angular2-all-testing.umd.dev.js 5.0 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183141841418514186141871418814189141901419114192141931419414195141961419714198141991420014201142021420314204142051420614207142081420914210142111421214213142141421514216142171421814219142201422114222142231422414225142261422714228142291423014231142321423314234142351423614237142381423914240142411424214243142441424514246142471424814249142501425114252142531425414255142561425714258142591426014261142621426314264142651426614267142681426914270142711427214273142741427514276142771427814279142801428114282142831428414285142861428714288142891429014291142921429314294142951429614297142981429914300143011430214303143041430514306143071430814309143101431114312143131431414315143161431714318143191432014321143221432314324143251432614327143281432914330143311433214333143341433514336143371433814339143401434114342143431434414345143461434714348143491435014351143521435314354143551435614357143581435914360143611436214363143641436514366143671436814369143701437114372143731437414375143761437714378143791438014381143821438314384143851438614387143881438914390143911439214393143941439514396143971439814399144001440114402144031440414405144061440714408144091441014411144121441314414144151441614417144181441914420144211442214423144241442514426144271442814429144301443114432144331443414435144361443714438144391444014441144421444314444144451444614447144481444914450144511445214453144541445514456144571445814459144601446114462144631446414465144661446714468144691447014471144721447314474144751447614477144781447914480144811448214483144841448514486144871448814489144901449114492144931449414495144961449714498144991450014501145021450314504145051450614507145081450914510145111451214513145141451514516145171451814519145201452114522145231452414525145261452714528145291453014531145321453314534145351453614537145381453914540145411454214543145441454514546145471454814549145501455114552145531455414555145561455714558145591456014561145621456314564145651456614567145681456914570145711457214573145741457514576145771457814579145801458114582145831458414585145861458714588145891459014591145921459314594145951459614597145981459914600146011460214603146041460514606146071460814609146101461114612146131461414615146161461714618146191462014621146221462314624146251462614627146281462914630146311463214633146341463514636146371463814639146401464114642146431464414645146461464714648146491465014651146521465314654146551465614657146581465914660146611466214663146641466514666146671466814669146701467114672146731467414675146761467714678146791468014681146821468314684146851468614687146881468914690146911469214693146941469514696146971469814699147001470114702147031470414705147061470714708147091471014711147121471314714147151471614717147181471914720147211472214723147241472514726147271472814729147301473114732147331473414735147361473714738147391474014741147421474314744147451474614747147481474914750147511475214753147541475514756147571475814759147601476114762147631476414765147661476714768147691477014771147721477314774147751477614777147781477914780147811478214783147841478514786147871478814789147901479114792147931479414795147961479714798147991480014801148021480314804148051480614807148081480914810148111481214813148141481514816148171481814819148201482114822148231482414825148261482714828148291483014831148321483314834148351483614837148381483914840148411484214843148441484514846148471484814849148501485114852148531485414855148561485714858148591486014861148621486314864148651486614867148681486914870148711487214873148741487514876148771487814879148801488114882148831488414885148861488714888148891489014891148921489314894148951489614897148981489914900149011490214903149041490514906149071490814909149101491114912149131491414915149161491714918149191492014921149221492314924149251492614927149281492914930149311493214933149341493514936149371493814939149401494114942149431494414945149461494714948149491495014951149521495314954149551495614957149581495914960149611496214963149641496514966149671496814969149701497114972149731497414975149761497714978149791498014981149821498314984149851498614987149881498914990149911499214993149941499514996149971499814999150001500115002150031500415005150061500715008150091501015011150121501315014150151501615017150181501915020150211502215023150241502515026150271502815029150301503115032150331503415035150361503715038150391504015041150421504315044150451504615047150481504915050150511505215053150541505515056150571505815059150601506115062150631506415065150661506715068150691507015071150721507315074150751507615077150781507915080150811508215083150841508515086150871508815089150901509115092150931509415095150961509715098150991510015101151021510315104151051510615107151081510915110151111511215113151141511515116151171511815119151201512115122151231512415125151261512715128151291513015131151321513315134151351513615137151381513915140151411514215143151441514515146151471514815149151501515115152151531515415155151561515715158151591516015161151621516315164151651516615167151681516915170151711517215173151741517515176151771517815179151801518115182151831518415185151861518715188151891519015191151921519315194151951519615197151981519915200152011520215203152041520515206152071520815209152101521115212152131521415215152161521715218152191522015221152221522315224152251522615227152281522915230152311523215233152341523515236152371523815239152401524115242152431524415245152461524715248152491525015251152521525315254152551525615257152581525915260152611526215263152641526515266152671526815269152701527115272152731527415275152761527715278152791528015281152821528315284152851528615287152881528915290152911529215293152941529515296152971529815299153001530115302153031530415305153061530715308153091531015311153121531315314153151531615317153181531915320153211532215323153241532515326153271532815329153301533115332153331533415335153361533715338153391534015341153421534315344153451534615347153481534915350153511535215353153541535515356153571535815359153601536115362153631536415365153661536715368153691537015371153721537315374153751537615377153781537915380153811538215383153841538515386153871538815389153901539115392153931539415395153961539715398153991540015401154021540315404154051540615407154081540915410154111541215413154141541515416154171541815419154201542115422154231542415425154261542715428154291543015431154321543315434154351543615437154381543915440154411544215443154441544515446154471544815449154501545115452154531545415455154561545715458154591546015461154621546315464154651546615467154681546915470154711547215473154741547515476154771547815479154801548115482154831548415485154861548715488154891549015491154921549315494154951549615497154981549915500155011550215503155041550515506155071550815509155101551115512155131551415515155161551715518155191552015521155221552315524155251552615527155281552915530155311553215533155341553515536155371553815539155401554115542155431554415545155461554715548155491555015551155521555315554155551555615557155581555915560155611556215563155641556515566155671556815569155701557115572155731557415575155761557715578155791558015581155821558315584155851558615587155881558915590155911559215593155941559515596155971559815599156001560115602156031560415605156061560715608156091561015611156121561315614156151561615617156181561915620156211562215623156241562515626156271562815629156301563115632156331563415635156361563715638156391564015641156421564315644156451564615647156481564915650156511565215653156541565515656156571565815659156601566115662156631566415665156661566715668156691567015671156721567315674156751567615677156781567915680156811568215683156841568515686156871568815689156901569115692156931569415695156961569715698156991570015701157021570315704157051570615707157081570915710157111571215713157141571515716157171571815719157201572115722157231572415725157261572715728157291573015731157321573315734157351573615737157381573915740157411574215743157441574515746157471574815749157501575115752157531575415755157561575715758157591576015761157621576315764157651576615767157681576915770157711577215773157741577515776157771577815779157801578115782157831578415785157861578715788157891579015791157921579315794157951579615797157981579915800158011580215803158041580515806158071580815809158101581115812158131581415815158161581715818158191582015821158221582315824158251582615827158281582915830158311583215833158341583515836158371583815839158401584115842158431584415845158461584715848158491585015851158521585315854158551585615857158581585915860158611586215863158641586515866158671586815869158701587115872158731587415875158761587715878158791588015881158821588315884158851588615887158881588915890158911589215893158941589515896158971589815899159001590115902159031590415905159061590715908159091591015911159121591315914159151591615917159181591915920159211592215923159241592515926159271592815929159301593115932159331593415935159361593715938159391594015941159421594315944159451594615947159481594915950159511595215953159541595515956159571595815959159601596115962159631596415965159661596715968159691597015971159721597315974159751597615977159781597915980159811598215983159841598515986159871598815989159901599115992159931599415995159961599715998159991600016001160021600316004160051600616007160081600916010160111601216013160141601516016160171601816019160201602116022160231602416025160261602716028160291603016031160321603316034160351603616037160381603916040160411604216043160441604516046160471604816049160501605116052160531605416055160561605716058160591606016061160621606316064160651606616067160681606916070160711607216073160741607516076160771607816079160801608116082160831608416085160861608716088160891609016091160921609316094160951609616097160981609916100161011610216103161041610516106161071610816109161101611116112161131611416115161161611716118161191612016121161221612316124161251612616127161281612916130161311613216133161341613516136161371613816139161401614116142161431614416145161461614716148161491615016151161521615316154161551615616157161581615916160161611616216163161641616516166161671616816169161701617116172161731617416175161761617716178161791618016181161821618316184161851618616187161881618916190161911619216193161941619516196161971619816199162001620116202162031620416205162061620716208162091621016211162121621316214162151621616217162181621916220162211622216223162241622516226162271622816229162301623116232162331623416235162361623716238162391624016241162421624316244162451624616247162481624916250162511625216253162541625516256162571625816259162601626116262162631626416265162661626716268162691627016271162721627316274162751627616277162781627916280162811628216283162841628516286162871628816289162901629116292162931629416295162961629716298162991630016301163021630316304163051630616307163081630916310163111631216313163141631516316163171631816319163201632116322163231632416325163261632716328163291633016331163321633316334163351633616337163381633916340163411634216343163441634516346163471634816349163501635116352163531635416355163561635716358163591636016361163621636316364163651636616367163681636916370163711637216373163741637516376163771637816379163801638116382163831638416385163861638716388163891639016391163921639316394163951639616397163981639916400164011640216403164041640516406164071640816409164101641116412164131641416415164161641716418164191642016421164221642316424164251642616427164281642916430164311643216433164341643516436164371643816439164401644116442164431644416445164461644716448164491645016451164521645316454164551645616457164581645916460164611646216463164641646516466164671646816469164701647116472164731647416475164761647716478164791648016481164821648316484164851648616487164881648916490164911649216493164941649516496164971649816499165001650116502165031650416505165061650716508165091651016511165121651316514165151651616517165181651916520165211652216523165241652516526165271652816529165301653116532165331653416535165361653716538165391654016541165421654316544165451654616547165481654916550165511655216553165541655516556165571655816559165601656116562165631656416565165661656716568165691657016571165721657316574165751657616577165781657916580165811658216583165841658516586165871658816589165901659116592165931659416595165961659716598165991660016601166021660316604166051660616607166081660916610166111661216613166141661516616166171661816619166201662116622166231662416625166261662716628166291663016631166321663316634166351663616637166381663916640166411664216643166441664516646166471664816649166501665116652166531665416655166561665716658166591666016661166621666316664166651666616667166681666916670166711667216673166741667516676166771667816679166801668116682166831668416685166861668716688166891669016691166921669316694166951669616697166981669916700167011670216703167041670516706167071670816709167101671116712167131671416715167161671716718167191672016721167221672316724167251672616727167281672916730167311673216733167341673516736167371673816739167401674116742167431674416745167461674716748167491675016751167521675316754167551675616757167581675916760167611676216763167641676516766167671676816769167701677116772167731677416775167761677716778167791678016781167821678316784167851678616787167881678916790167911679216793167941679516796167971679816799168001680116802168031680416805168061680716808168091681016811168121681316814168151681616817168181681916820168211682216823168241682516826168271682816829168301683116832168331683416835168361683716838168391684016841168421684316844168451684616847168481684916850168511685216853168541685516856168571685816859168601686116862168631686416865168661686716868168691687016871168721687316874168751687616877168781687916880168811688216883168841688516886168871688816889168901689116892168931689416895168961689716898168991690016901169021690316904169051690616907169081690916910169111691216913169141691516916169171691816919169201692116922169231692416925169261692716928169291693016931169321693316934169351693616937169381693916940169411694216943169441694516946169471694816949169501695116952169531695416955169561695716958169591696016961169621696316964169651696616967169681696916970169711697216973169741697516976169771697816979169801698116982169831698416985169861698716988169891699016991169921699316994169951699616997169981699917000170011700217003170041700517006170071700817009170101701117012170131701417015170161701717018170191702017021170221702317024170251702617027170281702917030170311703217033170341703517036170371703817039170401704117042170431704417045170461704717048170491705017051170521705317054170551705617057170581705917060170611706217063170641706517066170671706817069170701707117072170731707417075170761707717078170791708017081170821708317084170851708617087170881708917090170911709217093170941709517096170971709817099171001710117102171031710417105171061710717108171091711017111171121711317114171151711617117171181711917120171211712217123171241712517126171271712817129171301713117132171331713417135171361713717138171391714017141171421714317144171451714617147171481714917150171511715217153171541715517156171571715817159171601716117162171631716417165171661716717168171691717017171171721717317174171751717617177171781717917180171811718217183171841718517186171871718817189171901719117192171931719417195171961719717198171991720017201172021720317204172051720617207172081720917210172111721217213172141721517216172171721817219172201722117222172231722417225172261722717228172291723017231172321723317234172351723617237172381723917240172411724217243172441724517246172471724817249172501725117252172531725417255172561725717258172591726017261172621726317264172651726617267172681726917270172711727217273172741727517276172771727817279172801728117282172831728417285172861728717288172891729017291172921729317294172951729617297172981729917300173011730217303173041730517306173071730817309173101731117312173131731417315173161731717318173191732017321173221732317324173251732617327173281732917330173311733217333173341733517336173371733817339173401734117342173431734417345173461734717348173491735017351173521735317354173551735617357173581735917360173611736217363173641736517366173671736817369173701737117372173731737417375173761737717378173791738017381173821738317384173851738617387173881738917390173911739217393173941739517396173971739817399174001740117402174031740417405174061740717408174091741017411174121741317414174151741617417174181741917420174211742217423174241742517426174271742817429174301743117432174331743417435174361743717438174391744017441174421744317444174451744617447174481744917450174511745217453174541745517456174571745817459174601746117462174631746417465174661746717468174691747017471174721747317474174751747617477174781747917480174811748217483174841748517486174871748817489174901749117492174931749417495174961749717498174991750017501175021750317504175051750617507175081750917510175111751217513175141751517516175171751817519175201752117522175231752417525175261752717528175291753017531175321753317534175351753617537175381753917540175411754217543175441754517546175471754817549175501755117552175531755417555175561755717558175591756017561175621756317564175651756617567175681756917570175711757217573175741757517576175771757817579175801758117582175831758417585175861758717588175891759017591175921759317594175951759617597175981759917600176011760217603176041760517606176071760817609176101761117612176131761417615176161761717618176191762017621176221762317624176251762617627176281762917630176311763217633176341763517636176371763817639176401764117642176431764417645176461764717648176491765017651176521765317654176551765617657176581765917660176611766217663176641766517666176671766817669176701767117672176731767417675176761767717678176791768017681176821768317684176851768617687176881768917690176911769217693176941769517696176971769817699177001770117702177031770417705177061770717708177091771017711177121771317714177151771617717177181771917720177211772217723177241772517726177271772817729177301773117732177331773417735177361773717738177391774017741177421774317744177451774617747177481774917750177511775217753177541775517756177571775817759177601776117762177631776417765177661776717768177691777017771177721777317774177751777617777177781777917780177811778217783177841778517786177871778817789177901779117792177931779417795177961779717798177991780017801178021780317804178051780617807178081780917810178111781217813178141781517816178171781817819178201782117822178231782417825178261782717828178291783017831178321783317834178351783617837178381783917840178411784217843178441784517846178471784817849178501785117852178531785417855178561785717858178591786017861178621786317864178651786617867178681786917870178711787217873178741787517876178771787817879178801788117882178831788417885178861788717888178891789017891178921789317894178951789617897178981789917900179011790217903179041790517906179071790817909179101791117912179131791417915179161791717918179191792017921179221792317924179251792617927179281792917930179311793217933179341793517936179371793817939179401794117942179431794417945179461794717948179491795017951179521795317954179551795617957179581795917960179611796217963179641796517966179671796817969179701797117972179731797417975179761797717978179791798017981179821798317984179851798617987179881798917990179911799217993179941799517996179971799817999180001800118002180031800418005180061800718008180091801018011180121801318014180151801618017180181801918020180211802218023180241802518026180271802818029180301803118032180331803418035180361803718038180391804018041180421804318044180451804618047180481804918050180511805218053180541805518056180571805818059180601806118062180631806418065180661806718068180691807018071180721807318074180751807618077180781807918080180811808218083180841808518086180871808818089180901809118092180931809418095180961809718098180991810018101181021810318104181051810618107181081810918110181111811218113181141811518116181171811818119181201812118122181231812418125181261812718128181291813018131181321813318134181351813618137181381813918140181411814218143181441814518146181471814818149181501815118152181531815418155181561815718158181591816018161181621816318164181651816618167181681816918170181711817218173181741817518176181771817818179181801818118182181831818418185181861818718188181891819018191181921819318194181951819618197181981819918200182011820218203182041820518206182071820818209182101821118212182131821418215182161821718218182191822018221182221822318224182251822618227182281822918230182311823218233182341823518236182371823818239182401824118242182431824418245182461824718248182491825018251182521825318254182551825618257182581825918260182611826218263182641826518266182671826818269182701827118272182731827418275182761827718278182791828018281182821828318284182851828618287182881828918290182911829218293182941829518296182971829818299183001830118302183031830418305183061830718308183091831018311183121831318314183151831618317183181831918320183211832218323183241832518326183271832818329183301833118332183331833418335183361833718338183391834018341183421834318344183451834618347183481834918350183511835218353183541835518356183571835818359183601836118362183631836418365183661836718368183691837018371183721837318374183751837618377183781837918380183811838218383183841838518386183871838818389183901839118392183931839418395183961839718398183991840018401184021840318404184051840618407184081840918410184111841218413184141841518416184171841818419184201842118422184231842418425184261842718428184291843018431184321843318434184351843618437184381843918440184411844218443184441844518446184471844818449184501845118452184531845418455184561845718458184591846018461184621846318464184651846618467184681846918470184711847218473184741847518476184771847818479184801848118482184831848418485184861848718488184891849018491184921849318494184951849618497184981849918500185011850218503185041850518506185071850818509185101851118512185131851418515185161851718518185191852018521185221852318524185251852618527185281852918530185311853218533185341853518536185371853818539185401854118542185431854418545185461854718548185491855018551185521855318554185551855618557185581855918560185611856218563185641856518566185671856818569185701857118572185731857418575185761857718578185791858018581185821858318584185851858618587185881858918590185911859218593185941859518596185971859818599186001860118602186031860418605186061860718608186091861018611186121861318614186151861618617186181861918620186211862218623186241862518626186271862818629186301863118632186331863418635186361863718638186391864018641186421864318644186451864618647186481864918650186511865218653186541865518656186571865818659186601866118662186631866418665186661866718668186691867018671186721867318674186751867618677186781867918680186811868218683186841868518686186871868818689186901869118692186931869418695186961869718698186991870018701187021870318704187051870618707187081870918710187111871218713187141871518716187171871818719187201872118722187231872418725187261872718728187291873018731187321873318734187351873618737187381873918740187411874218743187441874518746187471874818749187501875118752187531875418755187561875718758187591876018761187621876318764187651876618767187681876918770187711877218773187741877518776187771877818779187801878118782187831878418785187861878718788187891879018791187921879318794187951879618797187981879918800188011880218803188041880518806188071880818809188101881118812188131881418815188161881718818188191882018821188221882318824188251882618827188281882918830188311883218833188341883518836188371883818839188401884118842188431884418845188461884718848188491885018851188521885318854188551885618857188581885918860188611886218863188641886518866188671886818869188701887118872188731887418875188761887718878188791888018881188821888318884188851888618887188881888918890188911889218893188941889518896188971889818899189001890118902189031890418905189061890718908189091891018911189121891318914189151891618917189181891918920189211892218923189241892518926189271892818929189301893118932189331893418935189361893718938189391894018941189421894318944189451894618947189481894918950189511895218953189541895518956189571895818959189601896118962189631896418965189661896718968189691897018971189721897318974189751897618977189781897918980189811898218983189841898518986189871898818989189901899118992189931899418995189961899718998189991900019001190021900319004190051900619007190081900919010190111901219013190141901519016190171901819019190201902119022190231902419025190261902719028190291903019031190321903319034190351903619037190381903919040190411904219043190441904519046190471904819049190501905119052190531905419055190561905719058190591906019061190621906319064190651906619067190681906919070190711907219073190741907519076190771907819079190801908119082190831908419085190861908719088190891909019091190921909319094190951909619097190981909919100191011910219103191041910519106191071910819109191101911119112191131911419115191161911719118191191912019121191221912319124191251912619127191281912919130191311913219133191341913519136191371913819139191401914119142191431914419145191461914719148191491915019151191521915319154191551915619157191581915919160191611916219163191641916519166191671916819169191701917119172191731917419175191761917719178191791918019181191821918319184191851918619187191881918919190191911919219193191941919519196191971919819199192001920119202192031920419205192061920719208192091921019211192121921319214192151921619217192181921919220192211922219223192241922519226192271922819229192301923119232192331923419235192361923719238192391924019241192421924319244192451924619247192481924919250192511925219253192541925519256192571925819259192601926119262192631926419265192661926719268192691927019271192721927319274192751927619277192781927919280192811928219283192841928519286192871928819289192901929119292192931929419295192961929719298192991930019301193021930319304193051930619307193081930919310193111931219313193141931519316193171931819319193201932119322193231932419325193261932719328193291933019331193321933319334193351933619337193381933919340193411934219343193441934519346193471934819349193501935119352193531935419355193561935719358193591936019361193621936319364193651936619367193681936919370193711937219373193741937519376193771937819379193801938119382193831938419385193861938719388193891939019391193921939319394193951939619397193981939919400194011940219403194041940519406194071940819409194101941119412194131941419415194161941719418194191942019421194221942319424194251942619427194281942919430194311943219433194341943519436194371943819439194401944119442194431944419445194461944719448194491945019451194521945319454194551945619457194581945919460194611946219463194641946519466194671946819469194701947119472194731947419475194761947719478194791948019481194821948319484194851948619487194881948919490194911949219493194941949519496194971949819499195001950119502195031950419505195061950719508195091951019511195121951319514195151951619517195181951919520195211952219523195241952519526195271952819529195301953119532195331953419535195361953719538195391954019541195421954319544195451954619547195481954919550195511955219553195541955519556195571955819559195601956119562195631956419565195661956719568195691957019571195721957319574195751957619577195781957919580195811958219583195841958519586195871958819589195901959119592195931959419595195961959719598195991960019601196021960319604196051960619607196081960919610196111961219613196141961519616196171961819619196201962119622196231962419625196261962719628196291963019631196321963319634196351963619637196381963919640196411964219643196441964519646196471964819649196501965119652196531965419655196561965719658196591966019661196621966319664196651966619667196681966919670196711967219673196741967519676196771967819679196801968119682196831968419685196861968719688196891969019691196921969319694196951969619697196981969919700197011970219703197041970519706197071970819709197101971119712197131971419715197161971719718197191972019721197221972319724197251972619727197281972919730197311973219733197341973519736197371973819739197401974119742197431974419745197461974719748197491975019751197521975319754197551975619757197581975919760197611976219763197641976519766197671976819769197701977119772197731977419775197761977719778197791978019781197821978319784197851978619787197881978919790197911979219793197941979519796197971979819799198001980119802198031980419805198061980719808198091981019811198121981319814198151981619817198181981919820198211982219823198241982519826198271982819829198301983119832198331983419835198361983719838198391984019841198421984319844198451984619847198481984919850198511985219853198541985519856198571985819859198601986119862198631986419865198661986719868198691987019871198721987319874198751987619877198781987919880198811988219883198841988519886198871988819889198901989119892198931989419895198961989719898198991990019901199021990319904199051990619907199081990919910199111991219913199141991519916199171991819919199201992119922199231992419925199261992719928199291993019931199321993319934199351993619937199381993919940199411994219943199441994519946199471994819949199501995119952199531995419955199561995719958199591996019961199621996319964199651996619967199681996919970199711997219973199741997519976199771997819979199801998119982199831998419985199861998719988199891999019991199921999319994199951999619997199981999920000200012000220003200042000520006200072000820009200102001120012200132001420015200162001720018200192002020021200222002320024200252002620027200282002920030200312003220033200342003520036200372003820039200402004120042200432004420045200462004720048200492005020051200522005320054200552005620057200582005920060200612006220063200642006520066200672006820069200702007120072200732007420075200762007720078200792008020081200822008320084200852008620087200882008920090200912009220093200942009520096200972009820099201002010120102201032010420105201062010720108201092011020111201122011320114201152011620117201182011920120201212012220123201242012520126201272012820129201302013120132201332013420135201362013720138201392014020141201422014320144201452014620147201482014920150201512015220153201542015520156201572015820159201602016120162201632016420165201662016720168201692017020171201722017320174201752017620177201782017920180201812018220183201842018520186201872018820189201902019120192201932019420195201962019720198201992020020201202022020320204202052020620207202082020920210202112021220213202142021520216202172021820219202202022120222202232022420225202262022720228202292023020231202322023320234202352023620237202382023920240202412024220243202442024520246202472024820249202502025120252202532025420255202562025720258202592026020261202622026320264202652026620267202682026920270202712027220273202742027520276202772027820279202802028120282202832028420285202862028720288202892029020291202922029320294202952029620297202982029920300203012030220303203042030520306203072030820309203102031120312203132031420315203162031720318203192032020321203222032320324203252032620327203282032920330203312033220333203342033520336203372033820339203402034120342203432034420345203462034720348203492035020351203522035320354203552035620357203582035920360203612036220363203642036520366203672036820369203702037120372203732037420375203762037720378203792038020381203822038320384203852038620387203882038920390203912039220393203942039520396203972039820399204002040120402204032040420405204062040720408204092041020411204122041320414204152041620417204182041920420204212042220423204242042520426204272042820429204302043120432204332043420435204362043720438204392044020441204422044320444204452044620447204482044920450204512045220453204542045520456204572045820459204602046120462204632046420465204662046720468204692047020471204722047320474204752047620477204782047920480204812048220483204842048520486204872048820489204902049120492204932049420495204962049720498204992050020501205022050320504205052050620507205082050920510205112051220513205142051520516205172051820519205202052120522205232052420525205262052720528205292053020531205322053320534205352053620537205382053920540205412054220543205442054520546205472054820549205502055120552205532055420555205562055720558205592056020561205622056320564205652056620567205682056920570205712057220573205742057520576205772057820579205802058120582205832058420585205862058720588205892059020591205922059320594205952059620597205982059920600206012060220603206042060520606206072060820609206102061120612206132061420615206162061720618206192062020621206222062320624206252062620627206282062920630206312063220633206342063520636206372063820639206402064120642206432064420645206462064720648206492065020651206522065320654206552065620657206582065920660206612066220663206642066520666206672066820669206702067120672206732067420675206762067720678206792068020681206822068320684206852068620687206882068920690206912069220693206942069520696206972069820699207002070120702207032070420705207062070720708207092071020711207122071320714207152071620717207182071920720207212072220723207242072520726207272072820729207302073120732207332073420735207362073720738207392074020741207422074320744207452074620747207482074920750207512075220753207542075520756207572075820759207602076120762207632076420765207662076720768207692077020771207722077320774207752077620777207782077920780207812078220783207842078520786207872078820789207902079120792207932079420795207962079720798207992080020801208022080320804208052080620807208082080920810208112081220813208142081520816208172081820819208202082120822208232082420825208262082720828208292083020831208322083320834208352083620837208382083920840208412084220843208442084520846208472084820849208502085120852208532085420855208562085720858208592086020861208622086320864208652086620867208682086920870208712087220873208742087520876208772087820879208802088120882208832088420885208862088720888208892089020891208922089320894208952089620897208982089920900209012090220903209042090520906209072090820909209102091120912209132091420915209162091720918209192092020921209222092320924209252092620927209282092920930209312093220933209342093520936209372093820939209402094120942209432094420945209462094720948209492095020951209522095320954209552095620957209582095920960209612096220963209642096520966209672096820969209702097120972209732097420975209762097720978209792098020981209822098320984209852098620987209882098920990209912099220993209942099520996209972099820999210002100121002210032100421005210062100721008210092101021011210122101321014210152101621017210182101921020210212102221023210242102521026210272102821029210302103121032210332103421035210362103721038210392104021041210422104321044210452104621047210482104921050210512105221053210542105521056210572105821059210602106121062210632106421065210662106721068210692107021071210722107321074210752107621077210782107921080210812108221083210842108521086210872108821089210902109121092210932109421095210962109721098210992110021101211022110321104211052110621107211082110921110211112111221113211142111521116211172111821119211202112121122211232112421125211262112721128211292113021131211322113321134211352113621137211382113921140211412114221143211442114521146211472114821149211502115121152211532115421155211562115721158211592116021161211622116321164211652116621167211682116921170211712117221173211742117521176211772117821179211802118121182211832118421185211862118721188211892119021191211922119321194211952119621197211982119921200212012120221203212042120521206212072120821209212102121121212212132121421215212162121721218212192122021221212222122321224212252122621227212282122921230212312123221233212342123521236212372123821239212402124121242212432124421245212462124721248212492125021251212522125321254212552125621257212582125921260212612126221263212642126521266212672126821269212702127121272212732127421275212762127721278212792128021281212822128321284212852128621287212882128921290212912129221293212942129521296212972129821299213002130121302213032130421305213062130721308213092131021311213122131321314213152131621317213182131921320213212132221323213242132521326213272132821329213302133121332213332133421335213362133721338213392134021341213422134321344213452134621347213482134921350213512135221353213542135521356213572135821359213602136121362213632136421365213662136721368213692137021371213722137321374213752137621377213782137921380213812138221383213842138521386213872138821389213902139121392213932139421395213962139721398213992140021401214022140321404214052140621407214082140921410214112141221413214142141521416214172141821419214202142121422214232142421425214262142721428214292143021431214322143321434214352143621437214382143921440214412144221443214442144521446214472144821449214502145121452214532145421455214562145721458214592146021461214622146321464214652146621467214682146921470214712147221473214742147521476214772147821479214802148121482214832148421485214862148721488214892149021491214922149321494214952149621497214982149921500215012150221503215042150521506215072150821509215102151121512215132151421515215162151721518215192152021521215222152321524215252152621527215282152921530215312153221533215342153521536215372153821539215402154121542215432154421545215462154721548215492155021551215522155321554215552155621557215582155921560215612156221563215642156521566215672156821569215702157121572215732157421575215762157721578215792158021581215822158321584215852158621587215882158921590215912159221593215942159521596215972159821599216002160121602216032160421605216062160721608216092161021611216122161321614216152161621617216182161921620216212162221623216242162521626216272162821629216302163121632216332163421635216362163721638216392164021641216422164321644216452164621647216482164921650216512165221653216542165521656216572165821659216602166121662216632166421665216662166721668216692167021671216722167321674216752167621677216782167921680216812168221683216842168521686216872168821689216902169121692216932169421695216962169721698216992170021701217022170321704217052170621707217082170921710217112171221713217142171521716217172171821719217202172121722217232172421725217262172721728217292173021731217322173321734217352173621737217382173921740217412174221743217442174521746217472174821749217502175121752217532175421755217562175721758217592176021761217622176321764217652176621767217682176921770217712177221773217742177521776217772177821779217802178121782217832178421785217862178721788217892179021791217922179321794217952179621797217982179921800218012180221803218042180521806218072180821809218102181121812218132181421815218162181721818218192182021821218222182321824218252182621827218282182921830218312183221833218342183521836218372183821839218402184121842218432184421845218462184721848218492185021851218522185321854218552185621857218582185921860218612186221863218642186521866218672186821869218702187121872218732187421875218762187721878218792188021881218822188321884218852188621887218882188921890218912189221893218942189521896218972189821899219002190121902219032190421905219062190721908219092191021911219122191321914219152191621917219182191921920219212192221923219242192521926219272192821929219302193121932219332193421935219362193721938219392194021941219422194321944219452194621947219482194921950219512195221953219542195521956219572195821959219602196121962219632196421965219662196721968219692197021971219722197321974219752197621977219782197921980219812198221983219842198521986219872198821989219902199121992219932199421995219962199721998219992200022001220022200322004220052200622007220082200922010220112201222013220142201522016220172201822019220202202122022220232202422025220262202722028220292203022031220322203322034220352203622037220382203922040220412204222043220442204522046220472204822049220502205122052220532205422055220562205722058220592206022061220622206322064220652206622067220682206922070220712207222073220742207522076220772207822079220802208122082220832208422085220862208722088220892209022091220922209322094220952209622097220982209922100221012210222103221042210522106221072210822109221102211122112221132211422115221162211722118221192212022121221222212322124221252212622127221282212922130221312213222133221342213522136221372213822139221402214122142221432214422145221462214722148221492215022151221522215322154221552215622157221582215922160221612216222163221642216522166221672216822169221702217122172221732217422175221762217722178221792218022181221822218322184221852218622187221882218922190221912219222193221942219522196221972219822199222002220122202222032220422205222062220722208222092221022211222122221322214222152221622217222182221922220222212222222223222242222522226222272222822229222302223122232222332223422235222362223722238222392224022241222422224322244222452224622247222482224922250222512225222253222542225522256222572225822259222602226122262222632226422265222662226722268222692227022271222722227322274222752227622277222782227922280222812228222283222842228522286222872228822289222902229122292222932229422295222962229722298222992230022301223022230322304223052230622307223082230922310223112231222313223142231522316223172231822319223202232122322223232232422325223262232722328223292233022331223322233322334223352233622337223382233922340223412234222343223442234522346223472234822349223502235122352223532235422355223562235722358223592236022361223622236322364223652236622367223682236922370223712237222373223742237522376223772237822379223802238122382223832238422385223862238722388223892239022391223922239322394223952239622397223982239922400224012240222403224042240522406224072240822409224102241122412224132241422415224162241722418224192242022421224222242322424224252242622427224282242922430224312243222433224342243522436224372243822439224402244122442224432244422445224462244722448224492245022451224522245322454224552245622457224582245922460224612246222463224642246522466224672246822469224702247122472224732247422475224762247722478224792248022481224822248322484224852248622487224882248922490224912249222493224942249522496224972249822499225002250122502225032250422505225062250722508225092251022511225122251322514225152251622517225182251922520225212252222523225242252522526225272252822529225302253122532225332253422535225362253722538225392254022541225422254322544225452254622547225482254922550225512255222553225542255522556225572255822559225602256122562225632256422565225662256722568225692257022571225722257322574225752257622577225782257922580225812258222583225842258522586225872258822589225902259122592225932259422595225962259722598225992260022601226022260322604226052260622607226082260922610226112261222613226142261522616226172261822619226202262122622226232262422625226262262722628226292263022631226322263322634226352263622637226382263922640226412264222643226442264522646226472264822649226502265122652226532265422655226562265722658226592266022661226622266322664226652266622667226682266922670226712267222673226742267522676226772267822679226802268122682226832268422685226862268722688226892269022691226922269322694226952269622697226982269922700227012270222703227042270522706227072270822709227102271122712227132271422715227162271722718227192272022721227222272322724227252272622727227282272922730227312273222733227342273522736227372273822739227402274122742227432274422745227462274722748227492275022751227522275322754227552275622757227582275922760227612276222763227642276522766227672276822769227702277122772227732277422775227762277722778227792278022781227822278322784227852278622787227882278922790227912279222793227942279522796227972279822799228002280122802228032280422805228062280722808228092281022811228122281322814228152281622817228182281922820228212282222823228242282522826228272282822829228302283122832228332283422835228362283722838228392284022841228422284322844228452284622847228482284922850228512285222853228542285522856228572285822859228602286122862228632286422865228662286722868228692287022871228722287322874228752287622877228782287922880228812288222883228842288522886228872288822889228902289122892228932289422895228962289722898228992290022901229022290322904229052290622907229082290922910229112291222913229142291522916229172291822919229202292122922229232292422925229262292722928229292293022931229322293322934229352293622937229382293922940229412294222943229442294522946229472294822949229502295122952229532295422955229562295722958229592296022961229622296322964229652296622967229682296922970229712297222973229742297522976229772297822979229802298122982229832298422985229862298722988229892299022991229922299322994229952299622997229982299923000230012300223003230042300523006230072300823009230102301123012230132301423015230162301723018230192302023021230222302323024230252302623027230282302923030230312303223033230342303523036230372303823039230402304123042230432304423045230462304723048230492305023051230522305323054230552305623057230582305923060230612306223063230642306523066230672306823069230702307123072230732307423075230762307723078230792308023081230822308323084230852308623087230882308923090230912309223093230942309523096230972309823099231002310123102231032310423105231062310723108231092311023111231122311323114231152311623117231182311923120231212312223123231242312523126231272312823129231302313123132231332313423135231362313723138231392314023141231422314323144231452314623147231482314923150231512315223153231542315523156231572315823159231602316123162231632316423165231662316723168231692317023171231722317323174231752317623177231782317923180231812318223183231842318523186231872318823189231902319123192231932319423195231962319723198231992320023201232022320323204232052320623207232082320923210232112321223213232142321523216232172321823219232202322123222232232322423225232262322723228232292323023231232322323323234232352323623237232382323923240232412324223243232442324523246232472324823249232502325123252232532325423255232562325723258232592326023261232622326323264232652326623267232682326923270232712327223273232742327523276232772327823279232802328123282232832328423285232862328723288232892329023291232922329323294232952329623297232982329923300233012330223303233042330523306233072330823309233102331123312233132331423315233162331723318233192332023321233222332323324233252332623327233282332923330233312333223333233342333523336233372333823339233402334123342233432334423345233462334723348233492335023351233522335323354233552335623357233582335923360233612336223363233642336523366233672336823369233702337123372233732337423375233762337723378233792338023381233822338323384233852338623387233882338923390233912339223393233942339523396233972339823399234002340123402234032340423405234062340723408234092341023411234122341323414234152341623417234182341923420234212342223423234242342523426234272342823429234302343123432234332343423435234362343723438234392344023441234422344323444234452344623447234482344923450234512345223453234542345523456234572345823459234602346123462234632346423465234662346723468234692347023471234722347323474234752347623477234782347923480234812348223483234842348523486234872348823489234902349123492234932349423495234962349723498234992350023501235022350323504235052350623507235082350923510235112351223513235142351523516235172351823519235202352123522235232352423525235262352723528235292353023531235322353323534235352353623537235382353923540235412354223543235442354523546235472354823549235502355123552235532355423555235562355723558235592356023561235622356323564235652356623567235682356923570235712357223573235742357523576235772357823579235802358123582235832358423585235862358723588235892359023591235922359323594235952359623597235982359923600236012360223603236042360523606236072360823609236102361123612236132361423615236162361723618236192362023621236222362323624236252362623627236282362923630236312363223633236342363523636236372363823639236402364123642236432364423645236462364723648236492365023651236522365323654236552365623657236582365923660236612366223663236642366523666236672366823669236702367123672236732367423675236762367723678236792368023681236822368323684236852368623687236882368923690236912369223693236942369523696236972369823699237002370123702237032370423705237062370723708237092371023711237122371323714237152371623717237182371923720237212372223723237242372523726237272372823729237302373123732237332373423735237362373723738237392374023741237422374323744237452374623747237482374923750237512375223753237542375523756237572375823759237602376123762237632376423765237662376723768237692377023771237722377323774237752377623777237782377923780237812378223783237842378523786237872378823789237902379123792237932379423795237962379723798237992380023801238022380323804238052380623807238082380923810238112381223813238142381523816238172381823819238202382123822238232382423825238262382723828238292383023831238322383323834238352383623837238382383923840238412384223843238442384523846238472384823849238502385123852238532385423855238562385723858238592386023861238622386323864238652386623867238682386923870238712387223873238742387523876238772387823879238802388123882238832388423885238862388723888238892389023891238922389323894238952389623897238982389923900239012390223903239042390523906239072390823909239102391123912239132391423915239162391723918239192392023921239222392323924239252392623927239282392923930239312393223933239342393523936239372393823939239402394123942239432394423945239462394723948239492395023951239522395323954239552395623957239582395923960239612396223963239642396523966239672396823969239702397123972239732397423975239762397723978239792398023981239822398323984239852398623987239882398923990239912399223993239942399523996239972399823999240002400124002240032400424005240062400724008240092401024011240122401324014240152401624017240182401924020240212402224023240242402524026240272402824029240302403124032240332403424035240362403724038240392404024041240422404324044240452404624047240482404924050240512405224053240542405524056240572405824059240602406124062240632406424065240662406724068240692407024071240722407324074240752407624077240782407924080240812408224083240842408524086240872408824089240902409124092240932409424095240962409724098240992410024101241022410324104241052410624107241082410924110241112411224113241142411524116241172411824119241202412124122241232412424125241262412724128241292413024131241322413324134241352413624137241382413924140241412414224143241442414524146241472414824149241502415124152241532415424155241562415724158241592416024161241622416324164241652416624167241682416924170241712417224173241742417524176241772417824179241802418124182241832418424185241862418724188241892419024191241922419324194241952419624197241982419924200242012420224203242042420524206242072420824209242102421124212242132421424215242162421724218242192422024221242222422324224242252422624227242282422924230242312423224233242342423524236242372423824239242402424124242242432424424245242462424724248242492425024251242522425324254242552425624257242582425924260242612426224263242642426524266242672426824269242702427124272242732427424275242762427724278242792428024281242822428324284242852428624287242882428924290242912429224293242942429524296242972429824299243002430124302243032430424305243062430724308243092431024311243122431324314243152431624317243182431924320243212432224323243242432524326243272432824329243302433124332243332433424335243362433724338243392434024341243422434324344243452434624347243482434924350243512435224353243542435524356243572435824359243602436124362243632436424365243662436724368243692437024371243722437324374243752437624377243782437924380243812438224383243842438524386243872438824389243902439124392243932439424395243962439724398243992440024401244022440324404244052440624407244082440924410244112441224413244142441524416244172441824419244202442124422244232442424425244262442724428244292443024431244322443324434244352443624437244382443924440244412444224443244442444524446244472444824449244502445124452244532445424455244562445724458244592446024461244622446324464244652446624467244682446924470244712447224473244742447524476244772447824479244802448124482244832448424485244862448724488244892449024491244922449324494244952449624497244982449924500245012450224503245042450524506245072450824509245102451124512245132451424515245162451724518245192452024521245222452324524245252452624527245282452924530245312453224533245342453524536245372453824539245402454124542245432454424545245462454724548245492455024551245522455324554245552455624557245582455924560245612456224563245642456524566245672456824569245702457124572245732457424575245762457724578245792458024581245822458324584245852458624587245882458924590245912459224593245942459524596245972459824599246002460124602246032460424605246062460724608246092461024611246122461324614246152461624617246182461924620246212462224623246242462524626246272462824629246302463124632246332463424635246362463724638246392464024641246422464324644246452464624647246482464924650246512465224653246542465524656246572465824659246602466124662246632466424665246662466724668246692467024671246722467324674246752467624677246782467924680246812468224683246842468524686246872468824689246902469124692246932469424695246962469724698246992470024701247022470324704247052470624707247082470924710247112471224713247142471524716247172471824719247202472124722247232472424725247262472724728247292473024731247322473324734247352473624737247382473924740247412474224743247442474524746247472474824749247502475124752247532475424755247562475724758247592476024761247622476324764247652476624767247682476924770247712477224773247742477524776247772477824779247802478124782247832478424785247862478724788247892479024791247922479324794247952479624797247982479924800248012480224803248042480524806248072480824809248102481124812248132481424815248162481724818248192482024821248222482324824248252482624827248282482924830248312483224833248342483524836248372483824839248402484124842248432484424845248462484724848248492485024851248522485324854248552485624857248582485924860248612486224863248642486524866248672486824869248702487124872248732487424875248762487724878248792488024881248822488324884248852488624887248882488924890248912489224893248942489524896248972489824899249002490124902249032490424905249062490724908249092491024911249122491324914249152491624917249182491924920249212492224923249242492524926249272492824929249302493124932249332493424935249362493724938249392494024941249422494324944249452494624947249482494924950249512495224953249542495524956249572495824959249602496124962249632496424965249662496724968249692497024971249722497324974249752497624977249782497924980249812498224983249842498524986249872498824989249902499124992249932499424995249962499724998249992500025001250022500325004250052500625007250082500925010250112501225013250142501525016250172501825019250202502125022250232502425025250262502725028250292503025031250322503325034250352503625037250382503925040250412504225043250442504525046250472504825049250502505125052250532505425055250562505725058250592506025061250622506325064250652506625067250682506925070250712507225073250742507525076250772507825079250802508125082250832508425085250862508725088250892509025091250922509325094250952509625097250982509925100251012510225103251042510525106251072510825109251102511125112251132511425115251162511725118251192512025121251222512325124251252512625127251282512925130251312513225133251342513525136251372513825139251402514125142251432514425145251462514725148251492515025151251522515325154251552515625157251582515925160251612516225163251642516525166251672516825169251702517125172251732517425175251762517725178251792518025181251822518325184251852518625187251882518925190251912519225193251942519525196251972519825199252002520125202252032520425205252062520725208252092521025211252122521325214252152521625217252182521925220252212522225223252242522525226252272522825229252302523125232252332523425235252362523725238252392524025241252422524325244252452524625247252482524925250252512525225253252542525525256252572525825259252602526125262252632526425265252662526725268252692527025271252722527325274252752527625277252782527925280252812528225283252842528525286252872528825289252902529125292252932529425295252962529725298252992530025301253022530325304253052530625307253082530925310253112531225313253142531525316253172531825319253202532125322253232532425325253262532725328253292533025331253322533325334253352533625337253382533925340253412534225343253442534525346253472534825349253502535125352253532535425355253562535725358253592536025361253622536325364253652536625367253682536925370253712537225373253742537525376253772537825379253802538125382253832538425385253862538725388253892539025391253922539325394253952539625397253982539925400254012540225403254042540525406254072540825409254102541125412254132541425415254162541725418254192542025421254222542325424254252542625427254282542925430254312543225433254342543525436254372543825439254402544125442254432544425445254462544725448254492545025451254522545325454254552545625457254582545925460254612546225463254642546525466254672546825469254702547125472254732547425475254762547725478254792548025481254822548325484254852548625487254882548925490254912549225493254942549525496254972549825499255002550125502255032550425505255062550725508255092551025511255122551325514255152551625517255182551925520255212552225523255242552525526255272552825529255302553125532255332553425535255362553725538255392554025541255422554325544255452554625547255482554925550255512555225553255542555525556255572555825559255602556125562255632556425565255662556725568255692557025571255722557325574255752557625577255782557925580255812558225583255842558525586255872558825589255902559125592255932559425595255962559725598255992560025601256022560325604256052560625607256082560925610256112561225613256142561525616256172561825619256202562125622256232562425625256262562725628256292563025631256322563325634256352563625637256382563925640256412564225643256442564525646256472564825649256502565125652256532565425655256562565725658256592566025661256622566325664256652566625667256682566925670256712567225673256742567525676256772567825679256802568125682256832568425685256862568725688256892569025691256922569325694256952569625697256982569925700257012570225703257042570525706257072570825709257102571125712257132571425715257162571725718257192572025721257222572325724257252572625727257282572925730257312573225733257342573525736257372573825739257402574125742257432574425745257462574725748257492575025751257522575325754257552575625757257582575925760257612576225763257642576525766257672576825769257702577125772257732577425775257762577725778257792578025781257822578325784257852578625787257882578925790257912579225793257942579525796257972579825799258002580125802258032580425805258062580725808258092581025811258122581325814258152581625817258182581925820258212582225823258242582525826258272582825829258302583125832258332583425835258362583725838258392584025841258422584325844258452584625847258482584925850258512585225853258542585525856258572585825859258602586125862258632586425865258662586725868258692587025871258722587325874258752587625877258782587925880258812588225883258842588525886258872588825889258902589125892258932589425895258962589725898258992590025901259022590325904259052590625907259082590925910259112591225913259142591525916259172591825919259202592125922259232592425925259262592725928259292593025931259322593325934259352593625937259382593925940259412594225943259442594525946259472594825949259502595125952259532595425955259562595725958259592596025961259622596325964259652596625967259682596925970259712597225973259742597525976259772597825979259802598125982259832598425985259862598725988259892599025991259922599325994259952599625997259982599926000260012600226003260042600526006260072600826009260102601126012260132601426015260162601726018260192602026021260222602326024260252602626027260282602926030260312603226033260342603526036260372603826039260402604126042260432604426045260462604726048260492605026051260522605326054260552605626057260582605926060260612606226063260642606526066260672606826069260702607126072260732607426075260762607726078260792608026081260822608326084260852608626087260882608926090260912609226093260942609526096260972609826099261002610126102261032610426105261062610726108261092611026111261122611326114261152611626117261182611926120261212612226123261242612526126261272612826129261302613126132261332613426135261362613726138261392614026141261422614326144261452614626147261482614926150261512615226153261542615526156261572615826159261602616126162261632616426165261662616726168261692617026171261722617326174261752617626177261782617926180261812618226183261842618526186261872618826189261902619126192261932619426195261962619726198261992620026201262022620326204262052620626207262082620926210262112621226213262142621526216262172621826219262202622126222262232622426225262262622726228262292623026231262322623326234262352623626237262382623926240262412624226243262442624526246262472624826249262502625126252262532625426255262562625726258262592626026261262622626326264262652626626267262682626926270262712627226273262742627526276262772627826279262802628126282262832628426285262862628726288262892629026291262922629326294262952629626297262982629926300263012630226303263042630526306263072630826309263102631126312263132631426315263162631726318263192632026321263222632326324263252632626327263282632926330263312633226333263342633526336263372633826339263402634126342263432634426345263462634726348263492635026351263522635326354263552635626357263582635926360263612636226363263642636526366263672636826369263702637126372263732637426375263762637726378263792638026381263822638326384263852638626387263882638926390263912639226393263942639526396263972639826399264002640126402264032640426405264062640726408264092641026411264122641326414264152641626417264182641926420264212642226423264242642526426264272642826429264302643126432264332643426435264362643726438264392644026441264422644326444264452644626447264482644926450264512645226453264542645526456264572645826459264602646126462264632646426465264662646726468264692647026471264722647326474264752647626477264782647926480264812648226483264842648526486264872648826489264902649126492264932649426495264962649726498264992650026501265022650326504265052650626507265082650926510265112651226513265142651526516265172651826519265202652126522265232652426525265262652726528265292653026531265322653326534265352653626537265382653926540265412654226543265442654526546265472654826549265502655126552265532655426555265562655726558265592656026561265622656326564265652656626567265682656926570265712657226573265742657526576265772657826579265802658126582265832658426585265862658726588265892659026591265922659326594265952659626597265982659926600266012660226603266042660526606266072660826609266102661126612266132661426615266162661726618266192662026621266222662326624266252662626627266282662926630266312663226633266342663526636266372663826639266402664126642266432664426645266462664726648266492665026651266522665326654266552665626657266582665926660266612666226663266642666526666266672666826669266702667126672266732667426675266762667726678266792668026681266822668326684266852668626687266882668926690266912669226693266942669526696266972669826699267002670126702267032670426705267062670726708267092671026711267122671326714267152671626717267182671926720267212672226723267242672526726267272672826729267302673126732267332673426735267362673726738267392674026741267422674326744267452674626747267482674926750267512675226753267542675526756267572675826759267602676126762267632676426765267662676726768267692677026771267722677326774267752677626777267782677926780267812678226783267842678526786267872678826789267902679126792267932679426795267962679726798267992680026801268022680326804268052680626807268082680926810268112681226813268142681526816268172681826819268202682126822268232682426825268262682726828268292683026831268322683326834268352683626837268382683926840268412684226843268442684526846268472684826849268502685126852268532685426855268562685726858268592686026861268622686326864268652686626867268682686926870268712687226873268742687526876268772687826879268802688126882268832688426885268862688726888268892689026891268922689326894268952689626897268982689926900269012690226903269042690526906269072690826909269102691126912269132691426915269162691726918269192692026921269222692326924269252692626927269282692926930269312693226933269342693526936269372693826939269402694126942269432694426945269462694726948269492695026951269522695326954269552695626957269582695926960269612696226963269642696526966269672696826969269702697126972269732697426975269762697726978269792698026981269822698326984269852698626987269882698926990269912699226993269942699526996269972699826999270002700127002270032700427005270062700727008270092701027011270122701327014270152701627017270182701927020270212702227023270242702527026270272702827029270302703127032270332703427035270362703727038270392704027041270422704327044270452704627047270482704927050270512705227053270542705527056270572705827059270602706127062270632706427065270662706727068270692707027071270722707327074270752707627077270782707927080270812708227083270842708527086270872708827089270902709127092270932709427095270962709727098270992710027101271022710327104271052710627107271082710927110271112711227113271142711527116271172711827119271202712127122271232712427125271262712727128271292713027131271322713327134271352713627137271382713927140271412714227143271442714527146271472714827149271502715127152271532715427155271562715727158271592716027161271622716327164271652716627167271682716927170271712717227173271742717527176271772717827179271802718127182271832718427185271862718727188271892719027191271922719327194271952719627197271982719927200272012720227203272042720527206272072720827209272102721127212272132721427215272162721727218272192722027221272222722327224272252722627227272282722927230272312723227233272342723527236272372723827239272402724127242272432724427245272462724727248272492725027251272522725327254272552725627257272582725927260272612726227263272642726527266272672726827269272702727127272272732727427275272762727727278272792728027281272822728327284272852728627287272882728927290272912729227293272942729527296272972729827299273002730127302273032730427305273062730727308273092731027311273122731327314273152731627317273182731927320273212732227323273242732527326273272732827329273302733127332273332733427335273362733727338273392734027341273422734327344273452734627347273482734927350273512735227353273542735527356273572735827359273602736127362273632736427365273662736727368273692737027371273722737327374273752737627377273782737927380273812738227383273842738527386273872738827389273902739127392273932739427395273962739727398273992740027401274022740327404274052740627407274082740927410274112741227413274142741527416274172741827419274202742127422274232742427425274262742727428274292743027431274322743327434274352743627437274382743927440274412744227443274442744527446274472744827449274502745127452274532745427455274562745727458274592746027461274622746327464274652746627467274682746927470274712747227473274742747527476274772747827479274802748127482274832748427485274862748727488274892749027491274922749327494274952749627497274982749927500275012750227503275042750527506275072750827509275102751127512275132751427515275162751727518275192752027521275222752327524275252752627527275282752927530275312753227533275342753527536275372753827539275402754127542275432754427545275462754727548275492755027551275522755327554275552755627557275582755927560275612756227563275642756527566275672756827569275702757127572275732757427575275762757727578275792758027581275822758327584275852758627587275882758927590275912759227593275942759527596275972759827599276002760127602276032760427605276062760727608276092761027611276122761327614276152761627617276182761927620276212762227623276242762527626276272762827629276302763127632276332763427635276362763727638276392764027641276422764327644276452764627647276482764927650276512765227653276542765527656276572765827659276602766127662276632766427665276662766727668276692767027671276722767327674276752767627677276782767927680276812768227683276842768527686276872768827689276902769127692276932769427695276962769727698276992770027701277022770327704277052770627707277082770927710277112771227713277142771527716277172771827719277202772127722277232772427725277262772727728277292773027731277322773327734277352773627737277382773927740277412774227743277442774527746277472774827749277502775127752277532775427755277562775727758277592776027761277622776327764277652776627767277682776927770277712777227773277742777527776277772777827779277802778127782277832778427785277862778727788277892779027791277922779327794277952779627797277982779927800278012780227803278042780527806278072780827809278102781127812278132781427815278162781727818278192782027821278222782327824278252782627827278282782927830278312783227833278342783527836278372783827839278402784127842278432784427845278462784727848278492785027851278522785327854278552785627857278582785927860278612786227863278642786527866278672786827869278702787127872278732787427875278762787727878278792788027881278822788327884278852788627887278882788927890278912789227893278942789527896278972789827899279002790127902279032790427905279062790727908279092791027911279122791327914279152791627917279182791927920279212792227923279242792527926279272792827929279302793127932279332793427935279362793727938279392794027941279422794327944279452794627947279482794927950279512795227953279542795527956279572795827959279602796127962279632796427965279662796727968279692797027971279722797327974279752797627977279782797927980279812798227983279842798527986279872798827989279902799127992279932799427995279962799727998279992800028001280022800328004280052800628007280082800928010280112801228013280142801528016280172801828019280202802128022280232802428025280262802728028280292803028031280322803328034280352803628037280382803928040280412804228043280442804528046280472804828049280502805128052280532805428055280562805728058280592806028061280622806328064280652806628067280682806928070280712807228073280742807528076280772807828079280802808128082280832808428085280862808728088280892809028091280922809328094280952809628097280982809928100281012810228103281042810528106281072810828109281102811128112281132811428115281162811728118281192812028121281222812328124281252812628127281282812928130281312813228133281342813528136281372813828139281402814128142281432814428145281462814728148281492815028151281522815328154281552815628157281582815928160281612816228163281642816528166281672816828169281702817128172281732817428175281762817728178281792818028181281822818328184281852818628187281882818928190281912819228193281942819528196281972819828199282002820128202282032820428205282062820728208282092821028211282122821328214282152821628217282182821928220282212822228223282242822528226282272822828229282302823128232282332823428235282362823728238282392824028241282422824328244282452824628247282482824928250282512825228253282542825528256282572825828259282602826128262282632826428265282662826728268282692827028271282722827328274282752827628277282782827928280282812828228283282842828528286282872828828289282902829128292282932829428295282962829728298282992830028301283022830328304283052830628307283082830928310283112831228313283142831528316283172831828319283202832128322283232832428325283262832728328283292833028331283322833328334283352833628337283382833928340283412834228343283442834528346283472834828349283502835128352283532835428355283562835728358283592836028361283622836328364283652836628367283682836928370283712837228373283742837528376283772837828379283802838128382283832838428385283862838728388283892839028391283922839328394283952839628397283982839928400284012840228403284042840528406284072840828409284102841128412284132841428415284162841728418284192842028421284222842328424284252842628427284282842928430284312843228433284342843528436284372843828439284402844128442284432844428445284462844728448284492845028451284522845328454284552845628457284582845928460284612846228463284642846528466284672846828469284702847128472284732847428475284762847728478284792848028481284822848328484284852848628487284882848928490284912849228493284942849528496284972849828499285002850128502285032850428505285062850728508285092851028511285122851328514285152851628517285182851928520285212852228523285242852528526285272852828529285302853128532285332853428535285362853728538285392854028541285422854328544285452854628547285482854928550285512855228553285542855528556285572855828559285602856128562285632856428565285662856728568285692857028571285722857328574285752857628577285782857928580285812858228583285842858528586285872858828589285902859128592285932859428595285962859728598285992860028601286022860328604286052860628607286082860928610286112861228613286142861528616286172861828619286202862128622286232862428625286262862728628286292863028631286322863328634286352863628637286382863928640286412864228643286442864528646286472864828649286502865128652286532865428655286562865728658286592866028661286622866328664286652866628667286682866928670286712867228673286742867528676286772867828679286802868128682286832868428685286862868728688286892869028691286922869328694286952869628697286982869928700287012870228703287042870528706287072870828709287102871128712287132871428715287162871728718287192872028721287222872328724287252872628727287282872928730287312873228733287342873528736287372873828739287402874128742287432874428745287462874728748287492875028751287522875328754287552875628757287582875928760287612876228763287642876528766287672876828769287702877128772287732877428775287762877728778287792878028781287822878328784287852878628787287882878928790287912879228793287942879528796287972879828799288002880128802288032880428805288062880728808288092881028811288122881328814288152881628817288182881928820288212882228823288242882528826288272882828829288302883128832288332883428835288362883728838288392884028841288422884328844288452884628847288482884928850288512885228853288542885528856288572885828859288602886128862288632886428865288662886728868288692887028871288722887328874288752887628877288782887928880288812888228883288842888528886288872888828889288902889128892288932889428895288962889728898288992890028901289022890328904289052890628907289082890928910289112891228913289142891528916289172891828919289202892128922289232892428925289262892728928289292893028931289322893328934289352893628937289382893928940289412894228943289442894528946289472894828949289502895128952289532895428955289562895728958289592896028961289622896328964289652896628967289682896928970289712897228973289742897528976289772897828979289802898128982289832898428985289862898728988289892899028991289922899328994289952899628997289982899929000290012900229003290042900529006290072900829009290102901129012290132901429015290162901729018290192902029021290222902329024290252902629027290282902929030290312903229033290342903529036290372903829039290402904129042290432904429045290462904729048290492905029051290522905329054290552905629057290582905929060290612906229063290642906529066290672906829069290702907129072290732907429075290762907729078290792908029081290822908329084290852908629087290882908929090290912909229093290942909529096290972909829099291002910129102291032910429105291062910729108291092911029111291122911329114291152911629117291182911929120291212912229123291242912529126291272912829129291302913129132291332913429135291362913729138291392914029141291422914329144291452914629147291482914929150291512915229153291542915529156291572915829159291602916129162291632916429165291662916729168291692917029171291722917329174291752917629177291782917929180291812918229183291842918529186291872918829189291902919129192291932919429195291962919729198291992920029201292022920329204292052920629207292082920929210292112921229213292142921529216292172921829219292202922129222292232922429225292262922729228292292923029231292322923329234292352923629237292382923929240292412924229243292442924529246292472924829249292502925129252292532925429255292562925729258292592926029261292622926329264292652926629267292682926929270292712927229273292742927529276292772927829279292802928129282292832928429285292862928729288292892929029291292922929329294292952929629297292982929929300293012930229303293042930529306293072930829309293102931129312293132931429315293162931729318293192932029321293222932329324293252932629327293282932929330293312933229333293342933529336293372933829339293402934129342293432934429345293462934729348293492935029351293522935329354293552935629357293582935929360293612936229363293642936529366293672936829369293702937129372293732937429375293762937729378293792938029381293822938329384293852938629387293882938929390293912939229393293942939529396293972939829399294002940129402294032940429405294062940729408294092941029411294122941329414294152941629417294182941929420294212942229423294242942529426294272942829429294302943129432294332943429435294362943729438294392944029441294422944329444294452944629447294482944929450294512945229453294542945529456294572945829459294602946129462294632946429465294662946729468294692947029471294722947329474294752947629477294782947929480294812948229483294842948529486294872948829489294902949129492294932949429495294962949729498294992950029501295022950329504295052950629507295082950929510295112951229513295142951529516295172951829519295202952129522295232952429525295262952729528295292953029531295322953329534295352953629537295382953929540295412954229543295442954529546295472954829549295502955129552295532955429555295562955729558295592956029561295622956329564295652956629567295682956929570295712957229573295742957529576295772957829579295802958129582295832958429585295862958729588295892959029591295922959329594295952959629597295982959929600296012960229603296042960529606296072960829609296102961129612296132961429615296162961729618296192962029621296222962329624296252962629627296282962929630296312963229633296342963529636296372963829639296402964129642296432964429645296462964729648296492965029651296522965329654296552965629657296582965929660296612966229663296642966529666296672966829669296702967129672296732967429675296762967729678296792968029681296822968329684296852968629687296882968929690296912969229693296942969529696296972969829699297002970129702297032970429705297062970729708297092971029711297122971329714297152971629717297182971929720297212972229723297242972529726297272972829729297302973129732297332973429735297362973729738297392974029741297422974329744297452974629747297482974929750297512975229753297542975529756297572975829759297602976129762297632976429765297662976729768297692977029771297722977329774297752977629777297782977929780297812978229783297842978529786297872978829789297902979129792297932979429795297962979729798297992980029801298022980329804298052980629807298082980929810298112981229813298142981529816298172981829819298202982129822298232982429825298262982729828298292983029831298322983329834298352983629837298382983929840298412984229843298442984529846298472984829849298502985129852298532985429855298562985729858298592986029861298622986329864298652986629867298682986929870298712987229873298742987529876298772987829879298802988129882298832988429885298862988729888298892989029891298922989329894298952989629897298982989929900299012990229903299042990529906299072990829909299102991129912299132991429915299162991729918299192992029921299222992329924299252992629927299282992929930299312993229933299342993529936299372993829939299402994129942299432994429945299462994729948299492995029951299522995329954299552995629957299582995929960299612996229963299642996529966299672996829969299702997129972299732997429975299762997729978299792998029981299822998329984299852998629987299882998929990299912999229993299942999529996299972999829999300003000130002300033000430005300063000730008300093001030011300123001330014300153001630017300183001930020300213002230023300243002530026300273002830029300303003130032300333003430035300363003730038300393004030041300423004330044300453004630047300483004930050300513005230053300543005530056300573005830059300603006130062300633006430065300663006730068300693007030071300723007330074300753007630077300783007930080300813008230083300843008530086300873008830089300903009130092300933009430095300963009730098300993010030101301023010330104301053010630107301083010930110301113011230113301143011530116301173011830119301203012130122301233012430125301263012730128301293013030131301323013330134301353013630137301383013930140301413014230143301443014530146301473014830149301503015130152301533015430155301563015730158301593016030161301623016330164301653016630167301683016930170301713017230173301743017530176301773017830179301803018130182301833018430185301863018730188301893019030191301923019330194301953019630197301983019930200302013020230203302043020530206302073020830209302103021130212302133021430215302163021730218302193022030221302223022330224302253022630227302283022930230302313023230233302343023530236302373023830239302403024130242302433024430245302463024730248302493025030251302523025330254302553025630257302583025930260302613026230263302643026530266302673026830269302703027130272302733027430275302763027730278302793028030281302823028330284302853028630287302883028930290302913029230293302943029530296302973029830299303003030130302303033030430305303063030730308303093031030311303123031330314303153031630317303183031930320303213032230323303243032530326303273032830329303303033130332303333033430335303363033730338303393034030341303423034330344303453034630347303483034930350303513035230353303543035530356303573035830359303603036130362303633036430365303663036730368303693037030371303723037330374303753037630377303783037930380303813038230383303843038530386303873038830389303903039130392303933039430395303963039730398303993040030401304023040330404304053040630407304083040930410304113041230413304143041530416304173041830419304203042130422304233042430425304263042730428304293043030431304323043330434304353043630437304383043930440304413044230443304443044530446304473044830449304503045130452304533045430455304563045730458304593046030461304623046330464304653046630467304683046930470304713047230473304743047530476304773047830479304803048130482304833048430485304863048730488304893049030491304923049330494304953049630497304983049930500305013050230503305043050530506305073050830509305103051130512305133051430515305163051730518305193052030521305223052330524305253052630527305283052930530305313053230533305343053530536305373053830539305403054130542305433054430545305463054730548305493055030551305523055330554305553055630557305583055930560305613056230563305643056530566305673056830569305703057130572305733057430575305763057730578305793058030581305823058330584305853058630587305883058930590305913059230593305943059530596305973059830599306003060130602306033060430605306063060730608306093061030611306123061330614306153061630617306183061930620306213062230623306243062530626306273062830629306303063130632306333063430635306363063730638306393064030641306423064330644306453064630647306483064930650306513065230653306543065530656306573065830659306603066130662306633066430665306663066730668306693067030671306723067330674306753067630677306783067930680306813068230683306843068530686306873068830689306903069130692306933069430695306963069730698306993070030701307023070330704307053070630707307083070930710307113071230713307143071530716307173071830719307203072130722307233072430725307263072730728307293073030731307323073330734307353073630737307383073930740307413074230743307443074530746307473074830749307503075130752307533075430755307563075730758307593076030761307623076330764307653076630767307683076930770307713077230773307743077530776307773077830779307803078130782307833078430785307863078730788307893079030791307923079330794307953079630797307983079930800308013080230803308043080530806308073080830809308103081130812308133081430815308163081730818308193082030821308223082330824308253082630827308283082930830308313083230833308343083530836308373083830839308403084130842308433084430845308463084730848308493085030851308523085330854308553085630857308583085930860308613086230863308643086530866308673086830869308703087130872308733087430875308763087730878308793088030881308823088330884308853088630887308883088930890308913089230893308943089530896308973089830899309003090130902309033090430905309063090730908309093091030911309123091330914309153091630917309183091930920309213092230923309243092530926309273092830929309303093130932309333093430935309363093730938309393094030941309423094330944309453094630947309483094930950309513095230953309543095530956309573095830959309603096130962309633096430965309663096730968309693097030971309723097330974309753097630977309783097930980309813098230983309843098530986309873098830989309903099130992309933099430995309963099730998309993100031001310023100331004310053100631007310083100931010310113101231013310143101531016310173101831019310203102131022310233102431025310263102731028310293103031031310323103331034310353103631037310383103931040310413104231043310443104531046310473104831049310503105131052310533105431055310563105731058310593106031061310623106331064310653106631067310683106931070310713107231073310743107531076310773107831079310803108131082310833108431085310863108731088310893109031091310923109331094310953109631097310983109931100311013110231103311043110531106311073110831109311103111131112311133111431115311163111731118311193112031121311223112331124311253112631127311283112931130311313113231133311343113531136311373113831139311403114131142311433114431145311463114731148311493115031151311523115331154311553115631157311583115931160311613116231163311643116531166311673116831169311703117131172311733117431175311763117731178311793118031181311823118331184311853118631187311883118931190311913119231193311943119531196311973119831199312003120131202312033120431205312063120731208312093121031211312123121331214312153121631217312183121931220312213122231223312243122531226312273122831229312303123131232312333123431235312363123731238312393124031241312423124331244312453124631247312483124931250312513125231253312543125531256312573125831259312603126131262312633126431265312663126731268312693127031271312723127331274312753127631277312783127931280312813128231283312843128531286312873128831289312903129131292312933129431295312963129731298312993130031301313023130331304313053130631307313083130931310313113131231313313143131531316313173131831319313203132131322313233132431325313263132731328313293133031331313323133331334313353133631337313383133931340313413134231343313443134531346313473134831349313503135131352313533135431355313563135731358313593136031361313623136331364313653136631367313683136931370313713137231373313743137531376313773137831379313803138131382313833138431385313863138731388313893139031391313923139331394313953139631397313983139931400314013140231403314043140531406314073140831409314103141131412314133141431415314163141731418314193142031421314223142331424314253142631427314283142931430314313143231433314343143531436314373143831439314403144131442314433144431445314463144731448314493145031451314523145331454314553145631457314583145931460314613146231463314643146531466314673146831469314703147131472314733147431475314763147731478314793148031481314823148331484314853148631487314883148931490314913149231493314943149531496314973149831499315003150131502315033150431505315063150731508315093151031511315123151331514315153151631517315183151931520315213152231523315243152531526315273152831529315303153131532315333153431535315363153731538315393154031541315423154331544315453154631547315483154931550315513155231553315543155531556315573155831559315603156131562315633156431565315663156731568315693157031571315723157331574315753157631577315783157931580315813158231583315843158531586315873158831589315903159131592315933159431595315963159731598315993160031601316023160331604316053160631607316083160931610316113161231613316143161531616316173161831619316203162131622316233162431625316263162731628316293163031631316323163331634316353163631637316383163931640316413164231643316443164531646316473164831649316503165131652316533165431655316563165731658316593166031661316623166331664316653166631667316683166931670316713167231673316743167531676316773167831679316803168131682316833168431685316863168731688316893169031691316923169331694316953169631697316983169931700317013170231703317043170531706317073170831709317103171131712317133171431715317163171731718317193172031721317223172331724317253172631727317283172931730317313173231733317343173531736317373173831739317403174131742317433174431745317463174731748317493175031751317523175331754317553175631757317583175931760317613176231763317643176531766317673176831769317703177131772317733177431775317763177731778317793178031781317823178331784317853178631787317883178931790317913179231793317943179531796317973179831799318003180131802318033180431805318063180731808318093181031811318123181331814318153181631817318183181931820318213182231823318243182531826318273182831829318303183131832318333183431835318363183731838318393184031841318423184331844318453184631847318483184931850318513185231853318543185531856318573185831859318603186131862318633186431865318663186731868318693187031871318723187331874318753187631877318783187931880318813188231883318843188531886318873188831889318903189131892318933189431895318963189731898318993190031901319023190331904319053190631907319083190931910319113191231913319143191531916319173191831919319203192131922319233192431925319263192731928319293193031931319323193331934319353193631937319383193931940319413194231943319443194531946319473194831949319503195131952319533195431955319563195731958319593196031961319623196331964319653196631967319683196931970319713197231973319743197531976319773197831979319803198131982319833198431985319863198731988319893199031991319923199331994319953199631997319983199932000320013200232003320043200532006320073200832009320103201132012320133201432015320163201732018320193202032021320223202332024320253202632027320283202932030320313203232033320343203532036320373203832039320403204132042320433204432045320463204732048320493205032051320523205332054320553205632057320583205932060320613206232063320643206532066320673206832069320703207132072320733207432075320763207732078320793208032081320823208332084320853208632087320883208932090320913209232093320943209532096320973209832099321003210132102321033210432105321063210732108321093211032111321123211332114321153211632117321183211932120321213212232123321243212532126321273212832129321303213132132321333213432135321363213732138321393214032141321423214332144321453214632147321483214932150321513215232153321543215532156321573215832159321603216132162321633216432165321663216732168321693217032171321723217332174321753217632177321783217932180321813218232183321843218532186321873218832189321903219132192321933219432195321963219732198321993220032201322023220332204322053220632207322083220932210322113221232213322143221532216322173221832219322203222132222322233222432225322263222732228322293223032231322323223332234322353223632237322383223932240322413224232243322443224532246322473224832249322503225132252322533225432255322563225732258322593226032261322623226332264322653226632267322683226932270322713227232273322743227532276322773227832279322803228132282322833228432285322863228732288322893229032291322923229332294322953229632297322983229932300323013230232303323043230532306323073230832309323103231132312323133231432315323163231732318323193232032321323223232332324323253232632327323283232932330323313233232333323343233532336323373233832339323403234132342323433234432345323463234732348323493235032351323523235332354323553235632357323583235932360323613236232363323643236532366323673236832369323703237132372323733237432375323763237732378323793238032381323823238332384323853238632387323883238932390323913239232393323943239532396323973239832399324003240132402324033240432405324063240732408324093241032411324123241332414324153241632417324183241932420324213242232423324243242532426324273242832429324303243132432324333243432435324363243732438324393244032441324423244332444324453244632447324483244932450324513245232453324543245532456324573245832459324603246132462324633246432465324663246732468324693247032471324723247332474324753247632477324783247932480324813248232483324843248532486324873248832489324903249132492324933249432495324963249732498324993250032501325023250332504325053250632507325083250932510325113251232513325143251532516325173251832519325203252132522325233252432525325263252732528325293253032531325323253332534325353253632537325383253932540325413254232543325443254532546325473254832549325503255132552325533255432555325563255732558325593256032561325623256332564325653256632567325683256932570325713257232573325743257532576325773257832579325803258132582325833258432585325863258732588325893259032591325923259332594325953259632597325983259932600326013260232603326043260532606326073260832609326103261132612326133261432615326163261732618326193262032621326223262332624326253262632627326283262932630326313263232633326343263532636326373263832639326403264132642326433264432645326463264732648326493265032651326523265332654326553265632657326583265932660326613266232663326643266532666326673266832669326703267132672326733267432675326763267732678326793268032681326823268332684326853268632687326883268932690326913269232693326943269532696326973269832699327003270132702327033270432705327063270732708327093271032711327123271332714327153271632717327183271932720327213272232723327243272532726327273272832729327303273132732327333273432735327363273732738327393274032741327423274332744327453274632747327483274932750327513275232753327543275532756327573275832759327603276132762327633276432765327663276732768327693277032771327723277332774327753277632777327783277932780327813278232783327843278532786327873278832789327903279132792327933279432795327963279732798327993280032801328023280332804328053280632807328083280932810328113281232813328143281532816328173281832819328203282132822328233282432825328263282732828328293283032831328323283332834328353283632837328383283932840328413284232843328443284532846328473284832849328503285132852328533285432855328563285732858328593286032861328623286332864328653286632867328683286932870328713287232873328743287532876328773287832879328803288132882328833288432885328863288732888328893289032891328923289332894328953289632897328983289932900329013290232903329043290532906329073290832909329103291132912329133291432915329163291732918329193292032921329223292332924329253292632927329283292932930329313293232933329343293532936329373293832939329403294132942329433294432945329463294732948329493295032951329523295332954329553295632957329583295932960329613296232963329643296532966329673296832969329703297132972329733297432975329763297732978329793298032981329823298332984329853298632987329883298932990329913299232993329943299532996329973299832999330003300133002330033300433005330063300733008330093301033011330123301333014330153301633017330183301933020330213302233023330243302533026330273302833029330303303133032330333303433035330363303733038330393304033041330423304333044330453304633047330483304933050330513305233053330543305533056330573305833059330603306133062330633306433065330663306733068330693307033071330723307333074330753307633077330783307933080330813308233083330843308533086330873308833089330903309133092330933309433095330963309733098330993310033101331023310333104331053310633107331083310933110331113311233113331143311533116331173311833119331203312133122331233312433125331263312733128331293313033131331323313333134331353313633137331383313933140331413314233143331443314533146331473314833149331503315133152331533315433155331563315733158331593316033161331623316333164331653316633167331683316933170331713317233173331743317533176331773317833179331803318133182331833318433185331863318733188331893319033191331923319333194331953319633197331983319933200332013320233203332043320533206332073320833209332103321133212332133321433215332163321733218332193322033221332223322333224332253322633227332283322933230332313323233233332343323533236332373323833239332403324133242332433324433245332463324733248332493325033251332523325333254332553325633257332583325933260332613326233263332643326533266332673326833269332703327133272332733327433275332763327733278332793328033281332823328333284332853328633287332883328933290332913329233293332943329533296332973329833299333003330133302333033330433305333063330733308333093331033311333123331333314333153331633317333183331933320333213332233323333243332533326333273332833329333303333133332333333333433335333363333733338333393334033341333423334333344333453334633347333483334933350333513335233353333543335533356333573335833359333603336133362333633336433365333663336733368333693337033371333723337333374333753337633377333783337933380333813338233383333843338533386333873338833389333903339133392333933339433395333963339733398333993340033401334023340333404334053340633407334083340933410334113341233413334143341533416334173341833419334203342133422334233342433425334263342733428334293343033431334323343333434334353343633437334383343933440334413344233443334443344533446334473344833449334503345133452334533345433455334563345733458334593346033461334623346333464334653346633467334683346933470334713347233473334743347533476334773347833479334803348133482334833348433485334863348733488334893349033491334923349333494334953349633497334983349933500335013350233503335043350533506335073350833509335103351133512335133351433515335163351733518335193352033521335223352333524335253352633527335283352933530335313353233533335343353533536335373353833539335403354133542335433354433545335463354733548335493355033551335523355333554335553355633557335583355933560335613356233563335643356533566335673356833569335703357133572335733357433575335763357733578335793358033581335823358333584335853358633587335883358933590335913359233593335943359533596335973359833599336003360133602336033360433605336063360733608336093361033611336123361333614336153361633617336183361933620336213362233623336243362533626336273362833629336303363133632336333363433635336363363733638336393364033641336423364333644336453364633647336483364933650336513365233653336543365533656336573365833659336603366133662336633366433665336663366733668336693367033671336723367333674336753367633677336783367933680336813368233683336843368533686336873368833689336903369133692336933369433695336963369733698336993370033701337023370333704337053370633707337083370933710337113371233713337143371533716337173371833719337203372133722337233372433725337263372733728337293373033731337323373333734337353373633737337383373933740337413374233743337443374533746337473374833749337503375133752337533375433755337563375733758337593376033761337623376333764337653376633767337683376933770337713377233773337743377533776337773377833779337803378133782337833378433785337863378733788337893379033791337923379333794337953379633797337983379933800338013380233803338043380533806338073380833809338103381133812338133381433815338163381733818338193382033821338223382333824338253382633827338283382933830338313383233833338343383533836338373383833839338403384133842338433384433845338463384733848338493385033851338523385333854338553385633857338583385933860338613386233863338643386533866338673386833869338703387133872338733387433875338763387733878338793388033881338823388333884338853388633887338883388933890338913389233893338943389533896338973389833899339003390133902339033390433905339063390733908339093391033911339123391333914339153391633917339183391933920339213392233923339243392533926339273392833929339303393133932339333393433935339363393733938339393394033941339423394333944339453394633947339483394933950339513395233953339543395533956339573395833959339603396133962339633396433965339663396733968339693397033971339723397333974339753397633977339783397933980339813398233983339843398533986339873398833989339903399133992339933399433995339963399733998339993400034001340023400334004340053400634007340083400934010340113401234013340143401534016340173401834019340203402134022340233402434025340263402734028340293403034031340323403334034340353403634037340383403934040340413404234043340443404534046340473404834049340503405134052340533405434055340563405734058340593406034061340623406334064340653406634067340683406934070340713407234073340743407534076340773407834079340803408134082340833408434085340863408734088340893409034091340923409334094340953409634097340983409934100341013410234103341043410534106341073410834109341103411134112341133411434115341163411734118341193412034121341223412334124341253412634127341283412934130341313413234133341343413534136341373413834139341403414134142341433414434145341463414734148341493415034151341523415334154341553415634157341583415934160341613416234163341643416534166341673416834169341703417134172341733417434175341763417734178341793418034181341823418334184341853418634187341883418934190341913419234193341943419534196341973419834199342003420134202342033420434205342063420734208342093421034211342123421334214342153421634217342183421934220342213422234223342243422534226342273422834229342303423134232342333423434235342363423734238342393424034241342423424334244342453424634247342483424934250342513425234253342543425534256342573425834259342603426134262342633426434265342663426734268342693427034271342723427334274342753427634277342783427934280342813428234283342843428534286342873428834289342903429134292342933429434295342963429734298342993430034301343023430334304343053430634307343083430934310343113431234313343143431534316343173431834319343203432134322343233432434325343263432734328343293433034331343323433334334343353433634337343383433934340343413434234343343443434534346343473434834349343503435134352343533435434355343563435734358343593436034361343623436334364343653436634367343683436934370343713437234373343743437534376343773437834379343803438134382343833438434385343863438734388343893439034391343923439334394343953439634397343983439934400344013440234403344043440534406344073440834409344103441134412344133441434415344163441734418344193442034421344223442334424344253442634427344283442934430344313443234433344343443534436344373443834439344403444134442344433444434445344463444734448344493445034451344523445334454344553445634457344583445934460344613446234463344643446534466344673446834469344703447134472344733447434475344763447734478344793448034481344823448334484344853448634487344883448934490344913449234493344943449534496344973449834499345003450134502345033450434505345063450734508345093451034511345123451334514345153451634517345183451934520345213452234523345243452534526345273452834529345303453134532345333453434535345363453734538345393454034541345423454334544345453454634547345483454934550345513455234553345543455534556345573455834559345603456134562345633456434565345663456734568345693457034571345723457334574345753457634577345783457934580345813458234583345843458534586345873458834589345903459134592345933459434595345963459734598345993460034601346023460334604346053460634607346083460934610346113461234613346143461534616346173461834619346203462134622346233462434625346263462734628346293463034631346323463334634346353463634637346383463934640346413464234643346443464534646346473464834649346503465134652346533465434655346563465734658346593466034661346623466334664346653466634667346683466934670346713467234673346743467534676346773467834679346803468134682346833468434685346863468734688346893469034691346923469334694346953469634697346983469934700347013470234703347043470534706347073470834709347103471134712347133471434715347163471734718347193472034721347223472334724347253472634727347283472934730347313473234733347343473534736347373473834739347403474134742347433474434745347463474734748347493475034751347523475334754347553475634757347583475934760347613476234763347643476534766347673476834769347703477134772347733477434775347763477734778347793478034781347823478334784347853478634787347883478934790347913479234793347943479534796347973479834799348003480134802348033480434805348063480734808348093481034811348123481334814348153481634817348183481934820348213482234823348243482534826348273482834829348303483134832348333483434835348363483734838348393484034841348423484334844348453484634847348483484934850348513485234853348543485534856348573485834859348603486134862348633486434865348663486734868348693487034871348723487334874348753487634877348783487934880348813488234883348843488534886348873488834889348903489134892348933489434895348963489734898348993490034901349023490334904349053490634907349083490934910349113491234913349143491534916349173491834919349203492134922349233492434925349263492734928349293493034931349323493334934349353493634937349383493934940349413494234943349443494534946349473494834949349503495134952349533495434955349563495734958349593496034961349623496334964349653496634967349683496934970349713497234973349743497534976349773497834979349803498134982349833498434985349863498734988349893499034991349923499334994349953499634997349983499935000350013500235003350043500535006350073500835009350103501135012350133501435015350163501735018350193502035021350223502335024350253502635027350283502935030350313503235033350343503535036350373503835039350403504135042350433504435045350463504735048350493505035051350523505335054350553505635057350583505935060350613506235063350643506535066350673506835069350703507135072350733507435075350763507735078350793508035081350823508335084350853508635087350883508935090350913509235093350943509535096350973509835099351003510135102351033510435105351063510735108351093511035111351123511335114351153511635117351183511935120351213512235123351243512535126351273512835129351303513135132351333513435135351363513735138351393514035141351423514335144351453514635147351483514935150351513515235153351543515535156351573515835159351603516135162351633516435165351663516735168351693517035171351723517335174351753517635177351783517935180351813518235183351843518535186351873518835189351903519135192351933519435195351963519735198351993520035201352023520335204352053520635207352083520935210352113521235213352143521535216352173521835219352203522135222352233522435225352263522735228352293523035231352323523335234352353523635237352383523935240352413524235243352443524535246352473524835249352503525135252352533525435255352563525735258352593526035261352623526335264352653526635267352683526935270352713527235273352743527535276352773527835279352803528135282352833528435285352863528735288352893529035291352923529335294352953529635297352983529935300353013530235303353043530535306353073530835309353103531135312353133531435315353163531735318353193532035321353223532335324353253532635327353283532935330353313533235333353343533535336353373533835339353403534135342353433534435345353463534735348353493535035351353523535335354353553535635357353583535935360353613536235363353643536535366353673536835369353703537135372353733537435375353763537735378353793538035381353823538335384353853538635387353883538935390353913539235393353943539535396353973539835399354003540135402354033540435405354063540735408354093541035411354123541335414354153541635417354183541935420354213542235423354243542535426354273542835429354303543135432354333543435435354363543735438354393544035441354423544335444354453544635447354483544935450354513545235453354543545535456354573545835459354603546135462354633546435465354663546735468354693547035471354723547335474354753547635477354783547935480354813548235483354843548535486354873548835489354903549135492354933549435495354963549735498354993550035501355023550335504355053550635507355083550935510355113551235513355143551535516355173551835519355203552135522355233552435525355263552735528355293553035531355323553335534355353553635537355383553935540355413554235543355443554535546355473554835549355503555135552355533555435555355563555735558355593556035561355623556335564355653556635567355683556935570355713557235573355743557535576355773557835579355803558135582355833558435585355863558735588355893559035591355923559335594355953559635597355983559935600356013560235603356043560535606356073560835609356103561135612356133561435615356163561735618356193562035621356223562335624356253562635627356283562935630356313563235633356343563535636356373563835639356403564135642356433564435645356463564735648356493565035651356523565335654356553565635657356583565935660356613566235663356643566535666356673566835669356703567135672356733567435675356763567735678356793568035681356823568335684356853568635687356883568935690356913569235693356943569535696356973569835699357003570135702357033570435705357063570735708357093571035711357123571335714357153571635717357183571935720357213572235723357243572535726357273572835729357303573135732357333573435735357363573735738357393574035741357423574335744357453574635747357483574935750357513575235753357543575535756357573575835759357603576135762357633576435765357663576735768357693577035771357723577335774357753577635777357783577935780357813578235783357843578535786357873578835789357903579135792357933579435795357963579735798357993580035801358023580335804358053580635807358083580935810358113581235813358143581535816358173581835819358203582135822358233582435825358263582735828358293583035831358323583335834358353583635837358383583935840358413584235843358443584535846358473584835849358503585135852358533585435855358563585735858358593586035861358623586335864358653586635867358683586935870358713587235873358743587535876358773587835879358803588135882358833588435885358863588735888358893589035891358923589335894358953589635897358983589935900359013590235903359043590535906359073590835909359103591135912359133591435915359163591735918359193592035921359223592335924359253592635927359283592935930359313593235933359343593535936359373593835939359403594135942359433594435945359463594735948359493595035951359523595335954359553595635957359583595935960359613596235963359643596535966359673596835969359703597135972359733597435975359763597735978359793598035981359823598335984359853598635987359883598935990359913599235993359943599535996359973599835999360003600136002360033600436005360063600736008360093601036011360123601336014360153601636017360183601936020360213602236023360243602536026360273602836029360303603136032360333603436035360363603736038360393604036041360423604336044360453604636047360483604936050360513605236053360543605536056360573605836059360603606136062360633606436065360663606736068360693607036071360723607336074360753607636077360783607936080360813608236083360843608536086360873608836089360903609136092360933609436095360963609736098360993610036101361023610336104361053610636107361083610936110361113611236113361143611536116361173611836119361203612136122361233612436125361263612736128361293613036131361323613336134361353613636137361383613936140361413614236143361443614536146361473614836149361503615136152361533615436155361563615736158361593616036161361623616336164361653616636167361683616936170361713617236173361743617536176361773617836179361803618136182361833618436185361863618736188361893619036191361923619336194361953619636197361983619936200362013620236203362043620536206362073620836209362103621136212362133621436215362163621736218362193622036221362223622336224362253622636227362283622936230362313623236233362343623536236362373623836239362403624136242362433624436245362463624736248362493625036251362523625336254362553625636257362583625936260362613626236263362643626536266362673626836269362703627136272362733627436275362763627736278362793628036281362823628336284362853628636287362883628936290362913629236293362943629536296362973629836299363003630136302363033630436305363063630736308363093631036311363123631336314363153631636317363183631936320363213632236323363243632536326363273632836329363303633136332363333633436335363363633736338363393634036341363423634336344363453634636347363483634936350363513635236353363543635536356363573635836359363603636136362363633636436365363663636736368363693637036371363723637336374363753637636377363783637936380363813638236383363843638536386363873638836389363903639136392363933639436395363963639736398363993640036401364023640336404364053640636407364083640936410364113641236413364143641536416364173641836419364203642136422364233642436425364263642736428364293643036431364323643336434364353643636437364383643936440364413644236443364443644536446364473644836449364503645136452364533645436455364563645736458364593646036461364623646336464364653646636467364683646936470364713647236473364743647536476364773647836479364803648136482364833648436485364863648736488364893649036491364923649336494364953649636497364983649936500365013650236503365043650536506365073650836509365103651136512365133651436515365163651736518365193652036521365223652336524365253652636527365283652936530365313653236533365343653536536365373653836539365403654136542365433654436545365463654736548365493655036551365523655336554365553655636557365583655936560365613656236563365643656536566365673656836569365703657136572365733657436575365763657736578365793658036581365823658336584365853658636587365883658936590365913659236593365943659536596365973659836599366003660136602366033660436605366063660736608366093661036611366123661336614366153661636617366183661936620366213662236623366243662536626366273662836629366303663136632366333663436635366363663736638366393664036641366423664336644366453664636647366483664936650366513665236653366543665536656366573665836659366603666136662366633666436665366663666736668366693667036671366723667336674366753667636677366783667936680366813668236683366843668536686366873668836689366903669136692366933669436695366963669736698366993670036701367023670336704367053670636707367083670936710367113671236713367143671536716367173671836719367203672136722367233672436725367263672736728367293673036731367323673336734367353673636737367383673936740367413674236743367443674536746367473674836749367503675136752367533675436755367563675736758367593676036761367623676336764367653676636767367683676936770367713677236773367743677536776367773677836779367803678136782367833678436785367863678736788367893679036791367923679336794367953679636797367983679936800368013680236803368043680536806368073680836809368103681136812368133681436815368163681736818368193682036821368223682336824368253682636827368283682936830368313683236833368343683536836368373683836839368403684136842368433684436845368463684736848368493685036851368523685336854368553685636857368583685936860368613686236863368643686536866368673686836869368703687136872368733687436875368763687736878368793688036881368823688336884368853688636887368883688936890368913689236893368943689536896368973689836899369003690136902369033690436905369063690736908369093691036911369123691336914369153691636917369183691936920369213692236923369243692536926369273692836929369303693136932369333693436935369363693736938369393694036941369423694336944369453694636947369483694936950369513695236953369543695536956369573695836959369603696136962369633696436965369663696736968369693697036971369723697336974369753697636977369783697936980369813698236983369843698536986369873698836989369903699136992369933699436995369963699736998369993700037001370023700337004370053700637007370083700937010370113701237013370143701537016370173701837019370203702137022370233702437025370263702737028370293703037031370323703337034370353703637037370383703937040370413704237043370443704537046370473704837049370503705137052370533705437055370563705737058370593706037061370623706337064370653706637067370683706937070370713707237073370743707537076370773707837079370803708137082370833708437085370863708737088370893709037091370923709337094370953709637097370983709937100371013710237103371043710537106371073710837109371103711137112371133711437115371163711737118371193712037121371223712337124371253712637127371283712937130371313713237133371343713537136371373713837139371403714137142371433714437145371463714737148371493715037151371523715337154371553715637157371583715937160371613716237163371643716537166371673716837169371703717137172371733717437175371763717737178371793718037181371823718337184371853718637187371883718937190371913719237193371943719537196371973719837199372003720137202372033720437205372063720737208372093721037211372123721337214372153721637217372183721937220372213722237223372243722537226372273722837229372303723137232372333723437235372363723737238372393724037241372423724337244372453724637247372483724937250372513725237253372543725537256372573725837259372603726137262372633726437265372663726737268372693727037271372723727337274372753727637277372783727937280372813728237283372843728537286372873728837289372903729137292372933729437295372963729737298372993730037301373023730337304373053730637307373083730937310373113731237313373143731537316373173731837319373203732137322373233732437325373263732737328373293733037331373323733337334373353733637337373383733937340373413734237343373443734537346373473734837349373503735137352373533735437355373563735737358373593736037361373623736337364373653736637367373683736937370373713737237373373743737537376373773737837379373803738137382373833738437385373863738737388373893739037391373923739337394373953739637397373983739937400374013740237403374043740537406374073740837409374103741137412374133741437415374163741737418374193742037421374223742337424374253742637427374283742937430374313743237433374343743537436374373743837439374403744137442374433744437445374463744737448374493745037451374523745337454374553745637457374583745937460374613746237463374643746537466374673746837469374703747137472374733747437475374763747737478374793748037481374823748337484374853748637487374883748937490374913749237493374943749537496374973749837499375003750137502375033750437505375063750737508375093751037511375123751337514375153751637517375183751937520375213752237523375243752537526375273752837529375303753137532375333753437535375363753737538375393754037541375423754337544375453754637547375483754937550375513755237553375543755537556375573755837559375603756137562375633756437565375663756737568375693757037571375723757337574375753757637577375783757937580375813758237583375843758537586375873758837589375903759137592375933759437595375963759737598375993760037601376023760337604376053760637607376083760937610376113761237613376143761537616376173761837619376203762137622376233762437625376263762737628376293763037631376323763337634376353763637637376383763937640376413764237643376443764537646376473764837649376503765137652376533765437655376563765737658376593766037661376623766337664376653766637667376683766937670376713767237673376743767537676376773767837679376803768137682376833768437685376863768737688376893769037691376923769337694376953769637697376983769937700377013770237703377043770537706377073770837709377103771137712377133771437715377163771737718377193772037721377223772337724377253772637727377283772937730377313773237733377343773537736377373773837739377403774137742377433774437745377463774737748377493775037751377523775337754377553775637757377583775937760377613776237763377643776537766377673776837769377703777137772377733777437775377763777737778377793778037781377823778337784377853778637787377883778937790377913779237793377943779537796377973779837799378003780137802378033780437805378063780737808378093781037811378123781337814378153781637817378183781937820378213782237823378243782537826378273782837829378303783137832378333783437835378363783737838378393784037841378423784337844378453784637847378483784937850378513785237853378543785537856378573785837859378603786137862378633786437865378663786737868378693787037871378723787337874378753787637877378783787937880378813788237883378843788537886378873788837889378903789137892378933789437895378963789737898378993790037901379023790337904379053790637907379083790937910379113791237913379143791537916379173791837919379203792137922379233792437925379263792737928379293793037931379323793337934379353793637937379383793937940379413794237943379443794537946379473794837949379503795137952379533795437955379563795737958379593796037961379623796337964379653796637967379683796937970379713797237973379743797537976379773797837979379803798137982379833798437985379863798737988379893799037991379923799337994379953799637997379983799938000380013800238003380043800538006380073800838009380103801138012380133801438015380163801738018380193802038021380223802338024380253802638027380283802938030380313803238033380343803538036380373803838039380403804138042380433804438045380463804738048380493805038051380523805338054380553805638057380583805938060380613806238063380643806538066380673806838069380703807138072380733807438075380763807738078380793808038081380823808338084380853808638087380883808938090380913809238093380943809538096380973809838099381003810138102381033810438105381063810738108381093811038111381123811338114381153811638117381183811938120381213812238123381243812538126381273812838129381303813138132381333813438135381363813738138381393814038141381423814338144381453814638147381483814938150381513815238153381543815538156381573815838159381603816138162381633816438165381663816738168381693817038171381723817338174381753817638177381783817938180381813818238183381843818538186381873818838189381903819138192381933819438195381963819738198381993820038201382023820338204382053820638207382083820938210382113821238213382143821538216382173821838219382203822138222382233822438225382263822738228382293823038231382323823338234382353823638237382383823938240382413824238243382443824538246382473824838249382503825138252382533825438255382563825738258382593826038261382623826338264382653826638267382683826938270382713827238273382743827538276382773827838279382803828138282382833828438285382863828738288382893829038291382923829338294382953829638297382983829938300383013830238303383043830538306383073830838309383103831138312383133831438315383163831738318383193832038321383223832338324383253832638327383283832938330383313833238333383343833538336383373833838339383403834138342383433834438345383463834738348383493835038351383523835338354383553835638357383583835938360383613836238363383643836538366383673836838369383703837138372383733837438375383763837738378383793838038381383823838338384383853838638387383883838938390383913839238393383943839538396383973839838399384003840138402384033840438405384063840738408384093841038411384123841338414384153841638417384183841938420384213842238423384243842538426384273842838429384303843138432384333843438435384363843738438384393844038441384423844338444384453844638447384483844938450384513845238453384543845538456384573845838459384603846138462384633846438465384663846738468384693847038471384723847338474384753847638477384783847938480384813848238483384843848538486384873848838489384903849138492384933849438495384963849738498384993850038501385023850338504385053850638507385083850938510385113851238513385143851538516385173851838519385203852138522385233852438525385263852738528385293853038531385323853338534385353853638537385383853938540385413854238543385443854538546385473854838549385503855138552385533855438555385563855738558385593856038561385623856338564385653856638567385683856938570385713857238573385743857538576385773857838579385803858138582385833858438585385863858738588385893859038591385923859338594385953859638597385983859938600386013860238603386043860538606386073860838609386103861138612386133861438615386163861738618386193862038621386223862338624386253862638627386283862938630386313863238633386343863538636386373863838639386403864138642386433864438645386463864738648386493865038651386523865338654386553865638657386583865938660386613866238663386643866538666386673866838669386703867138672386733867438675386763867738678386793868038681386823868338684386853868638687386883868938690386913869238693386943869538696386973869838699387003870138702387033870438705387063870738708387093871038711387123871338714387153871638717387183871938720387213872238723387243872538726387273872838729387303873138732387333873438735387363873738738387393874038741387423874338744387453874638747387483874938750387513875238753387543875538756387573875838759387603876138762387633876438765387663876738768387693877038771387723877338774387753877638777387783877938780387813878238783387843878538786387873878838789387903879138792387933879438795387963879738798387993880038801388023880338804388053880638807388083880938810388113881238813388143881538816388173881838819388203882138822388233882438825388263882738828388293883038831388323883338834388353883638837388383883938840388413884238843388443884538846388473884838849388503885138852388533885438855388563885738858388593886038861388623886338864388653886638867388683886938870388713887238873388743887538876388773887838879388803888138882388833888438885388863888738888388893889038891388923889338894388953889638897388983889938900389013890238903389043890538906389073890838909389103891138912389133891438915389163891738918389193892038921389223892338924389253892638927389283892938930389313893238933389343893538936389373893838939389403894138942389433894438945389463894738948389493895038951389523895338954389553895638957389583895938960389613896238963389643896538966389673896838969389703897138972389733897438975389763897738978389793898038981389823898338984389853898638987389883898938990389913899238993389943899538996389973899838999390003900139002390033900439005390063900739008390093901039011390123901339014390153901639017390183901939020390213902239023390243902539026390273902839029390303903139032390333903439035390363903739038390393904039041390423904339044390453904639047390483904939050390513905239053390543905539056390573905839059390603906139062390633906439065390663906739068390693907039071390723907339074390753907639077390783907939080390813908239083390843908539086390873908839089390903909139092390933909439095390963909739098390993910039101391023910339104391053910639107391083910939110391113911239113391143911539116391173911839119391203912139122391233912439125391263912739128391293913039131391323913339134391353913639137391383913939140391413914239143391443914539146391473914839149391503915139152391533915439155391563915739158391593916039161391623916339164391653916639167391683916939170391713917239173391743917539176391773917839179391803918139182391833918439185391863918739188391893919039191391923919339194391953919639197391983919939200392013920239203392043920539206392073920839209392103921139212392133921439215392163921739218392193922039221392223922339224392253922639227392283922939230392313923239233392343923539236392373923839239392403924139242392433924439245392463924739248392493925039251392523925339254392553925639257392583925939260392613926239263392643926539266392673926839269392703927139272392733927439275392763927739278392793928039281392823928339284392853928639287392883928939290392913929239293392943929539296392973929839299393003930139302393033930439305393063930739308393093931039311393123931339314393153931639317393183931939320393213932239323393243932539326393273932839329393303933139332393333933439335393363933739338393393934039341393423934339344393453934639347393483934939350393513935239353393543935539356393573935839359393603936139362393633936439365393663936739368393693937039371393723937339374393753937639377393783937939380393813938239383393843938539386393873938839389393903939139392393933939439395393963939739398393993940039401394023940339404394053940639407394083940939410394113941239413394143941539416394173941839419394203942139422394233942439425394263942739428394293943039431394323943339434394353943639437394383943939440394413944239443394443944539446394473944839449394503945139452394533945439455394563945739458394593946039461394623946339464394653946639467394683946939470394713947239473394743947539476394773947839479394803948139482394833948439485394863948739488394893949039491394923949339494394953949639497394983949939500395013950239503395043950539506395073950839509395103951139512395133951439515
  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"), require("rxjs/subject/ReplaySubject"), require("rxjs/operator/take"));
  4. else if(typeof define === 'function' && define.amd)
  5. define(["Rx", "rxjs/observable/fromPromise", "rxjs/operator/toPromise", "rxjs/subject/ReplaySubject", "rxjs/operator/take"], factory);
  6. else if(typeof exports === 'object')
  7. exports["ng"] = factory(require("Rx"), require("rxjs/observable/fromPromise"), require("rxjs/operator/toPromise"), require("rxjs/subject/ReplaySubject"), require("rxjs/operator/take"));
  8. else
  9. root["ng"] = factory(root["Rx"], root["Rx"]["Observable"], root["Rx"]["Observable"]["prototype"], root["Rx"], root["Rx"]["Observable"]["prototype"]);
  10. })(this, function(__WEBPACK_EXTERNAL_MODULE_62__, __WEBPACK_EXTERNAL_MODULE_63__, __WEBPACK_EXTERNAL_MODULE_64__, __WEBPACK_EXTERNAL_MODULE_279__, __WEBPACK_EXTERNAL_MODULE_280__) {
  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. // this bundle is almost identical to the angular2.umd.js
  61. // the only difference being "testing" export
  62. exports.core = __webpack_require__(2);
  63. exports.common = __webpack_require__(104);
  64. exports.compiler = __webpack_require__(147);
  65. exports.platform = {
  66. browser: __webpack_require__(179),
  67. common_dom: __webpack_require__(203)
  68. };
  69. exports.http = __webpack_require__(209);
  70. exports.router = __webpack_require__(224);
  71. exports.router_link_dsl = __webpack_require__(248);
  72. exports.instrumentation = __webpack_require__(250);
  73. exports.upgrade = __webpack_require__(251);
  74. // this is the only difference as compared to the angular2-all.umd.js bundle
  75. exports.testing = __webpack_require__(259);
  76. exports.http.testing = __webpack_require__(277);
  77. exports.router.testing = __webpack_require__(281);
  78. /***/ },
  79. /* 2 */
  80. /***/ function(module, exports, __webpack_require__) {
  81. function __export(m) {
  82. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  83. }
  84. /**
  85. * @module
  86. * @description
  87. * Starting point to import all public core APIs.
  88. */
  89. __export(__webpack_require__(3));
  90. __export(__webpack_require__(57));
  91. __export(__webpack_require__(58));
  92. __export(__webpack_require__(6));
  93. __export(__webpack_require__(59));
  94. var lang_1 = __webpack_require__(5);
  95. exports.enableProdMode = lang_1.enableProdMode;
  96. var application_ref_1 = __webpack_require__(65);
  97. exports.platform = application_ref_1.platform;
  98. exports.createNgZone = application_ref_1.createNgZone;
  99. exports.PlatformRef = application_ref_1.PlatformRef;
  100. exports.ApplicationRef = application_ref_1.ApplicationRef;
  101. var application_tokens_1 = __webpack_require__(67);
  102. exports.APP_ID = application_tokens_1.APP_ID;
  103. exports.APP_COMPONENT = application_tokens_1.APP_COMPONENT;
  104. exports.APP_INITIALIZER = application_tokens_1.APP_INITIALIZER;
  105. exports.PACKAGE_ROOT_URL = application_tokens_1.PACKAGE_ROOT_URL;
  106. exports.PLATFORM_INITIALIZER = application_tokens_1.PLATFORM_INITIALIZER;
  107. __export(__webpack_require__(98));
  108. __export(__webpack_require__(99));
  109. __export(__webpack_require__(100));
  110. var debug_element_1 = __webpack_require__(101);
  111. exports.DebugElement = debug_element_1.DebugElement;
  112. exports.Scope = debug_element_1.Scope;
  113. exports.inspectElement = debug_element_1.inspectElement;
  114. exports.asNativeElements = debug_element_1.asNativeElements;
  115. __export(__webpack_require__(68));
  116. __export(__webpack_require__(24));
  117. __export(__webpack_require__(95));
  118. __export(__webpack_require__(102));
  119. __export(__webpack_require__(103));
  120. __export(__webpack_require__(16));
  121. /***/ },
  122. /* 3 */
  123. /***/ function(module, exports, __webpack_require__) {
  124. /**
  125. * This indirection is needed to free up Component, etc symbols in the public API
  126. * to be used by the decorator versions of these annotations.
  127. */
  128. var di_1 = __webpack_require__(4);
  129. exports.QueryMetadata = di_1.QueryMetadata;
  130. exports.ContentChildrenMetadata = di_1.ContentChildrenMetadata;
  131. exports.ContentChildMetadata = di_1.ContentChildMetadata;
  132. exports.ViewChildrenMetadata = di_1.ViewChildrenMetadata;
  133. exports.ViewQueryMetadata = di_1.ViewQueryMetadata;
  134. exports.ViewChildMetadata = di_1.ViewChildMetadata;
  135. exports.AttributeMetadata = di_1.AttributeMetadata;
  136. var directives_1 = __webpack_require__(23);
  137. exports.ComponentMetadata = directives_1.ComponentMetadata;
  138. exports.DirectiveMetadata = directives_1.DirectiveMetadata;
  139. exports.PipeMetadata = directives_1.PipeMetadata;
  140. exports.InputMetadata = directives_1.InputMetadata;
  141. exports.OutputMetadata = directives_1.OutputMetadata;
  142. exports.HostBindingMetadata = directives_1.HostBindingMetadata;
  143. exports.HostListenerMetadata = directives_1.HostListenerMetadata;
  144. var view_1 = __webpack_require__(56);
  145. exports.ViewMetadata = view_1.ViewMetadata;
  146. exports.ViewEncapsulation = view_1.ViewEncapsulation;
  147. var di_2 = __webpack_require__(4);
  148. var directives_2 = __webpack_require__(23);
  149. var view_2 = __webpack_require__(56);
  150. var decorators_1 = __webpack_require__(9);
  151. // TODO(alexeagle): remove the duplication of this doc. It is copied from ComponentMetadata.
  152. /**
  153. * Declare reusable UI building blocks for an application.
  154. *
  155. * Each Angular component requires a single `@Component` and at least one `@View` annotation. The
  156. * `@Component`
  157. * annotation specifies when a component is instantiated, and which properties and hostListeners it
  158. * binds to.
  159. *
  160. * When a component is instantiated, Angular
  161. * - creates a shadow DOM for the component.
  162. * - loads the selected template into the shadow DOM.
  163. * - creates all the injectable objects configured with `providers` and `viewProviders`.
  164. *
  165. * All template expressions and statements are then evaluated against the component instance.
  166. *
  167. * For details on the `@View` annotation, see {@link ViewMetadata}.
  168. *
  169. * ## Lifecycle hooks
  170. *
  171. * When the component class implements some {@link angular2/lifecycle_hooks} the callbacks are
  172. * called by the change detection at defined points in time during the life of the component.
  173. *
  174. * ### Example
  175. *
  176. * {@example core/ts/metadata/metadata.ts region='component'}
  177. */
  178. exports.Component = decorators_1.makeDecorator(directives_2.ComponentMetadata, function (fn) { return fn.View = exports.View; });
  179. // TODO(alexeagle): remove the duplication of this doc. It is copied from DirectiveMetadata.
  180. /**
  181. * Directives allow you to attach behavior to elements in the DOM.
  182. *
  183. * {@link DirectiveMetadata}s with an embedded view are called {@link ComponentMetadata}s.
  184. *
  185. * A directive consists of a single directive annotation and a controller class. When the
  186. * directive's `selector` matches
  187. * elements in the DOM, the following steps occur:
  188. *
  189. * 1. For each directive, the `ElementInjector` attempts to resolve the directive's constructor
  190. * arguments.
  191. * 2. Angular instantiates directives for each matched element using `ElementInjector` in a
  192. * depth-first order,
  193. * as declared in the HTML.
  194. *
  195. * ## Understanding How Injection Works
  196. *
  197. * There are three stages of injection resolution.
  198. * - *Pre-existing Injectors*:
  199. * - The terminal {@link Injector} cannot resolve dependencies. It either throws an error or, if
  200. * the dependency was
  201. * specified as `@Optional`, returns `null`.
  202. * - The platform injector resolves browser singleton resources, such as: cookies, title,
  203. * location, and others.
  204. * - *Component Injectors*: Each component instance has its own {@link Injector}, and they follow
  205. * the same parent-child hierarchy
  206. * as the component instances in the DOM.
  207. * - *Element Injectors*: Each component instance has a Shadow DOM. Within the Shadow DOM each
  208. * element has an `ElementInjector`
  209. * which follow the same parent-child hierarchy as the DOM elements themselves.
  210. *
  211. * When a template is instantiated, it also must instantiate the corresponding directives in a
  212. * depth-first order. The
  213. * current `ElementInjector` resolves the constructor dependencies for each directive.
  214. *
  215. * Angular then resolves dependencies as follows, according to the order in which they appear in the
  216. * {@link ViewMetadata}:
  217. *
  218. * 1. Dependencies on the current element
  219. * 2. Dependencies on element injectors and their parents until it encounters a Shadow DOM boundary
  220. * 3. Dependencies on component injectors and their parents until it encounters the root component
  221. * 4. Dependencies on pre-existing injectors
  222. *
  223. *
  224. * The `ElementInjector` can inject other directives, element-specific special objects, or it can
  225. * delegate to the parent
  226. * injector.
  227. *
  228. * To inject other directives, declare the constructor parameter as:
  229. * - `directive:DirectiveType`: a directive on the current element only
  230. * - `@Host() directive:DirectiveType`: any directive that matches the type between the current
  231. * element and the
  232. * Shadow DOM root.
  233. * - `@Query(DirectiveType) query:QueryList<DirectiveType>`: A live collection of direct child
  234. * directives.
  235. * - `@QueryDescendants(DirectiveType) query:QueryList<DirectiveType>`: A live collection of any
  236. * child directives.
  237. *
  238. * To inject element-specific special objects, declare the constructor parameter as:
  239. * - `element: ElementRef` to obtain a reference to logical element in the view.
  240. * - `viewContainer: ViewContainerRef` to control child template instantiation, for
  241. * {@link DirectiveMetadata} directives only
  242. * - `bindingPropagation: BindingPropagation` to control change detection in a more granular way.
  243. *
  244. * ### Example
  245. *
  246. * The following example demonstrates how dependency injection resolves constructor arguments in
  247. * practice.
  248. *
  249. *
  250. * Assume this HTML template:
  251. *
  252. * ```
  253. * <div dependency="1">
  254. * <div dependency="2">
  255. * <div dependency="3" my-directive>
  256. * <div dependency="4">
  257. * <div dependency="5"></div>
  258. * </div>
  259. * <div dependency="6"></div>
  260. * </div>
  261. * </div>
  262. * </div>
  263. * ```
  264. *
  265. * With the following `dependency` decorator and `SomeService` injectable class.
  266. *
  267. * ```
  268. * @Injectable()
  269. * class SomeService {
  270. * }
  271. *
  272. * @Directive({
  273. * selector: '[dependency]',
  274. * inputs: [
  275. * 'id: dependency'
  276. * ]
  277. * })
  278. * class Dependency {
  279. * id:string;
  280. * }
  281. * ```
  282. *
  283. * Let's step through the different ways in which `MyDirective` could be declared...
  284. *
  285. *
  286. * ### No injection
  287. *
  288. * Here the constructor is declared with no arguments, therefore nothing is injected into
  289. * `MyDirective`.
  290. *
  291. * ```
  292. * @Directive({ selector: '[my-directive]' })
  293. * class MyDirective {
  294. * constructor() {
  295. * }
  296. * }
  297. * ```
  298. *
  299. * This directive would be instantiated with no dependencies.
  300. *
  301. *
  302. * ### Component-level injection
  303. *
  304. * Directives can inject any injectable instance from the closest component injector or any of its
  305. * parents.
  306. *
  307. * Here, the constructor declares a parameter, `someService`, and injects the `SomeService` type
  308. * from the parent
  309. * component's injector.
  310. * ```
  311. * @Directive({ selector: '[my-directive]' })
  312. * class MyDirective {
  313. * constructor(someService: SomeService) {
  314. * }
  315. * }
  316. * ```
  317. *
  318. * This directive would be instantiated with a dependency on `SomeService`.
  319. *
  320. *
  321. * ### Injecting a directive from the current element
  322. *
  323. * Directives can inject other directives declared on the current element.
  324. *
  325. * ```
  326. * @Directive({ selector: '[my-directive]' })
  327. * class MyDirective {
  328. * constructor(dependency: Dependency) {
  329. * expect(dependency.id).toEqual(3);
  330. * }
  331. * }
  332. * ```
  333. * This directive would be instantiated with `Dependency` declared at the same element, in this case
  334. * `dependency="3"`.
  335. *
  336. * ### Injecting a directive from any ancestor elements
  337. *
  338. * Directives can inject other directives declared on any ancestor element (in the current Shadow
  339. * DOM), i.e. on the current element, the
  340. * parent element, or its parents.
  341. * ```
  342. * @Directive({ selector: '[my-directive]' })
  343. * class MyDirective {
  344. * constructor(@Host() dependency: Dependency) {
  345. * expect(dependency.id).toEqual(2);
  346. * }
  347. * }
  348. * ```
  349. *
  350. * `@Host` checks the current element, the parent, as well as its parents recursively. If
  351. * `dependency="2"` didn't
  352. * exist on the direct parent, this injection would
  353. * have returned
  354. * `dependency="1"`.
  355. *
  356. *
  357. * ### Injecting a live collection of direct child directives
  358. *
  359. *
  360. * A directive can also query for other child directives. Since parent directives are instantiated
  361. * before child directives, a directive can't simply inject the list of child directives. Instead,
  362. * the directive injects a {@link QueryList}, which updates its contents as children are added,
  363. * removed, or moved by a directive that uses a {@link ViewContainerRef} such as a `ngFor`, an
  364. * `ngIf`, or an `ngSwitch`.
  365. *
  366. * ```
  367. * @Directive({ selector: '[my-directive]' })
  368. * class MyDirective {
  369. * constructor(@Query(Dependency) dependencies:QueryList<Dependency>) {
  370. * }
  371. * }
  372. * ```
  373. *
  374. * This directive would be instantiated with a {@link QueryList} which contains `Dependency` 4 and
  375. * 6. Here, `Dependency` 5 would not be included, because it is not a direct child.
  376. *
  377. * ### Injecting a live collection of descendant directives
  378. *
  379. * By passing the descendant flag to `@Query` above, we can include the children of the child
  380. * elements.
  381. *
  382. * ```
  383. * @Directive({ selector: '[my-directive]' })
  384. * class MyDirective {
  385. * constructor(@Query(Dependency, {descendants: true}) dependencies:QueryList<Dependency>) {
  386. * }
  387. * }
  388. * ```
  389. *
  390. * This directive would be instantiated with a Query which would contain `Dependency` 4, 5 and 6.
  391. *
  392. * ### Optional injection
  393. *
  394. * The normal behavior of directives is to return an error when a specified dependency cannot be
  395. * resolved. If you
  396. * would like to inject `null` on unresolved dependency instead, you can annotate that dependency
  397. * with `@Optional()`.
  398. * This explicitly permits the author of a template to treat some of the surrounding directives as
  399. * optional.
  400. *
  401. * ```
  402. * @Directive({ selector: '[my-directive]' })
  403. * class MyDirective {
  404. * constructor(@Optional() dependency:Dependency) {
  405. * }
  406. * }
  407. * ```
  408. *
  409. * This directive would be instantiated with a `Dependency` directive found on the current element.
  410. * If none can be
  411. * found, the injector supplies `null` instead of throwing an error.
  412. *
  413. * ### Example
  414. *
  415. * Here we use a decorator directive to simply define basic tool-tip behavior.
  416. *
  417. * ```
  418. * @Directive({
  419. * selector: '[tooltip]',
  420. * inputs: [
  421. * 'text: tooltip'
  422. * ],
  423. * host: {
  424. * '(mouseenter)': 'onMouseEnter()',
  425. * '(mouseleave)': 'onMouseLeave()'
  426. * }
  427. * })
  428. * class Tooltip{
  429. * text:string;
  430. * overlay:Overlay; // NOT YET IMPLEMENTED
  431. * overlayManager:OverlayManager; // NOT YET IMPLEMENTED
  432. *
  433. * constructor(overlayManager:OverlayManager) {
  434. * this.overlay = overlay;
  435. * }
  436. *
  437. * onMouseEnter() {
  438. * // exact signature to be determined
  439. * this.overlay = this.overlayManager.open(text, ...);
  440. * }
  441. *
  442. * onMouseLeave() {
  443. * this.overlay.close();
  444. * this.overlay = null;
  445. * }
  446. * }
  447. * ```
  448. * In our HTML template, we can then add this behavior to a `<div>` or any other element with the
  449. * `tooltip` selector,
  450. * like so:
  451. *
  452. * ```
  453. * <div tooltip="some text here"></div>
  454. * ```
  455. *
  456. * Directives can also control the instantiation, destruction, and positioning of inline template
  457. * elements:
  458. *
  459. * A directive uses a {@link ViewContainerRef} to instantiate, insert, move, and destroy views at
  460. * runtime.
  461. * The {@link ViewContainerRef} is created as a result of `<template>` element, and represents a
  462. * location in the current view
  463. * where these actions are performed.
  464. *
  465. * Views are always created as children of the current {@link ViewMetadata}, and as siblings of the
  466. * `<template>` element. Thus a
  467. * directive in a child view cannot inject the directive that created it.
  468. *
  469. * Since directives that create views via ViewContainers are common in Angular, and using the full
  470. * `<template>` element syntax is wordy, Angular
  471. * also supports a shorthand notation: `<li *foo="bar">` and `<li template="foo: bar">` are
  472. * equivalent.
  473. *
  474. * Thus,
  475. *
  476. * ```
  477. * <ul>
  478. * <li *foo="bar" title="text"></li>
  479. * </ul>
  480. * ```
  481. *
  482. * Expands in use to:
  483. *
  484. * ```
  485. * <ul>
  486. * <template [foo]="bar">
  487. * <li title="text"></li>
  488. * </template>
  489. * </ul>
  490. * ```
  491. *
  492. * Notice that although the shorthand places `*foo="bar"` within the `<li>` element, the binding for
  493. * the directive
  494. * controller is correctly instantiated on the `<template>` element rather than the `<li>` element.
  495. *
  496. * ## Lifecycle hooks
  497. *
  498. * When the directive class implements some {@link angular2/lifecycle_hooks} the callbacks are
  499. * called by the change detection at defined points in time during the life of the directive.
  500. *
  501. * ### Example
  502. *
  503. * Let's suppose we want to implement the `unless` behavior, to conditionally include a template.
  504. *
  505. * Here is a simple directive that triggers on an `unless` selector:
  506. *
  507. * ```
  508. * @Directive({
  509. * selector: '[unless]',
  510. * inputs: ['unless']
  511. * })
  512. * export class Unless {
  513. * viewContainer: ViewContainerRef;
  514. * templateRef: TemplateRef;
  515. * prevCondition: boolean;
  516. *
  517. * constructor(viewContainer: ViewContainerRef, templateRef: TemplateRef) {
  518. * this.viewContainer = viewContainer;
  519. * this.templateRef = templateRef;
  520. * this.prevCondition = null;
  521. * }
  522. *
  523. * set unless(newCondition) {
  524. * if (newCondition && (isBlank(this.prevCondition) || !this.prevCondition)) {
  525. * this.prevCondition = true;
  526. * this.viewContainer.clear();
  527. * } else if (!newCondition && (isBlank(this.prevCondition) || this.prevCondition)) {
  528. * this.prevCondition = false;
  529. * this.viewContainer.create(this.templateRef);
  530. * }
  531. * }
  532. * }
  533. * ```
  534. *
  535. * We can then use this `unless` selector in a template:
  536. * ```
  537. * <ul>
  538. * <li *unless="expr"></li>
  539. * </ul>
  540. * ```
  541. *
  542. * Once the directive instantiates the child view, the shorthand notation for the template expands
  543. * and the result is:
  544. *
  545. * ```
  546. * <ul>
  547. * <template [unless]="exp">
  548. * <li></li>
  549. * </template>
  550. * <li></li>
  551. * </ul>
  552. * ```
  553. *
  554. * Note also that although the `<li></li>` template still exists inside the `<template></template>`,
  555. * the instantiated
  556. * view occurs on the second `<li></li>` which is a sibling to the `<template>` element.
  557. */
  558. exports.Directive = decorators_1.makeDecorator(directives_2.DirectiveMetadata);
  559. // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewMetadata.
  560. /**
  561. * Metadata properties available for configuring Views.
  562. *
  563. * Each Angular component requires a single `@Component` and at least one `@View` annotation. The
  564. * `@View` annotation specifies the HTML template to use, and lists the directives that are active
  565. * within the template.
  566. *
  567. * When a component is instantiated, the template is loaded into the component's shadow root, and
  568. * the expressions and statements in the template are evaluated against the component.
  569. *
  570. * For details on the `@Component` annotation, see {@link ComponentMetadata}.
  571. *
  572. * ### Example
  573. *
  574. * ```
  575. * @Component({
  576. * selector: 'greet',
  577. * template: 'Hello {{name}}!',
  578. * directives: [GreetUser, Bold]
  579. * })
  580. * class Greet {
  581. * name: string;
  582. *
  583. * constructor() {
  584. * this.name = 'World';
  585. * }
  586. * }
  587. * ```
  588. */
  589. exports.View = decorators_1.makeDecorator(view_2.ViewMetadata, function (fn) { return fn.View = exports.View; });
  590. /**
  591. * Specifies that a constant attribute value should be injected.
  592. *
  593. * The directive can inject constant string literals of host element attributes.
  594. *
  595. * ### Example
  596. *
  597. * Suppose we have an `<input>` element and want to know its `type`.
  598. *
  599. * ```html
  600. * <input type="text">
  601. * ```
  602. *
  603. * A decorator can inject string literal `text` like so:
  604. *
  605. * {@example core/ts/metadata/metadata.ts region='attributeMetadata'}
  606. */
  607. exports.Attribute = decorators_1.makeParamDecorator(di_2.AttributeMetadata);
  608. // TODO(alexeagle): remove the duplication of this doc. It is copied from QueryMetadata.
  609. /**
  610. * Declares an injectable parameter to be a live list of directives or variable
  611. * bindings from the content children of a directive.
  612. *
  613. * ### Example ([live demo](http://plnkr.co/edit/lY9m8HLy7z06vDoUaSN2?p=preview))
  614. *
  615. * Assume that `<tabs>` component would like to get a list its children `<pane>`
  616. * components as shown in this example:
  617. *
  618. * ```html
  619. * <tabs>
  620. * <pane title="Overview">...</pane>
  621. * <pane *ngFor="#o of objects" [title]="o.title">{{o.text}}</pane>
  622. * </tabs>
  623. * ```
  624. *
  625. * The preferred solution is to query for `Pane` directives using this decorator.
  626. *
  627. * ```javascript
  628. * @Component({
  629. * selector: 'pane',
  630. * inputs: ['title']
  631. * })
  632. * class Pane {
  633. * title:string;
  634. * }
  635. *
  636. * @Component({
  637. * selector: 'tabs',
  638. * template: `
  639. * <ul>
  640. * <li *ngFor="#pane of panes">{{pane.title}}</li>
  641. * </ul>
  642. * <content></content>
  643. * `
  644. * })
  645. * class Tabs {
  646. * panes: QueryList<Pane>;
  647. * constructor(@Query(Pane) panes:QueryList<Pane>) {
  648. * this.panes = panes;
  649. * }
  650. * }
  651. * ```
  652. *
  653. * A query can look for variable bindings by passing in a string with desired binding symbol.
  654. *
  655. * ### Example ([live demo](http://plnkr.co/edit/sT2j25cH1dURAyBRCKx1?p=preview))
  656. * ```html
  657. * <seeker>
  658. * <div #findme>...</div>
  659. * </seeker>
  660. *
  661. * @Component({ selector: 'foo' })
  662. * class seeker {
  663. * constructor(@Query('findme') elList: QueryList<ElementRef>) {...}
  664. * }
  665. * ```
  666. *
  667. * In this case the object that is injected depend on the type of the variable
  668. * binding. It can be an ElementRef, a directive or a component.
  669. *
  670. * Passing in a comma separated list of variable bindings will query for all of them.
  671. *
  672. * ```html
  673. * <seeker>
  674. * <div #findMe>...</div>
  675. * <div #findMeToo>...</div>
  676. * </seeker>
  677. *
  678. * @Component({
  679. * selector: 'foo'
  680. * })
  681. * class Seeker {
  682. * constructor(@Query('findMe, findMeToo') elList: QueryList<ElementRef>) {...}
  683. * }
  684. * ```
  685. *
  686. * Configure whether query looks for direct children or all descendants
  687. * of the querying element, by using the `descendants` parameter.
  688. * It is set to `false` by default.
  689. *
  690. * ### Example ([live demo](http://plnkr.co/edit/wtGeB977bv7qvA5FTYl9?p=preview))
  691. * ```html
  692. * <container #first>
  693. * <item>a</item>
  694. * <item>b</item>
  695. * <container #second>
  696. * <item>c</item>
  697. * </container>
  698. * </container>
  699. * ```
  700. *
  701. * When querying for items, the first container will see only `a` and `b` by default,
  702. * but with `Query(TextDirective, {descendants: true})` it will see `c` too.
  703. *
  704. * The queried directives are kept in a depth-first pre-order with respect to their
  705. * positions in the DOM.
  706. *
  707. * Query does not look deep into any subcomponent views.
  708. *
  709. * Query is updated as part of the change-detection cycle. Since change detection
  710. * happens after construction of a directive, QueryList will always be empty when observed in the
  711. * constructor.
  712. *
  713. * The injected object is an unmodifiable live list.
  714. * See {@link QueryList} for more details.
  715. */
  716. exports.Query = decorators_1.makeParamDecorator(di_2.QueryMetadata);
  717. // TODO(alexeagle): remove the duplication of this doc. It is copied from ContentChildrenMetadata.
  718. /**
  719. * Configures a content query.
  720. *
  721. * Content queries are set before the `ngAfterContentInit` callback is called.
  722. *
  723. * ### Example
  724. *
  725. * ```
  726. * @Directive({
  727. * selector: 'someDir'
  728. * })
  729. * class SomeDir {
  730. * @ContentChildren(ChildDirective) contentChildren: QueryList<ChildDirective>;
  731. *
  732. * ngAfterContentInit() {
  733. * // contentChildren is set
  734. * }
  735. * }
  736. * ```
  737. */
  738. exports.ContentChildren = decorators_1.makePropDecorator(di_2.ContentChildrenMetadata);
  739. // TODO(alexeagle): remove the duplication of this doc. It is copied from ContentChildMetadata.
  740. /**
  741. * Configures a content query.
  742. *
  743. * Content queries are set before the `ngAfterContentInit` callback is called.
  744. *
  745. * ### Example
  746. *
  747. * ```
  748. * @Directive({
  749. * selector: 'someDir'
  750. * })
  751. * class SomeDir {
  752. * @ContentChild(ChildDirective) contentChild;
  753. *
  754. * ngAfterContentInit() {
  755. * // contentChild is set
  756. * }
  757. * }
  758. * ```
  759. */
  760. exports.ContentChild = decorators_1.makePropDecorator(di_2.ContentChildMetadata);
  761. // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewChildrenMetadata.
  762. /**
  763. * Configures a view query.
  764. *
  765. * View queries are set before the `ngAfterViewInit` callback is called.
  766. *
  767. * ### Example
  768. *
  769. * ```
  770. * @Component({
  771. * selector: 'someDir',
  772. * templateUrl: 'someTemplate',
  773. * directives: [ItemDirective]
  774. * })
  775. * class SomeDir {
  776. * @ViewChildren(ItemDirective) viewChildren: QueryList<ItemDirective>;
  777. *
  778. * ngAfterViewInit() {
  779. * // viewChildren is set
  780. * }
  781. * }
  782. * ```
  783. */
  784. exports.ViewChildren = decorators_1.makePropDecorator(di_2.ViewChildrenMetadata);
  785. // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewChildMetadata.
  786. /**
  787. * Configures a view query.
  788. *
  789. * View queries are set before the `ngAfterViewInit` callback is called.
  790. *
  791. * ### Example
  792. *
  793. * ```
  794. * @Component({
  795. * selector: 'someDir',
  796. * templateUrl: 'someTemplate',
  797. * directives: [ItemDirective]
  798. * })
  799. * class SomeDir {
  800. * @ViewChild(ItemDirective) viewChild:ItemDirective;
  801. *
  802. * ngAfterViewInit() {
  803. * // viewChild is set
  804. * }
  805. * }
  806. * ```
  807. */
  808. exports.ViewChild = decorators_1.makePropDecorator(di_2.ViewChildMetadata);
  809. // TODO(alexeagle): remove the duplication of this doc. It is copied from ViewQueryMetadata.
  810. /**
  811. * Similar to {@link QueryMetadata}, but querying the component view, instead of
  812. * the content children.
  813. *
  814. * ### Example ([live demo](http://plnkr.co/edit/eNsFHDf7YjyM6IzKxM1j?p=preview))
  815. *
  816. * ```javascript
  817. * @Component({...})
  818. * @View({
  819. * template: `
  820. * <item> a </item>
  821. * <item> b </item>
  822. * <item> c </item>
  823. * `
  824. * })
  825. * class MyComponent {
  826. * shown: boolean;
  827. *
  828. * constructor(private @Query(Item) items:QueryList<Item>) {
  829. * items.onChange(() => console.log(items.length));
  830. * }
  831. * }
  832. * ```
  833. *
  834. * Supports the same querying parameters as {@link QueryMetadata}, except
  835. * `descendants`. This always queries the whole view.
  836. *
  837. * As `shown` is flipped between true and false, items will contain zero of one
  838. * items.
  839. *
  840. * Specifies that a {@link QueryList} should be injected.
  841. *
  842. * The injected object is an iterable and observable live list.
  843. * See {@link QueryList} for more details.
  844. */
  845. exports.ViewQuery = decorators_1.makeParamDecorator(di_2.ViewQueryMetadata);
  846. // TODO(alexeagle): remove the duplication of this doc. It is copied from PipeMetadata.
  847. /**
  848. * Declare reusable pipe function.
  849. *
  850. * ### Example
  851. *
  852. * {@example core/ts/metadata/metadata.ts region='pipe'}
  853. */
  854. exports.Pipe = decorators_1.makeDecorator(directives_2.PipeMetadata);
  855. // TODO(alexeagle): remove the duplication of this doc. It is copied from InputMetadata.
  856. /**
  857. * Declares a data-bound input property.
  858. *
  859. * Angular automatically updates data-bound properties during change detection.
  860. *
  861. * `InputMetadata` takes an optional parameter that specifies the name
  862. * used when instantiating a component in the template. When not provided,
  863. * the name of the decorated property is used.
  864. *
  865. * ### Example
  866. *
  867. * The following example creates a component with two input properties.
  868. *
  869. * ```typescript
  870. * @Component({
  871. * selector: 'bank-account',
  872. * template: `
  873. * Bank Name: {{bankName}}
  874. * Account Id: {{id}}
  875. * `
  876. * })
  877. * class BankAccount {
  878. * @Input() bankName: string;
  879. * @Input('account-id') id: string;
  880. *
  881. * // this property is not bound, and won't be automatically updated by Angular
  882. * normalizedBankName: string;
  883. * }
  884. *
  885. * @Component({
  886. * selector: 'app',
  887. * template: `
  888. * <bank-account bank-name="RBC" account-id="4747"></bank-account>
  889. * `,
  890. * directives: [BankAccount]
  891. * })
  892. * class App {}
  893. *
  894. * bootstrap(App);
  895. * ```
  896. */
  897. exports.Input = decorators_1.makePropDecorator(directives_2.InputMetadata);
  898. // TODO(alexeagle): remove the duplication of this doc. It is copied from OutputMetadata.
  899. /**
  900. * Declares an event-bound output property.
  901. *
  902. * When an output property emits an event, an event handler attached to that event
  903. * the template is invoked.
  904. *
  905. * `OutputMetadata` takes an optional parameter that specifies the name
  906. * used when instantiating a component in the template. When not provided,
  907. * the name of the decorated property is used.
  908. *
  909. * ### Example
  910. *
  911. * ```typescript
  912. * @Directive({
  913. * selector: 'interval-dir',
  914. * })
  915. * class IntervalDir {
  916. * @Output() everySecond = new EventEmitter();
  917. * @Output('everyFiveSeconds') five5Secs = new EventEmitter();
  918. *
  919. * constructor() {
  920. * setInterval(() => this.everySecond.emit("event"), 1000);
  921. * setInterval(() => this.five5Secs.emit("event"), 5000);
  922. * }
  923. * }
  924. *
  925. * @Component({
  926. * selector: 'app',
  927. * template: `
  928. * <interval-dir (every-second)="everySecond()" (every-five-seconds)="everyFiveSeconds()">
  929. * </interval-dir>
  930. * `,
  931. * directives: [IntervalDir]
  932. * })
  933. * class App {
  934. * everySecond() { console.log('second'); }
  935. * everyFiveSeconds() { console.log('five seconds'); }
  936. * }
  937. * bootstrap(App);
  938. * ```
  939. */
  940. exports.Output = decorators_1.makePropDecorator(directives_2.OutputMetadata);
  941. // TODO(alexeagle): remove the duplication of this doc. It is copied from HostBindingMetadata.
  942. /**
  943. * Declares a host property binding.
  944. *
  945. * Angular automatically checks host property bindings during change detection.
  946. * If a binding changes, it will update the host element of the directive.
  947. *
  948. * `HostBindingMetadata` takes an optional parameter that specifies the property
  949. * name of the host element that will be updated. When not provided,
  950. * the class property name is used.
  951. *
  952. * ### Example
  953. *
  954. * The following example creates a directive that sets the `valid` and `invalid` classes
  955. * on the DOM element that has ngModel directive on it.
  956. *
  957. * ```typescript
  958. * @Directive({selector: '[ngModel]'})
  959. * class NgModelStatus {
  960. * constructor(public control:NgModel) {}
  961. * @HostBinding('[class.valid]') get valid { return this.control.valid; }
  962. * @HostBinding('[class.invalid]') get invalid { return this.control.invalid; }
  963. * }
  964. *
  965. * @Component({
  966. * selector: 'app',
  967. * template: `<input [(ngModel)]="prop">`,
  968. * directives: [FORM_DIRECTIVES, NgModelStatus]
  969. * })
  970. * class App {
  971. * prop;
  972. * }
  973. *
  974. * bootstrap(App);
  975. * ```
  976. */
  977. exports.HostBinding = decorators_1.makePropDecorator(directives_2.HostBindingMetadata);
  978. // TODO(alexeagle): remove the duplication of this doc. It is copied from HostListenerMetadata.
  979. /**
  980. * Declares a host listener.
  981. *
  982. * Angular will invoke the decorated method when the host element emits the specified event.
  983. *
  984. * If the decorated method returns `false`, then `preventDefault` is applied on the DOM
  985. * event.
  986. *
  987. * ### Example
  988. *
  989. * The following example declares a directive that attaches a click listener to the button and
  990. * counts clicks.
  991. *
  992. * ```typescript
  993. * @Directive({selector: 'button[counting]'})
  994. * class CountClicks {
  995. * numberOfClicks = 0;
  996. *
  997. * @HostListener('click', ['$event.target'])
  998. * onClick(btn) {
  999. * console.log("button", btn, "number of clicks:", this.numberOfClicks++);
  1000. * }
  1001. * }
  1002. *
  1003. * @Component({
  1004. * selector: 'app',
  1005. * template: `<button counting>Increment</button>`,
  1006. * directives: [CountClicks]
  1007. * })
  1008. * class App {}
  1009. *
  1010. * bootstrap(App);
  1011. * ```
  1012. */
  1013. exports.HostListener = decorators_1.makePropDecorator(directives_2.HostListenerMetadata);
  1014. /***/ },
  1015. /* 4 */
  1016. /***/ function(module, exports, __webpack_require__) {
  1017. var __extends = (this && this.__extends) || function (d, b) {
  1018. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  1019. function __() { this.constructor = d; }
  1020. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  1021. };
  1022. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  1023. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  1024. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  1025. 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;
  1026. return c > 3 && r && Object.defineProperty(target, key, r), r;
  1027. };
  1028. var __metadata = (this && this.__metadata) || function (k, v) {
  1029. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  1030. };
  1031. var lang_1 = __webpack_require__(5);
  1032. var di_1 = __webpack_require__(6);
  1033. var metadata_1 = __webpack_require__(7);
  1034. /**
  1035. * Specifies that a constant attribute value should be injected.
  1036. *
  1037. * The directive can inject constant string literals of host element attributes.
  1038. *
  1039. * ### Example
  1040. *
  1041. * Suppose we have an `<input>` element and want to know its `type`.
  1042. *
  1043. * ```html
  1044. * <input type="text">
  1045. * ```
  1046. *
  1047. * A decorator can inject string literal `text` like so:
  1048. *
  1049. * {@example core/ts/metadata/metadata.ts region='attributeMetadata'}
  1050. */
  1051. var AttributeMetadata = (function (_super) {
  1052. __extends(AttributeMetadata, _super);
  1053. function AttributeMetadata(attributeName) {
  1054. _super.call(this);
  1055. this.attributeName = attributeName;
  1056. }
  1057. Object.defineProperty(AttributeMetadata.prototype, "token", {
  1058. get: function () {
  1059. // Normally one would default a token to a type of an injected value but here
  1060. // the type of a variable is "string" and we can't use primitive type as a return value
  1061. // so we use instance of Attribute instead. This doesn't matter much in practice as arguments
  1062. // with @Attribute annotation are injected by ElementInjector that doesn't take tokens into
  1063. // account.
  1064. return this;
  1065. },
  1066. enumerable: true,
  1067. configurable: true
  1068. });
  1069. AttributeMetadata.prototype.toString = function () { return "@Attribute(" + lang_1.stringify(this.attributeName) + ")"; };
  1070. AttributeMetadata = __decorate([
  1071. lang_1.CONST(),
  1072. __metadata('design:paramtypes', [String])
  1073. ], AttributeMetadata);
  1074. return AttributeMetadata;
  1075. })(metadata_1.DependencyMetadata);
  1076. exports.AttributeMetadata = AttributeMetadata;
  1077. /**
  1078. * Declares an injectable parameter to be a live list of directives or variable
  1079. * bindings from the content children of a directive.
  1080. *
  1081. * ### Example ([live demo](http://plnkr.co/edit/lY9m8HLy7z06vDoUaSN2?p=preview))
  1082. *
  1083. * Assume that `<tabs>` component would like to get a list its children `<pane>`
  1084. * components as shown in this example:
  1085. *
  1086. * ```html
  1087. * <tabs>
  1088. * <pane title="Overview">...</pane>
  1089. * <pane *ngFor="#o of objects" [title]="o.title">{{o.text}}</pane>
  1090. * </tabs>
  1091. * ```
  1092. *
  1093. * The preferred solution is to query for `Pane` directives using this decorator.
  1094. *
  1095. * ```javascript
  1096. * @Component({
  1097. * selector: 'pane',
  1098. * inputs: ['title']
  1099. * })
  1100. * class Pane {
  1101. * title:string;
  1102. * }
  1103. *
  1104. * @Component({
  1105. * selector: 'tabs',
  1106. * template: `
  1107. * <ul>
  1108. * <li *ngFor="#pane of panes">{{pane.title}}</li>
  1109. * </ul>
  1110. * <content></content>
  1111. * `
  1112. * })
  1113. * class Tabs {
  1114. * panes: QueryList<Pane>;
  1115. * constructor(@Query(Pane) panes:QueryList<Pane>) {
  1116. * this.panes = panes;
  1117. * }
  1118. * }
  1119. * ```
  1120. *
  1121. * A query can look for variable bindings by passing in a string with desired binding symbol.
  1122. *
  1123. * ### Example ([live demo](http://plnkr.co/edit/sT2j25cH1dURAyBRCKx1?p=preview))
  1124. * ```html
  1125. * <seeker>
  1126. * <div #findme>...</div>
  1127. * </seeker>
  1128. *
  1129. * @Component({ selector: 'seeker' })
  1130. * class Seeker {
  1131. * constructor(@Query('findme') elList: QueryList<ElementRef>) {...}
  1132. * }
  1133. * ```
  1134. *
  1135. * In this case the object that is injected depend on the type of the variable
  1136. * binding. It can be an ElementRef, a directive or a component.
  1137. *
  1138. * Passing in a comma separated list of variable bindings will query for all of them.
  1139. *
  1140. * ```html
  1141. * <seeker>
  1142. * <div #find-me>...</div>
  1143. * <div #find-me-too>...</div>
  1144. * </seeker>
  1145. *
  1146. * @Component({
  1147. * selector: 'seeker'
  1148. * })
  1149. * class Seeker {
  1150. * constructor(@Query('findMe, findMeToo') elList: QueryList<ElementRef>) {...}
  1151. * }
  1152. * ```
  1153. *
  1154. * Configure whether query looks for direct children or all descendants
  1155. * of the querying element, by using the `descendants` parameter.
  1156. * It is set to `false` by default.
  1157. *
  1158. * ### Example ([live demo](http://plnkr.co/edit/wtGeB977bv7qvA5FTYl9?p=preview))
  1159. * ```html
  1160. * <container #first>
  1161. * <item>a</item>
  1162. * <item>b</item>
  1163. * <container #second>
  1164. * <item>c</item>
  1165. * </container>
  1166. * </container>
  1167. * ```
  1168. *
  1169. * When querying for items, the first container will see only `a` and `b` by default,
  1170. * but with `Query(TextDirective, {descendants: true})` it will see `c` too.
  1171. *
  1172. * The queried directives are kept in a depth-first pre-order with respect to their
  1173. * positions in the DOM.
  1174. *
  1175. * Query does not look deep into any subcomponent views.
  1176. *
  1177. * Query is updated as part of the change-detection cycle. Since change detection
  1178. * happens after construction of a directive, QueryList will always be empty when observed in the
  1179. * constructor.
  1180. *
  1181. * The injected object is an unmodifiable live list.
  1182. * See {@link QueryList} for more details.
  1183. */
  1184. var QueryMetadata = (function (_super) {
  1185. __extends(QueryMetadata, _super);
  1186. function QueryMetadata(_selector, _a) {
  1187. var _b = _a === void 0 ? {} : _a, _c = _b.descendants, descendants = _c === void 0 ? false : _c, _d = _b.first, first = _d === void 0 ? false : _d;
  1188. _super.call(this);
  1189. this._selector = _selector;
  1190. this.descendants = descendants;
  1191. this.first = first;
  1192. }
  1193. Object.defineProperty(QueryMetadata.prototype, "isViewQuery", {
  1194. /**
  1195. * always `false` to differentiate it with {@link ViewQueryMetadata}.
  1196. */
  1197. get: function () { return false; },
  1198. enumerable: true,
  1199. configurable: true
  1200. });
  1201. Object.defineProperty(QueryMetadata.prototype, "selector", {
  1202. /**
  1203. * what this is querying for.
  1204. */
  1205. get: function () { return di_1.resolveForwardRef(this._selector); },
  1206. enumerable: true,
  1207. configurable: true
  1208. });
  1209. Object.defineProperty(QueryMetadata.prototype, "isVarBindingQuery", {
  1210. /**
  1211. * whether this is querying for a variable binding or a directive.
  1212. */
  1213. get: function () { return lang_1.isString(this.selector); },
  1214. enumerable: true,
  1215. configurable: true
  1216. });
  1217. Object.defineProperty(QueryMetadata.prototype, "varBindings", {
  1218. /**
  1219. * returns a list of variable bindings this is querying for.
  1220. * Only applicable if this is a variable bindings query.
  1221. */
  1222. get: function () { return this.selector.split(','); },
  1223. enumerable: true,
  1224. configurable: true
  1225. });
  1226. QueryMetadata.prototype.toString = function () { return "@Query(" + lang_1.stringify(this.selector) + ")"; };
  1227. QueryMetadata = __decorate([
  1228. lang_1.CONST(),
  1229. __metadata('design:paramtypes', [Object, Object])
  1230. ], QueryMetadata);
  1231. return QueryMetadata;
  1232. })(metadata_1.DependencyMetadata);
  1233. exports.QueryMetadata = QueryMetadata;
  1234. // TODO: add an example after ContentChildren and ViewChildren are in master
  1235. /**
  1236. * Configures a content query.
  1237. *
  1238. * Content queries are set before the `ngAfterContentInit` callback is called.
  1239. *
  1240. * ### Example
  1241. *
  1242. * ```
  1243. * @Directive({
  1244. * selector: 'someDir'
  1245. * })
  1246. * class SomeDir {
  1247. * @ContentChildren(ChildDirective) contentChildren: QueryList<ChildDirective>;
  1248. *
  1249. * ngAfterContentInit() {
  1250. * // contentChildren is set
  1251. * }
  1252. * }
  1253. * ```
  1254. */
  1255. var ContentChildrenMetadata = (function (_super) {
  1256. __extends(ContentChildrenMetadata, _super);
  1257. function ContentChildrenMetadata(_selector, _a) {
  1258. var _b = (_a === void 0 ? {} : _a).descendants, descendants = _b === void 0 ? false : _b;
  1259. _super.call(this, _selector, { descendants: descendants });
  1260. }
  1261. ContentChildrenMetadata = __decorate([
  1262. lang_1.CONST(),
  1263. __metadata('design:paramtypes', [Object, Object])
  1264. ], ContentChildrenMetadata);
  1265. return ContentChildrenMetadata;
  1266. })(QueryMetadata);
  1267. exports.ContentChildrenMetadata = ContentChildrenMetadata;
  1268. // TODO: add an example after ContentChild and ViewChild are in master
  1269. /**
  1270. * Configures a content query.
  1271. *
  1272. * Content queries are set before the `ngAfterContentInit` callback is called.
  1273. *
  1274. * ### Example
  1275. *
  1276. * ```
  1277. * @Directive({
  1278. * selector: 'someDir'
  1279. * })
  1280. * class SomeDir {
  1281. * @ContentChild(ChildDirective) contentChild;
  1282. *
  1283. * ngAfterContentInit() {
  1284. * // contentChild is set
  1285. * }
  1286. * }
  1287. * ```
  1288. */
  1289. var ContentChildMetadata = (function (_super) {
  1290. __extends(ContentChildMetadata, _super);
  1291. function ContentChildMetadata(_selector) {
  1292. _super.call(this, _selector, { descendants: true, first: true });
  1293. }
  1294. ContentChildMetadata = __decorate([
  1295. lang_1.CONST(),
  1296. __metadata('design:paramtypes', [Object])
  1297. ], ContentChildMetadata);
  1298. return ContentChildMetadata;
  1299. })(QueryMetadata);
  1300. exports.ContentChildMetadata = ContentChildMetadata;
  1301. /**
  1302. * Similar to {@link QueryMetadata}, but querying the component view, instead of
  1303. * the content children.
  1304. *
  1305. * ### Example ([live demo](http://plnkr.co/edit/eNsFHDf7YjyM6IzKxM1j?p=preview))
  1306. *
  1307. * ```javascript
  1308. * @Component({...})
  1309. * @View({
  1310. * template: `
  1311. * <item> a </item>
  1312. * <item> b </item>
  1313. * <item> c </item>
  1314. * `
  1315. * })
  1316. * class MyComponent {
  1317. * shown: boolean;
  1318. *
  1319. * constructor(private @Query(Item) items:QueryList<Item>) {
  1320. * items.onChange(() => console.log(items.length));
  1321. * }
  1322. * }
  1323. * ```
  1324. *
  1325. * Supports the same querying parameters as {@link QueryMetadata}, except
  1326. * `descendants`. This always queries the whole view.
  1327. *
  1328. * As `shown` is flipped between true and false, items will contain zero of one
  1329. * items.
  1330. *
  1331. * Specifies that a {@link QueryList} should be injected.
  1332. *
  1333. * The injected object is an iterable and observable live list.
  1334. * See {@link QueryList} for more details.
  1335. */
  1336. var ViewQueryMetadata = (function (_super) {
  1337. __extends(ViewQueryMetadata, _super);
  1338. function ViewQueryMetadata(_selector, _a) {
  1339. var _b = _a === void 0 ? {} : _a, _c = _b.descendants, descendants = _c === void 0 ? false : _c, _d = _b.first, first = _d === void 0 ? false : _d;
  1340. _super.call(this, _selector, { descendants: descendants, first: first });
  1341. }
  1342. Object.defineProperty(ViewQueryMetadata.prototype, "isViewQuery", {
  1343. /**
  1344. * always `true` to differentiate it with {@link QueryMetadata}.
  1345. */
  1346. get: function () { return true; },
  1347. enumerable: true,
  1348. configurable: true
  1349. });
  1350. ViewQueryMetadata.prototype.toString = function () { return "@ViewQuery(" + lang_1.stringify(this.selector) + ")"; };
  1351. ViewQueryMetadata = __decorate([
  1352. lang_1.CONST(),
  1353. __metadata('design:paramtypes', [Object, Object])
  1354. ], ViewQueryMetadata);
  1355. return ViewQueryMetadata;
  1356. })(QueryMetadata);
  1357. exports.ViewQueryMetadata = ViewQueryMetadata;
  1358. /**
  1359. * Configures a view query.
  1360. *
  1361. * View queries are set before the `ngAfterViewInit` callback is called.
  1362. *
  1363. * ### Example
  1364. *
  1365. * ```
  1366. * @Component({
  1367. * selector: 'someDir',
  1368. * templateUrl: 'someTemplate',
  1369. * directives: [ItemDirective]
  1370. * })
  1371. * class SomeDir {
  1372. * @ViewChildren(ItemDirective) viewChildren: QueryList<ItemDirective>;
  1373. *
  1374. * ngAfterViewInit() {
  1375. * // viewChildren is set
  1376. * }
  1377. * }
  1378. * ```
  1379. */
  1380. var ViewChildrenMetadata = (function (_super) {
  1381. __extends(ViewChildrenMetadata, _super);
  1382. function ViewChildrenMetadata(_selector) {
  1383. _super.call(this, _selector, { descendants: true });
  1384. }
  1385. ViewChildrenMetadata = __decorate([
  1386. lang_1.CONST(),
  1387. __metadata('design:paramtypes', [Object])
  1388. ], ViewChildrenMetadata);
  1389. return ViewChildrenMetadata;
  1390. })(ViewQueryMetadata);
  1391. exports.ViewChildrenMetadata = ViewChildrenMetadata;
  1392. /**
  1393. * Configures a view query.
  1394. *
  1395. * View queries are set before the `ngAfterViewInit` callback is called.
  1396. *
  1397. * ### Example
  1398. *
  1399. * ```
  1400. * @Component({
  1401. * selector: 'someDir',
  1402. * templateUrl: 'someTemplate',
  1403. * directives: [ItemDirective]
  1404. * })
  1405. * class SomeDir {
  1406. * @ViewChild(ItemDirective) viewChild:ItemDirective;
  1407. *
  1408. * ngAfterViewInit() {
  1409. * // viewChild is set
  1410. * }
  1411. * }
  1412. * ```
  1413. */
  1414. var ViewChildMetadata = (function (_super) {
  1415. __extends(ViewChildMetadata, _super);
  1416. function ViewChildMetadata(_selector) {
  1417. _super.call(this, _selector, { descendants: true, first: true });
  1418. }
  1419. ViewChildMetadata = __decorate([
  1420. lang_1.CONST(),
  1421. __metadata('design:paramtypes', [Object])
  1422. ], ViewChildMetadata);
  1423. return ViewChildMetadata;
  1424. })(ViewQueryMetadata);
  1425. exports.ViewChildMetadata = ViewChildMetadata;
  1426. /***/ },
  1427. /* 5 */
  1428. /***/ function(module, exports) {
  1429. /* WEBPACK VAR INJECTION */(function(global) {var __extends = (this && this.__extends) || function (d, b) {
  1430. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  1431. function __() { this.constructor = d; }
  1432. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  1433. };
  1434. var globalScope;
  1435. if (typeof window === 'undefined') {
  1436. if (typeof WorkerGlobalScope !== 'undefined' && self instanceof WorkerGlobalScope) {
  1437. // TODO: Replace any with WorkerGlobalScope from lib.webworker.d.ts #3492
  1438. globalScope = self;
  1439. }
  1440. else {
  1441. globalScope = global;
  1442. }
  1443. }
  1444. else {
  1445. globalScope = window;
  1446. }
  1447. ;
  1448. exports.IS_DART = false;
  1449. // Need to declare a new variable for global here since TypeScript
  1450. // exports the original value of the symbol.
  1451. var _global = globalScope;
  1452. exports.global = _global;
  1453. exports.Type = Function;
  1454. function getTypeNameForDebugging(type) {
  1455. return type['name'];
  1456. }
  1457. exports.getTypeNameForDebugging = getTypeNameForDebugging;
  1458. exports.Math = _global.Math;
  1459. exports.Date = _global.Date;
  1460. var _devMode = true;
  1461. var _modeLocked = false;
  1462. function lockMode() {
  1463. _modeLocked = true;
  1464. }
  1465. exports.lockMode = lockMode;
  1466. /**
  1467. * Disable Angular's development mode, which turns off assertions and other
  1468. * checks within the framework.
  1469. *
  1470. * One important assertion this disables verifies that a change detection pass
  1471. * does not result in additional changes to any bindings (also known as
  1472. * unidirectional data flow).
  1473. */
  1474. function enableProdMode() {
  1475. if (_modeLocked) {
  1476. // Cannot use BaseException as that ends up importing from facade/lang.
  1477. throw 'Cannot enable prod mode after platform setup.';
  1478. }
  1479. _devMode = false;
  1480. }
  1481. exports.enableProdMode = enableProdMode;
  1482. function assertionsEnabled() {
  1483. return _devMode;
  1484. }
  1485. exports.assertionsEnabled = assertionsEnabled;
  1486. // TODO: remove calls to assert in production environment
  1487. // Note: Can't just export this and import in in other files
  1488. // as `assert` is a reserved keyword in Dart
  1489. _global.assert = function assert(condition) {
  1490. // TODO: to be fixed properly via #2830, noop for now
  1491. };
  1492. // This function is needed only to properly support Dart's const expressions
  1493. // see https://github.com/angular/ts2dart/pull/151 for more info
  1494. function CONST_EXPR(expr) {
  1495. return expr;
  1496. }
  1497. exports.CONST_EXPR = CONST_EXPR;
  1498. function CONST() {
  1499. return function (target) { return target; };
  1500. }
  1501. exports.CONST = CONST;
  1502. function isPresent(obj) {
  1503. return obj !== undefined && obj !== null;
  1504. }
  1505. exports.isPresent = isPresent;
  1506. function isBlank(obj) {
  1507. return obj === undefined || obj === null;
  1508. }
  1509. exports.isBlank = isBlank;
  1510. function isString(obj) {
  1511. return typeof obj === "string";
  1512. }
  1513. exports.isString = isString;
  1514. function isFunction(obj) {
  1515. return typeof obj === "function";
  1516. }
  1517. exports.isFunction = isFunction;
  1518. function isType(obj) {
  1519. return isFunction(obj);
  1520. }
  1521. exports.isType = isType;
  1522. function isStringMap(obj) {
  1523. return typeof obj === 'object' && obj !== null;
  1524. }
  1525. exports.isStringMap = isStringMap;
  1526. function isPromise(obj) {
  1527. return obj instanceof _global.Promise;
  1528. }
  1529. exports.isPromise = isPromise;
  1530. function isArray(obj) {
  1531. return Array.isArray(obj);
  1532. }
  1533. exports.isArray = isArray;
  1534. function isNumber(obj) {
  1535. return typeof obj === 'number';
  1536. }
  1537. exports.isNumber = isNumber;
  1538. function isDate(obj) {
  1539. return obj instanceof exports.Date && !isNaN(obj.valueOf());
  1540. }
  1541. exports.isDate = isDate;
  1542. function noop() { }
  1543. exports.noop = noop;
  1544. function stringify(token) {
  1545. if (typeof token === 'string') {
  1546. return token;
  1547. }
  1548. if (token === undefined || token === null) {
  1549. return '' + token;
  1550. }
  1551. if (token.name) {
  1552. return token.name;
  1553. }
  1554. var res = token.toString();
  1555. var newLineIndex = res.indexOf("\n");
  1556. return (newLineIndex === -1) ? res : res.substring(0, newLineIndex);
  1557. }
  1558. exports.stringify = stringify;
  1559. // serialize / deserialize enum exist only for consistency with dart API
  1560. // enums in typescript don't need to be serialized
  1561. function serializeEnum(val) {
  1562. return val;
  1563. }
  1564. exports.serializeEnum = serializeEnum;
  1565. function deserializeEnum(val, values) {
  1566. return val;
  1567. }
  1568. exports.deserializeEnum = deserializeEnum;
  1569. var StringWrapper = (function () {
  1570. function StringWrapper() {
  1571. }
  1572. StringWrapper.fromCharCode = function (code) { return String.fromCharCode(code); };
  1573. StringWrapper.charCodeAt = function (s, index) { return s.charCodeAt(index); };
  1574. StringWrapper.split = function (s, regExp) { return s.split(regExp); };
  1575. StringWrapper.equals = function (s, s2) { return s === s2; };
  1576. StringWrapper.stripLeft = function (s, charVal) {
  1577. if (s && s.length) {
  1578. var pos = 0;
  1579. for (var i = 0; i < s.length; i++) {
  1580. if (s[i] != charVal)
  1581. break;
  1582. pos++;
  1583. }
  1584. s = s.substring(pos);
  1585. }
  1586. return s;
  1587. };
  1588. StringWrapper.stripRight = function (s, charVal) {
  1589. if (s && s.length) {
  1590. var pos = s.length;
  1591. for (var i = s.length - 1; i >= 0; i--) {
  1592. if (s[i] != charVal)
  1593. break;
  1594. pos--;
  1595. }
  1596. s = s.substring(0, pos);
  1597. }
  1598. return s;
  1599. };
  1600. StringWrapper.replace = function (s, from, replace) {
  1601. return s.replace(from, replace);
  1602. };
  1603. StringWrapper.replaceAll = function (s, from, replace) {
  1604. return s.replace(from, replace);
  1605. };
  1606. StringWrapper.slice = function (s, from, to) {
  1607. if (from === void 0) { from = 0; }
  1608. if (to === void 0) { to = null; }
  1609. return s.slice(from, to === null ? undefined : to);
  1610. };
  1611. StringWrapper.replaceAllMapped = function (s, from, cb) {
  1612. return s.replace(from, function () {
  1613. var matches = [];
  1614. for (var _i = 0; _i < arguments.length; _i++) {
  1615. matches[_i - 0] = arguments[_i];
  1616. }
  1617. // Remove offset & string from the result array
  1618. matches.splice(-2, 2);
  1619. // The callback receives match, p1, ..., pn
  1620. return cb(matches);
  1621. });
  1622. };
  1623. StringWrapper.contains = function (s, substr) { return s.indexOf(substr) != -1; };
  1624. StringWrapper.compare = function (a, b) {
  1625. if (a < b) {
  1626. return -1;
  1627. }
  1628. else if (a > b) {
  1629. return 1;
  1630. }
  1631. else {
  1632. return 0;
  1633. }
  1634. };
  1635. return StringWrapper;
  1636. })();
  1637. exports.StringWrapper = StringWrapper;
  1638. var StringJoiner = (function () {
  1639. function StringJoiner(parts) {
  1640. if (parts === void 0) { parts = []; }
  1641. this.parts = parts;
  1642. }
  1643. StringJoiner.prototype.add = function (part) { this.parts.push(part); };
  1644. StringJoiner.prototype.toString = function () { return this.parts.join(""); };
  1645. return StringJoiner;
  1646. })();
  1647. exports.StringJoiner = StringJoiner;
  1648. var NumberParseError = (function (_super) {
  1649. __extends(NumberParseError, _super);
  1650. function NumberParseError(message) {
  1651. _super.call(this);
  1652. this.message = message;
  1653. }
  1654. NumberParseError.prototype.toString = function () { return this.message; };
  1655. return NumberParseError;
  1656. })(Error);
  1657. exports.NumberParseError = NumberParseError;
  1658. var NumberWrapper = (function () {
  1659. function NumberWrapper() {
  1660. }
  1661. NumberWrapper.toFixed = function (n, fractionDigits) { return n.toFixed(fractionDigits); };
  1662. NumberWrapper.equal = function (a, b) { return a === b; };
  1663. NumberWrapper.parseIntAutoRadix = function (text) {
  1664. var result = parseInt(text);
  1665. if (isNaN(result)) {
  1666. throw new NumberParseError("Invalid integer literal when parsing " + text);
  1667. }
  1668. return result;
  1669. };
  1670. NumberWrapper.parseInt = function (text, radix) {
  1671. if (radix == 10) {
  1672. if (/^(\-|\+)?[0-9]+$/.test(text)) {
  1673. return parseInt(text, radix);
  1674. }
  1675. }
  1676. else if (radix == 16) {
  1677. if (/^(\-|\+)?[0-9ABCDEFabcdef]+$/.test(text)) {
  1678. return parseInt(text, radix);
  1679. }
  1680. }
  1681. else {
  1682. var result = parseInt(text, radix);
  1683. if (!isNaN(result)) {
  1684. return result;
  1685. }
  1686. }
  1687. throw new NumberParseError("Invalid integer literal when parsing " + text + " in base " +
  1688. radix);
  1689. };
  1690. // TODO: NaN is a valid literal but is returned by parseFloat to indicate an error.
  1691. NumberWrapper.parseFloat = function (text) { return parseFloat(text); };
  1692. Object.defineProperty(NumberWrapper, "NaN", {
  1693. get: function () { return NaN; },
  1694. enumerable: true,
  1695. configurable: true
  1696. });
  1697. NumberWrapper.isNaN = function (value) { return isNaN(value); };
  1698. NumberWrapper.isInteger = function (value) { return Number.isInteger(value); };
  1699. return NumberWrapper;
  1700. })();
  1701. exports.NumberWrapper = NumberWrapper;
  1702. exports.RegExp = _global.RegExp;
  1703. var RegExpWrapper = (function () {
  1704. function RegExpWrapper() {
  1705. }
  1706. RegExpWrapper.create = function (regExpStr, flags) {
  1707. if (flags === void 0) { flags = ''; }
  1708. flags = flags.replace(/g/g, '');
  1709. return new _global.RegExp(regExpStr, flags + 'g');
  1710. };
  1711. RegExpWrapper.firstMatch = function (regExp, input) {
  1712. // Reset multimatch regex state
  1713. regExp.lastIndex = 0;
  1714. return regExp.exec(input);
  1715. };
  1716. RegExpWrapper.test = function (regExp, input) {
  1717. regExp.lastIndex = 0;
  1718. return regExp.test(input);
  1719. };
  1720. RegExpWrapper.matcher = function (regExp, input) {
  1721. // Reset regex state for the case
  1722. // someone did not loop over all matches
  1723. // last time.
  1724. regExp.lastIndex = 0;
  1725. return { re: regExp, input: input };
  1726. };
  1727. return RegExpWrapper;
  1728. })();
  1729. exports.RegExpWrapper = RegExpWrapper;
  1730. var RegExpMatcherWrapper = (function () {
  1731. function RegExpMatcherWrapper() {
  1732. }
  1733. RegExpMatcherWrapper.next = function (matcher) {
  1734. return matcher.re.exec(matcher.input);
  1735. };
  1736. return RegExpMatcherWrapper;
  1737. })();
  1738. exports.RegExpMatcherWrapper = RegExpMatcherWrapper;
  1739. var FunctionWrapper = (function () {
  1740. function FunctionWrapper() {
  1741. }
  1742. FunctionWrapper.apply = function (fn, posArgs) { return fn.apply(null, posArgs); };
  1743. return FunctionWrapper;
  1744. })();
  1745. exports.FunctionWrapper = FunctionWrapper;
  1746. // JS has NaN !== NaN
  1747. function looseIdentical(a, b) {
  1748. return a === b || typeof a === "number" && typeof b === "number" && isNaN(a) && isNaN(b);
  1749. }
  1750. exports.looseIdentical = looseIdentical;
  1751. // JS considers NaN is the same as NaN for map Key (while NaN !== NaN otherwise)
  1752. // see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map
  1753. function getMapKey(value) {
  1754. return value;
  1755. }
  1756. exports.getMapKey = getMapKey;
  1757. function normalizeBlank(obj) {
  1758. return isBlank(obj) ? null : obj;
  1759. }
  1760. exports.normalizeBlank = normalizeBlank;
  1761. function normalizeBool(obj) {
  1762. return isBlank(obj) ? false : obj;
  1763. }
  1764. exports.normalizeBool = normalizeBool;
  1765. function isJsObject(o) {
  1766. return o !== null && (typeof o === "function" || typeof o === "object");
  1767. }
  1768. exports.isJsObject = isJsObject;
  1769. function print(obj) {
  1770. console.log(obj);
  1771. }
  1772. exports.print = print;
  1773. // Can't be all uppercase as our transpiler would think it is a special directive...
  1774. var Json = (function () {
  1775. function Json() {
  1776. }
  1777. Json.parse = function (s) { return _global.JSON.parse(s); };
  1778. Json.stringify = function (data) {
  1779. // Dart doesn't take 3 arguments
  1780. return _global.JSON.stringify(data, null, 2);
  1781. };
  1782. return Json;
  1783. })();
  1784. exports.Json = Json;
  1785. var DateWrapper = (function () {
  1786. function DateWrapper() {
  1787. }
  1788. DateWrapper.create = function (year, month, day, hour, minutes, seconds, milliseconds) {
  1789. if (month === void 0) { month = 1; }
  1790. if (day === void 0) { day = 1; }
  1791. if (hour === void 0) { hour = 0; }
  1792. if (minutes === void 0) { minutes = 0; }
  1793. if (seconds === void 0) { seconds = 0; }
  1794. if (milliseconds === void 0) { milliseconds = 0; }
  1795. return new exports.Date(year, month - 1, day, hour, minutes, seconds, milliseconds);
  1796. };
  1797. DateWrapper.fromISOString = function (str) { return new exports.Date(str); };
  1798. DateWrapper.fromMillis = function (ms) { return new exports.Date(ms); };
  1799. DateWrapper.toMillis = function (date) { return date.getTime(); };
  1800. DateWrapper.now = function () { return new exports.Date(); };
  1801. DateWrapper.toJson = function (date) { return date.toJSON(); };
  1802. return DateWrapper;
  1803. })();
  1804. exports.DateWrapper = DateWrapper;
  1805. function setValueOnPath(global, path, value) {
  1806. var parts = path.split('.');
  1807. var obj = global;
  1808. while (parts.length > 1) {
  1809. var name = parts.shift();
  1810. if (obj.hasOwnProperty(name) && isPresent(obj[name])) {
  1811. obj = obj[name];
  1812. }
  1813. else {
  1814. obj = obj[name] = {};
  1815. }
  1816. }
  1817. if (obj === undefined || obj === null) {
  1818. obj = {};
  1819. }
  1820. obj[parts.shift()] = value;
  1821. }
  1822. exports.setValueOnPath = setValueOnPath;
  1823. var _symbolIterator = null;
  1824. function getSymbolIterator() {
  1825. if (isBlank(_symbolIterator)) {
  1826. if (isPresent(Symbol) && isPresent(Symbol.iterator)) {
  1827. _symbolIterator = Symbol.iterator;
  1828. }
  1829. else {
  1830. // es6-shim specific logic
  1831. var keys = Object.getOwnPropertyNames(Map.prototype);
  1832. for (var i = 0; i < keys.length; ++i) {
  1833. var key = keys[i];
  1834. if (key !== 'entries' && key !== 'size' &&
  1835. Map.prototype[key] === Map.prototype['entries']) {
  1836. _symbolIterator = key;
  1837. }
  1838. }
  1839. }
  1840. }
  1841. return _symbolIterator;
  1842. }
  1843. exports.getSymbolIterator = getSymbolIterator;
  1844. /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }())))
  1845. /***/ },
  1846. /* 6 */
  1847. /***/ function(module, exports, __webpack_require__) {
  1848. /**
  1849. * @module
  1850. * @description
  1851. * The `di` module provides dependency injection container services.
  1852. */
  1853. function __export(m) {
  1854. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  1855. }
  1856. var metadata_1 = __webpack_require__(7);
  1857. exports.InjectMetadata = metadata_1.InjectMetadata;
  1858. exports.OptionalMetadata = metadata_1.OptionalMetadata;
  1859. exports.InjectableMetadata = metadata_1.InjectableMetadata;
  1860. exports.SelfMetadata = metadata_1.SelfMetadata;
  1861. exports.HostMetadata = metadata_1.HostMetadata;
  1862. exports.SkipSelfMetadata = metadata_1.SkipSelfMetadata;
  1863. exports.DependencyMetadata = metadata_1.DependencyMetadata;
  1864. // we have to reexport * because Dart and TS export two different sets of types
  1865. __export(__webpack_require__(8));
  1866. var forward_ref_1 = __webpack_require__(10);
  1867. exports.forwardRef = forward_ref_1.forwardRef;
  1868. exports.resolveForwardRef = forward_ref_1.resolveForwardRef;
  1869. var injector_1 = __webpack_require__(11);
  1870. exports.Injector = injector_1.Injector;
  1871. var provider_1 = __webpack_require__(13);
  1872. exports.Binding = provider_1.Binding;
  1873. exports.ProviderBuilder = provider_1.ProviderBuilder;
  1874. exports.ResolvedFactory = provider_1.ResolvedFactory;
  1875. exports.Dependency = provider_1.Dependency;
  1876. exports.bind = provider_1.bind;
  1877. exports.Provider = provider_1.Provider;
  1878. exports.provide = provider_1.provide;
  1879. var key_1 = __webpack_require__(19);
  1880. exports.Key = key_1.Key;
  1881. exports.TypeLiteral = key_1.TypeLiteral;
  1882. var exceptions_1 = __webpack_require__(21);
  1883. exports.NoProviderError = exceptions_1.NoProviderError;
  1884. exports.AbstractProviderError = exceptions_1.AbstractProviderError;
  1885. exports.CyclicDependencyError = exceptions_1.CyclicDependencyError;
  1886. exports.InstantiationError = exceptions_1.InstantiationError;
  1887. exports.InvalidProviderError = exceptions_1.InvalidProviderError;
  1888. exports.NoAnnotationError = exceptions_1.NoAnnotationError;
  1889. exports.OutOfBoundsError = exceptions_1.OutOfBoundsError;
  1890. var opaque_token_1 = __webpack_require__(22);
  1891. exports.OpaqueToken = opaque_token_1.OpaqueToken;
  1892. /***/ },
  1893. /* 7 */
  1894. /***/ function(module, exports, __webpack_require__) {
  1895. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  1896. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  1897. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  1898. 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;
  1899. return c > 3 && r && Object.defineProperty(target, key, r), r;
  1900. };
  1901. var __metadata = (this && this.__metadata) || function (k, v) {
  1902. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  1903. };
  1904. var lang_1 = __webpack_require__(5);
  1905. /**
  1906. * A parameter metadata that specifies a dependency.
  1907. *
  1908. * ### Example ([live demo](http://plnkr.co/edit/6uHYJK?p=preview))
  1909. *
  1910. * ```typescript
  1911. * class Engine {}
  1912. *
  1913. * @Injectable()
  1914. * class Car {
  1915. * engine;
  1916. * constructor(@Inject("MyEngine") engine:Engine) {
  1917. * this.engine = engine;
  1918. * }
  1919. * }
  1920. *
  1921. * var injector = Injector.resolveAndCreate([
  1922. * provide("MyEngine", {useClass: Engine}),
  1923. * Car
  1924. * ]);
  1925. *
  1926. * expect(injector.get(Car).engine instanceof Engine).toBe(true);
  1927. * ```
  1928. *
  1929. * When `@Inject()` is not present, {@link Injector} will use the type annotation of the parameter.
  1930. *
  1931. * ### Example
  1932. *
  1933. * ```typescript
  1934. * class Engine {}
  1935. *
  1936. * @Injectable()
  1937. * class Car {
  1938. * constructor(public engine: Engine) {} //same as constructor(@Inject(Engine) engine:Engine)
  1939. * }
  1940. *
  1941. * var injector = Injector.resolveAndCreate([Engine, Car]);
  1942. * expect(injector.get(Car).engine instanceof Engine).toBe(true);
  1943. * ```
  1944. */
  1945. var InjectMetadata = (function () {
  1946. function InjectMetadata(token) {
  1947. this.token = token;
  1948. }
  1949. InjectMetadata.prototype.toString = function () { return "@Inject(" + lang_1.stringify(this.token) + ")"; };
  1950. InjectMetadata = __decorate([
  1951. lang_1.CONST(),
  1952. __metadata('design:paramtypes', [Object])
  1953. ], InjectMetadata);
  1954. return InjectMetadata;
  1955. })();
  1956. exports.InjectMetadata = InjectMetadata;
  1957. /**
  1958. * A parameter metadata that marks a dependency as optional. {@link Injector} provides `null` if
  1959. * the dependency is not found.
  1960. *
  1961. * ### Example ([live demo](http://plnkr.co/edit/AsryOm?p=preview))
  1962. *
  1963. * ```typescript
  1964. * class Engine {}
  1965. *
  1966. * @Injectable()
  1967. * class Car {
  1968. * engine;
  1969. * constructor(@Optional() engine:Engine) {
  1970. * this.engine = engine;
  1971. * }
  1972. * }
  1973. *
  1974. * var injector = Injector.resolveAndCreate([Car]);
  1975. * expect(injector.get(Car).engine).toBeNull();
  1976. * ```
  1977. */
  1978. var OptionalMetadata = (function () {
  1979. function OptionalMetadata() {
  1980. }
  1981. OptionalMetadata.prototype.toString = function () { return "@Optional()"; };
  1982. OptionalMetadata = __decorate([
  1983. lang_1.CONST(),
  1984. __metadata('design:paramtypes', [])
  1985. ], OptionalMetadata);
  1986. return OptionalMetadata;
  1987. })();
  1988. exports.OptionalMetadata = OptionalMetadata;
  1989. /**
  1990. * `DependencyMetadata` is used by the framework to extend DI.
  1991. * This is internal to Angular and should not be used directly.
  1992. */
  1993. var DependencyMetadata = (function () {
  1994. function DependencyMetadata() {
  1995. }
  1996. Object.defineProperty(DependencyMetadata.prototype, "token", {
  1997. get: function () { return null; },
  1998. enumerable: true,
  1999. configurable: true
  2000. });
  2001. DependencyMetadata = __decorate([
  2002. lang_1.CONST(),
  2003. __metadata('design:paramtypes', [])
  2004. ], DependencyMetadata);
  2005. return DependencyMetadata;
  2006. })();
  2007. exports.DependencyMetadata = DependencyMetadata;
  2008. /**
  2009. * A marker metadata that marks a class as available to {@link Injector} for creation.
  2010. *
  2011. * ### Example ([live demo](http://plnkr.co/edit/Wk4DMQ?p=preview))
  2012. *
  2013. * ```typescript
  2014. * @Injectable()
  2015. * class UsefulService {}
  2016. *
  2017. * @Injectable()
  2018. * class NeedsService {
  2019. * constructor(public service:UsefulService) {}
  2020. * }
  2021. *
  2022. * var injector = Injector.resolveAndCreate([NeedsService, UsefulService]);
  2023. * expect(injector.get(NeedsService).service instanceof UsefulService).toBe(true);
  2024. * ```
  2025. * {@link Injector} will throw {@link NoAnnotationError} when trying to instantiate a class that
  2026. * does not have `@Injectable` marker, as shown in the example below.
  2027. *
  2028. * ```typescript
  2029. * class UsefulService {}
  2030. *
  2031. * class NeedsService {
  2032. * constructor(public service:UsefulService) {}
  2033. * }
  2034. *
  2035. * var injector = Injector.resolveAndCreate([NeedsService, UsefulService]);
  2036. * expect(() => injector.get(NeedsService)).toThrowError();
  2037. * ```
  2038. */
  2039. var InjectableMetadata = (function () {
  2040. function InjectableMetadata() {
  2041. }
  2042. InjectableMetadata = __decorate([
  2043. lang_1.CONST(),
  2044. __metadata('design:paramtypes', [])
  2045. ], InjectableMetadata);
  2046. return InjectableMetadata;
  2047. })();
  2048. exports.InjectableMetadata = InjectableMetadata;
  2049. /**
  2050. * Specifies that an {@link Injector} should retrieve a dependency only from itself.
  2051. *
  2052. * ### Example ([live demo](http://plnkr.co/edit/NeagAg?p=preview))
  2053. *
  2054. * ```typescript
  2055. * class Dependency {
  2056. * }
  2057. *
  2058. * @Injectable()
  2059. * class NeedsDependency {
  2060. * dependency;
  2061. * constructor(@Self() dependency:Dependency) {
  2062. * this.dependency = dependency;
  2063. * }
  2064. * }
  2065. *
  2066. * var inj = Injector.resolveAndCreate([Dependency, NeedsDependency]);
  2067. * var nd = inj.get(NeedsDependency);
  2068. *
  2069. * expect(nd.dependency instanceof Dependency).toBe(true);
  2070. *
  2071. * var inj = Injector.resolveAndCreate([Dependency]);
  2072. * var child = inj.resolveAndCreateChild([NeedsDependency]);
  2073. * expect(() => child.get(NeedsDependency)).toThrowError();
  2074. * ```
  2075. */
  2076. var SelfMetadata = (function () {
  2077. function SelfMetadata() {
  2078. }
  2079. SelfMetadata.prototype.toString = function () { return "@Self()"; };
  2080. SelfMetadata = __decorate([
  2081. lang_1.CONST(),
  2082. __metadata('design:paramtypes', [])
  2083. ], SelfMetadata);
  2084. return SelfMetadata;
  2085. })();
  2086. exports.SelfMetadata = SelfMetadata;
  2087. /**
  2088. * Specifies that the dependency resolution should start from the parent injector.
  2089. *
  2090. * ### Example ([live demo](http://plnkr.co/edit/Wchdzb?p=preview))
  2091. *
  2092. * ```typescript
  2093. * class Dependency {
  2094. * }
  2095. *
  2096. * @Injectable()
  2097. * class NeedsDependency {
  2098. * dependency;
  2099. * constructor(@SkipSelf() dependency:Dependency) {
  2100. * this.dependency = dependency;
  2101. * }
  2102. * }
  2103. *
  2104. * var parent = Injector.resolveAndCreate([Dependency]);
  2105. * var child = parent.resolveAndCreateChild([NeedsDependency]);
  2106. * expect(child.get(NeedsDependency).dependency instanceof Depedency).toBe(true);
  2107. *
  2108. * var inj = Injector.resolveAndCreate([Dependency, NeedsDependency]);
  2109. * expect(() => inj.get(NeedsDependency)).toThrowError();
  2110. * ```
  2111. */
  2112. var SkipSelfMetadata = (function () {
  2113. function SkipSelfMetadata() {
  2114. }
  2115. SkipSelfMetadata.prototype.toString = function () { return "@SkipSelf()"; };
  2116. SkipSelfMetadata = __decorate([
  2117. lang_1.CONST(),
  2118. __metadata('design:paramtypes', [])
  2119. ], SkipSelfMetadata);
  2120. return SkipSelfMetadata;
  2121. })();
  2122. exports.SkipSelfMetadata = SkipSelfMetadata;
  2123. /**
  2124. * Specifies that an injector should retrieve a dependency from any injector until reaching the
  2125. * closest host.
  2126. *
  2127. * In Angular, a component element is automatically declared as a host for all the injectors in
  2128. * its view.
  2129. *
  2130. * ### Example ([live demo](http://plnkr.co/edit/GX79pV?p=preview))
  2131. *
  2132. * In the following example `App` contains `ParentCmp`, which contains `ChildDirective`.
  2133. * So `ParentCmp` is the host of `ChildDirective`.
  2134. *
  2135. * `ChildDirective` depends on two services: `HostService` and `OtherService`.
  2136. * `HostService` is defined at `ParentCmp`, and `OtherService` is defined at `App`.
  2137. *
  2138. *```typescript
  2139. * class OtherService {}
  2140. * class HostService {}
  2141. *
  2142. * @Directive({
  2143. * selector: 'child-directive'
  2144. * })
  2145. * class ChildDirective {
  2146. * constructor(@Optional() @Host() os:OtherService, @Optional() @Host() hs:HostService){
  2147. * console.log("os is null", os);
  2148. * console.log("hs is NOT null", hs);
  2149. * }
  2150. * }
  2151. *
  2152. * @Component({
  2153. * selector: 'parent-cmp',
  2154. * providers: [HostService],
  2155. * template: `
  2156. * Dir: <child-directive></child-directive>
  2157. * `,
  2158. * directives: [ChildDirective]
  2159. * })
  2160. * class ParentCmp {
  2161. * }
  2162. *
  2163. * @Component({
  2164. * selector: 'app',
  2165. * providers: [OtherService],
  2166. * template: `
  2167. * Parent: <parent-cmp></parent-cmp>
  2168. * `,
  2169. * directives: [ParentCmp]
  2170. * })
  2171. * class App {
  2172. * }
  2173. *
  2174. * bootstrap(App);
  2175. *```
  2176. */
  2177. var HostMetadata = (function () {
  2178. function HostMetadata() {
  2179. }
  2180. HostMetadata.prototype.toString = function () { return "@Host()"; };
  2181. HostMetadata = __decorate([
  2182. lang_1.CONST(),
  2183. __metadata('design:paramtypes', [])
  2184. ], HostMetadata);
  2185. return HostMetadata;
  2186. })();
  2187. exports.HostMetadata = HostMetadata;
  2188. /***/ },
  2189. /* 8 */
  2190. /***/ function(module, exports, __webpack_require__) {
  2191. var metadata_1 = __webpack_require__(7);
  2192. var decorators_1 = __webpack_require__(9);
  2193. /**
  2194. * Factory for creating {@link InjectMetadata}.
  2195. */
  2196. exports.Inject = decorators_1.makeParamDecorator(metadata_1.InjectMetadata);
  2197. /**
  2198. * Factory for creating {@link OptionalMetadata}.
  2199. */
  2200. exports.Optional = decorators_1.makeParamDecorator(metadata_1.OptionalMetadata);
  2201. /**
  2202. * Factory for creating {@link InjectableMetadata}.
  2203. */
  2204. exports.Injectable = decorators_1.makeDecorator(metadata_1.InjectableMetadata);
  2205. /**
  2206. * Factory for creating {@link SelfMetadata}.
  2207. */
  2208. exports.Self = decorators_1.makeParamDecorator(metadata_1.SelfMetadata);
  2209. /**
  2210. * Factory for creating {@link HostMetadata}.
  2211. */
  2212. exports.Host = decorators_1.makeParamDecorator(metadata_1.HostMetadata);
  2213. /**
  2214. * Factory for creating {@link SkipSelfMetadata}.
  2215. */
  2216. exports.SkipSelf = decorators_1.makeParamDecorator(metadata_1.SkipSelfMetadata);
  2217. /***/ },
  2218. /* 9 */
  2219. /***/ function(module, exports, __webpack_require__) {
  2220. var lang_1 = __webpack_require__(5);
  2221. function extractAnnotation(annotation) {
  2222. if (lang_1.isFunction(annotation) && annotation.hasOwnProperty('annotation')) {
  2223. // it is a decorator, extract annotation
  2224. annotation = annotation.annotation;
  2225. }
  2226. return annotation;
  2227. }
  2228. function applyParams(fnOrArray, key) {
  2229. if (fnOrArray === Object || fnOrArray === String || fnOrArray === Function ||
  2230. fnOrArray === Number || fnOrArray === Array) {
  2231. throw new Error("Can not use native " + lang_1.stringify(fnOrArray) + " as constructor");
  2232. }
  2233. if (lang_1.isFunction(fnOrArray)) {
  2234. return fnOrArray;
  2235. }
  2236. else if (fnOrArray instanceof Array) {
  2237. var annotations = fnOrArray;
  2238. var fn = fnOrArray[fnOrArray.length - 1];
  2239. if (!lang_1.isFunction(fn)) {
  2240. throw new Error("Last position of Class method array must be Function in key " + key + " was '" + lang_1.stringify(fn) + "'");
  2241. }
  2242. var annoLength = annotations.length - 1;
  2243. if (annoLength != fn.length) {
  2244. throw new Error("Number of annotations (" + annoLength + ") does not match number of arguments (" + fn.length + ") in the function: " + lang_1.stringify(fn));
  2245. }
  2246. var paramsAnnotations = [];
  2247. for (var i = 0, ii = annotations.length - 1; i < ii; i++) {
  2248. var paramAnnotations = [];
  2249. paramsAnnotations.push(paramAnnotations);
  2250. var annotation = annotations[i];
  2251. if (annotation instanceof Array) {
  2252. for (var j = 0; j < annotation.length; j++) {
  2253. paramAnnotations.push(extractAnnotation(annotation[j]));
  2254. }
  2255. }
  2256. else if (lang_1.isFunction(annotation)) {
  2257. paramAnnotations.push(extractAnnotation(annotation));
  2258. }
  2259. else {
  2260. paramAnnotations.push(annotation);
  2261. }
  2262. }
  2263. Reflect.defineMetadata('parameters', paramsAnnotations, fn);
  2264. return fn;
  2265. }
  2266. else {
  2267. throw new Error("Only Function or Array is supported in Class definition for key '" + key + "' is '" + lang_1.stringify(fnOrArray) + "'");
  2268. }
  2269. }
  2270. /**
  2271. * Provides a way for expressing ES6 classes with parameter annotations in ES5.
  2272. *
  2273. * ## Basic Example
  2274. *
  2275. * ```
  2276. * var Greeter = ng.Class({
  2277. * constructor: function(name) {
  2278. * this.name = name;
  2279. * },
  2280. *
  2281. * greet: function() {
  2282. * alert('Hello ' + this.name + '!');
  2283. * }
  2284. * });
  2285. * ```
  2286. *
  2287. * is equivalent to ES6:
  2288. *
  2289. * ```
  2290. * class Greeter {
  2291. * constructor(name) {
  2292. * this.name = name;
  2293. * }
  2294. *
  2295. * greet() {
  2296. * alert('Hello ' + this.name + '!');
  2297. * }
  2298. * }
  2299. * ```
  2300. *
  2301. * or equivalent to ES5:
  2302. *
  2303. * ```
  2304. * var Greeter = function (name) {
  2305. * this.name = name;
  2306. * }
  2307. *
  2308. * Greeter.prototype.greet = function () {
  2309. * alert('Hello ' + this.name + '!');
  2310. * }
  2311. * ```
  2312. *
  2313. * ### Example with parameter annotations
  2314. *
  2315. * ```
  2316. * var MyService = ng.Class({
  2317. * constructor: [String, [new Query(), QueryList], function(name, queryList) {
  2318. * ...
  2319. * }]
  2320. * });
  2321. * ```
  2322. *
  2323. * is equivalent to ES6:
  2324. *
  2325. * ```
  2326. * class MyService {
  2327. * constructor(name: string, @Query() queryList: QueryList) {
  2328. * ...
  2329. * }
  2330. * }
  2331. * ```
  2332. *
  2333. * ### Example with inheritance
  2334. *
  2335. * ```
  2336. * var Shape = ng.Class({
  2337. * constructor: (color) {
  2338. * this.color = color;
  2339. * }
  2340. * });
  2341. *
  2342. * var Square = ng.Class({
  2343. * extends: Shape,
  2344. * constructor: function(color, size) {
  2345. * Shape.call(this, color);
  2346. * this.size = size;
  2347. * }
  2348. * });
  2349. * ```
  2350. */
  2351. function Class(clsDef) {
  2352. var constructor = applyParams(clsDef.hasOwnProperty('constructor') ? clsDef.constructor : undefined, 'constructor');
  2353. var proto = constructor.prototype;
  2354. if (clsDef.hasOwnProperty('extends')) {
  2355. if (lang_1.isFunction(clsDef.extends)) {
  2356. constructor.prototype = proto =
  2357. Object.create(clsDef.extends.prototype);
  2358. }
  2359. else {
  2360. throw new Error("Class definition 'extends' property must be a constructor function was: " + lang_1.stringify(clsDef.extends));
  2361. }
  2362. }
  2363. for (var key in clsDef) {
  2364. if (key != 'extends' && key != 'prototype' && clsDef.hasOwnProperty(key)) {
  2365. proto[key] = applyParams(clsDef[key], key);
  2366. }
  2367. }
  2368. if (this && this.annotations instanceof Array) {
  2369. Reflect.defineMetadata('annotations', this.annotations, constructor);
  2370. }
  2371. return constructor;
  2372. }
  2373. exports.Class = Class;
  2374. var Reflect = lang_1.global.Reflect;
  2375. if (!(Reflect && Reflect.getMetadata)) {
  2376. throw 'reflect-metadata shim is required when using class decorators';
  2377. }
  2378. function makeDecorator(annotationCls, chainFn) {
  2379. if (chainFn === void 0) { chainFn = null; }
  2380. function DecoratorFactory(objOrType) {
  2381. var annotationInstance = new annotationCls(objOrType);
  2382. if (this instanceof annotationCls) {
  2383. return annotationInstance;
  2384. }
  2385. else {
  2386. var chainAnnotation = lang_1.isFunction(this) && this.annotations instanceof Array ? this.annotations : [];
  2387. chainAnnotation.push(annotationInstance);
  2388. var TypeDecorator = function TypeDecorator(cls) {
  2389. var annotations = Reflect.getOwnMetadata('annotations', cls);
  2390. annotations = annotations || [];
  2391. annotations.push(annotationInstance);
  2392. Reflect.defineMetadata('annotations', annotations, cls);
  2393. return cls;
  2394. };
  2395. TypeDecorator.annotations = chainAnnotation;
  2396. TypeDecorator.Class = Class;
  2397. if (chainFn)
  2398. chainFn(TypeDecorator);
  2399. return TypeDecorator;
  2400. }
  2401. }
  2402. DecoratorFactory.prototype = Object.create(annotationCls.prototype);
  2403. return DecoratorFactory;
  2404. }
  2405. exports.makeDecorator = makeDecorator;
  2406. function makeParamDecorator(annotationCls) {
  2407. function ParamDecoratorFactory() {
  2408. var args = [];
  2409. for (var _i = 0; _i < arguments.length; _i++) {
  2410. args[_i - 0] = arguments[_i];
  2411. }
  2412. var annotationInstance = Object.create(annotationCls.prototype);
  2413. annotationCls.apply(annotationInstance, args);
  2414. if (this instanceof annotationCls) {
  2415. return annotationInstance;
  2416. }
  2417. else {
  2418. ParamDecorator.annotation = annotationInstance;
  2419. return ParamDecorator;
  2420. }
  2421. function ParamDecorator(cls, unusedKey, index) {
  2422. var parameters = Reflect.getMetadata('parameters', cls);
  2423. parameters = parameters || [];
  2424. // there might be gaps if some in between parameters do not have annotations.
  2425. // we pad with nulls.
  2426. while (parameters.length <= index) {
  2427. parameters.push(null);
  2428. }
  2429. parameters[index] = parameters[index] || [];
  2430. var annotationsForParam = parameters[index];
  2431. annotationsForParam.push(annotationInstance);
  2432. Reflect.defineMetadata('parameters', parameters, cls);
  2433. return cls;
  2434. }
  2435. }
  2436. ParamDecoratorFactory.prototype = Object.create(annotationCls.prototype);
  2437. return ParamDecoratorFactory;
  2438. }
  2439. exports.makeParamDecorator = makeParamDecorator;
  2440. function makePropDecorator(decoratorCls) {
  2441. function PropDecoratorFactory() {
  2442. var args = [];
  2443. for (var _i = 0; _i < arguments.length; _i++) {
  2444. args[_i - 0] = arguments[_i];
  2445. }
  2446. var decoratorInstance = Object.create(decoratorCls.prototype);
  2447. decoratorCls.apply(decoratorInstance, args);
  2448. if (this instanceof decoratorCls) {
  2449. return decoratorInstance;
  2450. }
  2451. else {
  2452. return function PropDecorator(target, name) {
  2453. var meta = Reflect.getOwnMetadata('propMetadata', target.constructor);
  2454. meta = meta || {};
  2455. meta[name] = meta[name] || [];
  2456. meta[name].unshift(decoratorInstance);
  2457. Reflect.defineMetadata('propMetadata', meta, target.constructor);
  2458. };
  2459. }
  2460. }
  2461. PropDecoratorFactory.prototype = Object.create(decoratorCls.prototype);
  2462. return PropDecoratorFactory;
  2463. }
  2464. exports.makePropDecorator = makePropDecorator;
  2465. /***/ },
  2466. /* 10 */
  2467. /***/ function(module, exports, __webpack_require__) {
  2468. var lang_1 = __webpack_require__(5);
  2469. /**
  2470. * Allows to refer to references which are not yet defined.
  2471. *
  2472. * For instance, `forwardRef` is used when the `token` which we need to refer to for the purposes of
  2473. * DI is declared,
  2474. * but not yet defined. It is also used when the `token` which we use when creating a query is not
  2475. * yet defined.
  2476. *
  2477. * ### Example
  2478. * {@example core/di/ts/forward_ref/forward_ref.ts region='forward_ref'}
  2479. */
  2480. function forwardRef(forwardRefFn) {
  2481. forwardRefFn.__forward_ref__ = forwardRef;
  2482. forwardRefFn.toString = function () { return lang_1.stringify(this()); };
  2483. return forwardRefFn;
  2484. }
  2485. exports.forwardRef = forwardRef;
  2486. /**
  2487. * Lazily retrieves the reference value from a forwardRef.
  2488. *
  2489. * Acts as the identity function when given a non-forward-ref value.
  2490. *
  2491. * ### Example ([live demo](http://plnkr.co/edit/GU72mJrk1fiodChcmiDR?p=preview))
  2492. *
  2493. * ```typescript
  2494. * var ref = forwardRef(() => "refValue");
  2495. * expect(resolveForwardRef(ref)).toEqual("refValue");
  2496. * expect(resolveForwardRef("regularValue")).toEqual("regularValue");
  2497. * ```
  2498. *
  2499. * See: {@link forwardRef}
  2500. */
  2501. function resolveForwardRef(type) {
  2502. if (lang_1.isFunction(type) && type.hasOwnProperty('__forward_ref__') &&
  2503. type.__forward_ref__ === forwardRef) {
  2504. return type();
  2505. }
  2506. else {
  2507. return type;
  2508. }
  2509. }
  2510. exports.resolveForwardRef = resolveForwardRef;
  2511. /***/ },
  2512. /* 11 */
  2513. /***/ function(module, exports, __webpack_require__) {
  2514. var collection_1 = __webpack_require__(12);
  2515. var provider_1 = __webpack_require__(13);
  2516. var exceptions_1 = __webpack_require__(21);
  2517. var lang_1 = __webpack_require__(5);
  2518. var key_1 = __webpack_require__(19);
  2519. var metadata_1 = __webpack_require__(7);
  2520. // Threshold for the dynamic version
  2521. var _MAX_CONSTRUCTION_COUNTER = 10;
  2522. exports.UNDEFINED = lang_1.CONST_EXPR(new Object());
  2523. /**
  2524. * Visibility of a {@link Provider}.
  2525. */
  2526. (function (Visibility) {
  2527. /**
  2528. * A `Public` {@link Provider} is only visible to regular (as opposed to host) child injectors.
  2529. */
  2530. Visibility[Visibility["Public"] = 0] = "Public";
  2531. /**
  2532. * A `Private` {@link Provider} is only visible to host (as opposed to regular) child injectors.
  2533. */
  2534. Visibility[Visibility["Private"] = 1] = "Private";
  2535. /**
  2536. * A `PublicAndPrivate` {@link Provider} is visible to both host and regular child injectors.
  2537. */
  2538. Visibility[Visibility["PublicAndPrivate"] = 2] = "PublicAndPrivate";
  2539. })(exports.Visibility || (exports.Visibility = {}));
  2540. var Visibility = exports.Visibility;
  2541. function canSee(src, dst) {
  2542. return (src === dst) ||
  2543. (dst === Visibility.PublicAndPrivate || src === Visibility.PublicAndPrivate);
  2544. }
  2545. var ProtoInjectorInlineStrategy = (function () {
  2546. function ProtoInjectorInlineStrategy(protoEI, bwv) {
  2547. this.provider0 = null;
  2548. this.provider1 = null;
  2549. this.provider2 = null;
  2550. this.provider3 = null;
  2551. this.provider4 = null;
  2552. this.provider5 = null;
  2553. this.provider6 = null;
  2554. this.provider7 = null;
  2555. this.provider8 = null;
  2556. this.provider9 = null;
  2557. this.keyId0 = null;
  2558. this.keyId1 = null;
  2559. this.keyId2 = null;
  2560. this.keyId3 = null;
  2561. this.keyId4 = null;
  2562. this.keyId5 = null;
  2563. this.keyId6 = null;
  2564. this.keyId7 = null;
  2565. this.keyId8 = null;
  2566. this.keyId9 = null;
  2567. this.visibility0 = null;
  2568. this.visibility1 = null;
  2569. this.visibility2 = null;
  2570. this.visibility3 = null;
  2571. this.visibility4 = null;
  2572. this.visibility5 = null;
  2573. this.visibility6 = null;
  2574. this.visibility7 = null;
  2575. this.visibility8 = null;
  2576. this.visibility9 = null;
  2577. var length = bwv.length;
  2578. if (length > 0) {
  2579. this.provider0 = bwv[0].provider;
  2580. this.keyId0 = bwv[0].getKeyId();
  2581. this.visibility0 = bwv[0].visibility;
  2582. }
  2583. if (length > 1) {
  2584. this.provider1 = bwv[1].provider;
  2585. this.keyId1 = bwv[1].getKeyId();
  2586. this.visibility1 = bwv[1].visibility;
  2587. }
  2588. if (length > 2) {
  2589. this.provider2 = bwv[2].provider;
  2590. this.keyId2 = bwv[2].getKeyId();
  2591. this.visibility2 = bwv[2].visibility;
  2592. }
  2593. if (length > 3) {
  2594. this.provider3 = bwv[3].provider;
  2595. this.keyId3 = bwv[3].getKeyId();
  2596. this.visibility3 = bwv[3].visibility;
  2597. }
  2598. if (length > 4) {
  2599. this.provider4 = bwv[4].provider;
  2600. this.keyId4 = bwv[4].getKeyId();
  2601. this.visibility4 = bwv[4].visibility;
  2602. }
  2603. if (length > 5) {
  2604. this.provider5 = bwv[5].provider;
  2605. this.keyId5 = bwv[5].getKeyId();
  2606. this.visibility5 = bwv[5].visibility;
  2607. }
  2608. if (length > 6) {
  2609. this.provider6 = bwv[6].provider;
  2610. this.keyId6 = bwv[6].getKeyId();
  2611. this.visibility6 = bwv[6].visibility;
  2612. }
  2613. if (length > 7) {
  2614. this.provider7 = bwv[7].provider;
  2615. this.keyId7 = bwv[7].getKeyId();
  2616. this.visibility7 = bwv[7].visibility;
  2617. }
  2618. if (length > 8) {
  2619. this.provider8 = bwv[8].provider;
  2620. this.keyId8 = bwv[8].getKeyId();
  2621. this.visibility8 = bwv[8].visibility;
  2622. }
  2623. if (length > 9) {
  2624. this.provider9 = bwv[9].provider;
  2625. this.keyId9 = bwv[9].getKeyId();
  2626. this.visibility9 = bwv[9].visibility;
  2627. }
  2628. }
  2629. ProtoInjectorInlineStrategy.prototype.getProviderAtIndex = function (index) {
  2630. if (index == 0)
  2631. return this.provider0;
  2632. if (index == 1)
  2633. return this.provider1;
  2634. if (index == 2)
  2635. return this.provider2;
  2636. if (index == 3)
  2637. return this.provider3;
  2638. if (index == 4)
  2639. return this.provider4;
  2640. if (index == 5)
  2641. return this.provider5;
  2642. if (index == 6)
  2643. return this.provider6;
  2644. if (index == 7)
  2645. return this.provider7;
  2646. if (index == 8)
  2647. return this.provider8;
  2648. if (index == 9)
  2649. return this.provider9;
  2650. throw new exceptions_1.OutOfBoundsError(index);
  2651. };
  2652. ProtoInjectorInlineStrategy.prototype.createInjectorStrategy = function (injector) {
  2653. return new InjectorInlineStrategy(injector, this);
  2654. };
  2655. return ProtoInjectorInlineStrategy;
  2656. })();
  2657. exports.ProtoInjectorInlineStrategy = ProtoInjectorInlineStrategy;
  2658. var ProtoInjectorDynamicStrategy = (function () {
  2659. function ProtoInjectorDynamicStrategy(protoInj, bwv) {
  2660. var len = bwv.length;
  2661. this.providers = collection_1.ListWrapper.createFixedSize(len);
  2662. this.keyIds = collection_1.ListWrapper.createFixedSize(len);
  2663. this.visibilities = collection_1.ListWrapper.createFixedSize(len);
  2664. for (var i = 0; i < len; i++) {
  2665. this.providers[i] = bwv[i].provider;
  2666. this.keyIds[i] = bwv[i].getKeyId();
  2667. this.visibilities[i] = bwv[i].visibility;
  2668. }
  2669. }
  2670. ProtoInjectorDynamicStrategy.prototype.getProviderAtIndex = function (index) {
  2671. if (index < 0 || index >= this.providers.length) {
  2672. throw new exceptions_1.OutOfBoundsError(index);
  2673. }
  2674. return this.providers[index];
  2675. };
  2676. ProtoInjectorDynamicStrategy.prototype.createInjectorStrategy = function (ei) {
  2677. return new InjectorDynamicStrategy(this, ei);
  2678. };
  2679. return ProtoInjectorDynamicStrategy;
  2680. })();
  2681. exports.ProtoInjectorDynamicStrategy = ProtoInjectorDynamicStrategy;
  2682. var ProtoInjector = (function () {
  2683. function ProtoInjector(bwv) {
  2684. this.numberOfProviders = bwv.length;
  2685. this._strategy = bwv.length > _MAX_CONSTRUCTION_COUNTER ?
  2686. new ProtoInjectorDynamicStrategy(this, bwv) :
  2687. new ProtoInjectorInlineStrategy(this, bwv);
  2688. }
  2689. ProtoInjector.prototype.getProviderAtIndex = function (index) { return this._strategy.getProviderAtIndex(index); };
  2690. return ProtoInjector;
  2691. })();
  2692. exports.ProtoInjector = ProtoInjector;
  2693. var InjectorInlineStrategy = (function () {
  2694. function InjectorInlineStrategy(injector, protoStrategy) {
  2695. this.injector = injector;
  2696. this.protoStrategy = protoStrategy;
  2697. this.obj0 = exports.UNDEFINED;
  2698. this.obj1 = exports.UNDEFINED;
  2699. this.obj2 = exports.UNDEFINED;
  2700. this.obj3 = exports.UNDEFINED;
  2701. this.obj4 = exports.UNDEFINED;
  2702. this.obj5 = exports.UNDEFINED;
  2703. this.obj6 = exports.UNDEFINED;
  2704. this.obj7 = exports.UNDEFINED;
  2705. this.obj8 = exports.UNDEFINED;
  2706. this.obj9 = exports.UNDEFINED;
  2707. }
  2708. InjectorInlineStrategy.prototype.resetConstructionCounter = function () { this.injector._constructionCounter = 0; };
  2709. InjectorInlineStrategy.prototype.instantiateProvider = function (provider, visibility) {
  2710. return this.injector._new(provider, visibility);
  2711. };
  2712. InjectorInlineStrategy.prototype.attach = function (parent, isHost) {
  2713. var inj = this.injector;
  2714. inj._parent = parent;
  2715. inj._isHost = isHost;
  2716. };
  2717. InjectorInlineStrategy.prototype.getObjByKeyId = function (keyId, visibility) {
  2718. var p = this.protoStrategy;
  2719. var inj = this.injector;
  2720. if (p.keyId0 === keyId && canSee(p.visibility0, visibility)) {
  2721. if (this.obj0 === exports.UNDEFINED) {
  2722. this.obj0 = inj._new(p.provider0, p.visibility0);
  2723. }
  2724. return this.obj0;
  2725. }
  2726. if (p.keyId1 === keyId && canSee(p.visibility1, visibility)) {
  2727. if (this.obj1 === exports.UNDEFINED) {
  2728. this.obj1 = inj._new(p.provider1, p.visibility1);
  2729. }
  2730. return this.obj1;
  2731. }
  2732. if (p.keyId2 === keyId && canSee(p.visibility2, visibility)) {
  2733. if (this.obj2 === exports.UNDEFINED) {
  2734. this.obj2 = inj._new(p.provider2, p.visibility2);
  2735. }
  2736. return this.obj2;
  2737. }
  2738. if (p.keyId3 === keyId && canSee(p.visibility3, visibility)) {
  2739. if (this.obj3 === exports.UNDEFINED) {
  2740. this.obj3 = inj._new(p.provider3, p.visibility3);
  2741. }
  2742. return this.obj3;
  2743. }
  2744. if (p.keyId4 === keyId && canSee(p.visibility4, visibility)) {
  2745. if (this.obj4 === exports.UNDEFINED) {
  2746. this.obj4 = inj._new(p.provider4, p.visibility4);
  2747. }
  2748. return this.obj4;
  2749. }
  2750. if (p.keyId5 === keyId && canSee(p.visibility5, visibility)) {
  2751. if (this.obj5 === exports.UNDEFINED) {
  2752. this.obj5 = inj._new(p.provider5, p.visibility5);
  2753. }
  2754. return this.obj5;
  2755. }
  2756. if (p.keyId6 === keyId && canSee(p.visibility6, visibility)) {
  2757. if (this.obj6 === exports.UNDEFINED) {
  2758. this.obj6 = inj._new(p.provider6, p.visibility6);
  2759. }
  2760. return this.obj6;
  2761. }
  2762. if (p.keyId7 === keyId && canSee(p.visibility7, visibility)) {
  2763. if (this.obj7 === exports.UNDEFINED) {
  2764. this.obj7 = inj._new(p.provider7, p.visibility7);
  2765. }
  2766. return this.obj7;
  2767. }
  2768. if (p.keyId8 === keyId && canSee(p.visibility8, visibility)) {
  2769. if (this.obj8 === exports.UNDEFINED) {
  2770. this.obj8 = inj._new(p.provider8, p.visibility8);
  2771. }
  2772. return this.obj8;
  2773. }
  2774. if (p.keyId9 === keyId && canSee(p.visibility9, visibility)) {
  2775. if (this.obj9 === exports.UNDEFINED) {
  2776. this.obj9 = inj._new(p.provider9, p.visibility9);
  2777. }
  2778. return this.obj9;
  2779. }
  2780. return exports.UNDEFINED;
  2781. };
  2782. InjectorInlineStrategy.prototype.getObjAtIndex = function (index) {
  2783. if (index == 0)
  2784. return this.obj0;
  2785. if (index == 1)
  2786. return this.obj1;
  2787. if (index == 2)
  2788. return this.obj2;
  2789. if (index == 3)
  2790. return this.obj3;
  2791. if (index == 4)
  2792. return this.obj4;
  2793. if (index == 5)
  2794. return this.obj5;
  2795. if (index == 6)
  2796. return this.obj6;
  2797. if (index == 7)
  2798. return this.obj7;
  2799. if (index == 8)
  2800. return this.obj8;
  2801. if (index == 9)
  2802. return this.obj9;
  2803. throw new exceptions_1.OutOfBoundsError(index);
  2804. };
  2805. InjectorInlineStrategy.prototype.getMaxNumberOfObjects = function () { return _MAX_CONSTRUCTION_COUNTER; };
  2806. return InjectorInlineStrategy;
  2807. })();
  2808. exports.InjectorInlineStrategy = InjectorInlineStrategy;
  2809. var InjectorDynamicStrategy = (function () {
  2810. function InjectorDynamicStrategy(protoStrategy, injector) {
  2811. this.protoStrategy = protoStrategy;
  2812. this.injector = injector;
  2813. this.objs = collection_1.ListWrapper.createFixedSize(protoStrategy.providers.length);
  2814. collection_1.ListWrapper.fill(this.objs, exports.UNDEFINED);
  2815. }
  2816. InjectorDynamicStrategy.prototype.resetConstructionCounter = function () { this.injector._constructionCounter = 0; };
  2817. InjectorDynamicStrategy.prototype.instantiateProvider = function (provider, visibility) {
  2818. return this.injector._new(provider, visibility);
  2819. };
  2820. InjectorDynamicStrategy.prototype.attach = function (parent, isHost) {
  2821. var inj = this.injector;
  2822. inj._parent = parent;
  2823. inj._isHost = isHost;
  2824. };
  2825. InjectorDynamicStrategy.prototype.getObjByKeyId = function (keyId, visibility) {
  2826. var p = this.protoStrategy;
  2827. for (var i = 0; i < p.keyIds.length; i++) {
  2828. if (p.keyIds[i] === keyId && canSee(p.visibilities[i], visibility)) {
  2829. if (this.objs[i] === exports.UNDEFINED) {
  2830. this.objs[i] = this.injector._new(p.providers[i], p.visibilities[i]);
  2831. }
  2832. return this.objs[i];
  2833. }
  2834. }
  2835. return exports.UNDEFINED;
  2836. };
  2837. InjectorDynamicStrategy.prototype.getObjAtIndex = function (index) {
  2838. if (index < 0 || index >= this.objs.length) {
  2839. throw new exceptions_1.OutOfBoundsError(index);
  2840. }
  2841. return this.objs[index];
  2842. };
  2843. InjectorDynamicStrategy.prototype.getMaxNumberOfObjects = function () { return this.objs.length; };
  2844. return InjectorDynamicStrategy;
  2845. })();
  2846. exports.InjectorDynamicStrategy = InjectorDynamicStrategy;
  2847. var ProviderWithVisibility = (function () {
  2848. function ProviderWithVisibility(provider, visibility) {
  2849. this.provider = provider;
  2850. this.visibility = visibility;
  2851. }
  2852. ;
  2853. ProviderWithVisibility.prototype.getKeyId = function () { return this.provider.key.id; };
  2854. return ProviderWithVisibility;
  2855. })();
  2856. exports.ProviderWithVisibility = ProviderWithVisibility;
  2857. /**
  2858. * A dependency injection container used for instantiating objects and resolving dependencies.
  2859. *
  2860. * An `Injector` is a replacement for a `new` operator, which can automatically resolve the
  2861. * constructor dependencies.
  2862. *
  2863. * In typical use, application code asks for the dependencies in the constructor and they are
  2864. * resolved by the `Injector`.
  2865. *
  2866. * ### Example ([live demo](http://plnkr.co/edit/jzjec0?p=preview))
  2867. *
  2868. * The following example creates an `Injector` configured to create `Engine` and `Car`.
  2869. *
  2870. * ```typescript
  2871. * @Injectable()
  2872. * class Engine {
  2873. * }
  2874. *
  2875. * @Injectable()
  2876. * class Car {
  2877. * constructor(public engine:Engine) {}
  2878. * }
  2879. *
  2880. * var injector = Injector.resolveAndCreate([Car, Engine]);
  2881. * var car = injector.get(Car);
  2882. * expect(car instanceof Car).toBe(true);
  2883. * expect(car.engine instanceof Engine).toBe(true);
  2884. * ```
  2885. *
  2886. * Notice, we don't use the `new` operator because we explicitly want to have the `Injector`
  2887. * resolve all of the object's dependencies automatically.
  2888. */
  2889. var Injector = (function () {
  2890. /**
  2891. * Private
  2892. */
  2893. function Injector(_proto /* ProtoInjector */, _parent, _depProvider, _debugContext) {
  2894. if (_parent === void 0) { _parent = null; }
  2895. if (_depProvider === void 0) { _depProvider = null; }
  2896. if (_debugContext === void 0) { _debugContext = null; }
  2897. this._depProvider = _depProvider;
  2898. this._debugContext = _debugContext;
  2899. /** @internal */
  2900. this._isHost = false;
  2901. /** @internal */
  2902. this._constructionCounter = 0;
  2903. this._proto = _proto;
  2904. this._parent = _parent;
  2905. this._strategy = _proto._strategy.createInjectorStrategy(this);
  2906. }
  2907. /**
  2908. * Turns an array of provider definitions into an array of resolved providers.
  2909. *
  2910. * A resolution is a process of flattening multiple nested arrays and converting individual
  2911. * providers into an array of {@link ResolvedProvider}s.
  2912. *
  2913. * ### Example ([live demo](http://plnkr.co/edit/AiXTHi?p=preview))
  2914. *
  2915. * ```typescript
  2916. * @Injectable()
  2917. * class Engine {
  2918. * }
  2919. *
  2920. * @Injectable()
  2921. * class Car {
  2922. * constructor(public engine:Engine) {}
  2923. * }
  2924. *
  2925. * var providers = Injector.resolve([Car, [[Engine]]]);
  2926. *
  2927. * expect(providers.length).toEqual(2);
  2928. *
  2929. * expect(providers[0] instanceof ResolvedProvider).toBe(true);
  2930. * expect(providers[0].key.displayName).toBe("Car");
  2931. * expect(providers[0].dependencies.length).toEqual(1);
  2932. * expect(providers[0].factory).toBeDefined();
  2933. *
  2934. * expect(providers[1].key.displayName).toBe("Engine");
  2935. * });
  2936. * ```
  2937. *
  2938. * See {@link Injector#fromResolvedProviders} for more info.
  2939. */
  2940. Injector.resolve = function (providers) {
  2941. return provider_1.resolveProviders(providers);
  2942. };
  2943. /**
  2944. * Resolves an array of providers and creates an injector from those providers.
  2945. *
  2946. * The passed-in providers can be an array of `Type`, {@link Provider},
  2947. * or a recursive array of more providers.
  2948. *
  2949. * ### Example ([live demo](http://plnkr.co/edit/ePOccA?p=preview))
  2950. *
  2951. * ```typescript
  2952. * @Injectable()
  2953. * class Engine {
  2954. * }
  2955. *
  2956. * @Injectable()
  2957. * class Car {
  2958. * constructor(public engine:Engine) {}
  2959. * }
  2960. *
  2961. * var injector = Injector.resolveAndCreate([Car, Engine]);
  2962. * expect(injector.get(Car) instanceof Car).toBe(true);
  2963. * ```
  2964. *
  2965. * This function is slower than the corresponding `fromResolvedProviders`
  2966. * because it needs to resolve the passed-in providers first.
  2967. * See {@link Injector#resolve} and {@link Injector#fromResolvedProviders}.
  2968. */
  2969. Injector.resolveAndCreate = function (providers) {
  2970. var resolvedProviders = Injector.resolve(providers);
  2971. return Injector.fromResolvedProviders(resolvedProviders);
  2972. };
  2973. /**
  2974. * Creates an injector from previously resolved providers.
  2975. *
  2976. * This API is the recommended way to construct injectors in performance-sensitive parts.
  2977. *
  2978. * ### Example ([live demo](http://plnkr.co/edit/KrSMci?p=preview))
  2979. *
  2980. * ```typescript
  2981. * @Injectable()
  2982. * class Engine {
  2983. * }
  2984. *
  2985. * @Injectable()
  2986. * class Car {
  2987. * constructor(public engine:Engine) {}
  2988. * }
  2989. *
  2990. * var providers = Injector.resolve([Car, Engine]);
  2991. * var injector = Injector.fromResolvedProviders(providers);
  2992. * expect(injector.get(Car) instanceof Car).toBe(true);
  2993. * ```
  2994. */
  2995. Injector.fromResolvedProviders = function (providers) {
  2996. var bd = providers.map(function (b) { return new ProviderWithVisibility(b, Visibility.Public); });
  2997. var proto = new ProtoInjector(bd);
  2998. return new Injector(proto, null, null);
  2999. };
  3000. /**
  3001. * @deprecated
  3002. */
  3003. Injector.fromResolvedBindings = function (providers) {
  3004. return Injector.fromResolvedProviders(providers);
  3005. };
  3006. /**
  3007. * @internal
  3008. */
  3009. Injector.prototype.debugContext = function () { return this._debugContext(); };
  3010. /**
  3011. * Retrieves an instance from the injector based on the provided token.
  3012. * Throws {@link NoProviderError} if not found.
  3013. *
  3014. * ### Example ([live demo](http://plnkr.co/edit/HeXSHg?p=preview))
  3015. *
  3016. * ```typescript
  3017. * var injector = Injector.resolveAndCreate([
  3018. * provide("validToken", {useValue: "Value"})
  3019. * ]);
  3020. * expect(injector.get("validToken")).toEqual("Value");
  3021. * expect(() => injector.get("invalidToken")).toThrowError();
  3022. * ```
  3023. *
  3024. * `Injector` returns itself when given `Injector` as a token.
  3025. *
  3026. * ```typescript
  3027. * var injector = Injector.resolveAndCreate([]);
  3028. * expect(injector.get(Injector)).toBe(injector);
  3029. * ```
  3030. */
  3031. Injector.prototype.get = function (token) {
  3032. return this._getByKey(key_1.Key.get(token), null, null, false, Visibility.PublicAndPrivate);
  3033. };
  3034. /**
  3035. * Retrieves an instance from the injector based on the provided token.
  3036. * Returns null if not found.
  3037. *
  3038. * ### Example ([live demo](http://plnkr.co/edit/tpEbEy?p=preview))
  3039. *
  3040. * ```typescript
  3041. * var injector = Injector.resolveAndCreate([
  3042. * provide("validToken", {useValue: "Value"})
  3043. * ]);
  3044. * expect(injector.getOptional("validToken")).toEqual("Value");
  3045. * expect(injector.getOptional("invalidToken")).toBe(null);
  3046. * ```
  3047. *
  3048. * `Injector` returns itself when given `Injector` as a token.
  3049. *
  3050. * ```typescript
  3051. * var injector = Injector.resolveAndCreate([]);
  3052. * expect(injector.getOptional(Injector)).toBe(injector);
  3053. * ```
  3054. */
  3055. Injector.prototype.getOptional = function (token) {
  3056. return this._getByKey(key_1.Key.get(token), null, null, true, Visibility.PublicAndPrivate);
  3057. };
  3058. /**
  3059. * @internal
  3060. */
  3061. Injector.prototype.getAt = function (index) { return this._strategy.getObjAtIndex(index); };
  3062. Object.defineProperty(Injector.prototype, "parent", {
  3063. /**
  3064. * Parent of this injector.
  3065. *
  3066. * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
  3067. * -->
  3068. *
  3069. * ### Example ([live demo](http://plnkr.co/edit/eosMGo?p=preview))
  3070. *
  3071. * ```typescript
  3072. * var parent = Injector.resolveAndCreate([]);
  3073. * var child = parent.resolveAndCreateChild([]);
  3074. * expect(child.parent).toBe(parent);
  3075. * ```
  3076. */
  3077. get: function () { return this._parent; },
  3078. enumerable: true,
  3079. configurable: true
  3080. });
  3081. Object.defineProperty(Injector.prototype, "internalStrategy", {
  3082. /**
  3083. * @internal
  3084. * Internal. Do not use.
  3085. * We return `any` not to export the InjectorStrategy type.
  3086. */
  3087. get: function () { return this._strategy; },
  3088. enumerable: true,
  3089. configurable: true
  3090. });
  3091. /**
  3092. * Resolves an array of providers and creates a child injector from those providers.
  3093. *
  3094. * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
  3095. * -->
  3096. *
  3097. * The passed-in providers can be an array of `Type`, {@link Provider},
  3098. * or a recursive array of more providers.
  3099. *
  3100. * ### Example ([live demo](http://plnkr.co/edit/opB3T4?p=preview))
  3101. *
  3102. * ```typescript
  3103. * class ParentProvider {}
  3104. * class ChildProvider {}
  3105. *
  3106. * var parent = Injector.resolveAndCreate([ParentProvider]);
  3107. * var child = parent.resolveAndCreateChild([ChildProvider]);
  3108. *
  3109. * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);
  3110. * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);
  3111. * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));
  3112. * ```
  3113. *
  3114. * This function is slower than the corresponding `createChildFromResolved`
  3115. * because it needs to resolve the passed-in providers first.
  3116. * See {@link Injector#resolve} and {@link Injector#createChildFromResolved}.
  3117. */
  3118. Injector.prototype.resolveAndCreateChild = function (providers) {
  3119. var resolvedProviders = Injector.resolve(providers);
  3120. return this.createChildFromResolved(resolvedProviders);
  3121. };
  3122. /**
  3123. * Creates a child injector from previously resolved providers.
  3124. *
  3125. * <!-- TODO: Add a link to the section of the user guide talking about hierarchical injection.
  3126. * -->
  3127. *
  3128. * This API is the recommended way to construct injectors in performance-sensitive parts.
  3129. *
  3130. * ### Example ([live demo](http://plnkr.co/edit/VhyfjN?p=preview))
  3131. *
  3132. * ```typescript
  3133. * class ParentProvider {}
  3134. * class ChildProvider {}
  3135. *
  3136. * var parentProviders = Injector.resolve([ParentProvider]);
  3137. * var childProviders = Injector.resolve([ChildProvider]);
  3138. *
  3139. * var parent = Injector.fromResolvedProviders(parentProviders);
  3140. * var child = parent.createChildFromResolved(childProviders);
  3141. *
  3142. * expect(child.get(ParentProvider) instanceof ParentProvider).toBe(true);
  3143. * expect(child.get(ChildProvider) instanceof ChildProvider).toBe(true);
  3144. * expect(child.get(ParentProvider)).toBe(parent.get(ParentProvider));
  3145. * ```
  3146. */
  3147. Injector.prototype.createChildFromResolved = function (providers) {
  3148. var bd = providers.map(function (b) { return new ProviderWithVisibility(b, Visibility.Public); });
  3149. var proto = new ProtoInjector(bd);
  3150. var inj = new Injector(proto, null, null);
  3151. inj._parent = this;
  3152. return inj;
  3153. };
  3154. /**
  3155. * Resolves a provider and instantiates an object in the context of the injector.
  3156. *
  3157. * The created object does not get cached by the injector.
  3158. *
  3159. * ### Example ([live demo](http://plnkr.co/edit/yvVXoB?p=preview))
  3160. *
  3161. * ```typescript
  3162. * @Injectable()
  3163. * class Engine {
  3164. * }
  3165. *
  3166. * @Injectable()
  3167. * class Car {
  3168. * constructor(public engine:Engine) {}
  3169. * }
  3170. *
  3171. * var injector = Injector.resolveAndCreate([Engine]);
  3172. *
  3173. * var car = injector.resolveAndInstantiate(Car);
  3174. * expect(car.engine).toBe(injector.get(Engine));
  3175. * expect(car).not.toBe(injector.resolveAndInstantiate(Car));
  3176. * ```
  3177. */
  3178. Injector.prototype.resolveAndInstantiate = function (provider) {
  3179. return this.instantiateResolved(Injector.resolve([provider])[0]);
  3180. };
  3181. /**
  3182. * Instantiates an object using a resolved provider in the context of the injector.
  3183. *
  3184. * The created object does not get cached by the injector.
  3185. *
  3186. * ### Example ([live demo](http://plnkr.co/edit/ptCImQ?p=preview))
  3187. *
  3188. * ```typescript
  3189. * @Injectable()
  3190. * class Engine {
  3191. * }
  3192. *
  3193. * @Injectable()
  3194. * class Car {
  3195. * constructor(public engine:Engine) {}
  3196. * }
  3197. *
  3198. * var injector = Injector.resolveAndCreate([Engine]);
  3199. * var carProvider = Injector.resolve([Car])[0];
  3200. * var car = injector.instantiateResolved(carProvider);
  3201. * expect(car.engine).toBe(injector.get(Engine));
  3202. * expect(car).not.toBe(injector.instantiateResolved(carProvider));
  3203. * ```
  3204. */
  3205. Injector.prototype.instantiateResolved = function (provider) {
  3206. return this._instantiateProvider(provider, Visibility.PublicAndPrivate);
  3207. };
  3208. /** @internal */
  3209. Injector.prototype._new = function (provider, visibility) {
  3210. if (this._constructionCounter++ > this._strategy.getMaxNumberOfObjects()) {
  3211. throw new exceptions_1.CyclicDependencyError(this, provider.key);
  3212. }
  3213. return this._instantiateProvider(provider, visibility);
  3214. };
  3215. Injector.prototype._instantiateProvider = function (provider, visibility) {
  3216. if (provider.multiProvider) {
  3217. var res = collection_1.ListWrapper.createFixedSize(provider.resolvedFactories.length);
  3218. for (var i = 0; i < provider.resolvedFactories.length; ++i) {
  3219. res[i] = this._instantiate(provider, provider.resolvedFactories[i], visibility);
  3220. }
  3221. return res;
  3222. }
  3223. else {
  3224. return this._instantiate(provider, provider.resolvedFactories[0], visibility);
  3225. }
  3226. };
  3227. Injector.prototype._instantiate = function (provider, resolvedFactory, visibility) {
  3228. var factory = resolvedFactory.factory;
  3229. var deps = resolvedFactory.dependencies;
  3230. var length = deps.length;
  3231. var d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19;
  3232. try {
  3233. d0 = length > 0 ? this._getByDependency(provider, deps[0], visibility) : null;
  3234. d1 = length > 1 ? this._getByDependency(provider, deps[1], visibility) : null;
  3235. d2 = length > 2 ? this._getByDependency(provider, deps[2], visibility) : null;
  3236. d3 = length > 3 ? this._getByDependency(provider, deps[3], visibility) : null;
  3237. d4 = length > 4 ? this._getByDependency(provider, deps[4], visibility) : null;
  3238. d5 = length > 5 ? this._getByDependency(provider, deps[5], visibility) : null;
  3239. d6 = length > 6 ? this._getByDependency(provider, deps[6], visibility) : null;
  3240. d7 = length > 7 ? this._getByDependency(provider, deps[7], visibility) : null;
  3241. d8 = length > 8 ? this._getByDependency(provider, deps[8], visibility) : null;
  3242. d9 = length > 9 ? this._getByDependency(provider, deps[9], visibility) : null;
  3243. d10 = length > 10 ? this._getByDependency(provider, deps[10], visibility) : null;
  3244. d11 = length > 11 ? this._getByDependency(provider, deps[11], visibility) : null;
  3245. d12 = length > 12 ? this._getByDependency(provider, deps[12], visibility) : null;
  3246. d13 = length > 13 ? this._getByDependency(provider, deps[13], visibility) : null;
  3247. d14 = length > 14 ? this._getByDependency(provider, deps[14], visibility) : null;
  3248. d15 = length > 15 ? this._getByDependency(provider, deps[15], visibility) : null;
  3249. d16 = length > 16 ? this._getByDependency(provider, deps[16], visibility) : null;
  3250. d17 = length > 17 ? this._getByDependency(provider, deps[17], visibility) : null;
  3251. d18 = length > 18 ? this._getByDependency(provider, deps[18], visibility) : null;
  3252. d19 = length > 19 ? this._getByDependency(provider, deps[19], visibility) : null;
  3253. }
  3254. catch (e) {
  3255. if (e instanceof exceptions_1.AbstractProviderError || e instanceof exceptions_1.InstantiationError) {
  3256. e.addKey(this, provider.key);
  3257. }
  3258. throw e;
  3259. }
  3260. var obj;
  3261. try {
  3262. switch (length) {
  3263. case 0:
  3264. obj = factory();
  3265. break;
  3266. case 1:
  3267. obj = factory(d0);
  3268. break;
  3269. case 2:
  3270. obj = factory(d0, d1);
  3271. break;
  3272. case 3:
  3273. obj = factory(d0, d1, d2);
  3274. break;
  3275. case 4:
  3276. obj = factory(d0, d1, d2, d3);
  3277. break;
  3278. case 5:
  3279. obj = factory(d0, d1, d2, d3, d4);
  3280. break;
  3281. case 6:
  3282. obj = factory(d0, d1, d2, d3, d4, d5);
  3283. break;
  3284. case 7:
  3285. obj = factory(d0, d1, d2, d3, d4, d5, d6);
  3286. break;
  3287. case 8:
  3288. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7);
  3289. break;
  3290. case 9:
  3291. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8);
  3292. break;
  3293. case 10:
  3294. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9);
  3295. break;
  3296. case 11:
  3297. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10);
  3298. break;
  3299. case 12:
  3300. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11);
  3301. break;
  3302. case 13:
  3303. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12);
  3304. break;
  3305. case 14:
  3306. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13);
  3307. break;
  3308. case 15:
  3309. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14);
  3310. break;
  3311. case 16:
  3312. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15);
  3313. break;
  3314. case 17:
  3315. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16);
  3316. break;
  3317. case 18:
  3318. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17);
  3319. break;
  3320. case 19:
  3321. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18);
  3322. break;
  3323. case 20:
  3324. obj = factory(d0, d1, d2, d3, d4, d5, d6, d7, d8, d9, d10, d11, d12, d13, d14, d15, d16, d17, d18, d19);
  3325. break;
  3326. }
  3327. }
  3328. catch (e) {
  3329. throw new exceptions_1.InstantiationError(this, e, e.stack, provider.key);
  3330. }
  3331. return obj;
  3332. };
  3333. Injector.prototype._getByDependency = function (provider, dep, providerVisibility) {
  3334. var special = lang_1.isPresent(this._depProvider) ?
  3335. this._depProvider.getDependency(this, provider, dep) :
  3336. exports.UNDEFINED;
  3337. if (special !== exports.UNDEFINED) {
  3338. return special;
  3339. }
  3340. else {
  3341. return this._getByKey(dep.key, dep.lowerBoundVisibility, dep.upperBoundVisibility, dep.optional, providerVisibility);
  3342. }
  3343. };
  3344. Injector.prototype._getByKey = function (key, lowerBoundVisibility, upperBoundVisibility, optional, providerVisibility) {
  3345. if (key === INJECTOR_KEY) {
  3346. return this;
  3347. }
  3348. if (upperBoundVisibility instanceof metadata_1.SelfMetadata) {
  3349. return this._getByKeySelf(key, optional, providerVisibility);
  3350. }
  3351. else if (upperBoundVisibility instanceof metadata_1.HostMetadata) {
  3352. return this._getByKeyHost(key, optional, providerVisibility, lowerBoundVisibility);
  3353. }
  3354. else {
  3355. return this._getByKeyDefault(key, optional, providerVisibility, lowerBoundVisibility);
  3356. }
  3357. };
  3358. /** @internal */
  3359. Injector.prototype._throwOrNull = function (key, optional) {
  3360. if (optional) {
  3361. return null;
  3362. }
  3363. else {
  3364. throw new exceptions_1.NoProviderError(this, key);
  3365. }
  3366. };
  3367. /** @internal */
  3368. Injector.prototype._getByKeySelf = function (key, optional, providerVisibility) {
  3369. var obj = this._strategy.getObjByKeyId(key.id, providerVisibility);
  3370. return (obj !== exports.UNDEFINED) ? obj : this._throwOrNull(key, optional);
  3371. };
  3372. /** @internal */
  3373. Injector.prototype._getByKeyHost = function (key, optional, providerVisibility, lowerBoundVisibility) {
  3374. var inj = this;
  3375. if (lowerBoundVisibility instanceof metadata_1.SkipSelfMetadata) {
  3376. if (inj._isHost) {
  3377. return this._getPrivateDependency(key, optional, inj);
  3378. }
  3379. else {
  3380. inj = inj._parent;
  3381. }
  3382. }
  3383. while (inj != null) {
  3384. var obj = inj._strategy.getObjByKeyId(key.id, providerVisibility);
  3385. if (obj !== exports.UNDEFINED)
  3386. return obj;
  3387. if (lang_1.isPresent(inj._parent) && inj._isHost) {
  3388. return this._getPrivateDependency(key, optional, inj);
  3389. }
  3390. else {
  3391. inj = inj._parent;
  3392. }
  3393. }
  3394. return this._throwOrNull(key, optional);
  3395. };
  3396. /** @internal */
  3397. Injector.prototype._getPrivateDependency = function (key, optional, inj) {
  3398. var obj = inj._parent._strategy.getObjByKeyId(key.id, Visibility.Private);
  3399. return (obj !== exports.UNDEFINED) ? obj : this._throwOrNull(key, optional);
  3400. };
  3401. /** @internal */
  3402. Injector.prototype._getByKeyDefault = function (key, optional, providerVisibility, lowerBoundVisibility) {
  3403. var inj = this;
  3404. if (lowerBoundVisibility instanceof metadata_1.SkipSelfMetadata) {
  3405. providerVisibility = inj._isHost ? Visibility.PublicAndPrivate : Visibility.Public;
  3406. inj = inj._parent;
  3407. }
  3408. while (inj != null) {
  3409. var obj = inj._strategy.getObjByKeyId(key.id, providerVisibility);
  3410. if (obj !== exports.UNDEFINED)
  3411. return obj;
  3412. providerVisibility = inj._isHost ? Visibility.PublicAndPrivate : Visibility.Public;
  3413. inj = inj._parent;
  3414. }
  3415. return this._throwOrNull(key, optional);
  3416. };
  3417. Object.defineProperty(Injector.prototype, "displayName", {
  3418. get: function () {
  3419. return "Injector(providers: [" + _mapProviders(this, function (b) { return (" \"" + b.key.displayName + "\" "); }).join(", ") + "])";
  3420. },
  3421. enumerable: true,
  3422. configurable: true
  3423. });
  3424. Injector.prototype.toString = function () { return this.displayName; };
  3425. return Injector;
  3426. })();
  3427. exports.Injector = Injector;
  3428. var INJECTOR_KEY = key_1.Key.get(Injector);
  3429. function _mapProviders(injector, fn) {
  3430. var res = [];
  3431. for (var i = 0; i < injector._proto.numberOfProviders; ++i) {
  3432. res.push(fn(injector._proto.getProviderAtIndex(i)));
  3433. }
  3434. return res;
  3435. }
  3436. /***/ },
  3437. /* 12 */
  3438. /***/ function(module, exports, __webpack_require__) {
  3439. var lang_1 = __webpack_require__(5);
  3440. exports.Map = lang_1.global.Map;
  3441. exports.Set = lang_1.global.Set;
  3442. // Safari and Internet Explorer do not support the iterable parameter to the
  3443. // Map constructor. We work around that by manually adding the items.
  3444. var createMapFromPairs = (function () {
  3445. try {
  3446. if (new exports.Map([[1, 2]]).size === 1) {
  3447. return function createMapFromPairs(pairs) { return new exports.Map(pairs); };
  3448. }
  3449. }
  3450. catch (e) {
  3451. }
  3452. return function createMapAndPopulateFromPairs(pairs) {
  3453. var map = new exports.Map();
  3454. for (var i = 0; i < pairs.length; i++) {
  3455. var pair = pairs[i];
  3456. map.set(pair[0], pair[1]);
  3457. }
  3458. return map;
  3459. };
  3460. })();
  3461. var createMapFromMap = (function () {
  3462. try {
  3463. if (new exports.Map(new exports.Map())) {
  3464. return function createMapFromMap(m) { return new exports.Map(m); };
  3465. }
  3466. }
  3467. catch (e) {
  3468. }
  3469. return function createMapAndPopulateFromMap(m) {
  3470. var map = new exports.Map();
  3471. m.forEach(function (v, k) { map.set(k, v); });
  3472. return map;
  3473. };
  3474. })();
  3475. var _clearValues = (function () {
  3476. if ((new exports.Map()).keys().next) {
  3477. return function _clearValues(m) {
  3478. var keyIterator = m.keys();
  3479. var k;
  3480. while (!((k = keyIterator.next()).done)) {
  3481. m.set(k.value, null);
  3482. }
  3483. };
  3484. }
  3485. else {
  3486. return function _clearValuesWithForeEach(m) {
  3487. m.forEach(function (v, k) { m.set(k, null); });
  3488. };
  3489. }
  3490. })();
  3491. // Safari doesn't implement MapIterator.next(), which is used is Traceur's polyfill of Array.from
  3492. // TODO(mlaval): remove the work around once we have a working polyfill of Array.from
  3493. var _arrayFromMap = (function () {
  3494. try {
  3495. if ((new exports.Map()).values().next) {
  3496. return function createArrayFromMap(m, getValues) {
  3497. return getValues ? Array.from(m.values()) : Array.from(m.keys());
  3498. };
  3499. }
  3500. }
  3501. catch (e) {
  3502. }
  3503. return function createArrayFromMapWithForeach(m, getValues) {
  3504. var res = ListWrapper.createFixedSize(m.size), i = 0;
  3505. m.forEach(function (v, k) {
  3506. res[i] = getValues ? v : k;
  3507. i++;
  3508. });
  3509. return res;
  3510. };
  3511. })();
  3512. var MapWrapper = (function () {
  3513. function MapWrapper() {
  3514. }
  3515. MapWrapper.clone = function (m) { return createMapFromMap(m); };
  3516. MapWrapper.createFromStringMap = function (stringMap) {
  3517. var result = new exports.Map();
  3518. for (var prop in stringMap) {
  3519. result.set(prop, stringMap[prop]);
  3520. }
  3521. return result;
  3522. };
  3523. MapWrapper.toStringMap = function (m) {
  3524. var r = {};
  3525. m.forEach(function (v, k) { return r[k] = v; });
  3526. return r;
  3527. };
  3528. MapWrapper.createFromPairs = function (pairs) { return createMapFromPairs(pairs); };
  3529. MapWrapper.clearValues = function (m) { _clearValues(m); };
  3530. MapWrapper.iterable = function (m) { return m; };
  3531. MapWrapper.keys = function (m) { return _arrayFromMap(m, false); };
  3532. MapWrapper.values = function (m) { return _arrayFromMap(m, true); };
  3533. return MapWrapper;
  3534. })();
  3535. exports.MapWrapper = MapWrapper;
  3536. /**
  3537. * Wraps Javascript Objects
  3538. */
  3539. var StringMapWrapper = (function () {
  3540. function StringMapWrapper() {
  3541. }
  3542. StringMapWrapper.create = function () {
  3543. // Note: We are not using Object.create(null) here due to
  3544. // performance!
  3545. // http://jsperf.com/ng2-object-create-null
  3546. return {};
  3547. };
  3548. StringMapWrapper.contains = function (map, key) {
  3549. return map.hasOwnProperty(key);
  3550. };
  3551. StringMapWrapper.get = function (map, key) {
  3552. return map.hasOwnProperty(key) ? map[key] : undefined;
  3553. };
  3554. StringMapWrapper.set = function (map, key, value) { map[key] = value; };
  3555. StringMapWrapper.keys = function (map) { return Object.keys(map); };
  3556. StringMapWrapper.isEmpty = function (map) {
  3557. for (var prop in map) {
  3558. return false;
  3559. }
  3560. return true;
  3561. };
  3562. StringMapWrapper.delete = function (map, key) { delete map[key]; };
  3563. StringMapWrapper.forEach = function (map, callback) {
  3564. for (var prop in map) {
  3565. if (map.hasOwnProperty(prop)) {
  3566. callback(map[prop], prop);
  3567. }
  3568. }
  3569. };
  3570. StringMapWrapper.merge = function (m1, m2) {
  3571. var m = {};
  3572. for (var attr in m1) {
  3573. if (m1.hasOwnProperty(attr)) {
  3574. m[attr] = m1[attr];
  3575. }
  3576. }
  3577. for (var attr in m2) {
  3578. if (m2.hasOwnProperty(attr)) {
  3579. m[attr] = m2[attr];
  3580. }
  3581. }
  3582. return m;
  3583. };
  3584. StringMapWrapper.equals = function (m1, m2) {
  3585. var k1 = Object.keys(m1);
  3586. var k2 = Object.keys(m2);
  3587. if (k1.length != k2.length) {
  3588. return false;
  3589. }
  3590. var key;
  3591. for (var i = 0; i < k1.length; i++) {
  3592. key = k1[i];
  3593. if (m1[key] !== m2[key]) {
  3594. return false;
  3595. }
  3596. }
  3597. return true;
  3598. };
  3599. return StringMapWrapper;
  3600. })();
  3601. exports.StringMapWrapper = StringMapWrapper;
  3602. var ListWrapper = (function () {
  3603. function ListWrapper() {
  3604. }
  3605. // JS has no way to express a statically fixed size list, but dart does so we
  3606. // keep both methods.
  3607. ListWrapper.createFixedSize = function (size) { return new Array(size); };
  3608. ListWrapper.createGrowableSize = function (size) { return new Array(size); };
  3609. ListWrapper.clone = function (array) { return array.slice(0); };
  3610. ListWrapper.forEachWithIndex = function (array, fn) {
  3611. for (var i = 0; i < array.length; i++) {
  3612. fn(array[i], i);
  3613. }
  3614. };
  3615. ListWrapper.first = function (array) {
  3616. if (!array)
  3617. return null;
  3618. return array[0];
  3619. };
  3620. ListWrapper.last = function (array) {
  3621. if (!array || array.length == 0)
  3622. return null;
  3623. return array[array.length - 1];
  3624. };
  3625. ListWrapper.indexOf = function (array, value, startIndex) {
  3626. if (startIndex === void 0) { startIndex = 0; }
  3627. return array.indexOf(value, startIndex);
  3628. };
  3629. ListWrapper.contains = function (list, el) { return list.indexOf(el) !== -1; };
  3630. ListWrapper.reversed = function (array) {
  3631. var a = ListWrapper.clone(array);
  3632. return a.reverse();
  3633. };
  3634. ListWrapper.concat = function (a, b) { return a.concat(b); };
  3635. ListWrapper.insert = function (list, index, value) { list.splice(index, 0, value); };
  3636. ListWrapper.removeAt = function (list, index) {
  3637. var res = list[index];
  3638. list.splice(index, 1);
  3639. return res;
  3640. };
  3641. ListWrapper.removeAll = function (list, items) {
  3642. for (var i = 0; i < items.length; ++i) {
  3643. var index = list.indexOf(items[i]);
  3644. list.splice(index, 1);
  3645. }
  3646. };
  3647. ListWrapper.remove = function (list, el) {
  3648. var index = list.indexOf(el);
  3649. if (index > -1) {
  3650. list.splice(index, 1);
  3651. return true;
  3652. }
  3653. return false;
  3654. };
  3655. ListWrapper.clear = function (list) { list.length = 0; };
  3656. ListWrapper.isEmpty = function (list) { return list.length == 0; };
  3657. ListWrapper.fill = function (list, value, start, end) {
  3658. if (start === void 0) { start = 0; }
  3659. if (end === void 0) { end = null; }
  3660. list.fill(value, start, end === null ? list.length : end);
  3661. };
  3662. ListWrapper.equals = function (a, b) {
  3663. if (a.length != b.length)
  3664. return false;
  3665. for (var i = 0; i < a.length; ++i) {
  3666. if (a[i] !== b[i])
  3667. return false;
  3668. }
  3669. return true;
  3670. };
  3671. ListWrapper.slice = function (l, from, to) {
  3672. if (from === void 0) { from = 0; }
  3673. if (to === void 0) { to = null; }
  3674. return l.slice(from, to === null ? undefined : to);
  3675. };
  3676. ListWrapper.splice = function (l, from, length) { return l.splice(from, length); };
  3677. ListWrapper.sort = function (l, compareFn) {
  3678. if (lang_1.isPresent(compareFn)) {
  3679. l.sort(compareFn);
  3680. }
  3681. else {
  3682. l.sort();
  3683. }
  3684. };
  3685. ListWrapper.toString = function (l) { return l.toString(); };
  3686. ListWrapper.toJSON = function (l) { return JSON.stringify(l); };
  3687. ListWrapper.maximum = function (list, predicate) {
  3688. if (list.length == 0) {
  3689. return null;
  3690. }
  3691. var solution = null;
  3692. var maxValue = -Infinity;
  3693. for (var index = 0; index < list.length; index++) {
  3694. var candidate = list[index];
  3695. if (lang_1.isBlank(candidate)) {
  3696. continue;
  3697. }
  3698. var candidateValue = predicate(candidate);
  3699. if (candidateValue > maxValue) {
  3700. solution = candidate;
  3701. maxValue = candidateValue;
  3702. }
  3703. }
  3704. return solution;
  3705. };
  3706. return ListWrapper;
  3707. })();
  3708. exports.ListWrapper = ListWrapper;
  3709. function isListLikeIterable(obj) {
  3710. if (!lang_1.isJsObject(obj))
  3711. return false;
  3712. return lang_1.isArray(obj) ||
  3713. (!(obj instanceof exports.Map) &&
  3714. lang_1.getSymbolIterator() in obj); // JS Iterable have a Symbol.iterator prop
  3715. }
  3716. exports.isListLikeIterable = isListLikeIterable;
  3717. function iterateListLike(obj, fn) {
  3718. if (lang_1.isArray(obj)) {
  3719. for (var i = 0; i < obj.length; i++) {
  3720. fn(obj[i]);
  3721. }
  3722. }
  3723. else {
  3724. var iterator = obj[lang_1.getSymbolIterator()]();
  3725. var item;
  3726. while (!((item = iterator.next()).done)) {
  3727. fn(item.value);
  3728. }
  3729. }
  3730. }
  3731. exports.iterateListLike = iterateListLike;
  3732. // Safari and Internet Explorer do not support the iterable parameter to the
  3733. // Set constructor. We work around that by manually adding the items.
  3734. var createSetFromList = (function () {
  3735. var test = new exports.Set([1, 2, 3]);
  3736. if (test.size === 3) {
  3737. return function createSetFromList(lst) { return new exports.Set(lst); };
  3738. }
  3739. else {
  3740. return function createSetAndPopulateFromList(lst) {
  3741. var res = new exports.Set(lst);
  3742. if (res.size !== lst.length) {
  3743. for (var i = 0; i < lst.length; i++) {
  3744. res.add(lst[i]);
  3745. }
  3746. }
  3747. return res;
  3748. };
  3749. }
  3750. })();
  3751. var SetWrapper = (function () {
  3752. function SetWrapper() {
  3753. }
  3754. SetWrapper.createFromList = function (lst) { return createSetFromList(lst); };
  3755. SetWrapper.has = function (s, key) { return s.has(key); };
  3756. SetWrapper.delete = function (m, k) { m.delete(k); };
  3757. return SetWrapper;
  3758. })();
  3759. exports.SetWrapper = SetWrapper;
  3760. /***/ },
  3761. /* 13 */
  3762. /***/ function(module, exports, __webpack_require__) {
  3763. var __extends = (this && this.__extends) || function (d, b) {
  3764. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  3765. function __() { this.constructor = d; }
  3766. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  3767. };
  3768. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  3769. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  3770. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  3771. 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;
  3772. return c > 3 && r && Object.defineProperty(target, key, r), r;
  3773. };
  3774. var __metadata = (this && this.__metadata) || function (k, v) {
  3775. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  3776. };
  3777. var lang_1 = __webpack_require__(5);
  3778. var exceptions_1 = __webpack_require__(14);
  3779. var collection_1 = __webpack_require__(12);
  3780. var reflection_1 = __webpack_require__(16);
  3781. var key_1 = __webpack_require__(19);
  3782. var metadata_1 = __webpack_require__(7);
  3783. var exceptions_2 = __webpack_require__(21);
  3784. var forward_ref_1 = __webpack_require__(10);
  3785. /**
  3786. * `Dependency` is used by the framework to extend DI.
  3787. * This is internal to Angular and should not be used directly.
  3788. */
  3789. var Dependency = (function () {
  3790. function Dependency(key, optional, lowerBoundVisibility, upperBoundVisibility, properties) {
  3791. this.key = key;
  3792. this.optional = optional;
  3793. this.lowerBoundVisibility = lowerBoundVisibility;
  3794. this.upperBoundVisibility = upperBoundVisibility;
  3795. this.properties = properties;
  3796. }
  3797. Dependency.fromKey = function (key) { return new Dependency(key, false, null, null, []); };
  3798. return Dependency;
  3799. })();
  3800. exports.Dependency = Dependency;
  3801. var _EMPTY_LIST = lang_1.CONST_EXPR([]);
  3802. /**
  3803. * Describes how the {@link Injector} should instantiate a given token.
  3804. *
  3805. * See {@link provide}.
  3806. *
  3807. * ### Example ([live demo](http://plnkr.co/edit/GNAyj6K6PfYg2NBzgwZ5?p%3Dpreview&p=preview))
  3808. *
  3809. * ```javascript
  3810. * var injector = Injector.resolveAndCreate([
  3811. * new Provider("message", { useValue: 'Hello' })
  3812. * ]);
  3813. *
  3814. * expect(injector.get("message")).toEqual('Hello');
  3815. * ```
  3816. */
  3817. var Provider = (function () {
  3818. function Provider(token, _a) {
  3819. var useClass = _a.useClass, useValue = _a.useValue, useExisting = _a.useExisting, useFactory = _a.useFactory, deps = _a.deps, multi = _a.multi;
  3820. this.token = token;
  3821. this.useClass = useClass;
  3822. this.useValue = useValue;
  3823. this.useExisting = useExisting;
  3824. this.useFactory = useFactory;
  3825. this.dependencies = deps;
  3826. this._multi = multi;
  3827. }
  3828. Object.defineProperty(Provider.prototype, "multi", {
  3829. // TODO: Provide a full working example after alpha38 is released.
  3830. /**
  3831. * Creates multiple providers matching the same token (a multi-provider).
  3832. *
  3833. * Multi-providers are used for creating pluggable service, where the system comes
  3834. * with some default providers, and the user can register additonal providers.
  3835. * The combination of the default providers and the additional providers will be
  3836. * used to drive the behavior of the system.
  3837. *
  3838. * ### Example
  3839. *
  3840. * ```typescript
  3841. * var injector = Injector.resolveAndCreate([
  3842. * new Provider("Strings", { useValue: "String1", multi: true}),
  3843. * new Provider("Strings", { useValue: "String2", multi: true})
  3844. * ]);
  3845. *
  3846. * expect(injector.get("Strings")).toEqual(["String1", "String2"]);
  3847. * ```
  3848. *
  3849. * Multi-providers and regular providers cannot be mixed. The following
  3850. * will throw an exception:
  3851. *
  3852. * ```typescript
  3853. * var injector = Injector.resolveAndCreate([
  3854. * new Provider("Strings", { useValue: "String1", multi: true }),
  3855. * new Provider("Strings", { useValue: "String2"})
  3856. * ]);
  3857. * ```
  3858. */
  3859. get: function () { return lang_1.normalizeBool(this._multi); },
  3860. enumerable: true,
  3861. configurable: true
  3862. });
  3863. Provider = __decorate([
  3864. lang_1.CONST(),
  3865. __metadata('design:paramtypes', [Object, Object])
  3866. ], Provider);
  3867. return Provider;
  3868. })();
  3869. exports.Provider = Provider;
  3870. /**
  3871. * See {@link Provider} instead.
  3872. *
  3873. * @deprecated
  3874. */
  3875. var Binding = (function (_super) {
  3876. __extends(Binding, _super);
  3877. function Binding(token, _a) {
  3878. var toClass = _a.toClass, toValue = _a.toValue, toAlias = _a.toAlias, toFactory = _a.toFactory, deps = _a.deps, multi = _a.multi;
  3879. _super.call(this, token, {
  3880. useClass: toClass,
  3881. useValue: toValue,
  3882. useExisting: toAlias,
  3883. useFactory: toFactory,
  3884. deps: deps,
  3885. multi: multi
  3886. });
  3887. }
  3888. Object.defineProperty(Binding.prototype, "toClass", {
  3889. /**
  3890. * @deprecated
  3891. */
  3892. get: function () { return this.useClass; },
  3893. enumerable: true,
  3894. configurable: true
  3895. });
  3896. Object.defineProperty(Binding.prototype, "toAlias", {
  3897. /**
  3898. * @deprecated
  3899. */
  3900. get: function () { return this.useExisting; },
  3901. enumerable: true,
  3902. configurable: true
  3903. });
  3904. Object.defineProperty(Binding.prototype, "toFactory", {
  3905. /**
  3906. * @deprecated
  3907. */
  3908. get: function () { return this.useFactory; },
  3909. enumerable: true,
  3910. configurable: true
  3911. });
  3912. Object.defineProperty(Binding.prototype, "toValue", {
  3913. /**
  3914. * @deprecated
  3915. */
  3916. get: function () { return this.useValue; },
  3917. enumerable: true,
  3918. configurable: true
  3919. });
  3920. Binding = __decorate([
  3921. lang_1.CONST(),
  3922. __metadata('design:paramtypes', [Object, Object])
  3923. ], Binding);
  3924. return Binding;
  3925. })(Provider);
  3926. exports.Binding = Binding;
  3927. var ResolvedProvider_ = (function () {
  3928. function ResolvedProvider_(key, resolvedFactories, multiProvider) {
  3929. this.key = key;
  3930. this.resolvedFactories = resolvedFactories;
  3931. this.multiProvider = multiProvider;
  3932. }
  3933. Object.defineProperty(ResolvedProvider_.prototype, "resolvedFactory", {
  3934. get: function () { return this.resolvedFactories[0]; },
  3935. enumerable: true,
  3936. configurable: true
  3937. });
  3938. return ResolvedProvider_;
  3939. })();
  3940. exports.ResolvedProvider_ = ResolvedProvider_;
  3941. /**
  3942. * An internal resolved representation of a factory function created by resolving {@link Provider}.
  3943. */
  3944. var ResolvedFactory = (function () {
  3945. function ResolvedFactory(
  3946. /**
  3947. * Factory function which can return an instance of an object represented by a key.
  3948. */
  3949. factory,
  3950. /**
  3951. * Arguments (dependencies) to the `factory` function.
  3952. */
  3953. dependencies) {
  3954. this.factory = factory;
  3955. this.dependencies = dependencies;
  3956. }
  3957. return ResolvedFactory;
  3958. })();
  3959. exports.ResolvedFactory = ResolvedFactory;
  3960. /**
  3961. * Creates a {@link Provider}.
  3962. *
  3963. * To construct a {@link Provider}, bind a `token` to either a class, a value, a factory function,
  3964. * or
  3965. * to an existing `token`.
  3966. * See {@link ProviderBuilder} for more details.
  3967. *
  3968. * The `token` is most commonly a class or {@link angular2/di/OpaqueToken}.
  3969. *
  3970. * @deprecated
  3971. */
  3972. function bind(token) {
  3973. return new ProviderBuilder(token);
  3974. }
  3975. exports.bind = bind;
  3976. /**
  3977. * Creates a {@link Provider}.
  3978. *
  3979. * See {@link Provider} for more details.
  3980. *
  3981. * <!-- TODO: improve the docs -->
  3982. */
  3983. function provide(token, _a) {
  3984. var useClass = _a.useClass, useValue = _a.useValue, useExisting = _a.useExisting, useFactory = _a.useFactory, deps = _a.deps, multi = _a.multi;
  3985. return new Provider(token, {
  3986. useClass: useClass,
  3987. useValue: useValue,
  3988. useExisting: useExisting,
  3989. useFactory: useFactory,
  3990. deps: deps,
  3991. multi: multi
  3992. });
  3993. }
  3994. exports.provide = provide;
  3995. /**
  3996. * Helper class for the {@link bind} function.
  3997. */
  3998. var ProviderBuilder = (function () {
  3999. function ProviderBuilder(token) {
  4000. this.token = token;
  4001. }
  4002. /**
  4003. * Binds a DI token to a class.
  4004. *
  4005. * ### Example ([live demo](http://plnkr.co/edit/ZpBCSYqv6e2ud5KXLdxQ?p=preview))
  4006. *
  4007. * Because `toAlias` and `toClass` are often confused, the example contains
  4008. * both use cases for easy comparison.
  4009. *
  4010. * ```typescript
  4011. * class Vehicle {}
  4012. *
  4013. * class Car extends Vehicle {}
  4014. *
  4015. * var injectorClass = Injector.resolveAndCreate([
  4016. * Car,
  4017. * provide(Vehicle, {useClass: Car})
  4018. * ]);
  4019. * var injectorAlias = Injector.resolveAndCreate([
  4020. * Car,
  4021. * provide(Vehicle, {useExisting: Car})
  4022. * ]);
  4023. *
  4024. * expect(injectorClass.get(Vehicle)).not.toBe(injectorClass.get(Car));
  4025. * expect(injectorClass.get(Vehicle) instanceof Car).toBe(true);
  4026. *
  4027. * expect(injectorAlias.get(Vehicle)).toBe(injectorAlias.get(Car));
  4028. * expect(injectorAlias.get(Vehicle) instanceof Car).toBe(true);
  4029. * ```
  4030. */
  4031. ProviderBuilder.prototype.toClass = function (type) {
  4032. if (!lang_1.isType(type)) {
  4033. throw new exceptions_1.BaseException("Trying to create a class provider but \"" + lang_1.stringify(type) + "\" is not a class!");
  4034. }
  4035. return new Provider(this.token, { useClass: type });
  4036. };
  4037. /**
  4038. * Binds a DI token to a value.
  4039. *
  4040. * ### Example ([live demo](http://plnkr.co/edit/G024PFHmDL0cJFgfZK8O?p=preview))
  4041. *
  4042. * ```typescript
  4043. * var injector = Injector.resolveAndCreate([
  4044. * provide('message', {useValue: 'Hello'})
  4045. * ]);
  4046. *
  4047. * expect(injector.get('message')).toEqual('Hello');
  4048. * ```
  4049. */
  4050. ProviderBuilder.prototype.toValue = function (value) { return new Provider(this.token, { useValue: value }); };
  4051. /**
  4052. * Binds a DI token to an existing token.
  4053. *
  4054. * Angular will return the same instance as if the provided token was used. (This is
  4055. * in contrast to `useClass` where a separate instance of `useClass` will be returned.)
  4056. *
  4057. * ### Example ([live demo](http://plnkr.co/edit/uBaoF2pN5cfc5AfZapNw?p=preview))
  4058. *
  4059. * Because `toAlias` and `toClass` are often confused, the example contains
  4060. * both use cases for easy comparison.
  4061. *
  4062. * ```typescript
  4063. * class Vehicle {}
  4064. *
  4065. * class Car extends Vehicle {}
  4066. *
  4067. * var injectorAlias = Injector.resolveAndCreate([
  4068. * Car,
  4069. * provide(Vehicle, {useExisting: Car})
  4070. * ]);
  4071. * var injectorClass = Injector.resolveAndCreate([
  4072. * Car,
  4073. * provide(Vehicle, {useClass: Car})
  4074. * ]);
  4075. *
  4076. * expect(injectorAlias.get(Vehicle)).toBe(injectorAlias.get(Car));
  4077. * expect(injectorAlias.get(Vehicle) instanceof Car).toBe(true);
  4078. *
  4079. * expect(injectorClass.get(Vehicle)).not.toBe(injectorClass.get(Car));
  4080. * expect(injectorClass.get(Vehicle) instanceof Car).toBe(true);
  4081. * ```
  4082. */
  4083. ProviderBuilder.prototype.toAlias = function (aliasToken) {
  4084. if (lang_1.isBlank(aliasToken)) {
  4085. throw new exceptions_1.BaseException("Can not alias " + lang_1.stringify(this.token) + " to a blank value!");
  4086. }
  4087. return new Provider(this.token, { useExisting: aliasToken });
  4088. };
  4089. /**
  4090. * Binds a DI token to a function which computes the value.
  4091. *
  4092. * ### Example ([live demo](http://plnkr.co/edit/OejNIfTT3zb1iBxaIYOb?p=preview))
  4093. *
  4094. * ```typescript
  4095. * var injector = Injector.resolveAndCreate([
  4096. * provide(Number, {useFactory: () => { return 1+2; }}),
  4097. * provide(String, {useFactory: (v) => { return "Value: " + v; }, deps: [Number]})
  4098. * ]);
  4099. *
  4100. * expect(injector.get(Number)).toEqual(3);
  4101. * expect(injector.get(String)).toEqual('Value: 3');
  4102. * ```
  4103. */
  4104. ProviderBuilder.prototype.toFactory = function (factory, dependencies) {
  4105. if (!lang_1.isFunction(factory)) {
  4106. throw new exceptions_1.BaseException("Trying to create a factory provider but \"" + lang_1.stringify(factory) + "\" is not a function!");
  4107. }
  4108. return new Provider(this.token, { useFactory: factory, deps: dependencies });
  4109. };
  4110. return ProviderBuilder;
  4111. })();
  4112. exports.ProviderBuilder = ProviderBuilder;
  4113. /**
  4114. * Resolve a single provider.
  4115. */
  4116. function resolveFactory(provider) {
  4117. var factoryFn;
  4118. var resolvedDeps;
  4119. if (lang_1.isPresent(provider.useClass)) {
  4120. var useClass = forward_ref_1.resolveForwardRef(provider.useClass);
  4121. factoryFn = reflection_1.reflector.factory(useClass);
  4122. resolvedDeps = _dependenciesFor(useClass);
  4123. }
  4124. else if (lang_1.isPresent(provider.useExisting)) {
  4125. factoryFn = function (aliasInstance) { return aliasInstance; };
  4126. resolvedDeps = [Dependency.fromKey(key_1.Key.get(provider.useExisting))];
  4127. }
  4128. else if (lang_1.isPresent(provider.useFactory)) {
  4129. factoryFn = provider.useFactory;
  4130. resolvedDeps = _constructDependencies(provider.useFactory, provider.dependencies);
  4131. }
  4132. else {
  4133. factoryFn = function () { return provider.useValue; };
  4134. resolvedDeps = _EMPTY_LIST;
  4135. }
  4136. return new ResolvedFactory(factoryFn, resolvedDeps);
  4137. }
  4138. exports.resolveFactory = resolveFactory;
  4139. /**
  4140. * Converts the {@link Provider} into {@link ResolvedProvider}.
  4141. *
  4142. * {@link Injector} internally only uses {@link ResolvedProvider}, {@link Provider} contains
  4143. * convenience provider syntax.
  4144. */
  4145. function resolveProvider(provider) {
  4146. return new ResolvedProvider_(key_1.Key.get(provider.token), [resolveFactory(provider)], false);
  4147. }
  4148. exports.resolveProvider = resolveProvider;
  4149. /**
  4150. * Resolve a list of Providers.
  4151. */
  4152. function resolveProviders(providers) {
  4153. var normalized = _createListOfProviders(_normalizeProviders(providers, new Map()));
  4154. return normalized.map(function (b) {
  4155. if (b instanceof _NormalizedProvider) {
  4156. return new ResolvedProvider_(b.key, [b.resolvedFactory], false);
  4157. }
  4158. else {
  4159. var arr = b;
  4160. return new ResolvedProvider_(arr[0].key, arr.map(function (_) { return _.resolvedFactory; }), true);
  4161. }
  4162. });
  4163. }
  4164. exports.resolveProviders = resolveProviders;
  4165. /**
  4166. * The algorithm works as follows:
  4167. *
  4168. * [Provider] -> [_NormalizedProvider|[_NormalizedProvider]] -> [ResolvedProvider]
  4169. *
  4170. * _NormalizedProvider is essentially a resolved provider before it was grouped by key.
  4171. */
  4172. var _NormalizedProvider = (function () {
  4173. function _NormalizedProvider(key, resolvedFactory) {
  4174. this.key = key;
  4175. this.resolvedFactory = resolvedFactory;
  4176. }
  4177. return _NormalizedProvider;
  4178. })();
  4179. function _createListOfProviders(flattenedProviders) {
  4180. return collection_1.MapWrapper.values(flattenedProviders);
  4181. }
  4182. function _normalizeProviders(providers, res) {
  4183. providers.forEach(function (b) {
  4184. if (b instanceof lang_1.Type) {
  4185. _normalizeProvider(provide(b, { useClass: b }), res);
  4186. }
  4187. else if (b instanceof Provider) {
  4188. _normalizeProvider(b, res);
  4189. }
  4190. else if (b instanceof Array) {
  4191. _normalizeProviders(b, res);
  4192. }
  4193. else if (b instanceof ProviderBuilder) {
  4194. throw new exceptions_2.InvalidProviderError(b.token);
  4195. }
  4196. else {
  4197. throw new exceptions_2.InvalidProviderError(b);
  4198. }
  4199. });
  4200. return res;
  4201. }
  4202. function _normalizeProvider(b, res) {
  4203. var key = key_1.Key.get(b.token);
  4204. var factory = resolveFactory(b);
  4205. var normalized = new _NormalizedProvider(key, factory);
  4206. if (b.multi) {
  4207. var existingProvider = res.get(key.id);
  4208. if (existingProvider instanceof Array) {
  4209. existingProvider.push(normalized);
  4210. }
  4211. else if (lang_1.isBlank(existingProvider)) {
  4212. res.set(key.id, [normalized]);
  4213. }
  4214. else {
  4215. throw new exceptions_2.MixingMultiProvidersWithRegularProvidersError(existingProvider, b);
  4216. }
  4217. }
  4218. else {
  4219. var existingProvider = res.get(key.id);
  4220. if (existingProvider instanceof Array) {
  4221. throw new exceptions_2.MixingMultiProvidersWithRegularProvidersError(existingProvider, b);
  4222. }
  4223. res.set(key.id, normalized);
  4224. }
  4225. }
  4226. function _constructDependencies(factoryFunction, dependencies) {
  4227. if (lang_1.isBlank(dependencies)) {
  4228. return _dependenciesFor(factoryFunction);
  4229. }
  4230. else {
  4231. var params = dependencies.map(function (t) { return [t]; });
  4232. return dependencies.map(function (t) { return _extractToken(factoryFunction, t, params); });
  4233. }
  4234. }
  4235. function _dependenciesFor(typeOrFunc) {
  4236. var params = reflection_1.reflector.parameters(typeOrFunc);
  4237. if (lang_1.isBlank(params))
  4238. return [];
  4239. if (params.some(lang_1.isBlank)) {
  4240. throw new exceptions_2.NoAnnotationError(typeOrFunc, params);
  4241. }
  4242. return params.map(function (p) { return _extractToken(typeOrFunc, p, params); });
  4243. }
  4244. function _extractToken(typeOrFunc, metadata /*any[] | any*/, params) {
  4245. var depProps = [];
  4246. var token = null;
  4247. var optional = false;
  4248. if (!lang_1.isArray(metadata)) {
  4249. if (metadata instanceof metadata_1.InjectMetadata) {
  4250. return _createDependency(metadata.token, optional, null, null, depProps);
  4251. }
  4252. else {
  4253. return _createDependency(metadata, optional, null, null, depProps);
  4254. }
  4255. }
  4256. var lowerBoundVisibility = null;
  4257. var upperBoundVisibility = null;
  4258. for (var i = 0; i < metadata.length; ++i) {
  4259. var paramMetadata = metadata[i];
  4260. if (paramMetadata instanceof lang_1.Type) {
  4261. token = paramMetadata;
  4262. }
  4263. else if (paramMetadata instanceof metadata_1.InjectMetadata) {
  4264. token = paramMetadata.token;
  4265. }
  4266. else if (paramMetadata instanceof metadata_1.OptionalMetadata) {
  4267. optional = true;
  4268. }
  4269. else if (paramMetadata instanceof metadata_1.SelfMetadata) {
  4270. upperBoundVisibility = paramMetadata;
  4271. }
  4272. else if (paramMetadata instanceof metadata_1.HostMetadata) {
  4273. upperBoundVisibility = paramMetadata;
  4274. }
  4275. else if (paramMetadata instanceof metadata_1.SkipSelfMetadata) {
  4276. lowerBoundVisibility = paramMetadata;
  4277. }
  4278. else if (paramMetadata instanceof metadata_1.DependencyMetadata) {
  4279. if (lang_1.isPresent(paramMetadata.token)) {
  4280. token = paramMetadata.token;
  4281. }
  4282. depProps.push(paramMetadata);
  4283. }
  4284. }
  4285. token = forward_ref_1.resolveForwardRef(token);
  4286. if (lang_1.isPresent(token)) {
  4287. return _createDependency(token, optional, lowerBoundVisibility, upperBoundVisibility, depProps);
  4288. }
  4289. else {
  4290. throw new exceptions_2.NoAnnotationError(typeOrFunc, params);
  4291. }
  4292. }
  4293. function _createDependency(token, optional, lowerBoundVisibility, upperBoundVisibility, depProps) {
  4294. return new Dependency(key_1.Key.get(token), optional, lowerBoundVisibility, upperBoundVisibility, depProps);
  4295. }
  4296. /***/ },
  4297. /* 14 */
  4298. /***/ function(module, exports, __webpack_require__) {
  4299. var __extends = (this && this.__extends) || function (d, b) {
  4300. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  4301. function __() { this.constructor = d; }
  4302. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  4303. };
  4304. var exception_handler_1 = __webpack_require__(15);
  4305. var exception_handler_2 = __webpack_require__(15);
  4306. exports.ExceptionHandler = exception_handler_2.ExceptionHandler;
  4307. var BaseException = (function (_super) {
  4308. __extends(BaseException, _super);
  4309. function BaseException(message) {
  4310. if (message === void 0) { message = "--"; }
  4311. _super.call(this, message);
  4312. this.message = message;
  4313. this.stack = (new Error(message)).stack;
  4314. }
  4315. BaseException.prototype.toString = function () { return this.message; };
  4316. return BaseException;
  4317. })(Error);
  4318. exports.BaseException = BaseException;
  4319. /**
  4320. * Wraps an exception and provides additional context or information.
  4321. */
  4322. var WrappedException = (function (_super) {
  4323. __extends(WrappedException, _super);
  4324. function WrappedException(_wrapperMessage, _originalException, _originalStack, _context) {
  4325. _super.call(this, _wrapperMessage);
  4326. this._wrapperMessage = _wrapperMessage;
  4327. this._originalException = _originalException;
  4328. this._originalStack = _originalStack;
  4329. this._context = _context;
  4330. this._wrapperStack = (new Error(_wrapperMessage)).stack;
  4331. }
  4332. Object.defineProperty(WrappedException.prototype, "wrapperMessage", {
  4333. get: function () { return this._wrapperMessage; },
  4334. enumerable: true,
  4335. configurable: true
  4336. });
  4337. Object.defineProperty(WrappedException.prototype, "wrapperStack", {
  4338. get: function () { return this._wrapperStack; },
  4339. enumerable: true,
  4340. configurable: true
  4341. });
  4342. Object.defineProperty(WrappedException.prototype, "originalException", {
  4343. get: function () { return this._originalException; },
  4344. enumerable: true,
  4345. configurable: true
  4346. });
  4347. Object.defineProperty(WrappedException.prototype, "originalStack", {
  4348. get: function () { return this._originalStack; },
  4349. enumerable: true,
  4350. configurable: true
  4351. });
  4352. Object.defineProperty(WrappedException.prototype, "context", {
  4353. get: function () { return this._context; },
  4354. enumerable: true,
  4355. configurable: true
  4356. });
  4357. Object.defineProperty(WrappedException.prototype, "message", {
  4358. get: function () { return exception_handler_1.ExceptionHandler.exceptionToString(this); },
  4359. enumerable: true,
  4360. configurable: true
  4361. });
  4362. WrappedException.prototype.toString = function () { return this.message; };
  4363. return WrappedException;
  4364. })(Error);
  4365. exports.WrappedException = WrappedException;
  4366. function makeTypeError(message) {
  4367. return new TypeError(message);
  4368. }
  4369. exports.makeTypeError = makeTypeError;
  4370. function unimplemented() {
  4371. throw new BaseException('unimplemented');
  4372. }
  4373. exports.unimplemented = unimplemented;
  4374. /***/ },
  4375. /* 15 */
  4376. /***/ function(module, exports, __webpack_require__) {
  4377. var lang_1 = __webpack_require__(5);
  4378. var exceptions_1 = __webpack_require__(14);
  4379. var collection_1 = __webpack_require__(12);
  4380. var _ArrayLogger = (function () {
  4381. function _ArrayLogger() {
  4382. this.res = [];
  4383. }
  4384. _ArrayLogger.prototype.log = function (s) { this.res.push(s); };
  4385. _ArrayLogger.prototype.logError = function (s) { this.res.push(s); };
  4386. _ArrayLogger.prototype.logGroup = function (s) { this.res.push(s); };
  4387. _ArrayLogger.prototype.logGroupEnd = function () { };
  4388. ;
  4389. return _ArrayLogger;
  4390. })();
  4391. /**
  4392. * Provides a hook for centralized exception handling.
  4393. *
  4394. * The default implementation of `ExceptionHandler` prints error messages to the `Console`. To
  4395. * intercept error handling,
  4396. * write a custom exception handler that replaces this default as appropriate for your app.
  4397. *
  4398. * ### Example
  4399. *
  4400. * ```javascript
  4401. *
  4402. * class MyExceptionHandler implements ExceptionHandler {
  4403. * call(error, stackTrace = null, reason = null) {
  4404. * // do something with the exception
  4405. * }
  4406. * }
  4407. *
  4408. * bootstrap(MyApp, [provide(ExceptionHandler, {useClass: MyExceptionHandler})])
  4409. *
  4410. * ```
  4411. */
  4412. var ExceptionHandler = (function () {
  4413. function ExceptionHandler(_logger, _rethrowException) {
  4414. if (_rethrowException === void 0) { _rethrowException = true; }
  4415. this._logger = _logger;
  4416. this._rethrowException = _rethrowException;
  4417. }
  4418. ExceptionHandler.exceptionToString = function (exception, stackTrace, reason) {
  4419. if (stackTrace === void 0) { stackTrace = null; }
  4420. if (reason === void 0) { reason = null; }
  4421. var l = new _ArrayLogger();
  4422. var e = new ExceptionHandler(l, false);
  4423. e.call(exception, stackTrace, reason);
  4424. return l.res.join("\n");
  4425. };
  4426. ExceptionHandler.prototype.call = function (exception, stackTrace, reason) {
  4427. if (stackTrace === void 0) { stackTrace = null; }
  4428. if (reason === void 0) { reason = null; }
  4429. var originalException = this._findOriginalException(exception);
  4430. var originalStack = this._findOriginalStack(exception);
  4431. var context = this._findContext(exception);
  4432. this._logger.logGroup("EXCEPTION: " + this._extractMessage(exception));
  4433. if (lang_1.isPresent(stackTrace) && lang_1.isBlank(originalStack)) {
  4434. this._logger.logError("STACKTRACE:");
  4435. this._logger.logError(this._longStackTrace(stackTrace));
  4436. }
  4437. if (lang_1.isPresent(reason)) {
  4438. this._logger.logError("REASON: " + reason);
  4439. }
  4440. if (lang_1.isPresent(originalException)) {
  4441. this._logger.logError("ORIGINAL EXCEPTION: " + this._extractMessage(originalException));
  4442. }
  4443. if (lang_1.isPresent(originalStack)) {
  4444. this._logger.logError("ORIGINAL STACKTRACE:");
  4445. this._logger.logError(this._longStackTrace(originalStack));
  4446. }
  4447. if (lang_1.isPresent(context)) {
  4448. this._logger.logError("ERROR CONTEXT:");
  4449. this._logger.logError(context);
  4450. }
  4451. this._logger.logGroupEnd();
  4452. // We rethrow exceptions, so operations like 'bootstrap' will result in an error
  4453. // when an exception happens. If we do not rethrow, bootstrap will always succeed.
  4454. if (this._rethrowException)
  4455. throw exception;
  4456. };
  4457. /** @internal */
  4458. ExceptionHandler.prototype._extractMessage = function (exception) {
  4459. return exception instanceof exceptions_1.WrappedException ? exception.wrapperMessage : exception.toString();
  4460. };
  4461. /** @internal */
  4462. ExceptionHandler.prototype._longStackTrace = function (stackTrace) {
  4463. return collection_1.isListLikeIterable(stackTrace) ? stackTrace.join("\n\n-----async gap-----\n") :
  4464. stackTrace.toString();
  4465. };
  4466. /** @internal */
  4467. ExceptionHandler.prototype._findContext = function (exception) {
  4468. try {
  4469. if (!(exception instanceof exceptions_1.WrappedException))
  4470. return null;
  4471. return lang_1.isPresent(exception.context) ? exception.context :
  4472. this._findContext(exception.originalException);
  4473. }
  4474. catch (e) {
  4475. // exception.context can throw an exception. if it happens, we ignore the context.
  4476. return null;
  4477. }
  4478. };
  4479. /** @internal */
  4480. ExceptionHandler.prototype._findOriginalException = function (exception) {
  4481. if (!(exception instanceof exceptions_1.WrappedException))
  4482. return null;
  4483. var e = exception.originalException;
  4484. while (e instanceof exceptions_1.WrappedException && lang_1.isPresent(e.originalException)) {
  4485. e = e.originalException;
  4486. }
  4487. return e;
  4488. };
  4489. /** @internal */
  4490. ExceptionHandler.prototype._findOriginalStack = function (exception) {
  4491. if (!(exception instanceof exceptions_1.WrappedException))
  4492. return null;
  4493. var e = exception;
  4494. var stack = exception.originalStack;
  4495. while (e instanceof exceptions_1.WrappedException && lang_1.isPresent(e.originalException)) {
  4496. e = e.originalException;
  4497. if (e instanceof exceptions_1.WrappedException && lang_1.isPresent(e.originalException)) {
  4498. stack = e.originalStack;
  4499. }
  4500. }
  4501. return stack;
  4502. };
  4503. return ExceptionHandler;
  4504. })();
  4505. exports.ExceptionHandler = ExceptionHandler;
  4506. /***/ },
  4507. /* 16 */
  4508. /***/ function(module, exports, __webpack_require__) {
  4509. var reflector_1 = __webpack_require__(17);
  4510. var reflector_2 = __webpack_require__(17);
  4511. exports.Reflector = reflector_2.Reflector;
  4512. exports.ReflectionInfo = reflector_2.ReflectionInfo;
  4513. var reflection_capabilities_1 = __webpack_require__(18);
  4514. /**
  4515. * The {@link Reflector} used internally in Angular to access metadata
  4516. * about symbols.
  4517. */
  4518. exports.reflector = new reflector_1.Reflector(new reflection_capabilities_1.ReflectionCapabilities());
  4519. /***/ },
  4520. /* 17 */
  4521. /***/ function(module, exports, __webpack_require__) {
  4522. var lang_1 = __webpack_require__(5);
  4523. var exceptions_1 = __webpack_require__(14);
  4524. var collection_1 = __webpack_require__(12);
  4525. /**
  4526. * Reflective information about a symbol, including annotations, interfaces, and other metadata.
  4527. */
  4528. var ReflectionInfo = (function () {
  4529. function ReflectionInfo(annotations, parameters, factory, interfaces, propMetadata) {
  4530. this.annotations = annotations;
  4531. this.parameters = parameters;
  4532. this.factory = factory;
  4533. this.interfaces = interfaces;
  4534. this.propMetadata = propMetadata;
  4535. }
  4536. return ReflectionInfo;
  4537. })();
  4538. exports.ReflectionInfo = ReflectionInfo;
  4539. /**
  4540. * Provides access to reflection data about symbols. Used internally by Angular
  4541. * to power dependency injection and compilation.
  4542. */
  4543. var Reflector = (function () {
  4544. function Reflector(reflectionCapabilities) {
  4545. /** @internal */
  4546. this._injectableInfo = new collection_1.Map();
  4547. /** @internal */
  4548. this._getters = new collection_1.Map();
  4549. /** @internal */
  4550. this._setters = new collection_1.Map();
  4551. /** @internal */
  4552. this._methods = new collection_1.Map();
  4553. this._usedKeys = null;
  4554. this.reflectionCapabilities = reflectionCapabilities;
  4555. }
  4556. Reflector.prototype.isReflectionEnabled = function () { return this.reflectionCapabilities.isReflectionEnabled(); };
  4557. /**
  4558. * Causes `this` reflector to track keys used to access
  4559. * {@link ReflectionInfo} objects.
  4560. */
  4561. Reflector.prototype.trackUsage = function () { this._usedKeys = new collection_1.Set(); };
  4562. /**
  4563. * Lists types for which reflection information was not requested since
  4564. * {@link #trackUsage} was called. This list could later be audited as
  4565. * potential dead code.
  4566. */
  4567. Reflector.prototype.listUnusedKeys = function () {
  4568. var _this = this;
  4569. if (this._usedKeys == null) {
  4570. throw new exceptions_1.BaseException('Usage tracking is disabled');
  4571. }
  4572. var allTypes = collection_1.MapWrapper.keys(this._injectableInfo);
  4573. return allTypes.filter(function (key) { return !collection_1.SetWrapper.has(_this._usedKeys, key); });
  4574. };
  4575. Reflector.prototype.registerFunction = function (func, funcInfo) {
  4576. this._injectableInfo.set(func, funcInfo);
  4577. };
  4578. Reflector.prototype.registerType = function (type, typeInfo) {
  4579. this._injectableInfo.set(type, typeInfo);
  4580. };
  4581. Reflector.prototype.registerGetters = function (getters) { _mergeMaps(this._getters, getters); };
  4582. Reflector.prototype.registerSetters = function (setters) { _mergeMaps(this._setters, setters); };
  4583. Reflector.prototype.registerMethods = function (methods) { _mergeMaps(this._methods, methods); };
  4584. Reflector.prototype.factory = function (type) {
  4585. if (this._containsReflectionInfo(type)) {
  4586. var res = this._getReflectionInfo(type).factory;
  4587. return lang_1.isPresent(res) ? res : null;
  4588. }
  4589. else {
  4590. return this.reflectionCapabilities.factory(type);
  4591. }
  4592. };
  4593. Reflector.prototype.parameters = function (typeOrFunc) {
  4594. if (this._injectableInfo.has(typeOrFunc)) {
  4595. var res = this._getReflectionInfo(typeOrFunc).parameters;
  4596. return lang_1.isPresent(res) ? res : [];
  4597. }
  4598. else {
  4599. return this.reflectionCapabilities.parameters(typeOrFunc);
  4600. }
  4601. };
  4602. Reflector.prototype.annotations = function (typeOrFunc) {
  4603. if (this._injectableInfo.has(typeOrFunc)) {
  4604. var res = this._getReflectionInfo(typeOrFunc).annotations;
  4605. return lang_1.isPresent(res) ? res : [];
  4606. }
  4607. else {
  4608. return this.reflectionCapabilities.annotations(typeOrFunc);
  4609. }
  4610. };
  4611. Reflector.prototype.propMetadata = function (typeOrFunc) {
  4612. if (this._injectableInfo.has(typeOrFunc)) {
  4613. var res = this._getReflectionInfo(typeOrFunc).propMetadata;
  4614. return lang_1.isPresent(res) ? res : {};
  4615. }
  4616. else {
  4617. return this.reflectionCapabilities.propMetadata(typeOrFunc);
  4618. }
  4619. };
  4620. Reflector.prototype.interfaces = function (type) {
  4621. if (this._injectableInfo.has(type)) {
  4622. var res = this._getReflectionInfo(type).interfaces;
  4623. return lang_1.isPresent(res) ? res : [];
  4624. }
  4625. else {
  4626. return this.reflectionCapabilities.interfaces(type);
  4627. }
  4628. };
  4629. Reflector.prototype.getter = function (name) {
  4630. if (this._getters.has(name)) {
  4631. return this._getters.get(name);
  4632. }
  4633. else {
  4634. return this.reflectionCapabilities.getter(name);
  4635. }
  4636. };
  4637. Reflector.prototype.setter = function (name) {
  4638. if (this._setters.has(name)) {
  4639. return this._setters.get(name);
  4640. }
  4641. else {
  4642. return this.reflectionCapabilities.setter(name);
  4643. }
  4644. };
  4645. Reflector.prototype.method = function (name) {
  4646. if (this._methods.has(name)) {
  4647. return this._methods.get(name);
  4648. }
  4649. else {
  4650. return this.reflectionCapabilities.method(name);
  4651. }
  4652. };
  4653. /** @internal */
  4654. Reflector.prototype._getReflectionInfo = function (typeOrFunc) {
  4655. if (lang_1.isPresent(this._usedKeys)) {
  4656. this._usedKeys.add(typeOrFunc);
  4657. }
  4658. return this._injectableInfo.get(typeOrFunc);
  4659. };
  4660. /** @internal */
  4661. Reflector.prototype._containsReflectionInfo = function (typeOrFunc) { return this._injectableInfo.has(typeOrFunc); };
  4662. Reflector.prototype.importUri = function (type) { return this.reflectionCapabilities.importUri(type); };
  4663. return Reflector;
  4664. })();
  4665. exports.Reflector = Reflector;
  4666. function _mergeMaps(target, config) {
  4667. collection_1.StringMapWrapper.forEach(config, function (v, k) { return target.set(k, v); });
  4668. }
  4669. /***/ },
  4670. /* 18 */
  4671. /***/ function(module, exports, __webpack_require__) {
  4672. var lang_1 = __webpack_require__(5);
  4673. var exceptions_1 = __webpack_require__(14);
  4674. var ReflectionCapabilities = (function () {
  4675. function ReflectionCapabilities(reflect) {
  4676. this._reflect = lang_1.isPresent(reflect) ? reflect : lang_1.global.Reflect;
  4677. }
  4678. ReflectionCapabilities.prototype.isReflectionEnabled = function () { return true; };
  4679. ReflectionCapabilities.prototype.factory = function (t) {
  4680. switch (t.length) {
  4681. case 0:
  4682. return function () { return new t(); };
  4683. case 1:
  4684. return function (a1) { return new t(a1); };
  4685. case 2:
  4686. return function (a1, a2) { return new t(a1, a2); };
  4687. case 3:
  4688. return function (a1, a2, a3) { return new t(a1, a2, a3); };
  4689. case 4:
  4690. return function (a1, a2, a3, a4) { return new t(a1, a2, a3, a4); };
  4691. case 5:
  4692. return function (a1, a2, a3, a4, a5) { return new t(a1, a2, a3, a4, a5); };
  4693. case 6:
  4694. return function (a1, a2, a3, a4, a5, a6) { return new t(a1, a2, a3, a4, a5, a6); };
  4695. case 7:
  4696. return function (a1, a2, a3, a4, a5, a6, a7) { return new t(a1, a2, a3, a4, a5, a6, a7); };
  4697. case 8:
  4698. return function (a1, a2, a3, a4, a5, a6, a7, a8) { return new t(a1, a2, a3, a4, a5, a6, a7, a8); };
  4699. case 9:
  4700. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9) { return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9); };
  4701. case 10:
  4702. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {
  4703. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10);
  4704. };
  4705. case 11:
  4706. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11) {
  4707. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11);
  4708. };
  4709. case 12:
  4710. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12) {
  4711. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12);
  4712. };
  4713. case 13:
  4714. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13) {
  4715. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13);
  4716. };
  4717. case 14:
  4718. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) {
  4719. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
  4720. };
  4721. case 15:
  4722. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) {
  4723. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15);
  4724. };
  4725. case 16:
  4726. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16) {
  4727. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16);
  4728. };
  4729. case 17:
  4730. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17) {
  4731. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17);
  4732. };
  4733. case 18:
  4734. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18) {
  4735. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18);
  4736. };
  4737. case 19:
  4738. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19) {
  4739. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19);
  4740. };
  4741. case 20:
  4742. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20) {
  4743. return new t(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
  4744. };
  4745. }
  4746. ;
  4747. throw new Error("Cannot create a factory for '" + lang_1.stringify(t) + "' because its constructor has more than 20 arguments");
  4748. };
  4749. /** @internal */
  4750. ReflectionCapabilities.prototype._zipTypesAndAnnotaions = function (paramTypes, paramAnnotations) {
  4751. var result;
  4752. if (typeof paramTypes === 'undefined') {
  4753. result = new Array(paramAnnotations.length);
  4754. }
  4755. else {
  4756. result = new Array(paramTypes.length);
  4757. }
  4758. for (var i = 0; i < result.length; i++) {
  4759. // TS outputs Object for parameters without types, while Traceur omits
  4760. // the annotations. For now we preserve the Traceur behavior to aid
  4761. // migration, but this can be revisited.
  4762. if (typeof paramTypes === 'undefined') {
  4763. result[i] = [];
  4764. }
  4765. else if (paramTypes[i] != Object) {
  4766. result[i] = [paramTypes[i]];
  4767. }
  4768. else {
  4769. result[i] = [];
  4770. }
  4771. if (lang_1.isPresent(paramAnnotations) && lang_1.isPresent(paramAnnotations[i])) {
  4772. result[i] = result[i].concat(paramAnnotations[i]);
  4773. }
  4774. }
  4775. return result;
  4776. };
  4777. ReflectionCapabilities.prototype.parameters = function (typeOrFunc) {
  4778. // Prefer the direct API.
  4779. if (lang_1.isPresent(typeOrFunc.parameters)) {
  4780. return typeOrFunc.parameters;
  4781. }
  4782. if (lang_1.isPresent(this._reflect) && lang_1.isPresent(this._reflect.getMetadata)) {
  4783. var paramAnnotations = this._reflect.getMetadata('parameters', typeOrFunc);
  4784. var paramTypes = this._reflect.getMetadata('design:paramtypes', typeOrFunc);
  4785. if (lang_1.isPresent(paramTypes) || lang_1.isPresent(paramAnnotations)) {
  4786. return this._zipTypesAndAnnotaions(paramTypes, paramAnnotations);
  4787. }
  4788. }
  4789. // The array has to be filled with `undefined` because holes would be skipped by `some`
  4790. var parameters = new Array(typeOrFunc.length);
  4791. parameters.fill(undefined);
  4792. return parameters;
  4793. };
  4794. ReflectionCapabilities.prototype.annotations = function (typeOrFunc) {
  4795. // Prefer the direct API.
  4796. if (lang_1.isPresent(typeOrFunc.annotations)) {
  4797. var annotations = typeOrFunc.annotations;
  4798. if (lang_1.isFunction(annotations) && annotations.annotations) {
  4799. annotations = annotations.annotations;
  4800. }
  4801. return annotations;
  4802. }
  4803. if (lang_1.isPresent(this._reflect) && lang_1.isPresent(this._reflect.getMetadata)) {
  4804. var annotations = this._reflect.getMetadata('annotations', typeOrFunc);
  4805. if (lang_1.isPresent(annotations))
  4806. return annotations;
  4807. }
  4808. return [];
  4809. };
  4810. ReflectionCapabilities.prototype.propMetadata = function (typeOrFunc) {
  4811. // Prefer the direct API.
  4812. if (lang_1.isPresent(typeOrFunc.propMetadata)) {
  4813. var propMetadata = typeOrFunc.propMetadata;
  4814. if (lang_1.isFunction(propMetadata) && propMetadata.propMetadata) {
  4815. propMetadata = propMetadata.propMetadata;
  4816. }
  4817. return propMetadata;
  4818. }
  4819. if (lang_1.isPresent(this._reflect) && lang_1.isPresent(this._reflect.getMetadata)) {
  4820. var propMetadata = this._reflect.getMetadata('propMetadata', typeOrFunc);
  4821. if (lang_1.isPresent(propMetadata))
  4822. return propMetadata;
  4823. }
  4824. return {};
  4825. };
  4826. ReflectionCapabilities.prototype.interfaces = function (type) {
  4827. throw new exceptions_1.BaseException("JavaScript does not support interfaces");
  4828. };
  4829. ReflectionCapabilities.prototype.getter = function (name) { return new Function('o', 'return o.' + name + ';'); };
  4830. ReflectionCapabilities.prototype.setter = function (name) {
  4831. return new Function('o', 'v', 'return o.' + name + ' = v;');
  4832. };
  4833. ReflectionCapabilities.prototype.method = function (name) {
  4834. var functionBody = "if (!o." + name + ") throw new Error('\"" + name + "\" is undefined');\n return o." + name + ".apply(o, args);";
  4835. return new Function('o', 'args', functionBody);
  4836. };
  4837. // There is not a concept of import uri in Js, but this is useful in developing Dart applications.
  4838. ReflectionCapabilities.prototype.importUri = function (type) { return './'; };
  4839. return ReflectionCapabilities;
  4840. })();
  4841. exports.ReflectionCapabilities = ReflectionCapabilities;
  4842. /***/ },
  4843. /* 19 */
  4844. /***/ function(module, exports, __webpack_require__) {
  4845. var lang_1 = __webpack_require__(5);
  4846. var exceptions_1 = __webpack_require__(14);
  4847. var type_literal_1 = __webpack_require__(20);
  4848. var forward_ref_1 = __webpack_require__(10);
  4849. var type_literal_2 = __webpack_require__(20);
  4850. exports.TypeLiteral = type_literal_2.TypeLiteral;
  4851. /**
  4852. * A unique object used for retrieving items from the {@link Injector}.
  4853. *
  4854. * Keys have:
  4855. * - a system-wide unique `id`.
  4856. * - a `token`.
  4857. *
  4858. * `Key` is used internally by {@link Injector} because its system-wide unique `id` allows the
  4859. * injector to store created objects in a more efficient way.
  4860. *
  4861. * `Key` should not be created directly. {@link Injector} creates keys automatically when resolving
  4862. * providers.
  4863. */
  4864. var Key = (function () {
  4865. /**
  4866. * Private
  4867. */
  4868. function Key(token, id) {
  4869. this.token = token;
  4870. this.id = id;
  4871. if (lang_1.isBlank(token)) {
  4872. throw new exceptions_1.BaseException('Token must be defined!');
  4873. }
  4874. }
  4875. Object.defineProperty(Key.prototype, "displayName", {
  4876. /**
  4877. * Returns a stringified token.
  4878. */
  4879. get: function () { return lang_1.stringify(this.token); },
  4880. enumerable: true,
  4881. configurable: true
  4882. });
  4883. /**
  4884. * Retrieves a `Key` for a token.
  4885. */
  4886. Key.get = function (token) { return _globalKeyRegistry.get(forward_ref_1.resolveForwardRef(token)); };
  4887. Object.defineProperty(Key, "numberOfKeys", {
  4888. /**
  4889. * @returns the number of keys registered in the system.
  4890. */
  4891. get: function () { return _globalKeyRegistry.numberOfKeys; },
  4892. enumerable: true,
  4893. configurable: true
  4894. });
  4895. return Key;
  4896. })();
  4897. exports.Key = Key;
  4898. /**
  4899. * @internal
  4900. */
  4901. var KeyRegistry = (function () {
  4902. function KeyRegistry() {
  4903. this._allKeys = new Map();
  4904. }
  4905. KeyRegistry.prototype.get = function (token) {
  4906. if (token instanceof Key)
  4907. return token;
  4908. // TODO: workaround for https://github.com/Microsoft/TypeScript/issues/3123
  4909. var theToken = token;
  4910. if (token instanceof type_literal_1.TypeLiteral) {
  4911. theToken = token.type;
  4912. }
  4913. token = theToken;
  4914. if (this._allKeys.has(token)) {
  4915. return this._allKeys.get(token);
  4916. }
  4917. var newKey = new Key(token, Key.numberOfKeys);
  4918. this._allKeys.set(token, newKey);
  4919. return newKey;
  4920. };
  4921. Object.defineProperty(KeyRegistry.prototype, "numberOfKeys", {
  4922. get: function () { return this._allKeys.size; },
  4923. enumerable: true,
  4924. configurable: true
  4925. });
  4926. return KeyRegistry;
  4927. })();
  4928. exports.KeyRegistry = KeyRegistry;
  4929. var _globalKeyRegistry = new KeyRegistry();
  4930. /***/ },
  4931. /* 20 */
  4932. /***/ function(module, exports) {
  4933. /**
  4934. * Type literals is a Dart-only feature. This is here only so we can x-compile
  4935. * to multiple languages.
  4936. */
  4937. var TypeLiteral = (function () {
  4938. function TypeLiteral() {
  4939. }
  4940. Object.defineProperty(TypeLiteral.prototype, "type", {
  4941. get: function () { throw new Error("Type literals are only supported in Dart"); },
  4942. enumerable: true,
  4943. configurable: true
  4944. });
  4945. return TypeLiteral;
  4946. })();
  4947. exports.TypeLiteral = TypeLiteral;
  4948. /***/ },
  4949. /* 21 */
  4950. /***/ function(module, exports, __webpack_require__) {
  4951. var __extends = (this && this.__extends) || function (d, b) {
  4952. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  4953. function __() { this.constructor = d; }
  4954. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  4955. };
  4956. var collection_1 = __webpack_require__(12);
  4957. var lang_1 = __webpack_require__(5);
  4958. var exceptions_1 = __webpack_require__(14);
  4959. function findFirstClosedCycle(keys) {
  4960. var res = [];
  4961. for (var i = 0; i < keys.length; ++i) {
  4962. if (collection_1.ListWrapper.contains(res, keys[i])) {
  4963. res.push(keys[i]);
  4964. return res;
  4965. }
  4966. else {
  4967. res.push(keys[i]);
  4968. }
  4969. }
  4970. return res;
  4971. }
  4972. function constructResolvingPath(keys) {
  4973. if (keys.length > 1) {
  4974. var reversed = findFirstClosedCycle(collection_1.ListWrapper.reversed(keys));
  4975. var tokenStrs = reversed.map(function (k) { return lang_1.stringify(k.token); });
  4976. return " (" + tokenStrs.join(' -> ') + ")";
  4977. }
  4978. else {
  4979. return "";
  4980. }
  4981. }
  4982. /**
  4983. * Base class for all errors arising from misconfigured providers.
  4984. */
  4985. var AbstractProviderError = (function (_super) {
  4986. __extends(AbstractProviderError, _super);
  4987. function AbstractProviderError(injector, key, constructResolvingMessage) {
  4988. _super.call(this, "DI Exception");
  4989. this.keys = [key];
  4990. this.injectors = [injector];
  4991. this.constructResolvingMessage = constructResolvingMessage;
  4992. this.message = this.constructResolvingMessage(this.keys);
  4993. }
  4994. AbstractProviderError.prototype.addKey = function (injector, key) {
  4995. this.injectors.push(injector);
  4996. this.keys.push(key);
  4997. this.message = this.constructResolvingMessage(this.keys);
  4998. };
  4999. Object.defineProperty(AbstractProviderError.prototype, "context", {
  5000. get: function () { return this.injectors[this.injectors.length - 1].debugContext(); },
  5001. enumerable: true,
  5002. configurable: true
  5003. });
  5004. return AbstractProviderError;
  5005. })(exceptions_1.BaseException);
  5006. exports.AbstractProviderError = AbstractProviderError;
  5007. /**
  5008. * Thrown when trying to retrieve a dependency by `Key` from {@link Injector}, but the
  5009. * {@link Injector} does not have a {@link Provider} for {@link Key}.
  5010. *
  5011. * ### Example ([live demo](http://plnkr.co/edit/vq8D3FRB9aGbnWJqtEPE?p=preview))
  5012. *
  5013. * ```typescript
  5014. * class A {
  5015. * constructor(b:B) {}
  5016. * }
  5017. *
  5018. * expect(() => Injector.resolveAndCreate([A])).toThrowError();
  5019. * ```
  5020. */
  5021. var NoProviderError = (function (_super) {
  5022. __extends(NoProviderError, _super);
  5023. function NoProviderError(injector, key) {
  5024. _super.call(this, injector, key, function (keys) {
  5025. var first = lang_1.stringify(collection_1.ListWrapper.first(keys).token);
  5026. return "No provider for " + first + "!" + constructResolvingPath(keys);
  5027. });
  5028. }
  5029. return NoProviderError;
  5030. })(AbstractProviderError);
  5031. exports.NoProviderError = NoProviderError;
  5032. /**
  5033. * Thrown when dependencies form a cycle.
  5034. *
  5035. * ### Example ([live demo](http://plnkr.co/edit/wYQdNos0Tzql3ei1EV9j?p=info))
  5036. *
  5037. * ```typescript
  5038. * var injector = Injector.resolveAndCreate([
  5039. * provide("one", {useFactory: (two) => "two", deps: [[new Inject("two")]]}),
  5040. * provide("two", {useFactory: (one) => "one", deps: [[new Inject("one")]]})
  5041. * ]);
  5042. *
  5043. * expect(() => injector.get("one")).toThrowError();
  5044. * ```
  5045. *
  5046. * Retrieving `A` or `B` throws a `CyclicDependencyError` as the graph above cannot be constructed.
  5047. */
  5048. var CyclicDependencyError = (function (_super) {
  5049. __extends(CyclicDependencyError, _super);
  5050. function CyclicDependencyError(injector, key) {
  5051. _super.call(this, injector, key, function (keys) {
  5052. return "Cannot instantiate cyclic dependency!" + constructResolvingPath(keys);
  5053. });
  5054. }
  5055. return CyclicDependencyError;
  5056. })(AbstractProviderError);
  5057. exports.CyclicDependencyError = CyclicDependencyError;
  5058. /**
  5059. * Thrown when a constructing type returns with an Error.
  5060. *
  5061. * The `InstantiationError` class contains the original error plus the dependency graph which caused
  5062. * this object to be instantiated.
  5063. *
  5064. * ### Example ([live demo](http://plnkr.co/edit/7aWYdcqTQsP0eNqEdUAf?p=preview))
  5065. *
  5066. * ```typescript
  5067. * class A {
  5068. * constructor() {
  5069. * throw new Error('message');
  5070. * }
  5071. * }
  5072. *
  5073. * var injector = Injector.resolveAndCreate([A]);
  5074. * try {
  5075. * injector.get(A);
  5076. * } catch (e) {
  5077. * expect(e instanceof InstantiationError).toBe(true);
  5078. * expect(e.originalException.message).toEqual("message");
  5079. * expect(e.originalStack).toBeDefined();
  5080. * }
  5081. * ```
  5082. */
  5083. var InstantiationError = (function (_super) {
  5084. __extends(InstantiationError, _super);
  5085. function InstantiationError(injector, originalException, originalStack, key) {
  5086. _super.call(this, "DI Exception", originalException, originalStack, null);
  5087. this.keys = [key];
  5088. this.injectors = [injector];
  5089. }
  5090. InstantiationError.prototype.addKey = function (injector, key) {
  5091. this.injectors.push(injector);
  5092. this.keys.push(key);
  5093. };
  5094. Object.defineProperty(InstantiationError.prototype, "wrapperMessage", {
  5095. get: function () {
  5096. var first = lang_1.stringify(collection_1.ListWrapper.first(this.keys).token);
  5097. return "Error during instantiation of " + first + "!" + constructResolvingPath(this.keys) + ".";
  5098. },
  5099. enumerable: true,
  5100. configurable: true
  5101. });
  5102. Object.defineProperty(InstantiationError.prototype, "causeKey", {
  5103. get: function () { return this.keys[0]; },
  5104. enumerable: true,
  5105. configurable: true
  5106. });
  5107. Object.defineProperty(InstantiationError.prototype, "context", {
  5108. get: function () { return this.injectors[this.injectors.length - 1].debugContext(); },
  5109. enumerable: true,
  5110. configurable: true
  5111. });
  5112. return InstantiationError;
  5113. })(exceptions_1.WrappedException);
  5114. exports.InstantiationError = InstantiationError;
  5115. /**
  5116. * Thrown when an object other then {@link Provider} (or `Type`) is passed to {@link Injector}
  5117. * creation.
  5118. *
  5119. * ### Example ([live demo](http://plnkr.co/edit/YatCFbPAMCL0JSSQ4mvH?p=preview))
  5120. *
  5121. * ```typescript
  5122. * expect(() => Injector.resolveAndCreate(["not a type"])).toThrowError();
  5123. * ```
  5124. */
  5125. var InvalidProviderError = (function (_super) {
  5126. __extends(InvalidProviderError, _super);
  5127. function InvalidProviderError(provider) {
  5128. _super.call(this, "Invalid provider - only instances of Provider and Type are allowed, got: " +
  5129. provider.toString());
  5130. }
  5131. return InvalidProviderError;
  5132. })(exceptions_1.BaseException);
  5133. exports.InvalidProviderError = InvalidProviderError;
  5134. /**
  5135. * Thrown when the class has no annotation information.
  5136. *
  5137. * Lack of annotation information prevents the {@link Injector} from determining which dependencies
  5138. * need to be injected into the constructor.
  5139. *
  5140. * ### Example ([live demo](http://plnkr.co/edit/rHnZtlNS7vJOPQ6pcVkm?p=preview))
  5141. *
  5142. * ```typescript
  5143. * class A {
  5144. * constructor(b) {}
  5145. * }
  5146. *
  5147. * expect(() => Injector.resolveAndCreate([A])).toThrowError();
  5148. * ```
  5149. *
  5150. * This error is also thrown when the class not marked with {@link Injectable} has parameter types.
  5151. *
  5152. * ```typescript
  5153. * class B {}
  5154. *
  5155. * class A {
  5156. * constructor(b:B) {} // no information about the parameter types of A is available at runtime.
  5157. * }
  5158. *
  5159. * expect(() => Injector.resolveAndCreate([A,B])).toThrowError();
  5160. * ```
  5161. */
  5162. var NoAnnotationError = (function (_super) {
  5163. __extends(NoAnnotationError, _super);
  5164. function NoAnnotationError(typeOrFunc, params) {
  5165. _super.call(this, NoAnnotationError._genMessage(typeOrFunc, params));
  5166. }
  5167. NoAnnotationError._genMessage = function (typeOrFunc, params) {
  5168. var signature = [];
  5169. for (var i = 0, ii = params.length; i < ii; i++) {
  5170. var parameter = params[i];
  5171. if (lang_1.isBlank(parameter) || parameter.length == 0) {
  5172. signature.push('?');
  5173. }
  5174. else {
  5175. signature.push(parameter.map(lang_1.stringify).join(' '));
  5176. }
  5177. }
  5178. return "Cannot resolve all parameters for " + lang_1.stringify(typeOrFunc) + "(" +
  5179. signature.join(', ') + "). " + 'Make sure they all have valid type or annotations.';
  5180. };
  5181. return NoAnnotationError;
  5182. })(exceptions_1.BaseException);
  5183. exports.NoAnnotationError = NoAnnotationError;
  5184. /**
  5185. * Thrown when getting an object by index.
  5186. *
  5187. * ### Example ([live demo](http://plnkr.co/edit/bRs0SX2OTQiJzqvjgl8P?p=preview))
  5188. *
  5189. * ```typescript
  5190. * class A {}
  5191. *
  5192. * var injector = Injector.resolveAndCreate([A]);
  5193. *
  5194. * expect(() => injector.getAt(100)).toThrowError();
  5195. * ```
  5196. */
  5197. var OutOfBoundsError = (function (_super) {
  5198. __extends(OutOfBoundsError, _super);
  5199. function OutOfBoundsError(index) {
  5200. _super.call(this, "Index " + index + " is out-of-bounds.");
  5201. }
  5202. return OutOfBoundsError;
  5203. })(exceptions_1.BaseException);
  5204. exports.OutOfBoundsError = OutOfBoundsError;
  5205. // TODO: add a working example after alpha38 is released
  5206. /**
  5207. * Thrown when a multi provider and a regular provider are bound to the same token.
  5208. *
  5209. * ### Example
  5210. *
  5211. * ```typescript
  5212. * expect(() => Injector.resolveAndCreate([
  5213. * new Provider("Strings", {useValue: "string1", multi: true}),
  5214. * new Provider("Strings", {useValue: "string2", multi: false})
  5215. * ])).toThrowError();
  5216. * ```
  5217. */
  5218. var MixingMultiProvidersWithRegularProvidersError = (function (_super) {
  5219. __extends(MixingMultiProvidersWithRegularProvidersError, _super);
  5220. function MixingMultiProvidersWithRegularProvidersError(provider1, provider2) {
  5221. _super.call(this, "Cannot mix multi providers and regular providers, got: " + provider1.toString() + " " +
  5222. provider2.toString());
  5223. }
  5224. return MixingMultiProvidersWithRegularProvidersError;
  5225. })(exceptions_1.BaseException);
  5226. exports.MixingMultiProvidersWithRegularProvidersError = MixingMultiProvidersWithRegularProvidersError;
  5227. /***/ },
  5228. /* 22 */
  5229. /***/ function(module, exports, __webpack_require__) {
  5230. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  5231. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  5232. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  5233. 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;
  5234. return c > 3 && r && Object.defineProperty(target, key, r), r;
  5235. };
  5236. var __metadata = (this && this.__metadata) || function (k, v) {
  5237. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  5238. };
  5239. var lang_1 = __webpack_require__(5);
  5240. /**
  5241. * Creates a token that can be used in a DI Provider.
  5242. *
  5243. * ### Example ([live demo](http://plnkr.co/edit/Ys9ezXpj2Mnoy3Uc8KBp?p=preview))
  5244. *
  5245. * ```typescript
  5246. * var t = new OpaqueToken("value");
  5247. *
  5248. * var injector = Injector.resolveAndCreate([
  5249. * provide(t, {useValue: "providedValue"})
  5250. * ]);
  5251. *
  5252. * expect(injector.get(t)).toEqual("bindingValue");
  5253. * ```
  5254. *
  5255. * Using an `OpaqueToken` is preferable to using strings as tokens because of possible collisions
  5256. * caused by multiple providers using the same string as two different tokens.
  5257. *
  5258. * Using an `OpaqueToken` is preferable to using an `Object` as tokens because it provides better
  5259. * error messages.
  5260. */
  5261. var OpaqueToken = (function () {
  5262. function OpaqueToken(_desc) {
  5263. this._desc = _desc;
  5264. }
  5265. OpaqueToken.prototype.toString = function () { return "Token " + this._desc; };
  5266. OpaqueToken = __decorate([
  5267. lang_1.CONST(),
  5268. __metadata('design:paramtypes', [String])
  5269. ], OpaqueToken);
  5270. return OpaqueToken;
  5271. })();
  5272. exports.OpaqueToken = OpaqueToken;
  5273. /***/ },
  5274. /* 23 */
  5275. /***/ function(module, exports, __webpack_require__) {
  5276. var __extends = (this && this.__extends) || function (d, b) {
  5277. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  5278. function __() { this.constructor = d; }
  5279. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  5280. };
  5281. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  5282. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  5283. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  5284. 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;
  5285. return c > 3 && r && Object.defineProperty(target, key, r), r;
  5286. };
  5287. var __metadata = (this && this.__metadata) || function (k, v) {
  5288. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  5289. };
  5290. var lang_1 = __webpack_require__(5);
  5291. var metadata_1 = __webpack_require__(7);
  5292. var change_detection_1 = __webpack_require__(24);
  5293. /**
  5294. * Directives allow you to attach behavior to elements in the DOM.
  5295. *
  5296. * {@link DirectiveMetadata}s with an embedded view are called {@link ComponentMetadata}s.
  5297. *
  5298. * A directive consists of a single directive annotation and a controller class. When the
  5299. * directive's `selector` matches
  5300. * elements in the DOM, the following steps occur:
  5301. *
  5302. * 1. For each directive, the `ElementInjector` attempts to resolve the directive's constructor
  5303. * arguments.
  5304. * 2. Angular instantiates directives for each matched element using `ElementInjector` in a
  5305. * depth-first order,
  5306. * as declared in the HTML.
  5307. *
  5308. * ## Understanding How Injection Works
  5309. *
  5310. * There are three stages of injection resolution.
  5311. * - *Pre-existing Injectors*:
  5312. * - The terminal {@link Injector} cannot resolve dependencies. It either throws an error or, if
  5313. * the dependency was
  5314. * specified as `@Optional`, returns `null`.
  5315. * - The platform injector resolves browser singleton resources, such as: cookies, title,
  5316. * location, and others.
  5317. * - *Component Injectors*: Each component instance has its own {@link Injector}, and they follow
  5318. * the same parent-child hierarchy
  5319. * as the component instances in the DOM.
  5320. * - *Element Injectors*: Each component instance has a Shadow DOM. Within the Shadow DOM each
  5321. * element has an `ElementInjector`
  5322. * which follow the same parent-child hierarchy as the DOM elements themselves.
  5323. *
  5324. * When a template is instantiated, it also must instantiate the corresponding directives in a
  5325. * depth-first order. The
  5326. * current `ElementInjector` resolves the constructor dependencies for each directive.
  5327. *
  5328. * Angular then resolves dependencies as follows, according to the order in which they appear in the
  5329. * {@link ViewMetadata}:
  5330. *
  5331. * 1. Dependencies on the current element
  5332. * 2. Dependencies on element injectors and their parents until it encounters a Shadow DOM boundary
  5333. * 3. Dependencies on component injectors and their parents until it encounters the root component
  5334. * 4. Dependencies on pre-existing injectors
  5335. *
  5336. *
  5337. * The `ElementInjector` can inject other directives, element-specific special objects, or it can
  5338. * delegate to the parent
  5339. * injector.
  5340. *
  5341. * To inject other directives, declare the constructor parameter as:
  5342. * - `directive:DirectiveType`: a directive on the current element only
  5343. * - `@Host() directive:DirectiveType`: any directive that matches the type between the current
  5344. * element and the
  5345. * Shadow DOM root.
  5346. * - `@Query(DirectiveType) query:QueryList<DirectiveType>`: A live collection of direct child
  5347. * directives.
  5348. * - `@QueryDescendants(DirectiveType) query:QueryList<DirectiveType>`: A live collection of any
  5349. * child directives.
  5350. *
  5351. * To inject element-specific special objects, declare the constructor parameter as:
  5352. * - `element: ElementRef` to obtain a reference to logical element in the view.
  5353. * - `viewContainer: ViewContainerRef` to control child template instantiation, for
  5354. * {@link DirectiveMetadata} directives only
  5355. * - `bindingPropagation: BindingPropagation` to control change detection in a more granular way.
  5356. *
  5357. * ### Example
  5358. *
  5359. * The following example demonstrates how dependency injection resolves constructor arguments in
  5360. * practice.
  5361. *
  5362. *
  5363. * Assume this HTML template:
  5364. *
  5365. * ```
  5366. * <div dependency="1">
  5367. * <div dependency="2">
  5368. * <div dependency="3" my-directive>
  5369. * <div dependency="4">
  5370. * <div dependency="5"></div>
  5371. * </div>
  5372. * <div dependency="6"></div>
  5373. * </div>
  5374. * </div>
  5375. * </div>
  5376. * ```
  5377. *
  5378. * With the following `dependency` decorator and `SomeService` injectable class.
  5379. *
  5380. * ```
  5381. * @Injectable()
  5382. * class SomeService {
  5383. * }
  5384. *
  5385. * @Directive({
  5386. * selector: '[dependency]',
  5387. * inputs: [
  5388. * 'id: dependency'
  5389. * ]
  5390. * })
  5391. * class Dependency {
  5392. * id:string;
  5393. * }
  5394. * ```
  5395. *
  5396. * Let's step through the different ways in which `MyDirective` could be declared...
  5397. *
  5398. *
  5399. * ### No injection
  5400. *
  5401. * Here the constructor is declared with no arguments, therefore nothing is injected into
  5402. * `MyDirective`.
  5403. *
  5404. * ```
  5405. * @Directive({ selector: '[my-directive]' })
  5406. * class MyDirective {
  5407. * constructor() {
  5408. * }
  5409. * }
  5410. * ```
  5411. *
  5412. * This directive would be instantiated with no dependencies.
  5413. *
  5414. *
  5415. * ### Component-level injection
  5416. *
  5417. * Directives can inject any injectable instance from the closest component injector or any of its
  5418. * parents.
  5419. *
  5420. * Here, the constructor declares a parameter, `someService`, and injects the `SomeService` type
  5421. * from the parent
  5422. * component's injector.
  5423. * ```
  5424. * @Directive({ selector: '[my-directive]' })
  5425. * class MyDirective {
  5426. * constructor(someService: SomeService) {
  5427. * }
  5428. * }
  5429. * ```
  5430. *
  5431. * This directive would be instantiated with a dependency on `SomeService`.
  5432. *
  5433. *
  5434. * ### Injecting a directive from the current element
  5435. *
  5436. * Directives can inject other directives declared on the current element.
  5437. *
  5438. * ```
  5439. * @Directive({ selector: '[my-directive]' })
  5440. * class MyDirective {
  5441. * constructor(dependency: Dependency) {
  5442. * expect(dependency.id).toEqual(3);
  5443. * }
  5444. * }
  5445. * ```
  5446. * This directive would be instantiated with `Dependency` declared at the same element, in this case
  5447. * `dependency="3"`.
  5448. *
  5449. * ### Injecting a directive from any ancestor elements
  5450. *
  5451. * Directives can inject other directives declared on any ancestor element (in the current Shadow
  5452. * DOM), i.e. on the current element, the
  5453. * parent element, or its parents.
  5454. * ```
  5455. * @Directive({ selector: '[my-directive]' })
  5456. * class MyDirective {
  5457. * constructor(@Host() dependency: Dependency) {
  5458. * expect(dependency.id).toEqual(2);
  5459. * }
  5460. * }
  5461. * ```
  5462. *
  5463. * `@Host` checks the current element, the parent, as well as its parents recursively. If
  5464. * `dependency="2"` didn't
  5465. * exist on the direct parent, this injection would
  5466. * have returned
  5467. * `dependency="1"`.
  5468. *
  5469. *
  5470. * ### Injecting a live collection of direct child directives
  5471. *
  5472. *
  5473. * A directive can also query for other child directives. Since parent directives are instantiated
  5474. * before child directives, a directive can't simply inject the list of child directives. Instead,
  5475. * the directive injects a {@link QueryList}, which updates its contents as children are added,
  5476. * removed, or moved by a directive that uses a {@link ViewContainerRef} such as a `ngFor`, an
  5477. * `ngIf`, or an `ngSwitch`.
  5478. *
  5479. * ```
  5480. * @Directive({ selector: '[my-directive]' })
  5481. * class MyDirective {
  5482. * constructor(@Query(Dependency) dependencies:QueryList<Dependency>) {
  5483. * }
  5484. * }
  5485. * ```
  5486. *
  5487. * This directive would be instantiated with a {@link QueryList} which contains `Dependency` 4 and
  5488. * `Dependency` 6. Here, `Dependency` 5 would not be included, because it is not a direct child.
  5489. *
  5490. * ### Injecting a live collection of descendant directives
  5491. *
  5492. * By passing the descendant flag to `@Query` above, we can include the children of the child
  5493. * elements.
  5494. *
  5495. * ```
  5496. * @Directive({ selector: '[my-directive]' })
  5497. * class MyDirective {
  5498. * constructor(@Query(Dependency, {descendants: true}) dependencies:QueryList<Dependency>) {
  5499. * }
  5500. * }
  5501. * ```
  5502. *
  5503. * This directive would be instantiated with a Query which would contain `Dependency` 4, 5 and 6.
  5504. *
  5505. * ### Optional injection
  5506. *
  5507. * The normal behavior of directives is to return an error when a specified dependency cannot be
  5508. * resolved. If you
  5509. * would like to inject `null` on unresolved dependency instead, you can annotate that dependency
  5510. * with `@Optional()`.
  5511. * This explicitly permits the author of a template to treat some of the surrounding directives as
  5512. * optional.
  5513. *
  5514. * ```
  5515. * @Directive({ selector: '[my-directive]' })
  5516. * class MyDirective {
  5517. * constructor(@Optional() dependency:Dependency) {
  5518. * }
  5519. * }
  5520. * ```
  5521. *
  5522. * This directive would be instantiated with a `Dependency` directive found on the current element.
  5523. * If none can be
  5524. * found, the injector supplies `null` instead of throwing an error.
  5525. *
  5526. * ### Example
  5527. *
  5528. * Here we use a decorator directive to simply define basic tool-tip behavior.
  5529. *
  5530. * ```
  5531. * @Directive({
  5532. * selector: '[tooltip]',
  5533. * inputs: [
  5534. * 'text: tooltip'
  5535. * ],
  5536. * host: {
  5537. * '(mouseenter)': 'onMouseEnter()',
  5538. * '(mouseleave)': 'onMouseLeave()'
  5539. * }
  5540. * })
  5541. * class Tooltip{
  5542. * text:string;
  5543. * overlay:Overlay; // NOT YET IMPLEMENTED
  5544. * overlayManager:OverlayManager; // NOT YET IMPLEMENTED
  5545. *
  5546. * constructor(overlayManager:OverlayManager) {
  5547. * this.overlay = overlay;
  5548. * }
  5549. *
  5550. * onMouseEnter() {
  5551. * // exact signature to be determined
  5552. * this.overlay = this.overlayManager.open(text, ...);
  5553. * }
  5554. *
  5555. * onMouseLeave() {
  5556. * this.overlay.close();
  5557. * this.overlay = null;
  5558. * }
  5559. * }
  5560. * ```
  5561. * In our HTML template, we can then add this behavior to a `<div>` or any other element with the
  5562. * `tooltip` selector,
  5563. * like so:
  5564. *
  5565. * ```
  5566. * <div tooltip="some text here"></div>
  5567. * ```
  5568. *
  5569. * Directives can also control the instantiation, destruction, and positioning of inline template
  5570. * elements:
  5571. *
  5572. * A directive uses a {@link ViewContainerRef} to instantiate, insert, move, and destroy views at
  5573. * runtime.
  5574. * The {@link ViewContainerRef} is created as a result of `<template>` element, and represents a
  5575. * location in the current view
  5576. * where these actions are performed.
  5577. *
  5578. * Views are always created as children of the current {@link ViewMetadata}, and as siblings of the
  5579. * `<template>` element. Thus a
  5580. * directive in a child view cannot inject the directive that created it.
  5581. *
  5582. * Since directives that create views via ViewContainers are common in Angular, and using the full
  5583. * `<template>` element syntax is wordy, Angular
  5584. * also supports a shorthand notation: `<li *foo="bar">` and `<li template="foo: bar">` are
  5585. * equivalent.
  5586. *
  5587. * Thus,
  5588. *
  5589. * ```
  5590. * <ul>
  5591. * <li *foo="bar" title="text"></li>
  5592. * </ul>
  5593. * ```
  5594. *
  5595. * Expands in use to:
  5596. *
  5597. * ```
  5598. * <ul>
  5599. * <template [foo]="bar">
  5600. * <li title="text"></li>
  5601. * </template>
  5602. * </ul>
  5603. * ```
  5604. *
  5605. * Notice that although the shorthand places `*foo="bar"` within the `<li>` element, the binding for
  5606. * the directive
  5607. * controller is correctly instantiated on the `<template>` element rather than the `<li>` element.
  5608. *
  5609. * ## Lifecycle hooks
  5610. *
  5611. * When the directive class implements some {@link angular2/lifecycle_hooks} the callbacks are
  5612. * called by the change detection at defined points in time during the life of the directive.
  5613. *
  5614. * ### Example
  5615. *
  5616. * Let's suppose we want to implement the `unless` behavior, to conditionally include a template.
  5617. *
  5618. * Here is a simple directive that triggers on an `unless` selector:
  5619. *
  5620. * ```
  5621. * @Directive({
  5622. * selector: '[unless]',
  5623. * inputs: ['unless']
  5624. * })
  5625. * export class Unless {
  5626. * viewContainer: ViewContainerRef;
  5627. * templateRef: TemplateRef;
  5628. * prevCondition: boolean;
  5629. *
  5630. * constructor(viewContainer: ViewContainerRef, templateRef: TemplateRef) {
  5631. * this.viewContainer = viewContainer;
  5632. * this.templateRef = templateRef;
  5633. * this.prevCondition = null;
  5634. * }
  5635. *
  5636. * set unless(newCondition) {
  5637. * if (newCondition && (isBlank(this.prevCondition) || !this.prevCondition)) {
  5638. * this.prevCondition = true;
  5639. * this.viewContainer.clear();
  5640. * } else if (!newCondition && (isBlank(this.prevCondition) || this.prevCondition)) {
  5641. * this.prevCondition = false;
  5642. * this.viewContainer.create(this.templateRef);
  5643. * }
  5644. * }
  5645. * }
  5646. * ```
  5647. *
  5648. * We can then use this `unless` selector in a template:
  5649. * ```
  5650. * <ul>
  5651. * <li *unless="expr"></li>
  5652. * </ul>
  5653. * ```
  5654. *
  5655. * Once the directive instantiates the child view, the shorthand notation for the template expands
  5656. * and the result is:
  5657. *
  5658. * ```
  5659. * <ul>
  5660. * <template [unless]="exp">
  5661. * <li></li>
  5662. * </template>
  5663. * <li></li>
  5664. * </ul>
  5665. * ```
  5666. *
  5667. * Note also that although the `<li></li>` template still exists inside the `<template></template>`,
  5668. * the instantiated
  5669. * view occurs on the second `<li></li>` which is a sibling to the `<template>` element.
  5670. */
  5671. var DirectiveMetadata = (function (_super) {
  5672. __extends(DirectiveMetadata, _super);
  5673. function DirectiveMetadata(_a) {
  5674. 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;
  5675. _super.call(this);
  5676. this.selector = selector;
  5677. this._inputs = inputs;
  5678. this._properties = properties;
  5679. this._outputs = outputs;
  5680. this._events = events;
  5681. this.host = host;
  5682. this.exportAs = exportAs;
  5683. this.queries = queries;
  5684. this._providers = providers;
  5685. this._bindings = bindings;
  5686. }
  5687. Object.defineProperty(DirectiveMetadata.prototype, "inputs", {
  5688. /**
  5689. * Enumerates the set of data-bound input properties for a directive
  5690. *
  5691. * Angular automatically updates input properties during change detection.
  5692. *
  5693. * The `inputs` property defines a set of `directiveProperty` to `bindingProperty`
  5694. * configuration:
  5695. *
  5696. * - `directiveProperty` specifies the component property where the value is written.
  5697. * - `bindingProperty` specifies the DOM property where the value is read from.
  5698. *
  5699. * When `bindingProperty` is not provided, it is assumed to be equal to `directiveProperty`.
  5700. *
  5701. * ### Example ([live demo](http://plnkr.co/edit/ivhfXY?p=preview))
  5702. *
  5703. * The following example creates a component with two data-bound properties.
  5704. *
  5705. * ```typescript
  5706. * @Component({
  5707. * selector: 'bank-account',
  5708. * inputs: ['bankName', 'id: account-id'],
  5709. * template: `
  5710. * Bank Name: {{bankName}}
  5711. * Account Id: {{id}}
  5712. * `
  5713. * })
  5714. * class BankAccount {
  5715. * bankName: string;
  5716. * id: string;
  5717. *
  5718. * // this property is not bound, and won't be automatically updated by Angular
  5719. * normalizedBankName: string;
  5720. * }
  5721. *
  5722. * @Component({
  5723. * selector: 'app',
  5724. * template: `
  5725. * <bank-account bank-name="RBC" account-id="4747"></bank-account>
  5726. * `,
  5727. * directives: [BankAccount]
  5728. * })
  5729. * class App {}
  5730. *
  5731. * bootstrap(App);
  5732. * ```
  5733. *
  5734. */
  5735. get: function () {
  5736. return lang_1.isPresent(this._properties) && this._properties.length > 0 ? this._properties :
  5737. this._inputs;
  5738. },
  5739. enumerable: true,
  5740. configurable: true
  5741. });
  5742. Object.defineProperty(DirectiveMetadata.prototype, "properties", {
  5743. get: function () { return this.inputs; },
  5744. enumerable: true,
  5745. configurable: true
  5746. });
  5747. Object.defineProperty(DirectiveMetadata.prototype, "outputs", {
  5748. /**
  5749. * Enumerates the set of event-bound output properties.
  5750. *
  5751. * When an output property emits an event, an event handler attached to that event
  5752. * the template is invoked.
  5753. *
  5754. * The `outputs` property defines a set of `directiveProperty` to `bindingProperty`
  5755. * configuration:
  5756. *
  5757. * - `directiveProperty` specifies the component property that emits events.
  5758. * - `bindingProperty` specifies the DOM property the event handler is attached to.
  5759. *
  5760. * ### Example ([live demo](http://plnkr.co/edit/d5CNq7?p=preview))
  5761. *
  5762. * ```typescript
  5763. * @Directive({
  5764. * selector: 'interval-dir',
  5765. * outputs: ['everySecond', 'five5Secs: everyFiveSeconds']
  5766. * })
  5767. * class IntervalDir {
  5768. * everySecond = new EventEmitter();
  5769. * five5Secs = new EventEmitter();
  5770. *
  5771. * constructor() {
  5772. * setInterval(() => this.everySecond.emit("event"), 1000);
  5773. * setInterval(() => this.five5Secs.emit("event"), 5000);
  5774. * }
  5775. * }
  5776. *
  5777. * @Component({
  5778. * selector: 'app',
  5779. * template: `
  5780. * <interval-dir (every-second)="everySecond()" (every-five-seconds)="everyFiveSeconds()">
  5781. * </interval-dir>
  5782. * `,
  5783. * directives: [IntervalDir]
  5784. * })
  5785. * class App {
  5786. * everySecond() { console.log('second'); }
  5787. * everyFiveSeconds() { console.log('five seconds'); }
  5788. * }
  5789. * bootstrap(App);
  5790. * ```
  5791. *
  5792. */
  5793. get: function () {
  5794. return lang_1.isPresent(this._events) && this._events.length > 0 ? this._events : this._outputs;
  5795. },
  5796. enumerable: true,
  5797. configurable: true
  5798. });
  5799. Object.defineProperty(DirectiveMetadata.prototype, "events", {
  5800. get: function () { return this.outputs; },
  5801. enumerable: true,
  5802. configurable: true
  5803. });
  5804. Object.defineProperty(DirectiveMetadata.prototype, "providers", {
  5805. /**
  5806. * Defines the set of injectable objects that are visible to a Directive and its light DOM
  5807. * children.
  5808. *
  5809. * ## Simple Example
  5810. *
  5811. * Here is an example of a class that can be injected:
  5812. *
  5813. * ```
  5814. * class Greeter {
  5815. * greet(name:string) {
  5816. * return 'Hello ' + name + '!';
  5817. * }
  5818. * }
  5819. *
  5820. * @Directive({
  5821. * selector: 'greet',
  5822. * bindings: [
  5823. * Greeter
  5824. * ]
  5825. * })
  5826. * class HelloWorld {
  5827. * greeter:Greeter;
  5828. *
  5829. * constructor(greeter:Greeter) {
  5830. * this.greeter = greeter;
  5831. * }
  5832. * }
  5833. * ```
  5834. */
  5835. get: function () {
  5836. return lang_1.isPresent(this._bindings) && this._bindings.length > 0 ? this._bindings :
  5837. this._providers;
  5838. },
  5839. enumerable: true,
  5840. configurable: true
  5841. });
  5842. Object.defineProperty(DirectiveMetadata.prototype, "bindings", {
  5843. /** @deprecated */
  5844. get: function () { return this.providers; },
  5845. enumerable: true,
  5846. configurable: true
  5847. });
  5848. DirectiveMetadata = __decorate([
  5849. lang_1.CONST(),
  5850. __metadata('design:paramtypes', [Object])
  5851. ], DirectiveMetadata);
  5852. return DirectiveMetadata;
  5853. })(metadata_1.InjectableMetadata);
  5854. exports.DirectiveMetadata = DirectiveMetadata;
  5855. /**
  5856. * Declare reusable UI building blocks for an application.
  5857. *
  5858. * Each Angular component requires a single `@Component` annotation. The
  5859. * `@Component`
  5860. * annotation specifies when a component is instantiated, and which properties and hostListeners it
  5861. * binds to.
  5862. *
  5863. * When a component is instantiated, Angular
  5864. * - creates a shadow DOM for the component.
  5865. * - loads the selected template into the shadow DOM.
  5866. * - creates all the injectable objects configured with `providers` and `viewProviders`.
  5867. *
  5868. * All template expressions and statements are then evaluated against the component instance.
  5869. *
  5870. * For details on the `@View` annotation, see {@link ViewMetadata}.
  5871. *
  5872. * ## Lifecycle hooks
  5873. *
  5874. * When the component class implements some {@link angular2/lifecycle_hooks} the callbacks are
  5875. * called by the change detection at defined points in time during the life of the component.
  5876. *
  5877. * ### Example
  5878. *
  5879. * {@example core/ts/metadata/metadata.ts region='component'}
  5880. */
  5881. var ComponentMetadata = (function (_super) {
  5882. __extends(ComponentMetadata, _super);
  5883. function ComponentMetadata(_a) {
  5884. 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;
  5885. _super.call(this, {
  5886. selector: selector,
  5887. inputs: inputs,
  5888. outputs: outputs,
  5889. properties: properties,
  5890. events: events,
  5891. host: host,
  5892. exportAs: exportAs,
  5893. bindings: bindings,
  5894. providers: providers,
  5895. queries: queries
  5896. });
  5897. this.changeDetection = changeDetection;
  5898. this._viewProviders = viewProviders;
  5899. this._viewBindings = viewBindings;
  5900. this.templateUrl = templateUrl;
  5901. this.template = template;
  5902. this.styleUrls = styleUrls;
  5903. this.styles = styles;
  5904. this.directives = directives;
  5905. this.pipes = pipes;
  5906. this.encapsulation = encapsulation;
  5907. this.moduleId = moduleId;
  5908. }
  5909. Object.defineProperty(ComponentMetadata.prototype, "viewProviders", {
  5910. /**
  5911. * Defines the set of injectable objects that are visible to its view DOM children.
  5912. *
  5913. * ## Simple Example
  5914. *
  5915. * Here is an example of a class that can be injected:
  5916. *
  5917. * ```
  5918. * class Greeter {
  5919. * greet(name:string) {
  5920. * return 'Hello ' + name + '!';
  5921. * }
  5922. * }
  5923. *
  5924. * @Directive({
  5925. * selector: 'needs-greeter'
  5926. * })
  5927. * class NeedsGreeter {
  5928. * greeter:Greeter;
  5929. *
  5930. * constructor(greeter:Greeter) {
  5931. * this.greeter = greeter;
  5932. * }
  5933. * }
  5934. *
  5935. * @Component({
  5936. * selector: 'greet',
  5937. * viewProviders: [
  5938. * Greeter
  5939. * ],
  5940. * template: `<needs-greeter></needs-greeter>`,
  5941. * directives: [NeedsGreeter]
  5942. * })
  5943. * class HelloWorld {
  5944. * }
  5945. *
  5946. * ```
  5947. */
  5948. get: function () {
  5949. return lang_1.isPresent(this._viewBindings) && this._viewBindings.length > 0 ? this._viewBindings :
  5950. this._viewProviders;
  5951. },
  5952. enumerable: true,
  5953. configurable: true
  5954. });
  5955. Object.defineProperty(ComponentMetadata.prototype, "viewBindings", {
  5956. get: function () { return this.viewProviders; },
  5957. enumerable: true,
  5958. configurable: true
  5959. });
  5960. ComponentMetadata = __decorate([
  5961. lang_1.CONST(),
  5962. __metadata('design:paramtypes', [Object])
  5963. ], ComponentMetadata);
  5964. return ComponentMetadata;
  5965. })(DirectiveMetadata);
  5966. exports.ComponentMetadata = ComponentMetadata;
  5967. /**
  5968. * Declare reusable pipe function.
  5969. *
  5970. * A "pure" pipe is only re-evaluated when either the input or any of the arguments change.
  5971. *
  5972. * When not specified, pipes default to being pure.
  5973. *
  5974. * ### Example
  5975. *
  5976. * {@example core/ts/metadata/metadata.ts region='pipe'}
  5977. */
  5978. var PipeMetadata = (function (_super) {
  5979. __extends(PipeMetadata, _super);
  5980. function PipeMetadata(_a) {
  5981. var name = _a.name, pure = _a.pure;
  5982. _super.call(this);
  5983. this.name = name;
  5984. this._pure = pure;
  5985. }
  5986. Object.defineProperty(PipeMetadata.prototype, "pure", {
  5987. get: function () { return lang_1.isPresent(this._pure) ? this._pure : true; },
  5988. enumerable: true,
  5989. configurable: true
  5990. });
  5991. PipeMetadata = __decorate([
  5992. lang_1.CONST(),
  5993. __metadata('design:paramtypes', [Object])
  5994. ], PipeMetadata);
  5995. return PipeMetadata;
  5996. })(metadata_1.InjectableMetadata);
  5997. exports.PipeMetadata = PipeMetadata;
  5998. /**
  5999. * Declares a data-bound input property.
  6000. *
  6001. * Angular automatically updates data-bound properties during change detection.
  6002. *
  6003. * `InputMetadata` takes an optional parameter that specifies the name
  6004. * used when instantiating a component in the template. When not provided,
  6005. * the name of the decorated property is used.
  6006. *
  6007. * ### Example
  6008. *
  6009. * The following example creates a component with two input properties.
  6010. *
  6011. * ```typescript
  6012. * @Component({
  6013. * selector: 'bank-account',
  6014. * template: `
  6015. * Bank Name: {{bankName}}
  6016. * Account Id: {{id}}
  6017. * `
  6018. * })
  6019. * class BankAccount {
  6020. * @Input() bankName: string;
  6021. * @Input('account-id') id: string;
  6022. *
  6023. * // this property is not bound, and won't be automatically updated by Angular
  6024. * normalizedBankName: string;
  6025. * }
  6026. *
  6027. * @Component({
  6028. * selector: 'app',
  6029. * template: `
  6030. * <bank-account bank-name="RBC" account-id="4747"></bank-account>
  6031. * `,
  6032. * directives: [BankAccount]
  6033. * })
  6034. * class App {}
  6035. *
  6036. * bootstrap(App);
  6037. * ```
  6038. */
  6039. var InputMetadata = (function () {
  6040. function InputMetadata(
  6041. /**
  6042. * Name used when instantiating a component in the temlate.
  6043. */
  6044. bindingPropertyName) {
  6045. this.bindingPropertyName = bindingPropertyName;
  6046. }
  6047. InputMetadata = __decorate([
  6048. lang_1.CONST(),
  6049. __metadata('design:paramtypes', [String])
  6050. ], InputMetadata);
  6051. return InputMetadata;
  6052. })();
  6053. exports.InputMetadata = InputMetadata;
  6054. /**
  6055. * Declares an event-bound output property.
  6056. *
  6057. * When an output property emits an event, an event handler attached to that event
  6058. * the template is invoked.
  6059. *
  6060. * `OutputMetadata` takes an optional parameter that specifies the name
  6061. * used when instantiating a component in the template. When not provided,
  6062. * the name of the decorated property is used.
  6063. *
  6064. * ### Example
  6065. *
  6066. * ```typescript
  6067. * @Directive({
  6068. * selector: 'interval-dir',
  6069. * })
  6070. * class IntervalDir {
  6071. * @Output() everySecond = new EventEmitter();
  6072. * @Output('everyFiveSeconds') five5Secs = new EventEmitter();
  6073. *
  6074. * constructor() {
  6075. * setInterval(() => this.everySecond.emit("event"), 1000);
  6076. * setInterval(() => this.five5Secs.emit("event"), 5000);
  6077. * }
  6078. * }
  6079. *
  6080. * @Component({
  6081. * selector: 'app',
  6082. * template: `
  6083. * <interval-dir (every-second)="everySecond()" (every-five-seconds)="everyFiveSeconds()">
  6084. * </interval-dir>
  6085. * `,
  6086. * directives: [IntervalDir]
  6087. * })
  6088. * class App {
  6089. * everySecond() { console.log('second'); }
  6090. * everyFiveSeconds() { console.log('five seconds'); }
  6091. * }
  6092. * bootstrap(App);
  6093. * ```
  6094. */
  6095. var OutputMetadata = (function () {
  6096. function OutputMetadata(bindingPropertyName) {
  6097. this.bindingPropertyName = bindingPropertyName;
  6098. }
  6099. OutputMetadata = __decorate([
  6100. lang_1.CONST(),
  6101. __metadata('design:paramtypes', [String])
  6102. ], OutputMetadata);
  6103. return OutputMetadata;
  6104. })();
  6105. exports.OutputMetadata = OutputMetadata;
  6106. /**
  6107. * Declares a host property binding.
  6108. *
  6109. * Angular automatically checks host property bindings during change detection.
  6110. * If a binding changes, it will update the host element of the directive.
  6111. *
  6112. * `HostBindingMetadata` takes an optional parameter that specifies the property
  6113. * name of the host element that will be updated. When not provided,
  6114. * the class property name is used.
  6115. *
  6116. * ### Example
  6117. *
  6118. * The following example creates a directive that sets the `valid` and `invalid` classes
  6119. * on the DOM element that has ngModel directive on it.
  6120. *
  6121. * ```typescript
  6122. * @Directive({selector: '[ngModel]'})
  6123. * class NgModelStatus {
  6124. * constructor(public control:NgModel) {}
  6125. * @HostBinding('[class.valid]') get valid { return this.control.valid; }
  6126. * @HostBinding('[class.invalid]') get invalid { return this.control.invalid; }
  6127. * }
  6128. *
  6129. * @Component({
  6130. * selector: 'app',
  6131. * template: `<input [(ngModel)]="prop">`,
  6132. * directives: [FORM_DIRECTIVES, NgModelStatus]
  6133. * })
  6134. * class App {
  6135. * prop;
  6136. * }
  6137. *
  6138. * bootstrap(App);
  6139. * ```
  6140. */
  6141. var HostBindingMetadata = (function () {
  6142. function HostBindingMetadata(hostPropertyName) {
  6143. this.hostPropertyName = hostPropertyName;
  6144. }
  6145. HostBindingMetadata = __decorate([
  6146. lang_1.CONST(),
  6147. __metadata('design:paramtypes', [String])
  6148. ], HostBindingMetadata);
  6149. return HostBindingMetadata;
  6150. })();
  6151. exports.HostBindingMetadata = HostBindingMetadata;
  6152. /**
  6153. * Declares a host listener.
  6154. *
  6155. * Angular will invoke the decorated method when the host element emits the specified event.
  6156. *
  6157. * If the decorated method returns `false`, then `preventDefault` is applied on the DOM
  6158. * event.
  6159. *
  6160. * ### Example
  6161. *
  6162. * The following example declares a directive that attaches a click listener to the button and
  6163. * counts clicks.
  6164. *
  6165. * ```typescript
  6166. * @Directive({selector: 'button[counting]'})
  6167. * class CountClicks {
  6168. * numberOfClicks = 0;
  6169. *
  6170. * @HostListener('click', ['$event.target'])
  6171. * onClick(btn) {
  6172. * console.log("button", btn, "number of clicks:", this.numberOfClicks++);
  6173. * }
  6174. * }
  6175. *
  6176. * @Component({
  6177. * selector: 'app',
  6178. * template: `<button counting>Increment</button>`,
  6179. * directives: [CountClicks]
  6180. * })
  6181. * class App {}
  6182. *
  6183. * bootstrap(App);
  6184. * ```
  6185. */
  6186. var HostListenerMetadata = (function () {
  6187. function HostListenerMetadata(eventName, args) {
  6188. this.eventName = eventName;
  6189. this.args = args;
  6190. }
  6191. HostListenerMetadata = __decorate([
  6192. lang_1.CONST(),
  6193. __metadata('design:paramtypes', [String, Array])
  6194. ], HostListenerMetadata);
  6195. return HostListenerMetadata;
  6196. })();
  6197. exports.HostListenerMetadata = HostListenerMetadata;
  6198. /***/ },
  6199. /* 24 */
  6200. /***/ function(module, exports, __webpack_require__) {
  6201. /**
  6202. * @module
  6203. * @description
  6204. * Change detection enables data binding in Angular.
  6205. */
  6206. var change_detection_1 = __webpack_require__(25);
  6207. exports.ChangeDetectionStrategy = change_detection_1.ChangeDetectionStrategy;
  6208. exports.ExpressionChangedAfterItHasBeenCheckedException = change_detection_1.ExpressionChangedAfterItHasBeenCheckedException;
  6209. exports.ChangeDetectionError = change_detection_1.ChangeDetectionError;
  6210. exports.ChangeDetectorRef = change_detection_1.ChangeDetectorRef;
  6211. exports.WrappedValue = change_detection_1.WrappedValue;
  6212. exports.SimpleChange = change_detection_1.SimpleChange;
  6213. exports.IterableDiffers = change_detection_1.IterableDiffers;
  6214. exports.KeyValueDiffers = change_detection_1.KeyValueDiffers;
  6215. /***/ },
  6216. /* 25 */
  6217. /***/ function(module, exports, __webpack_require__) {
  6218. var iterable_differs_1 = __webpack_require__(26);
  6219. var default_iterable_differ_1 = __webpack_require__(27);
  6220. var keyvalue_differs_1 = __webpack_require__(28);
  6221. var default_keyvalue_differ_1 = __webpack_require__(29);
  6222. var lang_1 = __webpack_require__(5);
  6223. var ast_1 = __webpack_require__(30);
  6224. exports.ASTWithSource = ast_1.ASTWithSource;
  6225. exports.AST = ast_1.AST;
  6226. exports.AstTransformer = ast_1.AstTransformer;
  6227. exports.PropertyRead = ast_1.PropertyRead;
  6228. exports.LiteralArray = ast_1.LiteralArray;
  6229. exports.ImplicitReceiver = ast_1.ImplicitReceiver;
  6230. var lexer_1 = __webpack_require__(31);
  6231. exports.Lexer = lexer_1.Lexer;
  6232. var parser_1 = __webpack_require__(32);
  6233. exports.Parser = parser_1.Parser;
  6234. var locals_1 = __webpack_require__(33);
  6235. exports.Locals = locals_1.Locals;
  6236. var exceptions_1 = __webpack_require__(34);
  6237. exports.DehydratedException = exceptions_1.DehydratedException;
  6238. exports.ExpressionChangedAfterItHasBeenCheckedException = exceptions_1.ExpressionChangedAfterItHasBeenCheckedException;
  6239. exports.ChangeDetectionError = exceptions_1.ChangeDetectionError;
  6240. var interfaces_1 = __webpack_require__(35);
  6241. exports.ChangeDetectorDefinition = interfaces_1.ChangeDetectorDefinition;
  6242. exports.DebugContext = interfaces_1.DebugContext;
  6243. exports.ChangeDetectorGenConfig = interfaces_1.ChangeDetectorGenConfig;
  6244. var constants_1 = __webpack_require__(36);
  6245. exports.ChangeDetectionStrategy = constants_1.ChangeDetectionStrategy;
  6246. exports.CHANGE_DETECTION_STRATEGY_VALUES = constants_1.CHANGE_DETECTION_STRATEGY_VALUES;
  6247. var proto_change_detector_1 = __webpack_require__(37);
  6248. exports.DynamicProtoChangeDetector = proto_change_detector_1.DynamicProtoChangeDetector;
  6249. var jit_proto_change_detector_1 = __webpack_require__(51);
  6250. exports.JitProtoChangeDetector = jit_proto_change_detector_1.JitProtoChangeDetector;
  6251. var binding_record_1 = __webpack_require__(40);
  6252. exports.BindingRecord = binding_record_1.BindingRecord;
  6253. exports.BindingTarget = binding_record_1.BindingTarget;
  6254. var directive_record_1 = __webpack_require__(41);
  6255. exports.DirectiveIndex = directive_record_1.DirectiveIndex;
  6256. exports.DirectiveRecord = directive_record_1.DirectiveRecord;
  6257. var dynamic_change_detector_1 = __webpack_require__(42);
  6258. exports.DynamicChangeDetector = dynamic_change_detector_1.DynamicChangeDetector;
  6259. var change_detector_ref_1 = __webpack_require__(44);
  6260. exports.ChangeDetectorRef = change_detector_ref_1.ChangeDetectorRef;
  6261. var iterable_differs_2 = __webpack_require__(26);
  6262. exports.IterableDiffers = iterable_differs_2.IterableDiffers;
  6263. var keyvalue_differs_2 = __webpack_require__(28);
  6264. exports.KeyValueDiffers = keyvalue_differs_2.KeyValueDiffers;
  6265. var change_detection_util_1 = __webpack_require__(38);
  6266. exports.WrappedValue = change_detection_util_1.WrappedValue;
  6267. exports.SimpleChange = change_detection_util_1.SimpleChange;
  6268. /**
  6269. * Structural diffing for `Object`s and `Map`s.
  6270. */
  6271. exports.keyValDiff = lang_1.CONST_EXPR([lang_1.CONST_EXPR(new default_keyvalue_differ_1.DefaultKeyValueDifferFactory())]);
  6272. /**
  6273. * Structural diffing for `Iterable` types such as `Array`s.
  6274. */
  6275. exports.iterableDiff = lang_1.CONST_EXPR([lang_1.CONST_EXPR(new default_iterable_differ_1.DefaultIterableDifferFactory())]);
  6276. exports.defaultIterableDiffers = lang_1.CONST_EXPR(new iterable_differs_1.IterableDiffers(exports.iterableDiff));
  6277. exports.defaultKeyValueDiffers = lang_1.CONST_EXPR(new keyvalue_differs_1.KeyValueDiffers(exports.keyValDiff));
  6278. /***/ },
  6279. /* 26 */
  6280. /***/ function(module, exports, __webpack_require__) {
  6281. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  6282. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  6283. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  6284. 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;
  6285. return c > 3 && r && Object.defineProperty(target, key, r), r;
  6286. };
  6287. var __metadata = (this && this.__metadata) || function (k, v) {
  6288. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  6289. };
  6290. var lang_1 = __webpack_require__(5);
  6291. var exceptions_1 = __webpack_require__(14);
  6292. var collection_1 = __webpack_require__(12);
  6293. var di_1 = __webpack_require__(6);
  6294. /**
  6295. * A repository of different iterable diffing strategies used by NgFor, NgClass, and others.
  6296. */
  6297. var IterableDiffers = (function () {
  6298. function IterableDiffers(factories) {
  6299. this.factories = factories;
  6300. }
  6301. IterableDiffers.create = function (factories, parent) {
  6302. if (lang_1.isPresent(parent)) {
  6303. var copied = collection_1.ListWrapper.clone(parent.factories);
  6304. factories = factories.concat(copied);
  6305. return new IterableDiffers(factories);
  6306. }
  6307. else {
  6308. return new IterableDiffers(factories);
  6309. }
  6310. };
  6311. /**
  6312. * Takes an array of {@link IterableDifferFactory} and returns a provider used to extend the
  6313. * inherited {@link IterableDiffers} instance with the provided factories and return a new
  6314. * {@link IterableDiffers} instance.
  6315. *
  6316. * The following example shows how to extend an existing list of factories,
  6317. * which will only be applied to the injector for this component and its children.
  6318. * This step is all that's required to make a new {@link IterableDiffer} available.
  6319. *
  6320. * ### Example
  6321. *
  6322. * ```
  6323. * @Component({
  6324. * viewProviders: [
  6325. * IterableDiffers.extend([new ImmutableListDiffer()])
  6326. * ]
  6327. * })
  6328. * ```
  6329. */
  6330. IterableDiffers.extend = function (factories) {
  6331. return new di_1.Provider(IterableDiffers, {
  6332. useFactory: function (parent) {
  6333. if (lang_1.isBlank(parent)) {
  6334. // Typically would occur when calling IterableDiffers.extend inside of dependencies passed
  6335. // to
  6336. // bootstrap(), which would override default pipes instead of extending them.
  6337. throw new exceptions_1.BaseException('Cannot extend IterableDiffers without a parent injector');
  6338. }
  6339. return IterableDiffers.create(factories, parent);
  6340. },
  6341. // Dependency technically isn't optional, but we can provide a better error message this way.
  6342. deps: [[IterableDiffers, new di_1.SkipSelfMetadata(), new di_1.OptionalMetadata()]]
  6343. });
  6344. };
  6345. IterableDiffers.prototype.find = function (iterable) {
  6346. var factory = this.factories.find(function (f) { return f.supports(iterable); });
  6347. if (lang_1.isPresent(factory)) {
  6348. return factory;
  6349. }
  6350. else {
  6351. throw new exceptions_1.BaseException("Cannot find a differ supporting object '" + iterable + "'");
  6352. }
  6353. };
  6354. IterableDiffers = __decorate([
  6355. di_1.Injectable(),
  6356. lang_1.CONST(),
  6357. __metadata('design:paramtypes', [Array])
  6358. ], IterableDiffers);
  6359. return IterableDiffers;
  6360. })();
  6361. exports.IterableDiffers = IterableDiffers;
  6362. /***/ },
  6363. /* 27 */
  6364. /***/ function(module, exports, __webpack_require__) {
  6365. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  6366. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  6367. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  6368. 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;
  6369. return c > 3 && r && Object.defineProperty(target, key, r), r;
  6370. };
  6371. var __metadata = (this && this.__metadata) || function (k, v) {
  6372. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  6373. };
  6374. var lang_1 = __webpack_require__(5);
  6375. var exceptions_1 = __webpack_require__(14);
  6376. var collection_1 = __webpack_require__(12);
  6377. var lang_2 = __webpack_require__(5);
  6378. var DefaultIterableDifferFactory = (function () {
  6379. function DefaultIterableDifferFactory() {
  6380. }
  6381. DefaultIterableDifferFactory.prototype.supports = function (obj) { return collection_1.isListLikeIterable(obj); };
  6382. DefaultIterableDifferFactory.prototype.create = function (cdRef) { return new DefaultIterableDiffer(); };
  6383. DefaultIterableDifferFactory = __decorate([
  6384. lang_1.CONST(),
  6385. __metadata('design:paramtypes', [])
  6386. ], DefaultIterableDifferFactory);
  6387. return DefaultIterableDifferFactory;
  6388. })();
  6389. exports.DefaultIterableDifferFactory = DefaultIterableDifferFactory;
  6390. var DefaultIterableDiffer = (function () {
  6391. function DefaultIterableDiffer() {
  6392. this._collection = null;
  6393. this._length = null;
  6394. // Keeps track of the used records at any point in time (during & across `_check()` calls)
  6395. this._linkedRecords = null;
  6396. // Keeps track of the removed records at any point in time during `_check()` calls.
  6397. this._unlinkedRecords = null;
  6398. this._previousItHead = null;
  6399. this._itHead = null;
  6400. this._itTail = null;
  6401. this._additionsHead = null;
  6402. this._additionsTail = null;
  6403. this._movesHead = null;
  6404. this._movesTail = null;
  6405. this._removalsHead = null;
  6406. this._removalsTail = null;
  6407. }
  6408. Object.defineProperty(DefaultIterableDiffer.prototype, "collection", {
  6409. get: function () { return this._collection; },
  6410. enumerable: true,
  6411. configurable: true
  6412. });
  6413. Object.defineProperty(DefaultIterableDiffer.prototype, "length", {
  6414. get: function () { return this._length; },
  6415. enumerable: true,
  6416. configurable: true
  6417. });
  6418. DefaultIterableDiffer.prototype.forEachItem = function (fn) {
  6419. var record;
  6420. for (record = this._itHead; record !== null; record = record._next) {
  6421. fn(record);
  6422. }
  6423. };
  6424. DefaultIterableDiffer.prototype.forEachPreviousItem = function (fn) {
  6425. var record;
  6426. for (record = this._previousItHead; record !== null; record = record._nextPrevious) {
  6427. fn(record);
  6428. }
  6429. };
  6430. DefaultIterableDiffer.prototype.forEachAddedItem = function (fn) {
  6431. var record;
  6432. for (record = this._additionsHead; record !== null; record = record._nextAdded) {
  6433. fn(record);
  6434. }
  6435. };
  6436. DefaultIterableDiffer.prototype.forEachMovedItem = function (fn) {
  6437. var record;
  6438. for (record = this._movesHead; record !== null; record = record._nextMoved) {
  6439. fn(record);
  6440. }
  6441. };
  6442. DefaultIterableDiffer.prototype.forEachRemovedItem = function (fn) {
  6443. var record;
  6444. for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
  6445. fn(record);
  6446. }
  6447. };
  6448. DefaultIterableDiffer.prototype.diff = function (collection) {
  6449. if (lang_2.isBlank(collection))
  6450. collection = [];
  6451. if (!collection_1.isListLikeIterable(collection)) {
  6452. throw new exceptions_1.BaseException("Error trying to diff '" + collection + "'");
  6453. }
  6454. if (this.check(collection)) {
  6455. return this;
  6456. }
  6457. else {
  6458. return null;
  6459. }
  6460. };
  6461. DefaultIterableDiffer.prototype.onDestroy = function () { };
  6462. // todo(vicb): optim for UnmodifiableListView (frozen arrays)
  6463. DefaultIterableDiffer.prototype.check = function (collection) {
  6464. var _this = this;
  6465. this._reset();
  6466. var record = this._itHead;
  6467. var mayBeDirty = false;
  6468. var index;
  6469. var item;
  6470. if (lang_2.isArray(collection)) {
  6471. var list = collection;
  6472. this._length = collection.length;
  6473. for (index = 0; index < this._length; index++) {
  6474. item = list[index];
  6475. if (record === null || !lang_2.looseIdentical(record.item, item)) {
  6476. record = this._mismatch(record, item, index);
  6477. mayBeDirty = true;
  6478. }
  6479. else if (mayBeDirty) {
  6480. // TODO(misko): can we limit this to duplicates only?
  6481. record = this._verifyReinsertion(record, item, index);
  6482. }
  6483. record = record._next;
  6484. }
  6485. }
  6486. else {
  6487. index = 0;
  6488. collection_1.iterateListLike(collection, function (item) {
  6489. if (record === null || !lang_2.looseIdentical(record.item, item)) {
  6490. record = _this._mismatch(record, item, index);
  6491. mayBeDirty = true;
  6492. }
  6493. else if (mayBeDirty) {
  6494. // TODO(misko): can we limit this to duplicates only?
  6495. record = _this._verifyReinsertion(record, item, index);
  6496. }
  6497. record = record._next;
  6498. index++;
  6499. });
  6500. this._length = index;
  6501. }
  6502. this._truncate(record);
  6503. this._collection = collection;
  6504. return this.isDirty;
  6505. };
  6506. Object.defineProperty(DefaultIterableDiffer.prototype, "isDirty", {
  6507. // CollectionChanges is considered dirty if it has any additions, moves or removals.
  6508. get: function () {
  6509. return this._additionsHead !== null || this._movesHead !== null || this._removalsHead !== null;
  6510. },
  6511. enumerable: true,
  6512. configurable: true
  6513. });
  6514. /**
  6515. * Reset the state of the change objects to show no changes. This means set previousKey to
  6516. * currentKey, and clear all of the queues (additions, moves, removals).
  6517. * Set the previousIndexes of moved and added items to their currentIndexes
  6518. * Reset the list of additions, moves and removals
  6519. *
  6520. * @internal
  6521. */
  6522. DefaultIterableDiffer.prototype._reset = function () {
  6523. if (this.isDirty) {
  6524. var record;
  6525. var nextRecord;
  6526. for (record = this._previousItHead = this._itHead; record !== null; record = record._next) {
  6527. record._nextPrevious = record._next;
  6528. }
  6529. for (record = this._additionsHead; record !== null; record = record._nextAdded) {
  6530. record.previousIndex = record.currentIndex;
  6531. }
  6532. this._additionsHead = this._additionsTail = null;
  6533. for (record = this._movesHead; record !== null; record = nextRecord) {
  6534. record.previousIndex = record.currentIndex;
  6535. nextRecord = record._nextMoved;
  6536. }
  6537. this._movesHead = this._movesTail = null;
  6538. this._removalsHead = this._removalsTail = null;
  6539. }
  6540. };
  6541. /**
  6542. * This is the core function which handles differences between collections.
  6543. *
  6544. * - `record` is the record which we saw at this position last time. If null then it is a new
  6545. * item.
  6546. * - `item` is the current item in the collection
  6547. * - `index` is the position of the item in the collection
  6548. *
  6549. * @internal
  6550. */
  6551. DefaultIterableDiffer.prototype._mismatch = function (record, item, index) {
  6552. // The previous record after which we will append the current one.
  6553. var previousRecord;
  6554. if (record === null) {
  6555. previousRecord = this._itTail;
  6556. }
  6557. else {
  6558. previousRecord = record._prev;
  6559. // Remove the record from the collection since we know it does not match the item.
  6560. this._remove(record);
  6561. }
  6562. // Attempt to see if we have seen the item before.
  6563. record = this._linkedRecords === null ? null : this._linkedRecords.get(item, index);
  6564. if (record !== null) {
  6565. // We have seen this before, we need to move it forward in the collection.
  6566. this._moveAfter(record, previousRecord, index);
  6567. }
  6568. else {
  6569. // Never seen it, check evicted list.
  6570. record = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(item);
  6571. if (record !== null) {
  6572. // It is an item which we have evicted earlier: reinsert it back into the list.
  6573. this._reinsertAfter(record, previousRecord, index);
  6574. }
  6575. else {
  6576. // It is a new item: add it.
  6577. record = this._addAfter(new CollectionChangeRecord(item), previousRecord, index);
  6578. }
  6579. }
  6580. return record;
  6581. };
  6582. /**
  6583. * This check is only needed if an array contains duplicates. (Short circuit of nothing dirty)
  6584. *
  6585. * Use case: `[a, a]` => `[b, a, a]`
  6586. *
  6587. * If we did not have this check then the insertion of `b` would:
  6588. * 1) evict first `a`
  6589. * 2) insert `b` at `0` index.
  6590. * 3) leave `a` at index `1` as is. <-- this is wrong!
  6591. * 3) reinsert `a` at index 2. <-- this is wrong!
  6592. *
  6593. * The correct behavior is:
  6594. * 1) evict first `a`
  6595. * 2) insert `b` at `0` index.
  6596. * 3) reinsert `a` at index 1.
  6597. * 3) move `a` at from `1` to `2`.
  6598. *
  6599. *
  6600. * Double check that we have not evicted a duplicate item. We need to check if the item type may
  6601. * have already been removed:
  6602. * The insertion of b will evict the first 'a'. If we don't reinsert it now it will be reinserted
  6603. * at the end. Which will show up as the two 'a's switching position. This is incorrect, since a
  6604. * better way to think of it is as insert of 'b' rather then switch 'a' with 'b' and then add 'a'
  6605. * at the end.
  6606. *
  6607. * @internal
  6608. */
  6609. DefaultIterableDiffer.prototype._verifyReinsertion = function (record, item, index) {
  6610. var reinsertRecord = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(item);
  6611. if (reinsertRecord !== null) {
  6612. record = this._reinsertAfter(reinsertRecord, record._prev, index);
  6613. }
  6614. else if (record.currentIndex != index) {
  6615. record.currentIndex = index;
  6616. this._addToMoves(record, index);
  6617. }
  6618. return record;
  6619. };
  6620. /**
  6621. * Get rid of any excess {@link CollectionChangeRecord}s from the previous collection
  6622. *
  6623. * - `record` The first excess {@link CollectionChangeRecord}.
  6624. *
  6625. * @internal
  6626. */
  6627. DefaultIterableDiffer.prototype._truncate = function (record) {
  6628. // Anything after that needs to be removed;
  6629. while (record !== null) {
  6630. var nextRecord = record._next;
  6631. this._addToRemovals(this._unlink(record));
  6632. record = nextRecord;
  6633. }
  6634. if (this._unlinkedRecords !== null) {
  6635. this._unlinkedRecords.clear();
  6636. }
  6637. if (this._additionsTail !== null) {
  6638. this._additionsTail._nextAdded = null;
  6639. }
  6640. if (this._movesTail !== null) {
  6641. this._movesTail._nextMoved = null;
  6642. }
  6643. if (this._itTail !== null) {
  6644. this._itTail._next = null;
  6645. }
  6646. if (this._removalsTail !== null) {
  6647. this._removalsTail._nextRemoved = null;
  6648. }
  6649. };
  6650. /** @internal */
  6651. DefaultIterableDiffer.prototype._reinsertAfter = function (record, prevRecord, index) {
  6652. if (this._unlinkedRecords !== null) {
  6653. this._unlinkedRecords.remove(record);
  6654. }
  6655. var prev = record._prevRemoved;
  6656. var next = record._nextRemoved;
  6657. if (prev === null) {
  6658. this._removalsHead = next;
  6659. }
  6660. else {
  6661. prev._nextRemoved = next;
  6662. }
  6663. if (next === null) {
  6664. this._removalsTail = prev;
  6665. }
  6666. else {
  6667. next._prevRemoved = prev;
  6668. }
  6669. this._insertAfter(record, prevRecord, index);
  6670. this._addToMoves(record, index);
  6671. return record;
  6672. };
  6673. /** @internal */
  6674. DefaultIterableDiffer.prototype._moveAfter = function (record, prevRecord, index) {
  6675. this._unlink(record);
  6676. this._insertAfter(record, prevRecord, index);
  6677. this._addToMoves(record, index);
  6678. return record;
  6679. };
  6680. /** @internal */
  6681. DefaultIterableDiffer.prototype._addAfter = function (record, prevRecord, index) {
  6682. this._insertAfter(record, prevRecord, index);
  6683. if (this._additionsTail === null) {
  6684. // todo(vicb)
  6685. // assert(this._additionsHead === null);
  6686. this._additionsTail = this._additionsHead = record;
  6687. }
  6688. else {
  6689. // todo(vicb)
  6690. // assert(_additionsTail._nextAdded === null);
  6691. // assert(record._nextAdded === null);
  6692. this._additionsTail = this._additionsTail._nextAdded = record;
  6693. }
  6694. return record;
  6695. };
  6696. /** @internal */
  6697. DefaultIterableDiffer.prototype._insertAfter = function (record, prevRecord, index) {
  6698. // todo(vicb)
  6699. // assert(record != prevRecord);
  6700. // assert(record._next === null);
  6701. // assert(record._prev === null);
  6702. var next = prevRecord === null ? this._itHead : prevRecord._next;
  6703. // todo(vicb)
  6704. // assert(next != record);
  6705. // assert(prevRecord != record);
  6706. record._next = next;
  6707. record._prev = prevRecord;
  6708. if (next === null) {
  6709. this._itTail = record;
  6710. }
  6711. else {
  6712. next._prev = record;
  6713. }
  6714. if (prevRecord === null) {
  6715. this._itHead = record;
  6716. }
  6717. else {
  6718. prevRecord._next = record;
  6719. }
  6720. if (this._linkedRecords === null) {
  6721. this._linkedRecords = new _DuplicateMap();
  6722. }
  6723. this._linkedRecords.put(record);
  6724. record.currentIndex = index;
  6725. return record;
  6726. };
  6727. /** @internal */
  6728. DefaultIterableDiffer.prototype._remove = function (record) {
  6729. return this._addToRemovals(this._unlink(record));
  6730. };
  6731. /** @internal */
  6732. DefaultIterableDiffer.prototype._unlink = function (record) {
  6733. if (this._linkedRecords !== null) {
  6734. this._linkedRecords.remove(record);
  6735. }
  6736. var prev = record._prev;
  6737. var next = record._next;
  6738. // todo(vicb)
  6739. // assert((record._prev = null) === null);
  6740. // assert((record._next = null) === null);
  6741. if (prev === null) {
  6742. this._itHead = next;
  6743. }
  6744. else {
  6745. prev._next = next;
  6746. }
  6747. if (next === null) {
  6748. this._itTail = prev;
  6749. }
  6750. else {
  6751. next._prev = prev;
  6752. }
  6753. return record;
  6754. };
  6755. /** @internal */
  6756. DefaultIterableDiffer.prototype._addToMoves = function (record, toIndex) {
  6757. // todo(vicb)
  6758. // assert(record._nextMoved === null);
  6759. if (record.previousIndex === toIndex) {
  6760. return record;
  6761. }
  6762. if (this._movesTail === null) {
  6763. // todo(vicb)
  6764. // assert(_movesHead === null);
  6765. this._movesTail = this._movesHead = record;
  6766. }
  6767. else {
  6768. // todo(vicb)
  6769. // assert(_movesTail._nextMoved === null);
  6770. this._movesTail = this._movesTail._nextMoved = record;
  6771. }
  6772. return record;
  6773. };
  6774. /** @internal */
  6775. DefaultIterableDiffer.prototype._addToRemovals = function (record) {
  6776. if (this._unlinkedRecords === null) {
  6777. this._unlinkedRecords = new _DuplicateMap();
  6778. }
  6779. this._unlinkedRecords.put(record);
  6780. record.currentIndex = null;
  6781. record._nextRemoved = null;
  6782. if (this._removalsTail === null) {
  6783. // todo(vicb)
  6784. // assert(_removalsHead === null);
  6785. this._removalsTail = this._removalsHead = record;
  6786. record._prevRemoved = null;
  6787. }
  6788. else {
  6789. // todo(vicb)
  6790. // assert(_removalsTail._nextRemoved === null);
  6791. // assert(record._nextRemoved === null);
  6792. record._prevRemoved = this._removalsTail;
  6793. this._removalsTail = this._removalsTail._nextRemoved = record;
  6794. }
  6795. return record;
  6796. };
  6797. DefaultIterableDiffer.prototype.toString = function () {
  6798. var record;
  6799. var list = [];
  6800. for (record = this._itHead; record !== null; record = record._next) {
  6801. list.push(record);
  6802. }
  6803. var previous = [];
  6804. for (record = this._previousItHead; record !== null; record = record._nextPrevious) {
  6805. previous.push(record);
  6806. }
  6807. var additions = [];
  6808. for (record = this._additionsHead; record !== null; record = record._nextAdded) {
  6809. additions.push(record);
  6810. }
  6811. var moves = [];
  6812. for (record = this._movesHead; record !== null; record = record._nextMoved) {
  6813. moves.push(record);
  6814. }
  6815. var removals = [];
  6816. for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
  6817. removals.push(record);
  6818. }
  6819. return "collection: " + list.join(', ') + "\n" + "previous: " + previous.join(', ') + "\n" +
  6820. "additions: " + additions.join(', ') + "\n" + "moves: " + moves.join(', ') + "\n" +
  6821. "removals: " + removals.join(', ') + "\n";
  6822. };
  6823. return DefaultIterableDiffer;
  6824. })();
  6825. exports.DefaultIterableDiffer = DefaultIterableDiffer;
  6826. var CollectionChangeRecord = (function () {
  6827. function CollectionChangeRecord(item) {
  6828. this.item = item;
  6829. this.currentIndex = null;
  6830. this.previousIndex = null;
  6831. /** @internal */
  6832. this._nextPrevious = null;
  6833. /** @internal */
  6834. this._prev = null;
  6835. /** @internal */
  6836. this._next = null;
  6837. /** @internal */
  6838. this._prevDup = null;
  6839. /** @internal */
  6840. this._nextDup = null;
  6841. /** @internal */
  6842. this._prevRemoved = null;
  6843. /** @internal */
  6844. this._nextRemoved = null;
  6845. /** @internal */
  6846. this._nextAdded = null;
  6847. /** @internal */
  6848. this._nextMoved = null;
  6849. }
  6850. CollectionChangeRecord.prototype.toString = function () {
  6851. return this.previousIndex === this.currentIndex ?
  6852. lang_2.stringify(this.item) :
  6853. lang_2.stringify(this.item) + '[' + lang_2.stringify(this.previousIndex) + '->' +
  6854. lang_2.stringify(this.currentIndex) + ']';
  6855. };
  6856. return CollectionChangeRecord;
  6857. })();
  6858. exports.CollectionChangeRecord = CollectionChangeRecord;
  6859. // A linked list of CollectionChangeRecords with the same CollectionChangeRecord.item
  6860. var _DuplicateItemRecordList = (function () {
  6861. function _DuplicateItemRecordList() {
  6862. /** @internal */
  6863. this._head = null;
  6864. /** @internal */
  6865. this._tail = null;
  6866. }
  6867. /**
  6868. * Append the record to the list of duplicates.
  6869. *
  6870. * Note: by design all records in the list of duplicates hold the same value in record.item.
  6871. */
  6872. _DuplicateItemRecordList.prototype.add = function (record) {
  6873. if (this._head === null) {
  6874. this._head = this._tail = record;
  6875. record._nextDup = null;
  6876. record._prevDup = null;
  6877. }
  6878. else {
  6879. // todo(vicb)
  6880. // assert(record.item == _head.item ||
  6881. // record.item is num && record.item.isNaN && _head.item is num && _head.item.isNaN);
  6882. this._tail._nextDup = record;
  6883. record._prevDup = this._tail;
  6884. record._nextDup = null;
  6885. this._tail = record;
  6886. }
  6887. };
  6888. // Returns a CollectionChangeRecord having CollectionChangeRecord.item == item and
  6889. // CollectionChangeRecord.currentIndex >= afterIndex
  6890. _DuplicateItemRecordList.prototype.get = function (item, afterIndex) {
  6891. var record;
  6892. for (record = this._head; record !== null; record = record._nextDup) {
  6893. if ((afterIndex === null || afterIndex < record.currentIndex) &&
  6894. lang_2.looseIdentical(record.item, item)) {
  6895. return record;
  6896. }
  6897. }
  6898. return null;
  6899. };
  6900. /**
  6901. * Remove one {@link CollectionChangeRecord} from the list of duplicates.
  6902. *
  6903. * Returns whether the list of duplicates is empty.
  6904. */
  6905. _DuplicateItemRecordList.prototype.remove = function (record) {
  6906. // todo(vicb)
  6907. // assert(() {
  6908. // // verify that the record being removed is in the list.
  6909. // for (CollectionChangeRecord cursor = _head; cursor != null; cursor = cursor._nextDup) {
  6910. // if (identical(cursor, record)) return true;
  6911. // }
  6912. // return false;
  6913. //});
  6914. var prev = record._prevDup;
  6915. var next = record._nextDup;
  6916. if (prev === null) {
  6917. this._head = next;
  6918. }
  6919. else {
  6920. prev._nextDup = next;
  6921. }
  6922. if (next === null) {
  6923. this._tail = prev;
  6924. }
  6925. else {
  6926. next._prevDup = prev;
  6927. }
  6928. return this._head === null;
  6929. };
  6930. return _DuplicateItemRecordList;
  6931. })();
  6932. var _DuplicateMap = (function () {
  6933. function _DuplicateMap() {
  6934. this.map = new Map();
  6935. }
  6936. _DuplicateMap.prototype.put = function (record) {
  6937. // todo(vicb) handle corner cases
  6938. var key = lang_2.getMapKey(record.item);
  6939. var duplicates = this.map.get(key);
  6940. if (!lang_2.isPresent(duplicates)) {
  6941. duplicates = new _DuplicateItemRecordList();
  6942. this.map.set(key, duplicates);
  6943. }
  6944. duplicates.add(record);
  6945. };
  6946. /**
  6947. * Retrieve the `value` using key. Because the CollectionChangeRecord value maybe one which we
  6948. * have already iterated over, we use the afterIndex to pretend it is not there.
  6949. *
  6950. * Use case: `[a, b, c, a, a]` if we are at index `3` which is the second `a` then asking if we
  6951. * have any more `a`s needs to return the last `a` not the first or second.
  6952. */
  6953. _DuplicateMap.prototype.get = function (value, afterIndex) {
  6954. if (afterIndex === void 0) { afterIndex = null; }
  6955. var key = lang_2.getMapKey(value);
  6956. var recordList = this.map.get(key);
  6957. return lang_2.isBlank(recordList) ? null : recordList.get(value, afterIndex);
  6958. };
  6959. /**
  6960. * Removes a {@link CollectionChangeRecord} from the list of duplicates.
  6961. *
  6962. * The list of duplicates also is removed from the map if it gets empty.
  6963. */
  6964. _DuplicateMap.prototype.remove = function (record) {
  6965. var key = lang_2.getMapKey(record.item);
  6966. // todo(vicb)
  6967. // assert(this.map.containsKey(key));
  6968. var recordList = this.map.get(key);
  6969. // Remove the list of duplicates when it gets empty
  6970. if (recordList.remove(record)) {
  6971. this.map.delete(key);
  6972. }
  6973. return record;
  6974. };
  6975. Object.defineProperty(_DuplicateMap.prototype, "isEmpty", {
  6976. get: function () { return this.map.size === 0; },
  6977. enumerable: true,
  6978. configurable: true
  6979. });
  6980. _DuplicateMap.prototype.clear = function () { this.map.clear(); };
  6981. _DuplicateMap.prototype.toString = function () { return '_DuplicateMap(' + lang_2.stringify(this.map) + ')'; };
  6982. return _DuplicateMap;
  6983. })();
  6984. /***/ },
  6985. /* 28 */
  6986. /***/ function(module, exports, __webpack_require__) {
  6987. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  6988. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  6989. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  6990. 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;
  6991. return c > 3 && r && Object.defineProperty(target, key, r), r;
  6992. };
  6993. var __metadata = (this && this.__metadata) || function (k, v) {
  6994. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  6995. };
  6996. var lang_1 = __webpack_require__(5);
  6997. var exceptions_1 = __webpack_require__(14);
  6998. var collection_1 = __webpack_require__(12);
  6999. var di_1 = __webpack_require__(6);
  7000. /**
  7001. * A repository of different Map diffing strategies used by NgClass, NgStyle, and others.
  7002. */
  7003. var KeyValueDiffers = (function () {
  7004. function KeyValueDiffers(factories) {
  7005. this.factories = factories;
  7006. }
  7007. KeyValueDiffers.create = function (factories, parent) {
  7008. if (lang_1.isPresent(parent)) {
  7009. var copied = collection_1.ListWrapper.clone(parent.factories);
  7010. factories = factories.concat(copied);
  7011. return new KeyValueDiffers(factories);
  7012. }
  7013. else {
  7014. return new KeyValueDiffers(factories);
  7015. }
  7016. };
  7017. /**
  7018. * Takes an array of {@link KeyValueDifferFactory} and returns a provider used to extend the
  7019. * inherited {@link KeyValueDiffers} instance with the provided factories and return a new
  7020. * {@link KeyValueDiffers} instance.
  7021. *
  7022. * The following example shows how to extend an existing list of factories,
  7023. * which will only be applied to the injector for this component and its children.
  7024. * This step is all that's required to make a new {@link KeyValueDiffer} available.
  7025. *
  7026. * ### Example
  7027. *
  7028. * ```
  7029. * @Component({
  7030. * viewProviders: [
  7031. * KeyValueDiffers.extend([new ImmutableMapDiffer()])
  7032. * ]
  7033. * })
  7034. * ```
  7035. */
  7036. KeyValueDiffers.extend = function (factories) {
  7037. return new di_1.Provider(KeyValueDiffers, {
  7038. useFactory: function (parent) {
  7039. if (lang_1.isBlank(parent)) {
  7040. // Typically would occur when calling KeyValueDiffers.extend inside of dependencies passed
  7041. // to
  7042. // bootstrap(), which would override default pipes instead of extending them.
  7043. throw new exceptions_1.BaseException('Cannot extend KeyValueDiffers without a parent injector');
  7044. }
  7045. return KeyValueDiffers.create(factories, parent);
  7046. },
  7047. // Dependency technically isn't optional, but we can provide a better error message this way.
  7048. deps: [[KeyValueDiffers, new di_1.SkipSelfMetadata(), new di_1.OptionalMetadata()]]
  7049. });
  7050. };
  7051. KeyValueDiffers.prototype.find = function (kv) {
  7052. var factory = this.factories.find(function (f) { return f.supports(kv); });
  7053. if (lang_1.isPresent(factory)) {
  7054. return factory;
  7055. }
  7056. else {
  7057. throw new exceptions_1.BaseException("Cannot find a differ supporting object '" + kv + "'");
  7058. }
  7059. };
  7060. KeyValueDiffers = __decorate([
  7061. di_1.Injectable(),
  7062. lang_1.CONST(),
  7063. __metadata('design:paramtypes', [Array])
  7064. ], KeyValueDiffers);
  7065. return KeyValueDiffers;
  7066. })();
  7067. exports.KeyValueDiffers = KeyValueDiffers;
  7068. /***/ },
  7069. /* 29 */
  7070. /***/ function(module, exports, __webpack_require__) {
  7071. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  7072. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  7073. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  7074. 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;
  7075. return c > 3 && r && Object.defineProperty(target, key, r), r;
  7076. };
  7077. var __metadata = (this && this.__metadata) || function (k, v) {
  7078. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  7079. };
  7080. var collection_1 = __webpack_require__(12);
  7081. var lang_1 = __webpack_require__(5);
  7082. var exceptions_1 = __webpack_require__(14);
  7083. var DefaultKeyValueDifferFactory = (function () {
  7084. function DefaultKeyValueDifferFactory() {
  7085. }
  7086. DefaultKeyValueDifferFactory.prototype.supports = function (obj) { return obj instanceof Map || lang_1.isJsObject(obj); };
  7087. DefaultKeyValueDifferFactory.prototype.create = function (cdRef) { return new DefaultKeyValueDiffer(); };
  7088. DefaultKeyValueDifferFactory = __decorate([
  7089. lang_1.CONST(),
  7090. __metadata('design:paramtypes', [])
  7091. ], DefaultKeyValueDifferFactory);
  7092. return DefaultKeyValueDifferFactory;
  7093. })();
  7094. exports.DefaultKeyValueDifferFactory = DefaultKeyValueDifferFactory;
  7095. var DefaultKeyValueDiffer = (function () {
  7096. function DefaultKeyValueDiffer() {
  7097. this._records = new Map();
  7098. this._mapHead = null;
  7099. this._previousMapHead = null;
  7100. this._changesHead = null;
  7101. this._changesTail = null;
  7102. this._additionsHead = null;
  7103. this._additionsTail = null;
  7104. this._removalsHead = null;
  7105. this._removalsTail = null;
  7106. }
  7107. Object.defineProperty(DefaultKeyValueDiffer.prototype, "isDirty", {
  7108. get: function () {
  7109. return this._additionsHead !== null || this._changesHead !== null ||
  7110. this._removalsHead !== null;
  7111. },
  7112. enumerable: true,
  7113. configurable: true
  7114. });
  7115. DefaultKeyValueDiffer.prototype.forEachItem = function (fn) {
  7116. var record;
  7117. for (record = this._mapHead; record !== null; record = record._next) {
  7118. fn(record);
  7119. }
  7120. };
  7121. DefaultKeyValueDiffer.prototype.forEachPreviousItem = function (fn) {
  7122. var record;
  7123. for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {
  7124. fn(record);
  7125. }
  7126. };
  7127. DefaultKeyValueDiffer.prototype.forEachChangedItem = function (fn) {
  7128. var record;
  7129. for (record = this._changesHead; record !== null; record = record._nextChanged) {
  7130. fn(record);
  7131. }
  7132. };
  7133. DefaultKeyValueDiffer.prototype.forEachAddedItem = function (fn) {
  7134. var record;
  7135. for (record = this._additionsHead; record !== null; record = record._nextAdded) {
  7136. fn(record);
  7137. }
  7138. };
  7139. DefaultKeyValueDiffer.prototype.forEachRemovedItem = function (fn) {
  7140. var record;
  7141. for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
  7142. fn(record);
  7143. }
  7144. };
  7145. DefaultKeyValueDiffer.prototype.diff = function (map) {
  7146. if (lang_1.isBlank(map))
  7147. map = collection_1.MapWrapper.createFromPairs([]);
  7148. if (!(map instanceof Map || lang_1.isJsObject(map))) {
  7149. throw new exceptions_1.BaseException("Error trying to diff '" + map + "'");
  7150. }
  7151. if (this.check(map)) {
  7152. return this;
  7153. }
  7154. else {
  7155. return null;
  7156. }
  7157. };
  7158. DefaultKeyValueDiffer.prototype.onDestroy = function () { };
  7159. DefaultKeyValueDiffer.prototype.check = function (map) {
  7160. var _this = this;
  7161. this._reset();
  7162. var records = this._records;
  7163. var oldSeqRecord = this._mapHead;
  7164. var lastOldSeqRecord = null;
  7165. var lastNewSeqRecord = null;
  7166. var seqChanged = false;
  7167. this._forEach(map, function (value, key) {
  7168. var newSeqRecord;
  7169. if (oldSeqRecord !== null && key === oldSeqRecord.key) {
  7170. newSeqRecord = oldSeqRecord;
  7171. if (!lang_1.looseIdentical(value, oldSeqRecord.currentValue)) {
  7172. oldSeqRecord.previousValue = oldSeqRecord.currentValue;
  7173. oldSeqRecord.currentValue = value;
  7174. _this._addToChanges(oldSeqRecord);
  7175. }
  7176. }
  7177. else {
  7178. seqChanged = true;
  7179. if (oldSeqRecord !== null) {
  7180. oldSeqRecord._next = null;
  7181. _this._removeFromSeq(lastOldSeqRecord, oldSeqRecord);
  7182. _this._addToRemovals(oldSeqRecord);
  7183. }
  7184. if (records.has(key)) {
  7185. newSeqRecord = records.get(key);
  7186. }
  7187. else {
  7188. newSeqRecord = new KVChangeRecord(key);
  7189. records.set(key, newSeqRecord);
  7190. newSeqRecord.currentValue = value;
  7191. _this._addToAdditions(newSeqRecord);
  7192. }
  7193. }
  7194. if (seqChanged) {
  7195. if (_this._isInRemovals(newSeqRecord)) {
  7196. _this._removeFromRemovals(newSeqRecord);
  7197. }
  7198. if (lastNewSeqRecord == null) {
  7199. _this._mapHead = newSeqRecord;
  7200. }
  7201. else {
  7202. lastNewSeqRecord._next = newSeqRecord;
  7203. }
  7204. }
  7205. lastOldSeqRecord = oldSeqRecord;
  7206. lastNewSeqRecord = newSeqRecord;
  7207. oldSeqRecord = oldSeqRecord === null ? null : oldSeqRecord._next;
  7208. });
  7209. this._truncate(lastOldSeqRecord, oldSeqRecord);
  7210. return this.isDirty;
  7211. };
  7212. /** @internal */
  7213. DefaultKeyValueDiffer.prototype._reset = function () {
  7214. if (this.isDirty) {
  7215. var record;
  7216. // Record the state of the mapping
  7217. for (record = this._previousMapHead = this._mapHead; record !== null; record = record._next) {
  7218. record._nextPrevious = record._next;
  7219. }
  7220. for (record = this._changesHead; record !== null; record = record._nextChanged) {
  7221. record.previousValue = record.currentValue;
  7222. }
  7223. for (record = this._additionsHead; record != null; record = record._nextAdded) {
  7224. record.previousValue = record.currentValue;
  7225. }
  7226. // todo(vicb) once assert is supported
  7227. // assert(() {
  7228. // var r = _changesHead;
  7229. // while (r != null) {
  7230. // var nextRecord = r._nextChanged;
  7231. // r._nextChanged = null;
  7232. // r = nextRecord;
  7233. // }
  7234. //
  7235. // r = _additionsHead;
  7236. // while (r != null) {
  7237. // var nextRecord = r._nextAdded;
  7238. // r._nextAdded = null;
  7239. // r = nextRecord;
  7240. // }
  7241. //
  7242. // r = _removalsHead;
  7243. // while (r != null) {
  7244. // var nextRecord = r._nextRemoved;
  7245. // r._nextRemoved = null;
  7246. // r = nextRecord;
  7247. // }
  7248. //
  7249. // return true;
  7250. //});
  7251. this._changesHead = this._changesTail = null;
  7252. this._additionsHead = this._additionsTail = null;
  7253. this._removalsHead = this._removalsTail = null;
  7254. }
  7255. };
  7256. /** @internal */
  7257. DefaultKeyValueDiffer.prototype._truncate = function (lastRecord, record) {
  7258. while (record !== null) {
  7259. if (lastRecord === null) {
  7260. this._mapHead = null;
  7261. }
  7262. else {
  7263. lastRecord._next = null;
  7264. }
  7265. var nextRecord = record._next;
  7266. // todo(vicb) assert
  7267. // assert((() {
  7268. // record._next = null;
  7269. // return true;
  7270. //}));
  7271. this._addToRemovals(record);
  7272. lastRecord = record;
  7273. record = nextRecord;
  7274. }
  7275. for (var rec = this._removalsHead; rec !== null; rec = rec._nextRemoved) {
  7276. rec.previousValue = rec.currentValue;
  7277. rec.currentValue = null;
  7278. this._records.delete(rec.key);
  7279. }
  7280. };
  7281. /** @internal */
  7282. DefaultKeyValueDiffer.prototype._isInRemovals = function (record) {
  7283. return record === this._removalsHead || record._nextRemoved !== null ||
  7284. record._prevRemoved !== null;
  7285. };
  7286. /** @internal */
  7287. DefaultKeyValueDiffer.prototype._addToRemovals = function (record) {
  7288. // todo(vicb) assert
  7289. // assert(record._next == null);
  7290. // assert(record._nextAdded == null);
  7291. // assert(record._nextChanged == null);
  7292. // assert(record._nextRemoved == null);
  7293. // assert(record._prevRemoved == null);
  7294. if (this._removalsHead === null) {
  7295. this._removalsHead = this._removalsTail = record;
  7296. }
  7297. else {
  7298. this._removalsTail._nextRemoved = record;
  7299. record._prevRemoved = this._removalsTail;
  7300. this._removalsTail = record;
  7301. }
  7302. };
  7303. /** @internal */
  7304. DefaultKeyValueDiffer.prototype._removeFromSeq = function (prev, record) {
  7305. var next = record._next;
  7306. if (prev === null) {
  7307. this._mapHead = next;
  7308. }
  7309. else {
  7310. prev._next = next;
  7311. }
  7312. // todo(vicb) assert
  7313. // assert((() {
  7314. // record._next = null;
  7315. // return true;
  7316. //})());
  7317. };
  7318. /** @internal */
  7319. DefaultKeyValueDiffer.prototype._removeFromRemovals = function (record) {
  7320. // todo(vicb) assert
  7321. // assert(record._next == null);
  7322. // assert(record._nextAdded == null);
  7323. // assert(record._nextChanged == null);
  7324. var prev = record._prevRemoved;
  7325. var next = record._nextRemoved;
  7326. if (prev === null) {
  7327. this._removalsHead = next;
  7328. }
  7329. else {
  7330. prev._nextRemoved = next;
  7331. }
  7332. if (next === null) {
  7333. this._removalsTail = prev;
  7334. }
  7335. else {
  7336. next._prevRemoved = prev;
  7337. }
  7338. record._prevRemoved = record._nextRemoved = null;
  7339. };
  7340. /** @internal */
  7341. DefaultKeyValueDiffer.prototype._addToAdditions = function (record) {
  7342. // todo(vicb): assert
  7343. // assert(record._next == null);
  7344. // assert(record._nextAdded == null);
  7345. // assert(record._nextChanged == null);
  7346. // assert(record._nextRemoved == null);
  7347. // assert(record._prevRemoved == null);
  7348. if (this._additionsHead === null) {
  7349. this._additionsHead = this._additionsTail = record;
  7350. }
  7351. else {
  7352. this._additionsTail._nextAdded = record;
  7353. this._additionsTail = record;
  7354. }
  7355. };
  7356. /** @internal */
  7357. DefaultKeyValueDiffer.prototype._addToChanges = function (record) {
  7358. // todo(vicb) assert
  7359. // assert(record._nextAdded == null);
  7360. // assert(record._nextChanged == null);
  7361. // assert(record._nextRemoved == null);
  7362. // assert(record._prevRemoved == null);
  7363. if (this._changesHead === null) {
  7364. this._changesHead = this._changesTail = record;
  7365. }
  7366. else {
  7367. this._changesTail._nextChanged = record;
  7368. this._changesTail = record;
  7369. }
  7370. };
  7371. DefaultKeyValueDiffer.prototype.toString = function () {
  7372. var items = [];
  7373. var previous = [];
  7374. var changes = [];
  7375. var additions = [];
  7376. var removals = [];
  7377. var record;
  7378. for (record = this._mapHead; record !== null; record = record._next) {
  7379. items.push(lang_1.stringify(record));
  7380. }
  7381. for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {
  7382. previous.push(lang_1.stringify(record));
  7383. }
  7384. for (record = this._changesHead; record !== null; record = record._nextChanged) {
  7385. changes.push(lang_1.stringify(record));
  7386. }
  7387. for (record = this._additionsHead; record !== null; record = record._nextAdded) {
  7388. additions.push(lang_1.stringify(record));
  7389. }
  7390. for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
  7391. removals.push(lang_1.stringify(record));
  7392. }
  7393. return "map: " + items.join(', ') + "\n" + "previous: " + previous.join(', ') + "\n" +
  7394. "additions: " + additions.join(', ') + "\n" + "changes: " + changes.join(', ') + "\n" +
  7395. "removals: " + removals.join(', ') + "\n";
  7396. };
  7397. /** @internal */
  7398. DefaultKeyValueDiffer.prototype._forEach = function (obj, fn) {
  7399. if (obj instanceof Map) {
  7400. obj.forEach(fn);
  7401. }
  7402. else {
  7403. collection_1.StringMapWrapper.forEach(obj, fn);
  7404. }
  7405. };
  7406. return DefaultKeyValueDiffer;
  7407. })();
  7408. exports.DefaultKeyValueDiffer = DefaultKeyValueDiffer;
  7409. var KVChangeRecord = (function () {
  7410. function KVChangeRecord(key) {
  7411. this.key = key;
  7412. this.previousValue = null;
  7413. this.currentValue = null;
  7414. /** @internal */
  7415. this._nextPrevious = null;
  7416. /** @internal */
  7417. this._next = null;
  7418. /** @internal */
  7419. this._nextAdded = null;
  7420. /** @internal */
  7421. this._nextRemoved = null;
  7422. /** @internal */
  7423. this._prevRemoved = null;
  7424. /** @internal */
  7425. this._nextChanged = null;
  7426. }
  7427. KVChangeRecord.prototype.toString = function () {
  7428. return lang_1.looseIdentical(this.previousValue, this.currentValue) ?
  7429. lang_1.stringify(this.key) :
  7430. (lang_1.stringify(this.key) + '[' + lang_1.stringify(this.previousValue) + '->' +
  7431. lang_1.stringify(this.currentValue) + ']');
  7432. };
  7433. return KVChangeRecord;
  7434. })();
  7435. exports.KVChangeRecord = KVChangeRecord;
  7436. /***/ },
  7437. /* 30 */
  7438. /***/ function(module, exports, __webpack_require__) {
  7439. var __extends = (this && this.__extends) || function (d, b) {
  7440. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  7441. function __() { this.constructor = d; }
  7442. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  7443. };
  7444. var collection_1 = __webpack_require__(12);
  7445. var AST = (function () {
  7446. function AST() {
  7447. }
  7448. AST.prototype.visit = function (visitor) { return null; };
  7449. AST.prototype.toString = function () { return "AST"; };
  7450. return AST;
  7451. })();
  7452. exports.AST = AST;
  7453. /**
  7454. * Represents a quoted expression of the form:
  7455. *
  7456. * quote = prefix `:` uninterpretedExpression
  7457. * prefix = identifier
  7458. * uninterpretedExpression = arbitrary string
  7459. *
  7460. * A quoted expression is meant to be pre-processed by an AST transformer that
  7461. * converts it into another AST that no longer contains quoted expressions.
  7462. * It is meant to allow third-party developers to extend Angular template
  7463. * expression language. The `uninterpretedExpression` part of the quote is
  7464. * therefore not interpreted by the Angular's own expression parser.
  7465. */
  7466. var Quote = (function (_super) {
  7467. __extends(Quote, _super);
  7468. function Quote(prefix, uninterpretedExpression, location) {
  7469. _super.call(this);
  7470. this.prefix = prefix;
  7471. this.uninterpretedExpression = uninterpretedExpression;
  7472. this.location = location;
  7473. }
  7474. Quote.prototype.visit = function (visitor) { return visitor.visitQuote(this); };
  7475. Quote.prototype.toString = function () { return "Quote"; };
  7476. return Quote;
  7477. })(AST);
  7478. exports.Quote = Quote;
  7479. var EmptyExpr = (function (_super) {
  7480. __extends(EmptyExpr, _super);
  7481. function EmptyExpr() {
  7482. _super.apply(this, arguments);
  7483. }
  7484. EmptyExpr.prototype.visit = function (visitor) {
  7485. // do nothing
  7486. };
  7487. return EmptyExpr;
  7488. })(AST);
  7489. exports.EmptyExpr = EmptyExpr;
  7490. var ImplicitReceiver = (function (_super) {
  7491. __extends(ImplicitReceiver, _super);
  7492. function ImplicitReceiver() {
  7493. _super.apply(this, arguments);
  7494. }
  7495. ImplicitReceiver.prototype.visit = function (visitor) { return visitor.visitImplicitReceiver(this); };
  7496. return ImplicitReceiver;
  7497. })(AST);
  7498. exports.ImplicitReceiver = ImplicitReceiver;
  7499. /**
  7500. * Multiple expressions separated by a semicolon.
  7501. */
  7502. var Chain = (function (_super) {
  7503. __extends(Chain, _super);
  7504. function Chain(expressions) {
  7505. _super.call(this);
  7506. this.expressions = expressions;
  7507. }
  7508. Chain.prototype.visit = function (visitor) { return visitor.visitChain(this); };
  7509. return Chain;
  7510. })(AST);
  7511. exports.Chain = Chain;
  7512. var Conditional = (function (_super) {
  7513. __extends(Conditional, _super);
  7514. function Conditional(condition, trueExp, falseExp) {
  7515. _super.call(this);
  7516. this.condition = condition;
  7517. this.trueExp = trueExp;
  7518. this.falseExp = falseExp;
  7519. }
  7520. Conditional.prototype.visit = function (visitor) { return visitor.visitConditional(this); };
  7521. return Conditional;
  7522. })(AST);
  7523. exports.Conditional = Conditional;
  7524. var PropertyRead = (function (_super) {
  7525. __extends(PropertyRead, _super);
  7526. function PropertyRead(receiver, name, getter) {
  7527. _super.call(this);
  7528. this.receiver = receiver;
  7529. this.name = name;
  7530. this.getter = getter;
  7531. }
  7532. PropertyRead.prototype.visit = function (visitor) { return visitor.visitPropertyRead(this); };
  7533. return PropertyRead;
  7534. })(AST);
  7535. exports.PropertyRead = PropertyRead;
  7536. var PropertyWrite = (function (_super) {
  7537. __extends(PropertyWrite, _super);
  7538. function PropertyWrite(receiver, name, setter, value) {
  7539. _super.call(this);
  7540. this.receiver = receiver;
  7541. this.name = name;
  7542. this.setter = setter;
  7543. this.value = value;
  7544. }
  7545. PropertyWrite.prototype.visit = function (visitor) { return visitor.visitPropertyWrite(this); };
  7546. return PropertyWrite;
  7547. })(AST);
  7548. exports.PropertyWrite = PropertyWrite;
  7549. var SafePropertyRead = (function (_super) {
  7550. __extends(SafePropertyRead, _super);
  7551. function SafePropertyRead(receiver, name, getter) {
  7552. _super.call(this);
  7553. this.receiver = receiver;
  7554. this.name = name;
  7555. this.getter = getter;
  7556. }
  7557. SafePropertyRead.prototype.visit = function (visitor) { return visitor.visitSafePropertyRead(this); };
  7558. return SafePropertyRead;
  7559. })(AST);
  7560. exports.SafePropertyRead = SafePropertyRead;
  7561. var KeyedRead = (function (_super) {
  7562. __extends(KeyedRead, _super);
  7563. function KeyedRead(obj, key) {
  7564. _super.call(this);
  7565. this.obj = obj;
  7566. this.key = key;
  7567. }
  7568. KeyedRead.prototype.visit = function (visitor) { return visitor.visitKeyedRead(this); };
  7569. return KeyedRead;
  7570. })(AST);
  7571. exports.KeyedRead = KeyedRead;
  7572. var KeyedWrite = (function (_super) {
  7573. __extends(KeyedWrite, _super);
  7574. function KeyedWrite(obj, key, value) {
  7575. _super.call(this);
  7576. this.obj = obj;
  7577. this.key = key;
  7578. this.value = value;
  7579. }
  7580. KeyedWrite.prototype.visit = function (visitor) { return visitor.visitKeyedWrite(this); };
  7581. return KeyedWrite;
  7582. })(AST);
  7583. exports.KeyedWrite = KeyedWrite;
  7584. var BindingPipe = (function (_super) {
  7585. __extends(BindingPipe, _super);
  7586. function BindingPipe(exp, name, args) {
  7587. _super.call(this);
  7588. this.exp = exp;
  7589. this.name = name;
  7590. this.args = args;
  7591. }
  7592. BindingPipe.prototype.visit = function (visitor) { return visitor.visitPipe(this); };
  7593. return BindingPipe;
  7594. })(AST);
  7595. exports.BindingPipe = BindingPipe;
  7596. var LiteralPrimitive = (function (_super) {
  7597. __extends(LiteralPrimitive, _super);
  7598. function LiteralPrimitive(value) {
  7599. _super.call(this);
  7600. this.value = value;
  7601. }
  7602. LiteralPrimitive.prototype.visit = function (visitor) { return visitor.visitLiteralPrimitive(this); };
  7603. return LiteralPrimitive;
  7604. })(AST);
  7605. exports.LiteralPrimitive = LiteralPrimitive;
  7606. var LiteralArray = (function (_super) {
  7607. __extends(LiteralArray, _super);
  7608. function LiteralArray(expressions) {
  7609. _super.call(this);
  7610. this.expressions = expressions;
  7611. }
  7612. LiteralArray.prototype.visit = function (visitor) { return visitor.visitLiteralArray(this); };
  7613. return LiteralArray;
  7614. })(AST);
  7615. exports.LiteralArray = LiteralArray;
  7616. var LiteralMap = (function (_super) {
  7617. __extends(LiteralMap, _super);
  7618. function LiteralMap(keys, values) {
  7619. _super.call(this);
  7620. this.keys = keys;
  7621. this.values = values;
  7622. }
  7623. LiteralMap.prototype.visit = function (visitor) { return visitor.visitLiteralMap(this); };
  7624. return LiteralMap;
  7625. })(AST);
  7626. exports.LiteralMap = LiteralMap;
  7627. var Interpolation = (function (_super) {
  7628. __extends(Interpolation, _super);
  7629. function Interpolation(strings, expressions) {
  7630. _super.call(this);
  7631. this.strings = strings;
  7632. this.expressions = expressions;
  7633. }
  7634. Interpolation.prototype.visit = function (visitor) { return visitor.visitInterpolation(this); };
  7635. return Interpolation;
  7636. })(AST);
  7637. exports.Interpolation = Interpolation;
  7638. var Binary = (function (_super) {
  7639. __extends(Binary, _super);
  7640. function Binary(operation, left, right) {
  7641. _super.call(this);
  7642. this.operation = operation;
  7643. this.left = left;
  7644. this.right = right;
  7645. }
  7646. Binary.prototype.visit = function (visitor) { return visitor.visitBinary(this); };
  7647. return Binary;
  7648. })(AST);
  7649. exports.Binary = Binary;
  7650. var PrefixNot = (function (_super) {
  7651. __extends(PrefixNot, _super);
  7652. function PrefixNot(expression) {
  7653. _super.call(this);
  7654. this.expression = expression;
  7655. }
  7656. PrefixNot.prototype.visit = function (visitor) { return visitor.visitPrefixNot(this); };
  7657. return PrefixNot;
  7658. })(AST);
  7659. exports.PrefixNot = PrefixNot;
  7660. var MethodCall = (function (_super) {
  7661. __extends(MethodCall, _super);
  7662. function MethodCall(receiver, name, fn, args) {
  7663. _super.call(this);
  7664. this.receiver = receiver;
  7665. this.name = name;
  7666. this.fn = fn;
  7667. this.args = args;
  7668. }
  7669. MethodCall.prototype.visit = function (visitor) { return visitor.visitMethodCall(this); };
  7670. return MethodCall;
  7671. })(AST);
  7672. exports.MethodCall = MethodCall;
  7673. var SafeMethodCall = (function (_super) {
  7674. __extends(SafeMethodCall, _super);
  7675. function SafeMethodCall(receiver, name, fn, args) {
  7676. _super.call(this);
  7677. this.receiver = receiver;
  7678. this.name = name;
  7679. this.fn = fn;
  7680. this.args = args;
  7681. }
  7682. SafeMethodCall.prototype.visit = function (visitor) { return visitor.visitSafeMethodCall(this); };
  7683. return SafeMethodCall;
  7684. })(AST);
  7685. exports.SafeMethodCall = SafeMethodCall;
  7686. var FunctionCall = (function (_super) {
  7687. __extends(FunctionCall, _super);
  7688. function FunctionCall(target, args) {
  7689. _super.call(this);
  7690. this.target = target;
  7691. this.args = args;
  7692. }
  7693. FunctionCall.prototype.visit = function (visitor) { return visitor.visitFunctionCall(this); };
  7694. return FunctionCall;
  7695. })(AST);
  7696. exports.FunctionCall = FunctionCall;
  7697. var ASTWithSource = (function (_super) {
  7698. __extends(ASTWithSource, _super);
  7699. function ASTWithSource(ast, source, location) {
  7700. _super.call(this);
  7701. this.ast = ast;
  7702. this.source = source;
  7703. this.location = location;
  7704. }
  7705. ASTWithSource.prototype.visit = function (visitor) { return this.ast.visit(visitor); };
  7706. ASTWithSource.prototype.toString = function () { return this.source + " in " + this.location; };
  7707. return ASTWithSource;
  7708. })(AST);
  7709. exports.ASTWithSource = ASTWithSource;
  7710. var TemplateBinding = (function () {
  7711. function TemplateBinding(key, keyIsVar, name, expression) {
  7712. this.key = key;
  7713. this.keyIsVar = keyIsVar;
  7714. this.name = name;
  7715. this.expression = expression;
  7716. }
  7717. return TemplateBinding;
  7718. })();
  7719. exports.TemplateBinding = TemplateBinding;
  7720. var RecursiveAstVisitor = (function () {
  7721. function RecursiveAstVisitor() {
  7722. }
  7723. RecursiveAstVisitor.prototype.visitBinary = function (ast) {
  7724. ast.left.visit(this);
  7725. ast.right.visit(this);
  7726. return null;
  7727. };
  7728. RecursiveAstVisitor.prototype.visitChain = function (ast) { return this.visitAll(ast.expressions); };
  7729. RecursiveAstVisitor.prototype.visitConditional = function (ast) {
  7730. ast.condition.visit(this);
  7731. ast.trueExp.visit(this);
  7732. ast.falseExp.visit(this);
  7733. return null;
  7734. };
  7735. RecursiveAstVisitor.prototype.visitPipe = function (ast) {
  7736. ast.exp.visit(this);
  7737. this.visitAll(ast.args);
  7738. return null;
  7739. };
  7740. RecursiveAstVisitor.prototype.visitFunctionCall = function (ast) {
  7741. ast.target.visit(this);
  7742. this.visitAll(ast.args);
  7743. return null;
  7744. };
  7745. RecursiveAstVisitor.prototype.visitImplicitReceiver = function (ast) { return null; };
  7746. RecursiveAstVisitor.prototype.visitInterpolation = function (ast) { return this.visitAll(ast.expressions); };
  7747. RecursiveAstVisitor.prototype.visitKeyedRead = function (ast) {
  7748. ast.obj.visit(this);
  7749. ast.key.visit(this);
  7750. return null;
  7751. };
  7752. RecursiveAstVisitor.prototype.visitKeyedWrite = function (ast) {
  7753. ast.obj.visit(this);
  7754. ast.key.visit(this);
  7755. ast.value.visit(this);
  7756. return null;
  7757. };
  7758. RecursiveAstVisitor.prototype.visitLiteralArray = function (ast) { return this.visitAll(ast.expressions); };
  7759. RecursiveAstVisitor.prototype.visitLiteralMap = function (ast) { return this.visitAll(ast.values); };
  7760. RecursiveAstVisitor.prototype.visitLiteralPrimitive = function (ast) { return null; };
  7761. RecursiveAstVisitor.prototype.visitMethodCall = function (ast) {
  7762. ast.receiver.visit(this);
  7763. return this.visitAll(ast.args);
  7764. };
  7765. RecursiveAstVisitor.prototype.visitPrefixNot = function (ast) {
  7766. ast.expression.visit(this);
  7767. return null;
  7768. };
  7769. RecursiveAstVisitor.prototype.visitPropertyRead = function (ast) {
  7770. ast.receiver.visit(this);
  7771. return null;
  7772. };
  7773. RecursiveAstVisitor.prototype.visitPropertyWrite = function (ast) {
  7774. ast.receiver.visit(this);
  7775. ast.value.visit(this);
  7776. return null;
  7777. };
  7778. RecursiveAstVisitor.prototype.visitSafePropertyRead = function (ast) {
  7779. ast.receiver.visit(this);
  7780. return null;
  7781. };
  7782. RecursiveAstVisitor.prototype.visitSafeMethodCall = function (ast) {
  7783. ast.receiver.visit(this);
  7784. return this.visitAll(ast.args);
  7785. };
  7786. RecursiveAstVisitor.prototype.visitAll = function (asts) {
  7787. var _this = this;
  7788. asts.forEach(function (ast) { return ast.visit(_this); });
  7789. return null;
  7790. };
  7791. RecursiveAstVisitor.prototype.visitQuote = function (ast) { return null; };
  7792. return RecursiveAstVisitor;
  7793. })();
  7794. exports.RecursiveAstVisitor = RecursiveAstVisitor;
  7795. var AstTransformer = (function () {
  7796. function AstTransformer() {
  7797. }
  7798. AstTransformer.prototype.visitImplicitReceiver = function (ast) { return ast; };
  7799. AstTransformer.prototype.visitInterpolation = function (ast) {
  7800. return new Interpolation(ast.strings, this.visitAll(ast.expressions));
  7801. };
  7802. AstTransformer.prototype.visitLiteralPrimitive = function (ast) { return new LiteralPrimitive(ast.value); };
  7803. AstTransformer.prototype.visitPropertyRead = function (ast) {
  7804. return new PropertyRead(ast.receiver.visit(this), ast.name, ast.getter);
  7805. };
  7806. AstTransformer.prototype.visitPropertyWrite = function (ast) {
  7807. return new PropertyWrite(ast.receiver.visit(this), ast.name, ast.setter, ast.value);
  7808. };
  7809. AstTransformer.prototype.visitSafePropertyRead = function (ast) {
  7810. return new SafePropertyRead(ast.receiver.visit(this), ast.name, ast.getter);
  7811. };
  7812. AstTransformer.prototype.visitMethodCall = function (ast) {
  7813. return new MethodCall(ast.receiver.visit(this), ast.name, ast.fn, this.visitAll(ast.args));
  7814. };
  7815. AstTransformer.prototype.visitSafeMethodCall = function (ast) {
  7816. return new SafeMethodCall(ast.receiver.visit(this), ast.name, ast.fn, this.visitAll(ast.args));
  7817. };
  7818. AstTransformer.prototype.visitFunctionCall = function (ast) {
  7819. return new FunctionCall(ast.target.visit(this), this.visitAll(ast.args));
  7820. };
  7821. AstTransformer.prototype.visitLiteralArray = function (ast) {
  7822. return new LiteralArray(this.visitAll(ast.expressions));
  7823. };
  7824. AstTransformer.prototype.visitLiteralMap = function (ast) {
  7825. return new LiteralMap(ast.keys, this.visitAll(ast.values));
  7826. };
  7827. AstTransformer.prototype.visitBinary = function (ast) {
  7828. return new Binary(ast.operation, ast.left.visit(this), ast.right.visit(this));
  7829. };
  7830. AstTransformer.prototype.visitPrefixNot = function (ast) { return new PrefixNot(ast.expression.visit(this)); };
  7831. AstTransformer.prototype.visitConditional = function (ast) {
  7832. return new Conditional(ast.condition.visit(this), ast.trueExp.visit(this), ast.falseExp.visit(this));
  7833. };
  7834. AstTransformer.prototype.visitPipe = function (ast) {
  7835. return new BindingPipe(ast.exp.visit(this), ast.name, this.visitAll(ast.args));
  7836. };
  7837. AstTransformer.prototype.visitKeyedRead = function (ast) {
  7838. return new KeyedRead(ast.obj.visit(this), ast.key.visit(this));
  7839. };
  7840. AstTransformer.prototype.visitKeyedWrite = function (ast) {
  7841. return new KeyedWrite(ast.obj.visit(this), ast.key.visit(this), ast.value.visit(this));
  7842. };
  7843. AstTransformer.prototype.visitAll = function (asts) {
  7844. var res = collection_1.ListWrapper.createFixedSize(asts.length);
  7845. for (var i = 0; i < asts.length; ++i) {
  7846. res[i] = asts[i].visit(this);
  7847. }
  7848. return res;
  7849. };
  7850. AstTransformer.prototype.visitChain = function (ast) { return new Chain(this.visitAll(ast.expressions)); };
  7851. AstTransformer.prototype.visitQuote = function (ast) {
  7852. return new Quote(ast.prefix, ast.uninterpretedExpression, ast.location);
  7853. };
  7854. return AstTransformer;
  7855. })();
  7856. exports.AstTransformer = AstTransformer;
  7857. /***/ },
  7858. /* 31 */
  7859. /***/ function(module, exports, __webpack_require__) {
  7860. var __extends = (this && this.__extends) || function (d, b) {
  7861. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  7862. function __() { this.constructor = d; }
  7863. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  7864. };
  7865. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  7866. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  7867. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  7868. 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;
  7869. return c > 3 && r && Object.defineProperty(target, key, r), r;
  7870. };
  7871. var __metadata = (this && this.__metadata) || function (k, v) {
  7872. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  7873. };
  7874. var decorators_1 = __webpack_require__(8);
  7875. var collection_1 = __webpack_require__(12);
  7876. var lang_1 = __webpack_require__(5);
  7877. var exceptions_1 = __webpack_require__(14);
  7878. (function (TokenType) {
  7879. TokenType[TokenType["Character"] = 0] = "Character";
  7880. TokenType[TokenType["Identifier"] = 1] = "Identifier";
  7881. TokenType[TokenType["Keyword"] = 2] = "Keyword";
  7882. TokenType[TokenType["String"] = 3] = "String";
  7883. TokenType[TokenType["Operator"] = 4] = "Operator";
  7884. TokenType[TokenType["Number"] = 5] = "Number";
  7885. })(exports.TokenType || (exports.TokenType = {}));
  7886. var TokenType = exports.TokenType;
  7887. var Lexer = (function () {
  7888. function Lexer() {
  7889. }
  7890. Lexer.prototype.tokenize = function (text) {
  7891. var scanner = new _Scanner(text);
  7892. var tokens = [];
  7893. var token = scanner.scanToken();
  7894. while (token != null) {
  7895. tokens.push(token);
  7896. token = scanner.scanToken();
  7897. }
  7898. return tokens;
  7899. };
  7900. Lexer = __decorate([
  7901. decorators_1.Injectable(),
  7902. __metadata('design:paramtypes', [])
  7903. ], Lexer);
  7904. return Lexer;
  7905. })();
  7906. exports.Lexer = Lexer;
  7907. var Token = (function () {
  7908. function Token(index, type, numValue, strValue) {
  7909. this.index = index;
  7910. this.type = type;
  7911. this.numValue = numValue;
  7912. this.strValue = strValue;
  7913. }
  7914. Token.prototype.isCharacter = function (code) {
  7915. return (this.type == TokenType.Character && this.numValue == code);
  7916. };
  7917. Token.prototype.isNumber = function () { return (this.type == TokenType.Number); };
  7918. Token.prototype.isString = function () { return (this.type == TokenType.String); };
  7919. Token.prototype.isOperator = function (operater) {
  7920. return (this.type == TokenType.Operator && this.strValue == operater);
  7921. };
  7922. Token.prototype.isIdentifier = function () { return (this.type == TokenType.Identifier); };
  7923. Token.prototype.isKeyword = function () { return (this.type == TokenType.Keyword); };
  7924. Token.prototype.isKeywordVar = function () { return (this.type == TokenType.Keyword && this.strValue == "var"); };
  7925. Token.prototype.isKeywordNull = function () { return (this.type == TokenType.Keyword && this.strValue == "null"); };
  7926. Token.prototype.isKeywordUndefined = function () {
  7927. return (this.type == TokenType.Keyword && this.strValue == "undefined");
  7928. };
  7929. Token.prototype.isKeywordTrue = function () { return (this.type == TokenType.Keyword && this.strValue == "true"); };
  7930. Token.prototype.isKeywordFalse = function () { return (this.type == TokenType.Keyword && this.strValue == "false"); };
  7931. Token.prototype.toNumber = function () {
  7932. // -1 instead of NULL ok?
  7933. return (this.type == TokenType.Number) ? this.numValue : -1;
  7934. };
  7935. Token.prototype.toString = function () {
  7936. switch (this.type) {
  7937. case TokenType.Character:
  7938. case TokenType.Identifier:
  7939. case TokenType.Keyword:
  7940. case TokenType.Operator:
  7941. case TokenType.String:
  7942. return this.strValue;
  7943. case TokenType.Number:
  7944. return this.numValue.toString();
  7945. default:
  7946. return null;
  7947. }
  7948. };
  7949. return Token;
  7950. })();
  7951. exports.Token = Token;
  7952. function newCharacterToken(index, code) {
  7953. return new Token(index, TokenType.Character, code, lang_1.StringWrapper.fromCharCode(code));
  7954. }
  7955. function newIdentifierToken(index, text) {
  7956. return new Token(index, TokenType.Identifier, 0, text);
  7957. }
  7958. function newKeywordToken(index, text) {
  7959. return new Token(index, TokenType.Keyword, 0, text);
  7960. }
  7961. function newOperatorToken(index, text) {
  7962. return new Token(index, TokenType.Operator, 0, text);
  7963. }
  7964. function newStringToken(index, text) {
  7965. return new Token(index, TokenType.String, 0, text);
  7966. }
  7967. function newNumberToken(index, n) {
  7968. return new Token(index, TokenType.Number, n, "");
  7969. }
  7970. exports.EOF = new Token(-1, TokenType.Character, 0, "");
  7971. exports.$EOF = 0;
  7972. exports.$TAB = 9;
  7973. exports.$LF = 10;
  7974. exports.$VTAB = 11;
  7975. exports.$FF = 12;
  7976. exports.$CR = 13;
  7977. exports.$SPACE = 32;
  7978. exports.$BANG = 33;
  7979. exports.$DQ = 34;
  7980. exports.$HASH = 35;
  7981. exports.$$ = 36;
  7982. exports.$PERCENT = 37;
  7983. exports.$AMPERSAND = 38;
  7984. exports.$SQ = 39;
  7985. exports.$LPAREN = 40;
  7986. exports.$RPAREN = 41;
  7987. exports.$STAR = 42;
  7988. exports.$PLUS = 43;
  7989. exports.$COMMA = 44;
  7990. exports.$MINUS = 45;
  7991. exports.$PERIOD = 46;
  7992. exports.$SLASH = 47;
  7993. exports.$COLON = 58;
  7994. exports.$SEMICOLON = 59;
  7995. exports.$LT = 60;
  7996. exports.$EQ = 61;
  7997. exports.$GT = 62;
  7998. exports.$QUESTION = 63;
  7999. var $0 = 48;
  8000. var $9 = 57;
  8001. var $A = 65, $E = 69, $Z = 90;
  8002. exports.$LBRACKET = 91;
  8003. exports.$BACKSLASH = 92;
  8004. exports.$RBRACKET = 93;
  8005. var $CARET = 94;
  8006. var $_ = 95;
  8007. var $a = 97, $e = 101, $f = 102, $n = 110, $r = 114, $t = 116, $u = 117, $v = 118, $z = 122;
  8008. exports.$LBRACE = 123;
  8009. exports.$BAR = 124;
  8010. exports.$RBRACE = 125;
  8011. var $NBSP = 160;
  8012. var ScannerError = (function (_super) {
  8013. __extends(ScannerError, _super);
  8014. function ScannerError(message) {
  8015. _super.call(this);
  8016. this.message = message;
  8017. }
  8018. ScannerError.prototype.toString = function () { return this.message; };
  8019. return ScannerError;
  8020. })(exceptions_1.BaseException);
  8021. exports.ScannerError = ScannerError;
  8022. var _Scanner = (function () {
  8023. function _Scanner(input) {
  8024. this.input = input;
  8025. this.peek = 0;
  8026. this.index = -1;
  8027. this.length = input.length;
  8028. this.advance();
  8029. }
  8030. _Scanner.prototype.advance = function () {
  8031. this.peek =
  8032. ++this.index >= this.length ? exports.$EOF : lang_1.StringWrapper.charCodeAt(this.input, this.index);
  8033. };
  8034. _Scanner.prototype.scanToken = function () {
  8035. var input = this.input, length = this.length, peek = this.peek, index = this.index;
  8036. // Skip whitespace.
  8037. while (peek <= exports.$SPACE) {
  8038. if (++index >= length) {
  8039. peek = exports.$EOF;
  8040. break;
  8041. }
  8042. else {
  8043. peek = lang_1.StringWrapper.charCodeAt(input, index);
  8044. }
  8045. }
  8046. this.peek = peek;
  8047. this.index = index;
  8048. if (index >= length) {
  8049. return null;
  8050. }
  8051. // Handle identifiers and numbers.
  8052. if (isIdentifierStart(peek))
  8053. return this.scanIdentifier();
  8054. if (isDigit(peek))
  8055. return this.scanNumber(index);
  8056. var start = index;
  8057. switch (peek) {
  8058. case exports.$PERIOD:
  8059. this.advance();
  8060. return isDigit(this.peek) ? this.scanNumber(start) : newCharacterToken(start, exports.$PERIOD);
  8061. case exports.$LPAREN:
  8062. case exports.$RPAREN:
  8063. case exports.$LBRACE:
  8064. case exports.$RBRACE:
  8065. case exports.$LBRACKET:
  8066. case exports.$RBRACKET:
  8067. case exports.$COMMA:
  8068. case exports.$COLON:
  8069. case exports.$SEMICOLON:
  8070. return this.scanCharacter(start, peek);
  8071. case exports.$SQ:
  8072. case exports.$DQ:
  8073. return this.scanString();
  8074. case exports.$HASH:
  8075. case exports.$PLUS:
  8076. case exports.$MINUS:
  8077. case exports.$STAR:
  8078. case exports.$SLASH:
  8079. case exports.$PERCENT:
  8080. case $CARET:
  8081. return this.scanOperator(start, lang_1.StringWrapper.fromCharCode(peek));
  8082. case exports.$QUESTION:
  8083. return this.scanComplexOperator(start, '?', exports.$PERIOD, '.');
  8084. case exports.$LT:
  8085. case exports.$GT:
  8086. return this.scanComplexOperator(start, lang_1.StringWrapper.fromCharCode(peek), exports.$EQ, '=');
  8087. case exports.$BANG:
  8088. case exports.$EQ:
  8089. return this.scanComplexOperator(start, lang_1.StringWrapper.fromCharCode(peek), exports.$EQ, '=', exports.$EQ, '=');
  8090. case exports.$AMPERSAND:
  8091. return this.scanComplexOperator(start, '&', exports.$AMPERSAND, '&');
  8092. case exports.$BAR:
  8093. return this.scanComplexOperator(start, '|', exports.$BAR, '|');
  8094. case $NBSP:
  8095. while (isWhitespace(this.peek))
  8096. this.advance();
  8097. return this.scanToken();
  8098. }
  8099. this.error("Unexpected character [" + lang_1.StringWrapper.fromCharCode(peek) + "]", 0);
  8100. return null;
  8101. };
  8102. _Scanner.prototype.scanCharacter = function (start, code) {
  8103. assert(this.peek == code);
  8104. this.advance();
  8105. return newCharacterToken(start, code);
  8106. };
  8107. _Scanner.prototype.scanOperator = function (start, str) {
  8108. assert(this.peek == lang_1.StringWrapper.charCodeAt(str, 0));
  8109. assert(collection_1.SetWrapper.has(OPERATORS, str));
  8110. this.advance();
  8111. return newOperatorToken(start, str);
  8112. };
  8113. /**
  8114. * Tokenize a 2/3 char long operator
  8115. *
  8116. * @param start start index in the expression
  8117. * @param one first symbol (always part of the operator)
  8118. * @param twoCode code point for the second symbol
  8119. * @param two second symbol (part of the operator when the second code point matches)
  8120. * @param threeCode code point for the third symbol
  8121. * @param three third symbol (part of the operator when provided and matches source expression)
  8122. * @returns {Token}
  8123. */
  8124. _Scanner.prototype.scanComplexOperator = function (start, one, twoCode, two, threeCode, three) {
  8125. assert(this.peek == lang_1.StringWrapper.charCodeAt(one, 0));
  8126. this.advance();
  8127. var str = one;
  8128. if (this.peek == twoCode) {
  8129. this.advance();
  8130. str += two;
  8131. }
  8132. if (lang_1.isPresent(threeCode) && this.peek == threeCode) {
  8133. this.advance();
  8134. str += three;
  8135. }
  8136. assert(collection_1.SetWrapper.has(OPERATORS, str));
  8137. return newOperatorToken(start, str);
  8138. };
  8139. _Scanner.prototype.scanIdentifier = function () {
  8140. assert(isIdentifierStart(this.peek));
  8141. var start = this.index;
  8142. this.advance();
  8143. while (isIdentifierPart(this.peek))
  8144. this.advance();
  8145. var str = this.input.substring(start, this.index);
  8146. if (collection_1.SetWrapper.has(KEYWORDS, str)) {
  8147. return newKeywordToken(start, str);
  8148. }
  8149. else {
  8150. return newIdentifierToken(start, str);
  8151. }
  8152. };
  8153. _Scanner.prototype.scanNumber = function (start) {
  8154. assert(isDigit(this.peek));
  8155. var simple = (this.index === start);
  8156. this.advance(); // Skip initial digit.
  8157. while (true) {
  8158. if (isDigit(this.peek)) {
  8159. }
  8160. else if (this.peek == exports.$PERIOD) {
  8161. simple = false;
  8162. }
  8163. else if (isExponentStart(this.peek)) {
  8164. this.advance();
  8165. if (isExponentSign(this.peek))
  8166. this.advance();
  8167. if (!isDigit(this.peek))
  8168. this.error('Invalid exponent', -1);
  8169. simple = false;
  8170. }
  8171. else {
  8172. break;
  8173. }
  8174. this.advance();
  8175. }
  8176. var str = this.input.substring(start, this.index);
  8177. // TODO
  8178. var value = simple ? lang_1.NumberWrapper.parseIntAutoRadix(str) : lang_1.NumberWrapper.parseFloat(str);
  8179. return newNumberToken(start, value);
  8180. };
  8181. _Scanner.prototype.scanString = function () {
  8182. assert(this.peek == exports.$SQ || this.peek == exports.$DQ);
  8183. var start = this.index;
  8184. var quote = this.peek;
  8185. this.advance(); // Skip initial quote.
  8186. var buffer;
  8187. var marker = this.index;
  8188. var input = this.input;
  8189. while (this.peek != quote) {
  8190. if (this.peek == exports.$BACKSLASH) {
  8191. if (buffer == null)
  8192. buffer = new lang_1.StringJoiner();
  8193. buffer.add(input.substring(marker, this.index));
  8194. this.advance();
  8195. var unescapedCode;
  8196. if (this.peek == $u) {
  8197. // 4 character hex code for unicode character.
  8198. var hex = input.substring(this.index + 1, this.index + 5);
  8199. try {
  8200. unescapedCode = lang_1.NumberWrapper.parseInt(hex, 16);
  8201. }
  8202. catch (e) {
  8203. this.error("Invalid unicode escape [\\u" + hex + "]", 0);
  8204. }
  8205. for (var i = 0; i < 5; i++) {
  8206. this.advance();
  8207. }
  8208. }
  8209. else {
  8210. unescapedCode = unescape(this.peek);
  8211. this.advance();
  8212. }
  8213. buffer.add(lang_1.StringWrapper.fromCharCode(unescapedCode));
  8214. marker = this.index;
  8215. }
  8216. else if (this.peek == exports.$EOF) {
  8217. this.error('Unterminated quote', 0);
  8218. }
  8219. else {
  8220. this.advance();
  8221. }
  8222. }
  8223. var last = input.substring(marker, this.index);
  8224. this.advance(); // Skip terminating quote.
  8225. // Compute the unescaped string value.
  8226. var unescaped = last;
  8227. if (buffer != null) {
  8228. buffer.add(last);
  8229. unescaped = buffer.toString();
  8230. }
  8231. return newStringToken(start, unescaped);
  8232. };
  8233. _Scanner.prototype.error = function (message, offset) {
  8234. var position = this.index + offset;
  8235. throw new ScannerError("Lexer Error: " + message + " at column " + position + " in expression [" + this.input + "]");
  8236. };
  8237. return _Scanner;
  8238. })();
  8239. function isWhitespace(code) {
  8240. return (code >= exports.$TAB && code <= exports.$SPACE) || (code == $NBSP);
  8241. }
  8242. function isIdentifierStart(code) {
  8243. return ($a <= code && code <= $z) || ($A <= code && code <= $Z) || (code == $_) || (code == exports.$$);
  8244. }
  8245. function isIdentifier(input) {
  8246. if (input.length == 0)
  8247. return false;
  8248. var scanner = new _Scanner(input);
  8249. if (!isIdentifierStart(scanner.peek))
  8250. return false;
  8251. scanner.advance();
  8252. while (scanner.peek !== exports.$EOF) {
  8253. if (!isIdentifierPart(scanner.peek))
  8254. return false;
  8255. scanner.advance();
  8256. }
  8257. return true;
  8258. }
  8259. exports.isIdentifier = isIdentifier;
  8260. function isIdentifierPart(code) {
  8261. return ($a <= code && code <= $z) || ($A <= code && code <= $Z) || ($0 <= code && code <= $9) ||
  8262. (code == $_) || (code == exports.$$);
  8263. }
  8264. function isDigit(code) {
  8265. return $0 <= code && code <= $9;
  8266. }
  8267. function isExponentStart(code) {
  8268. return code == $e || code == $E;
  8269. }
  8270. function isExponentSign(code) {
  8271. return code == exports.$MINUS || code == exports.$PLUS;
  8272. }
  8273. function unescape(code) {
  8274. switch (code) {
  8275. case $n:
  8276. return exports.$LF;
  8277. case $f:
  8278. return exports.$FF;
  8279. case $r:
  8280. return exports.$CR;
  8281. case $t:
  8282. return exports.$TAB;
  8283. case $v:
  8284. return exports.$VTAB;
  8285. default:
  8286. return code;
  8287. }
  8288. }
  8289. var OPERATORS = collection_1.SetWrapper.createFromList([
  8290. '+',
  8291. '-',
  8292. '*',
  8293. '/',
  8294. '%',
  8295. '^',
  8296. '=',
  8297. '==',
  8298. '!=',
  8299. '===',
  8300. '!==',
  8301. '<',
  8302. '>',
  8303. '<=',
  8304. '>=',
  8305. '&&',
  8306. '||',
  8307. '&',
  8308. '|',
  8309. '!',
  8310. '?',
  8311. '#',
  8312. '?.'
  8313. ]);
  8314. var KEYWORDS = collection_1.SetWrapper.createFromList(['var', 'null', 'undefined', 'true', 'false', 'if', 'else']);
  8315. /***/ },
  8316. /* 32 */
  8317. /***/ function(module, exports, __webpack_require__) {
  8318. var __extends = (this && this.__extends) || function (d, b) {
  8319. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  8320. function __() { this.constructor = d; }
  8321. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  8322. };
  8323. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  8324. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  8325. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  8326. 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;
  8327. return c > 3 && r && Object.defineProperty(target, key, r), r;
  8328. };
  8329. var __metadata = (this && this.__metadata) || function (k, v) {
  8330. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  8331. };
  8332. var decorators_1 = __webpack_require__(8);
  8333. var lang_1 = __webpack_require__(5);
  8334. var exceptions_1 = __webpack_require__(14);
  8335. var collection_1 = __webpack_require__(12);
  8336. var lexer_1 = __webpack_require__(31);
  8337. var reflection_1 = __webpack_require__(16);
  8338. var ast_1 = __webpack_require__(30);
  8339. var _implicitReceiver = new ast_1.ImplicitReceiver();
  8340. // TODO(tbosch): Cannot make this const/final right now because of the transpiler...
  8341. var INTERPOLATION_REGEXP = /\{\{(.*?)\}\}/g;
  8342. var ParseException = (function (_super) {
  8343. __extends(ParseException, _super);
  8344. function ParseException(message, input, errLocation, ctxLocation) {
  8345. _super.call(this, "Parser Error: " + message + " " + errLocation + " [" + input + "] in " + ctxLocation);
  8346. }
  8347. return ParseException;
  8348. })(exceptions_1.BaseException);
  8349. var Parser = (function () {
  8350. function Parser(/** @internal */ _lexer, providedReflector) {
  8351. if (providedReflector === void 0) { providedReflector = null; }
  8352. this._lexer = _lexer;
  8353. this._reflector = lang_1.isPresent(providedReflector) ? providedReflector : reflection_1.reflector;
  8354. }
  8355. Parser.prototype.parseAction = function (input, location) {
  8356. this._checkNoInterpolation(input, location);
  8357. var tokens = this._lexer.tokenize(input);
  8358. var ast = new _ParseAST(input, location, tokens, this._reflector, true).parseChain();
  8359. return new ast_1.ASTWithSource(ast, input, location);
  8360. };
  8361. Parser.prototype.parseBinding = function (input, location) {
  8362. var ast = this._parseBindingAst(input, location);
  8363. return new ast_1.ASTWithSource(ast, input, location);
  8364. };
  8365. Parser.prototype.parseSimpleBinding = function (input, location) {
  8366. var ast = this._parseBindingAst(input, location);
  8367. if (!SimpleExpressionChecker.check(ast)) {
  8368. throw new ParseException('Host binding expression can only contain field access and constants', input, location);
  8369. }
  8370. return new ast_1.ASTWithSource(ast, input, location);
  8371. };
  8372. Parser.prototype._parseBindingAst = function (input, location) {
  8373. // Quotes expressions use 3rd-party expression language. We don't want to use
  8374. // our lexer or parser for that, so we check for that ahead of time.
  8375. var quote = this._parseQuote(input, location);
  8376. if (lang_1.isPresent(quote)) {
  8377. return quote;
  8378. }
  8379. this._checkNoInterpolation(input, location);
  8380. var tokens = this._lexer.tokenize(input);
  8381. return new _ParseAST(input, location, tokens, this._reflector, false).parseChain();
  8382. };
  8383. Parser.prototype._parseQuote = function (input, location) {
  8384. if (lang_1.isBlank(input))
  8385. return null;
  8386. var prefixSeparatorIndex = input.indexOf(':');
  8387. if (prefixSeparatorIndex == -1)
  8388. return null;
  8389. var prefix = input.substring(0, prefixSeparatorIndex).trim();
  8390. if (!lexer_1.isIdentifier(prefix))
  8391. return null;
  8392. var uninterpretedExpression = input.substring(prefixSeparatorIndex + 1);
  8393. return new ast_1.Quote(prefix, uninterpretedExpression, location);
  8394. };
  8395. Parser.prototype.parseTemplateBindings = function (input, location) {
  8396. var tokens = this._lexer.tokenize(input);
  8397. return new _ParseAST(input, location, tokens, this._reflector, false).parseTemplateBindings();
  8398. };
  8399. Parser.prototype.parseInterpolation = function (input, location) {
  8400. var parts = lang_1.StringWrapper.split(input, INTERPOLATION_REGEXP);
  8401. if (parts.length <= 1) {
  8402. return null;
  8403. }
  8404. var strings = [];
  8405. var expressions = [];
  8406. for (var i = 0; i < parts.length; i++) {
  8407. var part = parts[i];
  8408. if (i % 2 === 0) {
  8409. // fixed string
  8410. strings.push(part);
  8411. }
  8412. else if (part.trim().length > 0) {
  8413. var tokens = this._lexer.tokenize(part);
  8414. var ast = new _ParseAST(input, location, tokens, this._reflector, false).parseChain();
  8415. expressions.push(ast);
  8416. }
  8417. else {
  8418. throw new ParseException('Blank expressions are not allowed in interpolated strings', input, "at column " + this._findInterpolationErrorColumn(parts, i) + " in", location);
  8419. }
  8420. }
  8421. return new ast_1.ASTWithSource(new ast_1.Interpolation(strings, expressions), input, location);
  8422. };
  8423. Parser.prototype.wrapLiteralPrimitive = function (input, location) {
  8424. return new ast_1.ASTWithSource(new ast_1.LiteralPrimitive(input), input, location);
  8425. };
  8426. Parser.prototype._checkNoInterpolation = function (input, location) {
  8427. var parts = lang_1.StringWrapper.split(input, INTERPOLATION_REGEXP);
  8428. if (parts.length > 1) {
  8429. throw new ParseException('Got interpolation ({{}}) where expression was expected', input, "at column " + this._findInterpolationErrorColumn(parts, 1) + " in", location);
  8430. }
  8431. };
  8432. Parser.prototype._findInterpolationErrorColumn = function (parts, partInErrIdx) {
  8433. var errLocation = '';
  8434. for (var j = 0; j < partInErrIdx; j++) {
  8435. errLocation += j % 2 === 0 ? parts[j] : "{{" + parts[j] + "}}";
  8436. }
  8437. return errLocation.length;
  8438. };
  8439. Parser = __decorate([
  8440. decorators_1.Injectable(),
  8441. __metadata('design:paramtypes', [lexer_1.Lexer, reflection_1.Reflector])
  8442. ], Parser);
  8443. return Parser;
  8444. })();
  8445. exports.Parser = Parser;
  8446. var _ParseAST = (function () {
  8447. function _ParseAST(input, location, tokens, reflector, parseAction) {
  8448. this.input = input;
  8449. this.location = location;
  8450. this.tokens = tokens;
  8451. this.reflector = reflector;
  8452. this.parseAction = parseAction;
  8453. this.index = 0;
  8454. }
  8455. _ParseAST.prototype.peek = function (offset) {
  8456. var i = this.index + offset;
  8457. return i < this.tokens.length ? this.tokens[i] : lexer_1.EOF;
  8458. };
  8459. Object.defineProperty(_ParseAST.prototype, "next", {
  8460. get: function () { return this.peek(0); },
  8461. enumerable: true,
  8462. configurable: true
  8463. });
  8464. Object.defineProperty(_ParseAST.prototype, "inputIndex", {
  8465. get: function () {
  8466. return (this.index < this.tokens.length) ? this.next.index : this.input.length;
  8467. },
  8468. enumerable: true,
  8469. configurable: true
  8470. });
  8471. _ParseAST.prototype.advance = function () { this.index++; };
  8472. _ParseAST.prototype.optionalCharacter = function (code) {
  8473. if (this.next.isCharacter(code)) {
  8474. this.advance();
  8475. return true;
  8476. }
  8477. else {
  8478. return false;
  8479. }
  8480. };
  8481. _ParseAST.prototype.optionalKeywordVar = function () {
  8482. if (this.peekKeywordVar()) {
  8483. this.advance();
  8484. return true;
  8485. }
  8486. else {
  8487. return false;
  8488. }
  8489. };
  8490. _ParseAST.prototype.peekKeywordVar = function () { return this.next.isKeywordVar() || this.next.isOperator('#'); };
  8491. _ParseAST.prototype.expectCharacter = function (code) {
  8492. if (this.optionalCharacter(code))
  8493. return;
  8494. this.error("Missing expected " + lang_1.StringWrapper.fromCharCode(code));
  8495. };
  8496. _ParseAST.prototype.optionalOperator = function (op) {
  8497. if (this.next.isOperator(op)) {
  8498. this.advance();
  8499. return true;
  8500. }
  8501. else {
  8502. return false;
  8503. }
  8504. };
  8505. _ParseAST.prototype.expectOperator = function (operator) {
  8506. if (this.optionalOperator(operator))
  8507. return;
  8508. this.error("Missing expected operator " + operator);
  8509. };
  8510. _ParseAST.prototype.expectIdentifierOrKeyword = function () {
  8511. var n = this.next;
  8512. if (!n.isIdentifier() && !n.isKeyword()) {
  8513. this.error("Unexpected token " + n + ", expected identifier or keyword");
  8514. }
  8515. this.advance();
  8516. return n.toString();
  8517. };
  8518. _ParseAST.prototype.expectIdentifierOrKeywordOrString = function () {
  8519. var n = this.next;
  8520. if (!n.isIdentifier() && !n.isKeyword() && !n.isString()) {
  8521. this.error("Unexpected token " + n + ", expected identifier, keyword, or string");
  8522. }
  8523. this.advance();
  8524. return n.toString();
  8525. };
  8526. _ParseAST.prototype.parseChain = function () {
  8527. var exprs = [];
  8528. while (this.index < this.tokens.length) {
  8529. var expr = this.parsePipe();
  8530. exprs.push(expr);
  8531. if (this.optionalCharacter(lexer_1.$SEMICOLON)) {
  8532. if (!this.parseAction) {
  8533. this.error("Binding expression cannot contain chained expression");
  8534. }
  8535. while (this.optionalCharacter(lexer_1.$SEMICOLON)) {
  8536. } // read all semicolons
  8537. }
  8538. else if (this.index < this.tokens.length) {
  8539. this.error("Unexpected token '" + this.next + "'");
  8540. }
  8541. }
  8542. if (exprs.length == 0)
  8543. return new ast_1.EmptyExpr();
  8544. if (exprs.length == 1)
  8545. return exprs[0];
  8546. return new ast_1.Chain(exprs);
  8547. };
  8548. _ParseAST.prototype.parsePipe = function () {
  8549. var result = this.parseExpression();
  8550. if (this.optionalOperator("|")) {
  8551. if (this.parseAction) {
  8552. this.error("Cannot have a pipe in an action expression");
  8553. }
  8554. do {
  8555. var name = this.expectIdentifierOrKeyword();
  8556. var args = [];
  8557. while (this.optionalCharacter(lexer_1.$COLON)) {
  8558. args.push(this.parseExpression());
  8559. }
  8560. result = new ast_1.BindingPipe(result, name, args);
  8561. } while (this.optionalOperator("|"));
  8562. }
  8563. return result;
  8564. };
  8565. _ParseAST.prototype.parseExpression = function () { return this.parseConditional(); };
  8566. _ParseAST.prototype.parseConditional = function () {
  8567. var start = this.inputIndex;
  8568. var result = this.parseLogicalOr();
  8569. if (this.optionalOperator('?')) {
  8570. var yes = this.parsePipe();
  8571. if (!this.optionalCharacter(lexer_1.$COLON)) {
  8572. var end = this.inputIndex;
  8573. var expression = this.input.substring(start, end);
  8574. this.error("Conditional expression " + expression + " requires all 3 expressions");
  8575. }
  8576. var no = this.parsePipe();
  8577. return new ast_1.Conditional(result, yes, no);
  8578. }
  8579. else {
  8580. return result;
  8581. }
  8582. };
  8583. _ParseAST.prototype.parseLogicalOr = function () {
  8584. // '||'
  8585. var result = this.parseLogicalAnd();
  8586. while (this.optionalOperator('||')) {
  8587. result = new ast_1.Binary('||', result, this.parseLogicalAnd());
  8588. }
  8589. return result;
  8590. };
  8591. _ParseAST.prototype.parseLogicalAnd = function () {
  8592. // '&&'
  8593. var result = this.parseEquality();
  8594. while (this.optionalOperator('&&')) {
  8595. result = new ast_1.Binary('&&', result, this.parseEquality());
  8596. }
  8597. return result;
  8598. };
  8599. _ParseAST.prototype.parseEquality = function () {
  8600. // '==','!=','===','!=='
  8601. var result = this.parseRelational();
  8602. while (true) {
  8603. 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 if (this.optionalOperator('!=')) {
  8610. result = new ast_1.Binary('!=', result, this.parseRelational());
  8611. }
  8612. else if (this.optionalOperator('!==')) {
  8613. result = new ast_1.Binary('!==', result, this.parseRelational());
  8614. }
  8615. else {
  8616. return result;
  8617. }
  8618. }
  8619. };
  8620. _ParseAST.prototype.parseRelational = function () {
  8621. // '<', '>', '<=', '>='
  8622. var result = this.parseAdditive();
  8623. while (true) {
  8624. 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 if (this.optionalOperator('<=')) {
  8631. result = new ast_1.Binary('<=', result, this.parseAdditive());
  8632. }
  8633. else if (this.optionalOperator('>=')) {
  8634. result = new ast_1.Binary('>=', result, this.parseAdditive());
  8635. }
  8636. else {
  8637. return result;
  8638. }
  8639. }
  8640. };
  8641. _ParseAST.prototype.parseAdditive = function () {
  8642. // '+', '-'
  8643. var result = this.parseMultiplicative();
  8644. while (true) {
  8645. if (this.optionalOperator('+')) {
  8646. result = new ast_1.Binary('+', result, this.parseMultiplicative());
  8647. }
  8648. else if (this.optionalOperator('-')) {
  8649. result = new ast_1.Binary('-', result, this.parseMultiplicative());
  8650. }
  8651. else {
  8652. return result;
  8653. }
  8654. }
  8655. };
  8656. _ParseAST.prototype.parseMultiplicative = function () {
  8657. // '*', '%', '/'
  8658. var result = this.parsePrefix();
  8659. while (true) {
  8660. if (this.optionalOperator('*')) {
  8661. result = new ast_1.Binary('*', result, this.parsePrefix());
  8662. }
  8663. else if (this.optionalOperator('%')) {
  8664. result = new ast_1.Binary('%', result, this.parsePrefix());
  8665. }
  8666. else if (this.optionalOperator('/')) {
  8667. result = new ast_1.Binary('/', result, this.parsePrefix());
  8668. }
  8669. else {
  8670. return result;
  8671. }
  8672. }
  8673. };
  8674. _ParseAST.prototype.parsePrefix = function () {
  8675. if (this.optionalOperator('+')) {
  8676. return this.parsePrefix();
  8677. }
  8678. else if (this.optionalOperator('-')) {
  8679. return new ast_1.Binary('-', new ast_1.LiteralPrimitive(0), this.parsePrefix());
  8680. }
  8681. else if (this.optionalOperator('!')) {
  8682. return new ast_1.PrefixNot(this.parsePrefix());
  8683. }
  8684. else {
  8685. return this.parseCallChain();
  8686. }
  8687. };
  8688. _ParseAST.prototype.parseCallChain = function () {
  8689. var result = this.parsePrimary();
  8690. while (true) {
  8691. if (this.optionalCharacter(lexer_1.$PERIOD)) {
  8692. result = this.parseAccessMemberOrMethodCall(result, false);
  8693. }
  8694. else if (this.optionalOperator('?.')) {
  8695. result = this.parseAccessMemberOrMethodCall(result, true);
  8696. }
  8697. else if (this.optionalCharacter(lexer_1.$LBRACKET)) {
  8698. var key = this.parsePipe();
  8699. this.expectCharacter(lexer_1.$RBRACKET);
  8700. if (this.optionalOperator("=")) {
  8701. var value = this.parseConditional();
  8702. result = new ast_1.KeyedWrite(result, key, value);
  8703. }
  8704. else {
  8705. result = new ast_1.KeyedRead(result, key);
  8706. }
  8707. }
  8708. else if (this.optionalCharacter(lexer_1.$LPAREN)) {
  8709. var args = this.parseCallArguments();
  8710. this.expectCharacter(lexer_1.$RPAREN);
  8711. result = new ast_1.FunctionCall(result, args);
  8712. }
  8713. else {
  8714. return result;
  8715. }
  8716. }
  8717. };
  8718. _ParseAST.prototype.parsePrimary = function () {
  8719. if (this.optionalCharacter(lexer_1.$LPAREN)) {
  8720. var result = this.parsePipe();
  8721. this.expectCharacter(lexer_1.$RPAREN);
  8722. return result;
  8723. }
  8724. else if (this.next.isKeywordNull() || this.next.isKeywordUndefined()) {
  8725. this.advance();
  8726. return new ast_1.LiteralPrimitive(null);
  8727. }
  8728. else if (this.next.isKeywordTrue()) {
  8729. this.advance();
  8730. return new ast_1.LiteralPrimitive(true);
  8731. }
  8732. else if (this.next.isKeywordFalse()) {
  8733. this.advance();
  8734. return new ast_1.LiteralPrimitive(false);
  8735. }
  8736. else if (this.optionalCharacter(lexer_1.$LBRACKET)) {
  8737. var elements = this.parseExpressionList(lexer_1.$RBRACKET);
  8738. this.expectCharacter(lexer_1.$RBRACKET);
  8739. return new ast_1.LiteralArray(elements);
  8740. }
  8741. else if (this.next.isCharacter(lexer_1.$LBRACE)) {
  8742. return this.parseLiteralMap();
  8743. }
  8744. else if (this.next.isIdentifier()) {
  8745. return this.parseAccessMemberOrMethodCall(_implicitReceiver, false);
  8746. }
  8747. else if (this.next.isNumber()) {
  8748. var value = this.next.toNumber();
  8749. this.advance();
  8750. return new ast_1.LiteralPrimitive(value);
  8751. }
  8752. else if (this.next.isString()) {
  8753. var literalValue = this.next.toString();
  8754. this.advance();
  8755. return new ast_1.LiteralPrimitive(literalValue);
  8756. }
  8757. else if (this.index >= this.tokens.length) {
  8758. this.error("Unexpected end of expression: " + this.input);
  8759. }
  8760. else {
  8761. this.error("Unexpected token " + this.next);
  8762. }
  8763. // error() throws, so we don't reach here.
  8764. throw new exceptions_1.BaseException("Fell through all cases in parsePrimary");
  8765. };
  8766. _ParseAST.prototype.parseExpressionList = function (terminator) {
  8767. var result = [];
  8768. if (!this.next.isCharacter(terminator)) {
  8769. do {
  8770. result.push(this.parsePipe());
  8771. } while (this.optionalCharacter(lexer_1.$COMMA));
  8772. }
  8773. return result;
  8774. };
  8775. _ParseAST.prototype.parseLiteralMap = function () {
  8776. var keys = [];
  8777. var values = [];
  8778. this.expectCharacter(lexer_1.$LBRACE);
  8779. if (!this.optionalCharacter(lexer_1.$RBRACE)) {
  8780. do {
  8781. var key = this.expectIdentifierOrKeywordOrString();
  8782. keys.push(key);
  8783. this.expectCharacter(lexer_1.$COLON);
  8784. values.push(this.parsePipe());
  8785. } while (this.optionalCharacter(lexer_1.$COMMA));
  8786. this.expectCharacter(lexer_1.$RBRACE);
  8787. }
  8788. return new ast_1.LiteralMap(keys, values);
  8789. };
  8790. _ParseAST.prototype.parseAccessMemberOrMethodCall = function (receiver, isSafe) {
  8791. if (isSafe === void 0) { isSafe = false; }
  8792. var id = this.expectIdentifierOrKeyword();
  8793. if (this.optionalCharacter(lexer_1.$LPAREN)) {
  8794. var args = this.parseCallArguments();
  8795. this.expectCharacter(lexer_1.$RPAREN);
  8796. var fn = this.reflector.method(id);
  8797. return isSafe ? new ast_1.SafeMethodCall(receiver, id, fn, args) :
  8798. new ast_1.MethodCall(receiver, id, fn, args);
  8799. }
  8800. else {
  8801. if (isSafe) {
  8802. if (this.optionalOperator("=")) {
  8803. this.error("The '?.' operator cannot be used in the assignment");
  8804. }
  8805. else {
  8806. return new ast_1.SafePropertyRead(receiver, id, this.reflector.getter(id));
  8807. }
  8808. }
  8809. else {
  8810. if (this.optionalOperator("=")) {
  8811. if (!this.parseAction) {
  8812. this.error("Bindings cannot contain assignments");
  8813. }
  8814. var value = this.parseConditional();
  8815. return new ast_1.PropertyWrite(receiver, id, this.reflector.setter(id), value);
  8816. }
  8817. else {
  8818. return new ast_1.PropertyRead(receiver, id, this.reflector.getter(id));
  8819. }
  8820. }
  8821. }
  8822. return null;
  8823. };
  8824. _ParseAST.prototype.parseCallArguments = function () {
  8825. if (this.next.isCharacter(lexer_1.$RPAREN))
  8826. return [];
  8827. var positionals = [];
  8828. do {
  8829. positionals.push(this.parsePipe());
  8830. } while (this.optionalCharacter(lexer_1.$COMMA));
  8831. return positionals;
  8832. };
  8833. _ParseAST.prototype.parseBlockContent = function () {
  8834. if (!this.parseAction) {
  8835. this.error("Binding expression cannot contain chained expression");
  8836. }
  8837. var exprs = [];
  8838. while (this.index < this.tokens.length && !this.next.isCharacter(lexer_1.$RBRACE)) {
  8839. var expr = this.parseExpression();
  8840. exprs.push(expr);
  8841. if (this.optionalCharacter(lexer_1.$SEMICOLON)) {
  8842. while (this.optionalCharacter(lexer_1.$SEMICOLON)) {
  8843. } // read all semicolons
  8844. }
  8845. }
  8846. if (exprs.length == 0)
  8847. return new ast_1.EmptyExpr();
  8848. if (exprs.length == 1)
  8849. return exprs[0];
  8850. return new ast_1.Chain(exprs);
  8851. };
  8852. /**
  8853. * An identifier, a keyword, a string with an optional `-` inbetween.
  8854. */
  8855. _ParseAST.prototype.expectTemplateBindingKey = function () {
  8856. var result = '';
  8857. var operatorFound = false;
  8858. do {
  8859. result += this.expectIdentifierOrKeywordOrString();
  8860. operatorFound = this.optionalOperator('-');
  8861. if (operatorFound) {
  8862. result += '-';
  8863. }
  8864. } while (operatorFound);
  8865. return result.toString();
  8866. };
  8867. _ParseAST.prototype.parseTemplateBindings = function () {
  8868. var bindings = [];
  8869. var prefix = null;
  8870. while (this.index < this.tokens.length) {
  8871. var keyIsVar = this.optionalKeywordVar();
  8872. var key = this.expectTemplateBindingKey();
  8873. if (!keyIsVar) {
  8874. if (prefix == null) {
  8875. prefix = key;
  8876. }
  8877. else {
  8878. key = prefix + key[0].toUpperCase() + key.substring(1);
  8879. }
  8880. }
  8881. this.optionalCharacter(lexer_1.$COLON);
  8882. var name = null;
  8883. var expression = null;
  8884. if (keyIsVar) {
  8885. if (this.optionalOperator("=")) {
  8886. name = this.expectTemplateBindingKey();
  8887. }
  8888. else {
  8889. name = '\$implicit';
  8890. }
  8891. }
  8892. else if (this.next !== lexer_1.EOF && !this.peekKeywordVar()) {
  8893. var start = this.inputIndex;
  8894. var ast = this.parsePipe();
  8895. var source = this.input.substring(start, this.inputIndex);
  8896. expression = new ast_1.ASTWithSource(ast, source, this.location);
  8897. }
  8898. bindings.push(new ast_1.TemplateBinding(key, keyIsVar, name, expression));
  8899. if (!this.optionalCharacter(lexer_1.$SEMICOLON)) {
  8900. this.optionalCharacter(lexer_1.$COMMA);
  8901. }
  8902. }
  8903. return bindings;
  8904. };
  8905. _ParseAST.prototype.error = function (message, index) {
  8906. if (index === void 0) { index = null; }
  8907. if (lang_1.isBlank(index))
  8908. index = this.index;
  8909. var location = (index < this.tokens.length) ? "at column " + (this.tokens[index].index + 1) + " in" :
  8910. "at the end of the expression";
  8911. throw new ParseException(message, this.input, location, this.location);
  8912. };
  8913. return _ParseAST;
  8914. })();
  8915. exports._ParseAST = _ParseAST;
  8916. var SimpleExpressionChecker = (function () {
  8917. function SimpleExpressionChecker() {
  8918. this.simple = true;
  8919. }
  8920. SimpleExpressionChecker.check = function (ast) {
  8921. var s = new SimpleExpressionChecker();
  8922. ast.visit(s);
  8923. return s.simple;
  8924. };
  8925. SimpleExpressionChecker.prototype.visitImplicitReceiver = function (ast) { };
  8926. SimpleExpressionChecker.prototype.visitInterpolation = function (ast) { this.simple = false; };
  8927. SimpleExpressionChecker.prototype.visitLiteralPrimitive = function (ast) { };
  8928. SimpleExpressionChecker.prototype.visitPropertyRead = function (ast) { };
  8929. SimpleExpressionChecker.prototype.visitPropertyWrite = function (ast) { this.simple = false; };
  8930. SimpleExpressionChecker.prototype.visitSafePropertyRead = function (ast) { this.simple = false; };
  8931. SimpleExpressionChecker.prototype.visitMethodCall = function (ast) { this.simple = false; };
  8932. SimpleExpressionChecker.prototype.visitSafeMethodCall = function (ast) { this.simple = false; };
  8933. SimpleExpressionChecker.prototype.visitFunctionCall = function (ast) { this.simple = false; };
  8934. SimpleExpressionChecker.prototype.visitLiteralArray = function (ast) { this.visitAll(ast.expressions); };
  8935. SimpleExpressionChecker.prototype.visitLiteralMap = function (ast) { this.visitAll(ast.values); };
  8936. SimpleExpressionChecker.prototype.visitBinary = function (ast) { this.simple = false; };
  8937. SimpleExpressionChecker.prototype.visitPrefixNot = function (ast) { this.simple = false; };
  8938. SimpleExpressionChecker.prototype.visitConditional = function (ast) { this.simple = false; };
  8939. SimpleExpressionChecker.prototype.visitPipe = function (ast) { this.simple = false; };
  8940. SimpleExpressionChecker.prototype.visitKeyedRead = function (ast) { this.simple = false; };
  8941. SimpleExpressionChecker.prototype.visitKeyedWrite = function (ast) { this.simple = false; };
  8942. SimpleExpressionChecker.prototype.visitAll = function (asts) {
  8943. var res = collection_1.ListWrapper.createFixedSize(asts.length);
  8944. for (var i = 0; i < asts.length; ++i) {
  8945. res[i] = asts[i].visit(this);
  8946. }
  8947. return res;
  8948. };
  8949. SimpleExpressionChecker.prototype.visitChain = function (ast) { this.simple = false; };
  8950. SimpleExpressionChecker.prototype.visitQuote = function (ast) { this.simple = false; };
  8951. return SimpleExpressionChecker;
  8952. })();
  8953. /***/ },
  8954. /* 33 */
  8955. /***/ function(module, exports, __webpack_require__) {
  8956. var lang_1 = __webpack_require__(5);
  8957. var exceptions_1 = __webpack_require__(14);
  8958. var collection_1 = __webpack_require__(12);
  8959. var Locals = (function () {
  8960. function Locals(parent, current) {
  8961. this.parent = parent;
  8962. this.current = current;
  8963. }
  8964. Locals.prototype.contains = function (name) {
  8965. if (this.current.has(name)) {
  8966. return true;
  8967. }
  8968. if (lang_1.isPresent(this.parent)) {
  8969. return this.parent.contains(name);
  8970. }
  8971. return false;
  8972. };
  8973. Locals.prototype.get = function (name) {
  8974. if (this.current.has(name)) {
  8975. return this.current.get(name);
  8976. }
  8977. if (lang_1.isPresent(this.parent)) {
  8978. return this.parent.get(name);
  8979. }
  8980. throw new exceptions_1.BaseException("Cannot find '" + name + "'");
  8981. };
  8982. Locals.prototype.set = function (name, value) {
  8983. // TODO(rado): consider removing this check if we can guarantee this is not
  8984. // exposed to the public API.
  8985. // TODO: vsavkin maybe it should check only the local map
  8986. if (this.current.has(name)) {
  8987. this.current.set(name, value);
  8988. }
  8989. else {
  8990. throw new exceptions_1.BaseException("Setting of new keys post-construction is not supported. Key: " + name + ".");
  8991. }
  8992. };
  8993. Locals.prototype.clearValues = function () { collection_1.MapWrapper.clearValues(this.current); };
  8994. return Locals;
  8995. })();
  8996. exports.Locals = Locals;
  8997. /***/ },
  8998. /* 34 */
  8999. /***/ function(module, exports, __webpack_require__) {
  9000. var __extends = (this && this.__extends) || function (d, b) {
  9001. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  9002. function __() { this.constructor = d; }
  9003. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  9004. };
  9005. var exceptions_1 = __webpack_require__(14);
  9006. /**
  9007. * An error thrown if application changes model breaking the top-down data flow.
  9008. *
  9009. * This exception is only thrown in dev mode.
  9010. *
  9011. * <!-- TODO: Add a link once the dev mode option is configurable -->
  9012. *
  9013. * ### Example
  9014. *
  9015. * ```typescript
  9016. * @Component({
  9017. * selector: 'parent',
  9018. * template: `
  9019. * <child [prop]="parentProp"></child>
  9020. * `,
  9021. * directives: [forwardRef(() => Child)]
  9022. * })
  9023. * class Parent {
  9024. * parentProp = "init";
  9025. * }
  9026. *
  9027. * @Directive({selector: 'child', inputs: ['prop']})
  9028. * class Child {
  9029. * constructor(public parent: Parent) {}
  9030. *
  9031. * set prop(v) {
  9032. * // this updates the parent property, which is disallowed during change detection
  9033. * // this will result in ExpressionChangedAfterItHasBeenCheckedException
  9034. * this.parent.parentProp = "updated";
  9035. * }
  9036. * }
  9037. * ```
  9038. */
  9039. var ExpressionChangedAfterItHasBeenCheckedException = (function (_super) {
  9040. __extends(ExpressionChangedAfterItHasBeenCheckedException, _super);
  9041. function ExpressionChangedAfterItHasBeenCheckedException(exp, oldValue, currValue, context) {
  9042. _super.call(this, ("Expression '" + exp + "' has changed after it was checked. ") +
  9043. ("Previous value: '" + oldValue + "'. Current value: '" + currValue + "'"));
  9044. }
  9045. return ExpressionChangedAfterItHasBeenCheckedException;
  9046. })(exceptions_1.BaseException);
  9047. exports.ExpressionChangedAfterItHasBeenCheckedException = ExpressionChangedAfterItHasBeenCheckedException;
  9048. /**
  9049. * Thrown when an expression evaluation raises an exception.
  9050. *
  9051. * This error wraps the original exception to attach additional contextual information that can
  9052. * be useful for debugging.
  9053. *
  9054. * ### Example ([live demo](http://plnkr.co/edit/2Kywoz?p=preview))
  9055. *
  9056. * ```typescript
  9057. * @Directive({selector: 'child', inputs: ['prop']})
  9058. * class Child {
  9059. * prop;
  9060. * }
  9061. *
  9062. * @Component({
  9063. * selector: 'app',
  9064. * template: `
  9065. * <child [prop]="field.first"></child>
  9066. * `,
  9067. * directives: [Child]
  9068. * })
  9069. * class App {
  9070. * field = null;
  9071. * }
  9072. *
  9073. * bootstrap(App);
  9074. * ```
  9075. *
  9076. * You can access the original exception and stack through the `originalException` and
  9077. * `originalStack` properties.
  9078. */
  9079. var ChangeDetectionError = (function (_super) {
  9080. __extends(ChangeDetectionError, _super);
  9081. function ChangeDetectionError(exp, originalException, originalStack, context) {
  9082. _super.call(this, originalException + " in [" + exp + "]", originalException, originalStack, context);
  9083. this.location = exp;
  9084. }
  9085. return ChangeDetectionError;
  9086. })(exceptions_1.WrappedException);
  9087. exports.ChangeDetectionError = ChangeDetectionError;
  9088. /**
  9089. * Thrown when change detector executes on dehydrated view.
  9090. *
  9091. * This error indicates a bug in the framework.
  9092. *
  9093. * This is an internal Angular error.
  9094. */
  9095. var DehydratedException = (function (_super) {
  9096. __extends(DehydratedException, _super);
  9097. function DehydratedException() {
  9098. _super.call(this, 'Attempt to detect changes on a dehydrated detector.');
  9099. }
  9100. return DehydratedException;
  9101. })(exceptions_1.BaseException);
  9102. exports.DehydratedException = DehydratedException;
  9103. /***/ },
  9104. /* 35 */
  9105. /***/ function(module, exports) {
  9106. var DebugContext = (function () {
  9107. function DebugContext(element, componentElement, directive, context, locals, injector) {
  9108. this.element = element;
  9109. this.componentElement = componentElement;
  9110. this.directive = directive;
  9111. this.context = context;
  9112. this.locals = locals;
  9113. this.injector = injector;
  9114. }
  9115. return DebugContext;
  9116. })();
  9117. exports.DebugContext = DebugContext;
  9118. var ChangeDetectorGenConfig = (function () {
  9119. function ChangeDetectorGenConfig(genDebugInfo, logBindingUpdate, useJit) {
  9120. this.genDebugInfo = genDebugInfo;
  9121. this.logBindingUpdate = logBindingUpdate;
  9122. this.useJit = useJit;
  9123. }
  9124. return ChangeDetectorGenConfig;
  9125. })();
  9126. exports.ChangeDetectorGenConfig = ChangeDetectorGenConfig;
  9127. var ChangeDetectorDefinition = (function () {
  9128. function ChangeDetectorDefinition(id, strategy, variableNames, bindingRecords, eventRecords, directiveRecords, genConfig) {
  9129. this.id = id;
  9130. this.strategy = strategy;
  9131. this.variableNames = variableNames;
  9132. this.bindingRecords = bindingRecords;
  9133. this.eventRecords = eventRecords;
  9134. this.directiveRecords = directiveRecords;
  9135. this.genConfig = genConfig;
  9136. }
  9137. return ChangeDetectorDefinition;
  9138. })();
  9139. exports.ChangeDetectorDefinition = ChangeDetectorDefinition;
  9140. /***/ },
  9141. /* 36 */
  9142. /***/ function(module, exports, __webpack_require__) {
  9143. var lang_1 = __webpack_require__(5);
  9144. /**
  9145. * Describes the current state of the change detector.
  9146. */
  9147. (function (ChangeDetectorState) {
  9148. /**
  9149. * `NeverChecked` means that the change detector has not been checked yet, and
  9150. * initialization methods should be called during detection.
  9151. */
  9152. ChangeDetectorState[ChangeDetectorState["NeverChecked"] = 0] = "NeverChecked";
  9153. /**
  9154. * `CheckedBefore` means that the change detector has successfully completed at least
  9155. * one detection previously.
  9156. */
  9157. ChangeDetectorState[ChangeDetectorState["CheckedBefore"] = 1] = "CheckedBefore";
  9158. /**
  9159. * `Errored` means that the change detector encountered an error checking a binding
  9160. * or calling a directive lifecycle method and is now in an inconsistent state. Change
  9161. * detectors in this state will no longer detect changes.
  9162. */
  9163. ChangeDetectorState[ChangeDetectorState["Errored"] = 2] = "Errored";
  9164. })(exports.ChangeDetectorState || (exports.ChangeDetectorState = {}));
  9165. var ChangeDetectorState = exports.ChangeDetectorState;
  9166. /**
  9167. * Describes within the change detector which strategy will be used the next time change
  9168. * detection is triggered.
  9169. */
  9170. (function (ChangeDetectionStrategy) {
  9171. /**
  9172. * `CheckedOnce` means that after calling detectChanges the mode of the change detector
  9173. * will become `Checked`.
  9174. */
  9175. ChangeDetectionStrategy[ChangeDetectionStrategy["CheckOnce"] = 0] = "CheckOnce";
  9176. /**
  9177. * `Checked` means that the change detector should be skipped until its mode changes to
  9178. * `CheckOnce`.
  9179. */
  9180. ChangeDetectionStrategy[ChangeDetectionStrategy["Checked"] = 1] = "Checked";
  9181. /**
  9182. * `CheckAlways` means that after calling detectChanges the mode of the change detector
  9183. * will remain `CheckAlways`.
  9184. */
  9185. ChangeDetectionStrategy[ChangeDetectionStrategy["CheckAlways"] = 2] = "CheckAlways";
  9186. /**
  9187. * `Detached` means that the change detector sub tree is not a part of the main tree and
  9188. * should be skipped.
  9189. */
  9190. ChangeDetectionStrategy[ChangeDetectionStrategy["Detached"] = 3] = "Detached";
  9191. /**
  9192. * `OnPush` means that the change detector's mode will be set to `CheckOnce` during hydration.
  9193. */
  9194. ChangeDetectionStrategy[ChangeDetectionStrategy["OnPush"] = 4] = "OnPush";
  9195. /**
  9196. * `Default` means that the change detector's mode will be set to `CheckAlways` during hydration.
  9197. */
  9198. ChangeDetectionStrategy[ChangeDetectionStrategy["Default"] = 5] = "Default";
  9199. /**
  9200. * This is an experimental feature. Works only in Dart.
  9201. */
  9202. ChangeDetectionStrategy[ChangeDetectionStrategy["OnPushObserve"] = 6] = "OnPushObserve";
  9203. })(exports.ChangeDetectionStrategy || (exports.ChangeDetectionStrategy = {}));
  9204. var ChangeDetectionStrategy = exports.ChangeDetectionStrategy;
  9205. /**
  9206. * List of possible {@link ChangeDetectionStrategy} values.
  9207. */
  9208. exports.CHANGE_DETECTION_STRATEGY_VALUES = [
  9209. ChangeDetectionStrategy.CheckOnce,
  9210. ChangeDetectionStrategy.Checked,
  9211. ChangeDetectionStrategy.CheckAlways,
  9212. ChangeDetectionStrategy.Detached,
  9213. ChangeDetectionStrategy.OnPush,
  9214. ChangeDetectionStrategy.Default,
  9215. ChangeDetectionStrategy.OnPushObserve
  9216. ];
  9217. /**
  9218. * List of possible {@link ChangeDetectorState} values.
  9219. */
  9220. exports.CHANGE_DETECTOR_STATE_VALUES = [
  9221. ChangeDetectorState.NeverChecked,
  9222. ChangeDetectorState.CheckedBefore,
  9223. ChangeDetectorState.Errored
  9224. ];
  9225. function isDefaultChangeDetectionStrategy(changeDetectionStrategy) {
  9226. return lang_1.isBlank(changeDetectionStrategy) ||
  9227. changeDetectionStrategy === ChangeDetectionStrategy.Default;
  9228. }
  9229. exports.isDefaultChangeDetectionStrategy = isDefaultChangeDetectionStrategy;
  9230. /***/ },
  9231. /* 37 */
  9232. /***/ function(module, exports, __webpack_require__) {
  9233. var lang_1 = __webpack_require__(5);
  9234. var exceptions_1 = __webpack_require__(14);
  9235. var collection_1 = __webpack_require__(12);
  9236. var ast_1 = __webpack_require__(30);
  9237. var change_detection_util_1 = __webpack_require__(38);
  9238. var dynamic_change_detector_1 = __webpack_require__(42);
  9239. var directive_record_1 = __webpack_require__(41);
  9240. var event_binding_1 = __webpack_require__(49);
  9241. var coalesce_1 = __webpack_require__(50);
  9242. var proto_record_1 = __webpack_require__(48);
  9243. var DynamicProtoChangeDetector = (function () {
  9244. function DynamicProtoChangeDetector(_definition) {
  9245. this._definition = _definition;
  9246. this._propertyBindingRecords = createPropertyRecords(_definition);
  9247. this._eventBindingRecords = createEventRecords(_definition);
  9248. this._propertyBindingTargets = this._definition.bindingRecords.map(function (b) { return b.target; });
  9249. this._directiveIndices = this._definition.directiveRecords.map(function (d) { return d.directiveIndex; });
  9250. }
  9251. DynamicProtoChangeDetector.prototype.instantiate = function (dispatcher) {
  9252. 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);
  9253. };
  9254. return DynamicProtoChangeDetector;
  9255. })();
  9256. exports.DynamicProtoChangeDetector = DynamicProtoChangeDetector;
  9257. function createPropertyRecords(definition) {
  9258. var recordBuilder = new ProtoRecordBuilder();
  9259. collection_1.ListWrapper.forEachWithIndex(definition.bindingRecords, function (b, index) { return recordBuilder.add(b, definition.variableNames, index); });
  9260. return coalesce_1.coalesce(recordBuilder.records);
  9261. }
  9262. exports.createPropertyRecords = createPropertyRecords;
  9263. function createEventRecords(definition) {
  9264. // TODO: vsavkin: remove $event when the compiler handles render-side variables properly
  9265. var varNames = collection_1.ListWrapper.concat(['$event'], definition.variableNames);
  9266. return definition.eventRecords.map(function (er) {
  9267. var records = _ConvertAstIntoProtoRecords.create(er, varNames);
  9268. var dirIndex = er.implicitReceiver instanceof directive_record_1.DirectiveIndex ? er.implicitReceiver : null;
  9269. return new event_binding_1.EventBinding(er.target.name, er.target.elementIndex, dirIndex, records);
  9270. });
  9271. }
  9272. exports.createEventRecords = createEventRecords;
  9273. var ProtoRecordBuilder = (function () {
  9274. function ProtoRecordBuilder() {
  9275. this.records = [];
  9276. }
  9277. ProtoRecordBuilder.prototype.add = function (b, variableNames, bindingIndex) {
  9278. var oldLast = collection_1.ListWrapper.last(this.records);
  9279. if (lang_1.isPresent(oldLast) && oldLast.bindingRecord.directiveRecord == b.directiveRecord) {
  9280. oldLast.lastInDirective = false;
  9281. }
  9282. var numberOfRecordsBefore = this.records.length;
  9283. this._appendRecords(b, variableNames, bindingIndex);
  9284. var newLast = collection_1.ListWrapper.last(this.records);
  9285. if (lang_1.isPresent(newLast) && newLast !== oldLast) {
  9286. newLast.lastInBinding = true;
  9287. newLast.lastInDirective = true;
  9288. this._setArgumentToPureFunction(numberOfRecordsBefore);
  9289. }
  9290. };
  9291. /** @internal */
  9292. ProtoRecordBuilder.prototype._setArgumentToPureFunction = function (startIndex) {
  9293. var _this = this;
  9294. for (var i = startIndex; i < this.records.length; ++i) {
  9295. var rec = this.records[i];
  9296. if (rec.isPureFunction()) {
  9297. rec.args.forEach(function (recordIndex) { return _this.records[recordIndex - 1].argumentToPureFunction =
  9298. true; });
  9299. }
  9300. if (rec.mode === proto_record_1.RecordType.Pipe) {
  9301. rec.args.forEach(function (recordIndex) { return _this.records[recordIndex - 1].argumentToPureFunction =
  9302. true; });
  9303. this.records[rec.contextIndex - 1].argumentToPureFunction = true;
  9304. }
  9305. }
  9306. };
  9307. /** @internal */
  9308. ProtoRecordBuilder.prototype._appendRecords = function (b, variableNames, bindingIndex) {
  9309. if (b.isDirectiveLifecycle()) {
  9310. 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));
  9311. }
  9312. else {
  9313. _ConvertAstIntoProtoRecords.append(this.records, b, variableNames, bindingIndex);
  9314. }
  9315. };
  9316. return ProtoRecordBuilder;
  9317. })();
  9318. exports.ProtoRecordBuilder = ProtoRecordBuilder;
  9319. var _ConvertAstIntoProtoRecords = (function () {
  9320. function _ConvertAstIntoProtoRecords(_records, _bindingRecord, _variableNames, _bindingIndex) {
  9321. this._records = _records;
  9322. this._bindingRecord = _bindingRecord;
  9323. this._variableNames = _variableNames;
  9324. this._bindingIndex = _bindingIndex;
  9325. }
  9326. _ConvertAstIntoProtoRecords.append = function (records, b, variableNames, bindingIndex) {
  9327. var c = new _ConvertAstIntoProtoRecords(records, b, variableNames, bindingIndex);
  9328. b.ast.visit(c);
  9329. };
  9330. _ConvertAstIntoProtoRecords.create = function (b, variableNames) {
  9331. var rec = [];
  9332. _ConvertAstIntoProtoRecords.append(rec, b, variableNames, null);
  9333. rec[rec.length - 1].lastInBinding = true;
  9334. return rec;
  9335. };
  9336. _ConvertAstIntoProtoRecords.prototype.visitImplicitReceiver = function (ast) { return this._bindingRecord.implicitReceiver; };
  9337. _ConvertAstIntoProtoRecords.prototype.visitInterpolation = function (ast) {
  9338. var args = this._visitAll(ast.expressions);
  9339. return this._addRecord(proto_record_1.RecordType.Interpolate, "interpolate", _interpolationFn(ast.strings), args, ast.strings, 0);
  9340. };
  9341. _ConvertAstIntoProtoRecords.prototype.visitLiteralPrimitive = function (ast) {
  9342. return this._addRecord(proto_record_1.RecordType.Const, "literal", ast.value, [], null, 0);
  9343. };
  9344. _ConvertAstIntoProtoRecords.prototype.visitPropertyRead = function (ast) {
  9345. var receiver = ast.receiver.visit(this);
  9346. if (lang_1.isPresent(this._variableNames) && collection_1.ListWrapper.contains(this._variableNames, ast.name) &&
  9347. ast.receiver instanceof ast_1.ImplicitReceiver) {
  9348. return this._addRecord(proto_record_1.RecordType.Local, ast.name, ast.name, [], null, receiver);
  9349. }
  9350. else {
  9351. return this._addRecord(proto_record_1.RecordType.PropertyRead, ast.name, ast.getter, [], null, receiver);
  9352. }
  9353. };
  9354. _ConvertAstIntoProtoRecords.prototype.visitPropertyWrite = function (ast) {
  9355. if (lang_1.isPresent(this._variableNames) && collection_1.ListWrapper.contains(this._variableNames, ast.name) &&
  9356. ast.receiver instanceof ast_1.ImplicitReceiver) {
  9357. throw new exceptions_1.BaseException("Cannot reassign a variable binding " + ast.name);
  9358. }
  9359. else {
  9360. var receiver = ast.receiver.visit(this);
  9361. var value = ast.value.visit(this);
  9362. return this._addRecord(proto_record_1.RecordType.PropertyWrite, ast.name, ast.setter, [value], null, receiver);
  9363. }
  9364. };
  9365. _ConvertAstIntoProtoRecords.prototype.visitKeyedWrite = function (ast) {
  9366. var obj = ast.obj.visit(this);
  9367. var key = ast.key.visit(this);
  9368. var value = ast.value.visit(this);
  9369. return this._addRecord(proto_record_1.RecordType.KeyedWrite, null, null, [key, value], null, obj);
  9370. };
  9371. _ConvertAstIntoProtoRecords.prototype.visitSafePropertyRead = function (ast) {
  9372. var receiver = ast.receiver.visit(this);
  9373. return this._addRecord(proto_record_1.RecordType.SafeProperty, ast.name, ast.getter, [], null, receiver);
  9374. };
  9375. _ConvertAstIntoProtoRecords.prototype.visitMethodCall = function (ast) {
  9376. var receiver = ast.receiver.visit(this);
  9377. var args = this._visitAll(ast.args);
  9378. if (lang_1.isPresent(this._variableNames) && collection_1.ListWrapper.contains(this._variableNames, ast.name)) {
  9379. var target = this._addRecord(proto_record_1.RecordType.Local, ast.name, ast.name, [], null, receiver);
  9380. return this._addRecord(proto_record_1.RecordType.InvokeClosure, "closure", null, args, null, target);
  9381. }
  9382. else {
  9383. return this._addRecord(proto_record_1.RecordType.InvokeMethod, ast.name, ast.fn, args, null, receiver);
  9384. }
  9385. };
  9386. _ConvertAstIntoProtoRecords.prototype.visitSafeMethodCall = function (ast) {
  9387. var receiver = ast.receiver.visit(this);
  9388. var args = this._visitAll(ast.args);
  9389. return this._addRecord(proto_record_1.RecordType.SafeMethodInvoke, ast.name, ast.fn, args, null, receiver);
  9390. };
  9391. _ConvertAstIntoProtoRecords.prototype.visitFunctionCall = function (ast) {
  9392. var target = ast.target.visit(this);
  9393. var args = this._visitAll(ast.args);
  9394. return this._addRecord(proto_record_1.RecordType.InvokeClosure, "closure", null, args, null, target);
  9395. };
  9396. _ConvertAstIntoProtoRecords.prototype.visitLiteralArray = function (ast) {
  9397. var primitiveName = "arrayFn" + ast.expressions.length;
  9398. return this._addRecord(proto_record_1.RecordType.CollectionLiteral, primitiveName, _arrayFn(ast.expressions.length), this._visitAll(ast.expressions), null, 0);
  9399. };
  9400. _ConvertAstIntoProtoRecords.prototype.visitLiteralMap = function (ast) {
  9401. 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);
  9402. };
  9403. _ConvertAstIntoProtoRecords.prototype.visitBinary = function (ast) {
  9404. var left = ast.left.visit(this);
  9405. switch (ast.operation) {
  9406. case '&&':
  9407. var branchEnd = [null];
  9408. this._addRecord(proto_record_1.RecordType.SkipRecordsIfNot, "SkipRecordsIfNot", 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, right, left], null, 0);
  9412. case '||':
  9413. var branchEnd = [null];
  9414. this._addRecord(proto_record_1.RecordType.SkipRecordsIf, "SkipRecordsIf", null, [], branchEnd, left);
  9415. var right = ast.right.visit(this);
  9416. branchEnd[0] = right;
  9417. return this._addRecord(proto_record_1.RecordType.PrimitiveOp, "cond", change_detection_util_1.ChangeDetectionUtil.cond, [left, left, right], null, 0);
  9418. default:
  9419. var right = ast.right.visit(this);
  9420. return this._addRecord(proto_record_1.RecordType.PrimitiveOp, _operationToPrimitiveName(ast.operation), _operationToFunction(ast.operation), [left, right], null, 0);
  9421. }
  9422. };
  9423. _ConvertAstIntoProtoRecords.prototype.visitPrefixNot = function (ast) {
  9424. var exp = ast.expression.visit(this);
  9425. return this._addRecord(proto_record_1.RecordType.PrimitiveOp, "operation_negate", change_detection_util_1.ChangeDetectionUtil.operation_negate, [exp], null, 0);
  9426. };
  9427. _ConvertAstIntoProtoRecords.prototype.visitConditional = function (ast) {
  9428. var condition = ast.condition.visit(this);
  9429. var startOfFalseBranch = [null];
  9430. var endOfFalseBranch = [null];
  9431. this._addRecord(proto_record_1.RecordType.SkipRecordsIfNot, "SkipRecordsIfNot", null, [], startOfFalseBranch, condition);
  9432. var whenTrue = ast.trueExp.visit(this);
  9433. var skip = this._addRecord(proto_record_1.RecordType.SkipRecords, "SkipRecords", null, [], endOfFalseBranch, 0);
  9434. var whenFalse = ast.falseExp.visit(this);
  9435. startOfFalseBranch[0] = skip;
  9436. endOfFalseBranch[0] = whenFalse;
  9437. return this._addRecord(proto_record_1.RecordType.PrimitiveOp, "cond", change_detection_util_1.ChangeDetectionUtil.cond, [condition, whenTrue, whenFalse], null, 0);
  9438. };
  9439. _ConvertAstIntoProtoRecords.prototype.visitPipe = function (ast) {
  9440. var value = ast.exp.visit(this);
  9441. var args = this._visitAll(ast.args);
  9442. return this._addRecord(proto_record_1.RecordType.Pipe, ast.name, ast.name, args, null, value);
  9443. };
  9444. _ConvertAstIntoProtoRecords.prototype.visitKeyedRead = function (ast) {
  9445. var obj = ast.obj.visit(this);
  9446. var key = ast.key.visit(this);
  9447. return this._addRecord(proto_record_1.RecordType.KeyedRead, "keyedAccess", change_detection_util_1.ChangeDetectionUtil.keyedAccess, [key], null, obj);
  9448. };
  9449. _ConvertAstIntoProtoRecords.prototype.visitChain = function (ast) {
  9450. var _this = this;
  9451. var args = ast.expressions.map(function (e) { return e.visit(_this); });
  9452. return this._addRecord(proto_record_1.RecordType.Chain, "chain", null, args, null, 0);
  9453. };
  9454. _ConvertAstIntoProtoRecords.prototype.visitQuote = function (ast) {
  9455. throw new exceptions_1.BaseException(("Caught uninterpreted expression at " + ast.location + ": " + ast.uninterpretedExpression + ". ") +
  9456. ("Expression prefix " + ast.prefix + " did not match a template transformer to interpret the expression."));
  9457. };
  9458. _ConvertAstIntoProtoRecords.prototype._visitAll = function (asts) {
  9459. var res = collection_1.ListWrapper.createFixedSize(asts.length);
  9460. for (var i = 0; i < asts.length; ++i) {
  9461. res[i] = asts[i].visit(this);
  9462. }
  9463. return res;
  9464. };
  9465. /**
  9466. * Adds a `ProtoRecord` and returns its selfIndex.
  9467. */
  9468. _ConvertAstIntoProtoRecords.prototype._addRecord = function (type, name, funcOrValue, args, fixedArgs, context) {
  9469. var selfIndex = this._records.length + 1;
  9470. if (context instanceof directive_record_1.DirectiveIndex) {
  9471. this._records.push(new proto_record_1.ProtoRecord(type, name, funcOrValue, args, fixedArgs, -1, context, selfIndex, this._bindingRecord, false, false, false, false, this._bindingIndex));
  9472. }
  9473. else {
  9474. this._records.push(new proto_record_1.ProtoRecord(type, name, funcOrValue, args, fixedArgs, context, null, selfIndex, this._bindingRecord, false, false, false, false, this._bindingIndex));
  9475. }
  9476. return selfIndex;
  9477. };
  9478. return _ConvertAstIntoProtoRecords;
  9479. })();
  9480. function _arrayFn(length) {
  9481. switch (length) {
  9482. case 0:
  9483. return change_detection_util_1.ChangeDetectionUtil.arrayFn0;
  9484. case 1:
  9485. return change_detection_util_1.ChangeDetectionUtil.arrayFn1;
  9486. case 2:
  9487. return change_detection_util_1.ChangeDetectionUtil.arrayFn2;
  9488. case 3:
  9489. return change_detection_util_1.ChangeDetectionUtil.arrayFn3;
  9490. case 4:
  9491. return change_detection_util_1.ChangeDetectionUtil.arrayFn4;
  9492. case 5:
  9493. return change_detection_util_1.ChangeDetectionUtil.arrayFn5;
  9494. case 6:
  9495. return change_detection_util_1.ChangeDetectionUtil.arrayFn6;
  9496. case 7:
  9497. return change_detection_util_1.ChangeDetectionUtil.arrayFn7;
  9498. case 8:
  9499. return change_detection_util_1.ChangeDetectionUtil.arrayFn8;
  9500. case 9:
  9501. return change_detection_util_1.ChangeDetectionUtil.arrayFn9;
  9502. default:
  9503. throw new exceptions_1.BaseException("Does not support literal maps with more than 9 elements");
  9504. }
  9505. }
  9506. function _mapPrimitiveName(keys) {
  9507. var stringifiedKeys = keys.map(function (k) { return lang_1.isString(k) ? "\"" + k + "\"" : "" + k; }).join(', ');
  9508. return "mapFn([" + stringifiedKeys + "])";
  9509. }
  9510. function _operationToPrimitiveName(operation) {
  9511. switch (operation) {
  9512. case '+':
  9513. return "operation_add";
  9514. case '-':
  9515. return "operation_subtract";
  9516. case '*':
  9517. return "operation_multiply";
  9518. case '/':
  9519. return "operation_divide";
  9520. case '%':
  9521. return "operation_remainder";
  9522. case '==':
  9523. return "operation_equals";
  9524. case '!=':
  9525. return "operation_not_equals";
  9526. case '===':
  9527. return "operation_identical";
  9528. case '!==':
  9529. return "operation_not_identical";
  9530. case '<':
  9531. return "operation_less_then";
  9532. case '>':
  9533. return "operation_greater_then";
  9534. case '<=':
  9535. return "operation_less_or_equals_then";
  9536. case '>=':
  9537. return "operation_greater_or_equals_then";
  9538. default:
  9539. throw new exceptions_1.BaseException("Unsupported operation " + operation);
  9540. }
  9541. }
  9542. function _operationToFunction(operation) {
  9543. switch (operation) {
  9544. case '+':
  9545. return change_detection_util_1.ChangeDetectionUtil.operation_add;
  9546. case '-':
  9547. return change_detection_util_1.ChangeDetectionUtil.operation_subtract;
  9548. case '*':
  9549. return change_detection_util_1.ChangeDetectionUtil.operation_multiply;
  9550. case '/':
  9551. return change_detection_util_1.ChangeDetectionUtil.operation_divide;
  9552. case '%':
  9553. return change_detection_util_1.ChangeDetectionUtil.operation_remainder;
  9554. case '==':
  9555. return change_detection_util_1.ChangeDetectionUtil.operation_equals;
  9556. case '!=':
  9557. return change_detection_util_1.ChangeDetectionUtil.operation_not_equals;
  9558. case '===':
  9559. return change_detection_util_1.ChangeDetectionUtil.operation_identical;
  9560. case '!==':
  9561. return change_detection_util_1.ChangeDetectionUtil.operation_not_identical;
  9562. case '<':
  9563. return change_detection_util_1.ChangeDetectionUtil.operation_less_then;
  9564. case '>':
  9565. return change_detection_util_1.ChangeDetectionUtil.operation_greater_then;
  9566. case '<=':
  9567. return change_detection_util_1.ChangeDetectionUtil.operation_less_or_equals_then;
  9568. case '>=':
  9569. return change_detection_util_1.ChangeDetectionUtil.operation_greater_or_equals_then;
  9570. default:
  9571. throw new exceptions_1.BaseException("Unsupported operation " + operation);
  9572. }
  9573. }
  9574. function s(v) {
  9575. return lang_1.isPresent(v) ? "" + v : '';
  9576. }
  9577. function _interpolationFn(strings) {
  9578. var length = strings.length;
  9579. var c0 = length > 0 ? strings[0] : null;
  9580. var c1 = length > 1 ? strings[1] : null;
  9581. var c2 = length > 2 ? strings[2] : null;
  9582. var c3 = length > 3 ? strings[3] : null;
  9583. var c4 = length > 4 ? strings[4] : null;
  9584. var c5 = length > 5 ? strings[5] : null;
  9585. var c6 = length > 6 ? strings[6] : null;
  9586. var c7 = length > 7 ? strings[7] : null;
  9587. var c8 = length > 8 ? strings[8] : null;
  9588. var c9 = length > 9 ? strings[9] : null;
  9589. switch (length - 1) {
  9590. case 1:
  9591. return function (a1) { return c0 + s(a1) + c1; };
  9592. case 2:
  9593. return function (a1, a2) { return c0 + s(a1) + c1 + s(a2) + c2; };
  9594. case 3:
  9595. return function (a1, a2, a3) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3; };
  9596. case 4:
  9597. return function (a1, a2, a3, a4) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) + c4; };
  9598. case 5:
  9599. return function (a1, a2, a3, a4, a5) {
  9600. return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) + c4 + s(a5) + c5;
  9601. };
  9602. case 6:
  9603. return function (a1, a2, a3, a4, a5, a6) {
  9604. return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) + c4 + s(a5) + c5 + s(a6) + c6;
  9605. };
  9606. case 7:
  9607. return function (a1, a2, a3, a4, a5, a6, a7) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) +
  9608. c4 + s(a5) + c5 + s(a6) + c6 + s(a7) + c7; };
  9609. case 8:
  9610. return function (a1, a2, a3, a4, a5, a6, a7, a8) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 + s(a4) +
  9611. c4 + s(a5) + c5 + s(a6) + c6 + s(a7) + c7 + s(a8) +
  9612. c8; };
  9613. case 9:
  9614. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9) { return c0 + s(a1) + c1 + s(a2) + c2 + s(a3) + c3 +
  9615. s(a4) + c4 + s(a5) + c5 + s(a6) + c6 + s(a7) +
  9616. c7 + s(a8) + c8 + s(a9) + c9; };
  9617. default:
  9618. throw new exceptions_1.BaseException("Does not support more than 9 expressions");
  9619. }
  9620. }
  9621. /***/ },
  9622. /* 38 */
  9623. /***/ function(module, exports, __webpack_require__) {
  9624. var lang_1 = __webpack_require__(5);
  9625. var exceptions_1 = __webpack_require__(14);
  9626. var collection_1 = __webpack_require__(12);
  9627. var constants_1 = __webpack_require__(36);
  9628. var pipe_lifecycle_reflector_1 = __webpack_require__(39);
  9629. var binding_record_1 = __webpack_require__(40);
  9630. var directive_record_1 = __webpack_require__(41);
  9631. /**
  9632. * Indicates that the result of a {@link PipeMetadata} transformation has changed even though the
  9633. * reference
  9634. * has not changed.
  9635. *
  9636. * The wrapped value will be unwrapped by change detection, and the unwrapped value will be stored.
  9637. *
  9638. * Example:
  9639. *
  9640. * ```
  9641. * if (this._latestValue === this._latestReturnedValue) {
  9642. * return this._latestReturnedValue;
  9643. * } else {
  9644. * this._latestReturnedValue = this._latestValue;
  9645. * return WrappedValue.wrap(this._latestValue); // this will force update
  9646. * }
  9647. * ```
  9648. */
  9649. var WrappedValue = (function () {
  9650. function WrappedValue(wrapped) {
  9651. this.wrapped = wrapped;
  9652. }
  9653. WrappedValue.wrap = function (value) {
  9654. var w = _wrappedValues[_wrappedIndex++ % 5];
  9655. w.wrapped = value;
  9656. return w;
  9657. };
  9658. return WrappedValue;
  9659. })();
  9660. exports.WrappedValue = WrappedValue;
  9661. var _wrappedValues = [
  9662. new WrappedValue(null),
  9663. new WrappedValue(null),
  9664. new WrappedValue(null),
  9665. new WrappedValue(null),
  9666. new WrappedValue(null)
  9667. ];
  9668. var _wrappedIndex = 0;
  9669. /**
  9670. * Represents a basic change from a previous to a new value.
  9671. */
  9672. var SimpleChange = (function () {
  9673. function SimpleChange(previousValue, currentValue) {
  9674. this.previousValue = previousValue;
  9675. this.currentValue = currentValue;
  9676. }
  9677. /**
  9678. * Check whether the new value is the first value assigned.
  9679. */
  9680. SimpleChange.prototype.isFirstChange = function () { return this.previousValue === ChangeDetectionUtil.uninitialized; };
  9681. return SimpleChange;
  9682. })();
  9683. exports.SimpleChange = SimpleChange;
  9684. var _simpleChangesIndex = 0;
  9685. var _simpleChanges = [
  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. new SimpleChange(null, null),
  9701. new SimpleChange(null, null),
  9702. new SimpleChange(null, null),
  9703. new SimpleChange(null, null),
  9704. new SimpleChange(null, null),
  9705. new SimpleChange(null, null)
  9706. ];
  9707. function _simpleChange(previousValue, currentValue) {
  9708. var index = _simpleChangesIndex++ % 20;
  9709. var s = _simpleChanges[index];
  9710. s.previousValue = previousValue;
  9711. s.currentValue = currentValue;
  9712. return s;
  9713. }
  9714. /* tslint:disable:requireParameterType */
  9715. var ChangeDetectionUtil = (function () {
  9716. function ChangeDetectionUtil() {
  9717. }
  9718. ChangeDetectionUtil.arrayFn0 = function () { return []; };
  9719. ChangeDetectionUtil.arrayFn1 = function (a1) { return [a1]; };
  9720. ChangeDetectionUtil.arrayFn2 = function (a1, a2) { return [a1, a2]; };
  9721. ChangeDetectionUtil.arrayFn3 = function (a1, a2, a3) { return [a1, a2, a3]; };
  9722. ChangeDetectionUtil.arrayFn4 = function (a1, a2, a3, a4) { return [a1, a2, a3, a4]; };
  9723. ChangeDetectionUtil.arrayFn5 = function (a1, a2, a3, a4, a5) { return [a1, a2, a3, a4, a5]; };
  9724. ChangeDetectionUtil.arrayFn6 = function (a1, a2, a3, a4, a5, a6) { return [a1, a2, a3, a4, a5, a6]; };
  9725. ChangeDetectionUtil.arrayFn7 = function (a1, a2, a3, a4, a5, a6, a7) { return [a1, a2, a3, a4, a5, a6, a7]; };
  9726. ChangeDetectionUtil.arrayFn8 = function (a1, a2, a3, a4, a5, a6, a7, a8) {
  9727. return [a1, a2, a3, a4, a5, a6, a7, a8];
  9728. };
  9729. ChangeDetectionUtil.arrayFn9 = function (a1, a2, a3, a4, a5, a6, a7, a8, a9) {
  9730. return [a1, a2, a3, a4, a5, a6, a7, a8, a9];
  9731. };
  9732. ChangeDetectionUtil.operation_negate = function (value) { return !value; };
  9733. ChangeDetectionUtil.operation_add = function (left, right) { return left + right; };
  9734. ChangeDetectionUtil.operation_subtract = function (left, right) { return left - right; };
  9735. ChangeDetectionUtil.operation_multiply = function (left, right) { return left * right; };
  9736. ChangeDetectionUtil.operation_divide = function (left, right) { return left / right; };
  9737. ChangeDetectionUtil.operation_remainder = function (left, right) { return left % right; };
  9738. ChangeDetectionUtil.operation_equals = function (left, right) { return left == right; };
  9739. ChangeDetectionUtil.operation_not_equals = function (left, right) { return left != right; };
  9740. ChangeDetectionUtil.operation_identical = function (left, right) { return left === right; };
  9741. ChangeDetectionUtil.operation_not_identical = function (left, right) { return left !== right; };
  9742. ChangeDetectionUtil.operation_less_then = function (left, right) { return left < right; };
  9743. ChangeDetectionUtil.operation_greater_then = function (left, right) { return left > right; };
  9744. ChangeDetectionUtil.operation_less_or_equals_then = function (left, right) { return left <= right; };
  9745. ChangeDetectionUtil.operation_greater_or_equals_then = function (left, right) { return left >= right; };
  9746. ChangeDetectionUtil.cond = function (cond, trueVal, falseVal) { return cond ? trueVal : falseVal; };
  9747. ChangeDetectionUtil.mapFn = function (keys) {
  9748. function buildMap(values) {
  9749. var res = collection_1.StringMapWrapper.create();
  9750. for (var i = 0; i < keys.length; ++i) {
  9751. collection_1.StringMapWrapper.set(res, keys[i], values[i]);
  9752. }
  9753. return res;
  9754. }
  9755. switch (keys.length) {
  9756. case 0:
  9757. return function () { return []; };
  9758. case 1:
  9759. return function (a1) { return buildMap([a1]); };
  9760. case 2:
  9761. return function (a1, a2) { return buildMap([a1, a2]); };
  9762. case 3:
  9763. return function (a1, a2, a3) { return buildMap([a1, a2, a3]); };
  9764. case 4:
  9765. return function (a1, a2, a3, a4) { return buildMap([a1, a2, a3, a4]); };
  9766. case 5:
  9767. return function (a1, a2, a3, a4, a5) { return buildMap([a1, a2, a3, a4, a5]); };
  9768. case 6:
  9769. return function (a1, a2, a3, a4, a5, a6) { return buildMap([a1, a2, a3, a4, a5, a6]); };
  9770. case 7:
  9771. return function (a1, a2, a3, a4, a5, a6, a7) { return buildMap([a1, a2, a3, a4, a5, a6, a7]); };
  9772. case 8:
  9773. return function (a1, a2, a3, a4, a5, a6, a7, a8) { return buildMap([a1, a2, a3, a4, a5, a6, a7, a8]); };
  9774. case 9:
  9775. return function (a1, a2, a3, a4, a5, a6, a7, a8, a9) {
  9776. return buildMap([a1, a2, a3, a4, a5, a6, a7, a8, a9]);
  9777. };
  9778. default:
  9779. throw new exceptions_1.BaseException("Does not support literal maps with more than 9 elements");
  9780. }
  9781. };
  9782. ChangeDetectionUtil.keyedAccess = function (obj, args) { return obj[args[0]]; };
  9783. ChangeDetectionUtil.unwrapValue = function (value) {
  9784. if (value instanceof WrappedValue) {
  9785. return value.wrapped;
  9786. }
  9787. else {
  9788. return value;
  9789. }
  9790. };
  9791. ChangeDetectionUtil.changeDetectionMode = function (strategy) {
  9792. return constants_1.isDefaultChangeDetectionStrategy(strategy) ? constants_1.ChangeDetectionStrategy.CheckAlways :
  9793. constants_1.ChangeDetectionStrategy.CheckOnce;
  9794. };
  9795. ChangeDetectionUtil.simpleChange = function (previousValue, currentValue) {
  9796. return _simpleChange(previousValue, currentValue);
  9797. };
  9798. ChangeDetectionUtil.isValueBlank = function (value) { return lang_1.isBlank(value); };
  9799. ChangeDetectionUtil.s = function (value) { return lang_1.isPresent(value) ? "" + value : ''; };
  9800. ChangeDetectionUtil.protoByIndex = function (protos, selfIndex) {
  9801. return selfIndex < 1 ?
  9802. null :
  9803. protos[selfIndex - 1]; // self index is shifted by one because of context
  9804. };
  9805. ChangeDetectionUtil.callPipeOnDestroy = function (selectedPipe) {
  9806. if (pipe_lifecycle_reflector_1.implementsOnDestroy(selectedPipe.pipe)) {
  9807. selectedPipe.pipe.ngOnDestroy();
  9808. }
  9809. };
  9810. ChangeDetectionUtil.bindingTarget = function (mode, elementIndex, name, unit, debug) {
  9811. return new binding_record_1.BindingTarget(mode, elementIndex, name, unit, debug);
  9812. };
  9813. ChangeDetectionUtil.directiveIndex = function (elementIndex, directiveIndex) {
  9814. return new directive_record_1.DirectiveIndex(elementIndex, directiveIndex);
  9815. };
  9816. ChangeDetectionUtil.looseNotIdentical = function (a, b) { return !lang_1.looseIdentical(a, b); };
  9817. ChangeDetectionUtil.uninitialized = lang_1.CONST_EXPR(new Object());
  9818. return ChangeDetectionUtil;
  9819. })();
  9820. exports.ChangeDetectionUtil = ChangeDetectionUtil;
  9821. /***/ },
  9822. /* 39 */
  9823. /***/ function(module, exports) {
  9824. function implementsOnDestroy(pipe) {
  9825. return pipe.constructor.prototype.ngOnDestroy;
  9826. }
  9827. exports.implementsOnDestroy = implementsOnDestroy;
  9828. /***/ },
  9829. /* 40 */
  9830. /***/ function(module, exports, __webpack_require__) {
  9831. var lang_1 = __webpack_require__(5);
  9832. var DIRECTIVE_LIFECYCLE = "directiveLifecycle";
  9833. var BINDING = "native";
  9834. var DIRECTIVE = "directive";
  9835. var ELEMENT_PROPERTY = "elementProperty";
  9836. var ELEMENT_ATTRIBUTE = "elementAttribute";
  9837. var ELEMENT_CLASS = "elementClass";
  9838. var ELEMENT_STYLE = "elementStyle";
  9839. var TEXT_NODE = "textNode";
  9840. var EVENT = "event";
  9841. var HOST_EVENT = "hostEvent";
  9842. var BindingTarget = (function () {
  9843. function BindingTarget(mode, elementIndex, name, unit, debug) {
  9844. this.mode = mode;
  9845. this.elementIndex = elementIndex;
  9846. this.name = name;
  9847. this.unit = unit;
  9848. this.debug = debug;
  9849. }
  9850. BindingTarget.prototype.isDirective = function () { return this.mode === DIRECTIVE; };
  9851. BindingTarget.prototype.isElementProperty = function () { return this.mode === ELEMENT_PROPERTY; };
  9852. BindingTarget.prototype.isElementAttribute = function () { return this.mode === ELEMENT_ATTRIBUTE; };
  9853. BindingTarget.prototype.isElementClass = function () { return this.mode === ELEMENT_CLASS; };
  9854. BindingTarget.prototype.isElementStyle = function () { return this.mode === ELEMENT_STYLE; };
  9855. BindingTarget.prototype.isTextNode = function () { return this.mode === TEXT_NODE; };
  9856. return BindingTarget;
  9857. })();
  9858. exports.BindingTarget = BindingTarget;
  9859. var BindingRecord = (function () {
  9860. function BindingRecord(mode, target, implicitReceiver, ast, setter, lifecycleEvent, directiveRecord) {
  9861. this.mode = mode;
  9862. this.target = target;
  9863. this.implicitReceiver = implicitReceiver;
  9864. this.ast = ast;
  9865. this.setter = setter;
  9866. this.lifecycleEvent = lifecycleEvent;
  9867. this.directiveRecord = directiveRecord;
  9868. }
  9869. BindingRecord.prototype.isDirectiveLifecycle = function () { return this.mode === DIRECTIVE_LIFECYCLE; };
  9870. BindingRecord.prototype.callOnChanges = function () {
  9871. return lang_1.isPresent(this.directiveRecord) && this.directiveRecord.callOnChanges;
  9872. };
  9873. BindingRecord.prototype.isDefaultChangeDetection = function () {
  9874. return lang_1.isBlank(this.directiveRecord) || this.directiveRecord.isDefaultChangeDetection();
  9875. };
  9876. BindingRecord.createDirectiveDoCheck = function (directiveRecord) {
  9877. return new BindingRecord(DIRECTIVE_LIFECYCLE, null, 0, null, null, "DoCheck", directiveRecord);
  9878. };
  9879. BindingRecord.createDirectiveOnInit = function (directiveRecord) {
  9880. return new BindingRecord(DIRECTIVE_LIFECYCLE, null, 0, null, null, "OnInit", directiveRecord);
  9881. };
  9882. BindingRecord.createDirectiveOnChanges = function (directiveRecord) {
  9883. return new BindingRecord(DIRECTIVE_LIFECYCLE, null, 0, null, null, "OnChanges", directiveRecord);
  9884. };
  9885. BindingRecord.createForDirective = function (ast, propertyName, setter, directiveRecord) {
  9886. var elementIndex = directiveRecord.directiveIndex.elementIndex;
  9887. var t = new BindingTarget(DIRECTIVE, elementIndex, propertyName, null, ast.toString());
  9888. return new BindingRecord(DIRECTIVE, t, 0, ast, setter, null, directiveRecord);
  9889. };
  9890. BindingRecord.createForElementProperty = function (ast, elementIndex, propertyName) {
  9891. var t = new BindingTarget(ELEMENT_PROPERTY, elementIndex, propertyName, null, ast.toString());
  9892. return new BindingRecord(BINDING, t, 0, ast, null, null, null);
  9893. };
  9894. BindingRecord.createForElementAttribute = function (ast, elementIndex, attributeName) {
  9895. var t = new BindingTarget(ELEMENT_ATTRIBUTE, elementIndex, attributeName, null, ast.toString());
  9896. return new BindingRecord(BINDING, t, 0, ast, null, null, null);
  9897. };
  9898. BindingRecord.createForElementClass = function (ast, elementIndex, className) {
  9899. var t = new BindingTarget(ELEMENT_CLASS, elementIndex, className, null, ast.toString());
  9900. return new BindingRecord(BINDING, t, 0, ast, null, null, null);
  9901. };
  9902. BindingRecord.createForElementStyle = function (ast, elementIndex, styleName, unit) {
  9903. var t = new BindingTarget(ELEMENT_STYLE, elementIndex, styleName, unit, ast.toString());
  9904. return new BindingRecord(BINDING, t, 0, ast, null, null, null);
  9905. };
  9906. BindingRecord.createForHostProperty = function (directiveIndex, ast, propertyName) {
  9907. var t = new BindingTarget(ELEMENT_PROPERTY, directiveIndex.elementIndex, propertyName, null, ast.toString());
  9908. return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
  9909. };
  9910. BindingRecord.createForHostAttribute = function (directiveIndex, ast, attributeName) {
  9911. var t = new BindingTarget(ELEMENT_ATTRIBUTE, directiveIndex.elementIndex, attributeName, null, ast.toString());
  9912. return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
  9913. };
  9914. BindingRecord.createForHostClass = function (directiveIndex, ast, className) {
  9915. var t = new BindingTarget(ELEMENT_CLASS, directiveIndex.elementIndex, className, null, ast.toString());
  9916. return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
  9917. };
  9918. BindingRecord.createForHostStyle = function (directiveIndex, ast, styleName, unit) {
  9919. var t = new BindingTarget(ELEMENT_STYLE, directiveIndex.elementIndex, styleName, unit, ast.toString());
  9920. return new BindingRecord(BINDING, t, directiveIndex, ast, null, null, null);
  9921. };
  9922. BindingRecord.createForTextNode = function (ast, elementIndex) {
  9923. var t = new BindingTarget(TEXT_NODE, elementIndex, null, null, ast.toString());
  9924. return new BindingRecord(BINDING, t, 0, ast, null, null, null);
  9925. };
  9926. BindingRecord.createForEvent = function (ast, eventName, elementIndex) {
  9927. var t = new BindingTarget(EVENT, elementIndex, eventName, null, ast.toString());
  9928. return new BindingRecord(EVENT, t, 0, ast, null, null, null);
  9929. };
  9930. BindingRecord.createForHostEvent = function (ast, eventName, directiveRecord) {
  9931. var directiveIndex = directiveRecord.directiveIndex;
  9932. var t = new BindingTarget(HOST_EVENT, directiveIndex.elementIndex, eventName, null, ast.toString());
  9933. return new BindingRecord(HOST_EVENT, t, directiveIndex, ast, null, null, directiveRecord);
  9934. };
  9935. return BindingRecord;
  9936. })();
  9937. exports.BindingRecord = BindingRecord;
  9938. /***/ },
  9939. /* 41 */
  9940. /***/ function(module, exports, __webpack_require__) {
  9941. var lang_1 = __webpack_require__(5);
  9942. var constants_1 = __webpack_require__(36);
  9943. var DirectiveIndex = (function () {
  9944. function DirectiveIndex(elementIndex, directiveIndex) {
  9945. this.elementIndex = elementIndex;
  9946. this.directiveIndex = directiveIndex;
  9947. }
  9948. Object.defineProperty(DirectiveIndex.prototype, "name", {
  9949. get: function () { return this.elementIndex + "_" + this.directiveIndex; },
  9950. enumerable: true,
  9951. configurable: true
  9952. });
  9953. return DirectiveIndex;
  9954. })();
  9955. exports.DirectiveIndex = DirectiveIndex;
  9956. var DirectiveRecord = (function () {
  9957. function DirectiveRecord(_a) {
  9958. 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;
  9959. this.directiveIndex = directiveIndex;
  9960. this.callAfterContentInit = lang_1.normalizeBool(callAfterContentInit);
  9961. this.callAfterContentChecked = lang_1.normalizeBool(callAfterContentChecked);
  9962. this.callOnChanges = lang_1.normalizeBool(callOnChanges);
  9963. this.callAfterViewInit = lang_1.normalizeBool(callAfterViewInit);
  9964. this.callAfterViewChecked = lang_1.normalizeBool(callAfterViewChecked);
  9965. this.callDoCheck = lang_1.normalizeBool(callDoCheck);
  9966. this.callOnInit = lang_1.normalizeBool(callOnInit);
  9967. this.changeDetection = changeDetection;
  9968. }
  9969. DirectiveRecord.prototype.isDefaultChangeDetection = function () {
  9970. return constants_1.isDefaultChangeDetectionStrategy(this.changeDetection);
  9971. };
  9972. return DirectiveRecord;
  9973. })();
  9974. exports.DirectiveRecord = DirectiveRecord;
  9975. /***/ },
  9976. /* 42 */
  9977. /***/ function(module, exports, __webpack_require__) {
  9978. var __extends = (this && this.__extends) || function (d, b) {
  9979. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  9980. function __() { this.constructor = d; }
  9981. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  9982. };
  9983. var lang_1 = __webpack_require__(5);
  9984. var exceptions_1 = __webpack_require__(14);
  9985. var collection_1 = __webpack_require__(12);
  9986. var abstract_change_detector_1 = __webpack_require__(43);
  9987. var change_detection_util_1 = __webpack_require__(38);
  9988. var constants_1 = __webpack_require__(36);
  9989. var proto_record_1 = __webpack_require__(48);
  9990. var DynamicChangeDetector = (function (_super) {
  9991. __extends(DynamicChangeDetector, _super);
  9992. function DynamicChangeDetector(id, dispatcher, numberOfPropertyProtoRecords, propertyBindingTargets, directiveIndices, strategy, _records, _eventBindings, _directiveRecords, _genConfig) {
  9993. _super.call(this, id, dispatcher, numberOfPropertyProtoRecords, propertyBindingTargets, directiveIndices, strategy);
  9994. this._records = _records;
  9995. this._eventBindings = _eventBindings;
  9996. this._directiveRecords = _directiveRecords;
  9997. this._genConfig = _genConfig;
  9998. this.directives = null;
  9999. var len = _records.length + 1;
  10000. this.values = collection_1.ListWrapper.createFixedSize(len);
  10001. this.localPipes = collection_1.ListWrapper.createFixedSize(len);
  10002. this.prevContexts = collection_1.ListWrapper.createFixedSize(len);
  10003. this.changes = collection_1.ListWrapper.createFixedSize(len);
  10004. this.dehydrateDirectives(false);
  10005. }
  10006. DynamicChangeDetector.prototype.handleEventInternal = function (eventName, elIndex, locals) {
  10007. var _this = this;
  10008. var preventDefault = false;
  10009. this._matchingEventBindings(eventName, elIndex)
  10010. .forEach(function (rec) {
  10011. var res = _this._processEventBinding(rec, locals);
  10012. if (res === false) {
  10013. preventDefault = true;
  10014. }
  10015. });
  10016. return preventDefault;
  10017. };
  10018. /** @internal */
  10019. DynamicChangeDetector.prototype._processEventBinding = function (eb, locals) {
  10020. var values = collection_1.ListWrapper.createFixedSize(eb.records.length);
  10021. values[0] = this.values[0];
  10022. for (var protoIdx = 0; protoIdx < eb.records.length; ++protoIdx) {
  10023. var proto = eb.records[protoIdx];
  10024. if (proto.isSkipRecord()) {
  10025. protoIdx += this._computeSkipLength(protoIdx, proto, values);
  10026. }
  10027. else {
  10028. var res = this._calculateCurrValue(proto, values, locals);
  10029. if (proto.lastInBinding) {
  10030. this._markPathAsCheckOnce(proto);
  10031. return res;
  10032. }
  10033. else {
  10034. this._writeSelf(proto, res, values);
  10035. }
  10036. }
  10037. }
  10038. throw new exceptions_1.BaseException("Cannot be reached");
  10039. };
  10040. DynamicChangeDetector.prototype._computeSkipLength = function (protoIndex, proto, values) {
  10041. if (proto.mode === proto_record_1.RecordType.SkipRecords) {
  10042. return proto.fixedArgs[0] - protoIndex - 1;
  10043. }
  10044. if (proto.mode === proto_record_1.RecordType.SkipRecordsIf) {
  10045. var condition = this._readContext(proto, values);
  10046. return condition ? proto.fixedArgs[0] - protoIndex - 1 : 0;
  10047. }
  10048. if (proto.mode === proto_record_1.RecordType.SkipRecordsIfNot) {
  10049. var condition = this._readContext(proto, values);
  10050. return condition ? 0 : proto.fixedArgs[0] - protoIndex - 1;
  10051. }
  10052. throw new exceptions_1.BaseException("Cannot be reached");
  10053. };
  10054. /** @internal */
  10055. DynamicChangeDetector.prototype._markPathAsCheckOnce = function (proto) {
  10056. if (!proto.bindingRecord.isDefaultChangeDetection()) {
  10057. var dir = proto.bindingRecord.directiveRecord;
  10058. this._getDetectorFor(dir.directiveIndex).markPathToRootAsCheckOnce();
  10059. }
  10060. };
  10061. /** @internal */
  10062. DynamicChangeDetector.prototype._matchingEventBindings = function (eventName, elIndex) {
  10063. return this._eventBindings.filter(function (eb) { return eb.eventName == eventName && eb.elIndex === elIndex; });
  10064. };
  10065. DynamicChangeDetector.prototype.hydrateDirectives = function (directives) {
  10066. this.values[0] = this.context;
  10067. this.directives = directives;
  10068. if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  10069. for (var i = 0; i < this.directiveIndices.length; ++i) {
  10070. var index = this.directiveIndices[i];
  10071. _super.prototype.observeDirective.call(this, directives.getDirectiveFor(index), i);
  10072. }
  10073. }
  10074. };
  10075. DynamicChangeDetector.prototype.dehydrateDirectives = function (destroyPipes) {
  10076. if (destroyPipes) {
  10077. this._destroyPipes();
  10078. }
  10079. this.values[0] = null;
  10080. this.directives = null;
  10081. collection_1.ListWrapper.fill(this.values, change_detection_util_1.ChangeDetectionUtil.uninitialized, 1);
  10082. collection_1.ListWrapper.fill(this.changes, false);
  10083. collection_1.ListWrapper.fill(this.localPipes, null);
  10084. collection_1.ListWrapper.fill(this.prevContexts, change_detection_util_1.ChangeDetectionUtil.uninitialized);
  10085. };
  10086. /** @internal */
  10087. DynamicChangeDetector.prototype._destroyPipes = function () {
  10088. for (var i = 0; i < this.localPipes.length; ++i) {
  10089. if (lang_1.isPresent(this.localPipes[i])) {
  10090. change_detection_util_1.ChangeDetectionUtil.callPipeOnDestroy(this.localPipes[i]);
  10091. }
  10092. }
  10093. };
  10094. DynamicChangeDetector.prototype.checkNoChanges = function () { this.runDetectChanges(true); };
  10095. DynamicChangeDetector.prototype.detectChangesInRecordsInternal = function (throwOnChange) {
  10096. var protos = this._records;
  10097. var changes = null;
  10098. var isChanged = false;
  10099. for (var protoIdx = 0; protoIdx < protos.length; ++protoIdx) {
  10100. var proto = protos[protoIdx];
  10101. var bindingRecord = proto.bindingRecord;
  10102. var directiveRecord = bindingRecord.directiveRecord;
  10103. if (this._firstInBinding(proto)) {
  10104. this.propertyBindingIndex = proto.propertyBindingIndex;
  10105. }
  10106. if (proto.isLifeCycleRecord()) {
  10107. if (proto.name === "DoCheck" && !throwOnChange) {
  10108. this._getDirectiveFor(directiveRecord.directiveIndex).ngDoCheck();
  10109. }
  10110. else if (proto.name === "OnInit" && !throwOnChange &&
  10111. this.state == constants_1.ChangeDetectorState.NeverChecked) {
  10112. this._getDirectiveFor(directiveRecord.directiveIndex).ngOnInit();
  10113. }
  10114. else if (proto.name === "OnChanges" && lang_1.isPresent(changes) && !throwOnChange) {
  10115. this._getDirectiveFor(directiveRecord.directiveIndex).ngOnChanges(changes);
  10116. }
  10117. }
  10118. else if (proto.isSkipRecord()) {
  10119. protoIdx += this._computeSkipLength(protoIdx, proto, this.values);
  10120. }
  10121. else {
  10122. var change = this._check(proto, throwOnChange, this.values, this.locals);
  10123. if (lang_1.isPresent(change)) {
  10124. this._updateDirectiveOrElement(change, bindingRecord);
  10125. isChanged = true;
  10126. changes = this._addChange(bindingRecord, change, changes);
  10127. }
  10128. }
  10129. if (proto.lastInDirective) {
  10130. changes = null;
  10131. if (isChanged && !bindingRecord.isDefaultChangeDetection()) {
  10132. this._getDetectorFor(directiveRecord.directiveIndex).markAsCheckOnce();
  10133. }
  10134. isChanged = false;
  10135. }
  10136. }
  10137. };
  10138. /** @internal */
  10139. DynamicChangeDetector.prototype._firstInBinding = function (r) {
  10140. var prev = change_detection_util_1.ChangeDetectionUtil.protoByIndex(this._records, r.selfIndex - 1);
  10141. return lang_1.isBlank(prev) || prev.bindingRecord !== r.bindingRecord;
  10142. };
  10143. DynamicChangeDetector.prototype.afterContentLifecycleCallbacksInternal = function () {
  10144. var dirs = this._directiveRecords;
  10145. for (var i = dirs.length - 1; i >= 0; --i) {
  10146. var dir = dirs[i];
  10147. if (dir.callAfterContentInit && this.state == constants_1.ChangeDetectorState.NeverChecked) {
  10148. this._getDirectiveFor(dir.directiveIndex).ngAfterContentInit();
  10149. }
  10150. if (dir.callAfterContentChecked) {
  10151. this._getDirectiveFor(dir.directiveIndex).ngAfterContentChecked();
  10152. }
  10153. }
  10154. };
  10155. DynamicChangeDetector.prototype.afterViewLifecycleCallbacksInternal = function () {
  10156. var dirs = this._directiveRecords;
  10157. for (var i = dirs.length - 1; i >= 0; --i) {
  10158. var dir = dirs[i];
  10159. if (dir.callAfterViewInit && this.state == constants_1.ChangeDetectorState.NeverChecked) {
  10160. this._getDirectiveFor(dir.directiveIndex).ngAfterViewInit();
  10161. }
  10162. if (dir.callAfterViewChecked) {
  10163. this._getDirectiveFor(dir.directiveIndex).ngAfterViewChecked();
  10164. }
  10165. }
  10166. };
  10167. /** @internal */
  10168. DynamicChangeDetector.prototype._updateDirectiveOrElement = function (change, bindingRecord) {
  10169. if (lang_1.isBlank(bindingRecord.directiveRecord)) {
  10170. _super.prototype.notifyDispatcher.call(this, change.currentValue);
  10171. }
  10172. else {
  10173. var directiveIndex = bindingRecord.directiveRecord.directiveIndex;
  10174. bindingRecord.setter(this._getDirectiveFor(directiveIndex), change.currentValue);
  10175. }
  10176. if (this._genConfig.logBindingUpdate) {
  10177. _super.prototype.logBindingUpdate.call(this, change.currentValue);
  10178. }
  10179. };
  10180. /** @internal */
  10181. DynamicChangeDetector.prototype._addChange = function (bindingRecord, change, changes) {
  10182. if (bindingRecord.callOnChanges()) {
  10183. return _super.prototype.addChange.call(this, changes, change.previousValue, change.currentValue);
  10184. }
  10185. else {
  10186. return changes;
  10187. }
  10188. };
  10189. /** @internal */
  10190. DynamicChangeDetector.prototype._getDirectiveFor = function (directiveIndex) {
  10191. return this.directives.getDirectiveFor(directiveIndex);
  10192. };
  10193. /** @internal */
  10194. DynamicChangeDetector.prototype._getDetectorFor = function (directiveIndex) { return this.directives.getDetectorFor(directiveIndex); };
  10195. /** @internal */
  10196. DynamicChangeDetector.prototype._check = function (proto, throwOnChange, values, locals) {
  10197. if (proto.isPipeRecord()) {
  10198. return this._pipeCheck(proto, throwOnChange, values);
  10199. }
  10200. else {
  10201. return this._referenceCheck(proto, throwOnChange, values, locals);
  10202. }
  10203. };
  10204. /** @internal */
  10205. DynamicChangeDetector.prototype._referenceCheck = function (proto, throwOnChange, values, locals) {
  10206. if (this._pureFuncAndArgsDidNotChange(proto)) {
  10207. this._setChanged(proto, false);
  10208. return null;
  10209. }
  10210. var currValue = this._calculateCurrValue(proto, values, locals);
  10211. if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  10212. _super.prototype.observeValue.call(this, currValue, proto.selfIndex);
  10213. }
  10214. if (proto.shouldBeChecked()) {
  10215. var prevValue = this._readSelf(proto, values);
  10216. if (change_detection_util_1.ChangeDetectionUtil.looseNotIdentical(prevValue, currValue)) {
  10217. if (proto.lastInBinding) {
  10218. var change = change_detection_util_1.ChangeDetectionUtil.simpleChange(prevValue, currValue);
  10219. if (throwOnChange)
  10220. this.throwOnChangeError(prevValue, currValue);
  10221. this._writeSelf(proto, currValue, values);
  10222. this._setChanged(proto, true);
  10223. return change;
  10224. }
  10225. else {
  10226. this._writeSelf(proto, currValue, values);
  10227. this._setChanged(proto, true);
  10228. return null;
  10229. }
  10230. }
  10231. else {
  10232. this._setChanged(proto, false);
  10233. return null;
  10234. }
  10235. }
  10236. else {
  10237. this._writeSelf(proto, currValue, values);
  10238. this._setChanged(proto, true);
  10239. return null;
  10240. }
  10241. };
  10242. DynamicChangeDetector.prototype._calculateCurrValue = function (proto, values, locals) {
  10243. switch (proto.mode) {
  10244. case proto_record_1.RecordType.Self:
  10245. return this._readContext(proto, values);
  10246. case proto_record_1.RecordType.Const:
  10247. return proto.funcOrValue;
  10248. case proto_record_1.RecordType.PropertyRead:
  10249. var context = this._readContext(proto, values);
  10250. return proto.funcOrValue(context);
  10251. case proto_record_1.RecordType.SafeProperty:
  10252. var context = this._readContext(proto, values);
  10253. return lang_1.isBlank(context) ? null : proto.funcOrValue(context);
  10254. case proto_record_1.RecordType.PropertyWrite:
  10255. var context = this._readContext(proto, values);
  10256. var value = this._readArgs(proto, values)[0];
  10257. proto.funcOrValue(context, value);
  10258. return value;
  10259. case proto_record_1.RecordType.KeyedWrite:
  10260. var context = this._readContext(proto, values);
  10261. var key = this._readArgs(proto, values)[0];
  10262. var value = this._readArgs(proto, values)[1];
  10263. context[key] = value;
  10264. return value;
  10265. case proto_record_1.RecordType.Local:
  10266. return locals.get(proto.name);
  10267. case proto_record_1.RecordType.InvokeMethod:
  10268. var context = this._readContext(proto, values);
  10269. var args = this._readArgs(proto, values);
  10270. return proto.funcOrValue(context, args);
  10271. case proto_record_1.RecordType.SafeMethodInvoke:
  10272. var context = this._readContext(proto, values);
  10273. if (lang_1.isBlank(context)) {
  10274. return null;
  10275. }
  10276. var args = this._readArgs(proto, values);
  10277. return proto.funcOrValue(context, args);
  10278. case proto_record_1.RecordType.KeyedRead:
  10279. var arg = this._readArgs(proto, values)[0];
  10280. return this._readContext(proto, values)[arg];
  10281. case proto_record_1.RecordType.Chain:
  10282. var args = this._readArgs(proto, values);
  10283. return args[args.length - 1];
  10284. case proto_record_1.RecordType.InvokeClosure:
  10285. return lang_1.FunctionWrapper.apply(this._readContext(proto, values), this._readArgs(proto, values));
  10286. case proto_record_1.RecordType.Interpolate:
  10287. case proto_record_1.RecordType.PrimitiveOp:
  10288. case proto_record_1.RecordType.CollectionLiteral:
  10289. return lang_1.FunctionWrapper.apply(proto.funcOrValue, this._readArgs(proto, values));
  10290. default:
  10291. throw new exceptions_1.BaseException("Unknown operation " + proto.mode);
  10292. }
  10293. };
  10294. DynamicChangeDetector.prototype._pipeCheck = function (proto, throwOnChange, values) {
  10295. var context = this._readContext(proto, values);
  10296. var selectedPipe = this._pipeFor(proto, context);
  10297. if (!selectedPipe.pure || this._argsOrContextChanged(proto)) {
  10298. var args = this._readArgs(proto, values);
  10299. var currValue = selectedPipe.pipe.transform(context, args);
  10300. if (proto.shouldBeChecked()) {
  10301. var prevValue = this._readSelf(proto, values);
  10302. if (change_detection_util_1.ChangeDetectionUtil.looseNotIdentical(prevValue, currValue)) {
  10303. currValue = change_detection_util_1.ChangeDetectionUtil.unwrapValue(currValue);
  10304. if (proto.lastInBinding) {
  10305. var change = change_detection_util_1.ChangeDetectionUtil.simpleChange(prevValue, currValue);
  10306. if (throwOnChange)
  10307. this.throwOnChangeError(prevValue, currValue);
  10308. this._writeSelf(proto, currValue, values);
  10309. this._setChanged(proto, true);
  10310. return change;
  10311. }
  10312. else {
  10313. this._writeSelf(proto, currValue, values);
  10314. this._setChanged(proto, true);
  10315. return null;
  10316. }
  10317. }
  10318. else {
  10319. this._setChanged(proto, false);
  10320. return null;
  10321. }
  10322. }
  10323. else {
  10324. this._writeSelf(proto, currValue, values);
  10325. this._setChanged(proto, true);
  10326. return null;
  10327. }
  10328. }
  10329. };
  10330. DynamicChangeDetector.prototype._pipeFor = function (proto, context) {
  10331. var storedPipe = this._readPipe(proto);
  10332. if (lang_1.isPresent(storedPipe))
  10333. return storedPipe;
  10334. var pipe = this.pipes.get(proto.name);
  10335. this._writePipe(proto, pipe);
  10336. return pipe;
  10337. };
  10338. DynamicChangeDetector.prototype._readContext = function (proto, values) {
  10339. if (proto.contextIndex == -1) {
  10340. return this._getDirectiveFor(proto.directiveIndex);
  10341. }
  10342. return values[proto.contextIndex];
  10343. };
  10344. DynamicChangeDetector.prototype._readSelf = function (proto, values) { return values[proto.selfIndex]; };
  10345. DynamicChangeDetector.prototype._writeSelf = function (proto, value, values) { values[proto.selfIndex] = value; };
  10346. DynamicChangeDetector.prototype._readPipe = function (proto) { return this.localPipes[proto.selfIndex]; };
  10347. DynamicChangeDetector.prototype._writePipe = function (proto, value) { this.localPipes[proto.selfIndex] = value; };
  10348. DynamicChangeDetector.prototype._setChanged = function (proto, value) {
  10349. if (proto.argumentToPureFunction)
  10350. this.changes[proto.selfIndex] = value;
  10351. };
  10352. DynamicChangeDetector.prototype._pureFuncAndArgsDidNotChange = function (proto) {
  10353. return proto.isPureFunction() && !this._argsChanged(proto);
  10354. };
  10355. DynamicChangeDetector.prototype._argsChanged = function (proto) {
  10356. var args = proto.args;
  10357. for (var i = 0; i < args.length; ++i) {
  10358. if (this.changes[args[i]]) {
  10359. return true;
  10360. }
  10361. }
  10362. return false;
  10363. };
  10364. DynamicChangeDetector.prototype._argsOrContextChanged = function (proto) {
  10365. return this._argsChanged(proto) || this.changes[proto.contextIndex];
  10366. };
  10367. DynamicChangeDetector.prototype._readArgs = function (proto, values) {
  10368. var res = collection_1.ListWrapper.createFixedSize(proto.args.length);
  10369. var args = proto.args;
  10370. for (var i = 0; i < args.length; ++i) {
  10371. res[i] = values[args[i]];
  10372. }
  10373. return res;
  10374. };
  10375. return DynamicChangeDetector;
  10376. })(abstract_change_detector_1.AbstractChangeDetector);
  10377. exports.DynamicChangeDetector = DynamicChangeDetector;
  10378. /***/ },
  10379. /* 43 */
  10380. /***/ function(module, exports, __webpack_require__) {
  10381. var lang_1 = __webpack_require__(5);
  10382. var collection_1 = __webpack_require__(12);
  10383. var change_detection_util_1 = __webpack_require__(38);
  10384. var change_detector_ref_1 = __webpack_require__(44);
  10385. var exceptions_1 = __webpack_require__(34);
  10386. var constants_1 = __webpack_require__(36);
  10387. var profile_1 = __webpack_require__(45);
  10388. var observable_facade_1 = __webpack_require__(47);
  10389. var _scope_check = profile_1.wtfCreateScope("ChangeDetector#check(ascii id, bool throwOnChange)");
  10390. var _Context = (function () {
  10391. function _Context(element, componentElement, context, locals, injector, expression) {
  10392. this.element = element;
  10393. this.componentElement = componentElement;
  10394. this.context = context;
  10395. this.locals = locals;
  10396. this.injector = injector;
  10397. this.expression = expression;
  10398. }
  10399. return _Context;
  10400. })();
  10401. var AbstractChangeDetector = (function () {
  10402. function AbstractChangeDetector(id, dispatcher, numberOfPropertyProtoRecords, bindingTargets, directiveIndices, strategy) {
  10403. this.id = id;
  10404. this.dispatcher = dispatcher;
  10405. this.numberOfPropertyProtoRecords = numberOfPropertyProtoRecords;
  10406. this.bindingTargets = bindingTargets;
  10407. this.directiveIndices = directiveIndices;
  10408. this.strategy = strategy;
  10409. this.contentChildren = [];
  10410. this.viewChildren = [];
  10411. // The names of the below fields must be kept in sync with codegen_name_util.ts or
  10412. // change detection will fail.
  10413. this.state = constants_1.ChangeDetectorState.NeverChecked;
  10414. this.locals = null;
  10415. this.mode = null;
  10416. this.pipes = null;
  10417. this.ref = new change_detector_ref_1.ChangeDetectorRef_(this);
  10418. }
  10419. AbstractChangeDetector.prototype.addContentChild = function (cd) {
  10420. this.contentChildren.push(cd);
  10421. cd.parent = this;
  10422. };
  10423. AbstractChangeDetector.prototype.removeContentChild = function (cd) { collection_1.ListWrapper.remove(this.contentChildren, cd); };
  10424. AbstractChangeDetector.prototype.addViewChild = function (cd) {
  10425. this.viewChildren.push(cd);
  10426. cd.parent = this;
  10427. };
  10428. AbstractChangeDetector.prototype.removeViewChild = function (cd) { collection_1.ListWrapper.remove(this.viewChildren, cd); };
  10429. AbstractChangeDetector.prototype.remove = function () { this.parent.removeContentChild(this); };
  10430. AbstractChangeDetector.prototype.handleEvent = function (eventName, elIndex, locals) {
  10431. var res = this.handleEventInternal(eventName, elIndex, locals);
  10432. this.markPathToRootAsCheckOnce();
  10433. return res;
  10434. };
  10435. AbstractChangeDetector.prototype.handleEventInternal = function (eventName, elIndex, locals) { return false; };
  10436. AbstractChangeDetector.prototype.detectChanges = function () { this.runDetectChanges(false); };
  10437. AbstractChangeDetector.prototype.checkNoChanges = function () {
  10438. if (lang_1.assertionsEnabled()) {
  10439. this.runDetectChanges(true);
  10440. }
  10441. };
  10442. AbstractChangeDetector.prototype.runDetectChanges = function (throwOnChange) {
  10443. if (this.mode === constants_1.ChangeDetectionStrategy.Detached ||
  10444. this.mode === constants_1.ChangeDetectionStrategy.Checked || this.state === constants_1.ChangeDetectorState.Errored)
  10445. return;
  10446. var s = _scope_check(this.id, throwOnChange);
  10447. this.detectChangesInRecords(throwOnChange);
  10448. this._detectChangesContentChildren(throwOnChange);
  10449. if (!throwOnChange)
  10450. this.afterContentLifecycleCallbacks();
  10451. this._detectChangesInViewChildren(throwOnChange);
  10452. if (!throwOnChange)
  10453. this.afterViewLifecycleCallbacks();
  10454. if (this.mode === constants_1.ChangeDetectionStrategy.CheckOnce)
  10455. this.mode = constants_1.ChangeDetectionStrategy.Checked;
  10456. this.state = constants_1.ChangeDetectorState.CheckedBefore;
  10457. profile_1.wtfLeave(s);
  10458. };
  10459. // This method is not intended to be overridden. Subclasses should instead provide an
  10460. // implementation of `detectChangesInRecordsInternal` which does the work of detecting changes
  10461. // and which this method will call.
  10462. // This method expects that `detectChangesInRecordsInternal` will set the property
  10463. // `this.propertyBindingIndex` to the propertyBindingIndex of the first proto record. This is to
  10464. // facilitate error reporting.
  10465. AbstractChangeDetector.prototype.detectChangesInRecords = function (throwOnChange) {
  10466. if (!this.hydrated()) {
  10467. this.throwDehydratedError();
  10468. }
  10469. try {
  10470. this.detectChangesInRecordsInternal(throwOnChange);
  10471. }
  10472. catch (e) {
  10473. // throwOnChange errors aren't counted as fatal errors.
  10474. if (!(e instanceof exceptions_1.ExpressionChangedAfterItHasBeenCheckedException)) {
  10475. this.state = constants_1.ChangeDetectorState.Errored;
  10476. }
  10477. this._throwError(e, e.stack);
  10478. }
  10479. };
  10480. // Subclasses should override this method to perform any work necessary to detect and report
  10481. // changes. For example, changes should be reported via `ChangeDetectionUtil.addChange`, lifecycle
  10482. // methods should be called, etc.
  10483. // This implementation should also set `this.propertyBindingIndex` to the propertyBindingIndex of
  10484. // the
  10485. // first proto record to facilitate error reporting. See {@link #detectChangesInRecords}.
  10486. AbstractChangeDetector.prototype.detectChangesInRecordsInternal = function (throwOnChange) { };
  10487. // This method is not intended to be overridden. Subclasses should instead provide an
  10488. // implementation of `hydrateDirectives`.
  10489. AbstractChangeDetector.prototype.hydrate = function (context, locals, directives, pipes) {
  10490. this.mode = change_detection_util_1.ChangeDetectionUtil.changeDetectionMode(this.strategy);
  10491. this.context = context;
  10492. if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  10493. this.observeComponent(context);
  10494. }
  10495. this.locals = locals;
  10496. this.pipes = pipes;
  10497. this.hydrateDirectives(directives);
  10498. this.state = constants_1.ChangeDetectorState.NeverChecked;
  10499. };
  10500. // Subclasses should override this method to hydrate any directives.
  10501. AbstractChangeDetector.prototype.hydrateDirectives = function (directives) { };
  10502. // This method is not intended to be overridden. Subclasses should instead provide an
  10503. // implementation of `dehydrateDirectives`.
  10504. AbstractChangeDetector.prototype.dehydrate = function () {
  10505. this.dehydrateDirectives(true);
  10506. // This is an experimental feature. Works only in Dart.
  10507. if (this.strategy === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  10508. this._unsubsribeFromObservables();
  10509. }
  10510. this.context = null;
  10511. this.locals = null;
  10512. this.pipes = null;
  10513. };
  10514. // Subclasses should override this method to dehydrate any directives. This method should reverse
  10515. // any work done in `hydrateDirectives`.
  10516. AbstractChangeDetector.prototype.dehydrateDirectives = function (destroyPipes) { };
  10517. AbstractChangeDetector.prototype.hydrated = function () { return lang_1.isPresent(this.context); };
  10518. AbstractChangeDetector.prototype.afterContentLifecycleCallbacks = function () {
  10519. this.dispatcher.notifyAfterContentChecked();
  10520. this.afterContentLifecycleCallbacksInternal();
  10521. };
  10522. AbstractChangeDetector.prototype.afterContentLifecycleCallbacksInternal = function () { };
  10523. AbstractChangeDetector.prototype.afterViewLifecycleCallbacks = function () {
  10524. this.dispatcher.notifyAfterViewChecked();
  10525. this.afterViewLifecycleCallbacksInternal();
  10526. };
  10527. AbstractChangeDetector.prototype.afterViewLifecycleCallbacksInternal = function () { };
  10528. /** @internal */
  10529. AbstractChangeDetector.prototype._detectChangesContentChildren = function (throwOnChange) {
  10530. var c = this.contentChildren;
  10531. for (var i = 0; i < c.length; ++i) {
  10532. c[i].runDetectChanges(throwOnChange);
  10533. }
  10534. };
  10535. /** @internal */
  10536. AbstractChangeDetector.prototype._detectChangesInViewChildren = function (throwOnChange) {
  10537. var c = this.viewChildren;
  10538. for (var i = 0; i < c.length; ++i) {
  10539. c[i].runDetectChanges(throwOnChange);
  10540. }
  10541. };
  10542. AbstractChangeDetector.prototype.markAsCheckOnce = function () { this.mode = constants_1.ChangeDetectionStrategy.CheckOnce; };
  10543. AbstractChangeDetector.prototype.markPathToRootAsCheckOnce = function () {
  10544. var c = this;
  10545. while (lang_1.isPresent(c) && c.mode !== constants_1.ChangeDetectionStrategy.Detached) {
  10546. if (c.mode === constants_1.ChangeDetectionStrategy.Checked)
  10547. c.mode = constants_1.ChangeDetectionStrategy.CheckOnce;
  10548. c = c.parent;
  10549. }
  10550. };
  10551. // This is an experimental feature. Works only in Dart.
  10552. AbstractChangeDetector.prototype._unsubsribeFromObservables = function () {
  10553. if (lang_1.isPresent(this.subscriptions)) {
  10554. for (var i = 0; i < this.subscriptions.length; ++i) {
  10555. var s = this.subscriptions[i];
  10556. if (lang_1.isPresent(this.subscriptions[i])) {
  10557. s.cancel();
  10558. this.subscriptions[i] = null;
  10559. }
  10560. }
  10561. }
  10562. };
  10563. // This is an experimental feature. Works only in Dart.
  10564. AbstractChangeDetector.prototype.observeValue = function (value, index) {
  10565. var _this = this;
  10566. if (observable_facade_1.isObservable(value)) {
  10567. this._createArrayToStoreObservables();
  10568. if (lang_1.isBlank(this.subscriptions[index])) {
  10569. this.streams[index] = value.changes;
  10570. this.subscriptions[index] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
  10571. }
  10572. else if (this.streams[index] !== value.changes) {
  10573. this.subscriptions[index].cancel();
  10574. this.streams[index] = value.changes;
  10575. this.subscriptions[index] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
  10576. }
  10577. }
  10578. return value;
  10579. };
  10580. // This is an experimental feature. Works only in Dart.
  10581. AbstractChangeDetector.prototype.observeDirective = function (value, index) {
  10582. var _this = this;
  10583. if (observable_facade_1.isObservable(value)) {
  10584. this._createArrayToStoreObservables();
  10585. var arrayIndex = this.numberOfPropertyProtoRecords + index + 2; // +1 is component
  10586. this.streams[arrayIndex] = value.changes;
  10587. this.subscriptions[arrayIndex] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
  10588. }
  10589. return value;
  10590. };
  10591. // This is an experimental feature. Works only in Dart.
  10592. AbstractChangeDetector.prototype.observeComponent = function (value) {
  10593. var _this = this;
  10594. if (observable_facade_1.isObservable(value)) {
  10595. this._createArrayToStoreObservables();
  10596. var index = this.numberOfPropertyProtoRecords + 1;
  10597. this.streams[index] = value.changes;
  10598. this.subscriptions[index] = value.changes.listen(function (_) { return _this.ref.markForCheck(); });
  10599. }
  10600. return value;
  10601. };
  10602. AbstractChangeDetector.prototype._createArrayToStoreObservables = function () {
  10603. if (lang_1.isBlank(this.subscriptions)) {
  10604. this.subscriptions = collection_1.ListWrapper.createFixedSize(this.numberOfPropertyProtoRecords +
  10605. this.directiveIndices.length + 2);
  10606. this.streams = collection_1.ListWrapper.createFixedSize(this.numberOfPropertyProtoRecords +
  10607. this.directiveIndices.length + 2);
  10608. }
  10609. };
  10610. AbstractChangeDetector.prototype.getDirectiveFor = function (directives, index) {
  10611. return directives.getDirectiveFor(this.directiveIndices[index]);
  10612. };
  10613. AbstractChangeDetector.prototype.getDetectorFor = function (directives, index) {
  10614. return directives.getDetectorFor(this.directiveIndices[index]);
  10615. };
  10616. AbstractChangeDetector.prototype.notifyDispatcher = function (value) {
  10617. this.dispatcher.notifyOnBinding(this._currentBinding(), value);
  10618. };
  10619. AbstractChangeDetector.prototype.logBindingUpdate = function (value) {
  10620. this.dispatcher.logBindingUpdate(this._currentBinding(), value);
  10621. };
  10622. AbstractChangeDetector.prototype.addChange = function (changes, oldValue, newValue) {
  10623. if (lang_1.isBlank(changes)) {
  10624. changes = {};
  10625. }
  10626. changes[this._currentBinding().name] = change_detection_util_1.ChangeDetectionUtil.simpleChange(oldValue, newValue);
  10627. return changes;
  10628. };
  10629. AbstractChangeDetector.prototype._throwError = function (exception, stack) {
  10630. var error;
  10631. try {
  10632. var c = this.dispatcher.getDebugContext(this._currentBinding().elementIndex, null);
  10633. var context = lang_1.isPresent(c) ? new _Context(c.element, c.componentElement, c.context, c.locals, c.injector, this._currentBinding().debug) :
  10634. null;
  10635. error = new exceptions_1.ChangeDetectionError(this._currentBinding().debug, exception, stack, context);
  10636. }
  10637. catch (e) {
  10638. // if an error happens during getting the debug context, we throw a ChangeDetectionError
  10639. // without the extra information.
  10640. error = new exceptions_1.ChangeDetectionError(null, exception, stack, null);
  10641. }
  10642. throw error;
  10643. };
  10644. AbstractChangeDetector.prototype.throwOnChangeError = function (oldValue, newValue) {
  10645. throw new exceptions_1.ExpressionChangedAfterItHasBeenCheckedException(this._currentBinding().debug, oldValue, newValue, null);
  10646. };
  10647. AbstractChangeDetector.prototype.throwDehydratedError = function () { throw new exceptions_1.DehydratedException(); };
  10648. AbstractChangeDetector.prototype._currentBinding = function () {
  10649. return this.bindingTargets[this.propertyBindingIndex];
  10650. };
  10651. return AbstractChangeDetector;
  10652. })();
  10653. exports.AbstractChangeDetector = AbstractChangeDetector;
  10654. /***/ },
  10655. /* 44 */
  10656. /***/ function(module, exports, __webpack_require__) {
  10657. var __extends = (this && this.__extends) || function (d, b) {
  10658. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  10659. function __() { this.constructor = d; }
  10660. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  10661. };
  10662. var constants_1 = __webpack_require__(36);
  10663. var ChangeDetectorRef = (function () {
  10664. function ChangeDetectorRef() {
  10665. }
  10666. return ChangeDetectorRef;
  10667. })();
  10668. exports.ChangeDetectorRef = ChangeDetectorRef;
  10669. var ChangeDetectorRef_ = (function (_super) {
  10670. __extends(ChangeDetectorRef_, _super);
  10671. function ChangeDetectorRef_(_cd) {
  10672. _super.call(this);
  10673. this._cd = _cd;
  10674. }
  10675. ChangeDetectorRef_.prototype.markForCheck = function () { this._cd.markPathToRootAsCheckOnce(); };
  10676. ChangeDetectorRef_.prototype.detach = function () { this._cd.mode = constants_1.ChangeDetectionStrategy.Detached; };
  10677. ChangeDetectorRef_.prototype.detectChanges = function () { this._cd.detectChanges(); };
  10678. ChangeDetectorRef_.prototype.checkNoChanges = function () { this._cd.checkNoChanges(); };
  10679. ChangeDetectorRef_.prototype.reattach = function () {
  10680. this._cd.mode = constants_1.ChangeDetectionStrategy.CheckAlways;
  10681. this.markForCheck();
  10682. };
  10683. return ChangeDetectorRef_;
  10684. })(ChangeDetectorRef);
  10685. exports.ChangeDetectorRef_ = ChangeDetectorRef_;
  10686. /***/ },
  10687. /* 45 */
  10688. /***/ function(module, exports, __webpack_require__) {
  10689. var impl = __webpack_require__(46);
  10690. // Change exports to const once https://github.com/angular/ts2dart/issues/150
  10691. /**
  10692. * True if WTF is enabled.
  10693. */
  10694. exports.wtfEnabled = impl.detectWTF();
  10695. function noopScope(arg0, arg1) {
  10696. return null;
  10697. }
  10698. /**
  10699. * Create trace scope.
  10700. *
  10701. * Scopes must be strictly nested and are analogous to stack frames, but
  10702. * do not have to follow the stack frames. Instead it is recommended that they follow logical
  10703. * nesting. You may want to use
  10704. * [Event
  10705. * Signatures](http://google.github.io/tracing-framework/instrumenting-code.html#custom-events)
  10706. * as they are defined in WTF.
  10707. *
  10708. * Used to mark scope entry. The return value is used to leave the scope.
  10709. *
  10710. * var myScope = wtfCreateScope('MyClass#myMethod(ascii someVal)');
  10711. *
  10712. * someMethod() {
  10713. * var s = myScope('Foo'); // 'Foo' gets stored in tracing UI
  10714. * // DO SOME WORK HERE
  10715. * return wtfLeave(s, 123); // Return value 123
  10716. * }
  10717. *
  10718. * Note, adding try-finally block around the work to ensure that `wtfLeave` gets called can
  10719. * negatively impact the performance of your application. For this reason we recommend that
  10720. * you don't add them to ensure that `wtfLeave` gets called. In production `wtfLeave` is a noop and
  10721. * so try-finally block has no value. When debugging perf issues, skipping `wtfLeave`, do to
  10722. * exception, will produce incorrect trace, but presence of exception signifies logic error which
  10723. * needs to be fixed before the app should be profiled. Add try-finally only when you expect that
  10724. * an exception is expected during normal execution while profiling.
  10725. *
  10726. */
  10727. exports.wtfCreateScope = exports.wtfEnabled ? impl.createScope : function (signature, flags) { return noopScope; };
  10728. /**
  10729. * Used to mark end of Scope.
  10730. *
  10731. * - `scope` to end.
  10732. * - `returnValue` (optional) to be passed to the WTF.
  10733. *
  10734. * Returns the `returnValue for easy chaining.
  10735. */
  10736. exports.wtfLeave = exports.wtfEnabled ? impl.leave : function (s, r) { return r; };
  10737. /**
  10738. * Used to mark Async start. Async are similar to scope but they don't have to be strictly nested.
  10739. * The return value is used in the call to [endAsync]. Async ranges only work if WTF has been
  10740. * enabled.
  10741. *
  10742. * someMethod() {
  10743. * var s = wtfStartTimeRange('HTTP:GET', 'some.url');
  10744. * var future = new Future.delay(5).then((_) {
  10745. * wtfEndTimeRange(s);
  10746. * });
  10747. * }
  10748. */
  10749. exports.wtfStartTimeRange = exports.wtfEnabled ? impl.startTimeRange : function (rangeType, action) { return null; };
  10750. /**
  10751. * Ends a async time range operation.
  10752. * [range] is the return value from [wtfStartTimeRange] Async ranges only work if WTF has been
  10753. * enabled.
  10754. */
  10755. exports.wtfEndTimeRange = exports.wtfEnabled ? impl.endTimeRange : function (r) {
  10756. return null;
  10757. };
  10758. /***/ },
  10759. /* 46 */
  10760. /***/ function(module, exports, __webpack_require__) {
  10761. var lang_1 = __webpack_require__(5);
  10762. var trace;
  10763. var events;
  10764. function detectWTF() {
  10765. var wtf = lang_1.global['wtf'];
  10766. if (wtf) {
  10767. trace = wtf['trace'];
  10768. if (trace) {
  10769. events = trace['events'];
  10770. return true;
  10771. }
  10772. }
  10773. return false;
  10774. }
  10775. exports.detectWTF = detectWTF;
  10776. function createScope(signature, flags) {
  10777. if (flags === void 0) { flags = null; }
  10778. return events.createScope(signature, flags);
  10779. }
  10780. exports.createScope = createScope;
  10781. function leave(scope, returnValue) {
  10782. trace.leaveScope(scope, returnValue);
  10783. return returnValue;
  10784. }
  10785. exports.leave = leave;
  10786. function startTimeRange(rangeType, action) {
  10787. return trace.beginTimeRange(rangeType, action);
  10788. }
  10789. exports.startTimeRange = startTimeRange;
  10790. function endTimeRange(range) {
  10791. trace.endTimeRange(range);
  10792. }
  10793. exports.endTimeRange = endTimeRange;
  10794. /***/ },
  10795. /* 47 */
  10796. /***/ function(module, exports) {
  10797. function isObservable(value) {
  10798. return false;
  10799. }
  10800. exports.isObservable = isObservable;
  10801. /***/ },
  10802. /* 48 */
  10803. /***/ function(module, exports) {
  10804. (function (RecordType) {
  10805. RecordType[RecordType["Self"] = 0] = "Self";
  10806. RecordType[RecordType["Const"] = 1] = "Const";
  10807. RecordType[RecordType["PrimitiveOp"] = 2] = "PrimitiveOp";
  10808. RecordType[RecordType["PropertyRead"] = 3] = "PropertyRead";
  10809. RecordType[RecordType["PropertyWrite"] = 4] = "PropertyWrite";
  10810. RecordType[RecordType["Local"] = 5] = "Local";
  10811. RecordType[RecordType["InvokeMethod"] = 6] = "InvokeMethod";
  10812. RecordType[RecordType["InvokeClosure"] = 7] = "InvokeClosure";
  10813. RecordType[RecordType["KeyedRead"] = 8] = "KeyedRead";
  10814. RecordType[RecordType["KeyedWrite"] = 9] = "KeyedWrite";
  10815. RecordType[RecordType["Pipe"] = 10] = "Pipe";
  10816. RecordType[RecordType["Interpolate"] = 11] = "Interpolate";
  10817. RecordType[RecordType["SafeProperty"] = 12] = "SafeProperty";
  10818. RecordType[RecordType["CollectionLiteral"] = 13] = "CollectionLiteral";
  10819. RecordType[RecordType["SafeMethodInvoke"] = 14] = "SafeMethodInvoke";
  10820. RecordType[RecordType["DirectiveLifecycle"] = 15] = "DirectiveLifecycle";
  10821. RecordType[RecordType["Chain"] = 16] = "Chain";
  10822. RecordType[RecordType["SkipRecordsIf"] = 17] = "SkipRecordsIf";
  10823. RecordType[RecordType["SkipRecordsIfNot"] = 18] = "SkipRecordsIfNot";
  10824. RecordType[RecordType["SkipRecords"] = 19] = "SkipRecords"; // Skip records unconditionally
  10825. })(exports.RecordType || (exports.RecordType = {}));
  10826. var RecordType = exports.RecordType;
  10827. var ProtoRecord = (function () {
  10828. function ProtoRecord(mode, name, funcOrValue, args, fixedArgs, contextIndex, directiveIndex, selfIndex, bindingRecord, lastInBinding, lastInDirective, argumentToPureFunction, referencedBySelf, propertyBindingIndex) {
  10829. this.mode = mode;
  10830. this.name = name;
  10831. this.funcOrValue = funcOrValue;
  10832. this.args = args;
  10833. this.fixedArgs = fixedArgs;
  10834. this.contextIndex = contextIndex;
  10835. this.directiveIndex = directiveIndex;
  10836. this.selfIndex = selfIndex;
  10837. this.bindingRecord = bindingRecord;
  10838. this.lastInBinding = lastInBinding;
  10839. this.lastInDirective = lastInDirective;
  10840. this.argumentToPureFunction = argumentToPureFunction;
  10841. this.referencedBySelf = referencedBySelf;
  10842. this.propertyBindingIndex = propertyBindingIndex;
  10843. }
  10844. ProtoRecord.prototype.isPureFunction = function () {
  10845. return this.mode === RecordType.Interpolate || this.mode === RecordType.CollectionLiteral;
  10846. };
  10847. ProtoRecord.prototype.isUsedByOtherRecord = function () { return !this.lastInBinding || this.referencedBySelf; };
  10848. ProtoRecord.prototype.shouldBeChecked = function () {
  10849. return this.argumentToPureFunction || this.lastInBinding || this.isPureFunction() ||
  10850. this.isPipeRecord();
  10851. };
  10852. ProtoRecord.prototype.isPipeRecord = function () { return this.mode === RecordType.Pipe; };
  10853. ProtoRecord.prototype.isConditionalSkipRecord = function () {
  10854. return this.mode === RecordType.SkipRecordsIfNot || this.mode === RecordType.SkipRecordsIf;
  10855. };
  10856. ProtoRecord.prototype.isUnconditionalSkipRecord = function () { return this.mode === RecordType.SkipRecords; };
  10857. ProtoRecord.prototype.isSkipRecord = function () {
  10858. return this.isConditionalSkipRecord() || this.isUnconditionalSkipRecord();
  10859. };
  10860. ProtoRecord.prototype.isLifeCycleRecord = function () { return this.mode === RecordType.DirectiveLifecycle; };
  10861. return ProtoRecord;
  10862. })();
  10863. exports.ProtoRecord = ProtoRecord;
  10864. /***/ },
  10865. /* 49 */
  10866. /***/ function(module, exports) {
  10867. var EventBinding = (function () {
  10868. function EventBinding(eventName, elIndex, dirIndex, records) {
  10869. this.eventName = eventName;
  10870. this.elIndex = elIndex;
  10871. this.dirIndex = dirIndex;
  10872. this.records = records;
  10873. }
  10874. return EventBinding;
  10875. })();
  10876. exports.EventBinding = EventBinding;
  10877. /***/ },
  10878. /* 50 */
  10879. /***/ function(module, exports, __webpack_require__) {
  10880. var lang_1 = __webpack_require__(5);
  10881. var collection_1 = __webpack_require__(12);
  10882. var proto_record_1 = __webpack_require__(48);
  10883. /**
  10884. * Removes "duplicate" records. It assumes that record evaluation does not have side-effects.
  10885. *
  10886. * Records that are not last in bindings are removed and all the indices of the records that depend
  10887. * on them are updated.
  10888. *
  10889. * Records that are last in bindings CANNOT be removed, and instead are replaced with very cheap
  10890. * SELF records.
  10891. *
  10892. * @internal
  10893. */
  10894. function coalesce(srcRecords) {
  10895. var dstRecords = [];
  10896. var excludedIdxs = [];
  10897. var indexMap = new collection_1.Map();
  10898. var skipDepth = 0;
  10899. var skipSources = collection_1.ListWrapper.createFixedSize(srcRecords.length);
  10900. for (var protoIndex = 0; protoIndex < srcRecords.length; protoIndex++) {
  10901. var skipRecord = skipSources[protoIndex];
  10902. if (lang_1.isPresent(skipRecord)) {
  10903. skipDepth--;
  10904. skipRecord.fixedArgs[0] = dstRecords.length;
  10905. }
  10906. var src = srcRecords[protoIndex];
  10907. var dst = _cloneAndUpdateIndexes(src, dstRecords, indexMap);
  10908. if (dst.isSkipRecord()) {
  10909. dstRecords.push(dst);
  10910. skipDepth++;
  10911. skipSources[dst.fixedArgs[0]] = dst;
  10912. }
  10913. else {
  10914. var record = _mayBeAddRecord(dst, dstRecords, excludedIdxs, skipDepth > 0);
  10915. indexMap.set(src.selfIndex, record.selfIndex);
  10916. }
  10917. }
  10918. return _optimizeSkips(dstRecords);
  10919. }
  10920. exports.coalesce = coalesce;
  10921. /**
  10922. * - Conditional skip of 1 record followed by an unconditional skip of N are replaced by a
  10923. * conditional skip of N with the negated condition,
  10924. * - Skips of 0 records are removed
  10925. */
  10926. function _optimizeSkips(srcRecords) {
  10927. var dstRecords = [];
  10928. var skipSources = collection_1.ListWrapper.createFixedSize(srcRecords.length);
  10929. var indexMap = new collection_1.Map();
  10930. for (var protoIndex = 0; protoIndex < srcRecords.length; protoIndex++) {
  10931. var skipRecord = skipSources[protoIndex];
  10932. if (lang_1.isPresent(skipRecord)) {
  10933. skipRecord.fixedArgs[0] = dstRecords.length;
  10934. }
  10935. var src = srcRecords[protoIndex];
  10936. if (src.isSkipRecord()) {
  10937. if (src.isConditionalSkipRecord() && src.fixedArgs[0] === protoIndex + 2 &&
  10938. protoIndex < srcRecords.length - 1 &&
  10939. srcRecords[protoIndex + 1].mode === proto_record_1.RecordType.SkipRecords) {
  10940. src.mode = src.mode === proto_record_1.RecordType.SkipRecordsIf ? proto_record_1.RecordType.SkipRecordsIfNot :
  10941. proto_record_1.RecordType.SkipRecordsIf;
  10942. src.fixedArgs[0] = srcRecords[protoIndex + 1].fixedArgs[0];
  10943. protoIndex++;
  10944. }
  10945. if (src.fixedArgs[0] > protoIndex + 1) {
  10946. var dst = _cloneAndUpdateIndexes(src, dstRecords, indexMap);
  10947. dstRecords.push(dst);
  10948. skipSources[dst.fixedArgs[0]] = dst;
  10949. }
  10950. }
  10951. else {
  10952. var dst = _cloneAndUpdateIndexes(src, dstRecords, indexMap);
  10953. dstRecords.push(dst);
  10954. indexMap.set(src.selfIndex, dst.selfIndex);
  10955. }
  10956. }
  10957. return dstRecords;
  10958. }
  10959. /**
  10960. * Add a new record or re-use one of the existing records.
  10961. */
  10962. function _mayBeAddRecord(record, dstRecords, excludedIdxs, excluded) {
  10963. var match = _findFirstMatch(record, dstRecords, excludedIdxs);
  10964. if (lang_1.isPresent(match)) {
  10965. if (record.lastInBinding) {
  10966. dstRecords.push(_createSelfRecord(record, match.selfIndex, dstRecords.length + 1));
  10967. match.referencedBySelf = true;
  10968. }
  10969. else {
  10970. if (record.argumentToPureFunction) {
  10971. match.argumentToPureFunction = true;
  10972. }
  10973. }
  10974. return match;
  10975. }
  10976. if (excluded) {
  10977. excludedIdxs.push(record.selfIndex);
  10978. }
  10979. dstRecords.push(record);
  10980. return record;
  10981. }
  10982. /**
  10983. * Returns the first `ProtoRecord` that matches the record.
  10984. */
  10985. function _findFirstMatch(record, dstRecords, excludedIdxs) {
  10986. return dstRecords.find(
  10987. // TODO(vicb): optimize excludedIdxs.indexOf (sorted array)
  10988. function (rr) { return excludedIdxs.indexOf(rr.selfIndex) == -1 && rr.mode !== proto_record_1.RecordType.DirectiveLifecycle &&
  10989. _haveSameDirIndex(rr, record) && rr.mode === record.mode &&
  10990. lang_1.looseIdentical(rr.funcOrValue, record.funcOrValue) &&
  10991. rr.contextIndex === record.contextIndex && lang_1.looseIdentical(rr.name, record.name) &&
  10992. collection_1.ListWrapper.equals(rr.args, record.args); });
  10993. }
  10994. /**
  10995. * Clone the `ProtoRecord` and changes the indexes for the ones in the destination array for:
  10996. * - the arguments,
  10997. * - the context,
  10998. * - self
  10999. */
  11000. function _cloneAndUpdateIndexes(record, dstRecords, indexMap) {
  11001. var args = record.args.map(function (src) { return _srcToDstSelfIndex(indexMap, src); });
  11002. var contextIndex = _srcToDstSelfIndex(indexMap, record.contextIndex);
  11003. var selfIndex = dstRecords.length + 1;
  11004. 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);
  11005. }
  11006. /**
  11007. * Returns the index in the destination array corresponding to the index in the src array.
  11008. * When the element is not present in the destination array, return the source index.
  11009. */
  11010. function _srcToDstSelfIndex(indexMap, srcIdx) {
  11011. var dstIdx = indexMap.get(srcIdx);
  11012. return lang_1.isPresent(dstIdx) ? dstIdx : srcIdx;
  11013. }
  11014. function _createSelfRecord(r, contextIndex, selfIndex) {
  11015. 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);
  11016. }
  11017. function _haveSameDirIndex(a, b) {
  11018. var di1 = lang_1.isBlank(a.directiveIndex) ? null : a.directiveIndex.directiveIndex;
  11019. var ei1 = lang_1.isBlank(a.directiveIndex) ? null : a.directiveIndex.elementIndex;
  11020. var di2 = lang_1.isBlank(b.directiveIndex) ? null : b.directiveIndex.directiveIndex;
  11021. var ei2 = lang_1.isBlank(b.directiveIndex) ? null : b.directiveIndex.elementIndex;
  11022. return di1 === di2 && ei1 === ei2;
  11023. }
  11024. /***/ },
  11025. /* 51 */
  11026. /***/ function(module, exports, __webpack_require__) {
  11027. var change_detection_jit_generator_1 = __webpack_require__(52);
  11028. var JitProtoChangeDetector = (function () {
  11029. function JitProtoChangeDetector(definition) {
  11030. this.definition = definition;
  11031. this._factory = this._createFactory(definition);
  11032. }
  11033. JitProtoChangeDetector.isSupported = function () { return true; };
  11034. JitProtoChangeDetector.prototype.instantiate = function (dispatcher) { return this._factory(dispatcher); };
  11035. /** @internal */
  11036. JitProtoChangeDetector.prototype._createFactory = function (definition) {
  11037. return new change_detection_jit_generator_1.ChangeDetectorJITGenerator(definition, 'util', 'AbstractChangeDetector', 'ChangeDetectorStatus')
  11038. .generate();
  11039. };
  11040. return JitProtoChangeDetector;
  11041. })();
  11042. exports.JitProtoChangeDetector = JitProtoChangeDetector;
  11043. /***/ },
  11044. /* 52 */
  11045. /***/ function(module, exports, __webpack_require__) {
  11046. var lang_1 = __webpack_require__(5);
  11047. var exceptions_1 = __webpack_require__(14);
  11048. var collection_1 = __webpack_require__(12);
  11049. var abstract_change_detector_1 = __webpack_require__(43);
  11050. var change_detection_util_1 = __webpack_require__(38);
  11051. var proto_record_1 = __webpack_require__(48);
  11052. var codegen_name_util_1 = __webpack_require__(53);
  11053. var codegen_logic_util_1 = __webpack_require__(54);
  11054. var codegen_facade_1 = __webpack_require__(55);
  11055. var constants_1 = __webpack_require__(36);
  11056. var proto_change_detector_1 = __webpack_require__(37);
  11057. /**
  11058. * The code generator takes a list of proto records and creates a function/class
  11059. * that "emulates" what the developer would write by hand to implement the same
  11060. * kind of behaviour.
  11061. *
  11062. * This code should be kept in sync with the Dart transformer's
  11063. * `angular2.transform.template_compiler.change_detector_codegen` library. If you make updates
  11064. * here, please make equivalent changes there.
  11065. */
  11066. var IS_CHANGED_LOCAL = "isChanged";
  11067. var CHANGES_LOCAL = "changes";
  11068. var ChangeDetectorJITGenerator = (function () {
  11069. function ChangeDetectorJITGenerator(definition, changeDetectionUtilVarName, abstractChangeDetectorVarName, changeDetectorStateVarName) {
  11070. this.changeDetectionUtilVarName = changeDetectionUtilVarName;
  11071. this.abstractChangeDetectorVarName = abstractChangeDetectorVarName;
  11072. this.changeDetectorStateVarName = changeDetectorStateVarName;
  11073. var propertyBindingRecords = proto_change_detector_1.createPropertyRecords(definition);
  11074. var eventBindingRecords = proto_change_detector_1.createEventRecords(definition);
  11075. var propertyBindingTargets = definition.bindingRecords.map(function (b) { return b.target; });
  11076. this.id = definition.id;
  11077. this.changeDetectionStrategy = definition.strategy;
  11078. this.genConfig = definition.genConfig;
  11079. this.records = propertyBindingRecords;
  11080. this.propertyBindingTargets = propertyBindingTargets;
  11081. this.eventBindings = eventBindingRecords;
  11082. this.directiveRecords = definition.directiveRecords;
  11083. this._names = new codegen_name_util_1.CodegenNameUtil(this.records, this.eventBindings, this.directiveRecords, this.changeDetectionUtilVarName);
  11084. this._logic =
  11085. new codegen_logic_util_1.CodegenLogicUtil(this._names, this.changeDetectionUtilVarName, this.changeDetectorStateVarName, this.changeDetectionStrategy);
  11086. this.typeName = codegen_name_util_1.sanitizeName("ChangeDetector_" + this.id);
  11087. }
  11088. ChangeDetectorJITGenerator.prototype.generate = function () {
  11089. var factorySource = "\n " + this.generateSource() + "\n return function(dispatcher) {\n return new " + this.typeName + "(dispatcher);\n }\n ";
  11090. return new Function(this.abstractChangeDetectorVarName, this.changeDetectionUtilVarName, this.changeDetectorStateVarName, factorySource)(abstract_change_detector_1.AbstractChangeDetector, change_detection_util_1.ChangeDetectionUtil, constants_1.ChangeDetectorState);
  11091. };
  11092. ChangeDetectorJITGenerator.prototype.generateSource = function () {
  11093. 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 ";
  11094. };
  11095. /** @internal */
  11096. ChangeDetectorJITGenerator.prototype._genPropertyBindingTargets = function () {
  11097. var targets = this._logic.genPropertyBindingTargets(this.propertyBindingTargets, this.genConfig.genDebugInfo);
  11098. return this.typeName + ".gen_propertyBindingTargets = " + targets + ";";
  11099. };
  11100. /** @internal */
  11101. ChangeDetectorJITGenerator.prototype._genDirectiveIndices = function () {
  11102. var indices = this._logic.genDirectiveIndices(this.directiveRecords);
  11103. return this.typeName + ".gen_directiveIndices = " + indices + ";";
  11104. };
  11105. /** @internal */
  11106. ChangeDetectorJITGenerator.prototype._maybeGenHandleEventInternal = function () {
  11107. var _this = this;
  11108. if (this.eventBindings.length > 0) {
  11109. var handlers = this.eventBindings.map(function (eb) { return _this._genEventBinding(eb); }).join("\n");
  11110. 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 ";
  11111. }
  11112. else {
  11113. return '';
  11114. }
  11115. };
  11116. /** @internal */
  11117. ChangeDetectorJITGenerator.prototype._genEventBinding = function (eb) {
  11118. var _this = this;
  11119. var codes = [];
  11120. this._endOfBlockIdxs = [];
  11121. collection_1.ListWrapper.forEachWithIndex(eb.records, function (r, i) {
  11122. var code;
  11123. if (r.isConditionalSkipRecord()) {
  11124. code = _this._genConditionalSkip(r, _this._names.getEventLocalName(eb, i));
  11125. }
  11126. else if (r.isUnconditionalSkipRecord()) {
  11127. code = _this._genUnconditionalSkip(r);
  11128. }
  11129. else {
  11130. code = _this._genEventBindingEval(eb, r);
  11131. }
  11132. code += _this._genEndOfSkipBlock(i);
  11133. codes.push(code);
  11134. });
  11135. return "\n if (eventName === \"" + eb.eventName + "\" && elIndex === " + eb.elIndex + ") {\n " + codes.join("\n") + "\n }";
  11136. };
  11137. /** @internal */
  11138. ChangeDetectorJITGenerator.prototype._genEventBindingEval = function (eb, r) {
  11139. if (r.lastInBinding) {
  11140. var evalRecord = this._logic.genEventBindingEvalValue(eb, r);
  11141. var markPath = this._genMarkPathToRootAsCheckOnce(r);
  11142. var prevDefault = this._genUpdatePreventDefault(eb, r);
  11143. return evalRecord + "\n" + markPath + "\n" + prevDefault;
  11144. }
  11145. else {
  11146. return this._logic.genEventBindingEvalValue(eb, r);
  11147. }
  11148. };
  11149. /** @internal */
  11150. ChangeDetectorJITGenerator.prototype._genMarkPathToRootAsCheckOnce = function (r) {
  11151. var br = r.bindingRecord;
  11152. if (br.isDefaultChangeDetection()) {
  11153. return "";
  11154. }
  11155. else {
  11156. return this._names.getDetectorName(br.directiveRecord.directiveIndex) + ".markPathToRootAsCheckOnce();";
  11157. }
  11158. };
  11159. /** @internal */
  11160. ChangeDetectorJITGenerator.prototype._genUpdatePreventDefault = function (eb, r) {
  11161. var local = this._names.getEventLocalName(eb, r.selfIndex);
  11162. return "if (" + local + " === false) { " + this._names.getPreventDefaultAccesor() + " = true};";
  11163. };
  11164. /** @internal */
  11165. ChangeDetectorJITGenerator.prototype._maybeGenDehydrateDirectives = function () {
  11166. var destroyPipesCode = this._names.genPipeOnDestroy();
  11167. if (destroyPipesCode) {
  11168. destroyPipesCode = "if (destroyPipes) { " + destroyPipesCode + " }";
  11169. }
  11170. var dehydrateFieldsCode = this._names.genDehydrateFields();
  11171. if (!destroyPipesCode && !dehydrateFieldsCode)
  11172. return '';
  11173. return this.typeName + ".prototype.dehydrateDirectives = function(destroyPipes) {\n " + destroyPipesCode + "\n " + dehydrateFieldsCode + "\n }";
  11174. };
  11175. /** @internal */
  11176. ChangeDetectorJITGenerator.prototype._maybeGenHydrateDirectives = function () {
  11177. var hydrateDirectivesCode = this._logic.genHydrateDirectives(this.directiveRecords);
  11178. var hydrateDetectorsCode = this._logic.genHydrateDetectors(this.directiveRecords);
  11179. if (!hydrateDirectivesCode && !hydrateDetectorsCode)
  11180. return '';
  11181. return this.typeName + ".prototype.hydrateDirectives = function(directives) {\n " + hydrateDirectivesCode + "\n " + hydrateDetectorsCode + "\n }";
  11182. };
  11183. /** @internal */
  11184. ChangeDetectorJITGenerator.prototype._maybeGenAfterContentLifecycleCallbacks = function () {
  11185. var notifications = this._logic.genContentLifecycleCallbacks(this.directiveRecords);
  11186. if (notifications.length > 0) {
  11187. var directiveNotifications = notifications.join("\n");
  11188. return "\n " + this.typeName + ".prototype.afterContentLifecycleCallbacksInternal = function() {\n " + directiveNotifications + "\n }\n ";
  11189. }
  11190. else {
  11191. return '';
  11192. }
  11193. };
  11194. /** @internal */
  11195. ChangeDetectorJITGenerator.prototype._maybeGenAfterViewLifecycleCallbacks = function () {
  11196. var notifications = this._logic.genViewLifecycleCallbacks(this.directiveRecords);
  11197. if (notifications.length > 0) {
  11198. var directiveNotifications = notifications.join("\n");
  11199. return "\n " + this.typeName + ".prototype.afterViewLifecycleCallbacksInternal = function() {\n " + directiveNotifications + "\n }\n ";
  11200. }
  11201. else {
  11202. return '';
  11203. }
  11204. };
  11205. /** @internal */
  11206. ChangeDetectorJITGenerator.prototype._genAllRecords = function (rs) {
  11207. var codes = [];
  11208. this._endOfBlockIdxs = [];
  11209. for (var i = 0; i < rs.length; i++) {
  11210. var code = void 0;
  11211. var r = rs[i];
  11212. if (r.isLifeCycleRecord()) {
  11213. code = this._genDirectiveLifecycle(r);
  11214. }
  11215. else if (r.isPipeRecord()) {
  11216. code = this._genPipeCheck(r);
  11217. }
  11218. else if (r.isConditionalSkipRecord()) {
  11219. code = this._genConditionalSkip(r, this._names.getLocalName(r.contextIndex));
  11220. }
  11221. else if (r.isUnconditionalSkipRecord()) {
  11222. code = this._genUnconditionalSkip(r);
  11223. }
  11224. else {
  11225. code = this._genReferenceCheck(r);
  11226. }
  11227. code = "\n " + this._maybeFirstInBinding(r) + "\n " + code + "\n " + this._maybeGenLastInDirective(r) + "\n " + this._genEndOfSkipBlock(i) + "\n ";
  11228. codes.push(code);
  11229. }
  11230. return codes.join("\n");
  11231. };
  11232. /** @internal */
  11233. ChangeDetectorJITGenerator.prototype._genConditionalSkip = function (r, condition) {
  11234. var maybeNegate = r.mode === proto_record_1.RecordType.SkipRecordsIf ? '!' : '';
  11235. this._endOfBlockIdxs.push(r.fixedArgs[0] - 1);
  11236. return "if (" + maybeNegate + condition + ") {";
  11237. };
  11238. /** @internal */
  11239. ChangeDetectorJITGenerator.prototype._genUnconditionalSkip = function (r) {
  11240. this._endOfBlockIdxs.pop();
  11241. this._endOfBlockIdxs.push(r.fixedArgs[0] - 1);
  11242. return "} else {";
  11243. };
  11244. /** @internal */
  11245. ChangeDetectorJITGenerator.prototype._genEndOfSkipBlock = function (protoIndex) {
  11246. if (!collection_1.ListWrapper.isEmpty(this._endOfBlockIdxs)) {
  11247. var endOfBlock = collection_1.ListWrapper.last(this._endOfBlockIdxs);
  11248. if (protoIndex === endOfBlock) {
  11249. this._endOfBlockIdxs.pop();
  11250. return '}';
  11251. }
  11252. }
  11253. return '';
  11254. };
  11255. /** @internal */
  11256. ChangeDetectorJITGenerator.prototype._genDirectiveLifecycle = function (r) {
  11257. if (r.name === "DoCheck") {
  11258. return this._genOnCheck(r);
  11259. }
  11260. else if (r.name === "OnInit") {
  11261. return this._genOnInit(r);
  11262. }
  11263. else if (r.name === "OnChanges") {
  11264. return this._genOnChange(r);
  11265. }
  11266. else {
  11267. throw new exceptions_1.BaseException("Unknown lifecycle event '" + r.name + "'");
  11268. }
  11269. };
  11270. /** @internal */
  11271. ChangeDetectorJITGenerator.prototype._genPipeCheck = function (r) {
  11272. var _this = this;
  11273. var context = this._names.getLocalName(r.contextIndex);
  11274. var argString = r.args.map(function (arg) { return _this._names.getLocalName(arg); }).join(", ");
  11275. var oldValue = this._names.getFieldName(r.selfIndex);
  11276. var newValue = this._names.getLocalName(r.selfIndex);
  11277. var pipe = this._names.getPipeName(r.selfIndex);
  11278. var pipeName = r.name;
  11279. var init = "\n if (" + pipe + " === " + this.changeDetectionUtilVarName + ".uninitialized) {\n " + pipe + " = " + this._names.getPipesAccessorName() + ".get('" + pipeName + "');\n }\n ";
  11280. var read = newValue + " = " + pipe + ".pipe.transform(" + context + ", [" + argString + "]);";
  11281. var contexOrArgCheck = r.args.map(function (a) { return _this._names.getChangeName(a); });
  11282. contexOrArgCheck.push(this._names.getChangeName(r.contextIndex));
  11283. var condition = "!" + pipe + ".pure || (" + contexOrArgCheck.join(" || ") + ")";
  11284. 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 ";
  11285. var genCode = r.shouldBeChecked() ? "" + read + check : read;
  11286. if (r.isUsedByOtherRecord()) {
  11287. return init + " if (" + condition + ") { " + genCode + " } else { " + newValue + " = " + oldValue + "; }";
  11288. }
  11289. else {
  11290. return init + " if (" + condition + ") { " + genCode + " }";
  11291. }
  11292. };
  11293. /** @internal */
  11294. ChangeDetectorJITGenerator.prototype._genReferenceCheck = function (r) {
  11295. var _this = this;
  11296. var oldValue = this._names.getFieldName(r.selfIndex);
  11297. var newValue = this._names.getLocalName(r.selfIndex);
  11298. var read = "\n " + this._logic.genPropertyBindingEvalValue(r) + "\n ";
  11299. 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 ";
  11300. var genCode = r.shouldBeChecked() ? "" + read + check : read;
  11301. if (r.isPureFunction()) {
  11302. var condition = r.args.map(function (a) { return _this._names.getChangeName(a); }).join(" || ");
  11303. if (r.isUsedByOtherRecord()) {
  11304. return "if (" + condition + ") { " + genCode + " } else { " + newValue + " = " + oldValue + "; }";
  11305. }
  11306. else {
  11307. return "if (" + condition + ") { " + genCode + " }";
  11308. }
  11309. }
  11310. else {
  11311. return genCode;
  11312. }
  11313. };
  11314. /** @internal */
  11315. ChangeDetectorJITGenerator.prototype._genChangeMarker = function (r) {
  11316. return r.argumentToPureFunction ? this._names.getChangeName(r.selfIndex) + " = true" : "";
  11317. };
  11318. /** @internal */
  11319. ChangeDetectorJITGenerator.prototype._genUpdateDirectiveOrElement = function (r) {
  11320. if (!r.lastInBinding)
  11321. return "";
  11322. var newValue = this._names.getLocalName(r.selfIndex);
  11323. var oldValue = this._names.getFieldName(r.selfIndex);
  11324. var notifyDebug = this.genConfig.logBindingUpdate ? "this.logBindingUpdate(" + newValue + ");" : "";
  11325. var br = r.bindingRecord;
  11326. if (br.target.isDirective()) {
  11327. var directiveProperty = this._names.getDirectiveName(br.directiveRecord.directiveIndex) + "." + br.target.name;
  11328. return "\n " + this._genThrowOnChangeCheck(oldValue, newValue) + "\n " + directiveProperty + " = " + newValue + ";\n " + notifyDebug + "\n " + IS_CHANGED_LOCAL + " = true;\n ";
  11329. }
  11330. else {
  11331. return "\n " + this._genThrowOnChangeCheck(oldValue, newValue) + "\n this.notifyDispatcher(" + newValue + ");\n " + notifyDebug + "\n ";
  11332. }
  11333. };
  11334. /** @internal */
  11335. ChangeDetectorJITGenerator.prototype._genThrowOnChangeCheck = function (oldValue, newValue) {
  11336. if (lang_1.assertionsEnabled()) {
  11337. return "\n if(throwOnChange) {\n this.throwOnChangeError(" + oldValue + ", " + newValue + ");\n }\n ";
  11338. }
  11339. else {
  11340. return '';
  11341. }
  11342. };
  11343. /** @internal */
  11344. ChangeDetectorJITGenerator.prototype._genAddToChanges = function (r) {
  11345. var newValue = this._names.getLocalName(r.selfIndex);
  11346. var oldValue = this._names.getFieldName(r.selfIndex);
  11347. if (!r.bindingRecord.callOnChanges())
  11348. return "";
  11349. return CHANGES_LOCAL + " = this.addChange(" + CHANGES_LOCAL + ", " + oldValue + ", " + newValue + ");";
  11350. };
  11351. /** @internal */
  11352. ChangeDetectorJITGenerator.prototype._maybeFirstInBinding = function (r) {
  11353. var prev = change_detection_util_1.ChangeDetectionUtil.protoByIndex(this.records, r.selfIndex - 1);
  11354. var firstInBinding = lang_1.isBlank(prev) || prev.bindingRecord !== r.bindingRecord;
  11355. return firstInBinding && !r.bindingRecord.isDirectiveLifecycle() ?
  11356. this._names.getPropertyBindingIndex() + " = " + r.propertyBindingIndex + ";" :
  11357. '';
  11358. };
  11359. /** @internal */
  11360. ChangeDetectorJITGenerator.prototype._maybeGenLastInDirective = function (r) {
  11361. if (!r.lastInDirective)
  11362. return "";
  11363. return "\n " + CHANGES_LOCAL + " = null;\n " + this._genNotifyOnPushDetectors(r) + "\n " + IS_CHANGED_LOCAL + " = false;\n ";
  11364. };
  11365. /** @internal */
  11366. ChangeDetectorJITGenerator.prototype._genOnCheck = function (r) {
  11367. var br = r.bindingRecord;
  11368. return "if (!throwOnChange) " + this._names.getDirectiveName(br.directiveRecord.directiveIndex) + ".ngDoCheck();";
  11369. };
  11370. /** @internal */
  11371. ChangeDetectorJITGenerator.prototype._genOnInit = function (r) {
  11372. var br = r.bindingRecord;
  11373. return "if (!throwOnChange && " + this._names.getStateName() + " === " + this.changeDetectorStateVarName + ".NeverChecked) " + this._names.getDirectiveName(br.directiveRecord.directiveIndex) + ".ngOnInit();";
  11374. };
  11375. /** @internal */
  11376. ChangeDetectorJITGenerator.prototype._genOnChange = function (r) {
  11377. var br = r.bindingRecord;
  11378. return "if (!throwOnChange && " + CHANGES_LOCAL + ") " + this._names.getDirectiveName(br.directiveRecord.directiveIndex) + ".ngOnChanges(" + CHANGES_LOCAL + ");";
  11379. };
  11380. /** @internal */
  11381. ChangeDetectorJITGenerator.prototype._genNotifyOnPushDetectors = function (r) {
  11382. var br = r.bindingRecord;
  11383. if (!r.lastInDirective || br.isDefaultChangeDetection())
  11384. return "";
  11385. var retVal = "\n if(" + IS_CHANGED_LOCAL + ") {\n " + this._names.getDetectorName(br.directiveRecord.directiveIndex) + ".markAsCheckOnce();\n }\n ";
  11386. return retVal;
  11387. };
  11388. return ChangeDetectorJITGenerator;
  11389. })();
  11390. exports.ChangeDetectorJITGenerator = ChangeDetectorJITGenerator;
  11391. /***/ },
  11392. /* 53 */
  11393. /***/ function(module, exports, __webpack_require__) {
  11394. var lang_1 = __webpack_require__(5);
  11395. var collection_1 = __webpack_require__(12);
  11396. // The names of these fields must be kept in sync with abstract_change_detector.ts or change
  11397. // detection will fail.
  11398. var _STATE_ACCESSOR = "state";
  11399. var _CONTEXT_ACCESSOR = "context";
  11400. var _PROP_BINDING_INDEX = "propertyBindingIndex";
  11401. var _DIRECTIVES_ACCESSOR = "directiveIndices";
  11402. var _DISPATCHER_ACCESSOR = "dispatcher";
  11403. var _LOCALS_ACCESSOR = "locals";
  11404. var _MODE_ACCESSOR = "mode";
  11405. var _PIPES_ACCESSOR = "pipes";
  11406. var _PROTOS_ACCESSOR = "protos";
  11407. exports.CONTEXT_ACCESSOR = "context";
  11408. // `context` is always first.
  11409. exports.CONTEXT_INDEX = 0;
  11410. var _FIELD_PREFIX = 'this.';
  11411. var _whiteSpaceRegExp = /\W/g;
  11412. /**
  11413. * Returns `s` with all non-identifier characters removed.
  11414. */
  11415. function sanitizeName(s) {
  11416. return lang_1.StringWrapper.replaceAll(s, _whiteSpaceRegExp, '');
  11417. }
  11418. exports.sanitizeName = sanitizeName;
  11419. /**
  11420. * Class responsible for providing field and local variable names for change detector classes.
  11421. * Also provides some convenience functions, for example, declaring variables, destroying pipes,
  11422. * and dehydrating the detector.
  11423. */
  11424. var CodegenNameUtil = (function () {
  11425. function CodegenNameUtil(_records, _eventBindings, _directiveRecords, _utilName) {
  11426. this._records = _records;
  11427. this._eventBindings = _eventBindings;
  11428. this._directiveRecords = _directiveRecords;
  11429. this._utilName = _utilName;
  11430. /** @internal */
  11431. this._sanitizedEventNames = new collection_1.Map();
  11432. this._sanitizedNames = collection_1.ListWrapper.createFixedSize(this._records.length + 1);
  11433. this._sanitizedNames[exports.CONTEXT_INDEX] = exports.CONTEXT_ACCESSOR;
  11434. for (var i = 0, iLen = this._records.length; i < iLen; ++i) {
  11435. this._sanitizedNames[i + 1] = sanitizeName("" + this._records[i].name + i);
  11436. }
  11437. for (var ebIndex = 0; ebIndex < _eventBindings.length; ++ebIndex) {
  11438. var eb = _eventBindings[ebIndex];
  11439. var names = [exports.CONTEXT_ACCESSOR];
  11440. for (var i = 0, iLen = eb.records.length; i < iLen; ++i) {
  11441. names.push(sanitizeName("" + eb.records[i].name + i + "_" + ebIndex));
  11442. }
  11443. this._sanitizedEventNames.set(eb, names);
  11444. }
  11445. }
  11446. /** @internal */
  11447. CodegenNameUtil.prototype._addFieldPrefix = function (name) { return "" + _FIELD_PREFIX + name; };
  11448. CodegenNameUtil.prototype.getDispatcherName = function () { return this._addFieldPrefix(_DISPATCHER_ACCESSOR); };
  11449. CodegenNameUtil.prototype.getPipesAccessorName = function () { return this._addFieldPrefix(_PIPES_ACCESSOR); };
  11450. CodegenNameUtil.prototype.getProtosName = function () { return this._addFieldPrefix(_PROTOS_ACCESSOR); };
  11451. CodegenNameUtil.prototype.getDirectivesAccessorName = function () { return this._addFieldPrefix(_DIRECTIVES_ACCESSOR); };
  11452. CodegenNameUtil.prototype.getLocalsAccessorName = function () { return this._addFieldPrefix(_LOCALS_ACCESSOR); };
  11453. CodegenNameUtil.prototype.getStateName = function () { return this._addFieldPrefix(_STATE_ACCESSOR); };
  11454. CodegenNameUtil.prototype.getModeName = function () { return this._addFieldPrefix(_MODE_ACCESSOR); };
  11455. CodegenNameUtil.prototype.getPropertyBindingIndex = function () { return this._addFieldPrefix(_PROP_BINDING_INDEX); };
  11456. CodegenNameUtil.prototype.getLocalName = function (idx) { return "l_" + this._sanitizedNames[idx]; };
  11457. CodegenNameUtil.prototype.getEventLocalName = function (eb, idx) {
  11458. return "l_" + this._sanitizedEventNames.get(eb)[idx];
  11459. };
  11460. CodegenNameUtil.prototype.getChangeName = function (idx) { return "c_" + this._sanitizedNames[idx]; };
  11461. /**
  11462. * Generate a statement initializing local variables used when detecting changes.
  11463. */
  11464. CodegenNameUtil.prototype.genInitLocals = function () {
  11465. var declarations = [];
  11466. var assignments = [];
  11467. for (var i = 0, iLen = this.getFieldCount(); i < iLen; ++i) {
  11468. if (i == exports.CONTEXT_INDEX) {
  11469. declarations.push(this.getLocalName(i) + " = " + this.getFieldName(i));
  11470. }
  11471. else {
  11472. var rec = this._records[i - 1];
  11473. if (rec.argumentToPureFunction) {
  11474. var changeName = this.getChangeName(i);
  11475. declarations.push(this.getLocalName(i) + "," + changeName);
  11476. assignments.push(changeName);
  11477. }
  11478. else {
  11479. declarations.push("" + this.getLocalName(i));
  11480. }
  11481. }
  11482. }
  11483. var assignmentsCode = collection_1.ListWrapper.isEmpty(assignments) ? '' : assignments.join('=') + " = false;";
  11484. return "var " + declarations.join(',') + ";" + assignmentsCode;
  11485. };
  11486. /**
  11487. * Generate a statement initializing local variables for event handlers.
  11488. */
  11489. CodegenNameUtil.prototype.genInitEventLocals = function () {
  11490. var _this = this;
  11491. var res = [(this.getLocalName(exports.CONTEXT_INDEX) + " = " + this.getFieldName(exports.CONTEXT_INDEX))];
  11492. this._sanitizedEventNames.forEach(function (names, eb) {
  11493. for (var i = 0; i < names.length; ++i) {
  11494. if (i !== exports.CONTEXT_INDEX) {
  11495. res.push("" + _this.getEventLocalName(eb, i));
  11496. }
  11497. }
  11498. });
  11499. return res.length > 1 ? "var " + res.join(',') + ";" : '';
  11500. };
  11501. CodegenNameUtil.prototype.getPreventDefaultAccesor = function () { return "preventDefault"; };
  11502. CodegenNameUtil.prototype.getFieldCount = function () { return this._sanitizedNames.length; };
  11503. CodegenNameUtil.prototype.getFieldName = function (idx) { return this._addFieldPrefix(this._sanitizedNames[idx]); };
  11504. CodegenNameUtil.prototype.getAllFieldNames = function () {
  11505. var fieldList = [];
  11506. for (var k = 0, kLen = this.getFieldCount(); k < kLen; ++k) {
  11507. if (k === 0 || this._records[k - 1].shouldBeChecked()) {
  11508. fieldList.push(this.getFieldName(k));
  11509. }
  11510. }
  11511. for (var i = 0, iLen = this._records.length; i < iLen; ++i) {
  11512. var rec = this._records[i];
  11513. if (rec.isPipeRecord()) {
  11514. fieldList.push(this.getPipeName(rec.selfIndex));
  11515. }
  11516. }
  11517. for (var j = 0, jLen = this._directiveRecords.length; j < jLen; ++j) {
  11518. var dRec = this._directiveRecords[j];
  11519. fieldList.push(this.getDirectiveName(dRec.directiveIndex));
  11520. if (!dRec.isDefaultChangeDetection()) {
  11521. fieldList.push(this.getDetectorName(dRec.directiveIndex));
  11522. }
  11523. }
  11524. return fieldList;
  11525. };
  11526. /**
  11527. * Generates statements which clear all fields so that the change detector is dehydrated.
  11528. */
  11529. CodegenNameUtil.prototype.genDehydrateFields = function () {
  11530. var fields = this.getAllFieldNames();
  11531. collection_1.ListWrapper.removeAt(fields, exports.CONTEXT_INDEX);
  11532. if (collection_1.ListWrapper.isEmpty(fields))
  11533. return '';
  11534. // At least one assignment.
  11535. fields.push(this._utilName + ".uninitialized;");
  11536. return fields.join(' = ');
  11537. };
  11538. /**
  11539. * Generates statements destroying all pipe variables.
  11540. */
  11541. CodegenNameUtil.prototype.genPipeOnDestroy = function () {
  11542. var _this = this;
  11543. return this._records.filter(function (r) { return r.isPipeRecord(); })
  11544. .map(function (r) { return (_this._utilName + ".callPipeOnDestroy(" + _this.getPipeName(r.selfIndex) + ");"); })
  11545. .join('\n');
  11546. };
  11547. CodegenNameUtil.prototype.getPipeName = function (idx) {
  11548. return this._addFieldPrefix(this._sanitizedNames[idx] + "_pipe");
  11549. };
  11550. CodegenNameUtil.prototype.getDirectiveName = function (d) {
  11551. return this._addFieldPrefix("directive_" + d.name);
  11552. };
  11553. CodegenNameUtil.prototype.getDetectorName = function (d) { return this._addFieldPrefix("detector_" + d.name); };
  11554. return CodegenNameUtil;
  11555. })();
  11556. exports.CodegenNameUtil = CodegenNameUtil;
  11557. /***/ },
  11558. /* 54 */
  11559. /***/ function(module, exports, __webpack_require__) {
  11560. var lang_1 = __webpack_require__(5);
  11561. var codegen_facade_1 = __webpack_require__(55);
  11562. var proto_record_1 = __webpack_require__(48);
  11563. var constants_1 = __webpack_require__(36);
  11564. var exceptions_1 = __webpack_require__(14);
  11565. /**
  11566. * Class responsible for providing change detection logic for change detector classes.
  11567. */
  11568. var CodegenLogicUtil = (function () {
  11569. function CodegenLogicUtil(_names, _utilName, _changeDetectorStateName, _changeDetection) {
  11570. this._names = _names;
  11571. this._utilName = _utilName;
  11572. this._changeDetectorStateName = _changeDetectorStateName;
  11573. this._changeDetection = _changeDetection;
  11574. }
  11575. /**
  11576. * Generates a statement which updates the local variable representing `protoRec` with the current
  11577. * value of the record. Used by property bindings.
  11578. */
  11579. CodegenLogicUtil.prototype.genPropertyBindingEvalValue = function (protoRec) {
  11580. var _this = this;
  11581. return this._genEvalValue(protoRec, function (idx) { return _this._names.getLocalName(idx); }, this._names.getLocalsAccessorName());
  11582. };
  11583. /**
  11584. * Generates a statement which updates the local variable representing `protoRec` with the current
  11585. * value of the record. Used by event bindings.
  11586. */
  11587. CodegenLogicUtil.prototype.genEventBindingEvalValue = function (eventRecord, protoRec) {
  11588. var _this = this;
  11589. return this._genEvalValue(protoRec, function (idx) { return _this._names.getEventLocalName(eventRecord, idx); }, "locals");
  11590. };
  11591. CodegenLogicUtil.prototype._genEvalValue = function (protoRec, getLocalName, localsAccessor) {
  11592. var context = (protoRec.contextIndex == -1) ?
  11593. this._names.getDirectiveName(protoRec.directiveIndex) :
  11594. getLocalName(protoRec.contextIndex);
  11595. var argString = protoRec.args.map(function (arg) { return getLocalName(arg); }).join(", ");
  11596. var rhs;
  11597. switch (protoRec.mode) {
  11598. case proto_record_1.RecordType.Self:
  11599. rhs = context;
  11600. break;
  11601. case proto_record_1.RecordType.Const:
  11602. rhs = codegen_facade_1.codify(protoRec.funcOrValue);
  11603. break;
  11604. case proto_record_1.RecordType.PropertyRead:
  11605. rhs = this._observe(context + "." + protoRec.name, protoRec);
  11606. break;
  11607. case proto_record_1.RecordType.SafeProperty:
  11608. var read = this._observe(context + "." + protoRec.name, protoRec);
  11609. rhs =
  11610. this._utilName + ".isValueBlank(" + context + ") ? null : " + this._observe(read, protoRec);
  11611. break;
  11612. case proto_record_1.RecordType.PropertyWrite:
  11613. rhs = context + "." + protoRec.name + " = " + getLocalName(protoRec.args[0]);
  11614. break;
  11615. case proto_record_1.RecordType.Local:
  11616. rhs = this._observe(localsAccessor + ".get(" + codegen_facade_1.rawString(protoRec.name) + ")", protoRec);
  11617. break;
  11618. case proto_record_1.RecordType.InvokeMethod:
  11619. rhs = this._observe(context + "." + protoRec.name + "(" + argString + ")", protoRec);
  11620. break;
  11621. case proto_record_1.RecordType.SafeMethodInvoke:
  11622. var invoke = context + "." + protoRec.name + "(" + argString + ")";
  11623. rhs =
  11624. this._utilName + ".isValueBlank(" + context + ") ? null : " + this._observe(invoke, protoRec);
  11625. break;
  11626. case proto_record_1.RecordType.InvokeClosure:
  11627. rhs = context + "(" + argString + ")";
  11628. break;
  11629. case proto_record_1.RecordType.PrimitiveOp:
  11630. rhs = this._utilName + "." + protoRec.name + "(" + argString + ")";
  11631. break;
  11632. case proto_record_1.RecordType.CollectionLiteral:
  11633. rhs = this._utilName + "." + protoRec.name + "(" + argString + ")";
  11634. break;
  11635. case proto_record_1.RecordType.Interpolate:
  11636. rhs = this._genInterpolation(protoRec);
  11637. break;
  11638. case proto_record_1.RecordType.KeyedRead:
  11639. rhs = this._observe(context + "[" + getLocalName(protoRec.args[0]) + "]", protoRec);
  11640. break;
  11641. case proto_record_1.RecordType.KeyedWrite:
  11642. rhs = context + "[" + getLocalName(protoRec.args[0]) + "] = " + getLocalName(protoRec.args[1]);
  11643. break;
  11644. case proto_record_1.RecordType.Chain:
  11645. rhs = 'null';
  11646. break;
  11647. default:
  11648. throw new exceptions_1.BaseException("Unknown operation " + protoRec.mode);
  11649. }
  11650. return getLocalName(protoRec.selfIndex) + " = " + rhs + ";";
  11651. };
  11652. /** @internal */
  11653. CodegenLogicUtil.prototype._observe = function (exp, rec) {
  11654. // This is an experimental feature. Works only in Dart.
  11655. if (this._changeDetection === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  11656. return "this.observeValue(" + exp + ", " + rec.selfIndex + ")";
  11657. }
  11658. else {
  11659. return exp;
  11660. }
  11661. };
  11662. CodegenLogicUtil.prototype.genPropertyBindingTargets = function (propertyBindingTargets, genDebugInfo) {
  11663. var _this = this;
  11664. var bs = propertyBindingTargets.map(function (b) {
  11665. if (lang_1.isBlank(b))
  11666. return "null";
  11667. var debug = genDebugInfo ? codegen_facade_1.codify(b.debug) : "null";
  11668. 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 + ")";
  11669. });
  11670. return "[" + bs.join(", ") + "]";
  11671. };
  11672. CodegenLogicUtil.prototype.genDirectiveIndices = function (directiveRecords) {
  11673. var _this = this;
  11674. var bs = directiveRecords.map(function (b) {
  11675. return (_this._utilName + ".directiveIndex(" + b.directiveIndex.elementIndex + ", " + b.directiveIndex.directiveIndex + ")");
  11676. });
  11677. return "[" + bs.join(", ") + "]";
  11678. };
  11679. /** @internal */
  11680. CodegenLogicUtil.prototype._genInterpolation = function (protoRec) {
  11681. var iVals = [];
  11682. for (var i = 0; i < protoRec.args.length; ++i) {
  11683. iVals.push(codegen_facade_1.codify(protoRec.fixedArgs[i]));
  11684. iVals.push(this._utilName + ".s(" + this._names.getLocalName(protoRec.args[i]) + ")");
  11685. }
  11686. iVals.push(codegen_facade_1.codify(protoRec.fixedArgs[protoRec.args.length]));
  11687. return codegen_facade_1.combineGeneratedStrings(iVals);
  11688. };
  11689. CodegenLogicUtil.prototype.genHydrateDirectives = function (directiveRecords) {
  11690. var res = [];
  11691. for (var i = 0; i < directiveRecords.length; ++i) {
  11692. var r = directiveRecords[i];
  11693. res.push(this._names.getDirectiveName(r.directiveIndex) + " = " + this._genReadDirective(i) + ";");
  11694. }
  11695. return res.join("\n");
  11696. };
  11697. CodegenLogicUtil.prototype._genReadDirective = function (index) {
  11698. // This is an experimental feature. Works only in Dart.
  11699. if (this._changeDetection === constants_1.ChangeDetectionStrategy.OnPushObserve) {
  11700. return "this.observeDirective(this.getDirectiveFor(directives, " + index + "), " + index + ")";
  11701. }
  11702. else {
  11703. return "this.getDirectiveFor(directives, " + index + ")";
  11704. }
  11705. };
  11706. CodegenLogicUtil.prototype.genHydrateDetectors = function (directiveRecords) {
  11707. var res = [];
  11708. for (var i = 0; i < directiveRecords.length; ++i) {
  11709. var r = directiveRecords[i];
  11710. if (!r.isDefaultChangeDetection()) {
  11711. res.push(this._names.getDetectorName(r.directiveIndex) + " = this.getDetectorFor(directives, " + i + ");");
  11712. }
  11713. }
  11714. return res.join("\n");
  11715. };
  11716. CodegenLogicUtil.prototype.genContentLifecycleCallbacks = function (directiveRecords) {
  11717. var res = [];
  11718. var eq = lang_1.IS_DART ? '==' : '===';
  11719. // NOTE(kegluneq): Order is important!
  11720. for (var i = directiveRecords.length - 1; i >= 0; --i) {
  11721. var dir = directiveRecords[i];
  11722. if (dir.callAfterContentInit) {
  11723. res.push("if(" + this._names.getStateName() + " " + eq + " " + this._changeDetectorStateName + ".NeverChecked) " + this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterContentInit();");
  11724. }
  11725. if (dir.callAfterContentChecked) {
  11726. res.push(this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterContentChecked();");
  11727. }
  11728. }
  11729. return res;
  11730. };
  11731. CodegenLogicUtil.prototype.genViewLifecycleCallbacks = function (directiveRecords) {
  11732. var res = [];
  11733. var eq = lang_1.IS_DART ? '==' : '===';
  11734. // NOTE(kegluneq): Order is important!
  11735. for (var i = directiveRecords.length - 1; i >= 0; --i) {
  11736. var dir = directiveRecords[i];
  11737. if (dir.callAfterViewInit) {
  11738. res.push("if(" + this._names.getStateName() + " " + eq + " " + this._changeDetectorStateName + ".NeverChecked) " + this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterViewInit();");
  11739. }
  11740. if (dir.callAfterViewChecked) {
  11741. res.push(this._names.getDirectiveName(dir.directiveIndex) + ".ngAfterViewChecked();");
  11742. }
  11743. }
  11744. return res;
  11745. };
  11746. return CodegenLogicUtil;
  11747. })();
  11748. exports.CodegenLogicUtil = CodegenLogicUtil;
  11749. /***/ },
  11750. /* 55 */
  11751. /***/ function(module, exports) {
  11752. /**
  11753. * Converts `funcOrValue` to a string which can be used in generated code.
  11754. */
  11755. function codify(obj) {
  11756. return JSON.stringify(obj);
  11757. }
  11758. exports.codify = codify;
  11759. function rawString(str) {
  11760. return "'" + str + "'";
  11761. }
  11762. exports.rawString = rawString;
  11763. /**
  11764. * Combine the strings of generated code into a single interpolated string.
  11765. * Each element of `vals` is expected to be a string literal or a codegen'd
  11766. * call to a method returning a string.
  11767. */
  11768. function combineGeneratedStrings(vals) {
  11769. return vals.join(' + ');
  11770. }
  11771. exports.combineGeneratedStrings = combineGeneratedStrings;
  11772. /***/ },
  11773. /* 56 */
  11774. /***/ function(module, exports, __webpack_require__) {
  11775. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  11776. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  11777. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  11778. 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;
  11779. return c > 3 && r && Object.defineProperty(target, key, r), r;
  11780. };
  11781. var __metadata = (this && this.__metadata) || function (k, v) {
  11782. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  11783. };
  11784. var lang_1 = __webpack_require__(5);
  11785. /**
  11786. * Defines template and style encapsulation options available for Component's {@link View}.
  11787. *
  11788. * See {@link ViewMetadata#encapsulation}.
  11789. */
  11790. (function (ViewEncapsulation) {
  11791. /**
  11792. * Emulate `Native` scoping of styles by adding an attribute containing surrogate id to the Host
  11793. * Element and pre-processing the style rules provided via
  11794. * {@link ViewMetadata#styles} or {@link ViewMetadata#stylesUrls}, and adding the new Host Element
  11795. * attribute to all selectors.
  11796. *
  11797. * This is the default option.
  11798. */
  11799. ViewEncapsulation[ViewEncapsulation["Emulated"] = 0] = "Emulated";
  11800. /**
  11801. * Use the native encapsulation mechanism of the renderer.
  11802. *
  11803. * For the DOM this means using [Shadow DOM](https://w3c.github.io/webcomponents/spec/shadow/) and
  11804. * creating a ShadowRoot for Component's Host Element.
  11805. */
  11806. ViewEncapsulation[ViewEncapsulation["Native"] = 1] = "Native";
  11807. /**
  11808. * Don't provide any template or style encapsulation.
  11809. */
  11810. ViewEncapsulation[ViewEncapsulation["None"] = 2] = "None";
  11811. })(exports.ViewEncapsulation || (exports.ViewEncapsulation = {}));
  11812. var ViewEncapsulation = exports.ViewEncapsulation;
  11813. exports.VIEW_ENCAPSULATION_VALUES = [ViewEncapsulation.Emulated, ViewEncapsulation.Native, ViewEncapsulation.None];
  11814. /**
  11815. * Metadata properties available for configuring Views.
  11816. *
  11817. * Each Angular component requires a single `@Component` and at least one `@View` annotation. The
  11818. * `@View` annotation specifies the HTML template to use, and lists the directives that are active
  11819. * within the template.
  11820. *
  11821. * When a component is instantiated, the template is loaded into the component's shadow root, and
  11822. * the expressions and statements in the template are evaluated against the component.
  11823. *
  11824. * For details on the `@Component` annotation, see {@link ComponentMetadata}.
  11825. *
  11826. * ### Example
  11827. *
  11828. * ```
  11829. * @Component({
  11830. * selector: 'greet',
  11831. * template: 'Hello {{name}}!',
  11832. * directives: [GreetUser, Bold]
  11833. * })
  11834. * class Greet {
  11835. * name: string;
  11836. *
  11837. * constructor() {
  11838. * this.name = 'World';
  11839. * }
  11840. * }
  11841. * ```
  11842. */
  11843. var ViewMetadata = (function () {
  11844. function ViewMetadata(_a) {
  11845. 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;
  11846. this.templateUrl = templateUrl;
  11847. this.template = template;
  11848. this.styleUrls = styleUrls;
  11849. this.styles = styles;
  11850. this.directives = directives;
  11851. this.pipes = pipes;
  11852. this.encapsulation = encapsulation;
  11853. }
  11854. ViewMetadata = __decorate([
  11855. lang_1.CONST(),
  11856. __metadata('design:paramtypes', [Object])
  11857. ], ViewMetadata);
  11858. return ViewMetadata;
  11859. })();
  11860. exports.ViewMetadata = ViewMetadata;
  11861. /***/ },
  11862. /* 57 */
  11863. /***/ function(module, exports, __webpack_require__) {
  11864. // Public API for util
  11865. var decorators_1 = __webpack_require__(9);
  11866. exports.Class = decorators_1.Class;
  11867. /***/ },
  11868. /* 58 */
  11869. /***/ function(module, exports, __webpack_require__) {
  11870. var lang_1 = __webpack_require__(5);
  11871. exports.enableProdMode = lang_1.enableProdMode;
  11872. /***/ },
  11873. /* 59 */
  11874. /***/ function(module, exports, __webpack_require__) {
  11875. // Public API for Facade
  11876. var lang_1 = __webpack_require__(5);
  11877. exports.Type = lang_1.Type;
  11878. var async_1 = __webpack_require__(60);
  11879. exports.EventEmitter = async_1.EventEmitter;
  11880. var exceptions_1 = __webpack_require__(14);
  11881. exports.WrappedException = exceptions_1.WrappedException;
  11882. var exception_handler_1 = __webpack_require__(15);
  11883. exports.ExceptionHandler = exception_handler_1.ExceptionHandler;
  11884. /***/ },
  11885. /* 60 */
  11886. /***/ function(module, exports, __webpack_require__) {
  11887. var __extends = (this && this.__extends) || function (d, b) {
  11888. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  11889. function __() { this.constructor = d; }
  11890. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  11891. };
  11892. var lang_1 = __webpack_require__(5);
  11893. var promise_1 = __webpack_require__(61);
  11894. exports.PromiseWrapper = promise_1.PromiseWrapper;
  11895. exports.Promise = promise_1.Promise;
  11896. var Subject_1 = __webpack_require__(62);
  11897. var fromPromise_1 = __webpack_require__(63);
  11898. var toPromise_1 = __webpack_require__(64);
  11899. var Observable_1 = __webpack_require__(62);
  11900. exports.Observable = Observable_1.Observable;
  11901. var Subject_2 = __webpack_require__(62);
  11902. exports.Subject = Subject_2.Subject;
  11903. var TimerWrapper = (function () {
  11904. function TimerWrapper() {
  11905. }
  11906. TimerWrapper.setTimeout = function (fn, millis) {
  11907. return lang_1.global.setTimeout(fn, millis);
  11908. };
  11909. TimerWrapper.clearTimeout = function (id) { lang_1.global.clearTimeout(id); };
  11910. TimerWrapper.setInterval = function (fn, millis) {
  11911. return lang_1.global.setInterval(fn, millis);
  11912. };
  11913. TimerWrapper.clearInterval = function (id) { lang_1.global.clearInterval(id); };
  11914. return TimerWrapper;
  11915. })();
  11916. exports.TimerWrapper = TimerWrapper;
  11917. var ObservableWrapper = (function () {
  11918. function ObservableWrapper() {
  11919. }
  11920. // TODO(vsavkin): when we use rxnext, try inferring the generic type from the first arg
  11921. ObservableWrapper.subscribe = function (emitter, onNext, onError, onComplete) {
  11922. if (onComplete === void 0) { onComplete = function () { }; }
  11923. onError = (typeof onError === "function") && onError || lang_1.noop;
  11924. onComplete = (typeof onComplete === "function") && onComplete || lang_1.noop;
  11925. return emitter.subscribe({ next: onNext, error: onError, complete: onComplete });
  11926. };
  11927. ObservableWrapper.isObservable = function (obs) { return !!obs.subscribe; };
  11928. /**
  11929. * Returns whether `obs` has any subscribers listening to events.
  11930. */
  11931. ObservableWrapper.hasSubscribers = function (obs) { return obs.observers.length > 0; };
  11932. ObservableWrapper.dispose = function (subscription) { subscription.unsubscribe(); };
  11933. /**
  11934. * @deprecated - use callEmit() instead
  11935. */
  11936. ObservableWrapper.callNext = function (emitter, value) { emitter.next(value); };
  11937. ObservableWrapper.callEmit = function (emitter, value) { emitter.emit(value); };
  11938. ObservableWrapper.callError = function (emitter, error) { emitter.error(error); };
  11939. ObservableWrapper.callComplete = function (emitter) { emitter.complete(); };
  11940. ObservableWrapper.fromPromise = function (promise) {
  11941. return fromPromise_1.PromiseObservable.create(promise);
  11942. };
  11943. ObservableWrapper.toPromise = function (obj) { return toPromise_1.toPromise.call(obj); };
  11944. return ObservableWrapper;
  11945. })();
  11946. exports.ObservableWrapper = ObservableWrapper;
  11947. /**
  11948. * Use by directives and components to emit custom Events.
  11949. *
  11950. * ### Examples
  11951. *
  11952. * In the following example, `Zippy` alternatively emits `open` and `close` events when its
  11953. * title gets clicked:
  11954. *
  11955. * ```
  11956. * @Component({
  11957. * selector: 'zippy',
  11958. * template: `
  11959. * <div class="zippy">
  11960. * <div (click)="toggle()">Toggle</div>
  11961. * <div [hidden]="!visible">
  11962. * <ng-content></ng-content>
  11963. * </div>
  11964. * </div>`})
  11965. * export class Zippy {
  11966. * visible: boolean = true;
  11967. * @Output() open: EventEmitter<any> = new EventEmitter();
  11968. * @Output() close: EventEmitter<any> = new EventEmitter();
  11969. *
  11970. * toggle() {
  11971. * this.visible = !this.visible;
  11972. * if (this.visible) {
  11973. * this.open.emit(null);
  11974. * } else {
  11975. * this.close.emit(null);
  11976. * }
  11977. * }
  11978. * }
  11979. * ```
  11980. *
  11981. * Use Rx.Observable but provides an adapter to make it work as specified here:
  11982. * https://github.com/jhusain/observable-spec
  11983. *
  11984. * Once a reference implementation of the spec is available, switch to it.
  11985. */
  11986. var EventEmitter = (function (_super) {
  11987. __extends(EventEmitter, _super);
  11988. /**
  11989. * Creates an instance of [EventEmitter], which depending on [isAsync],
  11990. * delivers events synchronously or asynchronously.
  11991. */
  11992. function EventEmitter(isAsync) {
  11993. if (isAsync === void 0) { isAsync = true; }
  11994. _super.call(this);
  11995. this._isAsync = isAsync;
  11996. }
  11997. EventEmitter.prototype.emit = function (value) { _super.prototype.next.call(this, value); };
  11998. /**
  11999. * @deprecated - use .emit(value) instead
  12000. */
  12001. EventEmitter.prototype.next = function (value) { _super.prototype.next.call(this, value); };
  12002. EventEmitter.prototype.subscribe = function (generatorOrNext, error, complete) {
  12003. var schedulerFn;
  12004. var errorFn = function (err) { return null; };
  12005. var completeFn = function () { return null; };
  12006. if (generatorOrNext && typeof generatorOrNext === 'object') {
  12007. schedulerFn = this._isAsync ? function (value) { setTimeout(function () { return generatorOrNext.next(value); }); } :
  12008. function (value) { generatorOrNext.next(value); };
  12009. if (generatorOrNext.error) {
  12010. errorFn = this._isAsync ? function (err) { setTimeout(function () { return generatorOrNext.error(err); }); } :
  12011. function (err) { generatorOrNext.error(err); };
  12012. }
  12013. if (generatorOrNext.complete) {
  12014. completeFn = this._isAsync ? function () { setTimeout(function () { return generatorOrNext.complete(); }); } :
  12015. function () { generatorOrNext.complete(); };
  12016. }
  12017. }
  12018. else {
  12019. schedulerFn = this._isAsync ? function (value) { setTimeout(function () { return generatorOrNext(value); }); } :
  12020. function (value) { generatorOrNext(value); };
  12021. if (error) {
  12022. errorFn =
  12023. this._isAsync ? function (err) { setTimeout(function () { return error(err); }); } : function (err) { error(err); };
  12024. }
  12025. if (complete) {
  12026. completeFn =
  12027. this._isAsync ? function () { setTimeout(function () { return complete(); }); } : function () { complete(); };
  12028. }
  12029. }
  12030. return _super.prototype.subscribe.call(this, schedulerFn, errorFn, completeFn);
  12031. };
  12032. return EventEmitter;
  12033. })(Subject_1.Subject);
  12034. exports.EventEmitter = EventEmitter;
  12035. /***/ },
  12036. /* 61 */
  12037. /***/ function(module, exports) {
  12038. // Promises are put into their own facade file so that they can be used without
  12039. // introducing a dependency on rxjs. They are re-exported through facade/async.
  12040. var PromiseWrapper = (function () {
  12041. function PromiseWrapper() {
  12042. }
  12043. PromiseWrapper.resolve = function (obj) { return Promise.resolve(obj); };
  12044. PromiseWrapper.reject = function (obj, _) { return Promise.reject(obj); };
  12045. // Note: We can't rename this method into `catch`, as this is not a valid
  12046. // method name in Dart.
  12047. PromiseWrapper.catchError = function (promise, onError) {
  12048. return promise.catch(onError);
  12049. };
  12050. PromiseWrapper.all = function (promises) {
  12051. if (promises.length == 0)
  12052. return Promise.resolve([]);
  12053. return Promise.all(promises);
  12054. };
  12055. PromiseWrapper.then = function (promise, success, rejection) {
  12056. return promise.then(success, rejection);
  12057. };
  12058. PromiseWrapper.wrap = function (computation) {
  12059. return new Promise(function (res, rej) {
  12060. try {
  12061. res(computation());
  12062. }
  12063. catch (e) {
  12064. rej(e);
  12065. }
  12066. });
  12067. };
  12068. PromiseWrapper.scheduleMicrotask = function (computation) {
  12069. PromiseWrapper.then(PromiseWrapper.resolve(null), computation, function (_) { });
  12070. };
  12071. PromiseWrapper.isPromise = function (obj) { return obj instanceof Promise; };
  12072. PromiseWrapper.completer = function () {
  12073. var resolve;
  12074. var reject;
  12075. var p = new Promise(function (res, rej) {
  12076. resolve = res;
  12077. reject = rej;
  12078. });
  12079. return { promise: p, resolve: resolve, reject: reject };
  12080. };
  12081. return PromiseWrapper;
  12082. })();
  12083. exports.PromiseWrapper = PromiseWrapper;
  12084. /***/ },
  12085. /* 62 */
  12086. /***/ function(module, exports) {
  12087. module.exports = __WEBPACK_EXTERNAL_MODULE_62__;
  12088. /***/ },
  12089. /* 63 */
  12090. /***/ function(module, exports) {
  12091. module.exports = __WEBPACK_EXTERNAL_MODULE_63__;
  12092. /***/ },
  12093. /* 64 */
  12094. /***/ function(module, exports) {
  12095. module.exports = __WEBPACK_EXTERNAL_MODULE_64__;
  12096. /***/ },
  12097. /* 65 */
  12098. /***/ function(module, exports, __webpack_require__) {
  12099. var __extends = (this && this.__extends) || function (d, b) {
  12100. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  12101. function __() { this.constructor = d; }
  12102. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  12103. };
  12104. var ng_zone_1 = __webpack_require__(66);
  12105. var lang_1 = __webpack_require__(5);
  12106. var di_1 = __webpack_require__(6);
  12107. var application_tokens_1 = __webpack_require__(67);
  12108. var async_1 = __webpack_require__(60);
  12109. var collection_1 = __webpack_require__(12);
  12110. var testability_1 = __webpack_require__(68);
  12111. var dynamic_component_loader_1 = __webpack_require__(69);
  12112. var exceptions_1 = __webpack_require__(14);
  12113. var view_ref_1 = __webpack_require__(77);
  12114. var console_1 = __webpack_require__(97);
  12115. var profile_1 = __webpack_require__(45);
  12116. var lang_2 = __webpack_require__(5);
  12117. /**
  12118. * Construct providers specific to an individual root component.
  12119. */
  12120. function _componentProviders(appComponentType) {
  12121. return [
  12122. di_1.provide(application_tokens_1.APP_COMPONENT, { useValue: appComponentType }),
  12123. di_1.provide(application_tokens_1.APP_COMPONENT_REF_PROMISE, {
  12124. useFactory: function (dynamicComponentLoader, appRef, injector) {
  12125. // Save the ComponentRef for disposal later.
  12126. var ref;
  12127. // TODO(rado): investigate whether to support providers on root component.
  12128. return dynamicComponentLoader.loadAsRoot(appComponentType, null, injector, function () { appRef._unloadComponent(ref); })
  12129. .then(function (componentRef) {
  12130. ref = componentRef;
  12131. if (lang_1.isPresent(componentRef.location.nativeElement)) {
  12132. injector.get(testability_1.TestabilityRegistry)
  12133. .registerApplication(componentRef.location.nativeElement, injector.get(testability_1.Testability));
  12134. }
  12135. return componentRef;
  12136. });
  12137. },
  12138. deps: [dynamic_component_loader_1.DynamicComponentLoader, ApplicationRef, di_1.Injector]
  12139. }),
  12140. di_1.provide(appComponentType, {
  12141. useFactory: function (p) { return p.then(function (ref) { return ref.instance; }); },
  12142. deps: [application_tokens_1.APP_COMPONENT_REF_PROMISE]
  12143. }),
  12144. ];
  12145. }
  12146. /**
  12147. * Create an Angular zone.
  12148. */
  12149. function createNgZone() {
  12150. return new ng_zone_1.NgZone({ enableLongStackTrace: lang_1.assertionsEnabled() });
  12151. }
  12152. exports.createNgZone = createNgZone;
  12153. var _platform;
  12154. var _platformProviders;
  12155. /**
  12156. * Initialize the Angular 'platform' on the page.
  12157. *
  12158. * See {@link PlatformRef} for details on the Angular platform.
  12159. *
  12160. * It is also possible to specify providers to be made in the new platform. These providers
  12161. * will be shared between all applications on the page. For example, an abstraction for
  12162. * the browser cookie jar should be bound at the platform level, because there is only one
  12163. * cookie jar regardless of how many applications on the page will be accessing it.
  12164. *
  12165. * The platform function can be called multiple times as long as the same list of providers
  12166. * is passed into each call. If the platform function is called with a different set of
  12167. * provides, Angular will throw an exception.
  12168. */
  12169. function platform(providers) {
  12170. lang_2.lockMode();
  12171. if (lang_1.isPresent(_platform)) {
  12172. if (collection_1.ListWrapper.equals(_platformProviders, providers)) {
  12173. return _platform;
  12174. }
  12175. else {
  12176. throw new exceptions_1.BaseException("platform cannot be initialized with different sets of providers.");
  12177. }
  12178. }
  12179. else {
  12180. return _createPlatform(providers);
  12181. }
  12182. }
  12183. exports.platform = platform;
  12184. /**
  12185. * Dispose the existing platform.
  12186. */
  12187. function disposePlatform() {
  12188. if (lang_1.isPresent(_platform)) {
  12189. _platform.dispose();
  12190. _platform = null;
  12191. }
  12192. }
  12193. exports.disposePlatform = disposePlatform;
  12194. function _createPlatform(providers) {
  12195. _platformProviders = providers;
  12196. var injector = di_1.Injector.resolveAndCreate(providers);
  12197. _platform = new PlatformRef_(injector, function () {
  12198. _platform = null;
  12199. _platformProviders = null;
  12200. });
  12201. _runPlatformInitializers(injector);
  12202. return _platform;
  12203. }
  12204. function _runPlatformInitializers(injector) {
  12205. var inits = injector.getOptional(application_tokens_1.PLATFORM_INITIALIZER);
  12206. if (lang_1.isPresent(inits))
  12207. inits.forEach(function (init) { return init(); });
  12208. }
  12209. /**
  12210. * The Angular platform is the entry point for Angular on a web page. Each page
  12211. * has exactly one platform, and services (such as reflection) which are common
  12212. * to every Angular application running on the page are bound in its scope.
  12213. *
  12214. * A page's platform is initialized implicitly when {@link bootstrap}() is called, or
  12215. * explicitly by calling {@link platform}().
  12216. */
  12217. var PlatformRef = (function () {
  12218. function PlatformRef() {
  12219. }
  12220. Object.defineProperty(PlatformRef.prototype, "injector", {
  12221. /**
  12222. * Retrieve the platform {@link Injector}, which is the parent injector for
  12223. * every Angular application on the page and provides singleton providers.
  12224. */
  12225. get: function () { return exceptions_1.unimplemented(); },
  12226. enumerable: true,
  12227. configurable: true
  12228. });
  12229. ;
  12230. return PlatformRef;
  12231. })();
  12232. exports.PlatformRef = PlatformRef;
  12233. var PlatformRef_ = (function (_super) {
  12234. __extends(PlatformRef_, _super);
  12235. function PlatformRef_(_injector, _dispose) {
  12236. _super.call(this);
  12237. this._injector = _injector;
  12238. this._dispose = _dispose;
  12239. /** @internal */
  12240. this._applications = [];
  12241. /** @internal */
  12242. this._disposeListeners = [];
  12243. }
  12244. PlatformRef_.prototype.registerDisposeListener = function (dispose) { this._disposeListeners.push(dispose); };
  12245. Object.defineProperty(PlatformRef_.prototype, "injector", {
  12246. get: function () { return this._injector; },
  12247. enumerable: true,
  12248. configurable: true
  12249. });
  12250. PlatformRef_.prototype.application = function (providers) {
  12251. var app = this._initApp(createNgZone(), providers);
  12252. return app;
  12253. };
  12254. PlatformRef_.prototype.asyncApplication = function (bindingFn, additionalProviders) {
  12255. var _this = this;
  12256. var zone = createNgZone();
  12257. var completer = async_1.PromiseWrapper.completer();
  12258. zone.run(function () {
  12259. async_1.PromiseWrapper.then(bindingFn(zone), function (providers) {
  12260. if (lang_1.isPresent(additionalProviders)) {
  12261. providers = collection_1.ListWrapper.concat(providers, additionalProviders);
  12262. }
  12263. completer.resolve(_this._initApp(zone, providers));
  12264. });
  12265. });
  12266. return completer.promise;
  12267. };
  12268. PlatformRef_.prototype._initApp = function (zone, providers) {
  12269. var _this = this;
  12270. var injector;
  12271. var app;
  12272. zone.run(function () {
  12273. providers = collection_1.ListWrapper.concat(providers, [
  12274. di_1.provide(ng_zone_1.NgZone, { useValue: zone }),
  12275. di_1.provide(ApplicationRef, { useFactory: function () { return app; }, deps: [] })
  12276. ]);
  12277. var exceptionHandler;
  12278. try {
  12279. injector = _this.injector.resolveAndCreateChild(providers);
  12280. exceptionHandler = injector.get(exceptions_1.ExceptionHandler);
  12281. zone.overrideOnErrorHandler(function (e, s) { return exceptionHandler.call(e, s); });
  12282. }
  12283. catch (e) {
  12284. if (lang_1.isPresent(exceptionHandler)) {
  12285. exceptionHandler.call(e, e.stack);
  12286. }
  12287. else {
  12288. lang_1.print(e.toString());
  12289. }
  12290. }
  12291. });
  12292. app = new ApplicationRef_(this, zone, injector);
  12293. this._applications.push(app);
  12294. _runAppInitializers(injector);
  12295. return app;
  12296. };
  12297. PlatformRef_.prototype.dispose = function () {
  12298. collection_1.ListWrapper.clone(this._applications).forEach(function (app) { return app.dispose(); });
  12299. this._disposeListeners.forEach(function (dispose) { return dispose(); });
  12300. this._dispose();
  12301. };
  12302. /** @internal */
  12303. PlatformRef_.prototype._applicationDisposed = function (app) { collection_1.ListWrapper.remove(this._applications, app); };
  12304. return PlatformRef_;
  12305. })(PlatformRef);
  12306. exports.PlatformRef_ = PlatformRef_;
  12307. function _runAppInitializers(injector) {
  12308. var inits = injector.getOptional(application_tokens_1.APP_INITIALIZER);
  12309. if (lang_1.isPresent(inits))
  12310. inits.forEach(function (init) { return init(); });
  12311. }
  12312. /**
  12313. * A reference to an Angular application running on a page.
  12314. *
  12315. * For more about Angular applications, see the documentation for {@link bootstrap}.
  12316. */
  12317. var ApplicationRef = (function () {
  12318. function ApplicationRef() {
  12319. }
  12320. Object.defineProperty(ApplicationRef.prototype, "injector", {
  12321. /**
  12322. * Retrieve the application {@link Injector}.
  12323. */
  12324. get: function () { return exceptions_1.unimplemented(); },
  12325. enumerable: true,
  12326. configurable: true
  12327. });
  12328. ;
  12329. Object.defineProperty(ApplicationRef.prototype, "zone", {
  12330. /**
  12331. * Retrieve the application {@link NgZone}.
  12332. */
  12333. get: function () { return exceptions_1.unimplemented(); },
  12334. enumerable: true,
  12335. configurable: true
  12336. });
  12337. ;
  12338. Object.defineProperty(ApplicationRef.prototype, "componentTypes", {
  12339. /**
  12340. * Get a list of component types registered to this application.
  12341. */
  12342. get: function () { return exceptions_1.unimplemented(); },
  12343. enumerable: true,
  12344. configurable: true
  12345. });
  12346. ;
  12347. return ApplicationRef;
  12348. })();
  12349. exports.ApplicationRef = ApplicationRef;
  12350. var ApplicationRef_ = (function (_super) {
  12351. __extends(ApplicationRef_, _super);
  12352. function ApplicationRef_(_platform, _zone, _injector) {
  12353. var _this = this;
  12354. _super.call(this);
  12355. this._platform = _platform;
  12356. this._zone = _zone;
  12357. this._injector = _injector;
  12358. /** @internal */
  12359. this._bootstrapListeners = [];
  12360. /** @internal */
  12361. this._disposeListeners = [];
  12362. /** @internal */
  12363. this._rootComponents = [];
  12364. /** @internal */
  12365. this._rootComponentTypes = [];
  12366. /** @internal */
  12367. this._changeDetectorRefs = [];
  12368. /** @internal */
  12369. this._runningTick = false;
  12370. /** @internal */
  12371. this._enforceNoNewChanges = false;
  12372. if (lang_1.isPresent(this._zone)) {
  12373. async_1.ObservableWrapper.subscribe(this._zone.onTurnDone, function (_) { _this._zone.run(function () { _this.tick(); }); });
  12374. }
  12375. this._enforceNoNewChanges = lang_1.assertionsEnabled();
  12376. }
  12377. ApplicationRef_.prototype.registerBootstrapListener = function (listener) {
  12378. this._bootstrapListeners.push(listener);
  12379. };
  12380. ApplicationRef_.prototype.registerDisposeListener = function (dispose) { this._disposeListeners.push(dispose); };
  12381. ApplicationRef_.prototype.registerChangeDetector = function (changeDetector) {
  12382. this._changeDetectorRefs.push(changeDetector);
  12383. };
  12384. ApplicationRef_.prototype.unregisterChangeDetector = function (changeDetector) {
  12385. collection_1.ListWrapper.remove(this._changeDetectorRefs, changeDetector);
  12386. };
  12387. ApplicationRef_.prototype.bootstrap = function (componentType, providers) {
  12388. var _this = this;
  12389. var completer = async_1.PromiseWrapper.completer();
  12390. this._zone.run(function () {
  12391. var componentProviders = _componentProviders(componentType);
  12392. if (lang_1.isPresent(providers)) {
  12393. componentProviders.push(providers);
  12394. }
  12395. var exceptionHandler = _this._injector.get(exceptions_1.ExceptionHandler);
  12396. _this._rootComponentTypes.push(componentType);
  12397. try {
  12398. var injector = _this._injector.resolveAndCreateChild(componentProviders);
  12399. var compRefToken = injector.get(application_tokens_1.APP_COMPONENT_REF_PROMISE);
  12400. var tick = function (componentRef) {
  12401. _this._loadComponent(componentRef);
  12402. completer.resolve(componentRef);
  12403. };
  12404. var tickResult = async_1.PromiseWrapper.then(compRefToken, tick);
  12405. // THIS MUST ONLY RUN IN DART.
  12406. // This is required to report an error when no components with a matching selector found.
  12407. // Otherwise the promise will never be completed.
  12408. // Doing this in JS causes an extra error message to appear.
  12409. if (lang_1.IS_DART) {
  12410. async_1.PromiseWrapper.then(tickResult, function (_) { });
  12411. }
  12412. async_1.PromiseWrapper.then(tickResult, null, function (err, stackTrace) { return completer.reject(err, stackTrace); });
  12413. }
  12414. catch (e) {
  12415. exceptionHandler.call(e, e.stack);
  12416. completer.reject(e, e.stack);
  12417. }
  12418. });
  12419. return completer.promise.then(function (_) {
  12420. var c = _this._injector.get(console_1.Console);
  12421. var modeDescription = lang_1.assertionsEnabled() ?
  12422. "in the development mode. Call enableProdMode() to enable the production mode." :
  12423. "in the production mode. Call enableDevMode() to enable the development mode.";
  12424. c.log("Angular 2 is running " + modeDescription);
  12425. return _;
  12426. });
  12427. };
  12428. /** @internal */
  12429. ApplicationRef_.prototype._loadComponent = function (ref) {
  12430. var appChangeDetector = view_ref_1.internalView(ref.hostView).changeDetector;
  12431. this._changeDetectorRefs.push(appChangeDetector.ref);
  12432. this.tick();
  12433. this._rootComponents.push(ref);
  12434. this._bootstrapListeners.forEach(function (listener) { return listener(ref); });
  12435. };
  12436. /** @internal */
  12437. ApplicationRef_.prototype._unloadComponent = function (ref) {
  12438. if (!collection_1.ListWrapper.contains(this._rootComponents, ref)) {
  12439. return;
  12440. }
  12441. this.unregisterChangeDetector(view_ref_1.internalView(ref.hostView).changeDetector.ref);
  12442. collection_1.ListWrapper.remove(this._rootComponents, ref);
  12443. };
  12444. Object.defineProperty(ApplicationRef_.prototype, "injector", {
  12445. get: function () { return this._injector; },
  12446. enumerable: true,
  12447. configurable: true
  12448. });
  12449. Object.defineProperty(ApplicationRef_.prototype, "zone", {
  12450. get: function () { return this._zone; },
  12451. enumerable: true,
  12452. configurable: true
  12453. });
  12454. ApplicationRef_.prototype.tick = function () {
  12455. if (this._runningTick) {
  12456. throw new exceptions_1.BaseException("ApplicationRef.tick is called recursively");
  12457. }
  12458. var s = ApplicationRef_._tickScope();
  12459. try {
  12460. this._runningTick = true;
  12461. this._changeDetectorRefs.forEach(function (detector) { return detector.detectChanges(); });
  12462. if (this._enforceNoNewChanges) {
  12463. this._changeDetectorRefs.forEach(function (detector) { return detector.checkNoChanges(); });
  12464. }
  12465. }
  12466. finally {
  12467. this._runningTick = false;
  12468. profile_1.wtfLeave(s);
  12469. }
  12470. };
  12471. ApplicationRef_.prototype.dispose = function () {
  12472. // TODO(alxhub): Dispose of the NgZone.
  12473. collection_1.ListWrapper.clone(this._rootComponents).forEach(function (ref) { return ref.dispose(); });
  12474. this._disposeListeners.forEach(function (dispose) { return dispose(); });
  12475. this._platform._applicationDisposed(this);
  12476. };
  12477. Object.defineProperty(ApplicationRef_.prototype, "componentTypes", {
  12478. get: function () { return this._rootComponentTypes; },
  12479. enumerable: true,
  12480. configurable: true
  12481. });
  12482. /** @internal */
  12483. ApplicationRef_._tickScope = profile_1.wtfCreateScope('ApplicationRef#tick()');
  12484. return ApplicationRef_;
  12485. })(ApplicationRef);
  12486. exports.ApplicationRef_ = ApplicationRef_;
  12487. /***/ },
  12488. /* 66 */
  12489. /***/ function(module, exports, __webpack_require__) {
  12490. var collection_1 = __webpack_require__(12);
  12491. var lang_1 = __webpack_require__(5);
  12492. var async_1 = __webpack_require__(60);
  12493. var profile_1 = __webpack_require__(45);
  12494. /**
  12495. * Stores error information; delivered via [NgZone.onError] stream.
  12496. */
  12497. var NgZoneError = (function () {
  12498. function NgZoneError(error, stackTrace) {
  12499. this.error = error;
  12500. this.stackTrace = stackTrace;
  12501. }
  12502. return NgZoneError;
  12503. })();
  12504. exports.NgZoneError = NgZoneError;
  12505. /**
  12506. * An injectable service for executing work inside or outside of the Angular zone.
  12507. *
  12508. * The most common use of this service is to optimize performance when starting a work consisting of
  12509. * one or more asynchronous tasks that don't require UI updates or error handling to be handled by
  12510. * Angular. Such tasks can be kicked off via {@link #runOutsideAngular} and if needed, these tasks
  12511. * can reenter the Angular zone via {@link #run}.
  12512. *
  12513. * <!-- TODO: add/fix links to:
  12514. * - docs explaining zones and the use of zones in Angular and change-detection
  12515. * - link to runOutsideAngular/run (throughout this file!)
  12516. * -->
  12517. *
  12518. * ### Example ([live demo](http://plnkr.co/edit/lY9m8HLy7z06vDoUaSN2?p=preview))
  12519. * ```
  12520. * import {Component, View, NgZone} from 'angular2/core';
  12521. * import {NgIf} from 'angular2/common';
  12522. *
  12523. * @Component({
  12524. * selector: 'ng-zone-demo'.
  12525. * template: `
  12526. * <h2>Demo: NgZone</h2>
  12527. *
  12528. * <p>Progress: {{progress}}%</p>
  12529. * <p *ngIf="progress >= 100">Done processing {{label}} of Angular zone!</p>
  12530. *
  12531. * <button (click)="processWithinAngularZone()">Process within Angular zone</button>
  12532. * <button (click)="processOutsideOfAngularZone()">Process outside of Angular zone</button>
  12533. * `,
  12534. * directives: [NgIf]
  12535. * })
  12536. * export class NgZoneDemo {
  12537. * progress: number = 0;
  12538. * label: string;
  12539. *
  12540. * constructor(private _ngZone: NgZone) {}
  12541. *
  12542. * // Loop inside the Angular zone
  12543. * // so the UI DOES refresh after each setTimeout cycle
  12544. * processWithinAngularZone() {
  12545. * this.label = 'inside';
  12546. * this.progress = 0;
  12547. * this._increaseProgress(() => console.log('Inside Done!'));
  12548. * }
  12549. *
  12550. * // Loop outside of the Angular zone
  12551. * // so the UI DOES NOT refresh after each setTimeout cycle
  12552. * processOutsideOfAngularZone() {
  12553. * this.label = 'outside';
  12554. * this.progress = 0;
  12555. * this._ngZone.runOutsideAngular(() => {
  12556. * this._increaseProgress(() => {
  12557. * // reenter the Angular zone and display done
  12558. * this._ngZone.run(() => {console.log('Outside Done!') });
  12559. * }}));
  12560. * }
  12561. *
  12562. *
  12563. * _increaseProgress(doneCallback: () => void) {
  12564. * this.progress += 1;
  12565. * console.log(`Current progress: ${this.progress}%`);
  12566. *
  12567. * if (this.progress < 100) {
  12568. * window.setTimeout(() => this._increaseProgress(doneCallback)), 10)
  12569. * } else {
  12570. * doneCallback();
  12571. * }
  12572. * }
  12573. * }
  12574. * ```
  12575. */
  12576. var NgZone = (function () {
  12577. /**
  12578. * @param {bool} enableLongStackTrace whether to enable long stack trace. They should only be
  12579. * enabled in development mode as they significantly impact perf.
  12580. */
  12581. function NgZone(_a) {
  12582. var enableLongStackTrace = _a.enableLongStackTrace;
  12583. /** @internal */
  12584. this._runScope = profile_1.wtfCreateScope("NgZone#run()");
  12585. /** @internal */
  12586. this._microtaskScope = profile_1.wtfCreateScope("NgZone#microtask()");
  12587. // Number of microtasks pending from _innerZone (& descendants)
  12588. /** @internal */
  12589. this._pendingMicrotasks = 0;
  12590. // Whether some code has been executed in the _innerZone (& descendants) in the current turn
  12591. /** @internal */
  12592. this._hasExecutedCodeInInnerZone = false;
  12593. // run() call depth in _mountZone. 0 at the end of a macrotask
  12594. // zone.run(() => { // top-level call
  12595. // zone.run(() => {}); // nested call -> in-turn
  12596. // });
  12597. /** @internal */
  12598. this._nestedRun = 0;
  12599. /** @internal */
  12600. this._inVmTurnDone = false;
  12601. /** @internal */
  12602. this._pendingTimeouts = [];
  12603. if (lang_1.global.zone) {
  12604. this._disabled = false;
  12605. this._mountZone = lang_1.global.zone;
  12606. this._innerZone = this._createInnerZone(this._mountZone, enableLongStackTrace);
  12607. }
  12608. else {
  12609. this._disabled = true;
  12610. this._mountZone = null;
  12611. }
  12612. this._onTurnStartEvents = new async_1.EventEmitter(false);
  12613. this._onTurnDoneEvents = new async_1.EventEmitter(false);
  12614. this._onEventDoneEvents = new async_1.EventEmitter(false);
  12615. this._onErrorEvents = new async_1.EventEmitter(false);
  12616. }
  12617. /**
  12618. * Sets the zone hook that is called just before a browser task that is handled by Angular
  12619. * executes.
  12620. *
  12621. * The hook is called once per browser task that is handled by Angular.
  12622. *
  12623. * Setting the hook overrides any previously set hook.
  12624. *
  12625. * @deprecated this API will be removed in the future. Use `onTurnStart` instead.
  12626. */
  12627. NgZone.prototype.overrideOnTurnStart = function (onTurnStartHook) {
  12628. this._onTurnStart = lang_1.normalizeBlank(onTurnStartHook);
  12629. };
  12630. Object.defineProperty(NgZone.prototype, "onTurnStart", {
  12631. /**
  12632. * Notifies subscribers just before Angular event turn starts.
  12633. *
  12634. * Emits an event once per browser task that is handled by Angular.
  12635. */
  12636. get: function () { return this._onTurnStartEvents; },
  12637. enumerable: true,
  12638. configurable: true
  12639. });
  12640. /** @internal */
  12641. NgZone.prototype._notifyOnTurnStart = function (parentRun) {
  12642. var _this = this;
  12643. parentRun.call(this._innerZone, function () { _this._onTurnStartEvents.emit(null); });
  12644. };
  12645. /**
  12646. * Sets the zone hook that is called immediately after Angular zone is done processing the current
  12647. * task and any microtasks scheduled from that task.
  12648. *
  12649. * This is where we typically do change-detection.
  12650. *
  12651. * The hook is called once per browser task that is handled by Angular.
  12652. *
  12653. * Setting the hook overrides any previously set hook.
  12654. *
  12655. * @deprecated this API will be removed in the future. Use `onTurnDone` instead.
  12656. */
  12657. NgZone.prototype.overrideOnTurnDone = function (onTurnDoneHook) {
  12658. this._onTurnDone = lang_1.normalizeBlank(onTurnDoneHook);
  12659. };
  12660. Object.defineProperty(NgZone.prototype, "onTurnDone", {
  12661. /**
  12662. * Notifies subscribers immediately after Angular zone is done processing
  12663. * the current turn and any microtasks scheduled from that turn.
  12664. *
  12665. * Used by Angular as a signal to kick off change-detection.
  12666. */
  12667. get: function () { return this._onTurnDoneEvents; },
  12668. enumerable: true,
  12669. configurable: true
  12670. });
  12671. /** @internal */
  12672. NgZone.prototype._notifyOnTurnDone = function (parentRun) {
  12673. var _this = this;
  12674. parentRun.call(this._innerZone, function () { _this._onTurnDoneEvents.emit(null); });
  12675. };
  12676. /**
  12677. * Sets the zone hook that is called immediately after the `onTurnDone` callback is called and any
  12678. * microstasks scheduled from within that callback are drained.
  12679. *
  12680. * `onEventDoneFn` is executed outside Angular zone, which means that we will no longer attempt to
  12681. * sync the UI with any model changes that occur within this callback.
  12682. *
  12683. * This hook is useful for validating application state (e.g. in a test).
  12684. *
  12685. * Setting the hook overrides any previously set hook.
  12686. *
  12687. * @deprecated this API will be removed in the future. Use `onEventDone` instead.
  12688. */
  12689. NgZone.prototype.overrideOnEventDone = function (onEventDoneFn, opt_waitForAsync) {
  12690. var _this = this;
  12691. if (opt_waitForAsync === void 0) { opt_waitForAsync = false; }
  12692. var normalizedOnEventDone = lang_1.normalizeBlank(onEventDoneFn);
  12693. if (opt_waitForAsync) {
  12694. this._onEventDone = function () {
  12695. if (!_this._pendingTimeouts.length) {
  12696. normalizedOnEventDone();
  12697. }
  12698. };
  12699. }
  12700. else {
  12701. this._onEventDone = normalizedOnEventDone;
  12702. }
  12703. };
  12704. Object.defineProperty(NgZone.prototype, "onEventDone", {
  12705. /**
  12706. * Notifies subscribers immediately after the final `onTurnDone` callback
  12707. * before ending VM event.
  12708. *
  12709. * This event is useful for validating application state (e.g. in a test).
  12710. */
  12711. get: function () { return this._onEventDoneEvents; },
  12712. enumerable: true,
  12713. configurable: true
  12714. });
  12715. /** @internal */
  12716. NgZone.prototype._notifyOnEventDone = function () {
  12717. var _this = this;
  12718. this.runOutsideAngular(function () { _this._onEventDoneEvents.emit(null); });
  12719. };
  12720. Object.defineProperty(NgZone.prototype, "hasPendingMicrotasks", {
  12721. /**
  12722. * Whether there are any outstanding microtasks.
  12723. */
  12724. get: function () { return this._pendingMicrotasks > 0; },
  12725. enumerable: true,
  12726. configurable: true
  12727. });
  12728. Object.defineProperty(NgZone.prototype, "hasPendingTimers", {
  12729. /**
  12730. * Whether there are any outstanding timers.
  12731. */
  12732. get: function () { return this._pendingTimeouts.length > 0; },
  12733. enumerable: true,
  12734. configurable: true
  12735. });
  12736. Object.defineProperty(NgZone.prototype, "hasPendingAsyncTasks", {
  12737. /**
  12738. * Whether there are any outstanding asychnronous tasks of any kind that are
  12739. * scheduled to run within Angular zone.
  12740. *
  12741. * Useful as a signal of UI stability. For example, when a test reaches a
  12742. * point when [hasPendingAsyncTasks] is `false` it might be a good time to run
  12743. * test expectations.
  12744. */
  12745. get: function () { return this.hasPendingMicrotasks || this.hasPendingTimers; },
  12746. enumerable: true,
  12747. configurable: true
  12748. });
  12749. /**
  12750. * Sets the zone hook that is called when an error is thrown in the Angular zone.
  12751. *
  12752. * Setting the hook overrides any previously set hook.
  12753. *
  12754. * @deprecated this API will be removed in the future. Use `onError` instead.
  12755. */
  12756. NgZone.prototype.overrideOnErrorHandler = function (errorHandler) {
  12757. this._onErrorHandler = lang_1.normalizeBlank(errorHandler);
  12758. };
  12759. Object.defineProperty(NgZone.prototype, "onError", {
  12760. get: function () { return this._onErrorEvents; },
  12761. enumerable: true,
  12762. configurable: true
  12763. });
  12764. /**
  12765. * Executes the `fn` function synchronously within the Angular zone and returns value returned by
  12766. * the function.
  12767. *
  12768. * Running functions via `run` allows you to reenter Angular zone from a task that was executed
  12769. * outside of the Angular zone (typically started via {@link #runOutsideAngular}).
  12770. *
  12771. * Any future tasks or microtasks scheduled from within this function will continue executing from
  12772. * within the Angular zone.
  12773. */
  12774. NgZone.prototype.run = function (fn) {
  12775. if (this._disabled) {
  12776. return fn();
  12777. }
  12778. else {
  12779. var s = this._runScope();
  12780. try {
  12781. return this._innerZone.run(fn);
  12782. }
  12783. finally {
  12784. profile_1.wtfLeave(s);
  12785. }
  12786. }
  12787. };
  12788. /**
  12789. * Executes the `fn` function synchronously in Angular's parent zone and returns value returned by
  12790. * the function.
  12791. *
  12792. * Running functions via `runOutsideAngular` allows you to escape Angular's zone and do work that
  12793. * doesn't trigger Angular change-detection or is subject to Angular's error handling.
  12794. *
  12795. * Any future tasks or microtasks scheduled from within this function will continue executing from
  12796. * outside of the Angular zone.
  12797. *
  12798. * Use {@link #run} to reenter the Angular zone and do work that updates the application model.
  12799. */
  12800. NgZone.prototype.runOutsideAngular = function (fn) {
  12801. if (this._disabled) {
  12802. return fn();
  12803. }
  12804. else {
  12805. return this._mountZone.run(fn);
  12806. }
  12807. };
  12808. /** @internal */
  12809. NgZone.prototype._createInnerZone = function (zone, enableLongStackTrace) {
  12810. var microtaskScope = this._microtaskScope;
  12811. var ngZone = this;
  12812. var errorHandling;
  12813. if (enableLongStackTrace) {
  12814. errorHandling = collection_1.StringMapWrapper.merge(Zone.longStackTraceZone, { onError: function (e) { ngZone._notifyOnError(this, e); } });
  12815. }
  12816. else {
  12817. errorHandling = { onError: function (e) { ngZone._notifyOnError(this, e); } };
  12818. }
  12819. return zone.fork(errorHandling)
  12820. .fork({
  12821. '$run': function (parentRun) {
  12822. return function () {
  12823. try {
  12824. ngZone._nestedRun++;
  12825. if (!ngZone._hasExecutedCodeInInnerZone) {
  12826. ngZone._hasExecutedCodeInInnerZone = true;
  12827. ngZone._notifyOnTurnStart(parentRun);
  12828. if (ngZone._onTurnStart) {
  12829. parentRun.call(ngZone._innerZone, ngZone._onTurnStart);
  12830. }
  12831. }
  12832. return parentRun.apply(this, arguments);
  12833. }
  12834. finally {
  12835. ngZone._nestedRun--;
  12836. // If there are no more pending microtasks, we are at the end of a VM turn (or in
  12837. // onTurnStart)
  12838. // _nestedRun will be 0 at the end of a macrotasks (it could be > 0 when there are
  12839. // nested calls
  12840. // to run()).
  12841. if (ngZone._pendingMicrotasks == 0 && ngZone._nestedRun == 0 &&
  12842. !this._inVmTurnDone) {
  12843. if (ngZone._hasExecutedCodeInInnerZone) {
  12844. try {
  12845. this._inVmTurnDone = true;
  12846. ngZone._notifyOnTurnDone(parentRun);
  12847. if (ngZone._onTurnDone) {
  12848. parentRun.call(ngZone._innerZone, ngZone._onTurnDone);
  12849. }
  12850. }
  12851. finally {
  12852. this._inVmTurnDone = false;
  12853. ngZone._hasExecutedCodeInInnerZone = false;
  12854. }
  12855. }
  12856. if (ngZone._pendingMicrotasks === 0) {
  12857. ngZone._notifyOnEventDone();
  12858. if (lang_1.isPresent(ngZone._onEventDone)) {
  12859. ngZone.runOutsideAngular(ngZone._onEventDone);
  12860. }
  12861. }
  12862. }
  12863. }
  12864. };
  12865. },
  12866. '$scheduleMicrotask': function (parentScheduleMicrotask) {
  12867. return function (fn) {
  12868. ngZone._pendingMicrotasks++;
  12869. var microtask = function () {
  12870. var s = microtaskScope();
  12871. try {
  12872. fn();
  12873. }
  12874. finally {
  12875. ngZone._pendingMicrotasks--;
  12876. profile_1.wtfLeave(s);
  12877. }
  12878. };
  12879. parentScheduleMicrotask.call(this, microtask);
  12880. };
  12881. },
  12882. '$setTimeout': function (parentSetTimeout) {
  12883. return function (fn, delay) {
  12884. var args = [];
  12885. for (var _i = 2; _i < arguments.length; _i++) {
  12886. args[_i - 2] = arguments[_i];
  12887. }
  12888. var id;
  12889. var cb = function () {
  12890. fn();
  12891. collection_1.ListWrapper.remove(ngZone._pendingTimeouts, id);
  12892. };
  12893. id = parentSetTimeout(cb, delay, args);
  12894. ngZone._pendingTimeouts.push(id);
  12895. return id;
  12896. };
  12897. },
  12898. '$clearTimeout': function (parentClearTimeout) {
  12899. return function (id) {
  12900. parentClearTimeout(id);
  12901. collection_1.ListWrapper.remove(ngZone._pendingTimeouts, id);
  12902. };
  12903. },
  12904. _innerZone: true
  12905. });
  12906. };
  12907. /** @internal */
  12908. NgZone.prototype._notifyOnError = function (zone, e) {
  12909. if (lang_1.isPresent(this._onErrorHandler) || async_1.ObservableWrapper.hasSubscribers(this._onErrorEvents)) {
  12910. var trace = [lang_1.normalizeBlank(e.stack)];
  12911. while (zone && zone.constructedAtException) {
  12912. trace.push(zone.constructedAtException.get());
  12913. zone = zone.parent;
  12914. }
  12915. if (async_1.ObservableWrapper.hasSubscribers(this._onErrorEvents)) {
  12916. async_1.ObservableWrapper.callEmit(this._onErrorEvents, new NgZoneError(e, trace));
  12917. }
  12918. if (lang_1.isPresent(this._onErrorHandler)) {
  12919. this._onErrorHandler(e, trace);
  12920. }
  12921. }
  12922. else {
  12923. console.log('## _notifyOnError ##');
  12924. console.log(e.stack);
  12925. throw e;
  12926. }
  12927. };
  12928. return NgZone;
  12929. })();
  12930. exports.NgZone = NgZone;
  12931. /***/ },
  12932. /* 67 */
  12933. /***/ function(module, exports, __webpack_require__) {
  12934. var di_1 = __webpack_require__(6);
  12935. var lang_1 = __webpack_require__(5);
  12936. /**
  12937. * @internal
  12938. */
  12939. exports.APP_COMPONENT_REF_PROMISE = lang_1.CONST_EXPR(new di_1.OpaqueToken('Promise<ComponentRef>'));
  12940. /**
  12941. * An {@link angular2/di/OpaqueToken} representing the application root type in the {@link
  12942. * Injector}.
  12943. *
  12944. * ```
  12945. * @Component(...)
  12946. * class MyApp {
  12947. * ...
  12948. * }
  12949. *
  12950. * bootstrap(MyApp).then((appRef:ApplicationRef) {
  12951. * expect(appRef.injector.get(appComponentTypeToken)).toEqual(MyApp);
  12952. * });
  12953. *
  12954. * ```
  12955. */
  12956. exports.APP_COMPONENT = lang_1.CONST_EXPR(new di_1.OpaqueToken('AppComponent'));
  12957. /**
  12958. * A DI Token representing a unique string id assigned to the application by Angular and used
  12959. * primarily for prefixing application attributes and CSS styles when
  12960. * {@link ViewEncapsulation#Emulated} is being used.
  12961. *
  12962. * If you need to avoid randomly generated value to be used as an application id, you can provide
  12963. * a custom value via a DI provider <!-- TODO: provider --> configuring the root {@link Injector}
  12964. * using this token.
  12965. */
  12966. exports.APP_ID = lang_1.CONST_EXPR(new di_1.OpaqueToken('AppId'));
  12967. function _appIdRandomProviderFactory() {
  12968. return "" + _randomChar() + _randomChar() + _randomChar();
  12969. }
  12970. /**
  12971. * Providers that will generate a random APP_ID_TOKEN.
  12972. */
  12973. exports.APP_ID_RANDOM_PROVIDER = lang_1.CONST_EXPR(new di_1.Provider(exports.APP_ID, { useFactory: _appIdRandomProviderFactory, deps: [] }));
  12974. function _randomChar() {
  12975. return lang_1.StringWrapper.fromCharCode(97 + lang_1.Math.floor(lang_1.Math.random() * 25));
  12976. }
  12977. /**
  12978. * A function that will be executed when a platform is initialized.
  12979. */
  12980. exports.PLATFORM_INITIALIZER = lang_1.CONST_EXPR(new di_1.OpaqueToken("Platform Initializer"));
  12981. /**
  12982. * A function that will be executed when an application is initialized.
  12983. */
  12984. exports.APP_INITIALIZER = lang_1.CONST_EXPR(new di_1.OpaqueToken("Application Initializer"));
  12985. /**
  12986. * A token which indicates the root directory of the application
  12987. */
  12988. exports.PACKAGE_ROOT_URL = lang_1.CONST_EXPR(new di_1.OpaqueToken("Application Packages Root URL"));
  12989. /***/ },
  12990. /* 68 */
  12991. /***/ function(module, exports, __webpack_require__) {
  12992. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  12993. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  12994. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  12995. 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;
  12996. return c > 3 && r && Object.defineProperty(target, key, r), r;
  12997. };
  12998. var __metadata = (this && this.__metadata) || function (k, v) {
  12999. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  13000. };
  13001. var di_1 = __webpack_require__(6);
  13002. var collection_1 = __webpack_require__(12);
  13003. var lang_1 = __webpack_require__(5);
  13004. var exceptions_1 = __webpack_require__(14);
  13005. var ng_zone_1 = __webpack_require__(66);
  13006. var async_1 = __webpack_require__(60);
  13007. /**
  13008. * The Testability service provides testing hooks that can be accessed from
  13009. * the browser and by services such as Protractor. Each bootstrapped Angular
  13010. * application on the page will have an instance of Testability.
  13011. */
  13012. var Testability = (function () {
  13013. function Testability(_ngZone) {
  13014. /** @internal */
  13015. this._pendingCount = 0;
  13016. /** @internal */
  13017. this._callbacks = [];
  13018. /** @internal */
  13019. this._isAngularEventPending = false;
  13020. this._watchAngularEvents(_ngZone);
  13021. }
  13022. /** @internal */
  13023. Testability.prototype._watchAngularEvents = function (_ngZone) {
  13024. var _this = this;
  13025. async_1.ObservableWrapper.subscribe(_ngZone.onTurnStart, function (_) { _this._isAngularEventPending = true; });
  13026. _ngZone.runOutsideAngular(function () {
  13027. async_1.ObservableWrapper.subscribe(_ngZone.onEventDone, function (_) {
  13028. if (!_ngZone.hasPendingTimers) {
  13029. _this._isAngularEventPending = false;
  13030. _this._runCallbacksIfReady();
  13031. }
  13032. });
  13033. });
  13034. };
  13035. Testability.prototype.increasePendingRequestCount = function () {
  13036. this._pendingCount += 1;
  13037. return this._pendingCount;
  13038. };
  13039. Testability.prototype.decreasePendingRequestCount = function () {
  13040. this._pendingCount -= 1;
  13041. if (this._pendingCount < 0) {
  13042. throw new exceptions_1.BaseException('pending async requests below zero');
  13043. }
  13044. this._runCallbacksIfReady();
  13045. return this._pendingCount;
  13046. };
  13047. Testability.prototype.isStable = function () { return this._pendingCount == 0 && !this._isAngularEventPending; };
  13048. /** @internal */
  13049. Testability.prototype._runCallbacksIfReady = function () {
  13050. var _this = this;
  13051. if (!this.isStable()) {
  13052. return; // Not ready
  13053. }
  13054. // Schedules the call backs in a new frame so that it is always async.
  13055. async_1.PromiseWrapper.resolve(null).then(function (_) {
  13056. while (_this._callbacks.length !== 0) {
  13057. (_this._callbacks.pop())();
  13058. }
  13059. });
  13060. };
  13061. Testability.prototype.whenStable = function (callback) {
  13062. this._callbacks.push(callback);
  13063. this._runCallbacksIfReady();
  13064. };
  13065. Testability.prototype.getPendingRequestCount = function () { return this._pendingCount; };
  13066. // This only accounts for ngZone, and not pending counts. Use `whenStable` to
  13067. // check for stability.
  13068. Testability.prototype.isAngularEventPending = function () { return this._isAngularEventPending; };
  13069. Testability.prototype.findBindings = function (using, provider, exactMatch) {
  13070. // TODO(juliemr): implement.
  13071. return [];
  13072. };
  13073. Testability.prototype.findProviders = function (using, provider, exactMatch) {
  13074. // TODO(juliemr): implement.
  13075. return [];
  13076. };
  13077. Testability = __decorate([
  13078. di_1.Injectable(),
  13079. __metadata('design:paramtypes', [ng_zone_1.NgZone])
  13080. ], Testability);
  13081. return Testability;
  13082. })();
  13083. exports.Testability = Testability;
  13084. /**
  13085. * A global registry of {@link Testability} instances for specific elements.
  13086. */
  13087. var TestabilityRegistry = (function () {
  13088. function TestabilityRegistry() {
  13089. /** @internal */
  13090. this._applications = new collection_1.Map();
  13091. _testabilityGetter.addToWindow(this);
  13092. }
  13093. TestabilityRegistry.prototype.registerApplication = function (token, testability) {
  13094. this._applications.set(token, testability);
  13095. };
  13096. TestabilityRegistry.prototype.getTestability = function (elem) { return this._applications.get(elem); };
  13097. TestabilityRegistry.prototype.getAllTestabilities = function () { return collection_1.MapWrapper.values(this._applications); };
  13098. TestabilityRegistry.prototype.findTestabilityInTree = function (elem, findInAncestors) {
  13099. if (findInAncestors === void 0) { findInAncestors = true; }
  13100. return _testabilityGetter.findTestabilityInTree(this, elem, findInAncestors);
  13101. };
  13102. TestabilityRegistry = __decorate([
  13103. di_1.Injectable(),
  13104. __metadata('design:paramtypes', [])
  13105. ], TestabilityRegistry);
  13106. return TestabilityRegistry;
  13107. })();
  13108. exports.TestabilityRegistry = TestabilityRegistry;
  13109. var _NoopGetTestability = (function () {
  13110. function _NoopGetTestability() {
  13111. }
  13112. _NoopGetTestability.prototype.addToWindow = function (registry) { };
  13113. _NoopGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {
  13114. return null;
  13115. };
  13116. _NoopGetTestability = __decorate([
  13117. lang_1.CONST(),
  13118. __metadata('design:paramtypes', [])
  13119. ], _NoopGetTestability);
  13120. return _NoopGetTestability;
  13121. })();
  13122. /**
  13123. * Set the {@link GetTestability} implementation used by the Angular testing framework.
  13124. */
  13125. function setTestabilityGetter(getter) {
  13126. _testabilityGetter = getter;
  13127. }
  13128. exports.setTestabilityGetter = setTestabilityGetter;
  13129. var _testabilityGetter = lang_1.CONST_EXPR(new _NoopGetTestability());
  13130. /***/ },
  13131. /* 69 */
  13132. /***/ function(module, exports, __webpack_require__) {
  13133. var __extends = (this && this.__extends) || function (d, b) {
  13134. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  13135. function __() { this.constructor = d; }
  13136. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13137. };
  13138. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  13139. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  13140. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  13141. 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;
  13142. return c > 3 && r && Object.defineProperty(target, key, r), r;
  13143. };
  13144. var __metadata = (this && this.__metadata) || function (k, v) {
  13145. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  13146. };
  13147. var di_1 = __webpack_require__(6);
  13148. var compiler_1 = __webpack_require__(70);
  13149. var lang_1 = __webpack_require__(5);
  13150. var view_manager_1 = __webpack_require__(81);
  13151. /**
  13152. * Represents an instance of a Component created via {@link DynamicComponentLoader}.
  13153. *
  13154. * `ComponentRef` provides access to the Component Instance as well other objects related to this
  13155. * Component Instance and allows you to destroy the Component Instance via the {@link #dispose}
  13156. * method.
  13157. */
  13158. var ComponentRef = (function () {
  13159. function ComponentRef() {
  13160. }
  13161. Object.defineProperty(ComponentRef.prototype, "hostView", {
  13162. /**
  13163. * The {@link ViewRef} of the Host View of this Component instance.
  13164. */
  13165. get: function () { return this.location.parentView; },
  13166. enumerable: true,
  13167. configurable: true
  13168. });
  13169. Object.defineProperty(ComponentRef.prototype, "hostComponent", {
  13170. /**
  13171. * @internal
  13172. *
  13173. * The instance of the component.
  13174. *
  13175. * TODO(i): this api should be removed
  13176. */
  13177. get: function () { return this.instance; },
  13178. enumerable: true,
  13179. configurable: true
  13180. });
  13181. return ComponentRef;
  13182. })();
  13183. exports.ComponentRef = ComponentRef;
  13184. var ComponentRef_ = (function (_super) {
  13185. __extends(ComponentRef_, _super);
  13186. /**
  13187. * TODO(i): refactor into public/private fields
  13188. */
  13189. function ComponentRef_(location, instance, componentType, injector, _dispose) {
  13190. _super.call(this);
  13191. this._dispose = _dispose;
  13192. this.location = location;
  13193. this.instance = instance;
  13194. this.componentType = componentType;
  13195. this.injector = injector;
  13196. }
  13197. Object.defineProperty(ComponentRef_.prototype, "hostComponentType", {
  13198. /**
  13199. * @internal
  13200. *
  13201. * Returns the type of this Component instance.
  13202. *
  13203. * TODO(i): this api should be removed
  13204. */
  13205. get: function () { return this.componentType; },
  13206. enumerable: true,
  13207. configurable: true
  13208. });
  13209. ComponentRef_.prototype.dispose = function () { this._dispose(); };
  13210. return ComponentRef_;
  13211. })(ComponentRef);
  13212. exports.ComponentRef_ = ComponentRef_;
  13213. /**
  13214. * Service for instantiating a Component and attaching it to a View at a specified location.
  13215. */
  13216. var DynamicComponentLoader = (function () {
  13217. function DynamicComponentLoader() {
  13218. }
  13219. return DynamicComponentLoader;
  13220. })();
  13221. exports.DynamicComponentLoader = DynamicComponentLoader;
  13222. var DynamicComponentLoader_ = (function (_super) {
  13223. __extends(DynamicComponentLoader_, _super);
  13224. function DynamicComponentLoader_(_compiler, _viewManager) {
  13225. _super.call(this);
  13226. this._compiler = _compiler;
  13227. this._viewManager = _viewManager;
  13228. }
  13229. DynamicComponentLoader_.prototype.loadAsRoot = function (type, overrideSelector, injector, onDispose) {
  13230. var _this = this;
  13231. return this._compiler.compileInHost(type).then(function (hostProtoViewRef) {
  13232. var hostViewRef = _this._viewManager.createRootHostView(hostProtoViewRef, overrideSelector, injector);
  13233. var newLocation = _this._viewManager.getHostElement(hostViewRef);
  13234. var component = _this._viewManager.getComponent(newLocation);
  13235. var dispose = function () {
  13236. if (lang_1.isPresent(onDispose)) {
  13237. onDispose();
  13238. }
  13239. _this._viewManager.destroyRootHostView(hostViewRef);
  13240. };
  13241. return new ComponentRef_(newLocation, component, type, injector, dispose);
  13242. });
  13243. };
  13244. DynamicComponentLoader_.prototype.loadIntoLocation = function (type, hostLocation, anchorName, providers) {
  13245. if (providers === void 0) { providers = null; }
  13246. return this.loadNextToLocation(type, this._viewManager.getNamedElementInComponentView(hostLocation, anchorName), providers);
  13247. };
  13248. DynamicComponentLoader_.prototype.loadNextToLocation = function (type, location, providers) {
  13249. var _this = this;
  13250. if (providers === void 0) { providers = null; }
  13251. return this._compiler.compileInHost(type).then(function (hostProtoViewRef) {
  13252. var viewContainer = _this._viewManager.getViewContainer(location);
  13253. var hostViewRef = viewContainer.createHostView(hostProtoViewRef, viewContainer.length, providers);
  13254. var newLocation = _this._viewManager.getHostElement(hostViewRef);
  13255. var component = _this._viewManager.getComponent(newLocation);
  13256. var dispose = function () {
  13257. var index = viewContainer.indexOf(hostViewRef);
  13258. if (index !== -1) {
  13259. viewContainer.remove(index);
  13260. }
  13261. };
  13262. return new ComponentRef_(newLocation, component, type, null, dispose);
  13263. });
  13264. };
  13265. DynamicComponentLoader_ = __decorate([
  13266. di_1.Injectable(),
  13267. __metadata('design:paramtypes', [compiler_1.Compiler, view_manager_1.AppViewManager])
  13268. ], DynamicComponentLoader_);
  13269. return DynamicComponentLoader_;
  13270. })(DynamicComponentLoader);
  13271. exports.DynamicComponentLoader_ = DynamicComponentLoader_;
  13272. /***/ },
  13273. /* 70 */
  13274. /***/ function(module, exports, __webpack_require__) {
  13275. var __extends = (this && this.__extends) || function (d, b) {
  13276. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  13277. function __() { this.constructor = d; }
  13278. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13279. };
  13280. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  13281. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  13282. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  13283. 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;
  13284. return c > 3 && r && Object.defineProperty(target, key, r), r;
  13285. };
  13286. var __metadata = (this && this.__metadata) || function (k, v) {
  13287. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  13288. };
  13289. var proto_view_factory_1 = __webpack_require__(71);
  13290. var di_1 = __webpack_require__(6);
  13291. var lang_1 = __webpack_require__(5);
  13292. var exceptions_1 = __webpack_require__(14);
  13293. var async_1 = __webpack_require__(60);
  13294. var reflection_1 = __webpack_require__(16);
  13295. var template_commands_1 = __webpack_require__(96);
  13296. /**
  13297. * Low-level service for compiling {@link Component}s into {@link ProtoViewRef ProtoViews}s, which
  13298. * can later be used to create and render a Component instance.
  13299. *
  13300. * Most applications should instead use higher-level {@link DynamicComponentLoader} service, which
  13301. * both compiles and instantiates a Component.
  13302. */
  13303. var Compiler = (function () {
  13304. function Compiler() {
  13305. }
  13306. return Compiler;
  13307. })();
  13308. exports.Compiler = Compiler;
  13309. function _isCompiledHostTemplate(type) {
  13310. return type instanceof template_commands_1.CompiledHostTemplate;
  13311. }
  13312. var Compiler_ = (function (_super) {
  13313. __extends(Compiler_, _super);
  13314. function Compiler_(_protoViewFactory) {
  13315. _super.call(this);
  13316. this._protoViewFactory = _protoViewFactory;
  13317. }
  13318. Compiler_.prototype.compileInHost = function (componentType) {
  13319. var metadatas = reflection_1.reflector.annotations(componentType);
  13320. var compiledHostTemplate = metadatas.find(_isCompiledHostTemplate);
  13321. if (lang_1.isBlank(compiledHostTemplate)) {
  13322. throw new exceptions_1.BaseException("No precompiled template for component " + lang_1.stringify(componentType) + " found");
  13323. }
  13324. return async_1.PromiseWrapper.resolve(this._createProtoView(compiledHostTemplate));
  13325. };
  13326. Compiler_.prototype._createProtoView = function (compiledHostTemplate) {
  13327. return this._protoViewFactory.createHost(compiledHostTemplate).ref;
  13328. };
  13329. Compiler_.prototype.clearCache = function () { this._protoViewFactory.clearCache(); };
  13330. Compiler_ = __decorate([
  13331. di_1.Injectable(),
  13332. __metadata('design:paramtypes', [proto_view_factory_1.ProtoViewFactory])
  13333. ], Compiler_);
  13334. return Compiler_;
  13335. })(Compiler);
  13336. exports.Compiler_ = Compiler_;
  13337. function internalCreateProtoView(compiler, compiledHostTemplate) {
  13338. return compiler._createProtoView(compiledHostTemplate);
  13339. }
  13340. exports.internalCreateProtoView = internalCreateProtoView;
  13341. /***/ },
  13342. /* 71 */
  13343. /***/ function(module, exports, __webpack_require__) {
  13344. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  13345. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  13346. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  13347. 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;
  13348. return c > 3 && r && Object.defineProperty(target, key, r), r;
  13349. };
  13350. var __metadata = (this && this.__metadata) || function (k, v) {
  13351. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  13352. };
  13353. var __param = (this && this.__param) || function (paramIndex, decorator) {
  13354. return function (target, key) { decorator(target, key, paramIndex); }
  13355. };
  13356. var lang_1 = __webpack_require__(5);
  13357. var api_1 = __webpack_require__(72);
  13358. var di_1 = __webpack_require__(6);
  13359. var pipe_provider_1 = __webpack_require__(73);
  13360. var pipes_1 = __webpack_require__(74);
  13361. var view_1 = __webpack_require__(76);
  13362. var element_binder_1 = __webpack_require__(79);
  13363. var element_injector_1 = __webpack_require__(80);
  13364. var directive_resolver_1 = __webpack_require__(92);
  13365. var view_resolver_1 = __webpack_require__(93);
  13366. var pipe_resolver_1 = __webpack_require__(94);
  13367. var view_2 = __webpack_require__(56);
  13368. var platform_directives_and_pipes_1 = __webpack_require__(95);
  13369. var template_commands_1 = __webpack_require__(96);
  13370. var api_2 = __webpack_require__(72);
  13371. var application_tokens_1 = __webpack_require__(67);
  13372. var ProtoViewFactory = (function () {
  13373. function ProtoViewFactory(_renderer, _platformPipes, _directiveResolver, _viewResolver, _pipeResolver, _appId) {
  13374. this._renderer = _renderer;
  13375. this._platformPipes = _platformPipes;
  13376. this._directiveResolver = _directiveResolver;
  13377. this._viewResolver = _viewResolver;
  13378. this._pipeResolver = _pipeResolver;
  13379. this._appId = _appId;
  13380. this._cache = new Map();
  13381. this._nextTemplateId = 0;
  13382. }
  13383. ProtoViewFactory.prototype.clearCache = function () { this._cache.clear(); };
  13384. ProtoViewFactory.prototype.createHost = function (compiledHostTemplate) {
  13385. var compiledTemplate = compiledHostTemplate.template;
  13386. var result = this._cache.get(compiledTemplate.id);
  13387. if (lang_1.isBlank(result)) {
  13388. var emptyMap = {};
  13389. var shortId = this._appId + "-" + this._nextTemplateId++;
  13390. this._renderer.registerComponentTemplate(new api_1.RenderComponentTemplate(compiledTemplate.id, shortId, view_2.ViewEncapsulation.None, compiledTemplate.commands, []));
  13391. result =
  13392. new view_1.AppProtoView(compiledTemplate.id, compiledTemplate.commands, view_1.ViewType.HOST, true, compiledTemplate.changeDetectorFactory, null, new pipes_1.ProtoPipes(emptyMap));
  13393. this._cache.set(compiledTemplate.id, result);
  13394. }
  13395. return result;
  13396. };
  13397. ProtoViewFactory.prototype._createComponent = function (cmd) {
  13398. var _this = this;
  13399. var nestedProtoView = this._cache.get(cmd.templateId);
  13400. if (lang_1.isBlank(nestedProtoView)) {
  13401. var component = cmd.directives[0];
  13402. var view = this._viewResolver.resolve(component);
  13403. var compiledTemplate = cmd.templateGetter();
  13404. var styles = _flattenStyleArr(compiledTemplate.styles, []);
  13405. var shortId = this._appId + "-" + this._nextTemplateId++;
  13406. this._renderer.registerComponentTemplate(new api_1.RenderComponentTemplate(compiledTemplate.id, shortId, cmd.encapsulation, compiledTemplate.commands, styles));
  13407. var boundPipes = this._flattenPipes(view).map(function (pipe) { return _this._bindPipe(pipe); });
  13408. nestedProtoView = new view_1.AppProtoView(compiledTemplate.id, compiledTemplate.commands, view_1.ViewType.COMPONENT, true, compiledTemplate.changeDetectorFactory, null, pipes_1.ProtoPipes.fromProviders(boundPipes));
  13409. // Note: The cache is updated before recursing
  13410. // to be able to resolve cycles
  13411. this._cache.set(compiledTemplate.id, nestedProtoView);
  13412. this._initializeProtoView(nestedProtoView, null);
  13413. }
  13414. return nestedProtoView;
  13415. };
  13416. ProtoViewFactory.prototype._createEmbeddedTemplate = function (cmd, parent) {
  13417. 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));
  13418. if (cmd.isMerged) {
  13419. this.initializeProtoViewIfNeeded(nestedProtoView);
  13420. }
  13421. return nestedProtoView;
  13422. };
  13423. ProtoViewFactory.prototype.initializeProtoViewIfNeeded = function (protoView) {
  13424. if (!protoView.isInitialized()) {
  13425. var render = this._renderer.createProtoView(protoView.templateId, protoView.templateCmds);
  13426. this._initializeProtoView(protoView, render);
  13427. }
  13428. };
  13429. ProtoViewFactory.prototype._initializeProtoView = function (protoView, render) {
  13430. var initializer = new _ProtoViewInitializer(protoView, this._directiveResolver, this);
  13431. template_commands_1.visitAllCommands(initializer, protoView.templateCmds);
  13432. var mergeInfo = new view_1.AppProtoViewMergeInfo(initializer.mergeEmbeddedViewCount, initializer.mergeElementCount, initializer.mergeViewCount);
  13433. protoView.init(render, initializer.elementBinders, initializer.boundTextCount, mergeInfo, initializer.variableLocations);
  13434. };
  13435. ProtoViewFactory.prototype._bindPipe = function (typeOrProvider) {
  13436. var meta = this._pipeResolver.resolve(typeOrProvider);
  13437. return pipe_provider_1.PipeProvider.createFromType(typeOrProvider, meta);
  13438. };
  13439. ProtoViewFactory.prototype._flattenPipes = function (view) {
  13440. var pipes = [];
  13441. if (lang_1.isPresent(this._platformPipes)) {
  13442. _flattenArray(this._platformPipes, pipes);
  13443. }
  13444. if (lang_1.isPresent(view.pipes)) {
  13445. _flattenArray(view.pipes, pipes);
  13446. }
  13447. return pipes;
  13448. };
  13449. ProtoViewFactory = __decorate([
  13450. di_1.Injectable(),
  13451. __param(1, di_1.Optional()),
  13452. __param(1, di_1.Inject(platform_directives_and_pipes_1.PLATFORM_PIPES)),
  13453. __param(5, di_1.Inject(application_tokens_1.APP_ID)),
  13454. __metadata('design:paramtypes', [api_2.Renderer, Array, directive_resolver_1.DirectiveResolver, view_resolver_1.ViewResolver, pipe_resolver_1.PipeResolver, String])
  13455. ], ProtoViewFactory);
  13456. return ProtoViewFactory;
  13457. })();
  13458. exports.ProtoViewFactory = ProtoViewFactory;
  13459. function createComponent(protoViewFactory, cmd) {
  13460. return protoViewFactory._createComponent(cmd);
  13461. }
  13462. function createEmbeddedTemplate(protoViewFactory, cmd, parent) {
  13463. return protoViewFactory._createEmbeddedTemplate(cmd, parent);
  13464. }
  13465. var _ProtoViewInitializer = (function () {
  13466. function _ProtoViewInitializer(_protoView, _directiveResolver, _protoViewFactory) {
  13467. this._protoView = _protoView;
  13468. this._directiveResolver = _directiveResolver;
  13469. this._protoViewFactory = _protoViewFactory;
  13470. this.variableLocations = new Map();
  13471. this.boundTextCount = 0;
  13472. this.boundElementIndex = 0;
  13473. this.elementBinderStack = [];
  13474. this.distanceToParentElementBinder = 0;
  13475. this.distanceToParentProtoElementInjector = 0;
  13476. this.elementBinders = [];
  13477. this.mergeEmbeddedViewCount = 0;
  13478. this.mergeElementCount = 0;
  13479. this.mergeViewCount = 1;
  13480. }
  13481. _ProtoViewInitializer.prototype.visitText = function (cmd, context) {
  13482. if (cmd.isBound) {
  13483. this.boundTextCount++;
  13484. }
  13485. return null;
  13486. };
  13487. _ProtoViewInitializer.prototype.visitNgContent = function (cmd, context) { return null; };
  13488. _ProtoViewInitializer.prototype.visitBeginElement = function (cmd, context) {
  13489. if (cmd.isBound) {
  13490. this._visitBeginBoundElement(cmd, null);
  13491. }
  13492. else {
  13493. this._visitBeginElement(cmd, null, null);
  13494. }
  13495. return null;
  13496. };
  13497. _ProtoViewInitializer.prototype.visitEndElement = function (context) { return this._visitEndElement(); };
  13498. _ProtoViewInitializer.prototype.visitBeginComponent = function (cmd, context) {
  13499. var nestedProtoView = createComponent(this._protoViewFactory, cmd);
  13500. return this._visitBeginBoundElement(cmd, nestedProtoView);
  13501. };
  13502. _ProtoViewInitializer.prototype.visitEndComponent = function (context) { return this._visitEndElement(); };
  13503. _ProtoViewInitializer.prototype.visitEmbeddedTemplate = function (cmd, context) {
  13504. var nestedProtoView = createEmbeddedTemplate(this._protoViewFactory, cmd, this._protoView);
  13505. if (cmd.isMerged) {
  13506. this.mergeEmbeddedViewCount++;
  13507. }
  13508. this._visitBeginBoundElement(cmd, nestedProtoView);
  13509. return this._visitEndElement();
  13510. };
  13511. _ProtoViewInitializer.prototype._visitBeginBoundElement = function (cmd, nestedProtoView) {
  13512. if (lang_1.isPresent(nestedProtoView) && nestedProtoView.isMergable) {
  13513. this.mergeElementCount += nestedProtoView.mergeInfo.elementCount;
  13514. this.mergeViewCount += nestedProtoView.mergeInfo.viewCount;
  13515. this.mergeEmbeddedViewCount += nestedProtoView.mergeInfo.embeddedViewCount;
  13516. }
  13517. var elementBinder = _createElementBinder(this._directiveResolver, nestedProtoView, this.elementBinderStack, this.boundElementIndex, this.distanceToParentElementBinder, this.distanceToParentProtoElementInjector, cmd);
  13518. this.elementBinders.push(elementBinder);
  13519. var protoElementInjector = elementBinder.protoElementInjector;
  13520. for (var i = 0; i < cmd.variableNameAndValues.length; i += 2) {
  13521. this.variableLocations.set(cmd.variableNameAndValues[i], this.boundElementIndex);
  13522. }
  13523. this.boundElementIndex++;
  13524. this.mergeElementCount++;
  13525. return this._visitBeginElement(cmd, elementBinder, protoElementInjector);
  13526. };
  13527. _ProtoViewInitializer.prototype._visitBeginElement = function (cmd, elementBinder, protoElementInjector) {
  13528. this.distanceToParentElementBinder =
  13529. lang_1.isPresent(elementBinder) ? 1 : this.distanceToParentElementBinder + 1;
  13530. this.distanceToParentProtoElementInjector =
  13531. lang_1.isPresent(protoElementInjector) ? 1 : this.distanceToParentProtoElementInjector + 1;
  13532. this.elementBinderStack.push(elementBinder);
  13533. return null;
  13534. };
  13535. _ProtoViewInitializer.prototype._visitEndElement = function () {
  13536. var parentElementBinder = this.elementBinderStack.pop();
  13537. var parentProtoElementInjector = lang_1.isPresent(parentElementBinder) ? parentElementBinder.protoElementInjector : null;
  13538. this.distanceToParentElementBinder = lang_1.isPresent(parentElementBinder) ?
  13539. parentElementBinder.distanceToParent :
  13540. this.distanceToParentElementBinder - 1;
  13541. this.distanceToParentProtoElementInjector = lang_1.isPresent(parentProtoElementInjector) ?
  13542. parentProtoElementInjector.distanceToParent :
  13543. this.distanceToParentProtoElementInjector - 1;
  13544. return null;
  13545. };
  13546. return _ProtoViewInitializer;
  13547. })();
  13548. function _createElementBinder(directiveResolver, nestedProtoView, elementBinderStack, boundElementIndex, distanceToParentBinder, distanceToParentPei, beginElementCmd) {
  13549. var parentElementBinder = null;
  13550. var parentProtoElementInjector = null;
  13551. if (distanceToParentBinder > 0) {
  13552. parentElementBinder = elementBinderStack[elementBinderStack.length - distanceToParentBinder];
  13553. }
  13554. if (lang_1.isBlank(parentElementBinder)) {
  13555. distanceToParentBinder = -1;
  13556. }
  13557. if (distanceToParentPei > 0) {
  13558. var peiBinder = elementBinderStack[elementBinderStack.length - distanceToParentPei];
  13559. if (lang_1.isPresent(peiBinder)) {
  13560. parentProtoElementInjector = peiBinder.protoElementInjector;
  13561. }
  13562. }
  13563. if (lang_1.isBlank(parentProtoElementInjector)) {
  13564. distanceToParentPei = -1;
  13565. }
  13566. var componentDirectiveProvider = null;
  13567. var isEmbeddedTemplate = false;
  13568. var directiveProviders = beginElementCmd.directives.map(function (type) { return provideDirective(directiveResolver, type); });
  13569. if (beginElementCmd instanceof template_commands_1.BeginComponentCmd) {
  13570. componentDirectiveProvider = directiveProviders[0];
  13571. }
  13572. else if (beginElementCmd instanceof template_commands_1.EmbeddedTemplateCmd) {
  13573. isEmbeddedTemplate = true;
  13574. }
  13575. var protoElementInjector = null;
  13576. // Create a protoElementInjector for any element that either has bindings *or* has one
  13577. // or more var- defined *or* for <template> elements:
  13578. // - Elements with a var- defined need a their own element injector
  13579. // so that, when hydrating, $implicit can be set to the element.
  13580. // - <template> elements need their own ElementInjector so that we can query their TemplateRef
  13581. var hasVariables = beginElementCmd.variableNameAndValues.length > 0;
  13582. if (directiveProviders.length > 0 || hasVariables || isEmbeddedTemplate) {
  13583. var directiveVariableBindings = new Map();
  13584. if (!isEmbeddedTemplate) {
  13585. directiveVariableBindings = createDirectiveVariableBindings(beginElementCmd.variableNameAndValues, directiveProviders);
  13586. }
  13587. protoElementInjector = element_injector_1.ProtoElementInjector.create(parentProtoElementInjector, boundElementIndex, directiveProviders, lang_1.isPresent(componentDirectiveProvider), distanceToParentPei, directiveVariableBindings);
  13588. protoElementInjector.attributes = arrayToMap(beginElementCmd.attrNameAndValues, false);
  13589. }
  13590. return new element_binder_1.ElementBinder(boundElementIndex, parentElementBinder, distanceToParentBinder, protoElementInjector, componentDirectiveProvider, nestedProtoView);
  13591. }
  13592. function provideDirective(directiveResolver, type) {
  13593. var annotation = directiveResolver.resolve(type);
  13594. return element_injector_1.DirectiveProvider.createFromType(type, annotation);
  13595. }
  13596. function createDirectiveVariableBindings(variableNameAndValues, directiveProviders) {
  13597. var directiveVariableBindings = new Map();
  13598. for (var i = 0; i < variableNameAndValues.length; i += 2) {
  13599. var templateName = variableNameAndValues[i];
  13600. var dirIndex = variableNameAndValues[i + 1];
  13601. if (lang_1.isNumber(dirIndex)) {
  13602. directiveVariableBindings.set(templateName, dirIndex);
  13603. }
  13604. else {
  13605. // a variable without a directive index -> reference the element
  13606. directiveVariableBindings.set(templateName, null);
  13607. }
  13608. }
  13609. return directiveVariableBindings;
  13610. }
  13611. exports.createDirectiveVariableBindings = createDirectiveVariableBindings;
  13612. function arrayToMap(arr, inverse) {
  13613. var result = new Map();
  13614. for (var i = 0; i < arr.length; i += 2) {
  13615. if (inverse) {
  13616. result.set(arr[i + 1], arr[i]);
  13617. }
  13618. else {
  13619. result.set(arr[i], arr[i + 1]);
  13620. }
  13621. }
  13622. return result;
  13623. }
  13624. function _flattenArray(tree, out) {
  13625. for (var i = 0; i < tree.length; i++) {
  13626. var item = di_1.resolveForwardRef(tree[i]);
  13627. if (lang_1.isArray(item)) {
  13628. _flattenArray(item, out);
  13629. }
  13630. else {
  13631. out.push(item);
  13632. }
  13633. }
  13634. }
  13635. function _flattenStyleArr(arr, out) {
  13636. for (var i = 0; i < arr.length; i++) {
  13637. var entry = arr[i];
  13638. if (lang_1.isArray(entry)) {
  13639. _flattenStyleArr(entry, out);
  13640. }
  13641. else {
  13642. out.push(entry);
  13643. }
  13644. }
  13645. return out;
  13646. }
  13647. /***/ },
  13648. /* 72 */
  13649. /***/ function(module, exports, __webpack_require__) {
  13650. var __extends = (this && this.__extends) || function (d, b) {
  13651. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  13652. function __() { this.constructor = d; }
  13653. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13654. };
  13655. var exceptions_1 = __webpack_require__(14);
  13656. /**
  13657. * Represents an Angular ProtoView in the Rendering Context.
  13658. *
  13659. * When you implement a custom {@link Renderer}, `RenderProtoViewRef` specifies what Render View
  13660. * your renderer should create.
  13661. *
  13662. * `RenderProtoViewRef` is a counterpart to {@link ProtoViewRef} available in the Application
  13663. * Context. But unlike `ProtoViewRef`, `RenderProtoViewRef` contains all static nested Proto Views
  13664. * that are recursively merged into a single Render Proto View.
  13665. *
  13666. * <!-- TODO: this is created by Renderer#createProtoView in the new compiler -->
  13667. */
  13668. var RenderProtoViewRef = (function () {
  13669. function RenderProtoViewRef() {
  13670. }
  13671. return RenderProtoViewRef;
  13672. })();
  13673. exports.RenderProtoViewRef = RenderProtoViewRef;
  13674. /**
  13675. * Represents a list of sibling Nodes that can be moved by the {@link Renderer} independently of
  13676. * other Render Fragments.
  13677. *
  13678. * Any {@link RenderViewRef} has one Render Fragment.
  13679. *
  13680. * Additionally any View with an Embedded View that contains a {@link NgContentAst View Projection}
  13681. * results in additional Render Fragment.
  13682. */
  13683. /*
  13684. <div>foo</div>
  13685. {{bar}}
  13686. <div>foo</div> -> view 1 / fragment 1
  13687. <ul>
  13688. <template ngFor>
  13689. <li>{{fg}}</li> -> view 2 / fragment 1
  13690. </template>
  13691. </ul>
  13692. {{bar}}
  13693. <div>foo</div> -> view 1 / fragment 1
  13694. <ul>
  13695. <template ngIf>
  13696. <li><ng-content></></li> -> view 1 / fragment 2
  13697. </template>
  13698. <template ngFor>
  13699. <li><ng-content></></li> ->
  13700. <li></li> -> view 1 / fragment 2 + view 2 / fragment 1..n-1
  13701. </template>
  13702. </ul>
  13703. {{bar}}
  13704. */
  13705. // TODO(i): refactor into an interface
  13706. var RenderFragmentRef = (function () {
  13707. function RenderFragmentRef() {
  13708. }
  13709. return RenderFragmentRef;
  13710. })();
  13711. exports.RenderFragmentRef = RenderFragmentRef;
  13712. /**
  13713. * Represents an Angular View in the Rendering Context.
  13714. *
  13715. * `RenderViewRef` specifies to the {@link Renderer} what View to update or destroy.
  13716. *
  13717. * Unlike a {@link ViewRef} available in the Application Context, Render View contains all the
  13718. * static Component Views that have been recursively merged into a single Render View.
  13719. *
  13720. * Each `RenderViewRef` contains one or more {@link RenderFragmentRef Render Fragments}, these
  13721. * Fragments are created, hydrated, dehydrated and destroyed as a single unit together with the
  13722. * View.
  13723. */
  13724. // TODO(i): refactor into an interface
  13725. var RenderViewRef = (function () {
  13726. function RenderViewRef() {
  13727. }
  13728. return RenderViewRef;
  13729. })();
  13730. exports.RenderViewRef = RenderViewRef;
  13731. /**
  13732. * Abstract base class for commands to the Angular renderer, using the visitor pattern.
  13733. */
  13734. var RenderTemplateCmd = (function () {
  13735. function RenderTemplateCmd() {
  13736. }
  13737. return RenderTemplateCmd;
  13738. })();
  13739. exports.RenderTemplateCmd = RenderTemplateCmd;
  13740. /**
  13741. * Command to begin rendering.
  13742. */
  13743. var RenderBeginCmd = (function (_super) {
  13744. __extends(RenderBeginCmd, _super);
  13745. function RenderBeginCmd() {
  13746. _super.apply(this, arguments);
  13747. }
  13748. Object.defineProperty(RenderBeginCmd.prototype, "ngContentIndex", {
  13749. get: function () { return exceptions_1.unimplemented(); },
  13750. enumerable: true,
  13751. configurable: true
  13752. });
  13753. ;
  13754. Object.defineProperty(RenderBeginCmd.prototype, "isBound", {
  13755. get: function () { return exceptions_1.unimplemented(); },
  13756. enumerable: true,
  13757. configurable: true
  13758. });
  13759. ;
  13760. return RenderBeginCmd;
  13761. })(RenderTemplateCmd);
  13762. exports.RenderBeginCmd = RenderBeginCmd;
  13763. /**
  13764. * Command to render text.
  13765. */
  13766. var RenderTextCmd = (function (_super) {
  13767. __extends(RenderTextCmd, _super);
  13768. function RenderTextCmd() {
  13769. _super.apply(this, arguments);
  13770. }
  13771. Object.defineProperty(RenderTextCmd.prototype, "value", {
  13772. get: function () { return exceptions_1.unimplemented(); },
  13773. enumerable: true,
  13774. configurable: true
  13775. });
  13776. ;
  13777. return RenderTextCmd;
  13778. })(RenderBeginCmd);
  13779. exports.RenderTextCmd = RenderTextCmd;
  13780. /**
  13781. * Command to render projected content.
  13782. */
  13783. var RenderNgContentCmd = (function (_super) {
  13784. __extends(RenderNgContentCmd, _super);
  13785. function RenderNgContentCmd() {
  13786. _super.apply(this, arguments);
  13787. }
  13788. Object.defineProperty(RenderNgContentCmd.prototype, "index", {
  13789. // The index of this NgContent element
  13790. get: function () { return exceptions_1.unimplemented(); },
  13791. enumerable: true,
  13792. configurable: true
  13793. });
  13794. ;
  13795. Object.defineProperty(RenderNgContentCmd.prototype, "ngContentIndex", {
  13796. // The index of the NgContent element into which this
  13797. // NgContent element should be projected (if any)
  13798. get: function () { return exceptions_1.unimplemented(); },
  13799. enumerable: true,
  13800. configurable: true
  13801. });
  13802. ;
  13803. return RenderNgContentCmd;
  13804. })(RenderTemplateCmd);
  13805. exports.RenderNgContentCmd = RenderNgContentCmd;
  13806. /**
  13807. * Command to begin rendering an element.
  13808. */
  13809. var RenderBeginElementCmd = (function (_super) {
  13810. __extends(RenderBeginElementCmd, _super);
  13811. function RenderBeginElementCmd() {
  13812. _super.apply(this, arguments);
  13813. }
  13814. Object.defineProperty(RenderBeginElementCmd.prototype, "name", {
  13815. get: function () { return exceptions_1.unimplemented(); },
  13816. enumerable: true,
  13817. configurable: true
  13818. });
  13819. ;
  13820. Object.defineProperty(RenderBeginElementCmd.prototype, "attrNameAndValues", {
  13821. get: function () { return exceptions_1.unimplemented(); },
  13822. enumerable: true,
  13823. configurable: true
  13824. });
  13825. ;
  13826. Object.defineProperty(RenderBeginElementCmd.prototype, "eventTargetAndNames", {
  13827. get: function () { return exceptions_1.unimplemented(); },
  13828. enumerable: true,
  13829. configurable: true
  13830. });
  13831. ;
  13832. return RenderBeginElementCmd;
  13833. })(RenderBeginCmd);
  13834. exports.RenderBeginElementCmd = RenderBeginElementCmd;
  13835. /**
  13836. * Command to begin rendering a component.
  13837. */
  13838. var RenderBeginComponentCmd = (function (_super) {
  13839. __extends(RenderBeginComponentCmd, _super);
  13840. function RenderBeginComponentCmd() {
  13841. _super.apply(this, arguments);
  13842. }
  13843. Object.defineProperty(RenderBeginComponentCmd.prototype, "templateId", {
  13844. get: function () { return exceptions_1.unimplemented(); },
  13845. enumerable: true,
  13846. configurable: true
  13847. });
  13848. ;
  13849. return RenderBeginComponentCmd;
  13850. })(RenderBeginElementCmd);
  13851. exports.RenderBeginComponentCmd = RenderBeginComponentCmd;
  13852. /**
  13853. * Command to render a component's template.
  13854. */
  13855. var RenderEmbeddedTemplateCmd = (function (_super) {
  13856. __extends(RenderEmbeddedTemplateCmd, _super);
  13857. function RenderEmbeddedTemplateCmd() {
  13858. _super.apply(this, arguments);
  13859. }
  13860. Object.defineProperty(RenderEmbeddedTemplateCmd.prototype, "isMerged", {
  13861. get: function () { return exceptions_1.unimplemented(); },
  13862. enumerable: true,
  13863. configurable: true
  13864. });
  13865. ;
  13866. Object.defineProperty(RenderEmbeddedTemplateCmd.prototype, "children", {
  13867. get: function () { return exceptions_1.unimplemented(); },
  13868. enumerable: true,
  13869. configurable: true
  13870. });
  13871. ;
  13872. return RenderEmbeddedTemplateCmd;
  13873. })(RenderBeginElementCmd);
  13874. exports.RenderEmbeddedTemplateCmd = RenderEmbeddedTemplateCmd;
  13875. /**
  13876. * Container class produced by a {@link Renderer} when creating a Render View.
  13877. *
  13878. * An instance of `RenderViewWithFragments` contains a {@link RenderViewRef} and an array of
  13879. * {@link RenderFragmentRef}s belonging to this Render View.
  13880. */
  13881. // TODO(i): refactor this by RenderViewWithFragments and adding fragments directly to RenderViewRef
  13882. var RenderViewWithFragments = (function () {
  13883. function RenderViewWithFragments(
  13884. /**
  13885. * Reference to the {@link RenderViewRef}.
  13886. */
  13887. viewRef,
  13888. /**
  13889. * Array of {@link RenderFragmentRef}s ordered in the depth-first order.
  13890. */
  13891. fragmentRefs) {
  13892. this.viewRef = viewRef;
  13893. this.fragmentRefs = fragmentRefs;
  13894. }
  13895. return RenderViewWithFragments;
  13896. })();
  13897. exports.RenderViewWithFragments = RenderViewWithFragments;
  13898. /**
  13899. * Template for rendering a component, including commands and styles.
  13900. */
  13901. var RenderComponentTemplate = (function () {
  13902. function RenderComponentTemplate(id, shortId, encapsulation, commands, styles) {
  13903. this.id = id;
  13904. this.shortId = shortId;
  13905. this.encapsulation = encapsulation;
  13906. this.commands = commands;
  13907. this.styles = styles;
  13908. }
  13909. return RenderComponentTemplate;
  13910. })();
  13911. exports.RenderComponentTemplate = RenderComponentTemplate;
  13912. /**
  13913. * Injectable service that provides a low-level interface for modifying the UI.
  13914. *
  13915. * Use this service to bypass Angular's templating and make custom UI changes that can't be
  13916. * expressed declaratively. For example if you need to set a property or an attribute whose name is
  13917. * not statically known, use {@link #setElementProperty} or {@link #setElementAttribute}
  13918. * respectively.
  13919. *
  13920. * If you are implementing a custom renderer, you must implement this interface.
  13921. *
  13922. * The default Renderer implementation is `DomRenderer`. Also available is `WebWorkerRenderer`.
  13923. */
  13924. var Renderer = (function () {
  13925. function Renderer() {
  13926. }
  13927. return Renderer;
  13928. })();
  13929. exports.Renderer = Renderer;
  13930. /***/ },
  13931. /* 73 */
  13932. /***/ function(module, exports, __webpack_require__) {
  13933. var __extends = (this && this.__extends) || function (d, b) {
  13934. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  13935. function __() { this.constructor = d; }
  13936. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  13937. };
  13938. var provider_1 = __webpack_require__(13);
  13939. var di_1 = __webpack_require__(6);
  13940. var PipeProvider = (function (_super) {
  13941. __extends(PipeProvider, _super);
  13942. function PipeProvider(name, pure, key, resolvedFactories, multiBinding) {
  13943. _super.call(this, key, resolvedFactories, multiBinding);
  13944. this.name = name;
  13945. this.pure = pure;
  13946. }
  13947. PipeProvider.createFromType = function (type, metadata) {
  13948. var provider = new di_1.Provider(type, { useClass: type });
  13949. var rb = provider_1.resolveProvider(provider);
  13950. return new PipeProvider(metadata.name, metadata.pure, rb.key, rb.resolvedFactories, rb.multiProvider);
  13951. };
  13952. return PipeProvider;
  13953. })(provider_1.ResolvedProvider_);
  13954. exports.PipeProvider = PipeProvider;
  13955. /***/ },
  13956. /* 74 */
  13957. /***/ function(module, exports, __webpack_require__) {
  13958. var lang_1 = __webpack_require__(5);
  13959. var exceptions_1 = __webpack_require__(14);
  13960. var collection_1 = __webpack_require__(12);
  13961. var cd = __webpack_require__(75);
  13962. var ProtoPipes = (function () {
  13963. function ProtoPipes(
  13964. /**
  13965. * Map of {@link PipeMetadata} names to {@link PipeMetadata} implementations.
  13966. */
  13967. config) {
  13968. this.config = config;
  13969. this.config = config;
  13970. }
  13971. ProtoPipes.fromProviders = function (providers) {
  13972. var config = {};
  13973. providers.forEach(function (b) { return config[b.name] = b; });
  13974. return new ProtoPipes(config);
  13975. };
  13976. ProtoPipes.prototype.get = function (name) {
  13977. var provider = this.config[name];
  13978. if (lang_1.isBlank(provider))
  13979. throw new exceptions_1.BaseException("Cannot find pipe '" + name + "'.");
  13980. return provider;
  13981. };
  13982. return ProtoPipes;
  13983. })();
  13984. exports.ProtoPipes = ProtoPipes;
  13985. var Pipes = (function () {
  13986. function Pipes(proto, injector) {
  13987. this.proto = proto;
  13988. this.injector = injector;
  13989. /** @internal */
  13990. this._config = {};
  13991. }
  13992. Pipes.prototype.get = function (name) {
  13993. var cached = collection_1.StringMapWrapper.get(this._config, name);
  13994. if (lang_1.isPresent(cached))
  13995. return cached;
  13996. var p = this.proto.get(name);
  13997. var transform = this.injector.instantiateResolved(p);
  13998. var res = new cd.SelectedPipe(transform, p.pure);
  13999. if (p.pure) {
  14000. collection_1.StringMapWrapper.set(this._config, name, res);
  14001. }
  14002. return res;
  14003. };
  14004. return Pipes;
  14005. })();
  14006. exports.Pipes = Pipes;
  14007. /***/ },
  14008. /* 75 */
  14009. /***/ function(module, exports) {
  14010. var SelectedPipe = (function () {
  14011. function SelectedPipe(pipe, pure) {
  14012. this.pipe = pipe;
  14013. this.pure = pure;
  14014. }
  14015. return SelectedPipe;
  14016. })();
  14017. exports.SelectedPipe = SelectedPipe;
  14018. /***/ },
  14019. /* 76 */
  14020. /***/ function(module, exports, __webpack_require__) {
  14021. var __extends = (this && this.__extends) || function (d, b) {
  14022. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  14023. function __() { this.constructor = d; }
  14024. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  14025. };
  14026. var collection_1 = __webpack_require__(12);
  14027. var change_detection_1 = __webpack_require__(25);
  14028. var interfaces_1 = __webpack_require__(35);
  14029. var lang_1 = __webpack_require__(5);
  14030. var exceptions_1 = __webpack_require__(14);
  14031. var view_ref_1 = __webpack_require__(77);
  14032. var util_1 = __webpack_require__(78);
  14033. var view_ref_2 = __webpack_require__(77);
  14034. var interfaces_2 = __webpack_require__(35);
  14035. exports.DebugContext = interfaces_2.DebugContext;
  14036. var REFLECT_PREFIX = 'ng-reflect-';
  14037. (function (ViewType) {
  14038. // A view that contains the host element with bound component directive.
  14039. // Contains a COMPONENT view
  14040. ViewType[ViewType["HOST"] = 0] = "HOST";
  14041. // The view of the component
  14042. // Can contain 0 to n EMBEDDED views
  14043. ViewType[ViewType["COMPONENT"] = 1] = "COMPONENT";
  14044. // A view that is embedded into another View via a <template> element
  14045. // inside of a COMPONENT view
  14046. ViewType[ViewType["EMBEDDED"] = 2] = "EMBEDDED";
  14047. })(exports.ViewType || (exports.ViewType = {}));
  14048. var ViewType = exports.ViewType;
  14049. var AppViewContainer = (function () {
  14050. function AppViewContainer() {
  14051. // The order in this list matches the DOM order.
  14052. this.views = [];
  14053. }
  14054. return AppViewContainer;
  14055. })();
  14056. exports.AppViewContainer = AppViewContainer;
  14057. /**
  14058. * Cost of making objects: http://jsperf.com/instantiate-size-of-object
  14059. *
  14060. */
  14061. var AppView = (function () {
  14062. function AppView(renderer, proto, viewOffset, elementOffset, textOffset, protoLocals, render, renderFragment, containerElementInjector) {
  14063. this.renderer = renderer;
  14064. this.proto = proto;
  14065. this.viewOffset = viewOffset;
  14066. this.elementOffset = elementOffset;
  14067. this.textOffset = textOffset;
  14068. this.render = render;
  14069. this.renderFragment = renderFragment;
  14070. this.containerElementInjector = containerElementInjector;
  14071. // AppViews that have been merged in depth first order.
  14072. // This list is shared between all merged views. Use this.elementOffset to get the local
  14073. // entries.
  14074. this.views = null;
  14075. // ElementInjectors of all AppViews in views grouped by view.
  14076. // This list is shared between all merged views. Use this.elementOffset to get the local
  14077. // entries.
  14078. this.elementInjectors = null;
  14079. // ViewContainers of all AppViews in views grouped by view.
  14080. // This list is shared between all merged views. Use this.elementOffset to get the local
  14081. // entries.
  14082. this.viewContainers = null;
  14083. // PreBuiltObjects of all AppViews in views grouped by view.
  14084. // This list is shared between all merged views. Use this.elementOffset to get the local
  14085. // entries.
  14086. this.preBuiltObjects = null;
  14087. this.changeDetector = null;
  14088. /**
  14089. * The context against which data-binding expressions in this view are evaluated against.
  14090. * This is always a component instance.
  14091. */
  14092. this.context = null;
  14093. this.ref = new view_ref_2.ViewRef_(this);
  14094. this.locals = new change_detection_1.Locals(null, collection_1.MapWrapper.clone(protoLocals)); // TODO optimize this
  14095. }
  14096. AppView.prototype.init = function (changeDetector, elementInjectors, rootElementInjectors, preBuiltObjects, views, elementRefs, viewContainers) {
  14097. this.changeDetector = changeDetector;
  14098. this.elementInjectors = elementInjectors;
  14099. this.rootElementInjectors = rootElementInjectors;
  14100. this.preBuiltObjects = preBuiltObjects;
  14101. this.views = views;
  14102. this.elementRefs = elementRefs;
  14103. this.viewContainers = viewContainers;
  14104. };
  14105. AppView.prototype.setLocal = function (contextName, value) {
  14106. if (!this.hydrated())
  14107. throw new exceptions_1.BaseException('Cannot set locals on dehydrated view.');
  14108. if (!this.proto.templateVariableBindings.has(contextName)) {
  14109. return;
  14110. }
  14111. var templateName = this.proto.templateVariableBindings.get(contextName);
  14112. this.locals.set(templateName, value);
  14113. };
  14114. AppView.prototype.hydrated = function () { return lang_1.isPresent(this.context); };
  14115. /**
  14116. * Triggers the event handlers for the element and the directives.
  14117. *
  14118. * This method is intended to be called from directive EventEmitters.
  14119. *
  14120. * @param {string} eventName
  14121. * @param {*} eventObj
  14122. * @param {number} boundElementIndex
  14123. */
  14124. AppView.prototype.triggerEventHandlers = function (eventName, eventObj, boundElementIndex) {
  14125. var locals = new collection_1.Map();
  14126. locals.set('$event', eventObj);
  14127. this.dispatchEvent(boundElementIndex, eventName, locals);
  14128. };
  14129. // dispatch to element injector or text nodes based on context
  14130. AppView.prototype.notifyOnBinding = function (b, currentValue) {
  14131. if (b.isTextNode()) {
  14132. this.renderer.setText(this.render, b.elementIndex + this.textOffset, currentValue);
  14133. }
  14134. else {
  14135. var elementRef = this.elementRefs[this.elementOffset + b.elementIndex];
  14136. if (b.isElementProperty()) {
  14137. this.renderer.setElementProperty(elementRef, b.name, currentValue);
  14138. }
  14139. else if (b.isElementAttribute()) {
  14140. this.renderer.setElementAttribute(elementRef, b.name, lang_1.isPresent(currentValue) ? "" + currentValue : null);
  14141. }
  14142. else if (b.isElementClass()) {
  14143. this.renderer.setElementClass(elementRef, b.name, currentValue);
  14144. }
  14145. else if (b.isElementStyle()) {
  14146. var unit = lang_1.isPresent(b.unit) ? b.unit : '';
  14147. this.renderer.setElementStyle(elementRef, b.name, lang_1.isPresent(currentValue) ? "" + currentValue + unit : null);
  14148. }
  14149. else {
  14150. throw new exceptions_1.BaseException('Unsupported directive record');
  14151. }
  14152. }
  14153. };
  14154. AppView.prototype.logBindingUpdate = function (b, value) {
  14155. if (b.isDirective() || b.isElementProperty()) {
  14156. var elementRef = this.elementRefs[this.elementOffset + b.elementIndex];
  14157. this.renderer.setBindingDebugInfo(elementRef, "" + REFLECT_PREFIX + util_1.camelCaseToDashCase(b.name), "" + value);
  14158. }
  14159. };
  14160. AppView.prototype.notifyAfterContentChecked = function () {
  14161. var eiCount = this.proto.elementBinders.length;
  14162. var ei = this.elementInjectors;
  14163. for (var i = eiCount - 1; i >= 0; i--) {
  14164. if (lang_1.isPresent(ei[i + this.elementOffset]))
  14165. ei[i + this.elementOffset].ngAfterContentChecked();
  14166. }
  14167. };
  14168. AppView.prototype.notifyAfterViewChecked = function () {
  14169. var eiCount = this.proto.elementBinders.length;
  14170. var ei = this.elementInjectors;
  14171. for (var i = eiCount - 1; i >= 0; i--) {
  14172. if (lang_1.isPresent(ei[i + this.elementOffset]))
  14173. ei[i + this.elementOffset].ngAfterViewChecked();
  14174. }
  14175. };
  14176. AppView.prototype.getDirectiveFor = function (directive) {
  14177. var elementInjector = this.elementInjectors[this.elementOffset + directive.elementIndex];
  14178. return elementInjector.getDirectiveAtIndex(directive.directiveIndex);
  14179. };
  14180. AppView.prototype.getNestedView = function (boundElementIndex) {
  14181. var eli = this.elementInjectors[boundElementIndex];
  14182. return lang_1.isPresent(eli) ? eli.getNestedView() : null;
  14183. };
  14184. AppView.prototype.getContainerElement = function () {
  14185. return lang_1.isPresent(this.containerElementInjector) ?
  14186. this.containerElementInjector.getElementRef() :
  14187. null;
  14188. };
  14189. AppView.prototype.getDebugContext = function (elementIndex, directiveIndex) {
  14190. try {
  14191. var offsettedIndex = this.elementOffset + elementIndex;
  14192. var hasRefForIndex = offsettedIndex < this.elementRefs.length;
  14193. var elementRef = hasRefForIndex ? this.elementRefs[this.elementOffset + elementIndex] : null;
  14194. var container = this.getContainerElement();
  14195. var ei = hasRefForIndex ? this.elementInjectors[this.elementOffset + elementIndex] : null;
  14196. var element = lang_1.isPresent(elementRef) ? elementRef.nativeElement : null;
  14197. var componentElement = lang_1.isPresent(container) ? container.nativeElement : null;
  14198. var directive = lang_1.isPresent(directiveIndex) ? this.getDirectiveFor(directiveIndex) : null;
  14199. var injector = lang_1.isPresent(ei) ? ei.getInjector() : null;
  14200. return new interfaces_1.DebugContext(element, componentElement, directive, this.context, _localsToStringMap(this.locals), injector);
  14201. }
  14202. catch (e) {
  14203. // TODO: vsavkin log the exception once we have a good way to log errors and warnings
  14204. // if an error happens during getting the debug context, we return null.
  14205. return null;
  14206. }
  14207. };
  14208. AppView.prototype.getDetectorFor = function (directive) {
  14209. var childView = this.getNestedView(this.elementOffset + directive.elementIndex);
  14210. return lang_1.isPresent(childView) ? childView.changeDetector : null;
  14211. };
  14212. AppView.prototype.invokeElementMethod = function (elementIndex, methodName, args) {
  14213. this.renderer.invokeElementMethod(this.elementRefs[elementIndex], methodName, args);
  14214. };
  14215. // implementation of RenderEventDispatcher#dispatchRenderEvent
  14216. AppView.prototype.dispatchRenderEvent = function (boundElementIndex, eventName, locals) {
  14217. var elementRef = this.elementRefs[boundElementIndex];
  14218. var view = view_ref_1.internalView(elementRef.parentView);
  14219. return view.dispatchEvent(elementRef.boundElementIndex, eventName, locals);
  14220. };
  14221. // returns false if preventDefault must be applied to the DOM event
  14222. AppView.prototype.dispatchEvent = function (boundElementIndex, eventName, locals) {
  14223. try {
  14224. if (this.hydrated()) {
  14225. return !this.changeDetector.handleEvent(eventName, boundElementIndex - this.elementOffset, new change_detection_1.Locals(this.locals, locals));
  14226. }
  14227. else {
  14228. return true;
  14229. }
  14230. }
  14231. catch (e) {
  14232. var c = this.getDebugContext(boundElementIndex - this.elementOffset, null);
  14233. var context = lang_1.isPresent(c) ? new _Context(c.element, c.componentElement, c.context, c.locals, c.injector) :
  14234. null;
  14235. throw new EventEvaluationError(eventName, e, e.stack, context);
  14236. }
  14237. };
  14238. Object.defineProperty(AppView.prototype, "ownBindersCount", {
  14239. get: function () { return this.proto.elementBinders.length; },
  14240. enumerable: true,
  14241. configurable: true
  14242. });
  14243. return AppView;
  14244. })();
  14245. exports.AppView = AppView;
  14246. function _localsToStringMap(locals) {
  14247. var res = {};
  14248. var c = locals;
  14249. while (lang_1.isPresent(c)) {
  14250. res = collection_1.StringMapWrapper.merge(res, collection_1.MapWrapper.toStringMap(c.current));
  14251. c = c.parent;
  14252. }
  14253. return res;
  14254. }
  14255. /**
  14256. * Error context included when an event handler throws an exception.
  14257. */
  14258. var _Context = (function () {
  14259. function _Context(element, componentElement, context, locals, injector) {
  14260. this.element = element;
  14261. this.componentElement = componentElement;
  14262. this.context = context;
  14263. this.locals = locals;
  14264. this.injector = injector;
  14265. }
  14266. return _Context;
  14267. })();
  14268. /**
  14269. * Wraps an exception thrown by an event handler.
  14270. */
  14271. var EventEvaluationError = (function (_super) {
  14272. __extends(EventEvaluationError, _super);
  14273. function EventEvaluationError(eventName, originalException, originalStack, context) {
  14274. _super.call(this, "Error during evaluation of \"" + eventName + "\"", originalException, originalStack, context);
  14275. }
  14276. return EventEvaluationError;
  14277. })(exceptions_1.WrappedException);
  14278. var AppProtoViewMergeInfo = (function () {
  14279. function AppProtoViewMergeInfo(embeddedViewCount, elementCount, viewCount) {
  14280. this.embeddedViewCount = embeddedViewCount;
  14281. this.elementCount = elementCount;
  14282. this.viewCount = viewCount;
  14283. }
  14284. return AppProtoViewMergeInfo;
  14285. })();
  14286. exports.AppProtoViewMergeInfo = AppProtoViewMergeInfo;
  14287. /**
  14288. *
  14289. */
  14290. var AppProtoView = (function () {
  14291. function AppProtoView(templateId, templateCmds, type, isMergable, changeDetectorFactory, templateVariableBindings, pipes) {
  14292. this.templateId = templateId;
  14293. this.templateCmds = templateCmds;
  14294. this.type = type;
  14295. this.isMergable = isMergable;
  14296. this.changeDetectorFactory = changeDetectorFactory;
  14297. this.templateVariableBindings = templateVariableBindings;
  14298. this.pipes = pipes;
  14299. this.elementBinders = null;
  14300. this.mergeInfo = null;
  14301. this.variableLocations = null;
  14302. this.textBindingCount = null;
  14303. this.render = null;
  14304. this.ref = new view_ref_2.ProtoViewRef_(this);
  14305. }
  14306. AppProtoView.prototype.init = function (render, elementBinders, textBindingCount, mergeInfo, variableLocations) {
  14307. var _this = this;
  14308. this.render = render;
  14309. this.elementBinders = elementBinders;
  14310. this.textBindingCount = textBindingCount;
  14311. this.mergeInfo = mergeInfo;
  14312. this.variableLocations = variableLocations;
  14313. this.protoLocals = new collection_1.Map();
  14314. if (lang_1.isPresent(this.templateVariableBindings)) {
  14315. this.templateVariableBindings.forEach(function (templateName, _) { _this.protoLocals.set(templateName, null); });
  14316. }
  14317. if (lang_1.isPresent(variableLocations)) {
  14318. // The view's locals needs to have a full set of variable names at construction time
  14319. // in order to prevent new variables from being set later in the lifecycle. Since we don't
  14320. // want
  14321. // to actually create variable bindings for the $implicit bindings, add to the
  14322. // protoLocals manually.
  14323. variableLocations.forEach(function (_, templateName) { _this.protoLocals.set(templateName, null); });
  14324. }
  14325. };
  14326. AppProtoView.prototype.isInitialized = function () { return lang_1.isPresent(this.elementBinders); };
  14327. return AppProtoView;
  14328. })();
  14329. exports.AppProtoView = AppProtoView;
  14330. /***/ },
  14331. /* 77 */
  14332. /***/ function(module, exports, __webpack_require__) {
  14333. var __extends = (this && this.__extends) || function (d, b) {
  14334. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  14335. function __() { this.constructor = d; }
  14336. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  14337. };
  14338. var lang_1 = __webpack_require__(5);
  14339. var exceptions_1 = __webpack_require__(14);
  14340. // This is a workaround for privacy in Dart as we don't have library parts
  14341. function internalView(viewRef) {
  14342. return viewRef._view;
  14343. }
  14344. exports.internalView = internalView;
  14345. // This is a workaround for privacy in Dart as we don't have library parts
  14346. function internalProtoView(protoViewRef) {
  14347. return lang_1.isPresent(protoViewRef) ? protoViewRef._protoView : null;
  14348. }
  14349. exports.internalProtoView = internalProtoView;
  14350. /**
  14351. * Represents an Angular View.
  14352. *
  14353. * <!-- TODO: move the next two paragraphs to the dev guide -->
  14354. * A View is a fundamental building block of the application UI. It is the smallest grouping of
  14355. * Elements which are created and destroyed together.
  14356. *
  14357. * Properties of elements in a View can change, but the structure (number and order) of elements in
  14358. * a View cannot. Changing the structure of Elements can only be done by inserting, moving or
  14359. * removing nested Views via a {@link ViewContainerRef}. Each View can contain many View Containers.
  14360. * <!-- /TODO -->
  14361. *
  14362. * ### Example
  14363. *
  14364. * Given this template...
  14365. *
  14366. * ```
  14367. * Count: {{items.length}}
  14368. * <ul>
  14369. * <li *ngFor="var item of items">{{item}}</li>
  14370. * </ul>
  14371. * ```
  14372. *
  14373. * ... we have two {@link ProtoViewRef}s:
  14374. *
  14375. * Outer {@link ProtoViewRef}:
  14376. * ```
  14377. * Count: {{items.length}}
  14378. * <ul>
  14379. * <template ngFor var-item [ngForOf]="items"></template>
  14380. * </ul>
  14381. * ```
  14382. *
  14383. * Inner {@link ProtoViewRef}:
  14384. * ```
  14385. * <li>{{item}}</li>
  14386. * ```
  14387. *
  14388. * Notice that the original template is broken down into two separate {@link ProtoViewRef}s.
  14389. *
  14390. * The outer/inner {@link ProtoViewRef}s are then assembled into views like so:
  14391. *
  14392. * ```
  14393. * <!-- ViewRef: outer-0 -->
  14394. * Count: 2
  14395. * <ul>
  14396. * <template view-container-ref></template>
  14397. * <!-- ViewRef: inner-1 --><li>first</li><!-- /ViewRef: inner-1 -->
  14398. * <!-- ViewRef: inner-2 --><li>second</li><!-- /ViewRef: inner-2 -->
  14399. * </ul>
  14400. * <!-- /ViewRef: outer-0 -->
  14401. * ```
  14402. */
  14403. var ViewRef = (function () {
  14404. function ViewRef() {
  14405. }
  14406. Object.defineProperty(ViewRef.prototype, "changeDetectorRef", {
  14407. get: function () { return exceptions_1.unimplemented(); },
  14408. set: function (value) {
  14409. exceptions_1.unimplemented(); // TODO: https://github.com/Microsoft/TypeScript/issues/12
  14410. },
  14411. enumerable: true,
  14412. configurable: true
  14413. });
  14414. return ViewRef;
  14415. })();
  14416. exports.ViewRef = ViewRef;
  14417. var ViewRef_ = (function (_super) {
  14418. __extends(ViewRef_, _super);
  14419. function ViewRef_(_view) {
  14420. _super.call(this);
  14421. this._changeDetectorRef = null;
  14422. this._view = _view;
  14423. }
  14424. Object.defineProperty(ViewRef_.prototype, "render", {
  14425. /**
  14426. * Return `RenderViewRef`
  14427. */
  14428. get: function () { return this._view.render; },
  14429. enumerable: true,
  14430. configurable: true
  14431. });
  14432. Object.defineProperty(ViewRef_.prototype, "renderFragment", {
  14433. /**
  14434. * Return `RenderFragmentRef`
  14435. */
  14436. get: function () { return this._view.renderFragment; },
  14437. enumerable: true,
  14438. configurable: true
  14439. });
  14440. Object.defineProperty(ViewRef_.prototype, "changeDetectorRef", {
  14441. /**
  14442. * Return `ChangeDetectorRef`
  14443. */
  14444. get: function () {
  14445. if (this._changeDetectorRef === null) {
  14446. this._changeDetectorRef = this._view.changeDetector.ref;
  14447. }
  14448. return this._changeDetectorRef;
  14449. },
  14450. enumerable: true,
  14451. configurable: true
  14452. });
  14453. ViewRef_.prototype.setLocal = function (variableName, value) { this._view.setLocal(variableName, value); };
  14454. return ViewRef_;
  14455. })(ViewRef);
  14456. exports.ViewRef_ = ViewRef_;
  14457. /**
  14458. * Represents an Angular ProtoView.
  14459. *
  14460. * A ProtoView is a prototypical {@link ViewRef View} that is the result of Template compilation and
  14461. * is used by Angular to efficiently create an instance of this View based on the compiled Template.
  14462. *
  14463. * Most ProtoViews are created and used internally by Angular and you don't need to know about them,
  14464. * except in advanced use-cases where you compile components yourself via the low-level
  14465. * {@link Compiler#compileInHost} API.
  14466. *
  14467. *
  14468. * ### Example
  14469. *
  14470. * Given this template:
  14471. *
  14472. * ```
  14473. * Count: {{items.length}}
  14474. * <ul>
  14475. * <li *ngFor="var item of items">{{item}}</li>
  14476. * </ul>
  14477. * ```
  14478. *
  14479. * Angular desugars and compiles the template into two ProtoViews:
  14480. *
  14481. * Outer ProtoView:
  14482. * ```
  14483. * Count: {{items.length}}
  14484. * <ul>
  14485. * <template ngFor var-item [ngForOf]="items"></template>
  14486. * </ul>
  14487. * ```
  14488. *
  14489. * Inner ProtoView:
  14490. * ```
  14491. * <li>{{item}}</li>
  14492. * ```
  14493. *
  14494. * Notice that the original template is broken down into two separate ProtoViews.
  14495. */
  14496. var ProtoViewRef = (function () {
  14497. function ProtoViewRef() {
  14498. }
  14499. return ProtoViewRef;
  14500. })();
  14501. exports.ProtoViewRef = ProtoViewRef;
  14502. var ProtoViewRef_ = (function (_super) {
  14503. __extends(ProtoViewRef_, _super);
  14504. function ProtoViewRef_(_protoView) {
  14505. _super.call(this);
  14506. this._protoView = _protoView;
  14507. }
  14508. return ProtoViewRef_;
  14509. })(ProtoViewRef);
  14510. exports.ProtoViewRef_ = ProtoViewRef_;
  14511. /***/ },
  14512. /* 78 */
  14513. /***/ function(module, exports, __webpack_require__) {
  14514. var lang_1 = __webpack_require__(5);
  14515. var CAMEL_CASE_REGEXP = /([A-Z])/g;
  14516. var DASH_CASE_REGEXP = /-([a-z])/g;
  14517. function camelCaseToDashCase(input) {
  14518. return lang_1.StringWrapper.replaceAllMapped(input, CAMEL_CASE_REGEXP, function (m) { return '-' + m[1].toLowerCase(); });
  14519. }
  14520. exports.camelCaseToDashCase = camelCaseToDashCase;
  14521. function dashCaseToCamelCase(input) {
  14522. return lang_1.StringWrapper.replaceAllMapped(input, DASH_CASE_REGEXP, function (m) { return m[1].toUpperCase(); });
  14523. }
  14524. exports.dashCaseToCamelCase = dashCaseToCamelCase;
  14525. /***/ },
  14526. /* 79 */
  14527. /***/ function(module, exports, __webpack_require__) {
  14528. var lang_1 = __webpack_require__(5);
  14529. var exceptions_1 = __webpack_require__(14);
  14530. var ElementBinder = (function () {
  14531. function ElementBinder(index, parent, distanceToParent, protoElementInjector, componentDirective, nestedProtoView) {
  14532. this.index = index;
  14533. this.parent = parent;
  14534. this.distanceToParent = distanceToParent;
  14535. this.protoElementInjector = protoElementInjector;
  14536. this.componentDirective = componentDirective;
  14537. this.nestedProtoView = nestedProtoView;
  14538. if (lang_1.isBlank(index)) {
  14539. throw new exceptions_1.BaseException('null index not allowed.');
  14540. }
  14541. }
  14542. return ElementBinder;
  14543. })();
  14544. exports.ElementBinder = ElementBinder;
  14545. /***/ },
  14546. /* 80 */
  14547. /***/ function(module, exports, __webpack_require__) {
  14548. var __extends = (this && this.__extends) || function (d, b) {
  14549. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  14550. function __() { this.constructor = d; }
  14551. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  14552. };
  14553. var lang_1 = __webpack_require__(5);
  14554. var exceptions_1 = __webpack_require__(14);
  14555. var async_1 = __webpack_require__(60);
  14556. var collection_1 = __webpack_require__(12);
  14557. var di_1 = __webpack_require__(6);
  14558. var injector_1 = __webpack_require__(11);
  14559. var provider_1 = __webpack_require__(13);
  14560. var di_2 = __webpack_require__(4);
  14561. /* circular */ var avmModule = __webpack_require__(81);
  14562. var view_container_ref_1 = __webpack_require__(87);
  14563. var element_ref_1 = __webpack_require__(83);
  14564. var template_ref_1 = __webpack_require__(84);
  14565. var directives_1 = __webpack_require__(23);
  14566. var directive_lifecycle_reflector_1 = __webpack_require__(88);
  14567. var change_detection_1 = __webpack_require__(25);
  14568. var query_list_1 = __webpack_require__(90);
  14569. var reflection_1 = __webpack_require__(16);
  14570. var event_config_1 = __webpack_require__(91);
  14571. var pipe_provider_1 = __webpack_require__(73);
  14572. var interfaces_1 = __webpack_require__(89);
  14573. var view_container_ref_2 = __webpack_require__(87);
  14574. var _staticKeys;
  14575. var StaticKeys = (function () {
  14576. function StaticKeys() {
  14577. this.viewManagerId = di_1.Key.get(avmModule.AppViewManager).id;
  14578. this.templateRefId = di_1.Key.get(template_ref_1.TemplateRef).id;
  14579. this.viewContainerId = di_1.Key.get(view_container_ref_1.ViewContainerRef).id;
  14580. this.changeDetectorRefId = di_1.Key.get(change_detection_1.ChangeDetectorRef).id;
  14581. this.elementRefId = di_1.Key.get(element_ref_1.ElementRef).id;
  14582. }
  14583. StaticKeys.instance = function () {
  14584. if (lang_1.isBlank(_staticKeys))
  14585. _staticKeys = new StaticKeys();
  14586. return _staticKeys;
  14587. };
  14588. return StaticKeys;
  14589. })();
  14590. exports.StaticKeys = StaticKeys;
  14591. var TreeNode = (function () {
  14592. function TreeNode(parent) {
  14593. if (lang_1.isPresent(parent)) {
  14594. parent.addChild(this);
  14595. }
  14596. else {
  14597. this._parent = null;
  14598. }
  14599. }
  14600. TreeNode.prototype.addChild = function (child) { child._parent = this; };
  14601. TreeNode.prototype.remove = function () { this._parent = null; };
  14602. Object.defineProperty(TreeNode.prototype, "parent", {
  14603. get: function () { return this._parent; },
  14604. enumerable: true,
  14605. configurable: true
  14606. });
  14607. return TreeNode;
  14608. })();
  14609. exports.TreeNode = TreeNode;
  14610. var DirectiveDependency = (function (_super) {
  14611. __extends(DirectiveDependency, _super);
  14612. function DirectiveDependency(key, optional, lowerBoundVisibility, upperBoundVisibility, properties, attributeName, queryDecorator) {
  14613. _super.call(this, key, optional, lowerBoundVisibility, upperBoundVisibility, properties);
  14614. this.attributeName = attributeName;
  14615. this.queryDecorator = queryDecorator;
  14616. this._verify();
  14617. }
  14618. /** @internal */
  14619. DirectiveDependency.prototype._verify = function () {
  14620. var count = 0;
  14621. if (lang_1.isPresent(this.queryDecorator))
  14622. count++;
  14623. if (lang_1.isPresent(this.attributeName))
  14624. count++;
  14625. if (count > 1)
  14626. throw new exceptions_1.BaseException('A directive injectable can contain only one of the following @Attribute or @Query.');
  14627. };
  14628. DirectiveDependency.createFrom = function (d) {
  14629. return new DirectiveDependency(d.key, d.optional, d.lowerBoundVisibility, d.upperBoundVisibility, d.properties, DirectiveDependency._attributeName(d.properties), DirectiveDependency._query(d.properties));
  14630. };
  14631. /** @internal */
  14632. DirectiveDependency._attributeName = function (properties) {
  14633. var p = properties.find(function (p) { return p instanceof di_2.AttributeMetadata; });
  14634. return lang_1.isPresent(p) ? p.attributeName : null;
  14635. };
  14636. /** @internal */
  14637. DirectiveDependency._query = function (properties) {
  14638. return properties.find(function (p) { return p instanceof di_2.QueryMetadata; });
  14639. };
  14640. return DirectiveDependency;
  14641. })(di_1.Dependency);
  14642. exports.DirectiveDependency = DirectiveDependency;
  14643. var DirectiveProvider = (function (_super) {
  14644. __extends(DirectiveProvider, _super);
  14645. function DirectiveProvider(key, factory, deps, metadata, providers, viewProviders) {
  14646. _super.call(this, key, [new provider_1.ResolvedFactory(factory, deps)], false);
  14647. this.metadata = metadata;
  14648. this.providers = providers;
  14649. this.viewProviders = viewProviders;
  14650. this.callOnDestroy = directive_lifecycle_reflector_1.hasLifecycleHook(interfaces_1.LifecycleHooks.OnDestroy, key.token);
  14651. }
  14652. Object.defineProperty(DirectiveProvider.prototype, "displayName", {
  14653. get: function () { return this.key.displayName; },
  14654. enumerable: true,
  14655. configurable: true
  14656. });
  14657. Object.defineProperty(DirectiveProvider.prototype, "queries", {
  14658. get: function () {
  14659. if (lang_1.isBlank(this.metadata.queries))
  14660. return [];
  14661. var res = [];
  14662. collection_1.StringMapWrapper.forEach(this.metadata.queries, function (meta, fieldName) {
  14663. var setter = reflection_1.reflector.setter(fieldName);
  14664. res.push(new QueryMetadataWithSetter(setter, meta));
  14665. });
  14666. return res;
  14667. },
  14668. enumerable: true,
  14669. configurable: true
  14670. });
  14671. Object.defineProperty(DirectiveProvider.prototype, "eventEmitters", {
  14672. get: function () {
  14673. return lang_1.isPresent(this.metadata) && lang_1.isPresent(this.metadata.outputs) ? this.metadata.outputs :
  14674. [];
  14675. },
  14676. enumerable: true,
  14677. configurable: true
  14678. });
  14679. DirectiveProvider.createFromProvider = function (provider, meta) {
  14680. if (lang_1.isBlank(meta)) {
  14681. meta = new directives_1.DirectiveMetadata();
  14682. }
  14683. var rb = provider_1.resolveProvider(provider);
  14684. var rf = rb.resolvedFactories[0];
  14685. var deps = rf.dependencies.map(DirectiveDependency.createFrom);
  14686. var providers = lang_1.isPresent(meta.providers) ? meta.providers : [];
  14687. var viewBindigs = meta instanceof directives_1.ComponentMetadata && lang_1.isPresent(meta.viewProviders) ?
  14688. meta.viewProviders :
  14689. [];
  14690. return new DirectiveProvider(rb.key, rf.factory, deps, meta, providers, viewBindigs);
  14691. };
  14692. DirectiveProvider.createFromType = function (type, annotation) {
  14693. var provider = new di_1.Provider(type, { useClass: type });
  14694. return DirectiveProvider.createFromProvider(provider, annotation);
  14695. };
  14696. return DirectiveProvider;
  14697. })(provider_1.ResolvedProvider_);
  14698. exports.DirectiveProvider = DirectiveProvider;
  14699. // TODO(rado): benchmark and consider rolling in as ElementInjector fields.
  14700. var PreBuiltObjects = (function () {
  14701. function PreBuiltObjects(viewManager, view, elementRef, templateRef) {
  14702. this.viewManager = viewManager;
  14703. this.view = view;
  14704. this.elementRef = elementRef;
  14705. this.templateRef = templateRef;
  14706. this.nestedView = null;
  14707. }
  14708. return PreBuiltObjects;
  14709. })();
  14710. exports.PreBuiltObjects = PreBuiltObjects;
  14711. var QueryMetadataWithSetter = (function () {
  14712. function QueryMetadataWithSetter(setter, metadata) {
  14713. this.setter = setter;
  14714. this.metadata = metadata;
  14715. }
  14716. return QueryMetadataWithSetter;
  14717. })();
  14718. exports.QueryMetadataWithSetter = QueryMetadataWithSetter;
  14719. var EventEmitterAccessor = (function () {
  14720. function EventEmitterAccessor(eventName, getter) {
  14721. this.eventName = eventName;
  14722. this.getter = getter;
  14723. }
  14724. EventEmitterAccessor.prototype.subscribe = function (view, boundElementIndex, directive) {
  14725. var _this = this;
  14726. var eventEmitter = this.getter(directive);
  14727. return async_1.ObservableWrapper.subscribe(eventEmitter, function (eventObj) { return view.triggerEventHandlers(_this.eventName, eventObj, boundElementIndex); });
  14728. };
  14729. return EventEmitterAccessor;
  14730. })();
  14731. exports.EventEmitterAccessor = EventEmitterAccessor;
  14732. function _createEventEmitterAccessors(bwv) {
  14733. var provider = bwv.provider;
  14734. if (!(provider instanceof DirectiveProvider))
  14735. return [];
  14736. var db = provider;
  14737. return db.eventEmitters.map(function (eventConfig) {
  14738. var parsedEvent = event_config_1.EventConfig.parse(eventConfig);
  14739. return new EventEmitterAccessor(parsedEvent.eventName, reflection_1.reflector.getter(parsedEvent.fieldName));
  14740. });
  14741. }
  14742. function _createProtoQueryRefs(providers) {
  14743. var res = [];
  14744. collection_1.ListWrapper.forEachWithIndex(providers, function (b, i) {
  14745. if (b.provider instanceof DirectiveProvider) {
  14746. var directiveProvider = b.provider;
  14747. // field queries
  14748. var queries = directiveProvider.queries;
  14749. queries.forEach(function (q) { return res.push(new ProtoQueryRef(i, q.setter, q.metadata)); });
  14750. // queries passed into the constructor.
  14751. // TODO: remove this after constructor queries are no longer supported
  14752. var deps = directiveProvider.resolvedFactory.dependencies;
  14753. deps.forEach(function (d) {
  14754. if (lang_1.isPresent(d.queryDecorator))
  14755. res.push(new ProtoQueryRef(i, null, d.queryDecorator));
  14756. });
  14757. }
  14758. });
  14759. return res;
  14760. }
  14761. var ProtoElementInjector = (function () {
  14762. function ProtoElementInjector(parent, index, bwv, distanceToParent, _firstProviderIsComponent, directiveVariableBindings) {
  14763. this.parent = parent;
  14764. this.index = index;
  14765. this.distanceToParent = distanceToParent;
  14766. this.directiveVariableBindings = directiveVariableBindings;
  14767. this._firstProviderIsComponent = _firstProviderIsComponent;
  14768. var length = bwv.length;
  14769. this.protoInjector = new injector_1.ProtoInjector(bwv);
  14770. this.eventEmitterAccessors = collection_1.ListWrapper.createFixedSize(length);
  14771. for (var i = 0; i < length; ++i) {
  14772. this.eventEmitterAccessors[i] = _createEventEmitterAccessors(bwv[i]);
  14773. }
  14774. this.protoQueryRefs = _createProtoQueryRefs(bwv);
  14775. }
  14776. ProtoElementInjector.create = function (parent, index, providers, firstProviderIsComponent, distanceToParent, directiveVariableBindings) {
  14777. var bd = [];
  14778. ProtoElementInjector._createDirectiveProviderWithVisibility(providers, bd, firstProviderIsComponent);
  14779. if (firstProviderIsComponent) {
  14780. ProtoElementInjector._createViewProvidersWithVisibility(providers, bd);
  14781. }
  14782. ProtoElementInjector._createProvidersWithVisibility(providers, bd);
  14783. return new ProtoElementInjector(parent, index, bd, distanceToParent, firstProviderIsComponent, directiveVariableBindings);
  14784. };
  14785. ProtoElementInjector._createDirectiveProviderWithVisibility = function (dirProviders, bd, firstProviderIsComponent) {
  14786. dirProviders.forEach(function (dirProvider) {
  14787. bd.push(ProtoElementInjector._createProviderWithVisibility(firstProviderIsComponent, dirProvider, dirProviders, dirProvider));
  14788. });
  14789. };
  14790. ProtoElementInjector._createProvidersWithVisibility = function (dirProviders, bd) {
  14791. var providersFromAllDirectives = [];
  14792. dirProviders.forEach(function (dirProvider) {
  14793. providersFromAllDirectives =
  14794. collection_1.ListWrapper.concat(providersFromAllDirectives, dirProvider.providers);
  14795. });
  14796. var resolved = di_1.Injector.resolve(providersFromAllDirectives);
  14797. resolved.forEach(function (b) { return bd.push(new injector_1.ProviderWithVisibility(b, injector_1.Visibility.Public)); });
  14798. };
  14799. ProtoElementInjector._createProviderWithVisibility = function (firstProviderIsComponent, dirProvider, dirProviders, provider) {
  14800. var isComponent = firstProviderIsComponent && dirProviders[0] === dirProvider;
  14801. return new injector_1.ProviderWithVisibility(provider, isComponent ? injector_1.Visibility.PublicAndPrivate : injector_1.Visibility.Public);
  14802. };
  14803. ProtoElementInjector._createViewProvidersWithVisibility = function (dirProviders, bd) {
  14804. var resolvedViewProviders = di_1.Injector.resolve(dirProviders[0].viewProviders);
  14805. resolvedViewProviders.forEach(function (b) { return bd.push(new injector_1.ProviderWithVisibility(b, injector_1.Visibility.Private)); });
  14806. };
  14807. ProtoElementInjector.prototype.instantiate = function (parent) {
  14808. return new ElementInjector(this, parent);
  14809. };
  14810. ProtoElementInjector.prototype.directParent = function () { return this.distanceToParent < 2 ? this.parent : null; };
  14811. Object.defineProperty(ProtoElementInjector.prototype, "hasBindings", {
  14812. get: function () { return this.eventEmitterAccessors.length > 0; },
  14813. enumerable: true,
  14814. configurable: true
  14815. });
  14816. ProtoElementInjector.prototype.getProviderAtIndex = function (index) { return this.protoInjector.getProviderAtIndex(index); };
  14817. return ProtoElementInjector;
  14818. })();
  14819. exports.ProtoElementInjector = ProtoElementInjector;
  14820. var _Context = (function () {
  14821. function _Context(element, componentElement, injector) {
  14822. this.element = element;
  14823. this.componentElement = componentElement;
  14824. this.injector = injector;
  14825. }
  14826. return _Context;
  14827. })();
  14828. var ElementInjector = (function (_super) {
  14829. __extends(ElementInjector, _super);
  14830. function ElementInjector(_proto, parent) {
  14831. var _this = this;
  14832. _super.call(this, parent);
  14833. this._preBuiltObjects = null;
  14834. this._proto = _proto;
  14835. this._injector =
  14836. new di_1.Injector(this._proto.protoInjector, null, this, function () { return _this._debugContext(); });
  14837. // we couple ourselves to the injector strategy to avoid polymoprhic calls
  14838. var injectorStrategy = this._injector.internalStrategy;
  14839. this._strategy = injectorStrategy instanceof injector_1.InjectorInlineStrategy ?
  14840. new ElementInjectorInlineStrategy(injectorStrategy, this) :
  14841. new ElementInjectorDynamicStrategy(injectorStrategy, this);
  14842. this.hydrated = false;
  14843. this._queryStrategy = this._buildQueryStrategy();
  14844. }
  14845. ElementInjector.prototype.dehydrate = function () {
  14846. this.hydrated = false;
  14847. this._host = null;
  14848. this._preBuiltObjects = null;
  14849. this._strategy.callOnDestroy();
  14850. this._strategy.dehydrate();
  14851. this._queryStrategy.dehydrate();
  14852. };
  14853. ElementInjector.prototype.hydrate = function (imperativelyCreatedInjector, host, preBuiltObjects) {
  14854. this._host = host;
  14855. this._preBuiltObjects = preBuiltObjects;
  14856. this._reattachInjectors(imperativelyCreatedInjector);
  14857. this._queryStrategy.hydrate();
  14858. this._strategy.hydrate();
  14859. this.hydrated = true;
  14860. };
  14861. ElementInjector.prototype._debugContext = function () {
  14862. var p = this._preBuiltObjects;
  14863. var index = p.elementRef.boundElementIndex - p.view.elementOffset;
  14864. var c = this._preBuiltObjects.view.getDebugContext(index, null);
  14865. return lang_1.isPresent(c) ? new _Context(c.element, c.componentElement, c.injector) : null;
  14866. };
  14867. ElementInjector.prototype._reattachInjectors = function (imperativelyCreatedInjector) {
  14868. // Dynamically-loaded component in the template. Not a root ElementInjector.
  14869. if (lang_1.isPresent(this._parent)) {
  14870. if (lang_1.isPresent(imperativelyCreatedInjector)) {
  14871. // The imperative injector is similar to having an element between
  14872. // the dynamic-loaded component and its parent => no boundaries.
  14873. this._reattachInjector(this._injector, imperativelyCreatedInjector, false);
  14874. this._reattachInjector(imperativelyCreatedInjector, this._parent._injector, false);
  14875. }
  14876. else {
  14877. this._reattachInjector(this._injector, this._parent._injector, false);
  14878. }
  14879. }
  14880. else if (lang_1.isPresent(this._host)) {
  14881. // The imperative injector is similar to having an element between
  14882. // the dynamic-loaded component and its parent => no boundary between
  14883. // the component and imperativelyCreatedInjector.
  14884. // But since it is a root ElementInjector, we need to create a boundary
  14885. // between imperativelyCreatedInjector and _host.
  14886. if (lang_1.isPresent(imperativelyCreatedInjector)) {
  14887. this._reattachInjector(this._injector, imperativelyCreatedInjector, false);
  14888. this._reattachInjector(imperativelyCreatedInjector, this._host._injector, true);
  14889. }
  14890. else {
  14891. this._reattachInjector(this._injector, this._host._injector, true);
  14892. }
  14893. }
  14894. else {
  14895. if (lang_1.isPresent(imperativelyCreatedInjector)) {
  14896. this._reattachInjector(this._injector, imperativelyCreatedInjector, true);
  14897. }
  14898. }
  14899. };
  14900. ElementInjector.prototype._reattachInjector = function (injector, parentInjector, isBoundary) {
  14901. injector.internalStrategy.attach(parentInjector, isBoundary);
  14902. };
  14903. ElementInjector.prototype.hasVariableBinding = function (name) {
  14904. var vb = this._proto.directiveVariableBindings;
  14905. return lang_1.isPresent(vb) && vb.has(name);
  14906. };
  14907. ElementInjector.prototype.getVariableBinding = function (name) {
  14908. var index = this._proto.directiveVariableBindings.get(name);
  14909. return lang_1.isPresent(index) ? this.getDirectiveAtIndex(index) : this.getElementRef();
  14910. };
  14911. ElementInjector.prototype.get = function (token) { return this._injector.get(token); };
  14912. ElementInjector.prototype.hasDirective = function (type) { return lang_1.isPresent(this._injector.getOptional(type)); };
  14913. ElementInjector.prototype.getEventEmitterAccessors = function () { return this._proto.eventEmitterAccessors; };
  14914. ElementInjector.prototype.getDirectiveVariableBindings = function () {
  14915. return this._proto.directiveVariableBindings;
  14916. };
  14917. ElementInjector.prototype.getComponent = function () { return this._strategy.getComponent(); };
  14918. ElementInjector.prototype.getInjector = function () { return this._injector; };
  14919. ElementInjector.prototype.getElementRef = function () { return this._preBuiltObjects.elementRef; };
  14920. ElementInjector.prototype.getViewContainerRef = function () {
  14921. return new view_container_ref_2.ViewContainerRef_(this._preBuiltObjects.viewManager, this.getElementRef());
  14922. };
  14923. ElementInjector.prototype.getNestedView = function () { return this._preBuiltObjects.nestedView; };
  14924. ElementInjector.prototype.getView = function () { return this._preBuiltObjects.view; };
  14925. ElementInjector.prototype.directParent = function () { return this._proto.distanceToParent < 2 ? this.parent : null; };
  14926. ElementInjector.prototype.isComponentKey = function (key) { return this._strategy.isComponentKey(key); };
  14927. ElementInjector.prototype.getDependency = function (injector, provider, dep) {
  14928. var key = dep.key;
  14929. if (provider instanceof DirectiveProvider) {
  14930. var dirDep = dep;
  14931. var dirProvider = provider;
  14932. var staticKeys = StaticKeys.instance();
  14933. if (key.id === staticKeys.viewManagerId)
  14934. return this._preBuiltObjects.viewManager;
  14935. if (lang_1.isPresent(dirDep.attributeName))
  14936. return this._buildAttribute(dirDep);
  14937. if (lang_1.isPresent(dirDep.queryDecorator))
  14938. return this._queryStrategy.findQuery(dirDep.queryDecorator).list;
  14939. if (dirDep.key.id === StaticKeys.instance().changeDetectorRefId) {
  14940. // We provide the component's view change detector to components and
  14941. // the surrounding component's change detector to directives.
  14942. if (dirProvider.metadata instanceof directives_1.ComponentMetadata) {
  14943. var componentView = this._preBuiltObjects.view.getNestedView(this._preBuiltObjects.elementRef.boundElementIndex);
  14944. return componentView.changeDetector.ref;
  14945. }
  14946. else {
  14947. return this._preBuiltObjects.view.changeDetector.ref;
  14948. }
  14949. }
  14950. if (dirDep.key.id === StaticKeys.instance().elementRefId) {
  14951. return this.getElementRef();
  14952. }
  14953. if (dirDep.key.id === StaticKeys.instance().viewContainerId) {
  14954. return this.getViewContainerRef();
  14955. }
  14956. if (dirDep.key.id === StaticKeys.instance().templateRefId) {
  14957. if (lang_1.isBlank(this._preBuiltObjects.templateRef)) {
  14958. if (dirDep.optional) {
  14959. return null;
  14960. }
  14961. throw new di_1.NoProviderError(null, dirDep.key);
  14962. }
  14963. return this._preBuiltObjects.templateRef;
  14964. }
  14965. }
  14966. else if (provider instanceof pipe_provider_1.PipeProvider) {
  14967. if (dep.key.id === StaticKeys.instance().changeDetectorRefId) {
  14968. var componentView = this._preBuiltObjects.view.getNestedView(this._preBuiltObjects.elementRef.boundElementIndex);
  14969. return componentView.changeDetector.ref;
  14970. }
  14971. }
  14972. return injector_1.UNDEFINED;
  14973. };
  14974. ElementInjector.prototype._buildAttribute = function (dep) {
  14975. var attributes = this._proto.attributes;
  14976. if (lang_1.isPresent(attributes) && attributes.has(dep.attributeName)) {
  14977. return attributes.get(dep.attributeName);
  14978. }
  14979. else {
  14980. return null;
  14981. }
  14982. };
  14983. ElementInjector.prototype.addDirectivesMatchingQuery = function (query, list) {
  14984. var templateRef = lang_1.isBlank(this._preBuiltObjects) ? null : this._preBuiltObjects.templateRef;
  14985. if (query.selector === template_ref_1.TemplateRef && lang_1.isPresent(templateRef)) {
  14986. list.push(templateRef);
  14987. }
  14988. this._strategy.addDirectivesMatchingQuery(query, list);
  14989. };
  14990. ElementInjector.prototype._buildQueryStrategy = function () {
  14991. if (this._proto.protoQueryRefs.length === 0) {
  14992. return _emptyQueryStrategy;
  14993. }
  14994. else if (this._proto.protoQueryRefs.length <=
  14995. InlineQueryStrategy.NUMBER_OF_SUPPORTED_QUERIES) {
  14996. return new InlineQueryStrategy(this);
  14997. }
  14998. else {
  14999. return new DynamicQueryStrategy(this);
  15000. }
  15001. };
  15002. ElementInjector.prototype.link = function (parent) { parent.addChild(this); };
  15003. ElementInjector.prototype.unlink = function () { this.remove(); };
  15004. ElementInjector.prototype.getDirectiveAtIndex = function (index) { return this._injector.getAt(index); };
  15005. ElementInjector.prototype.hasInstances = function () { return this._proto.hasBindings && this.hydrated; };
  15006. ElementInjector.prototype.getHost = function () { return this._host; };
  15007. ElementInjector.prototype.getBoundElementIndex = function () { return this._proto.index; };
  15008. ElementInjector.prototype.getRootViewInjectors = function () {
  15009. if (!this.hydrated)
  15010. return [];
  15011. var view = this._preBuiltObjects.view;
  15012. var nestedView = view.getNestedView(view.elementOffset + this.getBoundElementIndex());
  15013. return lang_1.isPresent(nestedView) ? nestedView.rootElementInjectors : [];
  15014. };
  15015. ElementInjector.prototype.ngAfterViewChecked = function () { this._queryStrategy.updateViewQueries(); };
  15016. ElementInjector.prototype.ngAfterContentChecked = function () { this._queryStrategy.updateContentQueries(); };
  15017. ElementInjector.prototype.traverseAndSetQueriesAsDirty = function () {
  15018. var inj = this;
  15019. while (lang_1.isPresent(inj)) {
  15020. inj._setQueriesAsDirty();
  15021. inj = inj.parent;
  15022. }
  15023. };
  15024. ElementInjector.prototype._setQueriesAsDirty = function () {
  15025. this._queryStrategy.setContentQueriesAsDirty();
  15026. if (lang_1.isPresent(this._host))
  15027. this._host._queryStrategy.setViewQueriesAsDirty();
  15028. };
  15029. return ElementInjector;
  15030. })(TreeNode);
  15031. exports.ElementInjector = ElementInjector;
  15032. var _EmptyQueryStrategy = (function () {
  15033. function _EmptyQueryStrategy() {
  15034. }
  15035. _EmptyQueryStrategy.prototype.setContentQueriesAsDirty = function () { };
  15036. _EmptyQueryStrategy.prototype.setViewQueriesAsDirty = function () { };
  15037. _EmptyQueryStrategy.prototype.hydrate = function () { };
  15038. _EmptyQueryStrategy.prototype.dehydrate = function () { };
  15039. _EmptyQueryStrategy.prototype.updateContentQueries = function () { };
  15040. _EmptyQueryStrategy.prototype.updateViewQueries = function () { };
  15041. _EmptyQueryStrategy.prototype.findQuery = function (query) {
  15042. throw new exceptions_1.BaseException("Cannot find query for directive " + query + ".");
  15043. };
  15044. return _EmptyQueryStrategy;
  15045. })();
  15046. var _emptyQueryStrategy = new _EmptyQueryStrategy();
  15047. var InlineQueryStrategy = (function () {
  15048. function InlineQueryStrategy(ei) {
  15049. var protoRefs = ei._proto.protoQueryRefs;
  15050. if (protoRefs.length > 0)
  15051. this.query0 = new QueryRef(protoRefs[0], ei);
  15052. if (protoRefs.length > 1)
  15053. this.query1 = new QueryRef(protoRefs[1], ei);
  15054. if (protoRefs.length > 2)
  15055. this.query2 = new QueryRef(protoRefs[2], ei);
  15056. }
  15057. InlineQueryStrategy.prototype.setContentQueriesAsDirty = function () {
  15058. if (lang_1.isPresent(this.query0) && !this.query0.isViewQuery)
  15059. this.query0.dirty = true;
  15060. if (lang_1.isPresent(this.query1) && !this.query1.isViewQuery)
  15061. this.query1.dirty = true;
  15062. if (lang_1.isPresent(this.query2) && !this.query2.isViewQuery)
  15063. this.query2.dirty = true;
  15064. };
  15065. InlineQueryStrategy.prototype.setViewQueriesAsDirty = function () {
  15066. if (lang_1.isPresent(this.query0) && this.query0.isViewQuery)
  15067. this.query0.dirty = true;
  15068. if (lang_1.isPresent(this.query1) && this.query1.isViewQuery)
  15069. this.query1.dirty = true;
  15070. if (lang_1.isPresent(this.query2) && this.query2.isViewQuery)
  15071. this.query2.dirty = true;
  15072. };
  15073. InlineQueryStrategy.prototype.hydrate = function () {
  15074. if (lang_1.isPresent(this.query0))
  15075. this.query0.hydrate();
  15076. if (lang_1.isPresent(this.query1))
  15077. this.query1.hydrate();
  15078. if (lang_1.isPresent(this.query2))
  15079. this.query2.hydrate();
  15080. };
  15081. InlineQueryStrategy.prototype.dehydrate = function () {
  15082. if (lang_1.isPresent(this.query0))
  15083. this.query0.dehydrate();
  15084. if (lang_1.isPresent(this.query1))
  15085. this.query1.dehydrate();
  15086. if (lang_1.isPresent(this.query2))
  15087. this.query2.dehydrate();
  15088. };
  15089. InlineQueryStrategy.prototype.updateContentQueries = function () {
  15090. if (lang_1.isPresent(this.query0) && !this.query0.isViewQuery) {
  15091. this.query0.update();
  15092. }
  15093. if (lang_1.isPresent(this.query1) && !this.query1.isViewQuery) {
  15094. this.query1.update();
  15095. }
  15096. if (lang_1.isPresent(this.query2) && !this.query2.isViewQuery) {
  15097. this.query2.update();
  15098. }
  15099. };
  15100. InlineQueryStrategy.prototype.updateViewQueries = function () {
  15101. if (lang_1.isPresent(this.query0) && this.query0.isViewQuery) {
  15102. this.query0.update();
  15103. }
  15104. if (lang_1.isPresent(this.query1) && this.query1.isViewQuery) {
  15105. this.query1.update();
  15106. }
  15107. if (lang_1.isPresent(this.query2) && this.query2.isViewQuery) {
  15108. this.query2.update();
  15109. }
  15110. };
  15111. InlineQueryStrategy.prototype.findQuery = function (query) {
  15112. if (lang_1.isPresent(this.query0) && this.query0.protoQueryRef.query === query) {
  15113. return this.query0;
  15114. }
  15115. if (lang_1.isPresent(this.query1) && this.query1.protoQueryRef.query === query) {
  15116. return this.query1;
  15117. }
  15118. if (lang_1.isPresent(this.query2) && this.query2.protoQueryRef.query === query) {
  15119. return this.query2;
  15120. }
  15121. throw new exceptions_1.BaseException("Cannot find query for directive " + query + ".");
  15122. };
  15123. InlineQueryStrategy.NUMBER_OF_SUPPORTED_QUERIES = 3;
  15124. return InlineQueryStrategy;
  15125. })();
  15126. var DynamicQueryStrategy = (function () {
  15127. function DynamicQueryStrategy(ei) {
  15128. this.queries = ei._proto.protoQueryRefs.map(function (p) { return new QueryRef(p, ei); });
  15129. }
  15130. DynamicQueryStrategy.prototype.setContentQueriesAsDirty = function () {
  15131. for (var i = 0; i < this.queries.length; ++i) {
  15132. var q = this.queries[i];
  15133. if (!q.isViewQuery)
  15134. q.dirty = true;
  15135. }
  15136. };
  15137. DynamicQueryStrategy.prototype.setViewQueriesAsDirty = function () {
  15138. for (var i = 0; i < this.queries.length; ++i) {
  15139. var q = this.queries[i];
  15140. if (q.isViewQuery)
  15141. q.dirty = true;
  15142. }
  15143. };
  15144. DynamicQueryStrategy.prototype.hydrate = function () {
  15145. for (var i = 0; i < this.queries.length; ++i) {
  15146. var q = this.queries[i];
  15147. q.hydrate();
  15148. }
  15149. };
  15150. DynamicQueryStrategy.prototype.dehydrate = function () {
  15151. for (var i = 0; i < this.queries.length; ++i) {
  15152. var q = this.queries[i];
  15153. q.dehydrate();
  15154. }
  15155. };
  15156. DynamicQueryStrategy.prototype.updateContentQueries = function () {
  15157. for (var i = 0; i < this.queries.length; ++i) {
  15158. var q = this.queries[i];
  15159. if (!q.isViewQuery) {
  15160. q.update();
  15161. }
  15162. }
  15163. };
  15164. DynamicQueryStrategy.prototype.updateViewQueries = function () {
  15165. for (var i = 0; i < this.queries.length; ++i) {
  15166. var q = this.queries[i];
  15167. if (q.isViewQuery) {
  15168. q.update();
  15169. }
  15170. }
  15171. };
  15172. DynamicQueryStrategy.prototype.findQuery = function (query) {
  15173. for (var i = 0; i < this.queries.length; ++i) {
  15174. var q = this.queries[i];
  15175. if (q.protoQueryRef.query === query) {
  15176. return q;
  15177. }
  15178. }
  15179. throw new exceptions_1.BaseException("Cannot find query for directive " + query + ".");
  15180. };
  15181. return DynamicQueryStrategy;
  15182. })();
  15183. /**
  15184. * Strategy used by the `ElementInjector` when the number of providers is 10 or less.
  15185. * In such a case, inlining fields is beneficial for performances.
  15186. */
  15187. var ElementInjectorInlineStrategy = (function () {
  15188. function ElementInjectorInlineStrategy(injectorStrategy, _ei) {
  15189. this.injectorStrategy = injectorStrategy;
  15190. this._ei = _ei;
  15191. }
  15192. ElementInjectorInlineStrategy.prototype.hydrate = function () {
  15193. var i = this.injectorStrategy;
  15194. var p = i.protoStrategy;
  15195. i.resetConstructionCounter();
  15196. if (p.provider0 instanceof DirectiveProvider && lang_1.isPresent(p.keyId0) && i.obj0 === injector_1.UNDEFINED)
  15197. i.obj0 = i.instantiateProvider(p.provider0, p.visibility0);
  15198. if (p.provider1 instanceof DirectiveProvider && lang_1.isPresent(p.keyId1) && i.obj1 === injector_1.UNDEFINED)
  15199. i.obj1 = i.instantiateProvider(p.provider1, p.visibility1);
  15200. if (p.provider2 instanceof DirectiveProvider && lang_1.isPresent(p.keyId2) && i.obj2 === injector_1.UNDEFINED)
  15201. i.obj2 = i.instantiateProvider(p.provider2, p.visibility2);
  15202. if (p.provider3 instanceof DirectiveProvider && lang_1.isPresent(p.keyId3) && i.obj3 === injector_1.UNDEFINED)
  15203. i.obj3 = i.instantiateProvider(p.provider3, p.visibility3);
  15204. if (p.provider4 instanceof DirectiveProvider && lang_1.isPresent(p.keyId4) && i.obj4 === injector_1.UNDEFINED)
  15205. i.obj4 = i.instantiateProvider(p.provider4, p.visibility4);
  15206. if (p.provider5 instanceof DirectiveProvider && lang_1.isPresent(p.keyId5) && i.obj5 === injector_1.UNDEFINED)
  15207. i.obj5 = i.instantiateProvider(p.provider5, p.visibility5);
  15208. if (p.provider6 instanceof DirectiveProvider && lang_1.isPresent(p.keyId6) && i.obj6 === injector_1.UNDEFINED)
  15209. i.obj6 = i.instantiateProvider(p.provider6, p.visibility6);
  15210. if (p.provider7 instanceof DirectiveProvider && lang_1.isPresent(p.keyId7) && i.obj7 === injector_1.UNDEFINED)
  15211. i.obj7 = i.instantiateProvider(p.provider7, p.visibility7);
  15212. if (p.provider8 instanceof DirectiveProvider && lang_1.isPresent(p.keyId8) && i.obj8 === injector_1.UNDEFINED)
  15213. i.obj8 = i.instantiateProvider(p.provider8, p.visibility8);
  15214. if (p.provider9 instanceof DirectiveProvider && lang_1.isPresent(p.keyId9) && i.obj9 === injector_1.UNDEFINED)
  15215. i.obj9 = i.instantiateProvider(p.provider9, p.visibility9);
  15216. };
  15217. ElementInjectorInlineStrategy.prototype.dehydrate = function () {
  15218. var i = this.injectorStrategy;
  15219. i.obj0 = injector_1.UNDEFINED;
  15220. i.obj1 = injector_1.UNDEFINED;
  15221. i.obj2 = injector_1.UNDEFINED;
  15222. i.obj3 = injector_1.UNDEFINED;
  15223. i.obj4 = injector_1.UNDEFINED;
  15224. i.obj5 = injector_1.UNDEFINED;
  15225. i.obj6 = injector_1.UNDEFINED;
  15226. i.obj7 = injector_1.UNDEFINED;
  15227. i.obj8 = injector_1.UNDEFINED;
  15228. i.obj9 = injector_1.UNDEFINED;
  15229. };
  15230. ElementInjectorInlineStrategy.prototype.callOnDestroy = function () {
  15231. var i = this.injectorStrategy;
  15232. var p = i.protoStrategy;
  15233. if (p.provider0 instanceof DirectiveProvider &&
  15234. p.provider0.callOnDestroy) {
  15235. i.obj0.ngOnDestroy();
  15236. }
  15237. if (p.provider1 instanceof DirectiveProvider &&
  15238. p.provider1.callOnDestroy) {
  15239. i.obj1.ngOnDestroy();
  15240. }
  15241. if (p.provider2 instanceof DirectiveProvider &&
  15242. p.provider2.callOnDestroy) {
  15243. i.obj2.ngOnDestroy();
  15244. }
  15245. if (p.provider3 instanceof DirectiveProvider &&
  15246. p.provider3.callOnDestroy) {
  15247. i.obj3.ngOnDestroy();
  15248. }
  15249. if (p.provider4 instanceof DirectiveProvider &&
  15250. p.provider4.callOnDestroy) {
  15251. i.obj4.ngOnDestroy();
  15252. }
  15253. if (p.provider5 instanceof DirectiveProvider &&
  15254. p.provider5.callOnDestroy) {
  15255. i.obj5.ngOnDestroy();
  15256. }
  15257. if (p.provider6 instanceof DirectiveProvider &&
  15258. p.provider6.callOnDestroy) {
  15259. i.obj6.ngOnDestroy();
  15260. }
  15261. if (p.provider7 instanceof DirectiveProvider &&
  15262. p.provider7.callOnDestroy) {
  15263. i.obj7.ngOnDestroy();
  15264. }
  15265. if (p.provider8 instanceof DirectiveProvider &&
  15266. p.provider8.callOnDestroy) {
  15267. i.obj8.ngOnDestroy();
  15268. }
  15269. if (p.provider9 instanceof DirectiveProvider &&
  15270. p.provider9.callOnDestroy) {
  15271. i.obj9.ngOnDestroy();
  15272. }
  15273. };
  15274. ElementInjectorInlineStrategy.prototype.getComponent = function () { return this.injectorStrategy.obj0; };
  15275. ElementInjectorInlineStrategy.prototype.isComponentKey = function (key) {
  15276. return this._ei._proto._firstProviderIsComponent && lang_1.isPresent(key) &&
  15277. key.id === this.injectorStrategy.protoStrategy.keyId0;
  15278. };
  15279. ElementInjectorInlineStrategy.prototype.addDirectivesMatchingQuery = function (query, list) {
  15280. var i = this.injectorStrategy;
  15281. var p = i.protoStrategy;
  15282. if (lang_1.isPresent(p.provider0) && p.provider0.key.token === query.selector) {
  15283. if (i.obj0 === injector_1.UNDEFINED)
  15284. i.obj0 = i.instantiateProvider(p.provider0, p.visibility0);
  15285. list.push(i.obj0);
  15286. }
  15287. if (lang_1.isPresent(p.provider1) && p.provider1.key.token === query.selector) {
  15288. if (i.obj1 === injector_1.UNDEFINED)
  15289. i.obj1 = i.instantiateProvider(p.provider1, p.visibility1);
  15290. list.push(i.obj1);
  15291. }
  15292. if (lang_1.isPresent(p.provider2) && p.provider2.key.token === query.selector) {
  15293. if (i.obj2 === injector_1.UNDEFINED)
  15294. i.obj2 = i.instantiateProvider(p.provider2, p.visibility2);
  15295. list.push(i.obj2);
  15296. }
  15297. if (lang_1.isPresent(p.provider3) && p.provider3.key.token === query.selector) {
  15298. if (i.obj3 === injector_1.UNDEFINED)
  15299. i.obj3 = i.instantiateProvider(p.provider3, p.visibility3);
  15300. list.push(i.obj3);
  15301. }
  15302. if (lang_1.isPresent(p.provider4) && p.provider4.key.token === query.selector) {
  15303. if (i.obj4 === injector_1.UNDEFINED)
  15304. i.obj4 = i.instantiateProvider(p.provider4, p.visibility4);
  15305. list.push(i.obj4);
  15306. }
  15307. if (lang_1.isPresent(p.provider5) && p.provider5.key.token === query.selector) {
  15308. if (i.obj5 === injector_1.UNDEFINED)
  15309. i.obj5 = i.instantiateProvider(p.provider5, p.visibility5);
  15310. list.push(i.obj5);
  15311. }
  15312. if (lang_1.isPresent(p.provider6) && p.provider6.key.token === query.selector) {
  15313. if (i.obj6 === injector_1.UNDEFINED)
  15314. i.obj6 = i.instantiateProvider(p.provider6, p.visibility6);
  15315. list.push(i.obj6);
  15316. }
  15317. if (lang_1.isPresent(p.provider7) && p.provider7.key.token === query.selector) {
  15318. if (i.obj7 === injector_1.UNDEFINED)
  15319. i.obj7 = i.instantiateProvider(p.provider7, p.visibility7);
  15320. list.push(i.obj7);
  15321. }
  15322. if (lang_1.isPresent(p.provider8) && p.provider8.key.token === query.selector) {
  15323. if (i.obj8 === injector_1.UNDEFINED)
  15324. i.obj8 = i.instantiateProvider(p.provider8, p.visibility8);
  15325. list.push(i.obj8);
  15326. }
  15327. if (lang_1.isPresent(p.provider9) && p.provider9.key.token === query.selector) {
  15328. if (i.obj9 === injector_1.UNDEFINED)
  15329. i.obj9 = i.instantiateProvider(p.provider9, p.visibility9);
  15330. list.push(i.obj9);
  15331. }
  15332. };
  15333. return ElementInjectorInlineStrategy;
  15334. })();
  15335. /**
  15336. * Strategy used by the `ElementInjector` when the number of bindings is 11 or more.
  15337. * In such a case, there are too many fields to inline (see ElementInjectorInlineStrategy).
  15338. */
  15339. var ElementInjectorDynamicStrategy = (function () {
  15340. function ElementInjectorDynamicStrategy(injectorStrategy, _ei) {
  15341. this.injectorStrategy = injectorStrategy;
  15342. this._ei = _ei;
  15343. }
  15344. ElementInjectorDynamicStrategy.prototype.hydrate = function () {
  15345. var inj = this.injectorStrategy;
  15346. var p = inj.protoStrategy;
  15347. inj.resetConstructionCounter();
  15348. for (var i = 0; i < p.keyIds.length; i++) {
  15349. if (p.providers[i] instanceof DirectiveProvider && lang_1.isPresent(p.keyIds[i]) &&
  15350. inj.objs[i] === injector_1.UNDEFINED) {
  15351. inj.objs[i] = inj.instantiateProvider(p.providers[i], p.visibilities[i]);
  15352. }
  15353. }
  15354. };
  15355. ElementInjectorDynamicStrategy.prototype.dehydrate = function () {
  15356. var inj = this.injectorStrategy;
  15357. collection_1.ListWrapper.fill(inj.objs, injector_1.UNDEFINED);
  15358. };
  15359. ElementInjectorDynamicStrategy.prototype.callOnDestroy = function () {
  15360. var ist = this.injectorStrategy;
  15361. var p = ist.protoStrategy;
  15362. for (var i = 0; i < p.providers.length; i++) {
  15363. if (p.providers[i] instanceof DirectiveProvider &&
  15364. p.providers[i].callOnDestroy) {
  15365. ist.objs[i].ngOnDestroy();
  15366. }
  15367. }
  15368. };
  15369. ElementInjectorDynamicStrategy.prototype.getComponent = function () { return this.injectorStrategy.objs[0]; };
  15370. ElementInjectorDynamicStrategy.prototype.isComponentKey = function (key) {
  15371. var p = this.injectorStrategy.protoStrategy;
  15372. return this._ei._proto._firstProviderIsComponent && lang_1.isPresent(key) && key.id === p.keyIds[0];
  15373. };
  15374. ElementInjectorDynamicStrategy.prototype.addDirectivesMatchingQuery = function (query, list) {
  15375. var ist = this.injectorStrategy;
  15376. var p = ist.protoStrategy;
  15377. for (var i = 0; i < p.providers.length; i++) {
  15378. if (p.providers[i].key.token === query.selector) {
  15379. if (ist.objs[i] === injector_1.UNDEFINED) {
  15380. ist.objs[i] = ist.instantiateProvider(p.providers[i], p.visibilities[i]);
  15381. }
  15382. list.push(ist.objs[i]);
  15383. }
  15384. }
  15385. };
  15386. return ElementInjectorDynamicStrategy;
  15387. })();
  15388. var ProtoQueryRef = (function () {
  15389. function ProtoQueryRef(dirIndex, setter, query) {
  15390. this.dirIndex = dirIndex;
  15391. this.setter = setter;
  15392. this.query = query;
  15393. }
  15394. Object.defineProperty(ProtoQueryRef.prototype, "usesPropertySyntax", {
  15395. get: function () { return lang_1.isPresent(this.setter); },
  15396. enumerable: true,
  15397. configurable: true
  15398. });
  15399. return ProtoQueryRef;
  15400. })();
  15401. exports.ProtoQueryRef = ProtoQueryRef;
  15402. var QueryRef = (function () {
  15403. function QueryRef(protoQueryRef, originator) {
  15404. this.protoQueryRef = protoQueryRef;
  15405. this.originator = originator;
  15406. }
  15407. Object.defineProperty(QueryRef.prototype, "isViewQuery", {
  15408. get: function () { return this.protoQueryRef.query.isViewQuery; },
  15409. enumerable: true,
  15410. configurable: true
  15411. });
  15412. QueryRef.prototype.update = function () {
  15413. if (!this.dirty)
  15414. return;
  15415. this._update();
  15416. this.dirty = false;
  15417. // TODO delete the check once only field queries are supported
  15418. if (this.protoQueryRef.usesPropertySyntax) {
  15419. var dir = this.originator.getDirectiveAtIndex(this.protoQueryRef.dirIndex);
  15420. if (this.protoQueryRef.query.first) {
  15421. this.protoQueryRef.setter(dir, this.list.length > 0 ? this.list.first : null);
  15422. }
  15423. else {
  15424. this.protoQueryRef.setter(dir, this.list);
  15425. }
  15426. }
  15427. this.list.notifyOnChanges();
  15428. };
  15429. QueryRef.prototype._update = function () {
  15430. var aggregator = [];
  15431. if (this.protoQueryRef.query.isViewQuery) {
  15432. var view = this.originator.getView();
  15433. // intentionally skipping originator for view queries.
  15434. var nestedView = view.getNestedView(view.elementOffset + this.originator.getBoundElementIndex());
  15435. if (lang_1.isPresent(nestedView))
  15436. this._visitView(nestedView, aggregator);
  15437. }
  15438. else {
  15439. this._visit(this.originator, aggregator);
  15440. }
  15441. this.list.reset(aggregator);
  15442. };
  15443. ;
  15444. QueryRef.prototype._visit = function (inj, aggregator) {
  15445. var view = inj.getView();
  15446. var startIdx = view.elementOffset + inj._proto.index;
  15447. for (var i = startIdx; i < view.elementOffset + view.ownBindersCount; i++) {
  15448. var curInj = view.elementInjectors[i];
  15449. if (lang_1.isBlank(curInj))
  15450. continue;
  15451. // The first injector after inj, that is outside the subtree rooted at
  15452. // inj has to have a null parent or a parent that is an ancestor of inj.
  15453. if (i > startIdx && (lang_1.isBlank(curInj) || lang_1.isBlank(curInj.parent) ||
  15454. view.elementOffset + curInj.parent._proto.index < startIdx)) {
  15455. break;
  15456. }
  15457. if (!this.protoQueryRef.query.descendants &&
  15458. !(curInj.parent == this.originator || curInj == this.originator))
  15459. continue;
  15460. // We visit the view container(VC) views right after the injector that contains
  15461. // the VC. Theoretically, that might not be the right order if there are
  15462. // child injectors of said injector. Not clear whether if such case can
  15463. // even be constructed with the current apis.
  15464. this._visitInjector(curInj, aggregator);
  15465. var vc = view.viewContainers[i];
  15466. if (lang_1.isPresent(vc))
  15467. this._visitViewContainer(vc, aggregator);
  15468. }
  15469. };
  15470. QueryRef.prototype._visitInjector = function (inj, aggregator) {
  15471. if (this.protoQueryRef.query.isVarBindingQuery) {
  15472. this._aggregateVariableBinding(inj, aggregator);
  15473. }
  15474. else {
  15475. this._aggregateDirective(inj, aggregator);
  15476. }
  15477. };
  15478. QueryRef.prototype._visitViewContainer = function (vc, aggregator) {
  15479. for (var j = 0; j < vc.views.length; j++) {
  15480. this._visitView(vc.views[j], aggregator);
  15481. }
  15482. };
  15483. QueryRef.prototype._visitView = function (view, aggregator) {
  15484. for (var i = view.elementOffset; i < view.elementOffset + view.ownBindersCount; i++) {
  15485. var inj = view.elementInjectors[i];
  15486. if (lang_1.isBlank(inj))
  15487. continue;
  15488. this._visitInjector(inj, aggregator);
  15489. var vc = view.viewContainers[i];
  15490. if (lang_1.isPresent(vc))
  15491. this._visitViewContainer(vc, aggregator);
  15492. }
  15493. };
  15494. QueryRef.prototype._aggregateVariableBinding = function (inj, aggregator) {
  15495. var vb = this.protoQueryRef.query.varBindings;
  15496. for (var i = 0; i < vb.length; ++i) {
  15497. if (inj.hasVariableBinding(vb[i])) {
  15498. aggregator.push(inj.getVariableBinding(vb[i]));
  15499. }
  15500. }
  15501. };
  15502. QueryRef.prototype._aggregateDirective = function (inj, aggregator) {
  15503. inj.addDirectivesMatchingQuery(this.protoQueryRef.query, aggregator);
  15504. };
  15505. QueryRef.prototype.dehydrate = function () { this.list = null; };
  15506. QueryRef.prototype.hydrate = function () {
  15507. this.list = new query_list_1.QueryList();
  15508. this.dirty = true;
  15509. };
  15510. return QueryRef;
  15511. })();
  15512. exports.QueryRef = QueryRef;
  15513. /***/ },
  15514. /* 81 */
  15515. /***/ function(module, exports, __webpack_require__) {
  15516. var __extends = (this && this.__extends) || function (d, b) {
  15517. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  15518. function __() { this.constructor = d; }
  15519. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  15520. };
  15521. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  15522. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  15523. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  15524. 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;
  15525. return c > 3 && r && Object.defineProperty(target, key, r), r;
  15526. };
  15527. var __metadata = (this && this.__metadata) || function (k, v) {
  15528. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  15529. };
  15530. var __param = (this && this.__param) || function (paramIndex, decorator) {
  15531. return function (target, key) { decorator(target, key, paramIndex); }
  15532. };
  15533. var di_1 = __webpack_require__(6);
  15534. var lang_1 = __webpack_require__(5);
  15535. var exceptions_1 = __webpack_require__(14);
  15536. var viewModule = __webpack_require__(76);
  15537. var view_ref_1 = __webpack_require__(77);
  15538. var api_1 = __webpack_require__(72);
  15539. var view_manager_utils_1 = __webpack_require__(82);
  15540. var view_pool_1 = __webpack_require__(85);
  15541. var view_listener_1 = __webpack_require__(86);
  15542. var profile_1 = __webpack_require__(45);
  15543. var proto_view_factory_1 = __webpack_require__(71);
  15544. /**
  15545. * Service exposing low level API for creating, moving and destroying Views.
  15546. *
  15547. * Most applications should use higher-level abstractions like {@link DynamicComponentLoader} and
  15548. * {@link ViewContainerRef} instead.
  15549. */
  15550. var AppViewManager = (function () {
  15551. function AppViewManager() {
  15552. }
  15553. /**
  15554. * Returns the {@link ElementRef} that makes up the specified Host View.
  15555. */
  15556. AppViewManager.prototype.getHostElement = function (hostViewRef) {
  15557. var hostView = view_ref_1.internalView(hostViewRef);
  15558. if (hostView.proto.type !== viewModule.ViewType.HOST) {
  15559. throw new exceptions_1.BaseException('This operation is only allowed on host views');
  15560. }
  15561. return hostView.elementRefs[hostView.elementOffset];
  15562. };
  15563. return AppViewManager;
  15564. })();
  15565. exports.AppViewManager = AppViewManager;
  15566. var AppViewManager_ = (function (_super) {
  15567. __extends(AppViewManager_, _super);
  15568. function AppViewManager_(_viewPool, _viewListener, _utils, _renderer, _protoViewFactory) {
  15569. _super.call(this);
  15570. this._viewPool = _viewPool;
  15571. this._viewListener = _viewListener;
  15572. this._utils = _utils;
  15573. this._renderer = _renderer;
  15574. /** @internal */
  15575. this._createRootHostViewScope = profile_1.wtfCreateScope('AppViewManager#createRootHostView()');
  15576. /** @internal */
  15577. this._destroyRootHostViewScope = profile_1.wtfCreateScope('AppViewManager#destroyRootHostView()');
  15578. /** @internal */
  15579. this._createEmbeddedViewInContainerScope = profile_1.wtfCreateScope('AppViewManager#createEmbeddedViewInContainer()');
  15580. /** @internal */
  15581. this._createHostViewInContainerScope = profile_1.wtfCreateScope('AppViewManager#createHostViewInContainer()');
  15582. /** @internal */
  15583. this._destroyViewInContainerScope = profile_1.wtfCreateScope('AppViewMananger#destroyViewInContainer()');
  15584. /** @internal */
  15585. this._attachViewInContainerScope = profile_1.wtfCreateScope('AppViewMananger#attachViewInContainer()');
  15586. /** @internal */
  15587. this._detachViewInContainerScope = profile_1.wtfCreateScope('AppViewMananger#detachViewInContainer()');
  15588. this._protoViewFactory = _protoViewFactory;
  15589. }
  15590. AppViewManager_.prototype.getViewContainer = function (location) {
  15591. var hostView = view_ref_1.internalView(location.parentView);
  15592. return hostView.elementInjectors[location.boundElementIndex]
  15593. .getViewContainerRef();
  15594. };
  15595. AppViewManager_.prototype.getNamedElementInComponentView = function (hostLocation, variableName) {
  15596. var hostView = view_ref_1.internalView(hostLocation.parentView);
  15597. var boundElementIndex = hostLocation.boundElementIndex;
  15598. var componentView = hostView.getNestedView(boundElementIndex);
  15599. if (lang_1.isBlank(componentView)) {
  15600. throw new exceptions_1.BaseException("There is no component directive at element " + boundElementIndex);
  15601. }
  15602. var binderIdx = componentView.proto.variableLocations.get(variableName);
  15603. if (lang_1.isBlank(binderIdx)) {
  15604. throw new exceptions_1.BaseException("Could not find variable " + variableName);
  15605. }
  15606. return componentView.elementRefs[componentView.elementOffset + binderIdx];
  15607. };
  15608. AppViewManager_.prototype.getComponent = function (hostLocation) {
  15609. var hostView = view_ref_1.internalView(hostLocation.parentView);
  15610. var boundElementIndex = hostLocation.boundElementIndex;
  15611. return this._utils.getComponentInstance(hostView, boundElementIndex);
  15612. };
  15613. AppViewManager_.prototype.createRootHostView = function (hostProtoViewRef, overrideSelector, injector) {
  15614. var s = this._createRootHostViewScope();
  15615. var hostProtoView = view_ref_1.internalProtoView(hostProtoViewRef);
  15616. this._protoViewFactory.initializeProtoViewIfNeeded(hostProtoView);
  15617. var hostElementSelector = overrideSelector;
  15618. if (lang_1.isBlank(hostElementSelector)) {
  15619. hostElementSelector = hostProtoView.elementBinders[0].componentDirective.metadata.selector;
  15620. }
  15621. var renderViewWithFragments = this._renderer.createRootHostView(hostProtoView.render, hostProtoView.mergeInfo.embeddedViewCount + 1, hostElementSelector);
  15622. var hostView = this._createMainView(hostProtoView, renderViewWithFragments);
  15623. this._renderer.hydrateView(hostView.render);
  15624. this._utils.hydrateRootHostView(hostView, injector);
  15625. return profile_1.wtfLeave(s, hostView.ref);
  15626. };
  15627. AppViewManager_.prototype.destroyRootHostView = function (hostViewRef) {
  15628. // Note: Don't put the hostView into the view pool
  15629. // as it is depending on the element for which it was created.
  15630. var s = this._destroyRootHostViewScope();
  15631. var hostView = view_ref_1.internalView(hostViewRef);
  15632. this._renderer.detachFragment(hostView.renderFragment);
  15633. this._renderer.dehydrateView(hostView.render);
  15634. this._viewDehydrateRecurse(hostView);
  15635. this._viewListener.onViewDestroyed(hostView);
  15636. this._renderer.destroyView(hostView.render);
  15637. profile_1.wtfLeave(s);
  15638. };
  15639. AppViewManager_.prototype.createEmbeddedViewInContainer = function (viewContainerLocation, index, templateRef) {
  15640. var s = this._createEmbeddedViewInContainerScope();
  15641. var protoView = view_ref_1.internalProtoView(templateRef.protoViewRef);
  15642. if (protoView.type !== viewModule.ViewType.EMBEDDED) {
  15643. throw new exceptions_1.BaseException('This method can only be called with embedded ProtoViews!');
  15644. }
  15645. this._protoViewFactory.initializeProtoViewIfNeeded(protoView);
  15646. return profile_1.wtfLeave(s, this._createViewInContainer(viewContainerLocation, index, protoView, templateRef.elementRef, null));
  15647. };
  15648. AppViewManager_.prototype.createHostViewInContainer = function (viewContainerLocation, index, protoViewRef, imperativelyCreatedInjector) {
  15649. var s = this._createHostViewInContainerScope();
  15650. var protoView = view_ref_1.internalProtoView(protoViewRef);
  15651. if (protoView.type !== viewModule.ViewType.HOST) {
  15652. throw new exceptions_1.BaseException('This method can only be called with host ProtoViews!');
  15653. }
  15654. this._protoViewFactory.initializeProtoViewIfNeeded(protoView);
  15655. return profile_1.wtfLeave(s, this._createViewInContainer(viewContainerLocation, index, protoView, viewContainerLocation, imperativelyCreatedInjector));
  15656. };
  15657. /**
  15658. *
  15659. * See {@link AppViewManager#destroyViewInContainer}.
  15660. * @internal
  15661. */
  15662. AppViewManager_.prototype._createViewInContainer = function (viewContainerLocation, index, protoView, context, imperativelyCreatedInjector) {
  15663. var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
  15664. var boundElementIndex = viewContainerLocation.boundElementIndex;
  15665. var contextView = view_ref_1.internalView(context.parentView);
  15666. var contextBoundElementIndex = context.boundElementIndex;
  15667. var embeddedFragmentView = contextView.getNestedView(contextBoundElementIndex);
  15668. var view;
  15669. if (protoView.type === viewModule.ViewType.EMBEDDED && lang_1.isPresent(embeddedFragmentView) &&
  15670. !embeddedFragmentView.hydrated()) {
  15671. // Case 1: instantiate the first view of a template that has been merged into a parent
  15672. view = embeddedFragmentView;
  15673. this._attachRenderView(parentView, boundElementIndex, index, view);
  15674. }
  15675. else {
  15676. // Case 2: instantiate another copy of the template or a host ProtoView.
  15677. // This is a separate case
  15678. // as we only inline one copy of the template into the parent view.
  15679. view = this._createPooledView(protoView);
  15680. this._attachRenderView(parentView, boundElementIndex, index, view);
  15681. this._renderer.hydrateView(view.render);
  15682. }
  15683. this._utils.attachViewInContainer(parentView, boundElementIndex, contextView, contextBoundElementIndex, index, view);
  15684. try {
  15685. this._utils.hydrateViewInContainer(parentView, boundElementIndex, contextView, contextBoundElementIndex, index, imperativelyCreatedInjector);
  15686. }
  15687. catch (e) {
  15688. this._utils.detachViewInContainer(parentView, boundElementIndex, index);
  15689. throw e;
  15690. }
  15691. return view.ref;
  15692. };
  15693. /** @internal */
  15694. AppViewManager_.prototype._attachRenderView = function (parentView, boundElementIndex, index, view) {
  15695. var elementRef = parentView.elementRefs[boundElementIndex];
  15696. if (index === 0) {
  15697. this._renderer.attachFragmentAfterElement(elementRef, view.renderFragment);
  15698. }
  15699. else {
  15700. var prevView = parentView.viewContainers[boundElementIndex].views[index - 1];
  15701. this._renderer.attachFragmentAfterFragment(prevView.renderFragment, view.renderFragment);
  15702. }
  15703. };
  15704. AppViewManager_.prototype.destroyViewInContainer = function (viewContainerLocation, index) {
  15705. var s = this._destroyViewInContainerScope();
  15706. var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
  15707. var boundElementIndex = viewContainerLocation.boundElementIndex;
  15708. this._destroyViewInContainer(parentView, boundElementIndex, index);
  15709. profile_1.wtfLeave(s);
  15710. };
  15711. // TODO(i): refactor detachViewInContainer+attachViewInContainer to moveViewInContainer
  15712. AppViewManager_.prototype.attachViewInContainer = function (viewContainerLocation, index, viewRef) {
  15713. var s = this._attachViewInContainerScope();
  15714. var view = view_ref_1.internalView(viewRef);
  15715. var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
  15716. var boundElementIndex = viewContainerLocation.boundElementIndex;
  15717. // TODO(tbosch): the public methods attachViewInContainer/detachViewInContainer
  15718. // are used for moving elements without the same container.
  15719. // We will change this into an atomic `move` operation, which should preserve the
  15720. // previous parent injector (see https://github.com/angular/angular/issues/1377).
  15721. // Right now we are destroying any special
  15722. // context view that might have been used.
  15723. this._utils.attachViewInContainer(parentView, boundElementIndex, null, null, index, view);
  15724. this._attachRenderView(parentView, boundElementIndex, index, view);
  15725. return profile_1.wtfLeave(s, viewRef);
  15726. };
  15727. // TODO(i): refactor detachViewInContainer+attachViewInContainer to moveViewInContainer
  15728. AppViewManager_.prototype.detachViewInContainer = function (viewContainerLocation, index) {
  15729. var s = this._detachViewInContainerScope();
  15730. var parentView = view_ref_1.internalView(viewContainerLocation.parentView);
  15731. var boundElementIndex = viewContainerLocation.boundElementIndex;
  15732. var viewContainer = parentView.viewContainers[boundElementIndex];
  15733. var view = viewContainer.views[index];
  15734. this._utils.detachViewInContainer(parentView, boundElementIndex, index);
  15735. this._renderer.detachFragment(view.renderFragment);
  15736. return profile_1.wtfLeave(s, view.ref);
  15737. };
  15738. /** @internal */
  15739. AppViewManager_.prototype._createMainView = function (protoView, renderViewWithFragments) {
  15740. var mergedParentView = this._utils.createView(protoView, renderViewWithFragments, this, this._renderer);
  15741. this._renderer.setEventDispatcher(mergedParentView.render, mergedParentView);
  15742. this._viewListener.onViewCreated(mergedParentView);
  15743. return mergedParentView;
  15744. };
  15745. /** @internal */
  15746. AppViewManager_.prototype._createPooledView = function (protoView) {
  15747. var view = this._viewPool.getView(protoView);
  15748. if (lang_1.isBlank(view)) {
  15749. view = this._createMainView(protoView, this._renderer.createView(protoView.render, protoView.mergeInfo.embeddedViewCount + 1));
  15750. }
  15751. return view;
  15752. };
  15753. /** @internal */
  15754. AppViewManager_.prototype._destroyPooledView = function (view) {
  15755. var wasReturned = this._viewPool.returnView(view);
  15756. if (!wasReturned) {
  15757. this._viewListener.onViewDestroyed(view);
  15758. this._renderer.destroyView(view.render);
  15759. }
  15760. };
  15761. /** @internal */
  15762. AppViewManager_.prototype._destroyViewInContainer = function (parentView, boundElementIndex, index) {
  15763. var viewContainer = parentView.viewContainers[boundElementIndex];
  15764. var view = viewContainer.views[index];
  15765. this._viewDehydrateRecurse(view);
  15766. this._utils.detachViewInContainer(parentView, boundElementIndex, index);
  15767. if (view.viewOffset > 0) {
  15768. // Case 1: a view that is part of another view.
  15769. // Just detach the fragment
  15770. this._renderer.detachFragment(view.renderFragment);
  15771. }
  15772. else {
  15773. // Case 2: a view that is not part of another view.
  15774. // dehydrate and destroy it.
  15775. this._renderer.dehydrateView(view.render);
  15776. this._renderer.detachFragment(view.renderFragment);
  15777. this._destroyPooledView(view);
  15778. }
  15779. };
  15780. /** @internal */
  15781. AppViewManager_.prototype._viewDehydrateRecurse = function (view) {
  15782. if (view.hydrated()) {
  15783. this._utils.dehydrateView(view);
  15784. }
  15785. var viewContainers = view.viewContainers;
  15786. var startViewOffset = view.viewOffset;
  15787. var endViewOffset = view.viewOffset + view.proto.mergeInfo.viewCount - 1;
  15788. var elementOffset = view.elementOffset;
  15789. for (var viewIdx = startViewOffset; viewIdx <= endViewOffset; viewIdx++) {
  15790. var currView = view.views[viewIdx];
  15791. for (var binderIdx = 0; binderIdx < currView.proto.elementBinders.length; binderIdx++, elementOffset++) {
  15792. var vc = viewContainers[elementOffset];
  15793. if (lang_1.isPresent(vc)) {
  15794. for (var j = vc.views.length - 1; j >= 0; j--) {
  15795. this._destroyViewInContainer(currView, elementOffset, j);
  15796. }
  15797. }
  15798. }
  15799. }
  15800. };
  15801. AppViewManager_ = __decorate([
  15802. di_1.Injectable(),
  15803. __param(4, di_1.Inject(di_1.forwardRef(function () { return proto_view_factory_1.ProtoViewFactory; }))),
  15804. __metadata('design:paramtypes', [view_pool_1.AppViewPool, view_listener_1.AppViewListener, view_manager_utils_1.AppViewManagerUtils, api_1.Renderer, Object])
  15805. ], AppViewManager_);
  15806. return AppViewManager_;
  15807. })(AppViewManager);
  15808. exports.AppViewManager_ = AppViewManager_;
  15809. /***/ },
  15810. /* 82 */
  15811. /***/ function(module, exports, __webpack_require__) {
  15812. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  15813. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  15814. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  15815. 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;
  15816. return c > 3 && r && Object.defineProperty(target, key, r), r;
  15817. };
  15818. var __metadata = (this && this.__metadata) || function (k, v) {
  15819. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  15820. };
  15821. var di_1 = __webpack_require__(6);
  15822. var collection_1 = __webpack_require__(12);
  15823. var eli = __webpack_require__(80);
  15824. var lang_1 = __webpack_require__(5);
  15825. var viewModule = __webpack_require__(76);
  15826. var element_ref_1 = __webpack_require__(83);
  15827. var template_ref_1 = __webpack_require__(84);
  15828. var pipes_1 = __webpack_require__(74);
  15829. var AppViewManagerUtils = (function () {
  15830. function AppViewManagerUtils() {
  15831. }
  15832. AppViewManagerUtils.prototype.getComponentInstance = function (parentView, boundElementIndex) {
  15833. var eli = parentView.elementInjectors[boundElementIndex];
  15834. return eli.getComponent();
  15835. };
  15836. AppViewManagerUtils.prototype.createView = function (mergedParentViewProto, renderViewWithFragments, viewManager, renderer) {
  15837. var renderFragments = renderViewWithFragments.fragmentRefs;
  15838. var renderView = renderViewWithFragments.viewRef;
  15839. var elementCount = mergedParentViewProto.mergeInfo.elementCount;
  15840. var viewCount = mergedParentViewProto.mergeInfo.viewCount;
  15841. var elementRefs = collection_1.ListWrapper.createFixedSize(elementCount);
  15842. var viewContainers = collection_1.ListWrapper.createFixedSize(elementCount);
  15843. var preBuiltObjects = collection_1.ListWrapper.createFixedSize(elementCount);
  15844. var elementInjectors = collection_1.ListWrapper.createFixedSize(elementCount);
  15845. var views = collection_1.ListWrapper.createFixedSize(viewCount);
  15846. var elementOffset = 0;
  15847. var textOffset = 0;
  15848. var fragmentIdx = 0;
  15849. var containerElementIndicesByViewIndex = collection_1.ListWrapper.createFixedSize(viewCount);
  15850. for (var viewOffset = 0; viewOffset < viewCount; viewOffset++) {
  15851. var containerElementIndex = containerElementIndicesByViewIndex[viewOffset];
  15852. var containerElementInjector = lang_1.isPresent(containerElementIndex) ? elementInjectors[containerElementIndex] : null;
  15853. var parentView = lang_1.isPresent(containerElementInjector) ? preBuiltObjects[containerElementIndex].view : null;
  15854. var protoView = lang_1.isPresent(containerElementIndex) ?
  15855. parentView.proto.elementBinders[containerElementIndex - parentView.elementOffset]
  15856. .nestedProtoView :
  15857. mergedParentViewProto;
  15858. var renderFragment = null;
  15859. if (viewOffset === 0 || protoView.type === viewModule.ViewType.EMBEDDED) {
  15860. renderFragment = renderFragments[fragmentIdx++];
  15861. }
  15862. var currentView = new viewModule.AppView(renderer, protoView, viewOffset, elementOffset, textOffset, protoView.protoLocals, renderView, renderFragment, containerElementInjector);
  15863. views[viewOffset] = currentView;
  15864. if (lang_1.isPresent(containerElementIndex)) {
  15865. preBuiltObjects[containerElementIndex].nestedView = currentView;
  15866. }
  15867. var rootElementInjectors = [];
  15868. var nestedViewOffset = viewOffset + 1;
  15869. for (var binderIdx = 0; binderIdx < protoView.elementBinders.length; binderIdx++) {
  15870. var binder = protoView.elementBinders[binderIdx];
  15871. var boundElementIndex = elementOffset + binderIdx;
  15872. var elementInjector = null;
  15873. if (lang_1.isPresent(binder.nestedProtoView) && binder.nestedProtoView.isMergable) {
  15874. containerElementIndicesByViewIndex[nestedViewOffset] = boundElementIndex;
  15875. nestedViewOffset += binder.nestedProtoView.mergeInfo.viewCount;
  15876. }
  15877. // elementInjectors and rootElementInjectors
  15878. var protoElementInjector = binder.protoElementInjector;
  15879. if (lang_1.isPresent(protoElementInjector)) {
  15880. if (lang_1.isPresent(protoElementInjector.parent)) {
  15881. var parentElementInjector = elementInjectors[elementOffset + protoElementInjector.parent.index];
  15882. elementInjector = protoElementInjector.instantiate(parentElementInjector);
  15883. }
  15884. else {
  15885. elementInjector = protoElementInjector.instantiate(null);
  15886. rootElementInjectors.push(elementInjector);
  15887. }
  15888. }
  15889. elementInjectors[boundElementIndex] = elementInjector;
  15890. // elementRefs
  15891. var el = new element_ref_1.ElementRef_(currentView.ref, boundElementIndex, renderer);
  15892. elementRefs[el.boundElementIndex] = el;
  15893. // preBuiltObjects
  15894. if (lang_1.isPresent(elementInjector)) {
  15895. var templateRef = lang_1.isPresent(binder.nestedProtoView) &&
  15896. binder.nestedProtoView.type === viewModule.ViewType.EMBEDDED ?
  15897. new template_ref_1.TemplateRef_(el) :
  15898. null;
  15899. preBuiltObjects[boundElementIndex] =
  15900. new eli.PreBuiltObjects(viewManager, currentView, el, templateRef);
  15901. }
  15902. }
  15903. currentView.init(protoView.changeDetectorFactory(currentView), elementInjectors, rootElementInjectors, preBuiltObjects, views, elementRefs, viewContainers);
  15904. if (lang_1.isPresent(parentView) && protoView.type === viewModule.ViewType.COMPONENT) {
  15905. parentView.changeDetector.addViewChild(currentView.changeDetector);
  15906. }
  15907. elementOffset += protoView.elementBinders.length;
  15908. textOffset += protoView.textBindingCount;
  15909. }
  15910. return views[0];
  15911. };
  15912. AppViewManagerUtils.prototype.hydrateRootHostView = function (hostView, injector) {
  15913. this._hydrateView(hostView, injector, null, new Object(), null);
  15914. };
  15915. // Misnomer: this method is attaching next to the view container.
  15916. AppViewManagerUtils.prototype.attachViewInContainer = function (parentView, boundElementIndex, contextView, contextBoundElementIndex, index, view) {
  15917. if (lang_1.isBlank(contextView)) {
  15918. contextView = parentView;
  15919. contextBoundElementIndex = boundElementIndex;
  15920. }
  15921. parentView.changeDetector.addContentChild(view.changeDetector);
  15922. var viewContainer = parentView.viewContainers[boundElementIndex];
  15923. if (lang_1.isBlank(viewContainer)) {
  15924. viewContainer = new viewModule.AppViewContainer();
  15925. parentView.viewContainers[boundElementIndex] = viewContainer;
  15926. }
  15927. collection_1.ListWrapper.insert(viewContainer.views, index, view);
  15928. var elementInjector = contextView.elementInjectors[contextBoundElementIndex];
  15929. for (var i = view.rootElementInjectors.length - 1; i >= 0; i--) {
  15930. if (lang_1.isPresent(elementInjector.parent)) {
  15931. view.rootElementInjectors[i].link(elementInjector.parent);
  15932. }
  15933. }
  15934. elementInjector.traverseAndSetQueriesAsDirty();
  15935. };
  15936. AppViewManagerUtils.prototype.detachViewInContainer = function (parentView, boundElementIndex, index) {
  15937. var viewContainer = parentView.viewContainers[boundElementIndex];
  15938. var view = viewContainer.views[index];
  15939. parentView.elementInjectors[boundElementIndex].traverseAndSetQueriesAsDirty();
  15940. view.changeDetector.remove();
  15941. collection_1.ListWrapper.removeAt(viewContainer.views, index);
  15942. for (var i = 0; i < view.rootElementInjectors.length; ++i) {
  15943. var inj = view.rootElementInjectors[i];
  15944. inj.unlink();
  15945. }
  15946. };
  15947. AppViewManagerUtils.prototype.hydrateViewInContainer = function (parentView, boundElementIndex, contextView, contextBoundElementIndex, index, imperativelyCreatedProviders) {
  15948. if (lang_1.isBlank(contextView)) {
  15949. contextView = parentView;
  15950. contextBoundElementIndex = boundElementIndex;
  15951. }
  15952. var viewContainer = parentView.viewContainers[boundElementIndex];
  15953. var view = viewContainer.views[index];
  15954. var elementInjector = contextView.elementInjectors[contextBoundElementIndex];
  15955. var injector = lang_1.isPresent(imperativelyCreatedProviders) ?
  15956. di_1.Injector.fromResolvedProviders(imperativelyCreatedProviders) :
  15957. null;
  15958. this._hydrateView(view, injector, elementInjector.getHost(), contextView.context, contextView.locals);
  15959. };
  15960. /** @internal */
  15961. AppViewManagerUtils.prototype._hydrateView = function (initView, imperativelyCreatedInjector, hostElementInjector, context, parentLocals) {
  15962. var viewIdx = initView.viewOffset;
  15963. var endViewOffset = viewIdx + initView.proto.mergeInfo.viewCount - 1;
  15964. while (viewIdx <= endViewOffset) {
  15965. var currView = initView.views[viewIdx];
  15966. var currProtoView = currView.proto;
  15967. if (currView !== initView && currView.proto.type === viewModule.ViewType.EMBEDDED) {
  15968. // Don't hydrate components of embedded fragment views.
  15969. viewIdx += currView.proto.mergeInfo.viewCount;
  15970. }
  15971. else {
  15972. if (currView !== initView) {
  15973. // hydrate a nested component view
  15974. imperativelyCreatedInjector = null;
  15975. parentLocals = null;
  15976. hostElementInjector = currView.containerElementInjector;
  15977. context = hostElementInjector.getComponent();
  15978. }
  15979. currView.context = context;
  15980. currView.locals.parent = parentLocals;
  15981. var binders = currProtoView.elementBinders;
  15982. for (var binderIdx = 0; binderIdx < binders.length; binderIdx++) {
  15983. var boundElementIndex = binderIdx + currView.elementOffset;
  15984. var elementInjector = initView.elementInjectors[boundElementIndex];
  15985. if (lang_1.isPresent(elementInjector)) {
  15986. elementInjector.hydrate(imperativelyCreatedInjector, hostElementInjector, currView.preBuiltObjects[boundElementIndex]);
  15987. this._populateViewLocals(currView, elementInjector, boundElementIndex);
  15988. this._setUpEventEmitters(currView, elementInjector, boundElementIndex);
  15989. }
  15990. }
  15991. var pipes = lang_1.isPresent(hostElementInjector) ?
  15992. new pipes_1.Pipes(currView.proto.pipes, hostElementInjector.getInjector()) :
  15993. null;
  15994. currView.changeDetector.hydrate(currView.context, currView.locals, currView, pipes);
  15995. viewIdx++;
  15996. }
  15997. }
  15998. };
  15999. /** @internal */
  16000. AppViewManagerUtils.prototype._populateViewLocals = function (view, elementInjector, boundElementIdx) {
  16001. if (lang_1.isPresent(elementInjector.getDirectiveVariableBindings())) {
  16002. elementInjector.getDirectiveVariableBindings().forEach(function (directiveIndex, name) {
  16003. if (lang_1.isBlank(directiveIndex)) {
  16004. view.locals.set(name, view.elementRefs[boundElementIdx].nativeElement);
  16005. }
  16006. else {
  16007. view.locals.set(name, elementInjector.getDirectiveAtIndex(directiveIndex));
  16008. }
  16009. });
  16010. }
  16011. };
  16012. /** @internal */
  16013. AppViewManagerUtils.prototype._setUpEventEmitters = function (view, elementInjector, boundElementIndex) {
  16014. var emitters = elementInjector.getEventEmitterAccessors();
  16015. for (var directiveIndex = 0; directiveIndex < emitters.length; ++directiveIndex) {
  16016. var directiveEmitters = emitters[directiveIndex];
  16017. var directive = elementInjector.getDirectiveAtIndex(directiveIndex);
  16018. for (var eventIndex = 0; eventIndex < directiveEmitters.length; ++eventIndex) {
  16019. var eventEmitterAccessor = directiveEmitters[eventIndex];
  16020. eventEmitterAccessor.subscribe(view, boundElementIndex, directive);
  16021. }
  16022. }
  16023. };
  16024. AppViewManagerUtils.prototype.dehydrateView = function (initView) {
  16025. var endViewOffset = initView.viewOffset + initView.proto.mergeInfo.viewCount - 1;
  16026. for (var viewIdx = initView.viewOffset; viewIdx <= endViewOffset; viewIdx++) {
  16027. var currView = initView.views[viewIdx];
  16028. if (currView.hydrated()) {
  16029. if (lang_1.isPresent(currView.locals)) {
  16030. currView.locals.clearValues();
  16031. }
  16032. currView.context = null;
  16033. currView.changeDetector.dehydrate();
  16034. var binders = currView.proto.elementBinders;
  16035. for (var binderIdx = 0; binderIdx < binders.length; binderIdx++) {
  16036. var eli = initView.elementInjectors[currView.elementOffset + binderIdx];
  16037. if (lang_1.isPresent(eli)) {
  16038. eli.dehydrate();
  16039. }
  16040. }
  16041. }
  16042. }
  16043. };
  16044. AppViewManagerUtils = __decorate([
  16045. di_1.Injectable(),
  16046. __metadata('design:paramtypes', [])
  16047. ], AppViewManagerUtils);
  16048. return AppViewManagerUtils;
  16049. })();
  16050. exports.AppViewManagerUtils = AppViewManagerUtils;
  16051. /***/ },
  16052. /* 83 */
  16053. /***/ function(module, exports, __webpack_require__) {
  16054. var __extends = (this && this.__extends) || function (d, b) {
  16055. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  16056. function __() { this.constructor = d; }
  16057. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  16058. };
  16059. var exceptions_1 = __webpack_require__(14);
  16060. /**
  16061. * Represents a location in a View that has an injection, change-detection and render context
  16062. * associated with it.
  16063. *
  16064. * An `ElementRef` is created for each element in the Template that contains a Directive, Component
  16065. * or data-binding.
  16066. *
  16067. * An `ElementRef` is backed by a render-specific element. In the browser, this is usually a DOM
  16068. * element.
  16069. */
  16070. var ElementRef = (function () {
  16071. function ElementRef() {
  16072. }
  16073. Object.defineProperty(ElementRef.prototype, "nativeElement", {
  16074. /**
  16075. * The underlying native element or `null` if direct access to native elements is not supported
  16076. * (e.g. when the application runs in a web worker).
  16077. *
  16078. * <div class="callout is-critical">
  16079. * <header>Use with caution</header>
  16080. * <p>
  16081. * Use this API as the last resort when direct access to DOM is needed. Use templating and
  16082. * data-binding provided by Angular instead. Alternatively you take a look at {@link Renderer}
  16083. * which provides API that can safely be used even when direct access to native elements is not
  16084. * supported.
  16085. * </p>
  16086. * <p>
  16087. * Relying on direct DOM access creates tight coupling between your application and rendering
  16088. * layers which will make it impossible to separate the two and deploy your application into a
  16089. * web worker.
  16090. * </p>
  16091. * </div>
  16092. */
  16093. get: function () { return exceptions_1.unimplemented(); },
  16094. enumerable: true,
  16095. configurable: true
  16096. });
  16097. ;
  16098. Object.defineProperty(ElementRef.prototype, "renderView", {
  16099. get: function () { return exceptions_1.unimplemented(); },
  16100. enumerable: true,
  16101. configurable: true
  16102. });
  16103. return ElementRef;
  16104. })();
  16105. exports.ElementRef = ElementRef;
  16106. var ElementRef_ = (function (_super) {
  16107. __extends(ElementRef_, _super);
  16108. function ElementRef_(parentView,
  16109. /**
  16110. * Index of the element inside the {@link ViewRef}.
  16111. *
  16112. * This is used internally by the Angular framework to locate elements.
  16113. */
  16114. boundElementIndex, _renderer) {
  16115. _super.call(this);
  16116. this.parentView = parentView;
  16117. this.boundElementIndex = boundElementIndex;
  16118. this._renderer = _renderer;
  16119. }
  16120. Object.defineProperty(ElementRef_.prototype, "renderView", {
  16121. get: function () { return this.parentView.render; },
  16122. set: function (value) { exceptions_1.unimplemented(); },
  16123. enumerable: true,
  16124. configurable: true
  16125. });
  16126. Object.defineProperty(ElementRef_.prototype, "nativeElement", {
  16127. get: function () { return this._renderer.getNativeElementSync(this); },
  16128. enumerable: true,
  16129. configurable: true
  16130. });
  16131. return ElementRef_;
  16132. })(ElementRef);
  16133. exports.ElementRef_ = ElementRef_;
  16134. /***/ },
  16135. /* 84 */
  16136. /***/ function(module, exports, __webpack_require__) {
  16137. var __extends = (this && this.__extends) || function (d, b) {
  16138. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  16139. function __() { this.constructor = d; }
  16140. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  16141. };
  16142. var view_ref_1 = __webpack_require__(77);
  16143. /**
  16144. * Represents an Embedded Template that can be used to instantiate Embedded Views.
  16145. *
  16146. * You can access a `TemplateRef`, in two ways. Via a directive placed on a `<template>` element (or
  16147. * directive prefixed with `*`) and have the `TemplateRef` for this Embedded View injected into the
  16148. * constructor of the directive using the `TemplateRef` Token. Alternatively you can query for the
  16149. * `TemplateRef` from a Component or a Directive via {@link Query}.
  16150. *
  16151. * To instantiate Embedded Views based on a Template, use
  16152. * {@link ViewContainerRef#createEmbeddedView}, which will create the View and attach it to the
  16153. * View Container.
  16154. */
  16155. var TemplateRef = (function () {
  16156. function TemplateRef() {
  16157. }
  16158. return TemplateRef;
  16159. })();
  16160. exports.TemplateRef = TemplateRef;
  16161. var TemplateRef_ = (function (_super) {
  16162. __extends(TemplateRef_, _super);
  16163. function TemplateRef_(elementRef) {
  16164. _super.call(this);
  16165. this.elementRef = elementRef;
  16166. }
  16167. TemplateRef_.prototype._getProtoView = function () {
  16168. var elementRef = this.elementRef;
  16169. var parentView = view_ref_1.internalView(elementRef.parentView);
  16170. return parentView.proto.elementBinders[elementRef.boundElementIndex - parentView.elementOffset]
  16171. .nestedProtoView;
  16172. };
  16173. Object.defineProperty(TemplateRef_.prototype, "protoViewRef", {
  16174. /**
  16175. * Reference to the ProtoView used for creating Embedded Views that are based on the compiled
  16176. * Embedded Template.
  16177. */
  16178. get: function () { return this._getProtoView().ref; },
  16179. enumerable: true,
  16180. configurable: true
  16181. });
  16182. TemplateRef_.prototype.hasLocal = function (name) {
  16183. return this._getProtoView().templateVariableBindings.has(name);
  16184. };
  16185. return TemplateRef_;
  16186. })(TemplateRef);
  16187. exports.TemplateRef_ = TemplateRef_;
  16188. /***/ },
  16189. /* 85 */
  16190. /***/ function(module, exports, __webpack_require__) {
  16191. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16192. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16193. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16194. 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;
  16195. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16196. };
  16197. var __metadata = (this && this.__metadata) || function (k, v) {
  16198. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16199. };
  16200. var __param = (this && this.__param) || function (paramIndex, decorator) {
  16201. return function (target, key) { decorator(target, key, paramIndex); }
  16202. };
  16203. var di_1 = __webpack_require__(6);
  16204. var lang_1 = __webpack_require__(5);
  16205. var collection_1 = __webpack_require__(12);
  16206. exports.APP_VIEW_POOL_CAPACITY = lang_1.CONST_EXPR(new di_1.OpaqueToken('AppViewPool.viewPoolCapacity'));
  16207. var AppViewPool = (function () {
  16208. function AppViewPool(poolCapacityPerProtoView) {
  16209. /** @internal */
  16210. this._pooledViewsPerProtoView = new collection_1.Map();
  16211. this._poolCapacityPerProtoView = poolCapacityPerProtoView;
  16212. }
  16213. AppViewPool.prototype.getView = function (protoView) {
  16214. var pooledViews = this._pooledViewsPerProtoView.get(protoView);
  16215. if (lang_1.isPresent(pooledViews) && pooledViews.length > 0) {
  16216. return pooledViews.pop();
  16217. }
  16218. return null;
  16219. };
  16220. AppViewPool.prototype.returnView = function (view) {
  16221. var protoView = view.proto;
  16222. var pooledViews = this._pooledViewsPerProtoView.get(protoView);
  16223. if (lang_1.isBlank(pooledViews)) {
  16224. pooledViews = [];
  16225. this._pooledViewsPerProtoView.set(protoView, pooledViews);
  16226. }
  16227. var haveRemainingCapacity = pooledViews.length < this._poolCapacityPerProtoView;
  16228. if (haveRemainingCapacity) {
  16229. pooledViews.push(view);
  16230. }
  16231. return haveRemainingCapacity;
  16232. };
  16233. AppViewPool = __decorate([
  16234. di_1.Injectable(),
  16235. __param(0, di_1.Inject(exports.APP_VIEW_POOL_CAPACITY)),
  16236. __metadata('design:paramtypes', [Object])
  16237. ], AppViewPool);
  16238. return AppViewPool;
  16239. })();
  16240. exports.AppViewPool = AppViewPool;
  16241. /***/ },
  16242. /* 86 */
  16243. /***/ function(module, exports, __webpack_require__) {
  16244. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16245. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16246. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16247. 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;
  16248. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16249. };
  16250. var __metadata = (this && this.__metadata) || function (k, v) {
  16251. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16252. };
  16253. var di_1 = __webpack_require__(6);
  16254. /**
  16255. * Listener for view creation / destruction.
  16256. */
  16257. var AppViewListener = (function () {
  16258. function AppViewListener() {
  16259. }
  16260. AppViewListener.prototype.onViewCreated = function (view) { };
  16261. AppViewListener.prototype.onViewDestroyed = function (view) { };
  16262. AppViewListener = __decorate([
  16263. di_1.Injectable(),
  16264. __metadata('design:paramtypes', [])
  16265. ], AppViewListener);
  16266. return AppViewListener;
  16267. })();
  16268. exports.AppViewListener = AppViewListener;
  16269. /***/ },
  16270. /* 87 */
  16271. /***/ function(module, exports, __webpack_require__) {
  16272. var __extends = (this && this.__extends) || function (d, b) {
  16273. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  16274. function __() { this.constructor = d; }
  16275. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  16276. };
  16277. var collection_1 = __webpack_require__(12);
  16278. var exceptions_1 = __webpack_require__(14);
  16279. var lang_1 = __webpack_require__(5);
  16280. var view_ref_1 = __webpack_require__(77);
  16281. /**
  16282. * Represents a container where one or more Views can be attached.
  16283. *
  16284. * The container can contain two kinds of Views. Host Views, created by instantiating a
  16285. * {@link Component} via {@link #createHostView}, and Embedded Views, created by instantiating an
  16286. * {@link TemplateRef Embedded Template} via {@link #createEmbeddedView}.
  16287. *
  16288. * The location of the View Container within the containing View is specified by the Anchor
  16289. * `element`. Each View Container can have only one Anchor Element and each Anchor Element can only
  16290. * have a single View Container.
  16291. *
  16292. * Root elements of Views attached to this container become siblings of the Anchor Element in
  16293. * the Rendered View.
  16294. *
  16295. * To access a `ViewContainerRef` of an Element, you can either place a {@link Directive} injected
  16296. * with `ViewContainerRef` on the Element, or you obtain it via
  16297. * {@link AppViewManager#getViewContainer}.
  16298. *
  16299. * <!-- TODO(i): we are also considering ElementRef#viewContainer api -->
  16300. */
  16301. var ViewContainerRef = (function () {
  16302. function ViewContainerRef() {
  16303. }
  16304. /**
  16305. * Destroys all Views in this container.
  16306. */
  16307. ViewContainerRef.prototype.clear = function () {
  16308. for (var i = this.length - 1; i >= 0; i--) {
  16309. this.remove(i);
  16310. }
  16311. };
  16312. Object.defineProperty(ViewContainerRef.prototype, "length", {
  16313. /**
  16314. * Returns the number of Views currently attached to this container.
  16315. */
  16316. get: function () { return exceptions_1.unimplemented(); },
  16317. enumerable: true,
  16318. configurable: true
  16319. });
  16320. ;
  16321. return ViewContainerRef;
  16322. })();
  16323. exports.ViewContainerRef = ViewContainerRef;
  16324. var ViewContainerRef_ = (function (_super) {
  16325. __extends(ViewContainerRef_, _super);
  16326. function ViewContainerRef_(viewManager, element) {
  16327. _super.call(this);
  16328. this.viewManager = viewManager;
  16329. this.element = element;
  16330. }
  16331. ViewContainerRef_.prototype._getViews = function () {
  16332. var element = this.element;
  16333. var vc = view_ref_1.internalView(element.parentView).viewContainers[element.boundElementIndex];
  16334. return lang_1.isPresent(vc) ? vc.views : [];
  16335. };
  16336. ViewContainerRef_.prototype.get = function (index) { return this._getViews()[index].ref; };
  16337. Object.defineProperty(ViewContainerRef_.prototype, "length", {
  16338. get: function () { return this._getViews().length; },
  16339. enumerable: true,
  16340. configurable: true
  16341. });
  16342. // TODO(rado): profile and decide whether bounds checks should be added
  16343. // to the methods below.
  16344. ViewContainerRef_.prototype.createEmbeddedView = function (templateRef, index) {
  16345. if (index === void 0) { index = -1; }
  16346. if (index == -1)
  16347. index = this.length;
  16348. return this.viewManager.createEmbeddedViewInContainer(this.element, index, templateRef);
  16349. };
  16350. ViewContainerRef_.prototype.createHostView = function (protoViewRef, index, dynamicallyCreatedProviders) {
  16351. if (protoViewRef === void 0) { protoViewRef = null; }
  16352. if (index === void 0) { index = -1; }
  16353. if (dynamicallyCreatedProviders === void 0) { dynamicallyCreatedProviders = null; }
  16354. if (index == -1)
  16355. index = this.length;
  16356. return this.viewManager.createHostViewInContainer(this.element, index, protoViewRef, dynamicallyCreatedProviders);
  16357. };
  16358. // TODO(i): refactor insert+remove into move
  16359. ViewContainerRef_.prototype.insert = function (viewRef, index) {
  16360. if (index === void 0) { index = -1; }
  16361. if (index == -1)
  16362. index = this.length;
  16363. return this.viewManager.attachViewInContainer(this.element, index, viewRef);
  16364. };
  16365. ViewContainerRef_.prototype.indexOf = function (viewRef) {
  16366. return collection_1.ListWrapper.indexOf(this._getViews(), view_ref_1.internalView(viewRef));
  16367. };
  16368. // TODO(i): rename to destroy
  16369. ViewContainerRef_.prototype.remove = function (index) {
  16370. if (index === void 0) { index = -1; }
  16371. if (index == -1)
  16372. index = this.length - 1;
  16373. this.viewManager.destroyViewInContainer(this.element, index);
  16374. // view is intentionally not returned to the client.
  16375. };
  16376. // TODO(i): refactor insert+remove into move
  16377. ViewContainerRef_.prototype.detach = function (index) {
  16378. if (index === void 0) { index = -1; }
  16379. if (index == -1)
  16380. index = this.length - 1;
  16381. return this.viewManager.detachViewInContainer(this.element, index);
  16382. };
  16383. return ViewContainerRef_;
  16384. })(ViewContainerRef);
  16385. exports.ViewContainerRef_ = ViewContainerRef_;
  16386. /***/ },
  16387. /* 88 */
  16388. /***/ function(module, exports, __webpack_require__) {
  16389. var lang_1 = __webpack_require__(5);
  16390. var interfaces_1 = __webpack_require__(89);
  16391. function hasLifecycleHook(lcInterface, token) {
  16392. if (!(token instanceof lang_1.Type))
  16393. return false;
  16394. var proto = token.prototype;
  16395. switch (lcInterface) {
  16396. case interfaces_1.LifecycleHooks.AfterContentInit:
  16397. return !!proto.ngAfterContentInit;
  16398. case interfaces_1.LifecycleHooks.AfterContentChecked:
  16399. return !!proto.ngAfterContentChecked;
  16400. case interfaces_1.LifecycleHooks.AfterViewInit:
  16401. return !!proto.ngAfterViewInit;
  16402. case interfaces_1.LifecycleHooks.AfterViewChecked:
  16403. return !!proto.ngAfterViewChecked;
  16404. case interfaces_1.LifecycleHooks.OnChanges:
  16405. return !!proto.ngOnChanges;
  16406. case interfaces_1.LifecycleHooks.DoCheck:
  16407. return !!proto.ngDoCheck;
  16408. case interfaces_1.LifecycleHooks.OnDestroy:
  16409. return !!proto.ngOnDestroy;
  16410. case interfaces_1.LifecycleHooks.OnInit:
  16411. return !!proto.ngOnInit;
  16412. default:
  16413. return false;
  16414. }
  16415. }
  16416. exports.hasLifecycleHook = hasLifecycleHook;
  16417. /***/ },
  16418. /* 89 */
  16419. /***/ function(module, exports) {
  16420. (function (LifecycleHooks) {
  16421. LifecycleHooks[LifecycleHooks["OnInit"] = 0] = "OnInit";
  16422. LifecycleHooks[LifecycleHooks["OnDestroy"] = 1] = "OnDestroy";
  16423. LifecycleHooks[LifecycleHooks["DoCheck"] = 2] = "DoCheck";
  16424. LifecycleHooks[LifecycleHooks["OnChanges"] = 3] = "OnChanges";
  16425. LifecycleHooks[LifecycleHooks["AfterContentInit"] = 4] = "AfterContentInit";
  16426. LifecycleHooks[LifecycleHooks["AfterContentChecked"] = 5] = "AfterContentChecked";
  16427. LifecycleHooks[LifecycleHooks["AfterViewInit"] = 6] = "AfterViewInit";
  16428. LifecycleHooks[LifecycleHooks["AfterViewChecked"] = 7] = "AfterViewChecked";
  16429. })(exports.LifecycleHooks || (exports.LifecycleHooks = {}));
  16430. var LifecycleHooks = exports.LifecycleHooks;
  16431. /**
  16432. * @internal
  16433. */
  16434. exports.LIFECYCLE_HOOKS_VALUES = [
  16435. LifecycleHooks.OnInit,
  16436. LifecycleHooks.OnDestroy,
  16437. LifecycleHooks.DoCheck,
  16438. LifecycleHooks.OnChanges,
  16439. LifecycleHooks.AfterContentInit,
  16440. LifecycleHooks.AfterContentChecked,
  16441. LifecycleHooks.AfterViewInit,
  16442. LifecycleHooks.AfterViewChecked
  16443. ];
  16444. /***/ },
  16445. /* 90 */
  16446. /***/ function(module, exports, __webpack_require__) {
  16447. var collection_1 = __webpack_require__(12);
  16448. var lang_1 = __webpack_require__(5);
  16449. var async_1 = __webpack_require__(60);
  16450. /**
  16451. * An unmodifiable list of items that Angular keeps up to date when the state
  16452. * of the application changes.
  16453. *
  16454. * The type of object that {@link QueryMetadata} and {@link ViewQueryMetadata} provide.
  16455. *
  16456. * Implements an iterable interface, therefore it can be used in both ES6
  16457. * javascript `for (var i of items)` loops as well as in Angular templates with
  16458. * `*ngFor="#i of myList"`.
  16459. *
  16460. * Changes can be observed by subscribing to the changes `Observable`.
  16461. *
  16462. * NOTE: In the future this class will implement an `Observable` interface.
  16463. *
  16464. * ### Example ([live demo](http://plnkr.co/edit/RX8sJnQYl9FWuSCWme5z?p=preview))
  16465. * ```typescript
  16466. * @Component({...})
  16467. * class Container {
  16468. * constructor(@Query(Item) items: QueryList<Item>) {
  16469. * items.changes.subscribe(_ => console.log(items.length));
  16470. * }
  16471. * }
  16472. * ```
  16473. */
  16474. var QueryList = (function () {
  16475. function QueryList() {
  16476. this._results = [];
  16477. this._emitter = new async_1.EventEmitter();
  16478. }
  16479. Object.defineProperty(QueryList.prototype, "changes", {
  16480. get: function () { return this._emitter; },
  16481. enumerable: true,
  16482. configurable: true
  16483. });
  16484. Object.defineProperty(QueryList.prototype, "length", {
  16485. get: function () { return this._results.length; },
  16486. enumerable: true,
  16487. configurable: true
  16488. });
  16489. Object.defineProperty(QueryList.prototype, "first", {
  16490. get: function () { return collection_1.ListWrapper.first(this._results); },
  16491. enumerable: true,
  16492. configurable: true
  16493. });
  16494. Object.defineProperty(QueryList.prototype, "last", {
  16495. get: function () { return collection_1.ListWrapper.last(this._results); },
  16496. enumerable: true,
  16497. configurable: true
  16498. });
  16499. /**
  16500. * returns a new array with the passed in function applied to each element.
  16501. */
  16502. QueryList.prototype.map = function (fn) { return this._results.map(fn); };
  16503. /**
  16504. * returns a filtered array.
  16505. */
  16506. QueryList.prototype.filter = function (fn) { return this._results.filter(fn); };
  16507. /**
  16508. * returns a reduced value.
  16509. */
  16510. QueryList.prototype.reduce = function (fn, init) { return this._results.reduce(fn, init); };
  16511. /**
  16512. * converts QueryList into an array
  16513. */
  16514. QueryList.prototype.toArray = function () { return collection_1.ListWrapper.clone(this._results); };
  16515. QueryList.prototype[lang_1.getSymbolIterator()] = function () { return this._results[lang_1.getSymbolIterator()](); };
  16516. QueryList.prototype.toString = function () { return this._results.toString(); };
  16517. /**
  16518. * @internal
  16519. */
  16520. QueryList.prototype.reset = function (res) { this._results = res; };
  16521. /** @internal */
  16522. QueryList.prototype.notifyOnChanges = function () { this._emitter.emit(this); };
  16523. return QueryList;
  16524. })();
  16525. exports.QueryList = QueryList;
  16526. /***/ },
  16527. /* 91 */
  16528. /***/ function(module, exports) {
  16529. exports.EVENT_TARGET_SEPARATOR = ':';
  16530. var EventConfig = (function () {
  16531. function EventConfig(fieldName, eventName, isLongForm) {
  16532. this.fieldName = fieldName;
  16533. this.eventName = eventName;
  16534. this.isLongForm = isLongForm;
  16535. }
  16536. EventConfig.parse = function (eventConfig) {
  16537. var fieldName = eventConfig, eventName = eventConfig, isLongForm = false;
  16538. var separatorIdx = eventConfig.indexOf(exports.EVENT_TARGET_SEPARATOR);
  16539. if (separatorIdx > -1) {
  16540. // long format: 'fieldName: eventName'
  16541. fieldName = eventConfig.substring(0, separatorIdx).trim();
  16542. eventName = eventConfig.substring(separatorIdx + 1).trim();
  16543. isLongForm = true;
  16544. }
  16545. return new EventConfig(fieldName, eventName, isLongForm);
  16546. };
  16547. EventConfig.prototype.getFullName = function () {
  16548. return this.isLongForm ? "" + this.fieldName + exports.EVENT_TARGET_SEPARATOR + this.eventName :
  16549. this.eventName;
  16550. };
  16551. return EventConfig;
  16552. })();
  16553. exports.EventConfig = EventConfig;
  16554. /***/ },
  16555. /* 92 */
  16556. /***/ function(module, exports, __webpack_require__) {
  16557. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16558. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16559. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16560. 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;
  16561. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16562. };
  16563. var __metadata = (this && this.__metadata) || function (k, v) {
  16564. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16565. };
  16566. var di_1 = __webpack_require__(6);
  16567. var lang_1 = __webpack_require__(5);
  16568. var exceptions_1 = __webpack_require__(14);
  16569. var collection_1 = __webpack_require__(12);
  16570. var metadata_1 = __webpack_require__(3);
  16571. var reflection_1 = __webpack_require__(16);
  16572. function _isDirectiveMetadata(type) {
  16573. return type instanceof metadata_1.DirectiveMetadata;
  16574. }
  16575. /*
  16576. * Resolve a `Type` for {@link DirectiveMetadata}.
  16577. *
  16578. * This interface can be overridden by the application developer to create custom behavior.
  16579. *
  16580. * See {@link Compiler}
  16581. */
  16582. var DirectiveResolver = (function () {
  16583. function DirectiveResolver() {
  16584. }
  16585. /**
  16586. * Return {@link DirectiveMetadata} for a given `Type`.
  16587. */
  16588. DirectiveResolver.prototype.resolve = function (type) {
  16589. var typeMetadata = reflection_1.reflector.annotations(di_1.resolveForwardRef(type));
  16590. if (lang_1.isPresent(typeMetadata)) {
  16591. var metadata = typeMetadata.find(_isDirectiveMetadata);
  16592. if (lang_1.isPresent(metadata)) {
  16593. var propertyMetadata = reflection_1.reflector.propMetadata(type);
  16594. return this._mergeWithPropertyMetadata(metadata, propertyMetadata);
  16595. }
  16596. }
  16597. throw new exceptions_1.BaseException("No Directive annotation found on " + lang_1.stringify(type));
  16598. };
  16599. DirectiveResolver.prototype._mergeWithPropertyMetadata = function (dm, propertyMetadata) {
  16600. var inputs = [];
  16601. var outputs = [];
  16602. var host = {};
  16603. var queries = {};
  16604. collection_1.StringMapWrapper.forEach(propertyMetadata, function (metadata, propName) {
  16605. metadata.forEach(function (a) {
  16606. if (a instanceof metadata_1.InputMetadata) {
  16607. if (lang_1.isPresent(a.bindingPropertyName)) {
  16608. inputs.push(propName + ": " + a.bindingPropertyName);
  16609. }
  16610. else {
  16611. inputs.push(propName);
  16612. }
  16613. }
  16614. if (a instanceof metadata_1.OutputMetadata) {
  16615. if (lang_1.isPresent(a.bindingPropertyName)) {
  16616. outputs.push(propName + ": " + a.bindingPropertyName);
  16617. }
  16618. else {
  16619. outputs.push(propName);
  16620. }
  16621. }
  16622. if (a instanceof metadata_1.HostBindingMetadata) {
  16623. if (lang_1.isPresent(a.hostPropertyName)) {
  16624. host[("[" + a.hostPropertyName + "]")] = propName;
  16625. }
  16626. else {
  16627. host[("[" + propName + "]")] = propName;
  16628. }
  16629. }
  16630. if (a instanceof metadata_1.HostListenerMetadata) {
  16631. var args = lang_1.isPresent(a.args) ? a.args.join(', ') : '';
  16632. host[("(" + a.eventName + ")")] = propName + "(" + args + ")";
  16633. }
  16634. if (a instanceof metadata_1.ContentChildrenMetadata) {
  16635. queries[propName] = a;
  16636. }
  16637. if (a instanceof metadata_1.ViewChildrenMetadata) {
  16638. queries[propName] = a;
  16639. }
  16640. if (a instanceof metadata_1.ContentChildMetadata) {
  16641. queries[propName] = a;
  16642. }
  16643. if (a instanceof metadata_1.ViewChildMetadata) {
  16644. queries[propName] = a;
  16645. }
  16646. });
  16647. });
  16648. return this._merge(dm, inputs, outputs, host, queries);
  16649. };
  16650. DirectiveResolver.prototype._merge = function (dm, inputs, outputs, host, queries) {
  16651. var mergedInputs = lang_1.isPresent(dm.inputs) ? collection_1.ListWrapper.concat(dm.inputs, inputs) : inputs;
  16652. var mergedOutputs = lang_1.isPresent(dm.outputs) ? collection_1.ListWrapper.concat(dm.outputs, outputs) : outputs;
  16653. var mergedHost = lang_1.isPresent(dm.host) ? collection_1.StringMapWrapper.merge(dm.host, host) : host;
  16654. var mergedQueries = lang_1.isPresent(dm.queries) ? collection_1.StringMapWrapper.merge(dm.queries, queries) : queries;
  16655. if (dm instanceof metadata_1.ComponentMetadata) {
  16656. return new metadata_1.ComponentMetadata({
  16657. selector: dm.selector,
  16658. inputs: mergedInputs,
  16659. outputs: mergedOutputs,
  16660. host: mergedHost,
  16661. exportAs: dm.exportAs,
  16662. moduleId: dm.moduleId,
  16663. queries: mergedQueries,
  16664. changeDetection: dm.changeDetection,
  16665. providers: dm.providers,
  16666. viewProviders: dm.viewProviders
  16667. });
  16668. }
  16669. else {
  16670. return new metadata_1.DirectiveMetadata({
  16671. selector: dm.selector,
  16672. inputs: mergedInputs,
  16673. outputs: mergedOutputs,
  16674. host: mergedHost,
  16675. exportAs: dm.exportAs,
  16676. queries: mergedQueries,
  16677. providers: dm.providers
  16678. });
  16679. }
  16680. };
  16681. DirectiveResolver = __decorate([
  16682. di_1.Injectable(),
  16683. __metadata('design:paramtypes', [])
  16684. ], DirectiveResolver);
  16685. return DirectiveResolver;
  16686. })();
  16687. exports.DirectiveResolver = DirectiveResolver;
  16688. /***/ },
  16689. /* 93 */
  16690. /***/ function(module, exports, __webpack_require__) {
  16691. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16692. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16693. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16694. 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;
  16695. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16696. };
  16697. var __metadata = (this && this.__metadata) || function (k, v) {
  16698. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16699. };
  16700. var di_1 = __webpack_require__(6);
  16701. var view_1 = __webpack_require__(56);
  16702. var directives_1 = __webpack_require__(23);
  16703. var lang_1 = __webpack_require__(5);
  16704. var exceptions_1 = __webpack_require__(14);
  16705. var collection_1 = __webpack_require__(12);
  16706. var reflection_1 = __webpack_require__(16);
  16707. /**
  16708. * Resolves types to {@link ViewMetadata}.
  16709. */
  16710. var ViewResolver = (function () {
  16711. function ViewResolver() {
  16712. /** @internal */
  16713. this._cache = new collection_1.Map();
  16714. }
  16715. ViewResolver.prototype.resolve = function (component) {
  16716. var view = this._cache.get(component);
  16717. if (lang_1.isBlank(view)) {
  16718. view = this._resolve(component);
  16719. this._cache.set(component, view);
  16720. }
  16721. return view;
  16722. };
  16723. /** @internal */
  16724. ViewResolver.prototype._resolve = function (component) {
  16725. var compMeta;
  16726. var viewMeta;
  16727. reflection_1.reflector.annotations(component).forEach(function (m) {
  16728. if (m instanceof view_1.ViewMetadata) {
  16729. viewMeta = m;
  16730. }
  16731. if (m instanceof directives_1.ComponentMetadata) {
  16732. compMeta = m;
  16733. }
  16734. });
  16735. if (lang_1.isPresent(compMeta)) {
  16736. if (lang_1.isBlank(compMeta.template) && lang_1.isBlank(compMeta.templateUrl) && lang_1.isBlank(viewMeta)) {
  16737. throw new exceptions_1.BaseException("Component '" + lang_1.stringify(component) + "' must have either 'template', 'templateUrl', or '@View' set.");
  16738. }
  16739. else if (lang_1.isPresent(compMeta.template) && lang_1.isPresent(viewMeta)) {
  16740. this._throwMixingViewAndComponent("template", component);
  16741. }
  16742. else if (lang_1.isPresent(compMeta.templateUrl) && lang_1.isPresent(viewMeta)) {
  16743. this._throwMixingViewAndComponent("templateUrl", component);
  16744. }
  16745. else if (lang_1.isPresent(compMeta.directives) && lang_1.isPresent(viewMeta)) {
  16746. this._throwMixingViewAndComponent("directives", component);
  16747. }
  16748. else if (lang_1.isPresent(compMeta.pipes) && lang_1.isPresent(viewMeta)) {
  16749. this._throwMixingViewAndComponent("pipes", component);
  16750. }
  16751. else if (lang_1.isPresent(compMeta.encapsulation) && lang_1.isPresent(viewMeta)) {
  16752. this._throwMixingViewAndComponent("encapsulation", component);
  16753. }
  16754. else if (lang_1.isPresent(compMeta.styles) && lang_1.isPresent(viewMeta)) {
  16755. this._throwMixingViewAndComponent("styles", component);
  16756. }
  16757. else if (lang_1.isPresent(compMeta.styleUrls) && lang_1.isPresent(viewMeta)) {
  16758. this._throwMixingViewAndComponent("styleUrls", component);
  16759. }
  16760. else if (lang_1.isPresent(viewMeta)) {
  16761. return viewMeta;
  16762. }
  16763. else {
  16764. return new view_1.ViewMetadata({
  16765. templateUrl: compMeta.templateUrl,
  16766. template: compMeta.template,
  16767. directives: compMeta.directives,
  16768. pipes: compMeta.pipes,
  16769. encapsulation: compMeta.encapsulation,
  16770. styles: compMeta.styles,
  16771. styleUrls: compMeta.styleUrls
  16772. });
  16773. }
  16774. }
  16775. else {
  16776. if (lang_1.isBlank(viewMeta)) {
  16777. throw new exceptions_1.BaseException("No View decorator found on component '" + lang_1.stringify(component) + "'");
  16778. }
  16779. else {
  16780. return viewMeta;
  16781. }
  16782. }
  16783. return null;
  16784. };
  16785. /** @internal */
  16786. ViewResolver.prototype._throwMixingViewAndComponent = function (propertyName, component) {
  16787. throw new exceptions_1.BaseException("Component '" + lang_1.stringify(component) + "' cannot have both '" + propertyName + "' and '@View' set at the same time\"");
  16788. };
  16789. ViewResolver = __decorate([
  16790. di_1.Injectable(),
  16791. __metadata('design:paramtypes', [])
  16792. ], ViewResolver);
  16793. return ViewResolver;
  16794. })();
  16795. exports.ViewResolver = ViewResolver;
  16796. /***/ },
  16797. /* 94 */
  16798. /***/ function(module, exports, __webpack_require__) {
  16799. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16800. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16801. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16802. 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;
  16803. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16804. };
  16805. var __metadata = (this && this.__metadata) || function (k, v) {
  16806. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16807. };
  16808. var di_1 = __webpack_require__(6);
  16809. var lang_1 = __webpack_require__(5);
  16810. var exceptions_1 = __webpack_require__(14);
  16811. var metadata_1 = __webpack_require__(3);
  16812. var reflection_1 = __webpack_require__(16);
  16813. function _isPipeMetadata(type) {
  16814. return type instanceof metadata_1.PipeMetadata;
  16815. }
  16816. /**
  16817. * Resolve a `Type` for {@link PipeMetadata}.
  16818. *
  16819. * This interface can be overridden by the application developer to create custom behavior.
  16820. *
  16821. * See {@link Compiler}
  16822. */
  16823. var PipeResolver = (function () {
  16824. function PipeResolver() {
  16825. }
  16826. /**
  16827. * Return {@link PipeMetadata} for a given `Type`.
  16828. */
  16829. PipeResolver.prototype.resolve = function (type) {
  16830. var metas = reflection_1.reflector.annotations(di_1.resolveForwardRef(type));
  16831. if (lang_1.isPresent(metas)) {
  16832. var annotation = metas.find(_isPipeMetadata);
  16833. if (lang_1.isPresent(annotation)) {
  16834. return annotation;
  16835. }
  16836. }
  16837. throw new exceptions_1.BaseException("No Pipe decorator found on " + lang_1.stringify(type));
  16838. };
  16839. PipeResolver = __decorate([
  16840. di_1.Injectable(),
  16841. __metadata('design:paramtypes', [])
  16842. ], PipeResolver);
  16843. return PipeResolver;
  16844. })();
  16845. exports.PipeResolver = PipeResolver;
  16846. /***/ },
  16847. /* 95 */
  16848. /***/ function(module, exports, __webpack_require__) {
  16849. var di_1 = __webpack_require__(6);
  16850. var lang_1 = __webpack_require__(5);
  16851. /**
  16852. * A token that can be provided when bootstraping an application to make an array of directives
  16853. * available in every component of the application.
  16854. *
  16855. * ### Example
  16856. *
  16857. * ```typescript
  16858. * import {PLATFORM_DIRECTIVES} from 'angular2/core';
  16859. * import {OtherDirective} from './myDirectives';
  16860. *
  16861. * @Component({
  16862. * selector: 'my-component',
  16863. * template: `
  16864. * <!-- can use other directive even though the component does not list it in `directives` -->
  16865. * <other-directive></other-directive>
  16866. * `
  16867. * })
  16868. * export class MyComponent {
  16869. * ...
  16870. * }
  16871. *
  16872. * bootstrap(MyComponent, [provide(PLATFORM_DIRECTIVES, {useValue: [OtherDirective], multi:true})]);
  16873. * ```
  16874. */
  16875. exports.PLATFORM_DIRECTIVES = lang_1.CONST_EXPR(new di_1.OpaqueToken("Platform Directives"));
  16876. /**
  16877. * A token that can be provided when bootstraping an application to make an array of pipes
  16878. * available in every component of the application.
  16879. *
  16880. * ### Example
  16881. *
  16882. * ```typescript
  16883. * import {PLATFORM_PIPES} from 'angular2/core';
  16884. * import {OtherPipe} from './myPipe';
  16885. *
  16886. * @Component({
  16887. * selector: 'my-component',
  16888. * template: `
  16889. * {{123 | other-pipe}}
  16890. * `
  16891. * })
  16892. * export class MyComponent {
  16893. * ...
  16894. * }
  16895. *
  16896. * bootstrap(MyComponent, [provide(PLATFORM_PIPES, {useValue: [OtherPipe], multi:true})]);
  16897. * ```
  16898. */
  16899. exports.PLATFORM_PIPES = lang_1.CONST_EXPR(new di_1.OpaqueToken("Platform Pipes"));
  16900. /***/ },
  16901. /* 96 */
  16902. /***/ function(module, exports, __webpack_require__) {
  16903. var __extends = (this && this.__extends) || function (d, b) {
  16904. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  16905. function __() { this.constructor = d; }
  16906. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  16907. };
  16908. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  16909. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  16910. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  16911. 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;
  16912. return c > 3 && r && Object.defineProperty(target, key, r), r;
  16913. };
  16914. var __metadata = (this && this.__metadata) || function (k, v) {
  16915. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  16916. };
  16917. var lang_1 = __webpack_require__(5);
  16918. var exceptions_1 = __webpack_require__(14);
  16919. var api_1 = __webpack_require__(72);
  16920. var metadata_1 = __webpack_require__(3);
  16921. // Export ViewEncapsulation so that compiled templates only need to depend
  16922. // on template_commands.
  16923. var metadata_2 = __webpack_require__(3);
  16924. exports.ViewEncapsulation = metadata_2.ViewEncapsulation;
  16925. /**
  16926. * A compiled host template.
  16927. *
  16928. * This is const as we are storing it as annotation
  16929. * for the compiled component type.
  16930. */
  16931. var CompiledHostTemplate = (function () {
  16932. function CompiledHostTemplate(template) {
  16933. this.template = template;
  16934. }
  16935. CompiledHostTemplate = __decorate([
  16936. lang_1.CONST(),
  16937. __metadata('design:paramtypes', [CompiledComponentTemplate])
  16938. ], CompiledHostTemplate);
  16939. return CompiledHostTemplate;
  16940. })();
  16941. exports.CompiledHostTemplate = CompiledHostTemplate;
  16942. /**
  16943. * A compiled template.
  16944. */
  16945. var CompiledComponentTemplate = (function () {
  16946. function CompiledComponentTemplate(id, changeDetectorFactory, commands, styles) {
  16947. this.id = id;
  16948. this.changeDetectorFactory = changeDetectorFactory;
  16949. this.commands = commands;
  16950. this.styles = styles;
  16951. }
  16952. CompiledComponentTemplate = __decorate([
  16953. lang_1.CONST(),
  16954. __metadata('design:paramtypes', [String, Function, Array, Array])
  16955. ], CompiledComponentTemplate);
  16956. return CompiledComponentTemplate;
  16957. })();
  16958. exports.CompiledComponentTemplate = CompiledComponentTemplate;
  16959. var EMPTY_ARR = lang_1.CONST_EXPR([]);
  16960. var TextCmd = (function () {
  16961. function TextCmd(value, isBound, ngContentIndex) {
  16962. this.value = value;
  16963. this.isBound = isBound;
  16964. this.ngContentIndex = ngContentIndex;
  16965. }
  16966. TextCmd.prototype.visit = function (visitor, context) {
  16967. return visitor.visitText(this, context);
  16968. };
  16969. TextCmd = __decorate([
  16970. lang_1.CONST(),
  16971. __metadata('design:paramtypes', [String, Boolean, Number])
  16972. ], TextCmd);
  16973. return TextCmd;
  16974. })();
  16975. exports.TextCmd = TextCmd;
  16976. var NgContentCmd = (function () {
  16977. function NgContentCmd(index, ngContentIndex) {
  16978. this.index = index;
  16979. this.ngContentIndex = ngContentIndex;
  16980. this.isBound = false;
  16981. }
  16982. NgContentCmd.prototype.visit = function (visitor, context) {
  16983. return visitor.visitNgContent(this, context);
  16984. };
  16985. NgContentCmd = __decorate([
  16986. lang_1.CONST(),
  16987. __metadata('design:paramtypes', [Number, Number])
  16988. ], NgContentCmd);
  16989. return NgContentCmd;
  16990. })();
  16991. exports.NgContentCmd = NgContentCmd;
  16992. var IBeginElementCmd = (function (_super) {
  16993. __extends(IBeginElementCmd, _super);
  16994. function IBeginElementCmd() {
  16995. _super.apply(this, arguments);
  16996. }
  16997. Object.defineProperty(IBeginElementCmd.prototype, "variableNameAndValues", {
  16998. get: function () { return exceptions_1.unimplemented(); },
  16999. enumerable: true,
  17000. configurable: true
  17001. });
  17002. Object.defineProperty(IBeginElementCmd.prototype, "eventTargetAndNames", {
  17003. get: function () { return exceptions_1.unimplemented(); },
  17004. enumerable: true,
  17005. configurable: true
  17006. });
  17007. Object.defineProperty(IBeginElementCmd.prototype, "directives", {
  17008. get: function () { return exceptions_1.unimplemented(); },
  17009. enumerable: true,
  17010. configurable: true
  17011. });
  17012. return IBeginElementCmd;
  17013. })(api_1.RenderBeginElementCmd);
  17014. exports.IBeginElementCmd = IBeginElementCmd;
  17015. var BeginElementCmd = (function () {
  17016. function BeginElementCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, isBound, ngContentIndex) {
  17017. this.name = name;
  17018. this.attrNameAndValues = attrNameAndValues;
  17019. this.eventTargetAndNames = eventTargetAndNames;
  17020. this.variableNameAndValues = variableNameAndValues;
  17021. this.directives = directives;
  17022. this.isBound = isBound;
  17023. this.ngContentIndex = ngContentIndex;
  17024. }
  17025. BeginElementCmd.prototype.visit = function (visitor, context) {
  17026. return visitor.visitBeginElement(this, context);
  17027. };
  17028. BeginElementCmd = __decorate([
  17029. lang_1.CONST(),
  17030. __metadata('design:paramtypes', [String, Array, Array, Array, Array, Boolean, Number])
  17031. ], BeginElementCmd);
  17032. return BeginElementCmd;
  17033. })();
  17034. exports.BeginElementCmd = BeginElementCmd;
  17035. var EndElementCmd = (function () {
  17036. function EndElementCmd() {
  17037. }
  17038. EndElementCmd.prototype.visit = function (visitor, context) {
  17039. return visitor.visitEndElement(context);
  17040. };
  17041. EndElementCmd = __decorate([
  17042. lang_1.CONST(),
  17043. __metadata('design:paramtypes', [])
  17044. ], EndElementCmd);
  17045. return EndElementCmd;
  17046. })();
  17047. exports.EndElementCmd = EndElementCmd;
  17048. var BeginComponentCmd = (function () {
  17049. function BeginComponentCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, encapsulation, ngContentIndex,
  17050. // Note: the template needs to be stored as a function
  17051. // so that we can resolve cycles
  17052. templateGetter /*() => CompiledComponentTemplate*/) {
  17053. this.name = name;
  17054. this.attrNameAndValues = attrNameAndValues;
  17055. this.eventTargetAndNames = eventTargetAndNames;
  17056. this.variableNameAndValues = variableNameAndValues;
  17057. this.directives = directives;
  17058. this.encapsulation = encapsulation;
  17059. this.ngContentIndex = ngContentIndex;
  17060. this.templateGetter = templateGetter;
  17061. this.isBound = true;
  17062. }
  17063. Object.defineProperty(BeginComponentCmd.prototype, "templateId", {
  17064. get: function () { return this.templateGetter().id; },
  17065. enumerable: true,
  17066. configurable: true
  17067. });
  17068. BeginComponentCmd.prototype.visit = function (visitor, context) {
  17069. return visitor.visitBeginComponent(this, context);
  17070. };
  17071. BeginComponentCmd = __decorate([
  17072. lang_1.CONST(),
  17073. __metadata('design:paramtypes', [String, Array, Array, Array, Array, Number, Number, Function])
  17074. ], BeginComponentCmd);
  17075. return BeginComponentCmd;
  17076. })();
  17077. exports.BeginComponentCmd = BeginComponentCmd;
  17078. var EndComponentCmd = (function () {
  17079. function EndComponentCmd() {
  17080. }
  17081. EndComponentCmd.prototype.visit = function (visitor, context) {
  17082. return visitor.visitEndComponent(context);
  17083. };
  17084. EndComponentCmd = __decorate([
  17085. lang_1.CONST(),
  17086. __metadata('design:paramtypes', [])
  17087. ], EndComponentCmd);
  17088. return EndComponentCmd;
  17089. })();
  17090. exports.EndComponentCmd = EndComponentCmd;
  17091. var EmbeddedTemplateCmd = (function () {
  17092. function EmbeddedTemplateCmd(attrNameAndValues, variableNameAndValues, directives, isMerged, ngContentIndex, changeDetectorFactory, children) {
  17093. this.attrNameAndValues = attrNameAndValues;
  17094. this.variableNameAndValues = variableNameAndValues;
  17095. this.directives = directives;
  17096. this.isMerged = isMerged;
  17097. this.ngContentIndex = ngContentIndex;
  17098. this.changeDetectorFactory = changeDetectorFactory;
  17099. this.children = children;
  17100. this.isBound = true;
  17101. this.name = null;
  17102. this.eventTargetAndNames = EMPTY_ARR;
  17103. }
  17104. EmbeddedTemplateCmd.prototype.visit = function (visitor, context) {
  17105. return visitor.visitEmbeddedTemplate(this, context);
  17106. };
  17107. EmbeddedTemplateCmd = __decorate([
  17108. lang_1.CONST(),
  17109. __metadata('design:paramtypes', [Array, Array, Array, Boolean, Number, Function, Array])
  17110. ], EmbeddedTemplateCmd);
  17111. return EmbeddedTemplateCmd;
  17112. })();
  17113. exports.EmbeddedTemplateCmd = EmbeddedTemplateCmd;
  17114. function visitAllCommands(visitor, cmds, context) {
  17115. if (context === void 0) { context = null; }
  17116. for (var i = 0; i < cmds.length; i++) {
  17117. cmds[i].visit(visitor, context);
  17118. }
  17119. }
  17120. exports.visitAllCommands = visitAllCommands;
  17121. /***/ },
  17122. /* 97 */
  17123. /***/ function(module, exports, __webpack_require__) {
  17124. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17125. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17126. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17127. 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;
  17128. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17129. };
  17130. var __metadata = (this && this.__metadata) || function (k, v) {
  17131. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17132. };
  17133. var di_1 = __webpack_require__(6);
  17134. var lang_1 = __webpack_require__(5);
  17135. var Console = (function () {
  17136. function Console() {
  17137. }
  17138. Console.prototype.log = function (message) { lang_1.print(message); };
  17139. Console = __decorate([
  17140. di_1.Injectable(),
  17141. __metadata('design:paramtypes', [])
  17142. ], Console);
  17143. return Console;
  17144. })();
  17145. exports.Console = Console;
  17146. /***/ },
  17147. /* 98 */
  17148. /***/ function(module, exports, __webpack_require__) {
  17149. // Public API for Zone
  17150. var ng_zone_1 = __webpack_require__(66);
  17151. exports.NgZone = ng_zone_1.NgZone;
  17152. exports.NgZoneError = ng_zone_1.NgZoneError;
  17153. /***/ },
  17154. /* 99 */
  17155. /***/ function(module, exports, __webpack_require__) {
  17156. // Public API for render
  17157. var api_1 = __webpack_require__(72);
  17158. exports.Renderer = api_1.Renderer;
  17159. exports.RenderViewRef = api_1.RenderViewRef;
  17160. exports.RenderProtoViewRef = api_1.RenderProtoViewRef;
  17161. exports.RenderFragmentRef = api_1.RenderFragmentRef;
  17162. exports.RenderViewWithFragments = api_1.RenderViewWithFragments;
  17163. exports.RenderTemplateCmd = api_1.RenderTemplateCmd;
  17164. exports.RenderTextCmd = api_1.RenderTextCmd;
  17165. exports.RenderNgContentCmd = api_1.RenderNgContentCmd;
  17166. exports.RenderBeginElementCmd = api_1.RenderBeginElementCmd;
  17167. exports.RenderBeginComponentCmd = api_1.RenderBeginComponentCmd;
  17168. exports.RenderEmbeddedTemplateCmd = api_1.RenderEmbeddedTemplateCmd;
  17169. exports.RenderBeginCmd = api_1.RenderBeginCmd;
  17170. exports.RenderComponentTemplate = api_1.RenderComponentTemplate;
  17171. /***/ },
  17172. /* 100 */
  17173. /***/ function(module, exports, __webpack_require__) {
  17174. // Public API for compiler
  17175. var directive_resolver_1 = __webpack_require__(92);
  17176. exports.DirectiveResolver = directive_resolver_1.DirectiveResolver;
  17177. var view_resolver_1 = __webpack_require__(93);
  17178. exports.ViewResolver = view_resolver_1.ViewResolver;
  17179. var compiler_1 = __webpack_require__(70);
  17180. exports.Compiler = compiler_1.Compiler;
  17181. var view_manager_1 = __webpack_require__(81);
  17182. exports.AppViewManager = view_manager_1.AppViewManager;
  17183. var query_list_1 = __webpack_require__(90);
  17184. exports.QueryList = query_list_1.QueryList;
  17185. var dynamic_component_loader_1 = __webpack_require__(69);
  17186. exports.DynamicComponentLoader = dynamic_component_loader_1.DynamicComponentLoader;
  17187. var element_ref_1 = __webpack_require__(83);
  17188. exports.ElementRef = element_ref_1.ElementRef;
  17189. var template_ref_1 = __webpack_require__(84);
  17190. exports.TemplateRef = template_ref_1.TemplateRef;
  17191. var view_ref_1 = __webpack_require__(77);
  17192. exports.ViewRef = view_ref_1.ViewRef;
  17193. exports.ProtoViewRef = view_ref_1.ProtoViewRef;
  17194. var view_container_ref_1 = __webpack_require__(87);
  17195. exports.ViewContainerRef = view_container_ref_1.ViewContainerRef;
  17196. var dynamic_component_loader_2 = __webpack_require__(69);
  17197. exports.ComponentRef = dynamic_component_loader_2.ComponentRef;
  17198. /***/ },
  17199. /* 101 */
  17200. /***/ function(module, exports, __webpack_require__) {
  17201. var __extends = (this && this.__extends) || function (d, b) {
  17202. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  17203. function __() { this.constructor = d; }
  17204. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  17205. };
  17206. var lang_1 = __webpack_require__(5);
  17207. var exceptions_1 = __webpack_require__(14);
  17208. var view_1 = __webpack_require__(76);
  17209. var view_ref_1 = __webpack_require__(77);
  17210. /**
  17211. * A DebugElement contains information from the Angular compiler about an
  17212. * element and provides access to the corresponding ElementInjector and
  17213. * underlying DOM Element, as well as a way to query for children.
  17214. *
  17215. * A DebugElement can be obtained from a {@link ComponentFixture} or from an
  17216. * {@link ElementRef} via {@link inspectElement}.
  17217. */
  17218. var DebugElement = (function () {
  17219. function DebugElement() {
  17220. }
  17221. Object.defineProperty(DebugElement.prototype, "componentInstance", {
  17222. /**
  17223. * Return the instance of the component associated with this element, if any.
  17224. */
  17225. get: function () { return exceptions_1.unimplemented(); },
  17226. enumerable: true,
  17227. configurable: true
  17228. });
  17229. ;
  17230. Object.defineProperty(DebugElement.prototype, "nativeElement", {
  17231. /**
  17232. * Return the native HTML element for this DebugElement.
  17233. */
  17234. get: function () { return exceptions_1.unimplemented(); },
  17235. enumerable: true,
  17236. configurable: true
  17237. });
  17238. ;
  17239. Object.defineProperty(DebugElement.prototype, "elementRef", {
  17240. /**
  17241. * Return an Angular {@link ElementRef} for this element.
  17242. */
  17243. get: function () { return exceptions_1.unimplemented(); },
  17244. enumerable: true,
  17245. configurable: true
  17246. });
  17247. ;
  17248. Object.defineProperty(DebugElement.prototype, "children", {
  17249. /**
  17250. * Get child DebugElements from within the Light DOM.
  17251. *
  17252. * @return {DebugElement[]}
  17253. */
  17254. get: function () { return exceptions_1.unimplemented(); },
  17255. enumerable: true,
  17256. configurable: true
  17257. });
  17258. ;
  17259. Object.defineProperty(DebugElement.prototype, "componentViewChildren", {
  17260. /**
  17261. * Get the root DebugElement children of a component. Returns an empty
  17262. * list if the current DebugElement is not a component root.
  17263. *
  17264. * @return {DebugElement[]}
  17265. */
  17266. get: function () { return exceptions_1.unimplemented(); },
  17267. enumerable: true,
  17268. configurable: true
  17269. });
  17270. ;
  17271. /**
  17272. * Return the first descendant TestElement matching the given predicate
  17273. * and scope.
  17274. *
  17275. * @param {Function: boolean} predicate
  17276. * @param {Scope} scope
  17277. *
  17278. * @return {DebugElement}
  17279. */
  17280. DebugElement.prototype.query = function (predicate, scope) {
  17281. if (scope === void 0) { scope = Scope.all; }
  17282. var results = this.queryAll(predicate, scope);
  17283. return results.length > 0 ? results[0] : null;
  17284. };
  17285. /**
  17286. * Return descendant TestElememts matching the given predicate
  17287. * and scope.
  17288. *
  17289. * @param {Function: boolean} predicate
  17290. * @param {Scope} scope
  17291. *
  17292. * @return {DebugElement[]}
  17293. */
  17294. DebugElement.prototype.queryAll = function (predicate, scope) {
  17295. if (scope === void 0) { scope = Scope.all; }
  17296. var elementsInScope = scope(this);
  17297. return elementsInScope.filter(predicate);
  17298. };
  17299. return DebugElement;
  17300. })();
  17301. exports.DebugElement = DebugElement;
  17302. var DebugElement_ = (function (_super) {
  17303. __extends(DebugElement_, _super);
  17304. function DebugElement_(_parentView, _boundElementIndex) {
  17305. _super.call(this);
  17306. this._parentView = _parentView;
  17307. this._boundElementIndex = _boundElementIndex;
  17308. this._elementInjector = this._parentView.elementInjectors[this._boundElementIndex];
  17309. }
  17310. Object.defineProperty(DebugElement_.prototype, "componentInstance", {
  17311. get: function () {
  17312. if (!lang_1.isPresent(this._elementInjector)) {
  17313. return null;
  17314. }
  17315. return this._elementInjector.getComponent();
  17316. },
  17317. enumerable: true,
  17318. configurable: true
  17319. });
  17320. Object.defineProperty(DebugElement_.prototype, "nativeElement", {
  17321. get: function () { return this.elementRef.nativeElement; },
  17322. enumerable: true,
  17323. configurable: true
  17324. });
  17325. Object.defineProperty(DebugElement_.prototype, "elementRef", {
  17326. get: function () { return this._parentView.elementRefs[this._boundElementIndex]; },
  17327. enumerable: true,
  17328. configurable: true
  17329. });
  17330. DebugElement_.prototype.getDirectiveInstance = function (directiveIndex) {
  17331. return this._elementInjector.getDirectiveAtIndex(directiveIndex);
  17332. };
  17333. Object.defineProperty(DebugElement_.prototype, "children", {
  17334. get: function () {
  17335. return this._getChildElements(this._parentView, this._boundElementIndex);
  17336. },
  17337. enumerable: true,
  17338. configurable: true
  17339. });
  17340. Object.defineProperty(DebugElement_.prototype, "componentViewChildren", {
  17341. get: function () {
  17342. var shadowView = this._parentView.getNestedView(this._boundElementIndex);
  17343. if (!lang_1.isPresent(shadowView) || shadowView.proto.type !== view_1.ViewType.COMPONENT) {
  17344. // The current element is not a component.
  17345. return [];
  17346. }
  17347. return this._getChildElements(shadowView, null);
  17348. },
  17349. enumerable: true,
  17350. configurable: true
  17351. });
  17352. DebugElement_.prototype.triggerEventHandler = function (eventName, eventObj) {
  17353. this._parentView.triggerEventHandlers(eventName, eventObj, this._boundElementIndex);
  17354. };
  17355. DebugElement_.prototype.hasDirective = function (type) {
  17356. if (!lang_1.isPresent(this._elementInjector)) {
  17357. return false;
  17358. }
  17359. return this._elementInjector.hasDirective(type);
  17360. };
  17361. DebugElement_.prototype.inject = function (type) {
  17362. if (!lang_1.isPresent(this._elementInjector)) {
  17363. return null;
  17364. }
  17365. return this._elementInjector.get(type);
  17366. };
  17367. DebugElement_.prototype.getLocal = function (name) { return this._parentView.locals.get(name); };
  17368. /** @internal */
  17369. DebugElement_.prototype._getChildElements = function (view, parentBoundElementIndex) {
  17370. var _this = this;
  17371. var els = [];
  17372. var parentElementBinder = null;
  17373. if (lang_1.isPresent(parentBoundElementIndex)) {
  17374. parentElementBinder = view.proto.elementBinders[parentBoundElementIndex - view.elementOffset];
  17375. }
  17376. for (var i = 0; i < view.proto.elementBinders.length; ++i) {
  17377. var binder = view.proto.elementBinders[i];
  17378. if (binder.parent == parentElementBinder) {
  17379. els.push(new DebugElement_(view, view.elementOffset + i));
  17380. var views = view.viewContainers[view.elementOffset + i];
  17381. if (lang_1.isPresent(views)) {
  17382. views.views.forEach(function (nextView) { els = els.concat(_this._getChildElements(nextView, null)); });
  17383. }
  17384. }
  17385. }
  17386. return els;
  17387. };
  17388. return DebugElement_;
  17389. })(DebugElement);
  17390. exports.DebugElement_ = DebugElement_;
  17391. /**
  17392. * Returns a {@link DebugElement} for an {@link ElementRef}.
  17393. *
  17394. * @param {ElementRef}: elementRef
  17395. * @return {DebugElement}
  17396. */
  17397. function inspectElement(elementRef) {
  17398. return new DebugElement_(view_ref_1.internalView(elementRef.parentView), elementRef.boundElementIndex);
  17399. }
  17400. exports.inspectElement = inspectElement;
  17401. /**
  17402. * Maps an array of {@link DebugElement}s to an array of native DOM elements.
  17403. */
  17404. function asNativeElements(arr) {
  17405. return arr.map(function (debugEl) { return debugEl.nativeElement; });
  17406. }
  17407. exports.asNativeElements = asNativeElements;
  17408. /**
  17409. * Set of scope functions used with {@link DebugElement}'s query functionality.
  17410. */
  17411. var Scope = (function () {
  17412. function Scope() {
  17413. }
  17414. /**
  17415. * Scope queries to both the light dom and view of an element and its
  17416. * children.
  17417. *
  17418. * ## Example
  17419. *
  17420. * {@example core/debug/ts/debug_element/debug_element.ts region='scope_all'}
  17421. */
  17422. Scope.all = function (debugElement) {
  17423. var scope = [];
  17424. scope.push(debugElement);
  17425. debugElement.children.forEach(function (child) { return scope = scope.concat(Scope.all(child)); });
  17426. debugElement.componentViewChildren.forEach(function (child) { return scope = scope.concat(Scope.all(child)); });
  17427. return scope;
  17428. };
  17429. /**
  17430. * Scope queries to the light dom of an element and its children.
  17431. *
  17432. * ## Example
  17433. *
  17434. * {@example core/debug/ts/debug_element/debug_element.ts region='scope_light'}
  17435. */
  17436. Scope.light = function (debugElement) {
  17437. var scope = [];
  17438. debugElement.children.forEach(function (child) {
  17439. scope.push(child);
  17440. scope = scope.concat(Scope.light(child));
  17441. });
  17442. return scope;
  17443. };
  17444. /**
  17445. * Scope queries to the view of an element of its children.
  17446. *
  17447. * ## Example
  17448. *
  17449. * {@example core/debug/ts/debug_element/debug_element.ts region='scope_view'}
  17450. */
  17451. Scope.view = function (debugElement) {
  17452. var scope = [];
  17453. debugElement.componentViewChildren.forEach(function (child) {
  17454. scope.push(child);
  17455. scope = scope.concat(Scope.light(child));
  17456. });
  17457. return scope;
  17458. };
  17459. return Scope;
  17460. })();
  17461. exports.Scope = Scope;
  17462. /***/ },
  17463. /* 102 */
  17464. /***/ function(module, exports, __webpack_require__) {
  17465. var lang_1 = __webpack_require__(5);
  17466. var di_1 = __webpack_require__(6);
  17467. var console_1 = __webpack_require__(97);
  17468. var reflection_1 = __webpack_require__(16);
  17469. var testability_1 = __webpack_require__(68);
  17470. function _reflector() {
  17471. return reflection_1.reflector;
  17472. }
  17473. /**
  17474. * A default set of providers which should be included in any Angular platform.
  17475. */
  17476. exports.PLATFORM_COMMON_PROVIDERS = lang_1.CONST_EXPR([new di_1.Provider(reflection_1.Reflector, { useFactory: _reflector, deps: [] }), testability_1.TestabilityRegistry, console_1.Console]);
  17477. /***/ },
  17478. /* 103 */
  17479. /***/ function(module, exports, __webpack_require__) {
  17480. var lang_1 = __webpack_require__(5);
  17481. var di_1 = __webpack_require__(6);
  17482. var application_tokens_1 = __webpack_require__(67);
  17483. var change_detection_1 = __webpack_require__(25);
  17484. var view_pool_1 = __webpack_require__(85);
  17485. var view_manager_1 = __webpack_require__(81);
  17486. var view_manager_2 = __webpack_require__(81);
  17487. var view_manager_utils_1 = __webpack_require__(82);
  17488. var view_resolver_1 = __webpack_require__(93);
  17489. var view_listener_1 = __webpack_require__(86);
  17490. var proto_view_factory_1 = __webpack_require__(71);
  17491. var directive_resolver_1 = __webpack_require__(92);
  17492. var pipe_resolver_1 = __webpack_require__(94);
  17493. var compiler_1 = __webpack_require__(70);
  17494. var compiler_2 = __webpack_require__(70);
  17495. var dynamic_component_loader_1 = __webpack_require__(69);
  17496. var dynamic_component_loader_2 = __webpack_require__(69);
  17497. /**
  17498. * A default set of providers which should be included in any Angular
  17499. * application, regardless of the platform it runs onto.
  17500. */
  17501. exports.APPLICATION_COMMON_PROVIDERS = lang_1.CONST_EXPR([
  17502. new di_1.Provider(compiler_1.Compiler, { useClass: compiler_2.Compiler_ }),
  17503. application_tokens_1.APP_ID_RANDOM_PROVIDER,
  17504. view_pool_1.AppViewPool,
  17505. new di_1.Provider(view_pool_1.APP_VIEW_POOL_CAPACITY, { useValue: 10000 }),
  17506. new di_1.Provider(view_manager_1.AppViewManager, { useClass: view_manager_2.AppViewManager_ }),
  17507. view_manager_utils_1.AppViewManagerUtils,
  17508. view_listener_1.AppViewListener,
  17509. proto_view_factory_1.ProtoViewFactory,
  17510. view_resolver_1.ViewResolver,
  17511. new di_1.Provider(change_detection_1.IterableDiffers, { useValue: change_detection_1.defaultIterableDiffers }),
  17512. new di_1.Provider(change_detection_1.KeyValueDiffers, { useValue: change_detection_1.defaultKeyValueDiffers }),
  17513. directive_resolver_1.DirectiveResolver,
  17514. pipe_resolver_1.PipeResolver,
  17515. new di_1.Provider(dynamic_component_loader_1.DynamicComponentLoader, { useClass: dynamic_component_loader_2.DynamicComponentLoader_ })
  17516. ]);
  17517. /***/ },
  17518. /* 104 */
  17519. /***/ function(module, exports, __webpack_require__) {
  17520. function __export(m) {
  17521. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  17522. }
  17523. __export(__webpack_require__(105));
  17524. __export(__webpack_require__(115));
  17525. __export(__webpack_require__(123));
  17526. __export(__webpack_require__(146));
  17527. /***/ },
  17528. /* 105 */
  17529. /***/ function(module, exports, __webpack_require__) {
  17530. /**
  17531. * @module
  17532. * @description
  17533. * This module provides a set of common Pipes.
  17534. */
  17535. var async_pipe_1 = __webpack_require__(106);
  17536. var uppercase_pipe_1 = __webpack_require__(108);
  17537. var lowercase_pipe_1 = __webpack_require__(109);
  17538. var json_pipe_1 = __webpack_require__(110);
  17539. var slice_pipe_1 = __webpack_require__(111);
  17540. var date_pipe_1 = __webpack_require__(112);
  17541. var number_pipe_1 = __webpack_require__(114);
  17542. var lang_1 = __webpack_require__(5);
  17543. var async_pipe_2 = __webpack_require__(106);
  17544. exports.AsyncPipe = async_pipe_2.AsyncPipe;
  17545. var date_pipe_2 = __webpack_require__(112);
  17546. exports.DatePipe = date_pipe_2.DatePipe;
  17547. var json_pipe_2 = __webpack_require__(110);
  17548. exports.JsonPipe = json_pipe_2.JsonPipe;
  17549. var slice_pipe_2 = __webpack_require__(111);
  17550. exports.SlicePipe = slice_pipe_2.SlicePipe;
  17551. var lowercase_pipe_2 = __webpack_require__(109);
  17552. exports.LowerCasePipe = lowercase_pipe_2.LowerCasePipe;
  17553. var number_pipe_2 = __webpack_require__(114);
  17554. exports.NumberPipe = number_pipe_2.NumberPipe;
  17555. exports.DecimalPipe = number_pipe_2.DecimalPipe;
  17556. exports.PercentPipe = number_pipe_2.PercentPipe;
  17557. exports.CurrencyPipe = number_pipe_2.CurrencyPipe;
  17558. var uppercase_pipe_2 = __webpack_require__(108);
  17559. exports.UpperCasePipe = uppercase_pipe_2.UpperCasePipe;
  17560. /**
  17561. * A collection of Angular core pipes that are likely to be used in each and every
  17562. * application.
  17563. *
  17564. * This collection can be used to quickly enumerate all the built-in pipes in the `pipes`
  17565. * property of the `@Component` or `@View` decorators.
  17566. */
  17567. exports.COMMON_PIPES = lang_1.CONST_EXPR([
  17568. async_pipe_1.AsyncPipe,
  17569. uppercase_pipe_1.UpperCasePipe,
  17570. lowercase_pipe_1.LowerCasePipe,
  17571. json_pipe_1.JsonPipe,
  17572. slice_pipe_1.SlicePipe,
  17573. number_pipe_1.DecimalPipe,
  17574. number_pipe_1.PercentPipe,
  17575. number_pipe_1.CurrencyPipe,
  17576. date_pipe_1.DatePipe
  17577. ]);
  17578. /***/ },
  17579. /* 106 */
  17580. /***/ function(module, exports, __webpack_require__) {
  17581. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17582. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17583. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17584. 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;
  17585. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17586. };
  17587. var __metadata = (this && this.__metadata) || function (k, v) {
  17588. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17589. };
  17590. var lang_1 = __webpack_require__(5);
  17591. var async_1 = __webpack_require__(60);
  17592. var core_1 = __webpack_require__(2);
  17593. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  17594. var ObservableStrategy = (function () {
  17595. function ObservableStrategy() {
  17596. }
  17597. ObservableStrategy.prototype.createSubscription = function (async, updateLatestValue) {
  17598. return async_1.ObservableWrapper.subscribe(async, updateLatestValue, function (e) { throw e; });
  17599. };
  17600. ObservableStrategy.prototype.dispose = function (subscription) { async_1.ObservableWrapper.dispose(subscription); };
  17601. ObservableStrategy.prototype.onDestroy = function (subscription) { async_1.ObservableWrapper.dispose(subscription); };
  17602. return ObservableStrategy;
  17603. })();
  17604. var PromiseStrategy = (function () {
  17605. function PromiseStrategy() {
  17606. }
  17607. PromiseStrategy.prototype.createSubscription = function (async, updateLatestValue) {
  17608. return async.then(updateLatestValue);
  17609. };
  17610. PromiseStrategy.prototype.dispose = function (subscription) { };
  17611. PromiseStrategy.prototype.onDestroy = function (subscription) { };
  17612. return PromiseStrategy;
  17613. })();
  17614. var _promiseStrategy = new PromiseStrategy();
  17615. var _observableStrategy = new ObservableStrategy();
  17616. /**
  17617. * The `async` pipe subscribes to an Observable or Promise and returns the latest value it has
  17618. * emitted.
  17619. * When a new value is emitted, the `async` pipe marks the component to be checked for changes.
  17620. *
  17621. * ### Example
  17622. *
  17623. * This example binds a `Promise` to the view. Clicking the `Resolve` button resolves the
  17624. * promise.
  17625. *
  17626. * {@example core/pipes/ts/async_pipe/async_pipe_example.ts region='AsyncPipe'}
  17627. *
  17628. * It's also possible to use `async` with Observables. The example below binds the `time` Observable
  17629. * to the view. Every 500ms, the `time` Observable updates the view with the current time.
  17630. *
  17631. * ```typescript
  17632. * ```
  17633. */
  17634. var AsyncPipe = (function () {
  17635. function AsyncPipe(_ref) {
  17636. /** @internal */
  17637. this._latestValue = null;
  17638. /** @internal */
  17639. this._latestReturnedValue = null;
  17640. /** @internal */
  17641. this._subscription = null;
  17642. /** @internal */
  17643. this._obj = null;
  17644. this._strategy = null;
  17645. this._ref = _ref;
  17646. }
  17647. AsyncPipe.prototype.ngOnDestroy = function () {
  17648. if (lang_1.isPresent(this._subscription)) {
  17649. this._dispose();
  17650. }
  17651. };
  17652. AsyncPipe.prototype.transform = function (obj, args) {
  17653. if (lang_1.isBlank(this._obj)) {
  17654. if (lang_1.isPresent(obj)) {
  17655. this._subscribe(obj);
  17656. }
  17657. return this._latestValue;
  17658. }
  17659. if (obj !== this._obj) {
  17660. this._dispose();
  17661. return this.transform(obj);
  17662. }
  17663. if (this._latestValue === this._latestReturnedValue) {
  17664. return this._latestReturnedValue;
  17665. }
  17666. else {
  17667. this._latestReturnedValue = this._latestValue;
  17668. return core_1.WrappedValue.wrap(this._latestValue);
  17669. }
  17670. };
  17671. /** @internal */
  17672. AsyncPipe.prototype._subscribe = function (obj) {
  17673. var _this = this;
  17674. this._obj = obj;
  17675. this._strategy = this._selectStrategy(obj);
  17676. this._subscription =
  17677. this._strategy.createSubscription(obj, function (value) { return _this._updateLatestValue(obj, value); });
  17678. };
  17679. /** @internal */
  17680. AsyncPipe.prototype._selectStrategy = function (obj) {
  17681. if (lang_1.isPromise(obj)) {
  17682. return _promiseStrategy;
  17683. }
  17684. else if (async_1.ObservableWrapper.isObservable(obj)) {
  17685. return _observableStrategy;
  17686. }
  17687. else {
  17688. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(AsyncPipe, obj);
  17689. }
  17690. };
  17691. /** @internal */
  17692. AsyncPipe.prototype._dispose = function () {
  17693. this._strategy.dispose(this._subscription);
  17694. this._latestValue = null;
  17695. this._latestReturnedValue = null;
  17696. this._subscription = null;
  17697. this._obj = null;
  17698. };
  17699. /** @internal */
  17700. AsyncPipe.prototype._updateLatestValue = function (async, value) {
  17701. if (async === this._obj) {
  17702. this._latestValue = value;
  17703. this._ref.markForCheck();
  17704. }
  17705. };
  17706. AsyncPipe = __decorate([
  17707. core_1.Pipe({ name: 'async', pure: false }),
  17708. core_1.Injectable(),
  17709. __metadata('design:paramtypes', [core_1.ChangeDetectorRef])
  17710. ], AsyncPipe);
  17711. return AsyncPipe;
  17712. })();
  17713. exports.AsyncPipe = AsyncPipe;
  17714. /***/ },
  17715. /* 107 */
  17716. /***/ function(module, exports, __webpack_require__) {
  17717. var __extends = (this && this.__extends) || function (d, b) {
  17718. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  17719. function __() { this.constructor = d; }
  17720. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  17721. };
  17722. var lang_1 = __webpack_require__(5);
  17723. var exceptions_1 = __webpack_require__(14);
  17724. var InvalidPipeArgumentException = (function (_super) {
  17725. __extends(InvalidPipeArgumentException, _super);
  17726. function InvalidPipeArgumentException(type, value) {
  17727. _super.call(this, "Invalid argument '" + value + "' for pipe '" + lang_1.stringify(type) + "'");
  17728. }
  17729. return InvalidPipeArgumentException;
  17730. })(exceptions_1.BaseException);
  17731. exports.InvalidPipeArgumentException = InvalidPipeArgumentException;
  17732. /***/ },
  17733. /* 108 */
  17734. /***/ function(module, exports, __webpack_require__) {
  17735. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17736. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17737. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17738. 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;
  17739. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17740. };
  17741. var __metadata = (this && this.__metadata) || function (k, v) {
  17742. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17743. };
  17744. var lang_1 = __webpack_require__(5);
  17745. var core_1 = __webpack_require__(2);
  17746. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  17747. /**
  17748. * Implements uppercase transforms to text.
  17749. *
  17750. * ### Example
  17751. *
  17752. * {@example core/pipes/ts/lowerupper_pipe/lowerupper_pipe_example.ts region='LowerUpperPipe'}
  17753. */
  17754. var UpperCasePipe = (function () {
  17755. function UpperCasePipe() {
  17756. }
  17757. UpperCasePipe.prototype.transform = function (value, args) {
  17758. if (args === void 0) { args = null; }
  17759. if (lang_1.isBlank(value))
  17760. return value;
  17761. if (!lang_1.isString(value)) {
  17762. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(UpperCasePipe, value);
  17763. }
  17764. return value.toUpperCase();
  17765. };
  17766. UpperCasePipe = __decorate([
  17767. lang_1.CONST(),
  17768. core_1.Pipe({ name: 'uppercase' }),
  17769. core_1.Injectable(),
  17770. __metadata('design:paramtypes', [])
  17771. ], UpperCasePipe);
  17772. return UpperCasePipe;
  17773. })();
  17774. exports.UpperCasePipe = UpperCasePipe;
  17775. /***/ },
  17776. /* 109 */
  17777. /***/ function(module, exports, __webpack_require__) {
  17778. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17779. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17780. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17781. 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;
  17782. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17783. };
  17784. var __metadata = (this && this.__metadata) || function (k, v) {
  17785. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17786. };
  17787. var lang_1 = __webpack_require__(5);
  17788. var core_1 = __webpack_require__(2);
  17789. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  17790. /**
  17791. * Transforms text to lowercase.
  17792. *
  17793. * ### Example
  17794. *
  17795. * {@example core/pipes/ts/lowerupper_pipe/lowerupper_pipe_example.ts region='LowerUpperPipe'}
  17796. */
  17797. var LowerCasePipe = (function () {
  17798. function LowerCasePipe() {
  17799. }
  17800. LowerCasePipe.prototype.transform = function (value, args) {
  17801. if (args === void 0) { args = null; }
  17802. if (lang_1.isBlank(value))
  17803. return value;
  17804. if (!lang_1.isString(value)) {
  17805. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(LowerCasePipe, value);
  17806. }
  17807. return value.toLowerCase();
  17808. };
  17809. LowerCasePipe = __decorate([
  17810. lang_1.CONST(),
  17811. core_1.Pipe({ name: 'lowercase' }),
  17812. core_1.Injectable(),
  17813. __metadata('design:paramtypes', [])
  17814. ], LowerCasePipe);
  17815. return LowerCasePipe;
  17816. })();
  17817. exports.LowerCasePipe = LowerCasePipe;
  17818. /***/ },
  17819. /* 110 */
  17820. /***/ function(module, exports, __webpack_require__) {
  17821. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17822. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17823. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17824. 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;
  17825. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17826. };
  17827. var __metadata = (this && this.__metadata) || function (k, v) {
  17828. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17829. };
  17830. var lang_1 = __webpack_require__(5);
  17831. var core_1 = __webpack_require__(2);
  17832. /**
  17833. * Transforms any input value using `JSON.stringify`. Useful for debugging.
  17834. *
  17835. * ### Example
  17836. * {@example core/pipes/ts/json_pipe/json_pipe_example.ts region='JsonPipe'}
  17837. */
  17838. var JsonPipe = (function () {
  17839. function JsonPipe() {
  17840. }
  17841. JsonPipe.prototype.transform = function (value, args) {
  17842. if (args === void 0) { args = null; }
  17843. return lang_1.Json.stringify(value);
  17844. };
  17845. JsonPipe = __decorate([
  17846. lang_1.CONST(),
  17847. core_1.Pipe({ name: 'json', pure: false }),
  17848. core_1.Injectable(),
  17849. __metadata('design:paramtypes', [])
  17850. ], JsonPipe);
  17851. return JsonPipe;
  17852. })();
  17853. exports.JsonPipe = JsonPipe;
  17854. /***/ },
  17855. /* 111 */
  17856. /***/ function(module, exports, __webpack_require__) {
  17857. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17858. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17859. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17860. 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;
  17861. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17862. };
  17863. var __metadata = (this && this.__metadata) || function (k, v) {
  17864. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17865. };
  17866. var lang_1 = __webpack_require__(5);
  17867. var exceptions_1 = __webpack_require__(14);
  17868. var collection_1 = __webpack_require__(12);
  17869. var core_1 = __webpack_require__(2);
  17870. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  17871. /**
  17872. * Creates a new List or String containing only a subset (slice) of the
  17873. * elements.
  17874. *
  17875. * The starting index of the subset to return is specified by the `start` parameter.
  17876. *
  17877. * The ending index of the subset to return is specified by the optional `end` parameter.
  17878. *
  17879. * ### Usage
  17880. *
  17881. * expression | slice:start[:end]
  17882. *
  17883. * All behavior is based on the expected behavior of the JavaScript API
  17884. * Array.prototype.slice() and String.prototype.slice()
  17885. *
  17886. * Where the input expression is a [List] or [String], and `start` is:
  17887. *
  17888. * - **a positive integer**: return the item at _start_ index and all items after
  17889. * in the list or string expression.
  17890. * - **a negative integer**: return the item at _start_ index from the end and all items after
  17891. * in the list or string expression.
  17892. * - **`|start|` greater than the size of the expression**: return an empty list or string.
  17893. * - **`|start|` negative greater than the size of the expression**: return entire list or
  17894. * string expression.
  17895. *
  17896. * and where `end` is:
  17897. *
  17898. * - **omitted**: return all items until the end of the input
  17899. * - **a positive integer**: return all items before _end_ index of the list or string
  17900. * expression.
  17901. * - **a negative integer**: return all items before _end_ index from the end of the list
  17902. * or string expression.
  17903. *
  17904. * When operating on a [List], the returned list is always a copy even when all
  17905. * the elements are being returned.
  17906. *
  17907. * ## List Example
  17908. *
  17909. * This `ngFor` example:
  17910. *
  17911. * {@example core/pipes/ts/slice_pipe/slice_pipe_example.ts region='SlicePipe_list'}
  17912. *
  17913. * produces the following:
  17914. *
  17915. * <li>b</li>
  17916. * <li>c</li>
  17917. *
  17918. * ## String Examples
  17919. *
  17920. * {@example core/pipes/ts/slice_pipe/slice_pipe_example.ts region='SlicePipe_string'}
  17921. */
  17922. var SlicePipe = (function () {
  17923. function SlicePipe() {
  17924. }
  17925. SlicePipe.prototype.transform = function (value, args) {
  17926. if (args === void 0) { args = null; }
  17927. if (lang_1.isBlank(args) || args.length == 0) {
  17928. throw new exceptions_1.BaseException('Slice pipe requires one argument');
  17929. }
  17930. if (!this.supports(value)) {
  17931. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(SlicePipe, value);
  17932. }
  17933. if (lang_1.isBlank(value))
  17934. return value;
  17935. var start = args[0];
  17936. var end = args.length > 1 ? args[1] : null;
  17937. if (lang_1.isString(value)) {
  17938. return lang_1.StringWrapper.slice(value, start, end);
  17939. }
  17940. return collection_1.ListWrapper.slice(value, start, end);
  17941. };
  17942. SlicePipe.prototype.supports = function (obj) { return lang_1.isString(obj) || lang_1.isArray(obj); };
  17943. SlicePipe = __decorate([
  17944. core_1.Pipe({ name: 'slice', pure: false }),
  17945. core_1.Injectable(),
  17946. __metadata('design:paramtypes', [])
  17947. ], SlicePipe);
  17948. return SlicePipe;
  17949. })();
  17950. exports.SlicePipe = SlicePipe;
  17951. /***/ },
  17952. /* 112 */
  17953. /***/ function(module, exports, __webpack_require__) {
  17954. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  17955. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  17956. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  17957. 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;
  17958. return c > 3 && r && Object.defineProperty(target, key, r), r;
  17959. };
  17960. var __metadata = (this && this.__metadata) || function (k, v) {
  17961. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  17962. };
  17963. var lang_1 = __webpack_require__(5);
  17964. var intl_1 = __webpack_require__(113);
  17965. var core_1 = __webpack_require__(2);
  17966. var collection_1 = __webpack_require__(12);
  17967. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  17968. // TODO: move to a global configurable location along with other i18n components.
  17969. var defaultLocale = 'en-US';
  17970. /**
  17971. * Formats a date value to a string based on the requested format.
  17972. *
  17973. * WARNINGS:
  17974. * - this pipe is marked as pure hence it will not be re-evaluated when the input is mutated.
  17975. * Instead users should treat the date as an immutable object and change the reference when the
  17976. * pipe needs to re-run (this is to avoid reformatting the date on every change detection run
  17977. * which would be an expensive operation).
  17978. * - this pipe uses the Internationalization API. Therefore it is only reliable in Chrome and Opera
  17979. * browsers.
  17980. *
  17981. * ## Usage
  17982. *
  17983. * expression | date[:format]
  17984. *
  17985. * where `expression` is a date object or a number (milliseconds since UTC epoch) and
  17986. * `format` indicates which date/time components to include:
  17987. *
  17988. * | Component | Symbol | Short Form | Long Form | Numeric | 2-digit |
  17989. * |-----------|:------:|--------------|-------------------|-----------|-----------|
  17990. * | era | G | G (AD) | GGGG (Anno Domini)| - | - |
  17991. * | year | y | - | - | y (2015) | yy (15) |
  17992. * | month | M | MMM (Sep) | MMMM (September) | M (9) | MM (09) |
  17993. * | day | d | - | - | d (3) | dd (03) |
  17994. * | weekday | E | EEE (Sun) | EEEE (Sunday) | - | - |
  17995. * | hour | j | - | - | j (13) | jj (13) |
  17996. * | hour12 | h | - | - | h (1 PM) | hh (01 PM)|
  17997. * | hour24 | H | - | - | H (13) | HH (13) |
  17998. * | minute | m | - | - | m (5) | mm (05) |
  17999. * | second | s | - | - | s (9) | ss (09) |
  18000. * | timezone | z | - | z (Pacific Standard Time)| - | - |
  18001. * | timezone | Z | Z (GMT-8:00) | - | - | - |
  18002. *
  18003. * In javascript, only the components specified will be respected (not the ordering,
  18004. * punctuations, ...) and details of the formatting will be dependent on the locale.
  18005. * On the other hand in Dart version, you can also include quoted text as well as some extra
  18006. * date/time components such as quarter. For more information see:
  18007. * https://api.dartlang.org/apidocs/channels/stable/dartdoc-viewer/intl/intl.DateFormat.
  18008. *
  18009. * `format` can also be one of the following predefined formats:
  18010. *
  18011. * - `'medium'`: equivalent to `'yMMMdjms'` (e.g. Sep 3, 2010, 12:05:08 PM for en-US)
  18012. * - `'short'`: equivalent to `'yMdjm'` (e.g. 9/3/2010, 12:05 PM for en-US)
  18013. * - `'fullDate'`: equivalent to `'yMMMMEEEEd'` (e.g. Friday, September 3, 2010 for en-US)
  18014. * - `'longDate'`: equivalent to `'yMMMMd'` (e.g. September 3, 2010)
  18015. * - `'mediumDate'`: equivalent to `'yMMMd'` (e.g. Sep 3, 2010 for en-US)
  18016. * - `'shortDate'`: equivalent to `'yMd'` (e.g. 9/3/2010 for en-US)
  18017. * - `'mediumTime'`: equivalent to `'jms'` (e.g. 12:05:08 PM for en-US)
  18018. * - `'shortTime'`: equivalent to `'jm'` (e.g. 12:05 PM for en-US)
  18019. *
  18020. * Timezone of the formatted text will be the local system timezone of the end-users machine.
  18021. *
  18022. * ### Examples
  18023. *
  18024. * Assuming `dateObj` is (year: 2015, month: 6, day: 15, hour: 21, minute: 43, second: 11)
  18025. * in the _local_ time and locale is 'en-US':
  18026. *
  18027. * ```
  18028. * {{ dateObj | date }} // output is 'Jun 15, 2015'
  18029. * {{ dateObj | date:'medium' }} // output is 'Jun 15, 2015, 9:43:11 PM'
  18030. * {{ dateObj | date:'shortTime' }} // output is '9:43 PM'
  18031. * {{ dateObj | date:'mmss' }} // output is '43:11'
  18032. * ```
  18033. *
  18034. * {@example core/pipes/ts/date_pipe/date_pipe_example.ts region='DatePipe'}
  18035. */
  18036. var DatePipe = (function () {
  18037. function DatePipe() {
  18038. }
  18039. DatePipe.prototype.transform = function (value, args) {
  18040. if (lang_1.isBlank(value))
  18041. return null;
  18042. if (!this.supports(value)) {
  18043. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(DatePipe, value);
  18044. }
  18045. var pattern = lang_1.isPresent(args) && args.length > 0 ? args[0] : 'mediumDate';
  18046. if (lang_1.isNumber(value)) {
  18047. value = lang_1.DateWrapper.fromMillis(value);
  18048. }
  18049. if (collection_1.StringMapWrapper.contains(DatePipe._ALIASES, pattern)) {
  18050. pattern = collection_1.StringMapWrapper.get(DatePipe._ALIASES, pattern);
  18051. }
  18052. return intl_1.DateFormatter.format(value, defaultLocale, pattern);
  18053. };
  18054. DatePipe.prototype.supports = function (obj) { return lang_1.isDate(obj) || lang_1.isNumber(obj); };
  18055. /** @internal */
  18056. DatePipe._ALIASES = {
  18057. 'medium': 'yMMMdjms',
  18058. 'short': 'yMdjm',
  18059. 'fullDate': 'yMMMMEEEEd',
  18060. 'longDate': 'yMMMMd',
  18061. 'mediumDate': 'yMMMd',
  18062. 'shortDate': 'yMd',
  18063. 'mediumTime': 'jms',
  18064. 'shortTime': 'jm'
  18065. };
  18066. DatePipe = __decorate([
  18067. lang_1.CONST(),
  18068. core_1.Pipe({ name: 'date', pure: true }),
  18069. core_1.Injectable(),
  18070. __metadata('design:paramtypes', [])
  18071. ], DatePipe);
  18072. return DatePipe;
  18073. })();
  18074. exports.DatePipe = DatePipe;
  18075. /***/ },
  18076. /* 113 */
  18077. /***/ function(module, exports) {
  18078. (function (NumberFormatStyle) {
  18079. NumberFormatStyle[NumberFormatStyle["Decimal"] = 0] = "Decimal";
  18080. NumberFormatStyle[NumberFormatStyle["Percent"] = 1] = "Percent";
  18081. NumberFormatStyle[NumberFormatStyle["Currency"] = 2] = "Currency";
  18082. })(exports.NumberFormatStyle || (exports.NumberFormatStyle = {}));
  18083. var NumberFormatStyle = exports.NumberFormatStyle;
  18084. var NumberFormatter = (function () {
  18085. function NumberFormatter() {
  18086. }
  18087. NumberFormatter.format = function (num, locale, style, _a) {
  18088. 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;
  18089. var intlOptions = {
  18090. minimumIntegerDigits: minimumIntegerDigits,
  18091. minimumFractionDigits: minimumFractionDigits,
  18092. maximumFractionDigits: maximumFractionDigits
  18093. };
  18094. intlOptions.style = NumberFormatStyle[style].toLowerCase();
  18095. if (style == NumberFormatStyle.Currency) {
  18096. intlOptions.currency = currency;
  18097. intlOptions.currencyDisplay = currencyAsSymbol ? 'symbol' : 'code';
  18098. }
  18099. return new Intl.NumberFormat(locale, intlOptions).format(num);
  18100. };
  18101. return NumberFormatter;
  18102. })();
  18103. exports.NumberFormatter = NumberFormatter;
  18104. function digitCondition(len) {
  18105. return len == 2 ? '2-digit' : 'numeric';
  18106. }
  18107. function nameCondition(len) {
  18108. return len < 4 ? 'short' : 'long';
  18109. }
  18110. function extractComponents(pattern) {
  18111. var ret = {};
  18112. var i = 0, j;
  18113. while (i < pattern.length) {
  18114. j = i;
  18115. while (j < pattern.length && pattern[j] == pattern[i])
  18116. j++;
  18117. var len = j - i;
  18118. switch (pattern[i]) {
  18119. case 'G':
  18120. ret.era = nameCondition(len);
  18121. break;
  18122. case 'y':
  18123. ret.year = digitCondition(len);
  18124. break;
  18125. case 'M':
  18126. if (len >= 3)
  18127. ret.month = nameCondition(len);
  18128. else
  18129. ret.month = digitCondition(len);
  18130. break;
  18131. case 'd':
  18132. ret.day = digitCondition(len);
  18133. break;
  18134. case 'E':
  18135. ret.weekday = nameCondition(len);
  18136. break;
  18137. case 'j':
  18138. ret.hour = digitCondition(len);
  18139. break;
  18140. case 'h':
  18141. ret.hour = digitCondition(len);
  18142. ret.hour12 = true;
  18143. break;
  18144. case 'H':
  18145. ret.hour = digitCondition(len);
  18146. ret.hour12 = false;
  18147. break;
  18148. case 'm':
  18149. ret.minute = digitCondition(len);
  18150. break;
  18151. case 's':
  18152. ret.second = digitCondition(len);
  18153. break;
  18154. case 'z':
  18155. ret.timeZoneName = 'long';
  18156. break;
  18157. case 'Z':
  18158. ret.timeZoneName = 'short';
  18159. break;
  18160. }
  18161. i = j;
  18162. }
  18163. return ret;
  18164. }
  18165. var dateFormatterCache = new Map();
  18166. var DateFormatter = (function () {
  18167. function DateFormatter() {
  18168. }
  18169. DateFormatter.format = function (date, locale, pattern) {
  18170. var key = locale + pattern;
  18171. if (dateFormatterCache.has(key)) {
  18172. return dateFormatterCache.get(key).format(date);
  18173. }
  18174. var formatter = new Intl.DateTimeFormat(locale, extractComponents(pattern));
  18175. dateFormatterCache.set(key, formatter);
  18176. return formatter.format(date);
  18177. };
  18178. return DateFormatter;
  18179. })();
  18180. exports.DateFormatter = DateFormatter;
  18181. /***/ },
  18182. /* 114 */
  18183. /***/ function(module, exports, __webpack_require__) {
  18184. var __extends = (this && this.__extends) || function (d, b) {
  18185. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  18186. function __() { this.constructor = d; }
  18187. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  18188. };
  18189. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18190. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18191. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18192. 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;
  18193. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18194. };
  18195. var __metadata = (this && this.__metadata) || function (k, v) {
  18196. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18197. };
  18198. var lang_1 = __webpack_require__(5);
  18199. var exceptions_1 = __webpack_require__(14);
  18200. var intl_1 = __webpack_require__(113);
  18201. var core_1 = __webpack_require__(2);
  18202. var collection_1 = __webpack_require__(12);
  18203. var invalid_pipe_argument_exception_1 = __webpack_require__(107);
  18204. var defaultLocale = 'en-US';
  18205. var _re = lang_1.RegExpWrapper.create('^(\\d+)?\\.((\\d+)(\\-(\\d+))?)?$');
  18206. /**
  18207. * Internal base class for numeric pipes.
  18208. */
  18209. var NumberPipe = (function () {
  18210. function NumberPipe() {
  18211. }
  18212. /** @internal */
  18213. NumberPipe._format = function (value, style, digits, currency, currencyAsSymbol) {
  18214. if (currency === void 0) { currency = null; }
  18215. if (currencyAsSymbol === void 0) { currencyAsSymbol = false; }
  18216. if (lang_1.isBlank(value))
  18217. return null;
  18218. if (!lang_1.isNumber(value)) {
  18219. throw new invalid_pipe_argument_exception_1.InvalidPipeArgumentException(NumberPipe, value);
  18220. }
  18221. var minInt = 1, minFraction = 0, maxFraction = 3;
  18222. if (lang_1.isPresent(digits)) {
  18223. var parts = lang_1.RegExpWrapper.firstMatch(_re, digits);
  18224. if (lang_1.isBlank(parts)) {
  18225. throw new exceptions_1.BaseException(digits + " is not a valid digit info for number pipes");
  18226. }
  18227. if (lang_1.isPresent(parts[1])) {
  18228. minInt = lang_1.NumberWrapper.parseIntAutoRadix(parts[1]);
  18229. }
  18230. if (lang_1.isPresent(parts[3])) {
  18231. minFraction = lang_1.NumberWrapper.parseIntAutoRadix(parts[3]);
  18232. }
  18233. if (lang_1.isPresent(parts[5])) {
  18234. maxFraction = lang_1.NumberWrapper.parseIntAutoRadix(parts[5]);
  18235. }
  18236. }
  18237. return intl_1.NumberFormatter.format(value, defaultLocale, style, {
  18238. minimumIntegerDigits: minInt,
  18239. minimumFractionDigits: minFraction,
  18240. maximumFractionDigits: maxFraction,
  18241. currency: currency,
  18242. currencyAsSymbol: currencyAsSymbol
  18243. });
  18244. };
  18245. NumberPipe = __decorate([
  18246. lang_1.CONST(),
  18247. core_1.Injectable(),
  18248. __metadata('design:paramtypes', [])
  18249. ], NumberPipe);
  18250. return NumberPipe;
  18251. })();
  18252. exports.NumberPipe = NumberPipe;
  18253. /**
  18254. * WARNING: this pipe uses the Internationalization API.
  18255. * Therefore it is only reliable in Chrome and Opera browsers.
  18256. *
  18257. * Formats a number as local text. i.e. group sizing and separator and other locale-specific
  18258. * configurations are based on the active locale.
  18259. *
  18260. * ### Usage
  18261. *
  18262. * expression | number[:digitInfo]
  18263. *
  18264. * where `expression` is a number and `digitInfo` has the following format:
  18265. *
  18266. * {minIntegerDigits}.{minFractionDigits}-{maxFractionDigits}
  18267. *
  18268. * - minIntegerDigits is the minimum number of integer digits to use. Defaults to 1.
  18269. * - minFractionDigits is the minimum number of digits after fraction. Defaults to 0.
  18270. * - maxFractionDigits is the maximum number of digits after fraction. Defaults to 3.
  18271. *
  18272. * For more information on the acceptable range for each of these numbers and other
  18273. * details see your native internationalization library.
  18274. *
  18275. * ### Example
  18276. *
  18277. * {@example core/pipes/ts/number_pipe/number_pipe_example.ts region='NumberPipe'}
  18278. */
  18279. var DecimalPipe = (function (_super) {
  18280. __extends(DecimalPipe, _super);
  18281. function DecimalPipe() {
  18282. _super.apply(this, arguments);
  18283. }
  18284. DecimalPipe.prototype.transform = function (value, args) {
  18285. var digits = collection_1.ListWrapper.first(args);
  18286. return NumberPipe._format(value, intl_1.NumberFormatStyle.Decimal, digits);
  18287. };
  18288. DecimalPipe = __decorate([
  18289. lang_1.CONST(),
  18290. core_1.Pipe({ name: 'number' }),
  18291. core_1.Injectable(),
  18292. __metadata('design:paramtypes', [])
  18293. ], DecimalPipe);
  18294. return DecimalPipe;
  18295. })(NumberPipe);
  18296. exports.DecimalPipe = DecimalPipe;
  18297. /**
  18298. * WARNING: this pipe uses the Internationalization API.
  18299. * Therefore it is only reliable in Chrome and Opera browsers.
  18300. *
  18301. * Formats a number as local percent.
  18302. *
  18303. * ### Usage
  18304. *
  18305. * expression | percent[:digitInfo]
  18306. *
  18307. * For more information about `digitInfo` see {@link DecimalPipe}
  18308. *
  18309. * ### Example
  18310. *
  18311. * {@example core/pipes/ts/number_pipe/number_pipe_example.ts region='PercentPipe'}
  18312. */
  18313. var PercentPipe = (function (_super) {
  18314. __extends(PercentPipe, _super);
  18315. function PercentPipe() {
  18316. _super.apply(this, arguments);
  18317. }
  18318. PercentPipe.prototype.transform = function (value, args) {
  18319. var digits = collection_1.ListWrapper.first(args);
  18320. return NumberPipe._format(value, intl_1.NumberFormatStyle.Percent, digits);
  18321. };
  18322. PercentPipe = __decorate([
  18323. lang_1.CONST(),
  18324. core_1.Pipe({ name: 'percent' }),
  18325. core_1.Injectable(),
  18326. __metadata('design:paramtypes', [])
  18327. ], PercentPipe);
  18328. return PercentPipe;
  18329. })(NumberPipe);
  18330. exports.PercentPipe = PercentPipe;
  18331. /**
  18332. * WARNING: this pipe uses the Internationalization API.
  18333. * Therefore it is only reliable in Chrome and Opera browsers.
  18334. *
  18335. * Formats a number as local currency.
  18336. *
  18337. * ### Usage
  18338. *
  18339. * expression | currency[:currencyCode[:symbolDisplay[:digitInfo]]]
  18340. *
  18341. * where `currencyCode` is the ISO 4217 currency code, such as "USD" for the US dollar and
  18342. * "EUR" for the euro. `symbolDisplay` is a boolean indicating whether to use the currency
  18343. * symbol (e.g. $) or the currency code (e.g. USD) in the output. The default for this value
  18344. * is `false`.
  18345. * For more information about `digitInfo` see {@link DecimalPipe}
  18346. *
  18347. * ### Example
  18348. *
  18349. * {@example core/pipes/ts/number_pipe/number_pipe_example.ts region='CurrencyPipe'}
  18350. */
  18351. var CurrencyPipe = (function (_super) {
  18352. __extends(CurrencyPipe, _super);
  18353. function CurrencyPipe() {
  18354. _super.apply(this, arguments);
  18355. }
  18356. CurrencyPipe.prototype.transform = function (value, args) {
  18357. var currencyCode = lang_1.isPresent(args) && args.length > 0 ? args[0] : 'USD';
  18358. var symbolDisplay = lang_1.isPresent(args) && args.length > 1 ? args[1] : false;
  18359. var digits = lang_1.isPresent(args) && args.length > 2 ? args[2] : null;
  18360. return NumberPipe._format(value, intl_1.NumberFormatStyle.Currency, digits, currencyCode, symbolDisplay);
  18361. };
  18362. CurrencyPipe = __decorate([
  18363. lang_1.CONST(),
  18364. core_1.Pipe({ name: 'currency' }),
  18365. core_1.Injectable(),
  18366. __metadata('design:paramtypes', [])
  18367. ], CurrencyPipe);
  18368. return CurrencyPipe;
  18369. })(NumberPipe);
  18370. exports.CurrencyPipe = CurrencyPipe;
  18371. /***/ },
  18372. /* 115 */
  18373. /***/ function(module, exports, __webpack_require__) {
  18374. function __export(m) {
  18375. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  18376. }
  18377. /**
  18378. * @module
  18379. * @description
  18380. * Common directives shipped with Angular.
  18381. */
  18382. var ng_class_1 = __webpack_require__(116);
  18383. exports.NgClass = ng_class_1.NgClass;
  18384. var ng_for_1 = __webpack_require__(117);
  18385. exports.NgFor = ng_for_1.NgFor;
  18386. var ng_if_1 = __webpack_require__(118);
  18387. exports.NgIf = ng_if_1.NgIf;
  18388. var ng_style_1 = __webpack_require__(119);
  18389. exports.NgStyle = ng_style_1.NgStyle;
  18390. var ng_switch_1 = __webpack_require__(120);
  18391. exports.NgSwitch = ng_switch_1.NgSwitch;
  18392. exports.NgSwitchWhen = ng_switch_1.NgSwitchWhen;
  18393. exports.NgSwitchDefault = ng_switch_1.NgSwitchDefault;
  18394. __export(__webpack_require__(121));
  18395. var core_directives_1 = __webpack_require__(122);
  18396. exports.CORE_DIRECTIVES = core_directives_1.CORE_DIRECTIVES;
  18397. /***/ },
  18398. /* 116 */
  18399. /***/ function(module, exports, __webpack_require__) {
  18400. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18401. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18402. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18403. 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;
  18404. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18405. };
  18406. var __metadata = (this && this.__metadata) || function (k, v) {
  18407. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18408. };
  18409. var lang_1 = __webpack_require__(5);
  18410. var core_1 = __webpack_require__(2);
  18411. var collection_1 = __webpack_require__(12);
  18412. /**
  18413. * The `NgClass` directive conditionally adds and removes CSS classes on an HTML element based on
  18414. * an expression's evaluation result.
  18415. *
  18416. * The result of an expression evaluation is interpreted differently depending on type of
  18417. * the expression evaluation result:
  18418. * - `string` - all the CSS classes listed in a string (space delimited) are added
  18419. * - `Array` - all the CSS classes (Array elements) are added
  18420. * - `Object` - each key corresponds to a CSS class name while values are interpreted as expressions
  18421. * evaluating to `Boolean`. If a given expression evaluates to `true` a corresponding CSS class
  18422. * is added - otherwise it is removed.
  18423. *
  18424. * While the `NgClass` directive can interpret expressions evaluating to `string`, `Array`
  18425. * or `Object`, the `Object`-based version is the most often used and has an advantage of keeping
  18426. * all the CSS class names in a template.
  18427. *
  18428. * ### Example ([live demo](http://plnkr.co/edit/a4YdtmWywhJ33uqfpPPn?p=preview)):
  18429. *
  18430. * ```
  18431. * import {Component} from 'angular2/core';
  18432. * import {NgClass} from 'angular2/common';
  18433. *
  18434. * @Component({
  18435. * selector: 'toggle-button',
  18436. * inputs: ['isDisabled'],
  18437. * template: `
  18438. * <div class="button" [ngClass]="{active: isOn, disabled: isDisabled}"
  18439. * (click)="toggle(!isOn)">
  18440. * Click me!
  18441. * </div>`,
  18442. * styles: [`
  18443. * .button {
  18444. * width: 120px;
  18445. * border: medium solid black;
  18446. * }
  18447. *
  18448. * .active {
  18449. * background-color: red;
  18450. * }
  18451. *
  18452. * .disabled {
  18453. * color: gray;
  18454. * border: medium solid gray;
  18455. * }
  18456. * `]
  18457. * directives: [NgClass]
  18458. * })
  18459. * class ToggleButton {
  18460. * isOn = false;
  18461. * isDisabled = false;
  18462. *
  18463. * toggle(newState) {
  18464. * if (!this.isDisabled) {
  18465. * this.isOn = newState;
  18466. * }
  18467. * }
  18468. * }
  18469. * ```
  18470. */
  18471. var NgClass = (function () {
  18472. function NgClass(_iterableDiffers, _keyValueDiffers, _ngEl, _renderer) {
  18473. this._iterableDiffers = _iterableDiffers;
  18474. this._keyValueDiffers = _keyValueDiffers;
  18475. this._ngEl = _ngEl;
  18476. this._renderer = _renderer;
  18477. this._initialClasses = [];
  18478. }
  18479. Object.defineProperty(NgClass.prototype, "initialClasses", {
  18480. set: function (v) {
  18481. this._applyInitialClasses(true);
  18482. this._initialClasses = lang_1.isPresent(v) && lang_1.isString(v) ? v.split(' ') : [];
  18483. this._applyInitialClasses(false);
  18484. this._applyClasses(this._rawClass, false);
  18485. },
  18486. enumerable: true,
  18487. configurable: true
  18488. });
  18489. Object.defineProperty(NgClass.prototype, "rawClass", {
  18490. set: function (v) {
  18491. this._cleanupClasses(this._rawClass);
  18492. if (lang_1.isString(v)) {
  18493. v = v.split(' ');
  18494. }
  18495. this._rawClass = v;
  18496. if (lang_1.isPresent(v)) {
  18497. if (collection_1.isListLikeIterable(v)) {
  18498. this._differ = this._iterableDiffers.find(v).create(null);
  18499. this._mode = 'iterable';
  18500. }
  18501. else {
  18502. this._differ = this._keyValueDiffers.find(v).create(null);
  18503. this._mode = 'keyValue';
  18504. }
  18505. }
  18506. else {
  18507. this._differ = null;
  18508. }
  18509. },
  18510. enumerable: true,
  18511. configurable: true
  18512. });
  18513. NgClass.prototype.ngDoCheck = function () {
  18514. if (lang_1.isPresent(this._differ)) {
  18515. var changes = this._differ.diff(this._rawClass);
  18516. if (lang_1.isPresent(changes)) {
  18517. if (this._mode == 'iterable') {
  18518. this._applyIterableChanges(changes);
  18519. }
  18520. else {
  18521. this._applyKeyValueChanges(changes);
  18522. }
  18523. }
  18524. }
  18525. };
  18526. NgClass.prototype.ngOnDestroy = function () { this._cleanupClasses(this._rawClass); };
  18527. NgClass.prototype._cleanupClasses = function (rawClassVal) {
  18528. this._applyClasses(rawClassVal, true);
  18529. this._applyInitialClasses(false);
  18530. };
  18531. NgClass.prototype._applyKeyValueChanges = function (changes) {
  18532. var _this = this;
  18533. changes.forEachAddedItem(function (record) { _this._toggleClass(record.key, record.currentValue); });
  18534. changes.forEachChangedItem(function (record) { _this._toggleClass(record.key, record.currentValue); });
  18535. changes.forEachRemovedItem(function (record) {
  18536. if (record.previousValue) {
  18537. _this._toggleClass(record.key, false);
  18538. }
  18539. });
  18540. };
  18541. NgClass.prototype._applyIterableChanges = function (changes) {
  18542. var _this = this;
  18543. changes.forEachAddedItem(function (record) { _this._toggleClass(record.item, true); });
  18544. changes.forEachRemovedItem(function (record) { _this._toggleClass(record.item, false); });
  18545. };
  18546. NgClass.prototype._applyInitialClasses = function (isCleanup) {
  18547. var _this = this;
  18548. this._initialClasses.forEach(function (className) { return _this._toggleClass(className, !isCleanup); });
  18549. };
  18550. NgClass.prototype._applyClasses = function (rawClassVal, isCleanup) {
  18551. var _this = this;
  18552. if (lang_1.isPresent(rawClassVal)) {
  18553. if (lang_1.isArray(rawClassVal)) {
  18554. rawClassVal.forEach(function (className) { return _this._toggleClass(className, !isCleanup); });
  18555. }
  18556. else if (rawClassVal instanceof Set) {
  18557. rawClassVal.forEach(function (className) { return _this._toggleClass(className, !isCleanup); });
  18558. }
  18559. else {
  18560. collection_1.StringMapWrapper.forEach(rawClassVal, function (expVal, className) {
  18561. if (expVal)
  18562. _this._toggleClass(className, !isCleanup);
  18563. });
  18564. }
  18565. }
  18566. };
  18567. NgClass.prototype._toggleClass = function (className, enabled) {
  18568. className = className.trim();
  18569. if (className.length > 0) {
  18570. if (className.indexOf(' ') > -1) {
  18571. var classes = className.split(/\s+/g);
  18572. for (var i = 0, len = classes.length; i < len; i++) {
  18573. this._renderer.setElementClass(this._ngEl, classes[i], enabled);
  18574. }
  18575. }
  18576. else {
  18577. this._renderer.setElementClass(this._ngEl, className, enabled);
  18578. }
  18579. }
  18580. };
  18581. NgClass = __decorate([
  18582. core_1.Directive({ selector: '[ngClass]', inputs: ['rawClass: ngClass', 'initialClasses: class'] }),
  18583. __metadata('design:paramtypes', [core_1.IterableDiffers, core_1.KeyValueDiffers, core_1.ElementRef, core_1.Renderer])
  18584. ], NgClass);
  18585. return NgClass;
  18586. })();
  18587. exports.NgClass = NgClass;
  18588. /***/ },
  18589. /* 117 */
  18590. /***/ function(module, exports, __webpack_require__) {
  18591. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18592. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18593. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18594. 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;
  18595. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18596. };
  18597. var __metadata = (this && this.__metadata) || function (k, v) {
  18598. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18599. };
  18600. var core_1 = __webpack_require__(2);
  18601. var lang_1 = __webpack_require__(5);
  18602. /**
  18603. * The `NgFor` directive instantiates a template once per item from an iterable. The context for
  18604. * each instantiated template inherits from the outer context with the given loop variable set
  18605. * to the current item from the iterable.
  18606. *
  18607. * # Local Variables
  18608. *
  18609. * `NgFor` provides several exported values that can be aliased to local variables:
  18610. *
  18611. * * `index` will be set to the current loop iteration for each template context.
  18612. * * `last` will be set to a boolean value indicating whether the item is the last one in the
  18613. * iteration.
  18614. * * `even` will be set to a boolean value indicating whether this item has an even index.
  18615. * * `odd` will be set to a boolean value indicating whether this item has an odd index.
  18616. *
  18617. * # Change Propagation
  18618. *
  18619. * When the contents of the iterator changes, `NgFor` makes the corresponding changes to the DOM:
  18620. *
  18621. * * When an item is added, a new instance of the template is added to the DOM.
  18622. * * When an item is removed, its template instance is removed from the DOM.
  18623. * * When items are reordered, their respective templates are reordered in the DOM.
  18624. * * Otherwise, the DOM element for that item will remain the same.
  18625. *
  18626. * Angular uses object identity to track insertions and deletions within the iterator and reproduce
  18627. * those changes in the DOM. This has important implications for animations and any stateful
  18628. * controls
  18629. * (such as `<input>` elements which accept user input) that are present. Inserted rows can be
  18630. * animated in, deleted rows can be animated out, and unchanged rows retain any unsaved state such
  18631. * as user input.
  18632. *
  18633. * It is possible for the identities of elements in the iterator to change while the data does not.
  18634. * This can happen, for example, if the iterator produced from an RPC to the server, and that
  18635. * RPC is re-run. Even if the data hasn't changed, the second response will produce objects with
  18636. * different identities, and Angular will tear down the entire DOM and rebuild it (as if all old
  18637. * elements were deleted and all new elements inserted). This is an expensive operation and should
  18638. * be avoided if possible.
  18639. *
  18640. * # Syntax
  18641. *
  18642. * - `<li *ngFor="#item of items; #i = index">...</li>`
  18643. * - `<li template="ngFor #item of items; #i = index">...</li>`
  18644. * - `<template ngFor #item [ngForOf]="items" #i="index"><li>...</li></template>`
  18645. *
  18646. * ### Example
  18647. *
  18648. * See a [live demo](http://plnkr.co/edit/KVuXxDp0qinGDyo307QW?p=preview) for a more detailed
  18649. * example.
  18650. */
  18651. var NgFor = (function () {
  18652. function NgFor(_viewContainer, _templateRef, _iterableDiffers, _cdr) {
  18653. this._viewContainer = _viewContainer;
  18654. this._templateRef = _templateRef;
  18655. this._iterableDiffers = _iterableDiffers;
  18656. this._cdr = _cdr;
  18657. }
  18658. Object.defineProperty(NgFor.prototype, "ngForOf", {
  18659. set: function (value) {
  18660. this._ngForOf = value;
  18661. if (lang_1.isBlank(this._differ) && lang_1.isPresent(value)) {
  18662. this._differ = this._iterableDiffers.find(value).create(this._cdr);
  18663. }
  18664. },
  18665. enumerable: true,
  18666. configurable: true
  18667. });
  18668. Object.defineProperty(NgFor.prototype, "ngForTemplate", {
  18669. set: function (value) {
  18670. if (lang_1.isPresent(value)) {
  18671. this._templateRef = value;
  18672. }
  18673. },
  18674. enumerable: true,
  18675. configurable: true
  18676. });
  18677. NgFor.prototype.ngDoCheck = function () {
  18678. if (lang_1.isPresent(this._differ)) {
  18679. var changes = this._differ.diff(this._ngForOf);
  18680. if (lang_1.isPresent(changes))
  18681. this._applyChanges(changes);
  18682. }
  18683. };
  18684. NgFor.prototype._applyChanges = function (changes) {
  18685. // TODO(rado): check if change detection can produce a change record that is
  18686. // easier to consume than current.
  18687. var recordViewTuples = [];
  18688. changes.forEachRemovedItem(function (removedRecord) {
  18689. return recordViewTuples.push(new RecordViewTuple(removedRecord, null));
  18690. });
  18691. changes.forEachMovedItem(function (movedRecord) {
  18692. return recordViewTuples.push(new RecordViewTuple(movedRecord, null));
  18693. });
  18694. var insertTuples = this._bulkRemove(recordViewTuples);
  18695. changes.forEachAddedItem(function (addedRecord) {
  18696. return insertTuples.push(new RecordViewTuple(addedRecord, null));
  18697. });
  18698. this._bulkInsert(insertTuples);
  18699. for (var i = 0; i < insertTuples.length; i++) {
  18700. this._perViewChange(insertTuples[i].view, insertTuples[i].record);
  18701. }
  18702. for (var i = 0, ilen = this._viewContainer.length; i < ilen; i++) {
  18703. this._viewContainer.get(i).setLocal('last', i === ilen - 1);
  18704. }
  18705. };
  18706. NgFor.prototype._perViewChange = function (view, record) {
  18707. view.setLocal('\$implicit', record.item);
  18708. view.setLocal('index', record.currentIndex);
  18709. view.setLocal('even', (record.currentIndex % 2 == 0));
  18710. view.setLocal('odd', (record.currentIndex % 2 == 1));
  18711. };
  18712. NgFor.prototype._bulkRemove = function (tuples) {
  18713. tuples.sort(function (a, b) { return a.record.previousIndex - b.record.previousIndex; });
  18714. var movedTuples = [];
  18715. for (var i = tuples.length - 1; i >= 0; i--) {
  18716. var tuple = tuples[i];
  18717. // separate moved views from removed views.
  18718. if (lang_1.isPresent(tuple.record.currentIndex)) {
  18719. tuple.view = this._viewContainer.detach(tuple.record.previousIndex);
  18720. movedTuples.push(tuple);
  18721. }
  18722. else {
  18723. this._viewContainer.remove(tuple.record.previousIndex);
  18724. }
  18725. }
  18726. return movedTuples;
  18727. };
  18728. NgFor.prototype._bulkInsert = function (tuples) {
  18729. tuples.sort(function (a, b) { return a.record.currentIndex - b.record.currentIndex; });
  18730. for (var i = 0; i < tuples.length; i++) {
  18731. var tuple = tuples[i];
  18732. if (lang_1.isPresent(tuple.view)) {
  18733. this._viewContainer.insert(tuple.view, tuple.record.currentIndex);
  18734. }
  18735. else {
  18736. tuple.view =
  18737. this._viewContainer.createEmbeddedView(this._templateRef, tuple.record.currentIndex);
  18738. }
  18739. }
  18740. return tuples;
  18741. };
  18742. NgFor = __decorate([
  18743. core_1.Directive({ selector: '[ngFor][ngForOf]', inputs: ['ngForOf', 'ngForTemplate'] }),
  18744. __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef, core_1.IterableDiffers, core_1.ChangeDetectorRef])
  18745. ], NgFor);
  18746. return NgFor;
  18747. })();
  18748. exports.NgFor = NgFor;
  18749. var RecordViewTuple = (function () {
  18750. function RecordViewTuple(record, view) {
  18751. this.record = record;
  18752. this.view = view;
  18753. }
  18754. return RecordViewTuple;
  18755. })();
  18756. /***/ },
  18757. /* 118 */
  18758. /***/ function(module, exports, __webpack_require__) {
  18759. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18760. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18761. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18762. 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;
  18763. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18764. };
  18765. var __metadata = (this && this.__metadata) || function (k, v) {
  18766. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18767. };
  18768. var core_1 = __webpack_require__(2);
  18769. var lang_1 = __webpack_require__(5);
  18770. /**
  18771. * Removes or recreates a portion of the DOM tree based on an {expression}.
  18772. *
  18773. * If the expression assigned to `ngIf` evaluates to a false value then the element
  18774. * is removed from the DOM, otherwise a clone of the element is reinserted into the DOM.
  18775. *
  18776. * ### Example ([live demo](http://plnkr.co/edit/fe0kgemFBtmQOY31b4tw?p=preview)):
  18777. *
  18778. * ```
  18779. * <div *ngIf="errorCount > 0" class="error">
  18780. * <!-- Error message displayed when the errorCount property on the current context is greater
  18781. * than 0. -->
  18782. * {{errorCount}} errors detected
  18783. * </div>
  18784. * ```
  18785. *
  18786. * ### Syntax
  18787. *
  18788. * - `<div *ngIf="condition">...</div>`
  18789. * - `<div template="ngIf condition">...</div>`
  18790. * - `<template [ngIf]="condition"><div>...</div></template>`
  18791. */
  18792. var NgIf = (function () {
  18793. function NgIf(_viewContainer, _templateRef) {
  18794. this._viewContainer = _viewContainer;
  18795. this._templateRef = _templateRef;
  18796. this._prevCondition = null;
  18797. }
  18798. Object.defineProperty(NgIf.prototype, "ngIf", {
  18799. set: function (newCondition /* boolean */) {
  18800. if (newCondition && (lang_1.isBlank(this._prevCondition) || !this._prevCondition)) {
  18801. this._prevCondition = true;
  18802. this._viewContainer.createEmbeddedView(this._templateRef);
  18803. }
  18804. else if (!newCondition && (lang_1.isBlank(this._prevCondition) || this._prevCondition)) {
  18805. this._prevCondition = false;
  18806. this._viewContainer.clear();
  18807. }
  18808. },
  18809. enumerable: true,
  18810. configurable: true
  18811. });
  18812. NgIf = __decorate([
  18813. core_1.Directive({ selector: '[ngIf]', inputs: ['ngIf'] }),
  18814. __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef])
  18815. ], NgIf);
  18816. return NgIf;
  18817. })();
  18818. exports.NgIf = NgIf;
  18819. /***/ },
  18820. /* 119 */
  18821. /***/ function(module, exports, __webpack_require__) {
  18822. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18823. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18824. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18825. 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;
  18826. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18827. };
  18828. var __metadata = (this && this.__metadata) || function (k, v) {
  18829. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18830. };
  18831. var core_1 = __webpack_require__(2);
  18832. var lang_1 = __webpack_require__(5);
  18833. /**
  18834. * The `NgStyle` directive changes styles based on a result of expression evaluation.
  18835. *
  18836. * An expression assigned to the `ngStyle` property must evaluate to an object and the
  18837. * corresponding element styles are updated based on changes to this object. Style names to update
  18838. * are taken from the object's keys, and values - from the corresponding object's values.
  18839. *
  18840. * ### Syntax
  18841. *
  18842. * - `<div [ngStyle]="{'font-style': style}"></div>`
  18843. * - `<div [ngStyle]="styleExp"></div>` - here the `styleExp` must evaluate to an object
  18844. *
  18845. * ### Example ([live demo](http://plnkr.co/edit/YamGS6GkUh9GqWNQhCyM?p=preview)):
  18846. *
  18847. * ```
  18848. * import {Component} from 'angular2/core';
  18849. * import {NgStyle} from 'angular2/common';
  18850. *
  18851. * @Component({
  18852. * selector: 'ngStyle-example',
  18853. * template: `
  18854. * <h1 [ngStyle]="{'font-style': style, 'font-size': size, 'font-weight': weight}">
  18855. * Change style of this text!
  18856. * </h1>
  18857. *
  18858. * <hr>
  18859. *
  18860. * <label>Italic: <input type="checkbox" (change)="changeStyle($event)"></label>
  18861. * <label>Bold: <input type="checkbox" (change)="changeWeight($event)"></label>
  18862. * <label>Size: <input type="text" [value]="size" (change)="size = $event.target.value"></label>
  18863. * `,
  18864. * directives: [NgStyle]
  18865. * })
  18866. * export class NgStyleExample {
  18867. * style = 'normal';
  18868. * weight = 'normal';
  18869. * size = '20px';
  18870. *
  18871. * changeStyle($event: any) {
  18872. * this.style = $event.target.checked ? 'italic' : 'normal';
  18873. * }
  18874. *
  18875. * changeWeight($event: any) {
  18876. * this.weight = $event.target.checked ? 'bold' : 'normal';
  18877. * }
  18878. * }
  18879. * ```
  18880. *
  18881. * In this example the `font-style`, `font-size` and `font-weight` styles will be updated
  18882. * based on the `style` property's value changes.
  18883. */
  18884. var NgStyle = (function () {
  18885. function NgStyle(_differs, _ngEl, _renderer) {
  18886. this._differs = _differs;
  18887. this._ngEl = _ngEl;
  18888. this._renderer = _renderer;
  18889. }
  18890. Object.defineProperty(NgStyle.prototype, "rawStyle", {
  18891. set: function (v) {
  18892. this._rawStyle = v;
  18893. if (lang_1.isBlank(this._differ) && lang_1.isPresent(v)) {
  18894. this._differ = this._differs.find(this._rawStyle).create(null);
  18895. }
  18896. },
  18897. enumerable: true,
  18898. configurable: true
  18899. });
  18900. NgStyle.prototype.ngDoCheck = function () {
  18901. if (lang_1.isPresent(this._differ)) {
  18902. var changes = this._differ.diff(this._rawStyle);
  18903. if (lang_1.isPresent(changes)) {
  18904. this._applyChanges(changes);
  18905. }
  18906. }
  18907. };
  18908. NgStyle.prototype._applyChanges = function (changes) {
  18909. var _this = this;
  18910. changes.forEachAddedItem(function (record) { _this._setStyle(record.key, record.currentValue); });
  18911. changes.forEachChangedItem(function (record) { _this._setStyle(record.key, record.currentValue); });
  18912. changes.forEachRemovedItem(function (record) { _this._setStyle(record.key, null); });
  18913. };
  18914. NgStyle.prototype._setStyle = function (name, val) {
  18915. this._renderer.setElementStyle(this._ngEl, name, val);
  18916. };
  18917. NgStyle = __decorate([
  18918. core_1.Directive({ selector: '[ngStyle]', inputs: ['rawStyle: ngStyle'] }),
  18919. __metadata('design:paramtypes', [core_1.KeyValueDiffers, core_1.ElementRef, core_1.Renderer])
  18920. ], NgStyle);
  18921. return NgStyle;
  18922. })();
  18923. exports.NgStyle = NgStyle;
  18924. /***/ },
  18925. /* 120 */
  18926. /***/ function(module, exports, __webpack_require__) {
  18927. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  18928. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  18929. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  18930. 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;
  18931. return c > 3 && r && Object.defineProperty(target, key, r), r;
  18932. };
  18933. var __metadata = (this && this.__metadata) || function (k, v) {
  18934. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  18935. };
  18936. var __param = (this && this.__param) || function (paramIndex, decorator) {
  18937. return function (target, key) { decorator(target, key, paramIndex); }
  18938. };
  18939. var core_1 = __webpack_require__(2);
  18940. var lang_1 = __webpack_require__(5);
  18941. var collection_1 = __webpack_require__(12);
  18942. var _WHEN_DEFAULT = lang_1.CONST_EXPR(new Object());
  18943. var SwitchView = (function () {
  18944. function SwitchView(_viewContainerRef, _templateRef) {
  18945. this._viewContainerRef = _viewContainerRef;
  18946. this._templateRef = _templateRef;
  18947. }
  18948. SwitchView.prototype.create = function () { this._viewContainerRef.createEmbeddedView(this._templateRef); };
  18949. SwitchView.prototype.destroy = function () { this._viewContainerRef.clear(); };
  18950. return SwitchView;
  18951. })();
  18952. /**
  18953. * Adds or removes DOM sub-trees when their match expressions match the switch expression.
  18954. *
  18955. * Elements within `NgSwitch` but without `NgSwitchWhen` or `NgSwitchDefault` directives will be
  18956. * preserved at the location as specified in the template.
  18957. *
  18958. * `NgSwitch` simply inserts nested elements based on which match expression matches the value
  18959. * obtained from the evaluated switch expression. In other words, you define a container element
  18960. * (where you place the directive with a switch expression on the
  18961. * **`[ngSwitch]="..."` attribute**), define any inner elements inside of the directive and
  18962. * place a `[ngSwitchWhen]` attribute per element.
  18963. *
  18964. * The `ngSwitchWhen` property is used to inform `NgSwitch` which element to display when the
  18965. * expression is evaluated. If a matching expression is not found via a `ngSwitchWhen` property
  18966. * then an element with the `ngSwitchDefault` attribute is displayed.
  18967. *
  18968. * ### Example ([live demo](http://plnkr.co/edit/DQMTII95CbuqWrl3lYAs?p=preview))
  18969. *
  18970. * ```typescript
  18971. * @Component({selector: 'app'})
  18972. * @View({
  18973. * template: `
  18974. * <p>Value = {{value}}</p>
  18975. * <button (click)="inc()">Increment</button>
  18976. *
  18977. * <div [ngSwitch]="value">
  18978. * <p *ngSwitchWhen="'init'">increment to start</p>
  18979. * <p *ngSwitchWhen="0">0, increment again</p>
  18980. * <p *ngSwitchWhen="1">1, increment again</p>
  18981. * <p *ngSwitchWhen="2">2, stop incrementing</p>
  18982. * <p *ngSwitchDefault>&gt; 2, STOP!</p>
  18983. * </div>
  18984. *
  18985. * <!-- alternate syntax -->
  18986. *
  18987. * <p [ngSwitch]="value">
  18988. * <template ngSwitchWhen="init">increment to start</template>
  18989. * <template [ngSwitchWhen]="0">0, increment again</template>
  18990. * <template [ngSwitchWhen]="1">1, increment again</template>
  18991. * <template [ngSwitchWhen]="2">2, stop incrementing</template>
  18992. * <template ngSwitchDefault>&gt; 2, STOP!</template>
  18993. * </p>
  18994. * `,
  18995. * directives: [NgSwitch, NgSwitchWhen, NgSwitchDefault]
  18996. * })
  18997. * export class App {
  18998. * value = 'init';
  18999. *
  19000. * inc() {
  19001. * this.value = this.value === 'init' ? 0 : this.value + 1;
  19002. * }
  19003. * }
  19004. *
  19005. * bootstrap(App).catch(err => console.error(err));
  19006. * ```
  19007. */
  19008. var NgSwitch = (function () {
  19009. function NgSwitch() {
  19010. this._useDefault = false;
  19011. this._valueViews = new collection_1.Map();
  19012. this._activeViews = [];
  19013. }
  19014. Object.defineProperty(NgSwitch.prototype, "ngSwitch", {
  19015. set: function (value) {
  19016. // Empty the currently active ViewContainers
  19017. this._emptyAllActiveViews();
  19018. // Add the ViewContainers matching the value (with a fallback to default)
  19019. this._useDefault = false;
  19020. var views = this._valueViews.get(value);
  19021. if (lang_1.isBlank(views)) {
  19022. this._useDefault = true;
  19023. views = lang_1.normalizeBlank(this._valueViews.get(_WHEN_DEFAULT));
  19024. }
  19025. this._activateViews(views);
  19026. this._switchValue = value;
  19027. },
  19028. enumerable: true,
  19029. configurable: true
  19030. });
  19031. /** @internal */
  19032. NgSwitch.prototype._onWhenValueChanged = function (oldWhen, newWhen, view) {
  19033. this._deregisterView(oldWhen, view);
  19034. this._registerView(newWhen, view);
  19035. if (oldWhen === this._switchValue) {
  19036. view.destroy();
  19037. collection_1.ListWrapper.remove(this._activeViews, view);
  19038. }
  19039. else if (newWhen === this._switchValue) {
  19040. if (this._useDefault) {
  19041. this._useDefault = false;
  19042. this._emptyAllActiveViews();
  19043. }
  19044. view.create();
  19045. this._activeViews.push(view);
  19046. }
  19047. // Switch to default when there is no more active ViewContainers
  19048. if (this._activeViews.length === 0 && !this._useDefault) {
  19049. this._useDefault = true;
  19050. this._activateViews(this._valueViews.get(_WHEN_DEFAULT));
  19051. }
  19052. };
  19053. /** @internal */
  19054. NgSwitch.prototype._emptyAllActiveViews = function () {
  19055. var activeContainers = this._activeViews;
  19056. for (var i = 0; i < activeContainers.length; i++) {
  19057. activeContainers[i].destroy();
  19058. }
  19059. this._activeViews = [];
  19060. };
  19061. /** @internal */
  19062. NgSwitch.prototype._activateViews = function (views) {
  19063. // TODO(vicb): assert(this._activeViews.length === 0);
  19064. if (lang_1.isPresent(views)) {
  19065. for (var i = 0; i < views.length; i++) {
  19066. views[i].create();
  19067. }
  19068. this._activeViews = views;
  19069. }
  19070. };
  19071. /** @internal */
  19072. NgSwitch.prototype._registerView = function (value, view) {
  19073. var views = this._valueViews.get(value);
  19074. if (lang_1.isBlank(views)) {
  19075. views = [];
  19076. this._valueViews.set(value, views);
  19077. }
  19078. views.push(view);
  19079. };
  19080. /** @internal */
  19081. NgSwitch.prototype._deregisterView = function (value, view) {
  19082. // `_WHEN_DEFAULT` is used a marker for non-registered whens
  19083. if (value === _WHEN_DEFAULT)
  19084. return;
  19085. var views = this._valueViews.get(value);
  19086. if (views.length == 1) {
  19087. this._valueViews.delete(value);
  19088. }
  19089. else {
  19090. collection_1.ListWrapper.remove(views, view);
  19091. }
  19092. };
  19093. NgSwitch = __decorate([
  19094. core_1.Directive({ selector: '[ngSwitch]', inputs: ['ngSwitch'] }),
  19095. __metadata('design:paramtypes', [])
  19096. ], NgSwitch);
  19097. return NgSwitch;
  19098. })();
  19099. exports.NgSwitch = NgSwitch;
  19100. /**
  19101. * Insert the sub-tree when the `ngSwitchWhen` expression evaluates to the same value as the
  19102. * enclosing switch expression.
  19103. *
  19104. * If multiple match expression match the switch expression value, all of them are displayed.
  19105. *
  19106. * See {@link NgSwitch} for more details and example.
  19107. */
  19108. var NgSwitchWhen = (function () {
  19109. function NgSwitchWhen(viewContainer, templateRef, ngSwitch) {
  19110. // `_WHEN_DEFAULT` is used as a marker for a not yet initialized value
  19111. /** @internal */
  19112. this._value = _WHEN_DEFAULT;
  19113. this._switch = ngSwitch;
  19114. this._view = new SwitchView(viewContainer, templateRef);
  19115. }
  19116. Object.defineProperty(NgSwitchWhen.prototype, "ngSwitchWhen", {
  19117. set: function (value) {
  19118. this._switch._onWhenValueChanged(this._value, value, this._view);
  19119. this._value = value;
  19120. },
  19121. enumerable: true,
  19122. configurable: true
  19123. });
  19124. NgSwitchWhen = __decorate([
  19125. core_1.Directive({ selector: '[ngSwitchWhen]', inputs: ['ngSwitchWhen'] }),
  19126. __param(2, core_1.Host()),
  19127. __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef, NgSwitch])
  19128. ], NgSwitchWhen);
  19129. return NgSwitchWhen;
  19130. })();
  19131. exports.NgSwitchWhen = NgSwitchWhen;
  19132. /**
  19133. * Default case statements are displayed when no match expression matches the switch expression
  19134. * value.
  19135. *
  19136. * See {@link NgSwitch} for more details and example.
  19137. */
  19138. var NgSwitchDefault = (function () {
  19139. function NgSwitchDefault(viewContainer, templateRef, sswitch) {
  19140. sswitch._registerView(_WHEN_DEFAULT, new SwitchView(viewContainer, templateRef));
  19141. }
  19142. NgSwitchDefault = __decorate([
  19143. core_1.Directive({ selector: '[ngSwitchDefault]' }),
  19144. __param(2, core_1.Host()),
  19145. __metadata('design:paramtypes', [core_1.ViewContainerRef, core_1.TemplateRef, NgSwitch])
  19146. ], NgSwitchDefault);
  19147. return NgSwitchDefault;
  19148. })();
  19149. exports.NgSwitchDefault = NgSwitchDefault;
  19150. /***/ },
  19151. /* 121 */
  19152. /***/ function(module, exports) {
  19153. // TS does not have Observables
  19154. /***/ },
  19155. /* 122 */
  19156. /***/ function(module, exports, __webpack_require__) {
  19157. var lang_1 = __webpack_require__(5);
  19158. var ng_class_1 = __webpack_require__(116);
  19159. var ng_for_1 = __webpack_require__(117);
  19160. var ng_if_1 = __webpack_require__(118);
  19161. var ng_style_1 = __webpack_require__(119);
  19162. var ng_switch_1 = __webpack_require__(120);
  19163. /**
  19164. * A collection of Angular core directives that are likely to be used in each and every Angular
  19165. * application.
  19166. *
  19167. * This collection can be used to quickly enumerate all the built-in directives in the `directives`
  19168. * property of the `@View` annotation.
  19169. *
  19170. * ### Example ([live demo](http://plnkr.co/edit/yakGwpCdUkg0qfzX5m8g?p=preview))
  19171. *
  19172. * Instead of writing:
  19173. *
  19174. * ```typescript
  19175. * import {NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault} from 'angular2/common';
  19176. * import {OtherDirective} from './myDirectives';
  19177. *
  19178. * @Component({
  19179. * selector: 'my-component',
  19180. * templateUrl: 'myComponent.html',
  19181. * directives: [NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault, OtherDirective]
  19182. * })
  19183. * export class MyComponent {
  19184. * ...
  19185. * }
  19186. * ```
  19187. * one could import all the core directives at once:
  19188. *
  19189. * ```typescript
  19190. * import {CORE_DIRECTIVES} from 'angular2/common';
  19191. * import {OtherDirective} from './myDirectives';
  19192. *
  19193. * @Component({
  19194. * selector: 'my-component',
  19195. * templateUrl: 'myComponent.html',
  19196. * directives: [CORE_DIRECTIVES, OtherDirective]
  19197. * })
  19198. * export class MyComponent {
  19199. * ...
  19200. * }
  19201. * ```
  19202. */
  19203. 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]);
  19204. /***/ },
  19205. /* 123 */
  19206. /***/ function(module, exports, __webpack_require__) {
  19207. /**
  19208. * @module
  19209. * @description
  19210. * This module is used for handling user input, by defining and building a {@link ControlGroup} that
  19211. * consists of
  19212. * {@link Control} objects, and mapping them onto the DOM. {@link Control} objects can then be used
  19213. * to read information
  19214. * from the form DOM elements.
  19215. *
  19216. * This module is not included in the `angular2` module; you must import the forms module
  19217. * explicitly.
  19218. *
  19219. */
  19220. var model_1 = __webpack_require__(124);
  19221. exports.AbstractControl = model_1.AbstractControl;
  19222. exports.Control = model_1.Control;
  19223. exports.ControlGroup = model_1.ControlGroup;
  19224. exports.ControlArray = model_1.ControlArray;
  19225. var abstract_control_directive_1 = __webpack_require__(125);
  19226. exports.AbstractControlDirective = abstract_control_directive_1.AbstractControlDirective;
  19227. var control_container_1 = __webpack_require__(126);
  19228. exports.ControlContainer = control_container_1.ControlContainer;
  19229. var ng_control_name_1 = __webpack_require__(127);
  19230. exports.NgControlName = ng_control_name_1.NgControlName;
  19231. var ng_form_control_1 = __webpack_require__(137);
  19232. exports.NgFormControl = ng_form_control_1.NgFormControl;
  19233. var ng_model_1 = __webpack_require__(138);
  19234. exports.NgModel = ng_model_1.NgModel;
  19235. var ng_control_1 = __webpack_require__(128);
  19236. exports.NgControl = ng_control_1.NgControl;
  19237. var ng_control_group_1 = __webpack_require__(139);
  19238. exports.NgControlGroup = ng_control_group_1.NgControlGroup;
  19239. var ng_form_model_1 = __webpack_require__(140);
  19240. exports.NgFormModel = ng_form_model_1.NgFormModel;
  19241. var ng_form_1 = __webpack_require__(141);
  19242. exports.NgForm = ng_form_1.NgForm;
  19243. var control_value_accessor_1 = __webpack_require__(129);
  19244. exports.NG_VALUE_ACCESSOR = control_value_accessor_1.NG_VALUE_ACCESSOR;
  19245. var default_value_accessor_1 = __webpack_require__(132);
  19246. exports.DefaultValueAccessor = default_value_accessor_1.DefaultValueAccessor;
  19247. var ng_control_status_1 = __webpack_require__(142);
  19248. exports.NgControlStatus = ng_control_status_1.NgControlStatus;
  19249. var checkbox_value_accessor_1 = __webpack_require__(134);
  19250. exports.CheckboxControlValueAccessor = checkbox_value_accessor_1.CheckboxControlValueAccessor;
  19251. var select_control_value_accessor_1 = __webpack_require__(135);
  19252. exports.NgSelectOption = select_control_value_accessor_1.NgSelectOption;
  19253. exports.SelectControlValueAccessor = select_control_value_accessor_1.SelectControlValueAccessor;
  19254. var directives_1 = __webpack_require__(143);
  19255. exports.FORM_DIRECTIVES = directives_1.FORM_DIRECTIVES;
  19256. var validators_1 = __webpack_require__(131);
  19257. exports.NG_VALIDATORS = validators_1.NG_VALIDATORS;
  19258. exports.NG_ASYNC_VALIDATORS = validators_1.NG_ASYNC_VALIDATORS;
  19259. exports.Validators = validators_1.Validators;
  19260. var validators_2 = __webpack_require__(144);
  19261. exports.RequiredValidator = validators_2.RequiredValidator;
  19262. exports.MinLengthValidator = validators_2.MinLengthValidator;
  19263. exports.MaxLengthValidator = validators_2.MaxLengthValidator;
  19264. var form_builder_1 = __webpack_require__(145);
  19265. exports.FormBuilder = form_builder_1.FormBuilder;
  19266. exports.FORM_PROVIDERS = form_builder_1.FORM_PROVIDERS;
  19267. exports.FORM_BINDINGS = form_builder_1.FORM_BINDINGS;
  19268. /***/ },
  19269. /* 124 */
  19270. /***/ function(module, exports, __webpack_require__) {
  19271. var __extends = (this && this.__extends) || function (d, b) {
  19272. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  19273. function __() { this.constructor = d; }
  19274. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  19275. };
  19276. var lang_1 = __webpack_require__(5);
  19277. var async_1 = __webpack_require__(60);
  19278. var promise_1 = __webpack_require__(61);
  19279. var collection_1 = __webpack_require__(12);
  19280. /**
  19281. * Indicates that a Control is valid, i.e. that no errors exist in the input value.
  19282. */
  19283. exports.VALID = "VALID";
  19284. /**
  19285. * Indicates that a Control is invalid, i.e. that an error exists in the input value.
  19286. */
  19287. exports.INVALID = "INVALID";
  19288. /**
  19289. * Indicates that a Control is pending, i.e. that async validation is occuring and
  19290. * errors are not yet available for the input value.
  19291. */
  19292. exports.PENDING = "PENDING";
  19293. function isControl(control) {
  19294. return control instanceof AbstractControl;
  19295. }
  19296. exports.isControl = isControl;
  19297. function _find(control, path) {
  19298. if (lang_1.isBlank(path))
  19299. return null;
  19300. if (!(path instanceof Array)) {
  19301. path = path.split("/");
  19302. }
  19303. if (path instanceof Array && collection_1.ListWrapper.isEmpty(path))
  19304. return null;
  19305. return path
  19306. .reduce(function (v, name) {
  19307. if (v instanceof ControlGroup) {
  19308. return lang_1.isPresent(v.controls[name]) ? v.controls[name] : null;
  19309. }
  19310. else if (v instanceof ControlArray) {
  19311. var index = name;
  19312. return lang_1.isPresent(v.at(index)) ? v.at(index) : null;
  19313. }
  19314. else {
  19315. return null;
  19316. }
  19317. }, control);
  19318. }
  19319. function toObservable(r) {
  19320. return promise_1.PromiseWrapper.isPromise(r) ? async_1.ObservableWrapper.fromPromise(r) : r;
  19321. }
  19322. /**
  19323. *
  19324. */
  19325. var AbstractControl = (function () {
  19326. function AbstractControl(validator, asyncValidator) {
  19327. this.validator = validator;
  19328. this.asyncValidator = asyncValidator;
  19329. this._pristine = true;
  19330. this._touched = false;
  19331. }
  19332. Object.defineProperty(AbstractControl.prototype, "value", {
  19333. get: function () { return this._value; },
  19334. enumerable: true,
  19335. configurable: true
  19336. });
  19337. Object.defineProperty(AbstractControl.prototype, "status", {
  19338. get: function () { return this._status; },
  19339. enumerable: true,
  19340. configurable: true
  19341. });
  19342. Object.defineProperty(AbstractControl.prototype, "valid", {
  19343. get: function () { return this._status === exports.VALID; },
  19344. enumerable: true,
  19345. configurable: true
  19346. });
  19347. Object.defineProperty(AbstractControl.prototype, "errors", {
  19348. /**
  19349. * Returns the errors of this control.
  19350. */
  19351. get: function () { return this._errors; },
  19352. enumerable: true,
  19353. configurable: true
  19354. });
  19355. Object.defineProperty(AbstractControl.prototype, "pristine", {
  19356. get: function () { return this._pristine; },
  19357. enumerable: true,
  19358. configurable: true
  19359. });
  19360. Object.defineProperty(AbstractControl.prototype, "dirty", {
  19361. get: function () { return !this.pristine; },
  19362. enumerable: true,
  19363. configurable: true
  19364. });
  19365. Object.defineProperty(AbstractControl.prototype, "touched", {
  19366. get: function () { return this._touched; },
  19367. enumerable: true,
  19368. configurable: true
  19369. });
  19370. Object.defineProperty(AbstractControl.prototype, "untouched", {
  19371. get: function () { return !this._touched; },
  19372. enumerable: true,
  19373. configurable: true
  19374. });
  19375. Object.defineProperty(AbstractControl.prototype, "valueChanges", {
  19376. get: function () { return this._valueChanges; },
  19377. enumerable: true,
  19378. configurable: true
  19379. });
  19380. Object.defineProperty(AbstractControl.prototype, "statusChanges", {
  19381. get: function () { return this._statusChanges; },
  19382. enumerable: true,
  19383. configurable: true
  19384. });
  19385. Object.defineProperty(AbstractControl.prototype, "pending", {
  19386. get: function () { return this._status == exports.PENDING; },
  19387. enumerable: true,
  19388. configurable: true
  19389. });
  19390. AbstractControl.prototype.markAsTouched = function () { this._touched = true; };
  19391. AbstractControl.prototype.markAsDirty = function (_a) {
  19392. var onlySelf = (_a === void 0 ? {} : _a).onlySelf;
  19393. onlySelf = lang_1.normalizeBool(onlySelf);
  19394. this._pristine = false;
  19395. if (lang_1.isPresent(this._parent) && !onlySelf) {
  19396. this._parent.markAsDirty({ onlySelf: onlySelf });
  19397. }
  19398. };
  19399. AbstractControl.prototype.markAsPending = function (_a) {
  19400. var onlySelf = (_a === void 0 ? {} : _a).onlySelf;
  19401. onlySelf = lang_1.normalizeBool(onlySelf);
  19402. this._status = exports.PENDING;
  19403. if (lang_1.isPresent(this._parent) && !onlySelf) {
  19404. this._parent.markAsPending({ onlySelf: onlySelf });
  19405. }
  19406. };
  19407. AbstractControl.prototype.setParent = function (parent) { this._parent = parent; };
  19408. AbstractControl.prototype.updateValueAndValidity = function (_a) {
  19409. var _b = _a === void 0 ? {} : _a, onlySelf = _b.onlySelf, emitEvent = _b.emitEvent;
  19410. onlySelf = lang_1.normalizeBool(onlySelf);
  19411. emitEvent = lang_1.isPresent(emitEvent) ? emitEvent : true;
  19412. this._updateValue();
  19413. this._errors = this._runValidator();
  19414. this._status = this._calculateStatus();
  19415. if (this._status == exports.VALID || this._status == exports.PENDING) {
  19416. this._runAsyncValidator(emitEvent);
  19417. }
  19418. if (emitEvent) {
  19419. async_1.ObservableWrapper.callEmit(this._valueChanges, this._value);
  19420. async_1.ObservableWrapper.callEmit(this._statusChanges, this._status);
  19421. }
  19422. if (lang_1.isPresent(this._parent) && !onlySelf) {
  19423. this._parent.updateValueAndValidity({ onlySelf: onlySelf, emitEvent: emitEvent });
  19424. }
  19425. };
  19426. AbstractControl.prototype._runValidator = function () { return lang_1.isPresent(this.validator) ? this.validator(this) : null; };
  19427. AbstractControl.prototype._runAsyncValidator = function (emitEvent) {
  19428. var _this = this;
  19429. if (lang_1.isPresent(this.asyncValidator)) {
  19430. this._status = exports.PENDING;
  19431. this._cancelExistingSubscription();
  19432. var obs = toObservable(this.asyncValidator(this));
  19433. this._asyncValidationSubscription =
  19434. async_1.ObservableWrapper.subscribe(obs, function (res) { return _this.setErrors(res, { emitEvent: emitEvent }); });
  19435. }
  19436. };
  19437. AbstractControl.prototype._cancelExistingSubscription = function () {
  19438. if (lang_1.isPresent(this._asyncValidationSubscription)) {
  19439. async_1.ObservableWrapper.dispose(this._asyncValidationSubscription);
  19440. }
  19441. };
  19442. /**
  19443. * Sets errors on a control.
  19444. *
  19445. * This is used when validations are run not automatically, but manually by the user.
  19446. *
  19447. * Calling `setErrors` will also update the validity of the parent control.
  19448. *
  19449. * ## Usage
  19450. *
  19451. * ```
  19452. * var login = new Control("someLogin");
  19453. * login.setErrors({
  19454. * "notUnique": true
  19455. * });
  19456. *
  19457. * expect(login.valid).toEqual(false);
  19458. * expect(login.errors).toEqual({"notUnique": true});
  19459. *
  19460. * login.updateValue("someOtherLogin");
  19461. *
  19462. * expect(login.valid).toEqual(true);
  19463. * ```
  19464. */
  19465. AbstractControl.prototype.setErrors = function (errors, _a) {
  19466. var emitEvent = (_a === void 0 ? {} : _a).emitEvent;
  19467. emitEvent = lang_1.isPresent(emitEvent) ? emitEvent : true;
  19468. this._errors = errors;
  19469. this._status = this._calculateStatus();
  19470. if (emitEvent) {
  19471. async_1.ObservableWrapper.callEmit(this._statusChanges, this._status);
  19472. }
  19473. if (lang_1.isPresent(this._parent)) {
  19474. this._parent._updateControlsErrors();
  19475. }
  19476. };
  19477. AbstractControl.prototype.find = function (path) { return _find(this, path); };
  19478. AbstractControl.prototype.getError = function (errorCode, path) {
  19479. if (path === void 0) { path = null; }
  19480. var control = lang_1.isPresent(path) && !collection_1.ListWrapper.isEmpty(path) ? this.find(path) : this;
  19481. if (lang_1.isPresent(control) && lang_1.isPresent(control._errors)) {
  19482. return collection_1.StringMapWrapper.get(control._errors, errorCode);
  19483. }
  19484. else {
  19485. return null;
  19486. }
  19487. };
  19488. AbstractControl.prototype.hasError = function (errorCode, path) {
  19489. if (path === void 0) { path = null; }
  19490. return lang_1.isPresent(this.getError(errorCode, path));
  19491. };
  19492. /** @internal */
  19493. AbstractControl.prototype._updateControlsErrors = function () {
  19494. this._status = this._calculateStatus();
  19495. if (lang_1.isPresent(this._parent)) {
  19496. this._parent._updateControlsErrors();
  19497. }
  19498. };
  19499. /** @internal */
  19500. AbstractControl.prototype._initObservables = function () {
  19501. this._valueChanges = new async_1.EventEmitter();
  19502. this._statusChanges = new async_1.EventEmitter();
  19503. };
  19504. AbstractControl.prototype._calculateStatus = function () {
  19505. if (lang_1.isPresent(this._errors))
  19506. return exports.INVALID;
  19507. if (this._anyControlsHaveStatus(exports.PENDING))
  19508. return exports.PENDING;
  19509. if (this._anyControlsHaveStatus(exports.INVALID))
  19510. return exports.INVALID;
  19511. return exports.VALID;
  19512. };
  19513. return AbstractControl;
  19514. })();
  19515. exports.AbstractControl = AbstractControl;
  19516. /**
  19517. * Defines a part of a form that cannot be divided into other controls. `Control`s have values and
  19518. * validation state, which is determined by an optional validation function.
  19519. *
  19520. * `Control` is one of the three fundamental building blocks used to define forms in Angular, along
  19521. * with {@link ControlGroup} and {@link ControlArray}.
  19522. *
  19523. * ## Usage
  19524. *
  19525. * By default, a `Control` is created for every `<input>` or other form component.
  19526. * With {@link NgFormControl} or {@link NgFormModel} an existing {@link Control} can be
  19527. * bound to a DOM element instead. This `Control` can be configured with a custom
  19528. * validation function.
  19529. *
  19530. * ### Example ([live demo](http://plnkr.co/edit/23DESOpbNnBpBHZt1BR4?p=preview))
  19531. */
  19532. var Control = (function (_super) {
  19533. __extends(Control, _super);
  19534. function Control(value, validator, asyncValidator) {
  19535. if (value === void 0) { value = null; }
  19536. if (validator === void 0) { validator = null; }
  19537. if (asyncValidator === void 0) { asyncValidator = null; }
  19538. _super.call(this, validator, asyncValidator);
  19539. this._value = value;
  19540. this.updateValueAndValidity({ onlySelf: true, emitEvent: false });
  19541. this._initObservables();
  19542. }
  19543. /**
  19544. * Set the value of the control to `value`.
  19545. *
  19546. * If `onlySelf` is `true`, this change will only affect the validation of this `Control`
  19547. * and not its parent component. If `emitEvent` is `true`, this change will cause a
  19548. * `valueChanges` event on the `Control` to be emitted. Both of these options default to
  19549. * `false`.
  19550. *
  19551. * If `emitModelToViewChange` is `true`, the view will be notified about the new value
  19552. * via an `onChange` event. This is the default behavior if `emitModelToViewChange` is not
  19553. * specified.
  19554. */
  19555. Control.prototype.updateValue = function (value, _a) {
  19556. var _b = _a === void 0 ? {} : _a, onlySelf = _b.onlySelf, emitEvent = _b.emitEvent, emitModelToViewChange = _b.emitModelToViewChange;
  19557. emitModelToViewChange = lang_1.isPresent(emitModelToViewChange) ? emitModelToViewChange : true;
  19558. this._value = value;
  19559. if (lang_1.isPresent(this._onChange) && emitModelToViewChange)
  19560. this._onChange(this._value);
  19561. this.updateValueAndValidity({ onlySelf: onlySelf, emitEvent: emitEvent });
  19562. };
  19563. /**
  19564. * @internal
  19565. */
  19566. Control.prototype._updateValue = function () { };
  19567. /**
  19568. * @internal
  19569. */
  19570. Control.prototype._anyControlsHaveStatus = function (status) { return false; };
  19571. /**
  19572. * Register a listener for change events.
  19573. */
  19574. Control.prototype.registerOnChange = function (fn) { this._onChange = fn; };
  19575. return Control;
  19576. })(AbstractControl);
  19577. exports.Control = Control;
  19578. /**
  19579. * Defines a part of a form, of fixed length, that can contain other controls.
  19580. *
  19581. * A `ControlGroup` aggregates the values and errors of each {@link Control} in the group. Thus, if
  19582. * one of the controls in a group is invalid, the entire group is invalid. Similarly, if a control
  19583. * changes its value, the entire group changes as well.
  19584. *
  19585. * `ControlGroup` is one of the three fundamental building blocks used to define forms in Angular,
  19586. * along with {@link Control} and {@link ControlArray}. {@link ControlArray} can also contain other
  19587. * controls, but is of variable length.
  19588. *
  19589. * ### Example ([live demo](http://plnkr.co/edit/23DESOpbNnBpBHZt1BR4?p=preview))
  19590. */
  19591. var ControlGroup = (function (_super) {
  19592. __extends(ControlGroup, _super);
  19593. function ControlGroup(controls, optionals, validator, asyncValidator) {
  19594. if (optionals === void 0) { optionals = null; }
  19595. if (validator === void 0) { validator = null; }
  19596. if (asyncValidator === void 0) { asyncValidator = null; }
  19597. _super.call(this, validator, asyncValidator);
  19598. this.controls = controls;
  19599. this._optionals = lang_1.isPresent(optionals) ? optionals : {};
  19600. this._initObservables();
  19601. this._setParentForControls();
  19602. this.updateValueAndValidity({ onlySelf: true, emitEvent: false });
  19603. }
  19604. /**
  19605. * Add a control to this group.
  19606. */
  19607. ControlGroup.prototype.addControl = function (name, control) {
  19608. this.controls[name] = control;
  19609. control.setParent(this);
  19610. };
  19611. /**
  19612. * Remove a control from this group.
  19613. */
  19614. ControlGroup.prototype.removeControl = function (name) { collection_1.StringMapWrapper.delete(this.controls, name); };
  19615. /**
  19616. * Mark the named control as non-optional.
  19617. */
  19618. ControlGroup.prototype.include = function (controlName) {
  19619. collection_1.StringMapWrapper.set(this._optionals, controlName, true);
  19620. this.updateValueAndValidity();
  19621. };
  19622. /**
  19623. * Mark the named control as optional.
  19624. */
  19625. ControlGroup.prototype.exclude = function (controlName) {
  19626. collection_1.StringMapWrapper.set(this._optionals, controlName, false);
  19627. this.updateValueAndValidity();
  19628. };
  19629. /**
  19630. * Check whether there is a control with the given name in the group.
  19631. */
  19632. ControlGroup.prototype.contains = function (controlName) {
  19633. var c = collection_1.StringMapWrapper.contains(this.controls, controlName);
  19634. return c && this._included(controlName);
  19635. };
  19636. /** @internal */
  19637. ControlGroup.prototype._setParentForControls = function () {
  19638. var _this = this;
  19639. collection_1.StringMapWrapper.forEach(this.controls, function (control, name) { control.setParent(_this); });
  19640. };
  19641. /** @internal */
  19642. ControlGroup.prototype._updateValue = function () { this._value = this._reduceValue(); };
  19643. /** @internal */
  19644. ControlGroup.prototype._anyControlsHaveStatus = function (status) {
  19645. var _this = this;
  19646. var res = false;
  19647. collection_1.StringMapWrapper.forEach(this.controls, function (control, name) {
  19648. res = res || (_this.contains(name) && control.status == status);
  19649. });
  19650. return res;
  19651. };
  19652. /** @internal */
  19653. ControlGroup.prototype._reduceValue = function () {
  19654. return this._reduceChildren({}, function (acc, control, name) {
  19655. acc[name] = control.value;
  19656. return acc;
  19657. });
  19658. };
  19659. /** @internal */
  19660. ControlGroup.prototype._reduceChildren = function (initValue, fn) {
  19661. var _this = this;
  19662. var res = initValue;
  19663. collection_1.StringMapWrapper.forEach(this.controls, function (control, name) {
  19664. if (_this._included(name)) {
  19665. res = fn(res, control, name);
  19666. }
  19667. });
  19668. return res;
  19669. };
  19670. /** @internal */
  19671. ControlGroup.prototype._included = function (controlName) {
  19672. var isOptional = collection_1.StringMapWrapper.contains(this._optionals, controlName);
  19673. return !isOptional || collection_1.StringMapWrapper.get(this._optionals, controlName);
  19674. };
  19675. return ControlGroup;
  19676. })(AbstractControl);
  19677. exports.ControlGroup = ControlGroup;
  19678. /**
  19679. * Defines a part of a form, of variable length, that can contain other controls.
  19680. *
  19681. * A `ControlArray` aggregates the values and errors of each {@link Control} in the group. Thus, if
  19682. * one of the controls in a group is invalid, the entire group is invalid. Similarly, if a control
  19683. * changes its value, the entire group changes as well.
  19684. *
  19685. * `ControlArray` is one of the three fundamental building blocks used to define forms in Angular,
  19686. * along with {@link Control} and {@link ControlGroup}. {@link ControlGroup} can also contain
  19687. * other controls, but is of fixed length.
  19688. *
  19689. * ## Adding or removing controls
  19690. *
  19691. * To change the controls in the array, use the `push`, `insert`, or `removeAt` methods
  19692. * in `ControlArray` itself. These methods ensure the controls are properly tracked in the
  19693. * form's hierarchy. Do not modify the array of `AbstractControl`s used to instantiate
  19694. * the `ControlArray` directly, as that will result in strange and unexpected behavior such
  19695. * as broken change detection.
  19696. *
  19697. * ### Example ([live demo](http://plnkr.co/edit/23DESOpbNnBpBHZt1BR4?p=preview))
  19698. */
  19699. var ControlArray = (function (_super) {
  19700. __extends(ControlArray, _super);
  19701. function ControlArray(controls, validator, asyncValidator) {
  19702. if (validator === void 0) { validator = null; }
  19703. if (asyncValidator === void 0) { asyncValidator = null; }
  19704. _super.call(this, validator, asyncValidator);
  19705. this.controls = controls;
  19706. this._initObservables();
  19707. this._setParentForControls();
  19708. this.updateValueAndValidity({ onlySelf: true, emitEvent: false });
  19709. }
  19710. /**
  19711. * Get the {@link AbstractControl} at the given `index` in the array.
  19712. */
  19713. ControlArray.prototype.at = function (index) { return this.controls[index]; };
  19714. /**
  19715. * Insert a new {@link AbstractControl} at the end of the array.
  19716. */
  19717. ControlArray.prototype.push = function (control) {
  19718. this.controls.push(control);
  19719. control.setParent(this);
  19720. this.updateValueAndValidity();
  19721. };
  19722. /**
  19723. * Insert a new {@link AbstractControl} at the given `index` in the array.
  19724. */
  19725. ControlArray.prototype.insert = function (index, control) {
  19726. collection_1.ListWrapper.insert(this.controls, index, control);
  19727. control.setParent(this);
  19728. this.updateValueAndValidity();
  19729. };
  19730. /**
  19731. * Remove the control at the given `index` in the array.
  19732. */
  19733. ControlArray.prototype.removeAt = function (index) {
  19734. collection_1.ListWrapper.removeAt(this.controls, index);
  19735. this.updateValueAndValidity();
  19736. };
  19737. Object.defineProperty(ControlArray.prototype, "length", {
  19738. /**
  19739. * Length of the control array.
  19740. */
  19741. get: function () { return this.controls.length; },
  19742. enumerable: true,
  19743. configurable: true
  19744. });
  19745. /** @internal */
  19746. ControlArray.prototype._updateValue = function () { this._value = this.controls.map(function (control) { return control.value; }); };
  19747. /** @internal */
  19748. ControlArray.prototype._anyControlsHaveStatus = function (status) {
  19749. return this.controls.some(function (c) { return c.status == status; });
  19750. };
  19751. /** @internal */
  19752. ControlArray.prototype._setParentForControls = function () {
  19753. var _this = this;
  19754. this.controls.forEach(function (control) { control.setParent(_this); });
  19755. };
  19756. return ControlArray;
  19757. })(AbstractControl);
  19758. exports.ControlArray = ControlArray;
  19759. /***/ },
  19760. /* 125 */
  19761. /***/ function(module, exports, __webpack_require__) {
  19762. var lang_1 = __webpack_require__(5);
  19763. var exceptions_1 = __webpack_require__(14);
  19764. /**
  19765. * Base class for control directives.
  19766. *
  19767. * Only used internally in the forms module.
  19768. */
  19769. var AbstractControlDirective = (function () {
  19770. function AbstractControlDirective() {
  19771. }
  19772. Object.defineProperty(AbstractControlDirective.prototype, "control", {
  19773. get: function () { return exceptions_1.unimplemented(); },
  19774. enumerable: true,
  19775. configurable: true
  19776. });
  19777. Object.defineProperty(AbstractControlDirective.prototype, "value", {
  19778. get: function () { return lang_1.isPresent(this.control) ? this.control.value : null; },
  19779. enumerable: true,
  19780. configurable: true
  19781. });
  19782. Object.defineProperty(AbstractControlDirective.prototype, "valid", {
  19783. get: function () { return lang_1.isPresent(this.control) ? this.control.valid : null; },
  19784. enumerable: true,
  19785. configurable: true
  19786. });
  19787. Object.defineProperty(AbstractControlDirective.prototype, "errors", {
  19788. get: function () {
  19789. return lang_1.isPresent(this.control) ? this.control.errors : null;
  19790. },
  19791. enumerable: true,
  19792. configurable: true
  19793. });
  19794. Object.defineProperty(AbstractControlDirective.prototype, "pristine", {
  19795. get: function () { return lang_1.isPresent(this.control) ? this.control.pristine : null; },
  19796. enumerable: true,
  19797. configurable: true
  19798. });
  19799. Object.defineProperty(AbstractControlDirective.prototype, "dirty", {
  19800. get: function () { return lang_1.isPresent(this.control) ? this.control.dirty : null; },
  19801. enumerable: true,
  19802. configurable: true
  19803. });
  19804. Object.defineProperty(AbstractControlDirective.prototype, "touched", {
  19805. get: function () { return lang_1.isPresent(this.control) ? this.control.touched : null; },
  19806. enumerable: true,
  19807. configurable: true
  19808. });
  19809. Object.defineProperty(AbstractControlDirective.prototype, "untouched", {
  19810. get: function () { return lang_1.isPresent(this.control) ? this.control.untouched : null; },
  19811. enumerable: true,
  19812. configurable: true
  19813. });
  19814. Object.defineProperty(AbstractControlDirective.prototype, "path", {
  19815. get: function () { return null; },
  19816. enumerable: true,
  19817. configurable: true
  19818. });
  19819. return AbstractControlDirective;
  19820. })();
  19821. exports.AbstractControlDirective = AbstractControlDirective;
  19822. /***/ },
  19823. /* 126 */
  19824. /***/ function(module, exports, __webpack_require__) {
  19825. var __extends = (this && this.__extends) || function (d, b) {
  19826. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  19827. function __() { this.constructor = d; }
  19828. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  19829. };
  19830. var abstract_control_directive_1 = __webpack_require__(125);
  19831. /**
  19832. * A directive that contains multiple {@link NgControl}s.
  19833. *
  19834. * Only used by the forms module.
  19835. */
  19836. var ControlContainer = (function (_super) {
  19837. __extends(ControlContainer, _super);
  19838. function ControlContainer() {
  19839. _super.apply(this, arguments);
  19840. }
  19841. Object.defineProperty(ControlContainer.prototype, "formDirective", {
  19842. /**
  19843. * Get the form to which this container belongs.
  19844. */
  19845. get: function () { return null; },
  19846. enumerable: true,
  19847. configurable: true
  19848. });
  19849. Object.defineProperty(ControlContainer.prototype, "path", {
  19850. /**
  19851. * Get the path to this container.
  19852. */
  19853. get: function () { return null; },
  19854. enumerable: true,
  19855. configurable: true
  19856. });
  19857. return ControlContainer;
  19858. })(abstract_control_directive_1.AbstractControlDirective);
  19859. exports.ControlContainer = ControlContainer;
  19860. /***/ },
  19861. /* 127 */
  19862. /***/ function(module, exports, __webpack_require__) {
  19863. var __extends = (this && this.__extends) || function (d, b) {
  19864. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  19865. function __() { this.constructor = d; }
  19866. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  19867. };
  19868. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  19869. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  19870. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  19871. 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;
  19872. return c > 3 && r && Object.defineProperty(target, key, r), r;
  19873. };
  19874. var __metadata = (this && this.__metadata) || function (k, v) {
  19875. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  19876. };
  19877. var __param = (this && this.__param) || function (paramIndex, decorator) {
  19878. return function (target, key) { decorator(target, key, paramIndex); }
  19879. };
  19880. var lang_1 = __webpack_require__(5);
  19881. var async_1 = __webpack_require__(60);
  19882. var core_1 = __webpack_require__(2);
  19883. var control_container_1 = __webpack_require__(126);
  19884. var ng_control_1 = __webpack_require__(128);
  19885. var control_value_accessor_1 = __webpack_require__(129);
  19886. var shared_1 = __webpack_require__(130);
  19887. var validators_1 = __webpack_require__(131);
  19888. var controlNameBinding = lang_1.CONST_EXPR(new core_1.Provider(ng_control_1.NgControl, { useExisting: core_1.forwardRef(function () { return NgControlName; }) }));
  19889. /**
  19890. * Creates and binds a control with a specified name to a DOM element.
  19891. *
  19892. * This directive can only be used as a child of {@link NgForm} or {@link NgFormModel}.
  19893. * ### Example
  19894. *
  19895. * In this example, we create the login and password controls.
  19896. * We can work with each control separately: check its validity, get its value, listen to its
  19897. * changes.
  19898. *
  19899. * ```
  19900. * @Component({
  19901. * selector: "login-comp",
  19902. * directives: [FORM_DIRECTIVES],
  19903. * template: `
  19904. * <form #f="ngForm" (submit)='onLogIn(f.value)'>
  19905. * Login <input type='text' ngControl='login' #l="form">
  19906. * <div *ngIf="!l.valid">Login is invalid</div>
  19907. *
  19908. * Password <input type='password' ngControl='password'>
  19909. * <button type='submit'>Log in!</button>
  19910. * </form>
  19911. * `})
  19912. * class LoginComp {
  19913. * onLogIn(value): void {
  19914. * // value === {login: 'some login', password: 'some password'}
  19915. * }
  19916. * }
  19917. * ```
  19918. *
  19919. * We can also use ngModel to bind a domain model to the form.
  19920. *
  19921. * ```
  19922. * @Component({
  19923. * selector: "login-comp",
  19924. * directives: [FORM_DIRECTIVES],
  19925. * template: `
  19926. * <form (submit)='onLogIn()'>
  19927. * Login <input type='text' ngControl='login' [(ngModel)]="credentials.login">
  19928. * Password <input type='password' ngControl='password'
  19929. * [(ngModel)]="credentials.password">
  19930. * <button type='submit'>Log in!</button>
  19931. * </form>
  19932. * `})
  19933. * class LoginComp {
  19934. * credentials: {login:string, password:string};
  19935. *
  19936. * onLogIn(): void {
  19937. * // this.credentials.login === "some login"
  19938. * // this.credentials.password === "some password"
  19939. * }
  19940. * }
  19941. * ```
  19942. */
  19943. var NgControlName = (function (_super) {
  19944. __extends(NgControlName, _super);
  19945. function NgControlName(_parent, _validators, _asyncValidators, valueAccessors) {
  19946. _super.call(this);
  19947. this._parent = _parent;
  19948. this._validators = _validators;
  19949. this._asyncValidators = _asyncValidators;
  19950. /** @internal */
  19951. this.update = new async_1.EventEmitter();
  19952. this._added = false;
  19953. this.valueAccessor = shared_1.selectValueAccessor(this, valueAccessors);
  19954. }
  19955. NgControlName.prototype.ngOnChanges = function (changes) {
  19956. if (!this._added) {
  19957. this.formDirective.addControl(this);
  19958. this._added = true;
  19959. }
  19960. if (shared_1.isPropertyUpdated(changes, this.viewModel)) {
  19961. this.viewModel = this.model;
  19962. this.formDirective.updateModel(this, this.model);
  19963. }
  19964. };
  19965. NgControlName.prototype.ngOnDestroy = function () { this.formDirective.removeControl(this); };
  19966. NgControlName.prototype.viewToModelUpdate = function (newValue) {
  19967. this.viewModel = newValue;
  19968. async_1.ObservableWrapper.callEmit(this.update, newValue);
  19969. };
  19970. Object.defineProperty(NgControlName.prototype, "path", {
  19971. get: function () { return shared_1.controlPath(this.name, this._parent); },
  19972. enumerable: true,
  19973. configurable: true
  19974. });
  19975. Object.defineProperty(NgControlName.prototype, "formDirective", {
  19976. get: function () { return this._parent.formDirective; },
  19977. enumerable: true,
  19978. configurable: true
  19979. });
  19980. Object.defineProperty(NgControlName.prototype, "validator", {
  19981. get: function () { return shared_1.composeValidators(this._validators); },
  19982. enumerable: true,
  19983. configurable: true
  19984. });
  19985. Object.defineProperty(NgControlName.prototype, "asyncValidator", {
  19986. get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
  19987. enumerable: true,
  19988. configurable: true
  19989. });
  19990. Object.defineProperty(NgControlName.prototype, "control", {
  19991. get: function () { return this.formDirective.getControl(this); },
  19992. enumerable: true,
  19993. configurable: true
  19994. });
  19995. NgControlName = __decorate([
  19996. core_1.Directive({
  19997. selector: '[ngControl]',
  19998. bindings: [controlNameBinding],
  19999. inputs: ['name: ngControl', 'model: ngModel'],
  20000. outputs: ['update: ngModelChange'],
  20001. exportAs: 'ngForm'
  20002. }),
  20003. __param(0, core_1.Host()),
  20004. __param(0, core_1.SkipSelf()),
  20005. __param(1, core_1.Optional()),
  20006. __param(1, core_1.Self()),
  20007. __param(1, core_1.Inject(validators_1.NG_VALIDATORS)),
  20008. __param(2, core_1.Optional()),
  20009. __param(2, core_1.Self()),
  20010. __param(2, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  20011. __param(3, core_1.Optional()),
  20012. __param(3, core_1.Self()),
  20013. __param(3, core_1.Inject(control_value_accessor_1.NG_VALUE_ACCESSOR)),
  20014. __metadata('design:paramtypes', [control_container_1.ControlContainer, Array, Array, Array])
  20015. ], NgControlName);
  20016. return NgControlName;
  20017. })(ng_control_1.NgControl);
  20018. exports.NgControlName = NgControlName;
  20019. /***/ },
  20020. /* 128 */
  20021. /***/ function(module, exports, __webpack_require__) {
  20022. var __extends = (this && this.__extends) || function (d, b) {
  20023. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  20024. function __() { this.constructor = d; }
  20025. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  20026. };
  20027. var abstract_control_directive_1 = __webpack_require__(125);
  20028. var exceptions_1 = __webpack_require__(14);
  20029. /**
  20030. * A base class that all control directive extend.
  20031. * It binds a {@link Control} object to a DOM element.
  20032. *
  20033. * Used internally by Angular forms.
  20034. */
  20035. var NgControl = (function (_super) {
  20036. __extends(NgControl, _super);
  20037. function NgControl() {
  20038. _super.apply(this, arguments);
  20039. this.name = null;
  20040. this.valueAccessor = null;
  20041. }
  20042. Object.defineProperty(NgControl.prototype, "validator", {
  20043. get: function () { return exceptions_1.unimplemented(); },
  20044. enumerable: true,
  20045. configurable: true
  20046. });
  20047. Object.defineProperty(NgControl.prototype, "asyncValidator", {
  20048. get: function () { return exceptions_1.unimplemented(); },
  20049. enumerable: true,
  20050. configurable: true
  20051. });
  20052. return NgControl;
  20053. })(abstract_control_directive_1.AbstractControlDirective);
  20054. exports.NgControl = NgControl;
  20055. /***/ },
  20056. /* 129 */
  20057. /***/ function(module, exports, __webpack_require__) {
  20058. var core_1 = __webpack_require__(2);
  20059. var lang_1 = __webpack_require__(5);
  20060. /**
  20061. * Used to provide a {@link ControlValueAccessor} for form controls.
  20062. *
  20063. * See {@link DefaultValueAccessor} for how to implement one.
  20064. */
  20065. exports.NG_VALUE_ACCESSOR = lang_1.CONST_EXPR(new core_1.OpaqueToken("NgValueAccessor"));
  20066. /***/ },
  20067. /* 130 */
  20068. /***/ function(module, exports, __webpack_require__) {
  20069. var collection_1 = __webpack_require__(12);
  20070. var lang_1 = __webpack_require__(5);
  20071. var exceptions_1 = __webpack_require__(14);
  20072. var validators_1 = __webpack_require__(131);
  20073. var default_value_accessor_1 = __webpack_require__(132);
  20074. var number_value_accessor_1 = __webpack_require__(133);
  20075. var checkbox_value_accessor_1 = __webpack_require__(134);
  20076. var select_control_value_accessor_1 = __webpack_require__(135);
  20077. var normalize_validator_1 = __webpack_require__(136);
  20078. function controlPath(name, parent) {
  20079. var p = collection_1.ListWrapper.clone(parent.path);
  20080. p.push(name);
  20081. return p;
  20082. }
  20083. exports.controlPath = controlPath;
  20084. function setUpControl(control, dir) {
  20085. if (lang_1.isBlank(control))
  20086. _throwError(dir, "Cannot find control");
  20087. if (lang_1.isBlank(dir.valueAccessor))
  20088. _throwError(dir, "No value accessor for");
  20089. control.validator = validators_1.Validators.compose([control.validator, dir.validator]);
  20090. control.asyncValidator = validators_1.Validators.composeAsync([control.asyncValidator, dir.asyncValidator]);
  20091. dir.valueAccessor.writeValue(control.value);
  20092. // view -> model
  20093. dir.valueAccessor.registerOnChange(function (newValue) {
  20094. dir.viewToModelUpdate(newValue);
  20095. control.updateValue(newValue, { emitModelToViewChange: false });
  20096. control.markAsDirty();
  20097. });
  20098. // model -> view
  20099. control.registerOnChange(function (newValue) { return dir.valueAccessor.writeValue(newValue); });
  20100. // touched
  20101. dir.valueAccessor.registerOnTouched(function () { return control.markAsTouched(); });
  20102. }
  20103. exports.setUpControl = setUpControl;
  20104. function setUpControlGroup(control, dir) {
  20105. if (lang_1.isBlank(control))
  20106. _throwError(dir, "Cannot find control");
  20107. control.validator = validators_1.Validators.compose([control.validator, dir.validator]);
  20108. control.asyncValidator = validators_1.Validators.composeAsync([control.asyncValidator, dir.asyncValidator]);
  20109. }
  20110. exports.setUpControlGroup = setUpControlGroup;
  20111. function _throwError(dir, message) {
  20112. var path = dir.path.join(" -> ");
  20113. throw new exceptions_1.BaseException(message + " '" + path + "'");
  20114. }
  20115. function composeValidators(validators) {
  20116. return lang_1.isPresent(validators) ? validators_1.Validators.compose(validators.map(normalize_validator_1.normalizeValidator)) : null;
  20117. }
  20118. exports.composeValidators = composeValidators;
  20119. function composeAsyncValidators(validators) {
  20120. return lang_1.isPresent(validators) ? validators_1.Validators.composeAsync(validators.map(normalize_validator_1.normalizeValidator)) : null;
  20121. }
  20122. exports.composeAsyncValidators = composeAsyncValidators;
  20123. function isPropertyUpdated(changes, viewModel) {
  20124. if (!collection_1.StringMapWrapper.contains(changes, "model"))
  20125. return false;
  20126. var change = changes["model"];
  20127. if (change.isFirstChange())
  20128. return true;
  20129. return !lang_1.looseIdentical(viewModel, change.currentValue);
  20130. }
  20131. exports.isPropertyUpdated = isPropertyUpdated;
  20132. // TODO: vsavkin remove it once https://github.com/angular/angular/issues/3011 is implemented
  20133. function selectValueAccessor(dir, valueAccessors) {
  20134. if (lang_1.isBlank(valueAccessors))
  20135. return null;
  20136. var defaultAccessor;
  20137. var builtinAccessor;
  20138. var customAccessor;
  20139. valueAccessors.forEach(function (v) {
  20140. if (v instanceof default_value_accessor_1.DefaultValueAccessor) {
  20141. defaultAccessor = v;
  20142. }
  20143. else if (v instanceof checkbox_value_accessor_1.CheckboxControlValueAccessor || v instanceof number_value_accessor_1.NumberValueAccessor ||
  20144. v instanceof select_control_value_accessor_1.SelectControlValueAccessor) {
  20145. if (lang_1.isPresent(builtinAccessor))
  20146. _throwError(dir, "More than one built-in value accessor matches");
  20147. builtinAccessor = v;
  20148. }
  20149. else {
  20150. if (lang_1.isPresent(customAccessor))
  20151. _throwError(dir, "More than one custom value accessor matches");
  20152. customAccessor = v;
  20153. }
  20154. });
  20155. if (lang_1.isPresent(customAccessor))
  20156. return customAccessor;
  20157. if (lang_1.isPresent(builtinAccessor))
  20158. return builtinAccessor;
  20159. if (lang_1.isPresent(defaultAccessor))
  20160. return defaultAccessor;
  20161. _throwError(dir, "No valid value accessor for");
  20162. return null;
  20163. }
  20164. exports.selectValueAccessor = selectValueAccessor;
  20165. /***/ },
  20166. /* 131 */
  20167. /***/ function(module, exports, __webpack_require__) {
  20168. var lang_1 = __webpack_require__(5);
  20169. var promise_1 = __webpack_require__(61);
  20170. var async_1 = __webpack_require__(60);
  20171. var collection_1 = __webpack_require__(12);
  20172. var core_1 = __webpack_require__(2);
  20173. /**
  20174. * Providers for validators to be used for {@link Control}s in a form.
  20175. *
  20176. * Provide this using `multi: true` to add validators.
  20177. *
  20178. * ### Example
  20179. *
  20180. * {@example core/forms/ts/ng_validators/ng_validators.ts region='ng_validators'}
  20181. */
  20182. exports.NG_VALIDATORS = lang_1.CONST_EXPR(new core_1.OpaqueToken("NgValidators"));
  20183. /**
  20184. * Providers for asynchronous validators to be used for {@link Control}s
  20185. * in a form.
  20186. *
  20187. * Provide this using `multi: true` to add validators.
  20188. *
  20189. * See {@link NG_VALIDATORS} for more details.
  20190. */
  20191. exports.NG_ASYNC_VALIDATORS = lang_1.CONST_EXPR(new core_1.OpaqueToken("NgAsyncValidators"));
  20192. /**
  20193. * Provides a set of validators used by form controls.
  20194. *
  20195. * A validator is a function that processes a {@link Control} or collection of
  20196. * controls and returns a map of errors. A null map means that validation has passed.
  20197. *
  20198. * ### Example
  20199. *
  20200. * ```typescript
  20201. * var loginControl = new Control("", Validators.required)
  20202. * ```
  20203. */
  20204. var Validators = (function () {
  20205. function Validators() {
  20206. }
  20207. /**
  20208. * Validator that requires controls to have a non-empty value.
  20209. */
  20210. Validators.required = function (control) {
  20211. return lang_1.isBlank(control.value) || control.value == "" ? { "required": true } : null;
  20212. };
  20213. /**
  20214. * Validator that requires controls to have a value of a minimum length.
  20215. */
  20216. Validators.minLength = function (minLength) {
  20217. return function (control) {
  20218. if (lang_1.isPresent(Validators.required(control)))
  20219. return null;
  20220. var v = control.value;
  20221. return v.length < minLength ?
  20222. { "minlength": { "requiredLength": minLength, "actualLength": v.length } } :
  20223. null;
  20224. };
  20225. };
  20226. /**
  20227. * Validator that requires controls to have a value of a maximum length.
  20228. */
  20229. Validators.maxLength = function (maxLength) {
  20230. return function (control) {
  20231. if (lang_1.isPresent(Validators.required(control)))
  20232. return null;
  20233. var v = control.value;
  20234. return v.length > maxLength ?
  20235. { "maxlength": { "requiredLength": maxLength, "actualLength": v.length } } :
  20236. null;
  20237. };
  20238. };
  20239. /**
  20240. * No-op validator.
  20241. */
  20242. Validators.nullValidator = function (c) { return null; };
  20243. /**
  20244. * Compose multiple validators into a single function that returns the union
  20245. * of the individual error maps.
  20246. */
  20247. Validators.compose = function (validators) {
  20248. if (lang_1.isBlank(validators))
  20249. return null;
  20250. var presentValidators = validators.filter(lang_1.isPresent);
  20251. if (presentValidators.length == 0)
  20252. return null;
  20253. return function (control) {
  20254. return _mergeErrors(_executeValidators(control, presentValidators));
  20255. };
  20256. };
  20257. Validators.composeAsync = function (validators) {
  20258. if (lang_1.isBlank(validators))
  20259. return null;
  20260. var presentValidators = validators.filter(lang_1.isPresent);
  20261. if (presentValidators.length == 0)
  20262. return null;
  20263. return function (control) {
  20264. var promises = _executeValidators(control, presentValidators).map(_convertToPromise);
  20265. return promise_1.PromiseWrapper.all(promises).then(_mergeErrors);
  20266. };
  20267. };
  20268. return Validators;
  20269. })();
  20270. exports.Validators = Validators;
  20271. function _convertToPromise(obj) {
  20272. return promise_1.PromiseWrapper.isPromise(obj) ? obj : async_1.ObservableWrapper.toPromise(obj);
  20273. }
  20274. function _executeValidators(control, validators) {
  20275. return validators.map(function (v) { return v(control); });
  20276. }
  20277. function _mergeErrors(arrayOfErrors) {
  20278. var res = arrayOfErrors.reduce(function (res, errors) {
  20279. return lang_1.isPresent(errors) ? collection_1.StringMapWrapper.merge(res, errors) : res;
  20280. }, {});
  20281. return collection_1.StringMapWrapper.isEmpty(res) ? null : res;
  20282. }
  20283. /***/ },
  20284. /* 132 */
  20285. /***/ function(module, exports, __webpack_require__) {
  20286. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20287. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20288. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20289. 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;
  20290. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20291. };
  20292. var __metadata = (this && this.__metadata) || function (k, v) {
  20293. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20294. };
  20295. var core_1 = __webpack_require__(2);
  20296. var control_value_accessor_1 = __webpack_require__(129);
  20297. var lang_1 = __webpack_require__(5);
  20298. 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 }));
  20299. /**
  20300. * The default accessor for writing a value and listening to changes that is used by the
  20301. * {@link NgModel}, {@link NgFormControl}, and {@link NgControlName} directives.
  20302. *
  20303. * ### Example
  20304. * ```
  20305. * <input type="text" ngControl="searchQuery">
  20306. * ```
  20307. */
  20308. var DefaultValueAccessor = (function () {
  20309. function DefaultValueAccessor(_renderer, _elementRef) {
  20310. this._renderer = _renderer;
  20311. this._elementRef = _elementRef;
  20312. this.onChange = function (_) { };
  20313. this.onTouched = function () { };
  20314. }
  20315. DefaultValueAccessor.prototype.writeValue = function (value) {
  20316. var normalizedValue = lang_1.isBlank(value) ? '' : value;
  20317. this._renderer.setElementProperty(this._elementRef, 'value', normalizedValue);
  20318. };
  20319. DefaultValueAccessor.prototype.registerOnChange = function (fn) { this.onChange = fn; };
  20320. DefaultValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
  20321. DefaultValueAccessor = __decorate([
  20322. core_1.Directive({
  20323. selector: 'input:not([type=checkbox])[ngControl],textarea[ngControl],input:not([type=checkbox])[ngFormControl],textarea[ngFormControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]',
  20324. // TODO: vsavkin replace the above selector with the one below it once
  20325. // https://github.com/angular/angular/issues/3011 is implemented
  20326. // selector: '[ngControl],[ngModel],[ngFormControl]',
  20327. host: { '(input)': 'onChange($event.target.value)', '(blur)': 'onTouched()' },
  20328. bindings: [DEFAULT_VALUE_ACCESSOR]
  20329. }),
  20330. __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef])
  20331. ], DefaultValueAccessor);
  20332. return DefaultValueAccessor;
  20333. })();
  20334. exports.DefaultValueAccessor = DefaultValueAccessor;
  20335. /***/ },
  20336. /* 133 */
  20337. /***/ function(module, exports, __webpack_require__) {
  20338. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20339. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20340. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20341. 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;
  20342. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20343. };
  20344. var __metadata = (this && this.__metadata) || function (k, v) {
  20345. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20346. };
  20347. var core_1 = __webpack_require__(2);
  20348. var control_value_accessor_1 = __webpack_require__(129);
  20349. var lang_1 = __webpack_require__(5);
  20350. 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 }));
  20351. /**
  20352. * The accessor for writing a number value and listening to changes that is used by the
  20353. * {@link NgModel}, {@link NgFormControl}, and {@link NgControlName} directives.
  20354. *
  20355. * ### Example
  20356. * ```
  20357. * <input type="number" [(ngModel)]="age">
  20358. * ```
  20359. */
  20360. var NumberValueAccessor = (function () {
  20361. function NumberValueAccessor(_renderer, _elementRef) {
  20362. this._renderer = _renderer;
  20363. this._elementRef = _elementRef;
  20364. this.onChange = function (_) { };
  20365. this.onTouched = function () { };
  20366. }
  20367. NumberValueAccessor.prototype.writeValue = function (value) {
  20368. this._renderer.setElementProperty(this._elementRef, 'value', value);
  20369. };
  20370. NumberValueAccessor.prototype.registerOnChange = function (fn) {
  20371. this.onChange = function (value) { fn(lang_1.NumberWrapper.parseFloat(value)); };
  20372. };
  20373. NumberValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
  20374. NumberValueAccessor = __decorate([
  20375. core_1.Directive({
  20376. selector: 'input[type=number][ngControl],input[type=number][ngFormControl],input[type=number][ngModel]',
  20377. host: {
  20378. '(change)': 'onChange($event.target.value)',
  20379. '(input)': 'onChange($event.target.value)',
  20380. '(blur)': 'onTouched()'
  20381. },
  20382. bindings: [NUMBER_VALUE_ACCESSOR]
  20383. }),
  20384. __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef])
  20385. ], NumberValueAccessor);
  20386. return NumberValueAccessor;
  20387. })();
  20388. exports.NumberValueAccessor = NumberValueAccessor;
  20389. /***/ },
  20390. /* 134 */
  20391. /***/ function(module, exports, __webpack_require__) {
  20392. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20393. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20394. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20395. 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;
  20396. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20397. };
  20398. var __metadata = (this && this.__metadata) || function (k, v) {
  20399. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20400. };
  20401. var core_1 = __webpack_require__(2);
  20402. var control_value_accessor_1 = __webpack_require__(129);
  20403. var lang_1 = __webpack_require__(5);
  20404. 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 }));
  20405. /**
  20406. * The accessor for writing a value and listening to changes on a checkbox input element.
  20407. *
  20408. * ### Example
  20409. * ```
  20410. * <input type="checkbox" ngControl="rememberLogin">
  20411. * ```
  20412. */
  20413. var CheckboxControlValueAccessor = (function () {
  20414. function CheckboxControlValueAccessor(_renderer, _elementRef) {
  20415. this._renderer = _renderer;
  20416. this._elementRef = _elementRef;
  20417. this.onChange = function (_) { };
  20418. this.onTouched = function () { };
  20419. }
  20420. CheckboxControlValueAccessor.prototype.writeValue = function (value) {
  20421. this._renderer.setElementProperty(this._elementRef, 'checked', value);
  20422. };
  20423. CheckboxControlValueAccessor.prototype.registerOnChange = function (fn) { this.onChange = fn; };
  20424. CheckboxControlValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
  20425. CheckboxControlValueAccessor = __decorate([
  20426. core_1.Directive({
  20427. selector: 'input[type=checkbox][ngControl],input[type=checkbox][ngFormControl],input[type=checkbox][ngModel]',
  20428. host: { '(change)': 'onChange($event.target.checked)', '(blur)': 'onTouched()' },
  20429. bindings: [CHECKBOX_VALUE_ACCESSOR]
  20430. }),
  20431. __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef])
  20432. ], CheckboxControlValueAccessor);
  20433. return CheckboxControlValueAccessor;
  20434. })();
  20435. exports.CheckboxControlValueAccessor = CheckboxControlValueAccessor;
  20436. /***/ },
  20437. /* 135 */
  20438. /***/ function(module, exports, __webpack_require__) {
  20439. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20440. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20441. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20442. 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;
  20443. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20444. };
  20445. var __metadata = (this && this.__metadata) || function (k, v) {
  20446. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20447. };
  20448. var __param = (this && this.__param) || function (paramIndex, decorator) {
  20449. return function (target, key) { decorator(target, key, paramIndex); }
  20450. };
  20451. var core_1 = __webpack_require__(2);
  20452. var async_1 = __webpack_require__(60);
  20453. var control_value_accessor_1 = __webpack_require__(129);
  20454. var lang_1 = __webpack_require__(5);
  20455. 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 }));
  20456. /**
  20457. * Marks `<option>` as dynamic, so Angular can be notified when options change.
  20458. *
  20459. * ### Example
  20460. *
  20461. * ```
  20462. * <select ngControl="city">
  20463. * <option *ngFor="#c of cities" [value]="c"></option>
  20464. * </select>
  20465. * ```
  20466. */
  20467. var NgSelectOption = (function () {
  20468. function NgSelectOption() {
  20469. }
  20470. NgSelectOption = __decorate([
  20471. core_1.Directive({ selector: 'option' }),
  20472. __metadata('design:paramtypes', [])
  20473. ], NgSelectOption);
  20474. return NgSelectOption;
  20475. })();
  20476. exports.NgSelectOption = NgSelectOption;
  20477. /**
  20478. * The accessor for writing a value and listening to changes on a select element.
  20479. */
  20480. var SelectControlValueAccessor = (function () {
  20481. function SelectControlValueAccessor(_renderer, _elementRef, query) {
  20482. this._renderer = _renderer;
  20483. this._elementRef = _elementRef;
  20484. this.onChange = function (_) { };
  20485. this.onTouched = function () { };
  20486. this._updateValueWhenListOfOptionsChanges(query);
  20487. }
  20488. SelectControlValueAccessor.prototype.writeValue = function (value) {
  20489. this.value = value;
  20490. this._renderer.setElementProperty(this._elementRef, 'value', value);
  20491. };
  20492. SelectControlValueAccessor.prototype.registerOnChange = function (fn) { this.onChange = fn; };
  20493. SelectControlValueAccessor.prototype.registerOnTouched = function (fn) { this.onTouched = fn; };
  20494. SelectControlValueAccessor.prototype._updateValueWhenListOfOptionsChanges = function (query) {
  20495. var _this = this;
  20496. async_1.ObservableWrapper.subscribe(query.changes, function (_) { return _this.writeValue(_this.value); });
  20497. };
  20498. SelectControlValueAccessor = __decorate([
  20499. core_1.Directive({
  20500. selector: 'select[ngControl],select[ngFormControl],select[ngModel]',
  20501. host: {
  20502. '(change)': 'onChange($event.target.value)',
  20503. '(input)': 'onChange($event.target.value)',
  20504. '(blur)': 'onTouched()'
  20505. },
  20506. bindings: [SELECT_VALUE_ACCESSOR]
  20507. }),
  20508. __param(2, core_1.Query(NgSelectOption, { descendants: true })),
  20509. __metadata('design:paramtypes', [core_1.Renderer, core_1.ElementRef, core_1.QueryList])
  20510. ], SelectControlValueAccessor);
  20511. return SelectControlValueAccessor;
  20512. })();
  20513. exports.SelectControlValueAccessor = SelectControlValueAccessor;
  20514. /***/ },
  20515. /* 136 */
  20516. /***/ function(module, exports) {
  20517. function normalizeValidator(validator) {
  20518. if (validator.validate !== undefined) {
  20519. return function (c) { return validator.validate(c); };
  20520. }
  20521. else {
  20522. return validator;
  20523. }
  20524. }
  20525. exports.normalizeValidator = normalizeValidator;
  20526. /***/ },
  20527. /* 137 */
  20528. /***/ function(module, exports, __webpack_require__) {
  20529. var __extends = (this && this.__extends) || function (d, b) {
  20530. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  20531. function __() { this.constructor = d; }
  20532. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  20533. };
  20534. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20535. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20536. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20537. 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;
  20538. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20539. };
  20540. var __metadata = (this && this.__metadata) || function (k, v) {
  20541. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20542. };
  20543. var __param = (this && this.__param) || function (paramIndex, decorator) {
  20544. return function (target, key) { decorator(target, key, paramIndex); }
  20545. };
  20546. var lang_1 = __webpack_require__(5);
  20547. var collection_1 = __webpack_require__(12);
  20548. var async_1 = __webpack_require__(60);
  20549. var core_1 = __webpack_require__(2);
  20550. var ng_control_1 = __webpack_require__(128);
  20551. var validators_1 = __webpack_require__(131);
  20552. var control_value_accessor_1 = __webpack_require__(129);
  20553. var shared_1 = __webpack_require__(130);
  20554. var formControlBinding = lang_1.CONST_EXPR(new core_1.Provider(ng_control_1.NgControl, { useExisting: core_1.forwardRef(function () { return NgFormControl; }) }));
  20555. /**
  20556. * Binds an existing {@link Control} to a DOM element.
  20557. *
  20558. * ### Example ([live demo](http://plnkr.co/edit/jcQlZ2tTh22BZZ2ucNAT?p=preview))
  20559. *
  20560. * In this example, we bind the control to an input element. When the value of the input element
  20561. * changes, the value of the control will reflect that change. Likewise, if the value of the
  20562. * control changes, the input element reflects that change.
  20563. *
  20564. * ```typescript
  20565. * @Component({
  20566. * selector: 'my-app',
  20567. * template: `
  20568. * <div>
  20569. * <h2>NgFormControl Example</h2>
  20570. * <form>
  20571. * <p>Element with existing control: <input type="text"
  20572. * [ngFormControl]="loginControl"></p>
  20573. * <p>Value of existing control: {{loginControl.value}}</p>
  20574. * </form>
  20575. * </div>
  20576. * `,
  20577. * directives: [CORE_DIRECTIVES, FORM_DIRECTIVES]
  20578. * })
  20579. * export class App {
  20580. * loginControl: Control = new Control('');
  20581. * }
  20582. * ```
  20583. *
  20584. * ###ngModel
  20585. *
  20586. * We can also use `ngModel` to bind a domain model to the form.
  20587. *
  20588. * ### Example ([live demo](http://plnkr.co/edit/yHMLuHO7DNgT8XvtjTDH?p=preview))
  20589. *
  20590. * ```typescript
  20591. * @Component({
  20592. * selector: "login-comp",
  20593. * directives: [FORM_DIRECTIVES],
  20594. * template: "<input type='text' [ngFormControl]='loginControl' [(ngModel)]='login'>"
  20595. * })
  20596. * class LoginComp {
  20597. * loginControl: Control = new Control('');
  20598. * login:string;
  20599. * }
  20600. * ```
  20601. */
  20602. var NgFormControl = (function (_super) {
  20603. __extends(NgFormControl, _super);
  20604. function NgFormControl(_validators, _asyncValidators, valueAccessors) {
  20605. _super.call(this);
  20606. this._validators = _validators;
  20607. this._asyncValidators = _asyncValidators;
  20608. this.update = new async_1.EventEmitter();
  20609. this.valueAccessor = shared_1.selectValueAccessor(this, valueAccessors);
  20610. }
  20611. NgFormControl.prototype.ngOnChanges = function (changes) {
  20612. if (this._isControlChanged(changes)) {
  20613. shared_1.setUpControl(this.form, this);
  20614. this.form.updateValueAndValidity({ emitEvent: false });
  20615. }
  20616. if (shared_1.isPropertyUpdated(changes, this.viewModel)) {
  20617. this.form.updateValue(this.model);
  20618. this.viewModel = this.model;
  20619. }
  20620. };
  20621. Object.defineProperty(NgFormControl.prototype, "path", {
  20622. get: function () { return []; },
  20623. enumerable: true,
  20624. configurable: true
  20625. });
  20626. Object.defineProperty(NgFormControl.prototype, "validator", {
  20627. get: function () { return shared_1.composeValidators(this._validators); },
  20628. enumerable: true,
  20629. configurable: true
  20630. });
  20631. Object.defineProperty(NgFormControl.prototype, "asyncValidator", {
  20632. get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
  20633. enumerable: true,
  20634. configurable: true
  20635. });
  20636. Object.defineProperty(NgFormControl.prototype, "control", {
  20637. get: function () { return this.form; },
  20638. enumerable: true,
  20639. configurable: true
  20640. });
  20641. NgFormControl.prototype.viewToModelUpdate = function (newValue) {
  20642. this.viewModel = newValue;
  20643. async_1.ObservableWrapper.callEmit(this.update, newValue);
  20644. };
  20645. NgFormControl.prototype._isControlChanged = function (changes) {
  20646. return collection_1.StringMapWrapper.contains(changes, "form");
  20647. };
  20648. NgFormControl = __decorate([
  20649. core_1.Directive({
  20650. selector: '[ngFormControl]',
  20651. bindings: [formControlBinding],
  20652. inputs: ['form: ngFormControl', 'model: ngModel'],
  20653. outputs: ['update: ngModelChange'],
  20654. exportAs: 'ngForm'
  20655. }),
  20656. __param(0, core_1.Optional()),
  20657. __param(0, core_1.Self()),
  20658. __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
  20659. __param(1, core_1.Optional()),
  20660. __param(1, core_1.Self()),
  20661. __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  20662. __param(2, core_1.Optional()),
  20663. __param(2, core_1.Self()),
  20664. __param(2, core_1.Inject(control_value_accessor_1.NG_VALUE_ACCESSOR)),
  20665. __metadata('design:paramtypes', [Array, Array, Array])
  20666. ], NgFormControl);
  20667. return NgFormControl;
  20668. })(ng_control_1.NgControl);
  20669. exports.NgFormControl = NgFormControl;
  20670. /***/ },
  20671. /* 138 */
  20672. /***/ function(module, exports, __webpack_require__) {
  20673. var __extends = (this && this.__extends) || function (d, b) {
  20674. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  20675. function __() { this.constructor = d; }
  20676. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  20677. };
  20678. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20679. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20680. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20681. 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;
  20682. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20683. };
  20684. var __metadata = (this && this.__metadata) || function (k, v) {
  20685. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20686. };
  20687. var __param = (this && this.__param) || function (paramIndex, decorator) {
  20688. return function (target, key) { decorator(target, key, paramIndex); }
  20689. };
  20690. var lang_1 = __webpack_require__(5);
  20691. var async_1 = __webpack_require__(60);
  20692. var core_1 = __webpack_require__(2);
  20693. var control_value_accessor_1 = __webpack_require__(129);
  20694. var ng_control_1 = __webpack_require__(128);
  20695. var model_1 = __webpack_require__(124);
  20696. var validators_1 = __webpack_require__(131);
  20697. var shared_1 = __webpack_require__(130);
  20698. var formControlBinding = lang_1.CONST_EXPR(new core_1.Provider(ng_control_1.NgControl, { useExisting: core_1.forwardRef(function () { return NgModel; }) }));
  20699. /**
  20700. * Binds a domain model to a form control.
  20701. *
  20702. * ### Usage
  20703. *
  20704. * `ngModel` binds an existing domain model to a form control. For a
  20705. * two-way binding, use `[(ngModel)]` to ensure the model updates in
  20706. * both directions.
  20707. *
  20708. * ### Example ([live demo](http://plnkr.co/edit/R3UX5qDaUqFO2VYR0UzH?p=preview))
  20709. * ```typescript
  20710. * @Component({
  20711. * selector: "search-comp",
  20712. * directives: [FORM_DIRECTIVES],
  20713. * template: `<input type='text' [(ngModel)]="searchQuery">`
  20714. * })
  20715. * class SearchComp {
  20716. * searchQuery: string;
  20717. * }
  20718. * ```
  20719. */
  20720. var NgModel = (function (_super) {
  20721. __extends(NgModel, _super);
  20722. function NgModel(_validators, _asyncValidators, valueAccessors) {
  20723. _super.call(this);
  20724. this._validators = _validators;
  20725. this._asyncValidators = _asyncValidators;
  20726. /** @internal */
  20727. this._control = new model_1.Control();
  20728. /** @internal */
  20729. this._added = false;
  20730. this.update = new async_1.EventEmitter();
  20731. this.valueAccessor = shared_1.selectValueAccessor(this, valueAccessors);
  20732. }
  20733. NgModel.prototype.ngOnChanges = function (changes) {
  20734. if (!this._added) {
  20735. shared_1.setUpControl(this._control, this);
  20736. this._control.updateValueAndValidity({ emitEvent: false });
  20737. this._added = true;
  20738. }
  20739. if (shared_1.isPropertyUpdated(changes, this.viewModel)) {
  20740. this._control.updateValue(this.model);
  20741. this.viewModel = this.model;
  20742. }
  20743. };
  20744. Object.defineProperty(NgModel.prototype, "control", {
  20745. get: function () { return this._control; },
  20746. enumerable: true,
  20747. configurable: true
  20748. });
  20749. Object.defineProperty(NgModel.prototype, "path", {
  20750. get: function () { return []; },
  20751. enumerable: true,
  20752. configurable: true
  20753. });
  20754. Object.defineProperty(NgModel.prototype, "validator", {
  20755. get: function () { return shared_1.composeValidators(this._validators); },
  20756. enumerable: true,
  20757. configurable: true
  20758. });
  20759. Object.defineProperty(NgModel.prototype, "asyncValidator", {
  20760. get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
  20761. enumerable: true,
  20762. configurable: true
  20763. });
  20764. NgModel.prototype.viewToModelUpdate = function (newValue) {
  20765. this.viewModel = newValue;
  20766. async_1.ObservableWrapper.callEmit(this.update, newValue);
  20767. };
  20768. NgModel = __decorate([
  20769. core_1.Directive({
  20770. selector: '[ngModel]:not([ngControl]):not([ngFormControl])',
  20771. bindings: [formControlBinding],
  20772. inputs: ['model: ngModel'],
  20773. outputs: ['update: ngModelChange'],
  20774. exportAs: 'ngForm'
  20775. }),
  20776. __param(0, core_1.Optional()),
  20777. __param(0, core_1.Self()),
  20778. __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
  20779. __param(1, core_1.Optional()),
  20780. __param(1, core_1.Self()),
  20781. __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  20782. __param(2, core_1.Optional()),
  20783. __param(2, core_1.Self()),
  20784. __param(2, core_1.Inject(control_value_accessor_1.NG_VALUE_ACCESSOR)),
  20785. __metadata('design:paramtypes', [Array, Array, Array])
  20786. ], NgModel);
  20787. return NgModel;
  20788. })(ng_control_1.NgControl);
  20789. exports.NgModel = NgModel;
  20790. /***/ },
  20791. /* 139 */
  20792. /***/ function(module, exports, __webpack_require__) {
  20793. var __extends = (this && this.__extends) || function (d, b) {
  20794. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  20795. function __() { this.constructor = d; }
  20796. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  20797. };
  20798. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20799. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20800. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20801. 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;
  20802. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20803. };
  20804. var __metadata = (this && this.__metadata) || function (k, v) {
  20805. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20806. };
  20807. var __param = (this && this.__param) || function (paramIndex, decorator) {
  20808. return function (target, key) { decorator(target, key, paramIndex); }
  20809. };
  20810. var core_1 = __webpack_require__(2);
  20811. var lang_1 = __webpack_require__(5);
  20812. var control_container_1 = __webpack_require__(126);
  20813. var shared_1 = __webpack_require__(130);
  20814. var validators_1 = __webpack_require__(131);
  20815. var controlGroupProvider = lang_1.CONST_EXPR(new core_1.Provider(control_container_1.ControlContainer, { useExisting: core_1.forwardRef(function () { return NgControlGroup; }) }));
  20816. /**
  20817. * Creates and binds a control group to a DOM element.
  20818. *
  20819. * This directive can only be used as a child of {@link NgForm} or {@link NgFormModel}.
  20820. *
  20821. * ### Example ([live demo](http://plnkr.co/edit/7EJ11uGeaggViYM6T5nq?p=preview))
  20822. *
  20823. * ```typescript
  20824. * @Component({
  20825. * selector: 'my-app',
  20826. * directives: [FORM_DIRECTIVES],
  20827. * })
  20828. * @View({
  20829. * template: `
  20830. * <div>
  20831. * <h2>Angular2 Control &amp; ControlGroup Example</h2>
  20832. * <form #f="ngForm">
  20833. * <div ngControlGroup="name" #cg-name="form">
  20834. * <h3>Enter your name:</h3>
  20835. * <p>First: <input ngControl="first" required></p>
  20836. * <p>Middle: <input ngControl="middle"></p>
  20837. * <p>Last: <input ngControl="last" required></p>
  20838. * </div>
  20839. * <h3>Name value:</h3>
  20840. * <pre>{{valueOf(cgName)}}</pre>
  20841. * <p>Name is {{cgName?.control?.valid ? "valid" : "invalid"}}</p>
  20842. * <h3>What's your favorite food?</h3>
  20843. * <p><input ngControl="food"></p>
  20844. * <h3>Form value</h3>
  20845. * <pre>{{valueOf(f)}}</pre>
  20846. * </form>
  20847. * </div>
  20848. * `,
  20849. * directives: [FORM_DIRECTIVES]
  20850. * })
  20851. * export class App {
  20852. * valueOf(cg: NgControlGroup): string {
  20853. * if (cg.control == null) {
  20854. * return null;
  20855. * }
  20856. * return JSON.stringify(cg.control.value, null, 2);
  20857. * }
  20858. * }
  20859. * ```
  20860. *
  20861. * This example declares a control group for a user's name. The value and validation state of
  20862. * this group can be accessed separately from the overall form.
  20863. */
  20864. var NgControlGroup = (function (_super) {
  20865. __extends(NgControlGroup, _super);
  20866. function NgControlGroup(parent, _validators, _asyncValidators) {
  20867. _super.call(this);
  20868. this._validators = _validators;
  20869. this._asyncValidators = _asyncValidators;
  20870. this._parent = parent;
  20871. }
  20872. NgControlGroup.prototype.ngOnInit = function () { this.formDirective.addControlGroup(this); };
  20873. NgControlGroup.prototype.ngOnDestroy = function () { this.formDirective.removeControlGroup(this); };
  20874. Object.defineProperty(NgControlGroup.prototype, "control", {
  20875. /**
  20876. * Get the {@link ControlGroup} backing this binding.
  20877. */
  20878. get: function () { return this.formDirective.getControlGroup(this); },
  20879. enumerable: true,
  20880. configurable: true
  20881. });
  20882. Object.defineProperty(NgControlGroup.prototype, "path", {
  20883. /**
  20884. * Get the path to this control group.
  20885. */
  20886. get: function () { return shared_1.controlPath(this.name, this._parent); },
  20887. enumerable: true,
  20888. configurable: true
  20889. });
  20890. Object.defineProperty(NgControlGroup.prototype, "formDirective", {
  20891. /**
  20892. * Get the {@link Form} to which this group belongs.
  20893. */
  20894. get: function () { return this._parent.formDirective; },
  20895. enumerable: true,
  20896. configurable: true
  20897. });
  20898. Object.defineProperty(NgControlGroup.prototype, "validator", {
  20899. get: function () { return shared_1.composeValidators(this._validators); },
  20900. enumerable: true,
  20901. configurable: true
  20902. });
  20903. Object.defineProperty(NgControlGroup.prototype, "asyncValidator", {
  20904. get: function () { return shared_1.composeAsyncValidators(this._asyncValidators); },
  20905. enumerable: true,
  20906. configurable: true
  20907. });
  20908. NgControlGroup = __decorate([
  20909. core_1.Directive({
  20910. selector: '[ngControlGroup]',
  20911. providers: [controlGroupProvider],
  20912. inputs: ['name: ngControlGroup'],
  20913. exportAs: 'ngForm'
  20914. }),
  20915. __param(0, core_1.Host()),
  20916. __param(0, core_1.SkipSelf()),
  20917. __param(1, core_1.Optional()),
  20918. __param(1, core_1.Self()),
  20919. __param(1, core_1.Inject(validators_1.NG_VALIDATORS)),
  20920. __param(2, core_1.Optional()),
  20921. __param(2, core_1.Self()),
  20922. __param(2, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  20923. __metadata('design:paramtypes', [control_container_1.ControlContainer, Array, Array])
  20924. ], NgControlGroup);
  20925. return NgControlGroup;
  20926. })(control_container_1.ControlContainer);
  20927. exports.NgControlGroup = NgControlGroup;
  20928. /***/ },
  20929. /* 140 */
  20930. /***/ function(module, exports, __webpack_require__) {
  20931. var __extends = (this && this.__extends) || function (d, b) {
  20932. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  20933. function __() { this.constructor = d; }
  20934. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  20935. };
  20936. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  20937. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  20938. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  20939. 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;
  20940. return c > 3 && r && Object.defineProperty(target, key, r), r;
  20941. };
  20942. var __metadata = (this && this.__metadata) || function (k, v) {
  20943. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  20944. };
  20945. var __param = (this && this.__param) || function (paramIndex, decorator) {
  20946. return function (target, key) { decorator(target, key, paramIndex); }
  20947. };
  20948. var lang_1 = __webpack_require__(5);
  20949. var collection_1 = __webpack_require__(12);
  20950. var async_1 = __webpack_require__(60);
  20951. var core_1 = __webpack_require__(2);
  20952. var control_container_1 = __webpack_require__(126);
  20953. var shared_1 = __webpack_require__(130);
  20954. var validators_1 = __webpack_require__(131);
  20955. var formDirectiveProvider = lang_1.CONST_EXPR(new core_1.Provider(control_container_1.ControlContainer, { useExisting: core_1.forwardRef(function () { return NgFormModel; }) }));
  20956. /**
  20957. * Binds an existing control group to a DOM element.
  20958. *
  20959. * ### Example ([live demo](http://plnkr.co/edit/jqrVirudY8anJxTMUjTP?p=preview))
  20960. *
  20961. * In this example, we bind the control group to the form element, and we bind the login and
  20962. * password controls to the login and password elements.
  20963. *
  20964. * ```typescript
  20965. * @Component({
  20966. * selector: 'my-app',
  20967. * template: `
  20968. * <div>
  20969. * <h2>NgFormModel Example</h2>
  20970. * <form [ngFormModel]="loginForm">
  20971. * <p>Login: <input type="text" ngControl="login"></p>
  20972. * <p>Password: <input type="password" ngControl="password"></p>
  20973. * </form>
  20974. * <p>Value:</p>
  20975. * <pre>{{value}}</pre>
  20976. * </div>
  20977. * `,
  20978. * directives: [FORM_DIRECTIVES]
  20979. * })
  20980. * export class App {
  20981. * loginForm: ControlGroup;
  20982. *
  20983. * constructor() {
  20984. * this.loginForm = new ControlGroup({
  20985. * login: new Control(""),
  20986. * password: new Control("")
  20987. * });
  20988. * }
  20989. *
  20990. * get value(): string {
  20991. * return JSON.stringify(this.loginForm.value, null, 2);
  20992. * }
  20993. * }
  20994. * ```
  20995. *
  20996. * We can also use ngModel to bind a domain model to the form.
  20997. *
  20998. * ```typescript
  20999. * @Component({
  21000. * selector: "login-comp",
  21001. * directives: [FORM_DIRECTIVES],
  21002. * template: `
  21003. * <form [ngFormModel]='loginForm'>
  21004. * Login <input type='text' ngControl='login' [(ngModel)]='credentials.login'>
  21005. * Password <input type='password' ngControl='password'
  21006. * [(ngModel)]='credentials.password'>
  21007. * <button (click)="onLogin()">Login</button>
  21008. * </form>`
  21009. * })
  21010. * class LoginComp {
  21011. * credentials: {login: string, password: string};
  21012. * loginForm: ControlGroup;
  21013. *
  21014. * constructor() {
  21015. * this.loginForm = new ControlGroup({
  21016. * login: new Control(""),
  21017. * password: new Control("")
  21018. * });
  21019. * }
  21020. *
  21021. * onLogin(): void {
  21022. * // this.credentials.login === 'some login'
  21023. * // this.credentials.password === 'some password'
  21024. * }
  21025. * }
  21026. * ```
  21027. */
  21028. var NgFormModel = (function (_super) {
  21029. __extends(NgFormModel, _super);
  21030. function NgFormModel(_validators, _asyncValidators) {
  21031. _super.call(this);
  21032. this._validators = _validators;
  21033. this._asyncValidators = _asyncValidators;
  21034. this.form = null;
  21035. this.directives = [];
  21036. this.ngSubmit = new async_1.EventEmitter();
  21037. }
  21038. NgFormModel.prototype.ngOnChanges = function (changes) {
  21039. if (collection_1.StringMapWrapper.contains(changes, "form")) {
  21040. var sync = shared_1.composeValidators(this._validators);
  21041. this.form.validator = validators_1.Validators.compose([this.form.validator, sync]);
  21042. var async = shared_1.composeAsyncValidators(this._asyncValidators);
  21043. this.form.asyncValidator = validators_1.Validators.composeAsync([this.form.asyncValidator, async]);
  21044. this.form.updateValueAndValidity({ onlySelf: true, emitEvent: false });
  21045. }
  21046. this._updateDomValue();
  21047. };
  21048. Object.defineProperty(NgFormModel.prototype, "formDirective", {
  21049. get: function () { return this; },
  21050. enumerable: true,
  21051. configurable: true
  21052. });
  21053. Object.defineProperty(NgFormModel.prototype, "control", {
  21054. get: function () { return this.form; },
  21055. enumerable: true,
  21056. configurable: true
  21057. });
  21058. Object.defineProperty(NgFormModel.prototype, "path", {
  21059. get: function () { return []; },
  21060. enumerable: true,
  21061. configurable: true
  21062. });
  21063. NgFormModel.prototype.addControl = function (dir) {
  21064. var ctrl = this.form.find(dir.path);
  21065. shared_1.setUpControl(ctrl, dir);
  21066. ctrl.updateValueAndValidity({ emitEvent: false });
  21067. this.directives.push(dir);
  21068. };
  21069. NgFormModel.prototype.getControl = function (dir) { return this.form.find(dir.path); };
  21070. NgFormModel.prototype.removeControl = function (dir) { collection_1.ListWrapper.remove(this.directives, dir); };
  21071. NgFormModel.prototype.addControlGroup = function (dir) {
  21072. var ctrl = this.form.find(dir.path);
  21073. shared_1.setUpControlGroup(ctrl, dir);
  21074. ctrl.updateValueAndValidity({ emitEvent: false });
  21075. };
  21076. NgFormModel.prototype.removeControlGroup = function (dir) { };
  21077. NgFormModel.prototype.getControlGroup = function (dir) {
  21078. return this.form.find(dir.path);
  21079. };
  21080. NgFormModel.prototype.updateModel = function (dir, value) {
  21081. var ctrl = this.form.find(dir.path);
  21082. ctrl.updateValue(value);
  21083. };
  21084. NgFormModel.prototype.onSubmit = function () {
  21085. async_1.ObservableWrapper.callEmit(this.ngSubmit, null);
  21086. return false;
  21087. };
  21088. /** @internal */
  21089. NgFormModel.prototype._updateDomValue = function () {
  21090. var _this = this;
  21091. this.directives.forEach(function (dir) {
  21092. var ctrl = _this.form.find(dir.path);
  21093. dir.valueAccessor.writeValue(ctrl.value);
  21094. });
  21095. };
  21096. NgFormModel = __decorate([
  21097. core_1.Directive({
  21098. selector: '[ngFormModel]',
  21099. bindings: [formDirectiveProvider],
  21100. inputs: ['form: ngFormModel'],
  21101. host: { '(submit)': 'onSubmit()' },
  21102. outputs: ['ngSubmit'],
  21103. exportAs: 'ngForm'
  21104. }),
  21105. __param(0, core_1.Optional()),
  21106. __param(0, core_1.Self()),
  21107. __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
  21108. __param(1, core_1.Optional()),
  21109. __param(1, core_1.Self()),
  21110. __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  21111. __metadata('design:paramtypes', [Array, Array])
  21112. ], NgFormModel);
  21113. return NgFormModel;
  21114. })(control_container_1.ControlContainer);
  21115. exports.NgFormModel = NgFormModel;
  21116. /***/ },
  21117. /* 141 */
  21118. /***/ function(module, exports, __webpack_require__) {
  21119. var __extends = (this && this.__extends) || function (d, b) {
  21120. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  21121. function __() { this.constructor = d; }
  21122. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  21123. };
  21124. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  21125. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  21126. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  21127. 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;
  21128. return c > 3 && r && Object.defineProperty(target, key, r), r;
  21129. };
  21130. var __metadata = (this && this.__metadata) || function (k, v) {
  21131. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  21132. };
  21133. var __param = (this && this.__param) || function (paramIndex, decorator) {
  21134. return function (target, key) { decorator(target, key, paramIndex); }
  21135. };
  21136. var async_1 = __webpack_require__(60);
  21137. var collection_1 = __webpack_require__(12);
  21138. var lang_1 = __webpack_require__(5);
  21139. var core_1 = __webpack_require__(2);
  21140. var control_container_1 = __webpack_require__(126);
  21141. var model_1 = __webpack_require__(124);
  21142. var shared_1 = __webpack_require__(130);
  21143. var validators_1 = __webpack_require__(131);
  21144. var formDirectiveProvider = lang_1.CONST_EXPR(new core_1.Provider(control_container_1.ControlContainer, { useExisting: core_1.forwardRef(function () { return NgForm; }) }));
  21145. /**
  21146. * If `NgForm` is bound in a component, `<form>` elements in that component will be
  21147. * upgraded to use the Angular form system.
  21148. *
  21149. * ### Typical Use
  21150. *
  21151. * Include `FORM_DIRECTIVES` in the `directives` section of a {@link View} annotation
  21152. * to use `NgForm` and its associated controls.
  21153. *
  21154. * ### Structure
  21155. *
  21156. * An Angular form is a collection of `Control`s in some hierarchy.
  21157. * `Control`s can be at the top level or can be organized in `ControlGroup`s
  21158. * or `ControlArray`s. This hierarchy is reflected in the form's `value`, a
  21159. * JSON object that mirrors the form structure.
  21160. *
  21161. * ### Submission
  21162. *
  21163. * The `ngSubmit` event signals when the user triggers a form submission.
  21164. *
  21165. * ### Example ([live demo](http://plnkr.co/edit/ltdgYj4P0iY64AR71EpL?p=preview))
  21166. *
  21167. * ```typescript
  21168. * @Component({
  21169. * selector: 'my-app',
  21170. * template: `
  21171. * <div>
  21172. * <p>Submit the form to see the data object Angular builds</p>
  21173. * <h2>NgForm demo</h2>
  21174. * <form #f="ngForm" (ngSubmit)="onSubmit(f.value)">
  21175. * <h3>Control group: credentials</h3>
  21176. * <div ngControlGroup="credentials">
  21177. * <p>Login: <input type="text" ngControl="login"></p>
  21178. * <p>Password: <input type="password" ngControl="password"></p>
  21179. * </div>
  21180. * <h3>Control group: person</h3>
  21181. * <div ngControlGroup="person">
  21182. * <p>First name: <input type="text" ngControl="firstName"></p>
  21183. * <p>Last name: <input type="text" ngControl="lastName"></p>
  21184. * </div>
  21185. * <button type="submit">Submit Form</button>
  21186. * <p>Form data submitted:</p>
  21187. * </form>
  21188. * <pre>{{data}}</pre>
  21189. * </div>
  21190. * `,
  21191. * directives: [CORE_DIRECTIVES, FORM_DIRECTIVES]
  21192. * })
  21193. * export class App {
  21194. * constructor() {}
  21195. *
  21196. * data: string;
  21197. *
  21198. * onSubmit(data) {
  21199. * this.data = JSON.stringify(data, null, 2);
  21200. * }
  21201. * }
  21202. * ```
  21203. */
  21204. var NgForm = (function (_super) {
  21205. __extends(NgForm, _super);
  21206. function NgForm(validators, asyncValidators) {
  21207. _super.call(this);
  21208. this.ngSubmit = new async_1.EventEmitter();
  21209. this.form = new model_1.ControlGroup({}, null, shared_1.composeValidators(validators), shared_1.composeAsyncValidators(asyncValidators));
  21210. }
  21211. Object.defineProperty(NgForm.prototype, "formDirective", {
  21212. get: function () { return this; },
  21213. enumerable: true,
  21214. configurable: true
  21215. });
  21216. Object.defineProperty(NgForm.prototype, "control", {
  21217. get: function () { return this.form; },
  21218. enumerable: true,
  21219. configurable: true
  21220. });
  21221. Object.defineProperty(NgForm.prototype, "path", {
  21222. get: function () { return []; },
  21223. enumerable: true,
  21224. configurable: true
  21225. });
  21226. Object.defineProperty(NgForm.prototype, "controls", {
  21227. get: function () { return this.form.controls; },
  21228. enumerable: true,
  21229. configurable: true
  21230. });
  21231. NgForm.prototype.addControl = function (dir) {
  21232. var _this = this;
  21233. async_1.PromiseWrapper.scheduleMicrotask(function () {
  21234. var container = _this._findContainer(dir.path);
  21235. var ctrl = new model_1.Control();
  21236. shared_1.setUpControl(ctrl, dir);
  21237. container.addControl(dir.name, ctrl);
  21238. ctrl.updateValueAndValidity({ emitEvent: false });
  21239. });
  21240. };
  21241. NgForm.prototype.getControl = function (dir) { return this.form.find(dir.path); };
  21242. NgForm.prototype.removeControl = function (dir) {
  21243. var _this = this;
  21244. async_1.PromiseWrapper.scheduleMicrotask(function () {
  21245. var container = _this._findContainer(dir.path);
  21246. if (lang_1.isPresent(container)) {
  21247. container.removeControl(dir.name);
  21248. container.updateValueAndValidity({ emitEvent: false });
  21249. }
  21250. });
  21251. };
  21252. NgForm.prototype.addControlGroup = function (dir) {
  21253. var _this = this;
  21254. async_1.PromiseWrapper.scheduleMicrotask(function () {
  21255. var container = _this._findContainer(dir.path);
  21256. var group = new model_1.ControlGroup({});
  21257. shared_1.setUpControlGroup(group, dir);
  21258. container.addControl(dir.name, group);
  21259. group.updateValueAndValidity({ emitEvent: false });
  21260. });
  21261. };
  21262. NgForm.prototype.removeControlGroup = function (dir) {
  21263. var _this = this;
  21264. async_1.PromiseWrapper.scheduleMicrotask(function () {
  21265. var container = _this._findContainer(dir.path);
  21266. if (lang_1.isPresent(container)) {
  21267. container.removeControl(dir.name);
  21268. container.updateValueAndValidity({ emitEvent: false });
  21269. }
  21270. });
  21271. };
  21272. NgForm.prototype.getControlGroup = function (dir) {
  21273. return this.form.find(dir.path);
  21274. };
  21275. NgForm.prototype.updateModel = function (dir, value) {
  21276. var _this = this;
  21277. async_1.PromiseWrapper.scheduleMicrotask(function () {
  21278. var ctrl = _this.form.find(dir.path);
  21279. ctrl.updateValue(value);
  21280. });
  21281. };
  21282. NgForm.prototype.onSubmit = function () {
  21283. async_1.ObservableWrapper.callEmit(this.ngSubmit, null);
  21284. return false;
  21285. };
  21286. /** @internal */
  21287. NgForm.prototype._findContainer = function (path) {
  21288. path.pop();
  21289. return collection_1.ListWrapper.isEmpty(path) ? this.form : this.form.find(path);
  21290. };
  21291. NgForm = __decorate([
  21292. core_1.Directive({
  21293. selector: 'form:not([ngNoForm]):not([ngFormModel]),ngForm,[ngForm]',
  21294. bindings: [formDirectiveProvider],
  21295. host: {
  21296. '(submit)': 'onSubmit()',
  21297. },
  21298. outputs: ['ngSubmit'],
  21299. exportAs: 'ngForm'
  21300. }),
  21301. __param(0, core_1.Optional()),
  21302. __param(0, core_1.Self()),
  21303. __param(0, core_1.Inject(validators_1.NG_VALIDATORS)),
  21304. __param(1, core_1.Optional()),
  21305. __param(1, core_1.Self()),
  21306. __param(1, core_1.Inject(validators_1.NG_ASYNC_VALIDATORS)),
  21307. __metadata('design:paramtypes', [Array, Array])
  21308. ], NgForm);
  21309. return NgForm;
  21310. })(control_container_1.ControlContainer);
  21311. exports.NgForm = NgForm;
  21312. /***/ },
  21313. /* 142 */
  21314. /***/ function(module, exports, __webpack_require__) {
  21315. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  21316. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  21317. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  21318. 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;
  21319. return c > 3 && r && Object.defineProperty(target, key, r), r;
  21320. };
  21321. var __metadata = (this && this.__metadata) || function (k, v) {
  21322. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  21323. };
  21324. var __param = (this && this.__param) || function (paramIndex, decorator) {
  21325. return function (target, key) { decorator(target, key, paramIndex); }
  21326. };
  21327. var core_1 = __webpack_require__(2);
  21328. var ng_control_1 = __webpack_require__(128);
  21329. var lang_1 = __webpack_require__(5);
  21330. /**
  21331. * Directive automatically applied to Angular forms that sets CSS classes
  21332. * based on control status (valid/invalid/dirty/etc).
  21333. */
  21334. var NgControlStatus = (function () {
  21335. function NgControlStatus(cd) {
  21336. this._cd = cd;
  21337. }
  21338. Object.defineProperty(NgControlStatus.prototype, "ngClassUntouched", {
  21339. get: function () {
  21340. return lang_1.isPresent(this._cd.control) ? this._cd.control.untouched : false;
  21341. },
  21342. enumerable: true,
  21343. configurable: true
  21344. });
  21345. Object.defineProperty(NgControlStatus.prototype, "ngClassTouched", {
  21346. get: function () {
  21347. return lang_1.isPresent(this._cd.control) ? this._cd.control.touched : false;
  21348. },
  21349. enumerable: true,
  21350. configurable: true
  21351. });
  21352. Object.defineProperty(NgControlStatus.prototype, "ngClassPristine", {
  21353. get: function () {
  21354. return lang_1.isPresent(this._cd.control) ? this._cd.control.pristine : false;
  21355. },
  21356. enumerable: true,
  21357. configurable: true
  21358. });
  21359. Object.defineProperty(NgControlStatus.prototype, "ngClassDirty", {
  21360. get: function () {
  21361. return lang_1.isPresent(this._cd.control) ? this._cd.control.dirty : false;
  21362. },
  21363. enumerable: true,
  21364. configurable: true
  21365. });
  21366. Object.defineProperty(NgControlStatus.prototype, "ngClassValid", {
  21367. get: function () {
  21368. return lang_1.isPresent(this._cd.control) ? this._cd.control.valid : false;
  21369. },
  21370. enumerable: true,
  21371. configurable: true
  21372. });
  21373. Object.defineProperty(NgControlStatus.prototype, "ngClassInvalid", {
  21374. get: function () {
  21375. return lang_1.isPresent(this._cd.control) ? !this._cd.control.valid : false;
  21376. },
  21377. enumerable: true,
  21378. configurable: true
  21379. });
  21380. NgControlStatus = __decorate([
  21381. core_1.Directive({
  21382. selector: '[ngControl],[ngModel],[ngFormControl]',
  21383. host: {
  21384. '[class.ng-untouched]': 'ngClassUntouched',
  21385. '[class.ng-touched]': 'ngClassTouched',
  21386. '[class.ng-pristine]': 'ngClassPristine',
  21387. '[class.ng-dirty]': 'ngClassDirty',
  21388. '[class.ng-valid]': 'ngClassValid',
  21389. '[class.ng-invalid]': 'ngClassInvalid'
  21390. }
  21391. }),
  21392. __param(0, core_1.Self()),
  21393. __metadata('design:paramtypes', [ng_control_1.NgControl])
  21394. ], NgControlStatus);
  21395. return NgControlStatus;
  21396. })();
  21397. exports.NgControlStatus = NgControlStatus;
  21398. /***/ },
  21399. /* 143 */
  21400. /***/ function(module, exports, __webpack_require__) {
  21401. var lang_1 = __webpack_require__(5);
  21402. var ng_control_name_1 = __webpack_require__(127);
  21403. var ng_form_control_1 = __webpack_require__(137);
  21404. var ng_model_1 = __webpack_require__(138);
  21405. var ng_control_group_1 = __webpack_require__(139);
  21406. var ng_form_model_1 = __webpack_require__(140);
  21407. var ng_form_1 = __webpack_require__(141);
  21408. var default_value_accessor_1 = __webpack_require__(132);
  21409. var checkbox_value_accessor_1 = __webpack_require__(134);
  21410. var number_value_accessor_1 = __webpack_require__(133);
  21411. var ng_control_status_1 = __webpack_require__(142);
  21412. var select_control_value_accessor_1 = __webpack_require__(135);
  21413. var validators_1 = __webpack_require__(144);
  21414. var ng_control_name_2 = __webpack_require__(127);
  21415. exports.NgControlName = ng_control_name_2.NgControlName;
  21416. var ng_form_control_2 = __webpack_require__(137);
  21417. exports.NgFormControl = ng_form_control_2.NgFormControl;
  21418. var ng_model_2 = __webpack_require__(138);
  21419. exports.NgModel = ng_model_2.NgModel;
  21420. var ng_control_group_2 = __webpack_require__(139);
  21421. exports.NgControlGroup = ng_control_group_2.NgControlGroup;
  21422. var ng_form_model_2 = __webpack_require__(140);
  21423. exports.NgFormModel = ng_form_model_2.NgFormModel;
  21424. var ng_form_2 = __webpack_require__(141);
  21425. exports.NgForm = ng_form_2.NgForm;
  21426. var default_value_accessor_2 = __webpack_require__(132);
  21427. exports.DefaultValueAccessor = default_value_accessor_2.DefaultValueAccessor;
  21428. var checkbox_value_accessor_2 = __webpack_require__(134);
  21429. exports.CheckboxControlValueAccessor = checkbox_value_accessor_2.CheckboxControlValueAccessor;
  21430. var number_value_accessor_2 = __webpack_require__(133);
  21431. exports.NumberValueAccessor = number_value_accessor_2.NumberValueAccessor;
  21432. var ng_control_status_2 = __webpack_require__(142);
  21433. exports.NgControlStatus = ng_control_status_2.NgControlStatus;
  21434. var select_control_value_accessor_2 = __webpack_require__(135);
  21435. exports.SelectControlValueAccessor = select_control_value_accessor_2.SelectControlValueAccessor;
  21436. exports.NgSelectOption = select_control_value_accessor_2.NgSelectOption;
  21437. var validators_2 = __webpack_require__(144);
  21438. exports.RequiredValidator = validators_2.RequiredValidator;
  21439. exports.MinLengthValidator = validators_2.MinLengthValidator;
  21440. exports.MaxLengthValidator = validators_2.MaxLengthValidator;
  21441. var ng_control_1 = __webpack_require__(128);
  21442. exports.NgControl = ng_control_1.NgControl;
  21443. /**
  21444. *
  21445. * A list of all the form directives used as part of a `@View` annotation.
  21446. *
  21447. * This is a shorthand for importing them each individually.
  21448. *
  21449. * ### Example
  21450. *
  21451. * ```typescript
  21452. * @Component({
  21453. * selector: 'my-app',
  21454. * directives: [FORM_DIRECTIVES]
  21455. * })
  21456. * class MyApp {}
  21457. * ```
  21458. */
  21459. exports.FORM_DIRECTIVES = lang_1.CONST_EXPR([
  21460. ng_control_name_1.NgControlName,
  21461. ng_control_group_1.NgControlGroup,
  21462. ng_form_control_1.NgFormControl,
  21463. ng_model_1.NgModel,
  21464. ng_form_model_1.NgFormModel,
  21465. ng_form_1.NgForm,
  21466. select_control_value_accessor_1.NgSelectOption,
  21467. default_value_accessor_1.DefaultValueAccessor,
  21468. number_value_accessor_1.NumberValueAccessor,
  21469. checkbox_value_accessor_1.CheckboxControlValueAccessor,
  21470. select_control_value_accessor_1.SelectControlValueAccessor,
  21471. ng_control_status_1.NgControlStatus,
  21472. validators_1.RequiredValidator,
  21473. validators_1.MinLengthValidator,
  21474. validators_1.MaxLengthValidator
  21475. ]);
  21476. /***/ },
  21477. /* 144 */
  21478. /***/ function(module, exports, __webpack_require__) {
  21479. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  21480. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  21481. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  21482. 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;
  21483. return c > 3 && r && Object.defineProperty(target, key, r), r;
  21484. };
  21485. var __metadata = (this && this.__metadata) || function (k, v) {
  21486. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  21487. };
  21488. var __param = (this && this.__param) || function (paramIndex, decorator) {
  21489. return function (target, key) { decorator(target, key, paramIndex); }
  21490. };
  21491. var core_1 = __webpack_require__(2);
  21492. var lang_1 = __webpack_require__(5);
  21493. var validators_1 = __webpack_require__(131);
  21494. var lang_2 = __webpack_require__(5);
  21495. var REQUIRED_VALIDATOR = lang_1.CONST_EXPR(new core_1.Provider(validators_1.NG_VALIDATORS, { useValue: validators_1.Validators.required, multi: true }));
  21496. /**
  21497. * A Directive that adds the `required` validator to any controls marked with the
  21498. * `required` attribute, via the {@link NG_VALIDATORS} binding.
  21499. *
  21500. * ### Example
  21501. *
  21502. * ```
  21503. * <input ngControl="fullName" required>
  21504. * ```
  21505. */
  21506. var RequiredValidator = (function () {
  21507. function RequiredValidator() {
  21508. }
  21509. RequiredValidator = __decorate([
  21510. core_1.Directive({
  21511. selector: '[required][ngControl],[required][ngFormControl],[required][ngModel]',
  21512. providers: [REQUIRED_VALIDATOR]
  21513. }),
  21514. __metadata('design:paramtypes', [])
  21515. ], RequiredValidator);
  21516. return RequiredValidator;
  21517. })();
  21518. exports.RequiredValidator = RequiredValidator;
  21519. /**
  21520. * Provivder which adds {@link MinLengthValidator} to {@link NG_VALIDATORS}.
  21521. *
  21522. * ## Example:
  21523. *
  21524. * {@example common/forms/ts/validators/validators.ts region='min'}
  21525. */
  21526. 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 }));
  21527. /**
  21528. * A directive which installs the {@link MinLengthValidator} for any `ngControl`,
  21529. * `ngFormControl`, or control with `ngModel` that also has a `minlength` attribute.
  21530. */
  21531. var MinLengthValidator = (function () {
  21532. function MinLengthValidator(minLength) {
  21533. this._validator = validators_1.Validators.minLength(lang_2.NumberWrapper.parseInt(minLength, 10));
  21534. }
  21535. MinLengthValidator.prototype.validate = function (c) { return this._validator(c); };
  21536. MinLengthValidator = __decorate([
  21537. core_1.Directive({
  21538. selector: '[minlength][ngControl],[minlength][ngFormControl],[minlength][ngModel]',
  21539. providers: [MIN_LENGTH_VALIDATOR]
  21540. }),
  21541. __param(0, core_1.Attribute("minlength")),
  21542. __metadata('design:paramtypes', [String])
  21543. ], MinLengthValidator);
  21544. return MinLengthValidator;
  21545. })();
  21546. exports.MinLengthValidator = MinLengthValidator;
  21547. /**
  21548. * Provider which adds {@link MaxLengthValidator} to {@link NG_VALIDATORS}.
  21549. *
  21550. * ## Example:
  21551. *
  21552. * {@example common/forms/ts/validators/validators.ts region='max'}
  21553. */
  21554. 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 }));
  21555. /**
  21556. * A directive which installs the {@link MaxLengthValidator} for any `ngControl, `ngFormControl`,
  21557. * or control with `ngModel` that also has a `maxlength` attribute.
  21558. */
  21559. var MaxLengthValidator = (function () {
  21560. function MaxLengthValidator(maxLength) {
  21561. this._validator = validators_1.Validators.maxLength(lang_2.NumberWrapper.parseInt(maxLength, 10));
  21562. }
  21563. MaxLengthValidator.prototype.validate = function (c) { return this._validator(c); };
  21564. MaxLengthValidator = __decorate([
  21565. core_1.Directive({
  21566. selector: '[maxlength][ngControl],[maxlength][ngFormControl],[maxlength][ngModel]',
  21567. providers: [MAX_LENGTH_VALIDATOR]
  21568. }),
  21569. __param(0, core_1.Attribute("maxlength")),
  21570. __metadata('design:paramtypes', [String])
  21571. ], MaxLengthValidator);
  21572. return MaxLengthValidator;
  21573. })();
  21574. exports.MaxLengthValidator = MaxLengthValidator;
  21575. /***/ },
  21576. /* 145 */
  21577. /***/ function(module, exports, __webpack_require__) {
  21578. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  21579. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  21580. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  21581. 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;
  21582. return c > 3 && r && Object.defineProperty(target, key, r), r;
  21583. };
  21584. var __metadata = (this && this.__metadata) || function (k, v) {
  21585. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  21586. };
  21587. var core_1 = __webpack_require__(2);
  21588. var collection_1 = __webpack_require__(12);
  21589. var lang_1 = __webpack_require__(5);
  21590. var modelModule = __webpack_require__(124);
  21591. /**
  21592. * Creates a form object from a user-specified configuration.
  21593. *
  21594. * ### Example ([live demo](http://plnkr.co/edit/ENgZo8EuIECZNensZCVr?p=preview))
  21595. *
  21596. * ```typescript
  21597. * @Component({
  21598. * selector: 'my-app',
  21599. * viewBindings: [FORM_BINDINGS]
  21600. * template: `
  21601. * <form [ngFormModel]="loginForm">
  21602. * <p>Login <input ngControl="login"></p>
  21603. * <div ngControlGroup="passwordRetry">
  21604. * <p>Password <input type="password" ngControl="password"></p>
  21605. * <p>Confirm password <input type="password" ngControl="passwordConfirmation"></p>
  21606. * </div>
  21607. * </form>
  21608. * <h3>Form value:</h3>
  21609. * <pre>{{value}}</pre>
  21610. * `,
  21611. * directives: [FORM_DIRECTIVES]
  21612. * })
  21613. * export class App {
  21614. * loginForm: ControlGroup;
  21615. *
  21616. * constructor(builder: FormBuilder) {
  21617. * this.loginForm = builder.group({
  21618. * login: ["", Validators.required],
  21619. * passwordRetry: builder.group({
  21620. * password: ["", Validators.required],
  21621. * passwordConfirmation: ["", Validators.required, asyncValidator]
  21622. * })
  21623. * });
  21624. * }
  21625. *
  21626. * get value(): string {
  21627. * return JSON.stringify(this.loginForm.value, null, 2);
  21628. * }
  21629. * }
  21630. * ```
  21631. */
  21632. var FormBuilder = (function () {
  21633. function FormBuilder() {
  21634. }
  21635. /**
  21636. * Construct a new {@link ControlGroup} with the given map of configuration.
  21637. * Valid keys for the `extra` parameter map are `optionals` and `validator`.
  21638. *
  21639. * See the {@link ControlGroup} constructor for more details.
  21640. */
  21641. FormBuilder.prototype.group = function (controlsConfig, extra) {
  21642. if (extra === void 0) { extra = null; }
  21643. var controls = this._reduceControls(controlsConfig);
  21644. var optionals = lang_1.isPresent(extra) ? collection_1.StringMapWrapper.get(extra, "optionals") : null;
  21645. var validator = lang_1.isPresent(extra) ? collection_1.StringMapWrapper.get(extra, "validator") : null;
  21646. var asyncValidator = lang_1.isPresent(extra) ? collection_1.StringMapWrapper.get(extra, "asyncValidator") : null;
  21647. return new modelModule.ControlGroup(controls, optionals, validator, asyncValidator);
  21648. };
  21649. /**
  21650. * Construct a new {@link Control} with the given `value`,`validator`, and `asyncValidator`.
  21651. */
  21652. FormBuilder.prototype.control = function (value, validator, asyncValidator) {
  21653. if (validator === void 0) { validator = null; }
  21654. if (asyncValidator === void 0) { asyncValidator = null; }
  21655. return new modelModule.Control(value, validator, asyncValidator);
  21656. };
  21657. /**
  21658. * Construct an array of {@link Control}s from the given `controlsConfig` array of
  21659. * configuration, with the given optional `validator` and `asyncValidator`.
  21660. */
  21661. FormBuilder.prototype.array = function (controlsConfig, validator, asyncValidator) {
  21662. var _this = this;
  21663. if (validator === void 0) { validator = null; }
  21664. if (asyncValidator === void 0) { asyncValidator = null; }
  21665. var controls = controlsConfig.map(function (c) { return _this._createControl(c); });
  21666. return new modelModule.ControlArray(controls, validator, asyncValidator);
  21667. };
  21668. /** @internal */
  21669. FormBuilder.prototype._reduceControls = function (controlsConfig) {
  21670. var _this = this;
  21671. var controls = {};
  21672. collection_1.StringMapWrapper.forEach(controlsConfig, function (controlConfig, controlName) {
  21673. controls[controlName] = _this._createControl(controlConfig);
  21674. });
  21675. return controls;
  21676. };
  21677. /** @internal */
  21678. FormBuilder.prototype._createControl = function (controlConfig) {
  21679. if (controlConfig instanceof modelModule.Control ||
  21680. controlConfig instanceof modelModule.ControlGroup ||
  21681. controlConfig instanceof modelModule.ControlArray) {
  21682. return controlConfig;
  21683. }
  21684. else if (lang_1.isArray(controlConfig)) {
  21685. var value = controlConfig[0];
  21686. var validator = controlConfig.length > 1 ? controlConfig[1] : null;
  21687. var asyncValidator = controlConfig.length > 2 ? controlConfig[2] : null;
  21688. return this.control(value, validator, asyncValidator);
  21689. }
  21690. else {
  21691. return this.control(controlConfig);
  21692. }
  21693. };
  21694. FormBuilder = __decorate([
  21695. core_1.Injectable(),
  21696. __metadata('design:paramtypes', [])
  21697. ], FormBuilder);
  21698. return FormBuilder;
  21699. })();
  21700. exports.FormBuilder = FormBuilder;
  21701. /**
  21702. * Shorthand set of providers used for building Angular forms.
  21703. *
  21704. * ### Example
  21705. *
  21706. * ```typescript
  21707. * bootstrap(MyApp, [FORM_PROVIDERS]);
  21708. * ```
  21709. */
  21710. exports.FORM_PROVIDERS = lang_1.CONST_EXPR([FormBuilder]);
  21711. /**
  21712. * See {@link FORM_PROVIDERS} instead.
  21713. *
  21714. * @deprecated
  21715. */
  21716. exports.FORM_BINDINGS = exports.FORM_PROVIDERS;
  21717. /***/ },
  21718. /* 146 */
  21719. /***/ function(module, exports, __webpack_require__) {
  21720. var lang_1 = __webpack_require__(5);
  21721. var forms_1 = __webpack_require__(123);
  21722. var directives_1 = __webpack_require__(115);
  21723. /**
  21724. * A collection of Angular core directives that are likely to be used in each and every Angular
  21725. * application. This includes core directives (e.g., NgIf and NgFor), and forms directives (e.g.,
  21726. * NgModel).
  21727. *
  21728. * This collection can be used to quickly enumerate all the built-in directives in the `directives`
  21729. * property of the `@Component` or `@View` decorators.
  21730. *
  21731. * ### Example
  21732. *
  21733. * Instead of writing:
  21734. *
  21735. * ```typescript
  21736. * import {NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault, NgModel, NgForm} from
  21737. * 'angular2/common';
  21738. * import {OtherDirective} from './myDirectives';
  21739. *
  21740. * @Component({
  21741. * selector: 'my-component',
  21742. * templateUrl: 'myComponent.html',
  21743. * directives: [NgClass, NgIf, NgFor, NgSwitch, NgSwitchWhen, NgSwitchDefault, NgModel, NgForm,
  21744. * OtherDirective]
  21745. * })
  21746. * export class MyComponent {
  21747. * ...
  21748. * }
  21749. * ```
  21750. * one could import all the common directives at once:
  21751. *
  21752. * ```typescript
  21753. * import {COMMON_DIRECTIVES} from 'angular2/common';
  21754. * import {OtherDirective} from './myDirectives';
  21755. *
  21756. * @Component({
  21757. * selector: 'my-component',
  21758. * templateUrl: 'myComponent.html',
  21759. * directives: [COMMON_DIRECTIVES, OtherDirective]
  21760. * })
  21761. * export class MyComponent {
  21762. * ...
  21763. * }
  21764. * ```
  21765. */
  21766. exports.COMMON_DIRECTIVES = lang_1.CONST_EXPR([directives_1.CORE_DIRECTIVES, forms_1.FORM_DIRECTIVES]);
  21767. /***/ },
  21768. /* 147 */
  21769. /***/ function(module, exports, __webpack_require__) {
  21770. function __export(m) {
  21771. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  21772. }
  21773. /**
  21774. * @module
  21775. * @description
  21776. * Starting point to import all compiler APIs.
  21777. */
  21778. __export(__webpack_require__(148));
  21779. __export(__webpack_require__(149));
  21780. __export(__webpack_require__(150));
  21781. /***/ },
  21782. /* 148 */
  21783. /***/ function(module, exports, __webpack_require__) {
  21784. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  21785. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  21786. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  21787. 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;
  21788. return c > 3 && r && Object.defineProperty(target, key, r), r;
  21789. };
  21790. var __metadata = (this && this.__metadata) || function (k, v) {
  21791. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  21792. };
  21793. var __param = (this && this.__param) || function (paramIndex, decorator) {
  21794. return function (target, key) { decorator(target, key, paramIndex); }
  21795. };
  21796. var di_1 = __webpack_require__(6);
  21797. var lang_1 = __webpack_require__(5);
  21798. var application_tokens_1 = __webpack_require__(67);
  21799. var di_2 = __webpack_require__(6);
  21800. /**
  21801. * Create a {@link UrlResolver} with no package prefix.
  21802. */
  21803. function createWithoutPackagePrefix() {
  21804. return new UrlResolver();
  21805. }
  21806. exports.createWithoutPackagePrefix = createWithoutPackagePrefix;
  21807. /**
  21808. * A default provider for {@link PACKAGE_ROOT_URL} that maps to '/'.
  21809. */
  21810. exports.DEFAULT_PACKAGE_URL_PROVIDER = new di_2.Provider(application_tokens_1.PACKAGE_ROOT_URL, { useValue: "/" });
  21811. /**
  21812. * Used by the {@link Compiler} when resolving HTML and CSS template URLs.
  21813. *
  21814. * This class can be overridden by the application developer to create custom behavior.
  21815. *
  21816. * See {@link Compiler}
  21817. *
  21818. * ## Example
  21819. *
  21820. * {@example compiler/ts/url_resolver/url_resolver.ts region='url_resolver'}
  21821. */
  21822. var UrlResolver = (function () {
  21823. function UrlResolver(packagePrefix) {
  21824. if (packagePrefix === void 0) { packagePrefix = null; }
  21825. if (lang_1.isPresent(packagePrefix)) {
  21826. this._packagePrefix = lang_1.StringWrapper.stripRight(packagePrefix, "/") + "/";
  21827. }
  21828. }
  21829. /**
  21830. * Resolves the `url` given the `baseUrl`:
  21831. * - when the `url` is null, the `baseUrl` is returned,
  21832. * - if `url` is relative ('path/to/here', './path/to/here'), the resolved url is a combination of
  21833. * `baseUrl` and `url`,
  21834. * - if `url` is absolute (it has a scheme: 'http://', 'https://' or start with '/'), the `url` is
  21835. * returned as is (ignoring the `baseUrl`)
  21836. *
  21837. * @param {string} baseUrl
  21838. * @param {string} url
  21839. * @returns {string} the resolved URL
  21840. */
  21841. UrlResolver.prototype.resolve = function (baseUrl, url) {
  21842. var resolvedUrl = url;
  21843. if (lang_1.isPresent(baseUrl) && baseUrl.length > 0) {
  21844. resolvedUrl = _resolveUrl(baseUrl, resolvedUrl);
  21845. }
  21846. if (lang_1.isPresent(this._packagePrefix) && getUrlScheme(resolvedUrl) == "package") {
  21847. resolvedUrl = resolvedUrl.replace("package:", this._packagePrefix);
  21848. }
  21849. return resolvedUrl;
  21850. };
  21851. UrlResolver = __decorate([
  21852. di_1.Injectable(),
  21853. __param(0, di_1.Inject(application_tokens_1.PACKAGE_ROOT_URL)),
  21854. __metadata('design:paramtypes', [String])
  21855. ], UrlResolver);
  21856. return UrlResolver;
  21857. })();
  21858. exports.UrlResolver = UrlResolver;
  21859. /**
  21860. * Extract the scheme of a URL.
  21861. */
  21862. function getUrlScheme(url) {
  21863. var match = _split(url);
  21864. return (match && match[_ComponentIndex.Scheme]) || "";
  21865. }
  21866. exports.getUrlScheme = getUrlScheme;
  21867. // The code below is adapted from Traceur:
  21868. // https://github.com/google/traceur-compiler/blob/9511c1dafa972bf0de1202a8a863bad02f0f95a8/src/runtime/url.js
  21869. /**
  21870. * Builds a URI string from already-encoded parts.
  21871. *
  21872. * No encoding is performed. Any component may be omitted as either null or
  21873. * undefined.
  21874. *
  21875. * @param {?string=} opt_scheme The scheme such as 'http'.
  21876. * @param {?string=} opt_userInfo The user name before the '@'.
  21877. * @param {?string=} opt_domain The domain such as 'www.google.com', already
  21878. * URI-encoded.
  21879. * @param {(string|null)=} opt_port The port number.
  21880. * @param {?string=} opt_path The path, already URI-encoded. If it is not
  21881. * empty, it must begin with a slash.
  21882. * @param {?string=} opt_queryData The URI-encoded query data.
  21883. * @param {?string=} opt_fragment The URI-encoded fragment identifier.
  21884. * @return {string} The fully combined URI.
  21885. */
  21886. function _buildFromEncodedParts(opt_scheme, opt_userInfo, opt_domain, opt_port, opt_path, opt_queryData, opt_fragment) {
  21887. var out = [];
  21888. if (lang_1.isPresent(opt_scheme)) {
  21889. out.push(opt_scheme + ':');
  21890. }
  21891. if (lang_1.isPresent(opt_domain)) {
  21892. out.push('//');
  21893. if (lang_1.isPresent(opt_userInfo)) {
  21894. out.push(opt_userInfo + '@');
  21895. }
  21896. out.push(opt_domain);
  21897. if (lang_1.isPresent(opt_port)) {
  21898. out.push(':' + opt_port);
  21899. }
  21900. }
  21901. if (lang_1.isPresent(opt_path)) {
  21902. out.push(opt_path);
  21903. }
  21904. if (lang_1.isPresent(opt_queryData)) {
  21905. out.push('?' + opt_queryData);
  21906. }
  21907. if (lang_1.isPresent(opt_fragment)) {
  21908. out.push('#' + opt_fragment);
  21909. }
  21910. return out.join('');
  21911. }
  21912. /**
  21913. * A regular expression for breaking a URI into its component parts.
  21914. *
  21915. * {@link http://www.gbiv.com/protocols/uri/rfc/rfc3986.html#RFC2234} says
  21916. * As the "first-match-wins" algorithm is identical to the "greedy"
  21917. * disambiguation method used by POSIX regular expressions, it is natural and
  21918. * commonplace to use a regular expression for parsing the potential five
  21919. * components of a URI reference.
  21920. *
  21921. * The following line is the regular expression for breaking-down a
  21922. * well-formed URI reference into its components.
  21923. *
  21924. * <pre>
  21925. * ^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
  21926. * 12 3 4 5 6 7 8 9
  21927. * </pre>
  21928. *
  21929. * The numbers in the second line above are only to assist readability; they
  21930. * indicate the reference points for each subexpression (i.e., each paired
  21931. * parenthesis). We refer to the value matched for subexpression <n> as $<n>.
  21932. * For example, matching the above expression to
  21933. * <pre>
  21934. * http://www.ics.uci.edu/pub/ietf/uri/#Related
  21935. * </pre>
  21936. * results in the following subexpression matches:
  21937. * <pre>
  21938. * $1 = http:
  21939. * $2 = http
  21940. * $3 = //www.ics.uci.edu
  21941. * $4 = www.ics.uci.edu
  21942. * $5 = /pub/ietf/uri/
  21943. * $6 = <undefined>
  21944. * $7 = <undefined>
  21945. * $8 = #Related
  21946. * $9 = Related
  21947. * </pre>
  21948. * where <undefined> indicates that the component is not present, as is the
  21949. * case for the query component in the above example. Therefore, we can
  21950. * determine the value of the five components as
  21951. * <pre>
  21952. * scheme = $2
  21953. * authority = $4
  21954. * path = $5
  21955. * query = $7
  21956. * fragment = $9
  21957. * </pre>
  21958. *
  21959. * The regular expression has been modified slightly to expose the
  21960. * userInfo, domain, and port separately from the authority.
  21961. * The modified version yields
  21962. * <pre>
  21963. * $1 = http scheme
  21964. * $2 = <undefined> userInfo -\
  21965. * $3 = www.ics.uci.edu domain | authority
  21966. * $4 = <undefined> port -/
  21967. * $5 = /pub/ietf/uri/ path
  21968. * $6 = <undefined> query without ?
  21969. * $7 = Related fragment without #
  21970. * </pre>
  21971. * @type {!RegExp}
  21972. * @internal
  21973. */
  21974. var _splitRe = lang_1.RegExpWrapper.create('^' +
  21975. '(?:' +
  21976. '([^:/?#.]+)' +
  21977. // used by other URL parts such as :,
  21978. // ?, /, #, and .
  21979. ':)?' +
  21980. '(?://' +
  21981. '(?:([^/?#]*)@)?' +
  21982. '([\\w\\d\\-\\u0100-\\uffff.%]*)' +
  21983. // digits, dashes, dots, percent
  21984. // escapes, and unicode characters.
  21985. '(?::([0-9]+))?' +
  21986. ')?' +
  21987. '([^?#]+)?' +
  21988. '(?:\\?([^#]*))?' +
  21989. '(?:#(.*))?' +
  21990. '$');
  21991. /**
  21992. * The index of each URI component in the return value of goog.uri.utils.split.
  21993. * @enum {number}
  21994. */
  21995. var _ComponentIndex;
  21996. (function (_ComponentIndex) {
  21997. _ComponentIndex[_ComponentIndex["Scheme"] = 1] = "Scheme";
  21998. _ComponentIndex[_ComponentIndex["UserInfo"] = 2] = "UserInfo";
  21999. _ComponentIndex[_ComponentIndex["Domain"] = 3] = "Domain";
  22000. _ComponentIndex[_ComponentIndex["Port"] = 4] = "Port";
  22001. _ComponentIndex[_ComponentIndex["Path"] = 5] = "Path";
  22002. _ComponentIndex[_ComponentIndex["QueryData"] = 6] = "QueryData";
  22003. _ComponentIndex[_ComponentIndex["Fragment"] = 7] = "Fragment";
  22004. })(_ComponentIndex || (_ComponentIndex = {}));
  22005. /**
  22006. * Splits a URI into its component parts.
  22007. *
  22008. * Each component can be accessed via the component indices; for example:
  22009. * <pre>
  22010. * goog.uri.utils.split(someStr)[goog.uri.utils.CompontentIndex.QUERY_DATA];
  22011. * </pre>
  22012. *
  22013. * @param {string} uri The URI string to examine.
  22014. * @return {!Array.<string|undefined>} Each component still URI-encoded.
  22015. * Each component that is present will contain the encoded value, whereas
  22016. * components that are not present will be undefined or empty, depending
  22017. * on the browser's regular expression implementation. Never null, since
  22018. * arbitrary strings may still look like path names.
  22019. */
  22020. function _split(uri) {
  22021. return lang_1.RegExpWrapper.firstMatch(_splitRe, uri);
  22022. }
  22023. /**
  22024. * Removes dot segments in given path component, as described in
  22025. * RFC 3986, section 5.2.4.
  22026. *
  22027. * @param {string} path A non-empty path component.
  22028. * @return {string} Path component with removed dot segments.
  22029. */
  22030. function _removeDotSegments(path) {
  22031. if (path == '/')
  22032. return '/';
  22033. var leadingSlash = path[0] == '/' ? '/' : '';
  22034. var trailingSlash = path[path.length - 1] === '/' ? '/' : '';
  22035. var segments = path.split('/');
  22036. var out = [];
  22037. var up = 0;
  22038. for (var pos = 0; pos < segments.length; pos++) {
  22039. var segment = segments[pos];
  22040. switch (segment) {
  22041. case '':
  22042. case '.':
  22043. break;
  22044. case '..':
  22045. if (out.length > 0) {
  22046. out.pop();
  22047. }
  22048. else {
  22049. up++;
  22050. }
  22051. break;
  22052. default:
  22053. out.push(segment);
  22054. }
  22055. }
  22056. if (leadingSlash == '') {
  22057. while (up-- > 0) {
  22058. out.unshift('..');
  22059. }
  22060. if (out.length === 0)
  22061. out.push('.');
  22062. }
  22063. return leadingSlash + out.join('/') + trailingSlash;
  22064. }
  22065. /**
  22066. * Takes an array of the parts from split and canonicalizes the path part
  22067. * and then joins all the parts.
  22068. * @param {Array.<string?>} parts
  22069. * @return {string}
  22070. */
  22071. function _joinAndCanonicalizePath(parts) {
  22072. var path = parts[_ComponentIndex.Path];
  22073. path = lang_1.isBlank(path) ? '' : _removeDotSegments(path);
  22074. parts[_ComponentIndex.Path] = path;
  22075. return _buildFromEncodedParts(parts[_ComponentIndex.Scheme], parts[_ComponentIndex.UserInfo], parts[_ComponentIndex.Domain], parts[_ComponentIndex.Port], path, parts[_ComponentIndex.QueryData], parts[_ComponentIndex.Fragment]);
  22076. }
  22077. /**
  22078. * Resolves a URL.
  22079. * @param {string} base The URL acting as the base URL.
  22080. * @param {string} to The URL to resolve.
  22081. * @return {string}
  22082. */
  22083. function _resolveUrl(base, url) {
  22084. var parts = _split(encodeURI(url));
  22085. var baseParts = _split(base);
  22086. if (lang_1.isPresent(parts[_ComponentIndex.Scheme])) {
  22087. return _joinAndCanonicalizePath(parts);
  22088. }
  22089. else {
  22090. parts[_ComponentIndex.Scheme] = baseParts[_ComponentIndex.Scheme];
  22091. }
  22092. for (var i = _ComponentIndex.Scheme; i <= _ComponentIndex.Port; i++) {
  22093. if (lang_1.isBlank(parts[i])) {
  22094. parts[i] = baseParts[i];
  22095. }
  22096. }
  22097. if (parts[_ComponentIndex.Path][0] == '/') {
  22098. return _joinAndCanonicalizePath(parts);
  22099. }
  22100. var path = baseParts[_ComponentIndex.Path];
  22101. if (lang_1.isBlank(path))
  22102. path = '/';
  22103. var index = path.lastIndexOf('/');
  22104. path = path.substring(0, index + 1) + parts[_ComponentIndex.Path];
  22105. parts[_ComponentIndex.Path] = path;
  22106. return _joinAndCanonicalizePath(parts);
  22107. }
  22108. /***/ },
  22109. /* 149 */
  22110. /***/ function(module, exports) {
  22111. // TODO: vsavkin rename it into TemplateLoader
  22112. /**
  22113. * An interface for retrieving documents by URL that the compiler uses
  22114. * to load templates.
  22115. */
  22116. var XHR = (function () {
  22117. function XHR() {
  22118. }
  22119. XHR.prototype.get = function (url) { return null; };
  22120. return XHR;
  22121. })();
  22122. exports.XHR = XHR;
  22123. /***/ },
  22124. /* 150 */
  22125. /***/ function(module, exports, __webpack_require__) {
  22126. function __export(m) {
  22127. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  22128. }
  22129. var runtime_compiler_1 = __webpack_require__(151);
  22130. var template_compiler_1 = __webpack_require__(152);
  22131. exports.TemplateCompiler = template_compiler_1.TemplateCompiler;
  22132. var directive_metadata_1 = __webpack_require__(153);
  22133. exports.CompileDirectiveMetadata = directive_metadata_1.CompileDirectiveMetadata;
  22134. exports.CompileTypeMetadata = directive_metadata_1.CompileTypeMetadata;
  22135. exports.CompileTemplateMetadata = directive_metadata_1.CompileTemplateMetadata;
  22136. var source_module_1 = __webpack_require__(156);
  22137. exports.SourceModule = source_module_1.SourceModule;
  22138. exports.SourceWithImports = source_module_1.SourceWithImports;
  22139. var platform_directives_and_pipes_1 = __webpack_require__(95);
  22140. exports.PLATFORM_DIRECTIVES = platform_directives_and_pipes_1.PLATFORM_DIRECTIVES;
  22141. exports.PLATFORM_PIPES = platform_directives_and_pipes_1.PLATFORM_PIPES;
  22142. __export(__webpack_require__(159));
  22143. var template_parser_1 = __webpack_require__(167);
  22144. exports.TEMPLATE_TRANSFORMS = template_parser_1.TEMPLATE_TRANSFORMS;
  22145. var lang_1 = __webpack_require__(5);
  22146. var di_1 = __webpack_require__(6);
  22147. var template_parser_2 = __webpack_require__(167);
  22148. var html_parser_1 = __webpack_require__(168);
  22149. var template_normalizer_1 = __webpack_require__(175);
  22150. var runtime_metadata_1 = __webpack_require__(176);
  22151. var change_detector_compiler_1 = __webpack_require__(157);
  22152. var style_compiler_1 = __webpack_require__(161);
  22153. var command_compiler_1 = __webpack_require__(166);
  22154. var template_compiler_2 = __webpack_require__(152);
  22155. var change_detection_1 = __webpack_require__(25);
  22156. var compiler_1 = __webpack_require__(70);
  22157. var runtime_compiler_2 = __webpack_require__(151);
  22158. var element_schema_registry_1 = __webpack_require__(173);
  22159. var dom_element_schema_registry_1 = __webpack_require__(177);
  22160. var url_resolver_1 = __webpack_require__(148);
  22161. var change_detection_2 = __webpack_require__(25);
  22162. function _createChangeDetectorGenConfig() {
  22163. return new change_detection_1.ChangeDetectorGenConfig(lang_1.assertionsEnabled(), false, true);
  22164. }
  22165. /**
  22166. * A set of providers that provide `RuntimeCompiler` and its dependencies to use for
  22167. * template compilation.
  22168. */
  22169. exports.COMPILER_PROVIDERS = lang_1.CONST_EXPR([
  22170. change_detection_2.Lexer,
  22171. change_detection_2.Parser,
  22172. html_parser_1.HtmlParser,
  22173. template_parser_2.TemplateParser,
  22174. template_normalizer_1.TemplateNormalizer,
  22175. runtime_metadata_1.RuntimeMetadataResolver,
  22176. url_resolver_1.DEFAULT_PACKAGE_URL_PROVIDER,
  22177. style_compiler_1.StyleCompiler,
  22178. command_compiler_1.CommandCompiler,
  22179. change_detector_compiler_1.ChangeDetectionCompiler,
  22180. new di_1.Provider(change_detection_1.ChangeDetectorGenConfig, { useFactory: _createChangeDetectorGenConfig, deps: [] }),
  22181. template_compiler_2.TemplateCompiler,
  22182. new di_1.Provider(runtime_compiler_2.RuntimeCompiler, { useClass: runtime_compiler_1.RuntimeCompiler_ }),
  22183. new di_1.Provider(compiler_1.Compiler, { useExisting: runtime_compiler_2.RuntimeCompiler }),
  22184. dom_element_schema_registry_1.DomElementSchemaRegistry,
  22185. new di_1.Provider(element_schema_registry_1.ElementSchemaRegistry, { useExisting: dom_element_schema_registry_1.DomElementSchemaRegistry }),
  22186. url_resolver_1.UrlResolver
  22187. ]);
  22188. /***/ },
  22189. /* 151 */
  22190. /***/ function(module, exports, __webpack_require__) {
  22191. var __extends = (this && this.__extends) || function (d, b) {
  22192. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  22193. function __() { this.constructor = d; }
  22194. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  22195. };
  22196. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  22197. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  22198. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  22199. 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;
  22200. return c > 3 && r && Object.defineProperty(target, key, r), r;
  22201. };
  22202. var __metadata = (this && this.__metadata) || function (k, v) {
  22203. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  22204. };
  22205. var compiler_1 = __webpack_require__(70);
  22206. var proto_view_factory_1 = __webpack_require__(71);
  22207. var template_compiler_1 = __webpack_require__(152);
  22208. var di_1 = __webpack_require__(6);
  22209. var RuntimeCompiler = (function (_super) {
  22210. __extends(RuntimeCompiler, _super);
  22211. function RuntimeCompiler() {
  22212. _super.apply(this, arguments);
  22213. }
  22214. return RuntimeCompiler;
  22215. })(compiler_1.Compiler);
  22216. exports.RuntimeCompiler = RuntimeCompiler;
  22217. var RuntimeCompiler_ = (function (_super) {
  22218. __extends(RuntimeCompiler_, _super);
  22219. function RuntimeCompiler_(_protoViewFactory, _templateCompiler) {
  22220. _super.call(this, _protoViewFactory);
  22221. this._templateCompiler = _templateCompiler;
  22222. }
  22223. RuntimeCompiler_.prototype.compileInHost = function (componentType) {
  22224. var _this = this;
  22225. return this._templateCompiler.compileHostComponentRuntime(componentType)
  22226. .then(function (compiledHostTemplate) { return compiler_1.internalCreateProtoView(_this, compiledHostTemplate); });
  22227. };
  22228. RuntimeCompiler_.prototype.clearCache = function () {
  22229. _super.prototype.clearCache.call(this);
  22230. this._templateCompiler.clearCache();
  22231. };
  22232. RuntimeCompiler_ = __decorate([
  22233. di_1.Injectable(),
  22234. __metadata('design:paramtypes', [proto_view_factory_1.ProtoViewFactory, template_compiler_1.TemplateCompiler])
  22235. ], RuntimeCompiler_);
  22236. return RuntimeCompiler_;
  22237. })(compiler_1.Compiler_);
  22238. exports.RuntimeCompiler_ = RuntimeCompiler_;
  22239. /***/ },
  22240. /* 152 */
  22241. /***/ function(module, exports, __webpack_require__) {
  22242. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  22243. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  22244. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  22245. 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;
  22246. return c > 3 && r && Object.defineProperty(target, key, r), r;
  22247. };
  22248. var __metadata = (this && this.__metadata) || function (k, v) {
  22249. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  22250. };
  22251. var lang_1 = __webpack_require__(5);
  22252. var exceptions_1 = __webpack_require__(14);
  22253. var collection_1 = __webpack_require__(12);
  22254. var async_1 = __webpack_require__(60);
  22255. var template_commands_1 = __webpack_require__(96);
  22256. var directive_metadata_1 = __webpack_require__(153);
  22257. var di_1 = __webpack_require__(6);
  22258. var source_module_1 = __webpack_require__(156);
  22259. var change_detector_compiler_1 = __webpack_require__(157);
  22260. var style_compiler_1 = __webpack_require__(161);
  22261. var command_compiler_1 = __webpack_require__(166);
  22262. var template_parser_1 = __webpack_require__(167);
  22263. var template_normalizer_1 = __webpack_require__(175);
  22264. var runtime_metadata_1 = __webpack_require__(176);
  22265. var command_compiler_2 = __webpack_require__(166);
  22266. var util_1 = __webpack_require__(155);
  22267. /**
  22268. * An internal module of the Angular compiler that begins with component types,
  22269. * extracts templates, and eventually produces a compiled version of the component
  22270. * ready for linking into an application.
  22271. */
  22272. var TemplateCompiler = (function () {
  22273. function TemplateCompiler(_runtimeMetadataResolver, _templateNormalizer, _templateParser, _styleCompiler, _commandCompiler, _cdCompiler) {
  22274. this._runtimeMetadataResolver = _runtimeMetadataResolver;
  22275. this._templateNormalizer = _templateNormalizer;
  22276. this._templateParser = _templateParser;
  22277. this._styleCompiler = _styleCompiler;
  22278. this._commandCompiler = _commandCompiler;
  22279. this._cdCompiler = _cdCompiler;
  22280. this._hostCacheKeys = new Map();
  22281. this._compiledTemplateCache = new Map();
  22282. this._compiledTemplateDone = new Map();
  22283. this._nextTemplateId = 0;
  22284. }
  22285. TemplateCompiler.prototype.normalizeDirectiveMetadata = function (directive) {
  22286. if (!directive.isComponent) {
  22287. // For non components there is nothing to be normalized yet.
  22288. return async_1.PromiseWrapper.resolve(directive);
  22289. }
  22290. return this._templateNormalizer.normalizeTemplate(directive.type, directive.template)
  22291. .then(function (normalizedTemplate) { return new directive_metadata_1.CompileDirectiveMetadata({
  22292. type: directive.type,
  22293. isComponent: directive.isComponent,
  22294. dynamicLoadable: directive.dynamicLoadable,
  22295. selector: directive.selector,
  22296. exportAs: directive.exportAs,
  22297. changeDetection: directive.changeDetection,
  22298. inputs: directive.inputs,
  22299. outputs: directive.outputs,
  22300. hostListeners: directive.hostListeners,
  22301. hostProperties: directive.hostProperties,
  22302. hostAttributes: directive.hostAttributes,
  22303. lifecycleHooks: directive.lifecycleHooks,
  22304. template: normalizedTemplate
  22305. }); });
  22306. };
  22307. TemplateCompiler.prototype.compileHostComponentRuntime = function (type) {
  22308. var hostCacheKey = this._hostCacheKeys.get(type);
  22309. if (lang_1.isBlank(hostCacheKey)) {
  22310. hostCacheKey = new Object();
  22311. this._hostCacheKeys.set(type, hostCacheKey);
  22312. var compMeta = this._runtimeMetadataResolver.getMetadata(type);
  22313. assertComponent(compMeta);
  22314. var hostMeta = directive_metadata_1.createHostComponentMeta(compMeta.type, compMeta.selector);
  22315. this._compileComponentRuntime(hostCacheKey, hostMeta, [compMeta], new Set());
  22316. }
  22317. return this._compiledTemplateDone.get(hostCacheKey)
  22318. .then(function (compiledTemplate) { return new template_commands_1.CompiledHostTemplate(compiledTemplate); });
  22319. };
  22320. TemplateCompiler.prototype.clearCache = function () {
  22321. this._hostCacheKeys.clear();
  22322. this._styleCompiler.clearCache();
  22323. this._compiledTemplateCache.clear();
  22324. this._compiledTemplateDone.clear();
  22325. };
  22326. TemplateCompiler.prototype._compileComponentRuntime = function (cacheKey, compMeta, viewDirectives, compilingComponentCacheKeys) {
  22327. var _this = this;
  22328. var uniqViewDirectives = removeDuplicates(viewDirectives);
  22329. var compiledTemplate = this._compiledTemplateCache.get(cacheKey);
  22330. var done = this._compiledTemplateDone.get(cacheKey);
  22331. if (lang_1.isBlank(compiledTemplate)) {
  22332. var styles = [];
  22333. var changeDetectorFactory;
  22334. var commands = [];
  22335. var templateId = lang_1.stringify(compMeta.type.runtime) + "Template" + this._nextTemplateId++;
  22336. compiledTemplate = new template_commands_1.CompiledComponentTemplate(templateId, function (dispatcher) { return changeDetectorFactory(dispatcher); }, commands, styles);
  22337. this._compiledTemplateCache.set(cacheKey, compiledTemplate);
  22338. compilingComponentCacheKeys.add(cacheKey);
  22339. done = async_1.PromiseWrapper
  22340. .all([this._styleCompiler.compileComponentRuntime(compMeta.template)].concat(uniqViewDirectives.map(function (dirMeta) { return _this.normalizeDirectiveMetadata(dirMeta); })))
  22341. .then(function (stylesAndNormalizedViewDirMetas) {
  22342. var childPromises = [];
  22343. var normalizedViewDirMetas = stylesAndNormalizedViewDirMetas.slice(1);
  22344. var parsedTemplate = _this._templateParser.parse(compMeta.template.template, normalizedViewDirMetas, compMeta.type.name);
  22345. var changeDetectorFactories = _this._cdCompiler.compileComponentRuntime(compMeta.type, compMeta.changeDetection, parsedTemplate);
  22346. changeDetectorFactory = changeDetectorFactories[0];
  22347. var tmpStyles = stylesAndNormalizedViewDirMetas[0];
  22348. tmpStyles.forEach(function (style) { return styles.push(style); });
  22349. var tmpCommands = _this._compileCommandsRuntime(compMeta, parsedTemplate, changeDetectorFactories, compilingComponentCacheKeys, childPromises);
  22350. tmpCommands.forEach(function (cmd) { return commands.push(cmd); });
  22351. return async_1.PromiseWrapper.all(childPromises);
  22352. })
  22353. .then(function (_) {
  22354. collection_1.SetWrapper.delete(compilingComponentCacheKeys, cacheKey);
  22355. return compiledTemplate;
  22356. });
  22357. this._compiledTemplateDone.set(cacheKey, done);
  22358. }
  22359. return compiledTemplate;
  22360. };
  22361. TemplateCompiler.prototype._compileCommandsRuntime = function (compMeta, parsedTemplate, changeDetectorFactories, compilingComponentCacheKeys, childPromises) {
  22362. var _this = this;
  22363. var cmds = this._commandCompiler.compileComponentRuntime(compMeta, parsedTemplate, changeDetectorFactories, function (childComponentDir) {
  22364. var childCacheKey = childComponentDir.type.runtime;
  22365. var childViewDirectives = _this._runtimeMetadataResolver.getViewDirectivesMetadata(childComponentDir.type.runtime);
  22366. var childIsRecursive = collection_1.SetWrapper.has(compilingComponentCacheKeys, childCacheKey);
  22367. var childTemplate = _this._compileComponentRuntime(childCacheKey, childComponentDir, childViewDirectives, compilingComponentCacheKeys);
  22368. if (!childIsRecursive) {
  22369. // Only wait for a child if it is not a cycle
  22370. childPromises.push(_this._compiledTemplateDone.get(childCacheKey));
  22371. }
  22372. return function () { return childTemplate; };
  22373. });
  22374. cmds.forEach(function (cmd) {
  22375. if (cmd instanceof template_commands_1.BeginComponentCmd) {
  22376. cmd.templateGetter();
  22377. }
  22378. });
  22379. return cmds;
  22380. };
  22381. TemplateCompiler.prototype.compileTemplatesCodeGen = function (components) {
  22382. var _this = this;
  22383. if (components.length === 0) {
  22384. throw new exceptions_1.BaseException('No components given');
  22385. }
  22386. var declarations = [];
  22387. var templateArguments = [];
  22388. var componentMetas = [];
  22389. components.forEach(function (componentWithDirs) {
  22390. var compMeta = componentWithDirs.component;
  22391. assertComponent(compMeta);
  22392. componentMetas.push(compMeta);
  22393. _this._processTemplateCodeGen(compMeta, componentWithDirs.directives, declarations, templateArguments);
  22394. if (compMeta.dynamicLoadable) {
  22395. var hostMeta = directive_metadata_1.createHostComponentMeta(compMeta.type, compMeta.selector);
  22396. componentMetas.push(hostMeta);
  22397. _this._processTemplateCodeGen(hostMeta, [compMeta], declarations, templateArguments);
  22398. }
  22399. });
  22400. collection_1.ListWrapper.forEachWithIndex(componentMetas, function (compMeta, index) {
  22401. var templateId = compMeta.type.moduleUrl + "|" + compMeta.type.name;
  22402. var constructionKeyword = lang_1.IS_DART ? 'const' : 'new';
  22403. var compiledTemplateExpr = constructionKeyword + " " + command_compiler_2.TEMPLATE_COMMANDS_MODULE_REF + "CompiledComponentTemplate('" + templateId + "'," + templateArguments[index].join(',') + ")";
  22404. var variableValueExpr;
  22405. if (compMeta.type.isHost) {
  22406. variableValueExpr =
  22407. constructionKeyword + " " + command_compiler_2.TEMPLATE_COMMANDS_MODULE_REF + "CompiledHostTemplate(" + compiledTemplateExpr + ")";
  22408. }
  22409. else {
  22410. variableValueExpr = compiledTemplateExpr;
  22411. }
  22412. var varName = templateVariableName(compMeta.type);
  22413. declarations.push("" + util_1.codeGenExportVariable(varName) + variableValueExpr + ";");
  22414. declarations.push(util_1.codeGenValueFn([], varName, templateGetterName(compMeta.type)) + ";");
  22415. });
  22416. var moduleUrl = components[0].component.type.moduleUrl;
  22417. return new source_module_1.SourceModule("" + templateModuleUrl(moduleUrl), declarations.join('\n'));
  22418. };
  22419. TemplateCompiler.prototype.compileStylesheetCodeGen = function (stylesheetUrl, cssText) {
  22420. return this._styleCompiler.compileStylesheetCodeGen(stylesheetUrl, cssText);
  22421. };
  22422. TemplateCompiler.prototype._processTemplateCodeGen = function (compMeta, directives, targetDeclarations, targetTemplateArguments) {
  22423. var uniqueDirectives = removeDuplicates(directives);
  22424. var styleExpr = this._styleCompiler.compileComponentCodeGen(compMeta.template);
  22425. var parsedTemplate = this._templateParser.parse(compMeta.template.template, uniqueDirectives, compMeta.type.name);
  22426. var changeDetectorsExprs = this._cdCompiler.compileComponentCodeGen(compMeta.type, compMeta.changeDetection, parsedTemplate);
  22427. var commandsExpr = this._commandCompiler.compileComponentCodeGen(compMeta, parsedTemplate, changeDetectorsExprs.expressions, codeGenComponentTemplateFactory);
  22428. addAll(styleExpr.declarations, targetDeclarations);
  22429. addAll(changeDetectorsExprs.declarations, targetDeclarations);
  22430. addAll(commandsExpr.declarations, targetDeclarations);
  22431. targetTemplateArguments.push([changeDetectorsExprs.expressions[0], commandsExpr.expression, styleExpr.expression]);
  22432. };
  22433. TemplateCompiler = __decorate([
  22434. di_1.Injectable(),
  22435. __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])
  22436. ], TemplateCompiler);
  22437. return TemplateCompiler;
  22438. })();
  22439. exports.TemplateCompiler = TemplateCompiler;
  22440. var NormalizedComponentWithViewDirectives = (function () {
  22441. function NormalizedComponentWithViewDirectives(component, directives) {
  22442. this.component = component;
  22443. this.directives = directives;
  22444. }
  22445. return NormalizedComponentWithViewDirectives;
  22446. })();
  22447. exports.NormalizedComponentWithViewDirectives = NormalizedComponentWithViewDirectives;
  22448. function assertComponent(meta) {
  22449. if (!meta.isComponent) {
  22450. throw new exceptions_1.BaseException("Could not compile '" + meta.type.name + "' because it is not a component.");
  22451. }
  22452. }
  22453. function templateVariableName(type) {
  22454. return type.name + "Template";
  22455. }
  22456. function templateGetterName(type) {
  22457. return templateVariableName(type) + "Getter";
  22458. }
  22459. function templateModuleUrl(moduleUrl) {
  22460. var urlWithoutSuffix = moduleUrl.substring(0, moduleUrl.length - util_1.MODULE_SUFFIX.length);
  22461. return urlWithoutSuffix + ".template" + util_1.MODULE_SUFFIX;
  22462. }
  22463. function addAll(source, target) {
  22464. for (var i = 0; i < source.length; i++) {
  22465. target.push(source[i]);
  22466. }
  22467. }
  22468. function codeGenComponentTemplateFactory(nestedCompType) {
  22469. return "" + source_module_1.moduleRef(templateModuleUrl(nestedCompType.type.moduleUrl)) + templateGetterName(nestedCompType.type);
  22470. }
  22471. function removeDuplicates(items) {
  22472. var res = [];
  22473. items.forEach(function (item) {
  22474. var hasMatch = res.filter(function (r) { return r.type.name == item.type.name && r.type.moduleUrl == item.type.moduleUrl &&
  22475. r.type.runtime == item.type.runtime; })
  22476. .length > 0;
  22477. if (!hasMatch) {
  22478. res.push(item);
  22479. }
  22480. });
  22481. return res;
  22482. }
  22483. /***/ },
  22484. /* 153 */
  22485. /***/ function(module, exports, __webpack_require__) {
  22486. var lang_1 = __webpack_require__(5);
  22487. var collection_1 = __webpack_require__(12);
  22488. var change_detection_1 = __webpack_require__(25);
  22489. var view_1 = __webpack_require__(56);
  22490. var selector_1 = __webpack_require__(154);
  22491. var util_1 = __webpack_require__(155);
  22492. var interfaces_1 = __webpack_require__(89);
  22493. // group 1: "property" from "[property]"
  22494. // group 2: "event" from "(event)"
  22495. var HOST_REG_EXP = /^(?:(?:\[([^\]]+)\])|(?:\(([^\)]+)\)))$/g;
  22496. /**
  22497. * Metadata regarding compilation of a type.
  22498. */
  22499. var CompileTypeMetadata = (function () {
  22500. function CompileTypeMetadata(_a) {
  22501. var _b = _a === void 0 ? {} : _a, runtime = _b.runtime, name = _b.name, moduleUrl = _b.moduleUrl, isHost = _b.isHost;
  22502. this.runtime = runtime;
  22503. this.name = name;
  22504. this.moduleUrl = moduleUrl;
  22505. this.isHost = lang_1.normalizeBool(isHost);
  22506. }
  22507. CompileTypeMetadata.fromJson = function (data) {
  22508. return new CompileTypeMetadata({ name: data['name'], moduleUrl: data['moduleUrl'], isHost: data['isHost'] });
  22509. };
  22510. CompileTypeMetadata.prototype.toJson = function () {
  22511. return {
  22512. // Note: Runtime type can't be serialized...
  22513. 'name': this.name,
  22514. 'moduleUrl': this.moduleUrl,
  22515. 'isHost': this.isHost
  22516. };
  22517. };
  22518. return CompileTypeMetadata;
  22519. })();
  22520. exports.CompileTypeMetadata = CompileTypeMetadata;
  22521. /**
  22522. * Metadata regarding compilation of a template.
  22523. */
  22524. var CompileTemplateMetadata = (function () {
  22525. function CompileTemplateMetadata(_a) {
  22526. var _b = _a === void 0 ? {} : _a, encapsulation = _b.encapsulation, template = _b.template, templateUrl = _b.templateUrl, styles = _b.styles, styleUrls = _b.styleUrls, ngContentSelectors = _b.ngContentSelectors;
  22527. this.encapsulation = lang_1.isPresent(encapsulation) ? encapsulation : view_1.ViewEncapsulation.Emulated;
  22528. this.template = template;
  22529. this.templateUrl = templateUrl;
  22530. this.styles = lang_1.isPresent(styles) ? styles : [];
  22531. this.styleUrls = lang_1.isPresent(styleUrls) ? styleUrls : [];
  22532. this.ngContentSelectors = lang_1.isPresent(ngContentSelectors) ? ngContentSelectors : [];
  22533. }
  22534. CompileTemplateMetadata.fromJson = function (data) {
  22535. return new CompileTemplateMetadata({
  22536. encapsulation: lang_1.isPresent(data['encapsulation']) ?
  22537. view_1.VIEW_ENCAPSULATION_VALUES[data['encapsulation']] :
  22538. data['encapsulation'],
  22539. template: data['template'],
  22540. templateUrl: data['templateUrl'],
  22541. styles: data['styles'],
  22542. styleUrls: data['styleUrls'],
  22543. ngContentSelectors: data['ngContentSelectors']
  22544. });
  22545. };
  22546. CompileTemplateMetadata.prototype.toJson = function () {
  22547. return {
  22548. 'encapsulation': lang_1.isPresent(this.encapsulation) ? lang_1.serializeEnum(this.encapsulation) : this.encapsulation,
  22549. 'template': this.template,
  22550. 'templateUrl': this.templateUrl,
  22551. 'styles': this.styles,
  22552. 'styleUrls': this.styleUrls,
  22553. 'ngContentSelectors': this.ngContentSelectors
  22554. };
  22555. };
  22556. return CompileTemplateMetadata;
  22557. })();
  22558. exports.CompileTemplateMetadata = CompileTemplateMetadata;
  22559. /**
  22560. * Metadata regarding compilation of a directive.
  22561. */
  22562. var CompileDirectiveMetadata = (function () {
  22563. function CompileDirectiveMetadata(_a) {
  22564. 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;
  22565. this.type = type;
  22566. this.isComponent = isComponent;
  22567. this.dynamicLoadable = dynamicLoadable;
  22568. this.selector = selector;
  22569. this.exportAs = exportAs;
  22570. this.changeDetection = changeDetection;
  22571. this.inputs = inputs;
  22572. this.outputs = outputs;
  22573. this.hostListeners = hostListeners;
  22574. this.hostProperties = hostProperties;
  22575. this.hostAttributes = hostAttributes;
  22576. this.lifecycleHooks = lifecycleHooks;
  22577. this.template = template;
  22578. }
  22579. CompileDirectiveMetadata.create = function (_a) {
  22580. 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;
  22581. var hostListeners = {};
  22582. var hostProperties = {};
  22583. var hostAttributes = {};
  22584. if (lang_1.isPresent(host)) {
  22585. collection_1.StringMapWrapper.forEach(host, function (value, key) {
  22586. var matches = lang_1.RegExpWrapper.firstMatch(HOST_REG_EXP, key);
  22587. if (lang_1.isBlank(matches)) {
  22588. hostAttributes[key] = value;
  22589. }
  22590. else if (lang_1.isPresent(matches[1])) {
  22591. hostProperties[matches[1]] = value;
  22592. }
  22593. else if (lang_1.isPresent(matches[2])) {
  22594. hostListeners[matches[2]] = value;
  22595. }
  22596. });
  22597. }
  22598. var inputsMap = {};
  22599. if (lang_1.isPresent(inputs)) {
  22600. inputs.forEach(function (bindConfig) {
  22601. // canonical syntax: `dirProp: elProp`
  22602. // if there is no `:`, use dirProp = elProp
  22603. var parts = util_1.splitAtColon(bindConfig, [bindConfig, bindConfig]);
  22604. inputsMap[parts[0]] = parts[1];
  22605. });
  22606. }
  22607. var outputsMap = {};
  22608. if (lang_1.isPresent(outputs)) {
  22609. outputs.forEach(function (bindConfig) {
  22610. // canonical syntax: `dirProp: elProp`
  22611. // if there is no `:`, use dirProp = elProp
  22612. var parts = util_1.splitAtColon(bindConfig, [bindConfig, bindConfig]);
  22613. outputsMap[parts[0]] = parts[1];
  22614. });
  22615. }
  22616. return new CompileDirectiveMetadata({
  22617. type: type,
  22618. isComponent: lang_1.normalizeBool(isComponent),
  22619. dynamicLoadable: lang_1.normalizeBool(dynamicLoadable),
  22620. selector: selector,
  22621. exportAs: exportAs,
  22622. changeDetection: changeDetection,
  22623. inputs: inputsMap,
  22624. outputs: outputsMap,
  22625. hostListeners: hostListeners,
  22626. hostProperties: hostProperties,
  22627. hostAttributes: hostAttributes,
  22628. lifecycleHooks: lang_1.isPresent(lifecycleHooks) ? lifecycleHooks : [],
  22629. template: template
  22630. });
  22631. };
  22632. CompileDirectiveMetadata.fromJson = function (data) {
  22633. return new CompileDirectiveMetadata({
  22634. isComponent: data['isComponent'],
  22635. dynamicLoadable: data['dynamicLoadable'],
  22636. selector: data['selector'],
  22637. exportAs: data['exportAs'],
  22638. type: lang_1.isPresent(data['type']) ? CompileTypeMetadata.fromJson(data['type']) : data['type'],
  22639. changeDetection: lang_1.isPresent(data['changeDetection']) ?
  22640. change_detection_1.CHANGE_DETECTION_STRATEGY_VALUES[data['changeDetection']] :
  22641. data['changeDetection'],
  22642. inputs: data['inputs'],
  22643. outputs: data['outputs'],
  22644. hostListeners: data['hostListeners'],
  22645. hostProperties: data['hostProperties'],
  22646. hostAttributes: data['hostAttributes'],
  22647. lifecycleHooks: data['lifecycleHooks'].map(function (hookValue) { return interfaces_1.LIFECYCLE_HOOKS_VALUES[hookValue]; }),
  22648. template: lang_1.isPresent(data['template']) ? CompileTemplateMetadata.fromJson(data['template']) :
  22649. data['template']
  22650. });
  22651. };
  22652. CompileDirectiveMetadata.prototype.toJson = function () {
  22653. return {
  22654. 'isComponent': this.isComponent,
  22655. 'dynamicLoadable': this.dynamicLoadable,
  22656. 'selector': this.selector,
  22657. 'exportAs': this.exportAs,
  22658. 'type': lang_1.isPresent(this.type) ? this.type.toJson() : this.type,
  22659. 'changeDetection': lang_1.isPresent(this.changeDetection) ? lang_1.serializeEnum(this.changeDetection) :
  22660. this.changeDetection,
  22661. 'inputs': this.inputs,
  22662. 'outputs': this.outputs,
  22663. 'hostListeners': this.hostListeners,
  22664. 'hostProperties': this.hostProperties,
  22665. 'hostAttributes': this.hostAttributes,
  22666. 'lifecycleHooks': this.lifecycleHooks.map(function (hook) { return lang_1.serializeEnum(hook); }),
  22667. 'template': lang_1.isPresent(this.template) ? this.template.toJson() : this.template
  22668. };
  22669. };
  22670. return CompileDirectiveMetadata;
  22671. })();
  22672. exports.CompileDirectiveMetadata = CompileDirectiveMetadata;
  22673. /**
  22674. * Construct {@link CompileDirectiveMetadata} from {@link ComponentTypeMetadata} and a selector.
  22675. */
  22676. function createHostComponentMeta(componentType, componentSelector) {
  22677. var template = selector_1.CssSelector.parse(componentSelector)[0].getMatchingElementTemplate();
  22678. return CompileDirectiveMetadata.create({
  22679. type: new CompileTypeMetadata({
  22680. runtime: Object,
  22681. name: "Host" + componentType.name,
  22682. moduleUrl: componentType.moduleUrl,
  22683. isHost: true
  22684. }),
  22685. template: new CompileTemplateMetadata({ template: template, templateUrl: '', styles: [], styleUrls: [], ngContentSelectors: [] }),
  22686. changeDetection: change_detection_1.ChangeDetectionStrategy.Default,
  22687. inputs: [],
  22688. outputs: [],
  22689. host: {},
  22690. lifecycleHooks: [],
  22691. isComponent: true,
  22692. dynamicLoadable: false,
  22693. selector: '*'
  22694. });
  22695. }
  22696. exports.createHostComponentMeta = createHostComponentMeta;
  22697. /***/ },
  22698. /* 154 */
  22699. /***/ function(module, exports, __webpack_require__) {
  22700. var collection_1 = __webpack_require__(12);
  22701. var lang_1 = __webpack_require__(5);
  22702. var exceptions_1 = __webpack_require__(14);
  22703. var _EMPTY_ATTR_VALUE = '';
  22704. // TODO: Can't use `const` here as
  22705. // in Dart this is not transpiled into `final` yet...
  22706. var _SELECTOR_REGEXP = lang_1.RegExpWrapper.create('(\\:not\\()|' +
  22707. '([-\\w]+)|' +
  22708. '(?:\\.([-\\w]+))|' +
  22709. '(?:\\[([-\\w*]+)(?:=([^\\]]*))?\\])|' +
  22710. '(\\))|' +
  22711. '(\\s*,\\s*)'); // ","
  22712. /**
  22713. * A css selector contains an element name,
  22714. * css classes and attribute/value pairs with the purpose
  22715. * of selecting subsets out of them.
  22716. */
  22717. var CssSelector = (function () {
  22718. function CssSelector() {
  22719. this.element = null;
  22720. this.classNames = [];
  22721. this.attrs = [];
  22722. this.notSelectors = [];
  22723. }
  22724. CssSelector.parse = function (selector) {
  22725. var results = [];
  22726. var _addResult = function (res, cssSel) {
  22727. if (cssSel.notSelectors.length > 0 && lang_1.isBlank(cssSel.element) &&
  22728. collection_1.ListWrapper.isEmpty(cssSel.classNames) && collection_1.ListWrapper.isEmpty(cssSel.attrs)) {
  22729. cssSel.element = "*";
  22730. }
  22731. res.push(cssSel);
  22732. };
  22733. var cssSelector = new CssSelector();
  22734. var matcher = lang_1.RegExpWrapper.matcher(_SELECTOR_REGEXP, selector);
  22735. var match;
  22736. var current = cssSelector;
  22737. var inNot = false;
  22738. while (lang_1.isPresent(match = lang_1.RegExpMatcherWrapper.next(matcher))) {
  22739. if (lang_1.isPresent(match[1])) {
  22740. if (inNot) {
  22741. throw new exceptions_1.BaseException('Nesting :not is not allowed in a selector');
  22742. }
  22743. inNot = true;
  22744. current = new CssSelector();
  22745. cssSelector.notSelectors.push(current);
  22746. }
  22747. if (lang_1.isPresent(match[2])) {
  22748. current.setElement(match[2]);
  22749. }
  22750. if (lang_1.isPresent(match[3])) {
  22751. current.addClassName(match[3]);
  22752. }
  22753. if (lang_1.isPresent(match[4])) {
  22754. current.addAttribute(match[4], match[5]);
  22755. }
  22756. if (lang_1.isPresent(match[6])) {
  22757. inNot = false;
  22758. current = cssSelector;
  22759. }
  22760. if (lang_1.isPresent(match[7])) {
  22761. if (inNot) {
  22762. throw new exceptions_1.BaseException('Multiple selectors in :not are not supported');
  22763. }
  22764. _addResult(results, cssSelector);
  22765. cssSelector = current = new CssSelector();
  22766. }
  22767. }
  22768. _addResult(results, cssSelector);
  22769. return results;
  22770. };
  22771. CssSelector.prototype.isElementSelector = function () {
  22772. return lang_1.isPresent(this.element) && collection_1.ListWrapper.isEmpty(this.classNames) &&
  22773. collection_1.ListWrapper.isEmpty(this.attrs) && this.notSelectors.length === 0;
  22774. };
  22775. CssSelector.prototype.setElement = function (element) {
  22776. if (element === void 0) { element = null; }
  22777. this.element = element;
  22778. };
  22779. /** Gets a template string for an element that matches the selector. */
  22780. CssSelector.prototype.getMatchingElementTemplate = function () {
  22781. var tagName = lang_1.isPresent(this.element) ? this.element : 'div';
  22782. var classAttr = this.classNames.length > 0 ? " class=\"" + this.classNames.join(' ') + "\"" : '';
  22783. var attrs = '';
  22784. for (var i = 0; i < this.attrs.length; i += 2) {
  22785. var attrName = this.attrs[i];
  22786. var attrValue = this.attrs[i + 1] !== '' ? "=\"" + this.attrs[i + 1] + "\"" : '';
  22787. attrs += " " + attrName + attrValue;
  22788. }
  22789. return "<" + tagName + classAttr + attrs + "></" + tagName + ">";
  22790. };
  22791. CssSelector.prototype.addAttribute = function (name, value) {
  22792. if (value === void 0) { value = _EMPTY_ATTR_VALUE; }
  22793. this.attrs.push(name);
  22794. if (lang_1.isPresent(value)) {
  22795. value = value.toLowerCase();
  22796. }
  22797. else {
  22798. value = _EMPTY_ATTR_VALUE;
  22799. }
  22800. this.attrs.push(value);
  22801. };
  22802. CssSelector.prototype.addClassName = function (name) { this.classNames.push(name.toLowerCase()); };
  22803. CssSelector.prototype.toString = function () {
  22804. var res = '';
  22805. if (lang_1.isPresent(this.element)) {
  22806. res += this.element;
  22807. }
  22808. if (lang_1.isPresent(this.classNames)) {
  22809. for (var i = 0; i < this.classNames.length; i++) {
  22810. res += '.' + this.classNames[i];
  22811. }
  22812. }
  22813. if (lang_1.isPresent(this.attrs)) {
  22814. for (var i = 0; i < this.attrs.length;) {
  22815. var attrName = this.attrs[i++];
  22816. var attrValue = this.attrs[i++];
  22817. res += '[' + attrName;
  22818. if (attrValue.length > 0) {
  22819. res += '=' + attrValue;
  22820. }
  22821. res += ']';
  22822. }
  22823. }
  22824. this.notSelectors.forEach(function (notSelector) { return res += ":not(" + notSelector + ")"; });
  22825. return res;
  22826. };
  22827. return CssSelector;
  22828. })();
  22829. exports.CssSelector = CssSelector;
  22830. /**
  22831. * Reads a list of CssSelectors and allows to calculate which ones
  22832. * are contained in a given CssSelector.
  22833. */
  22834. var SelectorMatcher = (function () {
  22835. function SelectorMatcher() {
  22836. this._elementMap = new collection_1.Map();
  22837. this._elementPartialMap = new collection_1.Map();
  22838. this._classMap = new collection_1.Map();
  22839. this._classPartialMap = new collection_1.Map();
  22840. this._attrValueMap = new collection_1.Map();
  22841. this._attrValuePartialMap = new collection_1.Map();
  22842. this._listContexts = [];
  22843. }
  22844. SelectorMatcher.createNotMatcher = function (notSelectors) {
  22845. var notMatcher = new SelectorMatcher();
  22846. notMatcher.addSelectables(notSelectors, null);
  22847. return notMatcher;
  22848. };
  22849. SelectorMatcher.prototype.addSelectables = function (cssSelectors, callbackCtxt) {
  22850. var listContext = null;
  22851. if (cssSelectors.length > 1) {
  22852. listContext = new SelectorListContext(cssSelectors);
  22853. this._listContexts.push(listContext);
  22854. }
  22855. for (var i = 0; i < cssSelectors.length; i++) {
  22856. this._addSelectable(cssSelectors[i], callbackCtxt, listContext);
  22857. }
  22858. };
  22859. /**
  22860. * Add an object that can be found later on by calling `match`.
  22861. * @param cssSelector A css selector
  22862. * @param callbackCtxt An opaque object that will be given to the callback of the `match` function
  22863. */
  22864. SelectorMatcher.prototype._addSelectable = function (cssSelector, callbackCtxt, listContext) {
  22865. var matcher = this;
  22866. var element = cssSelector.element;
  22867. var classNames = cssSelector.classNames;
  22868. var attrs = cssSelector.attrs;
  22869. var selectable = new SelectorContext(cssSelector, callbackCtxt, listContext);
  22870. if (lang_1.isPresent(element)) {
  22871. var isTerminal = attrs.length === 0 && classNames.length === 0;
  22872. if (isTerminal) {
  22873. this._addTerminal(matcher._elementMap, element, selectable);
  22874. }
  22875. else {
  22876. matcher = this._addPartial(matcher._elementPartialMap, element);
  22877. }
  22878. }
  22879. if (lang_1.isPresent(classNames)) {
  22880. for (var index = 0; index < classNames.length; index++) {
  22881. var isTerminal = attrs.length === 0 && index === classNames.length - 1;
  22882. var className = classNames[index];
  22883. if (isTerminal) {
  22884. this._addTerminal(matcher._classMap, className, selectable);
  22885. }
  22886. else {
  22887. matcher = this._addPartial(matcher._classPartialMap, className);
  22888. }
  22889. }
  22890. }
  22891. if (lang_1.isPresent(attrs)) {
  22892. for (var index = 0; index < attrs.length;) {
  22893. var isTerminal = index === attrs.length - 2;
  22894. var attrName = attrs[index++];
  22895. var attrValue = attrs[index++];
  22896. if (isTerminal) {
  22897. var terminalMap = matcher._attrValueMap;
  22898. var terminalValuesMap = terminalMap.get(attrName);
  22899. if (lang_1.isBlank(terminalValuesMap)) {
  22900. terminalValuesMap = new collection_1.Map();
  22901. terminalMap.set(attrName, terminalValuesMap);
  22902. }
  22903. this._addTerminal(terminalValuesMap, attrValue, selectable);
  22904. }
  22905. else {
  22906. var parttialMap = matcher._attrValuePartialMap;
  22907. var partialValuesMap = parttialMap.get(attrName);
  22908. if (lang_1.isBlank(partialValuesMap)) {
  22909. partialValuesMap = new collection_1.Map();
  22910. parttialMap.set(attrName, partialValuesMap);
  22911. }
  22912. matcher = this._addPartial(partialValuesMap, attrValue);
  22913. }
  22914. }
  22915. }
  22916. };
  22917. SelectorMatcher.prototype._addTerminal = function (map, name, selectable) {
  22918. var terminalList = map.get(name);
  22919. if (lang_1.isBlank(terminalList)) {
  22920. terminalList = [];
  22921. map.set(name, terminalList);
  22922. }
  22923. terminalList.push(selectable);
  22924. };
  22925. SelectorMatcher.prototype._addPartial = function (map, name) {
  22926. var matcher = map.get(name);
  22927. if (lang_1.isBlank(matcher)) {
  22928. matcher = new SelectorMatcher();
  22929. map.set(name, matcher);
  22930. }
  22931. return matcher;
  22932. };
  22933. /**
  22934. * Find the objects that have been added via `addSelectable`
  22935. * whose css selector is contained in the given css selector.
  22936. * @param cssSelector A css selector
  22937. * @param matchedCallback This callback will be called with the object handed into `addSelectable`
  22938. * @return boolean true if a match was found
  22939. */
  22940. SelectorMatcher.prototype.match = function (cssSelector, matchedCallback) {
  22941. var result = false;
  22942. var element = cssSelector.element;
  22943. var classNames = cssSelector.classNames;
  22944. var attrs = cssSelector.attrs;
  22945. for (var i = 0; i < this._listContexts.length; i++) {
  22946. this._listContexts[i].alreadyMatched = false;
  22947. }
  22948. result = this._matchTerminal(this._elementMap, element, cssSelector, matchedCallback) || result;
  22949. result = this._matchPartial(this._elementPartialMap, element, cssSelector, matchedCallback) ||
  22950. result;
  22951. if (lang_1.isPresent(classNames)) {
  22952. for (var index = 0; index < classNames.length; index++) {
  22953. var className = classNames[index];
  22954. result =
  22955. this._matchTerminal(this._classMap, className, cssSelector, matchedCallback) || result;
  22956. result =
  22957. this._matchPartial(this._classPartialMap, className, cssSelector, matchedCallback) ||
  22958. result;
  22959. }
  22960. }
  22961. if (lang_1.isPresent(attrs)) {
  22962. for (var index = 0; index < attrs.length;) {
  22963. var attrName = attrs[index++];
  22964. var attrValue = attrs[index++];
  22965. var terminalValuesMap = this._attrValueMap.get(attrName);
  22966. if (!lang_1.StringWrapper.equals(attrValue, _EMPTY_ATTR_VALUE)) {
  22967. result = this._matchTerminal(terminalValuesMap, _EMPTY_ATTR_VALUE, cssSelector, matchedCallback) ||
  22968. result;
  22969. }
  22970. result = this._matchTerminal(terminalValuesMap, attrValue, cssSelector, matchedCallback) ||
  22971. result;
  22972. var partialValuesMap = this._attrValuePartialMap.get(attrName);
  22973. if (!lang_1.StringWrapper.equals(attrValue, _EMPTY_ATTR_VALUE)) {
  22974. result = this._matchPartial(partialValuesMap, _EMPTY_ATTR_VALUE, cssSelector, matchedCallback) ||
  22975. result;
  22976. }
  22977. result =
  22978. this._matchPartial(partialValuesMap, attrValue, cssSelector, matchedCallback) || result;
  22979. }
  22980. }
  22981. return result;
  22982. };
  22983. /** @internal */
  22984. SelectorMatcher.prototype._matchTerminal = function (map, name, cssSelector, matchedCallback) {
  22985. if (lang_1.isBlank(map) || lang_1.isBlank(name)) {
  22986. return false;
  22987. }
  22988. var selectables = map.get(name);
  22989. var starSelectables = map.get("*");
  22990. if (lang_1.isPresent(starSelectables)) {
  22991. selectables = selectables.concat(starSelectables);
  22992. }
  22993. if (lang_1.isBlank(selectables)) {
  22994. return false;
  22995. }
  22996. var selectable;
  22997. var result = false;
  22998. for (var index = 0; index < selectables.length; index++) {
  22999. selectable = selectables[index];
  23000. result = selectable.finalize(cssSelector, matchedCallback) || result;
  23001. }
  23002. return result;
  23003. };
  23004. /** @internal */
  23005. SelectorMatcher.prototype._matchPartial = function (map, name, cssSelector, matchedCallback /*: (c: CssSelector, a: any) => void*/) {
  23006. if (lang_1.isBlank(map) || lang_1.isBlank(name)) {
  23007. return false;
  23008. }
  23009. var nestedSelector = map.get(name);
  23010. if (lang_1.isBlank(nestedSelector)) {
  23011. return false;
  23012. }
  23013. // TODO(perf): get rid of recursion and measure again
  23014. // TODO(perf): don't pass the whole selector into the recursion,
  23015. // but only the not processed parts
  23016. return nestedSelector.match(cssSelector, matchedCallback);
  23017. };
  23018. return SelectorMatcher;
  23019. })();
  23020. exports.SelectorMatcher = SelectorMatcher;
  23021. var SelectorListContext = (function () {
  23022. function SelectorListContext(selectors) {
  23023. this.selectors = selectors;
  23024. this.alreadyMatched = false;
  23025. }
  23026. return SelectorListContext;
  23027. })();
  23028. exports.SelectorListContext = SelectorListContext;
  23029. // Store context to pass back selector and context when a selector is matched
  23030. var SelectorContext = (function () {
  23031. function SelectorContext(selector, cbContext, listContext) {
  23032. this.selector = selector;
  23033. this.cbContext = cbContext;
  23034. this.listContext = listContext;
  23035. this.notSelectors = selector.notSelectors;
  23036. }
  23037. SelectorContext.prototype.finalize = function (cssSelector, callback) {
  23038. var result = true;
  23039. if (this.notSelectors.length > 0 &&
  23040. (lang_1.isBlank(this.listContext) || !this.listContext.alreadyMatched)) {
  23041. var notMatcher = SelectorMatcher.createNotMatcher(this.notSelectors);
  23042. result = !notMatcher.match(cssSelector, null);
  23043. }
  23044. if (result && lang_1.isPresent(callback) &&
  23045. (lang_1.isBlank(this.listContext) || !this.listContext.alreadyMatched)) {
  23046. if (lang_1.isPresent(this.listContext)) {
  23047. this.listContext.alreadyMatched = true;
  23048. }
  23049. callback(this.selector, this.cbContext);
  23050. }
  23051. return result;
  23052. };
  23053. return SelectorContext;
  23054. })();
  23055. exports.SelectorContext = SelectorContext;
  23056. /***/ },
  23057. /* 155 */
  23058. /***/ function(module, exports, __webpack_require__) {
  23059. var lang_1 = __webpack_require__(5);
  23060. var CAMEL_CASE_REGEXP = /([A-Z])/g;
  23061. var DASH_CASE_REGEXP = /-([a-z])/g;
  23062. var SINGLE_QUOTE_ESCAPE_STRING_RE = /'|\\|\n|\r|\$/g;
  23063. var DOUBLE_QUOTE_ESCAPE_STRING_RE = /"|\\|\n|\r|\$/g;
  23064. exports.MODULE_SUFFIX = lang_1.IS_DART ? '.dart' : '.js';
  23065. function camelCaseToDashCase(input) {
  23066. return lang_1.StringWrapper.replaceAllMapped(input, CAMEL_CASE_REGEXP, function (m) { return '-' + m[1].toLowerCase(); });
  23067. }
  23068. exports.camelCaseToDashCase = camelCaseToDashCase;
  23069. function dashCaseToCamelCase(input) {
  23070. return lang_1.StringWrapper.replaceAllMapped(input, DASH_CASE_REGEXP, function (m) { return m[1].toUpperCase(); });
  23071. }
  23072. exports.dashCaseToCamelCase = dashCaseToCamelCase;
  23073. function escapeSingleQuoteString(input) {
  23074. if (lang_1.isBlank(input)) {
  23075. return null;
  23076. }
  23077. return "'" + escapeString(input, SINGLE_QUOTE_ESCAPE_STRING_RE) + "'";
  23078. }
  23079. exports.escapeSingleQuoteString = escapeSingleQuoteString;
  23080. function escapeDoubleQuoteString(input) {
  23081. if (lang_1.isBlank(input)) {
  23082. return null;
  23083. }
  23084. return "\"" + escapeString(input, DOUBLE_QUOTE_ESCAPE_STRING_RE) + "\"";
  23085. }
  23086. exports.escapeDoubleQuoteString = escapeDoubleQuoteString;
  23087. function escapeString(input, re) {
  23088. return lang_1.StringWrapper.replaceAllMapped(input, re, function (match) {
  23089. if (match[0] == '$') {
  23090. return lang_1.IS_DART ? '\\$' : '$';
  23091. }
  23092. else if (match[0] == '\n') {
  23093. return '\\n';
  23094. }
  23095. else if (match[0] == '\r') {
  23096. return '\\r';
  23097. }
  23098. else {
  23099. return "\\" + match[0];
  23100. }
  23101. });
  23102. }
  23103. function codeGenExportVariable(name) {
  23104. if (lang_1.IS_DART) {
  23105. return "const " + name + " = ";
  23106. }
  23107. else {
  23108. return "var " + name + " = exports['" + name + "'] = ";
  23109. }
  23110. }
  23111. exports.codeGenExportVariable = codeGenExportVariable;
  23112. function codeGenConstConstructorCall(name) {
  23113. if (lang_1.IS_DART) {
  23114. return "const " + name;
  23115. }
  23116. else {
  23117. return "new " + name;
  23118. }
  23119. }
  23120. exports.codeGenConstConstructorCall = codeGenConstConstructorCall;
  23121. function codeGenValueFn(params, value, fnName) {
  23122. if (fnName === void 0) { fnName = ''; }
  23123. if (lang_1.IS_DART) {
  23124. return fnName + "(" + params.join(',') + ") => " + value;
  23125. }
  23126. else {
  23127. return "function " + fnName + "(" + params.join(',') + ") { return " + value + "; }";
  23128. }
  23129. }
  23130. exports.codeGenValueFn = codeGenValueFn;
  23131. function codeGenToString(expr) {
  23132. if (lang_1.IS_DART) {
  23133. return "'${" + expr + "}'";
  23134. }
  23135. else {
  23136. // JS automatically convets to string...
  23137. return expr;
  23138. }
  23139. }
  23140. exports.codeGenToString = codeGenToString;
  23141. function splitAtColon(input, defaultValues) {
  23142. var parts = lang_1.StringWrapper.split(input.trim(), /\s*:\s*/g);
  23143. if (parts.length > 1) {
  23144. return parts;
  23145. }
  23146. else {
  23147. return defaultValues;
  23148. }
  23149. }
  23150. exports.splitAtColon = splitAtColon;
  23151. /***/ },
  23152. /* 156 */
  23153. /***/ function(module, exports, __webpack_require__) {
  23154. var lang_1 = __webpack_require__(5);
  23155. var MODULE_REGEXP = /#MODULE\[([^\]]*)\]/g;
  23156. function moduleRef(moduleUrl) {
  23157. return "#MODULE[" + moduleUrl + "]";
  23158. }
  23159. exports.moduleRef = moduleRef;
  23160. /**
  23161. * Represents generated source code with module references. Internal to the Angular compiler.
  23162. */
  23163. var SourceModule = (function () {
  23164. function SourceModule(moduleUrl, sourceWithModuleRefs) {
  23165. this.moduleUrl = moduleUrl;
  23166. this.sourceWithModuleRefs = sourceWithModuleRefs;
  23167. }
  23168. SourceModule.prototype.getSourceWithImports = function () {
  23169. var _this = this;
  23170. var moduleAliases = {};
  23171. var imports = [];
  23172. var newSource = lang_1.StringWrapper.replaceAllMapped(this.sourceWithModuleRefs, MODULE_REGEXP, function (match) {
  23173. var moduleUrl = match[1];
  23174. var alias = moduleAliases[moduleUrl];
  23175. if (lang_1.isBlank(alias)) {
  23176. if (moduleUrl == _this.moduleUrl) {
  23177. alias = '';
  23178. }
  23179. else {
  23180. alias = "import" + imports.length;
  23181. imports.push([moduleUrl, alias]);
  23182. }
  23183. moduleAliases[moduleUrl] = alias;
  23184. }
  23185. return alias.length > 0 ? alias + "." : '';
  23186. });
  23187. return new SourceWithImports(newSource, imports);
  23188. };
  23189. return SourceModule;
  23190. })();
  23191. exports.SourceModule = SourceModule;
  23192. var SourceExpression = (function () {
  23193. function SourceExpression(declarations, expression) {
  23194. this.declarations = declarations;
  23195. this.expression = expression;
  23196. }
  23197. return SourceExpression;
  23198. })();
  23199. exports.SourceExpression = SourceExpression;
  23200. var SourceExpressions = (function () {
  23201. function SourceExpressions(declarations, expressions) {
  23202. this.declarations = declarations;
  23203. this.expressions = expressions;
  23204. }
  23205. return SourceExpressions;
  23206. })();
  23207. exports.SourceExpressions = SourceExpressions;
  23208. /**
  23209. * Represents generated source code with imports. Internal to the Angular compiler.
  23210. */
  23211. var SourceWithImports = (function () {
  23212. function SourceWithImports(source, imports) {
  23213. this.source = source;
  23214. this.imports = imports;
  23215. }
  23216. return SourceWithImports;
  23217. })();
  23218. exports.SourceWithImports = SourceWithImports;
  23219. /***/ },
  23220. /* 157 */
  23221. /***/ function(module, exports, __webpack_require__) {
  23222. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  23223. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  23224. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  23225. 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;
  23226. return c > 3 && r && Object.defineProperty(target, key, r), r;
  23227. };
  23228. var __metadata = (this && this.__metadata) || function (k, v) {
  23229. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  23230. };
  23231. var source_module_1 = __webpack_require__(156);
  23232. var change_detection_jit_generator_1 = __webpack_require__(52);
  23233. var change_definition_factory_1 = __webpack_require__(158);
  23234. var lang_1 = __webpack_require__(5);
  23235. var change_detection_1 = __webpack_require__(25);
  23236. var change_detector_codegen_1 = __webpack_require__(160);
  23237. var util_1 = __webpack_require__(155);
  23238. var di_1 = __webpack_require__(6);
  23239. var ABSTRACT_CHANGE_DETECTOR = "AbstractChangeDetector";
  23240. var UTIL = "ChangeDetectionUtil";
  23241. var CHANGE_DETECTOR_STATE = "ChangeDetectorState";
  23242. var ABSTRACT_CHANGE_DETECTOR_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/abstract_change_detector" + util_1.MODULE_SUFFIX);
  23243. var UTIL_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/change_detection_util" + util_1.MODULE_SUFFIX);
  23244. var PREGEN_PROTO_CHANGE_DETECTOR_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/pregen_proto_change_detector" + util_1.MODULE_SUFFIX);
  23245. var CONSTANTS_MODULE = source_module_1.moduleRef("package:angular2/src/core/change_detection/constants" + util_1.MODULE_SUFFIX);
  23246. var ChangeDetectionCompiler = (function () {
  23247. function ChangeDetectionCompiler(_genConfig) {
  23248. this._genConfig = _genConfig;
  23249. }
  23250. ChangeDetectionCompiler.prototype.compileComponentRuntime = function (componentType, strategy, parsedTemplate) {
  23251. var _this = this;
  23252. var changeDetectorDefinitions = change_definition_factory_1.createChangeDetectorDefinitions(componentType, strategy, this._genConfig, parsedTemplate);
  23253. return changeDetectorDefinitions.map(function (definition) {
  23254. return _this._createChangeDetectorFactory(definition);
  23255. });
  23256. };
  23257. ChangeDetectionCompiler.prototype._createChangeDetectorFactory = function (definition) {
  23258. if (lang_1.IS_DART || !this._genConfig.useJit) {
  23259. var proto = new change_detection_1.DynamicProtoChangeDetector(definition);
  23260. return function (dispatcher) { return proto.instantiate(dispatcher); };
  23261. }
  23262. else {
  23263. return new change_detection_jit_generator_1.ChangeDetectorJITGenerator(definition, UTIL, ABSTRACT_CHANGE_DETECTOR, CHANGE_DETECTOR_STATE)
  23264. .generate();
  23265. }
  23266. };
  23267. ChangeDetectionCompiler.prototype.compileComponentCodeGen = function (componentType, strategy, parsedTemplate) {
  23268. var changeDetectorDefinitions = change_definition_factory_1.createChangeDetectorDefinitions(componentType, strategy, this._genConfig, parsedTemplate);
  23269. var factories = [];
  23270. var index = 0;
  23271. var sourceParts = changeDetectorDefinitions.map(function (definition) {
  23272. var codegen;
  23273. var sourcePart;
  23274. // TODO(tbosch): move the 2 code generators to the same place, one with .dart and one with .ts
  23275. // suffix
  23276. // and have the same API for calling them!
  23277. if (lang_1.IS_DART) {
  23278. codegen = new change_detector_codegen_1.Codegen(PREGEN_PROTO_CHANGE_DETECTOR_MODULE);
  23279. var className = "_" + definition.id;
  23280. var typeRef = (index === 0 && componentType.isHost) ?
  23281. 'dynamic' :
  23282. "" + source_module_1.moduleRef(componentType.moduleUrl) + componentType.name;
  23283. codegen.generate(typeRef, className, definition);
  23284. factories.push(className + ".newChangeDetector");
  23285. sourcePart = codegen.toString();
  23286. }
  23287. else {
  23288. codegen = new change_detection_jit_generator_1.ChangeDetectorJITGenerator(definition, "" + UTIL_MODULE + UTIL, "" + ABSTRACT_CHANGE_DETECTOR_MODULE + ABSTRACT_CHANGE_DETECTOR, "" + CONSTANTS_MODULE + CHANGE_DETECTOR_STATE);
  23289. factories.push("function(dispatcher) { return new " + codegen.typeName + "(dispatcher); }");
  23290. sourcePart = codegen.generateSource();
  23291. }
  23292. index++;
  23293. return sourcePart;
  23294. });
  23295. return new source_module_1.SourceExpressions(sourceParts, factories);
  23296. };
  23297. ChangeDetectionCompiler = __decorate([
  23298. di_1.Injectable(),
  23299. __metadata('design:paramtypes', [change_detection_1.ChangeDetectorGenConfig])
  23300. ], ChangeDetectionCompiler);
  23301. return ChangeDetectionCompiler;
  23302. })();
  23303. exports.ChangeDetectionCompiler = ChangeDetectionCompiler;
  23304. /***/ },
  23305. /* 158 */
  23306. /***/ function(module, exports, __webpack_require__) {
  23307. var collection_1 = __webpack_require__(12);
  23308. var lang_1 = __webpack_require__(5);
  23309. var reflection_1 = __webpack_require__(16);
  23310. var change_detection_1 = __webpack_require__(25);
  23311. var template_ast_1 = __webpack_require__(159);
  23312. var interfaces_1 = __webpack_require__(89);
  23313. function createChangeDetectorDefinitions(componentType, componentStrategy, genConfig, parsedTemplate) {
  23314. var pvVisitors = [];
  23315. var visitor = new ProtoViewVisitor(null, pvVisitors, componentStrategy);
  23316. template_ast_1.templateVisitAll(visitor, parsedTemplate);
  23317. return createChangeDefinitions(pvVisitors, componentType, genConfig);
  23318. }
  23319. exports.createChangeDetectorDefinitions = createChangeDetectorDefinitions;
  23320. var ProtoViewVisitor = (function () {
  23321. function ProtoViewVisitor(parent, allVisitors, strategy) {
  23322. this.parent = parent;
  23323. this.allVisitors = allVisitors;
  23324. this.strategy = strategy;
  23325. this.boundTextCount = 0;
  23326. this.boundElementCount = 0;
  23327. this.variableNames = [];
  23328. this.bindingRecords = [];
  23329. this.eventRecords = [];
  23330. this.directiveRecords = [];
  23331. this.viewIndex = allVisitors.length;
  23332. allVisitors.push(this);
  23333. }
  23334. ProtoViewVisitor.prototype.visitEmbeddedTemplate = function (ast, context) {
  23335. this.boundElementCount++;
  23336. template_ast_1.templateVisitAll(this, ast.outputs);
  23337. for (var i = 0; i < ast.directives.length; i++) {
  23338. ast.directives[i].visit(this, i);
  23339. }
  23340. var childVisitor = new ProtoViewVisitor(this, this.allVisitors, change_detection_1.ChangeDetectionStrategy.Default);
  23341. // Attention: variables present on an embedded template count towards
  23342. // the embedded template and not the template anchor!
  23343. template_ast_1.templateVisitAll(childVisitor, ast.vars);
  23344. template_ast_1.templateVisitAll(childVisitor, ast.children);
  23345. return null;
  23346. };
  23347. ProtoViewVisitor.prototype.visitElement = function (ast, context) {
  23348. if (ast.isBound()) {
  23349. this.boundElementCount++;
  23350. }
  23351. template_ast_1.templateVisitAll(this, ast.inputs, null);
  23352. template_ast_1.templateVisitAll(this, ast.outputs);
  23353. template_ast_1.templateVisitAll(this, ast.exportAsVars);
  23354. for (var i = 0; i < ast.directives.length; i++) {
  23355. ast.directives[i].visit(this, i);
  23356. }
  23357. template_ast_1.templateVisitAll(this, ast.children);
  23358. return null;
  23359. };
  23360. ProtoViewVisitor.prototype.visitNgContent = function (ast, context) { return null; };
  23361. ProtoViewVisitor.prototype.visitVariable = function (ast, context) {
  23362. this.variableNames.push(ast.name);
  23363. return null;
  23364. };
  23365. ProtoViewVisitor.prototype.visitEvent = function (ast, directiveRecord) {
  23366. var bindingRecord = lang_1.isPresent(directiveRecord) ?
  23367. change_detection_1.BindingRecord.createForHostEvent(ast.handler, ast.fullName, directiveRecord) :
  23368. change_detection_1.BindingRecord.createForEvent(ast.handler, ast.fullName, this.boundElementCount - 1);
  23369. this.eventRecords.push(bindingRecord);
  23370. return null;
  23371. };
  23372. ProtoViewVisitor.prototype.visitElementProperty = function (ast, directiveRecord) {
  23373. var boundElementIndex = this.boundElementCount - 1;
  23374. var dirIndex = lang_1.isPresent(directiveRecord) ? directiveRecord.directiveIndex : null;
  23375. var bindingRecord;
  23376. if (ast.type === template_ast_1.PropertyBindingType.Property) {
  23377. bindingRecord =
  23378. lang_1.isPresent(dirIndex) ?
  23379. change_detection_1.BindingRecord.createForHostProperty(dirIndex, ast.value, ast.name) :
  23380. change_detection_1.BindingRecord.createForElementProperty(ast.value, boundElementIndex, ast.name);
  23381. }
  23382. else if (ast.type === template_ast_1.PropertyBindingType.Attribute) {
  23383. bindingRecord =
  23384. lang_1.isPresent(dirIndex) ?
  23385. change_detection_1.BindingRecord.createForHostAttribute(dirIndex, ast.value, ast.name) :
  23386. change_detection_1.BindingRecord.createForElementAttribute(ast.value, boundElementIndex, ast.name);
  23387. }
  23388. else if (ast.type === template_ast_1.PropertyBindingType.Class) {
  23389. bindingRecord =
  23390. lang_1.isPresent(dirIndex) ?
  23391. change_detection_1.BindingRecord.createForHostClass(dirIndex, ast.value, ast.name) :
  23392. change_detection_1.BindingRecord.createForElementClass(ast.value, boundElementIndex, ast.name);
  23393. }
  23394. else if (ast.type === template_ast_1.PropertyBindingType.Style) {
  23395. bindingRecord =
  23396. lang_1.isPresent(dirIndex) ?
  23397. change_detection_1.BindingRecord.createForHostStyle(dirIndex, ast.value, ast.name, ast.unit) :
  23398. change_detection_1.BindingRecord.createForElementStyle(ast.value, boundElementIndex, ast.name, ast.unit);
  23399. }
  23400. this.bindingRecords.push(bindingRecord);
  23401. return null;
  23402. };
  23403. ProtoViewVisitor.prototype.visitAttr = function (ast, context) { return null; };
  23404. ProtoViewVisitor.prototype.visitBoundText = function (ast, context) {
  23405. var boundTextIndex = this.boundTextCount++;
  23406. this.bindingRecords.push(change_detection_1.BindingRecord.createForTextNode(ast.value, boundTextIndex));
  23407. return null;
  23408. };
  23409. ProtoViewVisitor.prototype.visitText = function (ast, context) { return null; };
  23410. ProtoViewVisitor.prototype.visitDirective = function (ast, directiveIndexAsNumber) {
  23411. var directiveIndex = new change_detection_1.DirectiveIndex(this.boundElementCount - 1, directiveIndexAsNumber);
  23412. var directiveMetadata = ast.directive;
  23413. var directiveRecord = new change_detection_1.DirectiveRecord({
  23414. directiveIndex: directiveIndex,
  23415. callAfterContentInit: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterContentInit) !== -1,
  23416. callAfterContentChecked: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterContentChecked) !== -1,
  23417. callAfterViewInit: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterViewInit) !== -1,
  23418. callAfterViewChecked: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.AfterViewChecked) !== -1,
  23419. callOnChanges: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.OnChanges) !== -1,
  23420. callDoCheck: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.DoCheck) !== -1,
  23421. callOnInit: directiveMetadata.lifecycleHooks.indexOf(interfaces_1.LifecycleHooks.OnInit) !== -1,
  23422. changeDetection: directiveMetadata.changeDetection
  23423. });
  23424. this.directiveRecords.push(directiveRecord);
  23425. template_ast_1.templateVisitAll(this, ast.inputs, directiveRecord);
  23426. var bindingRecords = this.bindingRecords;
  23427. if (directiveRecord.callOnChanges) {
  23428. bindingRecords.push(change_detection_1.BindingRecord.createDirectiveOnChanges(directiveRecord));
  23429. }
  23430. if (directiveRecord.callOnInit) {
  23431. bindingRecords.push(change_detection_1.BindingRecord.createDirectiveOnInit(directiveRecord));
  23432. }
  23433. if (directiveRecord.callDoCheck) {
  23434. bindingRecords.push(change_detection_1.BindingRecord.createDirectiveDoCheck(directiveRecord));
  23435. }
  23436. template_ast_1.templateVisitAll(this, ast.hostProperties, directiveRecord);
  23437. template_ast_1.templateVisitAll(this, ast.hostEvents, directiveRecord);
  23438. template_ast_1.templateVisitAll(this, ast.exportAsVars);
  23439. return null;
  23440. };
  23441. ProtoViewVisitor.prototype.visitDirectiveProperty = function (ast, directiveRecord) {
  23442. // TODO: these setters should eventually be created by change detection, to make
  23443. // it monomorphic!
  23444. var setter = reflection_1.reflector.setter(ast.directiveName);
  23445. this.bindingRecords.push(change_detection_1.BindingRecord.createForDirective(ast.value, ast.directiveName, setter, directiveRecord));
  23446. return null;
  23447. };
  23448. return ProtoViewVisitor;
  23449. })();
  23450. function createChangeDefinitions(pvVisitors, componentType, genConfig) {
  23451. var pvVariableNames = _collectNestedProtoViewsVariableNames(pvVisitors);
  23452. return pvVisitors.map(function (pvVisitor) {
  23453. var id = componentType.name + "_" + pvVisitor.viewIndex;
  23454. return new change_detection_1.ChangeDetectorDefinition(id, pvVisitor.strategy, pvVariableNames[pvVisitor.viewIndex], pvVisitor.bindingRecords, pvVisitor.eventRecords, pvVisitor.directiveRecords, genConfig);
  23455. });
  23456. }
  23457. function _collectNestedProtoViewsVariableNames(pvVisitors) {
  23458. var nestedPvVariableNames = collection_1.ListWrapper.createFixedSize(pvVisitors.length);
  23459. pvVisitors.forEach(function (pv) {
  23460. var parentVariableNames = lang_1.isPresent(pv.parent) ? nestedPvVariableNames[pv.parent.viewIndex] : [];
  23461. nestedPvVariableNames[pv.viewIndex] = parentVariableNames.concat(pv.variableNames);
  23462. });
  23463. return nestedPvVariableNames;
  23464. }
  23465. /***/ },
  23466. /* 159 */
  23467. /***/ function(module, exports, __webpack_require__) {
  23468. var lang_1 = __webpack_require__(5);
  23469. /**
  23470. * A segment of text within the template.
  23471. */
  23472. var TextAst = (function () {
  23473. function TextAst(value, ngContentIndex, sourceSpan) {
  23474. this.value = value;
  23475. this.ngContentIndex = ngContentIndex;
  23476. this.sourceSpan = sourceSpan;
  23477. }
  23478. TextAst.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };
  23479. return TextAst;
  23480. })();
  23481. exports.TextAst = TextAst;
  23482. /**
  23483. * A bound expression within the text of a template.
  23484. */
  23485. var BoundTextAst = (function () {
  23486. function BoundTextAst(value, ngContentIndex, sourceSpan) {
  23487. this.value = value;
  23488. this.ngContentIndex = ngContentIndex;
  23489. this.sourceSpan = sourceSpan;
  23490. }
  23491. BoundTextAst.prototype.visit = function (visitor, context) {
  23492. return visitor.visitBoundText(this, context);
  23493. };
  23494. return BoundTextAst;
  23495. })();
  23496. exports.BoundTextAst = BoundTextAst;
  23497. /**
  23498. * A plain attribute on an element.
  23499. */
  23500. var AttrAst = (function () {
  23501. function AttrAst(name, value, sourceSpan) {
  23502. this.name = name;
  23503. this.value = value;
  23504. this.sourceSpan = sourceSpan;
  23505. }
  23506. AttrAst.prototype.visit = function (visitor, context) { return visitor.visitAttr(this, context); };
  23507. return AttrAst;
  23508. })();
  23509. exports.AttrAst = AttrAst;
  23510. /**
  23511. * A binding for an element property (e.g. `[property]="expression"`).
  23512. */
  23513. var BoundElementPropertyAst = (function () {
  23514. function BoundElementPropertyAst(name, type, value, unit, sourceSpan) {
  23515. this.name = name;
  23516. this.type = type;
  23517. this.value = value;
  23518. this.unit = unit;
  23519. this.sourceSpan = sourceSpan;
  23520. }
  23521. BoundElementPropertyAst.prototype.visit = function (visitor, context) {
  23522. return visitor.visitElementProperty(this, context);
  23523. };
  23524. return BoundElementPropertyAst;
  23525. })();
  23526. exports.BoundElementPropertyAst = BoundElementPropertyAst;
  23527. /**
  23528. * A binding for an element event (e.g. `(event)="handler()"`).
  23529. */
  23530. var BoundEventAst = (function () {
  23531. function BoundEventAst(name, target, handler, sourceSpan) {
  23532. this.name = name;
  23533. this.target = target;
  23534. this.handler = handler;
  23535. this.sourceSpan = sourceSpan;
  23536. }
  23537. BoundEventAst.prototype.visit = function (visitor, context) {
  23538. return visitor.visitEvent(this, context);
  23539. };
  23540. Object.defineProperty(BoundEventAst.prototype, "fullName", {
  23541. get: function () {
  23542. if (lang_1.isPresent(this.target)) {
  23543. return this.target + ":" + this.name;
  23544. }
  23545. else {
  23546. return this.name;
  23547. }
  23548. },
  23549. enumerable: true,
  23550. configurable: true
  23551. });
  23552. return BoundEventAst;
  23553. })();
  23554. exports.BoundEventAst = BoundEventAst;
  23555. /**
  23556. * A variable declaration on an element (e.g. `#var="expression"`).
  23557. */
  23558. var VariableAst = (function () {
  23559. function VariableAst(name, value, sourceSpan) {
  23560. this.name = name;
  23561. this.value = value;
  23562. this.sourceSpan = sourceSpan;
  23563. }
  23564. VariableAst.prototype.visit = function (visitor, context) {
  23565. return visitor.visitVariable(this, context);
  23566. };
  23567. return VariableAst;
  23568. })();
  23569. exports.VariableAst = VariableAst;
  23570. /**
  23571. * An element declaration in a template.
  23572. */
  23573. var ElementAst = (function () {
  23574. function ElementAst(name, attrs, inputs, outputs, exportAsVars, directives, children, ngContentIndex, sourceSpan) {
  23575. this.name = name;
  23576. this.attrs = attrs;
  23577. this.inputs = inputs;
  23578. this.outputs = outputs;
  23579. this.exportAsVars = exportAsVars;
  23580. this.directives = directives;
  23581. this.children = children;
  23582. this.ngContentIndex = ngContentIndex;
  23583. this.sourceSpan = sourceSpan;
  23584. }
  23585. ElementAst.prototype.visit = function (visitor, context) {
  23586. return visitor.visitElement(this, context);
  23587. };
  23588. /**
  23589. * Whether the element has any active bindings (inputs, outputs, vars, or directives).
  23590. */
  23591. ElementAst.prototype.isBound = function () {
  23592. return (this.inputs.length > 0 || this.outputs.length > 0 || this.exportAsVars.length > 0 ||
  23593. this.directives.length > 0);
  23594. };
  23595. /**
  23596. * Get the component associated with this element, if any.
  23597. */
  23598. ElementAst.prototype.getComponent = function () {
  23599. return this.directives.length > 0 && this.directives[0].directive.isComponent ?
  23600. this.directives[0].directive :
  23601. null;
  23602. };
  23603. return ElementAst;
  23604. })();
  23605. exports.ElementAst = ElementAst;
  23606. /**
  23607. * A `<template>` element included in an Angular template.
  23608. */
  23609. var EmbeddedTemplateAst = (function () {
  23610. function EmbeddedTemplateAst(attrs, outputs, vars, directives, children, ngContentIndex, sourceSpan) {
  23611. this.attrs = attrs;
  23612. this.outputs = outputs;
  23613. this.vars = vars;
  23614. this.directives = directives;
  23615. this.children = children;
  23616. this.ngContentIndex = ngContentIndex;
  23617. this.sourceSpan = sourceSpan;
  23618. }
  23619. EmbeddedTemplateAst.prototype.visit = function (visitor, context) {
  23620. return visitor.visitEmbeddedTemplate(this, context);
  23621. };
  23622. return EmbeddedTemplateAst;
  23623. })();
  23624. exports.EmbeddedTemplateAst = EmbeddedTemplateAst;
  23625. /**
  23626. * A directive property with a bound value (e.g. `*ngIf="condition").
  23627. */
  23628. var BoundDirectivePropertyAst = (function () {
  23629. function BoundDirectivePropertyAst(directiveName, templateName, value, sourceSpan) {
  23630. this.directiveName = directiveName;
  23631. this.templateName = templateName;
  23632. this.value = value;
  23633. this.sourceSpan = sourceSpan;
  23634. }
  23635. BoundDirectivePropertyAst.prototype.visit = function (visitor, context) {
  23636. return visitor.visitDirectiveProperty(this, context);
  23637. };
  23638. return BoundDirectivePropertyAst;
  23639. })();
  23640. exports.BoundDirectivePropertyAst = BoundDirectivePropertyAst;
  23641. /**
  23642. * A directive declared on an element.
  23643. */
  23644. var DirectiveAst = (function () {
  23645. function DirectiveAst(directive, inputs, hostProperties, hostEvents, exportAsVars, sourceSpan) {
  23646. this.directive = directive;
  23647. this.inputs = inputs;
  23648. this.hostProperties = hostProperties;
  23649. this.hostEvents = hostEvents;
  23650. this.exportAsVars = exportAsVars;
  23651. this.sourceSpan = sourceSpan;
  23652. }
  23653. DirectiveAst.prototype.visit = function (visitor, context) {
  23654. return visitor.visitDirective(this, context);
  23655. };
  23656. return DirectiveAst;
  23657. })();
  23658. exports.DirectiveAst = DirectiveAst;
  23659. /**
  23660. * Position where content is to be projected (instance of `<ng-content>` in a template).
  23661. */
  23662. var NgContentAst = (function () {
  23663. function NgContentAst(index, ngContentIndex, sourceSpan) {
  23664. this.index = index;
  23665. this.ngContentIndex = ngContentIndex;
  23666. this.sourceSpan = sourceSpan;
  23667. }
  23668. NgContentAst.prototype.visit = function (visitor, context) {
  23669. return visitor.visitNgContent(this, context);
  23670. };
  23671. return NgContentAst;
  23672. })();
  23673. exports.NgContentAst = NgContentAst;
  23674. /**
  23675. * Enumeration of types of property bindings.
  23676. */
  23677. (function (PropertyBindingType) {
  23678. /**
  23679. * A normal binding to a property (e.g. `[property]="expression"`).
  23680. */
  23681. PropertyBindingType[PropertyBindingType["Property"] = 0] = "Property";
  23682. /**
  23683. * A binding to an element attribute (e.g. `[attr.name]="expression"`).
  23684. */
  23685. PropertyBindingType[PropertyBindingType["Attribute"] = 1] = "Attribute";
  23686. /**
  23687. * A binding to a CSS class (e.g. `[class.name]="condition"`).
  23688. */
  23689. PropertyBindingType[PropertyBindingType["Class"] = 2] = "Class";
  23690. /**
  23691. * A binding to a style rule (e.g. `[style.rule]="expression"`).
  23692. */
  23693. PropertyBindingType[PropertyBindingType["Style"] = 3] = "Style";
  23694. })(exports.PropertyBindingType || (exports.PropertyBindingType = {}));
  23695. var PropertyBindingType = exports.PropertyBindingType;
  23696. /**
  23697. * Visit every node in a list of {@link TemplateAst}s with the given {@link TemplateAstVisitor}.
  23698. */
  23699. function templateVisitAll(visitor, asts, context) {
  23700. if (context === void 0) { context = null; }
  23701. var result = [];
  23702. asts.forEach(function (ast) {
  23703. var astResult = ast.visit(visitor, context);
  23704. if (lang_1.isPresent(astResult)) {
  23705. result.push(astResult);
  23706. }
  23707. });
  23708. return result;
  23709. }
  23710. exports.templateVisitAll = templateVisitAll;
  23711. /***/ },
  23712. /* 160 */
  23713. /***/ function(module, exports) {
  23714. // Note: This class is only here so that we can reference it from TypeScript code.
  23715. // The actual implementation lives under modules_dart.
  23716. // TODO(tbosch): Move the corresponding code into angular2/src/compiler once
  23717. // the new compiler is done.
  23718. var Codegen = (function () {
  23719. function Codegen(moduleAlias) {
  23720. }
  23721. Codegen.prototype.generate = function (typeName, changeDetectorTypeName, def) {
  23722. throw "Not implemented in JS";
  23723. };
  23724. Codegen.prototype.toString = function () { throw "Not implemented in JS"; };
  23725. return Codegen;
  23726. })();
  23727. exports.Codegen = Codegen;
  23728. /***/ },
  23729. /* 161 */
  23730. /***/ function(module, exports, __webpack_require__) {
  23731. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  23732. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  23733. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  23734. 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;
  23735. return c > 3 && r && Object.defineProperty(target, key, r), r;
  23736. };
  23737. var __metadata = (this && this.__metadata) || function (k, v) {
  23738. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  23739. };
  23740. var source_module_1 = __webpack_require__(156);
  23741. var view_1 = __webpack_require__(56);
  23742. var xhr_1 = __webpack_require__(149);
  23743. var lang_1 = __webpack_require__(5);
  23744. var async_1 = __webpack_require__(60);
  23745. var shadow_css_1 = __webpack_require__(162);
  23746. var url_resolver_1 = __webpack_require__(148);
  23747. var style_url_resolver_1 = __webpack_require__(163);
  23748. var util_1 = __webpack_require__(155);
  23749. var di_1 = __webpack_require__(6);
  23750. var view_factory_1 = __webpack_require__(164);
  23751. var StyleCompiler = (function () {
  23752. function StyleCompiler(_xhr, _urlResolver) {
  23753. this._xhr = _xhr;
  23754. this._urlResolver = _urlResolver;
  23755. this._styleCache = new Map();
  23756. this._shadowCss = new shadow_css_1.ShadowCss();
  23757. }
  23758. StyleCompiler.prototype.compileComponentRuntime = function (template) {
  23759. var styles = template.styles;
  23760. var styleAbsUrls = template.styleUrls;
  23761. return this._loadStyles(styles, styleAbsUrls, template.encapsulation === view_1.ViewEncapsulation.Emulated);
  23762. };
  23763. StyleCompiler.prototype.compileComponentCodeGen = function (template) {
  23764. var shim = template.encapsulation === view_1.ViewEncapsulation.Emulated;
  23765. return this._styleCodeGen(template.styles, template.styleUrls, shim);
  23766. };
  23767. StyleCompiler.prototype.compileStylesheetCodeGen = function (stylesheetUrl, cssText) {
  23768. var styleWithImports = style_url_resolver_1.extractStyleUrls(this._urlResolver, stylesheetUrl, cssText);
  23769. return [
  23770. this._styleModule(stylesheetUrl, false, this._styleCodeGen([styleWithImports.style], styleWithImports.styleUrls, false)),
  23771. this._styleModule(stylesheetUrl, true, this._styleCodeGen([styleWithImports.style], styleWithImports.styleUrls, true))
  23772. ];
  23773. };
  23774. StyleCompiler.prototype.clearCache = function () { this._styleCache.clear(); };
  23775. StyleCompiler.prototype._loadStyles = function (plainStyles, absUrls, encapsulate) {
  23776. var _this = this;
  23777. var promises = absUrls.map(function (absUrl) {
  23778. var cacheKey = "" + absUrl + (encapsulate ? '.shim' : '');
  23779. var result = _this._styleCache.get(cacheKey);
  23780. if (lang_1.isBlank(result)) {
  23781. result = _this._xhr.get(absUrl).then(function (style) {
  23782. var styleWithImports = style_url_resolver_1.extractStyleUrls(_this._urlResolver, absUrl, style);
  23783. return _this._loadStyles([styleWithImports.style], styleWithImports.styleUrls, encapsulate);
  23784. });
  23785. _this._styleCache.set(cacheKey, result);
  23786. }
  23787. return result;
  23788. });
  23789. return async_1.PromiseWrapper.all(promises).then(function (nestedStyles) {
  23790. var result = plainStyles.map(function (plainStyle) { return _this._shimIfNeeded(plainStyle, encapsulate); });
  23791. nestedStyles.forEach(function (styles) { return result.push(styles); });
  23792. return result;
  23793. });
  23794. };
  23795. StyleCompiler.prototype._styleCodeGen = function (plainStyles, absUrls, shim) {
  23796. var _this = this;
  23797. var arrayPrefix = lang_1.IS_DART ? "const" : '';
  23798. var styleExpressions = plainStyles.map(function (plainStyle) { return util_1.escapeSingleQuoteString(_this._shimIfNeeded(plainStyle, shim)); });
  23799. for (var i = 0; i < absUrls.length; i++) {
  23800. var moduleUrl = this._createModuleUrl(absUrls[i], shim);
  23801. styleExpressions.push(source_module_1.moduleRef(moduleUrl) + "STYLES");
  23802. }
  23803. var expressionSource = arrayPrefix + " [" + styleExpressions.join(',') + "]";
  23804. return new source_module_1.SourceExpression([], expressionSource);
  23805. };
  23806. StyleCompiler.prototype._styleModule = function (stylesheetUrl, shim, expression) {
  23807. var moduleSource = "\n " + expression.declarations.join('\n') + "\n " + util_1.codeGenExportVariable('STYLES') + expression.expression + ";\n ";
  23808. return new source_module_1.SourceModule(this._createModuleUrl(stylesheetUrl, shim), moduleSource);
  23809. };
  23810. StyleCompiler.prototype._shimIfNeeded = function (style, shim) {
  23811. return shim ? this._shadowCss.shimCssText(style, view_factory_1.CONTENT_ATTR, view_factory_1.HOST_ATTR) : style;
  23812. };
  23813. StyleCompiler.prototype._createModuleUrl = function (stylesheetUrl, shim) {
  23814. return shim ? stylesheetUrl + ".shim" + util_1.MODULE_SUFFIX : "" + stylesheetUrl + util_1.MODULE_SUFFIX;
  23815. };
  23816. StyleCompiler = __decorate([
  23817. di_1.Injectable(),
  23818. __metadata('design:paramtypes', [xhr_1.XHR, url_resolver_1.UrlResolver])
  23819. ], StyleCompiler);
  23820. return StyleCompiler;
  23821. })();
  23822. exports.StyleCompiler = StyleCompiler;
  23823. /***/ },
  23824. /* 162 */
  23825. /***/ function(module, exports, __webpack_require__) {
  23826. var collection_1 = __webpack_require__(12);
  23827. var lang_1 = __webpack_require__(5);
  23828. /**
  23829. * This file is a port of shadowCSS from webcomponents.js to TypeScript.
  23830. *
  23831. * Please make sure to keep to edits in sync with the source file.
  23832. *
  23833. * Source:
  23834. * https://github.com/webcomponents/webcomponentsjs/blob/4efecd7e0e/src/ShadowCSS/ShadowCSS.js
  23835. *
  23836. * The original file level comment is reproduced below
  23837. */
  23838. /*
  23839. This is a limited shim for ShadowDOM css styling.
  23840. https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#styles
  23841. The intention here is to support only the styling features which can be
  23842. relatively simply implemented. The goal is to allow users to avoid the
  23843. most obvious pitfalls and do so without compromising performance significantly.
  23844. For ShadowDOM styling that's not covered here, a set of best practices
  23845. can be provided that should allow users to accomplish more complex styling.
  23846. The following is a list of specific ShadowDOM styling features and a brief
  23847. discussion of the approach used to shim.
  23848. Shimmed features:
  23849. * :host, :host-context: ShadowDOM allows styling of the shadowRoot's host
  23850. element using the :host rule. To shim this feature, the :host styles are
  23851. reformatted and prefixed with a given scope name and promoted to a
  23852. document level stylesheet.
  23853. For example, given a scope name of .foo, a rule like this:
  23854. :host {
  23855. background: red;
  23856. }
  23857. }
  23858. becomes:
  23859. .foo {
  23860. background: red;
  23861. }
  23862. * encapsultion: Styles defined within ShadowDOM, apply only to
  23863. dom inside the ShadowDOM. Polymer uses one of two techniques to imlement
  23864. this feature.
  23865. By default, rules are prefixed with the host element tag name
  23866. as a descendant selector. This ensures styling does not leak out of the 'top'
  23867. of the element's ShadowDOM. For example,
  23868. div {
  23869. font-weight: bold;
  23870. }
  23871. becomes:
  23872. x-foo div {
  23873. font-weight: bold;
  23874. }
  23875. becomes:
  23876. Alternatively, if WebComponents.ShadowCSS.strictStyling is set to true then
  23877. selectors are scoped by adding an attribute selector suffix to each
  23878. simple selector that contains the host element tag name. Each element
  23879. in the element's ShadowDOM template is also given the scope attribute.
  23880. Thus, these rules match only elements that have the scope attribute.
  23881. For example, given a scope name of x-foo, a rule like this:
  23882. div {
  23883. font-weight: bold;
  23884. }
  23885. becomes:
  23886. div[x-foo] {
  23887. font-weight: bold;
  23888. }
  23889. Note that elements that are dynamically added to a scope must have the scope
  23890. selector added to them manually.
  23891. * upper/lower bound encapsulation: Styles which are defined outside a
  23892. shadowRoot should not cross the ShadowDOM boundary and should not apply
  23893. inside a shadowRoot.
  23894. This styling behavior is not emulated. Some possible ways to do this that
  23895. were rejected due to complexity and/or performance concerns include: (1) reset
  23896. every possible property for every possible selector for a given scope name;
  23897. (2) re-implement css in javascript.
  23898. As an alternative, users should make sure to use selectors
  23899. specific to the scope in which they are working.
  23900. * ::distributed: This behavior is not emulated. It's often not necessary
  23901. to style the contents of a specific insertion point and instead, descendants
  23902. of the host element can be styled selectively. Users can also create an
  23903. extra node around an insertion point and style that node's contents
  23904. via descendent selectors. For example, with a shadowRoot like this:
  23905. <style>
  23906. ::content(div) {
  23907. background: red;
  23908. }
  23909. </style>
  23910. <content></content>
  23911. could become:
  23912. <style>
  23913. / *@polyfill .content-container div * /
  23914. ::content(div) {
  23915. background: red;
  23916. }
  23917. </style>
  23918. <div class="content-container">
  23919. <content></content>
  23920. </div>
  23921. Note the use of @polyfill in the comment above a ShadowDOM specific style
  23922. declaration. This is a directive to the styling shim to use the selector
  23923. in comments in lieu of the next selector when running under polyfill.
  23924. */
  23925. var ShadowCss = (function () {
  23926. function ShadowCss() {
  23927. this.strictStyling = true;
  23928. }
  23929. /*
  23930. * Shim some cssText with the given selector. Returns cssText that can
  23931. * be included in the document via WebComponents.ShadowCSS.addCssToDocument(css).
  23932. *
  23933. * When strictStyling is true:
  23934. * - selector is the attribute added to all elements inside the host,
  23935. * - hostSelector is the attribute added to the host itself.
  23936. */
  23937. ShadowCss.prototype.shimCssText = function (cssText, selector, hostSelector) {
  23938. if (hostSelector === void 0) { hostSelector = ''; }
  23939. cssText = stripComments(cssText);
  23940. cssText = this._insertDirectives(cssText);
  23941. return this._scopeCssText(cssText, selector, hostSelector);
  23942. };
  23943. ShadowCss.prototype._insertDirectives = function (cssText) {
  23944. cssText = this._insertPolyfillDirectivesInCssText(cssText);
  23945. return this._insertPolyfillRulesInCssText(cssText);
  23946. };
  23947. /*
  23948. * Process styles to convert native ShadowDOM rules that will trip
  23949. * up the css parser; we rely on decorating the stylesheet with inert rules.
  23950. *
  23951. * For example, we convert this rule:
  23952. *
  23953. * polyfill-next-selector { content: ':host menu-item'; }
  23954. * ::content menu-item {
  23955. *
  23956. * to this:
  23957. *
  23958. * scopeName menu-item {
  23959. *
  23960. **/
  23961. ShadowCss.prototype._insertPolyfillDirectivesInCssText = function (cssText) {
  23962. // Difference with webcomponents.js: does not handle comments
  23963. return lang_1.StringWrapper.replaceAllMapped(cssText, _cssContentNextSelectorRe, function (m) { return m[1] + '{'; });
  23964. };
  23965. /*
  23966. * Process styles to add rules which will only apply under the polyfill
  23967. *
  23968. * For example, we convert this rule:
  23969. *
  23970. * polyfill-rule {
  23971. * content: ':host menu-item';
  23972. * ...
  23973. * }
  23974. *
  23975. * to this:
  23976. *
  23977. * scopeName menu-item {...}
  23978. *
  23979. **/
  23980. ShadowCss.prototype._insertPolyfillRulesInCssText = function (cssText) {
  23981. // Difference with webcomponents.js: does not handle comments
  23982. return lang_1.StringWrapper.replaceAllMapped(cssText, _cssContentRuleRe, function (m) {
  23983. var rule = m[0];
  23984. rule = lang_1.StringWrapper.replace(rule, m[1], '');
  23985. rule = lang_1.StringWrapper.replace(rule, m[2], '');
  23986. return m[3] + rule;
  23987. });
  23988. };
  23989. /* Ensure styles are scoped. Pseudo-scoping takes a rule like:
  23990. *
  23991. * .foo {... }
  23992. *
  23993. * and converts this to
  23994. *
  23995. * scopeName .foo { ... }
  23996. */
  23997. ShadowCss.prototype._scopeCssText = function (cssText, scopeSelector, hostSelector) {
  23998. var unscoped = this._extractUnscopedRulesFromCssText(cssText);
  23999. cssText = this._insertPolyfillHostInCssText(cssText);
  24000. cssText = this._convertColonHost(cssText);
  24001. cssText = this._convertColonHostContext(cssText);
  24002. cssText = this._convertShadowDOMSelectors(cssText);
  24003. if (lang_1.isPresent(scopeSelector)) {
  24004. cssText = this._scopeSelectors(cssText, scopeSelector, hostSelector);
  24005. }
  24006. cssText = cssText + '\n' + unscoped;
  24007. return cssText.trim();
  24008. };
  24009. /*
  24010. * Process styles to add rules which will only apply under the polyfill
  24011. * and do not process via CSSOM. (CSSOM is destructive to rules on rare
  24012. * occasions, e.g. -webkit-calc on Safari.)
  24013. * For example, we convert this rule:
  24014. *
  24015. * @polyfill-unscoped-rule {
  24016. * content: 'menu-item';
  24017. * ... }
  24018. *
  24019. * to this:
  24020. *
  24021. * menu-item {...}
  24022. *
  24023. **/
  24024. ShadowCss.prototype._extractUnscopedRulesFromCssText = function (cssText) {
  24025. // Difference with webcomponents.js: does not handle comments
  24026. var r = '', m;
  24027. var matcher = lang_1.RegExpWrapper.matcher(_cssContentUnscopedRuleRe, cssText);
  24028. while (lang_1.isPresent(m = lang_1.RegExpMatcherWrapper.next(matcher))) {
  24029. var rule = m[0];
  24030. rule = lang_1.StringWrapper.replace(rule, m[2], '');
  24031. rule = lang_1.StringWrapper.replace(rule, m[1], m[3]);
  24032. r += rule + '\n\n';
  24033. }
  24034. return r;
  24035. };
  24036. /*
  24037. * convert a rule like :host(.foo) > .bar { }
  24038. *
  24039. * to
  24040. *
  24041. * scopeName.foo > .bar
  24042. */
  24043. ShadowCss.prototype._convertColonHost = function (cssText) {
  24044. return this._convertColonRule(cssText, _cssColonHostRe, this._colonHostPartReplacer);
  24045. };
  24046. /*
  24047. * convert a rule like :host-context(.foo) > .bar { }
  24048. *
  24049. * to
  24050. *
  24051. * scopeName.foo > .bar, .foo scopeName > .bar { }
  24052. *
  24053. * and
  24054. *
  24055. * :host-context(.foo:host) .bar { ... }
  24056. *
  24057. * to
  24058. *
  24059. * scopeName.foo .bar { ... }
  24060. */
  24061. ShadowCss.prototype._convertColonHostContext = function (cssText) {
  24062. return this._convertColonRule(cssText, _cssColonHostContextRe, this._colonHostContextPartReplacer);
  24063. };
  24064. ShadowCss.prototype._convertColonRule = function (cssText, regExp, partReplacer) {
  24065. // p1 = :host, p2 = contents of (), p3 rest of rule
  24066. return lang_1.StringWrapper.replaceAllMapped(cssText, regExp, function (m) {
  24067. if (lang_1.isPresent(m[2])) {
  24068. var parts = m[2].split(','), r = [];
  24069. for (var i = 0; i < parts.length; i++) {
  24070. var p = parts[i];
  24071. if (lang_1.isBlank(p))
  24072. break;
  24073. p = p.trim();
  24074. r.push(partReplacer(_polyfillHostNoCombinator, p, m[3]));
  24075. }
  24076. return r.join(',');
  24077. }
  24078. else {
  24079. return _polyfillHostNoCombinator + m[3];
  24080. }
  24081. });
  24082. };
  24083. ShadowCss.prototype._colonHostContextPartReplacer = function (host, part, suffix) {
  24084. if (lang_1.StringWrapper.contains(part, _polyfillHost)) {
  24085. return this._colonHostPartReplacer(host, part, suffix);
  24086. }
  24087. else {
  24088. return host + part + suffix + ', ' + part + ' ' + host + suffix;
  24089. }
  24090. };
  24091. ShadowCss.prototype._colonHostPartReplacer = function (host, part, suffix) {
  24092. return host + lang_1.StringWrapper.replace(part, _polyfillHost, '') + suffix;
  24093. };
  24094. /*
  24095. * Convert combinators like ::shadow and pseudo-elements like ::content
  24096. * by replacing with space.
  24097. */
  24098. ShadowCss.prototype._convertShadowDOMSelectors = function (cssText) {
  24099. for (var i = 0; i < _shadowDOMSelectorsRe.length; i++) {
  24100. cssText = lang_1.StringWrapper.replaceAll(cssText, _shadowDOMSelectorsRe[i], ' ');
  24101. }
  24102. return cssText;
  24103. };
  24104. // change a selector like 'div' to 'name div'
  24105. ShadowCss.prototype._scopeSelectors = function (cssText, scopeSelector, hostSelector) {
  24106. var _this = this;
  24107. return processRules(cssText, function (rule) {
  24108. var selector = rule.selector;
  24109. var content = rule.content;
  24110. if (rule.selector[0] != '@' || rule.selector.startsWith('@page')) {
  24111. selector =
  24112. _this._scopeSelector(rule.selector, scopeSelector, hostSelector, _this.strictStyling);
  24113. }
  24114. else if (rule.selector.startsWith('@media')) {
  24115. content = _this._scopeSelectors(rule.content, scopeSelector, hostSelector);
  24116. }
  24117. return new CssRule(selector, content);
  24118. });
  24119. };
  24120. ShadowCss.prototype._scopeSelector = function (selector, scopeSelector, hostSelector, strict) {
  24121. var r = [], parts = selector.split(',');
  24122. for (var i = 0; i < parts.length; i++) {
  24123. var p = parts[i];
  24124. p = p.trim();
  24125. if (this._selectorNeedsScoping(p, scopeSelector)) {
  24126. p = strict && !lang_1.StringWrapper.contains(p, _polyfillHostNoCombinator) ?
  24127. this._applyStrictSelectorScope(p, scopeSelector) :
  24128. this._applySelectorScope(p, scopeSelector, hostSelector);
  24129. }
  24130. r.push(p);
  24131. }
  24132. return r.join(', ');
  24133. };
  24134. ShadowCss.prototype._selectorNeedsScoping = function (selector, scopeSelector) {
  24135. var re = this._makeScopeMatcher(scopeSelector);
  24136. return !lang_1.isPresent(lang_1.RegExpWrapper.firstMatch(re, selector));
  24137. };
  24138. ShadowCss.prototype._makeScopeMatcher = function (scopeSelector) {
  24139. var lre = /\[/g;
  24140. var rre = /\]/g;
  24141. scopeSelector = lang_1.StringWrapper.replaceAll(scopeSelector, lre, '\\[');
  24142. scopeSelector = lang_1.StringWrapper.replaceAll(scopeSelector, rre, '\\]');
  24143. return lang_1.RegExpWrapper.create('^(' + scopeSelector + ')' + _selectorReSuffix, 'm');
  24144. };
  24145. ShadowCss.prototype._applySelectorScope = function (selector, scopeSelector, hostSelector) {
  24146. // Difference from webcomponentsjs: scopeSelector could not be an array
  24147. return this._applySimpleSelectorScope(selector, scopeSelector, hostSelector);
  24148. };
  24149. // scope via name and [is=name]
  24150. ShadowCss.prototype._applySimpleSelectorScope = function (selector, scopeSelector, hostSelector) {
  24151. if (lang_1.isPresent(lang_1.RegExpWrapper.firstMatch(_polyfillHostRe, selector))) {
  24152. var replaceBy = this.strictStyling ? "[" + hostSelector + "]" : scopeSelector;
  24153. selector = lang_1.StringWrapper.replace(selector, _polyfillHostNoCombinator, replaceBy);
  24154. return lang_1.StringWrapper.replaceAll(selector, _polyfillHostRe, replaceBy + ' ');
  24155. }
  24156. else {
  24157. return scopeSelector + ' ' + selector;
  24158. }
  24159. };
  24160. // return a selector with [name] suffix on each simple selector
  24161. // e.g. .foo.bar > .zot becomes .foo[name].bar[name] > .zot[name] /** @internal */
  24162. ShadowCss.prototype._applyStrictSelectorScope = function (selector, scopeSelector) {
  24163. var isRe = /\[is=([^\]]*)\]/g;
  24164. scopeSelector = lang_1.StringWrapper.replaceAllMapped(scopeSelector, isRe, function (m) { return m[1]; });
  24165. var splits = [' ', '>', '+', '~'], scoped = selector, attrName = '[' + scopeSelector + ']';
  24166. for (var i = 0; i < splits.length; i++) {
  24167. var sep = splits[i];
  24168. var parts = scoped.split(sep);
  24169. scoped = parts.map(function (p) {
  24170. // remove :host since it should be unnecessary
  24171. var t = lang_1.StringWrapper.replaceAll(p.trim(), _polyfillHostRe, '');
  24172. if (t.length > 0 && !collection_1.ListWrapper.contains(splits, t) &&
  24173. !lang_1.StringWrapper.contains(t, attrName)) {
  24174. var re = /([^:]*)(:*)(.*)/g;
  24175. var m = lang_1.RegExpWrapper.firstMatch(re, t);
  24176. if (lang_1.isPresent(m)) {
  24177. p = m[1] + attrName + m[2] + m[3];
  24178. }
  24179. }
  24180. return p;
  24181. })
  24182. .join(sep);
  24183. }
  24184. return scoped;
  24185. };
  24186. ShadowCss.prototype._insertPolyfillHostInCssText = function (selector) {
  24187. selector = lang_1.StringWrapper.replaceAll(selector, _colonHostContextRe, _polyfillHostContext);
  24188. selector = lang_1.StringWrapper.replaceAll(selector, _colonHostRe, _polyfillHost);
  24189. return selector;
  24190. };
  24191. return ShadowCss;
  24192. })();
  24193. exports.ShadowCss = ShadowCss;
  24194. var _cssContentNextSelectorRe = /polyfill-next-selector[^}]*content:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim;
  24195. var _cssContentRuleRe = /(polyfill-rule)[^}]*(content:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim;
  24196. var _cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim;
  24197. var _polyfillHost = '-shadowcsshost';
  24198. // note: :host-context pre-processed to -shadowcsshostcontext.
  24199. var _polyfillHostContext = '-shadowcsscontext';
  24200. var _parenSuffix = ')(?:\\((' +
  24201. '(?:\\([^)(]*\\)|[^)(]*)+?' +
  24202. ')\\))?([^,{]*)';
  24203. var _cssColonHostRe = lang_1.RegExpWrapper.create('(' + _polyfillHost + _parenSuffix, 'im');
  24204. var _cssColonHostContextRe = lang_1.RegExpWrapper.create('(' + _polyfillHostContext + _parenSuffix, 'im');
  24205. var _polyfillHostNoCombinator = _polyfillHost + '-no-combinator';
  24206. var _shadowDOMSelectorsRe = [
  24207. />>>/g,
  24208. /::shadow/g,
  24209. /::content/g,
  24210. // Deprecated selectors
  24211. // TODO(vicb): see https://github.com/angular/clang-format/issues/16
  24212. // clang-format off
  24213. /\/deep\//g,
  24214. /\/shadow-deep\//g,
  24215. /\/shadow\//g,
  24216. ];
  24217. var _selectorReSuffix = '([>\\s~+\[.,{:][\\s\\S]*)?$';
  24218. var _polyfillHostRe = lang_1.RegExpWrapper.create(_polyfillHost, 'im');
  24219. var _colonHostRe = /:host/gim;
  24220. var _colonHostContextRe = /:host-context/gim;
  24221. var _commentRe = /\/\*[\s\S]*?\*\//g;
  24222. function stripComments(input) {
  24223. return lang_1.StringWrapper.replaceAllMapped(input, _commentRe, function (_) { return ''; });
  24224. }
  24225. var _ruleRe = /(\s*)([^;\{\}]+?)(\s*)((?:{%BLOCK%}?\s*;?)|(?:\s*;))/g;
  24226. var _curlyRe = /([{}])/g;
  24227. var OPEN_CURLY = '{';
  24228. var CLOSE_CURLY = '}';
  24229. var BLOCK_PLACEHOLDER = '%BLOCK%';
  24230. var CssRule = (function () {
  24231. function CssRule(selector, content) {
  24232. this.selector = selector;
  24233. this.content = content;
  24234. }
  24235. return CssRule;
  24236. })();
  24237. exports.CssRule = CssRule;
  24238. function processRules(input, ruleCallback) {
  24239. var inputWithEscapedBlocks = escapeBlocks(input);
  24240. var nextBlockIndex = 0;
  24241. return lang_1.StringWrapper.replaceAllMapped(inputWithEscapedBlocks.escapedString, _ruleRe, function (m) {
  24242. var selector = m[2];
  24243. var content = '';
  24244. var suffix = m[4];
  24245. var contentPrefix = '';
  24246. if (lang_1.isPresent(m[4]) && m[4].startsWith('{' + BLOCK_PLACEHOLDER)) {
  24247. content = inputWithEscapedBlocks.blocks[nextBlockIndex++];
  24248. suffix = m[4].substring(BLOCK_PLACEHOLDER.length + 1);
  24249. contentPrefix = '{';
  24250. }
  24251. var rule = ruleCallback(new CssRule(selector, content));
  24252. return "" + m[1] + rule.selector + m[3] + contentPrefix + rule.content + suffix;
  24253. });
  24254. }
  24255. exports.processRules = processRules;
  24256. var StringWithEscapedBlocks = (function () {
  24257. function StringWithEscapedBlocks(escapedString, blocks) {
  24258. this.escapedString = escapedString;
  24259. this.blocks = blocks;
  24260. }
  24261. return StringWithEscapedBlocks;
  24262. })();
  24263. function escapeBlocks(input) {
  24264. var inputParts = lang_1.StringWrapper.split(input, _curlyRe);
  24265. var resultParts = [];
  24266. var escapedBlocks = [];
  24267. var bracketCount = 0;
  24268. var currentBlockParts = [];
  24269. for (var partIndex = 0; partIndex < inputParts.length; partIndex++) {
  24270. var part = inputParts[partIndex];
  24271. if (part == CLOSE_CURLY) {
  24272. bracketCount--;
  24273. }
  24274. if (bracketCount > 0) {
  24275. currentBlockParts.push(part);
  24276. }
  24277. else {
  24278. if (currentBlockParts.length > 0) {
  24279. escapedBlocks.push(currentBlockParts.join(''));
  24280. resultParts.push(BLOCK_PLACEHOLDER);
  24281. currentBlockParts = [];
  24282. }
  24283. resultParts.push(part);
  24284. }
  24285. if (part == OPEN_CURLY) {
  24286. bracketCount++;
  24287. }
  24288. }
  24289. if (currentBlockParts.length > 0) {
  24290. escapedBlocks.push(currentBlockParts.join(''));
  24291. resultParts.push(BLOCK_PLACEHOLDER);
  24292. }
  24293. return new StringWithEscapedBlocks(resultParts.join(''), escapedBlocks);
  24294. }
  24295. /***/ },
  24296. /* 163 */
  24297. /***/ function(module, exports, __webpack_require__) {
  24298. // Some of the code comes from WebComponents.JS
  24299. // https://github.com/webcomponents/webcomponentsjs/blob/master/src/HTMLImports/path.js
  24300. var lang_1 = __webpack_require__(5);
  24301. var StyleWithImports = (function () {
  24302. function StyleWithImports(style, styleUrls) {
  24303. this.style = style;
  24304. this.styleUrls = styleUrls;
  24305. }
  24306. return StyleWithImports;
  24307. })();
  24308. exports.StyleWithImports = StyleWithImports;
  24309. function isStyleUrlResolvable(url) {
  24310. if (lang_1.isBlank(url) || url.length === 0 || url[0] == '/')
  24311. return false;
  24312. var schemeMatch = lang_1.RegExpWrapper.firstMatch(_urlWithSchemaRe, url);
  24313. return lang_1.isBlank(schemeMatch) || schemeMatch[1] == 'package' || schemeMatch[1] == 'asset';
  24314. }
  24315. exports.isStyleUrlResolvable = isStyleUrlResolvable;
  24316. /**
  24317. * Rewrites stylesheets by resolving and removing the @import urls that
  24318. * are either relative or don't have a `package:` scheme
  24319. */
  24320. function extractStyleUrls(resolver, baseUrl, cssText) {
  24321. var foundUrls = [];
  24322. var modifiedCssText = lang_1.StringWrapper.replaceAllMapped(cssText, _cssImportRe, function (m) {
  24323. var url = lang_1.isPresent(m[1]) ? m[1] : m[2];
  24324. if (!isStyleUrlResolvable(url)) {
  24325. // Do not attempt to resolve non-package absolute URLs with URI scheme
  24326. return m[0];
  24327. }
  24328. foundUrls.push(resolver.resolve(baseUrl, url));
  24329. return '';
  24330. });
  24331. return new StyleWithImports(modifiedCssText, foundUrls);
  24332. }
  24333. exports.extractStyleUrls = extractStyleUrls;
  24334. var _cssImportRe = /@import\s+(?:url\()?\s*(?:(?:['"]([^'"]*))|([^;\)\s]*))[^;]*;?/g;
  24335. // TODO: can't use /^[^:/?#.]+:/g due to clang-format bug:
  24336. // https://github.com/angular/angular/issues/4596
  24337. var _urlWithSchemaRe = /^([a-zA-Z\-\+\.]+):/g;
  24338. /***/ },
  24339. /* 164 */
  24340. /***/ function(module, exports, __webpack_require__) {
  24341. var lang_1 = __webpack_require__(5);
  24342. var view_1 = __webpack_require__(165);
  24343. var metadata_1 = __webpack_require__(3);
  24344. var collection_1 = __webpack_require__(12);
  24345. function encapsulateStyles(componentTemplate) {
  24346. var processedStyles = componentTemplate.styles;
  24347. if (componentTemplate.encapsulation === metadata_1.ViewEncapsulation.Emulated) {
  24348. processedStyles = collection_1.ListWrapper.createFixedSize(componentTemplate.styles.length);
  24349. for (var i = 0; i < componentTemplate.styles.length; i++) {
  24350. processedStyles[i] = lang_1.StringWrapper.replaceAll(componentTemplate.styles[i], COMPONENT_REGEX, componentTemplate.shortId);
  24351. }
  24352. }
  24353. return processedStyles;
  24354. }
  24355. exports.encapsulateStyles = encapsulateStyles;
  24356. function createRenderView(componentTemplate, cmds, inplaceElement, nodeFactory) {
  24357. var view;
  24358. var eventDispatcher = function (boundElementIndex, eventName, event) {
  24359. return view.dispatchRenderEvent(boundElementIndex, eventName, event);
  24360. };
  24361. var context = new BuildContext(eventDispatcher, nodeFactory, inplaceElement);
  24362. context.build(componentTemplate, cmds);
  24363. var fragments = [];
  24364. for (var i = 0; i < context.fragments.length; i++) {
  24365. fragments.push(new view_1.DefaultRenderFragmentRef(context.fragments[i]));
  24366. }
  24367. view = new view_1.DefaultRenderView(fragments, context.boundTextNodes, context.boundElements, context.nativeShadowRoots, context.globalEventAdders, context.rootContentInsertionPoints);
  24368. return view;
  24369. }
  24370. exports.createRenderView = createRenderView;
  24371. var BuildContext = (function () {
  24372. function BuildContext(_eventDispatcher, factory, _inplaceElement) {
  24373. this._eventDispatcher = _eventDispatcher;
  24374. this.factory = factory;
  24375. this._inplaceElement = _inplaceElement;
  24376. this._builders = [];
  24377. this.globalEventAdders = [];
  24378. this.boundElements = [];
  24379. this.boundTextNodes = [];
  24380. this.nativeShadowRoots = [];
  24381. this.fragments = [];
  24382. this.rootContentInsertionPoints = [];
  24383. this.componentCount = 0;
  24384. this.isHost = lang_1.isPresent((_inplaceElement));
  24385. }
  24386. BuildContext.prototype.build = function (template, cmds) {
  24387. this.enqueueRootBuilder(template, cmds);
  24388. this._build(this._builders[0]);
  24389. };
  24390. BuildContext.prototype._build = function (builder) {
  24391. this._builders = [];
  24392. builder.build(this);
  24393. var enqueuedBuilders = this._builders;
  24394. for (var i = 0; i < enqueuedBuilders.length; i++) {
  24395. this._build(enqueuedBuilders[i]);
  24396. }
  24397. };
  24398. BuildContext.prototype.enqueueComponentBuilder = function (component) {
  24399. this.componentCount++;
  24400. this._builders.push(new RenderViewBuilder(component, null, component.template, component.template.commands));
  24401. };
  24402. BuildContext.prototype.enqueueFragmentBuilder = function (parentComponent, parentTemplate, commands) {
  24403. var rootNodes = [];
  24404. this.fragments.push(rootNodes);
  24405. this._builders.push(new RenderViewBuilder(parentComponent, rootNodes, parentTemplate, commands));
  24406. };
  24407. BuildContext.prototype.enqueueRootBuilder = function (template, cmds) {
  24408. var rootNodes = [];
  24409. this.fragments.push(rootNodes);
  24410. this._builders.push(new RenderViewBuilder(null, rootNodes, template, cmds));
  24411. };
  24412. BuildContext.prototype.consumeInplaceElement = function () {
  24413. var result = this._inplaceElement;
  24414. this._inplaceElement = null;
  24415. return result;
  24416. };
  24417. BuildContext.prototype.addEventListener = function (boundElementIndex, target, eventName) {
  24418. if (lang_1.isPresent(target)) {
  24419. var handler = createEventHandler(boundElementIndex, target + ":" + eventName, this._eventDispatcher);
  24420. this.globalEventAdders.push(createGlobalEventAdder(target, eventName, handler, this.factory));
  24421. }
  24422. else {
  24423. var handler = createEventHandler(boundElementIndex, eventName, this._eventDispatcher);
  24424. this.factory.on(this.boundElements[boundElementIndex], eventName, handler);
  24425. }
  24426. };
  24427. return BuildContext;
  24428. })();
  24429. function createEventHandler(boundElementIndex, eventName, eventDispatcher) {
  24430. return function ($event) { return eventDispatcher(boundElementIndex, eventName, $event); };
  24431. }
  24432. function createGlobalEventAdder(target, eventName, eventHandler, nodeFactory) {
  24433. return function () { return nodeFactory.globalOn(target, eventName, eventHandler); };
  24434. }
  24435. var RenderViewBuilder = (function () {
  24436. function RenderViewBuilder(parentComponent, fragmentRootNodes, template, cmds) {
  24437. this.parentComponent = parentComponent;
  24438. this.fragmentRootNodes = fragmentRootNodes;
  24439. this.template = template;
  24440. this.cmds = cmds;
  24441. var rootNodesParent = lang_1.isPresent(fragmentRootNodes) ? null : parentComponent.shadowRoot;
  24442. this.parentStack = [rootNodesParent];
  24443. }
  24444. RenderViewBuilder.prototype.build = function (context) {
  24445. var cmds = this.cmds;
  24446. for (var i = 0; i < cmds.length; i++) {
  24447. cmds[i].visit(this, context);
  24448. }
  24449. };
  24450. Object.defineProperty(RenderViewBuilder.prototype, "parent", {
  24451. get: function () { return this.parentStack[this.parentStack.length - 1]; },
  24452. enumerable: true,
  24453. configurable: true
  24454. });
  24455. RenderViewBuilder.prototype.visitText = function (cmd, context) {
  24456. var text = context.factory.createText(cmd.value);
  24457. this._addChild(text, cmd.ngContentIndex, context);
  24458. if (cmd.isBound) {
  24459. context.boundTextNodes.push(text);
  24460. }
  24461. return null;
  24462. };
  24463. RenderViewBuilder.prototype.visitNgContent = function (cmd, context) {
  24464. if (lang_1.isPresent(this.parentComponent)) {
  24465. if (this.parentComponent.isRoot) {
  24466. var insertionPoint = context.factory.createRootContentInsertionPoint();
  24467. if (this.parent instanceof Component) {
  24468. context.factory.appendChild(this.parent.shadowRoot, insertionPoint);
  24469. }
  24470. else {
  24471. context.factory.appendChild(this.parent, insertionPoint);
  24472. }
  24473. context.rootContentInsertionPoints.push(insertionPoint);
  24474. }
  24475. else {
  24476. var projectedNodes = this.parentComponent.project(cmd.index);
  24477. for (var i = 0; i < projectedNodes.length; i++) {
  24478. var node = projectedNodes[i];
  24479. this._addChild(node, cmd.ngContentIndex, context);
  24480. }
  24481. }
  24482. }
  24483. return null;
  24484. };
  24485. RenderViewBuilder.prototype.visitBeginElement = function (cmd, context) {
  24486. this.parentStack.push(this._beginElement(cmd, context, null));
  24487. return null;
  24488. };
  24489. RenderViewBuilder.prototype.visitEndElement = function (context) {
  24490. this._endElement();
  24491. return null;
  24492. };
  24493. RenderViewBuilder.prototype.visitBeginComponent = function (cmd, context) {
  24494. var templateId = cmd.templateId;
  24495. var tpl = context.factory.resolveComponentTemplate(templateId);
  24496. var el = this._beginElement(cmd, context, tpl);
  24497. var root = el;
  24498. if (tpl.encapsulation === metadata_1.ViewEncapsulation.Native) {
  24499. root = context.factory.createShadowRoot(el, templateId);
  24500. context.nativeShadowRoots.push(root);
  24501. }
  24502. var isRoot = context.componentCount === 0 && context.isHost;
  24503. var component = new Component(el, root, isRoot, tpl);
  24504. context.enqueueComponentBuilder(component);
  24505. this.parentStack.push(component);
  24506. return null;
  24507. };
  24508. RenderViewBuilder.prototype.visitEndComponent = function (context) {
  24509. this._endElement();
  24510. return null;
  24511. };
  24512. RenderViewBuilder.prototype.visitEmbeddedTemplate = function (cmd, context) {
  24513. var el = context.factory.createTemplateAnchor(cmd.attrNameAndValues);
  24514. this._addChild(el, cmd.ngContentIndex, context);
  24515. context.boundElements.push(el);
  24516. if (cmd.isMerged) {
  24517. context.enqueueFragmentBuilder(this.parentComponent, this.template, cmd.children);
  24518. }
  24519. return null;
  24520. };
  24521. RenderViewBuilder.prototype._beginElement = function (cmd, context, componentTemplate) {
  24522. var el = context.consumeInplaceElement();
  24523. var attrNameAndValues = cmd.attrNameAndValues;
  24524. var templateEmulatedEncapsulation = this.template.encapsulation === metadata_1.ViewEncapsulation.Emulated;
  24525. var componentEmulatedEncapsulation = lang_1.isPresent(componentTemplate) &&
  24526. componentTemplate.encapsulation === metadata_1.ViewEncapsulation.Emulated;
  24527. var newAttrLength = attrNameAndValues.length + (templateEmulatedEncapsulation ? 2 : 0) +
  24528. (componentEmulatedEncapsulation ? 2 : 0);
  24529. if (newAttrLength > attrNameAndValues.length) {
  24530. // Note: Need to clone attrNameAndValues to make it writable!
  24531. var newAttrNameAndValues = collection_1.ListWrapper.createFixedSize(newAttrLength);
  24532. var attrIndex;
  24533. for (attrIndex = 0; attrIndex < attrNameAndValues.length; attrIndex++) {
  24534. newAttrNameAndValues[attrIndex] = attrNameAndValues[attrIndex];
  24535. }
  24536. if (templateEmulatedEncapsulation) {
  24537. newAttrNameAndValues[attrIndex++] = _shimContentAttribute(this.template.shortId);
  24538. newAttrNameAndValues[attrIndex++] = '';
  24539. }
  24540. if (componentEmulatedEncapsulation) {
  24541. newAttrNameAndValues[attrIndex++] = _shimHostAttribute(componentTemplate.shortId);
  24542. newAttrNameAndValues[attrIndex++] = '';
  24543. }
  24544. attrNameAndValues = newAttrNameAndValues;
  24545. }
  24546. if (lang_1.isPresent(el)) {
  24547. context.factory.mergeElement(el, attrNameAndValues);
  24548. this.fragmentRootNodes.push(el);
  24549. }
  24550. else {
  24551. el = context.factory.createElement(cmd.name, attrNameAndValues);
  24552. this._addChild(el, cmd.ngContentIndex, context);
  24553. }
  24554. if (cmd.isBound) {
  24555. var boundElementIndex = context.boundElements.length;
  24556. context.boundElements.push(el);
  24557. for (var i = 0; i < cmd.eventTargetAndNames.length; i += 2) {
  24558. var target = cmd.eventTargetAndNames[i];
  24559. var eventName = cmd.eventTargetAndNames[i + 1];
  24560. context.addEventListener(boundElementIndex, target, eventName);
  24561. }
  24562. }
  24563. return el;
  24564. };
  24565. RenderViewBuilder.prototype._endElement = function () { this.parentStack.pop(); };
  24566. RenderViewBuilder.prototype._addChild = function (node, ngContentIndex, context) {
  24567. var parent = this.parent;
  24568. if (lang_1.isPresent(parent)) {
  24569. if (parent instanceof Component) {
  24570. parent.addContentNode(ngContentIndex, node, context);
  24571. }
  24572. else {
  24573. context.factory.appendChild(parent, node);
  24574. }
  24575. }
  24576. else {
  24577. this.fragmentRootNodes.push(node);
  24578. }
  24579. };
  24580. return RenderViewBuilder;
  24581. })();
  24582. var Component = (function () {
  24583. function Component(hostElement, shadowRoot, isRoot, template) {
  24584. this.hostElement = hostElement;
  24585. this.shadowRoot = shadowRoot;
  24586. this.isRoot = isRoot;
  24587. this.template = template;
  24588. this.contentNodesByNgContentIndex = [];
  24589. }
  24590. Component.prototype.addContentNode = function (ngContentIndex, node, context) {
  24591. if (lang_1.isBlank(ngContentIndex)) {
  24592. if (this.template.encapsulation === metadata_1.ViewEncapsulation.Native) {
  24593. context.factory.appendChild(this.hostElement, node);
  24594. }
  24595. }
  24596. else {
  24597. while (this.contentNodesByNgContentIndex.length <= ngContentIndex) {
  24598. this.contentNodesByNgContentIndex.push([]);
  24599. }
  24600. this.contentNodesByNgContentIndex[ngContentIndex].push(node);
  24601. }
  24602. };
  24603. Component.prototype.project = function (ngContentIndex) {
  24604. return ngContentIndex < this.contentNodesByNgContentIndex.length ?
  24605. this.contentNodesByNgContentIndex[ngContentIndex] :
  24606. [];
  24607. };
  24608. return Component;
  24609. })();
  24610. var COMPONENT_REGEX = /%COMP%/g;
  24611. exports.COMPONENT_VARIABLE = '%COMP%';
  24612. exports.HOST_ATTR = "_nghost-" + exports.COMPONENT_VARIABLE;
  24613. exports.CONTENT_ATTR = "_ngcontent-" + exports.COMPONENT_VARIABLE;
  24614. function _shimContentAttribute(componentShortId) {
  24615. return lang_1.StringWrapper.replaceAll(exports.CONTENT_ATTR, COMPONENT_REGEX, componentShortId);
  24616. }
  24617. function _shimHostAttribute(componentShortId) {
  24618. return lang_1.StringWrapper.replaceAll(exports.HOST_ATTR, COMPONENT_REGEX, componentShortId);
  24619. }
  24620. /***/ },
  24621. /* 165 */
  24622. /***/ function(module, exports, __webpack_require__) {
  24623. var __extends = (this && this.__extends) || function (d, b) {
  24624. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  24625. function __() { this.constructor = d; }
  24626. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  24627. };
  24628. var exceptions_1 = __webpack_require__(14);
  24629. var collection_1 = __webpack_require__(12);
  24630. var lang_1 = __webpack_require__(5);
  24631. var api_1 = __webpack_require__(72);
  24632. var DefaultProtoViewRef = (function (_super) {
  24633. __extends(DefaultProtoViewRef, _super);
  24634. function DefaultProtoViewRef(template, cmds) {
  24635. _super.call(this);
  24636. this.template = template;
  24637. this.cmds = cmds;
  24638. }
  24639. return DefaultProtoViewRef;
  24640. })(api_1.RenderProtoViewRef);
  24641. exports.DefaultProtoViewRef = DefaultProtoViewRef;
  24642. var DefaultRenderFragmentRef = (function (_super) {
  24643. __extends(DefaultRenderFragmentRef, _super);
  24644. function DefaultRenderFragmentRef(nodes) {
  24645. _super.call(this);
  24646. this.nodes = nodes;
  24647. }
  24648. return DefaultRenderFragmentRef;
  24649. })(api_1.RenderFragmentRef);
  24650. exports.DefaultRenderFragmentRef = DefaultRenderFragmentRef;
  24651. var DefaultRenderView = (function (_super) {
  24652. __extends(DefaultRenderView, _super);
  24653. function DefaultRenderView(fragments, boundTextNodes, boundElements, nativeShadowRoots, globalEventAdders, rootContentInsertionPoints) {
  24654. _super.call(this);
  24655. this.fragments = fragments;
  24656. this.boundTextNodes = boundTextNodes;
  24657. this.boundElements = boundElements;
  24658. this.nativeShadowRoots = nativeShadowRoots;
  24659. this.globalEventAdders = globalEventAdders;
  24660. this.rootContentInsertionPoints = rootContentInsertionPoints;
  24661. this.hydrated = false;
  24662. this.eventDispatcher = null;
  24663. this.globalEventRemovers = null;
  24664. }
  24665. DefaultRenderView.prototype.hydrate = function () {
  24666. if (this.hydrated)
  24667. throw new exceptions_1.BaseException('The view is already hydrated.');
  24668. this.hydrated = true;
  24669. this.globalEventRemovers = collection_1.ListWrapper.createFixedSize(this.globalEventAdders.length);
  24670. for (var i = 0; i < this.globalEventAdders.length; i++) {
  24671. this.globalEventRemovers[i] = this.globalEventAdders[i]();
  24672. }
  24673. };
  24674. DefaultRenderView.prototype.dehydrate = function () {
  24675. if (!this.hydrated)
  24676. throw new exceptions_1.BaseException('The view is already dehydrated.');
  24677. for (var i = 0; i < this.globalEventRemovers.length; i++) {
  24678. this.globalEventRemovers[i]();
  24679. }
  24680. this.globalEventRemovers = null;
  24681. this.hydrated = false;
  24682. };
  24683. DefaultRenderView.prototype.setEventDispatcher = function (dispatcher) { this.eventDispatcher = dispatcher; };
  24684. DefaultRenderView.prototype.dispatchRenderEvent = function (boundElementIndex, eventName, event) {
  24685. var allowDefaultBehavior = true;
  24686. if (lang_1.isPresent(this.eventDispatcher)) {
  24687. var locals = new collection_1.Map();
  24688. locals.set('$event', event);
  24689. allowDefaultBehavior =
  24690. this.eventDispatcher.dispatchRenderEvent(boundElementIndex, eventName, locals);
  24691. }
  24692. return allowDefaultBehavior;
  24693. };
  24694. return DefaultRenderView;
  24695. })(api_1.RenderViewRef);
  24696. exports.DefaultRenderView = DefaultRenderView;
  24697. /***/ },
  24698. /* 166 */
  24699. /***/ function(module, exports, __webpack_require__) {
  24700. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  24701. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  24702. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  24703. 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;
  24704. return c > 3 && r && Object.defineProperty(target, key, r), r;
  24705. };
  24706. var __metadata = (this && this.__metadata) || function (k, v) {
  24707. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  24708. };
  24709. var lang_1 = __webpack_require__(5);
  24710. var collection_1 = __webpack_require__(12);
  24711. var template_commands_1 = __webpack_require__(96);
  24712. var template_ast_1 = __webpack_require__(159);
  24713. var source_module_1 = __webpack_require__(156);
  24714. var util_1 = __webpack_require__(155);
  24715. var di_1 = __webpack_require__(6);
  24716. exports.TEMPLATE_COMMANDS_MODULE_REF = source_module_1.moduleRef("package:angular2/src/core/linker/template_commands" + util_1.MODULE_SUFFIX);
  24717. var IMPLICIT_TEMPLATE_VAR = '\$implicit';
  24718. var CLASS_ATTR = 'class';
  24719. var STYLE_ATTR = 'style';
  24720. var CommandCompiler = (function () {
  24721. function CommandCompiler() {
  24722. }
  24723. CommandCompiler.prototype.compileComponentRuntime = function (component, template, changeDetectorFactories, componentTemplateFactory) {
  24724. var visitor = new CommandBuilderVisitor(new RuntimeCommandFactory(component, componentTemplateFactory, changeDetectorFactories), 0);
  24725. template_ast_1.templateVisitAll(visitor, template);
  24726. return visitor.result;
  24727. };
  24728. CommandCompiler.prototype.compileComponentCodeGen = function (component, template, changeDetectorFactoryExpressions, componentTemplateFactory) {
  24729. var visitor = new CommandBuilderVisitor(new CodegenCommandFactory(component, componentTemplateFactory, changeDetectorFactoryExpressions), 0);
  24730. template_ast_1.templateVisitAll(visitor, template);
  24731. return new source_module_1.SourceExpression([], codeGenArray(visitor.result));
  24732. };
  24733. CommandCompiler = __decorate([
  24734. di_1.Injectable(),
  24735. __metadata('design:paramtypes', [])
  24736. ], CommandCompiler);
  24737. return CommandCompiler;
  24738. })();
  24739. exports.CommandCompiler = CommandCompiler;
  24740. var RuntimeCommandFactory = (function () {
  24741. function RuntimeCommandFactory(component, componentTemplateFactory, changeDetectorFactories) {
  24742. this.component = component;
  24743. this.componentTemplateFactory = componentTemplateFactory;
  24744. this.changeDetectorFactories = changeDetectorFactories;
  24745. }
  24746. RuntimeCommandFactory.prototype._mapDirectives = function (directives) {
  24747. return directives.map(function (directive) { return directive.type.runtime; });
  24748. };
  24749. RuntimeCommandFactory.prototype.createText = function (value, isBound, ngContentIndex) {
  24750. return new template_commands_1.TextCmd(value, isBound, ngContentIndex);
  24751. };
  24752. RuntimeCommandFactory.prototype.createNgContent = function (index, ngContentIndex) {
  24753. return new template_commands_1.NgContentCmd(index, ngContentIndex);
  24754. };
  24755. RuntimeCommandFactory.prototype.createBeginElement = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, isBound, ngContentIndex) {
  24756. return new template_commands_1.BeginElementCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, this._mapDirectives(directives), isBound, ngContentIndex);
  24757. };
  24758. RuntimeCommandFactory.prototype.createEndElement = function () { return new template_commands_1.EndElementCmd(); };
  24759. RuntimeCommandFactory.prototype.createBeginComponent = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, encapsulation, ngContentIndex) {
  24760. var nestedTemplateAccessor = this.componentTemplateFactory(directives[0]);
  24761. return new template_commands_1.BeginComponentCmd(name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, this._mapDirectives(directives), encapsulation, ngContentIndex, nestedTemplateAccessor);
  24762. };
  24763. RuntimeCommandFactory.prototype.createEndComponent = function () { return new template_commands_1.EndComponentCmd(); };
  24764. RuntimeCommandFactory.prototype.createEmbeddedTemplate = function (embeddedTemplateIndex, attrNameAndValues, variableNameAndValues, directives, isMerged, ngContentIndex, children) {
  24765. return new template_commands_1.EmbeddedTemplateCmd(attrNameAndValues, variableNameAndValues, this._mapDirectives(directives), isMerged, ngContentIndex, this.changeDetectorFactories[embeddedTemplateIndex], children);
  24766. };
  24767. return RuntimeCommandFactory;
  24768. })();
  24769. var CodegenCommandFactory = (function () {
  24770. function CodegenCommandFactory(component, componentTemplateFactory, changeDetectorFactoryExpressions) {
  24771. this.component = component;
  24772. this.componentTemplateFactory = componentTemplateFactory;
  24773. this.changeDetectorFactoryExpressions = changeDetectorFactoryExpressions;
  24774. }
  24775. CodegenCommandFactory.prototype.createText = function (value, isBound, ngContentIndex) {
  24776. return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'TextCmd') + "(" + util_1.escapeSingleQuoteString(value) + ", " + isBound + ", " + ngContentIndex + ")");
  24777. };
  24778. CodegenCommandFactory.prototype.createNgContent = function (index, ngContentIndex) {
  24779. return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'NgContentCmd') + "(" + index + ", " + ngContentIndex + ")");
  24780. };
  24781. CodegenCommandFactory.prototype.createBeginElement = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, isBound, ngContentIndex) {
  24782. var attrsExpression = codeGenArray(attrNameAndValues);
  24783. return new Expression((util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'BeginElementCmd') + "(" + util_1.escapeSingleQuoteString(name) + ", " + attrsExpression + ", ") +
  24784. (codeGenArray(eventTargetAndNames) + ", " + codeGenArray(variableNameAndValues) + ", " + codeGenDirectivesArray(directives) + ", " + isBound + ", " + ngContentIndex + ")"));
  24785. };
  24786. CodegenCommandFactory.prototype.createEndElement = function () {
  24787. return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'EndElementCmd') + "()");
  24788. };
  24789. CodegenCommandFactory.prototype.createBeginComponent = function (name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, encapsulation, ngContentIndex) {
  24790. var attrsExpression = codeGenArray(attrNameAndValues);
  24791. return new Expression((util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'BeginComponentCmd') + "(" + util_1.escapeSingleQuoteString(name) + ", " + attrsExpression + ", ") +
  24792. (codeGenArray(eventTargetAndNames) + ", " + codeGenArray(variableNameAndValues) + ", " + codeGenDirectivesArray(directives) + ", " + codeGenViewEncapsulation(encapsulation) + ", " + ngContentIndex + ", " + this.componentTemplateFactory(directives[0]) + ")"));
  24793. };
  24794. CodegenCommandFactory.prototype.createEndComponent = function () {
  24795. return new Expression(util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'EndComponentCmd') + "()");
  24796. };
  24797. CodegenCommandFactory.prototype.createEmbeddedTemplate = function (embeddedTemplateIndex, attrNameAndValues, variableNameAndValues, directives, isMerged, ngContentIndex, children) {
  24798. return new Expression((util_1.codeGenConstConstructorCall(exports.TEMPLATE_COMMANDS_MODULE_REF + 'EmbeddedTemplateCmd') + "(" + codeGenArray(attrNameAndValues) + ", " + codeGenArray(variableNameAndValues) + ", ") +
  24799. (codeGenDirectivesArray(directives) + ", " + isMerged + ", " + ngContentIndex + ", " + this.changeDetectorFactoryExpressions[embeddedTemplateIndex] + ", " + codeGenArray(children) + ")"));
  24800. };
  24801. return CodegenCommandFactory;
  24802. })();
  24803. function visitAndReturnContext(visitor, asts, context) {
  24804. template_ast_1.templateVisitAll(visitor, asts, context);
  24805. return context;
  24806. }
  24807. var CommandBuilderVisitor = (function () {
  24808. function CommandBuilderVisitor(commandFactory, embeddedTemplateIndex) {
  24809. this.commandFactory = commandFactory;
  24810. this.embeddedTemplateIndex = embeddedTemplateIndex;
  24811. this.result = [];
  24812. this.transitiveNgContentCount = 0;
  24813. }
  24814. CommandBuilderVisitor.prototype._readAttrNameAndValues = function (directives, attrAsts) {
  24815. var attrs = keyValueArrayToMap(visitAndReturnContext(this, attrAsts, []));
  24816. directives.forEach(function (directiveMeta) {
  24817. collection_1.StringMapWrapper.forEach(directiveMeta.hostAttributes, function (value, name) {
  24818. var prevValue = attrs[name];
  24819. attrs[name] = lang_1.isPresent(prevValue) ? mergeAttributeValue(name, prevValue, value) : value;
  24820. });
  24821. });
  24822. return mapToKeyValueArray(attrs);
  24823. };
  24824. CommandBuilderVisitor.prototype.visitNgContent = function (ast, context) {
  24825. this.transitiveNgContentCount++;
  24826. this.result.push(this.commandFactory.createNgContent(ast.index, ast.ngContentIndex));
  24827. return null;
  24828. };
  24829. CommandBuilderVisitor.prototype.visitEmbeddedTemplate = function (ast, context) {
  24830. var _this = this;
  24831. this.embeddedTemplateIndex++;
  24832. var childVisitor = new CommandBuilderVisitor(this.commandFactory, this.embeddedTemplateIndex);
  24833. template_ast_1.templateVisitAll(childVisitor, ast.children);
  24834. var isMerged = childVisitor.transitiveNgContentCount > 0;
  24835. var variableNameAndValues = [];
  24836. ast.vars.forEach(function (varAst) {
  24837. variableNameAndValues.push(varAst.name);
  24838. variableNameAndValues.push(varAst.value.length > 0 ? varAst.value : IMPLICIT_TEMPLATE_VAR);
  24839. });
  24840. var directives = [];
  24841. collection_1.ListWrapper.forEachWithIndex(ast.directives, function (directiveAst, index) {
  24842. directiveAst.visit(_this, new DirectiveContext(index, [], [], directives));
  24843. });
  24844. this.result.push(this.commandFactory.createEmbeddedTemplate(this.embeddedTemplateIndex, this._readAttrNameAndValues(directives, ast.attrs), variableNameAndValues, directives, isMerged, ast.ngContentIndex, childVisitor.result));
  24845. this.transitiveNgContentCount += childVisitor.transitiveNgContentCount;
  24846. this.embeddedTemplateIndex = childVisitor.embeddedTemplateIndex;
  24847. return null;
  24848. };
  24849. CommandBuilderVisitor.prototype.visitElement = function (ast, context) {
  24850. var _this = this;
  24851. var component = ast.getComponent();
  24852. var eventTargetAndNames = visitAndReturnContext(this, ast.outputs, []);
  24853. var variableNameAndValues = [];
  24854. if (lang_1.isBlank(component)) {
  24855. ast.exportAsVars.forEach(function (varAst) {
  24856. variableNameAndValues.push(varAst.name);
  24857. variableNameAndValues.push(null);
  24858. });
  24859. }
  24860. var directives = [];
  24861. collection_1.ListWrapper.forEachWithIndex(ast.directives, function (directiveAst, index) {
  24862. directiveAst.visit(_this, new DirectiveContext(index, eventTargetAndNames, variableNameAndValues, directives));
  24863. });
  24864. eventTargetAndNames = removeKeyValueArrayDuplicates(eventTargetAndNames);
  24865. var attrNameAndValues = this._readAttrNameAndValues(directives, ast.attrs);
  24866. if (lang_1.isPresent(component)) {
  24867. this.result.push(this.commandFactory.createBeginComponent(ast.name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, component.template.encapsulation, ast.ngContentIndex));
  24868. template_ast_1.templateVisitAll(this, ast.children);
  24869. this.result.push(this.commandFactory.createEndComponent());
  24870. }
  24871. else {
  24872. this.result.push(this.commandFactory.createBeginElement(ast.name, attrNameAndValues, eventTargetAndNames, variableNameAndValues, directives, ast.isBound(), ast.ngContentIndex));
  24873. template_ast_1.templateVisitAll(this, ast.children);
  24874. this.result.push(this.commandFactory.createEndElement());
  24875. }
  24876. return null;
  24877. };
  24878. CommandBuilderVisitor.prototype.visitVariable = function (ast, ctx) { return null; };
  24879. CommandBuilderVisitor.prototype.visitAttr = function (ast, attrNameAndValues) {
  24880. attrNameAndValues.push(ast.name);
  24881. attrNameAndValues.push(ast.value);
  24882. return null;
  24883. };
  24884. CommandBuilderVisitor.prototype.visitBoundText = function (ast, context) {
  24885. this.result.push(this.commandFactory.createText(null, true, ast.ngContentIndex));
  24886. return null;
  24887. };
  24888. CommandBuilderVisitor.prototype.visitText = function (ast, context) {
  24889. this.result.push(this.commandFactory.createText(ast.value, false, ast.ngContentIndex));
  24890. return null;
  24891. };
  24892. CommandBuilderVisitor.prototype.visitDirective = function (ast, ctx) {
  24893. ctx.targetDirectives.push(ast.directive);
  24894. template_ast_1.templateVisitAll(this, ast.hostEvents, ctx.eventTargetAndNames);
  24895. ast.exportAsVars.forEach(function (varAst) {
  24896. ctx.targetVariableNameAndValues.push(varAst.name);
  24897. ctx.targetVariableNameAndValues.push(ctx.index);
  24898. });
  24899. return null;
  24900. };
  24901. CommandBuilderVisitor.prototype.visitEvent = function (ast, eventTargetAndNames) {
  24902. eventTargetAndNames.push(ast.target);
  24903. eventTargetAndNames.push(ast.name);
  24904. return null;
  24905. };
  24906. CommandBuilderVisitor.prototype.visitDirectiveProperty = function (ast, context) { return null; };
  24907. CommandBuilderVisitor.prototype.visitElementProperty = function (ast, context) { return null; };
  24908. return CommandBuilderVisitor;
  24909. })();
  24910. function removeKeyValueArrayDuplicates(keyValueArray) {
  24911. var knownPairs = new Set();
  24912. var resultKeyValueArray = [];
  24913. for (var i = 0; i < keyValueArray.length; i += 2) {
  24914. var key = keyValueArray[i];
  24915. var value = keyValueArray[i + 1];
  24916. var pairId = key + ":" + value;
  24917. if (!collection_1.SetWrapper.has(knownPairs, pairId)) {
  24918. resultKeyValueArray.push(key);
  24919. resultKeyValueArray.push(value);
  24920. knownPairs.add(pairId);
  24921. }
  24922. }
  24923. return resultKeyValueArray;
  24924. }
  24925. function keyValueArrayToMap(keyValueArr) {
  24926. var data = {};
  24927. for (var i = 0; i < keyValueArr.length; i += 2) {
  24928. data[keyValueArr[i]] = keyValueArr[i + 1];
  24929. }
  24930. return data;
  24931. }
  24932. function mapToKeyValueArray(data) {
  24933. var entryArray = [];
  24934. collection_1.StringMapWrapper.forEach(data, function (value, name) { entryArray.push([name, value]); });
  24935. // We need to sort to get a defined output order
  24936. // for tests and for caching generated artifacts...
  24937. collection_1.ListWrapper.sort(entryArray, function (entry1, entry2) { return lang_1.StringWrapper.compare(entry1[0], entry2[0]); });
  24938. var keyValueArray = [];
  24939. entryArray.forEach(function (entry) {
  24940. keyValueArray.push(entry[0]);
  24941. keyValueArray.push(entry[1]);
  24942. });
  24943. return keyValueArray;
  24944. }
  24945. function mergeAttributeValue(attrName, attrValue1, attrValue2) {
  24946. if (attrName == CLASS_ATTR || attrName == STYLE_ATTR) {
  24947. return attrValue1 + " " + attrValue2;
  24948. }
  24949. else {
  24950. return attrValue2;
  24951. }
  24952. }
  24953. var DirectiveContext = (function () {
  24954. function DirectiveContext(index, eventTargetAndNames, targetVariableNameAndValues, targetDirectives) {
  24955. this.index = index;
  24956. this.eventTargetAndNames = eventTargetAndNames;
  24957. this.targetVariableNameAndValues = targetVariableNameAndValues;
  24958. this.targetDirectives = targetDirectives;
  24959. }
  24960. return DirectiveContext;
  24961. })();
  24962. var Expression = (function () {
  24963. function Expression(value) {
  24964. this.value = value;
  24965. }
  24966. return Expression;
  24967. })();
  24968. function escapeValue(value) {
  24969. if (value instanceof Expression) {
  24970. return value.value;
  24971. }
  24972. else if (lang_1.isString(value)) {
  24973. return util_1.escapeSingleQuoteString(value);
  24974. }
  24975. else if (lang_1.isBlank(value)) {
  24976. return 'null';
  24977. }
  24978. else {
  24979. return "" + value;
  24980. }
  24981. }
  24982. function codeGenArray(data) {
  24983. var base = "[" + data.map(escapeValue).join(',') + "]";
  24984. return lang_1.IS_DART ? "const " + base : base;
  24985. }
  24986. function codeGenDirectivesArray(directives) {
  24987. var expressions = directives.map(function (directiveType) { return ("" + source_module_1.moduleRef(directiveType.type.moduleUrl) + directiveType.type.name); });
  24988. var base = "[" + expressions.join(',') + "]";
  24989. return lang_1.IS_DART ? "const " + base : base;
  24990. }
  24991. function codeGenViewEncapsulation(value) {
  24992. if (lang_1.IS_DART) {
  24993. return "" + exports.TEMPLATE_COMMANDS_MODULE_REF + value;
  24994. }
  24995. else {
  24996. return "" + value;
  24997. }
  24998. }
  24999. /***/ },
  25000. /* 167 */
  25001. /***/ function(module, exports, __webpack_require__) {
  25002. var __extends = (this && this.__extends) || function (d, b) {
  25003. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  25004. function __() { this.constructor = d; }
  25005. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  25006. };
  25007. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  25008. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  25009. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  25010. 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;
  25011. return c > 3 && r && Object.defineProperty(target, key, r), r;
  25012. };
  25013. var __metadata = (this && this.__metadata) || function (k, v) {
  25014. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  25015. };
  25016. var __param = (this && this.__param) || function (paramIndex, decorator) {
  25017. return function (target, key) { decorator(target, key, paramIndex); }
  25018. };
  25019. var collection_1 = __webpack_require__(12);
  25020. var lang_1 = __webpack_require__(5);
  25021. var core_1 = __webpack_require__(2);
  25022. var lang_2 = __webpack_require__(5);
  25023. var exceptions_1 = __webpack_require__(14);
  25024. var change_detection_1 = __webpack_require__(25);
  25025. var html_parser_1 = __webpack_require__(168);
  25026. var html_tags_1 = __webpack_require__(172);
  25027. var parse_util_1 = __webpack_require__(171);
  25028. var template_ast_1 = __webpack_require__(159);
  25029. var selector_1 = __webpack_require__(154);
  25030. var element_schema_registry_1 = __webpack_require__(173);
  25031. var template_preparser_1 = __webpack_require__(174);
  25032. var style_url_resolver_1 = __webpack_require__(163);
  25033. var html_ast_1 = __webpack_require__(169);
  25034. var util_1 = __webpack_require__(155);
  25035. // Group 1 = "bind-"
  25036. // Group 2 = "var-" or "#"
  25037. // Group 3 = "on-"
  25038. // Group 4 = "bindon-"
  25039. // Group 5 = the identifier after "bind-", "var-/#", or "on-"
  25040. // Group 6 = idenitifer inside [()]
  25041. // Group 7 = idenitifer inside []
  25042. // Group 8 = identifier inside ()
  25043. var BIND_NAME_REGEXP = /^(?:(?:(?:(bind-)|(var-|#)|(on-)|(bindon-))(.+))|\[\(([^\)]+)\)\]|\[([^\]]+)\]|\(([^\)]+)\))$/g;
  25044. var TEMPLATE_ELEMENT = 'template';
  25045. var TEMPLATE_ATTR = 'template';
  25046. var TEMPLATE_ATTR_PREFIX = '*';
  25047. var CLASS_ATTR = 'class';
  25048. var PROPERTY_PARTS_SEPARATOR = '.';
  25049. var ATTRIBUTE_PREFIX = 'attr';
  25050. var CLASS_PREFIX = 'class';
  25051. var STYLE_PREFIX = 'style';
  25052. var TEXT_CSS_SELECTOR = selector_1.CssSelector.parse('*')[0];
  25053. /**
  25054. * Provides an array of {@link TemplateAstVisitor}s which will be used to transform
  25055. * parsed templates before compilation is invoked, allowing custom expression syntax
  25056. * and other advanced transformations.
  25057. *
  25058. * This is currently an internal-only feature and not meant for general use.
  25059. */
  25060. exports.TEMPLATE_TRANSFORMS = lang_2.CONST_EXPR(new core_1.OpaqueToken('TemplateTransforms'));
  25061. var TemplateParseError = (function (_super) {
  25062. __extends(TemplateParseError, _super);
  25063. function TemplateParseError(message, location) {
  25064. _super.call(this, location, message);
  25065. }
  25066. return TemplateParseError;
  25067. })(parse_util_1.ParseError);
  25068. exports.TemplateParseError = TemplateParseError;
  25069. var TemplateParser = (function () {
  25070. function TemplateParser(_exprParser, _schemaRegistry, _htmlParser, transforms) {
  25071. this._exprParser = _exprParser;
  25072. this._schemaRegistry = _schemaRegistry;
  25073. this._htmlParser = _htmlParser;
  25074. this.transforms = transforms;
  25075. }
  25076. TemplateParser.prototype.parse = function (template, directives, templateUrl) {
  25077. var parseVisitor = new TemplateParseVisitor(directives, this._exprParser, this._schemaRegistry);
  25078. var htmlAstWithErrors = this._htmlParser.parse(template, templateUrl);
  25079. var result = html_ast_1.htmlVisitAll(parseVisitor, htmlAstWithErrors.rootNodes, EMPTY_COMPONENT);
  25080. var errors = htmlAstWithErrors.errors.concat(parseVisitor.errors);
  25081. if (errors.length > 0) {
  25082. var errorString = errors.join('\n');
  25083. throw new exceptions_1.BaseException("Template parse errors:\n" + errorString);
  25084. }
  25085. if (lang_1.isPresent(this.transforms)) {
  25086. this.transforms.forEach(function (transform) { result = template_ast_1.templateVisitAll(transform, result); });
  25087. }
  25088. return result;
  25089. };
  25090. TemplateParser = __decorate([
  25091. core_1.Injectable(),
  25092. __param(3, core_1.Optional()),
  25093. __param(3, core_1.Inject(exports.TEMPLATE_TRANSFORMS)),
  25094. __metadata('design:paramtypes', [change_detection_1.Parser, element_schema_registry_1.ElementSchemaRegistry, html_parser_1.HtmlParser, Array])
  25095. ], TemplateParser);
  25096. return TemplateParser;
  25097. })();
  25098. exports.TemplateParser = TemplateParser;
  25099. var TemplateParseVisitor = (function () {
  25100. function TemplateParseVisitor(directives, _exprParser, _schemaRegistry) {
  25101. var _this = this;
  25102. this._exprParser = _exprParser;
  25103. this._schemaRegistry = _schemaRegistry;
  25104. this.errors = [];
  25105. this.directivesIndex = new Map();
  25106. this.ngContentCount = 0;
  25107. this.selectorMatcher = new selector_1.SelectorMatcher();
  25108. collection_1.ListWrapper.forEachWithIndex(directives, function (directive, index) {
  25109. var selector = selector_1.CssSelector.parse(directive.selector);
  25110. _this.selectorMatcher.addSelectables(selector, directive);
  25111. _this.directivesIndex.set(directive, index);
  25112. });
  25113. }
  25114. TemplateParseVisitor.prototype._reportError = function (message, sourceSpan) {
  25115. this.errors.push(new TemplateParseError(message, sourceSpan.start));
  25116. };
  25117. TemplateParseVisitor.prototype._parseInterpolation = function (value, sourceSpan) {
  25118. var sourceInfo = sourceSpan.start.toString();
  25119. try {
  25120. return this._exprParser.parseInterpolation(value, sourceInfo);
  25121. }
  25122. catch (e) {
  25123. this._reportError("" + e, sourceSpan);
  25124. return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
  25125. }
  25126. };
  25127. TemplateParseVisitor.prototype._parseAction = function (value, sourceSpan) {
  25128. var sourceInfo = sourceSpan.start.toString();
  25129. try {
  25130. return this._exprParser.parseAction(value, sourceInfo);
  25131. }
  25132. catch (e) {
  25133. this._reportError("" + e, sourceSpan);
  25134. return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
  25135. }
  25136. };
  25137. TemplateParseVisitor.prototype._parseBinding = function (value, sourceSpan) {
  25138. var sourceInfo = sourceSpan.start.toString();
  25139. try {
  25140. return this._exprParser.parseBinding(value, sourceInfo);
  25141. }
  25142. catch (e) {
  25143. this._reportError("" + e, sourceSpan);
  25144. return this._exprParser.wrapLiteralPrimitive('ERROR', sourceInfo);
  25145. }
  25146. };
  25147. TemplateParseVisitor.prototype._parseTemplateBindings = function (value, sourceSpan) {
  25148. var sourceInfo = sourceSpan.start.toString();
  25149. try {
  25150. return this._exprParser.parseTemplateBindings(value, sourceInfo);
  25151. }
  25152. catch (e) {
  25153. this._reportError("" + e, sourceSpan);
  25154. return [];
  25155. }
  25156. };
  25157. TemplateParseVisitor.prototype.visitText = function (ast, component) {
  25158. var ngContentIndex = component.findNgContentIndex(TEXT_CSS_SELECTOR);
  25159. var expr = this._parseInterpolation(ast.value, ast.sourceSpan);
  25160. if (lang_1.isPresent(expr)) {
  25161. return new template_ast_1.BoundTextAst(expr, ngContentIndex, ast.sourceSpan);
  25162. }
  25163. else {
  25164. return new template_ast_1.TextAst(ast.value, ngContentIndex, ast.sourceSpan);
  25165. }
  25166. };
  25167. TemplateParseVisitor.prototype.visitAttr = function (ast, contex) {
  25168. return new template_ast_1.AttrAst(ast.name, ast.value, ast.sourceSpan);
  25169. };
  25170. TemplateParseVisitor.prototype.visitElement = function (element, component) {
  25171. var _this = this;
  25172. var nodeName = element.name;
  25173. var preparsedElement = template_preparser_1.preparseElement(element);
  25174. if (preparsedElement.type === template_preparser_1.PreparsedElementType.SCRIPT ||
  25175. preparsedElement.type === template_preparser_1.PreparsedElementType.STYLE) {
  25176. // Skipping <script> for security reasons
  25177. // Skipping <style> as we already processed them
  25178. // in the StyleCompiler
  25179. return null;
  25180. }
  25181. if (preparsedElement.type === template_preparser_1.PreparsedElementType.STYLESHEET &&
  25182. style_url_resolver_1.isStyleUrlResolvable(preparsedElement.hrefAttr)) {
  25183. // Skipping stylesheets with either relative urls or package scheme as we already processed
  25184. // them in the StyleCompiler
  25185. return null;
  25186. }
  25187. var matchableAttrs = [];
  25188. var elementOrDirectiveProps = [];
  25189. var vars = [];
  25190. var events = [];
  25191. var templateElementOrDirectiveProps = [];
  25192. var templateVars = [];
  25193. var templateMatchableAttrs = [];
  25194. var hasInlineTemplates = false;
  25195. var attrs = [];
  25196. element.attrs.forEach(function (attr) {
  25197. matchableAttrs.push([attr.name, attr.value]);
  25198. var hasBinding = _this._parseAttr(attr, matchableAttrs, elementOrDirectiveProps, events, vars);
  25199. var hasTemplateBinding = _this._parseInlineTemplateBinding(attr, templateMatchableAttrs, templateElementOrDirectiveProps, templateVars);
  25200. if (!hasBinding && !hasTemplateBinding) {
  25201. // don't include the bindings as attributes as well in the AST
  25202. attrs.push(_this.visitAttr(attr, null));
  25203. }
  25204. if (hasTemplateBinding) {
  25205. hasInlineTemplates = true;
  25206. }
  25207. });
  25208. var lcElName = html_tags_1.splitNsName(nodeName.toLowerCase())[1];
  25209. var isTemplateElement = lcElName == TEMPLATE_ELEMENT;
  25210. var elementCssSelector = createElementCssSelector(nodeName, matchableAttrs);
  25211. var directives = this._createDirectiveAsts(element.name, this._parseDirectives(this.selectorMatcher, elementCssSelector), elementOrDirectiveProps, isTemplateElement ? [] : vars, element.sourceSpan);
  25212. var elementProps = this._createElementPropertyAsts(element.name, elementOrDirectiveProps, directives);
  25213. var children = html_ast_1.htmlVisitAll(preparsedElement.nonBindable ? NON_BINDABLE_VISITOR : this, element.children, Component.create(directives));
  25214. var elementNgContentIndex = hasInlineTemplates ? null : component.findNgContentIndex(elementCssSelector);
  25215. var parsedElement;
  25216. if (preparsedElement.type === template_preparser_1.PreparsedElementType.NG_CONTENT) {
  25217. if (lang_1.isPresent(element.children) && element.children.length > 0) {
  25218. this._reportError("<ng-content> element cannot have content. <ng-content> must be immediately followed by </ng-content>", element.sourceSpan);
  25219. }
  25220. parsedElement =
  25221. new template_ast_1.NgContentAst(this.ngContentCount++, elementNgContentIndex, element.sourceSpan);
  25222. }
  25223. else if (isTemplateElement) {
  25224. this._assertAllEventsPublishedByDirectives(directives, events);
  25225. this._assertNoComponentsNorElementBindingsOnTemplate(directives, elementProps, element.sourceSpan);
  25226. parsedElement = new template_ast_1.EmbeddedTemplateAst(attrs, events, vars, directives, children, elementNgContentIndex, element.sourceSpan);
  25227. }
  25228. else {
  25229. this._assertOnlyOneComponent(directives, element.sourceSpan);
  25230. var elementExportAsVars = vars.filter(function (varAst) { return varAst.value.length === 0; });
  25231. parsedElement =
  25232. new template_ast_1.ElementAst(nodeName, attrs, elementProps, events, elementExportAsVars, directives, children, elementNgContentIndex, element.sourceSpan);
  25233. }
  25234. if (hasInlineTemplates) {
  25235. var templateCssSelector = createElementCssSelector(TEMPLATE_ELEMENT, templateMatchableAttrs);
  25236. var templateDirectives = this._createDirectiveAsts(element.name, this._parseDirectives(this.selectorMatcher, templateCssSelector), templateElementOrDirectiveProps, [], element.sourceSpan);
  25237. var templateElementProps = this._createElementPropertyAsts(element.name, templateElementOrDirectiveProps, templateDirectives);
  25238. this._assertNoComponentsNorElementBindingsOnTemplate(templateDirectives, templateElementProps, element.sourceSpan);
  25239. parsedElement = new template_ast_1.EmbeddedTemplateAst([], [], templateVars, templateDirectives, [parsedElement], component.findNgContentIndex(templateCssSelector), element.sourceSpan);
  25240. }
  25241. return parsedElement;
  25242. };
  25243. TemplateParseVisitor.prototype._parseInlineTemplateBinding = function (attr, targetMatchableAttrs, targetProps, targetVars) {
  25244. var templateBindingsSource = null;
  25245. if (attr.name == TEMPLATE_ATTR) {
  25246. templateBindingsSource = attr.value;
  25247. }
  25248. else if (attr.name.startsWith(TEMPLATE_ATTR_PREFIX)) {
  25249. var key = attr.name.substring(TEMPLATE_ATTR_PREFIX.length); // remove the star
  25250. templateBindingsSource = (attr.value.length == 0) ? key : key + ' ' + attr.value;
  25251. }
  25252. if (lang_1.isPresent(templateBindingsSource)) {
  25253. var bindings = this._parseTemplateBindings(templateBindingsSource, attr.sourceSpan);
  25254. for (var i = 0; i < bindings.length; i++) {
  25255. var binding = bindings[i];
  25256. if (binding.keyIsVar) {
  25257. targetVars.push(new template_ast_1.VariableAst(binding.key, binding.name, attr.sourceSpan));
  25258. targetMatchableAttrs.push([binding.key, binding.name]);
  25259. }
  25260. else if (lang_1.isPresent(binding.expression)) {
  25261. this._parsePropertyAst(binding.key, binding.expression, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25262. }
  25263. else {
  25264. targetMatchableAttrs.push([binding.key, '']);
  25265. this._parseLiteralAttr(binding.key, null, attr.sourceSpan, targetProps);
  25266. }
  25267. }
  25268. return true;
  25269. }
  25270. return false;
  25271. };
  25272. TemplateParseVisitor.prototype._parseAttr = function (attr, targetMatchableAttrs, targetProps, targetEvents, targetVars) {
  25273. var attrName = this._normalizeAttributeName(attr.name);
  25274. var attrValue = attr.value;
  25275. var bindParts = lang_1.RegExpWrapper.firstMatch(BIND_NAME_REGEXP, attrName);
  25276. var hasBinding = false;
  25277. if (lang_1.isPresent(bindParts)) {
  25278. hasBinding = true;
  25279. if (lang_1.isPresent(bindParts[1])) {
  25280. this._parseProperty(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25281. }
  25282. else if (lang_1.isPresent(bindParts[2])) {
  25283. var identifier = bindParts[5];
  25284. this._parseVariable(identifier, attrValue, attr.sourceSpan, targetVars);
  25285. }
  25286. else if (lang_1.isPresent(bindParts[3])) {
  25287. this._parseEvent(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
  25288. }
  25289. else if (lang_1.isPresent(bindParts[4])) {
  25290. this._parseProperty(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25291. this._parseAssignmentEvent(bindParts[5], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
  25292. }
  25293. else if (lang_1.isPresent(bindParts[6])) {
  25294. this._parseProperty(bindParts[6], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25295. this._parseAssignmentEvent(bindParts[6], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
  25296. }
  25297. else if (lang_1.isPresent(bindParts[7])) {
  25298. this._parseProperty(bindParts[7], attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25299. }
  25300. else if (lang_1.isPresent(bindParts[8])) {
  25301. this._parseEvent(bindParts[8], attrValue, attr.sourceSpan, targetMatchableAttrs, targetEvents);
  25302. }
  25303. }
  25304. else {
  25305. hasBinding = this._parsePropertyInterpolation(attrName, attrValue, attr.sourceSpan, targetMatchableAttrs, targetProps);
  25306. }
  25307. if (!hasBinding) {
  25308. this._parseLiteralAttr(attrName, attrValue, attr.sourceSpan, targetProps);
  25309. }
  25310. return hasBinding;
  25311. };
  25312. TemplateParseVisitor.prototype._normalizeAttributeName = function (attrName) {
  25313. return attrName.toLowerCase().startsWith('data-') ? attrName.substring(5) : attrName;
  25314. };
  25315. TemplateParseVisitor.prototype._parseVariable = function (identifier, value, sourceSpan, targetVars) {
  25316. if (identifier.indexOf('-') > -1) {
  25317. this._reportError("\"-\" is not allowed in variable names", sourceSpan);
  25318. }
  25319. targetVars.push(new template_ast_1.VariableAst(identifier, value, sourceSpan));
  25320. };
  25321. TemplateParseVisitor.prototype._parseProperty = function (name, expression, sourceSpan, targetMatchableAttrs, targetProps) {
  25322. this._parsePropertyAst(name, this._parseBinding(expression, sourceSpan), sourceSpan, targetMatchableAttrs, targetProps);
  25323. };
  25324. TemplateParseVisitor.prototype._parsePropertyInterpolation = function (name, value, sourceSpan, targetMatchableAttrs, targetProps) {
  25325. var expr = this._parseInterpolation(value, sourceSpan);
  25326. if (lang_1.isPresent(expr)) {
  25327. this._parsePropertyAst(name, expr, sourceSpan, targetMatchableAttrs, targetProps);
  25328. return true;
  25329. }
  25330. return false;
  25331. };
  25332. TemplateParseVisitor.prototype._parsePropertyAst = function (name, ast, sourceSpan, targetMatchableAttrs, targetProps) {
  25333. targetMatchableAttrs.push([name, ast.source]);
  25334. targetProps.push(new BoundElementOrDirectiveProperty(name, ast, false, sourceSpan));
  25335. };
  25336. TemplateParseVisitor.prototype._parseAssignmentEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {
  25337. this._parseEvent(name + "Change", expression + "=$event", sourceSpan, targetMatchableAttrs, targetEvents);
  25338. };
  25339. TemplateParseVisitor.prototype._parseEvent = function (name, expression, sourceSpan, targetMatchableAttrs, targetEvents) {
  25340. // long format: 'target: eventName'
  25341. var parts = util_1.splitAtColon(name, [null, name]);
  25342. var target = parts[0];
  25343. var eventName = parts[1];
  25344. targetEvents.push(new template_ast_1.BoundEventAst(eventName, target, this._parseAction(expression, sourceSpan), sourceSpan));
  25345. // Don't detect directives for event names for now,
  25346. // so don't add the event name to the matchableAttrs
  25347. };
  25348. TemplateParseVisitor.prototype._parseLiteralAttr = function (name, value, sourceSpan, targetProps) {
  25349. targetProps.push(new BoundElementOrDirectiveProperty(name, this._exprParser.wrapLiteralPrimitive(value, ''), true, sourceSpan));
  25350. };
  25351. TemplateParseVisitor.prototype._parseDirectives = function (selectorMatcher, elementCssSelector) {
  25352. var _this = this;
  25353. var directives = [];
  25354. selectorMatcher.match(elementCssSelector, function (selector, directive) { directives.push(directive); });
  25355. // Need to sort the directives so that we get consistent results throughout,
  25356. // as selectorMatcher uses Maps inside.
  25357. // Also need to make components the first directive in the array
  25358. collection_1.ListWrapper.sort(directives, function (dir1, dir2) {
  25359. var dir1Comp = dir1.isComponent;
  25360. var dir2Comp = dir2.isComponent;
  25361. if (dir1Comp && !dir2Comp) {
  25362. return -1;
  25363. }
  25364. else if (!dir1Comp && dir2Comp) {
  25365. return 1;
  25366. }
  25367. else {
  25368. return _this.directivesIndex.get(dir1) - _this.directivesIndex.get(dir2);
  25369. }
  25370. });
  25371. return directives;
  25372. };
  25373. TemplateParseVisitor.prototype._createDirectiveAsts = function (elementName, directives, props, possibleExportAsVars, sourceSpan) {
  25374. var _this = this;
  25375. var matchedVariables = new Set();
  25376. var directiveAsts = directives.map(function (directive) {
  25377. var hostProperties = [];
  25378. var hostEvents = [];
  25379. var directiveProperties = [];
  25380. _this._createDirectiveHostPropertyAsts(elementName, directive.hostProperties, sourceSpan, hostProperties);
  25381. _this._createDirectiveHostEventAsts(directive.hostListeners, sourceSpan, hostEvents);
  25382. _this._createDirectivePropertyAsts(directive.inputs, props, directiveProperties);
  25383. var exportAsVars = [];
  25384. possibleExportAsVars.forEach(function (varAst) {
  25385. if ((varAst.value.length === 0 && directive.isComponent) ||
  25386. (directive.exportAs == varAst.value)) {
  25387. exportAsVars.push(varAst);
  25388. matchedVariables.add(varAst.name);
  25389. }
  25390. });
  25391. return new template_ast_1.DirectiveAst(directive, directiveProperties, hostProperties, hostEvents, exportAsVars, sourceSpan);
  25392. });
  25393. possibleExportAsVars.forEach(function (varAst) {
  25394. if (varAst.value.length > 0 && !collection_1.SetWrapper.has(matchedVariables, varAst.name)) {
  25395. _this._reportError("There is no directive with \"exportAs\" set to \"" + varAst.value + "\"", varAst.sourceSpan);
  25396. }
  25397. });
  25398. return directiveAsts;
  25399. };
  25400. TemplateParseVisitor.prototype._createDirectiveHostPropertyAsts = function (elementName, hostProps, sourceSpan, targetPropertyAsts) {
  25401. var _this = this;
  25402. if (lang_1.isPresent(hostProps)) {
  25403. collection_1.StringMapWrapper.forEach(hostProps, function (expression, propName) {
  25404. var exprAst = _this._parseBinding(expression, sourceSpan);
  25405. targetPropertyAsts.push(_this._createElementPropertyAst(elementName, propName, exprAst, sourceSpan));
  25406. });
  25407. }
  25408. };
  25409. TemplateParseVisitor.prototype._createDirectiveHostEventAsts = function (hostListeners, sourceSpan, targetEventAsts) {
  25410. var _this = this;
  25411. if (lang_1.isPresent(hostListeners)) {
  25412. collection_1.StringMapWrapper.forEach(hostListeners, function (expression, propName) {
  25413. _this._parseEvent(propName, expression, sourceSpan, [], targetEventAsts);
  25414. });
  25415. }
  25416. };
  25417. TemplateParseVisitor.prototype._createDirectivePropertyAsts = function (directiveProperties, boundProps, targetBoundDirectiveProps) {
  25418. if (lang_1.isPresent(directiveProperties)) {
  25419. var boundPropsByName = new Map();
  25420. boundProps.forEach(function (boundProp) {
  25421. var prevValue = boundPropsByName.get(boundProp.name);
  25422. if (lang_1.isBlank(prevValue) || prevValue.isLiteral) {
  25423. // give [a]="b" a higher precedence than a="b" on the same element
  25424. boundPropsByName.set(boundProp.name, boundProp);
  25425. }
  25426. });
  25427. collection_1.StringMapWrapper.forEach(directiveProperties, function (elProp, dirProp) {
  25428. var boundProp = boundPropsByName.get(elProp);
  25429. // Bindings are optional, so this binding only needs to be set up if an expression is given.
  25430. if (lang_1.isPresent(boundProp)) {
  25431. targetBoundDirectiveProps.push(new template_ast_1.BoundDirectivePropertyAst(dirProp, boundProp.name, boundProp.expression, boundProp.sourceSpan));
  25432. }
  25433. });
  25434. }
  25435. };
  25436. TemplateParseVisitor.prototype._createElementPropertyAsts = function (elementName, props, directives) {
  25437. var _this = this;
  25438. var boundElementProps = [];
  25439. var boundDirectivePropsIndex = new Map();
  25440. directives.forEach(function (directive) {
  25441. directive.inputs.forEach(function (prop) {
  25442. boundDirectivePropsIndex.set(prop.templateName, prop);
  25443. });
  25444. });
  25445. props.forEach(function (prop) {
  25446. if (!prop.isLiteral && lang_1.isBlank(boundDirectivePropsIndex.get(prop.name))) {
  25447. boundElementProps.push(_this._createElementPropertyAst(elementName, prop.name, prop.expression, prop.sourceSpan));
  25448. }
  25449. });
  25450. return boundElementProps;
  25451. };
  25452. TemplateParseVisitor.prototype._createElementPropertyAst = function (elementName, name, ast, sourceSpan) {
  25453. var unit = null;
  25454. var bindingType;
  25455. var boundPropertyName;
  25456. var parts = name.split(PROPERTY_PARTS_SEPARATOR);
  25457. if (parts.length === 1) {
  25458. boundPropertyName = this._schemaRegistry.getMappedPropName(parts[0]);
  25459. bindingType = template_ast_1.PropertyBindingType.Property;
  25460. if (!this._schemaRegistry.hasProperty(elementName, boundPropertyName)) {
  25461. this._reportError("Can't bind to '" + boundPropertyName + "' since it isn't a known native property", sourceSpan);
  25462. }
  25463. }
  25464. else {
  25465. if (parts[0] == ATTRIBUTE_PREFIX) {
  25466. boundPropertyName = parts[1];
  25467. bindingType = template_ast_1.PropertyBindingType.Attribute;
  25468. }
  25469. else if (parts[0] == CLASS_PREFIX) {
  25470. boundPropertyName = parts[1];
  25471. bindingType = template_ast_1.PropertyBindingType.Class;
  25472. }
  25473. else if (parts[0] == STYLE_PREFIX) {
  25474. unit = parts.length > 2 ? parts[2] : null;
  25475. boundPropertyName = parts[1];
  25476. bindingType = template_ast_1.PropertyBindingType.Style;
  25477. }
  25478. else {
  25479. this._reportError("Invalid property name '" + name + "'", sourceSpan);
  25480. bindingType = null;
  25481. }
  25482. }
  25483. return new template_ast_1.BoundElementPropertyAst(boundPropertyName, bindingType, ast, unit, sourceSpan);
  25484. };
  25485. TemplateParseVisitor.prototype._findComponentDirectiveNames = function (directives) {
  25486. var componentTypeNames = [];
  25487. directives.forEach(function (directive) {
  25488. var typeName = directive.directive.type.name;
  25489. if (directive.directive.isComponent) {
  25490. componentTypeNames.push(typeName);
  25491. }
  25492. });
  25493. return componentTypeNames;
  25494. };
  25495. TemplateParseVisitor.prototype._assertOnlyOneComponent = function (directives, sourceSpan) {
  25496. var componentTypeNames = this._findComponentDirectiveNames(directives);
  25497. if (componentTypeNames.length > 1) {
  25498. this._reportError("More than one component: " + componentTypeNames.join(','), sourceSpan);
  25499. }
  25500. };
  25501. TemplateParseVisitor.prototype._assertNoComponentsNorElementBindingsOnTemplate = function (directives, elementProps, sourceSpan) {
  25502. var _this = this;
  25503. var componentTypeNames = this._findComponentDirectiveNames(directives);
  25504. if (componentTypeNames.length > 0) {
  25505. this._reportError("Components on an embedded template: " + componentTypeNames.join(','), sourceSpan);
  25506. }
  25507. elementProps.forEach(function (prop) {
  25508. _this._reportError("Property binding " + prop.name + " not used by any directive on an embedded template", sourceSpan);
  25509. });
  25510. };
  25511. TemplateParseVisitor.prototype._assertAllEventsPublishedByDirectives = function (directives, events) {
  25512. var _this = this;
  25513. var allDirectiveEvents = new Set();
  25514. directives.forEach(function (directive) {
  25515. collection_1.StringMapWrapper.forEach(directive.directive.outputs, function (eventName, _) { allDirectiveEvents.add(eventName); });
  25516. });
  25517. events.forEach(function (event) {
  25518. if (lang_1.isPresent(event.target) || !collection_1.SetWrapper.has(allDirectiveEvents, event.name)) {
  25519. _this._reportError("Event binding " + event.fullName + " not emitted by any directive on an embedded template", event.sourceSpan);
  25520. }
  25521. });
  25522. };
  25523. return TemplateParseVisitor;
  25524. })();
  25525. var NonBindableVisitor = (function () {
  25526. function NonBindableVisitor() {
  25527. }
  25528. NonBindableVisitor.prototype.visitElement = function (ast, component) {
  25529. var preparsedElement = template_preparser_1.preparseElement(ast);
  25530. if (preparsedElement.type === template_preparser_1.PreparsedElementType.SCRIPT ||
  25531. preparsedElement.type === template_preparser_1.PreparsedElementType.STYLE ||
  25532. preparsedElement.type === template_preparser_1.PreparsedElementType.STYLESHEET) {
  25533. // Skipping <script> for security reasons
  25534. // Skipping <style> and stylesheets as we already processed them
  25535. // in the StyleCompiler
  25536. return null;
  25537. }
  25538. var attrNameAndValues = ast.attrs.map(function (attrAst) { return [attrAst.name, attrAst.value]; });
  25539. var selector = createElementCssSelector(ast.name, attrNameAndValues);
  25540. var ngContentIndex = component.findNgContentIndex(selector);
  25541. var children = html_ast_1.htmlVisitAll(this, ast.children, EMPTY_COMPONENT);
  25542. return new template_ast_1.ElementAst(ast.name, html_ast_1.htmlVisitAll(this, ast.attrs), [], [], [], [], children, ngContentIndex, ast.sourceSpan);
  25543. };
  25544. NonBindableVisitor.prototype.visitAttr = function (ast, context) {
  25545. return new template_ast_1.AttrAst(ast.name, ast.value, ast.sourceSpan);
  25546. };
  25547. NonBindableVisitor.prototype.visitText = function (ast, component) {
  25548. var ngContentIndex = component.findNgContentIndex(TEXT_CSS_SELECTOR);
  25549. return new template_ast_1.TextAst(ast.value, ngContentIndex, ast.sourceSpan);
  25550. };
  25551. return NonBindableVisitor;
  25552. })();
  25553. var BoundElementOrDirectiveProperty = (function () {
  25554. function BoundElementOrDirectiveProperty(name, expression, isLiteral, sourceSpan) {
  25555. this.name = name;
  25556. this.expression = expression;
  25557. this.isLiteral = isLiteral;
  25558. this.sourceSpan = sourceSpan;
  25559. }
  25560. return BoundElementOrDirectiveProperty;
  25561. })();
  25562. function splitClasses(classAttrValue) {
  25563. return lang_1.StringWrapper.split(classAttrValue.trim(), /\s+/g);
  25564. }
  25565. exports.splitClasses = splitClasses;
  25566. var Component = (function () {
  25567. function Component(ngContentIndexMatcher, wildcardNgContentIndex) {
  25568. this.ngContentIndexMatcher = ngContentIndexMatcher;
  25569. this.wildcardNgContentIndex = wildcardNgContentIndex;
  25570. }
  25571. Component.create = function (directives) {
  25572. if (directives.length === 0 || !directives[0].directive.isComponent) {
  25573. return EMPTY_COMPONENT;
  25574. }
  25575. var matcher = new selector_1.SelectorMatcher();
  25576. var ngContentSelectors = directives[0].directive.template.ngContentSelectors;
  25577. var wildcardNgContentIndex = null;
  25578. for (var i = 0; i < ngContentSelectors.length; i++) {
  25579. var selector = ngContentSelectors[i];
  25580. if (lang_1.StringWrapper.equals(selector, '*')) {
  25581. wildcardNgContentIndex = i;
  25582. }
  25583. else {
  25584. matcher.addSelectables(selector_1.CssSelector.parse(ngContentSelectors[i]), i);
  25585. }
  25586. }
  25587. return new Component(matcher, wildcardNgContentIndex);
  25588. };
  25589. Component.prototype.findNgContentIndex = function (selector) {
  25590. var ngContentIndices = [];
  25591. this.ngContentIndexMatcher.match(selector, function (selector, ngContentIndex) { ngContentIndices.push(ngContentIndex); });
  25592. collection_1.ListWrapper.sort(ngContentIndices);
  25593. if (lang_1.isPresent(this.wildcardNgContentIndex)) {
  25594. ngContentIndices.push(this.wildcardNgContentIndex);
  25595. }
  25596. return ngContentIndices.length > 0 ? ngContentIndices[0] : null;
  25597. };
  25598. return Component;
  25599. })();
  25600. function createElementCssSelector(elementName, matchableAttrs) {
  25601. var cssSelector = new selector_1.CssSelector();
  25602. var elNameNoNs = html_tags_1.splitNsName(elementName)[1];
  25603. cssSelector.setElement(elNameNoNs);
  25604. for (var i = 0; i < matchableAttrs.length; i++) {
  25605. var attrName = matchableAttrs[i][0];
  25606. var attrNameNoNs = html_tags_1.splitNsName(attrName)[1];
  25607. var attrValue = matchableAttrs[i][1];
  25608. cssSelector.addAttribute(attrNameNoNs, attrValue);
  25609. if (attrName.toLowerCase() == CLASS_ATTR) {
  25610. var classes = splitClasses(attrValue);
  25611. classes.forEach(function (className) { return cssSelector.addClassName(className); });
  25612. }
  25613. }
  25614. return cssSelector;
  25615. }
  25616. var EMPTY_COMPONENT = new Component(new selector_1.SelectorMatcher(), null);
  25617. var NON_BINDABLE_VISITOR = new NonBindableVisitor();
  25618. /***/ },
  25619. /* 168 */
  25620. /***/ function(module, exports, __webpack_require__) {
  25621. var __extends = (this && this.__extends) || function (d, b) {
  25622. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  25623. function __() { this.constructor = d; }
  25624. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  25625. };
  25626. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  25627. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  25628. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  25629. 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;
  25630. return c > 3 && r && Object.defineProperty(target, key, r), r;
  25631. };
  25632. var __metadata = (this && this.__metadata) || function (k, v) {
  25633. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  25634. };
  25635. var lang_1 = __webpack_require__(5);
  25636. var collection_1 = __webpack_require__(12);
  25637. var html_ast_1 = __webpack_require__(169);
  25638. var di_1 = __webpack_require__(6);
  25639. var html_lexer_1 = __webpack_require__(170);
  25640. var parse_util_1 = __webpack_require__(171);
  25641. var html_tags_1 = __webpack_require__(172);
  25642. var HtmlTreeError = (function (_super) {
  25643. __extends(HtmlTreeError, _super);
  25644. function HtmlTreeError(elementName, location, msg) {
  25645. _super.call(this, location, msg);
  25646. this.elementName = elementName;
  25647. }
  25648. HtmlTreeError.create = function (elementName, location, msg) {
  25649. return new HtmlTreeError(elementName, location, msg);
  25650. };
  25651. return HtmlTreeError;
  25652. })(parse_util_1.ParseError);
  25653. exports.HtmlTreeError = HtmlTreeError;
  25654. var HtmlParseTreeResult = (function () {
  25655. function HtmlParseTreeResult(rootNodes, errors) {
  25656. this.rootNodes = rootNodes;
  25657. this.errors = errors;
  25658. }
  25659. return HtmlParseTreeResult;
  25660. })();
  25661. exports.HtmlParseTreeResult = HtmlParseTreeResult;
  25662. var HtmlParser = (function () {
  25663. function HtmlParser() {
  25664. }
  25665. HtmlParser.prototype.parse = function (sourceContent, sourceUrl) {
  25666. var tokensAndErrors = html_lexer_1.tokenizeHtml(sourceContent, sourceUrl);
  25667. var treeAndErrors = new TreeBuilder(tokensAndErrors.tokens).build();
  25668. return new HtmlParseTreeResult(treeAndErrors.rootNodes, tokensAndErrors.errors
  25669. .concat(treeAndErrors.errors));
  25670. };
  25671. HtmlParser = __decorate([
  25672. di_1.Injectable(),
  25673. __metadata('design:paramtypes', [])
  25674. ], HtmlParser);
  25675. return HtmlParser;
  25676. })();
  25677. exports.HtmlParser = HtmlParser;
  25678. var TreeBuilder = (function () {
  25679. function TreeBuilder(tokens) {
  25680. this.tokens = tokens;
  25681. this.index = -1;
  25682. this.rootNodes = [];
  25683. this.errors = [];
  25684. this.elementStack = [];
  25685. this._advance();
  25686. }
  25687. TreeBuilder.prototype.build = function () {
  25688. while (this.peek.type !== html_lexer_1.HtmlTokenType.EOF) {
  25689. if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_OPEN_START) {
  25690. this._consumeStartTag(this._advance());
  25691. }
  25692. else if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_CLOSE) {
  25693. this._consumeEndTag(this._advance());
  25694. }
  25695. else if (this.peek.type === html_lexer_1.HtmlTokenType.CDATA_START) {
  25696. this._closeVoidElement();
  25697. this._consumeCdata(this._advance());
  25698. }
  25699. else if (this.peek.type === html_lexer_1.HtmlTokenType.COMMENT_START) {
  25700. this._closeVoidElement();
  25701. this._consumeComment(this._advance());
  25702. }
  25703. else if (this.peek.type === html_lexer_1.HtmlTokenType.TEXT ||
  25704. this.peek.type === html_lexer_1.HtmlTokenType.RAW_TEXT ||
  25705. this.peek.type === html_lexer_1.HtmlTokenType.ESCAPABLE_RAW_TEXT) {
  25706. this._closeVoidElement();
  25707. this._consumeText(this._advance());
  25708. }
  25709. else {
  25710. // Skip all other tokens...
  25711. this._advance();
  25712. }
  25713. }
  25714. return new HtmlParseTreeResult(this.rootNodes, this.errors);
  25715. };
  25716. TreeBuilder.prototype._advance = function () {
  25717. var prev = this.peek;
  25718. if (this.index < this.tokens.length - 1) {
  25719. // Note: there is always an EOF token at the end
  25720. this.index++;
  25721. }
  25722. this.peek = this.tokens[this.index];
  25723. return prev;
  25724. };
  25725. TreeBuilder.prototype._advanceIf = function (type) {
  25726. if (this.peek.type === type) {
  25727. return this._advance();
  25728. }
  25729. return null;
  25730. };
  25731. TreeBuilder.prototype._consumeCdata = function (startToken) {
  25732. this._consumeText(this._advance());
  25733. this._advanceIf(html_lexer_1.HtmlTokenType.CDATA_END);
  25734. };
  25735. TreeBuilder.prototype._consumeComment = function (startToken) {
  25736. this._advanceIf(html_lexer_1.HtmlTokenType.RAW_TEXT);
  25737. this._advanceIf(html_lexer_1.HtmlTokenType.COMMENT_END);
  25738. };
  25739. TreeBuilder.prototype._consumeText = function (token) {
  25740. var text = token.parts[0];
  25741. if (text.length > 0 && text[0] == '\n') {
  25742. var parent_1 = this._getParentElement();
  25743. if (lang_1.isPresent(parent_1) && parent_1.children.length == 0 &&
  25744. html_tags_1.getHtmlTagDefinition(parent_1.name).ignoreFirstLf) {
  25745. text = text.substring(1);
  25746. }
  25747. }
  25748. if (text.length > 0) {
  25749. this._addToParent(new html_ast_1.HtmlTextAst(text, token.sourceSpan));
  25750. }
  25751. };
  25752. TreeBuilder.prototype._closeVoidElement = function () {
  25753. if (this.elementStack.length > 0) {
  25754. var el = collection_1.ListWrapper.last(this.elementStack);
  25755. if (html_tags_1.getHtmlTagDefinition(el.name).isVoid) {
  25756. this.elementStack.pop();
  25757. }
  25758. }
  25759. };
  25760. TreeBuilder.prototype._consumeStartTag = function (startTagToken) {
  25761. var prefix = startTagToken.parts[0];
  25762. var name = startTagToken.parts[1];
  25763. var attrs = [];
  25764. while (this.peek.type === html_lexer_1.HtmlTokenType.ATTR_NAME) {
  25765. attrs.push(this._consumeAttr(this._advance()));
  25766. }
  25767. var fullName = getElementFullName(prefix, name, this._getParentElement());
  25768. var selfClosing = false;
  25769. // Note: There could have been a tokenizer error
  25770. // so that we don't get a token for the end tag...
  25771. if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_OPEN_END_VOID) {
  25772. this._advance();
  25773. selfClosing = true;
  25774. if (html_tags_1.getNsPrefix(fullName) == null && !html_tags_1.getHtmlTagDefinition(fullName).isVoid) {
  25775. this.errors.push(HtmlTreeError.create(fullName, startTagToken.sourceSpan.start, "Only void and foreign elements can be self closed \"" + startTagToken.parts[1] + "\""));
  25776. }
  25777. }
  25778. else if (this.peek.type === html_lexer_1.HtmlTokenType.TAG_OPEN_END) {
  25779. this._advance();
  25780. selfClosing = false;
  25781. }
  25782. var end = this.peek.sourceSpan.start;
  25783. var el = new html_ast_1.HtmlElementAst(fullName, attrs, [], new parse_util_1.ParseSourceSpan(startTagToken.sourceSpan.start, end));
  25784. this._pushElement(el);
  25785. if (selfClosing) {
  25786. this._popElement(fullName);
  25787. }
  25788. };
  25789. TreeBuilder.prototype._pushElement = function (el) {
  25790. if (this.elementStack.length > 0) {
  25791. var parentEl = collection_1.ListWrapper.last(this.elementStack);
  25792. if (html_tags_1.getHtmlTagDefinition(parentEl.name).isClosedByChild(el.name)) {
  25793. this.elementStack.pop();
  25794. }
  25795. }
  25796. var tagDef = html_tags_1.getHtmlTagDefinition(el.name);
  25797. var parentEl = this._getParentElement();
  25798. if (tagDef.requireExtraParent(lang_1.isPresent(parentEl) ? parentEl.name : null)) {
  25799. var newParent = new html_ast_1.HtmlElementAst(tagDef.parentToAdd, [], [el], el.sourceSpan);
  25800. this._addToParent(newParent);
  25801. this.elementStack.push(newParent);
  25802. this.elementStack.push(el);
  25803. }
  25804. else {
  25805. this._addToParent(el);
  25806. this.elementStack.push(el);
  25807. }
  25808. };
  25809. TreeBuilder.prototype._consumeEndTag = function (endTagToken) {
  25810. var fullName = getElementFullName(endTagToken.parts[0], endTagToken.parts[1], this._getParentElement());
  25811. if (html_tags_1.getHtmlTagDefinition(fullName).isVoid) {
  25812. this.errors.push(HtmlTreeError.create(fullName, endTagToken.sourceSpan.start, "Void elements do not have end tags \"" + endTagToken.parts[1] + "\""));
  25813. }
  25814. else if (!this._popElement(fullName)) {
  25815. this.errors.push(HtmlTreeError.create(fullName, endTagToken.sourceSpan.start, "Unexpected closing tag \"" + endTagToken.parts[1] + "\""));
  25816. }
  25817. };
  25818. TreeBuilder.prototype._popElement = function (fullName) {
  25819. for (var stackIndex = this.elementStack.length - 1; stackIndex >= 0; stackIndex--) {
  25820. var el = this.elementStack[stackIndex];
  25821. if (el.name == fullName) {
  25822. collection_1.ListWrapper.splice(this.elementStack, stackIndex, this.elementStack.length - stackIndex);
  25823. return true;
  25824. }
  25825. if (!html_tags_1.getHtmlTagDefinition(el.name).closedByParent) {
  25826. return false;
  25827. }
  25828. }
  25829. return false;
  25830. };
  25831. TreeBuilder.prototype._consumeAttr = function (attrName) {
  25832. var fullName = mergeNsAndName(attrName.parts[0], attrName.parts[1]);
  25833. var end = attrName.sourceSpan.end;
  25834. var value = '';
  25835. if (this.peek.type === html_lexer_1.HtmlTokenType.ATTR_VALUE) {
  25836. var valueToken = this._advance();
  25837. value = valueToken.parts[0];
  25838. end = valueToken.sourceSpan.end;
  25839. }
  25840. return new html_ast_1.HtmlAttrAst(fullName, value, new parse_util_1.ParseSourceSpan(attrName.sourceSpan.start, end));
  25841. };
  25842. TreeBuilder.prototype._getParentElement = function () {
  25843. return this.elementStack.length > 0 ? collection_1.ListWrapper.last(this.elementStack) : null;
  25844. };
  25845. TreeBuilder.prototype._addToParent = function (node) {
  25846. var parent = this._getParentElement();
  25847. if (lang_1.isPresent(parent)) {
  25848. parent.children.push(node);
  25849. }
  25850. else {
  25851. this.rootNodes.push(node);
  25852. }
  25853. };
  25854. return TreeBuilder;
  25855. })();
  25856. function mergeNsAndName(prefix, localName) {
  25857. return lang_1.isPresent(prefix) ? "@" + prefix + ":" + localName : localName;
  25858. }
  25859. function getElementFullName(prefix, localName, parentElement) {
  25860. if (lang_1.isBlank(prefix)) {
  25861. prefix = html_tags_1.getHtmlTagDefinition(localName).implicitNamespacePrefix;
  25862. if (lang_1.isBlank(prefix) && lang_1.isPresent(parentElement)) {
  25863. prefix = html_tags_1.getNsPrefix(parentElement.name);
  25864. }
  25865. }
  25866. return mergeNsAndName(prefix, localName);
  25867. }
  25868. /***/ },
  25869. /* 169 */
  25870. /***/ function(module, exports, __webpack_require__) {
  25871. var lang_1 = __webpack_require__(5);
  25872. var HtmlTextAst = (function () {
  25873. function HtmlTextAst(value, sourceSpan) {
  25874. this.value = value;
  25875. this.sourceSpan = sourceSpan;
  25876. }
  25877. HtmlTextAst.prototype.visit = function (visitor, context) { return visitor.visitText(this, context); };
  25878. return HtmlTextAst;
  25879. })();
  25880. exports.HtmlTextAst = HtmlTextAst;
  25881. var HtmlAttrAst = (function () {
  25882. function HtmlAttrAst(name, value, sourceSpan) {
  25883. this.name = name;
  25884. this.value = value;
  25885. this.sourceSpan = sourceSpan;
  25886. }
  25887. HtmlAttrAst.prototype.visit = function (visitor, context) { return visitor.visitAttr(this, context); };
  25888. return HtmlAttrAst;
  25889. })();
  25890. exports.HtmlAttrAst = HtmlAttrAst;
  25891. var HtmlElementAst = (function () {
  25892. function HtmlElementAst(name, attrs, children, sourceSpan) {
  25893. this.name = name;
  25894. this.attrs = attrs;
  25895. this.children = children;
  25896. this.sourceSpan = sourceSpan;
  25897. }
  25898. HtmlElementAst.prototype.visit = function (visitor, context) { return visitor.visitElement(this, context); };
  25899. return HtmlElementAst;
  25900. })();
  25901. exports.HtmlElementAst = HtmlElementAst;
  25902. function htmlVisitAll(visitor, asts, context) {
  25903. if (context === void 0) { context = null; }
  25904. var result = [];
  25905. asts.forEach(function (ast) {
  25906. var astResult = ast.visit(visitor, context);
  25907. if (lang_1.isPresent(astResult)) {
  25908. result.push(astResult);
  25909. }
  25910. });
  25911. return result;
  25912. }
  25913. exports.htmlVisitAll = htmlVisitAll;
  25914. /***/ },
  25915. /* 170 */
  25916. /***/ function(module, exports, __webpack_require__) {
  25917. var __extends = (this && this.__extends) || function (d, b) {
  25918. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  25919. function __() { this.constructor = d; }
  25920. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  25921. };
  25922. var lang_1 = __webpack_require__(5);
  25923. var collection_1 = __webpack_require__(12);
  25924. var parse_util_1 = __webpack_require__(171);
  25925. var html_tags_1 = __webpack_require__(172);
  25926. (function (HtmlTokenType) {
  25927. HtmlTokenType[HtmlTokenType["TAG_OPEN_START"] = 0] = "TAG_OPEN_START";
  25928. HtmlTokenType[HtmlTokenType["TAG_OPEN_END"] = 1] = "TAG_OPEN_END";
  25929. HtmlTokenType[HtmlTokenType["TAG_OPEN_END_VOID"] = 2] = "TAG_OPEN_END_VOID";
  25930. HtmlTokenType[HtmlTokenType["TAG_CLOSE"] = 3] = "TAG_CLOSE";
  25931. HtmlTokenType[HtmlTokenType["TEXT"] = 4] = "TEXT";
  25932. HtmlTokenType[HtmlTokenType["ESCAPABLE_RAW_TEXT"] = 5] = "ESCAPABLE_RAW_TEXT";
  25933. HtmlTokenType[HtmlTokenType["RAW_TEXT"] = 6] = "RAW_TEXT";
  25934. HtmlTokenType[HtmlTokenType["COMMENT_START"] = 7] = "COMMENT_START";
  25935. HtmlTokenType[HtmlTokenType["COMMENT_END"] = 8] = "COMMENT_END";
  25936. HtmlTokenType[HtmlTokenType["CDATA_START"] = 9] = "CDATA_START";
  25937. HtmlTokenType[HtmlTokenType["CDATA_END"] = 10] = "CDATA_END";
  25938. HtmlTokenType[HtmlTokenType["ATTR_NAME"] = 11] = "ATTR_NAME";
  25939. HtmlTokenType[HtmlTokenType["ATTR_VALUE"] = 12] = "ATTR_VALUE";
  25940. HtmlTokenType[HtmlTokenType["DOC_TYPE"] = 13] = "DOC_TYPE";
  25941. HtmlTokenType[HtmlTokenType["EOF"] = 14] = "EOF";
  25942. })(exports.HtmlTokenType || (exports.HtmlTokenType = {}));
  25943. var HtmlTokenType = exports.HtmlTokenType;
  25944. var HtmlToken = (function () {
  25945. function HtmlToken(type, parts, sourceSpan) {
  25946. this.type = type;
  25947. this.parts = parts;
  25948. this.sourceSpan = sourceSpan;
  25949. }
  25950. return HtmlToken;
  25951. })();
  25952. exports.HtmlToken = HtmlToken;
  25953. var HtmlTokenError = (function (_super) {
  25954. __extends(HtmlTokenError, _super);
  25955. function HtmlTokenError(errorMsg, tokenType, location) {
  25956. _super.call(this, location, errorMsg);
  25957. this.tokenType = tokenType;
  25958. }
  25959. return HtmlTokenError;
  25960. })(parse_util_1.ParseError);
  25961. exports.HtmlTokenError = HtmlTokenError;
  25962. var HtmlTokenizeResult = (function () {
  25963. function HtmlTokenizeResult(tokens, errors) {
  25964. this.tokens = tokens;
  25965. this.errors = errors;
  25966. }
  25967. return HtmlTokenizeResult;
  25968. })();
  25969. exports.HtmlTokenizeResult = HtmlTokenizeResult;
  25970. function tokenizeHtml(sourceContent, sourceUrl) {
  25971. return new _HtmlTokenizer(new parse_util_1.ParseSourceFile(sourceContent, sourceUrl)).tokenize();
  25972. }
  25973. exports.tokenizeHtml = tokenizeHtml;
  25974. var $EOF = 0;
  25975. var $TAB = 9;
  25976. var $LF = 10;
  25977. var $FF = 12;
  25978. var $CR = 13;
  25979. var $SPACE = 32;
  25980. var $BANG = 33;
  25981. var $DQ = 34;
  25982. var $HASH = 35;
  25983. var $$ = 36;
  25984. var $AMPERSAND = 38;
  25985. var $SQ = 39;
  25986. var $MINUS = 45;
  25987. var $SLASH = 47;
  25988. var $0 = 48;
  25989. var $SEMICOLON = 59;
  25990. var $9 = 57;
  25991. var $COLON = 58;
  25992. var $LT = 60;
  25993. var $EQ = 61;
  25994. var $GT = 62;
  25995. var $QUESTION = 63;
  25996. var $A = 65;
  25997. var $Z = 90;
  25998. var $LBRACKET = 91;
  25999. var $RBRACKET = 93;
  26000. var $a = 97;
  26001. var $f = 102;
  26002. var $z = 122;
  26003. var $x = 120;
  26004. var $NBSP = 160;
  26005. var CR_OR_CRLF_REGEXP = /\r\n?/g;
  26006. function unexpectedCharacterErrorMsg(charCode) {
  26007. var char = charCode === $EOF ? 'EOF' : lang_1.StringWrapper.fromCharCode(charCode);
  26008. return "Unexpected character \"" + char + "\"";
  26009. }
  26010. function unknownEntityErrorMsg(entitySrc) {
  26011. return "Unknown entity \"" + entitySrc + "\" - use the \"&#<decimal>;\" or \"&#x<hex>;\" syntax";
  26012. }
  26013. var ControlFlowError = (function () {
  26014. function ControlFlowError(error) {
  26015. this.error = error;
  26016. }
  26017. return ControlFlowError;
  26018. })();
  26019. // See http://www.w3.org/TR/html51/syntax.html#writing
  26020. var _HtmlTokenizer = (function () {
  26021. function _HtmlTokenizer(file) {
  26022. this.file = file;
  26023. // Note: this is always lowercase!
  26024. this.peek = -1;
  26025. this.index = -1;
  26026. this.line = 0;
  26027. this.column = -1;
  26028. this.tokens = [];
  26029. this.errors = [];
  26030. this.input = file.content;
  26031. this.inputLowercase = file.content.toLowerCase();
  26032. this.length = file.content.length;
  26033. this._advance();
  26034. }
  26035. _HtmlTokenizer.prototype._processCarriageReturns = function (content) {
  26036. // http://www.w3.org/TR/html5/syntax.html#preprocessing-the-input-stream
  26037. // In order to keep the original position in the source, we can not pre-process it.
  26038. // Instead CRs are processed right before instantiating the tokens.
  26039. return lang_1.StringWrapper.replaceAll(content, CR_OR_CRLF_REGEXP, '\n');
  26040. };
  26041. _HtmlTokenizer.prototype.tokenize = function () {
  26042. while (this.peek !== $EOF) {
  26043. var start = this._getLocation();
  26044. try {
  26045. if (this._attemptChar($LT)) {
  26046. if (this._attemptChar($BANG)) {
  26047. if (this._attemptChar($LBRACKET)) {
  26048. this._consumeCdata(start);
  26049. }
  26050. else if (this._attemptChar($MINUS)) {
  26051. this._consumeComment(start);
  26052. }
  26053. else {
  26054. this._consumeDocType(start);
  26055. }
  26056. }
  26057. else if (this._attemptChar($SLASH)) {
  26058. this._consumeTagClose(start);
  26059. }
  26060. else {
  26061. this._consumeTagOpen(start);
  26062. }
  26063. }
  26064. else {
  26065. this._consumeText();
  26066. }
  26067. }
  26068. catch (e) {
  26069. if (e instanceof ControlFlowError) {
  26070. this.errors.push(e.error);
  26071. }
  26072. else {
  26073. throw e;
  26074. }
  26075. }
  26076. }
  26077. this._beginToken(HtmlTokenType.EOF);
  26078. this._endToken([]);
  26079. return new HtmlTokenizeResult(mergeTextTokens(this.tokens), this.errors);
  26080. };
  26081. _HtmlTokenizer.prototype._getLocation = function () {
  26082. return new parse_util_1.ParseLocation(this.file, this.index, this.line, this.column);
  26083. };
  26084. _HtmlTokenizer.prototype._beginToken = function (type, start) {
  26085. if (start === void 0) { start = null; }
  26086. if (lang_1.isBlank(start)) {
  26087. start = this._getLocation();
  26088. }
  26089. this.currentTokenStart = start;
  26090. this.currentTokenType = type;
  26091. };
  26092. _HtmlTokenizer.prototype._endToken = function (parts, end) {
  26093. if (end === void 0) { end = null; }
  26094. if (lang_1.isBlank(end)) {
  26095. end = this._getLocation();
  26096. }
  26097. var token = new HtmlToken(this.currentTokenType, parts, new parse_util_1.ParseSourceSpan(this.currentTokenStart, end));
  26098. this.tokens.push(token);
  26099. this.currentTokenStart = null;
  26100. this.currentTokenType = null;
  26101. return token;
  26102. };
  26103. _HtmlTokenizer.prototype._createError = function (msg, position) {
  26104. var error = new HtmlTokenError(msg, this.currentTokenType, position);
  26105. this.currentTokenStart = null;
  26106. this.currentTokenType = null;
  26107. return new ControlFlowError(error);
  26108. };
  26109. _HtmlTokenizer.prototype._advance = function () {
  26110. if (this.index >= this.length) {
  26111. throw this._createError(unexpectedCharacterErrorMsg($EOF), this._getLocation());
  26112. }
  26113. if (this.peek === $LF) {
  26114. this.line++;
  26115. this.column = 0;
  26116. }
  26117. else if (this.peek !== $LF && this.peek !== $CR) {
  26118. this.column++;
  26119. }
  26120. this.index++;
  26121. this.peek = this.index >= this.length ? $EOF : lang_1.StringWrapper.charCodeAt(this.inputLowercase, this.index);
  26122. };
  26123. _HtmlTokenizer.prototype._attemptChar = function (charCode) {
  26124. if (this.peek === charCode) {
  26125. this._advance();
  26126. return true;
  26127. }
  26128. return false;
  26129. };
  26130. _HtmlTokenizer.prototype._requireChar = function (charCode) {
  26131. var location = this._getLocation();
  26132. if (!this._attemptChar(charCode)) {
  26133. throw this._createError(unexpectedCharacterErrorMsg(this.peek), location);
  26134. }
  26135. };
  26136. _HtmlTokenizer.prototype._attemptChars = function (chars) {
  26137. for (var i = 0; i < chars.length; i++) {
  26138. if (!this._attemptChar(lang_1.StringWrapper.charCodeAt(chars, i))) {
  26139. return false;
  26140. }
  26141. }
  26142. return true;
  26143. };
  26144. _HtmlTokenizer.prototype._requireChars = function (chars) {
  26145. var location = this._getLocation();
  26146. if (!this._attemptChars(chars)) {
  26147. throw this._createError(unexpectedCharacterErrorMsg(this.peek), location);
  26148. }
  26149. };
  26150. _HtmlTokenizer.prototype._attemptUntilFn = function (predicate) {
  26151. while (!predicate(this.peek)) {
  26152. this._advance();
  26153. }
  26154. };
  26155. _HtmlTokenizer.prototype._requireUntilFn = function (predicate, len) {
  26156. var start = this._getLocation();
  26157. this._attemptUntilFn(predicate);
  26158. if (this.index - start.offset < len) {
  26159. throw this._createError(unexpectedCharacterErrorMsg(this.peek), start);
  26160. }
  26161. };
  26162. _HtmlTokenizer.prototype._attemptUntilChar = function (char) {
  26163. while (this.peek !== char) {
  26164. this._advance();
  26165. }
  26166. };
  26167. _HtmlTokenizer.prototype._readChar = function (decodeEntities) {
  26168. if (decodeEntities && this.peek === $AMPERSAND) {
  26169. return this._decodeEntity();
  26170. }
  26171. else {
  26172. var index = this.index;
  26173. this._advance();
  26174. return this.input[index];
  26175. }
  26176. };
  26177. _HtmlTokenizer.prototype._decodeEntity = function () {
  26178. var start = this._getLocation();
  26179. this._advance();
  26180. if (this._attemptChar($HASH)) {
  26181. var isHex = this._attemptChar($x);
  26182. var numberStart = this._getLocation().offset;
  26183. this._attemptUntilFn(isDigitEntityEnd);
  26184. if (this.peek != $SEMICOLON) {
  26185. throw this._createError(unexpectedCharacterErrorMsg(this.peek), this._getLocation());
  26186. }
  26187. this._advance();
  26188. var strNum = this.input.substring(numberStart, this.index - 1);
  26189. try {
  26190. var charCode = lang_1.NumberWrapper.parseInt(strNum, isHex ? 16 : 10);
  26191. return lang_1.StringWrapper.fromCharCode(charCode);
  26192. }
  26193. catch (e) {
  26194. var entity = this.input.substring(start.offset + 1, this.index - 1);
  26195. throw this._createError(unknownEntityErrorMsg(entity), start);
  26196. }
  26197. }
  26198. else {
  26199. var startPosition = this._savePosition();
  26200. this._attemptUntilFn(isNamedEntityEnd);
  26201. if (this.peek != $SEMICOLON) {
  26202. this._restorePosition(startPosition);
  26203. return '&';
  26204. }
  26205. this._advance();
  26206. var name_1 = this.input.substring(start.offset + 1, this.index - 1);
  26207. var char = html_tags_1.NAMED_ENTITIES[name_1];
  26208. if (lang_1.isBlank(char)) {
  26209. throw this._createError(unknownEntityErrorMsg(name_1), start);
  26210. }
  26211. return char;
  26212. }
  26213. };
  26214. _HtmlTokenizer.prototype._consumeRawText = function (decodeEntities, firstCharOfEnd, attemptEndRest) {
  26215. var tagCloseStart;
  26216. var textStart = this._getLocation();
  26217. this._beginToken(decodeEntities ? HtmlTokenType.ESCAPABLE_RAW_TEXT : HtmlTokenType.RAW_TEXT, textStart);
  26218. var parts = [];
  26219. while (true) {
  26220. tagCloseStart = this._getLocation();
  26221. if (this._attemptChar(firstCharOfEnd) && attemptEndRest()) {
  26222. break;
  26223. }
  26224. if (this.index > tagCloseStart.offset) {
  26225. parts.push(this.input.substring(tagCloseStart.offset, this.index));
  26226. }
  26227. while (this.peek !== firstCharOfEnd) {
  26228. parts.push(this._readChar(decodeEntities));
  26229. }
  26230. }
  26231. return this._endToken([this._processCarriageReturns(parts.join(''))], tagCloseStart);
  26232. };
  26233. _HtmlTokenizer.prototype._consumeComment = function (start) {
  26234. var _this = this;
  26235. this._beginToken(HtmlTokenType.COMMENT_START, start);
  26236. this._requireChar($MINUS);
  26237. this._endToken([]);
  26238. var textToken = this._consumeRawText(false, $MINUS, function () { return _this._attemptChars('->'); });
  26239. this._beginToken(HtmlTokenType.COMMENT_END, textToken.sourceSpan.end);
  26240. this._endToken([]);
  26241. };
  26242. _HtmlTokenizer.prototype._consumeCdata = function (start) {
  26243. var _this = this;
  26244. this._beginToken(HtmlTokenType.CDATA_START, start);
  26245. this._requireChars('cdata[');
  26246. this._endToken([]);
  26247. var textToken = this._consumeRawText(false, $RBRACKET, function () { return _this._attemptChars(']>'); });
  26248. this._beginToken(HtmlTokenType.CDATA_END, textToken.sourceSpan.end);
  26249. this._endToken([]);
  26250. };
  26251. _HtmlTokenizer.prototype._consumeDocType = function (start) {
  26252. this._beginToken(HtmlTokenType.DOC_TYPE, start);
  26253. this._attemptUntilChar($GT);
  26254. this._advance();
  26255. this._endToken([this.input.substring(start.offset + 2, this.index - 1)]);
  26256. };
  26257. _HtmlTokenizer.prototype._consumePrefixAndName = function () {
  26258. var nameOrPrefixStart = this.index;
  26259. var prefix = null;
  26260. while (this.peek !== $COLON && !isPrefixEnd(this.peek)) {
  26261. this._advance();
  26262. }
  26263. var nameStart;
  26264. if (this.peek === $COLON) {
  26265. this._advance();
  26266. prefix = this.input.substring(nameOrPrefixStart, this.index - 1);
  26267. nameStart = this.index;
  26268. }
  26269. else {
  26270. nameStart = nameOrPrefixStart;
  26271. }
  26272. this._requireUntilFn(isNameEnd, this.index === nameStart ? 1 : 0);
  26273. var name = this.input.substring(nameStart, this.index);
  26274. return [prefix, name];
  26275. };
  26276. _HtmlTokenizer.prototype._consumeTagOpen = function (start) {
  26277. var savedPos = this._savePosition();
  26278. var lowercaseTagName;
  26279. try {
  26280. if (!isAsciiLetter(this.peek)) {
  26281. throw this._createError(unexpectedCharacterErrorMsg(this.peek), this._getLocation());
  26282. }
  26283. var nameStart = this.index;
  26284. this._consumeTagOpenStart(start);
  26285. lowercaseTagName = this.inputLowercase.substring(nameStart, this.index);
  26286. this._attemptUntilFn(isNotWhitespace);
  26287. while (this.peek !== $SLASH && this.peek !== $GT) {
  26288. this._consumeAttributeName();
  26289. this._attemptUntilFn(isNotWhitespace);
  26290. if (this._attemptChar($EQ)) {
  26291. this._attemptUntilFn(isNotWhitespace);
  26292. this._consumeAttributeValue();
  26293. }
  26294. this._attemptUntilFn(isNotWhitespace);
  26295. }
  26296. this._consumeTagOpenEnd();
  26297. }
  26298. catch (e) {
  26299. if (e instanceof ControlFlowError) {
  26300. // When the start tag is invalid, assume we want a "<"
  26301. this._restorePosition(savedPos);
  26302. // Back to back text tokens are merged at the end
  26303. this._beginToken(HtmlTokenType.TEXT, start);
  26304. this._endToken(['<']);
  26305. return;
  26306. }
  26307. throw e;
  26308. }
  26309. var contentTokenType = html_tags_1.getHtmlTagDefinition(lowercaseTagName).contentType;
  26310. if (contentTokenType === html_tags_1.HtmlTagContentType.RAW_TEXT) {
  26311. this._consumeRawTextWithTagClose(lowercaseTagName, false);
  26312. }
  26313. else if (contentTokenType === html_tags_1.HtmlTagContentType.ESCAPABLE_RAW_TEXT) {
  26314. this._consumeRawTextWithTagClose(lowercaseTagName, true);
  26315. }
  26316. };
  26317. _HtmlTokenizer.prototype._consumeRawTextWithTagClose = function (lowercaseTagName, decodeEntities) {
  26318. var _this = this;
  26319. var textToken = this._consumeRawText(decodeEntities, $LT, function () {
  26320. if (!_this._attemptChar($SLASH))
  26321. return false;
  26322. _this._attemptUntilFn(isNotWhitespace);
  26323. if (!_this._attemptChars(lowercaseTagName))
  26324. return false;
  26325. _this._attemptUntilFn(isNotWhitespace);
  26326. if (!_this._attemptChar($GT))
  26327. return false;
  26328. return true;
  26329. });
  26330. this._beginToken(HtmlTokenType.TAG_CLOSE, textToken.sourceSpan.end);
  26331. this._endToken([null, lowercaseTagName]);
  26332. };
  26333. _HtmlTokenizer.prototype._consumeTagOpenStart = function (start) {
  26334. this._beginToken(HtmlTokenType.TAG_OPEN_START, start);
  26335. var parts = this._consumePrefixAndName();
  26336. this._endToken(parts);
  26337. };
  26338. _HtmlTokenizer.prototype._consumeAttributeName = function () {
  26339. this._beginToken(HtmlTokenType.ATTR_NAME);
  26340. var prefixAndName = this._consumePrefixAndName();
  26341. this._endToken(prefixAndName);
  26342. };
  26343. _HtmlTokenizer.prototype._consumeAttributeValue = function () {
  26344. this._beginToken(HtmlTokenType.ATTR_VALUE);
  26345. var value;
  26346. if (this.peek === $SQ || this.peek === $DQ) {
  26347. var quoteChar = this.peek;
  26348. this._advance();
  26349. var parts = [];
  26350. while (this.peek !== quoteChar) {
  26351. parts.push(this._readChar(true));
  26352. }
  26353. value = parts.join('');
  26354. this._advance();
  26355. }
  26356. else {
  26357. var valueStart = this.index;
  26358. this._requireUntilFn(isNameEnd, 1);
  26359. value = this.input.substring(valueStart, this.index);
  26360. }
  26361. this._endToken([this._processCarriageReturns(value)]);
  26362. };
  26363. _HtmlTokenizer.prototype._consumeTagOpenEnd = function () {
  26364. var tokenType = this._attemptChar($SLASH) ? HtmlTokenType.TAG_OPEN_END_VOID : HtmlTokenType.TAG_OPEN_END;
  26365. this._beginToken(tokenType);
  26366. this._requireChar($GT);
  26367. this._endToken([]);
  26368. };
  26369. _HtmlTokenizer.prototype._consumeTagClose = function (start) {
  26370. this._beginToken(HtmlTokenType.TAG_CLOSE, start);
  26371. this._attemptUntilFn(isNotWhitespace);
  26372. var prefixAndName;
  26373. prefixAndName = this._consumePrefixAndName();
  26374. this._attemptUntilFn(isNotWhitespace);
  26375. this._requireChar($GT);
  26376. this._endToken(prefixAndName);
  26377. };
  26378. _HtmlTokenizer.prototype._consumeText = function () {
  26379. var start = this._getLocation();
  26380. this._beginToken(HtmlTokenType.TEXT, start);
  26381. var parts = [this._readChar(true)];
  26382. while (!isTextEnd(this.peek)) {
  26383. parts.push(this._readChar(true));
  26384. }
  26385. this._endToken([this._processCarriageReturns(parts.join(''))]);
  26386. };
  26387. _HtmlTokenizer.prototype._savePosition = function () {
  26388. return [this.peek, this.index, this.column, this.line, this.tokens.length];
  26389. };
  26390. _HtmlTokenizer.prototype._restorePosition = function (position) {
  26391. this.peek = position[0];
  26392. this.index = position[1];
  26393. this.column = position[2];
  26394. this.line = position[3];
  26395. var nbTokens = position[4];
  26396. if (nbTokens < this.tokens.length) {
  26397. // remove any extra tokens
  26398. this.tokens = collection_1.ListWrapper.slice(this.tokens, 0, nbTokens);
  26399. }
  26400. };
  26401. return _HtmlTokenizer;
  26402. })();
  26403. function isNotWhitespace(code) {
  26404. return !isWhitespace(code) || code === $EOF;
  26405. }
  26406. function isWhitespace(code) {
  26407. return (code >= $TAB && code <= $SPACE) || (code === $NBSP);
  26408. }
  26409. function isNameEnd(code) {
  26410. return isWhitespace(code) || code === $GT || code === $SLASH || code === $SQ || code === $DQ ||
  26411. code === $EQ;
  26412. }
  26413. function isPrefixEnd(code) {
  26414. return (code < $a || $z < code) && (code < $A || $Z < code) && (code < $0 || code > $9);
  26415. }
  26416. function isDigitEntityEnd(code) {
  26417. return code == $SEMICOLON || code == $EOF || !isAsciiHexDigit(code);
  26418. }
  26419. function isNamedEntityEnd(code) {
  26420. return code == $SEMICOLON || code == $EOF || !isAsciiLetter(code);
  26421. }
  26422. function isTextEnd(code) {
  26423. return code === $LT || code === $EOF;
  26424. }
  26425. function isAsciiLetter(code) {
  26426. return code >= $a && code <= $z;
  26427. }
  26428. function isAsciiHexDigit(code) {
  26429. return code >= $a && code <= $f || code >= $0 && code <= $9;
  26430. }
  26431. function mergeTextTokens(srcTokens) {
  26432. var dstTokens = [];
  26433. var lastDstToken;
  26434. for (var i = 0; i < srcTokens.length; i++) {
  26435. var token = srcTokens[i];
  26436. if (lang_1.isPresent(lastDstToken) && lastDstToken.type == HtmlTokenType.TEXT &&
  26437. token.type == HtmlTokenType.TEXT) {
  26438. lastDstToken.parts[0] += token.parts[0];
  26439. lastDstToken.sourceSpan.end = token.sourceSpan.end;
  26440. }
  26441. else {
  26442. lastDstToken = token;
  26443. dstTokens.push(lastDstToken);
  26444. }
  26445. }
  26446. return dstTokens;
  26447. }
  26448. /***/ },
  26449. /* 171 */
  26450. /***/ function(module, exports) {
  26451. var ParseLocation = (function () {
  26452. function ParseLocation(file, offset, line, col) {
  26453. this.file = file;
  26454. this.offset = offset;
  26455. this.line = line;
  26456. this.col = col;
  26457. }
  26458. ParseLocation.prototype.toString = function () { return this.file.url + "@" + this.line + ":" + this.col; };
  26459. return ParseLocation;
  26460. })();
  26461. exports.ParseLocation = ParseLocation;
  26462. var ParseSourceFile = (function () {
  26463. function ParseSourceFile(content, url) {
  26464. this.content = content;
  26465. this.url = url;
  26466. }
  26467. return ParseSourceFile;
  26468. })();
  26469. exports.ParseSourceFile = ParseSourceFile;
  26470. var ParseError = (function () {
  26471. function ParseError(location, msg) {
  26472. this.location = location;
  26473. this.msg = msg;
  26474. }
  26475. ParseError.prototype.toString = function () {
  26476. var source = this.location.file.content;
  26477. var ctxStart = this.location.offset;
  26478. if (ctxStart > source.length - 1) {
  26479. ctxStart = source.length - 1;
  26480. }
  26481. var ctxEnd = ctxStart;
  26482. var ctxLen = 0;
  26483. var ctxLines = 0;
  26484. while (ctxLen < 100 && ctxStart > 0) {
  26485. ctxStart--;
  26486. ctxLen++;
  26487. if (source[ctxStart] == "\n") {
  26488. if (++ctxLines == 3) {
  26489. break;
  26490. }
  26491. }
  26492. }
  26493. ctxLen = 0;
  26494. ctxLines = 0;
  26495. while (ctxLen < 100 && ctxEnd < source.length - 1) {
  26496. ctxEnd++;
  26497. ctxLen++;
  26498. if (source[ctxEnd] == "\n") {
  26499. if (++ctxLines == 3) {
  26500. break;
  26501. }
  26502. }
  26503. }
  26504. var context = source.substring(ctxStart, this.location.offset) + '[ERROR ->]' +
  26505. source.substring(this.location.offset, ctxEnd + 1);
  26506. return this.msg + " (\"" + context + "\"): " + this.location;
  26507. };
  26508. return ParseError;
  26509. })();
  26510. exports.ParseError = ParseError;
  26511. var ParseSourceSpan = (function () {
  26512. function ParseSourceSpan(start, end) {
  26513. this.start = start;
  26514. this.end = end;
  26515. }
  26516. ParseSourceSpan.prototype.toString = function () {
  26517. return this.start.file.content.substring(this.start.offset, this.end.offset);
  26518. };
  26519. return ParseSourceSpan;
  26520. })();
  26521. exports.ParseSourceSpan = ParseSourceSpan;
  26522. /***/ },
  26523. /* 172 */
  26524. /***/ function(module, exports, __webpack_require__) {
  26525. var lang_1 = __webpack_require__(5);
  26526. // see http://www.w3.org/TR/html51/syntax.html#named-character-references
  26527. // see https://html.spec.whatwg.org/multipage/entities.json
  26528. // This list is not exhaustive to keep the compiler footprint low.
  26529. // The `&#123;` / `&#x1ab;` syntax should be used when the named character reference does not exist.
  26530. exports.NAMED_ENTITIES = lang_1.CONST_EXPR({
  26531. 'Aacute': '\u00C1',
  26532. 'aacute': '\u00E1',
  26533. 'Acirc': '\u00C2',
  26534. 'acirc': '\u00E2',
  26535. 'acute': '\u00B4',
  26536. 'AElig': '\u00C6',
  26537. 'aelig': '\u00E6',
  26538. 'Agrave': '\u00C0',
  26539. 'agrave': '\u00E0',
  26540. 'alefsym': '\u2135',
  26541. 'Alpha': '\u0391',
  26542. 'alpha': '\u03B1',
  26543. 'amp': '&',
  26544. 'and': '\u2227',
  26545. 'ang': '\u2220',
  26546. 'apos': '\u0027',
  26547. 'Aring': '\u00C5',
  26548. 'aring': '\u00E5',
  26549. 'asymp': '\u2248',
  26550. 'Atilde': '\u00C3',
  26551. 'atilde': '\u00E3',
  26552. 'Auml': '\u00C4',
  26553. 'auml': '\u00E4',
  26554. 'bdquo': '\u201E',
  26555. 'Beta': '\u0392',
  26556. 'beta': '\u03B2',
  26557. 'brvbar': '\u00A6',
  26558. 'bull': '\u2022',
  26559. 'cap': '\u2229',
  26560. 'Ccedil': '\u00C7',
  26561. 'ccedil': '\u00E7',
  26562. 'cedil': '\u00B8',
  26563. 'cent': '\u00A2',
  26564. 'Chi': '\u03A7',
  26565. 'chi': '\u03C7',
  26566. 'circ': '\u02C6',
  26567. 'clubs': '\u2663',
  26568. 'cong': '\u2245',
  26569. 'copy': '\u00A9',
  26570. 'crarr': '\u21B5',
  26571. 'cup': '\u222A',
  26572. 'curren': '\u00A4',
  26573. 'dagger': '\u2020',
  26574. 'Dagger': '\u2021',
  26575. 'darr': '\u2193',
  26576. 'dArr': '\u21D3',
  26577. 'deg': '\u00B0',
  26578. 'Delta': '\u0394',
  26579. 'delta': '\u03B4',
  26580. 'diams': '\u2666',
  26581. 'divide': '\u00F7',
  26582. 'Eacute': '\u00C9',
  26583. 'eacute': '\u00E9',
  26584. 'Ecirc': '\u00CA',
  26585. 'ecirc': '\u00EA',
  26586. 'Egrave': '\u00C8',
  26587. 'egrave': '\u00E8',
  26588. 'empty': '\u2205',
  26589. 'emsp': '\u2003',
  26590. 'ensp': '\u2002',
  26591. 'Epsilon': '\u0395',
  26592. 'epsilon': '\u03B5',
  26593. 'equiv': '\u2261',
  26594. 'Eta': '\u0397',
  26595. 'eta': '\u03B7',
  26596. 'ETH': '\u00D0',
  26597. 'eth': '\u00F0',
  26598. 'Euml': '\u00CB',
  26599. 'euml': '\u00EB',
  26600. 'euro': '\u20AC',
  26601. 'exist': '\u2203',
  26602. 'fnof': '\u0192',
  26603. 'forall': '\u2200',
  26604. 'frac12': '\u00BD',
  26605. 'frac14': '\u00BC',
  26606. 'frac34': '\u00BE',
  26607. 'frasl': '\u2044',
  26608. 'Gamma': '\u0393',
  26609. 'gamma': '\u03B3',
  26610. 'ge': '\u2265',
  26611. 'gt': '>',
  26612. 'harr': '\u2194',
  26613. 'hArr': '\u21D4',
  26614. 'hearts': '\u2665',
  26615. 'hellip': '\u2026',
  26616. 'Iacute': '\u00CD',
  26617. 'iacute': '\u00ED',
  26618. 'Icirc': '\u00CE',
  26619. 'icirc': '\u00EE',
  26620. 'iexcl': '\u00A1',
  26621. 'Igrave': '\u00CC',
  26622. 'igrave': '\u00EC',
  26623. 'image': '\u2111',
  26624. 'infin': '\u221E',
  26625. 'int': '\u222B',
  26626. 'Iota': '\u0399',
  26627. 'iota': '\u03B9',
  26628. 'iquest': '\u00BF',
  26629. 'isin': '\u2208',
  26630. 'Iuml': '\u00CF',
  26631. 'iuml': '\u00EF',
  26632. 'Kappa': '\u039A',
  26633. 'kappa': '\u03BA',
  26634. 'Lambda': '\u039B',
  26635. 'lambda': '\u03BB',
  26636. 'lang': '\u27E8',
  26637. 'laquo': '\u00AB',
  26638. 'larr': '\u2190',
  26639. 'lArr': '\u21D0',
  26640. 'lceil': '\u2308',
  26641. 'ldquo': '\u201C',
  26642. 'le': '\u2264',
  26643. 'lfloor': '\u230A',
  26644. 'lowast': '\u2217',
  26645. 'loz': '\u25CA',
  26646. 'lrm': '\u200E',
  26647. 'lsaquo': '\u2039',
  26648. 'lsquo': '\u2018',
  26649. 'lt': '<',
  26650. 'macr': '\u00AF',
  26651. 'mdash': '\u2014',
  26652. 'micro': '\u00B5',
  26653. 'middot': '\u00B7',
  26654. 'minus': '\u2212',
  26655. 'Mu': '\u039C',
  26656. 'mu': '\u03BC',
  26657. 'nabla': '\u2207',
  26658. 'nbsp': '\u00A0',
  26659. 'ndash': '\u2013',
  26660. 'ne': '\u2260',
  26661. 'ni': '\u220B',
  26662. 'not': '\u00AC',
  26663. 'notin': '\u2209',
  26664. 'nsub': '\u2284',
  26665. 'Ntilde': '\u00D1',
  26666. 'ntilde': '\u00F1',
  26667. 'Nu': '\u039D',
  26668. 'nu': '\u03BD',
  26669. 'Oacute': '\u00D3',
  26670. 'oacute': '\u00F3',
  26671. 'Ocirc': '\u00D4',
  26672. 'ocirc': '\u00F4',
  26673. 'OElig': '\u0152',
  26674. 'oelig': '\u0153',
  26675. 'Ograve': '\u00D2',
  26676. 'ograve': '\u00F2',
  26677. 'oline': '\u203E',
  26678. 'Omega': '\u03A9',
  26679. 'omega': '\u03C9',
  26680. 'Omicron': '\u039F',
  26681. 'omicron': '\u03BF',
  26682. 'oplus': '\u2295',
  26683. 'or': '\u2228',
  26684. 'ordf': '\u00AA',
  26685. 'ordm': '\u00BA',
  26686. 'Oslash': '\u00D8',
  26687. 'oslash': '\u00F8',
  26688. 'Otilde': '\u00D5',
  26689. 'otilde': '\u00F5',
  26690. 'otimes': '\u2297',
  26691. 'Ouml': '\u00D6',
  26692. 'ouml': '\u00F6',
  26693. 'para': '\u00B6',
  26694. 'permil': '\u2030',
  26695. 'perp': '\u22A5',
  26696. 'Phi': '\u03A6',
  26697. 'phi': '\u03C6',
  26698. 'Pi': '\u03A0',
  26699. 'pi': '\u03C0',
  26700. 'piv': '\u03D6',
  26701. 'plusmn': '\u00B1',
  26702. 'pound': '\u00A3',
  26703. 'prime': '\u2032',
  26704. 'Prime': '\u2033',
  26705. 'prod': '\u220F',
  26706. 'prop': '\u221D',
  26707. 'Psi': '\u03A8',
  26708. 'psi': '\u03C8',
  26709. 'quot': '\u0022',
  26710. 'radic': '\u221A',
  26711. 'rang': '\u27E9',
  26712. 'raquo': '\u00BB',
  26713. 'rarr': '\u2192',
  26714. 'rArr': '\u21D2',
  26715. 'rceil': '\u2309',
  26716. 'rdquo': '\u201D',
  26717. 'real': '\u211C',
  26718. 'reg': '\u00AE',
  26719. 'rfloor': '\u230B',
  26720. 'Rho': '\u03A1',
  26721. 'rho': '\u03C1',
  26722. 'rlm': '\u200F',
  26723. 'rsaquo': '\u203A',
  26724. 'rsquo': '\u2019',
  26725. 'sbquo': '\u201A',
  26726. 'Scaron': '\u0160',
  26727. 'scaron': '\u0161',
  26728. 'sdot': '\u22C5',
  26729. 'sect': '\u00A7',
  26730. 'shy': '\u00AD',
  26731. 'Sigma': '\u03A3',
  26732. 'sigma': '\u03C3',
  26733. 'sigmaf': '\u03C2',
  26734. 'sim': '\u223C',
  26735. 'spades': '\u2660',
  26736. 'sub': '\u2282',
  26737. 'sube': '\u2286',
  26738. 'sum': '\u2211',
  26739. 'sup': '\u2283',
  26740. 'sup1': '\u00B9',
  26741. 'sup2': '\u00B2',
  26742. 'sup3': '\u00B3',
  26743. 'supe': '\u2287',
  26744. 'szlig': '\u00DF',
  26745. 'Tau': '\u03A4',
  26746. 'tau': '\u03C4',
  26747. 'there4': '\u2234',
  26748. 'Theta': '\u0398',
  26749. 'theta': '\u03B8',
  26750. 'thetasym': '\u03D1',
  26751. 'thinsp': '\u2009',
  26752. 'THORN': '\u00DE',
  26753. 'thorn': '\u00FE',
  26754. 'tilde': '\u02DC',
  26755. 'times': '\u00D7',
  26756. 'trade': '\u2122',
  26757. 'Uacute': '\u00DA',
  26758. 'uacute': '\u00FA',
  26759. 'uarr': '\u2191',
  26760. 'uArr': '\u21D1',
  26761. 'Ucirc': '\u00DB',
  26762. 'ucirc': '\u00FB',
  26763. 'Ugrave': '\u00D9',
  26764. 'ugrave': '\u00F9',
  26765. 'uml': '\u00A8',
  26766. 'upsih': '\u03D2',
  26767. 'Upsilon': '\u03A5',
  26768. 'upsilon': '\u03C5',
  26769. 'Uuml': '\u00DC',
  26770. 'uuml': '\u00FC',
  26771. 'weierp': '\u2118',
  26772. 'Xi': '\u039E',
  26773. 'xi': '\u03BE',
  26774. 'Yacute': '\u00DD',
  26775. 'yacute': '\u00FD',
  26776. 'yen': '\u00A5',
  26777. 'yuml': '\u00FF',
  26778. 'Yuml': '\u0178',
  26779. 'Zeta': '\u0396',
  26780. 'zeta': '\u03B6',
  26781. 'zwj': '\u200D',
  26782. 'zwnj': '\u200C',
  26783. });
  26784. (function (HtmlTagContentType) {
  26785. HtmlTagContentType[HtmlTagContentType["RAW_TEXT"] = 0] = "RAW_TEXT";
  26786. HtmlTagContentType[HtmlTagContentType["ESCAPABLE_RAW_TEXT"] = 1] = "ESCAPABLE_RAW_TEXT";
  26787. HtmlTagContentType[HtmlTagContentType["PARSABLE_DATA"] = 2] = "PARSABLE_DATA";
  26788. })(exports.HtmlTagContentType || (exports.HtmlTagContentType = {}));
  26789. var HtmlTagContentType = exports.HtmlTagContentType;
  26790. var HtmlTagDefinition = (function () {
  26791. function HtmlTagDefinition(_a) {
  26792. var _this = this;
  26793. 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;
  26794. this.closedByChildren = {};
  26795. this.closedByParent = false;
  26796. if (lang_1.isPresent(closedByChildren) && closedByChildren.length > 0) {
  26797. closedByChildren.forEach(function (tagName) { return _this.closedByChildren[tagName] = true; });
  26798. }
  26799. this.isVoid = lang_1.normalizeBool(isVoid);
  26800. this.closedByParent = lang_1.normalizeBool(closedByParent) || this.isVoid;
  26801. if (lang_1.isPresent(requiredParents) && requiredParents.length > 0) {
  26802. this.requiredParents = {};
  26803. this.parentToAdd = requiredParents[0];
  26804. requiredParents.forEach(function (tagName) { return _this.requiredParents[tagName] = true; });
  26805. }
  26806. this.implicitNamespacePrefix = implicitNamespacePrefix;
  26807. this.contentType = lang_1.isPresent(contentType) ? contentType : HtmlTagContentType.PARSABLE_DATA;
  26808. this.ignoreFirstLf = lang_1.normalizeBool(ignoreFirstLf);
  26809. }
  26810. HtmlTagDefinition.prototype.requireExtraParent = function (currentParent) {
  26811. if (lang_1.isBlank(this.requiredParents)) {
  26812. return false;
  26813. }
  26814. if (lang_1.isBlank(currentParent)) {
  26815. return true;
  26816. }
  26817. var lcParent = currentParent.toLowerCase();
  26818. return this.requiredParents[lcParent] != true && lcParent != 'template';
  26819. };
  26820. HtmlTagDefinition.prototype.isClosedByChild = function (name) {
  26821. return this.isVoid || lang_1.normalizeBool(this.closedByChildren[name.toLowerCase()]);
  26822. };
  26823. return HtmlTagDefinition;
  26824. })();
  26825. exports.HtmlTagDefinition = HtmlTagDefinition;
  26826. // see http://www.w3.org/TR/html51/syntax.html#optional-tags
  26827. // This implementation does not fully conform to the HTML5 spec.
  26828. var TAG_DEFINITIONS = {
  26829. 'area': new HtmlTagDefinition({ isVoid: true }),
  26830. 'embed': new HtmlTagDefinition({ isVoid: true }),
  26831. 'link': new HtmlTagDefinition({ isVoid: true }),
  26832. 'img': new HtmlTagDefinition({ isVoid: true }),
  26833. 'input': new HtmlTagDefinition({ isVoid: true }),
  26834. 'param': new HtmlTagDefinition({ isVoid: true }),
  26835. 'hr': new HtmlTagDefinition({ isVoid: true }),
  26836. 'br': new HtmlTagDefinition({ isVoid: true }),
  26837. 'source': new HtmlTagDefinition({ isVoid: true }),
  26838. 'track': new HtmlTagDefinition({ isVoid: true }),
  26839. 'wbr': new HtmlTagDefinition({ isVoid: true }),
  26840. 'p': new HtmlTagDefinition({
  26841. closedByChildren: [
  26842. 'address',
  26843. 'article',
  26844. 'aside',
  26845. 'blockquote',
  26846. 'div',
  26847. 'dl',
  26848. 'fieldset',
  26849. 'footer',
  26850. 'form',
  26851. 'h1',
  26852. 'h2',
  26853. 'h3',
  26854. 'h4',
  26855. 'h5',
  26856. 'h6',
  26857. 'header',
  26858. 'hgroup',
  26859. 'hr',
  26860. 'main',
  26861. 'nav',
  26862. 'ol',
  26863. 'p',
  26864. 'pre',
  26865. 'section',
  26866. 'table',
  26867. 'ul'
  26868. ],
  26869. closedByParent: true
  26870. }),
  26871. 'thead': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'] }),
  26872. 'tbody': new HtmlTagDefinition({ closedByChildren: ['tbody', 'tfoot'], closedByParent: true }),
  26873. 'tfoot': new HtmlTagDefinition({ closedByChildren: ['tbody'], closedByParent: true }),
  26874. 'tr': new HtmlTagDefinition({
  26875. closedByChildren: ['tr'],
  26876. requiredParents: ['tbody', 'tfoot', 'thead'],
  26877. closedByParent: true
  26878. }),
  26879. 'td': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),
  26880. 'th': new HtmlTagDefinition({ closedByChildren: ['td', 'th'], closedByParent: true }),
  26881. 'col': new HtmlTagDefinition({ requiredParents: ['colgroup'], isVoid: true }),
  26882. 'svg': new HtmlTagDefinition({ implicitNamespacePrefix: 'svg' }),
  26883. 'math': new HtmlTagDefinition({ implicitNamespacePrefix: 'math' }),
  26884. 'li': new HtmlTagDefinition({ closedByChildren: ['li'], closedByParent: true }),
  26885. 'dt': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'] }),
  26886. 'dd': new HtmlTagDefinition({ closedByChildren: ['dt', 'dd'], closedByParent: true }),
  26887. 'rb': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
  26888. 'rt': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
  26889. 'rtc': new HtmlTagDefinition({ closedByChildren: ['rb', 'rtc', 'rp'], closedByParent: true }),
  26890. 'rp': new HtmlTagDefinition({ closedByChildren: ['rb', 'rt', 'rtc', 'rp'], closedByParent: true }),
  26891. 'optgroup': new HtmlTagDefinition({ closedByChildren: ['optgroup'], closedByParent: true }),
  26892. 'option': new HtmlTagDefinition({ closedByChildren: ['option', 'optgroup'], closedByParent: true }),
  26893. 'pre': new HtmlTagDefinition({ ignoreFirstLf: true }),
  26894. 'listing': new HtmlTagDefinition({ ignoreFirstLf: true }),
  26895. 'style': new HtmlTagDefinition({ contentType: HtmlTagContentType.RAW_TEXT }),
  26896. 'script': new HtmlTagDefinition({ contentType: HtmlTagContentType.RAW_TEXT }),
  26897. 'title': new HtmlTagDefinition({ contentType: HtmlTagContentType.ESCAPABLE_RAW_TEXT }),
  26898. 'textarea': new HtmlTagDefinition({ contentType: HtmlTagContentType.ESCAPABLE_RAW_TEXT, ignoreFirstLf: true }),
  26899. };
  26900. var DEFAULT_TAG_DEFINITION = new HtmlTagDefinition();
  26901. function getHtmlTagDefinition(tagName) {
  26902. var result = TAG_DEFINITIONS[tagName.toLowerCase()];
  26903. return lang_1.isPresent(result) ? result : DEFAULT_TAG_DEFINITION;
  26904. }
  26905. exports.getHtmlTagDefinition = getHtmlTagDefinition;
  26906. var NS_PREFIX_RE = /^@([^:]+):(.+)/g;
  26907. function splitNsName(elementName) {
  26908. if (elementName[0] != '@') {
  26909. return [null, elementName];
  26910. }
  26911. var match = lang_1.RegExpWrapper.firstMatch(NS_PREFIX_RE, elementName);
  26912. return [match[1], match[2]];
  26913. }
  26914. exports.splitNsName = splitNsName;
  26915. function getNsPrefix(elementName) {
  26916. return splitNsName(elementName)[0];
  26917. }
  26918. exports.getNsPrefix = getNsPrefix;
  26919. /***/ },
  26920. /* 173 */
  26921. /***/ function(module, exports) {
  26922. var ElementSchemaRegistry = (function () {
  26923. function ElementSchemaRegistry() {
  26924. }
  26925. ElementSchemaRegistry.prototype.hasProperty = function (tagName, propName) { return true; };
  26926. ElementSchemaRegistry.prototype.getMappedPropName = function (propName) { return propName; };
  26927. return ElementSchemaRegistry;
  26928. })();
  26929. exports.ElementSchemaRegistry = ElementSchemaRegistry;
  26930. /***/ },
  26931. /* 174 */
  26932. /***/ function(module, exports, __webpack_require__) {
  26933. var lang_1 = __webpack_require__(5);
  26934. var html_tags_1 = __webpack_require__(172);
  26935. var NG_CONTENT_SELECT_ATTR = 'select';
  26936. var NG_CONTENT_ELEMENT = 'ng-content';
  26937. var LINK_ELEMENT = 'link';
  26938. var LINK_STYLE_REL_ATTR = 'rel';
  26939. var LINK_STYLE_HREF_ATTR = 'href';
  26940. var LINK_STYLE_REL_VALUE = 'stylesheet';
  26941. var STYLE_ELEMENT = 'style';
  26942. var SCRIPT_ELEMENT = 'script';
  26943. var NG_NON_BINDABLE_ATTR = 'ngNonBindable';
  26944. function preparseElement(ast) {
  26945. var selectAttr = null;
  26946. var hrefAttr = null;
  26947. var relAttr = null;
  26948. var nonBindable = false;
  26949. ast.attrs.forEach(function (attr) {
  26950. var lcAttrName = attr.name.toLowerCase();
  26951. if (lcAttrName == NG_CONTENT_SELECT_ATTR) {
  26952. selectAttr = attr.value;
  26953. }
  26954. else if (lcAttrName == LINK_STYLE_HREF_ATTR) {
  26955. hrefAttr = attr.value;
  26956. }
  26957. else if (lcAttrName == LINK_STYLE_REL_ATTR) {
  26958. relAttr = attr.value;
  26959. }
  26960. else if (attr.name == NG_NON_BINDABLE_ATTR) {
  26961. nonBindable = true;
  26962. }
  26963. });
  26964. selectAttr = normalizeNgContentSelect(selectAttr);
  26965. var nodeName = ast.name.toLowerCase();
  26966. var type = PreparsedElementType.OTHER;
  26967. if (html_tags_1.splitNsName(nodeName)[1] == NG_CONTENT_ELEMENT) {
  26968. type = PreparsedElementType.NG_CONTENT;
  26969. }
  26970. else if (nodeName == STYLE_ELEMENT) {
  26971. type = PreparsedElementType.STYLE;
  26972. }
  26973. else if (nodeName == SCRIPT_ELEMENT) {
  26974. type = PreparsedElementType.SCRIPT;
  26975. }
  26976. else if (nodeName == LINK_ELEMENT && relAttr == LINK_STYLE_REL_VALUE) {
  26977. type = PreparsedElementType.STYLESHEET;
  26978. }
  26979. return new PreparsedElement(type, selectAttr, hrefAttr, nonBindable);
  26980. }
  26981. exports.preparseElement = preparseElement;
  26982. (function (PreparsedElementType) {
  26983. PreparsedElementType[PreparsedElementType["NG_CONTENT"] = 0] = "NG_CONTENT";
  26984. PreparsedElementType[PreparsedElementType["STYLE"] = 1] = "STYLE";
  26985. PreparsedElementType[PreparsedElementType["STYLESHEET"] = 2] = "STYLESHEET";
  26986. PreparsedElementType[PreparsedElementType["SCRIPT"] = 3] = "SCRIPT";
  26987. PreparsedElementType[PreparsedElementType["OTHER"] = 4] = "OTHER";
  26988. })(exports.PreparsedElementType || (exports.PreparsedElementType = {}));
  26989. var PreparsedElementType = exports.PreparsedElementType;
  26990. var PreparsedElement = (function () {
  26991. function PreparsedElement(type, selectAttr, hrefAttr, nonBindable) {
  26992. this.type = type;
  26993. this.selectAttr = selectAttr;
  26994. this.hrefAttr = hrefAttr;
  26995. this.nonBindable = nonBindable;
  26996. }
  26997. return PreparsedElement;
  26998. })();
  26999. exports.PreparsedElement = PreparsedElement;
  27000. function normalizeNgContentSelect(selectAttr) {
  27001. if (lang_1.isBlank(selectAttr) || selectAttr.length === 0) {
  27002. return '*';
  27003. }
  27004. return selectAttr;
  27005. }
  27006. /***/ },
  27007. /* 175 */
  27008. /***/ function(module, exports, __webpack_require__) {
  27009. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27010. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27011. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27012. 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;
  27013. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27014. };
  27015. var __metadata = (this && this.__metadata) || function (k, v) {
  27016. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27017. };
  27018. var directive_metadata_1 = __webpack_require__(153);
  27019. var lang_1 = __webpack_require__(5);
  27020. var exceptions_1 = __webpack_require__(14);
  27021. var async_1 = __webpack_require__(60);
  27022. var xhr_1 = __webpack_require__(149);
  27023. var url_resolver_1 = __webpack_require__(148);
  27024. var style_url_resolver_1 = __webpack_require__(163);
  27025. var di_1 = __webpack_require__(6);
  27026. var view_1 = __webpack_require__(56);
  27027. var html_ast_1 = __webpack_require__(169);
  27028. var html_parser_1 = __webpack_require__(168);
  27029. var template_preparser_1 = __webpack_require__(174);
  27030. var TemplateNormalizer = (function () {
  27031. function TemplateNormalizer(_xhr, _urlResolver, _htmlParser) {
  27032. this._xhr = _xhr;
  27033. this._urlResolver = _urlResolver;
  27034. this._htmlParser = _htmlParser;
  27035. }
  27036. TemplateNormalizer.prototype.normalizeTemplate = function (directiveType, template) {
  27037. var _this = this;
  27038. if (lang_1.isPresent(template.template)) {
  27039. return async_1.PromiseWrapper.resolve(this.normalizeLoadedTemplate(directiveType, template, template.template, directiveType.moduleUrl));
  27040. }
  27041. else if (lang_1.isPresent(template.templateUrl)) {
  27042. var sourceAbsUrl = this._urlResolver.resolve(directiveType.moduleUrl, template.templateUrl);
  27043. return this._xhr.get(sourceAbsUrl)
  27044. .then(function (templateContent) { return _this.normalizeLoadedTemplate(directiveType, template, templateContent, sourceAbsUrl); });
  27045. }
  27046. else {
  27047. throw new exceptions_1.BaseException("No template specified for component " + directiveType.name);
  27048. }
  27049. };
  27050. TemplateNormalizer.prototype.normalizeLoadedTemplate = function (directiveType, templateMeta, template, templateAbsUrl) {
  27051. var _this = this;
  27052. var rootNodesAndErrors = this._htmlParser.parse(template, directiveType.name);
  27053. if (rootNodesAndErrors.errors.length > 0) {
  27054. var errorString = rootNodesAndErrors.errors.join('\n');
  27055. throw new exceptions_1.BaseException("Template parse errors:\n" + errorString);
  27056. }
  27057. var visitor = new TemplatePreparseVisitor();
  27058. html_ast_1.htmlVisitAll(visitor, rootNodesAndErrors.rootNodes);
  27059. var allStyles = templateMeta.styles.concat(visitor.styles);
  27060. var allStyleAbsUrls = visitor.styleUrls.filter(style_url_resolver_1.isStyleUrlResolvable)
  27061. .map(function (url) { return _this._urlResolver.resolve(templateAbsUrl, url); })
  27062. .concat(templateMeta.styleUrls.filter(style_url_resolver_1.isStyleUrlResolvable)
  27063. .map(function (url) { return _this._urlResolver.resolve(directiveType.moduleUrl, url); }));
  27064. var allResolvedStyles = allStyles.map(function (style) {
  27065. var styleWithImports = style_url_resolver_1.extractStyleUrls(_this._urlResolver, templateAbsUrl, style);
  27066. styleWithImports.styleUrls.forEach(function (styleUrl) { return allStyleAbsUrls.push(styleUrl); });
  27067. return styleWithImports.style;
  27068. });
  27069. var encapsulation = templateMeta.encapsulation;
  27070. if (encapsulation === view_1.ViewEncapsulation.Emulated && allResolvedStyles.length === 0 &&
  27071. allStyleAbsUrls.length === 0) {
  27072. encapsulation = view_1.ViewEncapsulation.None;
  27073. }
  27074. return new directive_metadata_1.CompileTemplateMetadata({
  27075. encapsulation: encapsulation,
  27076. template: template,
  27077. templateUrl: templateAbsUrl,
  27078. styles: allResolvedStyles,
  27079. styleUrls: allStyleAbsUrls,
  27080. ngContentSelectors: visitor.ngContentSelectors
  27081. });
  27082. };
  27083. TemplateNormalizer = __decorate([
  27084. di_1.Injectable(),
  27085. __metadata('design:paramtypes', [xhr_1.XHR, url_resolver_1.UrlResolver, html_parser_1.HtmlParser])
  27086. ], TemplateNormalizer);
  27087. return TemplateNormalizer;
  27088. })();
  27089. exports.TemplateNormalizer = TemplateNormalizer;
  27090. var TemplatePreparseVisitor = (function () {
  27091. function TemplatePreparseVisitor() {
  27092. this.ngContentSelectors = [];
  27093. this.styles = [];
  27094. this.styleUrls = [];
  27095. this.ngNonBindableStackCount = 0;
  27096. }
  27097. TemplatePreparseVisitor.prototype.visitElement = function (ast, context) {
  27098. var preparsedElement = template_preparser_1.preparseElement(ast);
  27099. switch (preparsedElement.type) {
  27100. case template_preparser_1.PreparsedElementType.NG_CONTENT:
  27101. if (this.ngNonBindableStackCount === 0) {
  27102. this.ngContentSelectors.push(preparsedElement.selectAttr);
  27103. }
  27104. break;
  27105. case template_preparser_1.PreparsedElementType.STYLE:
  27106. var textContent = '';
  27107. ast.children.forEach(function (child) {
  27108. if (child instanceof html_ast_1.HtmlTextAst) {
  27109. textContent += child.value;
  27110. }
  27111. });
  27112. this.styles.push(textContent);
  27113. break;
  27114. case template_preparser_1.PreparsedElementType.STYLESHEET:
  27115. this.styleUrls.push(preparsedElement.hrefAttr);
  27116. break;
  27117. }
  27118. if (preparsedElement.nonBindable) {
  27119. this.ngNonBindableStackCount++;
  27120. }
  27121. html_ast_1.htmlVisitAll(this, ast.children);
  27122. if (preparsedElement.nonBindable) {
  27123. this.ngNonBindableStackCount--;
  27124. }
  27125. return null;
  27126. };
  27127. TemplatePreparseVisitor.prototype.visitAttr = function (ast, context) { return null; };
  27128. TemplatePreparseVisitor.prototype.visitText = function (ast, context) { return null; };
  27129. return TemplatePreparseVisitor;
  27130. })();
  27131. /***/ },
  27132. /* 176 */
  27133. /***/ function(module, exports, __webpack_require__) {
  27134. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27135. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27136. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27137. 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;
  27138. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27139. };
  27140. var __metadata = (this && this.__metadata) || function (k, v) {
  27141. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27142. };
  27143. var __param = (this && this.__param) || function (paramIndex, decorator) {
  27144. return function (target, key) { decorator(target, key, paramIndex); }
  27145. };
  27146. var di_1 = __webpack_require__(6);
  27147. var lang_1 = __webpack_require__(5);
  27148. var exceptions_1 = __webpack_require__(14);
  27149. var cpl = __webpack_require__(153);
  27150. var md = __webpack_require__(23);
  27151. var directive_resolver_1 = __webpack_require__(92);
  27152. var view_resolver_1 = __webpack_require__(93);
  27153. var directive_lifecycle_reflector_1 = __webpack_require__(88);
  27154. var interfaces_1 = __webpack_require__(89);
  27155. var reflection_1 = __webpack_require__(16);
  27156. var di_2 = __webpack_require__(6);
  27157. var platform_directives_and_pipes_1 = __webpack_require__(95);
  27158. var util_1 = __webpack_require__(155);
  27159. var url_resolver_1 = __webpack_require__(148);
  27160. var RuntimeMetadataResolver = (function () {
  27161. function RuntimeMetadataResolver(_directiveResolver, _viewResolver, _platformDirectives) {
  27162. this._directiveResolver = _directiveResolver;
  27163. this._viewResolver = _viewResolver;
  27164. this._platformDirectives = _platformDirectives;
  27165. this._cache = new Map();
  27166. }
  27167. RuntimeMetadataResolver.prototype.getMetadata = function (directiveType) {
  27168. var meta = this._cache.get(directiveType);
  27169. if (lang_1.isBlank(meta)) {
  27170. var dirMeta = this._directiveResolver.resolve(directiveType);
  27171. var moduleUrl = null;
  27172. var templateMeta = null;
  27173. var changeDetectionStrategy = null;
  27174. if (dirMeta instanceof md.ComponentMetadata) {
  27175. var cmpMeta = dirMeta;
  27176. moduleUrl = calcModuleUrl(directiveType, cmpMeta);
  27177. var viewMeta = this._viewResolver.resolve(directiveType);
  27178. templateMeta = new cpl.CompileTemplateMetadata({
  27179. encapsulation: viewMeta.encapsulation,
  27180. template: viewMeta.template,
  27181. templateUrl: viewMeta.templateUrl,
  27182. styles: viewMeta.styles,
  27183. styleUrls: viewMeta.styleUrls
  27184. });
  27185. changeDetectionStrategy = cmpMeta.changeDetection;
  27186. }
  27187. meta = cpl.CompileDirectiveMetadata.create({
  27188. selector: dirMeta.selector,
  27189. exportAs: dirMeta.exportAs,
  27190. isComponent: lang_1.isPresent(templateMeta),
  27191. dynamicLoadable: true,
  27192. type: new cpl.CompileTypeMetadata({ name: lang_1.stringify(directiveType), moduleUrl: moduleUrl, runtime: directiveType }),
  27193. template: templateMeta,
  27194. changeDetection: changeDetectionStrategy,
  27195. inputs: dirMeta.inputs,
  27196. outputs: dirMeta.outputs,
  27197. host: dirMeta.host,
  27198. lifecycleHooks: interfaces_1.LIFECYCLE_HOOKS_VALUES.filter(function (hook) { return directive_lifecycle_reflector_1.hasLifecycleHook(hook, directiveType); })
  27199. });
  27200. this._cache.set(directiveType, meta);
  27201. }
  27202. return meta;
  27203. };
  27204. RuntimeMetadataResolver.prototype.getViewDirectivesMetadata = function (component) {
  27205. var _this = this;
  27206. var view = this._viewResolver.resolve(component);
  27207. var directives = flattenDirectives(view, this._platformDirectives);
  27208. for (var i = 0; i < directives.length; i++) {
  27209. if (!isValidDirective(directives[i])) {
  27210. throw new exceptions_1.BaseException("Unexpected directive value '" + lang_1.stringify(directives[i]) + "' on the View of component '" + lang_1.stringify(component) + "'");
  27211. }
  27212. }
  27213. return directives.map(function (type) { return _this.getMetadata(type); });
  27214. };
  27215. RuntimeMetadataResolver = __decorate([
  27216. di_2.Injectable(),
  27217. __param(2, di_2.Optional()),
  27218. __param(2, di_2.Inject(platform_directives_and_pipes_1.PLATFORM_DIRECTIVES)),
  27219. __metadata('design:paramtypes', [directive_resolver_1.DirectiveResolver, view_resolver_1.ViewResolver, Array])
  27220. ], RuntimeMetadataResolver);
  27221. return RuntimeMetadataResolver;
  27222. })();
  27223. exports.RuntimeMetadataResolver = RuntimeMetadataResolver;
  27224. function flattenDirectives(view, platformDirectives) {
  27225. var directives = [];
  27226. if (lang_1.isPresent(platformDirectives)) {
  27227. flattenArray(platformDirectives, directives);
  27228. }
  27229. if (lang_1.isPresent(view.directives)) {
  27230. flattenArray(view.directives, directives);
  27231. }
  27232. return directives;
  27233. }
  27234. function flattenArray(tree, out) {
  27235. for (var i = 0; i < tree.length; i++) {
  27236. var item = di_1.resolveForwardRef(tree[i]);
  27237. if (lang_1.isArray(item)) {
  27238. flattenArray(item, out);
  27239. }
  27240. else {
  27241. out.push(item);
  27242. }
  27243. }
  27244. }
  27245. function isValidDirective(value) {
  27246. return lang_1.isPresent(value) && (value instanceof lang_1.Type);
  27247. }
  27248. function calcModuleUrl(type, cmpMetadata) {
  27249. var moduleId = cmpMetadata.moduleId;
  27250. if (lang_1.isPresent(moduleId)) {
  27251. var scheme = url_resolver_1.getUrlScheme(moduleId);
  27252. return lang_1.isPresent(scheme) && scheme.length > 0 ? moduleId :
  27253. "package:" + moduleId + util_1.MODULE_SUFFIX;
  27254. }
  27255. else {
  27256. return reflection_1.reflector.importUri(type);
  27257. }
  27258. }
  27259. /***/ },
  27260. /* 177 */
  27261. /***/ function(module, exports, __webpack_require__) {
  27262. var __extends = (this && this.__extends) || function (d, b) {
  27263. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27264. function __() { this.constructor = d; }
  27265. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27266. };
  27267. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27268. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27269. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27270. 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;
  27271. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27272. };
  27273. var __metadata = (this && this.__metadata) || function (k, v) {
  27274. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27275. };
  27276. var di_1 = __webpack_require__(6);
  27277. var lang_1 = __webpack_require__(5);
  27278. var collection_1 = __webpack_require__(12);
  27279. var dom_adapter_1 = __webpack_require__(178);
  27280. var html_tags_1 = __webpack_require__(172);
  27281. var element_schema_registry_1 = __webpack_require__(173);
  27282. var NAMESPACE_URIS = lang_1.CONST_EXPR({ 'xlink': 'http://www.w3.org/1999/xlink', 'svg': 'http://www.w3.org/2000/svg' });
  27283. var DomElementSchemaRegistry = (function (_super) {
  27284. __extends(DomElementSchemaRegistry, _super);
  27285. function DomElementSchemaRegistry() {
  27286. _super.apply(this, arguments);
  27287. this._protoElements = new Map();
  27288. }
  27289. DomElementSchemaRegistry.prototype._getProtoElement = function (tagName) {
  27290. var element = this._protoElements.get(tagName);
  27291. if (lang_1.isBlank(element)) {
  27292. var nsAndName = html_tags_1.splitNsName(tagName);
  27293. element = lang_1.isPresent(nsAndName[0]) ?
  27294. dom_adapter_1.DOM.createElementNS(NAMESPACE_URIS[nsAndName[0]], nsAndName[1]) :
  27295. dom_adapter_1.DOM.createElement(nsAndName[1]);
  27296. this._protoElements.set(tagName, element);
  27297. }
  27298. return element;
  27299. };
  27300. DomElementSchemaRegistry.prototype.hasProperty = function (tagName, propName) {
  27301. if (tagName.indexOf('-') !== -1) {
  27302. // can't tell now as we don't know which properties a custom element will get
  27303. // once it is instantiated
  27304. return true;
  27305. }
  27306. else {
  27307. var elm = this._getProtoElement(tagName);
  27308. return dom_adapter_1.DOM.hasProperty(elm, propName);
  27309. }
  27310. };
  27311. DomElementSchemaRegistry.prototype.getMappedPropName = function (propName) {
  27312. var mappedPropName = collection_1.StringMapWrapper.get(dom_adapter_1.DOM.attrToPropMap, propName);
  27313. return lang_1.isPresent(mappedPropName) ? mappedPropName : propName;
  27314. };
  27315. DomElementSchemaRegistry = __decorate([
  27316. di_1.Injectable(),
  27317. __metadata('design:paramtypes', [])
  27318. ], DomElementSchemaRegistry);
  27319. return DomElementSchemaRegistry;
  27320. })(element_schema_registry_1.ElementSchemaRegistry);
  27321. exports.DomElementSchemaRegistry = DomElementSchemaRegistry;
  27322. /***/ },
  27323. /* 178 */
  27324. /***/ function(module, exports, __webpack_require__) {
  27325. var lang_1 = __webpack_require__(5);
  27326. exports.DOM = null;
  27327. function setRootDomAdapter(adapter) {
  27328. if (lang_1.isBlank(exports.DOM)) {
  27329. exports.DOM = adapter;
  27330. }
  27331. }
  27332. exports.setRootDomAdapter = setRootDomAdapter;
  27333. /* tslint:disable:requireParameterType */
  27334. /**
  27335. * Provides DOM operations in an environment-agnostic way.
  27336. */
  27337. var DomAdapter = (function () {
  27338. function DomAdapter() {
  27339. }
  27340. return DomAdapter;
  27341. })();
  27342. exports.DomAdapter = DomAdapter;
  27343. /***/ },
  27344. /* 179 */
  27345. /***/ function(module, exports, __webpack_require__) {
  27346. var angular_entrypoint_1 = __webpack_require__(180);
  27347. exports.AngularEntrypoint = angular_entrypoint_1.AngularEntrypoint;
  27348. var browser_common_1 = __webpack_require__(181);
  27349. exports.BROWSER_PROVIDERS = browser_common_1.BROWSER_PROVIDERS;
  27350. exports.ELEMENT_PROBE_BINDINGS = browser_common_1.ELEMENT_PROBE_BINDINGS;
  27351. exports.ELEMENT_PROBE_PROVIDERS = browser_common_1.ELEMENT_PROBE_PROVIDERS;
  27352. exports.inspectNativeElement = browser_common_1.inspectNativeElement;
  27353. exports.BrowserDomAdapter = browser_common_1.BrowserDomAdapter;
  27354. exports.By = browser_common_1.By;
  27355. exports.Title = browser_common_1.Title;
  27356. exports.DOCUMENT = browser_common_1.DOCUMENT;
  27357. exports.enableDebugTools = browser_common_1.enableDebugTools;
  27358. exports.disableDebugTools = browser_common_1.disableDebugTools;
  27359. var lang_1 = __webpack_require__(5);
  27360. var browser_common_2 = __webpack_require__(181);
  27361. var compiler_1 = __webpack_require__(147);
  27362. var core_1 = __webpack_require__(2);
  27363. var reflection_capabilities_1 = __webpack_require__(18);
  27364. var xhr_impl_1 = __webpack_require__(199);
  27365. var compiler_2 = __webpack_require__(147);
  27366. var di_1 = __webpack_require__(6);
  27367. /**
  27368. * An array of providers that should be passed into `application()` when bootstrapping a component.
  27369. */
  27370. exports.BROWSER_APP_PROVIDERS = lang_1.CONST_EXPR([
  27371. browser_common_2.BROWSER_APP_COMMON_PROVIDERS,
  27372. compiler_1.COMPILER_PROVIDERS,
  27373. new di_1.Provider(compiler_2.XHR, { useClass: xhr_impl_1.XHRImpl }),
  27374. ]);
  27375. /**
  27376. * Bootstrapping for Angular applications.
  27377. *
  27378. * You instantiate an Angular application by explicitly specifying a component to use
  27379. * as the root component for your application via the `bootstrap()` method.
  27380. *
  27381. * ## Simple Example
  27382. *
  27383. * Assuming this `index.html`:
  27384. *
  27385. * ```html
  27386. * <html>
  27387. * <!-- load Angular script tags here. -->
  27388. * <body>
  27389. * <my-app>loading...</my-app>
  27390. * </body>
  27391. * </html>
  27392. * ```
  27393. *
  27394. * An application is bootstrapped inside an existing browser DOM, typically `index.html`.
  27395. * Unlike Angular 1, Angular 2 does not compile/process providers in `index.html`. This is
  27396. * mainly for security reasons, as well as architectural changes in Angular 2. This means
  27397. * that `index.html` can safely be processed using server-side technologies such as
  27398. * providers. Bindings can thus use double-curly `{{ syntax }}` without collision from
  27399. * Angular 2 component double-curly `{{ syntax }}`.
  27400. *
  27401. * We can use this script code:
  27402. *
  27403. * {@example core/ts/bootstrap/bootstrap.ts region='bootstrap'}
  27404. *
  27405. * When the app developer invokes `bootstrap()` with the root component `MyApp` as its
  27406. * argument, Angular performs the following tasks:
  27407. *
  27408. * 1. It uses the component's `selector` property to locate the DOM element which needs
  27409. * to be upgraded into the angular component.
  27410. * 2. It creates a new child injector (from the platform injector). Optionally, you can
  27411. * also override the injector configuration for an app by invoking `bootstrap` with the
  27412. * `componentInjectableBindings` argument.
  27413. * 3. It creates a new `Zone` and connects it to the angular application's change detection
  27414. * domain instance.
  27415. * 4. It creates an emulated or shadow DOM on the selected component's host element and loads the
  27416. * template into it.
  27417. * 5. It instantiates the specified component.
  27418. * 6. Finally, Angular performs change detection to apply the initial data providers for the
  27419. * application.
  27420. *
  27421. *
  27422. * ## Bootstrapping Multiple Applications
  27423. *
  27424. * When working within a browser window, there are many singleton resources: cookies, title,
  27425. * location, and others. Angular services that represent these resources must likewise be
  27426. * shared across all Angular applications that occupy the same browser window. For this
  27427. * reason, Angular creates exactly one global platform object which stores all shared
  27428. * services, and each angular application injector has the platform injector as its parent.
  27429. *
  27430. * Each application has its own private injector as well. When there are multiple
  27431. * applications on a page, Angular treats each application injector's services as private
  27432. * to that application.
  27433. *
  27434. * ## API
  27435. *
  27436. * - `appComponentType`: The root component which should act as the application. This is
  27437. * a reference to a `Type` which is annotated with `@Component(...)`.
  27438. * - `customProviders`: An additional set of providers that can be added to the
  27439. * app injector to override default injection behavior.
  27440. *
  27441. * Returns a `Promise` of {@link ComponentRef}.
  27442. */
  27443. function bootstrap(appComponentType, customProviders) {
  27444. core_1.reflector.reflectionCapabilities = new reflection_capabilities_1.ReflectionCapabilities();
  27445. var appProviders = lang_1.isPresent(customProviders) ? [exports.BROWSER_APP_PROVIDERS, customProviders] : exports.BROWSER_APP_PROVIDERS;
  27446. return core_1.platform(browser_common_2.BROWSER_PROVIDERS).application(appProviders).bootstrap(appComponentType);
  27447. }
  27448. exports.bootstrap = bootstrap;
  27449. /***/ },
  27450. /* 180 */
  27451. /***/ function(module, exports, __webpack_require__) {
  27452. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27453. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27454. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27455. 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;
  27456. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27457. };
  27458. var __metadata = (this && this.__metadata) || function (k, v) {
  27459. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27460. };
  27461. var lang_1 = __webpack_require__(5);
  27462. /**
  27463. * Marks a function or method as an Angular 2 entrypoint. Only necessary in Dart code.
  27464. *
  27465. * The optional `name` parameter will be reflected in logs when the entry point is processed.
  27466. *
  27467. * See [the wiki][] for detailed documentation.
  27468. * [the wiki]: https://github.com/angular/angular/wiki/Angular-2-Dart-Transformer#entry_points
  27469. *
  27470. * ## Example
  27471. *
  27472. * ```
  27473. * @AngularEntrypoint("name-for-debug")
  27474. * void main() {
  27475. * bootstrap(MyComponent);
  27476. * }
  27477. * ```
  27478. */
  27479. var AngularEntrypoint = (function () {
  27480. function AngularEntrypoint(name) {
  27481. this.name = name;
  27482. }
  27483. AngularEntrypoint = __decorate([
  27484. lang_1.CONST(),
  27485. __metadata('design:paramtypes', [String])
  27486. ], AngularEntrypoint);
  27487. return AngularEntrypoint;
  27488. })();
  27489. exports.AngularEntrypoint = AngularEntrypoint;
  27490. /***/ },
  27491. /* 181 */
  27492. /***/ function(module, exports, __webpack_require__) {
  27493. var lang_1 = __webpack_require__(5);
  27494. var di_1 = __webpack_require__(6);
  27495. var core_1 = __webpack_require__(2);
  27496. var common_1 = __webpack_require__(104);
  27497. var testability_1 = __webpack_require__(68);
  27498. var dom_adapter_1 = __webpack_require__(178);
  27499. var dom_events_1 = __webpack_require__(182);
  27500. var key_events_1 = __webpack_require__(184);
  27501. var hammer_gestures_1 = __webpack_require__(185);
  27502. var dom_tokens_1 = __webpack_require__(187);
  27503. var dom_renderer_1 = __webpack_require__(188);
  27504. var shared_styles_host_1 = __webpack_require__(196);
  27505. var shared_styles_host_2 = __webpack_require__(196);
  27506. var browser_details_1 = __webpack_require__(195);
  27507. var animation_builder_1 = __webpack_require__(189);
  27508. var browser_adapter_1 = __webpack_require__(197);
  27509. var testability_2 = __webpack_require__(200);
  27510. var wtf_init_1 = __webpack_require__(201);
  27511. var event_manager_1 = __webpack_require__(183);
  27512. var dom_tokens_2 = __webpack_require__(187);
  27513. exports.DOCUMENT = dom_tokens_2.DOCUMENT;
  27514. var title_1 = __webpack_require__(202);
  27515. exports.Title = title_1.Title;
  27516. var common_dom_1 = __webpack_require__(203);
  27517. exports.DebugElementViewListener = common_dom_1.DebugElementViewListener;
  27518. exports.ELEMENT_PROBE_PROVIDERS = common_dom_1.ELEMENT_PROBE_PROVIDERS;
  27519. exports.ELEMENT_PROBE_BINDINGS = common_dom_1.ELEMENT_PROBE_BINDINGS;
  27520. exports.inspectNativeElement = common_dom_1.inspectNativeElement;
  27521. exports.By = common_dom_1.By;
  27522. var browser_adapter_2 = __webpack_require__(197);
  27523. exports.BrowserDomAdapter = browser_adapter_2.BrowserDomAdapter;
  27524. var tools_1 = __webpack_require__(206);
  27525. exports.enableDebugTools = tools_1.enableDebugTools;
  27526. exports.disableDebugTools = tools_1.disableDebugTools;
  27527. /**
  27528. * A set of providers to initialize the Angular platform in a web browser.
  27529. *
  27530. * Used automatically by `bootstrap`, or can be passed to {@link platform}.
  27531. */
  27532. exports.BROWSER_PROVIDERS = lang_1.CONST_EXPR([
  27533. core_1.PLATFORM_COMMON_PROVIDERS,
  27534. new di_1.Provider(core_1.PLATFORM_INITIALIZER, { useValue: initDomAdapter, multi: true }),
  27535. ]);
  27536. function _exceptionHandler() {
  27537. // !IS_DART is required because we must rethrow exceptions in JS,
  27538. // but must not rethrow exceptions in Dart
  27539. return new core_1.ExceptionHandler(dom_adapter_1.DOM, !lang_1.IS_DART);
  27540. }
  27541. function _document() {
  27542. return dom_adapter_1.DOM.defaultDoc();
  27543. }
  27544. /**
  27545. * A set of providers to initialize an Angular application in a web browser.
  27546. *
  27547. * Used automatically by `bootstrap`, or can be passed to {@link PlatformRef.application}.
  27548. */
  27549. exports.BROWSER_APP_COMMON_PROVIDERS = lang_1.CONST_EXPR([
  27550. core_1.APPLICATION_COMMON_PROVIDERS,
  27551. common_1.FORM_PROVIDERS,
  27552. new di_1.Provider(core_1.PLATFORM_PIPES, { useValue: common_1.COMMON_PIPES, multi: true }),
  27553. new di_1.Provider(core_1.PLATFORM_DIRECTIVES, { useValue: common_1.COMMON_DIRECTIVES, multi: true }),
  27554. new di_1.Provider(core_1.ExceptionHandler, { useFactory: _exceptionHandler, deps: [] }),
  27555. new di_1.Provider(dom_tokens_1.DOCUMENT, { useFactory: _document, deps: [] }),
  27556. new di_1.Provider(event_manager_1.EVENT_MANAGER_PLUGINS, { useClass: dom_events_1.DomEventsPlugin, multi: true }),
  27557. new di_1.Provider(event_manager_1.EVENT_MANAGER_PLUGINS, { useClass: key_events_1.KeyEventsPlugin, multi: true }),
  27558. new di_1.Provider(event_manager_1.EVENT_MANAGER_PLUGINS, { useClass: hammer_gestures_1.HammerGesturesPlugin, multi: true }),
  27559. new di_1.Provider(dom_renderer_1.DomRenderer, { useClass: dom_renderer_1.DomRenderer_ }),
  27560. new di_1.Provider(core_1.Renderer, { useExisting: dom_renderer_1.DomRenderer }),
  27561. new di_1.Provider(shared_styles_host_2.SharedStylesHost, { useExisting: shared_styles_host_1.DomSharedStylesHost }),
  27562. shared_styles_host_1.DomSharedStylesHost,
  27563. testability_1.Testability,
  27564. browser_details_1.BrowserDetails,
  27565. animation_builder_1.AnimationBuilder,
  27566. event_manager_1.EventManager
  27567. ]);
  27568. function initDomAdapter() {
  27569. browser_adapter_1.BrowserDomAdapter.makeCurrent();
  27570. wtf_init_1.wtfInit();
  27571. testability_2.BrowserGetTestability.init();
  27572. }
  27573. exports.initDomAdapter = initDomAdapter;
  27574. /***/ },
  27575. /* 182 */
  27576. /***/ function(module, exports, __webpack_require__) {
  27577. var __extends = (this && this.__extends) || function (d, b) {
  27578. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27579. function __() { this.constructor = d; }
  27580. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27581. };
  27582. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27583. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27584. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27585. 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;
  27586. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27587. };
  27588. var __metadata = (this && this.__metadata) || function (k, v) {
  27589. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27590. };
  27591. var dom_adapter_1 = __webpack_require__(178);
  27592. var core_1 = __webpack_require__(2);
  27593. var event_manager_1 = __webpack_require__(183);
  27594. var DomEventsPlugin = (function (_super) {
  27595. __extends(DomEventsPlugin, _super);
  27596. function DomEventsPlugin() {
  27597. _super.apply(this, arguments);
  27598. }
  27599. // This plugin should come last in the list of plugins, because it accepts all
  27600. // events.
  27601. DomEventsPlugin.prototype.supports = function (eventName) { return true; };
  27602. DomEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {
  27603. var zone = this.manager.getZone();
  27604. var outsideHandler = function (event) { return zone.run(function () { return handler(event); }); };
  27605. this.manager.getZone().runOutsideAngular(function () { dom_adapter_1.DOM.on(element, eventName, outsideHandler); });
  27606. };
  27607. DomEventsPlugin.prototype.addGlobalEventListener = function (target, eventName, handler) {
  27608. var element = dom_adapter_1.DOM.getGlobalEventTarget(target);
  27609. var zone = this.manager.getZone();
  27610. var outsideHandler = function (event) { return zone.run(function () { return handler(event); }); };
  27611. return this.manager.getZone().runOutsideAngular(function () { return dom_adapter_1.DOM.onAndCancel(element, eventName, outsideHandler); });
  27612. };
  27613. DomEventsPlugin = __decorate([
  27614. core_1.Injectable(),
  27615. __metadata('design:paramtypes', [])
  27616. ], DomEventsPlugin);
  27617. return DomEventsPlugin;
  27618. })(event_manager_1.EventManagerPlugin);
  27619. exports.DomEventsPlugin = DomEventsPlugin;
  27620. /***/ },
  27621. /* 183 */
  27622. /***/ function(module, exports, __webpack_require__) {
  27623. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27624. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27625. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27626. 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;
  27627. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27628. };
  27629. var __metadata = (this && this.__metadata) || function (k, v) {
  27630. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27631. };
  27632. var __param = (this && this.__param) || function (paramIndex, decorator) {
  27633. return function (target, key) { decorator(target, key, paramIndex); }
  27634. };
  27635. var lang_1 = __webpack_require__(5);
  27636. var exceptions_1 = __webpack_require__(14);
  27637. var di_1 = __webpack_require__(6);
  27638. var ng_zone_1 = __webpack_require__(66);
  27639. var collection_1 = __webpack_require__(12);
  27640. exports.EVENT_MANAGER_PLUGINS = lang_1.CONST_EXPR(new di_1.OpaqueToken("EventManagerPlugins"));
  27641. var EventManager = (function () {
  27642. function EventManager(plugins, _zone) {
  27643. var _this = this;
  27644. this._zone = _zone;
  27645. plugins.forEach(function (p) { return p.manager = _this; });
  27646. this._plugins = collection_1.ListWrapper.reversed(plugins);
  27647. }
  27648. EventManager.prototype.addEventListener = function (element, eventName, handler) {
  27649. var plugin = this._findPluginFor(eventName);
  27650. plugin.addEventListener(element, eventName, handler);
  27651. };
  27652. EventManager.prototype.addGlobalEventListener = function (target, eventName, handler) {
  27653. var plugin = this._findPluginFor(eventName);
  27654. return plugin.addGlobalEventListener(target, eventName, handler);
  27655. };
  27656. EventManager.prototype.getZone = function () { return this._zone; };
  27657. /** @internal */
  27658. EventManager.prototype._findPluginFor = function (eventName) {
  27659. var plugins = this._plugins;
  27660. for (var i = 0; i < plugins.length; i++) {
  27661. var plugin = plugins[i];
  27662. if (plugin.supports(eventName)) {
  27663. return plugin;
  27664. }
  27665. }
  27666. throw new exceptions_1.BaseException("No event manager plugin found for event " + eventName);
  27667. };
  27668. EventManager = __decorate([
  27669. di_1.Injectable(),
  27670. __param(0, di_1.Inject(exports.EVENT_MANAGER_PLUGINS)),
  27671. __metadata('design:paramtypes', [Array, ng_zone_1.NgZone])
  27672. ], EventManager);
  27673. return EventManager;
  27674. })();
  27675. exports.EventManager = EventManager;
  27676. var EventManagerPlugin = (function () {
  27677. function EventManagerPlugin() {
  27678. }
  27679. // That is equivalent to having supporting $event.target
  27680. EventManagerPlugin.prototype.supports = function (eventName) { return false; };
  27681. EventManagerPlugin.prototype.addEventListener = function (element, eventName, handler) {
  27682. throw "not implemented";
  27683. };
  27684. EventManagerPlugin.prototype.addGlobalEventListener = function (element, eventName, handler) {
  27685. throw "not implemented";
  27686. };
  27687. return EventManagerPlugin;
  27688. })();
  27689. exports.EventManagerPlugin = EventManagerPlugin;
  27690. /***/ },
  27691. /* 184 */
  27692. /***/ function(module, exports, __webpack_require__) {
  27693. var __extends = (this && this.__extends) || function (d, b) {
  27694. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27695. function __() { this.constructor = d; }
  27696. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27697. };
  27698. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27699. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27700. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27701. 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;
  27702. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27703. };
  27704. var __metadata = (this && this.__metadata) || function (k, v) {
  27705. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27706. };
  27707. var dom_adapter_1 = __webpack_require__(178);
  27708. var lang_1 = __webpack_require__(5);
  27709. var collection_1 = __webpack_require__(12);
  27710. var event_manager_1 = __webpack_require__(183);
  27711. var di_1 = __webpack_require__(6);
  27712. var modifierKeys = ['alt', 'control', 'meta', 'shift'];
  27713. var modifierKeyGetters = {
  27714. 'alt': function (event) { return event.altKey; },
  27715. 'control': function (event) { return event.ctrlKey; },
  27716. 'meta': function (event) { return event.metaKey; },
  27717. 'shift': function (event) { return event.shiftKey; }
  27718. };
  27719. var KeyEventsPlugin = (function (_super) {
  27720. __extends(KeyEventsPlugin, _super);
  27721. function KeyEventsPlugin() {
  27722. _super.call(this);
  27723. }
  27724. KeyEventsPlugin.prototype.supports = function (eventName) {
  27725. return lang_1.isPresent(KeyEventsPlugin.parseEventName(eventName));
  27726. };
  27727. KeyEventsPlugin.prototype.addEventListener = function (element, eventName, handler) {
  27728. var parsedEvent = KeyEventsPlugin.parseEventName(eventName);
  27729. var outsideHandler = KeyEventsPlugin.eventCallback(element, collection_1.StringMapWrapper.get(parsedEvent, 'fullKey'), handler, this.manager.getZone());
  27730. this.manager.getZone().runOutsideAngular(function () {
  27731. dom_adapter_1.DOM.on(element, collection_1.StringMapWrapper.get(parsedEvent, 'domEventName'), outsideHandler);
  27732. });
  27733. };
  27734. KeyEventsPlugin.parseEventName = function (eventName) {
  27735. var parts = eventName.toLowerCase().split('.');
  27736. var domEventName = parts.shift();
  27737. if ((parts.length === 0) ||
  27738. !(lang_1.StringWrapper.equals(domEventName, 'keydown') ||
  27739. lang_1.StringWrapper.equals(domEventName, 'keyup'))) {
  27740. return null;
  27741. }
  27742. var key = KeyEventsPlugin._normalizeKey(parts.pop());
  27743. var fullKey = '';
  27744. modifierKeys.forEach(function (modifierName) {
  27745. if (collection_1.ListWrapper.contains(parts, modifierName)) {
  27746. collection_1.ListWrapper.remove(parts, modifierName);
  27747. fullKey += modifierName + '.';
  27748. }
  27749. });
  27750. fullKey += key;
  27751. if (parts.length != 0 || key.length === 0) {
  27752. // returning null instead of throwing to let another plugin process the event
  27753. return null;
  27754. }
  27755. var result = collection_1.StringMapWrapper.create();
  27756. collection_1.StringMapWrapper.set(result, 'domEventName', domEventName);
  27757. collection_1.StringMapWrapper.set(result, 'fullKey', fullKey);
  27758. return result;
  27759. };
  27760. KeyEventsPlugin.getEventFullKey = function (event) {
  27761. var fullKey = '';
  27762. var key = dom_adapter_1.DOM.getEventKey(event);
  27763. key = key.toLowerCase();
  27764. if (lang_1.StringWrapper.equals(key, ' ')) {
  27765. key = 'space'; // for readability
  27766. }
  27767. else if (lang_1.StringWrapper.equals(key, '.')) {
  27768. key = 'dot'; // because '.' is used as a separator in event names
  27769. }
  27770. modifierKeys.forEach(function (modifierName) {
  27771. if (modifierName != key) {
  27772. var modifierGetter = collection_1.StringMapWrapper.get(modifierKeyGetters, modifierName);
  27773. if (modifierGetter(event)) {
  27774. fullKey += modifierName + '.';
  27775. }
  27776. }
  27777. });
  27778. fullKey += key;
  27779. return fullKey;
  27780. };
  27781. KeyEventsPlugin.eventCallback = function (element, fullKey, handler, zone) {
  27782. return function (event) {
  27783. if (lang_1.StringWrapper.equals(KeyEventsPlugin.getEventFullKey(event), fullKey)) {
  27784. zone.run(function () { return handler(event); });
  27785. }
  27786. };
  27787. };
  27788. /** @internal */
  27789. KeyEventsPlugin._normalizeKey = function (keyName) {
  27790. // TODO: switch to a StringMap if the mapping grows too much
  27791. switch (keyName) {
  27792. case 'esc':
  27793. return 'escape';
  27794. default:
  27795. return keyName;
  27796. }
  27797. };
  27798. KeyEventsPlugin = __decorate([
  27799. di_1.Injectable(),
  27800. __metadata('design:paramtypes', [])
  27801. ], KeyEventsPlugin);
  27802. return KeyEventsPlugin;
  27803. })(event_manager_1.EventManagerPlugin);
  27804. exports.KeyEventsPlugin = KeyEventsPlugin;
  27805. /***/ },
  27806. /* 185 */
  27807. /***/ function(module, exports, __webpack_require__) {
  27808. var __extends = (this && this.__extends) || function (d, b) {
  27809. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27810. function __() { this.constructor = d; }
  27811. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27812. };
  27813. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27814. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27815. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27816. 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;
  27817. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27818. };
  27819. var __metadata = (this && this.__metadata) || function (k, v) {
  27820. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27821. };
  27822. var hammer_common_1 = __webpack_require__(186);
  27823. var lang_1 = __webpack_require__(5);
  27824. var exceptions_1 = __webpack_require__(14);
  27825. var di_1 = __webpack_require__(6);
  27826. var HammerGesturesPlugin = (function (_super) {
  27827. __extends(HammerGesturesPlugin, _super);
  27828. function HammerGesturesPlugin() {
  27829. _super.apply(this, arguments);
  27830. }
  27831. HammerGesturesPlugin.prototype.supports = function (eventName) {
  27832. if (!_super.prototype.supports.call(this, eventName))
  27833. return false;
  27834. if (!lang_1.isPresent(window['Hammer'])) {
  27835. throw new exceptions_1.BaseException("Hammer.js is not loaded, can not bind " + eventName + " event");
  27836. }
  27837. return true;
  27838. };
  27839. HammerGesturesPlugin.prototype.addEventListener = function (element, eventName, handler) {
  27840. var zone = this.manager.getZone();
  27841. eventName = eventName.toLowerCase();
  27842. zone.runOutsideAngular(function () {
  27843. // Creating the manager bind events, must be done outside of angular
  27844. var mc = new Hammer(element);
  27845. mc.get('pinch').set({ enable: true });
  27846. mc.get('rotate').set({ enable: true });
  27847. mc.on(eventName, function (eventObj) { zone.run(function () { handler(eventObj); }); });
  27848. });
  27849. };
  27850. HammerGesturesPlugin = __decorate([
  27851. di_1.Injectable(),
  27852. __metadata('design:paramtypes', [])
  27853. ], HammerGesturesPlugin);
  27854. return HammerGesturesPlugin;
  27855. })(hammer_common_1.HammerGesturesPluginCommon);
  27856. exports.HammerGesturesPlugin = HammerGesturesPlugin;
  27857. /***/ },
  27858. /* 186 */
  27859. /***/ function(module, exports, __webpack_require__) {
  27860. var __extends = (this && this.__extends) || function (d, b) {
  27861. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27862. function __() { this.constructor = d; }
  27863. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27864. };
  27865. var event_manager_1 = __webpack_require__(183);
  27866. var collection_1 = __webpack_require__(12);
  27867. var _eventNames = {
  27868. // pan
  27869. 'pan': true,
  27870. 'panstart': true,
  27871. 'panmove': true,
  27872. 'panend': true,
  27873. 'pancancel': true,
  27874. 'panleft': true,
  27875. 'panright': true,
  27876. 'panup': true,
  27877. 'pandown': true,
  27878. // pinch
  27879. 'pinch': true,
  27880. 'pinchstart': true,
  27881. 'pinchmove': true,
  27882. 'pinchend': true,
  27883. 'pinchcancel': true,
  27884. 'pinchin': true,
  27885. 'pinchout': true,
  27886. // press
  27887. 'press': true,
  27888. 'pressup': true,
  27889. // rotate
  27890. 'rotate': true,
  27891. 'rotatestart': true,
  27892. 'rotatemove': true,
  27893. 'rotateend': true,
  27894. 'rotatecancel': true,
  27895. // swipe
  27896. 'swipe': true,
  27897. 'swipeleft': true,
  27898. 'swiperight': true,
  27899. 'swipeup': true,
  27900. 'swipedown': true,
  27901. // tap
  27902. 'tap': true,
  27903. };
  27904. var HammerGesturesPluginCommon = (function (_super) {
  27905. __extends(HammerGesturesPluginCommon, _super);
  27906. function HammerGesturesPluginCommon() {
  27907. _super.call(this);
  27908. }
  27909. HammerGesturesPluginCommon.prototype.supports = function (eventName) {
  27910. eventName = eventName.toLowerCase();
  27911. return collection_1.StringMapWrapper.contains(_eventNames, eventName);
  27912. };
  27913. return HammerGesturesPluginCommon;
  27914. })(event_manager_1.EventManagerPlugin);
  27915. exports.HammerGesturesPluginCommon = HammerGesturesPluginCommon;
  27916. /***/ },
  27917. /* 187 */
  27918. /***/ function(module, exports, __webpack_require__) {
  27919. var di_1 = __webpack_require__(6);
  27920. var lang_1 = __webpack_require__(5);
  27921. /**
  27922. * A DI Token representing the main rendering context. In a browser this is the DOM Document.
  27923. *
  27924. * Note: Document might not be available in the Application Context when Application and Rendering
  27925. * Contexts are not the same (e.g. when running the application into a Web Worker).
  27926. */
  27927. exports.DOCUMENT = lang_1.CONST_EXPR(new di_1.OpaqueToken('DocumentToken'));
  27928. /***/ },
  27929. /* 188 */
  27930. /***/ function(module, exports, __webpack_require__) {
  27931. var __extends = (this && this.__extends) || function (d, b) {
  27932. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  27933. function __() { this.constructor = d; }
  27934. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  27935. };
  27936. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  27937. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  27938. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  27939. 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;
  27940. return c > 3 && r && Object.defineProperty(target, key, r), r;
  27941. };
  27942. var __metadata = (this && this.__metadata) || function (k, v) {
  27943. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  27944. };
  27945. var __param = (this && this.__param) || function (paramIndex, decorator) {
  27946. return function (target, key) { decorator(target, key, paramIndex); }
  27947. };
  27948. var di_1 = __webpack_require__(6);
  27949. var animation_builder_1 = __webpack_require__(189);
  27950. var lang_1 = __webpack_require__(5);
  27951. var exceptions_1 = __webpack_require__(14);
  27952. var shared_styles_host_1 = __webpack_require__(196);
  27953. var profile_1 = __webpack_require__(45);
  27954. var core_1 = __webpack_require__(2);
  27955. var event_manager_1 = __webpack_require__(183);
  27956. var dom_tokens_1 = __webpack_require__(187);
  27957. var view_factory_1 = __webpack_require__(164);
  27958. var view_1 = __webpack_require__(165);
  27959. var metadata_1 = __webpack_require__(3);
  27960. var dom_adapter_1 = __webpack_require__(178);
  27961. var util_1 = __webpack_require__(194);
  27962. var NAMESPACE_URIS = lang_1.CONST_EXPR({ 'xlink': 'http://www.w3.org/1999/xlink', 'svg': 'http://www.w3.org/2000/svg' });
  27963. var TEMPLATE_COMMENT_TEXT = 'template bindings={}';
  27964. var TEMPLATE_BINDINGS_EXP = /^template bindings=(.*)$/g;
  27965. var DomRenderer = (function (_super) {
  27966. __extends(DomRenderer, _super);
  27967. function DomRenderer() {
  27968. _super.apply(this, arguments);
  27969. }
  27970. DomRenderer.prototype.getNativeElementSync = function (location) {
  27971. return resolveInternalDomView(location.renderView).boundElements[location.boundElementIndex];
  27972. };
  27973. DomRenderer.prototype.getRootNodes = function (fragment) { return resolveInternalDomFragment(fragment); };
  27974. DomRenderer.prototype.attachFragmentAfterFragment = function (previousFragmentRef, fragmentRef) {
  27975. var previousFragmentNodes = resolveInternalDomFragment(previousFragmentRef);
  27976. if (previousFragmentNodes.length > 0) {
  27977. var sibling = previousFragmentNodes[previousFragmentNodes.length - 1];
  27978. var nodes = resolveInternalDomFragment(fragmentRef);
  27979. moveNodesAfterSibling(sibling, nodes);
  27980. this.animateNodesEnter(nodes);
  27981. }
  27982. };
  27983. /**
  27984. * Iterates through all nodes being added to the DOM and animates them if necessary
  27985. * @param nodes
  27986. */
  27987. DomRenderer.prototype.animateNodesEnter = function (nodes) {
  27988. for (var i = 0; i < nodes.length; i++)
  27989. this.animateNodeEnter(nodes[i]);
  27990. };
  27991. DomRenderer.prototype.attachFragmentAfterElement = function (elementRef, fragmentRef) {
  27992. var parentView = resolveInternalDomView(elementRef.renderView);
  27993. var element = parentView.boundElements[elementRef.boundElementIndex];
  27994. var nodes = resolveInternalDomFragment(fragmentRef);
  27995. moveNodesAfterSibling(element, nodes);
  27996. this.animateNodesEnter(nodes);
  27997. };
  27998. DomRenderer.prototype.hydrateView = function (viewRef) { resolveInternalDomView(viewRef).hydrate(); };
  27999. DomRenderer.prototype.dehydrateView = function (viewRef) { resolveInternalDomView(viewRef).dehydrate(); };
  28000. DomRenderer.prototype.createTemplateAnchor = function (attrNameAndValues) {
  28001. return dom_adapter_1.DOM.createComment(TEMPLATE_COMMENT_TEXT);
  28002. };
  28003. DomRenderer.prototype.createText = function (value) { return dom_adapter_1.DOM.createTextNode(lang_1.isPresent(value) ? value : ''); };
  28004. DomRenderer.prototype.appendChild = function (parent, child) { dom_adapter_1.DOM.appendChild(parent, child); };
  28005. DomRenderer.prototype.setElementProperty = function (location, propertyName, propertyValue) {
  28006. var view = resolveInternalDomView(location.renderView);
  28007. dom_adapter_1.DOM.setProperty(view.boundElements[location.boundElementIndex], propertyName, propertyValue);
  28008. };
  28009. DomRenderer.prototype.setElementAttribute = function (location, attributeName, attributeValue) {
  28010. var view = resolveInternalDomView(location.renderView);
  28011. var element = view.boundElements[location.boundElementIndex];
  28012. if (lang_1.isPresent(attributeValue)) {
  28013. dom_adapter_1.DOM.setAttribute(element, attributeName, lang_1.stringify(attributeValue));
  28014. }
  28015. else {
  28016. dom_adapter_1.DOM.removeAttribute(element, attributeName);
  28017. }
  28018. };
  28019. /**
  28020. * Used only in debug mode to serialize property changes to comment nodes,
  28021. * such as <template> placeholders.
  28022. */
  28023. DomRenderer.prototype.setBindingDebugInfo = function (location, propertyName, propertyValue) {
  28024. var view = resolveInternalDomView(location.renderView);
  28025. var element = view.boundElements[location.boundElementIndex];
  28026. var dashCasedPropertyName = util_1.camelCaseToDashCase(propertyName);
  28027. if (dom_adapter_1.DOM.isCommentNode(element)) {
  28028. var existingBindings = lang_1.RegExpWrapper.firstMatch(TEMPLATE_BINDINGS_EXP, lang_1.StringWrapper.replaceAll(dom_adapter_1.DOM.getText(element), /\n/g, ''));
  28029. var parsedBindings = lang_1.Json.parse(existingBindings[1]);
  28030. parsedBindings[dashCasedPropertyName] = propertyValue;
  28031. dom_adapter_1.DOM.setText(element, lang_1.StringWrapper.replace(TEMPLATE_COMMENT_TEXT, '{}', lang_1.Json.stringify(parsedBindings)));
  28032. }
  28033. else {
  28034. this.setElementAttribute(location, propertyName, propertyValue);
  28035. }
  28036. };
  28037. DomRenderer.prototype.setElementClass = function (location, className, isAdd) {
  28038. var view = resolveInternalDomView(location.renderView);
  28039. var element = view.boundElements[location.boundElementIndex];
  28040. if (isAdd) {
  28041. dom_adapter_1.DOM.addClass(element, className);
  28042. }
  28043. else {
  28044. dom_adapter_1.DOM.removeClass(element, className);
  28045. }
  28046. };
  28047. DomRenderer.prototype.setElementStyle = function (location, styleName, styleValue) {
  28048. var view = resolveInternalDomView(location.renderView);
  28049. var element = view.boundElements[location.boundElementIndex];
  28050. if (lang_1.isPresent(styleValue)) {
  28051. dom_adapter_1.DOM.setStyle(element, styleName, lang_1.stringify(styleValue));
  28052. }
  28053. else {
  28054. dom_adapter_1.DOM.removeStyle(element, styleName);
  28055. }
  28056. };
  28057. DomRenderer.prototype.invokeElementMethod = function (location, methodName, args) {
  28058. var view = resolveInternalDomView(location.renderView);
  28059. var element = view.boundElements[location.boundElementIndex];
  28060. dom_adapter_1.DOM.invoke(element, methodName, args);
  28061. };
  28062. DomRenderer.prototype.setText = function (viewRef, textNodeIndex, text) {
  28063. var view = resolveInternalDomView(viewRef);
  28064. dom_adapter_1.DOM.setText(view.boundTextNodes[textNodeIndex], text);
  28065. };
  28066. DomRenderer.prototype.setEventDispatcher = function (viewRef, dispatcher) {
  28067. resolveInternalDomView(viewRef).setEventDispatcher(dispatcher);
  28068. };
  28069. return DomRenderer;
  28070. })(core_1.Renderer);
  28071. exports.DomRenderer = DomRenderer;
  28072. var DomRenderer_ = (function (_super) {
  28073. __extends(DomRenderer_, _super);
  28074. function DomRenderer_(_eventManager, _domSharedStylesHost, _animate, document) {
  28075. _super.call(this);
  28076. this._eventManager = _eventManager;
  28077. this._domSharedStylesHost = _domSharedStylesHost;
  28078. this._animate = _animate;
  28079. this._componentTpls = new Map();
  28080. /** @internal */
  28081. this._createRootHostViewScope = profile_1.wtfCreateScope('DomRenderer#createRootHostView()');
  28082. /** @internal */
  28083. this._createViewScope = profile_1.wtfCreateScope('DomRenderer#createView()');
  28084. /** @internal */
  28085. this._detachFragmentScope = profile_1.wtfCreateScope('DomRenderer#detachFragment()');
  28086. this._document = document;
  28087. }
  28088. DomRenderer_.prototype.registerComponentTemplate = function (template) {
  28089. this._componentTpls.set(template.id, template);
  28090. if (template.encapsulation !== metadata_1.ViewEncapsulation.Native) {
  28091. var encapsulatedStyles = view_factory_1.encapsulateStyles(template);
  28092. this._domSharedStylesHost.addStyles(encapsulatedStyles);
  28093. }
  28094. };
  28095. DomRenderer_.prototype.createProtoView = function (componentTemplateId, cmds) {
  28096. return new view_1.DefaultProtoViewRef(this._componentTpls.get(componentTemplateId), cmds);
  28097. };
  28098. DomRenderer_.prototype.resolveComponentTemplate = function (templateId) {
  28099. return this._componentTpls.get(templateId);
  28100. };
  28101. DomRenderer_.prototype.createRootHostView = function (hostProtoViewRef, fragmentCount, hostElementSelector) {
  28102. var s = this._createRootHostViewScope();
  28103. var element = dom_adapter_1.DOM.querySelector(this._document, hostElementSelector);
  28104. if (lang_1.isBlank(element)) {
  28105. profile_1.wtfLeave(s);
  28106. throw new exceptions_1.BaseException("The selector \"" + hostElementSelector + "\" did not match any elements");
  28107. }
  28108. return profile_1.wtfLeave(s, this._createView(hostProtoViewRef, element));
  28109. };
  28110. DomRenderer_.prototype.createView = function (protoViewRef, fragmentCount) {
  28111. var s = this._createViewScope();
  28112. return profile_1.wtfLeave(s, this._createView(protoViewRef, null));
  28113. };
  28114. DomRenderer_.prototype._createView = function (protoViewRef, inplaceElement) {
  28115. var dpvr = protoViewRef;
  28116. var view = view_factory_1.createRenderView(dpvr.template, dpvr.cmds, inplaceElement, this);
  28117. var sdRoots = view.nativeShadowRoots;
  28118. for (var i = 0; i < sdRoots.length; i++) {
  28119. this._domSharedStylesHost.addHost(sdRoots[i]);
  28120. }
  28121. return new core_1.RenderViewWithFragments(view, view.fragments);
  28122. };
  28123. DomRenderer_.prototype.destroyView = function (viewRef) {
  28124. var view = viewRef;
  28125. var sdRoots = view.nativeShadowRoots;
  28126. for (var i = 0; i < sdRoots.length; i++) {
  28127. this._domSharedStylesHost.removeHost(sdRoots[i]);
  28128. }
  28129. };
  28130. DomRenderer_.prototype.animateNodeEnter = function (node) {
  28131. if (dom_adapter_1.DOM.isElementNode(node) && dom_adapter_1.DOM.hasClass(node, 'ng-animate')) {
  28132. dom_adapter_1.DOM.addClass(node, 'ng-enter');
  28133. this._animate.css()
  28134. .addAnimationClass('ng-enter-active')
  28135. .start(node)
  28136. .onComplete(function () { dom_adapter_1.DOM.removeClass(node, 'ng-enter'); });
  28137. }
  28138. };
  28139. DomRenderer_.prototype.animateNodeLeave = function (node) {
  28140. if (dom_adapter_1.DOM.isElementNode(node) && dom_adapter_1.DOM.hasClass(node, 'ng-animate')) {
  28141. dom_adapter_1.DOM.addClass(node, 'ng-leave');
  28142. this._animate.css()
  28143. .addAnimationClass('ng-leave-active')
  28144. .start(node)
  28145. .onComplete(function () {
  28146. dom_adapter_1.DOM.removeClass(node, 'ng-leave');
  28147. dom_adapter_1.DOM.remove(node);
  28148. });
  28149. }
  28150. else {
  28151. dom_adapter_1.DOM.remove(node);
  28152. }
  28153. };
  28154. DomRenderer_.prototype.detachFragment = function (fragmentRef) {
  28155. var s = this._detachFragmentScope();
  28156. var fragmentNodes = resolveInternalDomFragment(fragmentRef);
  28157. for (var i = 0; i < fragmentNodes.length; i++) {
  28158. this.animateNodeLeave(fragmentNodes[i]);
  28159. }
  28160. profile_1.wtfLeave(s);
  28161. };
  28162. DomRenderer_.prototype.createElement = function (name, attrNameAndValues) {
  28163. var nsAndName = splitNamespace(name);
  28164. var el = lang_1.isPresent(nsAndName[0]) ?
  28165. dom_adapter_1.DOM.createElementNS(NAMESPACE_URIS[nsAndName[0]], nsAndName[1]) :
  28166. dom_adapter_1.DOM.createElement(nsAndName[1]);
  28167. this._setAttributes(el, attrNameAndValues);
  28168. return el;
  28169. };
  28170. DomRenderer_.prototype.mergeElement = function (existing, attrNameAndValues) {
  28171. dom_adapter_1.DOM.clearNodes(existing);
  28172. this._setAttributes(existing, attrNameAndValues);
  28173. };
  28174. DomRenderer_.prototype._setAttributes = function (node, attrNameAndValues) {
  28175. for (var attrIdx = 0; attrIdx < attrNameAndValues.length; attrIdx += 2) {
  28176. var attrNs;
  28177. var attrName = attrNameAndValues[attrIdx];
  28178. var nsAndName = splitNamespace(attrName);
  28179. if (lang_1.isPresent(nsAndName[0])) {
  28180. attrName = nsAndName[0] + ':' + nsAndName[1];
  28181. attrNs = NAMESPACE_URIS[nsAndName[0]];
  28182. }
  28183. var attrValue = attrNameAndValues[attrIdx + 1];
  28184. if (lang_1.isPresent(attrNs)) {
  28185. dom_adapter_1.DOM.setAttributeNS(node, attrNs, attrName, attrValue);
  28186. }
  28187. else {
  28188. dom_adapter_1.DOM.setAttribute(node, nsAndName[1], attrValue);
  28189. }
  28190. }
  28191. };
  28192. DomRenderer_.prototype.createRootContentInsertionPoint = function () {
  28193. return dom_adapter_1.DOM.createComment('root-content-insertion-point');
  28194. };
  28195. DomRenderer_.prototype.createShadowRoot = function (host, templateId) {
  28196. var sr = dom_adapter_1.DOM.createShadowRoot(host);
  28197. var tpl = this._componentTpls.get(templateId);
  28198. for (var i = 0; i < tpl.styles.length; i++) {
  28199. dom_adapter_1.DOM.appendChild(sr, dom_adapter_1.DOM.createStyleElement(tpl.styles[i]));
  28200. }
  28201. return sr;
  28202. };
  28203. DomRenderer_.prototype.on = function (element, eventName, callback) {
  28204. this._eventManager.addEventListener(element, eventName, decoratePreventDefault(callback));
  28205. };
  28206. DomRenderer_.prototype.globalOn = function (target, eventName, callback) {
  28207. return this._eventManager.addGlobalEventListener(target, eventName, decoratePreventDefault(callback));
  28208. };
  28209. DomRenderer_ = __decorate([
  28210. di_1.Injectable(),
  28211. __param(3, di_1.Inject(dom_tokens_1.DOCUMENT)),
  28212. __metadata('design:paramtypes', [event_manager_1.EventManager, shared_styles_host_1.DomSharedStylesHost, animation_builder_1.AnimationBuilder, Object])
  28213. ], DomRenderer_);
  28214. return DomRenderer_;
  28215. })(DomRenderer);
  28216. exports.DomRenderer_ = DomRenderer_;
  28217. function resolveInternalDomView(viewRef) {
  28218. return viewRef;
  28219. }
  28220. function resolveInternalDomFragment(fragmentRef) {
  28221. return fragmentRef.nodes;
  28222. }
  28223. function moveNodesAfterSibling(sibling, nodes) {
  28224. var parent = dom_adapter_1.DOM.parentElement(sibling);
  28225. if (nodes.length > 0 && lang_1.isPresent(parent)) {
  28226. var nextSibling = dom_adapter_1.DOM.nextSibling(sibling);
  28227. if (lang_1.isPresent(nextSibling)) {
  28228. for (var i = 0; i < nodes.length; i++) {
  28229. dom_adapter_1.DOM.insertBefore(nextSibling, nodes[i]);
  28230. }
  28231. }
  28232. else {
  28233. for (var i = 0; i < nodes.length; i++) {
  28234. dom_adapter_1.DOM.appendChild(parent, nodes[i]);
  28235. }
  28236. }
  28237. }
  28238. }
  28239. function decoratePreventDefault(eventHandler) {
  28240. return function (event) {
  28241. var allowDefaultBehavior = eventHandler(event);
  28242. if (!allowDefaultBehavior) {
  28243. // TODO(tbosch): move preventDefault into event plugins...
  28244. dom_adapter_1.DOM.preventDefault(event);
  28245. }
  28246. };
  28247. }
  28248. var NS_PREFIX_RE = /^@([^:]+):(.+)/g;
  28249. function splitNamespace(name) {
  28250. if (name[0] != '@') {
  28251. return [null, name];
  28252. }
  28253. var match = lang_1.RegExpWrapper.firstMatch(NS_PREFIX_RE, name);
  28254. return [match[1], match[2]];
  28255. }
  28256. /***/ },
  28257. /* 189 */
  28258. /***/ function(module, exports, __webpack_require__) {
  28259. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  28260. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  28261. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  28262. 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;
  28263. return c > 3 && r && Object.defineProperty(target, key, r), r;
  28264. };
  28265. var __metadata = (this && this.__metadata) || function (k, v) {
  28266. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  28267. };
  28268. var di_1 = __webpack_require__(6);
  28269. var css_animation_builder_1 = __webpack_require__(190);
  28270. var browser_details_1 = __webpack_require__(195);
  28271. var AnimationBuilder = (function () {
  28272. /**
  28273. * Used for DI
  28274. * @param browserDetails
  28275. */
  28276. function AnimationBuilder(browserDetails) {
  28277. this.browserDetails = browserDetails;
  28278. }
  28279. /**
  28280. * Creates a new CSS Animation
  28281. * @returns {CssAnimationBuilder}
  28282. */
  28283. AnimationBuilder.prototype.css = function () { return new css_animation_builder_1.CssAnimationBuilder(this.browserDetails); };
  28284. AnimationBuilder = __decorate([
  28285. di_1.Injectable(),
  28286. __metadata('design:paramtypes', [browser_details_1.BrowserDetails])
  28287. ], AnimationBuilder);
  28288. return AnimationBuilder;
  28289. })();
  28290. exports.AnimationBuilder = AnimationBuilder;
  28291. /***/ },
  28292. /* 190 */
  28293. /***/ function(module, exports, __webpack_require__) {
  28294. var css_animation_options_1 = __webpack_require__(191);
  28295. var animation_1 = __webpack_require__(192);
  28296. var CssAnimationBuilder = (function () {
  28297. /**
  28298. * Accepts public properties for CssAnimationBuilder
  28299. */
  28300. function CssAnimationBuilder(browserDetails) {
  28301. this.browserDetails = browserDetails;
  28302. /** @type {CssAnimationOptions} */
  28303. this.data = new css_animation_options_1.CssAnimationOptions();
  28304. }
  28305. /**
  28306. * Adds a temporary class that will be removed at the end of the animation
  28307. * @param className
  28308. */
  28309. CssAnimationBuilder.prototype.addAnimationClass = function (className) {
  28310. this.data.animationClasses.push(className);
  28311. return this;
  28312. };
  28313. /**
  28314. * Adds a class that will remain on the element after the animation has finished
  28315. * @param className
  28316. */
  28317. CssAnimationBuilder.prototype.addClass = function (className) {
  28318. this.data.classesToAdd.push(className);
  28319. return this;
  28320. };
  28321. /**
  28322. * Removes a class from the element
  28323. * @param className
  28324. */
  28325. CssAnimationBuilder.prototype.removeClass = function (className) {
  28326. this.data.classesToRemove.push(className);
  28327. return this;
  28328. };
  28329. /**
  28330. * Sets the animation duration (and overrides any defined through CSS)
  28331. * @param duration
  28332. */
  28333. CssAnimationBuilder.prototype.setDuration = function (duration) {
  28334. this.data.duration = duration;
  28335. return this;
  28336. };
  28337. /**
  28338. * Sets the animation delay (and overrides any defined through CSS)
  28339. * @param delay
  28340. */
  28341. CssAnimationBuilder.prototype.setDelay = function (delay) {
  28342. this.data.delay = delay;
  28343. return this;
  28344. };
  28345. /**
  28346. * Sets styles for both the initial state and the destination state
  28347. * @param from
  28348. * @param to
  28349. */
  28350. CssAnimationBuilder.prototype.setStyles = function (from, to) {
  28351. return this.setFromStyles(from).setToStyles(to);
  28352. };
  28353. /**
  28354. * Sets the initial styles for the animation
  28355. * @param from
  28356. */
  28357. CssAnimationBuilder.prototype.setFromStyles = function (from) {
  28358. this.data.fromStyles = from;
  28359. return this;
  28360. };
  28361. /**
  28362. * Sets the destination styles for the animation
  28363. * @param to
  28364. */
  28365. CssAnimationBuilder.prototype.setToStyles = function (to) {
  28366. this.data.toStyles = to;
  28367. return this;
  28368. };
  28369. /**
  28370. * Starts the animation and returns a promise
  28371. * @param element
  28372. */
  28373. CssAnimationBuilder.prototype.start = function (element) {
  28374. return new animation_1.Animation(element, this.data, this.browserDetails);
  28375. };
  28376. return CssAnimationBuilder;
  28377. })();
  28378. exports.CssAnimationBuilder = CssAnimationBuilder;
  28379. /***/ },
  28380. /* 191 */
  28381. /***/ function(module, exports) {
  28382. var CssAnimationOptions = (function () {
  28383. function CssAnimationOptions() {
  28384. /** classes to be added to the element */
  28385. this.classesToAdd = [];
  28386. /** classes to be removed from the element */
  28387. this.classesToRemove = [];
  28388. /** classes to be added for the duration of the animation */
  28389. this.animationClasses = [];
  28390. }
  28391. return CssAnimationOptions;
  28392. })();
  28393. exports.CssAnimationOptions = CssAnimationOptions;
  28394. /***/ },
  28395. /* 192 */
  28396. /***/ function(module, exports, __webpack_require__) {
  28397. var lang_1 = __webpack_require__(5);
  28398. var math_1 = __webpack_require__(193);
  28399. var util_1 = __webpack_require__(194);
  28400. var collection_1 = __webpack_require__(12);
  28401. var dom_adapter_1 = __webpack_require__(178);
  28402. var Animation = (function () {
  28403. /**
  28404. * Stores the start time and starts the animation
  28405. * @param element
  28406. * @param data
  28407. * @param browserDetails
  28408. */
  28409. function Animation(element, data, browserDetails) {
  28410. var _this = this;
  28411. this.element = element;
  28412. this.data = data;
  28413. this.browserDetails = browserDetails;
  28414. /** functions to be called upon completion */
  28415. this.callbacks = [];
  28416. /** functions for removing event listeners */
  28417. this.eventClearFunctions = [];
  28418. /** flag used to track whether or not the animation has finished */
  28419. this.completed = false;
  28420. this._stringPrefix = '';
  28421. this.startTime = lang_1.DateWrapper.toMillis(lang_1.DateWrapper.now());
  28422. this._stringPrefix = dom_adapter_1.DOM.getAnimationPrefix();
  28423. this.setup();
  28424. this.wait(function (timestamp) { return _this.start(); });
  28425. }
  28426. Object.defineProperty(Animation.prototype, "totalTime", {
  28427. /** total amount of time that the animation should take including delay */
  28428. get: function () {
  28429. var delay = this.computedDelay != null ? this.computedDelay : 0;
  28430. var duration = this.computedDuration != null ? this.computedDuration : 0;
  28431. return delay + duration;
  28432. },
  28433. enumerable: true,
  28434. configurable: true
  28435. });
  28436. Animation.prototype.wait = function (callback) {
  28437. // Firefox requires 2 frames for some reason
  28438. this.browserDetails.raf(callback, 2);
  28439. };
  28440. /**
  28441. * Sets up the initial styles before the animation is started
  28442. */
  28443. Animation.prototype.setup = function () {
  28444. if (this.data.fromStyles != null)
  28445. this.applyStyles(this.data.fromStyles);
  28446. if (this.data.duration != null)
  28447. this.applyStyles({ 'transitionDuration': this.data.duration.toString() + 'ms' });
  28448. if (this.data.delay != null)
  28449. this.applyStyles({ 'transitionDelay': this.data.delay.toString() + 'ms' });
  28450. };
  28451. /**
  28452. * After the initial setup has occurred, this method adds the animation styles
  28453. */
  28454. Animation.prototype.start = function () {
  28455. this.addClasses(this.data.classesToAdd);
  28456. this.addClasses(this.data.animationClasses);
  28457. this.removeClasses(this.data.classesToRemove);
  28458. if (this.data.toStyles != null)
  28459. this.applyStyles(this.data.toStyles);
  28460. var computedStyles = dom_adapter_1.DOM.getComputedStyle(this.element);
  28461. this.computedDelay =
  28462. math_1.Math.max(this.parseDurationString(computedStyles.getPropertyValue(this._stringPrefix + 'transition-delay')), this.parseDurationString(this.element.style.getPropertyValue(this._stringPrefix + 'transition-delay')));
  28463. this.computedDuration = math_1.Math.max(this.parseDurationString(computedStyles.getPropertyValue(this._stringPrefix + 'transition-duration')), this.parseDurationString(this.element.style.getPropertyValue(this._stringPrefix + 'transition-duration')));
  28464. this.addEvents();
  28465. };
  28466. /**
  28467. * Applies the provided styles to the element
  28468. * @param styles
  28469. */
  28470. Animation.prototype.applyStyles = function (styles) {
  28471. var _this = this;
  28472. collection_1.StringMapWrapper.forEach(styles, function (value, key) {
  28473. var dashCaseKey = util_1.camelCaseToDashCase(key);
  28474. if (lang_1.isPresent(dom_adapter_1.DOM.getStyle(_this.element, dashCaseKey))) {
  28475. dom_adapter_1.DOM.setStyle(_this.element, dashCaseKey, value.toString());
  28476. }
  28477. else {
  28478. dom_adapter_1.DOM.setStyle(_this.element, _this._stringPrefix + dashCaseKey, value.toString());
  28479. }
  28480. });
  28481. };
  28482. /**
  28483. * Adds the provided classes to the element
  28484. * @param classes
  28485. */
  28486. Animation.prototype.addClasses = function (classes) {
  28487. for (var i = 0, len = classes.length; i < len; i++)
  28488. dom_adapter_1.DOM.addClass(this.element, classes[i]);
  28489. };
  28490. /**
  28491. * Removes the provided classes from the element
  28492. * @param classes
  28493. */
  28494. Animation.prototype.removeClasses = function (classes) {
  28495. for (var i = 0, len = classes.length; i < len; i++)
  28496. dom_adapter_1.DOM.removeClass(this.element, classes[i]);
  28497. };
  28498. /**
  28499. * Adds events to track when animations have finished
  28500. */
  28501. Animation.prototype.addEvents = function () {
  28502. var _this = this;
  28503. if (this.totalTime > 0) {
  28504. this.eventClearFunctions.push(dom_adapter_1.DOM.onAndCancel(this.element, dom_adapter_1.DOM.getTransitionEnd(), function (event) { return _this.handleAnimationEvent(event); }));
  28505. }
  28506. else {
  28507. this.handleAnimationCompleted();
  28508. }
  28509. };
  28510. Animation.prototype.handleAnimationEvent = function (event) {
  28511. var elapsedTime = math_1.Math.round(event.elapsedTime * 1000);
  28512. if (!this.browserDetails.elapsedTimeIncludesDelay)
  28513. elapsedTime += this.computedDelay;
  28514. event.stopPropagation();
  28515. if (elapsedTime >= this.totalTime)
  28516. this.handleAnimationCompleted();
  28517. };
  28518. /**
  28519. * Runs all animation callbacks and removes temporary classes
  28520. */
  28521. Animation.prototype.handleAnimationCompleted = function () {
  28522. this.removeClasses(this.data.animationClasses);
  28523. this.callbacks.forEach(function (callback) { return callback(); });
  28524. this.callbacks = [];
  28525. this.eventClearFunctions.forEach(function (fn) { return fn(); });
  28526. this.eventClearFunctions = [];
  28527. this.completed = true;
  28528. };
  28529. /**
  28530. * Adds animation callbacks to be called upon completion
  28531. * @param callback
  28532. * @returns {Animation}
  28533. */
  28534. Animation.prototype.onComplete = function (callback) {
  28535. if (this.completed) {
  28536. callback();
  28537. }
  28538. else {
  28539. this.callbacks.push(callback);
  28540. }
  28541. return this;
  28542. };
  28543. /**
  28544. * Converts the duration string to the number of milliseconds
  28545. * @param duration
  28546. * @returns {number}
  28547. */
  28548. Animation.prototype.parseDurationString = function (duration) {
  28549. var maxValue = 0;
  28550. // duration must have at least 2 characters to be valid. (number + type)
  28551. if (duration == null || duration.length < 2) {
  28552. return maxValue;
  28553. }
  28554. else if (duration.substring(duration.length - 2) == 'ms') {
  28555. var value = lang_1.NumberWrapper.parseInt(this.stripLetters(duration), 10);
  28556. if (value > maxValue)
  28557. maxValue = value;
  28558. }
  28559. else if (duration.substring(duration.length - 1) == 's') {
  28560. var ms = lang_1.NumberWrapper.parseFloat(this.stripLetters(duration)) * 1000;
  28561. var value = math_1.Math.floor(ms);
  28562. if (value > maxValue)
  28563. maxValue = value;
  28564. }
  28565. return maxValue;
  28566. };
  28567. /**
  28568. * Strips the letters from the duration string
  28569. * @param str
  28570. * @returns {string}
  28571. */
  28572. Animation.prototype.stripLetters = function (str) {
  28573. return lang_1.StringWrapper.replaceAll(str, lang_1.RegExpWrapper.create('[^0-9]+$', ''), '');
  28574. };
  28575. return Animation;
  28576. })();
  28577. exports.Animation = Animation;
  28578. /***/ },
  28579. /* 193 */
  28580. /***/ function(module, exports, __webpack_require__) {
  28581. var lang_1 = __webpack_require__(5);
  28582. exports.Math = lang_1.global.Math;
  28583. exports.NaN = typeof exports.NaN;
  28584. /***/ },
  28585. /* 194 */
  28586. /***/ function(module, exports, __webpack_require__) {
  28587. var lang_1 = __webpack_require__(5);
  28588. var CAMEL_CASE_REGEXP = /([A-Z])/g;
  28589. var DASH_CASE_REGEXP = /-([a-z])/g;
  28590. function camelCaseToDashCase(input) {
  28591. return lang_1.StringWrapper.replaceAllMapped(input, CAMEL_CASE_REGEXP, function (m) { return '-' + m[1].toLowerCase(); });
  28592. }
  28593. exports.camelCaseToDashCase = camelCaseToDashCase;
  28594. function dashCaseToCamelCase(input) {
  28595. return lang_1.StringWrapper.replaceAllMapped(input, DASH_CASE_REGEXP, function (m) { return m[1].toUpperCase(); });
  28596. }
  28597. exports.dashCaseToCamelCase = dashCaseToCamelCase;
  28598. /***/ },
  28599. /* 195 */
  28600. /***/ function(module, exports, __webpack_require__) {
  28601. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  28602. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  28603. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  28604. 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;
  28605. return c > 3 && r && Object.defineProperty(target, key, r), r;
  28606. };
  28607. var __metadata = (this && this.__metadata) || function (k, v) {
  28608. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  28609. };
  28610. var di_1 = __webpack_require__(6);
  28611. var math_1 = __webpack_require__(193);
  28612. var dom_adapter_1 = __webpack_require__(178);
  28613. var BrowserDetails = (function () {
  28614. function BrowserDetails() {
  28615. this.elapsedTimeIncludesDelay = false;
  28616. this.doesElapsedTimeIncludesDelay();
  28617. }
  28618. /**
  28619. * Determines if `event.elapsedTime` includes transition delay in the current browser. At this
  28620. * time, Chrome and Opera seem to be the only browsers that include this.
  28621. */
  28622. BrowserDetails.prototype.doesElapsedTimeIncludesDelay = function () {
  28623. var _this = this;
  28624. var div = dom_adapter_1.DOM.createElement('div');
  28625. dom_adapter_1.DOM.setAttribute(div, 'style', "position: absolute; top: -9999px; left: -9999px; width: 1px;\n height: 1px; transition: all 1ms linear 1ms;");
  28626. // Firefox requires that we wait for 2 frames for some reason
  28627. this.raf(function (timestamp) {
  28628. dom_adapter_1.DOM.on(div, 'transitionend', function (event) {
  28629. var elapsed = math_1.Math.round(event.elapsedTime * 1000);
  28630. _this.elapsedTimeIncludesDelay = elapsed == 2;
  28631. dom_adapter_1.DOM.remove(div);
  28632. });
  28633. dom_adapter_1.DOM.setStyle(div, 'width', '2px');
  28634. }, 2);
  28635. };
  28636. BrowserDetails.prototype.raf = function (callback, frames) {
  28637. if (frames === void 0) { frames = 1; }
  28638. var queue = new RafQueue(callback, frames);
  28639. return function () { return queue.cancel(); };
  28640. };
  28641. BrowserDetails = __decorate([
  28642. di_1.Injectable(),
  28643. __metadata('design:paramtypes', [])
  28644. ], BrowserDetails);
  28645. return BrowserDetails;
  28646. })();
  28647. exports.BrowserDetails = BrowserDetails;
  28648. var RafQueue = (function () {
  28649. function RafQueue(callback, frames) {
  28650. this.callback = callback;
  28651. this.frames = frames;
  28652. this._raf();
  28653. }
  28654. RafQueue.prototype._raf = function () {
  28655. var _this = this;
  28656. this.currentFrameId = dom_adapter_1.DOM.requestAnimationFrame(function (timestamp) { return _this._nextFrame(timestamp); });
  28657. };
  28658. RafQueue.prototype._nextFrame = function (timestamp) {
  28659. this.frames--;
  28660. if (this.frames > 0) {
  28661. this._raf();
  28662. }
  28663. else {
  28664. this.callback(timestamp);
  28665. }
  28666. };
  28667. RafQueue.prototype.cancel = function () {
  28668. dom_adapter_1.DOM.cancelAnimationFrame(this.currentFrameId);
  28669. this.currentFrameId = null;
  28670. };
  28671. return RafQueue;
  28672. })();
  28673. /***/ },
  28674. /* 196 */
  28675. /***/ function(module, exports, __webpack_require__) {
  28676. var __extends = (this && this.__extends) || function (d, b) {
  28677. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  28678. function __() { this.constructor = d; }
  28679. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  28680. };
  28681. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  28682. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  28683. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  28684. 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;
  28685. return c > 3 && r && Object.defineProperty(target, key, r), r;
  28686. };
  28687. var __metadata = (this && this.__metadata) || function (k, v) {
  28688. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  28689. };
  28690. var __param = (this && this.__param) || function (paramIndex, decorator) {
  28691. return function (target, key) { decorator(target, key, paramIndex); }
  28692. };
  28693. var dom_adapter_1 = __webpack_require__(178);
  28694. var di_1 = __webpack_require__(6);
  28695. var collection_1 = __webpack_require__(12);
  28696. var dom_tokens_1 = __webpack_require__(187);
  28697. var SharedStylesHost = (function () {
  28698. function SharedStylesHost() {
  28699. /** @internal */
  28700. this._styles = [];
  28701. /** @internal */
  28702. this._stylesSet = new Set();
  28703. }
  28704. SharedStylesHost.prototype.addStyles = function (styles) {
  28705. var _this = this;
  28706. var additions = [];
  28707. styles.forEach(function (style) {
  28708. if (!collection_1.SetWrapper.has(_this._stylesSet, style)) {
  28709. _this._stylesSet.add(style);
  28710. _this._styles.push(style);
  28711. additions.push(style);
  28712. }
  28713. });
  28714. this.onStylesAdded(additions);
  28715. };
  28716. SharedStylesHost.prototype.onStylesAdded = function (additions) { };
  28717. SharedStylesHost.prototype.getAllStyles = function () { return this._styles; };
  28718. SharedStylesHost = __decorate([
  28719. di_1.Injectable(),
  28720. __metadata('design:paramtypes', [])
  28721. ], SharedStylesHost);
  28722. return SharedStylesHost;
  28723. })();
  28724. exports.SharedStylesHost = SharedStylesHost;
  28725. var DomSharedStylesHost = (function (_super) {
  28726. __extends(DomSharedStylesHost, _super);
  28727. function DomSharedStylesHost(doc) {
  28728. _super.call(this);
  28729. this._hostNodes = new Set();
  28730. this._hostNodes.add(doc.head);
  28731. }
  28732. /** @internal */
  28733. DomSharedStylesHost.prototype._addStylesToHost = function (styles, host) {
  28734. for (var i = 0; i < styles.length; i++) {
  28735. var style = styles[i];
  28736. dom_adapter_1.DOM.appendChild(host, dom_adapter_1.DOM.createStyleElement(style));
  28737. }
  28738. };
  28739. DomSharedStylesHost.prototype.addHost = function (hostNode) {
  28740. this._addStylesToHost(this._styles, hostNode);
  28741. this._hostNodes.add(hostNode);
  28742. };
  28743. DomSharedStylesHost.prototype.removeHost = function (hostNode) { collection_1.SetWrapper.delete(this._hostNodes, hostNode); };
  28744. DomSharedStylesHost.prototype.onStylesAdded = function (additions) {
  28745. var _this = this;
  28746. this._hostNodes.forEach(function (hostNode) { _this._addStylesToHost(additions, hostNode); });
  28747. };
  28748. DomSharedStylesHost = __decorate([
  28749. di_1.Injectable(),
  28750. __param(0, di_1.Inject(dom_tokens_1.DOCUMENT)),
  28751. __metadata('design:paramtypes', [Object])
  28752. ], DomSharedStylesHost);
  28753. return DomSharedStylesHost;
  28754. })(SharedStylesHost);
  28755. exports.DomSharedStylesHost = DomSharedStylesHost;
  28756. /***/ },
  28757. /* 197 */
  28758. /***/ function(module, exports, __webpack_require__) {
  28759. var __extends = (this && this.__extends) || function (d, b) {
  28760. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  28761. function __() { this.constructor = d; }
  28762. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  28763. };
  28764. var collection_1 = __webpack_require__(12);
  28765. var lang_1 = __webpack_require__(5);
  28766. var dom_adapter_1 = __webpack_require__(178);
  28767. var generic_browser_adapter_1 = __webpack_require__(198);
  28768. var _attrToPropMap = {
  28769. 'class': 'className',
  28770. 'innerHtml': 'innerHTML',
  28771. 'readonly': 'readOnly',
  28772. 'tabindex': 'tabIndex'
  28773. };
  28774. var DOM_KEY_LOCATION_NUMPAD = 3;
  28775. // Map to convert some key or keyIdentifier values to what will be returned by getEventKey
  28776. var _keyMap = {
  28777. // The following values are here for cross-browser compatibility and to match the W3C standard
  28778. // cf http://www.w3.org/TR/DOM-Level-3-Events-key/
  28779. '\b': 'Backspace',
  28780. '\t': 'Tab',
  28781. '\x7F': 'Delete',
  28782. '\x1B': 'Escape',
  28783. 'Del': 'Delete',
  28784. 'Esc': 'Escape',
  28785. 'Left': 'ArrowLeft',
  28786. 'Right': 'ArrowRight',
  28787. 'Up': 'ArrowUp',
  28788. 'Down': 'ArrowDown',
  28789. 'Menu': 'ContextMenu',
  28790. 'Scroll': 'ScrollLock',
  28791. 'Win': 'OS'
  28792. };
  28793. // There is a bug in Chrome for numeric keypad keys:
  28794. // https://code.google.com/p/chromium/issues/detail?id=155654
  28795. // 1, 2, 3 ... are reported as A, B, C ...
  28796. var _chromeNumKeyPadMap = {
  28797. 'A': '1',
  28798. 'B': '2',
  28799. 'C': '3',
  28800. 'D': '4',
  28801. 'E': '5',
  28802. 'F': '6',
  28803. 'G': '7',
  28804. 'H': '8',
  28805. 'I': '9',
  28806. 'J': '*',
  28807. 'K': '+',
  28808. 'M': '-',
  28809. 'N': '.',
  28810. 'O': '/',
  28811. '\x60': '0',
  28812. '\x90': 'NumLock'
  28813. };
  28814. /**
  28815. * A `DomAdapter` powered by full browser DOM APIs.
  28816. */
  28817. /* tslint:disable:requireParameterType */
  28818. var BrowserDomAdapter = (function (_super) {
  28819. __extends(BrowserDomAdapter, _super);
  28820. function BrowserDomAdapter() {
  28821. _super.apply(this, arguments);
  28822. }
  28823. BrowserDomAdapter.prototype.parse = function (templateHtml) { throw new Error("parse not implemented"); };
  28824. BrowserDomAdapter.makeCurrent = function () { dom_adapter_1.setRootDomAdapter(new BrowserDomAdapter()); };
  28825. BrowserDomAdapter.prototype.hasProperty = function (element, name) { return name in element; };
  28826. BrowserDomAdapter.prototype.setProperty = function (el, name, value) { el[name] = value; };
  28827. BrowserDomAdapter.prototype.getProperty = function (el, name) { return el[name]; };
  28828. BrowserDomAdapter.prototype.invoke = function (el, methodName, args) {
  28829. el[methodName].apply(el, args);
  28830. };
  28831. // TODO(tbosch): move this into a separate environment class once we have it
  28832. BrowserDomAdapter.prototype.logError = function (error) {
  28833. if (window.console.error) {
  28834. window.console.error(error);
  28835. }
  28836. else {
  28837. window.console.log(error);
  28838. }
  28839. };
  28840. BrowserDomAdapter.prototype.log = function (error) { window.console.log(error); };
  28841. BrowserDomAdapter.prototype.logGroup = function (error) {
  28842. if (window.console.group) {
  28843. window.console.group(error);
  28844. this.logError(error);
  28845. }
  28846. else {
  28847. window.console.log(error);
  28848. }
  28849. };
  28850. BrowserDomAdapter.prototype.logGroupEnd = function () {
  28851. if (window.console.groupEnd) {
  28852. window.console.groupEnd();
  28853. }
  28854. };
  28855. Object.defineProperty(BrowserDomAdapter.prototype, "attrToPropMap", {
  28856. get: function () { return _attrToPropMap; },
  28857. enumerable: true,
  28858. configurable: true
  28859. });
  28860. BrowserDomAdapter.prototype.query = function (selector) { return document.querySelector(selector); };
  28861. BrowserDomAdapter.prototype.querySelector = function (el, selector) { return el.querySelector(selector); };
  28862. BrowserDomAdapter.prototype.querySelectorAll = function (el, selector) { return el.querySelectorAll(selector); };
  28863. BrowserDomAdapter.prototype.on = function (el, evt, listener) { el.addEventListener(evt, listener, false); };
  28864. BrowserDomAdapter.prototype.onAndCancel = function (el, evt, listener) {
  28865. el.addEventListener(evt, listener, false);
  28866. // Needed to follow Dart's subscription semantic, until fix of
  28867. // https://code.google.com/p/dart/issues/detail?id=17406
  28868. return function () { el.removeEventListener(evt, listener, false); };
  28869. };
  28870. BrowserDomAdapter.prototype.dispatchEvent = function (el, evt) { el.dispatchEvent(evt); };
  28871. BrowserDomAdapter.prototype.createMouseEvent = function (eventType) {
  28872. var evt = document.createEvent('MouseEvent');
  28873. evt.initEvent(eventType, true, true);
  28874. return evt;
  28875. };
  28876. BrowserDomAdapter.prototype.createEvent = function (eventType) {
  28877. var evt = document.createEvent('Event');
  28878. evt.initEvent(eventType, true, true);
  28879. return evt;
  28880. };
  28881. BrowserDomAdapter.prototype.preventDefault = function (evt) {
  28882. evt.preventDefault();
  28883. evt.returnValue = false;
  28884. };
  28885. BrowserDomAdapter.prototype.isPrevented = function (evt) {
  28886. return evt.defaultPrevented || lang_1.isPresent(evt.returnValue) && !evt.returnValue;
  28887. };
  28888. BrowserDomAdapter.prototype.getInnerHTML = function (el) { return el.innerHTML; };
  28889. BrowserDomAdapter.prototype.getOuterHTML = function (el) { return el.outerHTML; };
  28890. BrowserDomAdapter.prototype.nodeName = function (node) { return node.nodeName; };
  28891. BrowserDomAdapter.prototype.nodeValue = function (node) { return node.nodeValue; };
  28892. BrowserDomAdapter.prototype.type = function (node) { return node.type; };
  28893. BrowserDomAdapter.prototype.content = function (node) {
  28894. if (this.hasProperty(node, "content")) {
  28895. return node.content;
  28896. }
  28897. else {
  28898. return node;
  28899. }
  28900. };
  28901. BrowserDomAdapter.prototype.firstChild = function (el) { return el.firstChild; };
  28902. BrowserDomAdapter.prototype.nextSibling = function (el) { return el.nextSibling; };
  28903. BrowserDomAdapter.prototype.parentElement = function (el) { return el.parentNode; };
  28904. BrowserDomAdapter.prototype.childNodes = function (el) { return el.childNodes; };
  28905. BrowserDomAdapter.prototype.childNodesAsList = function (el) {
  28906. var childNodes = el.childNodes;
  28907. var res = collection_1.ListWrapper.createFixedSize(childNodes.length);
  28908. for (var i = 0; i < childNodes.length; i++) {
  28909. res[i] = childNodes[i];
  28910. }
  28911. return res;
  28912. };
  28913. BrowserDomAdapter.prototype.clearNodes = function (el) {
  28914. while (el.firstChild) {
  28915. el.removeChild(el.firstChild);
  28916. }
  28917. };
  28918. BrowserDomAdapter.prototype.appendChild = function (el, node) { el.appendChild(node); };
  28919. BrowserDomAdapter.prototype.removeChild = function (el, node) { el.removeChild(node); };
  28920. BrowserDomAdapter.prototype.replaceChild = function (el, newChild, oldChild) { el.replaceChild(newChild, oldChild); };
  28921. BrowserDomAdapter.prototype.remove = function (node) {
  28922. if (node.parentNode) {
  28923. node.parentNode.removeChild(node);
  28924. }
  28925. return node;
  28926. };
  28927. BrowserDomAdapter.prototype.insertBefore = function (el, node) { el.parentNode.insertBefore(node, el); };
  28928. BrowserDomAdapter.prototype.insertAllBefore = function (el, nodes) { nodes.forEach(function (n) { return el.parentNode.insertBefore(n, el); }); };
  28929. BrowserDomAdapter.prototype.insertAfter = function (el, node) { el.parentNode.insertBefore(node, el.nextSibling); };
  28930. BrowserDomAdapter.prototype.setInnerHTML = function (el, value) { el.innerHTML = value; };
  28931. BrowserDomAdapter.prototype.getText = function (el) { return el.textContent; };
  28932. // TODO(vicb): removed Element type because it does not support StyleElement
  28933. BrowserDomAdapter.prototype.setText = function (el, value) { el.textContent = value; };
  28934. BrowserDomAdapter.prototype.getValue = function (el) { return el.value; };
  28935. BrowserDomAdapter.prototype.setValue = function (el, value) { el.value = value; };
  28936. BrowserDomAdapter.prototype.getChecked = function (el) { return el.checked; };
  28937. BrowserDomAdapter.prototype.setChecked = function (el, value) { el.checked = value; };
  28938. BrowserDomAdapter.prototype.createComment = function (text) { return document.createComment(text); };
  28939. BrowserDomAdapter.prototype.createTemplate = function (html) {
  28940. var t = document.createElement('template');
  28941. t.innerHTML = html;
  28942. return t;
  28943. };
  28944. BrowserDomAdapter.prototype.createElement = function (tagName, doc) {
  28945. if (doc === void 0) { doc = document; }
  28946. return doc.createElement(tagName);
  28947. };
  28948. BrowserDomAdapter.prototype.createElementNS = function (ns, tagName, doc) {
  28949. if (doc === void 0) { doc = document; }
  28950. return doc.createElementNS(ns, tagName);
  28951. };
  28952. BrowserDomAdapter.prototype.createTextNode = function (text, doc) {
  28953. if (doc === void 0) { doc = document; }
  28954. return doc.createTextNode(text);
  28955. };
  28956. BrowserDomAdapter.prototype.createScriptTag = function (attrName, attrValue, doc) {
  28957. if (doc === void 0) { doc = document; }
  28958. var el = doc.createElement('SCRIPT');
  28959. el.setAttribute(attrName, attrValue);
  28960. return el;
  28961. };
  28962. BrowserDomAdapter.prototype.createStyleElement = function (css, doc) {
  28963. if (doc === void 0) { doc = document; }
  28964. var style = doc.createElement('style');
  28965. this.appendChild(style, this.createTextNode(css));
  28966. return style;
  28967. };
  28968. BrowserDomAdapter.prototype.createShadowRoot = function (el) { return el.createShadowRoot(); };
  28969. BrowserDomAdapter.prototype.getShadowRoot = function (el) { return el.shadowRoot; };
  28970. BrowserDomAdapter.prototype.getHost = function (el) { return el.host; };
  28971. BrowserDomAdapter.prototype.clone = function (node) { return node.cloneNode(true); };
  28972. BrowserDomAdapter.prototype.getElementsByClassName = function (element, name) {
  28973. return element.getElementsByClassName(name);
  28974. };
  28975. BrowserDomAdapter.prototype.getElementsByTagName = function (element, name) {
  28976. return element.getElementsByTagName(name);
  28977. };
  28978. BrowserDomAdapter.prototype.classList = function (element) { return Array.prototype.slice.call(element.classList, 0); };
  28979. BrowserDomAdapter.prototype.addClass = function (element, className) { element.classList.add(className); };
  28980. BrowserDomAdapter.prototype.removeClass = function (element, className) { element.classList.remove(className); };
  28981. BrowserDomAdapter.prototype.hasClass = function (element, className) { return element.classList.contains(className); };
  28982. BrowserDomAdapter.prototype.setStyle = function (element, styleName, styleValue) {
  28983. element.style[styleName] = styleValue;
  28984. };
  28985. BrowserDomAdapter.prototype.removeStyle = function (element, stylename) { element.style[stylename] = null; };
  28986. BrowserDomAdapter.prototype.getStyle = function (element, stylename) { return element.style[stylename]; };
  28987. BrowserDomAdapter.prototype.hasStyle = function (element, styleName, styleValue) {
  28988. if (styleValue === void 0) { styleValue = null; }
  28989. var value = this.getStyle(element, styleName) || '';
  28990. return styleValue ? value == styleValue : value.length > 0;
  28991. };
  28992. BrowserDomAdapter.prototype.tagName = function (element) { return element.tagName; };
  28993. BrowserDomAdapter.prototype.attributeMap = function (element) {
  28994. var res = new Map();
  28995. var elAttrs = element.attributes;
  28996. for (var i = 0; i < elAttrs.length; i++) {
  28997. var attrib = elAttrs[i];
  28998. res.set(attrib.name, attrib.value);
  28999. }
  29000. return res;
  29001. };
  29002. BrowserDomAdapter.prototype.hasAttribute = function (element, attribute) { return element.hasAttribute(attribute); };
  29003. BrowserDomAdapter.prototype.getAttribute = function (element, attribute) { return element.getAttribute(attribute); };
  29004. BrowserDomAdapter.prototype.setAttribute = function (element, name, value) { element.setAttribute(name, value); };
  29005. BrowserDomAdapter.prototype.setAttributeNS = function (element, ns, name, value) {
  29006. element.setAttributeNS(ns, name, value);
  29007. };
  29008. BrowserDomAdapter.prototype.removeAttribute = function (element, attribute) { element.removeAttribute(attribute); };
  29009. BrowserDomAdapter.prototype.templateAwareRoot = function (el) { return this.isTemplateElement(el) ? this.content(el) : el; };
  29010. BrowserDomAdapter.prototype.createHtmlDocument = function () {
  29011. return document.implementation.createHTMLDocument('fakeTitle');
  29012. };
  29013. BrowserDomAdapter.prototype.defaultDoc = function () { return document; };
  29014. BrowserDomAdapter.prototype.getBoundingClientRect = function (el) {
  29015. try {
  29016. return el.getBoundingClientRect();
  29017. }
  29018. catch (e) {
  29019. return { top: 0, bottom: 0, left: 0, right: 0, width: 0, height: 0 };
  29020. }
  29021. };
  29022. BrowserDomAdapter.prototype.getTitle = function () { return document.title; };
  29023. BrowserDomAdapter.prototype.setTitle = function (newTitle) { document.title = newTitle || ''; };
  29024. BrowserDomAdapter.prototype.elementMatches = function (n, selector) {
  29025. var matches = false;
  29026. if (n instanceof HTMLElement) {
  29027. if (n.matches) {
  29028. matches = n.matches(selector);
  29029. }
  29030. else if (n.msMatchesSelector) {
  29031. matches = n.msMatchesSelector(selector);
  29032. }
  29033. else if (n.webkitMatchesSelector) {
  29034. matches = n.webkitMatchesSelector(selector);
  29035. }
  29036. }
  29037. return matches;
  29038. };
  29039. BrowserDomAdapter.prototype.isTemplateElement = function (el) {
  29040. return el instanceof HTMLElement && el.nodeName == "TEMPLATE";
  29041. };
  29042. BrowserDomAdapter.prototype.isTextNode = function (node) { return node.nodeType === Node.TEXT_NODE; };
  29043. BrowserDomAdapter.prototype.isCommentNode = function (node) { return node.nodeType === Node.COMMENT_NODE; };
  29044. BrowserDomAdapter.prototype.isElementNode = function (node) { return node.nodeType === Node.ELEMENT_NODE; };
  29045. BrowserDomAdapter.prototype.hasShadowRoot = function (node) { return node instanceof HTMLElement && lang_1.isPresent(node.shadowRoot); };
  29046. BrowserDomAdapter.prototype.isShadowRoot = function (node) { return node instanceof DocumentFragment; };
  29047. BrowserDomAdapter.prototype.importIntoDoc = function (node) {
  29048. var toImport = node;
  29049. if (this.isTemplateElement(node)) {
  29050. toImport = this.content(node);
  29051. }
  29052. return document.importNode(toImport, true);
  29053. };
  29054. BrowserDomAdapter.prototype.adoptNode = function (node) { return document.adoptNode(node); };
  29055. BrowserDomAdapter.prototype.getHref = function (el) { return el.href; };
  29056. BrowserDomAdapter.prototype.getEventKey = function (event) {
  29057. var key = event.key;
  29058. if (lang_1.isBlank(key)) {
  29059. key = event.keyIdentifier;
  29060. // keyIdentifier is defined in the old draft of DOM Level 3 Events implemented by Chrome and
  29061. // Safari
  29062. // cf
  29063. // http://www.w3.org/TR/2007/WD-DOM-Level-3-Events-20071221/events.html#Events-KeyboardEvents-Interfaces
  29064. if (lang_1.isBlank(key)) {
  29065. return 'Unidentified';
  29066. }
  29067. if (key.startsWith('U+')) {
  29068. key = String.fromCharCode(parseInt(key.substring(2), 16));
  29069. if (event.location === DOM_KEY_LOCATION_NUMPAD && _chromeNumKeyPadMap.hasOwnProperty(key)) {
  29070. // There is a bug in Chrome for numeric keypad keys:
  29071. // https://code.google.com/p/chromium/issues/detail?id=155654
  29072. // 1, 2, 3 ... are reported as A, B, C ...
  29073. key = _chromeNumKeyPadMap[key];
  29074. }
  29075. }
  29076. }
  29077. if (_keyMap.hasOwnProperty(key)) {
  29078. key = _keyMap[key];
  29079. }
  29080. return key;
  29081. };
  29082. BrowserDomAdapter.prototype.getGlobalEventTarget = function (target) {
  29083. if (target == "window") {
  29084. return window;
  29085. }
  29086. else if (target == "document") {
  29087. return document;
  29088. }
  29089. else if (target == "body") {
  29090. return document.body;
  29091. }
  29092. };
  29093. BrowserDomAdapter.prototype.getHistory = function () { return window.history; };
  29094. BrowserDomAdapter.prototype.getLocation = function () { return window.location; };
  29095. BrowserDomAdapter.prototype.getBaseHref = function () {
  29096. var href = getBaseElementHref();
  29097. if (lang_1.isBlank(href)) {
  29098. return null;
  29099. }
  29100. return relativePath(href);
  29101. };
  29102. BrowserDomAdapter.prototype.resetBaseElement = function () { baseElement = null; };
  29103. BrowserDomAdapter.prototype.getUserAgent = function () { return window.navigator.userAgent; };
  29104. BrowserDomAdapter.prototype.setData = function (element, name, value) {
  29105. this.setAttribute(element, 'data-' + name, value);
  29106. };
  29107. BrowserDomAdapter.prototype.getData = function (element, name) { return this.getAttribute(element, 'data-' + name); };
  29108. BrowserDomAdapter.prototype.getComputedStyle = function (element) { return getComputedStyle(element); };
  29109. // TODO(tbosch): move this into a separate environment class once we have it
  29110. BrowserDomAdapter.prototype.setGlobalVar = function (path, value) { lang_1.setValueOnPath(lang_1.global, path, value); };
  29111. BrowserDomAdapter.prototype.requestAnimationFrame = function (callback) { return window.requestAnimationFrame(callback); };
  29112. BrowserDomAdapter.prototype.cancelAnimationFrame = function (id) { window.cancelAnimationFrame(id); };
  29113. BrowserDomAdapter.prototype.performanceNow = function () {
  29114. // performance.now() is not available in all browsers, see
  29115. // http://caniuse.com/#search=performance.now
  29116. if (lang_1.isPresent(window.performance) && lang_1.isPresent(window.performance.now)) {
  29117. return window.performance.now();
  29118. }
  29119. else {
  29120. return lang_1.DateWrapper.toMillis(lang_1.DateWrapper.now());
  29121. }
  29122. };
  29123. return BrowserDomAdapter;
  29124. })(generic_browser_adapter_1.GenericBrowserDomAdapter);
  29125. exports.BrowserDomAdapter = BrowserDomAdapter;
  29126. var baseElement = null;
  29127. function getBaseElementHref() {
  29128. if (lang_1.isBlank(baseElement)) {
  29129. baseElement = document.querySelector('base');
  29130. if (lang_1.isBlank(baseElement)) {
  29131. return null;
  29132. }
  29133. }
  29134. return baseElement.getAttribute('href');
  29135. }
  29136. // based on urlUtils.js in AngularJS 1
  29137. var urlParsingNode = null;
  29138. function relativePath(url) {
  29139. if (lang_1.isBlank(urlParsingNode)) {
  29140. urlParsingNode = document.createElement("a");
  29141. }
  29142. urlParsingNode.setAttribute('href', url);
  29143. return (urlParsingNode.pathname.charAt(0) === '/') ? urlParsingNode.pathname :
  29144. '/' + urlParsingNode.pathname;
  29145. }
  29146. /***/ },
  29147. /* 198 */
  29148. /***/ function(module, exports, __webpack_require__) {
  29149. var __extends = (this && this.__extends) || function (d, b) {
  29150. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  29151. function __() { this.constructor = d; }
  29152. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  29153. };
  29154. var collection_1 = __webpack_require__(12);
  29155. var lang_1 = __webpack_require__(5);
  29156. var dom_adapter_1 = __webpack_require__(178);
  29157. var xhr_impl_1 = __webpack_require__(199);
  29158. /**
  29159. * Provides DOM operations in any browser environment.
  29160. */
  29161. var GenericBrowserDomAdapter = (function (_super) {
  29162. __extends(GenericBrowserDomAdapter, _super);
  29163. function GenericBrowserDomAdapter() {
  29164. var _this = this;
  29165. _super.call(this);
  29166. this._animationPrefix = null;
  29167. this._transitionEnd = null;
  29168. try {
  29169. var element = this.createElement('div', this.defaultDoc());
  29170. if (lang_1.isPresent(this.getStyle(element, 'animationName'))) {
  29171. this._animationPrefix = '';
  29172. }
  29173. else {
  29174. var domPrefixes = ['Webkit', 'Moz', 'O', 'ms'];
  29175. for (var i = 0; i < domPrefixes.length; i++) {
  29176. if (lang_1.isPresent(this.getStyle(element, domPrefixes[i] + 'AnimationName'))) {
  29177. this._animationPrefix = '-' + domPrefixes[i].toLowerCase() + '-';
  29178. break;
  29179. }
  29180. }
  29181. }
  29182. var transEndEventNames = {
  29183. WebkitTransition: 'webkitTransitionEnd',
  29184. MozTransition: 'transitionend',
  29185. OTransition: 'oTransitionEnd otransitionend',
  29186. transition: 'transitionend'
  29187. };
  29188. collection_1.StringMapWrapper.forEach(transEndEventNames, function (value, key) {
  29189. if (lang_1.isPresent(_this.getStyle(element, key))) {
  29190. _this._transitionEnd = value;
  29191. }
  29192. });
  29193. }
  29194. catch (e) {
  29195. this._animationPrefix = null;
  29196. this._transitionEnd = null;
  29197. }
  29198. }
  29199. GenericBrowserDomAdapter.prototype.getXHR = function () { return xhr_impl_1.XHRImpl; };
  29200. GenericBrowserDomAdapter.prototype.getDistributedNodes = function (el) { return el.getDistributedNodes(); };
  29201. GenericBrowserDomAdapter.prototype.resolveAndSetHref = function (el, baseUrl, href) {
  29202. el.href = href == null ? baseUrl : baseUrl + '/../' + href;
  29203. };
  29204. GenericBrowserDomAdapter.prototype.supportsDOMEvents = function () { return true; };
  29205. GenericBrowserDomAdapter.prototype.supportsNativeShadowDOM = function () {
  29206. return lang_1.isFunction(this.defaultDoc().body.createShadowRoot);
  29207. };
  29208. GenericBrowserDomAdapter.prototype.getAnimationPrefix = function () {
  29209. return lang_1.isPresent(this._animationPrefix) ? this._animationPrefix : "";
  29210. };
  29211. GenericBrowserDomAdapter.prototype.getTransitionEnd = function () { return lang_1.isPresent(this._transitionEnd) ? this._transitionEnd : ""; };
  29212. GenericBrowserDomAdapter.prototype.supportsAnimation = function () {
  29213. return lang_1.isPresent(this._animationPrefix) && lang_1.isPresent(this._transitionEnd);
  29214. };
  29215. return GenericBrowserDomAdapter;
  29216. })(dom_adapter_1.DomAdapter);
  29217. exports.GenericBrowserDomAdapter = GenericBrowserDomAdapter;
  29218. /***/ },
  29219. /* 199 */
  29220. /***/ function(module, exports, __webpack_require__) {
  29221. var __extends = (this && this.__extends) || function (d, b) {
  29222. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  29223. function __() { this.constructor = d; }
  29224. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  29225. };
  29226. var promise_1 = __webpack_require__(61);
  29227. var lang_1 = __webpack_require__(5);
  29228. var xhr_1 = __webpack_require__(149);
  29229. var XHRImpl = (function (_super) {
  29230. __extends(XHRImpl, _super);
  29231. function XHRImpl() {
  29232. _super.apply(this, arguments);
  29233. }
  29234. XHRImpl.prototype.get = function (url) {
  29235. var completer = promise_1.PromiseWrapper.completer();
  29236. var xhr = new XMLHttpRequest();
  29237. xhr.open('GET', url, true);
  29238. xhr.responseType = 'text';
  29239. xhr.onload = function () {
  29240. // responseText is the old-school way of retrieving response (supported by IE8 & 9)
  29241. // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
  29242. var response = lang_1.isPresent(xhr.response) ? xhr.response : xhr.responseText;
  29243. // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
  29244. var status = xhr.status === 1223 ? 204 : xhr.status;
  29245. // fix status code when it is 0 (0 status is undocumented).
  29246. // Occurs when accessing file resources or on Android 4.1 stock browser
  29247. // while retrieving files from application cache.
  29248. if (status === 0) {
  29249. status = response ? 200 : 0;
  29250. }
  29251. if (200 <= status && status <= 300) {
  29252. completer.resolve(response);
  29253. }
  29254. else {
  29255. completer.reject("Failed to load " + url, null);
  29256. }
  29257. };
  29258. xhr.onerror = function () { completer.reject("Failed to load " + url, null); };
  29259. xhr.send();
  29260. return completer.promise;
  29261. };
  29262. return XHRImpl;
  29263. })(xhr_1.XHR);
  29264. exports.XHRImpl = XHRImpl;
  29265. /***/ },
  29266. /* 200 */
  29267. /***/ function(module, exports, __webpack_require__) {
  29268. var lang_1 = __webpack_require__(5);
  29269. var dom_adapter_1 = __webpack_require__(178);
  29270. var core_1 = __webpack_require__(2);
  29271. var PublicTestability = (function () {
  29272. function PublicTestability(testability) {
  29273. this._testability = testability;
  29274. }
  29275. PublicTestability.prototype.isStable = function () { return this._testability.isStable(); };
  29276. PublicTestability.prototype.whenStable = function (callback) { this._testability.whenStable(callback); };
  29277. PublicTestability.prototype.findBindings = function (using, provider, exactMatch) {
  29278. return this.findProviders(using, provider, exactMatch);
  29279. };
  29280. PublicTestability.prototype.findProviders = function (using, provider, exactMatch) {
  29281. return this._testability.findBindings(using, provider, exactMatch);
  29282. };
  29283. return PublicTestability;
  29284. })();
  29285. var BrowserGetTestability = (function () {
  29286. function BrowserGetTestability() {
  29287. }
  29288. BrowserGetTestability.init = function () { core_1.setTestabilityGetter(new BrowserGetTestability()); };
  29289. BrowserGetTestability.prototype.addToWindow = function (registry) {
  29290. lang_1.global.getAngularTestability = function (elem, findInAncestors) {
  29291. if (findInAncestors === void 0) { findInAncestors = true; }
  29292. var testability = registry.findTestabilityInTree(elem, findInAncestors);
  29293. if (testability == null) {
  29294. throw new Error('Could not find testability for element.');
  29295. }
  29296. return new PublicTestability(testability);
  29297. };
  29298. lang_1.global.getAllAngularTestabilities = function () {
  29299. var testabilities = registry.getAllTestabilities();
  29300. return testabilities.map(function (testability) { return new PublicTestability(testability); });
  29301. };
  29302. };
  29303. BrowserGetTestability.prototype.findTestabilityInTree = function (registry, elem, findInAncestors) {
  29304. if (elem == null) {
  29305. return null;
  29306. }
  29307. var t = registry.getTestability(elem);
  29308. if (lang_1.isPresent(t)) {
  29309. return t;
  29310. }
  29311. else if (!findInAncestors) {
  29312. return null;
  29313. }
  29314. if (dom_adapter_1.DOM.isShadowRoot(elem)) {
  29315. return this.findTestabilityInTree(registry, dom_adapter_1.DOM.getHost(elem), true);
  29316. }
  29317. return this.findTestabilityInTree(registry, dom_adapter_1.DOM.parentElement(elem), true);
  29318. };
  29319. return BrowserGetTestability;
  29320. })();
  29321. exports.BrowserGetTestability = BrowserGetTestability;
  29322. /***/ },
  29323. /* 201 */
  29324. /***/ function(module, exports) {
  29325. /**
  29326. * This is here because DART requires it. It is noop in JS.
  29327. */
  29328. function wtfInit() { }
  29329. exports.wtfInit = wtfInit;
  29330. /***/ },
  29331. /* 202 */
  29332. /***/ function(module, exports, __webpack_require__) {
  29333. var dom_adapter_1 = __webpack_require__(178);
  29334. /**
  29335. * A service that can be used to get and set the title of a current HTML document.
  29336. *
  29337. * Since an Angular 2 application can't be bootstrapped on the entire HTML document (`<html>` tag)
  29338. * it is not possible to bind to the `text` property of the `HTMLTitleElement` elements
  29339. * (representing the `<title>` tag). Instead, this service can be used to set and get the current
  29340. * title value.
  29341. */
  29342. var Title = (function () {
  29343. function Title() {
  29344. }
  29345. /**
  29346. * Get the title of the current HTML document.
  29347. * @returns {string}
  29348. */
  29349. Title.prototype.getTitle = function () { return dom_adapter_1.DOM.getTitle(); };
  29350. /**
  29351. * Set the title of the current HTML document.
  29352. * @param newTitle
  29353. */
  29354. Title.prototype.setTitle = function (newTitle) { dom_adapter_1.DOM.setTitle(newTitle); };
  29355. return Title;
  29356. })();
  29357. exports.Title = Title;
  29358. /***/ },
  29359. /* 203 */
  29360. /***/ function(module, exports, __webpack_require__) {
  29361. function __export(m) {
  29362. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  29363. }
  29364. /**
  29365. * This is a set of classes and objects that can be used both in the browser and on the server.
  29366. */
  29367. var dom_adapter_1 = __webpack_require__(178);
  29368. exports.DOM = dom_adapter_1.DOM;
  29369. exports.setRootDomAdapter = dom_adapter_1.setRootDomAdapter;
  29370. exports.DomAdapter = dom_adapter_1.DomAdapter;
  29371. var dom_renderer_1 = __webpack_require__(188);
  29372. exports.DomRenderer = dom_renderer_1.DomRenderer;
  29373. var dom_tokens_1 = __webpack_require__(187);
  29374. exports.DOCUMENT = dom_tokens_1.DOCUMENT;
  29375. var shared_styles_host_1 = __webpack_require__(196);
  29376. exports.SharedStylesHost = shared_styles_host_1.SharedStylesHost;
  29377. exports.DomSharedStylesHost = shared_styles_host_1.DomSharedStylesHost;
  29378. var dom_events_1 = __webpack_require__(182);
  29379. exports.DomEventsPlugin = dom_events_1.DomEventsPlugin;
  29380. var event_manager_1 = __webpack_require__(183);
  29381. exports.EVENT_MANAGER_PLUGINS = event_manager_1.EVENT_MANAGER_PLUGINS;
  29382. exports.EventManager = event_manager_1.EventManager;
  29383. exports.EventManagerPlugin = event_manager_1.EventManagerPlugin;
  29384. __export(__webpack_require__(204));
  29385. __export(__webpack_require__(205));
  29386. /***/ },
  29387. /* 204 */
  29388. /***/ function(module, exports, __webpack_require__) {
  29389. var lang_1 = __webpack_require__(5);
  29390. var dom_adapter_1 = __webpack_require__(178);
  29391. /**
  29392. * Predicates for use with {@link DebugElement}'s query functions.
  29393. */
  29394. var By = (function () {
  29395. function By() {
  29396. }
  29397. /**
  29398. * Match all elements.
  29399. *
  29400. * ## Example
  29401. *
  29402. * {@example platform/dom/debug/ts/by/by.ts region='by_all'}
  29403. */
  29404. By.all = function () { return function (debugElement) { return true; }; };
  29405. /**
  29406. * Match elements by the given CSS selector.
  29407. *
  29408. * ## Example
  29409. *
  29410. * {@example platform/dom/debug/ts/by/by.ts region='by_css'}
  29411. */
  29412. By.css = function (selector) {
  29413. return function (debugElement) {
  29414. return lang_1.isPresent(debugElement.nativeElement) ?
  29415. dom_adapter_1.DOM.elementMatches(debugElement.nativeElement, selector) :
  29416. false;
  29417. };
  29418. };
  29419. /**
  29420. * Match elements that have the given directive present.
  29421. *
  29422. * ## Example
  29423. *
  29424. * {@example platform/dom/debug/ts/by/by.ts region='by_directive'}
  29425. */
  29426. By.directive = function (type) {
  29427. return function (debugElement) { return debugElement.hasDirective(type); };
  29428. };
  29429. return By;
  29430. })();
  29431. exports.By = By;
  29432. /***/ },
  29433. /* 205 */
  29434. /***/ function(module, exports, __webpack_require__) {
  29435. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  29436. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  29437. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  29438. 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;
  29439. return c > 3 && r && Object.defineProperty(target, key, r), r;
  29440. };
  29441. var __metadata = (this && this.__metadata) || function (k, v) {
  29442. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  29443. };
  29444. var lang_1 = __webpack_require__(5);
  29445. var collection_1 = __webpack_require__(12);
  29446. var di_1 = __webpack_require__(6);
  29447. var view_listener_1 = __webpack_require__(86);
  29448. var dom_adapter_1 = __webpack_require__(178);
  29449. var api_1 = __webpack_require__(72);
  29450. var debug_element_1 = __webpack_require__(101);
  29451. var NG_ID_PROPERTY = 'ngid';
  29452. var INSPECT_GLOBAL_NAME = 'ng.probe';
  29453. var NG_ID_SEPARATOR = '#';
  29454. // Need to keep the views in a global Map so that multiple angular apps are supported
  29455. var _allIdsByView = new collection_1.Map();
  29456. var _allViewsById = new collection_1.Map();
  29457. var _nextId = 0;
  29458. function _setElementId(element, indices) {
  29459. if (lang_1.isPresent(element) && dom_adapter_1.DOM.isElementNode(element)) {
  29460. dom_adapter_1.DOM.setData(element, NG_ID_PROPERTY, indices.join(NG_ID_SEPARATOR));
  29461. }
  29462. }
  29463. function _getElementId(element) {
  29464. var elId = dom_adapter_1.DOM.getData(element, NG_ID_PROPERTY);
  29465. if (lang_1.isPresent(elId)) {
  29466. return elId.split(NG_ID_SEPARATOR).map(function (partStr) { return lang_1.NumberWrapper.parseInt(partStr, 10); });
  29467. }
  29468. else {
  29469. return null;
  29470. }
  29471. }
  29472. /**
  29473. * Returns a {@link DebugElement} for the given native DOM element, or
  29474. * null if the given native element does not have an Angular view associated
  29475. * with it.
  29476. */
  29477. function inspectNativeElement(element) {
  29478. var elId = _getElementId(element);
  29479. if (lang_1.isPresent(elId)) {
  29480. var view = _allViewsById.get(elId[0]);
  29481. if (lang_1.isPresent(view)) {
  29482. return new debug_element_1.DebugElement_(view, elId[1]);
  29483. }
  29484. }
  29485. return null;
  29486. }
  29487. exports.inspectNativeElement = inspectNativeElement;
  29488. var DebugElementViewListener = (function () {
  29489. function DebugElementViewListener(_renderer) {
  29490. this._renderer = _renderer;
  29491. dom_adapter_1.DOM.setGlobalVar(INSPECT_GLOBAL_NAME, inspectNativeElement);
  29492. }
  29493. DebugElementViewListener.prototype.onViewCreated = function (view) {
  29494. var viewId = _nextId++;
  29495. _allViewsById.set(viewId, view);
  29496. _allIdsByView.set(view, viewId);
  29497. for (var i = 0; i < view.elementRefs.length; i++) {
  29498. var el = view.elementRefs[i];
  29499. _setElementId(this._renderer.getNativeElementSync(el), [viewId, i]);
  29500. }
  29501. };
  29502. DebugElementViewListener.prototype.onViewDestroyed = function (view) {
  29503. var viewId = _allIdsByView.get(view);
  29504. _allIdsByView.delete(view);
  29505. _allViewsById.delete(viewId);
  29506. };
  29507. DebugElementViewListener = __decorate([
  29508. di_1.Injectable(),
  29509. __metadata('design:paramtypes', [api_1.Renderer])
  29510. ], DebugElementViewListener);
  29511. return DebugElementViewListener;
  29512. })();
  29513. exports.DebugElementViewListener = DebugElementViewListener;
  29514. /**
  29515. * Providers which support debugging Angular applications (e.g. via `ng.probe`).
  29516. *
  29517. * ## Example
  29518. *
  29519. * {@example platform/dom/debug/ts/debug_element_view_listener/providers.ts region='providers'}
  29520. */
  29521. exports.ELEMENT_PROBE_PROVIDERS = lang_1.CONST_EXPR([
  29522. DebugElementViewListener,
  29523. lang_1.CONST_EXPR(new di_1.Provider(view_listener_1.AppViewListener, { useExisting: DebugElementViewListener })),
  29524. ]);
  29525. /**
  29526. * Use {@link ELEMENT_PROBE_PROVIDERS}.
  29527. *
  29528. * @deprecated
  29529. */
  29530. exports.ELEMENT_PROBE_BINDINGS = exports.ELEMENT_PROBE_PROVIDERS;
  29531. /***/ },
  29532. /* 206 */
  29533. /***/ function(module, exports, __webpack_require__) {
  29534. var lang_1 = __webpack_require__(5);
  29535. var common_tools_1 = __webpack_require__(207);
  29536. var context = lang_1.global;
  29537. /**
  29538. * Enabled Angular 2 debug tools that are accessible via your browser's
  29539. * developer console.
  29540. *
  29541. * Usage:
  29542. *
  29543. * 1. Open developer console (e.g. in Chrome Ctrl + Shift + j)
  29544. * 1. Type `ng.` (usually the console will show auto-complete suggestion)
  29545. * 1. Try the change detection profiler `ng.profiler.timeChangeDetection()`
  29546. * then hit Enter.
  29547. */
  29548. function enableDebugTools(ref) {
  29549. context.ng = new common_tools_1.AngularTools(ref);
  29550. }
  29551. exports.enableDebugTools = enableDebugTools;
  29552. /**
  29553. * Disables Angular 2 tools.
  29554. */
  29555. function disableDebugTools() {
  29556. delete context.ng;
  29557. }
  29558. exports.disableDebugTools = disableDebugTools;
  29559. /***/ },
  29560. /* 207 */
  29561. /***/ function(module, exports, __webpack_require__) {
  29562. var application_ref_1 = __webpack_require__(65);
  29563. var lang_1 = __webpack_require__(5);
  29564. var browser_1 = __webpack_require__(208);
  29565. var dom_adapter_1 = __webpack_require__(178);
  29566. /**
  29567. * Entry point for all Angular debug tools. This object corresponds to the `ng`
  29568. * global variable accessible in the dev console.
  29569. */
  29570. var AngularTools = (function () {
  29571. function AngularTools(ref) {
  29572. this.profiler = new AngularProfiler(ref);
  29573. }
  29574. return AngularTools;
  29575. })();
  29576. exports.AngularTools = AngularTools;
  29577. /**
  29578. * Entry point for all Angular profiling-related debug tools. This object
  29579. * corresponds to the `ng.profiler` in the dev console.
  29580. */
  29581. var AngularProfiler = (function () {
  29582. function AngularProfiler(ref) {
  29583. this.appRef = ref.injector.get(application_ref_1.ApplicationRef);
  29584. }
  29585. /**
  29586. * Exercises change detection in a loop and then prints the average amount of
  29587. * time in milliseconds how long a single round of change detection takes for
  29588. * the current state of the UI. It runs a minimum of 5 rounds for a minimum
  29589. * of 500 milliseconds.
  29590. *
  29591. * Optionally, a user may pass a `config` parameter containing a map of
  29592. * options. Supported options are:
  29593. *
  29594. * `record` (boolean) - causes the profiler to record a CPU profile while
  29595. * it exercises the change detector. Example:
  29596. *
  29597. * ```
  29598. * ng.profiler.timeChangeDetection({record: true})
  29599. * ```
  29600. */
  29601. AngularProfiler.prototype.timeChangeDetection = function (config) {
  29602. var record = lang_1.isPresent(config) && config['record'];
  29603. var profileName = 'Change Detection';
  29604. // Profiler is not available in Android browsers, nor in IE 9 without dev tools opened
  29605. var isProfilerAvailable = lang_1.isPresent(browser_1.window.console.profile);
  29606. if (record && isProfilerAvailable) {
  29607. browser_1.window.console.profile(profileName);
  29608. }
  29609. var start = dom_adapter_1.DOM.performanceNow();
  29610. var numTicks = 0;
  29611. while (numTicks < 5 || (dom_adapter_1.DOM.performanceNow() - start) < 500) {
  29612. this.appRef.tick();
  29613. numTicks++;
  29614. }
  29615. var end = dom_adapter_1.DOM.performanceNow();
  29616. if (record && isProfilerAvailable) {
  29617. // need to cast to <any> because type checker thinks there's no argument
  29618. // while in fact there is:
  29619. //
  29620. // https://developer.mozilla.org/en-US/docs/Web/API/Console/profileEnd
  29621. browser_1.window.console.profileEnd(profileName);
  29622. }
  29623. var msPerTick = (end - start) / numTicks;
  29624. browser_1.window.console.log("ran " + numTicks + " change detection cycles");
  29625. browser_1.window.console.log(lang_1.NumberWrapper.toFixed(msPerTick, 2) + " ms per check");
  29626. };
  29627. return AngularProfiler;
  29628. })();
  29629. exports.AngularProfiler = AngularProfiler;
  29630. /***/ },
  29631. /* 208 */
  29632. /***/ function(module, exports) {
  29633. /**
  29634. * JS version of browser APIs. This library can only run in the browser.
  29635. */
  29636. var win = window;
  29637. exports.window = win;
  29638. exports.document = window.document;
  29639. exports.location = window.location;
  29640. exports.gc = window['gc'] ? function () { return window['gc'](); } : function () { return null; };
  29641. exports.performance = window['performance'] ? window['performance'] : null;
  29642. exports.Event = window['Event'];
  29643. exports.MouseEvent = window['MouseEvent'];
  29644. exports.KeyboardEvent = window['KeyboardEvent'];
  29645. exports.EventTarget = window['EventTarget'];
  29646. exports.History = window['History'];
  29647. exports.Location = window['Location'];
  29648. exports.EventListener = window['EventListener'];
  29649. /***/ },
  29650. /* 209 */
  29651. /***/ function(module, exports, __webpack_require__) {
  29652. /**
  29653. * @module
  29654. * @description
  29655. * The http module provides services to perform http requests. To get started, see the {@link Http}
  29656. * class.
  29657. */
  29658. var core_1 = __webpack_require__(2);
  29659. var http_1 = __webpack_require__(210);
  29660. var xhr_backend_1 = __webpack_require__(218);
  29661. var jsonp_backend_1 = __webpack_require__(222);
  29662. var browser_xhr_1 = __webpack_require__(221);
  29663. var browser_jsonp_1 = __webpack_require__(223);
  29664. var base_request_options_1 = __webpack_require__(216);
  29665. var base_response_options_1 = __webpack_require__(220);
  29666. var static_request_1 = __webpack_require__(212);
  29667. exports.Request = static_request_1.Request;
  29668. var static_response_1 = __webpack_require__(219);
  29669. exports.Response = static_response_1.Response;
  29670. var interfaces_1 = __webpack_require__(211);
  29671. exports.Connection = interfaces_1.Connection;
  29672. exports.ConnectionBackend = interfaces_1.ConnectionBackend;
  29673. var browser_xhr_2 = __webpack_require__(221);
  29674. exports.BrowserXhr = browser_xhr_2.BrowserXhr;
  29675. var base_request_options_2 = __webpack_require__(216);
  29676. exports.BaseRequestOptions = base_request_options_2.BaseRequestOptions;
  29677. exports.RequestOptions = base_request_options_2.RequestOptions;
  29678. var base_response_options_2 = __webpack_require__(220);
  29679. exports.BaseResponseOptions = base_response_options_2.BaseResponseOptions;
  29680. exports.ResponseOptions = base_response_options_2.ResponseOptions;
  29681. var xhr_backend_2 = __webpack_require__(218);
  29682. exports.XHRBackend = xhr_backend_2.XHRBackend;
  29683. exports.XHRConnection = xhr_backend_2.XHRConnection;
  29684. var jsonp_backend_2 = __webpack_require__(222);
  29685. exports.JSONPBackend = jsonp_backend_2.JSONPBackend;
  29686. exports.JSONPConnection = jsonp_backend_2.JSONPConnection;
  29687. var http_2 = __webpack_require__(210);
  29688. exports.Http = http_2.Http;
  29689. exports.Jsonp = http_2.Jsonp;
  29690. var headers_1 = __webpack_require__(213);
  29691. exports.Headers = headers_1.Headers;
  29692. var enums_1 = __webpack_require__(215);
  29693. exports.ResponseType = enums_1.ResponseType;
  29694. exports.ReadyState = enums_1.ReadyState;
  29695. exports.RequestMethod = enums_1.RequestMethod;
  29696. var url_search_params_1 = __webpack_require__(217);
  29697. exports.URLSearchParams = url_search_params_1.URLSearchParams;
  29698. /**
  29699. * Provides a basic set of injectables to use the {@link Http} service in any application.
  29700. *
  29701. * The `HTTP_PROVIDERS` should be included either in a component's injector,
  29702. * or in the root injector when bootstrapping an application.
  29703. *
  29704. * ### Example ([live demo](http://plnkr.co/edit/snj7Nv?p=preview))
  29705. *
  29706. * ```
  29707. * import {Component} from 'angular2/core';
  29708. * import {bootstrap} from 'angular2/platform/browser';
  29709. * import {NgFor} from 'angular2/common';
  29710. * import {HTTP_PROVIDERS, Http} from 'angular2/http';
  29711. *
  29712. * @Component({
  29713. * selector: 'app',
  29714. * providers: [HTTP_PROVIDERS],
  29715. * template: `
  29716. * <div>
  29717. * <h1>People</h1>
  29718. * <ul>
  29719. * <li *ngFor="#person of people">
  29720. * {{person.name}}
  29721. * </li>
  29722. * </ul>
  29723. * </div>
  29724. * `,
  29725. * directives: [NgFor]
  29726. * })
  29727. * export class App {
  29728. * people: Object[];
  29729. * constructor(http:Http) {
  29730. * http.get('people.json').subscribe(res => {
  29731. * this.people = res.json();
  29732. * });
  29733. * }
  29734. * active:boolean = false;
  29735. * toggleActiveState() {
  29736. * this.active = !this.active;
  29737. * }
  29738. * }
  29739. *
  29740. * bootstrap(App)
  29741. * .catch(err => console.error(err));
  29742. * ```
  29743. *
  29744. * The primary public API included in `HTTP_PROVIDERS` is the {@link Http} class.
  29745. * However, other providers required by `Http` are included,
  29746. * which may be beneficial to override in certain cases.
  29747. *
  29748. * The providers included in `HTTP_PROVIDERS` include:
  29749. * * {@link Http}
  29750. * * {@link XHRBackend}
  29751. * * `BrowserXHR` - Private factory to create `XMLHttpRequest` instances
  29752. * * {@link RequestOptions} - Bound to {@link BaseRequestOptions} class
  29753. * * {@link ResponseOptions} - Bound to {@link BaseResponseOptions} class
  29754. *
  29755. * There may be cases where it makes sense to extend the base request options,
  29756. * such as to add a search string to be appended to all URLs.
  29757. * To accomplish this, a new provider for {@link RequestOptions} should
  29758. * be added in the same injector as `HTTP_PROVIDERS`.
  29759. *
  29760. * ### Example ([live demo](http://plnkr.co/edit/aCMEXi?p=preview))
  29761. *
  29762. * ```
  29763. * import {provide} from 'angular2/core';
  29764. * import {bootstrap} from 'angular2/platform/browser';
  29765. * import {HTTP_PROVIDERS, BaseRequestOptions, RequestOptions} from 'angular2/http';
  29766. *
  29767. * class MyOptions extends BaseRequestOptions {
  29768. * search: string = 'coreTeam=true';
  29769. * }
  29770. *
  29771. * bootstrap(App, [HTTP_PROVIDERS, provide(RequestOptions, {useClass: MyOptions})])
  29772. * .catch(err => console.error(err));
  29773. * ```
  29774. *
  29775. * Likewise, to use a mock backend for unit tests, the {@link XHRBackend}
  29776. * provider should be bound to {@link MockBackend}.
  29777. *
  29778. * ### Example ([live demo](http://plnkr.co/edit/7LWALD?p=preview))
  29779. *
  29780. * ```
  29781. * import {provide} from 'angular2/core';
  29782. * import {bootstrap} from 'angular2/platform/browser';
  29783. * import {HTTP_PROVIDERS, Http, Response, XHRBackend} from 'angular2/http';
  29784. * import {MockBackend} from 'angular2/http/testing';
  29785. *
  29786. * var people = [{name: 'Jeff'}, {name: 'Tobias'}];
  29787. *
  29788. * var injector = Injector.resolveAndCreate([
  29789. * HTTP_PROVIDERS,
  29790. * MockBackend,
  29791. * provide(XHRBackend, {useExisting: MockBackend})
  29792. * ]);
  29793. * var http = injector.get(Http);
  29794. * var backend = injector.get(MockBackend);
  29795. *
  29796. * // Listen for any new requests
  29797. * backend.connections.observer({
  29798. * next: connection => {
  29799. * var response = new Response({body: people});
  29800. * setTimeout(() => {
  29801. * // Send a response to the request
  29802. * connection.mockRespond(response);
  29803. * });
  29804. * });
  29805. *
  29806. * http.get('people.json').observer({
  29807. * next: res => {
  29808. * // Response came from mock backend
  29809. * console.log('first person', res.json()[0].name);
  29810. * }
  29811. * });
  29812. * ```
  29813. */
  29814. exports.HTTP_PROVIDERS = [
  29815. // TODO(pascal): use factory type annotations once supported in DI
  29816. // issue: https://github.com/angular/angular/issues/3183
  29817. core_1.provide(http_1.Http, {
  29818. useFactory: function (xhrBackend, requestOptions) { return new http_1.Http(xhrBackend, requestOptions); },
  29819. deps: [xhr_backend_1.XHRBackend, base_request_options_1.RequestOptions]
  29820. }),
  29821. browser_xhr_1.BrowserXhr,
  29822. core_1.provide(base_request_options_1.RequestOptions, { useClass: base_request_options_1.BaseRequestOptions }),
  29823. core_1.provide(base_response_options_1.ResponseOptions, { useClass: base_response_options_1.BaseResponseOptions }),
  29824. xhr_backend_1.XHRBackend
  29825. ];
  29826. /**
  29827. * See {@link HTTP_PROVIDERS} instead.
  29828. *
  29829. * @deprecated
  29830. */
  29831. exports.HTTP_BINDINGS = exports.HTTP_PROVIDERS;
  29832. /**
  29833. * Provides a basic set of providers to use the {@link Jsonp} service in any application.
  29834. *
  29835. * The `JSONP_PROVIDERS` should be included either in a component's injector,
  29836. * or in the root injector when bootstrapping an application.
  29837. *
  29838. * ### Example ([live demo](http://plnkr.co/edit/vmeN4F?p=preview))
  29839. *
  29840. * ```
  29841. * import {Component} from 'angular2/core';
  29842. * import {NgFor} from 'angular2/common';
  29843. * import {JSONP_PROVIDERS, Jsonp} from 'angular2/http';
  29844. *
  29845. * @Component({
  29846. * selector: 'app',
  29847. * providers: [JSONP_PROVIDERS],
  29848. * template: `
  29849. * <div>
  29850. * <h1>People</h1>
  29851. * <ul>
  29852. * <li *ngFor="#person of people">
  29853. * {{person.name}}
  29854. * </li>
  29855. * </ul>
  29856. * </div>
  29857. * `,
  29858. * directives: [NgFor]
  29859. * })
  29860. * export class App {
  29861. * people: Array<Object>;
  29862. * constructor(jsonp:Jsonp) {
  29863. * jsonp.request('people.json').subscribe(res => {
  29864. * this.people = res.json();
  29865. * })
  29866. * }
  29867. * }
  29868. * ```
  29869. *
  29870. * The primary public API included in `JSONP_PROVIDERS` is the {@link Jsonp} class.
  29871. * However, other providers required by `Jsonp` are included,
  29872. * which may be beneficial to override in certain cases.
  29873. *
  29874. * The providers included in `JSONP_PROVIDERS` include:
  29875. * * {@link Jsonp}
  29876. * * {@link JSONPBackend}
  29877. * * `BrowserJsonp` - Private factory
  29878. * * {@link RequestOptions} - Bound to {@link BaseRequestOptions} class
  29879. * * {@link ResponseOptions} - Bound to {@link BaseResponseOptions} class
  29880. *
  29881. * There may be cases where it makes sense to extend the base request options,
  29882. * such as to add a search string to be appended to all URLs.
  29883. * To accomplish this, a new provider for {@link RequestOptions} should
  29884. * be added in the same injector as `JSONP_PROVIDERS`.
  29885. *
  29886. * ### Example ([live demo](http://plnkr.co/edit/TFug7x?p=preview))
  29887. *
  29888. * ```
  29889. * import {provide} from 'angular2/core';
  29890. * import {bootstrap} from 'angular2/platform/browser';
  29891. * import {JSONP_PROVIDERS, BaseRequestOptions, RequestOptions} from 'angular2/http';
  29892. *
  29893. * class MyOptions extends BaseRequestOptions {
  29894. * search: string = 'coreTeam=true';
  29895. * }
  29896. *
  29897. * bootstrap(App, [JSONP_PROVIDERS, provide(RequestOptions, {useClass: MyOptions})])
  29898. * .catch(err => console.error(err));
  29899. * ```
  29900. *
  29901. * Likewise, to use a mock backend for unit tests, the {@link JSONPBackend}
  29902. * provider should be bound to {@link MockBackend}.
  29903. *
  29904. * ### Example ([live demo](http://plnkr.co/edit/HDqZWL?p=preview))
  29905. *
  29906. * ```
  29907. * import {provide, Injector} from 'angular2/core';
  29908. * import {JSONP_PROVIDERS, Jsonp, Response, JSONPBackend} from 'angular2/http';
  29909. * import {MockBackend} from 'angular2/http/testing';
  29910. *
  29911. * var people = [{name: 'Jeff'}, {name: 'Tobias'}];
  29912. * var injector = Injector.resolveAndCreate([
  29913. * JSONP_PROVIDERS,
  29914. * MockBackend,
  29915. * provide(JSONPBackend, {useExisting: MockBackend})
  29916. * ]);
  29917. * var jsonp = injector.get(Jsonp);
  29918. * var backend = injector.get(MockBackend);
  29919. *
  29920. * // Listen for any new requests
  29921. * backend.connections.observer({
  29922. * next: connection => {
  29923. * var response = new Response({body: people});
  29924. * setTimeout(() => {
  29925. * // Send a response to the request
  29926. * connection.mockRespond(response);
  29927. * });
  29928. * });
  29929. * jsonp.get('people.json').observer({
  29930. * next: res => {
  29931. * // Response came from mock backend
  29932. * console.log('first person', res.json()[0].name);
  29933. * }
  29934. * });
  29935. * ```
  29936. */
  29937. exports.JSONP_PROVIDERS = [
  29938. // TODO(pascal): use factory type annotations once supported in DI
  29939. // issue: https://github.com/angular/angular/issues/3183
  29940. core_1.provide(http_1.Jsonp, {
  29941. useFactory: function (jsonpBackend, requestOptions) { return new http_1.Jsonp(jsonpBackend, requestOptions); },
  29942. deps: [jsonp_backend_1.JSONPBackend, base_request_options_1.RequestOptions]
  29943. }),
  29944. browser_jsonp_1.BrowserJsonp,
  29945. core_1.provide(base_request_options_1.RequestOptions, { useClass: base_request_options_1.BaseRequestOptions }),
  29946. core_1.provide(base_response_options_1.ResponseOptions, { useClass: base_response_options_1.BaseResponseOptions }),
  29947. core_1.provide(jsonp_backend_1.JSONPBackend, { useClass: jsonp_backend_1.JSONPBackend_ })
  29948. ];
  29949. /**
  29950. * See {@link JSONP_PROVIDERS} instead.
  29951. *
  29952. * @deprecated
  29953. */
  29954. exports.JSON_BINDINGS = exports.JSONP_PROVIDERS;
  29955. /***/ },
  29956. /* 210 */
  29957. /***/ function(module, exports, __webpack_require__) {
  29958. var __extends = (this && this.__extends) || function (d, b) {
  29959. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  29960. function __() { this.constructor = d; }
  29961. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  29962. };
  29963. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  29964. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  29965. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  29966. 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;
  29967. return c > 3 && r && Object.defineProperty(target, key, r), r;
  29968. };
  29969. var __metadata = (this && this.__metadata) || function (k, v) {
  29970. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  29971. };
  29972. var lang_1 = __webpack_require__(5);
  29973. var exceptions_1 = __webpack_require__(14);
  29974. var core_1 = __webpack_require__(2);
  29975. var interfaces_1 = __webpack_require__(211);
  29976. var static_request_1 = __webpack_require__(212);
  29977. var base_request_options_1 = __webpack_require__(216);
  29978. var enums_1 = __webpack_require__(215);
  29979. function httpRequest(backend, request) {
  29980. return backend.createConnection(request).response;
  29981. }
  29982. function mergeOptions(defaultOpts, providedOpts, method, url) {
  29983. var newOptions = defaultOpts;
  29984. if (lang_1.isPresent(providedOpts)) {
  29985. // Hack so Dart can used named parameters
  29986. return newOptions.merge(new base_request_options_1.RequestOptions({
  29987. method: providedOpts.method || method,
  29988. url: providedOpts.url || url,
  29989. search: providedOpts.search,
  29990. headers: providedOpts.headers,
  29991. body: providedOpts.body
  29992. }));
  29993. }
  29994. if (lang_1.isPresent(method)) {
  29995. return newOptions.merge(new base_request_options_1.RequestOptions({ method: method, url: url }));
  29996. }
  29997. else {
  29998. return newOptions.merge(new base_request_options_1.RequestOptions({ url: url }));
  29999. }
  30000. }
  30001. /**
  30002. * Performs http requests using `XMLHttpRequest` as the default backend.
  30003. *
  30004. * `Http` is available as an injectable class, with methods to perform http requests. Calling
  30005. * `request` returns an `Observable` which will emit a single {@link Response} when a
  30006. * response is received.
  30007. *
  30008. * ### Example
  30009. *
  30010. * ```typescript
  30011. * import {Http, HTTP_PROVIDERS} from 'angular2/http';
  30012. * @Component({
  30013. * selector: 'http-app',
  30014. * viewProviders: [HTTP_PROVIDERS],
  30015. * templateUrl: 'people.html'
  30016. * })
  30017. * class PeopleComponent {
  30018. * constructor(http: Http) {
  30019. * http.get('people.json')
  30020. * // Call map on the response observable to get the parsed people object
  30021. * .map(res => res.json())
  30022. * // Subscribe to the observable to get the parsed people object and attach it to the
  30023. * // component
  30024. * .subscribe(people => this.people = people);
  30025. * }
  30026. * }
  30027. * ```
  30028. *
  30029. *
  30030. * ### Example
  30031. *
  30032. * ```
  30033. * http.get('people.json').observer({next: (value) => this.people = value});
  30034. * ```
  30035. *
  30036. * The default construct used to perform requests, `XMLHttpRequest`, is abstracted as a "Backend" (
  30037. * {@link XHRBackend} in this case), which could be mocked with dependency injection by replacing
  30038. * the {@link XHRBackend} provider, as in the following example:
  30039. *
  30040. * ### Example
  30041. *
  30042. * ```typescript
  30043. * import {BaseRequestOptions, Http} from 'angular2/http';
  30044. * import {MockBackend} from 'angular2/http/testing';
  30045. * var injector = Injector.resolveAndCreate([
  30046. * BaseRequestOptions,
  30047. * MockBackend,
  30048. * provide(Http, {useFactory:
  30049. * function(backend, defaultOptions) {
  30050. * return new Http(backend, defaultOptions);
  30051. * },
  30052. * deps: [MockBackend, BaseRequestOptions]})
  30053. * ]);
  30054. * var http = injector.get(Http);
  30055. * http.get('request-from-mock-backend.json').subscribe((res:Response) => doSomething(res));
  30056. * ```
  30057. *
  30058. **/
  30059. var Http = (function () {
  30060. function Http(_backend, _defaultOptions) {
  30061. this._backend = _backend;
  30062. this._defaultOptions = _defaultOptions;
  30063. }
  30064. /**
  30065. * Performs any type of http request. First argument is required, and can either be a url or
  30066. * a {@link Request} instance. If the first argument is a url, an optional {@link RequestOptions}
  30067. * object can be provided as the 2nd argument. The options object will be merged with the values
  30068. * of {@link BaseRequestOptions} before performing the request.
  30069. */
  30070. Http.prototype.request = function (url, options) {
  30071. var responseObservable;
  30072. if (lang_1.isString(url)) {
  30073. responseObservable = httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url)));
  30074. }
  30075. else if (url instanceof static_request_1.Request) {
  30076. responseObservable = httpRequest(this._backend, url);
  30077. }
  30078. else {
  30079. throw exceptions_1.makeTypeError('First argument must be a url string or Request instance.');
  30080. }
  30081. return responseObservable;
  30082. };
  30083. /**
  30084. * Performs a request with `get` http method.
  30085. */
  30086. Http.prototype.get = function (url, options) {
  30087. return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url)));
  30088. };
  30089. /**
  30090. * Performs a request with `post` http method.
  30091. */
  30092. Http.prototype.post = 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.Post, url)));
  30094. };
  30095. /**
  30096. * Performs a request with `put` http method.
  30097. */
  30098. Http.prototype.put = function (url, body, options) {
  30099. 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)));
  30100. };
  30101. /**
  30102. * Performs a request with `delete` http method.
  30103. */
  30104. Http.prototype.delete = function (url, options) {
  30105. return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Delete, url)));
  30106. };
  30107. /**
  30108. * Performs a request with `patch` http method.
  30109. */
  30110. Http.prototype.patch = function (url, body, options) {
  30111. 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)));
  30112. };
  30113. /**
  30114. * Performs a request with `head` http method.
  30115. */
  30116. Http.prototype.head = function (url, options) {
  30117. return httpRequest(this._backend, new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Head, url)));
  30118. };
  30119. Http = __decorate([
  30120. core_1.Injectable(),
  30121. __metadata('design:paramtypes', [interfaces_1.ConnectionBackend, base_request_options_1.RequestOptions])
  30122. ], Http);
  30123. return Http;
  30124. })();
  30125. exports.Http = Http;
  30126. var Jsonp = (function (_super) {
  30127. __extends(Jsonp, _super);
  30128. function Jsonp(backend, defaultOptions) {
  30129. _super.call(this, backend, defaultOptions);
  30130. }
  30131. /**
  30132. * Performs any type of http request. First argument is required, and can either be a url or
  30133. * a {@link Request} instance. If the first argument is a url, an optional {@link RequestOptions}
  30134. * object can be provided as the 2nd argument. The options object will be merged with the values
  30135. * of {@link BaseRequestOptions} before performing the request.
  30136. */
  30137. Jsonp.prototype.request = function (url, options) {
  30138. var responseObservable;
  30139. if (lang_1.isString(url)) {
  30140. url = new static_request_1.Request(mergeOptions(this._defaultOptions, options, enums_1.RequestMethod.Get, url));
  30141. }
  30142. if (url instanceof static_request_1.Request) {
  30143. if (url.method !== enums_1.RequestMethod.Get) {
  30144. exceptions_1.makeTypeError('JSONP requests must use GET request method.');
  30145. }
  30146. responseObservable = httpRequest(this._backend, url);
  30147. }
  30148. else {
  30149. throw exceptions_1.makeTypeError('First argument must be a url string or Request instance.');
  30150. }
  30151. return responseObservable;
  30152. };
  30153. Jsonp = __decorate([
  30154. core_1.Injectable(),
  30155. __metadata('design:paramtypes', [interfaces_1.ConnectionBackend, base_request_options_1.RequestOptions])
  30156. ], Jsonp);
  30157. return Jsonp;
  30158. })(Http);
  30159. exports.Jsonp = Jsonp;
  30160. /***/ },
  30161. /* 211 */
  30162. /***/ function(module, exports) {
  30163. /**
  30164. * Abstract class from which real backends are derived.
  30165. *
  30166. * The primary purpose of a `ConnectionBackend` is to create new connections to fulfill a given
  30167. * {@link Request}.
  30168. */
  30169. var ConnectionBackend = (function () {
  30170. function ConnectionBackend() {
  30171. }
  30172. return ConnectionBackend;
  30173. })();
  30174. exports.ConnectionBackend = ConnectionBackend;
  30175. /**
  30176. * Abstract class from which real connections are derived.
  30177. */
  30178. var Connection = (function () {
  30179. function Connection() {
  30180. }
  30181. return Connection;
  30182. })();
  30183. exports.Connection = Connection;
  30184. /***/ },
  30185. /* 212 */
  30186. /***/ function(module, exports, __webpack_require__) {
  30187. var headers_1 = __webpack_require__(213);
  30188. var http_utils_1 = __webpack_require__(214);
  30189. var lang_1 = __webpack_require__(5);
  30190. // TODO(jeffbcross): properly implement body accessors
  30191. /**
  30192. * Creates `Request` instances from provided values.
  30193. *
  30194. * The Request's interface is inspired by the Request constructor defined in the [Fetch
  30195. * Spec](https://fetch.spec.whatwg.org/#request-class),
  30196. * but is considered a static value whose body can be accessed many times. There are other
  30197. * differences in the implementation, but this is the most significant.
  30198. *
  30199. * `Request` instances are typically created by higher-level classes, like {@link Http} and
  30200. * {@link Jsonp}, but it may occasionally be useful to explicitly create `Request` instances.
  30201. * One such example is when creating services that wrap higher-level services, like {@link Http},
  30202. * where it may be useful to generate a `Request` with arbitrary headers and search params.
  30203. *
  30204. * ```typescript
  30205. * import {Injectable, Injector} from 'angular2/core';
  30206. * import {HTTP_PROVIDERS, Http, Request, RequestMethod} from 'angular2/http';
  30207. *
  30208. * @Injectable()
  30209. * class AutoAuthenticator {
  30210. * constructor(public http:Http) {}
  30211. * request(url:string) {
  30212. * return this.http.request(new Request({
  30213. * method: RequestMethod.Get,
  30214. * url: url,
  30215. * search: 'password=123'
  30216. * }));
  30217. * }
  30218. * }
  30219. *
  30220. * var injector = Injector.resolveAndCreate([HTTP_PROVIDERS, AutoAuthenticator]);
  30221. * var authenticator = injector.get(AutoAuthenticator);
  30222. * authenticator.request('people.json').subscribe(res => {
  30223. * //URL should have included '?password=123'
  30224. * console.log('people', res.json());
  30225. * });
  30226. * ```
  30227. */
  30228. var Request = (function () {
  30229. function Request(requestOptions) {
  30230. // TODO: assert that url is present
  30231. var url = requestOptions.url;
  30232. this.url = requestOptions.url;
  30233. if (lang_1.isPresent(requestOptions.search)) {
  30234. var search = requestOptions.search.toString();
  30235. if (search.length > 0) {
  30236. var prefix = '?';
  30237. if (lang_1.StringWrapper.contains(this.url, '?')) {
  30238. prefix = (this.url[this.url.length - 1] == '&') ? '' : '&';
  30239. }
  30240. // TODO: just delete search-query-looking string in url?
  30241. this.url = url + prefix + search;
  30242. }
  30243. }
  30244. this._body = requestOptions.body;
  30245. this.method = http_utils_1.normalizeMethodName(requestOptions.method);
  30246. // TODO(jeffbcross): implement behavior
  30247. // Defaults to 'omit', consistent with browser
  30248. // TODO(jeffbcross): implement behavior
  30249. this.headers = new headers_1.Headers(requestOptions.headers);
  30250. }
  30251. /**
  30252. * Returns the request's body as string, assuming that body exists. If body is undefined, return
  30253. * empty
  30254. * string.
  30255. */
  30256. Request.prototype.text = function () { return lang_1.isPresent(this._body) ? this._body.toString() : ''; };
  30257. return Request;
  30258. })();
  30259. exports.Request = Request;
  30260. /***/ },
  30261. /* 213 */
  30262. /***/ function(module, exports, __webpack_require__) {
  30263. var lang_1 = __webpack_require__(5);
  30264. var exceptions_1 = __webpack_require__(14);
  30265. var collection_1 = __webpack_require__(12);
  30266. /**
  30267. * Polyfill for [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers/Headers), as
  30268. * specified in the [Fetch Spec](https://fetch.spec.whatwg.org/#headers-class).
  30269. *
  30270. * The only known difference between this `Headers` implementation and the spec is the
  30271. * lack of an `entries` method.
  30272. *
  30273. * ### Example ([live demo](http://plnkr.co/edit/MTdwT6?p=preview))
  30274. *
  30275. * ```
  30276. * import {Headers} from 'angular2/http';
  30277. *
  30278. * var firstHeaders = new Headers();
  30279. * firstHeaders.append('Content-Type', 'image/jpeg');
  30280. * console.log(firstHeaders.get('Content-Type')) //'image/jpeg'
  30281. *
  30282. * // Create headers from Plain Old JavaScript Object
  30283. * var secondHeaders = new Headers({
  30284. * 'X-My-Custom-Header': 'Angular'
  30285. * });
  30286. * console.log(secondHeaders.get('X-My-Custom-Header')); //'Angular'
  30287. *
  30288. * var thirdHeaders = new Headers(secondHeaders);
  30289. * console.log(thirdHeaders.get('X-My-Custom-Header')); //'Angular'
  30290. * ```
  30291. */
  30292. var Headers = (function () {
  30293. function Headers(headers) {
  30294. var _this = this;
  30295. if (headers instanceof Headers) {
  30296. this._headersMap = headers._headersMap;
  30297. return;
  30298. }
  30299. this._headersMap = new collection_1.Map();
  30300. if (lang_1.isBlank(headers)) {
  30301. return;
  30302. }
  30303. // headers instanceof StringMap
  30304. collection_1.StringMapWrapper.forEach(headers, function (v, k) { _this._headersMap.set(k, collection_1.isListLikeIterable(v) ? v : [v]); });
  30305. }
  30306. /**
  30307. * Returns a new Headers instance from the given DOMString of Response Headers
  30308. */
  30309. Headers.fromResponseHeaderString = function (headersString) {
  30310. return headersString.trim()
  30311. .split('\n')
  30312. .map(function (val) { return val.split(':'); })
  30313. .map(function (_a) {
  30314. var key = _a[0], parts = _a.slice(1);
  30315. return ([key.trim(), parts.join(':').trim()]);
  30316. })
  30317. .reduce(function (headers, _a) {
  30318. var key = _a[0], value = _a[1];
  30319. return !headers.set(key, value) && headers;
  30320. }, new Headers());
  30321. };
  30322. /**
  30323. * Appends a header to existing list of header values for a given header name.
  30324. */
  30325. Headers.prototype.append = function (name, value) {
  30326. var mapName = this._headersMap.get(name);
  30327. var list = collection_1.isListLikeIterable(mapName) ? mapName : [];
  30328. list.push(value);
  30329. this._headersMap.set(name, list);
  30330. };
  30331. /**
  30332. * Deletes all header values for the given name.
  30333. */
  30334. Headers.prototype.delete = function (name) { this._headersMap.delete(name); };
  30335. Headers.prototype.forEach = function (fn) {
  30336. this._headersMap.forEach(fn);
  30337. };
  30338. /**
  30339. * Returns first header that matches given name.
  30340. */
  30341. Headers.prototype.get = function (header) { return collection_1.ListWrapper.first(this._headersMap.get(header)); };
  30342. /**
  30343. * Check for existence of header by given name.
  30344. */
  30345. Headers.prototype.has = function (header) { return this._headersMap.has(header); };
  30346. /**
  30347. * Provides names of set headers
  30348. */
  30349. Headers.prototype.keys = function () { return collection_1.MapWrapper.keys(this._headersMap); };
  30350. /**
  30351. * Sets or overrides header value for given name.
  30352. */
  30353. Headers.prototype.set = function (header, value) {
  30354. var list = [];
  30355. if (collection_1.isListLikeIterable(value)) {
  30356. var pushValue = value.join(',');
  30357. list.push(pushValue);
  30358. }
  30359. else {
  30360. list.push(value);
  30361. }
  30362. this._headersMap.set(header, list);
  30363. };
  30364. /**
  30365. * Returns values of all headers.
  30366. */
  30367. Headers.prototype.values = function () { return collection_1.MapWrapper.values(this._headersMap); };
  30368. /**
  30369. * Returns string of all headers.
  30370. */
  30371. Headers.prototype.toJSON = function () { return lang_1.Json.stringify(this.values()); };
  30372. /**
  30373. * Returns list of header values for a given name.
  30374. */
  30375. Headers.prototype.getAll = function (header) {
  30376. var headers = this._headersMap.get(header);
  30377. return collection_1.isListLikeIterable(headers) ? headers : [];
  30378. };
  30379. /**
  30380. * This method is not implemented.
  30381. */
  30382. Headers.prototype.entries = function () { throw new exceptions_1.BaseException('"entries" method is not implemented on Headers class'); };
  30383. return Headers;
  30384. })();
  30385. exports.Headers = Headers;
  30386. /***/ },
  30387. /* 214 */
  30388. /***/ function(module, exports, __webpack_require__) {
  30389. var lang_1 = __webpack_require__(5);
  30390. var enums_1 = __webpack_require__(215);
  30391. var exceptions_1 = __webpack_require__(14);
  30392. function normalizeMethodName(method) {
  30393. if (lang_1.isString(method)) {
  30394. var originalMethod = method;
  30395. method = method.replace(/(\w)(\w*)/g, function (g0, g1, g2) { return g1.toUpperCase() + g2.toLowerCase(); });
  30396. method = enums_1.RequestMethod[method];
  30397. if (typeof method !== 'number')
  30398. throw exceptions_1.makeTypeError("Invalid request method. The method \"" + originalMethod + "\" is not supported.");
  30399. }
  30400. return method;
  30401. }
  30402. exports.normalizeMethodName = normalizeMethodName;
  30403. exports.isSuccess = function (status) { return (status >= 200 && status < 300); };
  30404. function getResponseURL(xhr) {
  30405. if ('responseURL' in xhr) {
  30406. return xhr.responseURL;
  30407. }
  30408. if (/^X-Request-URL:/m.test(xhr.getAllResponseHeaders())) {
  30409. return xhr.getResponseHeader('X-Request-URL');
  30410. }
  30411. return;
  30412. }
  30413. exports.getResponseURL = getResponseURL;
  30414. var lang_2 = __webpack_require__(5);
  30415. exports.isJsObject = lang_2.isJsObject;
  30416. /***/ },
  30417. /* 215 */
  30418. /***/ function(module, exports) {
  30419. /**
  30420. * Supported http methods.
  30421. */
  30422. (function (RequestMethod) {
  30423. RequestMethod[RequestMethod["Get"] = 0] = "Get";
  30424. RequestMethod[RequestMethod["Post"] = 1] = "Post";
  30425. RequestMethod[RequestMethod["Put"] = 2] = "Put";
  30426. RequestMethod[RequestMethod["Delete"] = 3] = "Delete";
  30427. RequestMethod[RequestMethod["Options"] = 4] = "Options";
  30428. RequestMethod[RequestMethod["Head"] = 5] = "Head";
  30429. RequestMethod[RequestMethod["Patch"] = 6] = "Patch";
  30430. })(exports.RequestMethod || (exports.RequestMethod = {}));
  30431. var RequestMethod = exports.RequestMethod;
  30432. /**
  30433. * All possible states in which a connection can be, based on
  30434. * [States](http://www.w3.org/TR/XMLHttpRequest/#states) from the `XMLHttpRequest` spec, but with an
  30435. * additional "CANCELLED" state.
  30436. */
  30437. (function (ReadyState) {
  30438. ReadyState[ReadyState["Unsent"] = 0] = "Unsent";
  30439. ReadyState[ReadyState["Open"] = 1] = "Open";
  30440. ReadyState[ReadyState["HeadersReceived"] = 2] = "HeadersReceived";
  30441. ReadyState[ReadyState["Loading"] = 3] = "Loading";
  30442. ReadyState[ReadyState["Done"] = 4] = "Done";
  30443. ReadyState[ReadyState["Cancelled"] = 5] = "Cancelled";
  30444. })(exports.ReadyState || (exports.ReadyState = {}));
  30445. var ReadyState = exports.ReadyState;
  30446. /**
  30447. * Acceptable response types to be associated with a {@link Response}, based on
  30448. * [ResponseType](https://fetch.spec.whatwg.org/#responsetype) from the Fetch spec.
  30449. */
  30450. (function (ResponseType) {
  30451. ResponseType[ResponseType["Basic"] = 0] = "Basic";
  30452. ResponseType[ResponseType["Cors"] = 1] = "Cors";
  30453. ResponseType[ResponseType["Default"] = 2] = "Default";
  30454. ResponseType[ResponseType["Error"] = 3] = "Error";
  30455. ResponseType[ResponseType["Opaque"] = 4] = "Opaque";
  30456. })(exports.ResponseType || (exports.ResponseType = {}));
  30457. var ResponseType = exports.ResponseType;
  30458. /***/ },
  30459. /* 216 */
  30460. /***/ function(module, exports, __webpack_require__) {
  30461. var __extends = (this && this.__extends) || function (d, b) {
  30462. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  30463. function __() { this.constructor = d; }
  30464. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  30465. };
  30466. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  30467. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  30468. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  30469. 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;
  30470. return c > 3 && r && Object.defineProperty(target, key, r), r;
  30471. };
  30472. var __metadata = (this && this.__metadata) || function (k, v) {
  30473. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  30474. };
  30475. var lang_1 = __webpack_require__(5);
  30476. var headers_1 = __webpack_require__(213);
  30477. var enums_1 = __webpack_require__(215);
  30478. var core_1 = __webpack_require__(2);
  30479. var url_search_params_1 = __webpack_require__(217);
  30480. var http_utils_1 = __webpack_require__(214);
  30481. /**
  30482. * Creates a request options object to be optionally provided when instantiating a
  30483. * {@link Request}.
  30484. *
  30485. * This class is based on the `RequestInit` description in the [Fetch
  30486. * Spec](https://fetch.spec.whatwg.org/#requestinit).
  30487. *
  30488. * All values are null by default. Typical defaults can be found in the {@link BaseRequestOptions}
  30489. * class, which sub-classes `RequestOptions`.
  30490. *
  30491. * ### Example ([live demo](http://plnkr.co/edit/7Wvi3lfLq41aQPKlxB4O?p=preview))
  30492. *
  30493. * ```typescript
  30494. * import {RequestOptions, Request, RequestMethod} from 'angular2/http';
  30495. *
  30496. * var options = new RequestOptions({
  30497. * method: RequestMethod.Post,
  30498. * url: 'https://google.com'
  30499. * });
  30500. * var req = new Request(options);
  30501. * console.log('req.method:', RequestMethod[req.method]); // Post
  30502. * console.log('options.url:', options.url); // https://google.com
  30503. * ```
  30504. */
  30505. var RequestOptions = (function () {
  30506. function RequestOptions(_a) {
  30507. var _b = _a === void 0 ? {} : _a, method = _b.method, headers = _b.headers, body = _b.body, url = _b.url, search = _b.search;
  30508. this.method = lang_1.isPresent(method) ? http_utils_1.normalizeMethodName(method) : null;
  30509. this.headers = lang_1.isPresent(headers) ? headers : null;
  30510. this.body = lang_1.isPresent(body) ? body : null;
  30511. this.url = lang_1.isPresent(url) ? url : null;
  30512. this.search = lang_1.isPresent(search) ? (lang_1.isString(search) ? new url_search_params_1.URLSearchParams((search)) :
  30513. (search)) :
  30514. null;
  30515. }
  30516. /**
  30517. * Creates a copy of the `RequestOptions` instance, using the optional input as values to override
  30518. * existing values. This method will not change the values of the instance on which it is being
  30519. * called.
  30520. *
  30521. * Note that `headers` and `search` will override existing values completely if present in
  30522. * the `options` object. If these values should be merged, it should be done prior to calling
  30523. * `merge` on the `RequestOptions` instance.
  30524. *
  30525. * ### Example ([live demo](http://plnkr.co/edit/6w8XA8YTkDRcPYpdB9dk?p=preview))
  30526. *
  30527. * ```typescript
  30528. * import {RequestOptions, Request, RequestMethod} from 'angular2/http';
  30529. *
  30530. * var options = new RequestOptions({
  30531. * method: RequestMethod.Post
  30532. * });
  30533. * var req = new Request(options.merge({
  30534. * url: 'https://google.com'
  30535. * }));
  30536. * console.log('req.method:', RequestMethod[req.method]); // Post
  30537. * console.log('options.url:', options.url); // null
  30538. * console.log('req.url:', req.url); // https://google.com
  30539. * ```
  30540. */
  30541. RequestOptions.prototype.merge = function (options) {
  30542. return new RequestOptions({
  30543. method: lang_1.isPresent(options) && lang_1.isPresent(options.method) ? options.method : this.method,
  30544. headers: lang_1.isPresent(options) && lang_1.isPresent(options.headers) ? options.headers : this.headers,
  30545. body: lang_1.isPresent(options) && lang_1.isPresent(options.body) ? options.body : this.body,
  30546. url: lang_1.isPresent(options) && lang_1.isPresent(options.url) ? options.url : this.url,
  30547. search: lang_1.isPresent(options) && lang_1.isPresent(options.search) ?
  30548. (lang_1.isString(options.search) ? new url_search_params_1.URLSearchParams((options.search)) :
  30549. (options.search).clone()) :
  30550. this.search
  30551. });
  30552. };
  30553. return RequestOptions;
  30554. })();
  30555. exports.RequestOptions = RequestOptions;
  30556. /**
  30557. * Subclass of {@link RequestOptions}, with default values.
  30558. *
  30559. * Default values:
  30560. * * method: {@link RequestMethod RequestMethod.Get}
  30561. * * headers: empty {@link Headers} object
  30562. *
  30563. * This class could be extended and bound to the {@link RequestOptions} class
  30564. * when configuring an {@link Injector}, in order to override the default options
  30565. * used by {@link Http} to create and send {@link Request Requests}.
  30566. *
  30567. * ### Example ([live demo](http://plnkr.co/edit/LEKVSx?p=preview))
  30568. *
  30569. * ```typescript
  30570. * import {provide} from 'angular2/core';
  30571. * import {bootstrap} from 'angular2/platform/browser';
  30572. * import {HTTP_PROVIDERS, Http, BaseRequestOptions, RequestOptions} from 'angular2/http';
  30573. * import {App} from './myapp';
  30574. *
  30575. * class MyOptions extends BaseRequestOptions {
  30576. * search: string = 'coreTeam=true';
  30577. * }
  30578. *
  30579. * bootstrap(App, [HTTP_PROVIDERS, provide(RequestOptions, {useClass: MyOptions})]);
  30580. * ```
  30581. *
  30582. * The options could also be extended when manually creating a {@link Request}
  30583. * object.
  30584. *
  30585. * ### Example ([live demo](http://plnkr.co/edit/oyBoEvNtDhOSfi9YxaVb?p=preview))
  30586. *
  30587. * ```
  30588. * import {BaseRequestOptions, Request, RequestMethod} from 'angular2/http';
  30589. *
  30590. * var options = new BaseRequestOptions();
  30591. * var req = new Request(options.merge({
  30592. * method: RequestMethod.Post,
  30593. * url: 'https://google.com'
  30594. * }));
  30595. * console.log('req.method:', RequestMethod[req.method]); // Post
  30596. * console.log('options.url:', options.url); // null
  30597. * console.log('req.url:', req.url); // https://google.com
  30598. * ```
  30599. */
  30600. var BaseRequestOptions = (function (_super) {
  30601. __extends(BaseRequestOptions, _super);
  30602. function BaseRequestOptions() {
  30603. _super.call(this, { method: enums_1.RequestMethod.Get, headers: new headers_1.Headers() });
  30604. }
  30605. BaseRequestOptions = __decorate([
  30606. core_1.Injectable(),
  30607. __metadata('design:paramtypes', [])
  30608. ], BaseRequestOptions);
  30609. return BaseRequestOptions;
  30610. })(RequestOptions);
  30611. exports.BaseRequestOptions = BaseRequestOptions;
  30612. /***/ },
  30613. /* 217 */
  30614. /***/ function(module, exports, __webpack_require__) {
  30615. var lang_1 = __webpack_require__(5);
  30616. var collection_1 = __webpack_require__(12);
  30617. function paramParser(rawParams) {
  30618. if (rawParams === void 0) { rawParams = ''; }
  30619. var map = new collection_1.Map();
  30620. if (rawParams.length > 0) {
  30621. var params = rawParams.split('&');
  30622. params.forEach(function (param) {
  30623. var split = param.split('=');
  30624. var key = split[0];
  30625. var val = split[1];
  30626. var list = lang_1.isPresent(map.get(key)) ? map.get(key) : [];
  30627. list.push(val);
  30628. map.set(key, list);
  30629. });
  30630. }
  30631. return map;
  30632. }
  30633. /**
  30634. * Map-like representation of url search parameters, based on
  30635. * [URLSearchParams](https://url.spec.whatwg.org/#urlsearchparams) in the url living standard,
  30636. * with several extensions for merging URLSearchParams objects:
  30637. * - setAll()
  30638. * - appendAll()
  30639. * - replaceAll()
  30640. */
  30641. var URLSearchParams = (function () {
  30642. function URLSearchParams(rawParams) {
  30643. if (rawParams === void 0) { rawParams = ''; }
  30644. this.rawParams = rawParams;
  30645. this.paramsMap = paramParser(rawParams);
  30646. }
  30647. URLSearchParams.prototype.clone = function () {
  30648. var clone = new URLSearchParams();
  30649. clone.appendAll(this);
  30650. return clone;
  30651. };
  30652. URLSearchParams.prototype.has = function (param) { return this.paramsMap.has(param); };
  30653. URLSearchParams.prototype.get = function (param) {
  30654. var storedParam = this.paramsMap.get(param);
  30655. if (collection_1.isListLikeIterable(storedParam)) {
  30656. return collection_1.ListWrapper.first(storedParam);
  30657. }
  30658. else {
  30659. return null;
  30660. }
  30661. };
  30662. URLSearchParams.prototype.getAll = function (param) {
  30663. var mapParam = this.paramsMap.get(param);
  30664. return lang_1.isPresent(mapParam) ? mapParam : [];
  30665. };
  30666. URLSearchParams.prototype.set = function (param, val) {
  30667. var mapParam = this.paramsMap.get(param);
  30668. var list = lang_1.isPresent(mapParam) ? mapParam : [];
  30669. collection_1.ListWrapper.clear(list);
  30670. list.push(val);
  30671. this.paramsMap.set(param, list);
  30672. };
  30673. // A merge operation
  30674. // For each name-values pair in `searchParams`, perform `set(name, values[0])`
  30675. //
  30676. // E.g: "a=[1,2,3], c=[8]" + "a=[4,5,6], b=[7]" = "a=[4], c=[8], b=[7]"
  30677. //
  30678. // TODO(@caitp): document this better
  30679. URLSearchParams.prototype.setAll = function (searchParams) {
  30680. var _this = this;
  30681. searchParams.paramsMap.forEach(function (value, param) {
  30682. var mapParam = _this.paramsMap.get(param);
  30683. var list = lang_1.isPresent(mapParam) ? mapParam : [];
  30684. collection_1.ListWrapper.clear(list);
  30685. list.push(value[0]);
  30686. _this.paramsMap.set(param, list);
  30687. });
  30688. };
  30689. URLSearchParams.prototype.append = function (param, val) {
  30690. var mapParam = this.paramsMap.get(param);
  30691. var list = lang_1.isPresent(mapParam) ? mapParam : [];
  30692. list.push(val);
  30693. this.paramsMap.set(param, list);
  30694. };
  30695. // A merge operation
  30696. // For each name-values pair in `searchParams`, perform `append(name, value)`
  30697. // for each value in `values`.
  30698. //
  30699. // E.g: "a=[1,2], c=[8]" + "a=[3,4], b=[7]" = "a=[1,2,3,4], c=[8], b=[7]"
  30700. //
  30701. // TODO(@caitp): document this better
  30702. URLSearchParams.prototype.appendAll = function (searchParams) {
  30703. var _this = this;
  30704. searchParams.paramsMap.forEach(function (value, param) {
  30705. var mapParam = _this.paramsMap.get(param);
  30706. var list = lang_1.isPresent(mapParam) ? mapParam : [];
  30707. for (var i = 0; i < value.length; ++i) {
  30708. list.push(value[i]);
  30709. }
  30710. _this.paramsMap.set(param, list);
  30711. });
  30712. };
  30713. // A merge operation
  30714. // For each name-values pair in `searchParams`, perform `delete(name)`,
  30715. // followed by `set(name, values)`
  30716. //
  30717. // E.g: "a=[1,2,3], c=[8]" + "a=[4,5,6], b=[7]" = "a=[4,5,6], c=[8], b=[7]"
  30718. //
  30719. // TODO(@caitp): document this better
  30720. URLSearchParams.prototype.replaceAll = function (searchParams) {
  30721. var _this = this;
  30722. searchParams.paramsMap.forEach(function (value, param) {
  30723. var mapParam = _this.paramsMap.get(param);
  30724. var list = lang_1.isPresent(mapParam) ? mapParam : [];
  30725. collection_1.ListWrapper.clear(list);
  30726. for (var i = 0; i < value.length; ++i) {
  30727. list.push(value[i]);
  30728. }
  30729. _this.paramsMap.set(param, list);
  30730. });
  30731. };
  30732. URLSearchParams.prototype.toString = function () {
  30733. var paramsList = [];
  30734. this.paramsMap.forEach(function (values, k) { values.forEach(function (v) { return paramsList.push(k + '=' + v); }); });
  30735. return paramsList.join('&');
  30736. };
  30737. URLSearchParams.prototype.delete = function (param) { this.paramsMap.delete(param); };
  30738. return URLSearchParams;
  30739. })();
  30740. exports.URLSearchParams = URLSearchParams;
  30741. /***/ },
  30742. /* 218 */
  30743. /***/ function(module, exports, __webpack_require__) {
  30744. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  30745. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  30746. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  30747. 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;
  30748. return c > 3 && r && Object.defineProperty(target, key, r), r;
  30749. };
  30750. var __metadata = (this && this.__metadata) || function (k, v) {
  30751. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  30752. };
  30753. var enums_1 = __webpack_require__(215);
  30754. var static_response_1 = __webpack_require__(219);
  30755. var headers_1 = __webpack_require__(213);
  30756. var base_response_options_1 = __webpack_require__(220);
  30757. var core_1 = __webpack_require__(2);
  30758. var browser_xhr_1 = __webpack_require__(221);
  30759. var lang_1 = __webpack_require__(5);
  30760. var Observable_1 = __webpack_require__(62);
  30761. var http_utils_1 = __webpack_require__(214);
  30762. /**
  30763. * Creates connections using `XMLHttpRequest`. Given a fully-qualified
  30764. * request, an `XHRConnection` will immediately create an `XMLHttpRequest` object and send the
  30765. * request.
  30766. *
  30767. * This class would typically not be created or interacted with directly inside applications, though
  30768. * the {@link MockConnection} may be interacted with in tests.
  30769. */
  30770. var XHRConnection = (function () {
  30771. function XHRConnection(req, browserXHR, baseResponseOptions) {
  30772. var _this = this;
  30773. this.request = req;
  30774. this.response = new Observable_1.Observable(function (responseObserver) {
  30775. var _xhr = browserXHR.build();
  30776. _xhr.open(enums_1.RequestMethod[req.method].toUpperCase(), req.url);
  30777. // load event handler
  30778. var onLoad = function () {
  30779. // responseText is the old-school way of retrieving response (supported by IE8 & 9)
  30780. // response/responseType properties were introduced in XHR Level2 spec (supported by
  30781. // IE10)
  30782. var body = lang_1.isPresent(_xhr.response) ? _xhr.response : _xhr.responseText;
  30783. var headers = headers_1.Headers.fromResponseHeaderString(_xhr.getAllResponseHeaders());
  30784. var url = http_utils_1.getResponseURL(_xhr);
  30785. // normalize IE9 bug (http://bugs.jquery.com/ticket/1450)
  30786. var status = _xhr.status === 1223 ? 204 : _xhr.status;
  30787. // fix status code when it is 0 (0 status is undocumented).
  30788. // Occurs when accessing file resources or on Android 4.1 stock browser
  30789. // while retrieving files from application cache.
  30790. if (status === 0) {
  30791. status = body ? 200 : 0;
  30792. }
  30793. var responseOptions = new base_response_options_1.ResponseOptions({ body: body, status: status, headers: headers, url: url });
  30794. if (lang_1.isPresent(baseResponseOptions)) {
  30795. responseOptions = baseResponseOptions.merge(responseOptions);
  30796. }
  30797. var response = new static_response_1.Response(responseOptions);
  30798. if (http_utils_1.isSuccess(status)) {
  30799. responseObserver.next(response);
  30800. // TODO(gdi2290): defer complete if array buffer until done
  30801. responseObserver.complete();
  30802. return;
  30803. }
  30804. responseObserver.error(response);
  30805. };
  30806. // error event handler
  30807. var onError = function (err) {
  30808. var responseOptions = new base_response_options_1.ResponseOptions({ body: err, type: enums_1.ResponseType.Error });
  30809. if (lang_1.isPresent(baseResponseOptions)) {
  30810. responseOptions = baseResponseOptions.merge(responseOptions);
  30811. }
  30812. responseObserver.error(new static_response_1.Response(responseOptions));
  30813. };
  30814. if (lang_1.isPresent(req.headers)) {
  30815. req.headers.forEach(function (values, name) { return _xhr.setRequestHeader(name, values.join(',')); });
  30816. }
  30817. _xhr.addEventListener('load', onLoad);
  30818. _xhr.addEventListener('error', onError);
  30819. _xhr.send(_this.request.text());
  30820. return function () {
  30821. _xhr.removeEventListener('load', onLoad);
  30822. _xhr.removeEventListener('error', onError);
  30823. _xhr.abort();
  30824. };
  30825. });
  30826. }
  30827. return XHRConnection;
  30828. })();
  30829. exports.XHRConnection = XHRConnection;
  30830. /**
  30831. * Creates {@link XHRConnection} instances.
  30832. *
  30833. * This class would typically not be used by end users, but could be
  30834. * overridden if a different backend implementation should be used,
  30835. * such as in a node backend.
  30836. *
  30837. * ### Example
  30838. *
  30839. * ```
  30840. * import {Http, MyNodeBackend, HTTP_PROVIDERS, BaseRequestOptions} from 'angular2/http';
  30841. * @Component({
  30842. * viewProviders: [
  30843. * HTTP_PROVIDERS,
  30844. * provide(Http, {useFactory: (backend, options) => {
  30845. * return new Http(backend, options);
  30846. * }, deps: [MyNodeBackend, BaseRequestOptions]})]
  30847. * })
  30848. * class MyComponent {
  30849. * constructor(http:Http) {
  30850. * http.request('people.json').subscribe(res => this.people = res.json());
  30851. * }
  30852. * }
  30853. * ```
  30854. *
  30855. **/
  30856. var XHRBackend = (function () {
  30857. function XHRBackend(_browserXHR, _baseResponseOptions) {
  30858. this._browserXHR = _browserXHR;
  30859. this._baseResponseOptions = _baseResponseOptions;
  30860. }
  30861. XHRBackend.prototype.createConnection = function (request) {
  30862. return new XHRConnection(request, this._browserXHR, this._baseResponseOptions);
  30863. };
  30864. XHRBackend = __decorate([
  30865. core_1.Injectable(),
  30866. __metadata('design:paramtypes', [browser_xhr_1.BrowserXhr, base_response_options_1.ResponseOptions])
  30867. ], XHRBackend);
  30868. return XHRBackend;
  30869. })();
  30870. exports.XHRBackend = XHRBackend;
  30871. /***/ },
  30872. /* 219 */
  30873. /***/ function(module, exports, __webpack_require__) {
  30874. var lang_1 = __webpack_require__(5);
  30875. var exceptions_1 = __webpack_require__(14);
  30876. var http_utils_1 = __webpack_require__(214);
  30877. /**
  30878. * Creates `Response` instances from provided values.
  30879. *
  30880. * Though this object isn't
  30881. * usually instantiated by end-users, it is the primary object interacted with when it comes time to
  30882. * add data to a view.
  30883. *
  30884. * ### Example
  30885. *
  30886. * ```
  30887. * http.request('my-friends.txt').subscribe(response => this.friends = response.text());
  30888. * ```
  30889. *
  30890. * The Response's interface is inspired by the Response constructor defined in the [Fetch
  30891. * Spec](https://fetch.spec.whatwg.org/#response-class), but is considered a static value whose body
  30892. * can be accessed many times. There are other differences in the implementation, but this is the
  30893. * most significant.
  30894. */
  30895. var Response = (function () {
  30896. function Response(responseOptions) {
  30897. this._body = responseOptions.body;
  30898. this.status = responseOptions.status;
  30899. this.statusText = responseOptions.statusText;
  30900. this.headers = responseOptions.headers;
  30901. this.type = responseOptions.type;
  30902. this.url = responseOptions.url;
  30903. }
  30904. /**
  30905. * Not yet implemented
  30906. */
  30907. // TODO: Blob return type
  30908. Response.prototype.blob = function () { throw new exceptions_1.BaseException('"blob()" method not implemented on Response superclass'); };
  30909. /**
  30910. * Attempts to return body as parsed `JSON` object, or raises an exception.
  30911. */
  30912. Response.prototype.json = function () {
  30913. var jsonResponse;
  30914. if (http_utils_1.isJsObject(this._body)) {
  30915. jsonResponse = this._body;
  30916. }
  30917. else if (lang_1.isString(this._body)) {
  30918. jsonResponse = lang_1.Json.parse(this._body);
  30919. }
  30920. return jsonResponse;
  30921. };
  30922. /**
  30923. * Returns the body as a string, presuming `toString()` can be called on the response body.
  30924. */
  30925. Response.prototype.text = function () { return this._body.toString(); };
  30926. /**
  30927. * Not yet implemented
  30928. */
  30929. // TODO: ArrayBuffer return type
  30930. Response.prototype.arrayBuffer = function () {
  30931. throw new exceptions_1.BaseException('"arrayBuffer()" method not implemented on Response superclass');
  30932. };
  30933. return Response;
  30934. })();
  30935. exports.Response = Response;
  30936. /***/ },
  30937. /* 220 */
  30938. /***/ function(module, exports, __webpack_require__) {
  30939. var __extends = (this && this.__extends) || function (d, b) {
  30940. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  30941. function __() { this.constructor = d; }
  30942. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  30943. };
  30944. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  30945. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  30946. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  30947. 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;
  30948. return c > 3 && r && Object.defineProperty(target, key, r), r;
  30949. };
  30950. var __metadata = (this && this.__metadata) || function (k, v) {
  30951. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  30952. };
  30953. var core_1 = __webpack_require__(2);
  30954. var lang_1 = __webpack_require__(5);
  30955. var headers_1 = __webpack_require__(213);
  30956. var enums_1 = __webpack_require__(215);
  30957. /**
  30958. * Creates a response options object to be optionally provided when instantiating a
  30959. * {@link Response}.
  30960. *
  30961. * This class is based on the `ResponseInit` description in the [Fetch
  30962. * Spec](https://fetch.spec.whatwg.org/#responseinit).
  30963. *
  30964. * All values are null by default. Typical defaults can be found in the
  30965. * {@link BaseResponseOptions} class, which sub-classes `ResponseOptions`.
  30966. *
  30967. * This class may be used in tests to build {@link Response Responses} for
  30968. * mock responses (see {@link MockBackend}).
  30969. *
  30970. * ### Example ([live demo](http://plnkr.co/edit/P9Jkk8e8cz6NVzbcxEsD?p=preview))
  30971. *
  30972. * ```typescript
  30973. * import {ResponseOptions, Response} from 'angular2/http';
  30974. *
  30975. * var options = new ResponseOptions({
  30976. * body: '{"name":"Jeff"}'
  30977. * });
  30978. * var res = new Response(options);
  30979. *
  30980. * console.log('res.json():', res.json()); // Object {name: "Jeff"}
  30981. * ```
  30982. */
  30983. var ResponseOptions = (function () {
  30984. function ResponseOptions(_a) {
  30985. var _b = _a === void 0 ? {} : _a, body = _b.body, status = _b.status, headers = _b.headers, statusText = _b.statusText, type = _b.type, url = _b.url;
  30986. this.body = lang_1.isPresent(body) ? body : null;
  30987. this.status = lang_1.isPresent(status) ? status : null;
  30988. this.headers = lang_1.isPresent(headers) ? headers : null;
  30989. this.statusText = lang_1.isPresent(statusText) ? statusText : null;
  30990. this.type = lang_1.isPresent(type) ? type : null;
  30991. this.url = lang_1.isPresent(url) ? url : null;
  30992. }
  30993. /**
  30994. * Creates a copy of the `ResponseOptions` instance, using the optional input as values to
  30995. * override
  30996. * existing values. This method will not change the values of the instance on which it is being
  30997. * called.
  30998. *
  30999. * This may be useful when sharing a base `ResponseOptions` object inside tests,
  31000. * where certain properties may change from test to test.
  31001. *
  31002. * ### Example ([live demo](http://plnkr.co/edit/1lXquqFfgduTFBWjNoRE?p=preview))
  31003. *
  31004. * ```typescript
  31005. * import {ResponseOptions, Response} from 'angular2/http';
  31006. *
  31007. * var options = new ResponseOptions({
  31008. * body: {name: 'Jeff'}
  31009. * });
  31010. * var res = new Response(options.merge({
  31011. * url: 'https://google.com'
  31012. * }));
  31013. * console.log('options.url:', options.url); // null
  31014. * console.log('res.json():', res.json()); // Object {name: "Jeff"}
  31015. * console.log('res.url:', res.url); // https://google.com
  31016. * ```
  31017. */
  31018. ResponseOptions.prototype.merge = function (options) {
  31019. return new ResponseOptions({
  31020. body: lang_1.isPresent(options) && lang_1.isPresent(options.body) ? options.body : this.body,
  31021. status: lang_1.isPresent(options) && lang_1.isPresent(options.status) ? options.status : this.status,
  31022. headers: lang_1.isPresent(options) && lang_1.isPresent(options.headers) ? options.headers : this.headers,
  31023. statusText: lang_1.isPresent(options) && lang_1.isPresent(options.statusText) ? options.statusText :
  31024. this.statusText,
  31025. type: lang_1.isPresent(options) && lang_1.isPresent(options.type) ? options.type : this.type,
  31026. url: lang_1.isPresent(options) && lang_1.isPresent(options.url) ? options.url : this.url,
  31027. });
  31028. };
  31029. return ResponseOptions;
  31030. })();
  31031. exports.ResponseOptions = ResponseOptions;
  31032. /**
  31033. * Subclass of {@link ResponseOptions}, with default values.
  31034. *
  31035. * Default values:
  31036. * * status: 200
  31037. * * headers: empty {@link Headers} object
  31038. *
  31039. * This class could be extended and bound to the {@link ResponseOptions} class
  31040. * when configuring an {@link Injector}, in order to override the default options
  31041. * used by {@link Http} to create {@link Response Responses}.
  31042. *
  31043. * ### Example ([live demo](http://plnkr.co/edit/qv8DLT?p=preview))
  31044. *
  31045. * ```typescript
  31046. * import {provide} from 'angular2/core';
  31047. * import {bootstrap} from 'angular2/platform/browser';
  31048. * import {HTTP_PROVIDERS, Headers, Http, BaseResponseOptions, ResponseOptions} from
  31049. * 'angular2/http';
  31050. * import {App} from './myapp';
  31051. *
  31052. * class MyOptions extends BaseResponseOptions {
  31053. * headers:Headers = new Headers({network: 'github'});
  31054. * }
  31055. *
  31056. * bootstrap(App, [HTTP_PROVIDERS, provide(ResponseOptions, {useClass: MyOptions})]);
  31057. * ```
  31058. *
  31059. * The options could also be extended when manually creating a {@link Response}
  31060. * object.
  31061. *
  31062. * ### Example ([live demo](http://plnkr.co/edit/VngosOWiaExEtbstDoix?p=preview))
  31063. *
  31064. * ```
  31065. * import {BaseResponseOptions, Response} from 'angular2/http';
  31066. *
  31067. * var options = new BaseResponseOptions();
  31068. * var res = new Response(options.merge({
  31069. * body: 'Angular2',
  31070. * headers: new Headers({framework: 'angular'})
  31071. * }));
  31072. * console.log('res.headers.get("framework"):', res.headers.get('framework')); // angular
  31073. * console.log('res.text():', res.text()); // Angular2;
  31074. * ```
  31075. */
  31076. var BaseResponseOptions = (function (_super) {
  31077. __extends(BaseResponseOptions, _super);
  31078. function BaseResponseOptions() {
  31079. _super.call(this, { status: 200, statusText: 'Ok', type: enums_1.ResponseType.Default, headers: new headers_1.Headers() });
  31080. }
  31081. BaseResponseOptions = __decorate([
  31082. core_1.Injectable(),
  31083. __metadata('design:paramtypes', [])
  31084. ], BaseResponseOptions);
  31085. return BaseResponseOptions;
  31086. })(ResponseOptions);
  31087. exports.BaseResponseOptions = BaseResponseOptions;
  31088. /***/ },
  31089. /* 221 */
  31090. /***/ function(module, exports, __webpack_require__) {
  31091. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  31092. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  31093. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31094. 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;
  31095. return c > 3 && r && Object.defineProperty(target, key, r), r;
  31096. };
  31097. var __metadata = (this && this.__metadata) || function (k, v) {
  31098. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  31099. };
  31100. var core_1 = __webpack_require__(2);
  31101. /**
  31102. * A backend for http that uses the `XMLHttpRequest` browser API.
  31103. *
  31104. * Take care not to evaluate this in non-browser contexts.
  31105. */
  31106. var BrowserXhr = (function () {
  31107. function BrowserXhr() {
  31108. }
  31109. BrowserXhr.prototype.build = function () { return (new XMLHttpRequest()); };
  31110. BrowserXhr = __decorate([
  31111. core_1.Injectable(),
  31112. __metadata('design:paramtypes', [])
  31113. ], BrowserXhr);
  31114. return BrowserXhr;
  31115. })();
  31116. exports.BrowserXhr = BrowserXhr;
  31117. /***/ },
  31118. /* 222 */
  31119. /***/ function(module, exports, __webpack_require__) {
  31120. var __extends = (this && this.__extends) || function (d, b) {
  31121. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  31122. function __() { this.constructor = d; }
  31123. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  31124. };
  31125. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  31126. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  31127. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31128. 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;
  31129. return c > 3 && r && Object.defineProperty(target, key, r), r;
  31130. };
  31131. var __metadata = (this && this.__metadata) || function (k, v) {
  31132. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  31133. };
  31134. var interfaces_1 = __webpack_require__(211);
  31135. var enums_1 = __webpack_require__(215);
  31136. var static_response_1 = __webpack_require__(219);
  31137. var base_response_options_1 = __webpack_require__(220);
  31138. var core_1 = __webpack_require__(2);
  31139. var browser_jsonp_1 = __webpack_require__(223);
  31140. var exceptions_1 = __webpack_require__(14);
  31141. var lang_1 = __webpack_require__(5);
  31142. var Observable_1 = __webpack_require__(62);
  31143. var JSONP_ERR_NO_CALLBACK = 'JSONP injected script did not invoke callback.';
  31144. var JSONP_ERR_WRONG_METHOD = 'JSONP requests must use GET request method.';
  31145. /**
  31146. * Abstract base class for an in-flight JSONP request.
  31147. */
  31148. var JSONPConnection = (function () {
  31149. function JSONPConnection() {
  31150. }
  31151. return JSONPConnection;
  31152. })();
  31153. exports.JSONPConnection = JSONPConnection;
  31154. var JSONPConnection_ = (function (_super) {
  31155. __extends(JSONPConnection_, _super);
  31156. function JSONPConnection_(req, _dom, baseResponseOptions) {
  31157. var _this = this;
  31158. _super.call(this);
  31159. this._dom = _dom;
  31160. this.baseResponseOptions = baseResponseOptions;
  31161. this._finished = false;
  31162. if (req.method !== enums_1.RequestMethod.Get) {
  31163. throw exceptions_1.makeTypeError(JSONP_ERR_WRONG_METHOD);
  31164. }
  31165. this.request = req;
  31166. this.response = new Observable_1.Observable(function (responseObserver) {
  31167. _this.readyState = enums_1.ReadyState.Loading;
  31168. var id = _this._id = _dom.nextRequestID();
  31169. _dom.exposeConnection(id, _this);
  31170. // Workaround Dart
  31171. // url = url.replace(/=JSONP_CALLBACK(&|$)/, `generated method`);
  31172. var callback = _dom.requestCallback(_this._id);
  31173. var url = req.url;
  31174. if (url.indexOf('=JSONP_CALLBACK&') > -1) {
  31175. url = lang_1.StringWrapper.replace(url, '=JSONP_CALLBACK&', "=" + callback + "&");
  31176. }
  31177. else if (url.lastIndexOf('=JSONP_CALLBACK') === url.length - '=JSONP_CALLBACK'.length) {
  31178. url = url.substring(0, url.length - '=JSONP_CALLBACK'.length) + ("=" + callback);
  31179. }
  31180. var script = _this._script = _dom.build(url);
  31181. var onLoad = function (event) {
  31182. if (_this.readyState === enums_1.ReadyState.Cancelled)
  31183. return;
  31184. _this.readyState = enums_1.ReadyState.Done;
  31185. _dom.cleanup(script);
  31186. if (!_this._finished) {
  31187. var responseOptions_1 = new base_response_options_1.ResponseOptions({ body: JSONP_ERR_NO_CALLBACK, type: enums_1.ResponseType.Error, url: url });
  31188. if (lang_1.isPresent(baseResponseOptions)) {
  31189. responseOptions_1 = baseResponseOptions.merge(responseOptions_1);
  31190. }
  31191. responseObserver.error(new static_response_1.Response(responseOptions_1));
  31192. return;
  31193. }
  31194. var responseOptions = new base_response_options_1.ResponseOptions({ body: _this._responseData, url: url });
  31195. if (lang_1.isPresent(_this.baseResponseOptions)) {
  31196. responseOptions = _this.baseResponseOptions.merge(responseOptions);
  31197. }
  31198. responseObserver.next(new static_response_1.Response(responseOptions));
  31199. responseObserver.complete();
  31200. };
  31201. var onError = function (error) {
  31202. if (_this.readyState === enums_1.ReadyState.Cancelled)
  31203. return;
  31204. _this.readyState = enums_1.ReadyState.Done;
  31205. _dom.cleanup(script);
  31206. var responseOptions = new base_response_options_1.ResponseOptions({ body: error.message, type: enums_1.ResponseType.Error });
  31207. if (lang_1.isPresent(baseResponseOptions)) {
  31208. responseOptions = baseResponseOptions.merge(responseOptions);
  31209. }
  31210. responseObserver.error(new static_response_1.Response(responseOptions));
  31211. };
  31212. script.addEventListener('load', onLoad);
  31213. script.addEventListener('error', onError);
  31214. _dom.send(script);
  31215. return function () {
  31216. _this.readyState = enums_1.ReadyState.Cancelled;
  31217. script.removeEventListener('load', onLoad);
  31218. script.removeEventListener('error', onError);
  31219. if (lang_1.isPresent(script)) {
  31220. _this._dom.cleanup(script);
  31221. }
  31222. };
  31223. });
  31224. }
  31225. JSONPConnection_.prototype.finished = function (data) {
  31226. // Don't leak connections
  31227. this._finished = true;
  31228. this._dom.removeConnection(this._id);
  31229. if (this.readyState === enums_1.ReadyState.Cancelled)
  31230. return;
  31231. this._responseData = data;
  31232. };
  31233. return JSONPConnection_;
  31234. })(JSONPConnection);
  31235. exports.JSONPConnection_ = JSONPConnection_;
  31236. /**
  31237. * A {@link ConnectionBackend} that uses the JSONP strategy of making requests.
  31238. */
  31239. var JSONPBackend = (function (_super) {
  31240. __extends(JSONPBackend, _super);
  31241. function JSONPBackend() {
  31242. _super.apply(this, arguments);
  31243. }
  31244. return JSONPBackend;
  31245. })(interfaces_1.ConnectionBackend);
  31246. exports.JSONPBackend = JSONPBackend;
  31247. var JSONPBackend_ = (function (_super) {
  31248. __extends(JSONPBackend_, _super);
  31249. function JSONPBackend_(_browserJSONP, _baseResponseOptions) {
  31250. _super.call(this);
  31251. this._browserJSONP = _browserJSONP;
  31252. this._baseResponseOptions = _baseResponseOptions;
  31253. }
  31254. JSONPBackend_.prototype.createConnection = function (request) {
  31255. return new JSONPConnection_(request, this._browserJSONP, this._baseResponseOptions);
  31256. };
  31257. JSONPBackend_ = __decorate([
  31258. core_1.Injectable(),
  31259. __metadata('design:paramtypes', [browser_jsonp_1.BrowserJsonp, base_response_options_1.ResponseOptions])
  31260. ], JSONPBackend_);
  31261. return JSONPBackend_;
  31262. })(JSONPBackend);
  31263. exports.JSONPBackend_ = JSONPBackend_;
  31264. /***/ },
  31265. /* 223 */
  31266. /***/ function(module, exports, __webpack_require__) {
  31267. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  31268. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  31269. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31270. 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;
  31271. return c > 3 && r && Object.defineProperty(target, key, r), r;
  31272. };
  31273. var __metadata = (this && this.__metadata) || function (k, v) {
  31274. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  31275. };
  31276. var core_1 = __webpack_require__(2);
  31277. var lang_1 = __webpack_require__(5);
  31278. var _nextRequestId = 0;
  31279. exports.JSONP_HOME = '__ng_jsonp__';
  31280. var _jsonpConnections = null;
  31281. function _getJsonpConnections() {
  31282. if (_jsonpConnections === null) {
  31283. _jsonpConnections = lang_1.global[exports.JSONP_HOME] = {};
  31284. }
  31285. return _jsonpConnections;
  31286. }
  31287. // Make sure not to evaluate this in a non-browser environment!
  31288. var BrowserJsonp = (function () {
  31289. function BrowserJsonp() {
  31290. }
  31291. // Construct a <script> element with the specified URL
  31292. BrowserJsonp.prototype.build = function (url) {
  31293. var node = document.createElement('script');
  31294. node.src = url;
  31295. return node;
  31296. };
  31297. BrowserJsonp.prototype.nextRequestID = function () { return "__req" + _nextRequestId++; };
  31298. BrowserJsonp.prototype.requestCallback = function (id) { return exports.JSONP_HOME + "." + id + ".finished"; };
  31299. BrowserJsonp.prototype.exposeConnection = function (id, connection) {
  31300. var connections = _getJsonpConnections();
  31301. connections[id] = connection;
  31302. };
  31303. BrowserJsonp.prototype.removeConnection = function (id) {
  31304. var connections = _getJsonpConnections();
  31305. connections[id] = null;
  31306. };
  31307. // Attach the <script> element to the DOM
  31308. BrowserJsonp.prototype.send = function (node) { document.body.appendChild((node)); };
  31309. // Remove <script> element from the DOM
  31310. BrowserJsonp.prototype.cleanup = function (node) {
  31311. if (node.parentNode) {
  31312. node.parentNode.removeChild((node));
  31313. }
  31314. };
  31315. BrowserJsonp = __decorate([
  31316. core_1.Injectable(),
  31317. __metadata('design:paramtypes', [])
  31318. ], BrowserJsonp);
  31319. return BrowserJsonp;
  31320. })();
  31321. exports.BrowserJsonp = BrowserJsonp;
  31322. /***/ },
  31323. /* 224 */
  31324. /***/ function(module, exports, __webpack_require__) {
  31325. /**
  31326. * @module
  31327. * @description
  31328. * Maps application URLs into application states, to support deep-linking and navigation.
  31329. */
  31330. function __export(m) {
  31331. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  31332. }
  31333. var router_1 = __webpack_require__(225);
  31334. exports.Router = router_1.Router;
  31335. var router_outlet_1 = __webpack_require__(241);
  31336. exports.RouterOutlet = router_outlet_1.RouterOutlet;
  31337. var router_link_1 = __webpack_require__(243);
  31338. exports.RouterLink = router_link_1.RouterLink;
  31339. var instruction_1 = __webpack_require__(229);
  31340. exports.RouteParams = instruction_1.RouteParams;
  31341. exports.RouteData = instruction_1.RouteData;
  31342. var platform_location_1 = __webpack_require__(244);
  31343. exports.PlatformLocation = platform_location_1.PlatformLocation;
  31344. var route_registry_1 = __webpack_require__(226);
  31345. exports.RouteRegistry = route_registry_1.RouteRegistry;
  31346. exports.ROUTER_PRIMARY_COMPONENT = route_registry_1.ROUTER_PRIMARY_COMPONENT;
  31347. var location_strategy_1 = __webpack_require__(238);
  31348. exports.LocationStrategy = location_strategy_1.LocationStrategy;
  31349. exports.APP_BASE_HREF = location_strategy_1.APP_BASE_HREF;
  31350. var hash_location_strategy_1 = __webpack_require__(245);
  31351. exports.HashLocationStrategy = hash_location_strategy_1.HashLocationStrategy;
  31352. var path_location_strategy_1 = __webpack_require__(246);
  31353. exports.PathLocationStrategy = path_location_strategy_1.PathLocationStrategy;
  31354. var location_1 = __webpack_require__(237);
  31355. exports.Location = location_1.Location;
  31356. __export(__webpack_require__(236));
  31357. __export(__webpack_require__(247));
  31358. var lifecycle_annotations_1 = __webpack_require__(242);
  31359. exports.CanActivate = lifecycle_annotations_1.CanActivate;
  31360. var instruction_2 = __webpack_require__(229);
  31361. exports.Instruction = instruction_2.Instruction;
  31362. exports.ComponentInstruction = instruction_2.ComponentInstruction;
  31363. var core_1 = __webpack_require__(2);
  31364. exports.OpaqueToken = core_1.OpaqueToken;
  31365. var platform_location_2 = __webpack_require__(244);
  31366. var location_strategy_2 = __webpack_require__(238);
  31367. var path_location_strategy_2 = __webpack_require__(246);
  31368. var router_2 = __webpack_require__(225);
  31369. var router_outlet_2 = __webpack_require__(241);
  31370. var router_link_2 = __webpack_require__(243);
  31371. var route_registry_2 = __webpack_require__(226);
  31372. var location_2 = __webpack_require__(237);
  31373. var core_2 = __webpack_require__(2);
  31374. var lang_1 = __webpack_require__(5);
  31375. var exceptions_1 = __webpack_require__(14);
  31376. /**
  31377. * A list of directives. To use the router directives like {@link RouterOutlet} and
  31378. * {@link RouterLink}, add this to your `directives` array in the {@link View} decorator of your
  31379. * component.
  31380. *
  31381. * ### Example ([live demo](http://plnkr.co/edit/iRUP8B5OUbxCWQ3AcIDm))
  31382. *
  31383. * ```
  31384. * import {Component} from 'angular2/core';
  31385. * import {ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
  31386. *
  31387. * @Component({directives: [ROUTER_DIRECTIVES]})
  31388. * @RouteConfig([
  31389. * {...},
  31390. * ])
  31391. * class AppCmp {
  31392. * // ...
  31393. * }
  31394. *
  31395. * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
  31396. * ```
  31397. */
  31398. exports.ROUTER_DIRECTIVES = lang_1.CONST_EXPR([router_outlet_2.RouterOutlet, router_link_2.RouterLink]);
  31399. /**
  31400. * A list of {@link Provider}s. To use the router, you must add this to your application.
  31401. *
  31402. * ### Example ([live demo](http://plnkr.co/edit/iRUP8B5OUbxCWQ3AcIDm))
  31403. *
  31404. * ```
  31405. * import {Component} from 'angular2/core';
  31406. * import {
  31407. * ROUTER_DIRECTIVES,
  31408. * ROUTER_PROVIDERS,
  31409. * RouteConfig
  31410. * } from 'angular2/router';
  31411. *
  31412. * @Component({directives: [ROUTER_DIRECTIVES]})
  31413. * @RouteConfig([
  31414. * {...},
  31415. * ])
  31416. * class AppCmp {
  31417. * // ...
  31418. * }
  31419. *
  31420. * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
  31421. * ```
  31422. */
  31423. exports.ROUTER_PROVIDERS = lang_1.CONST_EXPR([
  31424. route_registry_2.RouteRegistry,
  31425. lang_1.CONST_EXPR(new core_2.Provider(location_strategy_2.LocationStrategy, { useClass: path_location_strategy_2.PathLocationStrategy })),
  31426. platform_location_2.PlatformLocation,
  31427. location_2.Location,
  31428. lang_1.CONST_EXPR(new core_2.Provider(router_2.Router, {
  31429. useFactory: routerFactory,
  31430. deps: lang_1.CONST_EXPR([route_registry_2.RouteRegistry, location_2.Location, route_registry_2.ROUTER_PRIMARY_COMPONENT, core_2.ApplicationRef])
  31431. })),
  31432. lang_1.CONST_EXPR(new core_2.Provider(route_registry_2.ROUTER_PRIMARY_COMPONENT, { useFactory: routerPrimaryComponentFactory, deps: lang_1.CONST_EXPR([core_2.ApplicationRef]) }))
  31433. ]);
  31434. /**
  31435. * Use {@link ROUTER_PROVIDERS} instead.
  31436. *
  31437. * @deprecated
  31438. */
  31439. exports.ROUTER_BINDINGS = exports.ROUTER_PROVIDERS;
  31440. function routerFactory(registry, location, primaryComponent, appRef) {
  31441. var rootRouter = new router_2.RootRouter(registry, location, primaryComponent);
  31442. appRef.registerDisposeListener(function () { return rootRouter.dispose(); });
  31443. return rootRouter;
  31444. }
  31445. function routerPrimaryComponentFactory(app) {
  31446. if (app.componentTypes.length == 0) {
  31447. throw new exceptions_1.BaseException("Bootstrap at least one component before injecting Router.");
  31448. }
  31449. return app.componentTypes[0];
  31450. }
  31451. /***/ },
  31452. /* 225 */
  31453. /***/ function(module, exports, __webpack_require__) {
  31454. var __extends = (this && this.__extends) || function (d, b) {
  31455. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  31456. function __() { this.constructor = d; }
  31457. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  31458. };
  31459. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  31460. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  31461. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31462. 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;
  31463. return c > 3 && r && Object.defineProperty(target, key, r), r;
  31464. };
  31465. var __metadata = (this && this.__metadata) || function (k, v) {
  31466. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  31467. };
  31468. var __param = (this && this.__param) || function (paramIndex, decorator) {
  31469. return function (target, key) { decorator(target, key, paramIndex); }
  31470. };
  31471. var async_1 = __webpack_require__(60);
  31472. var collection_1 = __webpack_require__(12);
  31473. var lang_1 = __webpack_require__(5);
  31474. var exceptions_1 = __webpack_require__(14);
  31475. var core_1 = __webpack_require__(2);
  31476. var route_registry_1 = __webpack_require__(226);
  31477. var location_1 = __webpack_require__(237);
  31478. var route_lifecycle_reflector_1 = __webpack_require__(239);
  31479. var _resolveToTrue = async_1.PromiseWrapper.resolve(true);
  31480. var _resolveToFalse = async_1.PromiseWrapper.resolve(false);
  31481. /**
  31482. * The `Router` is responsible for mapping URLs to components.
  31483. *
  31484. * You can see the state of the router by inspecting the read-only field `router.navigating`.
  31485. * This may be useful for showing a spinner, for instance.
  31486. *
  31487. * ## Concepts
  31488. *
  31489. * Routers and component instances have a 1:1 correspondence.
  31490. *
  31491. * The router holds reference to a number of {@link RouterOutlet}.
  31492. * An outlet is a placeholder that the router dynamically fills in depending on the current URL.
  31493. *
  31494. * When the router navigates from a URL, it must first recognize it and serialize it into an
  31495. * `Instruction`.
  31496. * The router uses the `RouteRegistry` to get an `Instruction`.
  31497. */
  31498. var Router = (function () {
  31499. function Router(registry, parent, hostComponent) {
  31500. this.registry = registry;
  31501. this.parent = parent;
  31502. this.hostComponent = hostComponent;
  31503. this.navigating = false;
  31504. this._currentInstruction = null;
  31505. this._currentNavigation = _resolveToTrue;
  31506. this._outlet = null;
  31507. this._auxRouters = new collection_1.Map();
  31508. this._subject = new async_1.EventEmitter();
  31509. }
  31510. /**
  31511. * Constructs a child router. You probably don't need to use this unless you're writing a reusable
  31512. * component.
  31513. */
  31514. Router.prototype.childRouter = function (hostComponent) {
  31515. return this._childRouter = new ChildRouter(this, hostComponent);
  31516. };
  31517. /**
  31518. * Constructs a child router. You probably don't need to use this unless you're writing a reusable
  31519. * component.
  31520. */
  31521. Router.prototype.auxRouter = function (hostComponent) { return new ChildRouter(this, hostComponent); };
  31522. /**
  31523. * Register an outlet to be notified of primary route changes.
  31524. *
  31525. * You probably don't need to use this unless you're writing a reusable component.
  31526. */
  31527. Router.prototype.registerPrimaryOutlet = function (outlet) {
  31528. if (lang_1.isPresent(outlet.name)) {
  31529. throw new exceptions_1.BaseException("registerPrimaryOutlet expects to be called with an unnamed outlet.");
  31530. }
  31531. this._outlet = outlet;
  31532. if (lang_1.isPresent(this._currentInstruction)) {
  31533. return this.commit(this._currentInstruction, false);
  31534. }
  31535. return _resolveToTrue;
  31536. };
  31537. /**
  31538. * Register an outlet to notified of auxiliary route changes.
  31539. *
  31540. * You probably don't need to use this unless you're writing a reusable component.
  31541. */
  31542. Router.prototype.registerAuxOutlet = function (outlet) {
  31543. var outletName = outlet.name;
  31544. if (lang_1.isBlank(outletName)) {
  31545. throw new exceptions_1.BaseException("registerAuxOutlet expects to be called with an outlet with a name.");
  31546. }
  31547. // TODO...
  31548. // what is the host of an aux route???
  31549. var router = this.auxRouter(this.hostComponent);
  31550. this._auxRouters.set(outletName, router);
  31551. router._outlet = outlet;
  31552. var auxInstruction;
  31553. if (lang_1.isPresent(this._currentInstruction) &&
  31554. lang_1.isPresent(auxInstruction = this._currentInstruction.auxInstruction[outletName])) {
  31555. return router.commit(auxInstruction);
  31556. }
  31557. return _resolveToTrue;
  31558. };
  31559. /**
  31560. * Given an instruction, returns `true` if the instruction is currently active,
  31561. * otherwise `false`.
  31562. */
  31563. Router.prototype.isRouteActive = function (instruction) {
  31564. var router = this;
  31565. while (lang_1.isPresent(router.parent) && lang_1.isPresent(instruction.child)) {
  31566. router = router.parent;
  31567. instruction = instruction.child;
  31568. }
  31569. return lang_1.isPresent(this._currentInstruction) &&
  31570. this._currentInstruction.component == instruction.component;
  31571. };
  31572. /**
  31573. * Dynamically update the routing configuration and trigger a navigation.
  31574. *
  31575. * ### Usage
  31576. *
  31577. * ```
  31578. * router.config([
  31579. * { 'path': '/', 'component': IndexComp },
  31580. * { 'path': '/user/:id', 'component': UserComp },
  31581. * ]);
  31582. * ```
  31583. */
  31584. Router.prototype.config = function (definitions) {
  31585. var _this = this;
  31586. definitions.forEach(function (routeDefinition) { _this.registry.config(_this.hostComponent, routeDefinition); });
  31587. return this.renavigate();
  31588. };
  31589. /**
  31590. * Navigate based on the provided Route Link DSL. It's preferred to navigate with this method
  31591. * over `navigateByUrl`.
  31592. *
  31593. * ### Usage
  31594. *
  31595. * This method takes an array representing the Route Link DSL:
  31596. * ```
  31597. * ['./MyCmp', {param: 3}]
  31598. * ```
  31599. * See the {@link RouterLink} directive for more.
  31600. */
  31601. Router.prototype.navigate = function (linkParams) {
  31602. var instruction = this.generate(linkParams);
  31603. return this.navigateByInstruction(instruction, false);
  31604. };
  31605. /**
  31606. * Navigate to a URL. Returns a promise that resolves when navigation is complete.
  31607. * It's preferred to navigate with `navigate` instead of this method, since URLs are more brittle.
  31608. *
  31609. * If the given URL begins with a `/`, router will navigate absolutely.
  31610. * If the given URL does not begin with `/`, the router will navigate relative to this component.
  31611. */
  31612. Router.prototype.navigateByUrl = function (url, _skipLocationChange) {
  31613. var _this = this;
  31614. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31615. return this._currentNavigation = this._currentNavigation.then(function (_) {
  31616. _this.lastNavigationAttempt = url;
  31617. _this._startNavigating();
  31618. return _this._afterPromiseFinishNavigating(_this.recognize(url).then(function (instruction) {
  31619. if (lang_1.isBlank(instruction)) {
  31620. return false;
  31621. }
  31622. return _this._navigate(instruction, _skipLocationChange);
  31623. }));
  31624. });
  31625. };
  31626. /**
  31627. * Navigate via the provided instruction. Returns a promise that resolves when navigation is
  31628. * complete.
  31629. */
  31630. Router.prototype.navigateByInstruction = function (instruction, _skipLocationChange) {
  31631. var _this = this;
  31632. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31633. if (lang_1.isBlank(instruction)) {
  31634. return _resolveToFalse;
  31635. }
  31636. return this._currentNavigation = this._currentNavigation.then(function (_) {
  31637. _this._startNavigating();
  31638. return _this._afterPromiseFinishNavigating(_this._navigate(instruction, _skipLocationChange));
  31639. });
  31640. };
  31641. /** @internal */
  31642. Router.prototype._navigate = function (instruction, _skipLocationChange) {
  31643. var _this = this;
  31644. return this._settleInstruction(instruction)
  31645. .then(function (_) { return _this._routerCanReuse(instruction); })
  31646. .then(function (_) { return _this._canActivate(instruction); })
  31647. .then(function (result) {
  31648. if (!result) {
  31649. return false;
  31650. }
  31651. return _this._routerCanDeactivate(instruction)
  31652. .then(function (result) {
  31653. if (result) {
  31654. return _this.commit(instruction, _skipLocationChange)
  31655. .then(function (_) {
  31656. _this._emitNavigationFinish(instruction.toRootUrl());
  31657. return true;
  31658. });
  31659. }
  31660. });
  31661. });
  31662. };
  31663. /** @internal */
  31664. Router.prototype._settleInstruction = function (instruction) {
  31665. var _this = this;
  31666. return instruction.resolveComponent().then(function (_) {
  31667. instruction.component.reuse = false;
  31668. var unsettledInstructions = [];
  31669. if (lang_1.isPresent(instruction.child)) {
  31670. unsettledInstructions.push(_this._settleInstruction(instruction.child));
  31671. }
  31672. collection_1.StringMapWrapper.forEach(instruction.auxInstruction, function (instruction, _) {
  31673. unsettledInstructions.push(_this._settleInstruction(instruction));
  31674. });
  31675. return async_1.PromiseWrapper.all(unsettledInstructions);
  31676. });
  31677. };
  31678. Router.prototype._emitNavigationFinish = function (url) { async_1.ObservableWrapper.callEmit(this._subject, url); };
  31679. Router.prototype._afterPromiseFinishNavigating = function (promise) {
  31680. var _this = this;
  31681. return async_1.PromiseWrapper.catchError(promise.then(function (_) { return _this._finishNavigating(); }), function (err) {
  31682. _this._finishNavigating();
  31683. throw err;
  31684. });
  31685. };
  31686. /*
  31687. * Recursively set reuse flags
  31688. */
  31689. /** @internal */
  31690. Router.prototype._routerCanReuse = function (instruction) {
  31691. var _this = this;
  31692. if (lang_1.isBlank(this._outlet)) {
  31693. return _resolveToFalse;
  31694. }
  31695. return this._outlet.routerCanReuse(instruction.component)
  31696. .then(function (result) {
  31697. instruction.component.reuse = result;
  31698. if (result && lang_1.isPresent(_this._childRouter) && lang_1.isPresent(instruction.child)) {
  31699. return _this._childRouter._routerCanReuse(instruction.child);
  31700. }
  31701. });
  31702. };
  31703. Router.prototype._canActivate = function (nextInstruction) {
  31704. return canActivateOne(nextInstruction, this._currentInstruction);
  31705. };
  31706. Router.prototype._routerCanDeactivate = function (instruction) {
  31707. var _this = this;
  31708. if (lang_1.isBlank(this._outlet)) {
  31709. return _resolveToTrue;
  31710. }
  31711. var next;
  31712. var childInstruction = null;
  31713. var reuse = false;
  31714. var componentInstruction = null;
  31715. if (lang_1.isPresent(instruction)) {
  31716. childInstruction = instruction.child;
  31717. componentInstruction = instruction.component;
  31718. reuse = instruction.component.reuse;
  31719. }
  31720. if (reuse) {
  31721. next = _resolveToTrue;
  31722. }
  31723. else {
  31724. next = this._outlet.routerCanDeactivate(componentInstruction);
  31725. }
  31726. // TODO: aux route lifecycle hooks
  31727. return next.then(function (result) {
  31728. if (result == false) {
  31729. return false;
  31730. }
  31731. if (lang_1.isPresent(_this._childRouter)) {
  31732. return _this._childRouter._routerCanDeactivate(childInstruction);
  31733. }
  31734. return true;
  31735. });
  31736. };
  31737. /**
  31738. * Updates this router and all descendant routers according to the given instruction
  31739. */
  31740. Router.prototype.commit = function (instruction, _skipLocationChange) {
  31741. var _this = this;
  31742. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31743. this._currentInstruction = instruction;
  31744. var next = _resolveToTrue;
  31745. if (lang_1.isPresent(this._outlet)) {
  31746. var componentInstruction = instruction.component;
  31747. if (componentInstruction.reuse) {
  31748. next = this._outlet.reuse(componentInstruction);
  31749. }
  31750. else {
  31751. next =
  31752. this.deactivate(instruction).then(function (_) { return _this._outlet.activate(componentInstruction); });
  31753. }
  31754. if (lang_1.isPresent(instruction.child)) {
  31755. next = next.then(function (_) {
  31756. if (lang_1.isPresent(_this._childRouter)) {
  31757. return _this._childRouter.commit(instruction.child);
  31758. }
  31759. });
  31760. }
  31761. }
  31762. var promises = [];
  31763. this._auxRouters.forEach(function (router, name) {
  31764. if (lang_1.isPresent(instruction.auxInstruction[name])) {
  31765. promises.push(router.commit(instruction.auxInstruction[name]));
  31766. }
  31767. });
  31768. return next.then(function (_) { return async_1.PromiseWrapper.all(promises); });
  31769. };
  31770. /** @internal */
  31771. Router.prototype._startNavigating = function () { this.navigating = true; };
  31772. /** @internal */
  31773. Router.prototype._finishNavigating = function () { this.navigating = false; };
  31774. /**
  31775. * Subscribe to URL updates from the router
  31776. */
  31777. Router.prototype.subscribe = function (onNext) {
  31778. return async_1.ObservableWrapper.subscribe(this._subject, onNext);
  31779. };
  31780. /**
  31781. * Removes the contents of this router's outlet and all descendant outlets
  31782. */
  31783. Router.prototype.deactivate = function (instruction) {
  31784. var _this = this;
  31785. var childInstruction = null;
  31786. var componentInstruction = null;
  31787. if (lang_1.isPresent(instruction)) {
  31788. childInstruction = instruction.child;
  31789. componentInstruction = instruction.component;
  31790. }
  31791. var next = _resolveToTrue;
  31792. if (lang_1.isPresent(this._childRouter)) {
  31793. next = this._childRouter.deactivate(childInstruction);
  31794. }
  31795. if (lang_1.isPresent(this._outlet)) {
  31796. next = next.then(function (_) { return _this._outlet.deactivate(componentInstruction); });
  31797. }
  31798. // TODO: handle aux routes
  31799. return next;
  31800. };
  31801. /**
  31802. * Given a URL, returns an instruction representing the component graph
  31803. */
  31804. Router.prototype.recognize = function (url) {
  31805. var ancestorComponents = this._getAncestorInstructions();
  31806. return this.registry.recognize(url, ancestorComponents);
  31807. };
  31808. Router.prototype._getAncestorInstructions = function () {
  31809. var ancestorComponents = [];
  31810. var ancestorRouter = this;
  31811. while (lang_1.isPresent(ancestorRouter.parent) &&
  31812. lang_1.isPresent(ancestorRouter.parent._currentInstruction)) {
  31813. ancestorRouter = ancestorRouter.parent;
  31814. ancestorComponents.unshift(ancestorRouter._currentInstruction);
  31815. }
  31816. return ancestorComponents;
  31817. };
  31818. /**
  31819. * Navigates to either the last URL successfully navigated to, or the last URL requested if the
  31820. * router has yet to successfully navigate.
  31821. */
  31822. Router.prototype.renavigate = function () {
  31823. if (lang_1.isBlank(this.lastNavigationAttempt)) {
  31824. return this._currentNavigation;
  31825. }
  31826. return this.navigateByUrl(this.lastNavigationAttempt);
  31827. };
  31828. /**
  31829. * Generate an `Instruction` based on the provided Route Link DSL.
  31830. */
  31831. Router.prototype.generate = function (linkParams) {
  31832. var ancestorInstructions = this._getAncestorInstructions();
  31833. return this.registry.generate(linkParams, ancestorInstructions);
  31834. };
  31835. return Router;
  31836. })();
  31837. exports.Router = Router;
  31838. var RootRouter = (function (_super) {
  31839. __extends(RootRouter, _super);
  31840. function RootRouter(registry, location, primaryComponent) {
  31841. var _this = this;
  31842. _super.call(this, registry, null, primaryComponent);
  31843. this._location = location;
  31844. this._locationSub = this._location.subscribe(function (change) {
  31845. // we call recognize ourselves
  31846. _this.recognize(change['url'])
  31847. .then(function (instruction) {
  31848. _this.navigateByInstruction(instruction, lang_1.isPresent(change['pop']))
  31849. .then(function (_) {
  31850. // this is a popstate event; no need to change the URL
  31851. if (lang_1.isPresent(change['pop']) && change['type'] != 'hashchange') {
  31852. return;
  31853. }
  31854. var emitPath = instruction.toUrlPath();
  31855. var emitQuery = instruction.toUrlQuery();
  31856. if (emitPath.length > 0) {
  31857. emitPath = '/' + emitPath;
  31858. }
  31859. // Because we've opted to use All hashchange events occur outside Angular.
  31860. // However, apps that are migrating might have hash links that operate outside
  31861. // angular to which routing must respond.
  31862. // To support these cases where we respond to hashchanges and redirect as a
  31863. // result, we need to replace the top item on the stack.
  31864. if (change['type'] == 'hashchange') {
  31865. if (instruction.toRootUrl() != _this._location.path()) {
  31866. _this._location.replaceState(emitPath, emitQuery);
  31867. }
  31868. }
  31869. else {
  31870. _this._location.go(emitPath, emitQuery);
  31871. }
  31872. });
  31873. });
  31874. });
  31875. this.registry.configFromComponent(primaryComponent);
  31876. this.navigateByUrl(location.path());
  31877. }
  31878. RootRouter.prototype.commit = function (instruction, _skipLocationChange) {
  31879. var _this = this;
  31880. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31881. var emitPath = instruction.toUrlPath();
  31882. var emitQuery = instruction.toUrlQuery();
  31883. if (emitPath.length > 0) {
  31884. emitPath = '/' + emitPath;
  31885. }
  31886. var promise = _super.prototype.commit.call(this, instruction);
  31887. if (!_skipLocationChange) {
  31888. promise = promise.then(function (_) { _this._location.go(emitPath, emitQuery); });
  31889. }
  31890. return promise;
  31891. };
  31892. RootRouter.prototype.dispose = function () {
  31893. if (lang_1.isPresent(this._locationSub)) {
  31894. async_1.ObservableWrapper.dispose(this._locationSub);
  31895. this._locationSub = null;
  31896. }
  31897. };
  31898. RootRouter = __decorate([
  31899. core_1.Injectable(),
  31900. __param(2, core_1.Inject(route_registry_1.ROUTER_PRIMARY_COMPONENT)),
  31901. __metadata('design:paramtypes', [route_registry_1.RouteRegistry, location_1.Location, lang_1.Type])
  31902. ], RootRouter);
  31903. return RootRouter;
  31904. })(Router);
  31905. exports.RootRouter = RootRouter;
  31906. var ChildRouter = (function (_super) {
  31907. __extends(ChildRouter, _super);
  31908. function ChildRouter(parent, hostComponent) {
  31909. _super.call(this, parent.registry, parent, hostComponent);
  31910. this.parent = parent;
  31911. }
  31912. ChildRouter.prototype.navigateByUrl = function (url, _skipLocationChange) {
  31913. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31914. // Delegate navigation to the root router
  31915. return this.parent.navigateByUrl(url, _skipLocationChange);
  31916. };
  31917. ChildRouter.prototype.navigateByInstruction = function (instruction, _skipLocationChange) {
  31918. if (_skipLocationChange === void 0) { _skipLocationChange = false; }
  31919. // Delegate navigation to the root router
  31920. return this.parent.navigateByInstruction(instruction, _skipLocationChange);
  31921. };
  31922. return ChildRouter;
  31923. })(Router);
  31924. function canActivateOne(nextInstruction, prevInstruction) {
  31925. var next = _resolveToTrue;
  31926. if (lang_1.isPresent(nextInstruction.child)) {
  31927. next = canActivateOne(nextInstruction.child, lang_1.isPresent(prevInstruction) ? prevInstruction.child : null);
  31928. }
  31929. return next.then(function (result) {
  31930. if (result == false) {
  31931. return false;
  31932. }
  31933. if (nextInstruction.component.reuse) {
  31934. return true;
  31935. }
  31936. var hook = route_lifecycle_reflector_1.getCanActivateHook(nextInstruction.component.componentType);
  31937. if (lang_1.isPresent(hook)) {
  31938. return hook(nextInstruction.component, lang_1.isPresent(prevInstruction) ? prevInstruction.component : null);
  31939. }
  31940. return true;
  31941. });
  31942. }
  31943. /***/ },
  31944. /* 226 */
  31945. /***/ function(module, exports, __webpack_require__) {
  31946. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  31947. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  31948. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  31949. 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;
  31950. return c > 3 && r && Object.defineProperty(target, key, r), r;
  31951. };
  31952. var __metadata = (this && this.__metadata) || function (k, v) {
  31953. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  31954. };
  31955. var __param = (this && this.__param) || function (paramIndex, decorator) {
  31956. return function (target, key) { decorator(target, key, paramIndex); }
  31957. };
  31958. var collection_1 = __webpack_require__(12);
  31959. var async_1 = __webpack_require__(60);
  31960. var lang_1 = __webpack_require__(5);
  31961. var exceptions_1 = __webpack_require__(14);
  31962. var reflection_1 = __webpack_require__(16);
  31963. var core_1 = __webpack_require__(2);
  31964. var route_config_impl_1 = __webpack_require__(227);
  31965. var route_recognizer_1 = __webpack_require__(228);
  31966. var component_recognizer_1 = __webpack_require__(232);
  31967. var instruction_1 = __webpack_require__(229);
  31968. var route_config_nomalizer_1 = __webpack_require__(235);
  31969. var url_parser_1 = __webpack_require__(231);
  31970. var _resolveToNull = async_1.PromiseWrapper.resolve(null);
  31971. /**
  31972. * Token used to bind the component with the top-level {@link RouteConfig}s for the
  31973. * application.
  31974. *
  31975. * ### Example ([live demo](http://plnkr.co/edit/iRUP8B5OUbxCWQ3AcIDm))
  31976. *
  31977. * ```
  31978. * import {Component} from 'angular2/core';
  31979. * import {
  31980. * ROUTER_DIRECTIVES,
  31981. * ROUTER_PROVIDERS,
  31982. * RouteConfig
  31983. * } from 'angular2/router';
  31984. *
  31985. * @Component({directives: [ROUTER_DIRECTIVES]})
  31986. * @RouteConfig([
  31987. * {...},
  31988. * ])
  31989. * class AppCmp {
  31990. * // ...
  31991. * }
  31992. *
  31993. * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
  31994. * ```
  31995. */
  31996. exports.ROUTER_PRIMARY_COMPONENT = lang_1.CONST_EXPR(new core_1.OpaqueToken('RouterPrimaryComponent'));
  31997. /**
  31998. * The RouteRegistry holds route configurations for each component in an Angular app.
  31999. * It is responsible for creating Instructions from URLs, and generating URLs based on route and
  32000. * parameters.
  32001. */
  32002. var RouteRegistry = (function () {
  32003. function RouteRegistry(_rootComponent) {
  32004. this._rootComponent = _rootComponent;
  32005. this._rules = new collection_1.Map();
  32006. }
  32007. /**
  32008. * Given a component and a configuration object, add the route to this registry
  32009. */
  32010. RouteRegistry.prototype.config = function (parentComponent, config) {
  32011. config = route_config_nomalizer_1.normalizeRouteConfig(config, this);
  32012. // this is here because Dart type guard reasons
  32013. if (config instanceof route_config_impl_1.Route) {
  32014. route_config_nomalizer_1.assertComponentExists(config.component, config.path);
  32015. }
  32016. else if (config instanceof route_config_impl_1.AuxRoute) {
  32017. route_config_nomalizer_1.assertComponentExists(config.component, config.path);
  32018. }
  32019. var recognizer = this._rules.get(parentComponent);
  32020. if (lang_1.isBlank(recognizer)) {
  32021. recognizer = new component_recognizer_1.ComponentRecognizer();
  32022. this._rules.set(parentComponent, recognizer);
  32023. }
  32024. var terminal = recognizer.config(config);
  32025. if (config instanceof route_config_impl_1.Route) {
  32026. if (terminal) {
  32027. assertTerminalComponent(config.component, config.path);
  32028. }
  32029. else {
  32030. this.configFromComponent(config.component);
  32031. }
  32032. }
  32033. };
  32034. /**
  32035. * Reads the annotations of a component and configures the registry based on them
  32036. */
  32037. RouteRegistry.prototype.configFromComponent = function (component) {
  32038. var _this = this;
  32039. if (!lang_1.isType(component)) {
  32040. return;
  32041. }
  32042. // Don't read the annotations from a type more than once –
  32043. // this prevents an infinite loop if a component routes recursively.
  32044. if (this._rules.has(component)) {
  32045. return;
  32046. }
  32047. var annotations = reflection_1.reflector.annotations(component);
  32048. if (lang_1.isPresent(annotations)) {
  32049. for (var i = 0; i < annotations.length; i++) {
  32050. var annotation = annotations[i];
  32051. if (annotation instanceof route_config_impl_1.RouteConfig) {
  32052. var routeCfgs = annotation.configs;
  32053. routeCfgs.forEach(function (config) { return _this.config(component, config); });
  32054. }
  32055. }
  32056. }
  32057. };
  32058. /**
  32059. * Given a URL and a parent component, return the most specific instruction for navigating
  32060. * the application into the state specified by the url
  32061. */
  32062. RouteRegistry.prototype.recognize = function (url, ancestorInstructions) {
  32063. var parsedUrl = url_parser_1.parser.parse(url);
  32064. return this._recognize(parsedUrl, ancestorInstructions);
  32065. };
  32066. /**
  32067. * Recognizes all parent-child routes, but creates unresolved auxiliary routes
  32068. */
  32069. RouteRegistry.prototype._recognize = function (parsedUrl, ancestorInstructions, _aux) {
  32070. var _this = this;
  32071. if (_aux === void 0) { _aux = false; }
  32072. var parentComponent = ancestorInstructions.length > 0 ?
  32073. ancestorInstructions[ancestorInstructions.length - 1].component.componentType :
  32074. this._rootComponent;
  32075. var componentRecognizer = this._rules.get(parentComponent);
  32076. if (lang_1.isBlank(componentRecognizer)) {
  32077. return _resolveToNull;
  32078. }
  32079. // Matches some beginning part of the given URL
  32080. var possibleMatches = _aux ? componentRecognizer.recognizeAuxiliary(parsedUrl) :
  32081. componentRecognizer.recognize(parsedUrl);
  32082. var matchPromises = possibleMatches.map(function (candidate) { return candidate.then(function (candidate) {
  32083. if (candidate instanceof route_recognizer_1.PathMatch) {
  32084. var auxParentInstructions = ancestorInstructions.length > 0 ?
  32085. [ancestorInstructions[ancestorInstructions.length - 1]] :
  32086. [];
  32087. var auxInstructions = _this._auxRoutesToUnresolved(candidate.remainingAux, auxParentInstructions);
  32088. var instruction = new instruction_1.ResolvedInstruction(candidate.instruction, null, auxInstructions);
  32089. if (candidate.instruction.terminal) {
  32090. return instruction;
  32091. }
  32092. var newAncestorComponents = ancestorInstructions.concat([instruction]);
  32093. return _this._recognize(candidate.remaining, newAncestorComponents)
  32094. .then(function (childInstruction) {
  32095. if (lang_1.isBlank(childInstruction)) {
  32096. return null;
  32097. }
  32098. // redirect instructions are already absolute
  32099. if (childInstruction instanceof instruction_1.RedirectInstruction) {
  32100. return childInstruction;
  32101. }
  32102. instruction.child = childInstruction;
  32103. return instruction;
  32104. });
  32105. }
  32106. if (candidate instanceof route_recognizer_1.RedirectMatch) {
  32107. var instruction = _this.generate(candidate.redirectTo, ancestorInstructions);
  32108. return new instruction_1.RedirectInstruction(instruction.component, instruction.child, instruction.auxInstruction);
  32109. }
  32110. }); });
  32111. if ((lang_1.isBlank(parsedUrl) || parsedUrl.path == '') && possibleMatches.length == 0) {
  32112. return async_1.PromiseWrapper.resolve(this.generateDefault(parentComponent));
  32113. }
  32114. return async_1.PromiseWrapper.all(matchPromises).then(mostSpecific);
  32115. };
  32116. RouteRegistry.prototype._auxRoutesToUnresolved = function (auxRoutes, parentInstructions) {
  32117. var _this = this;
  32118. var unresolvedAuxInstructions = {};
  32119. auxRoutes.forEach(function (auxUrl) {
  32120. unresolvedAuxInstructions[auxUrl.path] = new instruction_1.UnresolvedInstruction(function () { return _this._recognize(auxUrl, parentInstructions, true); });
  32121. });
  32122. return unresolvedAuxInstructions;
  32123. };
  32124. /**
  32125. * Given a normalized list with component names and params like: `['user', {id: 3 }]`
  32126. * generates a url with a leading slash relative to the provided `parentComponent`.
  32127. *
  32128. * If the optional param `_aux` is `true`, then we generate starting at an auxiliary
  32129. * route boundary.
  32130. */
  32131. RouteRegistry.prototype.generate = function (linkParams, ancestorInstructions, _aux) {
  32132. if (_aux === void 0) { _aux = false; }
  32133. var normalizedLinkParams = splitAndFlattenLinkParams(linkParams);
  32134. var first = collection_1.ListWrapper.first(normalizedLinkParams);
  32135. var rest = collection_1.ListWrapper.slice(normalizedLinkParams, 1);
  32136. // The first segment should be either '.' (generate from parent) or '' (generate from root).
  32137. // When we normalize above, we strip all the slashes, './' becomes '.' and '/' becomes ''.
  32138. if (first == '') {
  32139. ancestorInstructions = [];
  32140. }
  32141. else if (first == '..') {
  32142. // we already captured the first instance of "..", so we need to pop off an ancestor
  32143. ancestorInstructions.pop();
  32144. while (collection_1.ListWrapper.first(rest) == '..') {
  32145. rest = collection_1.ListWrapper.slice(rest, 1);
  32146. ancestorInstructions.pop();
  32147. if (ancestorInstructions.length <= 0) {
  32148. throw new exceptions_1.BaseException("Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" has too many \"../\" segments.");
  32149. }
  32150. }
  32151. }
  32152. else if (first != '.') {
  32153. var parentComponent = this._rootComponent;
  32154. var grandparentComponent = null;
  32155. if (ancestorInstructions.length > 1) {
  32156. parentComponent =
  32157. ancestorInstructions[ancestorInstructions.length - 1].component.componentType;
  32158. grandparentComponent =
  32159. ancestorInstructions[ancestorInstructions.length - 2].component.componentType;
  32160. }
  32161. else if (ancestorInstructions.length == 1) {
  32162. parentComponent = ancestorInstructions[0].component.componentType;
  32163. grandparentComponent = this._rootComponent;
  32164. }
  32165. // For a link with no leading `./`, `/`, or `../`, we look for a sibling and child.
  32166. // If both exist, we throw. Otherwise, we prefer whichever exists.
  32167. var childRouteExists = this.hasRoute(first, parentComponent);
  32168. var parentRouteExists = lang_1.isPresent(grandparentComponent) && this.hasRoute(first, grandparentComponent);
  32169. if (parentRouteExists && childRouteExists) {
  32170. var msg = "Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" is ambiguous, use \"./\" or \"../\" to disambiguate.";
  32171. throw new exceptions_1.BaseException(msg);
  32172. }
  32173. if (parentRouteExists) {
  32174. ancestorInstructions.pop();
  32175. }
  32176. rest = linkParams;
  32177. }
  32178. if (rest[rest.length - 1] == '') {
  32179. rest.pop();
  32180. }
  32181. if (rest.length < 1) {
  32182. var msg = "Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" must include a route name.";
  32183. throw new exceptions_1.BaseException(msg);
  32184. }
  32185. var generatedInstruction = this._generate(rest, ancestorInstructions, _aux);
  32186. for (var i = ancestorInstructions.length - 1; i >= 0; i--) {
  32187. var ancestorInstruction = ancestorInstructions[i];
  32188. generatedInstruction = ancestorInstruction.replaceChild(generatedInstruction);
  32189. }
  32190. return generatedInstruction;
  32191. };
  32192. /*
  32193. * Internal helper that does not make any assertions about the beginning of the link DSL
  32194. */
  32195. RouteRegistry.prototype._generate = function (linkParams, ancestorInstructions, _aux) {
  32196. var _this = this;
  32197. if (_aux === void 0) { _aux = false; }
  32198. var parentComponent = ancestorInstructions.length > 0 ?
  32199. ancestorInstructions[ancestorInstructions.length - 1].component.componentType :
  32200. this._rootComponent;
  32201. if (linkParams.length == 0) {
  32202. return this.generateDefault(parentComponent);
  32203. }
  32204. var linkIndex = 0;
  32205. var routeName = linkParams[linkIndex];
  32206. if (!lang_1.isString(routeName)) {
  32207. throw new exceptions_1.BaseException("Unexpected segment \"" + routeName + "\" in link DSL. Expected a string.");
  32208. }
  32209. else if (routeName == '' || routeName == '.' || routeName == '..') {
  32210. throw new exceptions_1.BaseException("\"" + routeName + "/\" is only allowed at the beginning of a link DSL.");
  32211. }
  32212. var params = {};
  32213. if (linkIndex + 1 < linkParams.length) {
  32214. var nextSegment_1 = linkParams[linkIndex + 1];
  32215. if (lang_1.isStringMap(nextSegment_1) && !lang_1.isArray(nextSegment_1)) {
  32216. params = nextSegment_1;
  32217. linkIndex += 1;
  32218. }
  32219. }
  32220. var auxInstructions = {};
  32221. var nextSegment;
  32222. while (linkIndex + 1 < linkParams.length && lang_1.isArray(nextSegment = linkParams[linkIndex + 1])) {
  32223. var auxParentInstruction = ancestorInstructions.length > 0 ?
  32224. [ancestorInstructions[ancestorInstructions.length - 1]] :
  32225. [];
  32226. var auxInstruction = this._generate(nextSegment, auxParentInstruction, true);
  32227. // TODO: this will not work for aux routes with parameters or multiple segments
  32228. auxInstructions[auxInstruction.component.urlPath] = auxInstruction;
  32229. linkIndex += 1;
  32230. }
  32231. var componentRecognizer = this._rules.get(parentComponent);
  32232. if (lang_1.isBlank(componentRecognizer)) {
  32233. throw new exceptions_1.BaseException("Component \"" + lang_1.getTypeNameForDebugging(parentComponent) + "\" has no route config.");
  32234. }
  32235. var routeRecognizer = (_aux ? componentRecognizer.auxNames : componentRecognizer.names).get(routeName);
  32236. if (!lang_1.isPresent(routeRecognizer)) {
  32237. throw new exceptions_1.BaseException("Component \"" + lang_1.getTypeNameForDebugging(parentComponent) + "\" has no route named \"" + routeName + "\".");
  32238. }
  32239. if (!lang_1.isPresent(routeRecognizer.handler.componentType)) {
  32240. var compInstruction = routeRecognizer.generateComponentPathValues(params);
  32241. return new instruction_1.UnresolvedInstruction(function () {
  32242. return routeRecognizer.handler.resolveComponentType().then(function (_) { return _this._generate(linkParams, ancestorInstructions, _aux); });
  32243. }, compInstruction['urlPath'], compInstruction['urlParams']);
  32244. }
  32245. var componentInstruction = _aux ? componentRecognizer.generateAuxiliary(routeName, params) :
  32246. componentRecognizer.generate(routeName, params);
  32247. var remaining = linkParams.slice(linkIndex + 1);
  32248. var instruction = new instruction_1.ResolvedInstruction(componentInstruction, null, auxInstructions);
  32249. // the component is sync
  32250. if (lang_1.isPresent(componentInstruction.componentType)) {
  32251. var childInstruction = null;
  32252. if (linkIndex + 1 < linkParams.length) {
  32253. var childAncestorComponents = ancestorInstructions.concat([instruction]);
  32254. childInstruction = this._generate(remaining, childAncestorComponents);
  32255. }
  32256. else if (!componentInstruction.terminal) {
  32257. // ... look for defaults
  32258. childInstruction = this.generateDefault(componentInstruction.componentType);
  32259. if (lang_1.isBlank(childInstruction)) {
  32260. throw new exceptions_1.BaseException("Link \"" + collection_1.ListWrapper.toJSON(linkParams) + "\" does not resolve to a terminal instruction.");
  32261. }
  32262. }
  32263. instruction.child = childInstruction;
  32264. }
  32265. return instruction;
  32266. };
  32267. RouteRegistry.prototype.hasRoute = function (name, parentComponent) {
  32268. var componentRecognizer = this._rules.get(parentComponent);
  32269. if (lang_1.isBlank(componentRecognizer)) {
  32270. return false;
  32271. }
  32272. return componentRecognizer.hasRoute(name);
  32273. };
  32274. RouteRegistry.prototype.generateDefault = function (componentCursor) {
  32275. var _this = this;
  32276. if (lang_1.isBlank(componentCursor)) {
  32277. return null;
  32278. }
  32279. var componentRecognizer = this._rules.get(componentCursor);
  32280. if (lang_1.isBlank(componentRecognizer) || lang_1.isBlank(componentRecognizer.defaultRoute)) {
  32281. return null;
  32282. }
  32283. var defaultChild = null;
  32284. if (lang_1.isPresent(componentRecognizer.defaultRoute.handler.componentType)) {
  32285. var componentInstruction = componentRecognizer.defaultRoute.generate({});
  32286. if (!componentRecognizer.defaultRoute.terminal) {
  32287. defaultChild = this.generateDefault(componentRecognizer.defaultRoute.handler.componentType);
  32288. }
  32289. return new instruction_1.DefaultInstruction(componentInstruction, defaultChild);
  32290. }
  32291. return new instruction_1.UnresolvedInstruction(function () {
  32292. return componentRecognizer.defaultRoute.handler.resolveComponentType().then(function (_) { return _this.generateDefault(componentCursor); });
  32293. });
  32294. };
  32295. RouteRegistry = __decorate([
  32296. core_1.Injectable(),
  32297. __param(0, core_1.Inject(exports.ROUTER_PRIMARY_COMPONENT)),
  32298. __metadata('design:paramtypes', [lang_1.Type])
  32299. ], RouteRegistry);
  32300. return RouteRegistry;
  32301. })();
  32302. exports.RouteRegistry = RouteRegistry;
  32303. /*
  32304. * Given: ['/a/b', {c: 2}]
  32305. * Returns: ['', 'a', 'b', {c: 2}]
  32306. */
  32307. function splitAndFlattenLinkParams(linkParams) {
  32308. return linkParams.reduce(function (accumulation, item) {
  32309. if (lang_1.isString(item)) {
  32310. var strItem = item;
  32311. return accumulation.concat(strItem.split('/'));
  32312. }
  32313. accumulation.push(item);
  32314. return accumulation;
  32315. }, []);
  32316. }
  32317. /*
  32318. * Given a list of instructions, returns the most specific instruction
  32319. */
  32320. function mostSpecific(instructions) {
  32321. return collection_1.ListWrapper.maximum(instructions, function (instruction) { return instruction.specificity; });
  32322. }
  32323. function assertTerminalComponent(component, path) {
  32324. if (!lang_1.isType(component)) {
  32325. return;
  32326. }
  32327. var annotations = reflection_1.reflector.annotations(component);
  32328. if (lang_1.isPresent(annotations)) {
  32329. for (var i = 0; i < annotations.length; i++) {
  32330. var annotation = annotations[i];
  32331. if (annotation instanceof route_config_impl_1.RouteConfig) {
  32332. throw new exceptions_1.BaseException("Child routes are not allowed for \"" + path + "\". Use \"...\" on the parent's route path.");
  32333. }
  32334. }
  32335. }
  32336. }
  32337. /***/ },
  32338. /* 227 */
  32339. /***/ function(module, exports, __webpack_require__) {
  32340. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  32341. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  32342. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  32343. 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;
  32344. return c > 3 && r && Object.defineProperty(target, key, r), r;
  32345. };
  32346. var __metadata = (this && this.__metadata) || function (k, v) {
  32347. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  32348. };
  32349. var lang_1 = __webpack_require__(5);
  32350. /**
  32351. * The `RouteConfig` decorator defines routes for a given component.
  32352. *
  32353. * It takes an array of {@link RouteDefinition}s.
  32354. */
  32355. var RouteConfig = (function () {
  32356. function RouteConfig(configs) {
  32357. this.configs = configs;
  32358. }
  32359. RouteConfig = __decorate([
  32360. lang_1.CONST(),
  32361. __metadata('design:paramtypes', [Array])
  32362. ], RouteConfig);
  32363. return RouteConfig;
  32364. })();
  32365. exports.RouteConfig = RouteConfig;
  32366. /**
  32367. * `Route` is a type of {@link RouteDefinition} used to route a path to a component.
  32368. *
  32369. * It has the following properties:
  32370. * - `path` is a string that uses the route matcher DSL.
  32371. * - `component` a component type.
  32372. * - `name` is an optional `CamelCase` string representing the name of the route.
  32373. * - `data` is an optional property of any type representing arbitrary route metadata for the given
  32374. * route. It is injectable via {@link RouteData}.
  32375. * - `useAsDefault` is a boolean value. If `true`, the child route will be navigated to if no child
  32376. * route is specified during the navigation.
  32377. *
  32378. * ### Example
  32379. * ```
  32380. * import {RouteConfig} from 'angular2/router';
  32381. *
  32382. * @RouteConfig([
  32383. * {path: '/home', component: HomeCmp, name: 'HomeCmp' }
  32384. * ])
  32385. * class MyApp {}
  32386. * ```
  32387. */
  32388. var Route = (function () {
  32389. function Route(_a) {
  32390. var path = _a.path, component = _a.component, name = _a.name, data = _a.data, useAsDefault = _a.useAsDefault;
  32391. // added next three properties to work around https://github.com/Microsoft/TypeScript/issues/4107
  32392. this.aux = null;
  32393. this.loader = null;
  32394. this.redirectTo = null;
  32395. this.path = path;
  32396. this.component = component;
  32397. this.name = name;
  32398. this.data = data;
  32399. this.useAsDefault = useAsDefault;
  32400. }
  32401. Route = __decorate([
  32402. lang_1.CONST(),
  32403. __metadata('design:paramtypes', [Object])
  32404. ], Route);
  32405. return Route;
  32406. })();
  32407. exports.Route = Route;
  32408. /**
  32409. * `AuxRoute` is a type of {@link RouteDefinition} used to define an auxiliary route.
  32410. *
  32411. * It takes an object with the following properties:
  32412. * - `path` is a string that uses the route matcher DSL.
  32413. * - `component` a component type.
  32414. * - `name` is an optional `CamelCase` string representing the name of the route.
  32415. * - `data` is an optional property of any type representing arbitrary route metadata for the given
  32416. * route. It is injectable via {@link RouteData}.
  32417. *
  32418. * ### Example
  32419. * ```
  32420. * import {RouteConfig, AuxRoute} from 'angular2/router';
  32421. *
  32422. * @RouteConfig([
  32423. * new AuxRoute({path: '/home', component: HomeCmp})
  32424. * ])
  32425. * class MyApp {}
  32426. * ```
  32427. */
  32428. var AuxRoute = (function () {
  32429. function AuxRoute(_a) {
  32430. var path = _a.path, component = _a.component, name = _a.name;
  32431. this.data = null;
  32432. // added next three properties to work around https://github.com/Microsoft/TypeScript/issues/4107
  32433. this.aux = null;
  32434. this.loader = null;
  32435. this.redirectTo = null;
  32436. this.useAsDefault = false;
  32437. this.path = path;
  32438. this.component = component;
  32439. this.name = name;
  32440. }
  32441. AuxRoute = __decorate([
  32442. lang_1.CONST(),
  32443. __metadata('design:paramtypes', [Object])
  32444. ], AuxRoute);
  32445. return AuxRoute;
  32446. })();
  32447. exports.AuxRoute = AuxRoute;
  32448. /**
  32449. * `AsyncRoute` is a type of {@link RouteDefinition} used to route a path to an asynchronously
  32450. * loaded component.
  32451. *
  32452. * It has the following properties:
  32453. * - `path` is a string that uses the route matcher DSL.
  32454. * - `loader` is a function that returns a promise that resolves to a component.
  32455. * - `name` is an optional `CamelCase` string representing the name of the route.
  32456. * - `data` is an optional property of any type representing arbitrary route metadata for the given
  32457. * route. It is injectable via {@link RouteData}.
  32458. * - `useAsDefault` is a boolean value. If `true`, the child route will be navigated to if no child
  32459. * route is specified during the navigation.
  32460. *
  32461. * ### Example
  32462. * ```
  32463. * import {RouteConfig} from 'angular2/router';
  32464. *
  32465. * @RouteConfig([
  32466. * {path: '/home', loader: () => Promise.resolve(MyLoadedCmp), name: 'MyLoadedCmp'}
  32467. * ])
  32468. * class MyApp {}
  32469. * ```
  32470. */
  32471. var AsyncRoute = (function () {
  32472. function AsyncRoute(_a) {
  32473. var path = _a.path, loader = _a.loader, name = _a.name, data = _a.data, useAsDefault = _a.useAsDefault;
  32474. this.aux = null;
  32475. this.path = path;
  32476. this.loader = loader;
  32477. this.name = name;
  32478. this.data = data;
  32479. this.useAsDefault = useAsDefault;
  32480. }
  32481. AsyncRoute = __decorate([
  32482. lang_1.CONST(),
  32483. __metadata('design:paramtypes', [Object])
  32484. ], AsyncRoute);
  32485. return AsyncRoute;
  32486. })();
  32487. exports.AsyncRoute = AsyncRoute;
  32488. /**
  32489. * `Redirect` is a type of {@link RouteDefinition} used to route a path to a canonical route.
  32490. *
  32491. * It has the following properties:
  32492. * - `path` is a string that uses the route matcher DSL.
  32493. * - `redirectTo` is an array representing the link DSL.
  32494. *
  32495. * Note that redirects **do not** affect how links are generated. For that, see the `useAsDefault`
  32496. * option.
  32497. *
  32498. * ### Example
  32499. * ```
  32500. * import {RouteConfig} from 'angular2/router';
  32501. *
  32502. * @RouteConfig([
  32503. * {path: '/', redirectTo: ['/Home'] },
  32504. * {path: '/home', component: HomeCmp, name: 'Home'}
  32505. * ])
  32506. * class MyApp {}
  32507. * ```
  32508. */
  32509. var Redirect = (function () {
  32510. function Redirect(_a) {
  32511. var path = _a.path, redirectTo = _a.redirectTo;
  32512. this.name = null;
  32513. // added next three properties to work around https://github.com/Microsoft/TypeScript/issues/4107
  32514. this.loader = null;
  32515. this.data = null;
  32516. this.aux = null;
  32517. this.useAsDefault = false;
  32518. this.path = path;
  32519. this.redirectTo = redirectTo;
  32520. }
  32521. Redirect = __decorate([
  32522. lang_1.CONST(),
  32523. __metadata('design:paramtypes', [Object])
  32524. ], Redirect);
  32525. return Redirect;
  32526. })();
  32527. exports.Redirect = Redirect;
  32528. /***/ },
  32529. /* 228 */
  32530. /***/ function(module, exports, __webpack_require__) {
  32531. var __extends = (this && this.__extends) || function (d, b) {
  32532. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  32533. function __() { this.constructor = d; }
  32534. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  32535. };
  32536. var lang_1 = __webpack_require__(5);
  32537. var exceptions_1 = __webpack_require__(14);
  32538. var promise_1 = __webpack_require__(61);
  32539. var collection_1 = __webpack_require__(12);
  32540. var instruction_1 = __webpack_require__(229);
  32541. var path_recognizer_1 = __webpack_require__(230);
  32542. var RouteMatch = (function () {
  32543. function RouteMatch() {
  32544. }
  32545. return RouteMatch;
  32546. })();
  32547. exports.RouteMatch = RouteMatch;
  32548. var PathMatch = (function (_super) {
  32549. __extends(PathMatch, _super);
  32550. function PathMatch(instruction, remaining, remainingAux) {
  32551. _super.call(this);
  32552. this.instruction = instruction;
  32553. this.remaining = remaining;
  32554. this.remainingAux = remainingAux;
  32555. }
  32556. return PathMatch;
  32557. })(RouteMatch);
  32558. exports.PathMatch = PathMatch;
  32559. var RedirectMatch = (function (_super) {
  32560. __extends(RedirectMatch, _super);
  32561. function RedirectMatch(redirectTo, specificity) {
  32562. _super.call(this);
  32563. this.redirectTo = redirectTo;
  32564. this.specificity = specificity;
  32565. }
  32566. return RedirectMatch;
  32567. })(RouteMatch);
  32568. exports.RedirectMatch = RedirectMatch;
  32569. var RedirectRecognizer = (function () {
  32570. function RedirectRecognizer(path, redirectTo) {
  32571. this.path = path;
  32572. this.redirectTo = redirectTo;
  32573. this._pathRecognizer = new path_recognizer_1.PathRecognizer(path);
  32574. this.hash = this._pathRecognizer.hash;
  32575. }
  32576. /**
  32577. * Returns `null` or a `ParsedUrl` representing the new path to match
  32578. */
  32579. RedirectRecognizer.prototype.recognize = function (beginningSegment) {
  32580. var match = null;
  32581. if (lang_1.isPresent(this._pathRecognizer.recognize(beginningSegment))) {
  32582. match = new RedirectMatch(this.redirectTo, this._pathRecognizer.specificity);
  32583. }
  32584. return promise_1.PromiseWrapper.resolve(match);
  32585. };
  32586. RedirectRecognizer.prototype.generate = function (params) {
  32587. throw new exceptions_1.BaseException("Tried to generate a redirect.");
  32588. };
  32589. return RedirectRecognizer;
  32590. })();
  32591. exports.RedirectRecognizer = RedirectRecognizer;
  32592. // represents something like '/foo/:bar'
  32593. var RouteRecognizer = (function () {
  32594. // TODO: cache component instruction instances by params and by ParsedUrl instance
  32595. function RouteRecognizer(path, handler) {
  32596. this.path = path;
  32597. this.handler = handler;
  32598. this.terminal = true;
  32599. this._cache = new collection_1.Map();
  32600. this._pathRecognizer = new path_recognizer_1.PathRecognizer(path);
  32601. this.specificity = this._pathRecognizer.specificity;
  32602. this.hash = this._pathRecognizer.hash;
  32603. this.terminal = this._pathRecognizer.terminal;
  32604. }
  32605. RouteRecognizer.prototype.recognize = function (beginningSegment) {
  32606. var _this = this;
  32607. var res = this._pathRecognizer.recognize(beginningSegment);
  32608. if (lang_1.isBlank(res)) {
  32609. return null;
  32610. }
  32611. return this.handler.resolveComponentType().then(function (_) {
  32612. var componentInstruction = _this._getInstruction(res['urlPath'], res['urlParams'], res['allParams']);
  32613. return new PathMatch(componentInstruction, res['nextSegment'], res['auxiliary']);
  32614. });
  32615. };
  32616. RouteRecognizer.prototype.generate = function (params) {
  32617. var generated = this._pathRecognizer.generate(params);
  32618. var urlPath = generated['urlPath'];
  32619. var urlParams = generated['urlParams'];
  32620. return this._getInstruction(urlPath, urlParams, params);
  32621. };
  32622. RouteRecognizer.prototype.generateComponentPathValues = function (params) {
  32623. return this._pathRecognizer.generate(params);
  32624. };
  32625. RouteRecognizer.prototype._getInstruction = function (urlPath, urlParams, params) {
  32626. if (lang_1.isBlank(this.handler.componentType)) {
  32627. throw new exceptions_1.BaseException("Tried to get instruction before the type was loaded.");
  32628. }
  32629. var hashKey = urlPath + '?' + urlParams.join('?');
  32630. if (this._cache.has(hashKey)) {
  32631. return this._cache.get(hashKey);
  32632. }
  32633. var instruction = new instruction_1.ComponentInstruction(urlPath, urlParams, this.handler.data, this.handler.componentType, this.terminal, this.specificity, params);
  32634. this._cache.set(hashKey, instruction);
  32635. return instruction;
  32636. };
  32637. return RouteRecognizer;
  32638. })();
  32639. exports.RouteRecognizer = RouteRecognizer;
  32640. /***/ },
  32641. /* 229 */
  32642. /***/ function(module, exports, __webpack_require__) {
  32643. var __extends = (this && this.__extends) || function (d, b) {
  32644. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  32645. function __() { this.constructor = d; }
  32646. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  32647. };
  32648. var collection_1 = __webpack_require__(12);
  32649. var lang_1 = __webpack_require__(5);
  32650. var async_1 = __webpack_require__(60);
  32651. /**
  32652. * `RouteParams` is an immutable map of parameters for the given route
  32653. * based on the url matcher and optional parameters for that route.
  32654. *
  32655. * You can inject `RouteParams` into the constructor of a component to use it.
  32656. *
  32657. * ### Example
  32658. *
  32659. * ```
  32660. * import {Component} from 'angular2/core';
  32661. * import {bootstrap} from 'angular2/platform/browser';
  32662. * import {Router, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
  32663. *
  32664. * @Component({directives: [ROUTER_DIRECTIVES]})
  32665. * @RouteConfig([
  32666. * {path: '/user/:id', component: UserCmp, as: 'UserCmp'},
  32667. * ])
  32668. * class AppCmp {}
  32669. *
  32670. * @Component({ template: 'user: {{id}}' })
  32671. * class UserCmp {
  32672. * id: string;
  32673. * constructor(params: RouteParams) {
  32674. * this.id = params.get('id');
  32675. * }
  32676. * }
  32677. *
  32678. * bootstrap(AppCmp, ROUTER_PROVIDERS);
  32679. * ```
  32680. */
  32681. var RouteParams = (function () {
  32682. function RouteParams(params) {
  32683. this.params = params;
  32684. }
  32685. RouteParams.prototype.get = function (param) { return lang_1.normalizeBlank(collection_1.StringMapWrapper.get(this.params, param)); };
  32686. return RouteParams;
  32687. })();
  32688. exports.RouteParams = RouteParams;
  32689. /**
  32690. * `RouteData` is an immutable map of additional data you can configure in your {@link Route}.
  32691. *
  32692. * You can inject `RouteData` into the constructor of a component to use it.
  32693. *
  32694. * ### Example
  32695. *
  32696. * ```
  32697. * import {Component, View} from 'angular2/core';
  32698. * import {bootstrap} from 'angular2/platform/browser';
  32699. * import {Router, ROUTER_DIRECTIVES, routerBindings, RouteConfig} from 'angular2/router';
  32700. *
  32701. * @Component({...})
  32702. * @View({directives: [ROUTER_DIRECTIVES]})
  32703. * @RouteConfig([
  32704. * {path: '/user/:id', component: UserCmp, as: 'UserCmp', data: {isAdmin: true}},
  32705. * ])
  32706. * class AppCmp {}
  32707. *
  32708. * @Component({...})
  32709. * @View({ template: 'user: {{isAdmin}}' })
  32710. * class UserCmp {
  32711. * string: isAdmin;
  32712. * constructor(data: RouteData) {
  32713. * this.isAdmin = data.get('isAdmin');
  32714. * }
  32715. * }
  32716. *
  32717. * bootstrap(AppCmp, routerBindings(AppCmp));
  32718. * ```
  32719. */
  32720. var RouteData = (function () {
  32721. function RouteData(data) {
  32722. if (data === void 0) { data = lang_1.CONST_EXPR({}); }
  32723. this.data = data;
  32724. }
  32725. RouteData.prototype.get = function (key) { return lang_1.normalizeBlank(collection_1.StringMapWrapper.get(this.data, key)); };
  32726. return RouteData;
  32727. })();
  32728. exports.RouteData = RouteData;
  32729. exports.BLANK_ROUTE_DATA = new RouteData();
  32730. /**
  32731. * `Instruction` is a tree of {@link ComponentInstruction}s with all the information needed
  32732. * to transition each component in the app to a given route, including all auxiliary routes.
  32733. *
  32734. * `Instruction`s can be created using {@link Router#generate}, and can be used to
  32735. * perform route changes with {@link Router#navigateByInstruction}.
  32736. *
  32737. * ### Example
  32738. *
  32739. * ```
  32740. * import {Component} from 'angular2/core';
  32741. * import {bootstrap} from 'angular2/platform/browser';
  32742. * import {Router, ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
  32743. *
  32744. * @Component({directives: [ROUTER_DIRECTIVES]})
  32745. * @RouteConfig([
  32746. * {...},
  32747. * ])
  32748. * class AppCmp {
  32749. * constructor(router: Router) {
  32750. * var instruction = router.generate(['/MyRoute']);
  32751. * router.navigateByInstruction(instruction);
  32752. * }
  32753. * }
  32754. *
  32755. * bootstrap(AppCmp, ROUTER_PROVIDERS);
  32756. * ```
  32757. */
  32758. var Instruction = (function () {
  32759. function Instruction() {
  32760. this.auxInstruction = {};
  32761. }
  32762. Object.defineProperty(Instruction.prototype, "urlPath", {
  32763. get: function () { return this.component.urlPath; },
  32764. enumerable: true,
  32765. configurable: true
  32766. });
  32767. Object.defineProperty(Instruction.prototype, "urlParams", {
  32768. get: function () { return this.component.urlParams; },
  32769. enumerable: true,
  32770. configurable: true
  32771. });
  32772. Object.defineProperty(Instruction.prototype, "specificity", {
  32773. get: function () {
  32774. var total = 0;
  32775. if (lang_1.isPresent(this.component)) {
  32776. total += this.component.specificity;
  32777. }
  32778. if (lang_1.isPresent(this.child)) {
  32779. total += this.child.specificity;
  32780. }
  32781. return total;
  32782. },
  32783. enumerable: true,
  32784. configurable: true
  32785. });
  32786. /**
  32787. * converts the instruction into a URL string
  32788. */
  32789. Instruction.prototype.toRootUrl = function () { return this.toUrlPath() + this.toUrlQuery(); };
  32790. /** @internal */
  32791. Instruction.prototype._toNonRootUrl = function () {
  32792. return this._stringifyPathMatrixAuxPrefixed() +
  32793. (lang_1.isPresent(this.child) ? this.child._toNonRootUrl() : '');
  32794. };
  32795. Instruction.prototype.toUrlQuery = function () { return this.urlParams.length > 0 ? ('?' + this.urlParams.join('&')) : ''; };
  32796. /**
  32797. * Returns a new instruction that shares the state of the existing instruction, but with
  32798. * the given child {@link Instruction} replacing the existing child.
  32799. */
  32800. Instruction.prototype.replaceChild = function (child) {
  32801. return new ResolvedInstruction(this.component, child, this.auxInstruction);
  32802. };
  32803. /**
  32804. * If the final URL for the instruction is ``
  32805. */
  32806. Instruction.prototype.toUrlPath = function () {
  32807. return this.urlPath + this._stringifyAux() +
  32808. (lang_1.isPresent(this.child) ? this.child._toNonRootUrl() : '');
  32809. };
  32810. // default instructions override these
  32811. Instruction.prototype.toLinkUrl = function () {
  32812. return this.urlPath + this._stringifyAux() +
  32813. (lang_1.isPresent(this.child) ? this.child._toLinkUrl() : '');
  32814. };
  32815. // this is the non-root version (called recursively)
  32816. /** @internal */
  32817. Instruction.prototype._toLinkUrl = function () {
  32818. return this._stringifyPathMatrixAuxPrefixed() +
  32819. (lang_1.isPresent(this.child) ? this.child._toLinkUrl() : '');
  32820. };
  32821. /** @internal */
  32822. Instruction.prototype._stringifyPathMatrixAuxPrefixed = function () {
  32823. var primary = this._stringifyPathMatrixAux();
  32824. if (primary.length > 0) {
  32825. primary = '/' + primary;
  32826. }
  32827. return primary;
  32828. };
  32829. /** @internal */
  32830. Instruction.prototype._stringifyMatrixParams = function () {
  32831. return this.urlParams.length > 0 ? (';' + this.component.urlParams.join(';')) : '';
  32832. };
  32833. /** @internal */
  32834. Instruction.prototype._stringifyPathMatrixAux = function () {
  32835. if (lang_1.isBlank(this.component)) {
  32836. return '';
  32837. }
  32838. return this.urlPath + this._stringifyMatrixParams() + this._stringifyAux();
  32839. };
  32840. /** @internal */
  32841. Instruction.prototype._stringifyAux = function () {
  32842. var routes = [];
  32843. collection_1.StringMapWrapper.forEach(this.auxInstruction, function (auxInstruction, _) {
  32844. routes.push(auxInstruction._stringifyPathMatrixAux());
  32845. });
  32846. if (routes.length > 0) {
  32847. return '(' + routes.join('//') + ')';
  32848. }
  32849. return '';
  32850. };
  32851. return Instruction;
  32852. })();
  32853. exports.Instruction = Instruction;
  32854. /**
  32855. * a resolved instruction has an outlet instruction for itself, but maybe not for...
  32856. */
  32857. var ResolvedInstruction = (function (_super) {
  32858. __extends(ResolvedInstruction, _super);
  32859. function ResolvedInstruction(component, child, auxInstruction) {
  32860. _super.call(this);
  32861. this.component = component;
  32862. this.child = child;
  32863. this.auxInstruction = auxInstruction;
  32864. }
  32865. ResolvedInstruction.prototype.resolveComponent = function () {
  32866. return async_1.PromiseWrapper.resolve(this.component);
  32867. };
  32868. return ResolvedInstruction;
  32869. })(Instruction);
  32870. exports.ResolvedInstruction = ResolvedInstruction;
  32871. /**
  32872. * Represents a resolved default route
  32873. */
  32874. var DefaultInstruction = (function (_super) {
  32875. __extends(DefaultInstruction, _super);
  32876. function DefaultInstruction(component, child) {
  32877. _super.call(this);
  32878. this.component = component;
  32879. this.child = child;
  32880. }
  32881. DefaultInstruction.prototype.resolveComponent = function () {
  32882. return async_1.PromiseWrapper.resolve(this.component);
  32883. };
  32884. DefaultInstruction.prototype.toLinkUrl = function () { return ''; };
  32885. /** @internal */
  32886. DefaultInstruction.prototype._toLinkUrl = function () { return ''; };
  32887. return DefaultInstruction;
  32888. })(Instruction);
  32889. exports.DefaultInstruction = DefaultInstruction;
  32890. /**
  32891. * Represents a component that may need to do some redirection or lazy loading at a later time.
  32892. */
  32893. var UnresolvedInstruction = (function (_super) {
  32894. __extends(UnresolvedInstruction, _super);
  32895. function UnresolvedInstruction(_resolver, _urlPath, _urlParams) {
  32896. if (_urlPath === void 0) { _urlPath = ''; }
  32897. if (_urlParams === void 0) { _urlParams = lang_1.CONST_EXPR([]); }
  32898. _super.call(this);
  32899. this._resolver = _resolver;
  32900. this._urlPath = _urlPath;
  32901. this._urlParams = _urlParams;
  32902. }
  32903. Object.defineProperty(UnresolvedInstruction.prototype, "urlPath", {
  32904. get: function () {
  32905. if (lang_1.isPresent(this.component)) {
  32906. return this.component.urlPath;
  32907. }
  32908. if (lang_1.isPresent(this._urlPath)) {
  32909. return this._urlPath;
  32910. }
  32911. return '';
  32912. },
  32913. enumerable: true,
  32914. configurable: true
  32915. });
  32916. Object.defineProperty(UnresolvedInstruction.prototype, "urlParams", {
  32917. get: function () {
  32918. if (lang_1.isPresent(this.component)) {
  32919. return this.component.urlParams;
  32920. }
  32921. if (lang_1.isPresent(this._urlParams)) {
  32922. return this._urlParams;
  32923. }
  32924. return [];
  32925. },
  32926. enumerable: true,
  32927. configurable: true
  32928. });
  32929. UnresolvedInstruction.prototype.resolveComponent = function () {
  32930. var _this = this;
  32931. if (lang_1.isPresent(this.component)) {
  32932. return async_1.PromiseWrapper.resolve(this.component);
  32933. }
  32934. return this._resolver().then(function (resolution) {
  32935. _this.child = resolution.child;
  32936. return _this.component = resolution.component;
  32937. });
  32938. };
  32939. return UnresolvedInstruction;
  32940. })(Instruction);
  32941. exports.UnresolvedInstruction = UnresolvedInstruction;
  32942. var RedirectInstruction = (function (_super) {
  32943. __extends(RedirectInstruction, _super);
  32944. function RedirectInstruction(component, child, auxInstruction) {
  32945. _super.call(this, component, child, auxInstruction);
  32946. }
  32947. return RedirectInstruction;
  32948. })(ResolvedInstruction);
  32949. exports.RedirectInstruction = RedirectInstruction;
  32950. /**
  32951. * A `ComponentInstruction` represents the route state for a single component. An `Instruction` is
  32952. * composed of a tree of these `ComponentInstruction`s.
  32953. *
  32954. * `ComponentInstructions` is a public API. Instances of `ComponentInstruction` are passed
  32955. * to route lifecycle hooks, like {@link CanActivate}.
  32956. *
  32957. * `ComponentInstruction`s are [https://en.wikipedia.org/wiki/Hash_consing](hash consed). You should
  32958. * never construct one yourself with "new." Instead, rely on {@link Router/RouteRecognizer} to
  32959. * construct `ComponentInstruction`s.
  32960. *
  32961. * You should not modify this object. It should be treated as immutable.
  32962. */
  32963. var ComponentInstruction = (function () {
  32964. function ComponentInstruction(urlPath, urlParams, data, componentType, terminal, specificity, params) {
  32965. if (params === void 0) { params = null; }
  32966. this.urlPath = urlPath;
  32967. this.urlParams = urlParams;
  32968. this.componentType = componentType;
  32969. this.terminal = terminal;
  32970. this.specificity = specificity;
  32971. this.params = params;
  32972. this.reuse = false;
  32973. this.routeData = lang_1.isPresent(data) ? data : exports.BLANK_ROUTE_DATA;
  32974. }
  32975. return ComponentInstruction;
  32976. })();
  32977. exports.ComponentInstruction = ComponentInstruction;
  32978. /***/ },
  32979. /* 230 */
  32980. /***/ function(module, exports, __webpack_require__) {
  32981. var lang_1 = __webpack_require__(5);
  32982. var exceptions_1 = __webpack_require__(14);
  32983. var collection_1 = __webpack_require__(12);
  32984. var url_parser_1 = __webpack_require__(231);
  32985. var TouchMap = (function () {
  32986. function TouchMap(map) {
  32987. var _this = this;
  32988. this.map = {};
  32989. this.keys = {};
  32990. if (lang_1.isPresent(map)) {
  32991. collection_1.StringMapWrapper.forEach(map, function (value, key) {
  32992. _this.map[key] = lang_1.isPresent(value) ? value.toString() : null;
  32993. _this.keys[key] = true;
  32994. });
  32995. }
  32996. }
  32997. TouchMap.prototype.get = function (key) {
  32998. collection_1.StringMapWrapper.delete(this.keys, key);
  32999. return this.map[key];
  33000. };
  33001. TouchMap.prototype.getUnused = function () {
  33002. var _this = this;
  33003. var unused = {};
  33004. var keys = collection_1.StringMapWrapper.keys(this.keys);
  33005. keys.forEach(function (key) { return unused[key] = collection_1.StringMapWrapper.get(_this.map, key); });
  33006. return unused;
  33007. };
  33008. return TouchMap;
  33009. })();
  33010. function normalizeString(obj) {
  33011. if (lang_1.isBlank(obj)) {
  33012. return null;
  33013. }
  33014. else {
  33015. return obj.toString();
  33016. }
  33017. }
  33018. var ContinuationSegment = (function () {
  33019. function ContinuationSegment() {
  33020. this.name = '';
  33021. }
  33022. ContinuationSegment.prototype.generate = function (params) { return ''; };
  33023. ContinuationSegment.prototype.match = function (path) { return true; };
  33024. return ContinuationSegment;
  33025. })();
  33026. var StaticSegment = (function () {
  33027. function StaticSegment(path) {
  33028. this.path = path;
  33029. this.name = '';
  33030. }
  33031. StaticSegment.prototype.match = function (path) { return path == this.path; };
  33032. StaticSegment.prototype.generate = function (params) { return this.path; };
  33033. return StaticSegment;
  33034. })();
  33035. var DynamicSegment = (function () {
  33036. function DynamicSegment(name) {
  33037. this.name = name;
  33038. }
  33039. DynamicSegment.prototype.match = function (path) { return path.length > 0; };
  33040. DynamicSegment.prototype.generate = function (params) {
  33041. if (!collection_1.StringMapWrapper.contains(params.map, this.name)) {
  33042. throw new exceptions_1.BaseException("Route generator for '" + this.name + "' was not included in parameters passed.");
  33043. }
  33044. return normalizeString(params.get(this.name));
  33045. };
  33046. return DynamicSegment;
  33047. })();
  33048. var StarSegment = (function () {
  33049. function StarSegment(name) {
  33050. this.name = name;
  33051. }
  33052. StarSegment.prototype.match = function (path) { return true; };
  33053. StarSegment.prototype.generate = function (params) { return normalizeString(params.get(this.name)); };
  33054. return StarSegment;
  33055. })();
  33056. var paramMatcher = /^:([^\/]+)$/g;
  33057. var wildcardMatcher = /^\*([^\/]+)$/g;
  33058. function parsePathString(route) {
  33059. // normalize route as not starting with a "/". Recognition will
  33060. // also normalize.
  33061. if (route.startsWith("/")) {
  33062. route = route.substring(1);
  33063. }
  33064. var segments = splitBySlash(route);
  33065. var results = [];
  33066. var specificity = 0;
  33067. // The "specificity" of a path is used to determine which route is used when multiple routes match
  33068. // a URL.
  33069. // Static segments (like "/foo") are the most specific, followed by dynamic segments (like
  33070. // "/:id"). Star segments
  33071. // add no specificity. Segments at the start of the path are more specific than proceeding ones.
  33072. // The code below uses place values to combine the different types of segments into a single
  33073. // integer that we can
  33074. // sort later. Each static segment is worth hundreds of points of specificity (10000, 9900, ...,
  33075. // 200), and each
  33076. // dynamic segment is worth single points of specificity (100, 99, ... 2).
  33077. if (segments.length > 98) {
  33078. throw new exceptions_1.BaseException("'" + route + "' has more than the maximum supported number of segments.");
  33079. }
  33080. var limit = segments.length - 1;
  33081. for (var i = 0; i <= limit; i++) {
  33082. var segment = segments[i], match;
  33083. if (lang_1.isPresent(match = lang_1.RegExpWrapper.firstMatch(paramMatcher, segment))) {
  33084. results.push(new DynamicSegment(match[1]));
  33085. specificity += (100 - i);
  33086. }
  33087. else if (lang_1.isPresent(match = lang_1.RegExpWrapper.firstMatch(wildcardMatcher, segment))) {
  33088. results.push(new StarSegment(match[1]));
  33089. }
  33090. else if (segment == '...') {
  33091. if (i < limit) {
  33092. throw new exceptions_1.BaseException("Unexpected \"...\" before the end of the path for \"" + route + "\".");
  33093. }
  33094. results.push(new ContinuationSegment());
  33095. }
  33096. else {
  33097. results.push(new StaticSegment(segment));
  33098. specificity += 100 * (100 - i);
  33099. }
  33100. }
  33101. var result = collection_1.StringMapWrapper.create();
  33102. collection_1.StringMapWrapper.set(result, 'segments', results);
  33103. collection_1.StringMapWrapper.set(result, 'specificity', specificity);
  33104. return result;
  33105. }
  33106. // this function is used to determine whether a route config path like `/foo/:id` collides with
  33107. // `/foo/:name`
  33108. function pathDslHash(segments) {
  33109. return segments.map(function (segment) {
  33110. if (segment instanceof StarSegment) {
  33111. return '*';
  33112. }
  33113. else if (segment instanceof ContinuationSegment) {
  33114. return '...';
  33115. }
  33116. else if (segment instanceof DynamicSegment) {
  33117. return ':';
  33118. }
  33119. else if (segment instanceof StaticSegment) {
  33120. return segment.path;
  33121. }
  33122. })
  33123. .join('/');
  33124. }
  33125. function splitBySlash(url) {
  33126. return url.split('/');
  33127. }
  33128. var RESERVED_CHARS = lang_1.RegExpWrapper.create('//|\\(|\\)|;|\\?|=');
  33129. function assertPath(path) {
  33130. if (lang_1.StringWrapper.contains(path, '#')) {
  33131. throw new exceptions_1.BaseException("Path \"" + path + "\" should not include \"#\". Use \"HashLocationStrategy\" instead.");
  33132. }
  33133. var illegalCharacter = lang_1.RegExpWrapper.firstMatch(RESERVED_CHARS, path);
  33134. if (lang_1.isPresent(illegalCharacter)) {
  33135. throw new exceptions_1.BaseException("Path \"" + path + "\" contains \"" + illegalCharacter[0] + "\" which is not allowed in a route config.");
  33136. }
  33137. }
  33138. /**
  33139. * Parses a URL string using a given matcher DSL, and generates URLs from param maps
  33140. */
  33141. var PathRecognizer = (function () {
  33142. function PathRecognizer(path) {
  33143. this.path = path;
  33144. this.terminal = true;
  33145. assertPath(path);
  33146. var parsed = parsePathString(path);
  33147. this._segments = parsed['segments'];
  33148. this.specificity = parsed['specificity'];
  33149. this.hash = pathDslHash(this._segments);
  33150. var lastSegment = this._segments[this._segments.length - 1];
  33151. this.terminal = !(lastSegment instanceof ContinuationSegment);
  33152. }
  33153. PathRecognizer.prototype.recognize = function (beginningSegment) {
  33154. var nextSegment = beginningSegment;
  33155. var currentSegment;
  33156. var positionalParams = {};
  33157. var captured = [];
  33158. for (var i = 0; i < this._segments.length; i += 1) {
  33159. var segment = this._segments[i];
  33160. currentSegment = nextSegment;
  33161. if (segment instanceof ContinuationSegment) {
  33162. break;
  33163. }
  33164. if (lang_1.isPresent(currentSegment)) {
  33165. captured.push(currentSegment.path);
  33166. // the star segment consumes all of the remaining URL, including matrix params
  33167. if (segment instanceof StarSegment) {
  33168. positionalParams[segment.name] = currentSegment.toString();
  33169. nextSegment = null;
  33170. break;
  33171. }
  33172. if (segment instanceof DynamicSegment) {
  33173. positionalParams[segment.name] = currentSegment.path;
  33174. }
  33175. else if (!segment.match(currentSegment.path)) {
  33176. return null;
  33177. }
  33178. nextSegment = currentSegment.child;
  33179. }
  33180. else if (!segment.match('')) {
  33181. return null;
  33182. }
  33183. }
  33184. if (this.terminal && lang_1.isPresent(nextSegment)) {
  33185. return null;
  33186. }
  33187. var urlPath = captured.join('/');
  33188. var auxiliary;
  33189. var urlParams;
  33190. var allParams;
  33191. if (lang_1.isPresent(currentSegment)) {
  33192. // If this is the root component, read query params. Otherwise, read matrix params.
  33193. var paramsSegment = beginningSegment instanceof url_parser_1.RootUrl ? beginningSegment : currentSegment;
  33194. allParams = lang_1.isPresent(paramsSegment.params) ?
  33195. collection_1.StringMapWrapper.merge(paramsSegment.params, positionalParams) :
  33196. positionalParams;
  33197. urlParams = url_parser_1.serializeParams(paramsSegment.params);
  33198. auxiliary = currentSegment.auxiliary;
  33199. }
  33200. else {
  33201. allParams = positionalParams;
  33202. auxiliary = [];
  33203. urlParams = [];
  33204. }
  33205. return { urlPath: urlPath, urlParams: urlParams, allParams: allParams, auxiliary: auxiliary, nextSegment: nextSegment };
  33206. };
  33207. PathRecognizer.prototype.generate = function (params) {
  33208. var paramTokens = new TouchMap(params);
  33209. var path = [];
  33210. for (var i = 0; i < this._segments.length; i++) {
  33211. var segment = this._segments[i];
  33212. if (!(segment instanceof ContinuationSegment)) {
  33213. path.push(segment.generate(paramTokens));
  33214. }
  33215. }
  33216. var urlPath = path.join('/');
  33217. var nonPositionalParams = paramTokens.getUnused();
  33218. var urlParams = url_parser_1.serializeParams(nonPositionalParams);
  33219. return { urlPath: urlPath, urlParams: urlParams };
  33220. };
  33221. return PathRecognizer;
  33222. })();
  33223. exports.PathRecognizer = PathRecognizer;
  33224. /***/ },
  33225. /* 231 */
  33226. /***/ function(module, exports, __webpack_require__) {
  33227. var __extends = (this && this.__extends) || function (d, b) {
  33228. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  33229. function __() { this.constructor = d; }
  33230. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  33231. };
  33232. var collection_1 = __webpack_require__(12);
  33233. var lang_1 = __webpack_require__(5);
  33234. var exceptions_1 = __webpack_require__(14);
  33235. /**
  33236. * This class represents a parsed URL
  33237. */
  33238. var Url = (function () {
  33239. function Url(path, child, auxiliary, params) {
  33240. if (child === void 0) { child = null; }
  33241. if (auxiliary === void 0) { auxiliary = lang_1.CONST_EXPR([]); }
  33242. if (params === void 0) { params = null; }
  33243. this.path = path;
  33244. this.child = child;
  33245. this.auxiliary = auxiliary;
  33246. this.params = params;
  33247. }
  33248. Url.prototype.toString = function () {
  33249. return this.path + this._matrixParamsToString() + this._auxToString() + this._childString();
  33250. };
  33251. Url.prototype.segmentToString = function () { return this.path + this._matrixParamsToString(); };
  33252. /** @internal */
  33253. Url.prototype._auxToString = function () {
  33254. return this.auxiliary.length > 0 ?
  33255. ('(' + this.auxiliary.map(function (sibling) { return sibling.toString(); }).join('//') + ')') :
  33256. '';
  33257. };
  33258. Url.prototype._matrixParamsToString = function () {
  33259. if (lang_1.isBlank(this.params)) {
  33260. return '';
  33261. }
  33262. return ';' + serializeParams(this.params).join(';');
  33263. };
  33264. /** @internal */
  33265. Url.prototype._childString = function () { return lang_1.isPresent(this.child) ? ('/' + this.child.toString()) : ''; };
  33266. return Url;
  33267. })();
  33268. exports.Url = Url;
  33269. var RootUrl = (function (_super) {
  33270. __extends(RootUrl, _super);
  33271. function RootUrl(path, child, auxiliary, params) {
  33272. if (child === void 0) { child = null; }
  33273. if (auxiliary === void 0) { auxiliary = lang_1.CONST_EXPR([]); }
  33274. if (params === void 0) { params = null; }
  33275. _super.call(this, path, child, auxiliary, params);
  33276. }
  33277. RootUrl.prototype.toString = function () {
  33278. return this.path + this._auxToString() + this._childString() + this._queryParamsToString();
  33279. };
  33280. RootUrl.prototype.segmentToString = function () { return this.path + this._queryParamsToString(); };
  33281. RootUrl.prototype._queryParamsToString = function () {
  33282. if (lang_1.isBlank(this.params)) {
  33283. return '';
  33284. }
  33285. return '?' + serializeParams(this.params).join('&');
  33286. };
  33287. return RootUrl;
  33288. })(Url);
  33289. exports.RootUrl = RootUrl;
  33290. function pathSegmentsToUrl(pathSegments) {
  33291. var url = new Url(pathSegments[pathSegments.length - 1]);
  33292. for (var i = pathSegments.length - 2; i >= 0; i -= 1) {
  33293. url = new Url(pathSegments[i], url);
  33294. }
  33295. return url;
  33296. }
  33297. exports.pathSegmentsToUrl = pathSegmentsToUrl;
  33298. var SEGMENT_RE = lang_1.RegExpWrapper.create('^[^\\/\\(\\)\\?;=&#]+');
  33299. function matchUrlSegment(str) {
  33300. var match = lang_1.RegExpWrapper.firstMatch(SEGMENT_RE, str);
  33301. return lang_1.isPresent(match) ? match[0] : '';
  33302. }
  33303. var UrlParser = (function () {
  33304. function UrlParser() {
  33305. }
  33306. UrlParser.prototype.peekStartsWith = function (str) { return this._remaining.startsWith(str); };
  33307. UrlParser.prototype.capture = function (str) {
  33308. if (!this._remaining.startsWith(str)) {
  33309. throw new exceptions_1.BaseException("Expected \"" + str + "\".");
  33310. }
  33311. this._remaining = this._remaining.substring(str.length);
  33312. };
  33313. UrlParser.prototype.parse = function (url) {
  33314. this._remaining = url;
  33315. if (url == '' || url == '/') {
  33316. return new Url('');
  33317. }
  33318. return this.parseRoot();
  33319. };
  33320. // segment + (aux segments) + (query params)
  33321. UrlParser.prototype.parseRoot = function () {
  33322. if (this.peekStartsWith('/')) {
  33323. this.capture('/');
  33324. }
  33325. var path = matchUrlSegment(this._remaining);
  33326. this.capture(path);
  33327. var aux = [];
  33328. if (this.peekStartsWith('(')) {
  33329. aux = this.parseAuxiliaryRoutes();
  33330. }
  33331. if (this.peekStartsWith(';')) {
  33332. // TODO: should these params just be dropped?
  33333. this.parseMatrixParams();
  33334. }
  33335. var child = null;
  33336. if (this.peekStartsWith('/') && !this.peekStartsWith('//')) {
  33337. this.capture('/');
  33338. child = this.parseSegment();
  33339. }
  33340. var queryParams = null;
  33341. if (this.peekStartsWith('?')) {
  33342. queryParams = this.parseQueryParams();
  33343. }
  33344. return new RootUrl(path, child, aux, queryParams);
  33345. };
  33346. // segment + (matrix params) + (aux segments)
  33347. UrlParser.prototype.parseSegment = function () {
  33348. if (this._remaining.length == 0) {
  33349. return null;
  33350. }
  33351. if (this.peekStartsWith('/')) {
  33352. this.capture('/');
  33353. }
  33354. var path = matchUrlSegment(this._remaining);
  33355. this.capture(path);
  33356. var matrixParams = null;
  33357. if (this.peekStartsWith(';')) {
  33358. matrixParams = this.parseMatrixParams();
  33359. }
  33360. var aux = [];
  33361. if (this.peekStartsWith('(')) {
  33362. aux = this.parseAuxiliaryRoutes();
  33363. }
  33364. var child = null;
  33365. if (this.peekStartsWith('/') && !this.peekStartsWith('//')) {
  33366. this.capture('/');
  33367. child = this.parseSegment();
  33368. }
  33369. return new Url(path, child, aux, matrixParams);
  33370. };
  33371. UrlParser.prototype.parseQueryParams = function () {
  33372. var params = {};
  33373. this.capture('?');
  33374. this.parseParam(params);
  33375. while (this._remaining.length > 0 && this.peekStartsWith('&')) {
  33376. this.capture('&');
  33377. this.parseParam(params);
  33378. }
  33379. return params;
  33380. };
  33381. UrlParser.prototype.parseMatrixParams = function () {
  33382. var params = {};
  33383. while (this._remaining.length > 0 && this.peekStartsWith(';')) {
  33384. this.capture(';');
  33385. this.parseParam(params);
  33386. }
  33387. return params;
  33388. };
  33389. UrlParser.prototype.parseParam = function (params) {
  33390. var key = matchUrlSegment(this._remaining);
  33391. if (lang_1.isBlank(key)) {
  33392. return;
  33393. }
  33394. this.capture(key);
  33395. var value = true;
  33396. if (this.peekStartsWith('=')) {
  33397. this.capture('=');
  33398. var valueMatch = matchUrlSegment(this._remaining);
  33399. if (lang_1.isPresent(valueMatch)) {
  33400. value = valueMatch;
  33401. this.capture(value);
  33402. }
  33403. }
  33404. params[key] = value;
  33405. };
  33406. UrlParser.prototype.parseAuxiliaryRoutes = function () {
  33407. var routes = [];
  33408. this.capture('(');
  33409. while (!this.peekStartsWith(')') && this._remaining.length > 0) {
  33410. routes.push(this.parseSegment());
  33411. if (this.peekStartsWith('//')) {
  33412. this.capture('//');
  33413. }
  33414. }
  33415. this.capture(')');
  33416. return routes;
  33417. };
  33418. return UrlParser;
  33419. })();
  33420. exports.UrlParser = UrlParser;
  33421. exports.parser = new UrlParser();
  33422. function serializeParams(paramMap) {
  33423. var params = [];
  33424. if (lang_1.isPresent(paramMap)) {
  33425. collection_1.StringMapWrapper.forEach(paramMap, function (value, key) {
  33426. if (value == true) {
  33427. params.push(key);
  33428. }
  33429. else {
  33430. params.push(key + '=' + value);
  33431. }
  33432. });
  33433. }
  33434. return params;
  33435. }
  33436. exports.serializeParams = serializeParams;
  33437. /***/ },
  33438. /* 232 */
  33439. /***/ function(module, exports, __webpack_require__) {
  33440. var lang_1 = __webpack_require__(5);
  33441. var exceptions_1 = __webpack_require__(14);
  33442. var collection_1 = __webpack_require__(12);
  33443. var async_1 = __webpack_require__(60);
  33444. var route_recognizer_1 = __webpack_require__(228);
  33445. var route_config_impl_1 = __webpack_require__(227);
  33446. var async_route_handler_1 = __webpack_require__(233);
  33447. var sync_route_handler_1 = __webpack_require__(234);
  33448. /**
  33449. * `ComponentRecognizer` is responsible for recognizing routes for a single component.
  33450. * It is consumed by `RouteRegistry`, which knows how to recognize an entire hierarchy of
  33451. * components.
  33452. */
  33453. var ComponentRecognizer = (function () {
  33454. function ComponentRecognizer() {
  33455. this.names = new collection_1.Map();
  33456. // map from name to recognizer
  33457. this.auxNames = new collection_1.Map();
  33458. // map from starting path to recognizer
  33459. this.auxRoutes = new collection_1.Map();
  33460. // TODO: optimize this into a trie
  33461. this.matchers = [];
  33462. this.defaultRoute = null;
  33463. }
  33464. /**
  33465. * returns whether or not the config is terminal
  33466. */
  33467. ComponentRecognizer.prototype.config = function (config) {
  33468. var handler;
  33469. if (lang_1.isPresent(config.name) && config.name[0].toUpperCase() != config.name[0]) {
  33470. var suggestedName = config.name[0].toUpperCase() + config.name.substring(1);
  33471. 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 + "\".");
  33472. }
  33473. if (config instanceof route_config_impl_1.AuxRoute) {
  33474. handler = new sync_route_handler_1.SyncRouteHandler(config.component, config.data);
  33475. var path = config.path.startsWith('/') ? config.path.substring(1) : config.path;
  33476. var recognizer = new route_recognizer_1.RouteRecognizer(config.path, handler);
  33477. this.auxRoutes.set(path, recognizer);
  33478. if (lang_1.isPresent(config.name)) {
  33479. this.auxNames.set(config.name, recognizer);
  33480. }
  33481. return recognizer.terminal;
  33482. }
  33483. var useAsDefault = false;
  33484. if (config instanceof route_config_impl_1.Redirect) {
  33485. var redirector = new route_recognizer_1.RedirectRecognizer(config.path, config.redirectTo);
  33486. this._assertNoHashCollision(redirector.hash, config.path);
  33487. this.matchers.push(redirector);
  33488. return true;
  33489. }
  33490. if (config instanceof route_config_impl_1.Route) {
  33491. handler = new sync_route_handler_1.SyncRouteHandler(config.component, config.data);
  33492. useAsDefault = lang_1.isPresent(config.useAsDefault) && config.useAsDefault;
  33493. }
  33494. else if (config instanceof route_config_impl_1.AsyncRoute) {
  33495. handler = new async_route_handler_1.AsyncRouteHandler(config.loader, config.data);
  33496. useAsDefault = lang_1.isPresent(config.useAsDefault) && config.useAsDefault;
  33497. }
  33498. var recognizer = new route_recognizer_1.RouteRecognizer(config.path, handler);
  33499. this._assertNoHashCollision(recognizer.hash, config.path);
  33500. if (useAsDefault) {
  33501. if (lang_1.isPresent(this.defaultRoute)) {
  33502. throw new exceptions_1.BaseException("Only one route can be default");
  33503. }
  33504. this.defaultRoute = recognizer;
  33505. }
  33506. this.matchers.push(recognizer);
  33507. if (lang_1.isPresent(config.name)) {
  33508. this.names.set(config.name, recognizer);
  33509. }
  33510. return recognizer.terminal;
  33511. };
  33512. ComponentRecognizer.prototype._assertNoHashCollision = function (hash, path) {
  33513. this.matchers.forEach(function (matcher) {
  33514. if (hash == matcher.hash) {
  33515. throw new exceptions_1.BaseException("Configuration '" + path + "' conflicts with existing route '" + matcher.path + "'");
  33516. }
  33517. });
  33518. };
  33519. /**
  33520. * Given a URL, returns a list of `RouteMatch`es, which are partial recognitions for some route.
  33521. */
  33522. ComponentRecognizer.prototype.recognize = function (urlParse) {
  33523. var solutions = [];
  33524. this.matchers.forEach(function (routeRecognizer) {
  33525. var pathMatch = routeRecognizer.recognize(urlParse);
  33526. if (lang_1.isPresent(pathMatch)) {
  33527. solutions.push(pathMatch);
  33528. }
  33529. });
  33530. return solutions;
  33531. };
  33532. ComponentRecognizer.prototype.recognizeAuxiliary = function (urlParse) {
  33533. var routeRecognizer = this.auxRoutes.get(urlParse.path);
  33534. if (lang_1.isPresent(routeRecognizer)) {
  33535. return [routeRecognizer.recognize(urlParse)];
  33536. }
  33537. return [async_1.PromiseWrapper.resolve(null)];
  33538. };
  33539. ComponentRecognizer.prototype.hasRoute = function (name) { return this.names.has(name); };
  33540. ComponentRecognizer.prototype.componentLoaded = function (name) {
  33541. return this.hasRoute(name) && lang_1.isPresent(this.names.get(name).handler.componentType);
  33542. };
  33543. ComponentRecognizer.prototype.loadComponent = function (name) {
  33544. return this.names.get(name).handler.resolveComponentType();
  33545. };
  33546. ComponentRecognizer.prototype.generate = function (name, params) {
  33547. var pathRecognizer = this.names.get(name);
  33548. if (lang_1.isBlank(pathRecognizer)) {
  33549. return null;
  33550. }
  33551. return pathRecognizer.generate(params);
  33552. };
  33553. ComponentRecognizer.prototype.generateAuxiliary = function (name, params) {
  33554. var pathRecognizer = this.auxNames.get(name);
  33555. if (lang_1.isBlank(pathRecognizer)) {
  33556. return null;
  33557. }
  33558. return pathRecognizer.generate(params);
  33559. };
  33560. return ComponentRecognizer;
  33561. })();
  33562. exports.ComponentRecognizer = ComponentRecognizer;
  33563. /***/ },
  33564. /* 233 */
  33565. /***/ function(module, exports, __webpack_require__) {
  33566. var lang_1 = __webpack_require__(5);
  33567. var instruction_1 = __webpack_require__(229);
  33568. var AsyncRouteHandler = (function () {
  33569. function AsyncRouteHandler(_loader, data) {
  33570. if (data === void 0) { data = null; }
  33571. this._loader = _loader;
  33572. /** @internal */
  33573. this._resolvedComponent = null;
  33574. this.data = lang_1.isPresent(data) ? new instruction_1.RouteData(data) : instruction_1.BLANK_ROUTE_DATA;
  33575. }
  33576. AsyncRouteHandler.prototype.resolveComponentType = function () {
  33577. var _this = this;
  33578. if (lang_1.isPresent(this._resolvedComponent)) {
  33579. return this._resolvedComponent;
  33580. }
  33581. return this._resolvedComponent = this._loader().then(function (componentType) {
  33582. _this.componentType = componentType;
  33583. return componentType;
  33584. });
  33585. };
  33586. return AsyncRouteHandler;
  33587. })();
  33588. exports.AsyncRouteHandler = AsyncRouteHandler;
  33589. /***/ },
  33590. /* 234 */
  33591. /***/ function(module, exports, __webpack_require__) {
  33592. var async_1 = __webpack_require__(60);
  33593. var lang_1 = __webpack_require__(5);
  33594. var instruction_1 = __webpack_require__(229);
  33595. var SyncRouteHandler = (function () {
  33596. function SyncRouteHandler(componentType, data) {
  33597. this.componentType = componentType;
  33598. /** @internal */
  33599. this._resolvedComponent = null;
  33600. this._resolvedComponent = async_1.PromiseWrapper.resolve(componentType);
  33601. this.data = lang_1.isPresent(data) ? new instruction_1.RouteData(data) : instruction_1.BLANK_ROUTE_DATA;
  33602. }
  33603. SyncRouteHandler.prototype.resolveComponentType = function () { return this._resolvedComponent; };
  33604. return SyncRouteHandler;
  33605. })();
  33606. exports.SyncRouteHandler = SyncRouteHandler;
  33607. /***/ },
  33608. /* 235 */
  33609. /***/ function(module, exports, __webpack_require__) {
  33610. var route_config_decorator_1 = __webpack_require__(236);
  33611. var lang_1 = __webpack_require__(5);
  33612. var exceptions_1 = __webpack_require__(14);
  33613. /**
  33614. * Given a JS Object that represents a route config, returns a corresponding Route, AsyncRoute,
  33615. * AuxRoute or Redirect object.
  33616. *
  33617. * Also wraps an AsyncRoute's loader function to add the loaded component's route config to the
  33618. * `RouteRegistry`.
  33619. */
  33620. function normalizeRouteConfig(config, registry) {
  33621. if (config instanceof route_config_decorator_1.AsyncRoute) {
  33622. var wrappedLoader = wrapLoaderToReconfigureRegistry(config.loader, registry);
  33623. return new route_config_decorator_1.AsyncRoute({
  33624. path: config.path,
  33625. loader: wrappedLoader,
  33626. name: config.name,
  33627. data: config.data,
  33628. useAsDefault: config.useAsDefault
  33629. });
  33630. }
  33631. if (config instanceof route_config_decorator_1.Route || config instanceof route_config_decorator_1.Redirect || config instanceof route_config_decorator_1.AuxRoute) {
  33632. return config;
  33633. }
  33634. if ((+!!config.component) + (+!!config.redirectTo) + (+!!config.loader) != 1) {
  33635. throw new exceptions_1.BaseException("Route config should contain exactly one \"component\", \"loader\", or \"redirectTo\" property.");
  33636. }
  33637. if (config.as && config.name) {
  33638. throw new exceptions_1.BaseException("Route config should contain exactly one \"as\" or \"name\" property.");
  33639. }
  33640. if (config.as) {
  33641. config.name = config.as;
  33642. }
  33643. if (config.loader) {
  33644. var wrappedLoader = wrapLoaderToReconfigureRegistry(config.loader, registry);
  33645. return new route_config_decorator_1.AsyncRoute({
  33646. path: config.path,
  33647. loader: wrappedLoader,
  33648. name: config.name,
  33649. useAsDefault: config.useAsDefault
  33650. });
  33651. }
  33652. if (config.aux) {
  33653. return new route_config_decorator_1.AuxRoute({ path: config.aux, component: config.component, name: config.name });
  33654. }
  33655. if (config.component) {
  33656. if (typeof config.component == 'object') {
  33657. var componentDefinitionObject = config.component;
  33658. if (componentDefinitionObject.type == 'constructor') {
  33659. return new route_config_decorator_1.Route({
  33660. path: config.path,
  33661. component: componentDefinitionObject.constructor,
  33662. name: config.name,
  33663. data: config.data,
  33664. useAsDefault: config.useAsDefault
  33665. });
  33666. }
  33667. else if (componentDefinitionObject.type == 'loader') {
  33668. return new route_config_decorator_1.AsyncRoute({
  33669. path: config.path,
  33670. loader: componentDefinitionObject.loader,
  33671. name: config.name,
  33672. useAsDefault: config.useAsDefault
  33673. });
  33674. }
  33675. else {
  33676. throw new exceptions_1.BaseException("Invalid component type \"" + componentDefinitionObject.type + "\". Valid types are \"constructor\" and \"loader\".");
  33677. }
  33678. }
  33679. return new route_config_decorator_1.Route(config);
  33680. }
  33681. if (config.redirectTo) {
  33682. return new route_config_decorator_1.Redirect({ path: config.path, redirectTo: config.redirectTo });
  33683. }
  33684. return config;
  33685. }
  33686. exports.normalizeRouteConfig = normalizeRouteConfig;
  33687. function wrapLoaderToReconfigureRegistry(loader, registry) {
  33688. return function () {
  33689. return loader().then(function (componentType) {
  33690. registry.configFromComponent(componentType);
  33691. return componentType;
  33692. });
  33693. };
  33694. }
  33695. function assertComponentExists(component, path) {
  33696. if (!lang_1.isType(component)) {
  33697. throw new exceptions_1.BaseException("Component for route \"" + path + "\" is not defined, or is not a class.");
  33698. }
  33699. }
  33700. exports.assertComponentExists = assertComponentExists;
  33701. /***/ },
  33702. /* 236 */
  33703. /***/ function(module, exports, __webpack_require__) {
  33704. var route_config_impl_1 = __webpack_require__(227);
  33705. var decorators_1 = __webpack_require__(9);
  33706. var route_config_impl_2 = __webpack_require__(227);
  33707. exports.Route = route_config_impl_2.Route;
  33708. exports.Redirect = route_config_impl_2.Redirect;
  33709. exports.AuxRoute = route_config_impl_2.AuxRoute;
  33710. exports.AsyncRoute = route_config_impl_2.AsyncRoute;
  33711. // Copied from RouteConfig in route_config_impl.
  33712. /**
  33713. * The `RouteConfig` decorator defines routes for a given component.
  33714. *
  33715. * It takes an array of {@link RouteDefinition}s.
  33716. */
  33717. exports.RouteConfig = decorators_1.makeDecorator(route_config_impl_1.RouteConfig);
  33718. /***/ },
  33719. /* 237 */
  33720. /***/ function(module, exports, __webpack_require__) {
  33721. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  33722. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  33723. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  33724. 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;
  33725. return c > 3 && r && Object.defineProperty(target, key, r), r;
  33726. };
  33727. var __metadata = (this && this.__metadata) || function (k, v) {
  33728. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  33729. };
  33730. var location_strategy_1 = __webpack_require__(238);
  33731. var async_1 = __webpack_require__(60);
  33732. var core_1 = __webpack_require__(2);
  33733. /**
  33734. * `Location` is a service that applications can use to interact with a browser's URL.
  33735. * Depending on which {@link LocationStrategy} is used, `Location` will either persist
  33736. * to the URL's path or the URL's hash segment.
  33737. *
  33738. * Note: it's better to use {@link Router#navigate} service to trigger route changes. Use
  33739. * `Location` only if you need to interact with or create normalized URLs outside of
  33740. * routing.
  33741. *
  33742. * `Location` is responsible for normalizing the URL against the application's base href.
  33743. * A normalized URL is absolute from the URL host, includes the application's base href, and has no
  33744. * trailing slash:
  33745. * - `/my/app/user/123` is normalized
  33746. * - `my/app/user/123` **is not** normalized
  33747. * - `/my/app/user/123/` **is not** normalized
  33748. *
  33749. * ### Example
  33750. *
  33751. * ```
  33752. * import {Component} from 'angular2/core';
  33753. * import {
  33754. * ROUTER_DIRECTIVES,
  33755. * ROUTER_PROVIDERS,
  33756. * RouteConfig,
  33757. * Location
  33758. * } from 'angular2/router';
  33759. *
  33760. * @Component({directives: [ROUTER_DIRECTIVES]})
  33761. * @RouteConfig([
  33762. * {...},
  33763. * ])
  33764. * class AppCmp {
  33765. * constructor(location: Location) {
  33766. * location.go('/foo');
  33767. * }
  33768. * }
  33769. *
  33770. * bootstrap(AppCmp, [ROUTER_PROVIDERS]);
  33771. * ```
  33772. */
  33773. var Location = (function () {
  33774. function Location(platformStrategy) {
  33775. var _this = this;
  33776. this.platformStrategy = platformStrategy;
  33777. /** @internal */
  33778. this._subject = new async_1.EventEmitter();
  33779. var browserBaseHref = this.platformStrategy.getBaseHref();
  33780. this._baseHref = stripTrailingSlash(stripIndexHtml(browserBaseHref));
  33781. this.platformStrategy.onPopState(function (ev) {
  33782. async_1.ObservableWrapper.callEmit(_this._subject, { 'url': _this.path(), 'pop': true, 'type': ev.type });
  33783. });
  33784. }
  33785. /**
  33786. * Returns the normalized URL path.
  33787. */
  33788. Location.prototype.path = function () { return this.normalize(this.platformStrategy.path()); };
  33789. /**
  33790. * Given a string representing a URL, returns the normalized URL path without leading or
  33791. * trailing slashes
  33792. */
  33793. Location.prototype.normalize = function (url) {
  33794. return stripTrailingSlash(_stripBaseHref(this._baseHref, stripIndexHtml(url)));
  33795. };
  33796. /**
  33797. * Given a string representing a URL, returns the platform-specific external URL path.
  33798. * If the given URL doesn't begin with a leading slash (`'/'`), this method adds one
  33799. * before normalizing. This method will also add a hash if `HashLocationStrategy` is
  33800. * used, or the `APP_BASE_HREF` if the `PathLocationStrategy` is in use.
  33801. */
  33802. Location.prototype.prepareExternalUrl = function (url) {
  33803. if (url.length > 0 && !url.startsWith('/')) {
  33804. url = '/' + url;
  33805. }
  33806. return this.platformStrategy.prepareExternalUrl(url);
  33807. };
  33808. // TODO: rename this method to pushState
  33809. /**
  33810. * Changes the browsers URL to the normalized version of the given URL, and pushes a
  33811. * new item onto the platform's history.
  33812. */
  33813. Location.prototype.go = function (path, query) {
  33814. if (query === void 0) { query = ''; }
  33815. this.platformStrategy.pushState(null, '', path, query);
  33816. };
  33817. /**
  33818. * Changes the browsers URL to the normalized version of the given URL, and replaces
  33819. * the top item on the platform's history stack.
  33820. */
  33821. Location.prototype.replaceState = function (path, query) {
  33822. if (query === void 0) { query = ''; }
  33823. this.platformStrategy.replaceState(null, '', path, query);
  33824. };
  33825. /**
  33826. * Navigates forward in the platform's history.
  33827. */
  33828. Location.prototype.forward = function () { this.platformStrategy.forward(); };
  33829. /**
  33830. * Navigates back in the platform's history.
  33831. */
  33832. Location.prototype.back = function () { this.platformStrategy.back(); };
  33833. /**
  33834. * Subscribe to the platform's `popState` events.
  33835. */
  33836. Location.prototype.subscribe = function (onNext, onThrow, onReturn) {
  33837. if (onThrow === void 0) { onThrow = null; }
  33838. if (onReturn === void 0) { onReturn = null; }
  33839. return async_1.ObservableWrapper.subscribe(this._subject, onNext, onThrow, onReturn);
  33840. };
  33841. Location = __decorate([
  33842. core_1.Injectable(),
  33843. __metadata('design:paramtypes', [location_strategy_1.LocationStrategy])
  33844. ], Location);
  33845. return Location;
  33846. })();
  33847. exports.Location = Location;
  33848. function _stripBaseHref(baseHref, url) {
  33849. if (baseHref.length > 0 && url.startsWith(baseHref)) {
  33850. return url.substring(baseHref.length);
  33851. }
  33852. return url;
  33853. }
  33854. function stripIndexHtml(url) {
  33855. if (/\/index.html$/g.test(url)) {
  33856. // '/index.html'.length == 11
  33857. return url.substring(0, url.length - 11);
  33858. }
  33859. return url;
  33860. }
  33861. function stripTrailingSlash(url) {
  33862. if (/\/$/g.test(url)) {
  33863. url = url.substring(0, url.length - 1);
  33864. }
  33865. return url;
  33866. }
  33867. /***/ },
  33868. /* 238 */
  33869. /***/ function(module, exports, __webpack_require__) {
  33870. var lang_1 = __webpack_require__(5);
  33871. var core_1 = __webpack_require__(2);
  33872. /**
  33873. * `LocationStrategy` is responsible for representing and reading route state
  33874. * from the browser's URL. Angular provides two strategies:
  33875. * {@link HashLocationStrategy} (default) and {@link PathLocationStrategy}.
  33876. *
  33877. * This is used under the hood of the {@link Location} service.
  33878. *
  33879. * Applications should use the {@link Router} or {@link Location} services to
  33880. * interact with application route state.
  33881. *
  33882. * For instance, {@link HashLocationStrategy} produces URLs like
  33883. * `http://example.com#/foo`, and {@link PathLocationStrategy} produces
  33884. * `http://example.com/foo` as an equivalent URL.
  33885. *
  33886. * See these two classes for more.
  33887. */
  33888. var LocationStrategy = (function () {
  33889. function LocationStrategy() {
  33890. }
  33891. return LocationStrategy;
  33892. })();
  33893. exports.LocationStrategy = LocationStrategy;
  33894. /**
  33895. * The `APP_BASE_HREF` token represents the base href to be used with the
  33896. * {@link PathLocationStrategy}.
  33897. *
  33898. * If you're using {@link PathLocationStrategy}, you must provide a provider to a string
  33899. * representing the URL prefix that should be preserved when generating and recognizing
  33900. * URLs.
  33901. *
  33902. * ### Example
  33903. *
  33904. * ```
  33905. * import {Component} from 'angular2/core';
  33906. * import {ROUTER_DIRECTIVES, ROUTER_PROVIDERS, RouteConfig} from 'angular2/router';
  33907. *
  33908. * @Component({directives: [ROUTER_DIRECTIVES]})
  33909. * @RouteConfig([
  33910. * {...},
  33911. * ])
  33912. * class AppCmp {
  33913. * // ...
  33914. * }
  33915. *
  33916. * bootstrap(AppCmp, [
  33917. * ROUTER_PROVIDERS,
  33918. * PathLocationStrategy,
  33919. * provide(APP_BASE_HREF, {useValue: '/my/app'})
  33920. * ]);
  33921. * ```
  33922. */
  33923. exports.APP_BASE_HREF = lang_1.CONST_EXPR(new core_1.OpaqueToken('appBaseHref'));
  33924. function normalizeQueryParams(params) {
  33925. return (params.length > 0 && params.substring(0, 1) != '?') ? ('?' + params) : params;
  33926. }
  33927. exports.normalizeQueryParams = normalizeQueryParams;
  33928. function joinWithSlash(start, end) {
  33929. if (start.length == 0) {
  33930. return end;
  33931. }
  33932. if (end.length == 0) {
  33933. return start;
  33934. }
  33935. var slashes = 0;
  33936. if (start.endsWith('/')) {
  33937. slashes++;
  33938. }
  33939. if (end.startsWith('/')) {
  33940. slashes++;
  33941. }
  33942. if (slashes == 2) {
  33943. return start + end.substring(1);
  33944. }
  33945. if (slashes == 1) {
  33946. return start + end;
  33947. }
  33948. return start + '/' + end;
  33949. }
  33950. exports.joinWithSlash = joinWithSlash;
  33951. /***/ },
  33952. /* 239 */
  33953. /***/ function(module, exports, __webpack_require__) {
  33954. var lang_1 = __webpack_require__(5);
  33955. var lifecycle_annotations_impl_1 = __webpack_require__(240);
  33956. var reflection_1 = __webpack_require__(16);
  33957. function hasLifecycleHook(e, type) {
  33958. if (!(type instanceof lang_1.Type))
  33959. return false;
  33960. return e.name in type.prototype;
  33961. }
  33962. exports.hasLifecycleHook = hasLifecycleHook;
  33963. function getCanActivateHook(type) {
  33964. var annotations = reflection_1.reflector.annotations(type);
  33965. for (var i = 0; i < annotations.length; i += 1) {
  33966. var annotation = annotations[i];
  33967. if (annotation instanceof lifecycle_annotations_impl_1.CanActivate) {
  33968. return annotation.fn;
  33969. }
  33970. }
  33971. return null;
  33972. }
  33973. exports.getCanActivateHook = getCanActivateHook;
  33974. /***/ },
  33975. /* 240 */
  33976. /***/ function(module, exports, __webpack_require__) {
  33977. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  33978. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  33979. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  33980. 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;
  33981. return c > 3 && r && Object.defineProperty(target, key, r), r;
  33982. };
  33983. var __metadata = (this && this.__metadata) || function (k, v) {
  33984. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  33985. };
  33986. var lang_1 = __webpack_require__(5);
  33987. var RouteLifecycleHook = (function () {
  33988. function RouteLifecycleHook(name) {
  33989. this.name = name;
  33990. }
  33991. RouteLifecycleHook = __decorate([
  33992. lang_1.CONST(),
  33993. __metadata('design:paramtypes', [String])
  33994. ], RouteLifecycleHook);
  33995. return RouteLifecycleHook;
  33996. })();
  33997. exports.RouteLifecycleHook = RouteLifecycleHook;
  33998. var CanActivate = (function () {
  33999. function CanActivate(fn) {
  34000. this.fn = fn;
  34001. }
  34002. CanActivate = __decorate([
  34003. lang_1.CONST(),
  34004. __metadata('design:paramtypes', [Function])
  34005. ], CanActivate);
  34006. return CanActivate;
  34007. })();
  34008. exports.CanActivate = CanActivate;
  34009. exports.routerCanReuse = lang_1.CONST_EXPR(new RouteLifecycleHook("routerCanReuse"));
  34010. exports.routerCanDeactivate = lang_1.CONST_EXPR(new RouteLifecycleHook("routerCanDeactivate"));
  34011. exports.routerOnActivate = lang_1.CONST_EXPR(new RouteLifecycleHook("routerOnActivate"));
  34012. exports.routerOnReuse = lang_1.CONST_EXPR(new RouteLifecycleHook("routerOnReuse"));
  34013. exports.routerOnDeactivate = lang_1.CONST_EXPR(new RouteLifecycleHook("routerOnDeactivate"));
  34014. /***/ },
  34015. /* 241 */
  34016. /***/ function(module, exports, __webpack_require__) {
  34017. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34018. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34019. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34020. 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;
  34021. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34022. };
  34023. var __metadata = (this && this.__metadata) || function (k, v) {
  34024. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34025. };
  34026. var __param = (this && this.__param) || function (paramIndex, decorator) {
  34027. return function (target, key) { decorator(target, key, paramIndex); }
  34028. };
  34029. var async_1 = __webpack_require__(60);
  34030. var collection_1 = __webpack_require__(12);
  34031. var lang_1 = __webpack_require__(5);
  34032. var exceptions_1 = __webpack_require__(14);
  34033. var core_1 = __webpack_require__(2);
  34034. var routerMod = __webpack_require__(225);
  34035. var instruction_1 = __webpack_require__(229);
  34036. var hookMod = __webpack_require__(242);
  34037. var route_lifecycle_reflector_1 = __webpack_require__(239);
  34038. var _resolveToTrue = async_1.PromiseWrapper.resolve(true);
  34039. /**
  34040. * A router outlet is a placeholder that Angular dynamically fills based on the application's route.
  34041. *
  34042. * ## Use
  34043. *
  34044. * ```
  34045. * <router-outlet></router-outlet>
  34046. * ```
  34047. */
  34048. var RouterOutlet = (function () {
  34049. function RouterOutlet(_elementRef, _loader, _parentRouter, nameAttr) {
  34050. this._elementRef = _elementRef;
  34051. this._loader = _loader;
  34052. this._parentRouter = _parentRouter;
  34053. this.name = null;
  34054. this._componentRef = null;
  34055. this._currentInstruction = null;
  34056. if (lang_1.isPresent(nameAttr)) {
  34057. this.name = nameAttr;
  34058. this._parentRouter.registerAuxOutlet(this);
  34059. }
  34060. else {
  34061. this._parentRouter.registerPrimaryOutlet(this);
  34062. }
  34063. }
  34064. /**
  34065. * Called by the Router to instantiate a new component during the commit phase of a navigation.
  34066. * This method in turn is responsible for calling the `routerOnActivate` hook of its child.
  34067. */
  34068. RouterOutlet.prototype.activate = function (nextInstruction) {
  34069. var _this = this;
  34070. var previousInstruction = this._currentInstruction;
  34071. this._currentInstruction = nextInstruction;
  34072. var componentType = nextInstruction.componentType;
  34073. var childRouter = this._parentRouter.childRouter(componentType);
  34074. var providers = core_1.Injector.resolve([
  34075. core_1.provide(instruction_1.RouteData, { useValue: nextInstruction.routeData }),
  34076. core_1.provide(instruction_1.RouteParams, { useValue: new instruction_1.RouteParams(nextInstruction.params) }),
  34077. core_1.provide(routerMod.Router, { useValue: childRouter })
  34078. ]);
  34079. return this._loader.loadNextToLocation(componentType, this._elementRef, providers)
  34080. .then(function (componentRef) {
  34081. _this._componentRef = componentRef;
  34082. if (route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerOnActivate, componentType)) {
  34083. return _this._componentRef.instance
  34084. .routerOnActivate(nextInstruction, previousInstruction);
  34085. }
  34086. });
  34087. };
  34088. /**
  34089. * Called by the {@link Router} during the commit phase of a navigation when an outlet
  34090. * reuses a component between different routes.
  34091. * This method in turn is responsible for calling the `routerOnReuse` hook of its child.
  34092. */
  34093. RouterOutlet.prototype.reuse = function (nextInstruction) {
  34094. var previousInstruction = this._currentInstruction;
  34095. this._currentInstruction = nextInstruction;
  34096. if (lang_1.isBlank(this._componentRef)) {
  34097. throw new exceptions_1.BaseException("Cannot reuse an outlet that does not contain a component.");
  34098. }
  34099. return async_1.PromiseWrapper.resolve(route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerOnReuse, this._currentInstruction.componentType) ?
  34100. this._componentRef.instance
  34101. .routerOnReuse(nextInstruction, previousInstruction) :
  34102. true);
  34103. };
  34104. /**
  34105. * Called by the {@link Router} when an outlet disposes of a component's contents.
  34106. * This method in turn is responsible for calling the `routerOnDeactivate` hook of its child.
  34107. */
  34108. RouterOutlet.prototype.deactivate = function (nextInstruction) {
  34109. var _this = this;
  34110. var next = _resolveToTrue;
  34111. if (lang_1.isPresent(this._componentRef) && lang_1.isPresent(this._currentInstruction) &&
  34112. route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerOnDeactivate, this._currentInstruction.componentType)) {
  34113. next = async_1.PromiseWrapper.resolve(this._componentRef.instance
  34114. .routerOnDeactivate(nextInstruction, this._currentInstruction));
  34115. }
  34116. return next.then(function (_) {
  34117. if (lang_1.isPresent(_this._componentRef)) {
  34118. _this._componentRef.dispose();
  34119. _this._componentRef = null;
  34120. }
  34121. });
  34122. };
  34123. /**
  34124. * Called by the {@link Router} during recognition phase of a navigation.
  34125. *
  34126. * If this resolves to `false`, the given navigation is cancelled.
  34127. *
  34128. * This method delegates to the child component's `routerCanDeactivate` hook if it exists,
  34129. * and otherwise resolves to true.
  34130. */
  34131. RouterOutlet.prototype.routerCanDeactivate = function (nextInstruction) {
  34132. if (lang_1.isBlank(this._currentInstruction)) {
  34133. return _resolveToTrue;
  34134. }
  34135. if (route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerCanDeactivate, this._currentInstruction.componentType)) {
  34136. return async_1.PromiseWrapper.resolve(this._componentRef.instance
  34137. .routerCanDeactivate(nextInstruction, this._currentInstruction));
  34138. }
  34139. return _resolveToTrue;
  34140. };
  34141. /**
  34142. * Called by the {@link Router} during recognition phase of a navigation.
  34143. *
  34144. * If the new child component has a different Type than the existing child component,
  34145. * this will resolve to `false`. You can't reuse an old component when the new component
  34146. * is of a different Type.
  34147. *
  34148. * Otherwise, this method delegates to the child component's `routerCanReuse` hook if it exists,
  34149. * or resolves to true if the hook is not present.
  34150. */
  34151. RouterOutlet.prototype.routerCanReuse = function (nextInstruction) {
  34152. var result;
  34153. if (lang_1.isBlank(this._currentInstruction) ||
  34154. this._currentInstruction.componentType != nextInstruction.componentType) {
  34155. result = false;
  34156. }
  34157. else if (route_lifecycle_reflector_1.hasLifecycleHook(hookMod.routerCanReuse, this._currentInstruction.componentType)) {
  34158. result = this._componentRef.instance
  34159. .routerCanReuse(nextInstruction, this._currentInstruction);
  34160. }
  34161. else {
  34162. result = nextInstruction == this._currentInstruction ||
  34163. (lang_1.isPresent(nextInstruction.params) && lang_1.isPresent(this._currentInstruction.params) &&
  34164. collection_1.StringMapWrapper.equals(nextInstruction.params, this._currentInstruction.params));
  34165. }
  34166. return async_1.PromiseWrapper.resolve(result);
  34167. };
  34168. RouterOutlet = __decorate([
  34169. core_1.Directive({ selector: 'router-outlet' }),
  34170. __param(3, core_1.Attribute('name')),
  34171. __metadata('design:paramtypes', [core_1.ElementRef, core_1.DynamicComponentLoader, routerMod.Router, String])
  34172. ], RouterOutlet);
  34173. return RouterOutlet;
  34174. })();
  34175. exports.RouterOutlet = RouterOutlet;
  34176. /***/ },
  34177. /* 242 */
  34178. /***/ function(module, exports, __webpack_require__) {
  34179. /**
  34180. * This indirection is needed to free up Component, etc symbols in the public API
  34181. * to be used by the decorator versions of these annotations.
  34182. */
  34183. var decorators_1 = __webpack_require__(9);
  34184. var lifecycle_annotations_impl_1 = __webpack_require__(240);
  34185. var lifecycle_annotations_impl_2 = __webpack_require__(240);
  34186. exports.routerCanReuse = lifecycle_annotations_impl_2.routerCanReuse;
  34187. exports.routerCanDeactivate = lifecycle_annotations_impl_2.routerCanDeactivate;
  34188. exports.routerOnActivate = lifecycle_annotations_impl_2.routerOnActivate;
  34189. exports.routerOnReuse = lifecycle_annotations_impl_2.routerOnReuse;
  34190. exports.routerOnDeactivate = lifecycle_annotations_impl_2.routerOnDeactivate;
  34191. /**
  34192. * Defines route lifecycle hook `CanActivate`, which is called by the router to determine
  34193. * if a component can be instantiated as part of a navigation.
  34194. *
  34195. * <aside class="is-right">
  34196. * Note that unlike other lifecycle hooks, this one uses an annotation rather than an interface.
  34197. * This is because the `CanActivate` function is called before the component is instantiated.
  34198. * </aside>
  34199. *
  34200. * The `CanActivate` hook is called with two {@link ComponentInstruction}s as parameters, the first
  34201. * representing the current route being navigated to, and the second parameter representing the
  34202. * previous route or `null`.
  34203. *
  34204. * ```typescript
  34205. * @CanActivate((next, prev) => boolean | Promise<boolean>)
  34206. * ```
  34207. *
  34208. * If `CanActivate` returns or resolves to `false`, the navigation is cancelled.
  34209. * If `CanActivate` throws or rejects, the navigation is also cancelled.
  34210. * If `CanActivate` returns or resolves to `true`, navigation continues, the component is
  34211. * instantiated, and the {@link OnActivate} hook of that component is called if implemented.
  34212. *
  34213. * ### Example
  34214. *
  34215. * {@example router/ts/can_activate/can_activate_example.ts region='canActivate' }
  34216. */
  34217. exports.CanActivate = decorators_1.makeDecorator(lifecycle_annotations_impl_1.CanActivate);
  34218. /***/ },
  34219. /* 243 */
  34220. /***/ function(module, exports, __webpack_require__) {
  34221. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34222. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34223. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34224. 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;
  34225. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34226. };
  34227. var __metadata = (this && this.__metadata) || function (k, v) {
  34228. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34229. };
  34230. var core_1 = __webpack_require__(2);
  34231. var lang_1 = __webpack_require__(5);
  34232. var router_1 = __webpack_require__(225);
  34233. var location_1 = __webpack_require__(237);
  34234. /**
  34235. * The RouterLink directive lets you link to specific parts of your app.
  34236. *
  34237. * Consider the following route configuration:
  34238. * ```
  34239. * @RouteConfig([
  34240. * { path: '/user', component: UserCmp, as: 'User' }
  34241. * ]);
  34242. * class MyComp {}
  34243. * ```
  34244. *
  34245. * When linking to this `User` route, you can write:
  34246. *
  34247. * ```
  34248. * <a [routerLink]="['./User']">link to user component</a>
  34249. * ```
  34250. *
  34251. * RouterLink expects the value to be an array of route names, followed by the params
  34252. * for that level of routing. For instance `['/Team', {teamId: 1}, 'User', {userId: 2}]`
  34253. * means that we want to generate a link for the `Team` route with params `{teamId: 1}`,
  34254. * and with a child route `User` with params `{userId: 2}`.
  34255. *
  34256. * The first route name should be prepended with `/`, `./`, or `../`.
  34257. * If the route begins with `/`, the router will look up the route from the root of the app.
  34258. * If the route begins with `./`, the router will instead look in the current component's
  34259. * children for the route. And if the route begins with `../`, the router will look at the
  34260. * current component's parent.
  34261. */
  34262. var RouterLink = (function () {
  34263. function RouterLink(_router, _location) {
  34264. this._router = _router;
  34265. this._location = _location;
  34266. }
  34267. Object.defineProperty(RouterLink.prototype, "isRouteActive", {
  34268. get: function () { return this._router.isRouteActive(this._navigationInstruction); },
  34269. enumerable: true,
  34270. configurable: true
  34271. });
  34272. Object.defineProperty(RouterLink.prototype, "routeParams", {
  34273. set: function (changes) {
  34274. this._routeParams = changes;
  34275. this._navigationInstruction = this._router.generate(this._routeParams);
  34276. var navigationHref = this._navigationInstruction.toLinkUrl();
  34277. this.visibleHref = this._location.prepareExternalUrl(navigationHref);
  34278. },
  34279. enumerable: true,
  34280. configurable: true
  34281. });
  34282. RouterLink.prototype.onClick = function () {
  34283. // If no target, or if target is _self, prevent default browser behavior
  34284. if (!lang_1.isString(this.target) || this.target == '_self') {
  34285. this._router.navigateByInstruction(this._navigationInstruction);
  34286. return false;
  34287. }
  34288. return true;
  34289. };
  34290. RouterLink = __decorate([
  34291. core_1.Directive({
  34292. selector: '[routerLink]',
  34293. inputs: ['routeParams: routerLink', 'target: target'],
  34294. host: {
  34295. '(click)': 'onClick()',
  34296. '[attr.href]': 'visibleHref',
  34297. '[class.router-link-active]': 'isRouteActive'
  34298. }
  34299. }),
  34300. __metadata('design:paramtypes', [router_1.Router, location_1.Location])
  34301. ], RouterLink);
  34302. return RouterLink;
  34303. })();
  34304. exports.RouterLink = RouterLink;
  34305. /***/ },
  34306. /* 244 */
  34307. /***/ function(module, exports, __webpack_require__) {
  34308. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34309. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34310. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34311. 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;
  34312. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34313. };
  34314. var __metadata = (this && this.__metadata) || function (k, v) {
  34315. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34316. };
  34317. var dom_adapter_1 = __webpack_require__(178);
  34318. var core_1 = __webpack_require__(2);
  34319. /**
  34320. * `PlatformLocation` encapsulates all of the direct calls to platform APIs.
  34321. * This class should not be used directly by an application developer. Instead, use
  34322. * {@link Location}.
  34323. */
  34324. var PlatformLocation = (function () {
  34325. function PlatformLocation() {
  34326. this._init();
  34327. }
  34328. // This is moved to its own method so that `MockPlatformLocationStrategy` can overwrite it
  34329. /** @internal */
  34330. PlatformLocation.prototype._init = function () {
  34331. this._location = dom_adapter_1.DOM.getLocation();
  34332. this._history = dom_adapter_1.DOM.getHistory();
  34333. };
  34334. PlatformLocation.prototype.getBaseHrefFromDOM = function () { return dom_adapter_1.DOM.getBaseHref(); };
  34335. PlatformLocation.prototype.onPopState = function (fn) {
  34336. dom_adapter_1.DOM.getGlobalEventTarget('window').addEventListener('popstate', fn, false);
  34337. };
  34338. PlatformLocation.prototype.onHashChange = function (fn) {
  34339. dom_adapter_1.DOM.getGlobalEventTarget('window').addEventListener('hashchange', fn, false);
  34340. };
  34341. Object.defineProperty(PlatformLocation.prototype, "pathname", {
  34342. get: function () { return this._location.pathname; },
  34343. set: function (newPath) { this._location.pathname = newPath; },
  34344. enumerable: true,
  34345. configurable: true
  34346. });
  34347. Object.defineProperty(PlatformLocation.prototype, "search", {
  34348. get: function () { return this._location.search; },
  34349. enumerable: true,
  34350. configurable: true
  34351. });
  34352. Object.defineProperty(PlatformLocation.prototype, "hash", {
  34353. get: function () { return this._location.hash; },
  34354. enumerable: true,
  34355. configurable: true
  34356. });
  34357. PlatformLocation.prototype.pushState = function (state, title, url) {
  34358. this._history.pushState(state, title, url);
  34359. };
  34360. PlatformLocation.prototype.replaceState = function (state, title, url) {
  34361. this._history.replaceState(state, title, url);
  34362. };
  34363. PlatformLocation.prototype.forward = function () { this._history.forward(); };
  34364. PlatformLocation.prototype.back = function () { this._history.back(); };
  34365. PlatformLocation = __decorate([
  34366. core_1.Injectable(),
  34367. __metadata('design:paramtypes', [])
  34368. ], PlatformLocation);
  34369. return PlatformLocation;
  34370. })();
  34371. exports.PlatformLocation = PlatformLocation;
  34372. /***/ },
  34373. /* 245 */
  34374. /***/ function(module, exports, __webpack_require__) {
  34375. var __extends = (this && this.__extends) || function (d, b) {
  34376. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  34377. function __() { this.constructor = d; }
  34378. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  34379. };
  34380. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34381. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34382. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34383. 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;
  34384. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34385. };
  34386. var __metadata = (this && this.__metadata) || function (k, v) {
  34387. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34388. };
  34389. var __param = (this && this.__param) || function (paramIndex, decorator) {
  34390. return function (target, key) { decorator(target, key, paramIndex); }
  34391. };
  34392. var core_1 = __webpack_require__(2);
  34393. var location_strategy_1 = __webpack_require__(238);
  34394. var lang_1 = __webpack_require__(5);
  34395. var platform_location_1 = __webpack_require__(244);
  34396. /**
  34397. * `HashLocationStrategy` is a {@link LocationStrategy} used to configure the
  34398. * {@link Location} service to represent its state in the
  34399. * [hash fragment](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax)
  34400. * of the browser's URL.
  34401. *
  34402. * For instance, if you call `location.go('/foo')`, the browser's URL will become
  34403. * `example.com#/foo`.
  34404. *
  34405. * ### Example
  34406. *
  34407. * ```
  34408. * import {Component, provide} from 'angular2/core';
  34409. * import {
  34410. * ROUTER_DIRECTIVES,
  34411. * ROUTER_PROVIDERS,
  34412. * RouteConfig,
  34413. * Location,
  34414. * LocationStrategy,
  34415. * HashLocationStrategy
  34416. * } from 'angular2/router';
  34417. *
  34418. * @Component({directives: [ROUTER_DIRECTIVES]})
  34419. * @RouteConfig([
  34420. * {...},
  34421. * ])
  34422. * class AppCmp {
  34423. * constructor(location: Location) {
  34424. * location.go('/foo');
  34425. * }
  34426. * }
  34427. *
  34428. * bootstrap(AppCmp, [
  34429. * ROUTER_PROVIDERS,
  34430. * provide(LocationStrategy, {useClass: HashLocationStrategy})
  34431. * ]);
  34432. * ```
  34433. */
  34434. var HashLocationStrategy = (function (_super) {
  34435. __extends(HashLocationStrategy, _super);
  34436. function HashLocationStrategy(_platformLocation, _baseHref) {
  34437. _super.call(this);
  34438. this._platformLocation = _platformLocation;
  34439. this._baseHref = '';
  34440. if (lang_1.isPresent(_baseHref)) {
  34441. this._baseHref = _baseHref;
  34442. }
  34443. }
  34444. HashLocationStrategy.prototype.onPopState = function (fn) {
  34445. this._platformLocation.onPopState(fn);
  34446. this._platformLocation.onHashChange(fn);
  34447. };
  34448. HashLocationStrategy.prototype.getBaseHref = function () { return this._baseHref; };
  34449. HashLocationStrategy.prototype.path = function () {
  34450. // the hash value is always prefixed with a `#`
  34451. // and if it is empty then it will stay empty
  34452. var path = this._platformLocation.hash;
  34453. // Dart will complain if a call to substring is
  34454. // executed with a position value that extends the
  34455. // length of string.
  34456. return (path.length > 0 ? path.substring(1) : path) +
  34457. location_strategy_1.normalizeQueryParams(this._platformLocation.search);
  34458. };
  34459. HashLocationStrategy.prototype.prepareExternalUrl = function (internal) {
  34460. var url = location_strategy_1.joinWithSlash(this._baseHref, internal);
  34461. return url.length > 0 ? ('#' + url) : url;
  34462. };
  34463. HashLocationStrategy.prototype.pushState = function (state, title, path, queryParams) {
  34464. var url = this.prepareExternalUrl(path + location_strategy_1.normalizeQueryParams(queryParams));
  34465. if (url.length == 0) {
  34466. url = this._platformLocation.pathname;
  34467. }
  34468. this._platformLocation.pushState(state, title, url);
  34469. };
  34470. HashLocationStrategy.prototype.replaceState = function (state, title, path, queryParams) {
  34471. var url = this.prepareExternalUrl(path + location_strategy_1.normalizeQueryParams(queryParams));
  34472. if (url.length == 0) {
  34473. url = this._platformLocation.pathname;
  34474. }
  34475. this._platformLocation.replaceState(state, title, url);
  34476. };
  34477. HashLocationStrategy.prototype.forward = function () { this._platformLocation.forward(); };
  34478. HashLocationStrategy.prototype.back = function () { this._platformLocation.back(); };
  34479. HashLocationStrategy = __decorate([
  34480. core_1.Injectable(),
  34481. __param(1, core_1.Optional()),
  34482. __param(1, core_1.Inject(location_strategy_1.APP_BASE_HREF)),
  34483. __metadata('design:paramtypes', [platform_location_1.PlatformLocation, String])
  34484. ], HashLocationStrategy);
  34485. return HashLocationStrategy;
  34486. })(location_strategy_1.LocationStrategy);
  34487. exports.HashLocationStrategy = HashLocationStrategy;
  34488. /***/ },
  34489. /* 246 */
  34490. /***/ function(module, exports, __webpack_require__) {
  34491. var __extends = (this && this.__extends) || function (d, b) {
  34492. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  34493. function __() { this.constructor = d; }
  34494. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  34495. };
  34496. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34497. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34498. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34499. 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;
  34500. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34501. };
  34502. var __metadata = (this && this.__metadata) || function (k, v) {
  34503. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34504. };
  34505. var __param = (this && this.__param) || function (paramIndex, decorator) {
  34506. return function (target, key) { decorator(target, key, paramIndex); }
  34507. };
  34508. var core_1 = __webpack_require__(2);
  34509. var lang_1 = __webpack_require__(5);
  34510. var exceptions_1 = __webpack_require__(14);
  34511. var location_strategy_1 = __webpack_require__(238);
  34512. var platform_location_1 = __webpack_require__(244);
  34513. /**
  34514. * `PathLocationStrategy` is a {@link LocationStrategy} used to configure the
  34515. * {@link Location} service to represent its state in the
  34516. * [path](https://en.wikipedia.org/wiki/Uniform_Resource_Locator#Syntax) of the
  34517. * browser's URL.
  34518. *
  34519. * `PathLocationStrategy` is the default binding for {@link LocationStrategy}
  34520. * provided in {@link ROUTER_PROVIDERS}.
  34521. *
  34522. * If you're using `PathLocationStrategy`, you must provide a provider for
  34523. * {@link APP_BASE_HREF} to a string representing the URL prefix that should
  34524. * be preserved when generating and recognizing URLs.
  34525. *
  34526. * For instance, if you provide an `APP_BASE_HREF` of `'/my/app'` and call
  34527. * `location.go('/foo')`, the browser's URL will become
  34528. * `example.com/my/app/foo`.
  34529. *
  34530. * ### Example
  34531. *
  34532. * ```
  34533. * import {Component, provide} from 'angular2/core';
  34534. * import {
  34535. * APP_BASE_HREF
  34536. * ROUTER_DIRECTIVES,
  34537. * ROUTER_PROVIDERS,
  34538. * RouteConfig,
  34539. * Location
  34540. * } from 'angular2/router';
  34541. *
  34542. * @Component({directives: [ROUTER_DIRECTIVES]})
  34543. * @RouteConfig([
  34544. * {...},
  34545. * ])
  34546. * class AppCmp {
  34547. * constructor(location: Location) {
  34548. * location.go('/foo');
  34549. * }
  34550. * }
  34551. *
  34552. * bootstrap(AppCmp, [
  34553. * ROUTER_PROVIDERS, // includes binding to PathLocationStrategy
  34554. * provide(APP_BASE_HREF, {useValue: '/my/app'})
  34555. * ]);
  34556. * ```
  34557. */
  34558. var PathLocationStrategy = (function (_super) {
  34559. __extends(PathLocationStrategy, _super);
  34560. function PathLocationStrategy(_platformLocation, href) {
  34561. _super.call(this);
  34562. this._platformLocation = _platformLocation;
  34563. if (lang_1.isBlank(href)) {
  34564. href = this._platformLocation.getBaseHrefFromDOM();
  34565. }
  34566. if (lang_1.isBlank(href)) {
  34567. 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.");
  34568. }
  34569. this._baseHref = href;
  34570. }
  34571. PathLocationStrategy.prototype.onPopState = function (fn) {
  34572. this._platformLocation.onPopState(fn);
  34573. this._platformLocation.onHashChange(fn);
  34574. };
  34575. PathLocationStrategy.prototype.getBaseHref = function () { return this._baseHref; };
  34576. PathLocationStrategy.prototype.prepareExternalUrl = function (internal) { return location_strategy_1.joinWithSlash(this._baseHref, internal); };
  34577. PathLocationStrategy.prototype.path = function () {
  34578. return this._platformLocation.pathname + location_strategy_1.normalizeQueryParams(this._platformLocation.search);
  34579. };
  34580. PathLocationStrategy.prototype.pushState = function (state, title, url, queryParams) {
  34581. var externalUrl = this.prepareExternalUrl(url + location_strategy_1.normalizeQueryParams(queryParams));
  34582. this._platformLocation.pushState(state, title, externalUrl);
  34583. };
  34584. PathLocationStrategy.prototype.replaceState = function (state, title, url, queryParams) {
  34585. var externalUrl = this.prepareExternalUrl(url + location_strategy_1.normalizeQueryParams(queryParams));
  34586. this._platformLocation.replaceState(state, title, externalUrl);
  34587. };
  34588. PathLocationStrategy.prototype.forward = function () { this._platformLocation.forward(); };
  34589. PathLocationStrategy.prototype.back = function () { this._platformLocation.back(); };
  34590. PathLocationStrategy = __decorate([
  34591. core_1.Injectable(),
  34592. __param(1, core_1.Optional()),
  34593. __param(1, core_1.Inject(location_strategy_1.APP_BASE_HREF)),
  34594. __metadata('design:paramtypes', [platform_location_1.PlatformLocation, String])
  34595. ], PathLocationStrategy);
  34596. return PathLocationStrategy;
  34597. })(location_strategy_1.LocationStrategy);
  34598. exports.PathLocationStrategy = PathLocationStrategy;
  34599. /***/ },
  34600. /* 247 */
  34601. /***/ function(module, exports) {
  34602. /***/ },
  34603. /* 248 */
  34604. /***/ function(module, exports, __webpack_require__) {
  34605. var compiler_1 = __webpack_require__(147);
  34606. var core_1 = __webpack_require__(2);
  34607. var router_link_transform_1 = __webpack_require__(249);
  34608. var lang_1 = __webpack_require__(5);
  34609. var router_link_transform_2 = __webpack_require__(249);
  34610. exports.RouterLinkTransform = router_link_transform_2.RouterLinkTransform;
  34611. /**
  34612. * Enables the router link DSL.
  34613. *
  34614. * Warning. This feature is experimental and can change.
  34615. *
  34616. * To enable the transformer pass the router link DSL provider to `bootstrap`.
  34617. *
  34618. * ## Example:
  34619. * ```
  34620. * import {bootstrap} from 'angular2/platform/browser';
  34621. * import {ROUTER_LINK_DSL_PROVIDER} from 'angular2/router/router_link_dsl';
  34622. *
  34623. * bootstrap(CustomApp, [ROUTER_LINK_DSL_PROVIDER]);
  34624. * ```
  34625. *
  34626. * The DSL allows you to express router links as follows:
  34627. * ```
  34628. * <a [routerLink]="route:User"> <!-- Same as <a [routerLink]="['User']"> -->
  34629. * <a [routerLink]="route:/User"> <!-- Same as <a [routerLink]="['User']"> -->
  34630. * <a [routerLink]="route:./User"> <!-- Same as <a [routerLink]="['./User']"> -->
  34631. * <a [routerLink]="./User(id: value, name: 'Bob')"> <!-- Same as <a [routerLink]="['./User', {id:
  34632. * value, name: 'Bob'}]"> -->
  34633. * <a [routerLink]="/User/Modal"> <!-- Same as <a [routerLink]="['/User', 'Modal']"> -->
  34634. * <a [routerLink]="User[Modal]"> <!-- Same as <a [routerLink]="['User', ['Modal']]"> -->
  34635. * ```
  34636. */
  34637. 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 }));
  34638. /***/ },
  34639. /* 249 */
  34640. /***/ function(module, exports, __webpack_require__) {
  34641. var __extends = (this && this.__extends) || function (d, b) {
  34642. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  34643. function __() { this.constructor = d; }
  34644. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  34645. };
  34646. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  34647. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  34648. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  34649. 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;
  34650. return c > 3 && r && Object.defineProperty(target, key, r), r;
  34651. };
  34652. var __metadata = (this && this.__metadata) || function (k, v) {
  34653. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  34654. };
  34655. var compiler_1 = __webpack_require__(147);
  34656. var ast_1 = __webpack_require__(30);
  34657. var exceptions_1 = __webpack_require__(14);
  34658. var core_1 = __webpack_require__(2);
  34659. var parser_1 = __webpack_require__(32);
  34660. /**
  34661. * e.g., './User', 'Modal' in ./User[Modal(param: value)]
  34662. */
  34663. var FixedPart = (function () {
  34664. function FixedPart(value) {
  34665. this.value = value;
  34666. }
  34667. return FixedPart;
  34668. })();
  34669. /**
  34670. * The square bracket
  34671. */
  34672. var AuxiliaryStart = (function () {
  34673. function AuxiliaryStart() {
  34674. }
  34675. return AuxiliaryStart;
  34676. })();
  34677. /**
  34678. * The square bracket
  34679. */
  34680. var AuxiliaryEnd = (function () {
  34681. function AuxiliaryEnd() {
  34682. }
  34683. return AuxiliaryEnd;
  34684. })();
  34685. /**
  34686. * e.g., param:value in ./User[Modal(param: value)]
  34687. */
  34688. var Params = (function () {
  34689. function Params(ast) {
  34690. this.ast = ast;
  34691. }
  34692. return Params;
  34693. })();
  34694. var RouterLinkLexer = (function () {
  34695. function RouterLinkLexer(parser, exp) {
  34696. this.parser = parser;
  34697. this.exp = exp;
  34698. this.index = 0;
  34699. }
  34700. RouterLinkLexer.prototype.tokenize = function () {
  34701. var tokens = [];
  34702. while (this.index < this.exp.length) {
  34703. tokens.push(this._parseToken());
  34704. }
  34705. return tokens;
  34706. };
  34707. RouterLinkLexer.prototype._parseToken = function () {
  34708. var c = this.exp[this.index];
  34709. if (c == '[') {
  34710. this.index++;
  34711. return new AuxiliaryStart();
  34712. }
  34713. else if (c == ']') {
  34714. this.index++;
  34715. return new AuxiliaryEnd();
  34716. }
  34717. else if (c == '(') {
  34718. return this._parseParams();
  34719. }
  34720. else if (c == '/' && this.index !== 0) {
  34721. this.index++;
  34722. return this._parseFixedPart();
  34723. }
  34724. else {
  34725. return this._parseFixedPart();
  34726. }
  34727. };
  34728. RouterLinkLexer.prototype._parseParams = function () {
  34729. var start = this.index;
  34730. for (; this.index < this.exp.length; ++this.index) {
  34731. var c = this.exp[this.index];
  34732. if (c == ')') {
  34733. var paramsContent = this.exp.substring(start + 1, this.index);
  34734. this.index++;
  34735. return new Params(this.parser.parseBinding("{" + paramsContent + "}", null).ast);
  34736. }
  34737. }
  34738. throw new exceptions_1.BaseException("Cannot find ')'");
  34739. };
  34740. RouterLinkLexer.prototype._parseFixedPart = function () {
  34741. var start = this.index;
  34742. var sawNonSlash = false;
  34743. for (; this.index < this.exp.length; ++this.index) {
  34744. var c = this.exp[this.index];
  34745. if (c == '(' || c == '[' || c == ']' || (c == '/' && sawNonSlash)) {
  34746. break;
  34747. }
  34748. if (c != '.' && c != '/') {
  34749. sawNonSlash = true;
  34750. }
  34751. }
  34752. var fixed = this.exp.substring(start, this.index);
  34753. if (start === this.index || !sawNonSlash || fixed.startsWith('//')) {
  34754. throw new exceptions_1.BaseException("Invalid router link");
  34755. }
  34756. return new FixedPart(fixed);
  34757. };
  34758. return RouterLinkLexer;
  34759. })();
  34760. var RouterLinkAstGenerator = (function () {
  34761. function RouterLinkAstGenerator(tokens) {
  34762. this.tokens = tokens;
  34763. this.index = 0;
  34764. }
  34765. RouterLinkAstGenerator.prototype.generate = function () { return this._genAuxiliary(); };
  34766. RouterLinkAstGenerator.prototype._genAuxiliary = function () {
  34767. var arr = [];
  34768. for (; this.index < this.tokens.length; this.index++) {
  34769. var r = this.tokens[this.index];
  34770. if (r instanceof FixedPart) {
  34771. arr.push(new ast_1.LiteralPrimitive(r.value));
  34772. }
  34773. else if (r instanceof Params) {
  34774. arr.push(r.ast);
  34775. }
  34776. else if (r instanceof AuxiliaryEnd) {
  34777. break;
  34778. }
  34779. else if (r instanceof AuxiliaryStart) {
  34780. this.index++;
  34781. arr.push(this._genAuxiliary());
  34782. }
  34783. }
  34784. return new ast_1.LiteralArray(arr);
  34785. };
  34786. return RouterLinkAstGenerator;
  34787. })();
  34788. var RouterLinkAstTransformer = (function (_super) {
  34789. __extends(RouterLinkAstTransformer, _super);
  34790. function RouterLinkAstTransformer(parser) {
  34791. _super.call(this);
  34792. this.parser = parser;
  34793. }
  34794. RouterLinkAstTransformer.prototype.visitQuote = function (ast) {
  34795. if (ast.prefix == "route") {
  34796. return parseRouterLinkExpression(this.parser, ast.uninterpretedExpression);
  34797. }
  34798. else {
  34799. return _super.prototype.visitQuote.call(this, ast);
  34800. }
  34801. };
  34802. return RouterLinkAstTransformer;
  34803. })(ast_1.AstTransformer);
  34804. function parseRouterLinkExpression(parser, exp) {
  34805. var tokens = new RouterLinkLexer(parser, exp.trim()).tokenize();
  34806. return new RouterLinkAstGenerator(tokens).generate();
  34807. }
  34808. exports.parseRouterLinkExpression = parseRouterLinkExpression;
  34809. /**
  34810. * A compiler plugin that implements the router link DSL.
  34811. */
  34812. var RouterLinkTransform = (function () {
  34813. function RouterLinkTransform(parser) {
  34814. this.astTransformer = new RouterLinkAstTransformer(parser);
  34815. }
  34816. RouterLinkTransform.prototype.visitNgContent = function (ast, context) { return ast; };
  34817. RouterLinkTransform.prototype.visitEmbeddedTemplate = function (ast, context) { return ast; };
  34818. RouterLinkTransform.prototype.visitElement = function (ast, context) {
  34819. var _this = this;
  34820. var updatedChildren = ast.children.map(function (c) { return c.visit(_this, context); });
  34821. var updatedInputs = ast.inputs.map(function (c) { return c.visit(_this, context); });
  34822. var updatedDirectives = ast.directives.map(function (c) { return c.visit(_this, context); });
  34823. return new compiler_1.ElementAst(ast.name, ast.attrs, updatedInputs, ast.outputs, ast.exportAsVars, updatedDirectives, updatedChildren, ast.ngContentIndex, ast.sourceSpan);
  34824. };
  34825. RouterLinkTransform.prototype.visitVariable = function (ast, context) { return ast; };
  34826. RouterLinkTransform.prototype.visitEvent = function (ast, context) { return ast; };
  34827. RouterLinkTransform.prototype.visitElementProperty = function (ast, context) { return ast; };
  34828. RouterLinkTransform.prototype.visitAttr = function (ast, context) { return ast; };
  34829. RouterLinkTransform.prototype.visitBoundText = function (ast, context) { return ast; };
  34830. RouterLinkTransform.prototype.visitText = function (ast, context) { return ast; };
  34831. RouterLinkTransform.prototype.visitDirective = function (ast, context) {
  34832. var _this = this;
  34833. var updatedInputs = ast.inputs.map(function (c) { return c.visit(_this, context); });
  34834. return new compiler_1.DirectiveAst(ast.directive, updatedInputs, ast.hostProperties, ast.hostEvents, ast.exportAsVars, ast.sourceSpan);
  34835. };
  34836. RouterLinkTransform.prototype.visitDirectiveProperty = function (ast, context) {
  34837. var transformedValue = ast.value.visit(this.astTransformer);
  34838. return new compiler_1.BoundDirectivePropertyAst(ast.directiveName, ast.templateName, transformedValue, ast.sourceSpan);
  34839. };
  34840. RouterLinkTransform = __decorate([
  34841. core_1.Injectable(),
  34842. __metadata('design:paramtypes', [parser_1.Parser])
  34843. ], RouterLinkTransform);
  34844. return RouterLinkTransform;
  34845. })();
  34846. exports.RouterLinkTransform = RouterLinkTransform;
  34847. /***/ },
  34848. /* 250 */
  34849. /***/ function(module, exports, __webpack_require__) {
  34850. var profile_1 = __webpack_require__(45);
  34851. exports.wtfCreateScope = profile_1.wtfCreateScope;
  34852. exports.wtfLeave = profile_1.wtfLeave;
  34853. exports.wtfStartTimeRange = profile_1.wtfStartTimeRange;
  34854. exports.wtfEndTimeRange = profile_1.wtfEndTimeRange;
  34855. /***/ },
  34856. /* 251 */
  34857. /***/ function(module, exports, __webpack_require__) {
  34858. /**
  34859. * @module
  34860. * @description
  34861. * Adapter allowing AngularJS v1 and Angular v2 to run side by side in the same application.
  34862. */
  34863. var upgrade_adapter_1 = __webpack_require__(252);
  34864. exports.UpgradeAdapter = upgrade_adapter_1.UpgradeAdapter;
  34865. exports.UpgradeAdapterRef = upgrade_adapter_1.UpgradeAdapterRef;
  34866. /***/ },
  34867. /* 252 */
  34868. /***/ function(module, exports, __webpack_require__) {
  34869. var core_1 = __webpack_require__(2);
  34870. var async_1 = __webpack_require__(60);
  34871. var browser_1 = __webpack_require__(179);
  34872. var metadata_1 = __webpack_require__(253);
  34873. var util_1 = __webpack_require__(254);
  34874. var constants_1 = __webpack_require__(255);
  34875. var downgrade_ng2_adapter_1 = __webpack_require__(256);
  34876. var upgrade_ng1_adapter_1 = __webpack_require__(257);
  34877. var angular = __webpack_require__(258);
  34878. var upgradeCount = 0;
  34879. /**
  34880. * Use `UpgradeAdapter` to allow AngularJS v1 and Angular v2 to coexist in a single application.
  34881. *
  34882. * The `UpgradeAdapter` allows:
  34883. * 1. creation of Angular v2 component from AngularJS v1 component directive
  34884. * (See [UpgradeAdapter#upgradeNg1Component()])
  34885. * 2. creation of AngularJS v1 directive from Angular v2 component.
  34886. * (See [UpgradeAdapter#downgradeNg2Component()])
  34887. * 3. Bootstrapping of a hybrid Angular application which contains both of the frameworks
  34888. * coexisting in a single application.
  34889. *
  34890. * ## Mental Model
  34891. *
  34892. * When reasoning about how a hybrid application works it is useful to have a mental model which
  34893. * describes what is happening and explains what is happening at the lowest level.
  34894. *
  34895. * 1. There are two independent frameworks running in a single application, each framework treats
  34896. * the other as a black box.
  34897. * 2. Each DOM element on the page is owned exactly by one framework. Whichever framework
  34898. * instantiated the element is the owner. Each framework only updates/interacts with its own
  34899. * DOM elements and ignores others.
  34900. * 3. AngularJS v1 directives always execute inside AngularJS v1 framework codebase regardless of
  34901. * where they are instantiated.
  34902. * 4. Angular v2 components always execute inside Angular v2 framework codebase regardless of
  34903. * where they are instantiated.
  34904. * 5. An AngularJS v1 component can be upgraded to an Angular v2 component. This creates an
  34905. * Angular v2 directive, which bootstraps the AngularJS v1 component directive in that location.
  34906. * 6. An Angular v2 component can be downgraded to an AngularJS v1 component directive. This creates
  34907. * an AngularJS v1 directive, which bootstraps the Angular v2 component in that location.
  34908. * 7. Whenever an adapter component is instantiated the host element is owned by the framework
  34909. * doing the instantiation. The other framework then instantiates and owns the view for that
  34910. * component. This implies that component bindings will always follow the semantics of the
  34911. * instantiation framework. The syntax is always that of Angular v2 syntax.
  34912. * 8. AngularJS v1 is always bootstrapped first and owns the bottom most view.
  34913. * 9. The new application is running in Angular v2 zone, and therefore it no longer needs calls to
  34914. * `$apply()`.
  34915. *
  34916. * ### Example
  34917. *
  34918. * ```
  34919. * var adapter = new UpgradeAdapter();
  34920. * var module = angular.module('myExample', []);
  34921. * module.directive('ng2', adapter.downgradeNg2Component(Ng2));
  34922. *
  34923. * module.directive('ng1', function() {
  34924. * return {
  34925. * scope: { title: '=' },
  34926. * template: 'ng1[Hello {{title}}!](<span ng-transclude></span>)'
  34927. * };
  34928. * });
  34929. *
  34930. *
  34931. * @Component({
  34932. * selector: 'ng2',
  34933. * inputs: ['name'],
  34934. * template: 'ng2[<ng1 [title]="name">transclude</ng1>](<ng-content></ng-content>)',
  34935. * directives: [adapter.upgradeNg1Component('ng1')]
  34936. * })
  34937. * class Ng2 {
  34938. * }
  34939. *
  34940. * document.body.innerHTML = '<ng2 name="World">project</ng2>';
  34941. *
  34942. * adapter.bootstrap(document.body, ['myExample']).ready(function() {
  34943. * expect(document.body.textContent).toEqual(
  34944. * "ng2[ng1[Hello World!](transclude)](project)");
  34945. * });
  34946. * ```
  34947. */
  34948. var UpgradeAdapter = (function () {
  34949. function UpgradeAdapter() {
  34950. /* @internal */
  34951. this.idPrefix = "NG2_UPGRADE_" + upgradeCount++ + "_";
  34952. /* @internal */
  34953. this.upgradedComponents = [];
  34954. /* @internal */
  34955. this.downgradedComponents = {};
  34956. /* @internal */
  34957. this.providers = [];
  34958. }
  34959. /**
  34960. * Allows Angular v2 Component to be used from AngularJS v1.
  34961. *
  34962. * Use `downgradeNg2Component` to create an AngularJS v1 Directive Definition Factory from
  34963. * Angular v2 Component. The adapter will bootstrap Angular v2 component from within the
  34964. * AngularJS v1 template.
  34965. *
  34966. * ## Mental Model
  34967. *
  34968. * 1. The component is instantiated by being listed in AngularJS v1 template. This means that the
  34969. * host element is controlled by AngularJS v1, but the component's view will be controlled by
  34970. * Angular v2.
  34971. * 2. Even thought the component is instantiated in AngularJS v1, it will be using Angular v2
  34972. * syntax. This has to be done, this way because we must follow Angular v2 components do not
  34973. * declare how the attributes should be interpreted.
  34974. *
  34975. * ## Supported Features
  34976. *
  34977. * - Bindings:
  34978. * - Attribute: `<comp name="World">`
  34979. * - Interpolation: `<comp greeting="Hello {{name}}!">`
  34980. * - Expression: `<comp [name]="username">`
  34981. * - Event: `<comp (close)="doSomething()">`
  34982. * - Content projection: yes
  34983. *
  34984. * ### Example
  34985. *
  34986. * ```
  34987. * var adapter = new UpgradeAdapter();
  34988. * var module = angular.module('myExample', []);
  34989. * module.directive('greet', adapter.downgradeNg2Component(Greeter));
  34990. *
  34991. * @Component({
  34992. * selector: 'greet',
  34993. * template: '{{salutation}} {{name}}! - <ng-content></ng-content>'
  34994. * })
  34995. * class Greeter {
  34996. * @Input() salutation: string;
  34997. * @Input() name: string;
  34998. * }
  34999. *
  35000. * document.body.innerHTML =
  35001. * 'ng1 template: <greet salutation="Hello" [name]="world">text</greet>';
  35002. *
  35003. * adapter.bootstrap(document.body, ['myExample']).ready(function() {
  35004. * expect(document.body.textContent).toEqual("ng1 template: Hello world! - text");
  35005. * });
  35006. * ```
  35007. */
  35008. UpgradeAdapter.prototype.downgradeNg2Component = function (type) {
  35009. this.upgradedComponents.push(type);
  35010. var info = metadata_1.getComponentInfo(type);
  35011. return ng1ComponentDirective(info, "" + this.idPrefix + info.selector + "_c");
  35012. };
  35013. /**
  35014. * Allows AngularJS v1 Component to be used from Angular v2.
  35015. *
  35016. * Use `upgradeNg1Component` to create an Angular v2 component from AngularJS v1 Component
  35017. * directive. The adapter will bootstrap AngularJS v1 component from within the Angular v2
  35018. * template.
  35019. *
  35020. * ## Mental Model
  35021. *
  35022. * 1. The component is instantiated by being listed in Angular v2 template. This means that the
  35023. * host element is controlled by Angular v2, but the component's view will be controlled by
  35024. * AngularJS v1.
  35025. *
  35026. * ## Supported Features
  35027. *
  35028. * - Bindings:
  35029. * - Attribute: `<comp name="World">`
  35030. * - Interpolation: `<comp greeting="Hello {{name}}!">`
  35031. * - Expression: `<comp [name]="username">`
  35032. * - Event: `<comp (close)="doSomething()">`
  35033. * - Transclusion: yes
  35034. * - Only some of the features of
  35035. * [Directive Definition Object](https://docs.angularjs.org/api/ng/service/$compile) are
  35036. * supported:
  35037. * - `compile`: not supported because the host element is owned by Angular v2, which does
  35038. * not allow modifying DOM structure during compilation.
  35039. * - `controller`: supported. (NOTE: injection of `$attrs` and `$transclude` is not supported.)
  35040. * - `controllerAs': supported.
  35041. * - `bindToController': supported.
  35042. * - `link': supported. (NOTE: only pre-link function is supported.)
  35043. * - `name': supported.
  35044. * - `priority': ignored.
  35045. * - `replace': not supported.
  35046. * - `require`: supported.
  35047. * - `restrict`: must be set to 'E'.
  35048. * - `scope`: supported.
  35049. * - `template`: supported.
  35050. * - `templateUrl`: supported.
  35051. * - `terminal`: ignored.
  35052. * - `transclude`: supported.
  35053. *
  35054. *
  35055. * ### Example
  35056. *
  35057. * ```
  35058. * var adapter = new UpgradeAdapter();
  35059. * var module = angular.module('myExample', []);
  35060. *
  35061. * module.directive('greet', function() {
  35062. * return {
  35063. * scope: {salutation: '=', name: '=' },
  35064. * template: '{{salutation}} {{name}}! - <span ng-transclude></span>'
  35065. * };
  35066. * });
  35067. *
  35068. * module.directive('ng2', adapter.downgradeNg2Component(Ng2));
  35069. *
  35070. * @Component({
  35071. * selector: 'ng2',
  35072. * template: 'ng2 template: <greet salutation="Hello" [name]="world">text</greet>'
  35073. * directives: [adapter.upgradeNg1Component('greet')]
  35074. * })
  35075. * class Ng2 {
  35076. * }
  35077. *
  35078. * document.body.innerHTML = '<ng2></ng2>';
  35079. *
  35080. * adapter.bootstrap(document.body, ['myExample']).ready(function() {
  35081. * expect(document.body.textContent).toEqual("ng2 template: Hello world! - text");
  35082. * });
  35083. * ```
  35084. */
  35085. UpgradeAdapter.prototype.upgradeNg1Component = function (name) {
  35086. if (this.downgradedComponents.hasOwnProperty(name)) {
  35087. return this.downgradedComponents[name].type;
  35088. }
  35089. else {
  35090. return (this.downgradedComponents[name] = new upgrade_ng1_adapter_1.UpgradeNg1ComponentAdapterBuilder(name)).type;
  35091. }
  35092. };
  35093. /**
  35094. * Bootstrap a hybrid AngularJS v1 / Angular v2 application.
  35095. *
  35096. * This `bootstrap` method is a direct replacement (takes same arguments) for AngularJS v1
  35097. * [`bootstrap`](https://docs.angularjs.org/api/ng/function/angular.bootstrap) method. Unlike
  35098. * AngularJS v1, this bootstrap is asynchronous.
  35099. *
  35100. * ### Example
  35101. *
  35102. * ```
  35103. * var adapter = new UpgradeAdapter();
  35104. * var module = angular.module('myExample', []);
  35105. * module.directive('ng2', adapter.downgradeNg2Component(Ng2));
  35106. *
  35107. * module.directive('ng1', function() {
  35108. * return {
  35109. * scope: { title: '=' },
  35110. * template: 'ng1[Hello {{title}}!](<span ng-transclude></span>)'
  35111. * };
  35112. * });
  35113. *
  35114. *
  35115. * @Component({
  35116. * selector: 'ng2',
  35117. * inputs: ['name'],
  35118. * template: 'ng2[<ng1 [title]="name">transclude</ng1>](<ng-content></ng-content>)',
  35119. * directives: [adapter.upgradeNg1Component('ng1')]
  35120. * })
  35121. * class Ng2 {
  35122. * }
  35123. *
  35124. * document.body.innerHTML = '<ng2 name="World">project</ng2>';
  35125. *
  35126. * adapter.bootstrap(document.body, ['myExample']).ready(function() {
  35127. * expect(document.body.textContent).toEqual(
  35128. * "ng2[ng1[Hello World!](transclude)](project)");
  35129. * });
  35130. * ```
  35131. */
  35132. UpgradeAdapter.prototype.bootstrap = function (element, modules, config) {
  35133. var _this = this;
  35134. var upgrade = new UpgradeAdapterRef();
  35135. var ng1Injector = null;
  35136. var platformRef = core_1.platform(browser_1.BROWSER_PROVIDERS);
  35137. var applicationRef = platformRef.application([
  35138. browser_1.BROWSER_APP_PROVIDERS,
  35139. core_1.provide(constants_1.NG1_INJECTOR, { useFactory: function () { return ng1Injector; } }),
  35140. core_1.provide(constants_1.NG1_COMPILE, { useFactory: function () { return ng1Injector.get(constants_1.NG1_COMPILE); } }),
  35141. this.providers
  35142. ]);
  35143. var injector = applicationRef.injector;
  35144. var ngZone = injector.get(core_1.NgZone);
  35145. var compiler = injector.get(core_1.Compiler);
  35146. var delayApplyExps = [];
  35147. var original$applyFn;
  35148. var rootScopePrototype;
  35149. var rootScope;
  35150. var protoViewRefMap = {};
  35151. var ng1Module = angular.module(this.idPrefix, modules);
  35152. var ng1compilePromise = null;
  35153. ng1Module.value(constants_1.NG2_INJECTOR, injector)
  35154. .value(constants_1.NG2_ZONE, ngZone)
  35155. .value(constants_1.NG2_COMPILER, compiler)
  35156. .value(constants_1.NG2_PROTO_VIEW_REF_MAP, protoViewRefMap)
  35157. .value(constants_1.NG2_APP_VIEW_MANAGER, injector.get(core_1.AppViewManager))
  35158. .config([
  35159. '$provide',
  35160. function (provide) {
  35161. provide.decorator(constants_1.NG1_ROOT_SCOPE, [
  35162. '$delegate',
  35163. function (rootScopeDelegate) {
  35164. rootScopePrototype = rootScopeDelegate.constructor.prototype;
  35165. if (rootScopePrototype.hasOwnProperty('$apply')) {
  35166. original$applyFn = rootScopePrototype.$apply;
  35167. rootScopePrototype.$apply = function (exp) { return delayApplyExps.push(exp); };
  35168. }
  35169. else {
  35170. throw new Error("Failed to find '$apply' on '$rootScope'!");
  35171. }
  35172. return rootScope = rootScopeDelegate;
  35173. }
  35174. ]);
  35175. }
  35176. ])
  35177. .run([
  35178. '$injector',
  35179. '$rootScope',
  35180. function (injector, rootScope) {
  35181. ng1Injector = injector;
  35182. async_1.ObservableWrapper.subscribe(ngZone.onTurnDone, function (_) { ngZone.run(function () { return rootScope.$apply(); }); });
  35183. ng1compilePromise =
  35184. upgrade_ng1_adapter_1.UpgradeNg1ComponentAdapterBuilder.resolve(_this.downgradedComponents, injector);
  35185. }
  35186. ]);
  35187. angular.element(element).data(util_1.controllerKey(constants_1.NG2_INJECTOR), injector);
  35188. ngZone.run(function () { angular.bootstrap(element, [_this.idPrefix], config); });
  35189. Promise.all([this.compileNg2Components(compiler, protoViewRefMap), ng1compilePromise])
  35190. .then(function () {
  35191. ngZone.run(function () {
  35192. if (rootScopePrototype) {
  35193. rootScopePrototype.$apply = original$applyFn; // restore original $apply
  35194. while (delayApplyExps.length) {
  35195. rootScope.$apply(delayApplyExps.shift());
  35196. }
  35197. upgrade._bootstrapDone(applicationRef, ng1Injector);
  35198. rootScopePrototype = null;
  35199. }
  35200. });
  35201. }, util_1.onError);
  35202. return upgrade;
  35203. };
  35204. /**
  35205. * Adds a provider to the top level environment of a hybrid AngularJS v1 / Angular v2 application.
  35206. *
  35207. * In hybrid AngularJS v1 / Angular v2 application, there is no one root Angular v2 component,
  35208. * for this reason we provide an application global way of registering providers which is
  35209. * consistent with single global injection in AngularJS v1.
  35210. *
  35211. * ### Example
  35212. *
  35213. * ```
  35214. * class Greeter {
  35215. * greet(name) {
  35216. * alert('Hello ' + name + '!');
  35217. * }
  35218. * }
  35219. *
  35220. * @Component({
  35221. * selector: 'app',
  35222. * template: ''
  35223. * })
  35224. * class App {
  35225. * constructor(greeter: Greeter) {
  35226. * this.greeter('World');
  35227. * }
  35228. * }
  35229. *
  35230. * var adapter = new UpgradeAdapter();
  35231. * adapter.addProvider(Greeter);
  35232. *
  35233. * var module = angular.module('myExample', []);
  35234. * module.directive('app', adapter.downgradeNg2Component(App));
  35235. *
  35236. * document.body.innerHTML = '<app></app>'
  35237. * adapter.bootstrap(document.body, ['myExample']);
  35238. *```
  35239. */
  35240. UpgradeAdapter.prototype.addProvider = function (provider) { this.providers.push(provider); };
  35241. /**
  35242. * Allows AngularJS v1 service to be accessible from Angular v2.
  35243. *
  35244. *
  35245. * ### Example
  35246. *
  35247. * ```
  35248. * class Login { ... }
  35249. * class Server { ... }
  35250. *
  35251. * @Injectable()
  35252. * class Example {
  35253. * constructor(@Inject('server') server, login: Login) {
  35254. * ...
  35255. * }
  35256. * }
  35257. *
  35258. * var module = angular.module('myExample', []);
  35259. * module.service('server', Server);
  35260. * module.service('login', Login);
  35261. *
  35262. * var adapter = new UpgradeAdapter();
  35263. * adapter.upgradeNg1Provider('server');
  35264. * adapter.upgradeNg1Provider('login', {asToken: Login});
  35265. * adapter.addProvider(Example);
  35266. *
  35267. * adapter.bootstrap(document.body, ['myExample']).ready((ref) => {
  35268. * var example: Example = ref.ng2Injector.get(Example);
  35269. * });
  35270. *
  35271. * ```
  35272. */
  35273. UpgradeAdapter.prototype.upgradeNg1Provider = function (name, options) {
  35274. var token = options && options.asToken || name;
  35275. this.providers.push(core_1.provide(token, {
  35276. useFactory: function (ng1Injector) { return ng1Injector.get(name); },
  35277. deps: [constants_1.NG1_INJECTOR]
  35278. }));
  35279. };
  35280. /**
  35281. * Allows Angular v2 service to be accessible from AngularJS v1.
  35282. *
  35283. *
  35284. * ### Example
  35285. *
  35286. * ```
  35287. * class Example {
  35288. * }
  35289. *
  35290. * var adapter = new UpgradeAdapter();
  35291. * adapter.addProvider(Example);
  35292. *
  35293. * var module = angular.module('myExample', []);
  35294. * module.factory('example', adapter.downgradeNg2Provider(Example));
  35295. *
  35296. * adapter.bootstrap(document.body, ['myExample']).ready((ref) => {
  35297. * var example: Example = ref.ng1Injector.get('example');
  35298. * });
  35299. *
  35300. * ```
  35301. */
  35302. UpgradeAdapter.prototype.downgradeNg2Provider = function (token) {
  35303. var factory = function (injector) { return injector.get(token); };
  35304. factory.$inject = [constants_1.NG2_INJECTOR];
  35305. return factory;
  35306. };
  35307. /* @internal */
  35308. UpgradeAdapter.prototype.compileNg2Components = function (compiler, protoViewRefMap) {
  35309. var _this = this;
  35310. var promises = [];
  35311. var types = this.upgradedComponents;
  35312. for (var i = 0; i < types.length; i++) {
  35313. promises.push(compiler.compileInHost(types[i]));
  35314. }
  35315. return Promise.all(promises).then(function (protoViews) {
  35316. var types = _this.upgradedComponents;
  35317. for (var i = 0; i < protoViews.length; i++) {
  35318. protoViewRefMap[metadata_1.getComponentInfo(types[i]).selector] = protoViews[i];
  35319. }
  35320. return protoViewRefMap;
  35321. }, util_1.onError);
  35322. };
  35323. return UpgradeAdapter;
  35324. })();
  35325. exports.UpgradeAdapter = UpgradeAdapter;
  35326. function ng1ComponentDirective(info, idPrefix) {
  35327. directiveFactory.$inject = [constants_1.NG2_PROTO_VIEW_REF_MAP, constants_1.NG2_APP_VIEW_MANAGER, constants_1.NG1_PARSE];
  35328. function directiveFactory(protoViewRefMap, viewManager, parse) {
  35329. var protoView = protoViewRefMap[info.selector];
  35330. if (!protoView)
  35331. throw new Error('Expecting ProtoViewRef for: ' + info.selector);
  35332. var idCount = 0;
  35333. return {
  35334. restrict: 'E',
  35335. require: constants_1.REQUIRE_INJECTOR,
  35336. link: {
  35337. post: function (scope, element, attrs, parentInjector, transclude) {
  35338. var domElement = element[0];
  35339. var facade = new downgrade_ng2_adapter_1.DowngradeNg2ComponentAdapter(idPrefix + (idCount++), info, element, attrs, scope, parentInjector, parse, viewManager, protoView);
  35340. facade.setupInputs();
  35341. facade.bootstrapNg2();
  35342. facade.projectContent();
  35343. facade.setupOutputs();
  35344. facade.registerCleanup();
  35345. }
  35346. }
  35347. };
  35348. }
  35349. return directiveFactory;
  35350. }
  35351. /**
  35352. * Use `UgradeAdapterRef` to control a hybrid AngularJS v1 / Angular v2 application.
  35353. */
  35354. var UpgradeAdapterRef = (function () {
  35355. function UpgradeAdapterRef() {
  35356. /* @internal */
  35357. this._readyFn = null;
  35358. this.ng1RootScope = null;
  35359. this.ng1Injector = null;
  35360. this.ng2ApplicationRef = null;
  35361. this.ng2Injector = null;
  35362. }
  35363. /* @internal */
  35364. UpgradeAdapterRef.prototype._bootstrapDone = function (applicationRef, ng1Injector) {
  35365. this.ng2ApplicationRef = applicationRef;
  35366. this.ng2Injector = applicationRef.injector;
  35367. this.ng1Injector = ng1Injector;
  35368. this.ng1RootScope = ng1Injector.get(constants_1.NG1_ROOT_SCOPE);
  35369. this._readyFn && this._readyFn(this);
  35370. };
  35371. /**
  35372. * Register a callback function which is notified upon successful hybrid AngularJS v1 / Angular v2
  35373. * application has been bootstrapped.
  35374. *
  35375. * The `ready` callback function is invoked inside the Angular v2 zone, therefore it does not
  35376. * require a call to `$apply()`.
  35377. */
  35378. UpgradeAdapterRef.prototype.ready = function (fn) { this._readyFn = fn; };
  35379. /**
  35380. * Dispose of running hybrid AngularJS v1 / Angular v2 application.
  35381. */
  35382. UpgradeAdapterRef.prototype.dispose = function () {
  35383. this.ng1Injector.get(constants_1.NG1_ROOT_SCOPE).$destroy();
  35384. this.ng2ApplicationRef.dispose();
  35385. };
  35386. return UpgradeAdapterRef;
  35387. })();
  35388. exports.UpgradeAdapterRef = UpgradeAdapterRef;
  35389. /***/ },
  35390. /* 253 */
  35391. /***/ function(module, exports, __webpack_require__) {
  35392. var core_1 = __webpack_require__(2);
  35393. var COMPONENT_SELECTOR = /^[\w|-]*$/;
  35394. var SKEWER_CASE = /-(\w)/g;
  35395. var directiveResolver = new core_1.DirectiveResolver();
  35396. function getComponentInfo(type) {
  35397. var resolvedMetadata = directiveResolver.resolve(type);
  35398. var selector = resolvedMetadata.selector;
  35399. if (!selector.match(COMPONENT_SELECTOR)) {
  35400. throw new Error('Only selectors matching element names are supported, got: ' + selector);
  35401. }
  35402. var selector = selector.replace(SKEWER_CASE, function (all, letter) { return letter.toUpperCase(); });
  35403. return {
  35404. type: type,
  35405. selector: selector,
  35406. inputs: parseFields(resolvedMetadata.inputs),
  35407. outputs: parseFields(resolvedMetadata.outputs)
  35408. };
  35409. }
  35410. exports.getComponentInfo = getComponentInfo;
  35411. function parseFields(names) {
  35412. var attrProps = [];
  35413. if (names) {
  35414. for (var i = 0; i < names.length; i++) {
  35415. var parts = names[i].split(':');
  35416. var prop = parts[0].trim();
  35417. var attr = (parts[1] || parts[0]).trim();
  35418. var capitalAttr = attr.charAt(0).toUpperCase() + attr.substr(1);
  35419. attrProps.push({
  35420. prop: prop,
  35421. attr: attr,
  35422. bracketAttr: "[" + attr + "]",
  35423. parenAttr: "(" + attr + ")",
  35424. bracketParenAttr: "[(" + attr + ")]",
  35425. onAttr: "on" + capitalAttr,
  35426. bindAttr: "bind" + capitalAttr,
  35427. bindonAttr: "bindon" + capitalAttr
  35428. });
  35429. }
  35430. }
  35431. return attrProps;
  35432. }
  35433. exports.parseFields = parseFields;
  35434. /***/ },
  35435. /* 254 */
  35436. /***/ function(module, exports) {
  35437. function stringify(obj) {
  35438. if (typeof obj == 'function')
  35439. return obj.name || obj.toString();
  35440. return '' + obj;
  35441. }
  35442. exports.stringify = stringify;
  35443. function onError(e) {
  35444. // TODO: (misko): We seem to not have a stack trace here!
  35445. console.log(e, e.stack);
  35446. throw e;
  35447. }
  35448. exports.onError = onError;
  35449. function controllerKey(name) {
  35450. return '$' + name + 'Controller';
  35451. }
  35452. exports.controllerKey = controllerKey;
  35453. /***/ },
  35454. /* 255 */
  35455. /***/ function(module, exports) {
  35456. exports.NG2_APP_VIEW_MANAGER = 'ng2.AppViewManager';
  35457. exports.NG2_COMPILER = 'ng2.Compiler';
  35458. exports.NG2_INJECTOR = 'ng2.Injector';
  35459. exports.NG2_PROTO_VIEW_REF_MAP = 'ng2.ProtoViewRefMap';
  35460. exports.NG2_ZONE = 'ng2.NgZone';
  35461. exports.NG1_CONTROLLER = '$controller';
  35462. exports.NG1_SCOPE = '$scope';
  35463. exports.NG1_ROOT_SCOPE = '$rootScope';
  35464. exports.NG1_COMPILE = '$compile';
  35465. exports.NG1_HTTP_BACKEND = '$httpBackend';
  35466. exports.NG1_INJECTOR = '$injector';
  35467. exports.NG1_PARSE = '$parse';
  35468. exports.NG1_TEMPLATE_CACHE = '$templateCache';
  35469. exports.REQUIRE_INJECTOR = '^' + exports.NG2_INJECTOR;
  35470. /***/ },
  35471. /* 256 */
  35472. /***/ function(module, exports, __webpack_require__) {
  35473. var core_1 = __webpack_require__(2);
  35474. var constants_1 = __webpack_require__(255);
  35475. var INITIAL_VALUE = {
  35476. __UNINITIALIZED__: true
  35477. };
  35478. var DowngradeNg2ComponentAdapter = (function () {
  35479. function DowngradeNg2ComponentAdapter(id, info, element, attrs, scope, parentInjector, parse, viewManager, protoView) {
  35480. this.id = id;
  35481. this.info = info;
  35482. this.element = element;
  35483. this.attrs = attrs;
  35484. this.scope = scope;
  35485. this.parentInjector = parentInjector;
  35486. this.parse = parse;
  35487. this.viewManager = viewManager;
  35488. this.protoView = protoView;
  35489. this.component = null;
  35490. this.inputChangeCount = 0;
  35491. this.inputChanges = null;
  35492. this.hostViewRef = null;
  35493. this.changeDetector = null;
  35494. this.contentInserctionPoint = null;
  35495. this.element[0].id = id;
  35496. this.componentScope = scope.$new();
  35497. this.childNodes = element.contents();
  35498. }
  35499. DowngradeNg2ComponentAdapter.prototype.bootstrapNg2 = function () {
  35500. var childInjector = this.parentInjector.resolveAndCreateChild([core_1.provide(constants_1.NG1_SCOPE, { useValue: this.componentScope })]);
  35501. this.hostViewRef =
  35502. this.viewManager.createRootHostView(this.protoView, '#' + this.id, childInjector);
  35503. var renderer = this.hostViewRef.render;
  35504. var hostElement = this.viewManager.getHostElement(this.hostViewRef);
  35505. this.changeDetector = this.hostViewRef.changeDetectorRef;
  35506. this.component = this.viewManager.getComponent(hostElement);
  35507. this.contentInserctionPoint = renderer.rootContentInsertionPoints[0];
  35508. };
  35509. DowngradeNg2ComponentAdapter.prototype.setupInputs = function () {
  35510. var _this = this;
  35511. var attrs = this.attrs;
  35512. var inputs = this.info.inputs;
  35513. for (var i = 0; i < inputs.length; i++) {
  35514. var input = inputs[i];
  35515. var expr = null;
  35516. if (attrs.hasOwnProperty(input.attr)) {
  35517. var observeFn = (function (prop) {
  35518. var prevValue = INITIAL_VALUE;
  35519. return function (value) {
  35520. if (_this.inputChanges !== null) {
  35521. _this.inputChangeCount++;
  35522. _this.inputChanges[prop] =
  35523. new Ng1Change(value, prevValue === INITIAL_VALUE ? value : prevValue);
  35524. prevValue = value;
  35525. }
  35526. _this.component[prop] = value;
  35527. };
  35528. })(input.prop);
  35529. attrs.$observe(input.attr, observeFn);
  35530. }
  35531. else if (attrs.hasOwnProperty(input.bindAttr)) {
  35532. expr = attrs[input.bindAttr];
  35533. }
  35534. else if (attrs.hasOwnProperty(input.bracketAttr)) {
  35535. expr = attrs[input.bracketAttr];
  35536. }
  35537. else if (attrs.hasOwnProperty(input.bindonAttr)) {
  35538. expr = attrs[input.bindonAttr];
  35539. }
  35540. else if (attrs.hasOwnProperty(input.bracketParenAttr)) {
  35541. expr = attrs[input.bracketParenAttr];
  35542. }
  35543. if (expr != null) {
  35544. var watchFn = (function (prop) { return function (value, prevValue) {
  35545. if (_this.inputChanges != null) {
  35546. _this.inputChangeCount++;
  35547. _this.inputChanges[prop] = new Ng1Change(prevValue, value);
  35548. }
  35549. _this.component[prop] = value;
  35550. }; })(input.prop);
  35551. this.componentScope.$watch(expr, watchFn);
  35552. }
  35553. }
  35554. var prototype = this.info.type.prototype;
  35555. if (prototype && prototype.ngOnChanges) {
  35556. // Detect: OnChanges interface
  35557. this.inputChanges = {};
  35558. this.componentScope.$watch(function () { return _this.inputChangeCount; }, function () {
  35559. var inputChanges = _this.inputChanges;
  35560. _this.inputChanges = {};
  35561. _this.component.ngOnChanges(inputChanges);
  35562. });
  35563. }
  35564. this.componentScope.$watch(function () { return _this.changeDetector && _this.changeDetector.detectChanges(); });
  35565. };
  35566. DowngradeNg2ComponentAdapter.prototype.projectContent = function () {
  35567. var childNodes = this.childNodes;
  35568. if (this.contentInserctionPoint) {
  35569. var parent = this.contentInserctionPoint.parentNode;
  35570. for (var i = 0, ii = childNodes.length; i < ii; i++) {
  35571. parent.insertBefore(childNodes[i], this.contentInserctionPoint);
  35572. }
  35573. }
  35574. };
  35575. DowngradeNg2ComponentAdapter.prototype.setupOutputs = function () {
  35576. var _this = this;
  35577. var attrs = this.attrs;
  35578. var outputs = this.info.outputs;
  35579. for (var j = 0; j < outputs.length; j++) {
  35580. var output = outputs[j];
  35581. var expr = null;
  35582. var assignExpr = false;
  35583. var bindonAttr = output.bindonAttr ? output.bindonAttr.substring(0, output.bindonAttr.length - 6) : null;
  35584. var bracketParenAttr = output.bracketParenAttr ?
  35585. "[(" + output.bracketParenAttr.substring(2, output.bracketParenAttr.length - 8) + ")]" :
  35586. null;
  35587. if (attrs.hasOwnProperty(output.onAttr)) {
  35588. expr = attrs[output.onAttr];
  35589. }
  35590. else if (attrs.hasOwnProperty(output.parenAttr)) {
  35591. expr = attrs[output.parenAttr];
  35592. }
  35593. else if (attrs.hasOwnProperty(bindonAttr)) {
  35594. expr = attrs[bindonAttr];
  35595. assignExpr = true;
  35596. }
  35597. else if (attrs.hasOwnProperty(bracketParenAttr)) {
  35598. expr = attrs[bracketParenAttr];
  35599. assignExpr = true;
  35600. }
  35601. if (expr != null && assignExpr != null) {
  35602. var getter = this.parse(expr);
  35603. var setter = getter.assign;
  35604. if (assignExpr && !setter) {
  35605. throw new Error("Expression '" + expr + "' is not assignable!");
  35606. }
  35607. var emitter = this.component[output.prop];
  35608. if (emitter) {
  35609. emitter.subscribe({
  35610. next: assignExpr ? (function (setter) { return function (value) { return setter(_this.scope, value); }; })(setter) :
  35611. (function (getter) { return function (value) { return getter(_this.scope, { $event: value }); }; })(getter)
  35612. });
  35613. }
  35614. else {
  35615. throw new Error("Missing emitter '" + output.prop + "' on component '" + this.info.selector + "'!");
  35616. }
  35617. }
  35618. }
  35619. };
  35620. DowngradeNg2ComponentAdapter.prototype.registerCleanup = function () {
  35621. var _this = this;
  35622. this.element.bind('$remove', function () { return _this.viewManager.destroyRootHostView(_this.hostViewRef); });
  35623. };
  35624. return DowngradeNg2ComponentAdapter;
  35625. })();
  35626. exports.DowngradeNg2ComponentAdapter = DowngradeNg2ComponentAdapter;
  35627. var Ng1Change = (function () {
  35628. function Ng1Change(previousValue, currentValue) {
  35629. this.previousValue = previousValue;
  35630. this.currentValue = currentValue;
  35631. }
  35632. Ng1Change.prototype.isFirstChange = function () { return this.previousValue === this.currentValue; };
  35633. return Ng1Change;
  35634. })();
  35635. /***/ },
  35636. /* 257 */
  35637. /***/ function(module, exports, __webpack_require__) {
  35638. var core_1 = __webpack_require__(2);
  35639. var constants_1 = __webpack_require__(255);
  35640. var util_1 = __webpack_require__(254);
  35641. var angular = __webpack_require__(258);
  35642. var CAMEL_CASE = /([A-Z])/g;
  35643. var INITIAL_VALUE = {
  35644. __UNINITIALIZED__: true
  35645. };
  35646. var NOT_SUPPORTED = 'NOT_SUPPORTED';
  35647. var UpgradeNg1ComponentAdapterBuilder = (function () {
  35648. function UpgradeNg1ComponentAdapterBuilder(name) {
  35649. this.name = name;
  35650. this.inputs = [];
  35651. this.inputsRename = [];
  35652. this.outputs = [];
  35653. this.outputsRename = [];
  35654. this.propertyOutputs = [];
  35655. this.checkProperties = [];
  35656. this.propertyMap = {};
  35657. this.linkFn = null;
  35658. this.directive = null;
  35659. this.$controller = null;
  35660. var selector = name.replace(CAMEL_CASE, function (all, next) { return '-' + next.toLowerCase(); });
  35661. var self = this;
  35662. this.type =
  35663. core_1.Directive({ selector: selector, inputs: this.inputsRename, outputs: this.outputsRename })
  35664. .Class({
  35665. constructor: [
  35666. new core_1.Inject(constants_1.NG1_SCOPE),
  35667. core_1.ElementRef,
  35668. function (scope, elementRef) {
  35669. return new UpgradeNg1ComponentAdapter(self.linkFn, scope, self.directive, elementRef, self.$controller, self.inputs, self.outputs, self.propertyOutputs, self.checkProperties, self.propertyMap);
  35670. }
  35671. ],
  35672. ngOnChanges: function () { },
  35673. ngDoCheck: function () { }
  35674. });
  35675. }
  35676. UpgradeNg1ComponentAdapterBuilder.prototype.extractDirective = function (injector) {
  35677. var directives = injector.get(this.name + 'Directive');
  35678. if (directives.length > 1) {
  35679. throw new Error('Only support single directive definition for: ' + this.name);
  35680. }
  35681. var directive = directives[0];
  35682. if (directive.replace)
  35683. this.notSupported('replace');
  35684. if (directive.terminal)
  35685. this.notSupported('terminal');
  35686. var link = directive.link;
  35687. if (typeof link == 'object') {
  35688. if (link.post)
  35689. this.notSupported('link.post');
  35690. }
  35691. return directive;
  35692. };
  35693. UpgradeNg1ComponentAdapterBuilder.prototype.notSupported = function (feature) {
  35694. throw new Error("Upgraded directive '" + this.name + "' does not support '" + feature + "'.");
  35695. };
  35696. UpgradeNg1ComponentAdapterBuilder.prototype.extractBindings = function () {
  35697. var scope = this.directive.scope;
  35698. if (typeof scope == 'object') {
  35699. for (var name in scope) {
  35700. if (scope.hasOwnProperty(name)) {
  35701. var localName = scope[name];
  35702. var type = localName.charAt(0);
  35703. localName = localName.substr(1) || name;
  35704. var outputName = 'output_' + name;
  35705. var outputNameRename = outputName + ': ' + name;
  35706. var outputNameRenameChange = outputName + ': ' + name + 'Change';
  35707. var inputName = 'input_' + name;
  35708. var inputNameRename = inputName + ': ' + name;
  35709. switch (type) {
  35710. case '=':
  35711. this.propertyOutputs.push(outputName);
  35712. this.checkProperties.push(localName);
  35713. this.outputs.push(outputName);
  35714. this.outputsRename.push(outputNameRenameChange);
  35715. this.propertyMap[outputName] = localName;
  35716. // don't break; let it fall through to '@'
  35717. case '@':
  35718. this.inputs.push(inputName);
  35719. this.inputsRename.push(inputNameRename);
  35720. this.propertyMap[inputName] = localName;
  35721. break;
  35722. case '&':
  35723. this.outputs.push(outputName);
  35724. this.outputsRename.push(outputNameRename);
  35725. this.propertyMap[outputName] = localName;
  35726. break;
  35727. default:
  35728. var json = JSON.stringify(scope);
  35729. throw new Error("Unexpected mapping '" + type + "' in '" + json + "' in '" + this.name + "' directive.");
  35730. }
  35731. }
  35732. }
  35733. }
  35734. };
  35735. UpgradeNg1ComponentAdapterBuilder.prototype.compileTemplate = function (compile, templateCache, httpBackend) {
  35736. var _this = this;
  35737. if (this.directive.template !== undefined) {
  35738. this.linkFn = compileHtml(this.directive.template);
  35739. }
  35740. else if (this.directive.templateUrl) {
  35741. var url = this.directive.templateUrl;
  35742. var html = templateCache.get(url);
  35743. if (html !== undefined) {
  35744. this.linkFn = compileHtml(html);
  35745. }
  35746. else {
  35747. return new Promise(function (resolve, err) {
  35748. httpBackend('GET', url, null, function (status, response) {
  35749. if (status == 200) {
  35750. resolve(_this.linkFn = compileHtml(templateCache.put(url, response)));
  35751. }
  35752. else {
  35753. err("GET " + url + " returned " + status + ": " + response);
  35754. }
  35755. });
  35756. });
  35757. }
  35758. }
  35759. else {
  35760. throw new Error("Directive '" + this.name + "' is not a component, it is missing template.");
  35761. }
  35762. return null;
  35763. function compileHtml(html) {
  35764. var div = document.createElement('div');
  35765. div.innerHTML = html;
  35766. return compile(div.childNodes);
  35767. }
  35768. };
  35769. UpgradeNg1ComponentAdapterBuilder.resolve = function (exportedComponents, injector) {
  35770. var promises = [];
  35771. var compile = injector.get(constants_1.NG1_COMPILE);
  35772. var templateCache = injector.get(constants_1.NG1_TEMPLATE_CACHE);
  35773. var httpBackend = injector.get(constants_1.NG1_HTTP_BACKEND);
  35774. var $controller = injector.get(constants_1.NG1_CONTROLLER);
  35775. for (var name in exportedComponents) {
  35776. if (exportedComponents.hasOwnProperty(name)) {
  35777. var exportedComponent = exportedComponents[name];
  35778. exportedComponent.directive = exportedComponent.extractDirective(injector);
  35779. exportedComponent.$controller = $controller;
  35780. exportedComponent.extractBindings();
  35781. var promise = exportedComponent.compileTemplate(compile, templateCache, httpBackend);
  35782. if (promise)
  35783. promises.push(promise);
  35784. }
  35785. }
  35786. return Promise.all(promises);
  35787. };
  35788. return UpgradeNg1ComponentAdapterBuilder;
  35789. })();
  35790. exports.UpgradeNg1ComponentAdapterBuilder = UpgradeNg1ComponentAdapterBuilder;
  35791. var UpgradeNg1ComponentAdapter = (function () {
  35792. function UpgradeNg1ComponentAdapter(linkFn, scope, directive, elementRef, $controller, inputs, outputs, propOuts, checkProperties, propertyMap) {
  35793. this.directive = directive;
  35794. this.inputs = inputs;
  35795. this.outputs = outputs;
  35796. this.propOuts = propOuts;
  35797. this.checkProperties = checkProperties;
  35798. this.propertyMap = propertyMap;
  35799. this.destinationObj = null;
  35800. this.checkLastValues = [];
  35801. var element = elementRef.nativeElement;
  35802. var childNodes = [];
  35803. var childNode;
  35804. while (childNode = element.firstChild) {
  35805. element.removeChild(childNode);
  35806. childNodes.push(childNode);
  35807. }
  35808. var componentScope = scope.$new(!!directive.scope);
  35809. var $element = angular.element(element);
  35810. var controllerType = directive.controller;
  35811. var controller = null;
  35812. if (controllerType) {
  35813. var locals = { $scope: componentScope, $element: $element };
  35814. controller = $controller(controllerType, locals, null, directive.controllerAs);
  35815. $element.data(util_1.controllerKey(directive.name), controller);
  35816. }
  35817. var link = directive.link;
  35818. if (typeof link == 'object')
  35819. link = link.pre;
  35820. if (link) {
  35821. var attrs = NOT_SUPPORTED;
  35822. var transcludeFn = NOT_SUPPORTED;
  35823. var linkController = this.resolveRequired($element, directive.require);
  35824. directive.link(componentScope, $element, attrs, linkController, transcludeFn);
  35825. }
  35826. this.destinationObj = directive.bindToController && controller ? controller : componentScope;
  35827. linkFn(componentScope, function (clonedElement, scope) {
  35828. for (var i = 0, ii = clonedElement.length; i < ii; i++) {
  35829. element.appendChild(clonedElement[i]);
  35830. }
  35831. }, { parentBoundTranscludeFn: function (scope, cloneAttach) { cloneAttach(childNodes); } });
  35832. for (var i = 0; i < inputs.length; i++) {
  35833. this[inputs[i]] = null;
  35834. }
  35835. for (var j = 0; j < outputs.length; j++) {
  35836. var emitter = this[outputs[j]] = new core_1.EventEmitter();
  35837. this.setComponentProperty(outputs[j], (function (emitter) { return function (value) { return emitter.emit(value); }; })(emitter));
  35838. }
  35839. for (var k = 0; k < propOuts.length; k++) {
  35840. this[propOuts[k]] = new core_1.EventEmitter();
  35841. this.checkLastValues.push(INITIAL_VALUE);
  35842. }
  35843. }
  35844. UpgradeNg1ComponentAdapter.prototype.ngOnChanges = function (changes) {
  35845. for (var name in changes) {
  35846. if (changes.hasOwnProperty(name)) {
  35847. var change = changes[name];
  35848. this.setComponentProperty(name, change.currentValue);
  35849. }
  35850. }
  35851. };
  35852. UpgradeNg1ComponentAdapter.prototype.ngDoCheck = function () {
  35853. var count = 0;
  35854. var destinationObj = this.destinationObj;
  35855. var lastValues = this.checkLastValues;
  35856. var checkProperties = this.checkProperties;
  35857. for (var i = 0; i < checkProperties.length; i++) {
  35858. var value = destinationObj[checkProperties[i]];
  35859. var last = lastValues[i];
  35860. if (value !== last) {
  35861. if (typeof value == 'number' && isNaN(value) && typeof last == 'number' && isNaN(last)) {
  35862. }
  35863. else {
  35864. var eventEmitter = this[this.propOuts[i]];
  35865. eventEmitter.emit(lastValues[i] = value);
  35866. }
  35867. }
  35868. }
  35869. return count;
  35870. };
  35871. UpgradeNg1ComponentAdapter.prototype.setComponentProperty = function (name, value) {
  35872. this.destinationObj[this.propertyMap[name]] = value;
  35873. };
  35874. UpgradeNg1ComponentAdapter.prototype.resolveRequired = function ($element, require) {
  35875. if (!require) {
  35876. return undefined;
  35877. }
  35878. else if (typeof require == 'string') {
  35879. var name = require;
  35880. var isOptional = false;
  35881. var startParent = false;
  35882. var searchParents = false;
  35883. var ch;
  35884. if (name.charAt(0) == '?') {
  35885. isOptional = true;
  35886. name = name.substr(1);
  35887. }
  35888. if (name.charAt(0) == '^') {
  35889. searchParents = true;
  35890. name = name.substr(1);
  35891. }
  35892. if (name.charAt(0) == '^') {
  35893. startParent = true;
  35894. name = name.substr(1);
  35895. }
  35896. var key = util_1.controllerKey(name);
  35897. if (startParent)
  35898. $element = $element.parent();
  35899. var dep = searchParents ? $element.inheritedData(key) : $element.data(key);
  35900. if (!dep && !isOptional) {
  35901. throw new Error("Can not locate '" + require + "' in '" + this.directive.name + "'.");
  35902. }
  35903. return dep;
  35904. }
  35905. else if (require instanceof Array) {
  35906. var deps = [];
  35907. for (var i = 0; i < require.length; i++) {
  35908. deps.push(this.resolveRequired($element, require[i]));
  35909. }
  35910. return deps;
  35911. }
  35912. throw new Error("Directive '" + this.directive.name + "' require syntax unrecognized: " + this.directive.require);
  35913. };
  35914. return UpgradeNg1ComponentAdapter;
  35915. })();
  35916. /***/ },
  35917. /* 258 */
  35918. /***/ function(module, exports) {
  35919. function noNg() {
  35920. throw new Error('AngularJS v1.x is not loaded!');
  35921. }
  35922. var angular = { bootstrap: noNg, module: noNg, element: noNg, version: noNg };
  35923. try {
  35924. if (window.hasOwnProperty('angular')) {
  35925. angular = window.angular;
  35926. }
  35927. }
  35928. catch (e) {
  35929. }
  35930. exports.bootstrap = angular.bootstrap;
  35931. exports.module = angular.module;
  35932. exports.element = angular.element;
  35933. exports.version = angular.version;
  35934. /***/ },
  35935. /* 259 */
  35936. /***/ function(module, exports, __webpack_require__) {
  35937. function __export(m) {
  35938. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  35939. }
  35940. /**
  35941. * @module
  35942. * @description
  35943. * This module is used for writing tests for applications written in Angular.
  35944. *
  35945. * This module is not included in the `angular2` module; you must import the test module explicitly.
  35946. *
  35947. */
  35948. __export(__webpack_require__(260));
  35949. var test_component_builder_1 = __webpack_require__(267);
  35950. exports.ComponentFixture = test_component_builder_1.ComponentFixture;
  35951. exports.TestComponentBuilder = test_component_builder_1.TestComponentBuilder;
  35952. __export(__webpack_require__(261));
  35953. __export(__webpack_require__(274));
  35954. var view_resolver_mock_1 = __webpack_require__(264);
  35955. exports.MockViewResolver = view_resolver_mock_1.MockViewResolver;
  35956. var xhr_mock_1 = __webpack_require__(275);
  35957. exports.MockXHR = xhr_mock_1.MockXHR;
  35958. var ng_zone_mock_1 = __webpack_require__(266);
  35959. exports.MockNgZone = ng_zone_mock_1.MockNgZone;
  35960. var mock_application_ref_1 = __webpack_require__(276);
  35961. exports.MockApplicationRef = mock_application_ref_1.MockApplicationRef;
  35962. var directive_resolver_mock_1 = __webpack_require__(263);
  35963. exports.MockDirectiveResolver = directive_resolver_mock_1.MockDirectiveResolver;
  35964. /***/ },
  35965. /* 260 */
  35966. /***/ function(module, exports, __webpack_require__) {
  35967. /**
  35968. * Public Test Library for unit testing Angular2 Applications. Uses the
  35969. * Jasmine framework.
  35970. */
  35971. var lang_1 = __webpack_require__(5);
  35972. var collection_1 = __webpack_require__(12);
  35973. var test_injector_1 = __webpack_require__(261);
  35974. var test_injector_2 = __webpack_require__(261);
  35975. exports.inject = test_injector_2.inject;
  35976. exports.injectAsync = test_injector_2.injectAsync;
  35977. var matchers_1 = __webpack_require__(273);
  35978. exports.expect = matchers_1.expect;
  35979. var _global = (typeof window === 'undefined' ? lang_1.global : window);
  35980. /**
  35981. * Run a function (with an optional asynchronous callback) after each test case.
  35982. *
  35983. * See http://jasmine.github.io/ for more details.
  35984. *
  35985. * ## Example:
  35986. *
  35987. * {@example testing/ts/testing.ts region='afterEach'}
  35988. */
  35989. exports.afterEach = _global.afterEach;
  35990. /**
  35991. * Group test cases together under a common description prefix.
  35992. *
  35993. * See http://jasmine.github.io/ for more details.
  35994. *
  35995. * ## Example:
  35996. *
  35997. * {@example testing/ts/testing.ts region='describeIt'}
  35998. */
  35999. exports.describe = _global.describe;
  36000. /**
  36001. * See {@link fdescribe}.
  36002. */
  36003. exports.ddescribe = _global.fdescribe;
  36004. /**
  36005. * Like {@link describe}, but instructs the test runner to only run
  36006. * the test cases in this group. This is useful for debugging.
  36007. *
  36008. * See http://jasmine.github.io/ for more details.
  36009. *
  36010. * ## Example:
  36011. *
  36012. * {@example testing/ts/testing.ts region='fdescribe'}
  36013. */
  36014. exports.fdescribe = _global.fdescribe;
  36015. /**
  36016. * Like {@link describe}, but instructs the test runner to exclude
  36017. * this group of test cases from execution. This is useful for
  36018. * debugging, or for excluding broken tests until they can be fixed.
  36019. *
  36020. * See http://jasmine.github.io/ for more details.
  36021. *
  36022. * ## Example:
  36023. *
  36024. * {@example testing/ts/testing.ts region='xdescribe'}
  36025. */
  36026. exports.xdescribe = _global.xdescribe;
  36027. var jsmBeforeEach = _global.beforeEach;
  36028. var jsmIt = _global.it;
  36029. var jsmIIt = _global.fit;
  36030. var jsmXIt = _global.xit;
  36031. var testProviders;
  36032. var injector;
  36033. // Reset the test providers before each test.
  36034. jsmBeforeEach(function () {
  36035. testProviders = [];
  36036. injector = null;
  36037. });
  36038. /**
  36039. * Allows overriding default providers of the test injector,
  36040. * which are defined in test_injector.js.
  36041. *
  36042. * The given function must return a list of DI providers.
  36043. *
  36044. * ## Example:
  36045. *
  36046. * {@example testing/ts/testing.ts region='beforeEachProviders'}
  36047. */
  36048. function beforeEachProviders(fn) {
  36049. jsmBeforeEach(function () {
  36050. var providers = fn();
  36051. if (!providers)
  36052. return;
  36053. testProviders = testProviders.concat(providers);
  36054. if (injector !== null) {
  36055. throw new Error('beforeEachProviders was called after the injector had ' +
  36056. 'been used in a beforeEach or it block. This invalidates the ' +
  36057. 'test injector');
  36058. }
  36059. });
  36060. }
  36061. exports.beforeEachProviders = beforeEachProviders;
  36062. function _isPromiseLike(input) {
  36063. return input && !!(input.then);
  36064. }
  36065. function runInTestZone(fnToExecute, finishCallback, failCallback) {
  36066. var pendingMicrotasks = 0;
  36067. var pendingTimeouts = [];
  36068. var ngTestZone = lang_1.global.zone
  36069. .fork({
  36070. onError: function (e) { failCallback(e); },
  36071. '$run': function (parentRun) {
  36072. return function () {
  36073. try {
  36074. return parentRun.apply(this, arguments);
  36075. }
  36076. finally {
  36077. if (pendingMicrotasks == 0 && pendingTimeouts.length == 0) {
  36078. finishCallback();
  36079. }
  36080. }
  36081. };
  36082. },
  36083. '$scheduleMicrotask': function (parentScheduleMicrotask) {
  36084. return function (fn) {
  36085. pendingMicrotasks++;
  36086. var microtask = function () {
  36087. try {
  36088. fn();
  36089. }
  36090. finally {
  36091. pendingMicrotasks--;
  36092. }
  36093. };
  36094. parentScheduleMicrotask.call(this, microtask);
  36095. };
  36096. },
  36097. '$setTimeout': function (parentSetTimeout) {
  36098. return function (fn, delay) {
  36099. var args = [];
  36100. for (var _i = 2; _i < arguments.length; _i++) {
  36101. args[_i - 2] = arguments[_i];
  36102. }
  36103. var id;
  36104. var cb = function () {
  36105. fn();
  36106. collection_1.ListWrapper.remove(pendingTimeouts, id);
  36107. };
  36108. id = parentSetTimeout(cb, delay, args);
  36109. pendingTimeouts.push(id);
  36110. return id;
  36111. };
  36112. },
  36113. '$clearTimeout': function (parentClearTimeout) {
  36114. return function (id) {
  36115. parentClearTimeout(id);
  36116. collection_1.ListWrapper.remove(pendingTimeouts, id);
  36117. };
  36118. },
  36119. });
  36120. return ngTestZone.run(fnToExecute);
  36121. }
  36122. function _it(jsmFn, name, testFn, testTimeOut) {
  36123. var timeOut = testTimeOut;
  36124. if (testFn instanceof test_injector_1.FunctionWithParamTokens) {
  36125. jsmFn(name, function (done) {
  36126. if (!injector) {
  36127. injector = test_injector_1.createTestInjectorWithRuntimeCompiler(testProviders);
  36128. }
  36129. var finishCallback = function () {
  36130. // Wait one more event loop to make sure we catch unreturned promises and
  36131. // promise rejections.
  36132. setTimeout(done, 0);
  36133. };
  36134. var returnedTestValue = runInTestZone(function () { return testFn.execute(injector); }, finishCallback, done.fail);
  36135. if (testFn.isAsync) {
  36136. if (_isPromiseLike(returnedTestValue)) {
  36137. returnedTestValue.then(null, function (err) { done.fail(err); });
  36138. }
  36139. else {
  36140. done.fail('Error: injectAsync was expected to return a promise, but the ' +
  36141. ' returned value was: ' + returnedTestValue);
  36142. }
  36143. }
  36144. else {
  36145. if (!(returnedTestValue === undefined)) {
  36146. done.fail('Error: inject returned a value. Did you mean to use injectAsync? Returned ' +
  36147. 'value was: ' + returnedTestValue);
  36148. }
  36149. }
  36150. }, timeOut);
  36151. }
  36152. else {
  36153. // The test case doesn't use inject(). ie `it('test', (done) => { ... }));`
  36154. jsmFn(name, testFn, timeOut);
  36155. }
  36156. }
  36157. /**
  36158. * Wrapper around Jasmine beforeEach function.
  36159. *
  36160. * beforeEach may be used with the `inject` function to fetch dependencies.
  36161. * The test will automatically wait for any asynchronous calls inside the
  36162. * injected test function to complete.
  36163. *
  36164. * See http://jasmine.github.io/ for more details.
  36165. *
  36166. * ## Example:
  36167. *
  36168. * {@example testing/ts/testing.ts region='beforeEach'}
  36169. */
  36170. function beforeEach(fn) {
  36171. if (fn instanceof test_injector_1.FunctionWithParamTokens) {
  36172. // The test case uses inject(). ie `beforeEach(inject([ClassA], (a) => { ...
  36173. // }));`
  36174. jsmBeforeEach(function (done) {
  36175. var finishCallback = function () {
  36176. // Wait one more event loop to make sure we catch unreturned promises and
  36177. // promise rejections.
  36178. setTimeout(done, 0);
  36179. };
  36180. if (!injector) {
  36181. injector = test_injector_1.createTestInjectorWithRuntimeCompiler(testProviders);
  36182. }
  36183. var returnedTestValue = runInTestZone(function () { return fn.execute(injector); }, finishCallback, done.fail);
  36184. if (fn.isAsync) {
  36185. if (_isPromiseLike(returnedTestValue)) {
  36186. returnedTestValue.then(null, function (err) { done.fail(err); });
  36187. }
  36188. else {
  36189. done.fail('Error: injectAsync was expected to return a promise, but the ' +
  36190. ' returned value was: ' + returnedTestValue);
  36191. }
  36192. }
  36193. else {
  36194. if (!(returnedTestValue === undefined)) {
  36195. done.fail('Error: inject returned a value. Did you mean to use injectAsync? Returned ' +
  36196. 'value was: ' + returnedTestValue);
  36197. }
  36198. }
  36199. });
  36200. }
  36201. else {
  36202. // The test case doesn't use inject(). ie `beforeEach((done) => { ... }));`
  36203. if (fn.length === 0) {
  36204. jsmBeforeEach(function () { fn(); });
  36205. }
  36206. else {
  36207. jsmBeforeEach(function (done) { fn(done); });
  36208. }
  36209. }
  36210. }
  36211. exports.beforeEach = beforeEach;
  36212. /**
  36213. * Define a single test case with the given test name and execution function.
  36214. *
  36215. * The test function can be either a synchronous function, an asynchronous function
  36216. * that takes a completion callback, or an injected function created via {@link inject}
  36217. * or {@link injectAsync}. The test will automatically wait for any asynchronous calls
  36218. * inside the injected test function to complete.
  36219. *
  36220. * Wrapper around Jasmine it function. See http://jasmine.github.io/ for more details.
  36221. *
  36222. * ## Example:
  36223. *
  36224. * {@example testing/ts/testing.ts region='describeIt'}
  36225. */
  36226. function it(name, fn, timeOut) {
  36227. if (timeOut === void 0) { timeOut = null; }
  36228. return _it(jsmIt, name, fn, timeOut);
  36229. }
  36230. exports.it = it;
  36231. /**
  36232. * Like {@link it}, but instructs the test runner to exclude this test
  36233. * entirely. Useful for debugging or for excluding broken tests until
  36234. * they can be fixed.
  36235. *
  36236. * Wrapper around Jasmine xit function. See http://jasmine.github.io/ for more details.
  36237. *
  36238. * ## Example:
  36239. *
  36240. * {@example testing/ts/testing.ts region='xit'}
  36241. */
  36242. function xit(name, fn, timeOut) {
  36243. if (timeOut === void 0) { timeOut = null; }
  36244. return _it(jsmXIt, name, fn, timeOut);
  36245. }
  36246. exports.xit = xit;
  36247. /**
  36248. * See {@link fit}.
  36249. */
  36250. function iit(name, fn, timeOut) {
  36251. if (timeOut === void 0) { timeOut = null; }
  36252. return _it(jsmIIt, name, fn, timeOut);
  36253. }
  36254. exports.iit = iit;
  36255. /**
  36256. * Like {@link it}, but instructs the test runner to only run this test.
  36257. * Useful for debugging.
  36258. *
  36259. * Wrapper around Jasmine fit function. See http://jasmine.github.io/ for more details.
  36260. *
  36261. * ## Example:
  36262. *
  36263. * {@example testing/ts/testing.ts region='fit'}
  36264. */
  36265. function fit(name, fn, timeOut) {
  36266. if (timeOut === void 0) { timeOut = null; }
  36267. return _it(jsmIIt, name, fn, timeOut);
  36268. }
  36269. exports.fit = fit;
  36270. /***/ },
  36271. /* 261 */
  36272. /***/ function(module, exports, __webpack_require__) {
  36273. var core_1 = __webpack_require__(2);
  36274. var animation_builder_1 = __webpack_require__(189);
  36275. var animation_builder_mock_1 = __webpack_require__(262);
  36276. var proto_view_factory_1 = __webpack_require__(71);
  36277. var reflection_1 = __webpack_require__(16);
  36278. var change_detection_1 = __webpack_require__(25);
  36279. var exceptions_1 = __webpack_require__(14);
  36280. var pipe_resolver_1 = __webpack_require__(94);
  36281. var xhr_1 = __webpack_require__(149);
  36282. var dom_adapter_1 = __webpack_require__(178);
  36283. var directive_resolver_mock_1 = __webpack_require__(263);
  36284. var view_resolver_mock_1 = __webpack_require__(264);
  36285. var mock_location_strategy_1 = __webpack_require__(265);
  36286. var location_strategy_1 = __webpack_require__(238);
  36287. var ng_zone_mock_1 = __webpack_require__(266);
  36288. var test_component_builder_1 = __webpack_require__(267);
  36289. var common_dom_1 = __webpack_require__(203);
  36290. var collection_1 = __webpack_require__(12);
  36291. var lang_1 = __webpack_require__(5);
  36292. var view_pool_1 = __webpack_require__(85);
  36293. var view_manager_utils_1 = __webpack_require__(82);
  36294. var dom_tokens_1 = __webpack_require__(187);
  36295. var dom_renderer_1 = __webpack_require__(188);
  36296. var shared_styles_host_1 = __webpack_require__(196);
  36297. var shared_styles_host_2 = __webpack_require__(196);
  36298. var dom_events_1 = __webpack_require__(182);
  36299. var serializer_1 = __webpack_require__(269);
  36300. var utils_1 = __webpack_require__(268);
  36301. var compiler_1 = __webpack_require__(150);
  36302. var dom_renderer_2 = __webpack_require__(188);
  36303. var dynamic_component_loader_1 = __webpack_require__(69);
  36304. var view_manager_1 = __webpack_require__(81);
  36305. /**
  36306. * Returns the root injector providers.
  36307. *
  36308. * This must be kept in sync with the _rootBindings in application.js
  36309. *
  36310. * @returns {any[]}
  36311. */
  36312. function _getRootProviders() {
  36313. return [core_1.provide(reflection_1.Reflector, { useValue: reflection_1.reflector })];
  36314. }
  36315. /**
  36316. * Returns the application injector providers.
  36317. *
  36318. * This must be kept in sync with _injectorBindings() in application.js
  36319. *
  36320. * @returns {any[]}
  36321. */
  36322. function _getAppBindings() {
  36323. var appDoc;
  36324. // The document is only available in browser environment
  36325. try {
  36326. appDoc = dom_adapter_1.DOM.defaultDoc();
  36327. }
  36328. catch (e) {
  36329. appDoc = null;
  36330. }
  36331. return [
  36332. core_1.APPLICATION_COMMON_PROVIDERS,
  36333. core_1.provide(change_detection_1.ChangeDetectorGenConfig, { useValue: new change_detection_1.ChangeDetectorGenConfig(true, false, true) }),
  36334. core_1.provide(dom_tokens_1.DOCUMENT, { useValue: appDoc }),
  36335. core_1.provide(dom_renderer_1.DomRenderer, { useClass: dom_renderer_2.DomRenderer_ }),
  36336. core_1.provide(core_1.Renderer, { useExisting: dom_renderer_1.DomRenderer }),
  36337. core_1.provide(core_1.APP_ID, { useValue: 'a' }),
  36338. shared_styles_host_1.DomSharedStylesHost,
  36339. core_1.provide(shared_styles_host_2.SharedStylesHost, { useExisting: shared_styles_host_1.DomSharedStylesHost }),
  36340. view_pool_1.AppViewPool,
  36341. core_1.provide(core_1.AppViewManager, { useClass: view_manager_1.AppViewManager_ }),
  36342. view_manager_utils_1.AppViewManagerUtils,
  36343. serializer_1.Serializer,
  36344. common_dom_1.ELEMENT_PROBE_PROVIDERS,
  36345. core_1.provide(view_pool_1.APP_VIEW_POOL_CAPACITY, { useValue: 500 }),
  36346. proto_view_factory_1.ProtoViewFactory,
  36347. core_1.provide(core_1.DirectiveResolver, { useClass: directive_resolver_mock_1.MockDirectiveResolver }),
  36348. core_1.provide(core_1.ViewResolver, { useClass: view_resolver_mock_1.MockViewResolver }),
  36349. core_1.provide(change_detection_1.IterableDiffers, { useValue: change_detection_1.defaultIterableDiffers }),
  36350. core_1.provide(change_detection_1.KeyValueDiffers, { useValue: change_detection_1.defaultKeyValueDiffers }),
  36351. utils_1.Log,
  36352. core_1.provide(core_1.DynamicComponentLoader, { useClass: dynamic_component_loader_1.DynamicComponentLoader_ }),
  36353. pipe_resolver_1.PipeResolver,
  36354. core_1.provide(exceptions_1.ExceptionHandler, { useValue: new exceptions_1.ExceptionHandler(dom_adapter_1.DOM) }),
  36355. core_1.provide(location_strategy_1.LocationStrategy, { useClass: mock_location_strategy_1.MockLocationStrategy }),
  36356. core_1.provide(xhr_1.XHR, { useClass: dom_adapter_1.DOM.getXHR() }),
  36357. test_component_builder_1.TestComponentBuilder,
  36358. core_1.provide(core_1.NgZone, { useClass: ng_zone_mock_1.MockNgZone }),
  36359. core_1.provide(animation_builder_1.AnimationBuilder, { useClass: animation_builder_mock_1.MockAnimationBuilder }),
  36360. common_dom_1.EventManager,
  36361. new core_1.Provider(common_dom_1.EVENT_MANAGER_PLUGINS, { useClass: dom_events_1.DomEventsPlugin, multi: true })
  36362. ];
  36363. }
  36364. function _runtimeCompilerBindings() {
  36365. return [
  36366. core_1.provide(xhr_1.XHR, { useClass: dom_adapter_1.DOM.getXHR() }),
  36367. compiler_1.COMPILER_PROVIDERS,
  36368. ];
  36369. }
  36370. function createTestInjector(providers) {
  36371. var rootInjector = core_1.Injector.resolveAndCreate(_getRootProviders());
  36372. return rootInjector.resolveAndCreateChild(collection_1.ListWrapper.concat(_getAppBindings(), providers));
  36373. }
  36374. exports.createTestInjector = createTestInjector;
  36375. function createTestInjectorWithRuntimeCompiler(providers) {
  36376. return createTestInjector(collection_1.ListWrapper.concat(_runtimeCompilerBindings(), providers));
  36377. }
  36378. exports.createTestInjectorWithRuntimeCompiler = createTestInjectorWithRuntimeCompiler;
  36379. /**
  36380. * Allows injecting dependencies in `beforeEach()` and `it()`.
  36381. *
  36382. * Example:
  36383. *
  36384. * ```
  36385. * beforeEach(inject([Dependency, AClass], (dep, object) => {
  36386. * // some code that uses `dep` and `object`
  36387. * // ...
  36388. * }));
  36389. *
  36390. * it('...', inject([AClass], (object) => {
  36391. * object.doSomething();
  36392. * expect(...);
  36393. * })
  36394. * ```
  36395. *
  36396. * Notes:
  36397. * - inject is currently a function because of some Traceur limitation the syntax should eventually
  36398. * becomes `it('...', @Inject (object: AClass, async: AsyncTestCompleter) => { ... });`
  36399. *
  36400. * @param {Array} tokens
  36401. * @param {Function} fn
  36402. * @return {FunctionWithParamTokens}
  36403. */
  36404. function inject(tokens, fn) {
  36405. return new FunctionWithParamTokens(tokens, fn, false);
  36406. }
  36407. exports.inject = inject;
  36408. /**
  36409. * Allows injecting dependencies in `beforeEach()` and `it()`. The test must return
  36410. * a promise which will resolve when all asynchronous activity is complete.
  36411. *
  36412. * Example:
  36413. *
  36414. * ```
  36415. * it('...', injectAsync([AClass], (object) => {
  36416. * return object.doSomething().then(() => {
  36417. * expect(...);
  36418. * });
  36419. * })
  36420. * ```
  36421. *
  36422. * @param {Array} tokens
  36423. * @param {Function} fn
  36424. * @return {FunctionWithParamTokens}
  36425. */
  36426. function injectAsync(tokens, fn) {
  36427. return new FunctionWithParamTokens(tokens, fn, true);
  36428. }
  36429. exports.injectAsync = injectAsync;
  36430. var FunctionWithParamTokens = (function () {
  36431. function FunctionWithParamTokens(_tokens, _fn, isAsync) {
  36432. this._tokens = _tokens;
  36433. this._fn = _fn;
  36434. this.isAsync = isAsync;
  36435. }
  36436. /**
  36437. * Returns the value of the executed function.
  36438. */
  36439. FunctionWithParamTokens.prototype.execute = function (injector) {
  36440. var params = this._tokens.map(function (t) { return injector.get(t); });
  36441. return lang_1.FunctionWrapper.apply(this._fn, params);
  36442. };
  36443. FunctionWithParamTokens.prototype.hasToken = function (token) { return this._tokens.indexOf(token) > -1; };
  36444. return FunctionWithParamTokens;
  36445. })();
  36446. exports.FunctionWithParamTokens = FunctionWithParamTokens;
  36447. /***/ },
  36448. /* 262 */
  36449. /***/ function(module, exports, __webpack_require__) {
  36450. var __extends = (this && this.__extends) || function (d, b) {
  36451. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  36452. function __() { this.constructor = d; }
  36453. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  36454. };
  36455. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  36456. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  36457. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  36458. 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;
  36459. return c > 3 && r && Object.defineProperty(target, key, r), r;
  36460. };
  36461. var __metadata = (this && this.__metadata) || function (k, v) {
  36462. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  36463. };
  36464. var di_1 = __webpack_require__(6);
  36465. var animation_builder_1 = __webpack_require__(189);
  36466. var css_animation_builder_1 = __webpack_require__(190);
  36467. var animation_1 = __webpack_require__(192);
  36468. var browser_details_1 = __webpack_require__(195);
  36469. var MockAnimationBuilder = (function (_super) {
  36470. __extends(MockAnimationBuilder, _super);
  36471. function MockAnimationBuilder() {
  36472. _super.call(this, null);
  36473. }
  36474. MockAnimationBuilder.prototype.css = function () { return new MockCssAnimationBuilder(); };
  36475. MockAnimationBuilder = __decorate([
  36476. di_1.Injectable(),
  36477. __metadata('design:paramtypes', [])
  36478. ], MockAnimationBuilder);
  36479. return MockAnimationBuilder;
  36480. })(animation_builder_1.AnimationBuilder);
  36481. exports.MockAnimationBuilder = MockAnimationBuilder;
  36482. var MockCssAnimationBuilder = (function (_super) {
  36483. __extends(MockCssAnimationBuilder, _super);
  36484. function MockCssAnimationBuilder() {
  36485. _super.call(this, null);
  36486. }
  36487. MockCssAnimationBuilder.prototype.start = function (element) { return new MockAnimation(element, this.data); };
  36488. return MockCssAnimationBuilder;
  36489. })(css_animation_builder_1.CssAnimationBuilder);
  36490. var MockBrowserAbstraction = (function (_super) {
  36491. __extends(MockBrowserAbstraction, _super);
  36492. function MockBrowserAbstraction() {
  36493. _super.apply(this, arguments);
  36494. }
  36495. MockBrowserAbstraction.prototype.doesElapsedTimeIncludesDelay = function () { this.elapsedTimeIncludesDelay = false; };
  36496. return MockBrowserAbstraction;
  36497. })(browser_details_1.BrowserDetails);
  36498. var MockAnimation = (function (_super) {
  36499. __extends(MockAnimation, _super);
  36500. function MockAnimation(element, data) {
  36501. _super.call(this, element, data, new MockBrowserAbstraction());
  36502. }
  36503. MockAnimation.prototype.wait = function (callback) { this._callback = callback; };
  36504. MockAnimation.prototype.flush = function () {
  36505. this._callback(0);
  36506. this._callback = null;
  36507. };
  36508. return MockAnimation;
  36509. })(animation_1.Animation);
  36510. /***/ },
  36511. /* 263 */
  36512. /***/ function(module, exports, __webpack_require__) {
  36513. var __extends = (this && this.__extends) || function (d, b) {
  36514. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  36515. function __() { this.constructor = d; }
  36516. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  36517. };
  36518. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  36519. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  36520. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  36521. 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;
  36522. return c > 3 && r && Object.defineProperty(target, key, r), r;
  36523. };
  36524. var __metadata = (this && this.__metadata) || function (k, v) {
  36525. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  36526. };
  36527. var di_1 = __webpack_require__(6);
  36528. var collection_1 = __webpack_require__(12);
  36529. var lang_1 = __webpack_require__(5);
  36530. var metadata_1 = __webpack_require__(3);
  36531. var directive_resolver_1 = __webpack_require__(92);
  36532. /**
  36533. * An implementation of {@link DirectiveResolver} that allows overriding
  36534. * various properties of directives.
  36535. */
  36536. var MockDirectiveResolver = (function (_super) {
  36537. __extends(MockDirectiveResolver, _super);
  36538. function MockDirectiveResolver() {
  36539. _super.apply(this, arguments);
  36540. this._providerOverrides = new collection_1.Map();
  36541. this.viewProviderOverrides = new collection_1.Map();
  36542. }
  36543. MockDirectiveResolver.prototype.resolve = function (type) {
  36544. var dm = _super.prototype.resolve.call(this, type);
  36545. var providerOverrides = this._providerOverrides.get(type);
  36546. var viewProviderOverrides = this.viewProviderOverrides.get(type);
  36547. var providers = dm.providers;
  36548. if (lang_1.isPresent(providerOverrides)) {
  36549. providers = dm.providers.concat(providerOverrides);
  36550. }
  36551. if (dm instanceof metadata_1.ComponentMetadata) {
  36552. var viewProviders = dm.viewProviders;
  36553. if (lang_1.isPresent(viewProviderOverrides)) {
  36554. viewProviders = dm.viewProviders.concat(viewProviderOverrides);
  36555. }
  36556. return new metadata_1.ComponentMetadata({
  36557. selector: dm.selector,
  36558. inputs: dm.inputs,
  36559. outputs: dm.outputs,
  36560. host: dm.host,
  36561. exportAs: dm.exportAs,
  36562. moduleId: dm.moduleId,
  36563. queries: dm.queries,
  36564. changeDetection: dm.changeDetection,
  36565. providers: providers,
  36566. viewProviders: viewProviders
  36567. });
  36568. }
  36569. return new metadata_1.DirectiveMetadata({
  36570. selector: dm.selector,
  36571. inputs: dm.inputs,
  36572. outputs: dm.outputs,
  36573. host: dm.host,
  36574. providers: providers,
  36575. exportAs: dm.exportAs,
  36576. queries: dm.queries
  36577. });
  36578. };
  36579. /**
  36580. * @deprecated
  36581. */
  36582. MockDirectiveResolver.prototype.setBindingsOverride = function (type, bindings) {
  36583. this._providerOverrides.set(type, bindings);
  36584. };
  36585. /**
  36586. * @deprecated
  36587. */
  36588. MockDirectiveResolver.prototype.setViewBindingsOverride = function (type, viewBindings) {
  36589. this.viewProviderOverrides.set(type, viewBindings);
  36590. };
  36591. MockDirectiveResolver.prototype.setProvidersOverride = function (type, bindings) {
  36592. this._providerOverrides.set(type, bindings);
  36593. };
  36594. MockDirectiveResolver.prototype.setViewProvidersOverride = function (type, viewBindings) {
  36595. this.viewProviderOverrides.set(type, viewBindings);
  36596. };
  36597. MockDirectiveResolver = __decorate([
  36598. di_1.Injectable(),
  36599. __metadata('design:paramtypes', [])
  36600. ], MockDirectiveResolver);
  36601. return MockDirectiveResolver;
  36602. })(directive_resolver_1.DirectiveResolver);
  36603. exports.MockDirectiveResolver = MockDirectiveResolver;
  36604. /***/ },
  36605. /* 264 */
  36606. /***/ function(module, exports, __webpack_require__) {
  36607. var __extends = (this && this.__extends) || function (d, b) {
  36608. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  36609. function __() { this.constructor = d; }
  36610. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  36611. };
  36612. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  36613. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  36614. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  36615. 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;
  36616. return c > 3 && r && Object.defineProperty(target, key, r), r;
  36617. };
  36618. var __metadata = (this && this.__metadata) || function (k, v) {
  36619. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  36620. };
  36621. var di_1 = __webpack_require__(6);
  36622. var collection_1 = __webpack_require__(12);
  36623. var lang_1 = __webpack_require__(5);
  36624. var exceptions_1 = __webpack_require__(14);
  36625. var metadata_1 = __webpack_require__(3);
  36626. var view_resolver_1 = __webpack_require__(93);
  36627. var MockViewResolver = (function (_super) {
  36628. __extends(MockViewResolver, _super);
  36629. function MockViewResolver() {
  36630. _super.call(this);
  36631. /** @internal */
  36632. this._views = new collection_1.Map();
  36633. /** @internal */
  36634. this._inlineTemplates = new collection_1.Map();
  36635. /** @internal */
  36636. this._viewCache = new collection_1.Map();
  36637. /** @internal */
  36638. this._directiveOverrides = new collection_1.Map();
  36639. }
  36640. /**
  36641. * Overrides the {@link ViewMetadata} for a component.
  36642. *
  36643. * @param {Type} component
  36644. * @param {ViewDefinition} view
  36645. */
  36646. MockViewResolver.prototype.setView = function (component, view) {
  36647. this._checkOverrideable(component);
  36648. this._views.set(component, view);
  36649. };
  36650. /**
  36651. * Overrides the inline template for a component - other configuration remains unchanged.
  36652. *
  36653. * @param {Type} component
  36654. * @param {string} template
  36655. */
  36656. MockViewResolver.prototype.setInlineTemplate = function (component, template) {
  36657. this._checkOverrideable(component);
  36658. this._inlineTemplates.set(component, template);
  36659. };
  36660. /**
  36661. * Overrides a directive from the component {@link ViewMetadata}.
  36662. *
  36663. * @param {Type} component
  36664. * @param {Type} from
  36665. * @param {Type} to
  36666. */
  36667. MockViewResolver.prototype.overrideViewDirective = function (component, from, to) {
  36668. this._checkOverrideable(component);
  36669. var overrides = this._directiveOverrides.get(component);
  36670. if (lang_1.isBlank(overrides)) {
  36671. overrides = new collection_1.Map();
  36672. this._directiveOverrides.set(component, overrides);
  36673. }
  36674. overrides.set(from, to);
  36675. };
  36676. /**
  36677. * Returns the {@link ViewMetadata} for a component:
  36678. * - Set the {@link ViewMetadata} to the overridden view when it exists or fallback to the default
  36679. * `ViewResolver`,
  36680. * see `setView`.
  36681. * - Override the directives, see `overrideViewDirective`.
  36682. * - Override the @View definition, see `setInlineTemplate`.
  36683. *
  36684. * @param component
  36685. * @returns {ViewDefinition}
  36686. */
  36687. MockViewResolver.prototype.resolve = function (component) {
  36688. var view = this._viewCache.get(component);
  36689. if (lang_1.isPresent(view))
  36690. return view;
  36691. view = this._views.get(component);
  36692. if (lang_1.isBlank(view)) {
  36693. view = _super.prototype.resolve.call(this, component);
  36694. }
  36695. var directives = view.directives;
  36696. var overrides = this._directiveOverrides.get(component);
  36697. if (lang_1.isPresent(overrides) && lang_1.isPresent(directives)) {
  36698. directives = collection_1.ListWrapper.clone(view.directives);
  36699. overrides.forEach(function (to, from) {
  36700. var srcIndex = directives.indexOf(from);
  36701. if (srcIndex == -1) {
  36702. throw new exceptions_1.BaseException("Overriden directive " + lang_1.stringify(from) + " not found in the template of " + lang_1.stringify(component));
  36703. }
  36704. directives[srcIndex] = to;
  36705. });
  36706. view = new metadata_1.ViewMetadata({ template: view.template, templateUrl: view.templateUrl, directives: directives });
  36707. }
  36708. var inlineTemplate = this._inlineTemplates.get(component);
  36709. if (lang_1.isPresent(inlineTemplate)) {
  36710. view = new metadata_1.ViewMetadata({ template: inlineTemplate, templateUrl: null, directives: view.directives });
  36711. }
  36712. this._viewCache.set(component, view);
  36713. return view;
  36714. };
  36715. /**
  36716. * @internal
  36717. *
  36718. * Once a component has been compiled, the AppProtoView is stored in the compiler cache.
  36719. *
  36720. * Then it should not be possible to override the component configuration after the component
  36721. * has been compiled.
  36722. *
  36723. * @param {Type} component
  36724. */
  36725. MockViewResolver.prototype._checkOverrideable = function (component) {
  36726. var cached = this._viewCache.get(component);
  36727. if (lang_1.isPresent(cached)) {
  36728. throw new exceptions_1.BaseException("The component " + lang_1.stringify(component) + " has already been compiled, its configuration can not be changed");
  36729. }
  36730. };
  36731. MockViewResolver = __decorate([
  36732. di_1.Injectable(),
  36733. __metadata('design:paramtypes', [])
  36734. ], MockViewResolver);
  36735. return MockViewResolver;
  36736. })(view_resolver_1.ViewResolver);
  36737. exports.MockViewResolver = MockViewResolver;
  36738. /***/ },
  36739. /* 265 */
  36740. /***/ function(module, exports, __webpack_require__) {
  36741. var __extends = (this && this.__extends) || function (d, b) {
  36742. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  36743. function __() { this.constructor = d; }
  36744. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  36745. };
  36746. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  36747. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  36748. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  36749. 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;
  36750. return c > 3 && r && Object.defineProperty(target, key, r), r;
  36751. };
  36752. var __metadata = (this && this.__metadata) || function (k, v) {
  36753. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  36754. };
  36755. var di_1 = __webpack_require__(6);
  36756. var async_1 = __webpack_require__(60);
  36757. var location_strategy_1 = __webpack_require__(238);
  36758. /**
  36759. * A mock implementation of {@link LocationStrategy} that allows tests to fire simulated
  36760. * location events.
  36761. */
  36762. var MockLocationStrategy = (function (_super) {
  36763. __extends(MockLocationStrategy, _super);
  36764. function MockLocationStrategy() {
  36765. _super.call(this);
  36766. this.internalBaseHref = '/';
  36767. this.internalPath = '/';
  36768. this.internalTitle = '';
  36769. this.urlChanges = [];
  36770. /** @internal */
  36771. this._subject = new async_1.EventEmitter();
  36772. }
  36773. MockLocationStrategy.prototype.simulatePopState = function (url) {
  36774. this.internalPath = url;
  36775. async_1.ObservableWrapper.callEmit(this._subject, new _MockPopStateEvent(this.path()));
  36776. };
  36777. MockLocationStrategy.prototype.path = function () { return this.internalPath; };
  36778. MockLocationStrategy.prototype.prepareExternalUrl = function (internal) {
  36779. if (internal.startsWith('/') && this.internalBaseHref.endsWith('/')) {
  36780. return this.internalBaseHref + internal.substring(1);
  36781. }
  36782. return this.internalBaseHref + internal;
  36783. };
  36784. MockLocationStrategy.prototype.pushState = function (ctx, title, path, query) {
  36785. this.internalTitle = title;
  36786. var url = path + (query.length > 0 ? ('?' + query) : '');
  36787. this.internalPath = url;
  36788. var externalUrl = this.prepareExternalUrl(url);
  36789. this.urlChanges.push(externalUrl);
  36790. };
  36791. MockLocationStrategy.prototype.replaceState = function (ctx, title, path, query) {
  36792. this.internalTitle = title;
  36793. var url = path + (query.length > 0 ? ('?' + query) : '');
  36794. this.internalPath = url;
  36795. var externalUrl = this.prepareExternalUrl(url);
  36796. this.urlChanges.push('replace: ' + externalUrl);
  36797. };
  36798. MockLocationStrategy.prototype.onPopState = function (fn) { async_1.ObservableWrapper.subscribe(this._subject, fn); };
  36799. MockLocationStrategy.prototype.getBaseHref = function () { return this.internalBaseHref; };
  36800. MockLocationStrategy.prototype.back = function () {
  36801. if (this.urlChanges.length > 0) {
  36802. this.urlChanges.pop();
  36803. var nextUrl = this.urlChanges.length > 0 ? this.urlChanges[this.urlChanges.length - 1] : '';
  36804. this.simulatePopState(nextUrl);
  36805. }
  36806. };
  36807. MockLocationStrategy.prototype.forward = function () { throw 'not implemented'; };
  36808. MockLocationStrategy = __decorate([
  36809. di_1.Injectable(),
  36810. __metadata('design:paramtypes', [])
  36811. ], MockLocationStrategy);
  36812. return MockLocationStrategy;
  36813. })(location_strategy_1.LocationStrategy);
  36814. exports.MockLocationStrategy = MockLocationStrategy;
  36815. var _MockPopStateEvent = (function () {
  36816. function _MockPopStateEvent(newUrl) {
  36817. this.newUrl = newUrl;
  36818. this.pop = true;
  36819. this.type = 'popstate';
  36820. }
  36821. return _MockPopStateEvent;
  36822. })();
  36823. /***/ },
  36824. /* 266 */
  36825. /***/ function(module, exports, __webpack_require__) {
  36826. var __extends = (this && this.__extends) || function (d, b) {
  36827. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  36828. function __() { this.constructor = d; }
  36829. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  36830. };
  36831. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  36832. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  36833. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  36834. 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;
  36835. return c > 3 && r && Object.defineProperty(target, key, r), r;
  36836. };
  36837. var __metadata = (this && this.__metadata) || function (k, v) {
  36838. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  36839. };
  36840. var di_1 = __webpack_require__(6);
  36841. var ng_zone_1 = __webpack_require__(66);
  36842. var async_1 = __webpack_require__(60);
  36843. /**
  36844. * A mock implementation of {@link NgZone}.
  36845. */
  36846. var MockNgZone = (function (_super) {
  36847. __extends(MockNgZone, _super);
  36848. function MockNgZone() {
  36849. _super.call(this, { enableLongStackTrace: false });
  36850. this._mockOnEventDone = new async_1.EventEmitter(false);
  36851. }
  36852. Object.defineProperty(MockNgZone.prototype, "onEventDone", {
  36853. get: function () { return this._mockOnEventDone; },
  36854. enumerable: true,
  36855. configurable: true
  36856. });
  36857. MockNgZone.prototype.run = function (fn) { return fn(); };
  36858. MockNgZone.prototype.runOutsideAngular = function (fn) { return fn(); };
  36859. MockNgZone.prototype.simulateZoneExit = function () { async_1.ObservableWrapper.callNext(this.onEventDone, null); };
  36860. MockNgZone = __decorate([
  36861. di_1.Injectable(),
  36862. __metadata('design:paramtypes', [])
  36863. ], MockNgZone);
  36864. return MockNgZone;
  36865. })(ng_zone_1.NgZone);
  36866. exports.MockNgZone = MockNgZone;
  36867. /***/ },
  36868. /* 267 */
  36869. /***/ function(module, exports, __webpack_require__) {
  36870. var __extends = (this && this.__extends) || function (d, b) {
  36871. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  36872. function __() { this.constructor = d; }
  36873. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  36874. };
  36875. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  36876. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  36877. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  36878. 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;
  36879. return c > 3 && r && Object.defineProperty(target, key, r), r;
  36880. };
  36881. var __metadata = (this && this.__metadata) || function (k, v) {
  36882. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  36883. };
  36884. var core_1 = __webpack_require__(2);
  36885. var lang_1 = __webpack_require__(5);
  36886. var collection_1 = __webpack_require__(12);
  36887. var view_ref_1 = __webpack_require__(77);
  36888. var utils_1 = __webpack_require__(268);
  36889. var dom_tokens_1 = __webpack_require__(187);
  36890. var dom_adapter_1 = __webpack_require__(178);
  36891. var debug_element_1 = __webpack_require__(101);
  36892. /**
  36893. * Fixture for debugging and testing a component.
  36894. */
  36895. var ComponentFixture = (function () {
  36896. function ComponentFixture() {
  36897. }
  36898. return ComponentFixture;
  36899. })();
  36900. exports.ComponentFixture = ComponentFixture;
  36901. var ComponentFixture_ = (function (_super) {
  36902. __extends(ComponentFixture_, _super);
  36903. function ComponentFixture_(componentRef) {
  36904. _super.call(this);
  36905. this.debugElement = new debug_element_1.DebugElement_(view_ref_1.internalView(componentRef.hostView), 0);
  36906. this.componentInstance = this.debugElement.componentInstance;
  36907. this.nativeElement = this.debugElement.nativeElement;
  36908. this._componentParentView = view_ref_1.internalView(componentRef.hostView);
  36909. this._componentRef = componentRef;
  36910. }
  36911. ComponentFixture_.prototype.detectChanges = function () {
  36912. this._componentParentView.changeDetector.detectChanges();
  36913. this._componentParentView.changeDetector.checkNoChanges();
  36914. };
  36915. ComponentFixture_.prototype.destroy = function () { this._componentRef.dispose(); };
  36916. return ComponentFixture_;
  36917. })(ComponentFixture);
  36918. exports.ComponentFixture_ = ComponentFixture_;
  36919. var _nextRootElementId = 0;
  36920. /**
  36921. * Builds a ComponentFixture for use in component level tests.
  36922. */
  36923. var TestComponentBuilder = (function () {
  36924. function TestComponentBuilder(_injector) {
  36925. this._injector = _injector;
  36926. /** @internal */
  36927. this._bindingsOverrides = new Map();
  36928. /** @internal */
  36929. this._directiveOverrides = new Map();
  36930. /** @internal */
  36931. this._templateOverrides = new Map();
  36932. /** @internal */
  36933. this._viewBindingsOverrides = new Map();
  36934. /** @internal */
  36935. this._viewOverrides = new Map();
  36936. }
  36937. /** @internal */
  36938. TestComponentBuilder.prototype._clone = function () {
  36939. var clone = new TestComponentBuilder(this._injector);
  36940. clone._viewOverrides = collection_1.MapWrapper.clone(this._viewOverrides);
  36941. clone._directiveOverrides = collection_1.MapWrapper.clone(this._directiveOverrides);
  36942. clone._templateOverrides = collection_1.MapWrapper.clone(this._templateOverrides);
  36943. return clone;
  36944. };
  36945. /**
  36946. * Overrides only the html of a {@link ComponentMetadata}.
  36947. * All the other properties of the component's {@link ViewMetadata} are preserved.
  36948. *
  36949. * @param {Type} component
  36950. * @param {string} html
  36951. *
  36952. * @return {TestComponentBuilder}
  36953. */
  36954. TestComponentBuilder.prototype.overrideTemplate = function (componentType, template) {
  36955. var clone = this._clone();
  36956. clone._templateOverrides.set(componentType, template);
  36957. return clone;
  36958. };
  36959. /**
  36960. * Overrides a component's {@link ViewMetadata}.
  36961. *
  36962. * @param {Type} component
  36963. * @param {view} View
  36964. *
  36965. * @return {TestComponentBuilder}
  36966. */
  36967. TestComponentBuilder.prototype.overrideView = function (componentType, view) {
  36968. var clone = this._clone();
  36969. clone._viewOverrides.set(componentType, view);
  36970. return clone;
  36971. };
  36972. /**
  36973. * Overrides the directives from the component {@link ViewMetadata}.
  36974. *
  36975. * @param {Type} component
  36976. * @param {Type} from
  36977. * @param {Type} to
  36978. *
  36979. * @return {TestComponentBuilder}
  36980. */
  36981. TestComponentBuilder.prototype.overrideDirective = function (componentType, from, to) {
  36982. var clone = this._clone();
  36983. var overridesForComponent = clone._directiveOverrides.get(componentType);
  36984. if (!lang_1.isPresent(overridesForComponent)) {
  36985. clone._directiveOverrides.set(componentType, new Map());
  36986. overridesForComponent = clone._directiveOverrides.get(componentType);
  36987. }
  36988. overridesForComponent.set(from, to);
  36989. return clone;
  36990. };
  36991. /**
  36992. * Overrides one or more injectables configured via `providers` metadata property of a directive
  36993. * or
  36994. * component.
  36995. * Very useful when certain providers need to be mocked out.
  36996. *
  36997. * The providers specified via this method are appended to the existing `providers` causing the
  36998. * duplicated providers to
  36999. * be overridden.
  37000. *
  37001. * @param {Type} component
  37002. * @param {any[]} providers
  37003. *
  37004. * @return {TestComponentBuilder}
  37005. */
  37006. TestComponentBuilder.prototype.overrideProviders = function (type, providers) {
  37007. var clone = this._clone();
  37008. clone._bindingsOverrides.set(type, providers);
  37009. return clone;
  37010. };
  37011. /**
  37012. * @deprecated
  37013. */
  37014. TestComponentBuilder.prototype.overrideBindings = function (type, providers) {
  37015. return this.overrideProviders(type, providers);
  37016. };
  37017. /**
  37018. * Overrides one or more injectables configured via `providers` metadata property of a directive
  37019. * or
  37020. * component.
  37021. * Very useful when certain providers need to be mocked out.
  37022. *
  37023. * The providers specified via this method are appended to the existing `providers` causing the
  37024. * duplicated providers to
  37025. * be overridden.
  37026. *
  37027. * @param {Type} component
  37028. * @param {any[]} providers
  37029. *
  37030. * @return {TestComponentBuilder}
  37031. */
  37032. TestComponentBuilder.prototype.overrideViewProviders = function (type, providers) {
  37033. var clone = this._clone();
  37034. clone._viewBindingsOverrides.set(type, providers);
  37035. return clone;
  37036. };
  37037. /**
  37038. * @deprecated
  37039. */
  37040. TestComponentBuilder.prototype.overrideViewBindings = function (type, providers) {
  37041. return this.overrideViewProviders(type, providers);
  37042. };
  37043. /**
  37044. * Builds and returns a ComponentFixture.
  37045. *
  37046. * @return {Promise<ComponentFixture>}
  37047. */
  37048. TestComponentBuilder.prototype.createAsync = function (rootComponentType) {
  37049. var mockDirectiveResolver = this._injector.get(core_1.DirectiveResolver);
  37050. var mockViewResolver = this._injector.get(core_1.ViewResolver);
  37051. this._viewOverrides.forEach(function (view, type) { return mockViewResolver.setView(type, view); });
  37052. this._templateOverrides.forEach(function (template, type) {
  37053. return mockViewResolver.setInlineTemplate(type, template);
  37054. });
  37055. this._directiveOverrides.forEach(function (overrides, component) {
  37056. overrides.forEach(function (to, from) { mockViewResolver.overrideViewDirective(component, from, to); });
  37057. });
  37058. this._bindingsOverrides.forEach(function (bindings, type) {
  37059. return mockDirectiveResolver.setBindingsOverride(type, bindings);
  37060. });
  37061. this._viewBindingsOverrides.forEach(function (bindings, type) { return mockDirectiveResolver.setViewBindingsOverride(type, bindings); });
  37062. var rootElId = "root" + _nextRootElementId++;
  37063. var rootEl = utils_1.el("<div id=\"" + rootElId + "\"></div>");
  37064. var doc = this._injector.get(dom_tokens_1.DOCUMENT);
  37065. // TODO(juliemr): can/should this be optional?
  37066. var oldRoots = dom_adapter_1.DOM.querySelectorAll(doc, '[id^=root]');
  37067. for (var i = 0; i < oldRoots.length; i++) {
  37068. dom_adapter_1.DOM.remove(oldRoots[i]);
  37069. }
  37070. dom_adapter_1.DOM.appendChild(doc.body, rootEl);
  37071. return this._injector.get(core_1.DynamicComponentLoader)
  37072. .loadAsRoot(rootComponentType, "#" + rootElId, this._injector)
  37073. .then(function (componentRef) { return new ComponentFixture_(componentRef); });
  37074. };
  37075. TestComponentBuilder = __decorate([
  37076. core_1.Injectable(),
  37077. __metadata('design:paramtypes', [core_1.Injector])
  37078. ], TestComponentBuilder);
  37079. return TestComponentBuilder;
  37080. })();
  37081. exports.TestComponentBuilder = TestComponentBuilder;
  37082. /***/ },
  37083. /* 268 */
  37084. /***/ function(module, exports, __webpack_require__) {
  37085. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  37086. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  37087. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  37088. 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;
  37089. return c > 3 && r && Object.defineProperty(target, key, r), r;
  37090. };
  37091. var __metadata = (this && this.__metadata) || function (k, v) {
  37092. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  37093. };
  37094. var core_1 = __webpack_require__(2);
  37095. var collection_1 = __webpack_require__(12);
  37096. var dom_adapter_1 = __webpack_require__(178);
  37097. var lang_1 = __webpack_require__(5);
  37098. var Log = (function () {
  37099. function Log() {
  37100. this._result = [];
  37101. }
  37102. Log.prototype.add = function (value) { this._result.push(value); };
  37103. Log.prototype.fn = function (value) {
  37104. var _this = this;
  37105. return function (a1, a2, a3, a4, a5) {
  37106. if (a1 === void 0) { a1 = null; }
  37107. if (a2 === void 0) { a2 = null; }
  37108. if (a3 === void 0) { a3 = null; }
  37109. if (a4 === void 0) { a4 = null; }
  37110. if (a5 === void 0) { a5 = null; }
  37111. _this._result.push(value);
  37112. };
  37113. };
  37114. Log.prototype.clear = function () { this._result = []; };
  37115. Log.prototype.result = function () { return this._result.join("; "); };
  37116. Log = __decorate([
  37117. core_1.Injectable(),
  37118. __metadata('design:paramtypes', [])
  37119. ], Log);
  37120. return Log;
  37121. })();
  37122. exports.Log = Log;
  37123. var BrowserDetection = (function () {
  37124. function BrowserDetection(ua) {
  37125. if (lang_1.isPresent(ua)) {
  37126. this._ua = ua;
  37127. }
  37128. else {
  37129. this._ua = lang_1.isPresent(dom_adapter_1.DOM) ? dom_adapter_1.DOM.getUserAgent() : '';
  37130. }
  37131. }
  37132. Object.defineProperty(BrowserDetection.prototype, "isFirefox", {
  37133. get: function () { return this._ua.indexOf('Firefox') > -1; },
  37134. enumerable: true,
  37135. configurable: true
  37136. });
  37137. Object.defineProperty(BrowserDetection.prototype, "isAndroid", {
  37138. get: function () {
  37139. return this._ua.indexOf('Mozilla/5.0') > -1 && this._ua.indexOf('Android') > -1 &&
  37140. this._ua.indexOf('AppleWebKit') > -1 && this._ua.indexOf('Chrome') == -1;
  37141. },
  37142. enumerable: true,
  37143. configurable: true
  37144. });
  37145. Object.defineProperty(BrowserDetection.prototype, "isEdge", {
  37146. get: function () { return this._ua.indexOf('Edge') > -1; },
  37147. enumerable: true,
  37148. configurable: true
  37149. });
  37150. Object.defineProperty(BrowserDetection.prototype, "isIE", {
  37151. get: function () { return this._ua.indexOf('Trident') > -1; },
  37152. enumerable: true,
  37153. configurable: true
  37154. });
  37155. Object.defineProperty(BrowserDetection.prototype, "isWebkit", {
  37156. get: function () {
  37157. return this._ua.indexOf('AppleWebKit') > -1 && this._ua.indexOf('Edge') == -1;
  37158. },
  37159. enumerable: true,
  37160. configurable: true
  37161. });
  37162. Object.defineProperty(BrowserDetection.prototype, "isIOS7", {
  37163. get: function () {
  37164. return this._ua.indexOf('iPhone OS 7') > -1 || this._ua.indexOf('iPad OS 7') > -1;
  37165. },
  37166. enumerable: true,
  37167. configurable: true
  37168. });
  37169. Object.defineProperty(BrowserDetection.prototype, "isSlow", {
  37170. get: function () { return this.isAndroid || this.isIE || this.isIOS7; },
  37171. enumerable: true,
  37172. configurable: true
  37173. });
  37174. Object.defineProperty(BrowserDetection.prototype, "supportsIntlApi", {
  37175. // The Intl API is only properly supported in recent Chrome and Opera.
  37176. // Note: Edge is disguised as Chrome 42, so checking the "Edge" part is needed,
  37177. // see https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx
  37178. get: function () {
  37179. return this._ua.indexOf('Chrome/4') > -1 && this._ua.indexOf('Edge') == -1;
  37180. },
  37181. enumerable: true,
  37182. configurable: true
  37183. });
  37184. return BrowserDetection;
  37185. })();
  37186. exports.BrowserDetection = BrowserDetection;
  37187. exports.browserDetection = new BrowserDetection(null);
  37188. function dispatchEvent(element, eventType) {
  37189. dom_adapter_1.DOM.dispatchEvent(element, dom_adapter_1.DOM.createEvent(eventType));
  37190. }
  37191. exports.dispatchEvent = dispatchEvent;
  37192. function el(html) {
  37193. return dom_adapter_1.DOM.firstChild(dom_adapter_1.DOM.content(dom_adapter_1.DOM.createTemplate(html)));
  37194. }
  37195. exports.el = el;
  37196. var _RE_SPECIAL_CHARS = ['-', '[', ']', '/', '{', '}', '\\', '(', ')', '*', '+', '?', '.', '^', '$', '|'];
  37197. var _ESCAPE_RE = lang_1.RegExpWrapper.create("[\\" + _RE_SPECIAL_CHARS.join('\\') + "]");
  37198. function containsRegexp(input) {
  37199. return lang_1.RegExpWrapper.create(lang_1.StringWrapper.replaceAllMapped(input, _ESCAPE_RE, function (match) { return ("\\" + match[0]); }));
  37200. }
  37201. exports.containsRegexp = containsRegexp;
  37202. function normalizeCSS(css) {
  37203. css = lang_1.StringWrapper.replaceAll(css, /\s+/g, ' ');
  37204. css = lang_1.StringWrapper.replaceAll(css, /:\s/g, ':');
  37205. css = lang_1.StringWrapper.replaceAll(css, /'/g, '"');
  37206. css = lang_1.StringWrapper.replaceAll(css, / }/g, '}');
  37207. css = lang_1.StringWrapper.replaceAllMapped(css, /url\((\"|\s)(.+)(\"|\s)\)(\s*)/g, function (match) { return ("url(\"" + match[2] + "\")"); });
  37208. css = lang_1.StringWrapper.replaceAllMapped(css, /\[(.+)=([^"\]]+)\]/g, function (match) { return ("[" + match[1] + "=\"" + match[2] + "\"]"); });
  37209. return css;
  37210. }
  37211. exports.normalizeCSS = normalizeCSS;
  37212. var _singleTagWhitelist = ['br', 'hr', 'input'];
  37213. function stringifyElement(el) {
  37214. var result = '';
  37215. if (dom_adapter_1.DOM.isElementNode(el)) {
  37216. var tagName = dom_adapter_1.DOM.tagName(el).toLowerCase();
  37217. // Opening tag
  37218. result += "<" + tagName;
  37219. // Attributes in an ordered way
  37220. var attributeMap = dom_adapter_1.DOM.attributeMap(el);
  37221. var keys = [];
  37222. attributeMap.forEach(function (v, k) { return keys.push(k); });
  37223. collection_1.ListWrapper.sort(keys);
  37224. for (var i = 0; i < keys.length; i++) {
  37225. var key = keys[i];
  37226. var attValue = attributeMap.get(key);
  37227. if (!lang_1.isString(attValue)) {
  37228. result += " " + key;
  37229. }
  37230. else {
  37231. result += " " + key + "=\"" + attValue + "\"";
  37232. }
  37233. }
  37234. result += '>';
  37235. // Children
  37236. var childrenRoot = dom_adapter_1.DOM.templateAwareRoot(el);
  37237. var children = lang_1.isPresent(childrenRoot) ? dom_adapter_1.DOM.childNodes(childrenRoot) : [];
  37238. for (var j = 0; j < children.length; j++) {
  37239. result += stringifyElement(children[j]);
  37240. }
  37241. // Closing tag
  37242. if (!collection_1.ListWrapper.contains(_singleTagWhitelist, tagName)) {
  37243. result += "</" + tagName + ">";
  37244. }
  37245. }
  37246. else if (dom_adapter_1.DOM.isCommentNode(el)) {
  37247. result += "<!--" + dom_adapter_1.DOM.nodeValue(el) + "-->";
  37248. }
  37249. else {
  37250. result += dom_adapter_1.DOM.getText(el);
  37251. }
  37252. return result;
  37253. }
  37254. exports.stringifyElement = stringifyElement;
  37255. /***/ },
  37256. /* 269 */
  37257. /***/ function(module, exports, __webpack_require__) {
  37258. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  37259. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  37260. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  37261. 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;
  37262. return c > 3 && r && Object.defineProperty(target, key, r), r;
  37263. };
  37264. var __metadata = (this && this.__metadata) || function (k, v) {
  37265. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  37266. };
  37267. var lang_1 = __webpack_require__(5);
  37268. var exceptions_1 = __webpack_require__(14);
  37269. var collection_1 = __webpack_require__(12);
  37270. var api_1 = __webpack_require__(72);
  37271. var api_2 = __webpack_require__(270);
  37272. var di_1 = __webpack_require__(6);
  37273. var render_proto_view_ref_store_1 = __webpack_require__(271);
  37274. var render_view_with_fragments_store_1 = __webpack_require__(272);
  37275. var view_1 = __webpack_require__(56);
  37276. // PRIMITIVE is any type that does not need to be serialized (string, number, boolean)
  37277. // We set it to String so that it is considered a Type.
  37278. exports.PRIMITIVE = String;
  37279. var Serializer = (function () {
  37280. function Serializer(_protoViewStore, _renderViewStore) {
  37281. this._protoViewStore = _protoViewStore;
  37282. this._renderViewStore = _renderViewStore;
  37283. }
  37284. Serializer.prototype.serialize = function (obj, type) {
  37285. var _this = this;
  37286. if (!lang_1.isPresent(obj)) {
  37287. return null;
  37288. }
  37289. if (lang_1.isArray(obj)) {
  37290. return obj.map(function (v) { return _this.serialize(v, type); });
  37291. }
  37292. if (type == exports.PRIMITIVE) {
  37293. return obj;
  37294. }
  37295. if (type == api_1.RenderProtoViewRef) {
  37296. return this._protoViewStore.serialize(obj);
  37297. }
  37298. else if (type == api_1.RenderViewRef) {
  37299. return this._renderViewStore.serializeRenderViewRef(obj);
  37300. }
  37301. else if (type == api_1.RenderFragmentRef) {
  37302. return this._renderViewStore.serializeRenderFragmentRef(obj);
  37303. }
  37304. else if (type == api_2.WebWorkerElementRef) {
  37305. return this._serializeWorkerElementRef(obj);
  37306. }
  37307. else if (type == api_2.WebWorkerTemplateCmd) {
  37308. return serializeTemplateCmd(obj);
  37309. }
  37310. else if (type === api_1.RenderComponentTemplate) {
  37311. return this._serializeRenderTemplate(obj);
  37312. }
  37313. else if (type === view_1.ViewEncapsulation) {
  37314. return lang_1.serializeEnum(obj);
  37315. }
  37316. else {
  37317. throw new exceptions_1.BaseException("No serializer for " + type.toString());
  37318. }
  37319. };
  37320. Serializer.prototype.deserialize = function (map, type, data) {
  37321. var _this = this;
  37322. if (!lang_1.isPresent(map)) {
  37323. return null;
  37324. }
  37325. if (lang_1.isArray(map)) {
  37326. var obj = [];
  37327. map.forEach(function (val) { return obj.push(_this.deserialize(val, type, data)); });
  37328. return obj;
  37329. }
  37330. if (type == exports.PRIMITIVE) {
  37331. return map;
  37332. }
  37333. if (type == api_1.RenderProtoViewRef) {
  37334. return this._protoViewStore.deserialize(map);
  37335. }
  37336. else if (type == api_1.RenderViewRef) {
  37337. return this._renderViewStore.deserializeRenderViewRef(map);
  37338. }
  37339. else if (type == api_1.RenderFragmentRef) {
  37340. return this._renderViewStore.deserializeRenderFragmentRef(map);
  37341. }
  37342. else if (type == api_2.WebWorkerElementRef) {
  37343. return this._deserializeWorkerElementRef(map);
  37344. }
  37345. else if (type == api_2.WebWorkerTemplateCmd) {
  37346. return deserializeTemplateCmd(map);
  37347. }
  37348. else if (type === api_1.RenderComponentTemplate) {
  37349. return this._deserializeRenderTemplate(map);
  37350. }
  37351. else if (type === view_1.ViewEncapsulation) {
  37352. return view_1.VIEW_ENCAPSULATION_VALUES[map];
  37353. }
  37354. else {
  37355. throw new exceptions_1.BaseException("No deserializer for " + type.toString());
  37356. }
  37357. };
  37358. Serializer.prototype.mapToObject = function (map, type) {
  37359. var _this = this;
  37360. var object = {};
  37361. var serialize = lang_1.isPresent(type);
  37362. map.forEach(function (value, key) {
  37363. if (serialize) {
  37364. object[key] = _this.serialize(value, type);
  37365. }
  37366. else {
  37367. object[key] = value;
  37368. }
  37369. });
  37370. return object;
  37371. };
  37372. /*
  37373. * Transforms a Javascript object (StringMap) into a Map<string, V>
  37374. * If the values need to be deserialized pass in their type
  37375. * and they will be deserialized before being placed in the map
  37376. */
  37377. Serializer.prototype.objectToMap = function (obj, type, data) {
  37378. var _this = this;
  37379. if (lang_1.isPresent(type)) {
  37380. var map = new collection_1.Map();
  37381. collection_1.StringMapWrapper.forEach(obj, function (val, key) { map.set(key, _this.deserialize(val, type, data)); });
  37382. return map;
  37383. }
  37384. else {
  37385. return collection_1.MapWrapper.createFromStringMap(obj);
  37386. }
  37387. };
  37388. Serializer.prototype.allocateRenderViews = function (fragmentCount) { this._renderViewStore.allocate(fragmentCount); };
  37389. Serializer.prototype._serializeWorkerElementRef = function (elementRef) {
  37390. return {
  37391. 'renderView': this.serialize(elementRef.renderView, api_1.RenderViewRef),
  37392. 'boundElementIndex': elementRef.boundElementIndex
  37393. };
  37394. };
  37395. Serializer.prototype._deserializeWorkerElementRef = function (map) {
  37396. return new api_2.WebWorkerElementRef(this.deserialize(map['renderView'], api_1.RenderViewRef), map['boundElementIndex']);
  37397. };
  37398. Serializer.prototype._serializeRenderTemplate = function (obj) {
  37399. return {
  37400. 'id': obj.id,
  37401. 'shortId': obj.shortId,
  37402. 'encapsulation': this.serialize(obj.encapsulation, view_1.ViewEncapsulation),
  37403. 'commands': this.serialize(obj.commands, api_2.WebWorkerTemplateCmd),
  37404. 'styles': this.serialize(obj.styles, exports.PRIMITIVE)
  37405. };
  37406. };
  37407. Serializer.prototype._deserializeRenderTemplate = function (map) {
  37408. return new api_1.RenderComponentTemplate(map['id'], map['shortId'], this.deserialize(map['encapsulation'], view_1.ViewEncapsulation), this.deserialize(map['commands'], api_2.WebWorkerTemplateCmd), this.deserialize(map['styles'], exports.PRIMITIVE));
  37409. };
  37410. Serializer = __decorate([
  37411. di_1.Injectable(),
  37412. __metadata('design:paramtypes', [render_proto_view_ref_store_1.RenderProtoViewRefStore, render_view_with_fragments_store_1.RenderViewWithFragmentsStore])
  37413. ], Serializer);
  37414. return Serializer;
  37415. })();
  37416. exports.Serializer = Serializer;
  37417. function serializeTemplateCmd(cmd) {
  37418. return cmd.visit(RENDER_TEMPLATE_CMD_SERIALIZER, null);
  37419. }
  37420. function deserializeTemplateCmd(data) {
  37421. return RENDER_TEMPLATE_CMD_DESERIALIZERS[data['deserializerIndex']](data);
  37422. }
  37423. var RenderTemplateCmdSerializer = (function () {
  37424. function RenderTemplateCmdSerializer() {
  37425. }
  37426. RenderTemplateCmdSerializer.prototype.visitText = function (cmd, context) {
  37427. return {
  37428. 'deserializerIndex': 0,
  37429. 'isBound': cmd.isBound,
  37430. 'ngContentIndex': cmd.ngContentIndex,
  37431. 'value': cmd.value
  37432. };
  37433. };
  37434. RenderTemplateCmdSerializer.prototype.visitNgContent = function (cmd, context) {
  37435. return { 'deserializerIndex': 1, 'index': cmd.index, 'ngContentIndex': cmd.ngContentIndex };
  37436. };
  37437. RenderTemplateCmdSerializer.prototype.visitBeginElement = function (cmd, context) {
  37438. return {
  37439. 'deserializerIndex': 2,
  37440. 'isBound': cmd.isBound,
  37441. 'ngContentIndex': cmd.ngContentIndex,
  37442. 'name': cmd.name,
  37443. 'attrNameAndValues': cmd.attrNameAndValues,
  37444. 'eventTargetAndNames': cmd.eventTargetAndNames
  37445. };
  37446. };
  37447. RenderTemplateCmdSerializer.prototype.visitEndElement = function (context) { return { 'deserializerIndex': 3 }; };
  37448. RenderTemplateCmdSerializer.prototype.visitBeginComponent = function (cmd, context) {
  37449. return {
  37450. 'deserializerIndex': 4,
  37451. 'isBound': cmd.isBound,
  37452. 'ngContentIndex': cmd.ngContentIndex,
  37453. 'name': cmd.name,
  37454. 'attrNameAndValues': cmd.attrNameAndValues,
  37455. 'eventTargetAndNames': cmd.eventTargetAndNames,
  37456. 'templateId': cmd.templateId
  37457. };
  37458. };
  37459. RenderTemplateCmdSerializer.prototype.visitEndComponent = function (context) { return { 'deserializerIndex': 5 }; };
  37460. RenderTemplateCmdSerializer.prototype.visitEmbeddedTemplate = function (cmd, context) {
  37461. var _this = this;
  37462. var children = cmd.children.map(function (child) { return child.visit(_this, null); });
  37463. return {
  37464. 'deserializerIndex': 6,
  37465. 'isBound': cmd.isBound,
  37466. 'ngContentIndex': cmd.ngContentIndex,
  37467. 'name': cmd.name,
  37468. 'attrNameAndValues': cmd.attrNameAndValues,
  37469. 'eventTargetAndNames': cmd.eventTargetAndNames,
  37470. 'isMerged': cmd.isMerged,
  37471. 'children': children
  37472. };
  37473. };
  37474. return RenderTemplateCmdSerializer;
  37475. })();
  37476. var RENDER_TEMPLATE_CMD_SERIALIZER = new RenderTemplateCmdSerializer();
  37477. var RENDER_TEMPLATE_CMD_DESERIALIZERS = [
  37478. function (data) {
  37479. return new api_2.WebWorkerTextCmd(data['isBound'], data['ngContentIndex'], data['value']);
  37480. },
  37481. function (data) { return new api_2.WebWorkerNgContentCmd(data['index'], data['ngContentIndex']); },
  37482. function (data) {
  37483. return new api_2.WebWorkerBeginElementCmd(data['isBound'], data['ngContentIndex'], data['name'], data['attrNameAndValues'], data['eventTargetAndNames']);
  37484. },
  37485. function (data) { return new api_2.WebWorkerEndElementCmd(); },
  37486. function (data) { return new api_2.WebWorkerBeginComponentCmd(data['isBound'], data['ngContentIndex'], data['name'], data['attrNameAndValues'], data['eventTargetAndNames'], data['templateId']); },
  37487. function (data) { return new api_2.WebWorkerEndComponentCmd(); },
  37488. function (data) { return new api_2.WebWorkerEmbeddedTemplateCmd(data['isBound'], data['ngContentIndex'], data['name'], data['attrNameAndValues'], data['eventTargetAndNames'], data['isMerged'], data['children'].map(function (childData) { return deserializeTemplateCmd(childData); })); },
  37489. ];
  37490. /***/ },
  37491. /* 270 */
  37492. /***/ function(module, exports, __webpack_require__) {
  37493. var lang_1 = __webpack_require__(5);
  37494. var di_1 = __webpack_require__(6);
  37495. exports.ON_WEB_WORKER = lang_1.CONST_EXPR(new di_1.OpaqueToken('WebWorker.onWebWorker'));
  37496. var WebWorkerElementRef = (function () {
  37497. function WebWorkerElementRef(renderView, boundElementIndex) {
  37498. this.renderView = renderView;
  37499. this.boundElementIndex = boundElementIndex;
  37500. }
  37501. return WebWorkerElementRef;
  37502. })();
  37503. exports.WebWorkerElementRef = WebWorkerElementRef;
  37504. var WebWorkerTemplateCmd = (function () {
  37505. function WebWorkerTemplateCmd() {
  37506. }
  37507. WebWorkerTemplateCmd.prototype.visit = function (visitor, context) { return null; };
  37508. return WebWorkerTemplateCmd;
  37509. })();
  37510. exports.WebWorkerTemplateCmd = WebWorkerTemplateCmd;
  37511. var WebWorkerTextCmd = (function () {
  37512. function WebWorkerTextCmd(isBound, ngContentIndex, value) {
  37513. this.isBound = isBound;
  37514. this.ngContentIndex = ngContentIndex;
  37515. this.value = value;
  37516. }
  37517. WebWorkerTextCmd.prototype.visit = function (visitor, context) {
  37518. return visitor.visitText(this, context);
  37519. };
  37520. return WebWorkerTextCmd;
  37521. })();
  37522. exports.WebWorkerTextCmd = WebWorkerTextCmd;
  37523. var WebWorkerNgContentCmd = (function () {
  37524. function WebWorkerNgContentCmd(index, ngContentIndex) {
  37525. this.index = index;
  37526. this.ngContentIndex = ngContentIndex;
  37527. }
  37528. WebWorkerNgContentCmd.prototype.visit = function (visitor, context) {
  37529. return visitor.visitNgContent(this, context);
  37530. };
  37531. return WebWorkerNgContentCmd;
  37532. })();
  37533. exports.WebWorkerNgContentCmd = WebWorkerNgContentCmd;
  37534. var WebWorkerBeginElementCmd = (function () {
  37535. function WebWorkerBeginElementCmd(isBound, ngContentIndex, name, attrNameAndValues, eventTargetAndNames) {
  37536. this.isBound = isBound;
  37537. this.ngContentIndex = ngContentIndex;
  37538. this.name = name;
  37539. this.attrNameAndValues = attrNameAndValues;
  37540. this.eventTargetAndNames = eventTargetAndNames;
  37541. }
  37542. WebWorkerBeginElementCmd.prototype.visit = function (visitor, context) {
  37543. return visitor.visitBeginElement(this, context);
  37544. };
  37545. return WebWorkerBeginElementCmd;
  37546. })();
  37547. exports.WebWorkerBeginElementCmd = WebWorkerBeginElementCmd;
  37548. var WebWorkerEndElementCmd = (function () {
  37549. function WebWorkerEndElementCmd() {
  37550. }
  37551. WebWorkerEndElementCmd.prototype.visit = function (visitor, context) {
  37552. return visitor.visitEndElement(context);
  37553. };
  37554. return WebWorkerEndElementCmd;
  37555. })();
  37556. exports.WebWorkerEndElementCmd = WebWorkerEndElementCmd;
  37557. var WebWorkerBeginComponentCmd = (function () {
  37558. function WebWorkerBeginComponentCmd(isBound, ngContentIndex, name, attrNameAndValues, eventTargetAndNames, templateId) {
  37559. this.isBound = isBound;
  37560. this.ngContentIndex = ngContentIndex;
  37561. this.name = name;
  37562. this.attrNameAndValues = attrNameAndValues;
  37563. this.eventTargetAndNames = eventTargetAndNames;
  37564. this.templateId = templateId;
  37565. }
  37566. WebWorkerBeginComponentCmd.prototype.visit = function (visitor, context) {
  37567. return visitor.visitBeginComponent(this, context);
  37568. };
  37569. return WebWorkerBeginComponentCmd;
  37570. })();
  37571. exports.WebWorkerBeginComponentCmd = WebWorkerBeginComponentCmd;
  37572. var WebWorkerEndComponentCmd = (function () {
  37573. function WebWorkerEndComponentCmd() {
  37574. }
  37575. WebWorkerEndComponentCmd.prototype.visit = function (visitor, context) {
  37576. return visitor.visitEndComponent(context);
  37577. };
  37578. return WebWorkerEndComponentCmd;
  37579. })();
  37580. exports.WebWorkerEndComponentCmd = WebWorkerEndComponentCmd;
  37581. var WebWorkerEmbeddedTemplateCmd = (function () {
  37582. function WebWorkerEmbeddedTemplateCmd(isBound, ngContentIndex, name, attrNameAndValues, eventTargetAndNames, isMerged, children) {
  37583. this.isBound = isBound;
  37584. this.ngContentIndex = ngContentIndex;
  37585. this.name = name;
  37586. this.attrNameAndValues = attrNameAndValues;
  37587. this.eventTargetAndNames = eventTargetAndNames;
  37588. this.isMerged = isMerged;
  37589. this.children = children;
  37590. }
  37591. WebWorkerEmbeddedTemplateCmd.prototype.visit = function (visitor, context) {
  37592. return visitor.visitEmbeddedTemplate(this, context);
  37593. };
  37594. return WebWorkerEmbeddedTemplateCmd;
  37595. })();
  37596. exports.WebWorkerEmbeddedTemplateCmd = WebWorkerEmbeddedTemplateCmd;
  37597. /***/ },
  37598. /* 271 */
  37599. /***/ function(module, exports, __webpack_require__) {
  37600. var __extends = (this && this.__extends) || function (d, b) {
  37601. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  37602. function __() { this.constructor = d; }
  37603. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  37604. };
  37605. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  37606. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  37607. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  37608. 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;
  37609. return c > 3 && r && Object.defineProperty(target, key, r), r;
  37610. };
  37611. var __metadata = (this && this.__metadata) || function (k, v) {
  37612. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  37613. };
  37614. var __param = (this && this.__param) || function (paramIndex, decorator) {
  37615. return function (target, key) { decorator(target, key, paramIndex); }
  37616. };
  37617. var di_1 = __webpack_require__(6);
  37618. var api_1 = __webpack_require__(72);
  37619. var api_2 = __webpack_require__(270);
  37620. var RenderProtoViewRefStore = (function () {
  37621. function RenderProtoViewRefStore(onWebworker) {
  37622. this._lookupByIndex = new Map();
  37623. this._lookupByProtoView = new Map();
  37624. this._nextIndex = 0;
  37625. this._onWebworker = onWebworker;
  37626. }
  37627. RenderProtoViewRefStore.prototype.allocate = function () {
  37628. var index = this._nextIndex++;
  37629. var result = new WebWorkerRenderProtoViewRef(index);
  37630. this.store(result, index);
  37631. return result;
  37632. };
  37633. RenderProtoViewRefStore.prototype.store = function (ref, index) {
  37634. this._lookupByProtoView.set(ref, index);
  37635. this._lookupByIndex.set(index, ref);
  37636. };
  37637. RenderProtoViewRefStore.prototype.deserialize = function (index) {
  37638. if (index == null) {
  37639. return null;
  37640. }
  37641. return this._lookupByIndex.get(index);
  37642. };
  37643. RenderProtoViewRefStore.prototype.serialize = function (ref) {
  37644. if (ref == null) {
  37645. return null;
  37646. }
  37647. if (this._onWebworker) {
  37648. return ref.refNumber;
  37649. }
  37650. else {
  37651. return this._lookupByProtoView.get(ref);
  37652. }
  37653. };
  37654. RenderProtoViewRefStore = __decorate([
  37655. di_1.Injectable(),
  37656. __param(0, di_1.Inject(api_2.ON_WEB_WORKER)),
  37657. __metadata('design:paramtypes', [Object])
  37658. ], RenderProtoViewRefStore);
  37659. return RenderProtoViewRefStore;
  37660. })();
  37661. exports.RenderProtoViewRefStore = RenderProtoViewRefStore;
  37662. var WebWorkerRenderProtoViewRef = (function (_super) {
  37663. __extends(WebWorkerRenderProtoViewRef, _super);
  37664. function WebWorkerRenderProtoViewRef(refNumber) {
  37665. _super.call(this);
  37666. this.refNumber = refNumber;
  37667. }
  37668. return WebWorkerRenderProtoViewRef;
  37669. })(api_1.RenderProtoViewRef);
  37670. exports.WebWorkerRenderProtoViewRef = WebWorkerRenderProtoViewRef;
  37671. /***/ },
  37672. /* 272 */
  37673. /***/ function(module, exports, __webpack_require__) {
  37674. var __extends = (this && this.__extends) || function (d, b) {
  37675. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  37676. function __() { this.constructor = d; }
  37677. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  37678. };
  37679. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  37680. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  37681. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  37682. 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;
  37683. return c > 3 && r && Object.defineProperty(target, key, r), r;
  37684. };
  37685. var __metadata = (this && this.__metadata) || function (k, v) {
  37686. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  37687. };
  37688. var __param = (this && this.__param) || function (paramIndex, decorator) {
  37689. return function (target, key) { decorator(target, key, paramIndex); }
  37690. };
  37691. var di_1 = __webpack_require__(6);
  37692. var api_1 = __webpack_require__(72);
  37693. var api_2 = __webpack_require__(270);
  37694. var collection_1 = __webpack_require__(12);
  37695. var RenderViewWithFragmentsStore = (function () {
  37696. function RenderViewWithFragmentsStore(onWebWorker) {
  37697. this._nextIndex = 0;
  37698. this._onWebWorker = onWebWorker;
  37699. this._lookupByIndex = new Map();
  37700. this._lookupByView = new Map();
  37701. this._viewFragments = new Map();
  37702. }
  37703. RenderViewWithFragmentsStore.prototype.allocate = function (fragmentCount) {
  37704. var initialIndex = this._nextIndex;
  37705. var viewRef = new WebWorkerRenderViewRef(this._nextIndex++);
  37706. var fragmentRefs = collection_1.ListWrapper.createGrowableSize(fragmentCount);
  37707. for (var i = 0; i < fragmentCount; i++) {
  37708. fragmentRefs[i] = new WebWorkerRenderFragmentRef(this._nextIndex++);
  37709. }
  37710. var renderViewWithFragments = new api_1.RenderViewWithFragments(viewRef, fragmentRefs);
  37711. this.store(renderViewWithFragments, initialIndex);
  37712. return renderViewWithFragments;
  37713. };
  37714. RenderViewWithFragmentsStore.prototype.store = function (view, startIndex) {
  37715. var _this = this;
  37716. this._lookupByIndex.set(startIndex, view.viewRef);
  37717. this._lookupByView.set(view.viewRef, startIndex);
  37718. startIndex++;
  37719. view.fragmentRefs.forEach(function (ref) {
  37720. _this._lookupByIndex.set(startIndex, ref);
  37721. _this._lookupByView.set(ref, startIndex);
  37722. startIndex++;
  37723. });
  37724. this._viewFragments.set(view.viewRef, view.fragmentRefs);
  37725. };
  37726. RenderViewWithFragmentsStore.prototype.remove = function (view) {
  37727. var _this = this;
  37728. this._removeRef(view);
  37729. var fragments = this._viewFragments.get(view);
  37730. fragments.forEach(function (fragment) { _this._removeRef(fragment); });
  37731. this._viewFragments.delete(view);
  37732. };
  37733. RenderViewWithFragmentsStore.prototype._removeRef = function (ref) {
  37734. var index = this._lookupByView.get(ref);
  37735. this._lookupByView.delete(ref);
  37736. this._lookupByIndex.delete(index);
  37737. };
  37738. RenderViewWithFragmentsStore.prototype.serializeRenderViewRef = function (viewRef) {
  37739. return this._serializeRenderFragmentOrViewRef(viewRef);
  37740. };
  37741. RenderViewWithFragmentsStore.prototype.serializeRenderFragmentRef = function (fragmentRef) {
  37742. return this._serializeRenderFragmentOrViewRef(fragmentRef);
  37743. };
  37744. RenderViewWithFragmentsStore.prototype.deserializeRenderViewRef = function (ref) {
  37745. if (ref == null) {
  37746. return null;
  37747. }
  37748. return this._retrieve(ref);
  37749. };
  37750. RenderViewWithFragmentsStore.prototype.deserializeRenderFragmentRef = function (ref) {
  37751. if (ref == null) {
  37752. return null;
  37753. }
  37754. return this._retrieve(ref);
  37755. };
  37756. RenderViewWithFragmentsStore.prototype._retrieve = function (ref) {
  37757. if (ref == null) {
  37758. return null;
  37759. }
  37760. if (!this._lookupByIndex.has(ref)) {
  37761. return null;
  37762. }
  37763. return this._lookupByIndex.get(ref);
  37764. };
  37765. RenderViewWithFragmentsStore.prototype._serializeRenderFragmentOrViewRef = function (ref) {
  37766. if (ref == null) {
  37767. return null;
  37768. }
  37769. if (this._onWebWorker) {
  37770. return ref.serialize();
  37771. }
  37772. else {
  37773. return this._lookupByView.get(ref);
  37774. }
  37775. };
  37776. RenderViewWithFragmentsStore.prototype.serializeViewWithFragments = function (view) {
  37777. var _this = this;
  37778. if (view == null) {
  37779. return null;
  37780. }
  37781. if (this._onWebWorker) {
  37782. return {
  37783. 'viewRef': view.viewRef.serialize(),
  37784. 'fragmentRefs': view.fragmentRefs.map(function (val) { return val.serialize(); })
  37785. };
  37786. }
  37787. else {
  37788. return {
  37789. 'viewRef': this._lookupByView.get(view.viewRef),
  37790. 'fragmentRefs': view.fragmentRefs.map(function (val) { return _this._lookupByView.get(val); })
  37791. };
  37792. }
  37793. };
  37794. RenderViewWithFragmentsStore.prototype.deserializeViewWithFragments = function (obj) {
  37795. var _this = this;
  37796. if (obj == null) {
  37797. return null;
  37798. }
  37799. var viewRef = this.deserializeRenderViewRef(obj['viewRef']);
  37800. var fragments = obj['fragmentRefs'].map(function (val) { return _this.deserializeRenderFragmentRef(val); });
  37801. return new api_1.RenderViewWithFragments(viewRef, fragments);
  37802. };
  37803. RenderViewWithFragmentsStore = __decorate([
  37804. di_1.Injectable(),
  37805. __param(0, di_1.Inject(api_2.ON_WEB_WORKER)),
  37806. __metadata('design:paramtypes', [Object])
  37807. ], RenderViewWithFragmentsStore);
  37808. return RenderViewWithFragmentsStore;
  37809. })();
  37810. exports.RenderViewWithFragmentsStore = RenderViewWithFragmentsStore;
  37811. var WebWorkerRenderViewRef = (function (_super) {
  37812. __extends(WebWorkerRenderViewRef, _super);
  37813. function WebWorkerRenderViewRef(refNumber) {
  37814. _super.call(this);
  37815. this.refNumber = refNumber;
  37816. }
  37817. WebWorkerRenderViewRef.prototype.serialize = function () { return this.refNumber; };
  37818. WebWorkerRenderViewRef.deserialize = function (ref) {
  37819. return new WebWorkerRenderViewRef(ref);
  37820. };
  37821. return WebWorkerRenderViewRef;
  37822. })(api_1.RenderViewRef);
  37823. exports.WebWorkerRenderViewRef = WebWorkerRenderViewRef;
  37824. var WebWorkerRenderFragmentRef = (function (_super) {
  37825. __extends(WebWorkerRenderFragmentRef, _super);
  37826. function WebWorkerRenderFragmentRef(refNumber) {
  37827. _super.call(this);
  37828. this.refNumber = refNumber;
  37829. }
  37830. WebWorkerRenderFragmentRef.prototype.serialize = function () { return this.refNumber; };
  37831. WebWorkerRenderFragmentRef.deserialize = function (ref) {
  37832. return new WebWorkerRenderFragmentRef(ref);
  37833. };
  37834. return WebWorkerRenderFragmentRef;
  37835. })(api_1.RenderFragmentRef);
  37836. exports.WebWorkerRenderFragmentRef = WebWorkerRenderFragmentRef;
  37837. /***/ },
  37838. /* 273 */
  37839. /***/ function(module, exports, __webpack_require__) {
  37840. var dom_adapter_1 = __webpack_require__(178);
  37841. var lang_1 = __webpack_require__(5);
  37842. var collection_1 = __webpack_require__(12);
  37843. var _global = (typeof window === 'undefined' ? lang_1.global : window);
  37844. /**
  37845. * Jasmine matching function with Angular matchers mixed in.
  37846. *
  37847. * ## Example
  37848. *
  37849. * {@example testing/ts/matchers.ts region='toHaveText'}
  37850. */
  37851. exports.expect = _global.expect;
  37852. // Some Map polyfills don't polyfill Map.toString correctly, which
  37853. // gives us bad error messages in tests.
  37854. // The only way to do this in Jasmine is to monkey patch a method
  37855. // to the object :-(
  37856. Map.prototype['jasmineToString'] = function () {
  37857. var m = this;
  37858. if (!m) {
  37859. return '' + m;
  37860. }
  37861. var res = [];
  37862. m.forEach(function (v, k) { res.push(k + ":" + v); });
  37863. return "{ " + res.join(',') + " }";
  37864. };
  37865. _global.beforeEach(function () {
  37866. jasmine.addMatchers({
  37867. // Custom handler for Map as Jasmine does not support it yet
  37868. toEqual: function (util, customEqualityTesters) {
  37869. return {
  37870. compare: function (actual, expected) {
  37871. return { pass: util.equals(actual, expected, [compareMap]) };
  37872. }
  37873. };
  37874. function compareMap(actual, expected) {
  37875. if (actual instanceof Map) {
  37876. var pass = actual.size === expected.size;
  37877. if (pass) {
  37878. actual.forEach(function (v, k) { pass = pass && util.equals(v, expected.get(k)); });
  37879. }
  37880. return pass;
  37881. }
  37882. else {
  37883. return undefined;
  37884. }
  37885. }
  37886. },
  37887. toBePromise: function () {
  37888. return {
  37889. compare: function (actual, expectedClass) {
  37890. var pass = typeof actual === 'object' && typeof actual.then === 'function';
  37891. return { pass: pass, get message() { return 'Expected ' + actual + ' to be a promise'; } };
  37892. }
  37893. };
  37894. },
  37895. toBeAnInstanceOf: function () {
  37896. return {
  37897. compare: function (actual, expectedClass) {
  37898. var pass = typeof actual === 'object' && actual instanceof expectedClass;
  37899. return {
  37900. pass: pass,
  37901. get message() {
  37902. return 'Expected ' + actual + ' to be an instance of ' + expectedClass;
  37903. }
  37904. };
  37905. }
  37906. };
  37907. },
  37908. toHaveText: function () {
  37909. return {
  37910. compare: function (actual, expectedText) {
  37911. var actualText = elementText(actual);
  37912. return {
  37913. pass: actualText == expectedText,
  37914. get message() { return 'Expected ' + actualText + ' to be equal to ' + expectedText; }
  37915. };
  37916. }
  37917. };
  37918. },
  37919. toHaveCssClass: function () {
  37920. return { compare: buildError(false), negativeCompare: buildError(true) };
  37921. function buildError(isNot) {
  37922. return function (actual, className) {
  37923. return {
  37924. pass: dom_adapter_1.DOM.hasClass(actual, className) == !isNot,
  37925. get message() {
  37926. return "Expected " + actual.outerHTML + " " + (isNot ? 'not ' : '') + "to contain the CSS class \"" + className + "\"";
  37927. }
  37928. };
  37929. };
  37930. }
  37931. },
  37932. toHaveCssStyle: function () {
  37933. return {
  37934. compare: function (actual, styles) {
  37935. var allPassed;
  37936. if (lang_1.isString(styles)) {
  37937. allPassed = dom_adapter_1.DOM.hasStyle(actual, styles);
  37938. }
  37939. else {
  37940. allPassed = !collection_1.StringMapWrapper.isEmpty(styles);
  37941. collection_1.StringMapWrapper.forEach(styles, function (style, prop) {
  37942. allPassed = allPassed && dom_adapter_1.DOM.hasStyle(actual, prop, style);
  37943. });
  37944. }
  37945. return {
  37946. pass: allPassed,
  37947. get message() {
  37948. var expectedValueStr = lang_1.isString(styles) ? styles : JSON.stringify(styles);
  37949. return "Expected " + actual.outerHTML + " " + (!allPassed ? ' ' : 'not ') + "to contain the\n CSS " + (lang_1.isString(styles) ? 'property' : 'styles') + " \"" + expectedValueStr + "\"";
  37950. }
  37951. };
  37952. }
  37953. };
  37954. },
  37955. toContainError: function () {
  37956. return {
  37957. compare: function (actual, expectedText) {
  37958. var errorMessage = actual.toString();
  37959. return {
  37960. pass: errorMessage.indexOf(expectedText) > -1,
  37961. get message() { return 'Expected ' + errorMessage + ' to contain ' + expectedText; }
  37962. };
  37963. }
  37964. };
  37965. },
  37966. toThrowErrorWith: function () {
  37967. return {
  37968. compare: function (actual, expectedText) {
  37969. try {
  37970. actual();
  37971. return {
  37972. pass: false,
  37973. get message() { return "Was expected to throw, but did not throw"; }
  37974. };
  37975. }
  37976. catch (e) {
  37977. var errorMessage = e.toString();
  37978. return {
  37979. pass: errorMessage.indexOf(expectedText) > -1,
  37980. get message() { return 'Expected ' + errorMessage + ' to contain ' + expectedText; }
  37981. };
  37982. }
  37983. }
  37984. };
  37985. },
  37986. toImplement: function () {
  37987. return {
  37988. compare: function (actualObject, expectedInterface) {
  37989. var objProps = Object.keys(actualObject.constructor.prototype);
  37990. var intProps = Object.keys(expectedInterface.prototype);
  37991. var missedMethods = [];
  37992. intProps.forEach(function (k) {
  37993. if (!actualObject.constructor.prototype[k])
  37994. missedMethods.push(k);
  37995. });
  37996. return {
  37997. pass: missedMethods.length == 0,
  37998. get message() {
  37999. return 'Expected ' + actualObject + ' to have the following methods: ' +
  38000. missedMethods.join(", ");
  38001. }
  38002. };
  38003. }
  38004. };
  38005. }
  38006. });
  38007. });
  38008. function elementText(n) {
  38009. var hasNodes = function (n) {
  38010. var children = dom_adapter_1.DOM.childNodes(n);
  38011. return children && children.length > 0;
  38012. };
  38013. if (n instanceof Array) {
  38014. return n.map(elementText).join("");
  38015. }
  38016. if (dom_adapter_1.DOM.isCommentNode(n)) {
  38017. return '';
  38018. }
  38019. if (dom_adapter_1.DOM.isElementNode(n) && dom_adapter_1.DOM.tagName(n) == 'CONTENT') {
  38020. return elementText(Array.prototype.slice.apply(dom_adapter_1.DOM.getDistributedNodes(n)));
  38021. }
  38022. if (dom_adapter_1.DOM.hasShadowRoot(n)) {
  38023. return elementText(dom_adapter_1.DOM.childNodesAsList(dom_adapter_1.DOM.getShadowRoot(n)));
  38024. }
  38025. if (hasNodes(n)) {
  38026. return elementText(dom_adapter_1.DOM.childNodesAsList(n));
  38027. }
  38028. return dom_adapter_1.DOM.getText(n);
  38029. }
  38030. /***/ },
  38031. /* 274 */
  38032. /***/ function(module, exports, __webpack_require__) {
  38033. var lang_1 = __webpack_require__(5);
  38034. var exceptions_1 = __webpack_require__(14);
  38035. var collection_1 = __webpack_require__(12);
  38036. var _scheduler;
  38037. var _microtasks = [];
  38038. var _pendingPeriodicTimers = [];
  38039. var _pendingTimers = [];
  38040. /**
  38041. * Wraps a function to be executed in the fakeAsync zone:
  38042. * - microtasks are manually executed by calling `flushMicrotasks()`,
  38043. * - timers are synchronous, `tick()` simulates the asynchronous passage of time.
  38044. *
  38045. * If there are any pending timers at the end of the function, an exception will be thrown.
  38046. *
  38047. * ## Example
  38048. *
  38049. * {@example testing/ts/fake_async.ts region='basic'}
  38050. *
  38051. * @param fn
  38052. * @returns {Function} The function wrapped to be executed in the fakeAsync zone
  38053. */
  38054. function fakeAsync(fn) {
  38055. if (lang_1.global.zone._inFakeAsyncZone) {
  38056. throw new Error('fakeAsync() calls can not be nested');
  38057. }
  38058. var fakeAsyncZone = lang_1.global.zone.fork({
  38059. setTimeout: _setTimeout,
  38060. clearTimeout: _clearTimeout,
  38061. setInterval: _setInterval,
  38062. clearInterval: _clearInterval,
  38063. scheduleMicrotask: _scheduleMicrotask,
  38064. _inFakeAsyncZone: true
  38065. });
  38066. return function () {
  38067. var args = [];
  38068. for (var _i = 0; _i < arguments.length; _i++) {
  38069. args[_i - 0] = arguments[_i];
  38070. }
  38071. // TODO(tbosch): This class should already be part of the jasmine typings but it is not...
  38072. _scheduler = new jasmine.DelayedFunctionScheduler();
  38073. clearPendingTimers();
  38074. var res = fakeAsyncZone.run(function () {
  38075. var res = fn.apply(void 0, args);
  38076. flushMicrotasks();
  38077. return res;
  38078. });
  38079. if (_pendingPeriodicTimers.length > 0) {
  38080. throw new exceptions_1.BaseException(_pendingPeriodicTimers.length + " periodic timer(s) still in the queue.");
  38081. }
  38082. if (_pendingTimers.length > 0) {
  38083. throw new exceptions_1.BaseException(_pendingTimers.length + " timer(s) still in the queue.");
  38084. }
  38085. _scheduler = null;
  38086. collection_1.ListWrapper.clear(_microtasks);
  38087. return res;
  38088. };
  38089. }
  38090. exports.fakeAsync = fakeAsync;
  38091. /**
  38092. * Clear the queue of pending timers and microtasks.
  38093. *
  38094. * Useful for cleaning up after an asynchronous test passes.
  38095. *
  38096. * ## Example
  38097. *
  38098. * {@example testing/ts/fake_async.ts region='pending'}
  38099. */
  38100. function clearPendingTimers() {
  38101. // TODO we should fix tick to dequeue the failed timer instead of relying on clearPendingTimers
  38102. collection_1.ListWrapper.clear(_microtasks);
  38103. collection_1.ListWrapper.clear(_pendingPeriodicTimers);
  38104. collection_1.ListWrapper.clear(_pendingTimers);
  38105. }
  38106. exports.clearPendingTimers = clearPendingTimers;
  38107. /**
  38108. * Simulates the asynchronous passage of time for the timers in the fakeAsync zone.
  38109. *
  38110. * The microtasks queue is drained at the very start of this function and after any timer callback
  38111. * has been executed.
  38112. *
  38113. * ## Example
  38114. *
  38115. * {@example testing/ts/fake_async.ts region='basic'}
  38116. *
  38117. * @param {number} millis Number of millisecond, defaults to 0
  38118. */
  38119. function tick(millis) {
  38120. if (millis === void 0) { millis = 0; }
  38121. _assertInFakeAsyncZone();
  38122. flushMicrotasks();
  38123. _scheduler.tick(millis);
  38124. }
  38125. exports.tick = tick;
  38126. /**
  38127. * Flush any pending microtasks.
  38128. */
  38129. function flushMicrotasks() {
  38130. _assertInFakeAsyncZone();
  38131. while (_microtasks.length > 0) {
  38132. var microtask = collection_1.ListWrapper.removeAt(_microtasks, 0);
  38133. microtask();
  38134. }
  38135. }
  38136. exports.flushMicrotasks = flushMicrotasks;
  38137. function _setTimeout(fn, delay) {
  38138. var args = [];
  38139. for (var _i = 2; _i < arguments.length; _i++) {
  38140. args[_i - 2] = arguments[_i];
  38141. }
  38142. var cb = _fnAndFlush(fn);
  38143. var id = _scheduler.scheduleFunction(cb, delay, args);
  38144. _pendingTimers.push(id);
  38145. _scheduler.scheduleFunction(_dequeueTimer(id), delay);
  38146. return id;
  38147. }
  38148. function _clearTimeout(id) {
  38149. _dequeueTimer(id);
  38150. return _scheduler.removeFunctionWithId(id);
  38151. }
  38152. function _setInterval(fn, interval) {
  38153. var args = [];
  38154. for (var _i = 2; _i < arguments.length; _i++) {
  38155. args[_i - 2] = arguments[_i];
  38156. }
  38157. var cb = _fnAndFlush(fn);
  38158. var id = _scheduler.scheduleFunction(cb, interval, args, true);
  38159. _pendingPeriodicTimers.push(id);
  38160. return id;
  38161. }
  38162. function _clearInterval(id) {
  38163. collection_1.ListWrapper.remove(_pendingPeriodicTimers, id);
  38164. return _scheduler.removeFunctionWithId(id);
  38165. }
  38166. function _fnAndFlush(fn) {
  38167. return function () {
  38168. var args = [];
  38169. for (var _i = 0; _i < arguments.length; _i++) {
  38170. args[_i - 0] = arguments[_i];
  38171. }
  38172. fn.apply(lang_1.global, args);
  38173. flushMicrotasks();
  38174. };
  38175. }
  38176. function _scheduleMicrotask(microtask) {
  38177. _microtasks.push(microtask);
  38178. }
  38179. function _dequeueTimer(id) {
  38180. return function () { collection_1.ListWrapper.remove(_pendingTimers, id); };
  38181. }
  38182. function _assertInFakeAsyncZone() {
  38183. if (!lang_1.global.zone || !lang_1.global.zone._inFakeAsyncZone) {
  38184. throw new Error('The code should be running in the fakeAsync zone to call this function');
  38185. }
  38186. }
  38187. /***/ },
  38188. /* 275 */
  38189. /***/ function(module, exports, __webpack_require__) {
  38190. var __extends = (this && this.__extends) || function (d, b) {
  38191. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  38192. function __() { this.constructor = d; }
  38193. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  38194. };
  38195. var xhr_1 = __webpack_require__(149);
  38196. var collection_1 = __webpack_require__(12);
  38197. var lang_1 = __webpack_require__(5);
  38198. var exceptions_1 = __webpack_require__(14);
  38199. var async_1 = __webpack_require__(60);
  38200. /**
  38201. * A mock implemenation of {@link XHR} that allows outgoing requests to be mocked
  38202. * and responded to within a single test, without going to the network.
  38203. */
  38204. var MockXHR = (function (_super) {
  38205. __extends(MockXHR, _super);
  38206. function MockXHR() {
  38207. _super.apply(this, arguments);
  38208. this._expectations = [];
  38209. this._definitions = new collection_1.Map();
  38210. this._requests = [];
  38211. }
  38212. MockXHR.prototype.get = function (url) {
  38213. var request = new _PendingRequest(url);
  38214. this._requests.push(request);
  38215. return request.getPromise();
  38216. };
  38217. /**
  38218. * Add an expectation for the given URL. Incoming requests will be checked against
  38219. * the next expectation (in FIFO order). The `verifyNoOutstandingExpectations` method
  38220. * can be used to check if any expectations have not yet been met.
  38221. *
  38222. * The response given will be returned if the expectation matches.
  38223. */
  38224. MockXHR.prototype.expect = function (url, response) {
  38225. var expectation = new _Expectation(url, response);
  38226. this._expectations.push(expectation);
  38227. };
  38228. /**
  38229. * Add a definition for the given URL to return the given response. Unlike expectations,
  38230. * definitions have no order and will satisfy any matching request at any time. Also
  38231. * unlike expectations, unused definitions do not cause `verifyNoOutstandingExpectations`
  38232. * to return an error.
  38233. */
  38234. MockXHR.prototype.when = function (url, response) { this._definitions.set(url, response); };
  38235. /**
  38236. * Process pending requests and verify there are no outstanding expectations. Also fails
  38237. * if no requests are pending.
  38238. */
  38239. MockXHR.prototype.flush = function () {
  38240. if (this._requests.length === 0) {
  38241. throw new exceptions_1.BaseException('No pending requests to flush');
  38242. }
  38243. do {
  38244. this._processRequest(this._requests.shift());
  38245. } while (this._requests.length > 0);
  38246. this.verifyNoOutstandingExpectations();
  38247. };
  38248. /**
  38249. * Throw an exception if any expectations have not been satisfied.
  38250. */
  38251. MockXHR.prototype.verifyNoOutstandingExpectations = function () {
  38252. if (this._expectations.length === 0)
  38253. return;
  38254. var urls = [];
  38255. for (var i = 0; i < this._expectations.length; i++) {
  38256. var expectation = this._expectations[i];
  38257. urls.push(expectation.url);
  38258. }
  38259. throw new exceptions_1.BaseException("Unsatisfied requests: " + urls.join(', '));
  38260. };
  38261. MockXHR.prototype._processRequest = function (request) {
  38262. var url = request.url;
  38263. if (this._expectations.length > 0) {
  38264. var expectation = this._expectations[0];
  38265. if (expectation.url == url) {
  38266. collection_1.ListWrapper.remove(this._expectations, expectation);
  38267. request.complete(expectation.response);
  38268. return;
  38269. }
  38270. }
  38271. if (this._definitions.has(url)) {
  38272. var response = this._definitions.get(url);
  38273. request.complete(lang_1.normalizeBlank(response));
  38274. return;
  38275. }
  38276. throw new exceptions_1.BaseException("Unexpected request " + url);
  38277. };
  38278. return MockXHR;
  38279. })(xhr_1.XHR);
  38280. exports.MockXHR = MockXHR;
  38281. var _PendingRequest = (function () {
  38282. function _PendingRequest(url) {
  38283. this.url = url;
  38284. this.completer = async_1.PromiseWrapper.completer();
  38285. }
  38286. _PendingRequest.prototype.complete = function (response) {
  38287. if (lang_1.isBlank(response)) {
  38288. this.completer.reject("Failed to load " + this.url, null);
  38289. }
  38290. else {
  38291. this.completer.resolve(response);
  38292. }
  38293. };
  38294. _PendingRequest.prototype.getPromise = function () { return this.completer.promise; };
  38295. return _PendingRequest;
  38296. })();
  38297. var _Expectation = (function () {
  38298. function _Expectation(url, response) {
  38299. this.url = url;
  38300. this.response = response;
  38301. }
  38302. return _Expectation;
  38303. })();
  38304. /***/ },
  38305. /* 276 */
  38306. /***/ function(module, exports, __webpack_require__) {
  38307. var __extends = (this && this.__extends) || function (d, b) {
  38308. for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
  38309. function __() { this.constructor = d; }
  38310. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  38311. };
  38312. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  38313. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  38314. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  38315. 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;
  38316. return c > 3 && r && Object.defineProperty(target, key, r), r;
  38317. };
  38318. var __metadata = (this && this.__metadata) || function (k, v) {
  38319. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  38320. };
  38321. var application_ref_1 = __webpack_require__(65);
  38322. var di_1 = __webpack_require__(6);
  38323. /**
  38324. * A no-op implementation of {@link ApplicationRef}, useful for testing.
  38325. */
  38326. var MockApplicationRef = (function (_super) {
  38327. __extends(MockApplicationRef, _super);
  38328. function MockApplicationRef() {
  38329. _super.apply(this, arguments);
  38330. }
  38331. MockApplicationRef.prototype.registerBootstrapListener = function (listener) { };
  38332. MockApplicationRef.prototype.registerDisposeListener = function (dispose) { };
  38333. MockApplicationRef.prototype.bootstrap = function (componentType, bindings) {
  38334. return null;
  38335. };
  38336. Object.defineProperty(MockApplicationRef.prototype, "injector", {
  38337. get: function () { return null; },
  38338. enumerable: true,
  38339. configurable: true
  38340. });
  38341. ;
  38342. Object.defineProperty(MockApplicationRef.prototype, "zone", {
  38343. get: function () { return null; },
  38344. enumerable: true,
  38345. configurable: true
  38346. });
  38347. ;
  38348. MockApplicationRef.prototype.dispose = function () { };
  38349. MockApplicationRef.prototype.tick = function () { };
  38350. Object.defineProperty(MockApplicationRef.prototype, "componentTypes", {
  38351. get: function () { return null; },
  38352. enumerable: true,
  38353. configurable: true
  38354. });
  38355. ;
  38356. MockApplicationRef = __decorate([
  38357. di_1.Injectable(),
  38358. __metadata('design:paramtypes', [])
  38359. ], MockApplicationRef);
  38360. return MockApplicationRef;
  38361. })(application_ref_1.ApplicationRef);
  38362. exports.MockApplicationRef = MockApplicationRef;
  38363. /***/ },
  38364. /* 277 */
  38365. /***/ function(module, exports, __webpack_require__) {
  38366. function __export(m) {
  38367. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  38368. }
  38369. __export(__webpack_require__(278));
  38370. /***/ },
  38371. /* 278 */
  38372. /***/ function(module, exports, __webpack_require__) {
  38373. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  38374. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  38375. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  38376. 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;
  38377. return c > 3 && r && Object.defineProperty(target, key, r), r;
  38378. };
  38379. var __metadata = (this && this.__metadata) || function (k, v) {
  38380. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  38381. };
  38382. var core_1 = __webpack_require__(2);
  38383. var static_request_1 = __webpack_require__(212);
  38384. var enums_1 = __webpack_require__(215);
  38385. var lang_1 = __webpack_require__(5);
  38386. var exceptions_1 = __webpack_require__(14);
  38387. var Subject_1 = __webpack_require__(62);
  38388. var ReplaySubject_1 = __webpack_require__(279);
  38389. var take_1 = __webpack_require__(280);
  38390. /**
  38391. *
  38392. * Mock Connection to represent a {@link Connection} for tests.
  38393. *
  38394. **/
  38395. var MockConnection = (function () {
  38396. function MockConnection(req) {
  38397. this.response = take_1.take.call(new ReplaySubject_1.ReplaySubject(1), 1);
  38398. this.readyState = enums_1.ReadyState.Open;
  38399. this.request = req;
  38400. }
  38401. /**
  38402. * Sends a mock response to the connection. This response is the value that is emitted to the
  38403. * {@link EventEmitter} returned by {@link Http}.
  38404. *
  38405. * ### Example
  38406. *
  38407. * ```
  38408. * var connection;
  38409. * backend.connections.subscribe(c => connection = c);
  38410. * http.request('data.json').subscribe(res => console.log(res.text()));
  38411. * connection.mockRespond(new Response('fake response')); //logs 'fake response'
  38412. * ```
  38413. *
  38414. */
  38415. MockConnection.prototype.mockRespond = function (res) {
  38416. if (this.readyState === enums_1.ReadyState.Done || this.readyState === enums_1.ReadyState.Cancelled) {
  38417. throw new exceptions_1.BaseException('Connection has already been resolved');
  38418. }
  38419. this.readyState = enums_1.ReadyState.Done;
  38420. this.response.next(res);
  38421. this.response.complete();
  38422. };
  38423. /**
  38424. * Not yet implemented!
  38425. *
  38426. * Sends the provided {@link Response} to the `downloadObserver` of the `Request`
  38427. * associated with this connection.
  38428. */
  38429. MockConnection.prototype.mockDownload = function (res) {
  38430. // this.request.downloadObserver.onNext(res);
  38431. // if (res.bytesLoaded === res.totalBytes) {
  38432. // this.request.downloadObserver.onCompleted();
  38433. // }
  38434. };
  38435. // TODO(jeffbcross): consider using Response type
  38436. /**
  38437. * Emits the provided error object as an error to the {@link Response} {@link EventEmitter}
  38438. * returned
  38439. * from {@link Http}.
  38440. */
  38441. MockConnection.prototype.mockError = function (err) {
  38442. // Matches XHR semantics
  38443. this.readyState = enums_1.ReadyState.Done;
  38444. this.response.error(err);
  38445. };
  38446. return MockConnection;
  38447. })();
  38448. exports.MockConnection = MockConnection;
  38449. /**
  38450. * A mock backend for testing the {@link Http} service.
  38451. *
  38452. * This class can be injected in tests, and should be used to override providers
  38453. * to other backends, such as {@link XHRBackend}.
  38454. *
  38455. * ### Example
  38456. *
  38457. * ```
  38458. * import {DefaultOptions, Http} from 'angular2/http';
  38459. * import {MockBackend} from 'angular2/http/testing';
  38460. * it('should get some data', inject([AsyncTestCompleter], (async) => {
  38461. * var connection;
  38462. * var injector = Injector.resolveAndCreate([
  38463. * MockBackend,
  38464. * provide(Http, {useFactory: (backend, defaultOptions) => {
  38465. * return new Http(backend, defaultOptions)
  38466. * }, deps: [MockBackend, DefaultOptions]})]);
  38467. * var http = injector.get(Http);
  38468. * var backend = injector.get(MockBackend);
  38469. * //Assign any newly-created connection to local variable
  38470. * backend.connections.subscribe(c => connection = c);
  38471. * http.request('data.json').subscribe((res) => {
  38472. * expect(res.text()).toBe('awesome');
  38473. * async.done();
  38474. * });
  38475. * connection.mockRespond(new Response('awesome'));
  38476. * }));
  38477. * ```
  38478. *
  38479. * This method only exists in the mock implementation, not in real Backends.
  38480. **/
  38481. var MockBackend = (function () {
  38482. function MockBackend() {
  38483. var _this = this;
  38484. this.connectionsArray = [];
  38485. this.connections = new Subject_1.Subject();
  38486. this.connections.subscribe(function (connection) { return _this.connectionsArray.push(connection); });
  38487. this.pendingConnections = new Subject_1.Subject();
  38488. }
  38489. /**
  38490. * Checks all connections, and raises an exception if any connection has not received a response.
  38491. *
  38492. * This method only exists in the mock implementation, not in real Backends.
  38493. */
  38494. MockBackend.prototype.verifyNoPendingRequests = function () {
  38495. var pending = 0;
  38496. this.pendingConnections.subscribe(function (c) { return pending++; });
  38497. if (pending > 0)
  38498. throw new exceptions_1.BaseException(pending + " pending connections to be resolved");
  38499. };
  38500. /**
  38501. * Can be used in conjunction with `verifyNoPendingRequests` to resolve any not-yet-resolve
  38502. * connections, if it's expected that there are connections that have not yet received a response.
  38503. *
  38504. * This method only exists in the mock implementation, not in real Backends.
  38505. */
  38506. MockBackend.prototype.resolveAllConnections = function () { this.connections.subscribe(function (c) { return c.readyState = 4; }); };
  38507. /**
  38508. * Creates a new {@link MockConnection}. This is equivalent to calling `new
  38509. * MockConnection()`, except that it also will emit the new `Connection` to the `connections`
  38510. * emitter of this `MockBackend` instance. This method will usually only be used by tests
  38511. * against the framework itself, not by end-users.
  38512. */
  38513. MockBackend.prototype.createConnection = function (req) {
  38514. if (!lang_1.isPresent(req) || !(req instanceof static_request_1.Request)) {
  38515. throw new exceptions_1.BaseException("createConnection requires an instance of Request, got " + req);
  38516. }
  38517. var connection = new MockConnection(req);
  38518. this.connections.next(connection);
  38519. return connection;
  38520. };
  38521. MockBackend = __decorate([
  38522. core_1.Injectable(),
  38523. __metadata('design:paramtypes', [])
  38524. ], MockBackend);
  38525. return MockBackend;
  38526. })();
  38527. exports.MockBackend = MockBackend;
  38528. /***/ },
  38529. /* 279 */
  38530. /***/ function(module, exports) {
  38531. module.exports = __WEBPACK_EXTERNAL_MODULE_279__;
  38532. /***/ },
  38533. /* 280 */
  38534. /***/ function(module, exports) {
  38535. module.exports = __WEBPACK_EXTERNAL_MODULE_280__;
  38536. /***/ },
  38537. /* 281 */
  38538. /***/ function(module, exports, __webpack_require__) {
  38539. function __export(m) {
  38540. for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
  38541. }
  38542. __export(__webpack_require__(265));
  38543. __export(__webpack_require__(282));
  38544. /***/ },
  38545. /* 282 */
  38546. /***/ function(module, exports, __webpack_require__) {
  38547. var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
  38548. var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
  38549. if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
  38550. 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;
  38551. return c > 3 && r && Object.defineProperty(target, key, r), r;
  38552. };
  38553. var __metadata = (this && this.__metadata) || function (k, v) {
  38554. if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  38555. };
  38556. var di_1 = __webpack_require__(6);
  38557. var async_1 = __webpack_require__(60);
  38558. /**
  38559. * A spy for {@link Location} that allows tests to fire simulated location events.
  38560. */
  38561. var SpyLocation = (function () {
  38562. function SpyLocation() {
  38563. this.urlChanges = [];
  38564. /** @internal */
  38565. this._path = '';
  38566. /** @internal */
  38567. this._query = '';
  38568. /** @internal */
  38569. this._subject = new async_1.EventEmitter();
  38570. /** @internal */
  38571. this._baseHref = '';
  38572. // TODO: remove these once Location is an interface, and can be implemented cleanly
  38573. this.platformStrategy = null;
  38574. }
  38575. SpyLocation.prototype.setInitialPath = function (url) { this._path = url; };
  38576. SpyLocation.prototype.setBaseHref = function (url) { this._baseHref = url; };
  38577. SpyLocation.prototype.path = function () { return this._path; };
  38578. SpyLocation.prototype.simulateUrlPop = function (pathname) {
  38579. async_1.ObservableWrapper.callEmit(this._subject, { 'url': pathname, 'pop': true });
  38580. };
  38581. SpyLocation.prototype.simulateHashChange = function (pathname) {
  38582. // Because we don't prevent the native event, the browser will independently update the path
  38583. this.setInitialPath(pathname);
  38584. this.urlChanges.push('hash: ' + pathname);
  38585. async_1.ObservableWrapper.callEmit(this._subject, { 'url': pathname, 'pop': true, 'type': 'hashchange' });
  38586. };
  38587. SpyLocation.prototype.prepareExternalUrl = function (url) {
  38588. if (url.length > 0 && !url.startsWith('/')) {
  38589. url = '/' + url;
  38590. }
  38591. return this._baseHref + url;
  38592. };
  38593. SpyLocation.prototype.go = function (path, query) {
  38594. if (query === void 0) { query = ''; }
  38595. path = this.prepareExternalUrl(path);
  38596. if (this._path == path && this._query == query) {
  38597. return;
  38598. }
  38599. this._path = path;
  38600. this._query = query;
  38601. var url = path + (query.length > 0 ? ('?' + query) : '');
  38602. this.urlChanges.push(url);
  38603. };
  38604. SpyLocation.prototype.replaceState = function (path, query) {
  38605. if (query === void 0) { query = ''; }
  38606. path = this.prepareExternalUrl(path);
  38607. this._path = path;
  38608. this._query = query;
  38609. var url = path + (query.length > 0 ? ('?' + query) : '');
  38610. this.urlChanges.push('replace: ' + url);
  38611. };
  38612. SpyLocation.prototype.forward = function () {
  38613. // TODO
  38614. };
  38615. SpyLocation.prototype.back = function () {
  38616. // TODO
  38617. };
  38618. SpyLocation.prototype.subscribe = function (onNext, onThrow, onReturn) {
  38619. if (onThrow === void 0) { onThrow = null; }
  38620. if (onReturn === void 0) { onReturn = null; }
  38621. return async_1.ObservableWrapper.subscribe(this._subject, onNext, onThrow, onReturn);
  38622. };
  38623. SpyLocation.prototype.normalize = function (url) { return null; };
  38624. SpyLocation = __decorate([
  38625. di_1.Injectable(),
  38626. __metadata('design:paramtypes', [])
  38627. ], SpyLocation);
  38628. return SpyLocation;
  38629. })();
  38630. exports.SpyLocation = SpyLocation;
  38631. /***/ }
  38632. /******/ ])
  38633. });
  38634. ;
  38635. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly8vd2VicGFjay91bml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uIiwid2VicGFjazovLy93ZWJwYWNrL2Jvb3RzdHJhcCAwMDVhNWVlMjUwMmM1MDQxODFiNCIsIndlYnBhY2s6Ly8vLi90b29scy9idWlsZC93ZWJwYWNrL2FuZ3VsYXIyLWFsbC10ZXN0aW5nLnVtZC5qcyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvY29yZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL2RpLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2RpLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9kaS9tZXRhZGF0YS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGkvZGVjb3JhdG9ycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvdXRpbC9kZWNvcmF0b3JzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9kaS9mb3J3YXJkX3JlZi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGkvaW5qZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGkvcHJvdmlkZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25faGFuZGxlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9yZWZsZWN0aW9uL3JlZmxlY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uX2NhcGFiaWxpdGllcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvZGkva2V5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9kaS90eXBlX2xpdGVyYWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2RpL2V4Y2VwdGlvbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2RpL29wYXF1ZV90b2tlbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEvZGlyZWN0aXZlcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2RpZmZlcnMvaXRlcmFibGVfZGlmZmVycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9kaWZmZXJzL2RlZmF1bHRfaXRlcmFibGVfZGlmZmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2RpZmZlcnMva2V5dmFsdWVfZGlmZmVycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9kaWZmZXJzL2RlZmF1bHRfa2V5dmFsdWVfZGlmZmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9hc3QudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcGFyc2VyL2xleGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9wYXJzZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcGFyc2VyL2xvY2Fscy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9leGNlcHRpb25zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2ludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY29uc3RhbnRzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3Byb3RvX2NoYW5nZV9kZXRlY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uX3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcGlwZV9saWZlY3ljbGVfcmVmbGVjdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2JpbmRpbmdfcmVjb3JkLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2RpcmVjdGl2ZV9yZWNvcmQudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vZHluYW1pY19jaGFuZ2VfZGV0ZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vYWJzdHJhY3RfY2hhbmdlX2RldGVjdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rvcl9yZWYudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3Byb2ZpbGUvcHJvZmlsZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcHJvZmlsZS93dGZfaW1wbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9vYnNlcnZhYmxlX2ZhY2FkZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9wcm90b19yZWNvcmQudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vZXZlbnRfYmluZGluZy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jb2FsZXNjZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9qaXRfcHJvdG9fY2hhbmdlX2RldGVjdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb25faml0X2dlbmVyYXRvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jb2RlZ2VuX25hbWVfdXRpbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jb2RlZ2VuX2xvZ2ljX3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY29kZWdlbl9mYWNhZGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL3ZpZXcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3Byb2RfbW9kZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2ZhY2FkZS9mYWNhZGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9mYWNhZGUvcHJvbWlzZS50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwgXCJSeFwiIiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwicnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlXCIsXCJjb21tb25qczJcIjpcInJ4anMvb2JzZXJ2YWJsZS9mcm9tUHJvbWlzZVwiLFwiYW1kXCI6XCJyeGpzL29ic2VydmFibGUvZnJvbVByb21pc2VcIixcInJvb3RcIjpbXCJSeFwiLFwiT2JzZXJ2YWJsZVwiXX0iLCJ3ZWJwYWNrOi8vL2V4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJyeGpzL29wZXJhdG9yL3RvUHJvbWlzZVwiLFwiY29tbW9uanMyXCI6XCJyeGpzL29wZXJhdG9yL3RvUHJvbWlzZVwiLFwiYW1kXCI6XCJyeGpzL29wZXJhdG9yL3RvUHJvbWlzZVwiLFwicm9vdFwiOltcIlJ4XCIsXCJPYnNlcnZhYmxlXCIsXCJwcm90b3R5cGVcIl19Iiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9hcHBsaWNhdGlvbl9yZWYudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3pvbmUvbmdfem9uZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fdG9rZW5zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS90ZXN0YWJpbGl0eS90ZXN0YWJpbGl0eS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2R5bmFtaWNfY29tcG9uZW50X2xvYWRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvcHJvdG9fdmlld19mYWN0b3J5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9waXBlcy9waXBlX3Byb3ZpZGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9waXBlcy9waXBlcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9waXBlcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X3JlZi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9lbGVtZW50X2JpbmRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2VsZW1lbnRfaW5qZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X21hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X21hbmFnZXJfdXRpbHMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9lbGVtZW50X3JlZi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3RlbXBsYXRlX3JlZi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcG9vbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfbGlzdGVuZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X2NvbnRhaW5lcl9yZWYudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9kaXJlY3RpdmVfbGlmZWN5Y2xlX3JlZmxlY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2ludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9xdWVyeV9saXN0LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZXZlbnRfY29uZmlnLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZGlyZWN0aXZlX3Jlc29sdmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19yZXNvbHZlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3BpcGVfcmVzb2x2ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3BsYXRmb3JtX2RpcmVjdGl2ZXNfYW5kX3BpcGVzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdGVtcGxhdGVfY29tbWFuZHMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL2NvbnNvbGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3pvbmUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9kZWJ1Zy9kZWJ1Z19lbGVtZW50LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9wbGF0Zm9ybV9jb21tb25fcHJvdmlkZXJzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9hcHBsaWNhdGlvbl9jb21tb25fcHJvdmlkZXJzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9jb21tb24udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMvYXN5bmNfcGlwZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9pbnZhbGlkX3BpcGVfYXJndW1lbnRfZXhjZXB0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL3VwcGVyY2FzZV9waXBlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL2xvd2VyY2FzZV9waXBlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL2pzb25fcGlwZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9zbGljZV9waXBlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL2RhdGVfcGlwZS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2ZhY2FkZS9pbnRsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL251bWJlcl9waXBlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZGlyZWN0aXZlcy9uZ19jbGFzcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzL25nX2Zvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzL25nX2lmLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvbmdfc3R5bGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZGlyZWN0aXZlcy9uZ19zd2l0Y2gudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZGlyZWN0aXZlcy9vYnNlcnZhYmxlX2xpc3RfZGlmZi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzL2NvcmVfZGlyZWN0aXZlcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9tb2RlbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL2Fic3RyYWN0X2NvbnRyb2xfZGlyZWN0aXZlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvY29udHJvbF9jb250YWluZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX25hbWUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvY29udHJvbF92YWx1ZV9hY2Nlc3Nvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL3NoYXJlZC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy92YWxpZGF0b3JzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvZGVmYXVsdF92YWx1ZV9hY2Nlc3Nvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL251bWJlcl92YWx1ZV9hY2Nlc3Nvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL2NoZWNrYm94X3ZhbHVlX2FjY2Vzc29yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvc2VsZWN0X2NvbnRyb2xfdmFsdWVfYWNjZXNzb3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9ub3JtYWxpemVfdmFsaWRhdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfZm9ybV9jb250cm9sLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfbW9kZWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX2dyb3VwLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfZm9ybV9tb2RlbC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL25nX2Zvcm0udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX3N0YXR1cy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvdmFsaWRhdG9ycy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9mb3JtX2J1aWxkZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21tb24vY29tbW9uX2RpcmVjdGl2ZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvdXJsX3Jlc29sdmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvY29tcGlsZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9ydW50aW1lX2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfY29tcGlsZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9kaXJlY3RpdmVfbWV0YWRhdGEudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9zZWxlY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9zb3VyY2VfbW9kdWxlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvY2hhbmdlX2RldGVjdG9yX2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvY2hhbmdlX2RlZmluaXRpb25fZmFjdG9yeS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX2FzdC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3RyYW5zZm9ybS90ZW1wbGF0ZV9jb21waWxlci9jaGFuZ2VfZGV0ZWN0b3JfY29kZWdlbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3N0eWxlX2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvc2hhZG93X2Nzcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3N0eWxlX3VybF9yZXNvbHZlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3ZpZXdfZmFjdG9yeS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3ZpZXcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9jb21tYW5kX2NvbXBpbGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfcGFyc2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvaHRtbF9wYXJzZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9odG1sX2FzdC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2h0bWxfbGV4ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9wYXJzZV91dGlsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvaHRtbF90YWdzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvc2NoZW1hL2VsZW1lbnRfc2NoZW1hX3JlZ2lzdHJ5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfcHJlcGFyc2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfbm9ybWFsaXplci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3J1bnRpbWVfbWV0YWRhdGEudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9jb21waWxlci9zY2hlbWEvZG9tX2VsZW1lbnRfc2NoZW1hX3JlZ2lzdHJ5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29yZS9hbmd1bGFyX2VudHJ5cG9pbnQudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyX2NvbW1vbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvZG9tX2V2ZW50cy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvZXZlbnRfbWFuYWdlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMva2V5X2V2ZW50cy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvaGFtbWVyX2dlc3R1cmVzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9oYW1tZXJfY29tbW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV90b2tlbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX3JlbmRlcmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvYW5pbWF0ZS9hbmltYXRpb25fYnVpbGRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2FuaW1hdGUvY3NzX2FuaW1hdGlvbl9idWlsZGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvYW5pbWF0ZS9jc3NfYW5pbWF0aW9uX29wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9hbmltYXRlL2FuaW1hdGlvbi50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2ZhY2FkZS9tYXRoLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL3V0aWwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9hbmltYXRlL2Jyb3dzZXJfZGV0YWlscy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9zaGFyZWRfc3R5bGVzX2hvc3QudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyL2Jyb3dzZXJfYWRhcHRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvZ2VuZXJpY19icm93c2VyX2FkYXB0ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyL3hocl9pbXBsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci90ZXN0YWJpbGl0eS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2NvcmUvcHJvZmlsZS93dGZfaW5pdC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdGl0bGUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3BsYXRmb3JtL2NvbW1vbl9kb20udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZGVidWcvYnkudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZGVidWcvZGVidWdfZWxlbWVudF92aWV3X2xpc3RlbmVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci90b29scy90b29scy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdG9vbHMvY29tbW9uX3Rvb2xzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvZmFjYWRlL2Jyb3dzZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL2h0dHAudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL2h0dHAudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL2ludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL3N0YXRpY19yZXF1ZXN0LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9oZWFkZXJzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9odHRwX3V0aWxzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9lbnVtcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2h0dHAvYmFzZV9yZXF1ZXN0X29wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL3VybF9zZWFyY2hfcGFyYW1zLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9iYWNrZW5kcy94aHJfYmFja2VuZC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL2h0dHAvc3RhdGljX3Jlc3BvbnNlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9iYXNlX3Jlc3BvbnNlX29wdGlvbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL2JhY2tlbmRzL2Jyb3dzZXJfeGhyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9iYWNrZW5kcy9qc29ucF9iYWNrZW5kLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvaHR0cC9iYWNrZW5kcy9icm93c2VyX2pzb25wLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9yb3V0ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlX3JlZ2lzdHJ5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlX2NvbmZpZ19pbXBsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlX3JlY29nbml6ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvaW5zdHJ1Y3Rpb24udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcGF0aF9yZWNvZ25pemVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3VybF9wYXJzZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvY29tcG9uZW50X3JlY29nbml6ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvYXN5bmNfcm91dGVfaGFuZGxlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9zeW5jX3JvdXRlX2hhbmRsZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVfY29uZmlnX25vbWFsaXplci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9jb25maWdfZGVjb3JhdG9yLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL2xvY2F0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL2xvY2F0aW9uX3N0cmF0ZWd5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlX2xpZmVjeWNsZV9yZWZsZWN0b3IudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvbGlmZWN5Y2xlX2Fubm90YXRpb25zX2ltcGwudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyX291dGxldC50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9saWZlY3ljbGVfYW5ub3RhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyX2xpbmsudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcGxhdGZvcm1fbG9jYXRpb24udHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9yb3V0ZXIvaGFzaF9sb2NhdGlvbl9zdHJhdGVneS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3JvdXRlci9wYXRoX2xvY2F0aW9uX3N0cmF0ZWd5LnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9yb3V0ZXIvcm91dGVyX2xpbmtfZHNsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlcl9saW5rX3RyYW5zZm9ybS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvaW5zdHJ1bWVudGF0aW9uLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi91cGdyYWRlLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdXBncmFkZS91cGdyYWRlX2FkYXB0ZXIudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy91cGdyYWRlL21ldGFkYXRhLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdXBncmFkZS91dGlsLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdXBncmFkZS9jb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy91cGdyYWRlL2Rvd25ncmFkZV9uZzJfYWRhcHRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3VwZ3JhZGUvdXBncmFkZV9uZzFfYWRhcHRlci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3VwZ3JhZGUvYW5ndWxhcl9qcy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvdGVzdGluZy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3Rlc3RpbmcvdGVzdGluZy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3Rlc3RpbmcvdGVzdF9pbmplY3Rvci50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL21vY2svYW5pbWF0aW9uX2J1aWxkZXJfbW9jay50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL21vY2svZGlyZWN0aXZlX3Jlc29sdmVyX21vY2sudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9tb2NrL3ZpZXdfcmVzb2x2ZXJfbW9jay50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL21vY2svbW9ja19sb2NhdGlvbl9zdHJhdGVneS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL21vY2svbmdfem9uZV9tb2NrLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdGVzdGluZy90ZXN0X2NvbXBvbmVudF9idWlsZGVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdGVzdGluZy91dGlscy50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9zZXJpYWxpemVyLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL2FwaS50cyIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9yZW5kZXJfcHJvdG9fdmlld19yZWZfc3RvcmUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy93ZWJfd29ya2Vycy9zaGFyZWQvcmVuZGVyX3ZpZXdfd2l0aF9mcmFnbWVudHNfc3RvcmUudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy90ZXN0aW5nL21hdGNoZXJzLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvdGVzdGluZy9mYWtlX2FzeW5jLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyX21vY2sudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9tb2NrL21vY2tfYXBwbGljYXRpb25fcmVmLnRzIiwid2VicGFjazovLy9hbmd1bGFyMi9odHRwL3Rlc3RpbmcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9odHRwL2JhY2tlbmRzL21vY2tfYmFja2VuZC50cyIsIndlYnBhY2s6Ly8vZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInJ4anMvc3ViamVjdC9SZXBsYXlTdWJqZWN0XCIsXCJjb21tb25qczJcIjpcInJ4anMvc3ViamVjdC9SZXBsYXlTdWJqZWN0XCIsXCJhbWRcIjpcInJ4anMvc3ViamVjdC9SZXBsYXlTdWJqZWN0XCIsXCJyb290XCI6W1wiUnhcIl19Iiwid2VicGFjazovLy9leHRlcm5hbCB7XCJjb21tb25qc1wiOlwicnhqcy9vcGVyYXRvci90YWtlXCIsXCJjb21tb25qczJcIjpcInJ4anMvb3BlcmF0b3IvdGFrZVwiLFwiYW1kXCI6XCJyeGpzL29wZXJhdG9yL3Rha2VcIixcInJvb3RcIjpbXCJSeFwiLFwiT2JzZXJ2YWJsZVwiLFwicHJvdG90eXBlXCJdfSIsIndlYnBhY2s6Ly8vYW5ndWxhcjIvcm91dGVyL3Rlc3RpbmcudHMiLCJ3ZWJwYWNrOi8vL2FuZ3VsYXIyL3NyYy9tb2NrL2xvY2F0aW9uX21vY2sudHMiXSwibmFtZXMiOlsiQXR0cmlidXRlTWV0YWRhdGEiLCJBdHRyaWJ1dGVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkF0dHJpYnV0ZU1ldGFkYXRhLnRva2VuIiwiQXR0cmlidXRlTWV0YWRhdGEudG9TdHJpbmciLCJRdWVyeU1ldGFkYXRhIiwiUXVlcnlNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIlF1ZXJ5TWV0YWRhdGEuaXNWaWV3UXVlcnkiLCJRdWVyeU1ldGFkYXRhLnNlbGVjdG9yIiwiUXVlcnlNZXRhZGF0YS5pc1ZhckJpbmRpbmdRdWVyeSIsIlF1ZXJ5TWV0YWRhdGEudmFyQmluZGluZ3MiLCJRdWVyeU1ldGFkYXRhLnRvU3RyaW5nIiwiQ29udGVudENoaWxkcmVuTWV0YWRhdGEiLCJDb250ZW50Q2hpbGRyZW5NZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkNvbnRlbnRDaGlsZE1ldGFkYXRhIiwiQ29udGVudENoaWxkTWV0YWRhdGEuY29uc3RydWN0b3IiLCJWaWV3UXVlcnlNZXRhZGF0YSIsIlZpZXdRdWVyeU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiVmlld1F1ZXJ5TWV0YWRhdGEuaXNWaWV3UXVlcnkiLCJWaWV3UXVlcnlNZXRhZGF0YS50b1N0cmluZyIsIlZpZXdDaGlsZHJlbk1ldGFkYXRhIiwiVmlld0NoaWxkcmVuTWV0YWRhdGEuY29uc3RydWN0b3IiLCJWaWV3Q2hpbGRNZXRhZGF0YSIsIlZpZXdDaGlsZE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiZ2V0VHlwZU5hbWVGb3JEZWJ1Z2dpbmciLCJsb2NrTW9kZSIsImVuYWJsZVByb2RNb2RlIiwiYXNzZXJ0aW9uc0VuYWJsZWQiLCJhc3NlcnQiLCJDT05TVF9FWFBSIiwiQ09OU1QiLCJpc1ByZXNlbnQiLCJpc0JsYW5rIiwiaXNTdHJpbmciLCJpc0Z1bmN0aW9uIiwiaXNUeXBlIiwiaXNTdHJpbmdNYXAiLCJpc1Byb21pc2UiLCJpc0FycmF5IiwiaXNOdW1iZXIiLCJpc0RhdGUiLCJub29wIiwic3RyaW5naWZ5Iiwic2VyaWFsaXplRW51bSIsImRlc2VyaWFsaXplRW51bSIsIlN0cmluZ1dyYXBwZXIiLCJTdHJpbmdXcmFwcGVyLmNvbnN0cnVjdG9yIiwiU3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUiLCJTdHJpbmdXcmFwcGVyLmNoYXJDb2RlQXQiLCJTdHJpbmdXcmFwcGVyLnNwbGl0IiwiU3RyaW5nV3JhcHBlci5lcXVhbHMiLCJTdHJpbmdXcmFwcGVyLnN0cmlwTGVmdCIsIlN0cmluZ1dyYXBwZXIuc3RyaXBSaWdodCIsIlN0cmluZ1dyYXBwZXIucmVwbGFjZSIsIlN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbCIsIlN0cmluZ1dyYXBwZXIuc2xpY2UiLCJTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQiLCJTdHJpbmdXcmFwcGVyLmNvbnRhaW5zIiwiU3RyaW5nV3JhcHBlci5jb21wYXJlIiwiU3RyaW5nSm9pbmVyIiwiU3RyaW5nSm9pbmVyLmNvbnN0cnVjdG9yIiwiU3RyaW5nSm9pbmVyLmFkZCIsIlN0cmluZ0pvaW5lci50b1N0cmluZyIsIk51bWJlclBhcnNlRXJyb3IiLCJOdW1iZXJQYXJzZUVycm9yLmNvbnN0cnVjdG9yIiwiTnVtYmVyUGFyc2VFcnJvci50b1N0cmluZyIsIk51bWJlcldyYXBwZXIiLCJOdW1iZXJXcmFwcGVyLmNvbnN0cnVjdG9yIiwiTnVtYmVyV3JhcHBlci50b0ZpeGVkIiwiTnVtYmVyV3JhcHBlci5lcXVhbCIsIk51bWJlcldyYXBwZXIucGFyc2VJbnRBdXRvUmFkaXgiLCJOdW1iZXJXcmFwcGVyLnBhcnNlSW50IiwiTnVtYmVyV3JhcHBlci5wYXJzZUZsb2F0IiwiTnVtYmVyV3JhcHBlci5OYU4iLCJOdW1iZXJXcmFwcGVyLmlzTmFOIiwiTnVtYmVyV3JhcHBlci5pc0ludGVnZXIiLCJSZWdFeHBXcmFwcGVyIiwiUmVnRXhwV3JhcHBlci5jb25zdHJ1Y3RvciIsIlJlZ0V4cFdyYXBwZXIuY3JlYXRlIiwiUmVnRXhwV3JhcHBlci5maXJzdE1hdGNoIiwiUmVnRXhwV3JhcHBlci50ZXN0IiwiUmVnRXhwV3JhcHBlci5tYXRjaGVyIiwiUmVnRXhwTWF0Y2hlcldyYXBwZXIiLCJSZWdFeHBNYXRjaGVyV3JhcHBlci5jb25zdHJ1Y3RvciIsIlJlZ0V4cE1hdGNoZXJXcmFwcGVyLm5leHQiLCJGdW5jdGlvbldyYXBwZXIiLCJGdW5jdGlvbldyYXBwZXIuY29uc3RydWN0b3IiLCJGdW5jdGlvbldyYXBwZXIuYXBwbHkiLCJsb29zZUlkZW50aWNhbCIsImdldE1hcEtleSIsIm5vcm1hbGl6ZUJsYW5rIiwibm9ybWFsaXplQm9vbCIsImlzSnNPYmplY3QiLCJwcmludCIsIkpzb24iLCJKc29uLmNvbnN0cnVjdG9yIiwiSnNvbi5wYXJzZSIsIkpzb24uc3RyaW5naWZ5IiwiRGF0ZVdyYXBwZXIiLCJEYXRlV3JhcHBlci5jb25zdHJ1Y3RvciIsIkRhdGVXcmFwcGVyLmNyZWF0ZSIsIkRhdGVXcmFwcGVyLmZyb21JU09TdHJpbmciLCJEYXRlV3JhcHBlci5mcm9tTWlsbGlzIiwiRGF0ZVdyYXBwZXIudG9NaWxsaXMiLCJEYXRlV3JhcHBlci5ub3ciLCJEYXRlV3JhcHBlci50b0pzb24iLCJzZXRWYWx1ZU9uUGF0aCIsImdldFN5bWJvbEl0ZXJhdG9yIiwiSW5qZWN0TWV0YWRhdGEiLCJJbmplY3RNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkluamVjdE1ldGFkYXRhLnRvU3RyaW5nIiwiT3B0aW9uYWxNZXRhZGF0YSIsIk9wdGlvbmFsTWV0YWRhdGEuY29uc3RydWN0b3IiLCJPcHRpb25hbE1ldGFkYXRhLnRvU3RyaW5nIiwiRGVwZW5kZW5jeU1ldGFkYXRhIiwiRGVwZW5kZW5jeU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiRGVwZW5kZW5jeU1ldGFkYXRhLnRva2VuIiwiSW5qZWN0YWJsZU1ldGFkYXRhIiwiSW5qZWN0YWJsZU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiU2VsZk1ldGFkYXRhIiwiU2VsZk1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiU2VsZk1ldGFkYXRhLnRvU3RyaW5nIiwiU2tpcFNlbGZNZXRhZGF0YSIsIlNraXBTZWxmTWV0YWRhdGEuY29uc3RydWN0b3IiLCJTa2lwU2VsZk1ldGFkYXRhLnRvU3RyaW5nIiwiSG9zdE1ldGFkYXRhIiwiSG9zdE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiSG9zdE1ldGFkYXRhLnRvU3RyaW5nIiwiZXh0cmFjdEFubm90YXRpb24iLCJhcHBseVBhcmFtcyIsIkNsYXNzIiwibWFrZURlY29yYXRvciIsIm1ha2VEZWNvcmF0b3IuRGVjb3JhdG9yRmFjdG9yeSIsIm1ha2VEZWNvcmF0b3IuRGVjb3JhdG9yRmFjdG9yeS5UeXBlRGVjb3JhdG9yIiwibWFrZVBhcmFtRGVjb3JhdG9yIiwibWFrZVBhcmFtRGVjb3JhdG9yLlBhcmFtRGVjb3JhdG9yRmFjdG9yeSIsIm1ha2VQYXJhbURlY29yYXRvci5QYXJhbURlY29yYXRvckZhY3RvcnkuUGFyYW1EZWNvcmF0b3IiLCJtYWtlUHJvcERlY29yYXRvciIsIm1ha2VQcm9wRGVjb3JhdG9yLlByb3BEZWNvcmF0b3JGYWN0b3J5IiwibWFrZVByb3BEZWNvcmF0b3IuUHJvcERlY29yYXRvckZhY3RvcnkuUHJvcERlY29yYXRvciIsImZvcndhcmRSZWYiLCJyZXNvbHZlRm9yd2FyZFJlZiIsIlZpc2liaWxpdHkiLCJjYW5TZWUiLCJQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kiLCJQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kuY29uc3RydWN0b3IiLCJQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0UHJvdmlkZXJBdEluZGV4IiwiUHJvdG9JbmplY3RvcklubGluZVN0cmF0ZWd5LmNyZWF0ZUluamVjdG9yU3RyYXRlZ3kiLCJQcm90b0luamVjdG9yRHluYW1pY1N0cmF0ZWd5IiwiUHJvdG9JbmplY3RvckR5bmFtaWNTdHJhdGVneS5jb25zdHJ1Y3RvciIsIlByb3RvSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZ2V0UHJvdmlkZXJBdEluZGV4IiwiUHJvdG9JbmplY3RvckR5bmFtaWNTdHJhdGVneS5jcmVhdGVJbmplY3RvclN0cmF0ZWd5IiwiUHJvdG9JbmplY3RvciIsIlByb3RvSW5qZWN0b3IuY29uc3RydWN0b3IiLCJQcm90b0luamVjdG9yLmdldFByb3ZpZGVyQXRJbmRleCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kiLCJJbmplY3RvcklubGluZVN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiSW5qZWN0b3JJbmxpbmVTdHJhdGVneS5yZXNldENvbnN0cnVjdGlvbkNvdW50ZXIiLCJJbmplY3RvcklubGluZVN0cmF0ZWd5Lmluc3RhbnRpYXRlUHJvdmlkZXIiLCJJbmplY3RvcklubGluZVN0cmF0ZWd5LmF0dGFjaCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0T2JqQnlLZXlJZCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0T2JqQXRJbmRleCIsIkluamVjdG9ySW5saW5lU3RyYXRlZ3kuZ2V0TWF4TnVtYmVyT2ZPYmplY3RzIiwiSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kiLCJJbmplY3RvckR5bmFtaWNTdHJhdGVneS5jb25zdHJ1Y3RvciIsIkluamVjdG9yRHluYW1pY1N0cmF0ZWd5LnJlc2V0Q29uc3RydWN0aW9uQ291bnRlciIsIkluamVjdG9yRHluYW1pY1N0cmF0ZWd5Lmluc3RhbnRpYXRlUHJvdmlkZXIiLCJJbmplY3RvckR5bmFtaWNTdHJhdGVneS5hdHRhY2giLCJJbmplY3RvckR5bmFtaWNTdHJhdGVneS5nZXRPYmpCeUtleUlkIiwiSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZ2V0T2JqQXRJbmRleCIsIkluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmdldE1heE51bWJlck9mT2JqZWN0cyIsIlByb3ZpZGVyV2l0aFZpc2liaWxpdHkiLCJQcm92aWRlcldpdGhWaXNpYmlsaXR5LmNvbnN0cnVjdG9yIiwiUHJvdmlkZXJXaXRoVmlzaWJpbGl0eS5nZXRLZXlJZCIsIkluamVjdG9yIiwiSW5qZWN0b3IuY29uc3RydWN0b3IiLCJJbmplY3Rvci5yZXNvbHZlIiwiSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZSIsIkluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyIsIkluamVjdG9yLmZyb21SZXNvbHZlZEJpbmRpbmdzIiwiSW5qZWN0b3IuZGVidWdDb250ZXh0IiwiSW5qZWN0b3IuZ2V0IiwiSW5qZWN0b3IuZ2V0T3B0aW9uYWwiLCJJbmplY3Rvci5nZXRBdCIsIkluamVjdG9yLnBhcmVudCIsIkluamVjdG9yLmludGVybmFsU3RyYXRlZ3kiLCJJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQiLCJJbmplY3Rvci5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZCIsIkluamVjdG9yLnJlc29sdmVBbmRJbnN0YW50aWF0ZSIsIkluamVjdG9yLmluc3RhbnRpYXRlUmVzb2x2ZWQiLCJJbmplY3Rvci5fbmV3IiwiSW5qZWN0b3IuX2luc3RhbnRpYXRlUHJvdmlkZXIiLCJJbmplY3Rvci5faW5zdGFudGlhdGUiLCJJbmplY3Rvci5fZ2V0QnlEZXBlbmRlbmN5IiwiSW5qZWN0b3IuX2dldEJ5S2V5IiwiSW5qZWN0b3IuX3Rocm93T3JOdWxsIiwiSW5qZWN0b3IuX2dldEJ5S2V5U2VsZiIsIkluamVjdG9yLl9nZXRCeUtleUhvc3QiLCJJbmplY3Rvci5fZ2V0UHJpdmF0ZURlcGVuZGVuY3kiLCJJbmplY3Rvci5fZ2V0QnlLZXlEZWZhdWx0IiwiSW5qZWN0b3IuZGlzcGxheU5hbWUiLCJJbmplY3Rvci50b1N0cmluZyIsIl9tYXBQcm92aWRlcnMiLCJjcmVhdGVNYXBGcm9tUGFpcnMiLCJjcmVhdGVNYXBBbmRQb3B1bGF0ZUZyb21QYWlycyIsImNyZWF0ZU1hcEZyb21NYXAiLCJjcmVhdGVNYXBBbmRQb3B1bGF0ZUZyb21NYXAiLCJfY2xlYXJWYWx1ZXMiLCJfY2xlYXJWYWx1ZXNXaXRoRm9yZUVhY2giLCJjcmVhdGVBcnJheUZyb21NYXAiLCJjcmVhdGVBcnJheUZyb21NYXBXaXRoRm9yZWFjaCIsIk1hcFdyYXBwZXIiLCJNYXBXcmFwcGVyLmNvbnN0cnVjdG9yIiwiTWFwV3JhcHBlci5jbG9uZSIsIk1hcFdyYXBwZXIuY3JlYXRlRnJvbVN0cmluZ01hcCIsIk1hcFdyYXBwZXIudG9TdHJpbmdNYXAiLCJNYXBXcmFwcGVyLmNyZWF0ZUZyb21QYWlycyIsIk1hcFdyYXBwZXIuY2xlYXJWYWx1ZXMiLCJNYXBXcmFwcGVyLml0ZXJhYmxlIiwiTWFwV3JhcHBlci5rZXlzIiwiTWFwV3JhcHBlci52YWx1ZXMiLCJTdHJpbmdNYXBXcmFwcGVyIiwiU3RyaW5nTWFwV3JhcHBlci5jb25zdHJ1Y3RvciIsIlN0cmluZ01hcFdyYXBwZXIuY3JlYXRlIiwiU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyIsIlN0cmluZ01hcFdyYXBwZXIuZ2V0IiwiU3RyaW5nTWFwV3JhcHBlci5zZXQiLCJTdHJpbmdNYXBXcmFwcGVyLmtleXMiLCJTdHJpbmdNYXBXcmFwcGVyLmlzRW1wdHkiLCJTdHJpbmdNYXBXcmFwcGVyLmRlbGV0ZSIsIlN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaCIsIlN0cmluZ01hcFdyYXBwZXIubWVyZ2UiLCJTdHJpbmdNYXBXcmFwcGVyLmVxdWFscyIsIkxpc3RXcmFwcGVyIiwiTGlzdFdyYXBwZXIuY29uc3RydWN0b3IiLCJMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUiLCJMaXN0V3JhcHBlci5jcmVhdGVHcm93YWJsZVNpemUiLCJMaXN0V3JhcHBlci5jbG9uZSIsIkxpc3RXcmFwcGVyLmZvckVhY2hXaXRoSW5kZXgiLCJMaXN0V3JhcHBlci5maXJzdCIsIkxpc3RXcmFwcGVyLmxhc3QiLCJMaXN0V3JhcHBlci5pbmRleE9mIiwiTGlzdFdyYXBwZXIuY29udGFpbnMiLCJMaXN0V3JhcHBlci5yZXZlcnNlZCIsIkxpc3RXcmFwcGVyLmNvbmNhdCIsIkxpc3RXcmFwcGVyLmluc2VydCIsIkxpc3RXcmFwcGVyLnJlbW92ZUF0IiwiTGlzdFdyYXBwZXIucmVtb3ZlQWxsIiwiTGlzdFdyYXBwZXIucmVtb3ZlIiwiTGlzdFdyYXBwZXIuY2xlYXIiLCJMaXN0V3JhcHBlci5pc0VtcHR5IiwiTGlzdFdyYXBwZXIuZmlsbCIsIkxpc3RXcmFwcGVyLmVxdWFscyIsIkxpc3RXcmFwcGVyLnNsaWNlIiwiTGlzdFdyYXBwZXIuc3BsaWNlIiwiTGlzdFdyYXBwZXIuc29ydCIsIkxpc3RXcmFwcGVyLnRvU3RyaW5nIiwiTGlzdFdyYXBwZXIudG9KU09OIiwiTGlzdFdyYXBwZXIubWF4aW11bSIsImlzTGlzdExpa2VJdGVyYWJsZSIsIml0ZXJhdGVMaXN0TGlrZSIsImNyZWF0ZVNldEZyb21MaXN0IiwiY3JlYXRlU2V0QW5kUG9wdWxhdGVGcm9tTGlzdCIsIlNldFdyYXBwZXIiLCJTZXRXcmFwcGVyLmNvbnN0cnVjdG9yIiwiU2V0V3JhcHBlci5jcmVhdGVGcm9tTGlzdCIsIlNldFdyYXBwZXIuaGFzIiwiU2V0V3JhcHBlci5kZWxldGUiLCJEZXBlbmRlbmN5IiwiRGVwZW5kZW5jeS5jb25zdHJ1Y3RvciIsIkRlcGVuZGVuY3kuZnJvbUtleSIsIlByb3ZpZGVyIiwiUHJvdmlkZXIuY29uc3RydWN0b3IiLCJQcm92aWRlci5tdWx0aSIsIkJpbmRpbmciLCJCaW5kaW5nLmNvbnN0cnVjdG9yIiwiQmluZGluZy50b0NsYXNzIiwiQmluZGluZy50b0FsaWFzIiwiQmluZGluZy50b0ZhY3RvcnkiLCJCaW5kaW5nLnRvVmFsdWUiLCJSZXNvbHZlZFByb3ZpZGVyXyIsIlJlc29sdmVkUHJvdmlkZXJfLmNvbnN0cnVjdG9yIiwiUmVzb2x2ZWRQcm92aWRlcl8ucmVzb2x2ZWRGYWN0b3J5IiwiUmVzb2x2ZWRGYWN0b3J5IiwiUmVzb2x2ZWRGYWN0b3J5LmNvbnN0cnVjdG9yIiwiYmluZCIsInByb3ZpZGUiLCJQcm92aWRlckJ1aWxkZXIiLCJQcm92aWRlckJ1aWxkZXIuY29uc3RydWN0b3IiLCJQcm92aWRlckJ1aWxkZXIudG9DbGFzcyIsIlByb3ZpZGVyQnVpbGRlci50b1ZhbHVlIiwiUHJvdmlkZXJCdWlsZGVyLnRvQWxpYXMiLCJQcm92aWRlckJ1aWxkZXIudG9GYWN0b3J5IiwicmVzb2x2ZUZhY3RvcnkiLCJyZXNvbHZlUHJvdmlkZXIiLCJyZXNvbHZlUHJvdmlkZXJzIiwiX05vcm1hbGl6ZWRQcm92aWRlciIsIl9Ob3JtYWxpemVkUHJvdmlkZXIuY29uc3RydWN0b3IiLCJfY3JlYXRlTGlzdE9mUHJvdmlkZXJzIiwiX25vcm1hbGl6ZVByb3ZpZGVycyIsIl9ub3JtYWxpemVQcm92aWRlciIsIl9jb25zdHJ1Y3REZXBlbmRlbmNpZXMiLCJfZGVwZW5kZW5jaWVzRm9yIiwiX2V4dHJhY3RUb2tlbiIsIl9jcmVhdGVEZXBlbmRlbmN5IiwiQmFzZUV4Y2VwdGlvbiIsIkJhc2VFeGNlcHRpb24uY29uc3RydWN0b3IiLCJCYXNlRXhjZXB0aW9uLnRvU3RyaW5nIiwiV3JhcHBlZEV4Y2VwdGlvbiIsIldyYXBwZWRFeGNlcHRpb24uY29uc3RydWN0b3IiLCJXcmFwcGVkRXhjZXB0aW9uLndyYXBwZXJNZXNzYWdlIiwiV3JhcHBlZEV4Y2VwdGlvbi53cmFwcGVyU3RhY2siLCJXcmFwcGVkRXhjZXB0aW9uLm9yaWdpbmFsRXhjZXB0aW9uIiwiV3JhcHBlZEV4Y2VwdGlvbi5vcmlnaW5hbFN0YWNrIiwiV3JhcHBlZEV4Y2VwdGlvbi5jb250ZXh0IiwiV3JhcHBlZEV4Y2VwdGlvbi5tZXNzYWdlIiwiV3JhcHBlZEV4Y2VwdGlvbi50b1N0cmluZyIsIm1ha2VUeXBlRXJyb3IiLCJ1bmltcGxlbWVudGVkIiwiX0FycmF5TG9nZ2VyIiwiX0FycmF5TG9nZ2VyLmNvbnN0cnVjdG9yIiwiX0FycmF5TG9nZ2VyLmxvZyIsIl9BcnJheUxvZ2dlci5sb2dFcnJvciIsIl9BcnJheUxvZ2dlci5sb2dHcm91cCIsIl9BcnJheUxvZ2dlci5sb2dHcm91cEVuZCIsIkV4Y2VwdGlvbkhhbmRsZXIiLCJFeGNlcHRpb25IYW5kbGVyLmNvbnN0cnVjdG9yIiwiRXhjZXB0aW9uSGFuZGxlci5leGNlcHRpb25Ub1N0cmluZyIsIkV4Y2VwdGlvbkhhbmRsZXIuY2FsbCIsIkV4Y2VwdGlvbkhhbmRsZXIuX2V4dHJhY3RNZXNzYWdlIiwiRXhjZXB0aW9uSGFuZGxlci5fbG9uZ1N0YWNrVHJhY2UiLCJFeGNlcHRpb25IYW5kbGVyLl9maW5kQ29udGV4dCIsIkV4Y2VwdGlvbkhhbmRsZXIuX2ZpbmRPcmlnaW5hbEV4Y2VwdGlvbiIsIkV4Y2VwdGlvbkhhbmRsZXIuX2ZpbmRPcmlnaW5hbFN0YWNrIiwiUmVmbGVjdGlvbkluZm8iLCJSZWZsZWN0aW9uSW5mby5jb25zdHJ1Y3RvciIsIlJlZmxlY3RvciIsIlJlZmxlY3Rvci5jb25zdHJ1Y3RvciIsIlJlZmxlY3Rvci5pc1JlZmxlY3Rpb25FbmFibGVkIiwiUmVmbGVjdG9yLnRyYWNrVXNhZ2UiLCJSZWZsZWN0b3IubGlzdFVudXNlZEtleXMiLCJSZWZsZWN0b3IucmVnaXN0ZXJGdW5jdGlvbiIsIlJlZmxlY3Rvci5yZWdpc3RlclR5cGUiLCJSZWZsZWN0b3IucmVnaXN0ZXJHZXR0ZXJzIiwiUmVmbGVjdG9yLnJlZ2lzdGVyU2V0dGVycyIsIlJlZmxlY3Rvci5yZWdpc3Rlck1ldGhvZHMiLCJSZWZsZWN0b3IuZmFjdG9yeSIsIlJlZmxlY3Rvci5wYXJhbWV0ZXJzIiwiUmVmbGVjdG9yLmFubm90YXRpb25zIiwiUmVmbGVjdG9yLnByb3BNZXRhZGF0YSIsIlJlZmxlY3Rvci5pbnRlcmZhY2VzIiwiUmVmbGVjdG9yLmdldHRlciIsIlJlZmxlY3Rvci5zZXR0ZXIiLCJSZWZsZWN0b3IubWV0aG9kIiwiUmVmbGVjdG9yLl9nZXRSZWZsZWN0aW9uSW5mbyIsIlJlZmxlY3Rvci5fY29udGFpbnNSZWZsZWN0aW9uSW5mbyIsIlJlZmxlY3Rvci5pbXBvcnRVcmkiLCJfbWVyZ2VNYXBzIiwiUmVmbGVjdGlvbkNhcGFiaWxpdGllcyIsIlJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuY29uc3RydWN0b3IiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmlzUmVmbGVjdGlvbkVuYWJsZWQiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmZhY3RvcnkiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLl96aXBUeXBlc0FuZEFubm90YWlvbnMiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnBhcmFtZXRlcnMiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmFubm90YXRpb25zIiwiUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wcm9wTWV0YWRhdGEiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmludGVyZmFjZXMiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmdldHRlciIsIlJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuc2V0dGVyIiwiUmVmbGVjdGlvbkNhcGFiaWxpdGllcy5tZXRob2QiLCJSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmltcG9ydFVyaSIsIktleSIsIktleS5jb25zdHJ1Y3RvciIsIktleS5kaXNwbGF5TmFtZSIsIktleS5nZXQiLCJLZXkubnVtYmVyT2ZLZXlzIiwiS2V5UmVnaXN0cnkiLCJLZXlSZWdpc3RyeS5jb25zdHJ1Y3RvciIsIktleVJlZ2lzdHJ5LmdldCIsIktleVJlZ2lzdHJ5Lm51bWJlck9mS2V5cyIsIlR5cGVMaXRlcmFsIiwiVHlwZUxpdGVyYWwuY29uc3RydWN0b3IiLCJUeXBlTGl0ZXJhbC50eXBlIiwiZmluZEZpcnN0Q2xvc2VkQ3ljbGUiLCJjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoIiwiQWJzdHJhY3RQcm92aWRlckVycm9yIiwiQWJzdHJhY3RQcm92aWRlckVycm9yLmNvbnN0cnVjdG9yIiwiQWJzdHJhY3RQcm92aWRlckVycm9yLmFkZEtleSIsIkFic3RyYWN0UHJvdmlkZXJFcnJvci5jb250ZXh0IiwiTm9Qcm92aWRlckVycm9yIiwiTm9Qcm92aWRlckVycm9yLmNvbnN0cnVjdG9yIiwiQ3ljbGljRGVwZW5kZW5jeUVycm9yIiwiQ3ljbGljRGVwZW5kZW5jeUVycm9yLmNvbnN0cnVjdG9yIiwiSW5zdGFudGlhdGlvbkVycm9yIiwiSW5zdGFudGlhdGlvbkVycm9yLmNvbnN0cnVjdG9yIiwiSW5zdGFudGlhdGlvbkVycm9yLmFkZEtleSIsIkluc3RhbnRpYXRpb25FcnJvci53cmFwcGVyTWVzc2FnZSIsIkluc3RhbnRpYXRpb25FcnJvci5jYXVzZUtleSIsIkluc3RhbnRpYXRpb25FcnJvci5jb250ZXh0IiwiSW52YWxpZFByb3ZpZGVyRXJyb3IiLCJJbnZhbGlkUHJvdmlkZXJFcnJvci5jb25zdHJ1Y3RvciIsIk5vQW5ub3RhdGlvbkVycm9yIiwiTm9Bbm5vdGF0aW9uRXJyb3IuY29uc3RydWN0b3IiLCJOb0Fubm90YXRpb25FcnJvci5fZ2VuTWVzc2FnZSIsIk91dE9mQm91bmRzRXJyb3IiLCJPdXRPZkJvdW5kc0Vycm9yLmNvbnN0cnVjdG9yIiwiTWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yIiwiTWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yLmNvbnN0cnVjdG9yIiwiT3BhcXVlVG9rZW4iLCJPcGFxdWVUb2tlbi5jb25zdHJ1Y3RvciIsIk9wYXF1ZVRva2VuLnRvU3RyaW5nIiwiRGlyZWN0aXZlTWV0YWRhdGEiLCJEaXJlY3RpdmVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZU1ldGFkYXRhLmlucHV0cyIsIkRpcmVjdGl2ZU1ldGFkYXRhLnByb3BlcnRpZXMiLCJEaXJlY3RpdmVNZXRhZGF0YS5vdXRwdXRzIiwiRGlyZWN0aXZlTWV0YWRhdGEuZXZlbnRzIiwiRGlyZWN0aXZlTWV0YWRhdGEucHJvdmlkZXJzIiwiRGlyZWN0aXZlTWV0YWRhdGEuYmluZGluZ3MiLCJDb21wb25lbnRNZXRhZGF0YSIsIkNvbXBvbmVudE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiQ29tcG9uZW50TWV0YWRhdGEudmlld1Byb3ZpZGVycyIsIkNvbXBvbmVudE1ldGFkYXRhLnZpZXdCaW5kaW5ncyIsIlBpcGVNZXRhZGF0YSIsIlBpcGVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIlBpcGVNZXRhZGF0YS5wdXJlIiwiSW5wdXRNZXRhZGF0YSIsIklucHV0TWV0YWRhdGEuY29uc3RydWN0b3IiLCJPdXRwdXRNZXRhZGF0YSIsIk91dHB1dE1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiSG9zdEJpbmRpbmdNZXRhZGF0YSIsIkhvc3RCaW5kaW5nTWV0YWRhdGEuY29uc3RydWN0b3IiLCJIb3N0TGlzdGVuZXJNZXRhZGF0YSIsIkhvc3RMaXN0ZW5lck1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiSXRlcmFibGVEaWZmZXJzIiwiSXRlcmFibGVEaWZmZXJzLmNvbnN0cnVjdG9yIiwiSXRlcmFibGVEaWZmZXJzLmNyZWF0ZSIsIkl0ZXJhYmxlRGlmZmVycy5leHRlbmQiLCJJdGVyYWJsZURpZmZlcnMuZmluZCIsIkRlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkiLCJEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5LmNvbnN0cnVjdG9yIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyRmFjdG9yeS5zdXBwb3J0cyIsIkRlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkuY3JlYXRlIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmNvbnN0cnVjdG9yIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmNvbGxlY3Rpb24iLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIubGVuZ3RoIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmZvckVhY2hJdGVtIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmZvckVhY2hQcmV2aW91c0l0ZW0iLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIuZm9yRWFjaEFkZGVkSXRlbSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5mb3JFYWNoTW92ZWRJdGVtIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLmZvckVhY2hSZW1vdmVkSXRlbSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5kaWZmIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLm9uRGVzdHJveSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5jaGVjayIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5pc0RpcnR5IiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9yZXNldCIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fbWlzbWF0Y2giLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIuX3ZlcmlmeVJlaW5zZXJ0aW9uIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl90cnVuY2F0ZSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fcmVpbnNlcnRBZnRlciIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fbW92ZUFmdGVyIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9hZGRBZnRlciIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5faW5zZXJ0QWZ0ZXIiLCJEZWZhdWx0SXRlcmFibGVEaWZmZXIuX3JlbW92ZSIsIkRlZmF1bHRJdGVyYWJsZURpZmZlci5fdW5saW5rIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9hZGRUb01vdmVzIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLl9hZGRUb1JlbW92YWxzIiwiRGVmYXVsdEl0ZXJhYmxlRGlmZmVyLnRvU3RyaW5nIiwiQ29sbGVjdGlvbkNoYW5nZVJlY29yZCIsIkNvbGxlY3Rpb25DaGFuZ2VSZWNvcmQuY29uc3RydWN0b3IiLCJDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLnRvU3RyaW5nIiwiX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0IiwiX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0LmNvbnN0cnVjdG9yIiwiX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0LmFkZCIsIl9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdC5nZXQiLCJfRHVwbGljYXRlSXRlbVJlY29yZExpc3QucmVtb3ZlIiwiX0R1cGxpY2F0ZU1hcCIsIl9EdXBsaWNhdGVNYXAuY29uc3RydWN0b3IiLCJfRHVwbGljYXRlTWFwLnB1dCIsIl9EdXBsaWNhdGVNYXAuZ2V0IiwiX0R1cGxpY2F0ZU1hcC5yZW1vdmUiLCJfRHVwbGljYXRlTWFwLmlzRW1wdHkiLCJfRHVwbGljYXRlTWFwLmNsZWFyIiwiX0R1cGxpY2F0ZU1hcC50b1N0cmluZyIsIktleVZhbHVlRGlmZmVycyIsIktleVZhbHVlRGlmZmVycy5jb25zdHJ1Y3RvciIsIktleVZhbHVlRGlmZmVycy5jcmVhdGUiLCJLZXlWYWx1ZURpZmZlcnMuZXh0ZW5kIiwiS2V5VmFsdWVEaWZmZXJzLmZpbmQiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5IiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyRmFjdG9yeS5jb25zdHJ1Y3RvciIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3Rvcnkuc3VwcG9ydHMiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5LmNyZWF0ZSIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlciIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5jb25zdHJ1Y3RvciIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5pc0RpcnR5IiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmZvckVhY2hJdGVtIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmZvckVhY2hQcmV2aW91c0l0ZW0iLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIuZm9yRWFjaENoYW5nZWRJdGVtIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmZvckVhY2hBZGRlZEl0ZW0iLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIuZm9yRWFjaFJlbW92ZWRJdGVtIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmRpZmYiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIub25EZXN0cm95IiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLmNoZWNrIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLl9yZXNldCIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fdHJ1bmNhdGUiLCJEZWZhdWx0S2V5VmFsdWVEaWZmZXIuX2lzSW5SZW1vdmFscyIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fYWRkVG9SZW1vdmFscyIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fcmVtb3ZlRnJvbVNlcSIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fcmVtb3ZlRnJvbVJlbW92YWxzIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLl9hZGRUb0FkZGl0aW9ucyIsIkRlZmF1bHRLZXlWYWx1ZURpZmZlci5fYWRkVG9DaGFuZ2VzIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLnRvU3RyaW5nIiwiRGVmYXVsdEtleVZhbHVlRGlmZmVyLl9mb3JFYWNoIiwiS1ZDaGFuZ2VSZWNvcmQiLCJLVkNoYW5nZVJlY29yZC5jb25zdHJ1Y3RvciIsIktWQ2hhbmdlUmVjb3JkLnRvU3RyaW5nIiwiQVNUIiwiQVNULmNvbnN0cnVjdG9yIiwiQVNULnZpc2l0IiwiQVNULnRvU3RyaW5nIiwiUXVvdGUiLCJRdW90ZS5jb25zdHJ1Y3RvciIsIlF1b3RlLnZpc2l0IiwiUXVvdGUudG9TdHJpbmciLCJFbXB0eUV4cHIiLCJFbXB0eUV4cHIuY29uc3RydWN0b3IiLCJFbXB0eUV4cHIudmlzaXQiLCJJbXBsaWNpdFJlY2VpdmVyIiwiSW1wbGljaXRSZWNlaXZlci5jb25zdHJ1Y3RvciIsIkltcGxpY2l0UmVjZWl2ZXIudmlzaXQiLCJDaGFpbiIsIkNoYWluLmNvbnN0cnVjdG9yIiwiQ2hhaW4udmlzaXQiLCJDb25kaXRpb25hbCIsIkNvbmRpdGlvbmFsLmNvbnN0cnVjdG9yIiwiQ29uZGl0aW9uYWwudmlzaXQiLCJQcm9wZXJ0eVJlYWQiLCJQcm9wZXJ0eVJlYWQuY29uc3RydWN0b3IiLCJQcm9wZXJ0eVJlYWQudmlzaXQiLCJQcm9wZXJ0eVdyaXRlIiwiUHJvcGVydHlXcml0ZS5jb25zdHJ1Y3RvciIsIlByb3BlcnR5V3JpdGUudmlzaXQiLCJTYWZlUHJvcGVydHlSZWFkIiwiU2FmZVByb3BlcnR5UmVhZC5jb25zdHJ1Y3RvciIsIlNhZmVQcm9wZXJ0eVJlYWQudmlzaXQiLCJLZXllZFJlYWQiLCJLZXllZFJlYWQuY29uc3RydWN0b3IiLCJLZXllZFJlYWQudmlzaXQiLCJLZXllZFdyaXRlIiwiS2V5ZWRXcml0ZS5jb25zdHJ1Y3RvciIsIktleWVkV3JpdGUudmlzaXQiLCJCaW5kaW5nUGlwZSIsIkJpbmRpbmdQaXBlLmNvbnN0cnVjdG9yIiwiQmluZGluZ1BpcGUudmlzaXQiLCJMaXRlcmFsUHJpbWl0aXZlIiwiTGl0ZXJhbFByaW1pdGl2ZS5jb25zdHJ1Y3RvciIsIkxpdGVyYWxQcmltaXRpdmUudmlzaXQiLCJMaXRlcmFsQXJyYXkiLCJMaXRlcmFsQXJyYXkuY29uc3RydWN0b3IiLCJMaXRlcmFsQXJyYXkudmlzaXQiLCJMaXRlcmFsTWFwIiwiTGl0ZXJhbE1hcC5jb25zdHJ1Y3RvciIsIkxpdGVyYWxNYXAudmlzaXQiLCJJbnRlcnBvbGF0aW9uIiwiSW50ZXJwb2xhdGlvbi5jb25zdHJ1Y3RvciIsIkludGVycG9sYXRpb24udmlzaXQiLCJCaW5hcnkiLCJCaW5hcnkuY29uc3RydWN0b3IiLCJCaW5hcnkudmlzaXQiLCJQcmVmaXhOb3QiLCJQcmVmaXhOb3QuY29uc3RydWN0b3IiLCJQcmVmaXhOb3QudmlzaXQiLCJNZXRob2RDYWxsIiwiTWV0aG9kQ2FsbC5jb25zdHJ1Y3RvciIsIk1ldGhvZENhbGwudmlzaXQiLCJTYWZlTWV0aG9kQ2FsbCIsIlNhZmVNZXRob2RDYWxsLmNvbnN0cnVjdG9yIiwiU2FmZU1ldGhvZENhbGwudmlzaXQiLCJGdW5jdGlvbkNhbGwiLCJGdW5jdGlvbkNhbGwuY29uc3RydWN0b3IiLCJGdW5jdGlvbkNhbGwudmlzaXQiLCJBU1RXaXRoU291cmNlIiwiQVNUV2l0aFNvdXJjZS5jb25zdHJ1Y3RvciIsIkFTVFdpdGhTb3VyY2UudmlzaXQiLCJBU1RXaXRoU291cmNlLnRvU3RyaW5nIiwiVGVtcGxhdGVCaW5kaW5nIiwiVGVtcGxhdGVCaW5kaW5nLmNvbnN0cnVjdG9yIiwiUmVjdXJzaXZlQXN0VmlzaXRvciIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IuY29uc3RydWN0b3IiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0QmluYXJ5IiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdENoYWluIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdENvbmRpdGlvbmFsIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFBpcGUiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0RnVuY3Rpb25DYWxsIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdEltcGxpY2l0UmVjZWl2ZXIiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0SW50ZXJwb2xhdGlvbiIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRLZXllZFJlYWQiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0S2V5ZWRXcml0ZSIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRMaXRlcmFsQXJyYXkiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0TGl0ZXJhbE1hcCIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRMaXRlcmFsUHJpbWl0aXZlIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdE1ldGhvZENhbGwiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0UHJlZml4Tm90IiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFByb3BlcnR5UmVhZCIsIlJlY3Vyc2l2ZUFzdFZpc2l0b3IudmlzaXRQcm9wZXJ0eVdyaXRlIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFNhZmVQcm9wZXJ0eVJlYWQiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0U2FmZU1ldGhvZENhbGwiLCJSZWN1cnNpdmVBc3RWaXNpdG9yLnZpc2l0QWxsIiwiUmVjdXJzaXZlQXN0VmlzaXRvci52aXNpdFF1b3RlIiwiQXN0VHJhbnNmb3JtZXIiLCJBc3RUcmFuc2Zvcm1lci5jb25zdHJ1Y3RvciIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0SW1wbGljaXRSZWNlaXZlciIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0SW50ZXJwb2xhdGlvbiIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0TGl0ZXJhbFByaW1pdGl2ZSIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0UHJvcGVydHlSZWFkIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRQcm9wZXJ0eVdyaXRlIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRTYWZlUHJvcGVydHlSZWFkIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRNZXRob2RDYWxsIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRTYWZlTWV0aG9kQ2FsbCIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0RnVuY3Rpb25DYWxsIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRMaXRlcmFsQXJyYXkiLCJBc3RUcmFuc2Zvcm1lci52aXNpdExpdGVyYWxNYXAiLCJBc3RUcmFuc2Zvcm1lci52aXNpdEJpbmFyeSIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0UHJlZml4Tm90IiwiQXN0VHJhbnNmb3JtZXIudmlzaXRDb25kaXRpb25hbCIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0UGlwZSIsIkFzdFRyYW5zZm9ybWVyLnZpc2l0S2V5ZWRSZWFkIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRLZXllZFdyaXRlIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRBbGwiLCJBc3RUcmFuc2Zvcm1lci52aXNpdENoYWluIiwiQXN0VHJhbnNmb3JtZXIudmlzaXRRdW90ZSIsIlRva2VuVHlwZSIsIkxleGVyIiwiTGV4ZXIuY29uc3RydWN0b3IiLCJMZXhlci50b2tlbml6ZSIsIlRva2VuIiwiVG9rZW4uY29uc3RydWN0b3IiLCJUb2tlbi5pc0NoYXJhY3RlciIsIlRva2VuLmlzTnVtYmVyIiwiVG9rZW4uaXNTdHJpbmciLCJUb2tlbi5pc09wZXJhdG9yIiwiVG9rZW4uaXNJZGVudGlmaWVyIiwiVG9rZW4uaXNLZXl3b3JkIiwiVG9rZW4uaXNLZXl3b3JkVmFyIiwiVG9rZW4uaXNLZXl3b3JkTnVsbCIsIlRva2VuLmlzS2V5d29yZFVuZGVmaW5lZCIsIlRva2VuLmlzS2V5d29yZFRydWUiLCJUb2tlbi5pc0tleXdvcmRGYWxzZSIsIlRva2VuLnRvTnVtYmVyIiwiVG9rZW4udG9TdHJpbmciLCJuZXdDaGFyYWN0ZXJUb2tlbiIsIm5ld0lkZW50aWZpZXJUb2tlbiIsIm5ld0tleXdvcmRUb2tlbiIsIm5ld09wZXJhdG9yVG9rZW4iLCJuZXdTdHJpbmdUb2tlbiIsIm5ld051bWJlclRva2VuIiwiU2Nhbm5lckVycm9yIiwiU2Nhbm5lckVycm9yLmNvbnN0cnVjdG9yIiwiU2Nhbm5lckVycm9yLnRvU3RyaW5nIiwiX1NjYW5uZXIiLCJfU2Nhbm5lci5jb25zdHJ1Y3RvciIsIl9TY2FubmVyLmFkdmFuY2UiLCJfU2Nhbm5lci5zY2FuVG9rZW4iLCJfU2Nhbm5lci5zY2FuQ2hhcmFjdGVyIiwiX1NjYW5uZXIuc2Nhbk9wZXJhdG9yIiwiX1NjYW5uZXIuc2NhbkNvbXBsZXhPcGVyYXRvciIsIl9TY2FubmVyLnNjYW5JZGVudGlmaWVyIiwiX1NjYW5uZXIuc2Nhbk51bWJlciIsIl9TY2FubmVyLnNjYW5TdHJpbmciLCJfU2Nhbm5lci5lcnJvciIsImlzV2hpdGVzcGFjZSIsImlzSWRlbnRpZmllclN0YXJ0IiwiaXNJZGVudGlmaWVyIiwiaXNJZGVudGlmaWVyUGFydCIsImlzRGlnaXQiLCJpc0V4cG9uZW50U3RhcnQiLCJpc0V4cG9uZW50U2lnbiIsInVuZXNjYXBlIiwiUGFyc2VFeGNlcHRpb24iLCJQYXJzZUV4Y2VwdGlvbi5jb25zdHJ1Y3RvciIsIlBhcnNlciIsIlBhcnNlci5jb25zdHJ1Y3RvciIsIlBhcnNlci5wYXJzZUFjdGlvbiIsIlBhcnNlci5wYXJzZUJpbmRpbmciLCJQYXJzZXIucGFyc2VTaW1wbGVCaW5kaW5nIiwiUGFyc2VyLl9wYXJzZUJpbmRpbmdBc3QiLCJQYXJzZXIuX3BhcnNlUXVvdGUiLCJQYXJzZXIucGFyc2VUZW1wbGF0ZUJpbmRpbmdzIiwiUGFyc2VyLnBhcnNlSW50ZXJwb2xhdGlvbiIsIlBhcnNlci53cmFwTGl0ZXJhbFByaW1pdGl2ZSIsIlBhcnNlci5fY2hlY2tOb0ludGVycG9sYXRpb24iLCJQYXJzZXIuX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4iLCJfUGFyc2VBU1QiLCJfUGFyc2VBU1QuY29uc3RydWN0b3IiLCJfUGFyc2VBU1QucGVlayIsIl9QYXJzZUFTVC5uZXh0IiwiX1BhcnNlQVNULmlucHV0SW5kZXgiLCJfUGFyc2VBU1QuYWR2YW5jZSIsIl9QYXJzZUFTVC5vcHRpb25hbENoYXJhY3RlciIsIl9QYXJzZUFTVC5vcHRpb25hbEtleXdvcmRWYXIiLCJfUGFyc2VBU1QucGVla0tleXdvcmRWYXIiLCJfUGFyc2VBU1QuZXhwZWN0Q2hhcmFjdGVyIiwiX1BhcnNlQVNULm9wdGlvbmFsT3BlcmF0b3IiLCJfUGFyc2VBU1QuZXhwZWN0T3BlcmF0b3IiLCJfUGFyc2VBU1QuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZCIsIl9QYXJzZUFTVC5leHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkT3JTdHJpbmciLCJfUGFyc2VBU1QucGFyc2VDaGFpbiIsIl9QYXJzZUFTVC5wYXJzZVBpcGUiLCJfUGFyc2VBU1QucGFyc2VFeHByZXNzaW9uIiwiX1BhcnNlQVNULnBhcnNlQ29uZGl0aW9uYWwiLCJfUGFyc2VBU1QucGFyc2VMb2dpY2FsT3IiLCJfUGFyc2VBU1QucGFyc2VMb2dpY2FsQW5kIiwiX1BhcnNlQVNULnBhcnNlRXF1YWxpdHkiLCJfUGFyc2VBU1QucGFyc2VSZWxhdGlvbmFsIiwiX1BhcnNlQVNULnBhcnNlQWRkaXRpdmUiLCJfUGFyc2VBU1QucGFyc2VNdWx0aXBsaWNhdGl2ZSIsIl9QYXJzZUFTVC5wYXJzZVByZWZpeCIsIl9QYXJzZUFTVC5wYXJzZUNhbGxDaGFpbiIsIl9QYXJzZUFTVC5wYXJzZVByaW1hcnkiLCJfUGFyc2VBU1QucGFyc2VFeHByZXNzaW9uTGlzdCIsIl9QYXJzZUFTVC5wYXJzZUxpdGVyYWxNYXAiLCJfUGFyc2VBU1QucGFyc2VBY2Nlc3NNZW1iZXJPck1ldGhvZENhbGwiLCJfUGFyc2VBU1QucGFyc2VDYWxsQXJndW1lbnRzIiwiX1BhcnNlQVNULnBhcnNlQmxvY2tDb250ZW50IiwiX1BhcnNlQVNULmV4cGVjdFRlbXBsYXRlQmluZGluZ0tleSIsIl9QYXJzZUFTVC5wYXJzZVRlbXBsYXRlQmluZGluZ3MiLCJfUGFyc2VBU1QuZXJyb3IiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlciIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLmNvbnN0cnVjdG9yIiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIuY2hlY2siLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEltcGxpY2l0UmVjZWl2ZXIiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEludGVycG9sYXRpb24iLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdExpdGVyYWxQcmltaXRpdmUiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdFByb3BlcnR5UmVhZCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0UHJvcGVydHlXcml0ZSIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0U2FmZVByb3BlcnR5UmVhZCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0TWV0aG9kQ2FsbCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0U2FmZU1ldGhvZENhbGwiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEZ1bmN0aW9uQ2FsbCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0TGl0ZXJhbEFycmF5IiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIudmlzaXRMaXRlcmFsTWFwIiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIudmlzaXRCaW5hcnkiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdFByZWZpeE5vdCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0Q29uZGl0aW9uYWwiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdFBpcGUiLCJTaW1wbGVFeHByZXNzaW9uQ2hlY2tlci52aXNpdEtleWVkUmVhZCIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0S2V5ZWRXcml0ZSIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0QWxsIiwiU2ltcGxlRXhwcmVzc2lvbkNoZWNrZXIudmlzaXRDaGFpbiIsIlNpbXBsZUV4cHJlc3Npb25DaGVja2VyLnZpc2l0UXVvdGUiLCJMb2NhbHMiLCJMb2NhbHMuY29uc3RydWN0b3IiLCJMb2NhbHMuY29udGFpbnMiLCJMb2NhbHMuZ2V0IiwiTG9jYWxzLnNldCIsIkxvY2Fscy5jbGVhclZhbHVlcyIsIkV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXhjZXB0aW9uIiwiRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFeGNlcHRpb24uY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3Rpb25FcnJvciIsIkNoYW5nZURldGVjdGlvbkVycm9yLmNvbnN0cnVjdG9yIiwiRGVoeWRyYXRlZEV4Y2VwdGlvbiIsIkRlaHlkcmF0ZWRFeGNlcHRpb24uY29uc3RydWN0b3IiLCJEZWJ1Z0NvbnRleHQiLCJEZWJ1Z0NvbnRleHQuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZyIsIkNoYW5nZURldGVjdG9yR2VuQ29uZmlnLmNvbnN0cnVjdG9yIiwiQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uIiwiQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uLmNvbnN0cnVjdG9yIiwiQ2hhbmdlRGV0ZWN0b3JTdGF0ZSIsIkNoYW5nZURldGVjdGlvblN0cmF0ZWd5IiwiaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kiLCJEeW5hbWljUHJvdG9DaGFuZ2VEZXRlY3RvciIsIkR5bmFtaWNQcm90b0NoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiRHluYW1pY1Byb3RvQ2hhbmdlRGV0ZWN0b3IuaW5zdGFudGlhdGUiLCJjcmVhdGVQcm9wZXJ0eVJlY29yZHMiLCJjcmVhdGVFdmVudFJlY29yZHMiLCJQcm90b1JlY29yZEJ1aWxkZXIiLCJQcm90b1JlY29yZEJ1aWxkZXIuY29uc3RydWN0b3IiLCJQcm90b1JlY29yZEJ1aWxkZXIuYWRkIiwiUHJvdG9SZWNvcmRCdWlsZGVyLl9zZXRBcmd1bWVudFRvUHVyZUZ1bmN0aW9uIiwiUHJvdG9SZWNvcmRCdWlsZGVyLl9hcHBlbmRSZWNvcmRzIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLmNvbnN0cnVjdG9yIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLmFwcGVuZCIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy5jcmVhdGUiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRJbXBsaWNpdFJlY2VpdmVyIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0SW50ZXJwb2xhdGlvbiIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy52aXNpdExpdGVyYWxQcmltaXRpdmUiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRQcm9wZXJ0eVJlYWQiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRQcm9wZXJ0eVdyaXRlIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0S2V5ZWRXcml0ZSIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy52aXNpdFNhZmVQcm9wZXJ0eVJlYWQiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRNZXRob2RDYWxsIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0U2FmZU1ldGhvZENhbGwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRGdW5jdGlvbkNhbGwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRMaXRlcmFsQXJyYXkiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRMaXRlcmFsTWFwIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0QmluYXJ5IiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0UHJlZml4Tm90IiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0Q29uZGl0aW9uYWwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRQaXBlIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0S2V5ZWRSZWFkIiwiX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLnZpc2l0Q2hhaW4iLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMudmlzaXRRdW90ZSIsIl9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy5fdmlzaXRBbGwiLCJfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMuX2FkZFJlY29yZCIsIl9hcnJheUZuIiwiX21hcFByaW1pdGl2ZU5hbWUiLCJfb3BlcmF0aW9uVG9QcmltaXRpdmVOYW1lIiwiX29wZXJhdGlvblRvRnVuY3Rpb24iLCJzIiwiX2ludGVycG9sYXRpb25GbiIsIldyYXBwZWRWYWx1ZSIsIldyYXBwZWRWYWx1ZS5jb25zdHJ1Y3RvciIsIldyYXBwZWRWYWx1ZS53cmFwIiwiU2ltcGxlQ2hhbmdlIiwiU2ltcGxlQ2hhbmdlLmNvbnN0cnVjdG9yIiwiU2ltcGxlQ2hhbmdlLmlzRmlyc3RDaGFuZ2UiLCJfc2ltcGxlQ2hhbmdlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbCIsIkNoYW5nZURldGVjdGlvblV0aWwuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm4wIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuMSIsIkNoYW5nZURldGVjdGlvblV0aWwuYXJyYXlGbjIiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm4zIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNCIsIkNoYW5nZURldGVjdGlvblV0aWwuYXJyYXlGbjUiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm42IiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNyIsIkNoYW5nZURldGVjdGlvblV0aWwuYXJyYXlGbjgiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmFycmF5Rm45IiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fbmVnYXRlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fYWRkIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fc3VidHJhY3QiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9tdWx0aXBseSIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2RpdmlkZSIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX3JlbWFpbmRlciIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2VxdWFscyIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX25vdF9lcXVhbHMiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9pZGVudGljYWwiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9ub3RfaWRlbnRpY2FsIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fbGVzc190aGVuIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fZ3JlYXRlcl90aGVuIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fbGVzc19vcl9lcXVhbHNfdGhlbiIsIkNoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2dyZWF0ZXJfb3JfZXF1YWxzX3RoZW4iLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmNvbmQiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLm1hcEZuIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5tYXBGbi5idWlsZE1hcCIsIkNoYW5nZURldGVjdGlvblV0aWwua2V5ZWRBY2Nlc3MiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLnVud3JhcFZhbHVlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5jaGFuZ2VEZXRlY3Rpb25Nb2RlIiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5zaW1wbGVDaGFuZ2UiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmlzVmFsdWVCbGFuayIsIkNoYW5nZURldGVjdGlvblV0aWwucyIsIkNoYW5nZURldGVjdGlvblV0aWwucHJvdG9CeUluZGV4IiwiQ2hhbmdlRGV0ZWN0aW9uVXRpbC5jYWxsUGlwZU9uRGVzdHJveSIsIkNoYW5nZURldGVjdGlvblV0aWwuYmluZGluZ1RhcmdldCIsIkNoYW5nZURldGVjdGlvblV0aWwuZGlyZWN0aXZlSW5kZXgiLCJDaGFuZ2VEZXRlY3Rpb25VdGlsLmxvb3NlTm90SWRlbnRpY2FsIiwiaW1wbGVtZW50c09uRGVzdHJveSIsIkJpbmRpbmdUYXJnZXQiLCJCaW5kaW5nVGFyZ2V0LmNvbnN0cnVjdG9yIiwiQmluZGluZ1RhcmdldC5pc0RpcmVjdGl2ZSIsIkJpbmRpbmdUYXJnZXQuaXNFbGVtZW50UHJvcGVydHkiLCJCaW5kaW5nVGFyZ2V0LmlzRWxlbWVudEF0dHJpYnV0ZSIsIkJpbmRpbmdUYXJnZXQuaXNFbGVtZW50Q2xhc3MiLCJCaW5kaW5nVGFyZ2V0LmlzRWxlbWVudFN0eWxlIiwiQmluZGluZ1RhcmdldC5pc1RleHROb2RlIiwiQmluZGluZ1JlY29yZCIsIkJpbmRpbmdSZWNvcmQuY29uc3RydWN0b3IiLCJCaW5kaW5nUmVjb3JkLmlzRGlyZWN0aXZlTGlmZWN5Y2xlIiwiQmluZGluZ1JlY29yZC5jYWxsT25DaGFuZ2VzIiwiQmluZGluZ1JlY29yZC5pc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb24iLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZURpcmVjdGl2ZURvQ2hlY2siLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZURpcmVjdGl2ZU9uSW5pdCIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRGlyZWN0aXZlT25DaGFuZ2VzIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JEaXJlY3RpdmUiLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckVsZW1lbnRQcm9wZXJ0eSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9yRWxlbWVudEF0dHJpYnV0ZSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9yRWxlbWVudENsYXNzIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JFbGVtZW50U3R5bGUiLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckhvc3RQcm9wZXJ0eSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdEF0dHJpYnV0ZSIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdENsYXNzIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JIb3N0U3R5bGUiLCJCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvclRleHROb2RlIiwiQmluZGluZ1JlY29yZC5jcmVhdGVGb3JFdmVudCIsIkJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdEV2ZW50IiwiRGlyZWN0aXZlSW5kZXgiLCJEaXJlY3RpdmVJbmRleC5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZUluZGV4Lm5hbWUiLCJEaXJlY3RpdmVSZWNvcmQiLCJEaXJlY3RpdmVSZWNvcmQuY29uc3RydWN0b3IiLCJEaXJlY3RpdmVSZWNvcmQuaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uIiwiRHluYW1pY0NoYW5nZURldGVjdG9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmhhbmRsZUV2ZW50SW50ZXJuYWwiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3Byb2Nlc3NFdmVudEJpbmRpbmciLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX2NvbXB1dGVTa2lwTGVuZ3RoIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9tYXJrUGF0aEFzQ2hlY2tPbmNlIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9tYXRjaGluZ0V2ZW50QmluZGluZ3MiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuaHlkcmF0ZURpcmVjdGl2ZXMiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuZGVoeWRyYXRlRGlyZWN0aXZlcyIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fZGVzdHJveVBpcGVzIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmNoZWNrTm9DaGFuZ2VzIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXNJblJlY29yZHNJbnRlcm5hbCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fZmlyc3RJbkJpbmRpbmciLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuYWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3VwZGF0ZURpcmVjdGl2ZU9yRWxlbWVudCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fYWRkQ2hhbmdlIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9nZXREaXJlY3RpdmVGb3IiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX2dldERldGVjdG9yRm9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9jaGVjayIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcmVmZXJlbmNlQ2hlY2siLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX2NhbGN1bGF0ZUN1cnJWYWx1ZSIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcGlwZUNoZWNrIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9waXBlRm9yIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9yZWFkQ29udGV4dCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcmVhZFNlbGYiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3dyaXRlU2VsZiIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcmVhZFBpcGUiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3dyaXRlUGlwZSIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fc2V0Q2hhbmdlZCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fcHVyZUZ1bmNBbmRBcmdzRGlkTm90Q2hhbmdlIiwiRHluYW1pY0NoYW5nZURldGVjdG9yLl9hcmdzQ2hhbmdlZCIsIkR5bmFtaWNDaGFuZ2VEZXRlY3Rvci5fYXJnc09yQ29udGV4dENoYW5nZWQiLCJEeW5hbWljQ2hhbmdlRGV0ZWN0b3IuX3JlYWRBcmdzIiwiX0NvbnRleHQiLCJfQ29udGV4dC5jb25zdHJ1Y3RvciIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5hZGRDb250ZW50Q2hpbGQiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLnJlbW92ZUNvbnRlbnRDaGlsZCIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuYWRkVmlld0NoaWxkIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5yZW1vdmVWaWV3Q2hpbGQiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLnJlbW92ZSIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuaGFuZGxlRXZlbnQiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmhhbmRsZUV2ZW50SW50ZXJuYWwiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmNoZWNrTm9DaGFuZ2VzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5ydW5EZXRlY3RDaGFuZ2VzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzSW5SZWNvcmRzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzSW5SZWNvcmRzSW50ZXJuYWwiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmh5ZHJhdGUiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmh5ZHJhdGVEaXJlY3RpdmVzIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5kZWh5ZHJhdGUiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmRlaHlkcmF0ZURpcmVjdGl2ZXMiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmh5ZHJhdGVkIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5hZnRlckNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3MiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrc0ludGVybmFsIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5hZnRlclZpZXdMaWZlY3ljbGVDYWxsYmFja3MiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrc0ludGVybmFsIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5fZGV0ZWN0Q2hhbmdlc0NvbnRlbnRDaGlsZHJlbiIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuX2RldGVjdENoYW5nZXNJblZpZXdDaGlsZHJlbiIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IubWFya0FzQ2hlY2tPbmNlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5tYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5fdW5zdWJzcmliZUZyb21PYnNlcnZhYmxlcyIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3Iub2JzZXJ2ZVZhbHVlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5vYnNlcnZlRGlyZWN0aXZlIiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5vYnNlcnZlQ29tcG9uZW50IiwiQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvci5fY3JlYXRlQXJyYXlUb1N0b3JlT2JzZXJ2YWJsZXMiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmdldERpcmVjdGl2ZUZvciIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuZ2V0RGV0ZWN0b3JGb3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLm5vdGlmeURpc3BhdGNoZXIiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmxvZ0JpbmRpbmdVcGRhdGUiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLmFkZENoYW5nZSIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IuX3Rocm93RXJyb3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLnRocm93T25DaGFuZ2VFcnJvciIsIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IudGhyb3dEZWh5ZHJhdGVkRXJyb3IiLCJBYnN0cmFjdENoYW5nZURldGVjdG9yLl9jdXJyZW50QmluZGluZyIsIkNoYW5nZURldGVjdG9yUmVmIiwiQ2hhbmdlRGV0ZWN0b3JSZWYuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3RvclJlZl8iLCJDaGFuZ2VEZXRlY3RvclJlZl8uY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3RvclJlZl8ubWFya0ZvckNoZWNrIiwiQ2hhbmdlRGV0ZWN0b3JSZWZfLmRldGFjaCIsIkNoYW5nZURldGVjdG9yUmVmXy5kZXRlY3RDaGFuZ2VzIiwiQ2hhbmdlRGV0ZWN0b3JSZWZfLmNoZWNrTm9DaGFuZ2VzIiwiQ2hhbmdlRGV0ZWN0b3JSZWZfLnJlYXR0YWNoIiwibm9vcFNjb3BlIiwiZGV0ZWN0V1RGIiwiY3JlYXRlU2NvcGUiLCJsZWF2ZSIsInN0YXJ0VGltZVJhbmdlIiwiZW5kVGltZVJhbmdlIiwiaXNPYnNlcnZhYmxlIiwiUmVjb3JkVHlwZSIsIlByb3RvUmVjb3JkIiwiUHJvdG9SZWNvcmQuY29uc3RydWN0b3IiLCJQcm90b1JlY29yZC5pc1B1cmVGdW5jdGlvbiIsIlByb3RvUmVjb3JkLmlzVXNlZEJ5T3RoZXJSZWNvcmQiLCJQcm90b1JlY29yZC5zaG91bGRCZUNoZWNrZWQiLCJQcm90b1JlY29yZC5pc1BpcGVSZWNvcmQiLCJQcm90b1JlY29yZC5pc0NvbmRpdGlvbmFsU2tpcFJlY29yZCIsIlByb3RvUmVjb3JkLmlzVW5jb25kaXRpb25hbFNraXBSZWNvcmQiLCJQcm90b1JlY29yZC5pc1NraXBSZWNvcmQiLCJQcm90b1JlY29yZC5pc0xpZmVDeWNsZVJlY29yZCIsIkV2ZW50QmluZGluZyIsIkV2ZW50QmluZGluZy5jb25zdHJ1Y3RvciIsImNvYWxlc2NlIiwiX29wdGltaXplU2tpcHMiLCJfbWF5QmVBZGRSZWNvcmQiLCJfZmluZEZpcnN0TWF0Y2giLCJfY2xvbmVBbmRVcGRhdGVJbmRleGVzIiwiX3NyY1RvRHN0U2VsZkluZGV4IiwiX2NyZWF0ZVNlbGZSZWNvcmQiLCJfaGF2ZVNhbWVEaXJJbmRleCIsIkppdFByb3RvQ2hhbmdlRGV0ZWN0b3IiLCJKaXRQcm90b0NoYW5nZURldGVjdG9yLmNvbnN0cnVjdG9yIiwiSml0UHJvdG9DaGFuZ2VEZXRlY3Rvci5pc1N1cHBvcnRlZCIsIkppdFByb3RvQ2hhbmdlRGV0ZWN0b3IuaW5zdGFudGlhdGUiLCJKaXRQcm90b0NoYW5nZURldGVjdG9yLl9jcmVhdGVGYWN0b3J5IiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5jb25zdHJ1Y3RvciIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLmdlbmVyYXRlIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuZ2VuZXJhdGVTb3VyY2UiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuUHJvcGVydHlCaW5kaW5nVGFyZ2V0cyIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5EaXJlY3RpdmVJbmRpY2VzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuSGFuZGxlRXZlbnRJbnRlcm5hbCIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5FdmVudEJpbmRpbmciLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuRXZlbnRCaW5kaW5nRXZhbCIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5NYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlblVwZGF0ZVByZXZlbnREZWZhdWx0IiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuRGVoeWRyYXRlRGlyZWN0aXZlcyIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9tYXliZUdlbkh5ZHJhdGVEaXJlY3RpdmVzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuQWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlR2VuQWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlbkFsbFJlY29yZHMiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuQ29uZGl0aW9uYWxTa2lwIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlblVuY29uZGl0aW9uYWxTa2lwIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlbkVuZE9mU2tpcEJsb2NrIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlbkRpcmVjdGl2ZUxpZmVjeWNsZSIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5QaXBlQ2hlY2siLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuUmVmZXJlbmNlQ2hlY2siLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuQ2hhbmdlTWFya2VyIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX2dlblVwZGF0ZURpcmVjdGl2ZU9yRWxlbWVudCIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5UaHJvd09uQ2hhbmdlQ2hlY2siLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuQWRkVG9DaGFuZ2VzIiwiQ2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3IuX21heWJlRmlyc3RJbkJpbmRpbmciLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fbWF5YmVHZW5MYXN0SW5EaXJlY3RpdmUiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuT25DaGVjayIsIkNoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yLl9nZW5PbkluaXQiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuT25DaGFuZ2UiLCJDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvci5fZ2VuTm90aWZ5T25QdXNoRGV0ZWN0b3JzIiwic2FuaXRpemVOYW1lIiwiQ29kZWdlbk5hbWVVdGlsIiwiQ29kZWdlbk5hbWVVdGlsLmNvbnN0cnVjdG9yIiwiQ29kZWdlbk5hbWVVdGlsLl9hZGRGaWVsZFByZWZpeCIsIkNvZGVnZW5OYW1lVXRpbC5nZXREaXNwYXRjaGVyTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQaXBlc0FjY2Vzc29yTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQcm90b3NOYW1lIiwiQ29kZWdlbk5hbWVVdGlsLmdldERpcmVjdGl2ZXNBY2Nlc3Nvck5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0TG9jYWxzQWNjZXNzb3JOYW1lIiwiQ29kZWdlbk5hbWVVdGlsLmdldFN0YXRlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRNb2RlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQcm9wZXJ0eUJpbmRpbmdJbmRleCIsIkNvZGVnZW5OYW1lVXRpbC5nZXRMb2NhbE5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0RXZlbnRMb2NhbE5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0Q2hhbmdlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZW5Jbml0TG9jYWxzIiwiQ29kZWdlbk5hbWVVdGlsLmdlbkluaXRFdmVudExvY2FscyIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQcmV2ZW50RGVmYXVsdEFjY2Vzb3IiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0RmllbGRDb3VudCIsIkNvZGVnZW5OYW1lVXRpbC5nZXRGaWVsZE5hbWUiLCJDb2RlZ2VuTmFtZVV0aWwuZ2V0QWxsRmllbGROYW1lcyIsIkNvZGVnZW5OYW1lVXRpbC5nZW5EZWh5ZHJhdGVGaWVsZHMiLCJDb2RlZ2VuTmFtZVV0aWwuZ2VuUGlwZU9uRGVzdHJveSIsIkNvZGVnZW5OYW1lVXRpbC5nZXRQaXBlTmFtZSIsIkNvZGVnZW5OYW1lVXRpbC5nZXREaXJlY3RpdmVOYW1lIiwiQ29kZWdlbk5hbWVVdGlsLmdldERldGVjdG9yTmFtZSIsIkNvZGVnZW5Mb2dpY1V0aWwiLCJDb2RlZ2VuTG9naWNVdGlsLmNvbnN0cnVjdG9yIiwiQ29kZWdlbkxvZ2ljVXRpbC5nZW5Qcm9wZXJ0eUJpbmRpbmdFdmFsVmFsdWUiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkV2ZW50QmluZGluZ0V2YWxWYWx1ZSIsIkNvZGVnZW5Mb2dpY1V0aWwuX2dlbkV2YWxWYWx1ZSIsIkNvZGVnZW5Mb2dpY1V0aWwuX29ic2VydmUiLCJDb2RlZ2VuTG9naWNVdGlsLmdlblByb3BlcnR5QmluZGluZ1RhcmdldHMiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkRpcmVjdGl2ZUluZGljZXMiLCJDb2RlZ2VuTG9naWNVdGlsLl9nZW5JbnRlcnBvbGF0aW9uIiwiQ29kZWdlbkxvZ2ljVXRpbC5nZW5IeWRyYXRlRGlyZWN0aXZlcyIsIkNvZGVnZW5Mb2dpY1V0aWwuX2dlblJlYWREaXJlY3RpdmUiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkh5ZHJhdGVEZXRlY3RvcnMiLCJDb2RlZ2VuTG9naWNVdGlsLmdlbkNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3MiLCJDb2RlZ2VuTG9naWNVdGlsLmdlblZpZXdMaWZlY3ljbGVDYWxsYmFja3MiLCJjb2RpZnkiLCJyYXdTdHJpbmciLCJjb21iaW5lR2VuZXJhdGVkU3RyaW5ncyIsIlZpZXdFbmNhcHN1bGF0aW9uIiwiVmlld01ldGFkYXRhIiwiVmlld01ldGFkYXRhLmNvbnN0cnVjdG9yIiwiVGltZXJXcmFwcGVyIiwiVGltZXJXcmFwcGVyLmNvbnN0cnVjdG9yIiwiVGltZXJXcmFwcGVyLnNldFRpbWVvdXQiLCJUaW1lcldyYXBwZXIuY2xlYXJUaW1lb3V0IiwiVGltZXJXcmFwcGVyLnNldEludGVydmFsIiwiVGltZXJXcmFwcGVyLmNsZWFySW50ZXJ2YWwiLCJPYnNlcnZhYmxlV3JhcHBlciIsIk9ic2VydmFibGVXcmFwcGVyLmNvbnN0cnVjdG9yIiwiT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlIiwiT2JzZXJ2YWJsZVdyYXBwZXIuaXNPYnNlcnZhYmxlIiwiT2JzZXJ2YWJsZVdyYXBwZXIuaGFzU3Vic2NyaWJlcnMiLCJPYnNlcnZhYmxlV3JhcHBlci5kaXNwb3NlIiwiT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbE5leHQiLCJPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCIsIk9ic2VydmFibGVXcmFwcGVyLmNhbGxFcnJvciIsIk9ic2VydmFibGVXcmFwcGVyLmNhbGxDb21wbGV0ZSIsIk9ic2VydmFibGVXcmFwcGVyLmZyb21Qcm9taXNlIiwiT2JzZXJ2YWJsZVdyYXBwZXIudG9Qcm9taXNlIiwiRXZlbnRFbWl0dGVyIiwiRXZlbnRFbWl0dGVyLmNvbnN0cnVjdG9yIiwiRXZlbnRFbWl0dGVyLmVtaXQiLCJFdmVudEVtaXR0ZXIubmV4dCIsIkV2ZW50RW1pdHRlci5zdWJzY3JpYmUiLCJQcm9taXNlV3JhcHBlciIsIlByb21pc2VXcmFwcGVyLmNvbnN0cnVjdG9yIiwiUHJvbWlzZVdyYXBwZXIucmVzb2x2ZSIsIlByb21pc2VXcmFwcGVyLnJlamVjdCIsIlByb21pc2VXcmFwcGVyLmNhdGNoRXJyb3IiLCJQcm9taXNlV3JhcHBlci5hbGwiLCJQcm9taXNlV3JhcHBlci50aGVuIiwiUHJvbWlzZVdyYXBwZXIud3JhcCIsIlByb21pc2VXcmFwcGVyLnNjaGVkdWxlTWljcm90YXNrIiwiUHJvbWlzZVdyYXBwZXIuaXNQcm9taXNlIiwiUHJvbWlzZVdyYXBwZXIuY29tcGxldGVyIiwiX2NvbXBvbmVudFByb3ZpZGVycyIsImNyZWF0ZU5nWm9uZSIsInBsYXRmb3JtIiwiZGlzcG9zZVBsYXRmb3JtIiwiX2NyZWF0ZVBsYXRmb3JtIiwiX3J1blBsYXRmb3JtSW5pdGlhbGl6ZXJzIiwiUGxhdGZvcm1SZWYiLCJQbGF0Zm9ybVJlZi5jb25zdHJ1Y3RvciIsIlBsYXRmb3JtUmVmLmluamVjdG9yIiwiUGxhdGZvcm1SZWZfIiwiUGxhdGZvcm1SZWZfLmNvbnN0cnVjdG9yIiwiUGxhdGZvcm1SZWZfLnJlZ2lzdGVyRGlzcG9zZUxpc3RlbmVyIiwiUGxhdGZvcm1SZWZfLmluamVjdG9yIiwiUGxhdGZvcm1SZWZfLmFwcGxpY2F0aW9uIiwiUGxhdGZvcm1SZWZfLmFzeW5jQXBwbGljYXRpb24iLCJQbGF0Zm9ybVJlZl8uX2luaXRBcHAiLCJQbGF0Zm9ybVJlZl8uZGlzcG9zZSIsIlBsYXRmb3JtUmVmXy5fYXBwbGljYXRpb25EaXNwb3NlZCIsIl9ydW5BcHBJbml0aWFsaXplcnMiLCJBcHBsaWNhdGlvblJlZiIsIkFwcGxpY2F0aW9uUmVmLmNvbnN0cnVjdG9yIiwiQXBwbGljYXRpb25SZWYuaW5qZWN0b3IiLCJBcHBsaWNhdGlvblJlZi56b25lIiwiQXBwbGljYXRpb25SZWYuY29tcG9uZW50VHlwZXMiLCJBcHBsaWNhdGlvblJlZl8iLCJBcHBsaWNhdGlvblJlZl8uY29uc3RydWN0b3IiLCJBcHBsaWNhdGlvblJlZl8ucmVnaXN0ZXJCb290c3RyYXBMaXN0ZW5lciIsIkFwcGxpY2F0aW9uUmVmXy5yZWdpc3RlckRpc3Bvc2VMaXN0ZW5lciIsIkFwcGxpY2F0aW9uUmVmXy5yZWdpc3RlckNoYW5nZURldGVjdG9yIiwiQXBwbGljYXRpb25SZWZfLnVucmVnaXN0ZXJDaGFuZ2VEZXRlY3RvciIsIkFwcGxpY2F0aW9uUmVmXy5ib290c3RyYXAiLCJBcHBsaWNhdGlvblJlZl8uX2xvYWRDb21wb25lbnQiLCJBcHBsaWNhdGlvblJlZl8uX3VubG9hZENvbXBvbmVudCIsIkFwcGxpY2F0aW9uUmVmXy5pbmplY3RvciIsIkFwcGxpY2F0aW9uUmVmXy56b25lIiwiQXBwbGljYXRpb25SZWZfLnRpY2siLCJBcHBsaWNhdGlvblJlZl8uZGlzcG9zZSIsIkFwcGxpY2F0aW9uUmVmXy5jb21wb25lbnRUeXBlcyIsIk5nWm9uZUVycm9yIiwiTmdab25lRXJyb3IuY29uc3RydWN0b3IiLCJOZ1pvbmUiLCJOZ1pvbmUuY29uc3RydWN0b3IiLCJOZ1pvbmUub3ZlcnJpZGVPblR1cm5TdGFydCIsIk5nWm9uZS5vblR1cm5TdGFydCIsIk5nWm9uZS5fbm90aWZ5T25UdXJuU3RhcnQiLCJOZ1pvbmUub3ZlcnJpZGVPblR1cm5Eb25lIiwiTmdab25lLm9uVHVybkRvbmUiLCJOZ1pvbmUuX25vdGlmeU9uVHVybkRvbmUiLCJOZ1pvbmUub3ZlcnJpZGVPbkV2ZW50RG9uZSIsIk5nWm9uZS5vbkV2ZW50RG9uZSIsIk5nWm9uZS5fbm90aWZ5T25FdmVudERvbmUiLCJOZ1pvbmUuaGFzUGVuZGluZ01pY3JvdGFza3MiLCJOZ1pvbmUuaGFzUGVuZGluZ1RpbWVycyIsIk5nWm9uZS5oYXNQZW5kaW5nQXN5bmNUYXNrcyIsIk5nWm9uZS5vdmVycmlkZU9uRXJyb3JIYW5kbGVyIiwiTmdab25lLm9uRXJyb3IiLCJOZ1pvbmUucnVuIiwiTmdab25lLnJ1bk91dHNpZGVBbmd1bGFyIiwiTmdab25lLl9jcmVhdGVJbm5lclpvbmUiLCJOZ1pvbmUuX25vdGlmeU9uRXJyb3IiLCJfYXBwSWRSYW5kb21Qcm92aWRlckZhY3RvcnkiLCJfcmFuZG9tQ2hhciIsIlRlc3RhYmlsaXR5IiwiVGVzdGFiaWxpdHkuY29uc3RydWN0b3IiLCJUZXN0YWJpbGl0eS5fd2F0Y2hBbmd1bGFyRXZlbnRzIiwiVGVzdGFiaWxpdHkuaW5jcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50IiwiVGVzdGFiaWxpdHkuZGVjcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50IiwiVGVzdGFiaWxpdHkuaXNTdGFibGUiLCJUZXN0YWJpbGl0eS5fcnVuQ2FsbGJhY2tzSWZSZWFkeSIsIlRlc3RhYmlsaXR5LndoZW5TdGFibGUiLCJUZXN0YWJpbGl0eS5nZXRQZW5kaW5nUmVxdWVzdENvdW50IiwiVGVzdGFiaWxpdHkuaXNBbmd1bGFyRXZlbnRQZW5kaW5nIiwiVGVzdGFiaWxpdHkuZmluZEJpbmRpbmdzIiwiVGVzdGFiaWxpdHkuZmluZFByb3ZpZGVycyIsIlRlc3RhYmlsaXR5UmVnaXN0cnkiLCJUZXN0YWJpbGl0eVJlZ2lzdHJ5LmNvbnN0cnVjdG9yIiwiVGVzdGFiaWxpdHlSZWdpc3RyeS5yZWdpc3RlckFwcGxpY2F0aW9uIiwiVGVzdGFiaWxpdHlSZWdpc3RyeS5nZXRUZXN0YWJpbGl0eSIsIlRlc3RhYmlsaXR5UmVnaXN0cnkuZ2V0QWxsVGVzdGFiaWxpdGllcyIsIlRlc3RhYmlsaXR5UmVnaXN0cnkuZmluZFRlc3RhYmlsaXR5SW5UcmVlIiwiX05vb3BHZXRUZXN0YWJpbGl0eSIsIl9Ob29wR2V0VGVzdGFiaWxpdHkuY29uc3RydWN0b3IiLCJfTm9vcEdldFRlc3RhYmlsaXR5LmFkZFRvV2luZG93IiwiX05vb3BHZXRUZXN0YWJpbGl0eS5maW5kVGVzdGFiaWxpdHlJblRyZWUiLCJzZXRUZXN0YWJpbGl0eUdldHRlciIsIkNvbXBvbmVudFJlZiIsIkNvbXBvbmVudFJlZi5jb25zdHJ1Y3RvciIsIkNvbXBvbmVudFJlZi5ob3N0VmlldyIsIkNvbXBvbmVudFJlZi5ob3N0Q29tcG9uZW50IiwiQ29tcG9uZW50UmVmXyIsIkNvbXBvbmVudFJlZl8uY29uc3RydWN0b3IiLCJDb21wb25lbnRSZWZfLmhvc3RDb21wb25lbnRUeXBlIiwiQ29tcG9uZW50UmVmXy5kaXNwb3NlIiwiRHluYW1pY0NvbXBvbmVudExvYWRlciIsIkR5bmFtaWNDb21wb25lbnRMb2FkZXIuY29uc3RydWN0b3IiLCJEeW5hbWljQ29tcG9uZW50TG9hZGVyXyIsIkR5bmFtaWNDb21wb25lbnRMb2FkZXJfLmNvbnN0cnVjdG9yIiwiRHluYW1pY0NvbXBvbmVudExvYWRlcl8ubG9hZEFzUm9vdCIsIkR5bmFtaWNDb21wb25lbnRMb2FkZXJfLmxvYWRJbnRvTG9jYXRpb24iLCJEeW5hbWljQ29tcG9uZW50TG9hZGVyXy5sb2FkTmV4dFRvTG9jYXRpb24iLCJDb21waWxlciIsIkNvbXBpbGVyLmNvbnN0cnVjdG9yIiwiX2lzQ29tcGlsZWRIb3N0VGVtcGxhdGUiLCJDb21waWxlcl8iLCJDb21waWxlcl8uY29uc3RydWN0b3IiLCJDb21waWxlcl8uY29tcGlsZUluSG9zdCIsIkNvbXBpbGVyXy5fY3JlYXRlUHJvdG9WaWV3IiwiQ29tcGlsZXJfLmNsZWFyQ2FjaGUiLCJpbnRlcm5hbENyZWF0ZVByb3RvVmlldyIsIlByb3RvVmlld0ZhY3RvcnkiLCJQcm90b1ZpZXdGYWN0b3J5LmNvbnN0cnVjdG9yIiwiUHJvdG9WaWV3RmFjdG9yeS5jbGVhckNhY2hlIiwiUHJvdG9WaWV3RmFjdG9yeS5jcmVhdGVIb3N0IiwiUHJvdG9WaWV3RmFjdG9yeS5fY3JlYXRlQ29tcG9uZW50IiwiUHJvdG9WaWV3RmFjdG9yeS5fY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsIlByb3RvVmlld0ZhY3RvcnkuaW5pdGlhbGl6ZVByb3RvVmlld0lmTmVlZGVkIiwiUHJvdG9WaWV3RmFjdG9yeS5faW5pdGlhbGl6ZVByb3RvVmlldyIsIlByb3RvVmlld0ZhY3RvcnkuX2JpbmRQaXBlIiwiUHJvdG9WaWV3RmFjdG9yeS5fZmxhdHRlblBpcGVzIiwiY3JlYXRlQ29tcG9uZW50IiwiY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsIl9Qcm90b1ZpZXdJbml0aWFsaXplciIsIl9Qcm90b1ZpZXdJbml0aWFsaXplci5jb25zdHJ1Y3RvciIsIl9Qcm90b1ZpZXdJbml0aWFsaXplci52aXNpdFRleHQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXROZ0NvbnRlbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRCZWdpbkVsZW1lbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRFbmRFbGVtZW50IiwiX1Byb3RvVmlld0luaXRpYWxpemVyLnZpc2l0QmVnaW5Db21wb25lbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRFbmRDb21wb25lbnQiLCJfUHJvdG9WaWV3SW5pdGlhbGl6ZXIudmlzaXRFbWJlZGRlZFRlbXBsYXRlIiwiX1Byb3RvVmlld0luaXRpYWxpemVyLl92aXNpdEJlZ2luQm91bmRFbGVtZW50IiwiX1Byb3RvVmlld0luaXRpYWxpemVyLl92aXNpdEJlZ2luRWxlbWVudCIsIl9Qcm90b1ZpZXdJbml0aWFsaXplci5fdmlzaXRFbmRFbGVtZW50IiwiX2NyZWF0ZUVsZW1lbnRCaW5kZXIiLCJwcm92aWRlRGlyZWN0aXZlIiwiY3JlYXRlRGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyIsImFycmF5VG9NYXAiLCJfZmxhdHRlbkFycmF5IiwiX2ZsYXR0ZW5TdHlsZUFyciIsIlJlbmRlclByb3RvVmlld1JlZiIsIlJlbmRlclByb3RvVmlld1JlZi5jb25zdHJ1Y3RvciIsIlJlbmRlckZyYWdtZW50UmVmIiwiUmVuZGVyRnJhZ21lbnRSZWYuY29uc3RydWN0b3IiLCJSZW5kZXJWaWV3UmVmIiwiUmVuZGVyVmlld1JlZi5jb25zdHJ1Y3RvciIsIlJlbmRlclRlbXBsYXRlQ21kIiwiUmVuZGVyVGVtcGxhdGVDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJCZWdpbkNtZCIsIlJlbmRlckJlZ2luQ21kLmNvbnN0cnVjdG9yIiwiUmVuZGVyQmVnaW5DbWQubmdDb250ZW50SW5kZXgiLCJSZW5kZXJCZWdpbkNtZC5pc0JvdW5kIiwiUmVuZGVyVGV4dENtZCIsIlJlbmRlclRleHRDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJUZXh0Q21kLnZhbHVlIiwiUmVuZGVyTmdDb250ZW50Q21kIiwiUmVuZGVyTmdDb250ZW50Q21kLmNvbnN0cnVjdG9yIiwiUmVuZGVyTmdDb250ZW50Q21kLmluZGV4IiwiUmVuZGVyTmdDb250ZW50Q21kLm5nQ29udGVudEluZGV4IiwiUmVuZGVyQmVnaW5FbGVtZW50Q21kIiwiUmVuZGVyQmVnaW5FbGVtZW50Q21kLmNvbnN0cnVjdG9yIiwiUmVuZGVyQmVnaW5FbGVtZW50Q21kLm5hbWUiLCJSZW5kZXJCZWdpbkVsZW1lbnRDbWQuYXR0ck5hbWVBbmRWYWx1ZXMiLCJSZW5kZXJCZWdpbkVsZW1lbnRDbWQuZXZlbnRUYXJnZXRBbmROYW1lcyIsIlJlbmRlckJlZ2luQ29tcG9uZW50Q21kIiwiUmVuZGVyQmVnaW5Db21wb25lbnRDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJCZWdpbkNvbXBvbmVudENtZC50ZW1wbGF0ZUlkIiwiUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZCIsIlJlbmRlckVtYmVkZGVkVGVtcGxhdGVDbWQuY29uc3RydWN0b3IiLCJSZW5kZXJFbWJlZGRlZFRlbXBsYXRlQ21kLmlzTWVyZ2VkIiwiUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZC5jaGlsZHJlbiIsIlJlbmRlclZpZXdXaXRoRnJhZ21lbnRzIiwiUmVuZGVyVmlld1dpdGhGcmFnbWVudHMuY29uc3RydWN0b3IiLCJSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSIsIlJlbmRlckNvbXBvbmVudFRlbXBsYXRlLmNvbnN0cnVjdG9yIiwiUmVuZGVyZXIiLCJSZW5kZXJlci5jb25zdHJ1Y3RvciIsIlBpcGVQcm92aWRlciIsIlBpcGVQcm92aWRlci5jb25zdHJ1Y3RvciIsIlBpcGVQcm92aWRlci5jcmVhdGVGcm9tVHlwZSIsIlByb3RvUGlwZXMiLCJQcm90b1BpcGVzLmNvbnN0cnVjdG9yIiwiUHJvdG9QaXBlcy5mcm9tUHJvdmlkZXJzIiwiUHJvdG9QaXBlcy5nZXQiLCJQaXBlcyIsIlBpcGVzLmNvbnN0cnVjdG9yIiwiUGlwZXMuZ2V0IiwiU2VsZWN0ZWRQaXBlIiwiU2VsZWN0ZWRQaXBlLmNvbnN0cnVjdG9yIiwiVmlld1R5cGUiLCJBcHBWaWV3Q29udGFpbmVyIiwiQXBwVmlld0NvbnRhaW5lci5jb25zdHJ1Y3RvciIsIkFwcFZpZXciLCJBcHBWaWV3LmNvbnN0cnVjdG9yIiwiQXBwVmlldy5pbml0IiwiQXBwVmlldy5zZXRMb2NhbCIsIkFwcFZpZXcuaHlkcmF0ZWQiLCJBcHBWaWV3LnRyaWdnZXJFdmVudEhhbmRsZXJzIiwiQXBwVmlldy5ub3RpZnlPbkJpbmRpbmciLCJBcHBWaWV3LmxvZ0JpbmRpbmdVcGRhdGUiLCJBcHBWaWV3Lm5vdGlmeUFmdGVyQ29udGVudENoZWNrZWQiLCJBcHBWaWV3Lm5vdGlmeUFmdGVyVmlld0NoZWNrZWQiLCJBcHBWaWV3LmdldERpcmVjdGl2ZUZvciIsIkFwcFZpZXcuZ2V0TmVzdGVkVmlldyIsIkFwcFZpZXcuZ2V0Q29udGFpbmVyRWxlbWVudCIsIkFwcFZpZXcuZ2V0RGVidWdDb250ZXh0IiwiQXBwVmlldy5nZXREZXRlY3RvckZvciIsIkFwcFZpZXcuaW52b2tlRWxlbWVudE1ldGhvZCIsIkFwcFZpZXcuZGlzcGF0Y2hSZW5kZXJFdmVudCIsIkFwcFZpZXcuZGlzcGF0Y2hFdmVudCIsIkFwcFZpZXcub3duQmluZGVyc0NvdW50IiwiX2xvY2Fsc1RvU3RyaW5nTWFwIiwiRXZlbnRFdmFsdWF0aW9uRXJyb3IiLCJFdmVudEV2YWx1YXRpb25FcnJvci5jb25zdHJ1Y3RvciIsIkFwcFByb3RvVmlld01lcmdlSW5mbyIsIkFwcFByb3RvVmlld01lcmdlSW5mby5jb25zdHJ1Y3RvciIsIkFwcFByb3RvVmlldyIsIkFwcFByb3RvVmlldy5jb25zdHJ1Y3RvciIsIkFwcFByb3RvVmlldy5pbml0IiwiQXBwUHJvdG9WaWV3LmlzSW5pdGlhbGl6ZWQiLCJpbnRlcm5hbFZpZXciLCJpbnRlcm5hbFByb3RvVmlldyIsIlZpZXdSZWYiLCJWaWV3UmVmLmNvbnN0cnVjdG9yIiwiVmlld1JlZi5jaGFuZ2VEZXRlY3RvclJlZiIsIlZpZXdSZWZfIiwiVmlld1JlZl8uY29uc3RydWN0b3IiLCJWaWV3UmVmXy5yZW5kZXIiLCJWaWV3UmVmXy5yZW5kZXJGcmFnbWVudCIsIlZpZXdSZWZfLmNoYW5nZURldGVjdG9yUmVmIiwiVmlld1JlZl8uc2V0TG9jYWwiLCJQcm90b1ZpZXdSZWYiLCJQcm90b1ZpZXdSZWYuY29uc3RydWN0b3IiLCJQcm90b1ZpZXdSZWZfIiwiUHJvdG9WaWV3UmVmXy5jb25zdHJ1Y3RvciIsImNhbWVsQ2FzZVRvRGFzaENhc2UiLCJkYXNoQ2FzZVRvQ2FtZWxDYXNlIiwiRWxlbWVudEJpbmRlciIsIkVsZW1lbnRCaW5kZXIuY29uc3RydWN0b3IiLCJTdGF0aWNLZXlzIiwiU3RhdGljS2V5cy5jb25zdHJ1Y3RvciIsIlN0YXRpY0tleXMuaW5zdGFuY2UiLCJUcmVlTm9kZSIsIlRyZWVOb2RlLmNvbnN0cnVjdG9yIiwiVHJlZU5vZGUuYWRkQ2hpbGQiLCJUcmVlTm9kZS5yZW1vdmUiLCJUcmVlTm9kZS5wYXJlbnQiLCJEaXJlY3RpdmVEZXBlbmRlbmN5IiwiRGlyZWN0aXZlRGVwZW5kZW5jeS5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZURlcGVuZGVuY3kuX3ZlcmlmeSIsIkRpcmVjdGl2ZURlcGVuZGVuY3kuY3JlYXRlRnJvbSIsIkRpcmVjdGl2ZURlcGVuZGVuY3kuX2F0dHJpYnV0ZU5hbWUiLCJEaXJlY3RpdmVEZXBlbmRlbmN5Ll9xdWVyeSIsIkRpcmVjdGl2ZVByb3ZpZGVyIiwiRGlyZWN0aXZlUHJvdmlkZXIuY29uc3RydWN0b3IiLCJEaXJlY3RpdmVQcm92aWRlci5kaXNwbGF5TmFtZSIsIkRpcmVjdGl2ZVByb3ZpZGVyLnF1ZXJpZXMiLCJEaXJlY3RpdmVQcm92aWRlci5ldmVudEVtaXR0ZXJzIiwiRGlyZWN0aXZlUHJvdmlkZXIuY3JlYXRlRnJvbVByb3ZpZGVyIiwiRGlyZWN0aXZlUHJvdmlkZXIuY3JlYXRlRnJvbVR5cGUiLCJQcmVCdWlsdE9iamVjdHMiLCJQcmVCdWlsdE9iamVjdHMuY29uc3RydWN0b3IiLCJRdWVyeU1ldGFkYXRhV2l0aFNldHRlciIsIlF1ZXJ5TWV0YWRhdGFXaXRoU2V0dGVyLmNvbnN0cnVjdG9yIiwiRXZlbnRFbWl0dGVyQWNjZXNzb3IiLCJFdmVudEVtaXR0ZXJBY2Nlc3Nvci5jb25zdHJ1Y3RvciIsIkV2ZW50RW1pdHRlckFjY2Vzc29yLnN1YnNjcmliZSIsIl9jcmVhdGVFdmVudEVtaXR0ZXJBY2Nlc3NvcnMiLCJfY3JlYXRlUHJvdG9RdWVyeVJlZnMiLCJQcm90b0VsZW1lbnRJbmplY3RvciIsIlByb3RvRWxlbWVudEluamVjdG9yLmNvbnN0cnVjdG9yIiwiUHJvdG9FbGVtZW50SW5qZWN0b3IuY3JlYXRlIiwiUHJvdG9FbGVtZW50SW5qZWN0b3IuX2NyZWF0ZURpcmVjdGl2ZVByb3ZpZGVyV2l0aFZpc2liaWxpdHkiLCJQcm90b0VsZW1lbnRJbmplY3Rvci5fY3JlYXRlUHJvdmlkZXJzV2l0aFZpc2liaWxpdHkiLCJQcm90b0VsZW1lbnRJbmplY3Rvci5fY3JlYXRlUHJvdmlkZXJXaXRoVmlzaWJpbGl0eSIsIlByb3RvRWxlbWVudEluamVjdG9yLl9jcmVhdGVWaWV3UHJvdmlkZXJzV2l0aFZpc2liaWxpdHkiLCJQcm90b0VsZW1lbnRJbmplY3Rvci5pbnN0YW50aWF0ZSIsIlByb3RvRWxlbWVudEluamVjdG9yLmRpcmVjdFBhcmVudCIsIlByb3RvRWxlbWVudEluamVjdG9yLmhhc0JpbmRpbmdzIiwiUHJvdG9FbGVtZW50SW5qZWN0b3IuZ2V0UHJvdmlkZXJBdEluZGV4IiwiRWxlbWVudEluamVjdG9yIiwiRWxlbWVudEluamVjdG9yLmNvbnN0cnVjdG9yIiwiRWxlbWVudEluamVjdG9yLmRlaHlkcmF0ZSIsIkVsZW1lbnRJbmplY3Rvci5oeWRyYXRlIiwiRWxlbWVudEluamVjdG9yLl9kZWJ1Z0NvbnRleHQiLCJFbGVtZW50SW5qZWN0b3IuX3JlYXR0YWNoSW5qZWN0b3JzIiwiRWxlbWVudEluamVjdG9yLl9yZWF0dGFjaEluamVjdG9yIiwiRWxlbWVudEluamVjdG9yLmhhc1ZhcmlhYmxlQmluZGluZyIsIkVsZW1lbnRJbmplY3Rvci5nZXRWYXJpYWJsZUJpbmRpbmciLCJFbGVtZW50SW5qZWN0b3IuZ2V0IiwiRWxlbWVudEluamVjdG9yLmhhc0RpcmVjdGl2ZSIsIkVsZW1lbnRJbmplY3Rvci5nZXRFdmVudEVtaXR0ZXJBY2Nlc3NvcnMiLCJFbGVtZW50SW5qZWN0b3IuZ2V0RGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyIsIkVsZW1lbnRJbmplY3Rvci5nZXRDb21wb25lbnQiLCJFbGVtZW50SW5qZWN0b3IuZ2V0SW5qZWN0b3IiLCJFbGVtZW50SW5qZWN0b3IuZ2V0RWxlbWVudFJlZiIsIkVsZW1lbnRJbmplY3Rvci5nZXRWaWV3Q29udGFpbmVyUmVmIiwiRWxlbWVudEluamVjdG9yLmdldE5lc3RlZFZpZXciLCJFbGVtZW50SW5qZWN0b3IuZ2V0VmlldyIsIkVsZW1lbnRJbmplY3Rvci5kaXJlY3RQYXJlbnQiLCJFbGVtZW50SW5qZWN0b3IuaXNDb21wb25lbnRLZXkiLCJFbGVtZW50SW5qZWN0b3IuZ2V0RGVwZW5kZW5jeSIsIkVsZW1lbnRJbmplY3Rvci5fYnVpbGRBdHRyaWJ1dGUiLCJFbGVtZW50SW5qZWN0b3IuYWRkRGlyZWN0aXZlc01hdGNoaW5nUXVlcnkiLCJFbGVtZW50SW5qZWN0b3IuX2J1aWxkUXVlcnlTdHJhdGVneSIsIkVsZW1lbnRJbmplY3Rvci5saW5rIiwiRWxlbWVudEluamVjdG9yLnVubGluayIsIkVsZW1lbnRJbmplY3Rvci5nZXREaXJlY3RpdmVBdEluZGV4IiwiRWxlbWVudEluamVjdG9yLmhhc0luc3RhbmNlcyIsIkVsZW1lbnRJbmplY3Rvci5nZXRIb3N0IiwiRWxlbWVudEluamVjdG9yLmdldEJvdW5kRWxlbWVudEluZGV4IiwiRWxlbWVudEluamVjdG9yLmdldFJvb3RWaWV3SW5qZWN0b3JzIiwiRWxlbWVudEluamVjdG9yLm5nQWZ0ZXJWaWV3Q2hlY2tlZCIsIkVsZW1lbnRJbmplY3Rvci5uZ0FmdGVyQ29udGVudENoZWNrZWQiLCJFbGVtZW50SW5qZWN0b3IudHJhdmVyc2VBbmRTZXRRdWVyaWVzQXNEaXJ0eSIsIkVsZW1lbnRJbmplY3Rvci5fc2V0UXVlcmllc0FzRGlydHkiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5IiwiX0VtcHR5UXVlcnlTdHJhdGVneS5jb25zdHJ1Y3RvciIsIl9FbXB0eVF1ZXJ5U3RyYXRlZ3kuc2V0Q29udGVudFF1ZXJpZXNBc0RpcnR5IiwiX0VtcHR5UXVlcnlTdHJhdGVneS5zZXRWaWV3UXVlcmllc0FzRGlydHkiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5Lmh5ZHJhdGUiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIl9FbXB0eVF1ZXJ5U3RyYXRlZ3kudXBkYXRlQ29udGVudFF1ZXJpZXMiLCJfRW1wdHlRdWVyeVN0cmF0ZWd5LnVwZGF0ZVZpZXdRdWVyaWVzIiwiX0VtcHR5UXVlcnlTdHJhdGVneS5maW5kUXVlcnkiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5IiwiSW5saW5lUXVlcnlTdHJhdGVneS5jb25zdHJ1Y3RvciIsIklubGluZVF1ZXJ5U3RyYXRlZ3kuc2V0Q29udGVudFF1ZXJpZXNBc0RpcnR5IiwiSW5saW5lUXVlcnlTdHJhdGVneS5zZXRWaWV3UXVlcmllc0FzRGlydHkiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5Lmh5ZHJhdGUiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIklubGluZVF1ZXJ5U3RyYXRlZ3kudXBkYXRlQ29udGVudFF1ZXJpZXMiLCJJbmxpbmVRdWVyeVN0cmF0ZWd5LnVwZGF0ZVZpZXdRdWVyaWVzIiwiSW5saW5lUXVlcnlTdHJhdGVneS5maW5kUXVlcnkiLCJEeW5hbWljUXVlcnlTdHJhdGVneSIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kuc2V0Q29udGVudFF1ZXJpZXNBc0RpcnR5IiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kuc2V0Vmlld1F1ZXJpZXNBc0RpcnR5IiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kuaHlkcmF0ZSIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIkR5bmFtaWNRdWVyeVN0cmF0ZWd5LnVwZGF0ZUNvbnRlbnRRdWVyaWVzIiwiRHluYW1pY1F1ZXJ5U3RyYXRlZ3kudXBkYXRlVmlld1F1ZXJpZXMiLCJEeW5hbWljUXVlcnlTdHJhdGVneS5maW5kUXVlcnkiLCJFbGVtZW50SW5qZWN0b3JJbmxpbmVTdHJhdGVneSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiRWxlbWVudEluamVjdG9ySW5saW5lU3RyYXRlZ3kuaHlkcmF0ZSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmRlaHlkcmF0ZSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmNhbGxPbkRlc3Ryb3kiLCJFbGVtZW50SW5qZWN0b3JJbmxpbmVTdHJhdGVneS5nZXRDb21wb25lbnQiLCJFbGVtZW50SW5qZWN0b3JJbmxpbmVTdHJhdGVneS5pc0NvbXBvbmVudEtleSIsIkVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5LmFkZERpcmVjdGl2ZXNNYXRjaGluZ1F1ZXJ5IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5Lmh5ZHJhdGUiLCJFbGVtZW50SW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZGVoeWRyYXRlIiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmNhbGxPbkRlc3Ryb3kiLCJFbGVtZW50SW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kuZ2V0Q29tcG9uZW50IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmlzQ29tcG9uZW50S2V5IiwiRWxlbWVudEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LmFkZERpcmVjdGl2ZXNNYXRjaGluZ1F1ZXJ5IiwiUHJvdG9RdWVyeVJlZiIsIlByb3RvUXVlcnlSZWYuY29uc3RydWN0b3IiLCJQcm90b1F1ZXJ5UmVmLnVzZXNQcm9wZXJ0eVN5bnRheCIsIlF1ZXJ5UmVmIiwiUXVlcnlSZWYuY29uc3RydWN0b3IiLCJRdWVyeVJlZi5pc1ZpZXdRdWVyeSIsIlF1ZXJ5UmVmLnVwZGF0ZSIsIlF1ZXJ5UmVmLl91cGRhdGUiLCJRdWVyeVJlZi5fdmlzaXQiLCJRdWVyeVJlZi5fdmlzaXRJbmplY3RvciIsIlF1ZXJ5UmVmLl92aXNpdFZpZXdDb250YWluZXIiLCJRdWVyeVJlZi5fdmlzaXRWaWV3IiwiUXVlcnlSZWYuX2FnZ3JlZ2F0ZVZhcmlhYmxlQmluZGluZyIsIlF1ZXJ5UmVmLl9hZ2dyZWdhdGVEaXJlY3RpdmUiLCJRdWVyeVJlZi5kZWh5ZHJhdGUiLCJRdWVyeVJlZi5oeWRyYXRlIiwiQXBwVmlld01hbmFnZXIiLCJBcHBWaWV3TWFuYWdlci5jb25zdHJ1Y3RvciIsIkFwcFZpZXdNYW5hZ2VyLmdldEhvc3RFbGVtZW50IiwiQXBwVmlld01hbmFnZXJfIiwiQXBwVmlld01hbmFnZXJfLmNvbnN0cnVjdG9yIiwiQXBwVmlld01hbmFnZXJfLmdldFZpZXdDb250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uZ2V0TmFtZWRFbGVtZW50SW5Db21wb25lbnRWaWV3IiwiQXBwVmlld01hbmFnZXJfLmdldENvbXBvbmVudCIsIkFwcFZpZXdNYW5hZ2VyXy5jcmVhdGVSb290SG9zdFZpZXciLCJBcHBWaWV3TWFuYWdlcl8uZGVzdHJveVJvb3RIb3N0VmlldyIsIkFwcFZpZXdNYW5hZ2VyXy5jcmVhdGVFbWJlZGRlZFZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyXy5jcmVhdGVIb3N0Vmlld0luQ29udGFpbmVyIiwiQXBwVmlld01hbmFnZXJfLl9jcmVhdGVWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uX2F0dGFjaFJlbmRlclZpZXciLCJBcHBWaWV3TWFuYWdlcl8uZGVzdHJveVZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyXy5hdHRhY2hWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uZGV0YWNoVmlld0luQ29udGFpbmVyIiwiQXBwVmlld01hbmFnZXJfLl9jcmVhdGVNYWluVmlldyIsIkFwcFZpZXdNYW5hZ2VyXy5fY3JlYXRlUG9vbGVkVmlldyIsIkFwcFZpZXdNYW5hZ2VyXy5fZGVzdHJveVBvb2xlZFZpZXciLCJBcHBWaWV3TWFuYWdlcl8uX2Rlc3Ryb3lWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlcl8uX3ZpZXdEZWh5ZHJhdGVSZWN1cnNlIiwiQXBwVmlld01hbmFnZXJVdGlscyIsIkFwcFZpZXdNYW5hZ2VyVXRpbHMuY29uc3RydWN0b3IiLCJBcHBWaWV3TWFuYWdlclV0aWxzLmdldENvbXBvbmVudEluc3RhbmNlIiwiQXBwVmlld01hbmFnZXJVdGlscy5jcmVhdGVWaWV3IiwiQXBwVmlld01hbmFnZXJVdGlscy5oeWRyYXRlUm9vdEhvc3RWaWV3IiwiQXBwVmlld01hbmFnZXJVdGlscy5hdHRhY2hWaWV3SW5Db250YWluZXIiLCJBcHBWaWV3TWFuYWdlclV0aWxzLmRldGFjaFZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyVXRpbHMuaHlkcmF0ZVZpZXdJbkNvbnRhaW5lciIsIkFwcFZpZXdNYW5hZ2VyVXRpbHMuX2h5ZHJhdGVWaWV3IiwiQXBwVmlld01hbmFnZXJVdGlscy5fcG9wdWxhdGVWaWV3TG9jYWxzIiwiQXBwVmlld01hbmFnZXJVdGlscy5fc2V0VXBFdmVudEVtaXR0ZXJzIiwiQXBwVmlld01hbmFnZXJVdGlscy5kZWh5ZHJhdGVWaWV3IiwiRWxlbWVudFJlZiIsIkVsZW1lbnRSZWYuY29uc3RydWN0b3IiLCJFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQiLCJFbGVtZW50UmVmLnJlbmRlclZpZXciLCJFbGVtZW50UmVmXyIsIkVsZW1lbnRSZWZfLmNvbnN0cnVjdG9yIiwiRWxlbWVudFJlZl8ucmVuZGVyVmlldyIsIkVsZW1lbnRSZWZfLm5hdGl2ZUVsZW1lbnQiLCJUZW1wbGF0ZVJlZiIsIlRlbXBsYXRlUmVmLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVSZWZfIiwiVGVtcGxhdGVSZWZfLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVSZWZfLl9nZXRQcm90b1ZpZXciLCJUZW1wbGF0ZVJlZl8ucHJvdG9WaWV3UmVmIiwiVGVtcGxhdGVSZWZfLmhhc0xvY2FsIiwiQXBwVmlld1Bvb2wiLCJBcHBWaWV3UG9vbC5jb25zdHJ1Y3RvciIsIkFwcFZpZXdQb29sLmdldFZpZXciLCJBcHBWaWV3UG9vbC5yZXR1cm5WaWV3IiwiQXBwVmlld0xpc3RlbmVyIiwiQXBwVmlld0xpc3RlbmVyLmNvbnN0cnVjdG9yIiwiQXBwVmlld0xpc3RlbmVyLm9uVmlld0NyZWF0ZWQiLCJBcHBWaWV3TGlzdGVuZXIub25WaWV3RGVzdHJveWVkIiwiVmlld0NvbnRhaW5lclJlZiIsIlZpZXdDb250YWluZXJSZWYuY29uc3RydWN0b3IiLCJWaWV3Q29udGFpbmVyUmVmLmNsZWFyIiwiVmlld0NvbnRhaW5lclJlZi5sZW5ndGgiLCJWaWV3Q29udGFpbmVyUmVmXyIsIlZpZXdDb250YWluZXJSZWZfLmNvbnN0cnVjdG9yIiwiVmlld0NvbnRhaW5lclJlZl8uX2dldFZpZXdzIiwiVmlld0NvbnRhaW5lclJlZl8uZ2V0IiwiVmlld0NvbnRhaW5lclJlZl8ubGVuZ3RoIiwiVmlld0NvbnRhaW5lclJlZl8uY3JlYXRlRW1iZWRkZWRWaWV3IiwiVmlld0NvbnRhaW5lclJlZl8uY3JlYXRlSG9zdFZpZXciLCJWaWV3Q29udGFpbmVyUmVmXy5pbnNlcnQiLCJWaWV3Q29udGFpbmVyUmVmXy5pbmRleE9mIiwiVmlld0NvbnRhaW5lclJlZl8ucmVtb3ZlIiwiVmlld0NvbnRhaW5lclJlZl8uZGV0YWNoIiwiaGFzTGlmZWN5Y2xlSG9vayIsIkxpZmVjeWNsZUhvb2tzIiwiUXVlcnlMaXN0IiwiUXVlcnlMaXN0LmNvbnN0cnVjdG9yIiwiUXVlcnlMaXN0LmNoYW5nZXMiLCJRdWVyeUxpc3QubGVuZ3RoIiwiUXVlcnlMaXN0LmZpcnN0IiwiUXVlcnlMaXN0Lmxhc3QiLCJRdWVyeUxpc3QubWFwIiwiUXVlcnlMaXN0LmZpbHRlciIsIlF1ZXJ5TGlzdC5yZWR1Y2UiLCJRdWVyeUxpc3QudG9BcnJheSIsIlF1ZXJ5TGlzdFtnZXRTeW1ib2xJdGVyYXRvcigpXSIsIlF1ZXJ5TGlzdC50b1N0cmluZyIsIlF1ZXJ5TGlzdC5yZXNldCIsIlF1ZXJ5TGlzdC5ub3RpZnlPbkNoYW5nZXMiLCJFdmVudENvbmZpZyIsIkV2ZW50Q29uZmlnLmNvbnN0cnVjdG9yIiwiRXZlbnRDb25maWcucGFyc2UiLCJFdmVudENvbmZpZy5nZXRGdWxsTmFtZSIsIl9pc0RpcmVjdGl2ZU1ldGFkYXRhIiwiRGlyZWN0aXZlUmVzb2x2ZXIiLCJEaXJlY3RpdmVSZXNvbHZlci5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZVJlc29sdmVyLnJlc29sdmUiLCJEaXJlY3RpdmVSZXNvbHZlci5fbWVyZ2VXaXRoUHJvcGVydHlNZXRhZGF0YSIsIkRpcmVjdGl2ZVJlc29sdmVyLl9tZXJnZSIsIlZpZXdSZXNvbHZlciIsIlZpZXdSZXNvbHZlci5jb25zdHJ1Y3RvciIsIlZpZXdSZXNvbHZlci5yZXNvbHZlIiwiVmlld1Jlc29sdmVyLl9yZXNvbHZlIiwiVmlld1Jlc29sdmVyLl90aHJvd01peGluZ1ZpZXdBbmRDb21wb25lbnQiLCJfaXNQaXBlTWV0YWRhdGEiLCJQaXBlUmVzb2x2ZXIiLCJQaXBlUmVzb2x2ZXIuY29uc3RydWN0b3IiLCJQaXBlUmVzb2x2ZXIucmVzb2x2ZSIsIkNvbXBpbGVkSG9zdFRlbXBsYXRlIiwiQ29tcGlsZWRIb3N0VGVtcGxhdGUuY29uc3RydWN0b3IiLCJDb21waWxlZENvbXBvbmVudFRlbXBsYXRlIiwiQ29tcGlsZWRDb21wb25lbnRUZW1wbGF0ZS5jb25zdHJ1Y3RvciIsIlRleHRDbWQiLCJUZXh0Q21kLmNvbnN0cnVjdG9yIiwiVGV4dENtZC52aXNpdCIsIk5nQ29udGVudENtZCIsIk5nQ29udGVudENtZC5jb25zdHJ1Y3RvciIsIk5nQ29udGVudENtZC52aXNpdCIsIklCZWdpbkVsZW1lbnRDbWQiLCJJQmVnaW5FbGVtZW50Q21kLmNvbnN0cnVjdG9yIiwiSUJlZ2luRWxlbWVudENtZC52YXJpYWJsZU5hbWVBbmRWYWx1ZXMiLCJJQmVnaW5FbGVtZW50Q21kLmV2ZW50VGFyZ2V0QW5kTmFtZXMiLCJJQmVnaW5FbGVtZW50Q21kLmRpcmVjdGl2ZXMiLCJCZWdpbkVsZW1lbnRDbWQiLCJCZWdpbkVsZW1lbnRDbWQuY29uc3RydWN0b3IiLCJCZWdpbkVsZW1lbnRDbWQudmlzaXQiLCJFbmRFbGVtZW50Q21kIiwiRW5kRWxlbWVudENtZC5jb25zdHJ1Y3RvciIsIkVuZEVsZW1lbnRDbWQudmlzaXQiLCJCZWdpbkNvbXBvbmVudENtZCIsIkJlZ2luQ29tcG9uZW50Q21kLmNvbnN0cnVjdG9yIiwiQmVnaW5Db21wb25lbnRDbWQudGVtcGxhdGVJZCIsIkJlZ2luQ29tcG9uZW50Q21kLnZpc2l0IiwiRW5kQ29tcG9uZW50Q21kIiwiRW5kQ29tcG9uZW50Q21kLmNvbnN0cnVjdG9yIiwiRW5kQ29tcG9uZW50Q21kLnZpc2l0IiwiRW1iZWRkZWRUZW1wbGF0ZUNtZCIsIkVtYmVkZGVkVGVtcGxhdGVDbWQuY29uc3RydWN0b3IiLCJFbWJlZGRlZFRlbXBsYXRlQ21kLnZpc2l0IiwidmlzaXRBbGxDb21tYW5kcyIsIkNvbnNvbGUiLCJDb25zb2xlLmNvbnN0cnVjdG9yIiwiQ29uc29sZS5sb2ciLCJEZWJ1Z0VsZW1lbnQiLCJEZWJ1Z0VsZW1lbnQuY29uc3RydWN0b3IiLCJEZWJ1Z0VsZW1lbnQuY29tcG9uZW50SW5zdGFuY2UiLCJEZWJ1Z0VsZW1lbnQubmF0aXZlRWxlbWVudCIsIkRlYnVnRWxlbWVudC5lbGVtZW50UmVmIiwiRGVidWdFbGVtZW50LmNoaWxkcmVuIiwiRGVidWdFbGVtZW50LmNvbXBvbmVudFZpZXdDaGlsZHJlbiIsIkRlYnVnRWxlbWVudC5xdWVyeSIsIkRlYnVnRWxlbWVudC5xdWVyeUFsbCIsIkRlYnVnRWxlbWVudF8iLCJEZWJ1Z0VsZW1lbnRfLmNvbnN0cnVjdG9yIiwiRGVidWdFbGVtZW50Xy5jb21wb25lbnRJbnN0YW5jZSIsIkRlYnVnRWxlbWVudF8ubmF0aXZlRWxlbWVudCIsIkRlYnVnRWxlbWVudF8uZWxlbWVudFJlZiIsIkRlYnVnRWxlbWVudF8uZ2V0RGlyZWN0aXZlSW5zdGFuY2UiLCJEZWJ1Z0VsZW1lbnRfLmNoaWxkcmVuIiwiRGVidWdFbGVtZW50Xy5jb21wb25lbnRWaWV3Q2hpbGRyZW4iLCJEZWJ1Z0VsZW1lbnRfLnRyaWdnZXJFdmVudEhhbmRsZXIiLCJEZWJ1Z0VsZW1lbnRfLmhhc0RpcmVjdGl2ZSIsIkRlYnVnRWxlbWVudF8uaW5qZWN0IiwiRGVidWdFbGVtZW50Xy5nZXRMb2NhbCIsIkRlYnVnRWxlbWVudF8uX2dldENoaWxkRWxlbWVudHMiLCJpbnNwZWN0RWxlbWVudCIsImFzTmF0aXZlRWxlbWVudHMiLCJTY29wZSIsIlNjb3BlLmNvbnN0cnVjdG9yIiwiU2NvcGUuYWxsIiwiU2NvcGUubGlnaHQiLCJTY29wZS52aWV3IiwiX3JlZmxlY3RvciIsIk9ic2VydmFibGVTdHJhdGVneSIsIk9ic2VydmFibGVTdHJhdGVneS5jb25zdHJ1Y3RvciIsIk9ic2VydmFibGVTdHJhdGVneS5jcmVhdGVTdWJzY3JpcHRpb24iLCJPYnNlcnZhYmxlU3RyYXRlZ3kuZGlzcG9zZSIsIk9ic2VydmFibGVTdHJhdGVneS5vbkRlc3Ryb3kiLCJQcm9taXNlU3RyYXRlZ3kiLCJQcm9taXNlU3RyYXRlZ3kuY29uc3RydWN0b3IiLCJQcm9taXNlU3RyYXRlZ3kuY3JlYXRlU3Vic2NyaXB0aW9uIiwiUHJvbWlzZVN0cmF0ZWd5LmRpc3Bvc2UiLCJQcm9taXNlU3RyYXRlZ3kub25EZXN0cm95IiwiQXN5bmNQaXBlIiwiQXN5bmNQaXBlLmNvbnN0cnVjdG9yIiwiQXN5bmNQaXBlLm5nT25EZXN0cm95IiwiQXN5bmNQaXBlLnRyYW5zZm9ybSIsIkFzeW5jUGlwZS5fc3Vic2NyaWJlIiwiQXN5bmNQaXBlLl9zZWxlY3RTdHJhdGVneSIsIkFzeW5jUGlwZS5fZGlzcG9zZSIsIkFzeW5jUGlwZS5fdXBkYXRlTGF0ZXN0VmFsdWUiLCJJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9uIiwiSW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbi5jb25zdHJ1Y3RvciIsIlVwcGVyQ2FzZVBpcGUiLCJVcHBlckNhc2VQaXBlLmNvbnN0cnVjdG9yIiwiVXBwZXJDYXNlUGlwZS50cmFuc2Zvcm0iLCJMb3dlckNhc2VQaXBlIiwiTG93ZXJDYXNlUGlwZS5jb25zdHJ1Y3RvciIsIkxvd2VyQ2FzZVBpcGUudHJhbnNmb3JtIiwiSnNvblBpcGUiLCJKc29uUGlwZS5jb25zdHJ1Y3RvciIsIkpzb25QaXBlLnRyYW5zZm9ybSIsIlNsaWNlUGlwZSIsIlNsaWNlUGlwZS5jb25zdHJ1Y3RvciIsIlNsaWNlUGlwZS50cmFuc2Zvcm0iLCJTbGljZVBpcGUuc3VwcG9ydHMiLCJEYXRlUGlwZSIsIkRhdGVQaXBlLmNvbnN0cnVjdG9yIiwiRGF0ZVBpcGUudHJhbnNmb3JtIiwiRGF0ZVBpcGUuc3VwcG9ydHMiLCJOdW1iZXJGb3JtYXRTdHlsZSIsIk51bWJlckZvcm1hdHRlciIsIk51bWJlckZvcm1hdHRlci5jb25zdHJ1Y3RvciIsIk51bWJlckZvcm1hdHRlci5mb3JtYXQiLCJkaWdpdENvbmRpdGlvbiIsIm5hbWVDb25kaXRpb24iLCJleHRyYWN0Q29tcG9uZW50cyIsIkRhdGVGb3JtYXR0ZXIiLCJEYXRlRm9ybWF0dGVyLmNvbnN0cnVjdG9yIiwiRGF0ZUZvcm1hdHRlci5mb3JtYXQiLCJOdW1iZXJQaXBlIiwiTnVtYmVyUGlwZS5jb25zdHJ1Y3RvciIsIk51bWJlclBpcGUuX2Zvcm1hdCIsIkRlY2ltYWxQaXBlIiwiRGVjaW1hbFBpcGUuY29uc3RydWN0b3IiLCJEZWNpbWFsUGlwZS50cmFuc2Zvcm0iLCJQZXJjZW50UGlwZSIsIlBlcmNlbnRQaXBlLmNvbnN0cnVjdG9yIiwiUGVyY2VudFBpcGUudHJhbnNmb3JtIiwiQ3VycmVuY3lQaXBlIiwiQ3VycmVuY3lQaXBlLmNvbnN0cnVjdG9yIiwiQ3VycmVuY3lQaXBlLnRyYW5zZm9ybSIsIk5nQ2xhc3MiLCJOZ0NsYXNzLmNvbnN0cnVjdG9yIiwiTmdDbGFzcy5pbml0aWFsQ2xhc3NlcyIsIk5nQ2xhc3MucmF3Q2xhc3MiLCJOZ0NsYXNzLm5nRG9DaGVjayIsIk5nQ2xhc3MubmdPbkRlc3Ryb3kiLCJOZ0NsYXNzLl9jbGVhbnVwQ2xhc3NlcyIsIk5nQ2xhc3MuX2FwcGx5S2V5VmFsdWVDaGFuZ2VzIiwiTmdDbGFzcy5fYXBwbHlJdGVyYWJsZUNoYW5nZXMiLCJOZ0NsYXNzLl9hcHBseUluaXRpYWxDbGFzc2VzIiwiTmdDbGFzcy5fYXBwbHlDbGFzc2VzIiwiTmdDbGFzcy5fdG9nZ2xlQ2xhc3MiLCJOZ0ZvciIsIk5nRm9yLmNvbnN0cnVjdG9yIiwiTmdGb3IubmdGb3JPZiIsIk5nRm9yLm5nRm9yVGVtcGxhdGUiLCJOZ0Zvci5uZ0RvQ2hlY2siLCJOZ0Zvci5fYXBwbHlDaGFuZ2VzIiwiTmdGb3IuX3BlclZpZXdDaGFuZ2UiLCJOZ0Zvci5fYnVsa1JlbW92ZSIsIk5nRm9yLl9idWxrSW5zZXJ0IiwiUmVjb3JkVmlld1R1cGxlIiwiUmVjb3JkVmlld1R1cGxlLmNvbnN0cnVjdG9yIiwiTmdJZiIsIk5nSWYuY29uc3RydWN0b3IiLCJOZ0lmLm5nSWYiLCJOZ1N0eWxlIiwiTmdTdHlsZS5jb25zdHJ1Y3RvciIsIk5nU3R5bGUucmF3U3R5bGUiLCJOZ1N0eWxlLm5nRG9DaGVjayIsIk5nU3R5bGUuX2FwcGx5Q2hhbmdlcyIsIk5nU3R5bGUuX3NldFN0eWxlIiwiU3dpdGNoVmlldyIsIlN3aXRjaFZpZXcuY29uc3RydWN0b3IiLCJTd2l0Y2hWaWV3LmNyZWF0ZSIsIlN3aXRjaFZpZXcuZGVzdHJveSIsIk5nU3dpdGNoIiwiTmdTd2l0Y2guY29uc3RydWN0b3IiLCJOZ1N3aXRjaC5uZ1N3aXRjaCIsIk5nU3dpdGNoLl9vbldoZW5WYWx1ZUNoYW5nZWQiLCJOZ1N3aXRjaC5fZW1wdHlBbGxBY3RpdmVWaWV3cyIsIk5nU3dpdGNoLl9hY3RpdmF0ZVZpZXdzIiwiTmdTd2l0Y2guX3JlZ2lzdGVyVmlldyIsIk5nU3dpdGNoLl9kZXJlZ2lzdGVyVmlldyIsIk5nU3dpdGNoV2hlbiIsIk5nU3dpdGNoV2hlbi5jb25zdHJ1Y3RvciIsIk5nU3dpdGNoV2hlbi5uZ1N3aXRjaFdoZW4iLCJOZ1N3aXRjaERlZmF1bHQiLCJOZ1N3aXRjaERlZmF1bHQuY29uc3RydWN0b3IiLCJpc0NvbnRyb2wiLCJfZmluZCIsInRvT2JzZXJ2YWJsZSIsIkFic3RyYWN0Q29udHJvbCIsIkFic3RyYWN0Q29udHJvbC5jb25zdHJ1Y3RvciIsIkFic3RyYWN0Q29udHJvbC52YWx1ZSIsIkFic3RyYWN0Q29udHJvbC5zdGF0dXMiLCJBYnN0cmFjdENvbnRyb2wudmFsaWQiLCJBYnN0cmFjdENvbnRyb2wuZXJyb3JzIiwiQWJzdHJhY3RDb250cm9sLnByaXN0aW5lIiwiQWJzdHJhY3RDb250cm9sLmRpcnR5IiwiQWJzdHJhY3RDb250cm9sLnRvdWNoZWQiLCJBYnN0cmFjdENvbnRyb2wudW50b3VjaGVkIiwiQWJzdHJhY3RDb250cm9sLnZhbHVlQ2hhbmdlcyIsIkFic3RyYWN0Q29udHJvbC5zdGF0dXNDaGFuZ2VzIiwiQWJzdHJhY3RDb250cm9sLnBlbmRpbmciLCJBYnN0cmFjdENvbnRyb2wubWFya0FzVG91Y2hlZCIsIkFic3RyYWN0Q29udHJvbC5tYXJrQXNEaXJ0eSIsIkFic3RyYWN0Q29udHJvbC5tYXJrQXNQZW5kaW5nIiwiQWJzdHJhY3RDb250cm9sLnNldFBhcmVudCIsIkFic3RyYWN0Q29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5IiwiQWJzdHJhY3RDb250cm9sLl9ydW5WYWxpZGF0b3IiLCJBYnN0cmFjdENvbnRyb2wuX3J1bkFzeW5jVmFsaWRhdG9yIiwiQWJzdHJhY3RDb250cm9sLl9jYW5jZWxFeGlzdGluZ1N1YnNjcmlwdGlvbiIsIkFic3RyYWN0Q29udHJvbC5zZXRFcnJvcnMiLCJBYnN0cmFjdENvbnRyb2wuZmluZCIsIkFic3RyYWN0Q29udHJvbC5nZXRFcnJvciIsIkFic3RyYWN0Q29udHJvbC5oYXNFcnJvciIsIkFic3RyYWN0Q29udHJvbC5fdXBkYXRlQ29udHJvbHNFcnJvcnMiLCJBYnN0cmFjdENvbnRyb2wuX2luaXRPYnNlcnZhYmxlcyIsIkFic3RyYWN0Q29udHJvbC5fY2FsY3VsYXRlU3RhdHVzIiwiQ29udHJvbCIsIkNvbnRyb2wuY29uc3RydWN0b3IiLCJDb250cm9sLnVwZGF0ZVZhbHVlIiwiQ29udHJvbC5fdXBkYXRlVmFsdWUiLCJDb250cm9sLl9hbnlDb250cm9sc0hhdmVTdGF0dXMiLCJDb250cm9sLnJlZ2lzdGVyT25DaGFuZ2UiLCJDb250cm9sR3JvdXAiLCJDb250cm9sR3JvdXAuY29uc3RydWN0b3IiLCJDb250cm9sR3JvdXAuYWRkQ29udHJvbCIsIkNvbnRyb2xHcm91cC5yZW1vdmVDb250cm9sIiwiQ29udHJvbEdyb3VwLmluY2x1ZGUiLCJDb250cm9sR3JvdXAuZXhjbHVkZSIsIkNvbnRyb2xHcm91cC5jb250YWlucyIsIkNvbnRyb2xHcm91cC5fc2V0UGFyZW50Rm9yQ29udHJvbHMiLCJDb250cm9sR3JvdXAuX3VwZGF0ZVZhbHVlIiwiQ29udHJvbEdyb3VwLl9hbnlDb250cm9sc0hhdmVTdGF0dXMiLCJDb250cm9sR3JvdXAuX3JlZHVjZVZhbHVlIiwiQ29udHJvbEdyb3VwLl9yZWR1Y2VDaGlsZHJlbiIsIkNvbnRyb2xHcm91cC5faW5jbHVkZWQiLCJDb250cm9sQXJyYXkiLCJDb250cm9sQXJyYXkuY29uc3RydWN0b3IiLCJDb250cm9sQXJyYXkuYXQiLCJDb250cm9sQXJyYXkucHVzaCIsIkNvbnRyb2xBcnJheS5pbnNlcnQiLCJDb250cm9sQXJyYXkucmVtb3ZlQXQiLCJDb250cm9sQXJyYXkubGVuZ3RoIiwiQ29udHJvbEFycmF5Ll91cGRhdGVWYWx1ZSIsIkNvbnRyb2xBcnJheS5fYW55Q29udHJvbHNIYXZlU3RhdHVzIiwiQ29udHJvbEFycmF5Ll9zZXRQYXJlbnRGb3JDb250cm9scyIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5jb25zdHJ1Y3RvciIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5jb250cm9sIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnZhbHVlIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnZhbGlkIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLmVycm9ycyIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5wcmlzdGluZSIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5kaXJ0eSIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS50b3VjaGVkIiwiQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLnVudG91Y2hlZCIsIkFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS5wYXRoIiwiQ29udHJvbENvbnRhaW5lciIsIkNvbnRyb2xDb250YWluZXIuY29uc3RydWN0b3IiLCJDb250cm9sQ29udGFpbmVyLmZvcm1EaXJlY3RpdmUiLCJDb250cm9sQ29udGFpbmVyLnBhdGgiLCJOZ0NvbnRyb2xOYW1lIiwiTmdDb250cm9sTmFtZS5jb25zdHJ1Y3RvciIsIk5nQ29udHJvbE5hbWUubmdPbkNoYW5nZXMiLCJOZ0NvbnRyb2xOYW1lLm5nT25EZXN0cm95IiwiTmdDb250cm9sTmFtZS52aWV3VG9Nb2RlbFVwZGF0ZSIsIk5nQ29udHJvbE5hbWUucGF0aCIsIk5nQ29udHJvbE5hbWUuZm9ybURpcmVjdGl2ZSIsIk5nQ29udHJvbE5hbWUudmFsaWRhdG9yIiwiTmdDb250cm9sTmFtZS5hc3luY1ZhbGlkYXRvciIsIk5nQ29udHJvbE5hbWUuY29udHJvbCIsIk5nQ29udHJvbCIsIk5nQ29udHJvbC5jb25zdHJ1Y3RvciIsIk5nQ29udHJvbC52YWxpZGF0b3IiLCJOZ0NvbnRyb2wuYXN5bmNWYWxpZGF0b3IiLCJjb250cm9sUGF0aCIsInNldFVwQ29udHJvbCIsInNldFVwQ29udHJvbEdyb3VwIiwiX3Rocm93RXJyb3IiLCJjb21wb3NlVmFsaWRhdG9ycyIsImNvbXBvc2VBc3luY1ZhbGlkYXRvcnMiLCJpc1Byb3BlcnR5VXBkYXRlZCIsInNlbGVjdFZhbHVlQWNjZXNzb3IiLCJWYWxpZGF0b3JzIiwiVmFsaWRhdG9ycy5jb25zdHJ1Y3RvciIsIlZhbGlkYXRvcnMucmVxdWlyZWQiLCJWYWxpZGF0b3JzLm1pbkxlbmd0aCIsIlZhbGlkYXRvcnMubWF4TGVuZ3RoIiwiVmFsaWRhdG9ycy5udWxsVmFsaWRhdG9yIiwiVmFsaWRhdG9ycy5jb21wb3NlIiwiVmFsaWRhdG9ycy5jb21wb3NlQXN5bmMiLCJfY29udmVydFRvUHJvbWlzZSIsIl9leGVjdXRlVmFsaWRhdG9ycyIsIl9tZXJnZUVycm9ycyIsIkRlZmF1bHRWYWx1ZUFjY2Vzc29yIiwiRGVmYXVsdFZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJEZWZhdWx0VmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlIiwiRGVmYXVsdFZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPbkNoYW5nZSIsIkRlZmF1bHRWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiTnVtYmVyVmFsdWVBY2Nlc3NvciIsIk51bWJlclZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJOdW1iZXJWYWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUiLCJOdW1iZXJWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25DaGFuZ2UiLCJOdW1iZXJWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3NvciIsIkNoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUiLCJDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25DaGFuZ2UiLCJDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiTmdTZWxlY3RPcHRpb24iLCJOZ1NlbGVjdE9wdGlvbi5jb25zdHJ1Y3RvciIsIlNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yIiwiU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IiLCJTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlIiwiU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IucmVnaXN0ZXJPbkNoYW5nZSIsIlNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLnJlZ2lzdGVyT25Ub3VjaGVkIiwiU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IuX3VwZGF0ZVZhbHVlV2hlbkxpc3RPZk9wdGlvbnNDaGFuZ2VzIiwibm9ybWFsaXplVmFsaWRhdG9yIiwiTmdGb3JtQ29udHJvbCIsIk5nRm9ybUNvbnRyb2wuY29uc3RydWN0b3IiLCJOZ0Zvcm1Db250cm9sLm5nT25DaGFuZ2VzIiwiTmdGb3JtQ29udHJvbC5wYXRoIiwiTmdGb3JtQ29udHJvbC52YWxpZGF0b3IiLCJOZ0Zvcm1Db250cm9sLmFzeW5jVmFsaWRhdG9yIiwiTmdGb3JtQ29udHJvbC5jb250cm9sIiwiTmdGb3JtQ29udHJvbC52aWV3VG9Nb2RlbFVwZGF0ZSIsIk5nRm9ybUNvbnRyb2wuX2lzQ29udHJvbENoYW5nZWQiLCJOZ01vZGVsIiwiTmdNb2RlbC5jb25zdHJ1Y3RvciIsIk5nTW9kZWwubmdPbkNoYW5nZXMiLCJOZ01vZGVsLmNvbnRyb2wiLCJOZ01vZGVsLnBhdGgiLCJOZ01vZGVsLnZhbGlkYXRvciIsIk5nTW9kZWwuYXN5bmNWYWxpZGF0b3IiLCJOZ01vZGVsLnZpZXdUb01vZGVsVXBkYXRlIiwiTmdDb250cm9sR3JvdXAiLCJOZ0NvbnRyb2xHcm91cC5jb25zdHJ1Y3RvciIsIk5nQ29udHJvbEdyb3VwLm5nT25Jbml0IiwiTmdDb250cm9sR3JvdXAubmdPbkRlc3Ryb3kiLCJOZ0NvbnRyb2xHcm91cC5jb250cm9sIiwiTmdDb250cm9sR3JvdXAucGF0aCIsIk5nQ29udHJvbEdyb3VwLmZvcm1EaXJlY3RpdmUiLCJOZ0NvbnRyb2xHcm91cC52YWxpZGF0b3IiLCJOZ0NvbnRyb2xHcm91cC5hc3luY1ZhbGlkYXRvciIsIk5nRm9ybU1vZGVsIiwiTmdGb3JtTW9kZWwuY29uc3RydWN0b3IiLCJOZ0Zvcm1Nb2RlbC5uZ09uQ2hhbmdlcyIsIk5nRm9ybU1vZGVsLmZvcm1EaXJlY3RpdmUiLCJOZ0Zvcm1Nb2RlbC5jb250cm9sIiwiTmdGb3JtTW9kZWwucGF0aCIsIk5nRm9ybU1vZGVsLmFkZENvbnRyb2wiLCJOZ0Zvcm1Nb2RlbC5nZXRDb250cm9sIiwiTmdGb3JtTW9kZWwucmVtb3ZlQ29udHJvbCIsIk5nRm9ybU1vZGVsLmFkZENvbnRyb2xHcm91cCIsIk5nRm9ybU1vZGVsLnJlbW92ZUNvbnRyb2xHcm91cCIsIk5nRm9ybU1vZGVsLmdldENvbnRyb2xHcm91cCIsIk5nRm9ybU1vZGVsLnVwZGF0ZU1vZGVsIiwiTmdGb3JtTW9kZWwub25TdWJtaXQiLCJOZ0Zvcm1Nb2RlbC5fdXBkYXRlRG9tVmFsdWUiLCJOZ0Zvcm0iLCJOZ0Zvcm0uY29uc3RydWN0b3IiLCJOZ0Zvcm0uZm9ybURpcmVjdGl2ZSIsIk5nRm9ybS5jb250cm9sIiwiTmdGb3JtLnBhdGgiLCJOZ0Zvcm0uY29udHJvbHMiLCJOZ0Zvcm0uYWRkQ29udHJvbCIsIk5nRm9ybS5nZXRDb250cm9sIiwiTmdGb3JtLnJlbW92ZUNvbnRyb2wiLCJOZ0Zvcm0uYWRkQ29udHJvbEdyb3VwIiwiTmdGb3JtLnJlbW92ZUNvbnRyb2xHcm91cCIsIk5nRm9ybS5nZXRDb250cm9sR3JvdXAiLCJOZ0Zvcm0udXBkYXRlTW9kZWwiLCJOZ0Zvcm0ub25TdWJtaXQiLCJOZ0Zvcm0uX2ZpbmRDb250YWluZXIiLCJOZ0NvbnRyb2xTdGF0dXMiLCJOZ0NvbnRyb2xTdGF0dXMuY29uc3RydWN0b3IiLCJOZ0NvbnRyb2xTdGF0dXMubmdDbGFzc1VudG91Y2hlZCIsIk5nQ29udHJvbFN0YXR1cy5uZ0NsYXNzVG91Y2hlZCIsIk5nQ29udHJvbFN0YXR1cy5uZ0NsYXNzUHJpc3RpbmUiLCJOZ0NvbnRyb2xTdGF0dXMubmdDbGFzc0RpcnR5IiwiTmdDb250cm9sU3RhdHVzLm5nQ2xhc3NWYWxpZCIsIk5nQ29udHJvbFN0YXR1cy5uZ0NsYXNzSW52YWxpZCIsIlJlcXVpcmVkVmFsaWRhdG9yIiwiUmVxdWlyZWRWYWxpZGF0b3IuY29uc3RydWN0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IuY29uc3RydWN0b3IiLCJNaW5MZW5ndGhWYWxpZGF0b3IudmFsaWRhdGUiLCJNYXhMZW5ndGhWYWxpZGF0b3IiLCJNYXhMZW5ndGhWYWxpZGF0b3IuY29uc3RydWN0b3IiLCJNYXhMZW5ndGhWYWxpZGF0b3IudmFsaWRhdGUiLCJGb3JtQnVpbGRlciIsIkZvcm1CdWlsZGVyLmNvbnN0cnVjdG9yIiwiRm9ybUJ1aWxkZXIuZ3JvdXAiLCJGb3JtQnVpbGRlci5jb250cm9sIiwiRm9ybUJ1aWxkZXIuYXJyYXkiLCJGb3JtQnVpbGRlci5fcmVkdWNlQ29udHJvbHMiLCJGb3JtQnVpbGRlci5fY3JlYXRlQ29udHJvbCIsImNyZWF0ZVdpdGhvdXRQYWNrYWdlUHJlZml4IiwiVXJsUmVzb2x2ZXIiLCJVcmxSZXNvbHZlci5jb25zdHJ1Y3RvciIsIlVybFJlc29sdmVyLnJlc29sdmUiLCJnZXRVcmxTY2hlbWUiLCJfYnVpbGRGcm9tRW5jb2RlZFBhcnRzIiwiX0NvbXBvbmVudEluZGV4IiwiX3NwbGl0IiwiX3JlbW92ZURvdFNlZ21lbnRzIiwiX2pvaW5BbmRDYW5vbmljYWxpemVQYXRoIiwiX3Jlc29sdmVVcmwiLCJYSFIiLCJYSFIuY29uc3RydWN0b3IiLCJYSFIuZ2V0IiwiX2NyZWF0ZUNoYW5nZURldGVjdG9yR2VuQ29uZmlnIiwiUnVudGltZUNvbXBpbGVyIiwiUnVudGltZUNvbXBpbGVyLmNvbnN0cnVjdG9yIiwiUnVudGltZUNvbXBpbGVyXyIsIlJ1bnRpbWVDb21waWxlcl8uY29uc3RydWN0b3IiLCJSdW50aW1lQ29tcGlsZXJfLmNvbXBpbGVJbkhvc3QiLCJSdW50aW1lQ29tcGlsZXJfLmNsZWFyQ2FjaGUiLCJUZW1wbGF0ZUNvbXBpbGVyIiwiVGVtcGxhdGVDb21waWxlci5jb25zdHJ1Y3RvciIsIlRlbXBsYXRlQ29tcGlsZXIubm9ybWFsaXplRGlyZWN0aXZlTWV0YWRhdGEiLCJUZW1wbGF0ZUNvbXBpbGVyLmNvbXBpbGVIb3N0Q29tcG9uZW50UnVudGltZSIsIlRlbXBsYXRlQ29tcGlsZXIuY2xlYXJDYWNoZSIsIlRlbXBsYXRlQ29tcGlsZXIuX2NvbXBpbGVDb21wb25lbnRSdW50aW1lIiwiVGVtcGxhdGVDb21waWxlci5fY29tcGlsZUNvbW1hbmRzUnVudGltZSIsIlRlbXBsYXRlQ29tcGlsZXIuY29tcGlsZVRlbXBsYXRlc0NvZGVHZW4iLCJUZW1wbGF0ZUNvbXBpbGVyLmNvbXBpbGVTdHlsZXNoZWV0Q29kZUdlbiIsIlRlbXBsYXRlQ29tcGlsZXIuX3Byb2Nlc3NUZW1wbGF0ZUNvZGVHZW4iLCJOb3JtYWxpemVkQ29tcG9uZW50V2l0aFZpZXdEaXJlY3RpdmVzIiwiTm9ybWFsaXplZENvbXBvbmVudFdpdGhWaWV3RGlyZWN0aXZlcy5jb25zdHJ1Y3RvciIsImFzc2VydENvbXBvbmVudCIsInRlbXBsYXRlVmFyaWFibGVOYW1lIiwidGVtcGxhdGVHZXR0ZXJOYW1lIiwidGVtcGxhdGVNb2R1bGVVcmwiLCJhZGRBbGwiLCJjb2RlR2VuQ29tcG9uZW50VGVtcGxhdGVGYWN0b3J5IiwicmVtb3ZlRHVwbGljYXRlcyIsIkNvbXBpbGVUeXBlTWV0YWRhdGEiLCJDb21waWxlVHlwZU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiQ29tcGlsZVR5cGVNZXRhZGF0YS5mcm9tSnNvbiIsIkNvbXBpbGVUeXBlTWV0YWRhdGEudG9Kc29uIiwiQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEiLCJDb21waWxlVGVtcGxhdGVNZXRhZGF0YS5jb25zdHJ1Y3RvciIsIkNvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhLmZyb21Kc29uIiwiQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEudG9Kc29uIiwiQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhIiwiQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLmNvbnN0cnVjdG9yIiwiQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLmNyZWF0ZSIsIkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YS5mcm9tSnNvbiIsIkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YS50b0pzb24iLCJjcmVhdGVIb3N0Q29tcG9uZW50TWV0YSIsIkNzc1NlbGVjdG9yIiwiQ3NzU2VsZWN0b3IuY29uc3RydWN0b3IiLCJDc3NTZWxlY3Rvci5wYXJzZSIsIkNzc1NlbGVjdG9yLmlzRWxlbWVudFNlbGVjdG9yIiwiQ3NzU2VsZWN0b3Iuc2V0RWxlbWVudCIsIkNzc1NlbGVjdG9yLmdldE1hdGNoaW5nRWxlbWVudFRlbXBsYXRlIiwiQ3NzU2VsZWN0b3IuYWRkQXR0cmlidXRlIiwiQ3NzU2VsZWN0b3IuYWRkQ2xhc3NOYW1lIiwiQ3NzU2VsZWN0b3IudG9TdHJpbmciLCJTZWxlY3Rvck1hdGNoZXIiLCJTZWxlY3Rvck1hdGNoZXIuY29uc3RydWN0b3IiLCJTZWxlY3Rvck1hdGNoZXIuY3JlYXRlTm90TWF0Y2hlciIsIlNlbGVjdG9yTWF0Y2hlci5hZGRTZWxlY3RhYmxlcyIsIlNlbGVjdG9yTWF0Y2hlci5fYWRkU2VsZWN0YWJsZSIsIlNlbGVjdG9yTWF0Y2hlci5fYWRkVGVybWluYWwiLCJTZWxlY3Rvck1hdGNoZXIuX2FkZFBhcnRpYWwiLCJTZWxlY3Rvck1hdGNoZXIubWF0Y2giLCJTZWxlY3Rvck1hdGNoZXIuX21hdGNoVGVybWluYWwiLCJTZWxlY3Rvck1hdGNoZXIuX21hdGNoUGFydGlhbCIsIlNlbGVjdG9yTGlzdENvbnRleHQiLCJTZWxlY3Rvckxpc3RDb250ZXh0LmNvbnN0cnVjdG9yIiwiU2VsZWN0b3JDb250ZXh0IiwiU2VsZWN0b3JDb250ZXh0LmNvbnN0cnVjdG9yIiwiU2VsZWN0b3JDb250ZXh0LmZpbmFsaXplIiwiZXNjYXBlU2luZ2xlUXVvdGVTdHJpbmciLCJlc2NhcGVEb3VibGVRdW90ZVN0cmluZyIsImVzY2FwZVN0cmluZyIsImNvZGVHZW5FeHBvcnRWYXJpYWJsZSIsImNvZGVHZW5Db25zdENvbnN0cnVjdG9yQ2FsbCIsImNvZGVHZW5WYWx1ZUZuIiwiY29kZUdlblRvU3RyaW5nIiwic3BsaXRBdENvbG9uIiwibW9kdWxlUmVmIiwiU291cmNlTW9kdWxlIiwiU291cmNlTW9kdWxlLmNvbnN0cnVjdG9yIiwiU291cmNlTW9kdWxlLmdldFNvdXJjZVdpdGhJbXBvcnRzIiwiU291cmNlRXhwcmVzc2lvbiIsIlNvdXJjZUV4cHJlc3Npb24uY29uc3RydWN0b3IiLCJTb3VyY2VFeHByZXNzaW9ucyIsIlNvdXJjZUV4cHJlc3Npb25zLmNvbnN0cnVjdG9yIiwiU291cmNlV2l0aEltcG9ydHMiLCJTb3VyY2VXaXRoSW1wb3J0cy5jb25zdHJ1Y3RvciIsIkNoYW5nZURldGVjdGlvbkNvbXBpbGVyIiwiQ2hhbmdlRGV0ZWN0aW9uQ29tcGlsZXIuY29uc3RydWN0b3IiLCJDaGFuZ2VEZXRlY3Rpb25Db21waWxlci5jb21waWxlQ29tcG9uZW50UnVudGltZSIsIkNoYW5nZURldGVjdGlvbkNvbXBpbGVyLl9jcmVhdGVDaGFuZ2VEZXRlY3RvckZhY3RvcnkiLCJDaGFuZ2VEZXRlY3Rpb25Db21waWxlci5jb21waWxlQ29tcG9uZW50Q29kZUdlbiIsImNyZWF0ZUNoYW5nZURldGVjdG9yRGVmaW5pdGlvbnMiLCJQcm90b1ZpZXdWaXNpdG9yIiwiUHJvdG9WaWV3VmlzaXRvci5jb25zdHJ1Y3RvciIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXRFbWJlZGRlZFRlbXBsYXRlIiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEVsZW1lbnQiLCJQcm90b1ZpZXdWaXNpdG9yLnZpc2l0TmdDb250ZW50IiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdFZhcmlhYmxlIiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEV2ZW50IiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEVsZW1lbnRQcm9wZXJ0eSIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXRBdHRyIiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdEJvdW5kVGV4dCIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXRUZXh0IiwiUHJvdG9WaWV3VmlzaXRvci52aXNpdERpcmVjdGl2ZSIsIlByb3RvVmlld1Zpc2l0b3IudmlzaXREaXJlY3RpdmVQcm9wZXJ0eSIsImNyZWF0ZUNoYW5nZURlZmluaXRpb25zIiwiX2NvbGxlY3ROZXN0ZWRQcm90b1ZpZXdzVmFyaWFibGVOYW1lcyIsIlRleHRBc3QiLCJUZXh0QXN0LmNvbnN0cnVjdG9yIiwiVGV4dEFzdC52aXNpdCIsIkJvdW5kVGV4dEFzdCIsIkJvdW5kVGV4dEFzdC5jb25zdHJ1Y3RvciIsIkJvdW5kVGV4dEFzdC52aXNpdCIsIkF0dHJBc3QiLCJBdHRyQXN0LmNvbnN0cnVjdG9yIiwiQXR0ckFzdC52aXNpdCIsIkJvdW5kRWxlbWVudFByb3BlcnR5QXN0IiwiQm91bmRFbGVtZW50UHJvcGVydHlBc3QuY29uc3RydWN0b3IiLCJCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdC52aXNpdCIsIkJvdW5kRXZlbnRBc3QiLCJCb3VuZEV2ZW50QXN0LmNvbnN0cnVjdG9yIiwiQm91bmRFdmVudEFzdC52aXNpdCIsIkJvdW5kRXZlbnRBc3QuZnVsbE5hbWUiLCJWYXJpYWJsZUFzdCIsIlZhcmlhYmxlQXN0LmNvbnN0cnVjdG9yIiwiVmFyaWFibGVBc3QudmlzaXQiLCJFbGVtZW50QXN0IiwiRWxlbWVudEFzdC5jb25zdHJ1Y3RvciIsIkVsZW1lbnRBc3QudmlzaXQiLCJFbGVtZW50QXN0LmlzQm91bmQiLCJFbGVtZW50QXN0LmdldENvbXBvbmVudCIsIkVtYmVkZGVkVGVtcGxhdGVBc3QiLCJFbWJlZGRlZFRlbXBsYXRlQXN0LmNvbnN0cnVjdG9yIiwiRW1iZWRkZWRUZW1wbGF0ZUFzdC52aXNpdCIsIkJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QiLCJCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LmNvbnN0cnVjdG9yIiwiQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdC52aXNpdCIsIkRpcmVjdGl2ZUFzdCIsIkRpcmVjdGl2ZUFzdC5jb25zdHJ1Y3RvciIsIkRpcmVjdGl2ZUFzdC52aXNpdCIsIk5nQ29udGVudEFzdCIsIk5nQ29udGVudEFzdC5jb25zdHJ1Y3RvciIsIk5nQ29udGVudEFzdC52aXNpdCIsIlByb3BlcnR5QmluZGluZ1R5cGUiLCJ0ZW1wbGF0ZVZpc2l0QWxsIiwiQ29kZWdlbiIsIkNvZGVnZW4uY29uc3RydWN0b3IiLCJDb2RlZ2VuLmdlbmVyYXRlIiwiQ29kZWdlbi50b1N0cmluZyIsIlN0eWxlQ29tcGlsZXIiLCJTdHlsZUNvbXBpbGVyLmNvbnN0cnVjdG9yIiwiU3R5bGVDb21waWxlci5jb21waWxlQ29tcG9uZW50UnVudGltZSIsIlN0eWxlQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudENvZGVHZW4iLCJTdHlsZUNvbXBpbGVyLmNvbXBpbGVTdHlsZXNoZWV0Q29kZUdlbiIsIlN0eWxlQ29tcGlsZXIuY2xlYXJDYWNoZSIsIlN0eWxlQ29tcGlsZXIuX2xvYWRTdHlsZXMiLCJTdHlsZUNvbXBpbGVyLl9zdHlsZUNvZGVHZW4iLCJTdHlsZUNvbXBpbGVyLl9zdHlsZU1vZHVsZSIsIlN0eWxlQ29tcGlsZXIuX3NoaW1JZk5lZWRlZCIsIlN0eWxlQ29tcGlsZXIuX2NyZWF0ZU1vZHVsZVVybCIsIlNoYWRvd0NzcyIsIlNoYWRvd0Nzcy5jb25zdHJ1Y3RvciIsIlNoYWRvd0Nzcy5zaGltQ3NzVGV4dCIsIlNoYWRvd0Nzcy5faW5zZXJ0RGlyZWN0aXZlcyIsIlNoYWRvd0Nzcy5faW5zZXJ0UG9seWZpbGxEaXJlY3RpdmVzSW5Dc3NUZXh0IiwiU2hhZG93Q3NzLl9pbnNlcnRQb2x5ZmlsbFJ1bGVzSW5Dc3NUZXh0IiwiU2hhZG93Q3NzLl9zY29wZUNzc1RleHQiLCJTaGFkb3dDc3MuX2V4dHJhY3RVbnNjb3BlZFJ1bGVzRnJvbUNzc1RleHQiLCJTaGFkb3dDc3MuX2NvbnZlcnRDb2xvbkhvc3QiLCJTaGFkb3dDc3MuX2NvbnZlcnRDb2xvbkhvc3RDb250ZXh0IiwiU2hhZG93Q3NzLl9jb252ZXJ0Q29sb25SdWxlIiwiU2hhZG93Q3NzLl9jb2xvbkhvc3RDb250ZXh0UGFydFJlcGxhY2VyIiwiU2hhZG93Q3NzLl9jb2xvbkhvc3RQYXJ0UmVwbGFjZXIiLCJTaGFkb3dDc3MuX2NvbnZlcnRTaGFkb3dET01TZWxlY3RvcnMiLCJTaGFkb3dDc3MuX3Njb3BlU2VsZWN0b3JzIiwiU2hhZG93Q3NzLl9zY29wZVNlbGVjdG9yIiwiU2hhZG93Q3NzLl9zZWxlY3Rvck5lZWRzU2NvcGluZyIsIlNoYWRvd0Nzcy5fbWFrZVNjb3BlTWF0Y2hlciIsIlNoYWRvd0Nzcy5fYXBwbHlTZWxlY3RvclNjb3BlIiwiU2hhZG93Q3NzLl9hcHBseVNpbXBsZVNlbGVjdG9yU2NvcGUiLCJTaGFkb3dDc3MuX2FwcGx5U3RyaWN0U2VsZWN0b3JTY29wZSIsIlNoYWRvd0Nzcy5faW5zZXJ0UG9seWZpbGxIb3N0SW5Dc3NUZXh0Iiwic3RyaXBDb21tZW50cyIsIkNzc1J1bGUiLCJDc3NSdWxlLmNvbnN0cnVjdG9yIiwicHJvY2Vzc1J1bGVzIiwiU3RyaW5nV2l0aEVzY2FwZWRCbG9ja3MiLCJTdHJpbmdXaXRoRXNjYXBlZEJsb2Nrcy5jb25zdHJ1Y3RvciIsImVzY2FwZUJsb2NrcyIsIlN0eWxlV2l0aEltcG9ydHMiLCJTdHlsZVdpdGhJbXBvcnRzLmNvbnN0cnVjdG9yIiwiaXNTdHlsZVVybFJlc29sdmFibGUiLCJleHRyYWN0U3R5bGVVcmxzIiwiZW5jYXBzdWxhdGVTdHlsZXMiLCJjcmVhdGVSZW5kZXJWaWV3IiwiQnVpbGRDb250ZXh0IiwiQnVpbGRDb250ZXh0LmNvbnN0cnVjdG9yIiwiQnVpbGRDb250ZXh0LmJ1aWxkIiwiQnVpbGRDb250ZXh0Ll9idWlsZCIsIkJ1aWxkQ29udGV4dC5lbnF1ZXVlQ29tcG9uZW50QnVpbGRlciIsIkJ1aWxkQ29udGV4dC5lbnF1ZXVlRnJhZ21lbnRCdWlsZGVyIiwiQnVpbGRDb250ZXh0LmVucXVldWVSb290QnVpbGRlciIsIkJ1aWxkQ29udGV4dC5jb25zdW1lSW5wbGFjZUVsZW1lbnQiLCJCdWlsZENvbnRleHQuYWRkRXZlbnRMaXN0ZW5lciIsImNyZWF0ZUV2ZW50SGFuZGxlciIsImNyZWF0ZUdsb2JhbEV2ZW50QWRkZXIiLCJSZW5kZXJWaWV3QnVpbGRlciIsIlJlbmRlclZpZXdCdWlsZGVyLmNvbnN0cnVjdG9yIiwiUmVuZGVyVmlld0J1aWxkZXIuYnVpbGQiLCJSZW5kZXJWaWV3QnVpbGRlci5wYXJlbnQiLCJSZW5kZXJWaWV3QnVpbGRlci52aXNpdFRleHQiLCJSZW5kZXJWaWV3QnVpbGRlci52aXNpdE5nQ29udGVudCIsIlJlbmRlclZpZXdCdWlsZGVyLnZpc2l0QmVnaW5FbGVtZW50IiwiUmVuZGVyVmlld0J1aWxkZXIudmlzaXRFbmRFbGVtZW50IiwiUmVuZGVyVmlld0J1aWxkZXIudmlzaXRCZWdpbkNvbXBvbmVudCIsIlJlbmRlclZpZXdCdWlsZGVyLnZpc2l0RW5kQ29tcG9uZW50IiwiUmVuZGVyVmlld0J1aWxkZXIudmlzaXRFbWJlZGRlZFRlbXBsYXRlIiwiUmVuZGVyVmlld0J1aWxkZXIuX2JlZ2luRWxlbWVudCIsIlJlbmRlclZpZXdCdWlsZGVyLl9lbmRFbGVtZW50IiwiUmVuZGVyVmlld0J1aWxkZXIuX2FkZENoaWxkIiwiQ29tcG9uZW50IiwiQ29tcG9uZW50LmNvbnN0cnVjdG9yIiwiQ29tcG9uZW50LmFkZENvbnRlbnROb2RlIiwiQ29tcG9uZW50LnByb2plY3QiLCJfc2hpbUNvbnRlbnRBdHRyaWJ1dGUiLCJfc2hpbUhvc3RBdHRyaWJ1dGUiLCJEZWZhdWx0UHJvdG9WaWV3UmVmIiwiRGVmYXVsdFByb3RvVmlld1JlZi5jb25zdHJ1Y3RvciIsIkRlZmF1bHRSZW5kZXJGcmFnbWVudFJlZiIsIkRlZmF1bHRSZW5kZXJGcmFnbWVudFJlZi5jb25zdHJ1Y3RvciIsIkRlZmF1bHRSZW5kZXJWaWV3IiwiRGVmYXVsdFJlbmRlclZpZXcuY29uc3RydWN0b3IiLCJEZWZhdWx0UmVuZGVyVmlldy5oeWRyYXRlIiwiRGVmYXVsdFJlbmRlclZpZXcuZGVoeWRyYXRlIiwiRGVmYXVsdFJlbmRlclZpZXcuc2V0RXZlbnREaXNwYXRjaGVyIiwiRGVmYXVsdFJlbmRlclZpZXcuZGlzcGF0Y2hSZW5kZXJFdmVudCIsIkNvbW1hbmRDb21waWxlciIsIkNvbW1hbmRDb21waWxlci5jb25zdHJ1Y3RvciIsIkNvbW1hbmRDb21waWxlci5jb21waWxlQ29tcG9uZW50UnVudGltZSIsIkNvbW1hbmRDb21waWxlci5jb21waWxlQ29tcG9uZW50Q29kZUdlbiIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeSIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jb25zdHJ1Y3RvciIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5fbWFwRGlyZWN0aXZlcyIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVUZXh0IiwiUnVudGltZUNvbW1hbmRGYWN0b3J5LmNyZWF0ZU5nQ29udGVudCIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkVsZW1lbnQiLCJSdW50aW1lQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW5kRWxlbWVudCIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkNvbXBvbmVudCIsIlJ1bnRpbWVDb21tYW5kRmFjdG9yeS5jcmVhdGVFbmRDb21wb25lbnQiLCJSdW50aW1lQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeSIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jb25zdHJ1Y3RvciIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVUZXh0IiwiQ29kZWdlbkNvbW1hbmRGYWN0b3J5LmNyZWF0ZU5nQ29udGVudCIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkVsZW1lbnQiLCJDb2RlZ2VuQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW5kRWxlbWVudCIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVCZWdpbkNvbXBvbmVudCIsIkNvZGVnZW5Db21tYW5kRmFjdG9yeS5jcmVhdGVFbmRDb21wb25lbnQiLCJDb2RlZ2VuQ29tbWFuZEZhY3RvcnkuY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZSIsInZpc2l0QW5kUmV0dXJuQ29udGV4dCIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvciIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci5jb25zdHJ1Y3RvciIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci5fcmVhZEF0dHJOYW1lQW5kVmFsdWVzIiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0TmdDb250ZW50IiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0RW1iZWRkZWRUZW1wbGF0ZSIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci52aXNpdEVsZW1lbnQiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXRWYXJpYWJsZSIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci52aXNpdEF0dHIiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXRCb3VuZFRleHQiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXRUZXh0IiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0RGlyZWN0aXZlIiwiQ29tbWFuZEJ1aWxkZXJWaXNpdG9yLnZpc2l0RXZlbnQiLCJDb21tYW5kQnVpbGRlclZpc2l0b3IudmlzaXREaXJlY3RpdmVQcm9wZXJ0eSIsIkNvbW1hbmRCdWlsZGVyVmlzaXRvci52aXNpdEVsZW1lbnRQcm9wZXJ0eSIsInJlbW92ZUtleVZhbHVlQXJyYXlEdXBsaWNhdGVzIiwia2V5VmFsdWVBcnJheVRvTWFwIiwibWFwVG9LZXlWYWx1ZUFycmF5IiwibWVyZ2VBdHRyaWJ1dGVWYWx1ZSIsIkRpcmVjdGl2ZUNvbnRleHQiLCJEaXJlY3RpdmVDb250ZXh0LmNvbnN0cnVjdG9yIiwiRXhwcmVzc2lvbiIsIkV4cHJlc3Npb24uY29uc3RydWN0b3IiLCJlc2NhcGVWYWx1ZSIsImNvZGVHZW5BcnJheSIsImNvZGVHZW5EaXJlY3RpdmVzQXJyYXkiLCJjb2RlR2VuVmlld0VuY2Fwc3VsYXRpb24iLCJUZW1wbGF0ZVBhcnNlRXJyb3IiLCJUZW1wbGF0ZVBhcnNlRXJyb3IuY29uc3RydWN0b3IiLCJUZW1wbGF0ZVBhcnNlciIsIlRlbXBsYXRlUGFyc2VyLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVQYXJzZXIucGFyc2UiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvciIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3JlcG9ydEVycm9yIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlSW50ZXJwb2xhdGlvbiIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZUFjdGlvbiIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZUJpbmRpbmciLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fcGFyc2VUZW1wbGF0ZUJpbmRpbmdzIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IudmlzaXRUZXh0IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IudmlzaXRBdHRyIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IudmlzaXRFbGVtZW50IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlSW5saW5lVGVtcGxhdGVCaW5kaW5nIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlQXR0ciIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9ub3JtYWxpemVBdHRyaWJ1dGVOYW1lIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlVmFyaWFibGUiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fcGFyc2VQcm9wZXJ0eSIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZVByb3BlcnR5SW50ZXJwb2xhdGlvbiIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZVByb3BlcnR5QXN0IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlQXNzaWdubWVudEV2ZW50IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX3BhcnNlRXZlbnQiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fcGFyc2VMaXRlcmFsQXR0ciIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9wYXJzZURpcmVjdGl2ZXMiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fY3JlYXRlRGlyZWN0aXZlQXN0cyIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9jcmVhdGVEaXJlY3RpdmVIb3N0UHJvcGVydHlBc3RzIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2NyZWF0ZURpcmVjdGl2ZUhvc3RFdmVudEFzdHMiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fY3JlYXRlRGlyZWN0aXZlUHJvcGVydHlBc3RzIiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2NyZWF0ZUVsZW1lbnRQcm9wZXJ0eUFzdHMiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2ZpbmRDb21wb25lbnREaXJlY3RpdmVOYW1lcyIsIlRlbXBsYXRlUGFyc2VWaXNpdG9yLl9hc3NlcnRPbmx5T25lQ29tcG9uZW50IiwiVGVtcGxhdGVQYXJzZVZpc2l0b3IuX2Fzc2VydE5vQ29tcG9uZW50c05vckVsZW1lbnRCaW5kaW5nc09uVGVtcGxhdGUiLCJUZW1wbGF0ZVBhcnNlVmlzaXRvci5fYXNzZXJ0QWxsRXZlbnRzUHVibGlzaGVkQnlEaXJlY3RpdmVzIiwiTm9uQmluZGFibGVWaXNpdG9yIiwiTm9uQmluZGFibGVWaXNpdG9yLmNvbnN0cnVjdG9yIiwiTm9uQmluZGFibGVWaXNpdG9yLnZpc2l0RWxlbWVudCIsIk5vbkJpbmRhYmxlVmlzaXRvci52aXNpdEF0dHIiLCJOb25CaW5kYWJsZVZpc2l0b3IudmlzaXRUZXh0IiwiQm91bmRFbGVtZW50T3JEaXJlY3RpdmVQcm9wZXJ0eSIsIkJvdW5kRWxlbWVudE9yRGlyZWN0aXZlUHJvcGVydHkuY29uc3RydWN0b3IiLCJzcGxpdENsYXNzZXMiLCJDb21wb25lbnQuY3JlYXRlIiwiQ29tcG9uZW50LmZpbmROZ0NvbnRlbnRJbmRleCIsImNyZWF0ZUVsZW1lbnRDc3NTZWxlY3RvciIsIkh0bWxUcmVlRXJyb3IiLCJIdG1sVHJlZUVycm9yLmNvbnN0cnVjdG9yIiwiSHRtbFRyZWVFcnJvci5jcmVhdGUiLCJIdG1sUGFyc2VUcmVlUmVzdWx0IiwiSHRtbFBhcnNlVHJlZVJlc3VsdC5jb25zdHJ1Y3RvciIsIkh0bWxQYXJzZXIiLCJIdG1sUGFyc2VyLmNvbnN0cnVjdG9yIiwiSHRtbFBhcnNlci5wYXJzZSIsIlRyZWVCdWlsZGVyIiwiVHJlZUJ1aWxkZXIuY29uc3RydWN0b3IiLCJUcmVlQnVpbGRlci5idWlsZCIsIlRyZWVCdWlsZGVyLl9hZHZhbmNlIiwiVHJlZUJ1aWxkZXIuX2FkdmFuY2VJZiIsIlRyZWVCdWlsZGVyLl9jb25zdW1lQ2RhdGEiLCJUcmVlQnVpbGRlci5fY29uc3VtZUNvbW1lbnQiLCJUcmVlQnVpbGRlci5fY29uc3VtZVRleHQiLCJUcmVlQnVpbGRlci5fY2xvc2VWb2lkRWxlbWVudCIsIlRyZWVCdWlsZGVyLl9jb25zdW1lU3RhcnRUYWciLCJUcmVlQnVpbGRlci5fcHVzaEVsZW1lbnQiLCJUcmVlQnVpbGRlci5fY29uc3VtZUVuZFRhZyIsIlRyZWVCdWlsZGVyLl9wb3BFbGVtZW50IiwiVHJlZUJ1aWxkZXIuX2NvbnN1bWVBdHRyIiwiVHJlZUJ1aWxkZXIuX2dldFBhcmVudEVsZW1lbnQiLCJUcmVlQnVpbGRlci5fYWRkVG9QYXJlbnQiLCJtZXJnZU5zQW5kTmFtZSIsImdldEVsZW1lbnRGdWxsTmFtZSIsIkh0bWxUZXh0QXN0IiwiSHRtbFRleHRBc3QuY29uc3RydWN0b3IiLCJIdG1sVGV4dEFzdC52aXNpdCIsIkh0bWxBdHRyQXN0IiwiSHRtbEF0dHJBc3QuY29uc3RydWN0b3IiLCJIdG1sQXR0ckFzdC52aXNpdCIsIkh0bWxFbGVtZW50QXN0IiwiSHRtbEVsZW1lbnRBc3QuY29uc3RydWN0b3IiLCJIdG1sRWxlbWVudEFzdC52aXNpdCIsImh0bWxWaXNpdEFsbCIsIkh0bWxUb2tlblR5cGUiLCJIdG1sVG9rZW4iLCJIdG1sVG9rZW4uY29uc3RydWN0b3IiLCJIdG1sVG9rZW5FcnJvciIsIkh0bWxUb2tlbkVycm9yLmNvbnN0cnVjdG9yIiwiSHRtbFRva2VuaXplUmVzdWx0IiwiSHRtbFRva2VuaXplUmVzdWx0LmNvbnN0cnVjdG9yIiwidG9rZW5pemVIdG1sIiwidW5leHBlY3RlZENoYXJhY3RlckVycm9yTXNnIiwidW5rbm93bkVudGl0eUVycm9yTXNnIiwiQ29udHJvbEZsb3dFcnJvciIsIkNvbnRyb2xGbG93RXJyb3IuY29uc3RydWN0b3IiLCJfSHRtbFRva2VuaXplciIsIl9IdG1sVG9rZW5pemVyLmNvbnN0cnVjdG9yIiwiX0h0bWxUb2tlbml6ZXIuX3Byb2Nlc3NDYXJyaWFnZVJldHVybnMiLCJfSHRtbFRva2VuaXplci50b2tlbml6ZSIsIl9IdG1sVG9rZW5pemVyLl9nZXRMb2NhdGlvbiIsIl9IdG1sVG9rZW5pemVyLl9iZWdpblRva2VuIiwiX0h0bWxUb2tlbml6ZXIuX2VuZFRva2VuIiwiX0h0bWxUb2tlbml6ZXIuX2NyZWF0ZUVycm9yIiwiX0h0bWxUb2tlbml6ZXIuX2FkdmFuY2UiLCJfSHRtbFRva2VuaXplci5fYXR0ZW1wdENoYXIiLCJfSHRtbFRva2VuaXplci5fcmVxdWlyZUNoYXIiLCJfSHRtbFRva2VuaXplci5fYXR0ZW1wdENoYXJzIiwiX0h0bWxUb2tlbml6ZXIuX3JlcXVpcmVDaGFycyIsIl9IdG1sVG9rZW5pemVyLl9hdHRlbXB0VW50aWxGbiIsIl9IdG1sVG9rZW5pemVyLl9yZXF1aXJlVW50aWxGbiIsIl9IdG1sVG9rZW5pemVyLl9hdHRlbXB0VW50aWxDaGFyIiwiX0h0bWxUb2tlbml6ZXIuX3JlYWRDaGFyIiwiX0h0bWxUb2tlbml6ZXIuX2RlY29kZUVudGl0eSIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lUmF3VGV4dCIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQ29tbWVudCIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQ2RhdGEiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZURvY1R5cGUiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVByZWZpeEFuZE5hbWUiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ09wZW4iLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVJhd1RleHRXaXRoVGFnQ2xvc2UiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ09wZW5TdGFydCIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQXR0cmlidXRlTmFtZSIsIl9IdG1sVG9rZW5pemVyLl9jb25zdW1lQXR0cmlidXRlVmFsdWUiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ09wZW5FbmQiLCJfSHRtbFRva2VuaXplci5fY29uc3VtZVRhZ0Nsb3NlIiwiX0h0bWxUb2tlbml6ZXIuX2NvbnN1bWVUZXh0IiwiX0h0bWxUb2tlbml6ZXIuX3NhdmVQb3NpdGlvbiIsIl9IdG1sVG9rZW5pemVyLl9yZXN0b3JlUG9zaXRpb24iLCJpc05vdFdoaXRlc3BhY2UiLCJpc05hbWVFbmQiLCJpc1ByZWZpeEVuZCIsImlzRGlnaXRFbnRpdHlFbmQiLCJpc05hbWVkRW50aXR5RW5kIiwiaXNUZXh0RW5kIiwiaXNBc2NpaUxldHRlciIsImlzQXNjaWlIZXhEaWdpdCIsIm1lcmdlVGV4dFRva2VucyIsIlBhcnNlTG9jYXRpb24iLCJQYXJzZUxvY2F0aW9uLmNvbnN0cnVjdG9yIiwiUGFyc2VMb2NhdGlvbi50b1N0cmluZyIsIlBhcnNlU291cmNlRmlsZSIsIlBhcnNlU291cmNlRmlsZS5jb25zdHJ1Y3RvciIsIlBhcnNlRXJyb3IiLCJQYXJzZUVycm9yLmNvbnN0cnVjdG9yIiwiUGFyc2VFcnJvci50b1N0cmluZyIsIlBhcnNlU291cmNlU3BhbiIsIlBhcnNlU291cmNlU3Bhbi5jb25zdHJ1Y3RvciIsIlBhcnNlU291cmNlU3Bhbi50b1N0cmluZyIsIkh0bWxUYWdDb250ZW50VHlwZSIsIkh0bWxUYWdEZWZpbml0aW9uIiwiSHRtbFRhZ0RlZmluaXRpb24uY29uc3RydWN0b3IiLCJIdG1sVGFnRGVmaW5pdGlvbi5yZXF1aXJlRXh0cmFQYXJlbnQiLCJIdG1sVGFnRGVmaW5pdGlvbi5pc0Nsb3NlZEJ5Q2hpbGQiLCJnZXRIdG1sVGFnRGVmaW5pdGlvbiIsInNwbGl0TnNOYW1lIiwiZ2V0TnNQcmVmaXgiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkuY29uc3RydWN0b3IiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkuaGFzUHJvcGVydHkiLCJFbGVtZW50U2NoZW1hUmVnaXN0cnkuZ2V0TWFwcGVkUHJvcE5hbWUiLCJwcmVwYXJzZUVsZW1lbnQiLCJQcmVwYXJzZWRFbGVtZW50VHlwZSIsIlByZXBhcnNlZEVsZW1lbnQiLCJQcmVwYXJzZWRFbGVtZW50LmNvbnN0cnVjdG9yIiwibm9ybWFsaXplTmdDb250ZW50U2VsZWN0IiwiVGVtcGxhdGVOb3JtYWxpemVyIiwiVGVtcGxhdGVOb3JtYWxpemVyLmNvbnN0cnVjdG9yIiwiVGVtcGxhdGVOb3JtYWxpemVyLm5vcm1hbGl6ZVRlbXBsYXRlIiwiVGVtcGxhdGVOb3JtYWxpemVyLm5vcm1hbGl6ZUxvYWRlZFRlbXBsYXRlIiwiVGVtcGxhdGVQcmVwYXJzZVZpc2l0b3IiLCJUZW1wbGF0ZVByZXBhcnNlVmlzaXRvci5jb25zdHJ1Y3RvciIsIlRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnZpc2l0RWxlbWVudCIsIlRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnZpc2l0QXR0ciIsIlRlbXBsYXRlUHJlcGFyc2VWaXNpdG9yLnZpc2l0VGV4dCIsIlJ1bnRpbWVNZXRhZGF0YVJlc29sdmVyIiwiUnVudGltZU1ldGFkYXRhUmVzb2x2ZXIuY29uc3RydWN0b3IiLCJSdW50aW1lTWV0YWRhdGFSZXNvbHZlci5nZXRNZXRhZGF0YSIsIlJ1bnRpbWVNZXRhZGF0YVJlc29sdmVyLmdldFZpZXdEaXJlY3RpdmVzTWV0YWRhdGEiLCJmbGF0dGVuRGlyZWN0aXZlcyIsImZsYXR0ZW5BcnJheSIsImlzVmFsaWREaXJlY3RpdmUiLCJjYWxjTW9kdWxlVXJsIiwiRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5IiwiRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5LmNvbnN0cnVjdG9yIiwiRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5Ll9nZXRQcm90b0VsZW1lbnQiLCJEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkuaGFzUHJvcGVydHkiLCJEb21FbGVtZW50U2NoZW1hUmVnaXN0cnkuZ2V0TWFwcGVkUHJvcE5hbWUiLCJzZXRSb290RG9tQWRhcHRlciIsIkRvbUFkYXB0ZXIiLCJEb21BZGFwdGVyLmNvbnN0cnVjdG9yIiwiYm9vdHN0cmFwIiwiQW5ndWxhckVudHJ5cG9pbnQiLCJBbmd1bGFyRW50cnlwb2ludC5jb25zdHJ1Y3RvciIsIl9leGNlcHRpb25IYW5kbGVyIiwiX2RvY3VtZW50IiwiaW5pdERvbUFkYXB0ZXIiLCJEb21FdmVudHNQbHVnaW4iLCJEb21FdmVudHNQbHVnaW4uY29uc3RydWN0b3IiLCJEb21FdmVudHNQbHVnaW4uc3VwcG9ydHMiLCJEb21FdmVudHNQbHVnaW4uYWRkRXZlbnRMaXN0ZW5lciIsIkRvbUV2ZW50c1BsdWdpbi5hZGRHbG9iYWxFdmVudExpc3RlbmVyIiwiRXZlbnRNYW5hZ2VyIiwiRXZlbnRNYW5hZ2VyLmNvbnN0cnVjdG9yIiwiRXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIiLCJFdmVudE1hbmFnZXIuYWRkR2xvYmFsRXZlbnRMaXN0ZW5lciIsIkV2ZW50TWFuYWdlci5nZXRab25lIiwiRXZlbnRNYW5hZ2VyLl9maW5kUGx1Z2luRm9yIiwiRXZlbnRNYW5hZ2VyUGx1Z2luIiwiRXZlbnRNYW5hZ2VyUGx1Z2luLmNvbnN0cnVjdG9yIiwiRXZlbnRNYW5hZ2VyUGx1Z2luLnN1cHBvcnRzIiwiRXZlbnRNYW5hZ2VyUGx1Z2luLmFkZEV2ZW50TGlzdGVuZXIiLCJFdmVudE1hbmFnZXJQbHVnaW4uYWRkR2xvYmFsRXZlbnRMaXN0ZW5lciIsIktleUV2ZW50c1BsdWdpbiIsIktleUV2ZW50c1BsdWdpbi5jb25zdHJ1Y3RvciIsIktleUV2ZW50c1BsdWdpbi5zdXBwb3J0cyIsIktleUV2ZW50c1BsdWdpbi5hZGRFdmVudExpc3RlbmVyIiwiS2V5RXZlbnRzUGx1Z2luLnBhcnNlRXZlbnROYW1lIiwiS2V5RXZlbnRzUGx1Z2luLmdldEV2ZW50RnVsbEtleSIsIktleUV2ZW50c1BsdWdpbi5ldmVudENhbGxiYWNrIiwiS2V5RXZlbnRzUGx1Z2luLl9ub3JtYWxpemVLZXkiLCJIYW1tZXJHZXN0dXJlc1BsdWdpbiIsIkhhbW1lckdlc3R1cmVzUGx1Z2luLmNvbnN0cnVjdG9yIiwiSGFtbWVyR2VzdHVyZXNQbHVnaW4uc3VwcG9ydHMiLCJIYW1tZXJHZXN0dXJlc1BsdWdpbi5hZGRFdmVudExpc3RlbmVyIiwiSGFtbWVyR2VzdHVyZXNQbHVnaW5Db21tb24iLCJIYW1tZXJHZXN0dXJlc1BsdWdpbkNvbW1vbi5jb25zdHJ1Y3RvciIsIkhhbW1lckdlc3R1cmVzUGx1Z2luQ29tbW9uLnN1cHBvcnRzIiwiRG9tUmVuZGVyZXIiLCJEb21SZW5kZXJlci5jb25zdHJ1Y3RvciIsIkRvbVJlbmRlcmVyLmdldE5hdGl2ZUVsZW1lbnRTeW5jIiwiRG9tUmVuZGVyZXIuZ2V0Um9vdE5vZGVzIiwiRG9tUmVuZGVyZXIuYXR0YWNoRnJhZ21lbnRBZnRlckZyYWdtZW50IiwiRG9tUmVuZGVyZXIuYW5pbWF0ZU5vZGVzRW50ZXIiLCJEb21SZW5kZXJlci5hdHRhY2hGcmFnbWVudEFmdGVyRWxlbWVudCIsIkRvbVJlbmRlcmVyLmh5ZHJhdGVWaWV3IiwiRG9tUmVuZGVyZXIuZGVoeWRyYXRlVmlldyIsIkRvbVJlbmRlcmVyLmNyZWF0ZVRlbXBsYXRlQW5jaG9yIiwiRG9tUmVuZGVyZXIuY3JlYXRlVGV4dCIsIkRvbVJlbmRlcmVyLmFwcGVuZENoaWxkIiwiRG9tUmVuZGVyZXIuc2V0RWxlbWVudFByb3BlcnR5IiwiRG9tUmVuZGVyZXIuc2V0RWxlbWVudEF0dHJpYnV0ZSIsIkRvbVJlbmRlcmVyLnNldEJpbmRpbmdEZWJ1Z0luZm8iLCJEb21SZW5kZXJlci5zZXRFbGVtZW50Q2xhc3MiLCJEb21SZW5kZXJlci5zZXRFbGVtZW50U3R5bGUiLCJEb21SZW5kZXJlci5pbnZva2VFbGVtZW50TWV0aG9kIiwiRG9tUmVuZGVyZXIuc2V0VGV4dCIsIkRvbVJlbmRlcmVyLnNldEV2ZW50RGlzcGF0Y2hlciIsIkRvbVJlbmRlcmVyXyIsIkRvbVJlbmRlcmVyXy5jb25zdHJ1Y3RvciIsIkRvbVJlbmRlcmVyXy5yZWdpc3RlckNvbXBvbmVudFRlbXBsYXRlIiwiRG9tUmVuZGVyZXJfLmNyZWF0ZVByb3RvVmlldyIsIkRvbVJlbmRlcmVyXy5yZXNvbHZlQ29tcG9uZW50VGVtcGxhdGUiLCJEb21SZW5kZXJlcl8uY3JlYXRlUm9vdEhvc3RWaWV3IiwiRG9tUmVuZGVyZXJfLmNyZWF0ZVZpZXciLCJEb21SZW5kZXJlcl8uX2NyZWF0ZVZpZXciLCJEb21SZW5kZXJlcl8uZGVzdHJveVZpZXciLCJEb21SZW5kZXJlcl8uYW5pbWF0ZU5vZGVFbnRlciIsIkRvbVJlbmRlcmVyXy5hbmltYXRlTm9kZUxlYXZlIiwiRG9tUmVuZGVyZXJfLmRldGFjaEZyYWdtZW50IiwiRG9tUmVuZGVyZXJfLmNyZWF0ZUVsZW1lbnQiLCJEb21SZW5kZXJlcl8ubWVyZ2VFbGVtZW50IiwiRG9tUmVuZGVyZXJfLl9zZXRBdHRyaWJ1dGVzIiwiRG9tUmVuZGVyZXJfLmNyZWF0ZVJvb3RDb250ZW50SW5zZXJ0aW9uUG9pbnQiLCJEb21SZW5kZXJlcl8uY3JlYXRlU2hhZG93Um9vdCIsIkRvbVJlbmRlcmVyXy5vbiIsIkRvbVJlbmRlcmVyXy5nbG9iYWxPbiIsInJlc29sdmVJbnRlcm5hbERvbVZpZXciLCJyZXNvbHZlSW50ZXJuYWxEb21GcmFnbWVudCIsIm1vdmVOb2Rlc0FmdGVyU2libGluZyIsImRlY29yYXRlUHJldmVudERlZmF1bHQiLCJzcGxpdE5hbWVzcGFjZSIsIkFuaW1hdGlvbkJ1aWxkZXIiLCJBbmltYXRpb25CdWlsZGVyLmNvbnN0cnVjdG9yIiwiQW5pbWF0aW9uQnVpbGRlci5jc3MiLCJDc3NBbmltYXRpb25CdWlsZGVyIiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5jb25zdHJ1Y3RvciIsIkNzc0FuaW1hdGlvbkJ1aWxkZXIuYWRkQW5pbWF0aW9uQ2xhc3MiLCJDc3NBbmltYXRpb25CdWlsZGVyLmFkZENsYXNzIiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5yZW1vdmVDbGFzcyIsIkNzc0FuaW1hdGlvbkJ1aWxkZXIuc2V0RHVyYXRpb24iLCJDc3NBbmltYXRpb25CdWlsZGVyLnNldERlbGF5IiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5zZXRTdHlsZXMiLCJDc3NBbmltYXRpb25CdWlsZGVyLnNldEZyb21TdHlsZXMiLCJDc3NBbmltYXRpb25CdWlsZGVyLnNldFRvU3R5bGVzIiwiQ3NzQW5pbWF0aW9uQnVpbGRlci5zdGFydCIsIkNzc0FuaW1hdGlvbk9wdGlvbnMiLCJDc3NBbmltYXRpb25PcHRpb25zLmNvbnN0cnVjdG9yIiwiQW5pbWF0aW9uIiwiQW5pbWF0aW9uLmNvbnN0cnVjdG9yIiwiQW5pbWF0aW9uLnRvdGFsVGltZSIsIkFuaW1hdGlvbi53YWl0IiwiQW5pbWF0aW9uLnNldHVwIiwiQW5pbWF0aW9uLnN0YXJ0IiwiQW5pbWF0aW9uLmFwcGx5U3R5bGVzIiwiQW5pbWF0aW9uLmFkZENsYXNzZXMiLCJBbmltYXRpb24ucmVtb3ZlQ2xhc3NlcyIsIkFuaW1hdGlvbi5hZGRFdmVudHMiLCJBbmltYXRpb24uaGFuZGxlQW5pbWF0aW9uRXZlbnQiLCJBbmltYXRpb24uaGFuZGxlQW5pbWF0aW9uQ29tcGxldGVkIiwiQW5pbWF0aW9uLm9uQ29tcGxldGUiLCJBbmltYXRpb24ucGFyc2VEdXJhdGlvblN0cmluZyIsIkFuaW1hdGlvbi5zdHJpcExldHRlcnMiLCJCcm93c2VyRGV0YWlscyIsIkJyb3dzZXJEZXRhaWxzLmNvbnN0cnVjdG9yIiwiQnJvd3NlckRldGFpbHMuZG9lc0VsYXBzZWRUaW1lSW5jbHVkZXNEZWxheSIsIkJyb3dzZXJEZXRhaWxzLnJhZiIsIlJhZlF1ZXVlIiwiUmFmUXVldWUuY29uc3RydWN0b3IiLCJSYWZRdWV1ZS5fcmFmIiwiUmFmUXVldWUuX25leHRGcmFtZSIsIlJhZlF1ZXVlLmNhbmNlbCIsIlNoYXJlZFN0eWxlc0hvc3QiLCJTaGFyZWRTdHlsZXNIb3N0LmNvbnN0cnVjdG9yIiwiU2hhcmVkU3R5bGVzSG9zdC5hZGRTdHlsZXMiLCJTaGFyZWRTdHlsZXNIb3N0Lm9uU3R5bGVzQWRkZWQiLCJTaGFyZWRTdHlsZXNIb3N0LmdldEFsbFN0eWxlcyIsIkRvbVNoYXJlZFN0eWxlc0hvc3QiLCJEb21TaGFyZWRTdHlsZXNIb3N0LmNvbnN0cnVjdG9yIiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5fYWRkU3R5bGVzVG9Ib3N0IiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5hZGRIb3N0IiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5yZW1vdmVIb3N0IiwiRG9tU2hhcmVkU3R5bGVzSG9zdC5vblN0eWxlc0FkZGVkIiwiQnJvd3NlckRvbUFkYXB0ZXIiLCJCcm93c2VyRG9tQWRhcHRlci5jb25zdHJ1Y3RvciIsIkJyb3dzZXJEb21BZGFwdGVyLnBhcnNlIiwiQnJvd3NlckRvbUFkYXB0ZXIubWFrZUN1cnJlbnQiLCJCcm93c2VyRG9tQWRhcHRlci5oYXNQcm9wZXJ0eSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFByb3BlcnR5IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0UHJvcGVydHkiLCJCcm93c2VyRG9tQWRhcHRlci5pbnZva2UiLCJCcm93c2VyRG9tQWRhcHRlci5sb2dFcnJvciIsIkJyb3dzZXJEb21BZGFwdGVyLmxvZyIsIkJyb3dzZXJEb21BZGFwdGVyLmxvZ0dyb3VwIiwiQnJvd3NlckRvbUFkYXB0ZXIubG9nR3JvdXBFbmQiLCJCcm93c2VyRG9tQWRhcHRlci5hdHRyVG9Qcm9wTWFwIiwiQnJvd3NlckRvbUFkYXB0ZXIucXVlcnkiLCJCcm93c2VyRG9tQWRhcHRlci5xdWVyeVNlbGVjdG9yIiwiQnJvd3NlckRvbUFkYXB0ZXIucXVlcnlTZWxlY3RvckFsbCIsIkJyb3dzZXJEb21BZGFwdGVyLm9uIiwiQnJvd3NlckRvbUFkYXB0ZXIub25BbmRDYW5jZWwiLCJCcm93c2VyRG9tQWRhcHRlci5kaXNwYXRjaEV2ZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlTW91c2VFdmVudCIsIkJyb3dzZXJEb21BZGFwdGVyLmNyZWF0ZUV2ZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIucHJldmVudERlZmF1bHQiLCJCcm93c2VyRG9tQWRhcHRlci5pc1ByZXZlbnRlZCIsIkJyb3dzZXJEb21BZGFwdGVyLmdldElubmVySFRNTCIsIkJyb3dzZXJEb21BZGFwdGVyLmdldE91dGVySFRNTCIsIkJyb3dzZXJEb21BZGFwdGVyLm5vZGVOYW1lIiwiQnJvd3NlckRvbUFkYXB0ZXIubm9kZVZhbHVlIiwiQnJvd3NlckRvbUFkYXB0ZXIudHlwZSIsIkJyb3dzZXJEb21BZGFwdGVyLmNvbnRlbnQiLCJCcm93c2VyRG9tQWRhcHRlci5maXJzdENoaWxkIiwiQnJvd3NlckRvbUFkYXB0ZXIubmV4dFNpYmxpbmciLCJCcm93c2VyRG9tQWRhcHRlci5wYXJlbnRFbGVtZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY2hpbGROb2RlcyIsIkJyb3dzZXJEb21BZGFwdGVyLmNoaWxkTm9kZXNBc0xpc3QiLCJCcm93c2VyRG9tQWRhcHRlci5jbGVhck5vZGVzIiwiQnJvd3NlckRvbUFkYXB0ZXIuYXBwZW5kQ2hpbGQiLCJCcm93c2VyRG9tQWRhcHRlci5yZW1vdmVDaGlsZCIsIkJyb3dzZXJEb21BZGFwdGVyLnJlcGxhY2VDaGlsZCIsIkJyb3dzZXJEb21BZGFwdGVyLnJlbW92ZSIsIkJyb3dzZXJEb21BZGFwdGVyLmluc2VydEJlZm9yZSIsIkJyb3dzZXJEb21BZGFwdGVyLmluc2VydEFsbEJlZm9yZSIsIkJyb3dzZXJEb21BZGFwdGVyLmluc2VydEFmdGVyIiwiQnJvd3NlckRvbUFkYXB0ZXIuc2V0SW5uZXJIVE1MIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VGV4dCIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFRleHQiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRWYWx1ZSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFZhbHVlIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0Q2hlY2tlZCIsIkJyb3dzZXJEb21BZGFwdGVyLnNldENoZWNrZWQiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVDb21tZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlVGVtcGxhdGUiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVFbGVtZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlRWxlbWVudE5TIiwiQnJvd3NlckRvbUFkYXB0ZXIuY3JlYXRlVGV4dE5vZGUiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVTY3JpcHRUYWciLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVTdHlsZUVsZW1lbnQiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVTaGFkb3dSb290IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0U2hhZG93Um9vdCIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEhvc3QiLCJCcm93c2VyRG9tQWRhcHRlci5jbG9uZSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRFbGVtZW50c0J5VGFnTmFtZSIsIkJyb3dzZXJEb21BZGFwdGVyLmNsYXNzTGlzdCIsIkJyb3dzZXJEb21BZGFwdGVyLmFkZENsYXNzIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVtb3ZlQ2xhc3MiLCJCcm93c2VyRG9tQWRhcHRlci5oYXNDbGFzcyIsIkJyb3dzZXJEb21BZGFwdGVyLnNldFN0eWxlIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVtb3ZlU3R5bGUiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRTdHlsZSIsIkJyb3dzZXJEb21BZGFwdGVyLmhhc1N0eWxlIiwiQnJvd3NlckRvbUFkYXB0ZXIudGFnTmFtZSIsIkJyb3dzZXJEb21BZGFwdGVyLmF0dHJpYnV0ZU1hcCIsIkJyb3dzZXJEb21BZGFwdGVyLmhhc0F0dHJpYnV0ZSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEF0dHJpYnV0ZSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldEF0dHJpYnV0ZSIsIkJyb3dzZXJEb21BZGFwdGVyLnNldEF0dHJpYnV0ZU5TIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVtb3ZlQXR0cmlidXRlIiwiQnJvd3NlckRvbUFkYXB0ZXIudGVtcGxhdGVBd2FyZVJvb3QiLCJCcm93c2VyRG9tQWRhcHRlci5jcmVhdGVIdG1sRG9jdW1lbnQiLCJCcm93c2VyRG9tQWRhcHRlci5kZWZhdWx0RG9jIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VGl0bGUiLCJCcm93c2VyRG9tQWRhcHRlci5zZXRUaXRsZSIsIkJyb3dzZXJEb21BZGFwdGVyLmVsZW1lbnRNYXRjaGVzIiwiQnJvd3NlckRvbUFkYXB0ZXIuaXNUZW1wbGF0ZUVsZW1lbnQiLCJCcm93c2VyRG9tQWRhcHRlci5pc1RleHROb2RlIiwiQnJvd3NlckRvbUFkYXB0ZXIuaXNDb21tZW50Tm9kZSIsIkJyb3dzZXJEb21BZGFwdGVyLmlzRWxlbWVudE5vZGUiLCJCcm93c2VyRG9tQWRhcHRlci5oYXNTaGFkb3dSb290IiwiQnJvd3NlckRvbUFkYXB0ZXIuaXNTaGFkb3dSb290IiwiQnJvd3NlckRvbUFkYXB0ZXIuaW1wb3J0SW50b0RvYyIsIkJyb3dzZXJEb21BZGFwdGVyLmFkb3B0Tm9kZSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEhyZWYiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRFdmVudEtleSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldEdsb2JhbEV2ZW50VGFyZ2V0IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0SGlzdG9yeSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldExvY2F0aW9uIiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0QmFzZUhyZWYiLCJCcm93c2VyRG9tQWRhcHRlci5yZXNldEJhc2VFbGVtZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VXNlckFnZW50IiwiQnJvd3NlckRvbUFkYXB0ZXIuc2V0RGF0YSIsIkJyb3dzZXJEb21BZGFwdGVyLmdldERhdGEiLCJCcm93c2VyRG9tQWRhcHRlci5nZXRDb21wdXRlZFN0eWxlIiwiQnJvd3NlckRvbUFkYXB0ZXIuc2V0R2xvYmFsVmFyIiwiQnJvd3NlckRvbUFkYXB0ZXIucmVxdWVzdEFuaW1hdGlvbkZyYW1lIiwiQnJvd3NlckRvbUFkYXB0ZXIuY2FuY2VsQW5pbWF0aW9uRnJhbWUiLCJCcm93c2VyRG9tQWRhcHRlci5wZXJmb3JtYW5jZU5vdyIsImdldEJhc2VFbGVtZW50SHJlZiIsInJlbGF0aXZlUGF0aCIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlciIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5jb25zdHJ1Y3RvciIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5nZXRYSFIiLCJHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIuZ2V0RGlzdHJpYnV0ZWROb2RlcyIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5yZXNvbHZlQW5kU2V0SHJlZiIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5zdXBwb3J0c0RPTUV2ZW50cyIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5zdXBwb3J0c05hdGl2ZVNoYWRvd0RPTSIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5nZXRBbmltYXRpb25QcmVmaXgiLCJHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIuZ2V0VHJhbnNpdGlvbkVuZCIsIkdlbmVyaWNCcm93c2VyRG9tQWRhcHRlci5zdXBwb3J0c0FuaW1hdGlvbiIsIlhIUkltcGwiLCJYSFJJbXBsLmNvbnN0cnVjdG9yIiwiWEhSSW1wbC5nZXQiLCJQdWJsaWNUZXN0YWJpbGl0eSIsIlB1YmxpY1Rlc3RhYmlsaXR5LmNvbnN0cnVjdG9yIiwiUHVibGljVGVzdGFiaWxpdHkuaXNTdGFibGUiLCJQdWJsaWNUZXN0YWJpbGl0eS53aGVuU3RhYmxlIiwiUHVibGljVGVzdGFiaWxpdHkuZmluZEJpbmRpbmdzIiwiUHVibGljVGVzdGFiaWxpdHkuZmluZFByb3ZpZGVycyIsIkJyb3dzZXJHZXRUZXN0YWJpbGl0eSIsIkJyb3dzZXJHZXRUZXN0YWJpbGl0eS5jb25zdHJ1Y3RvciIsIkJyb3dzZXJHZXRUZXN0YWJpbGl0eS5pbml0IiwiQnJvd3NlckdldFRlc3RhYmlsaXR5LmFkZFRvV2luZG93IiwiQnJvd3NlckdldFRlc3RhYmlsaXR5LmZpbmRUZXN0YWJpbGl0eUluVHJlZSIsInd0ZkluaXQiLCJUaXRsZSIsIlRpdGxlLmNvbnN0cnVjdG9yIiwiVGl0bGUuZ2V0VGl0bGUiLCJUaXRsZS5zZXRUaXRsZSIsIkJ5IiwiQnkuY29uc3RydWN0b3IiLCJCeS5hbGwiLCJCeS5jc3MiLCJCeS5kaXJlY3RpdmUiLCJfc2V0RWxlbWVudElkIiwiX2dldEVsZW1lbnRJZCIsImluc3BlY3ROYXRpdmVFbGVtZW50IiwiRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyIiwiRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyLmNvbnN0cnVjdG9yIiwiRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyLm9uVmlld0NyZWF0ZWQiLCJEZWJ1Z0VsZW1lbnRWaWV3TGlzdGVuZXIub25WaWV3RGVzdHJveWVkIiwiZW5hYmxlRGVidWdUb29scyIsImRpc2FibGVEZWJ1Z1Rvb2xzIiwiQW5ndWxhclRvb2xzIiwiQW5ndWxhclRvb2xzLmNvbnN0cnVjdG9yIiwiQW5ndWxhclByb2ZpbGVyIiwiQW5ndWxhclByb2ZpbGVyLmNvbnN0cnVjdG9yIiwiQW5ndWxhclByb2ZpbGVyLnRpbWVDaGFuZ2VEZXRlY3Rpb24iLCJodHRwUmVxdWVzdCIsIm1lcmdlT3B0aW9ucyIsIkh0dHAiLCJIdHRwLmNvbnN0cnVjdG9yIiwiSHR0cC5yZXF1ZXN0IiwiSHR0cC5nZXQiLCJIdHRwLnBvc3QiLCJIdHRwLnB1dCIsIkh0dHAuZGVsZXRlIiwiSHR0cC5wYXRjaCIsIkh0dHAuaGVhZCIsIkpzb25wIiwiSnNvbnAuY29uc3RydWN0b3IiLCJKc29ucC5yZXF1ZXN0IiwiQ29ubmVjdGlvbkJhY2tlbmQiLCJDb25uZWN0aW9uQmFja2VuZC5jb25zdHJ1Y3RvciIsIkNvbm5lY3Rpb24iLCJDb25uZWN0aW9uLmNvbnN0cnVjdG9yIiwiUmVxdWVzdCIsIlJlcXVlc3QuY29uc3RydWN0b3IiLCJSZXF1ZXN0LnRleHQiLCJIZWFkZXJzIiwiSGVhZGVycy5jb25zdHJ1Y3RvciIsIkhlYWRlcnMuZnJvbVJlc3BvbnNlSGVhZGVyU3RyaW5nIiwiSGVhZGVycy5hcHBlbmQiLCJIZWFkZXJzLmRlbGV0ZSIsIkhlYWRlcnMuZm9yRWFjaCIsIkhlYWRlcnMuZ2V0IiwiSGVhZGVycy5oYXMiLCJIZWFkZXJzLmtleXMiLCJIZWFkZXJzLnNldCIsIkhlYWRlcnMudmFsdWVzIiwiSGVhZGVycy50b0pTT04iLCJIZWFkZXJzLmdldEFsbCIsIkhlYWRlcnMuZW50cmllcyIsIm5vcm1hbGl6ZU1ldGhvZE5hbWUiLCJnZXRSZXNwb25zZVVSTCIsIlJlcXVlc3RNZXRob2QiLCJSZWFkeVN0YXRlIiwiUmVzcG9uc2VUeXBlIiwiUmVxdWVzdE9wdGlvbnMiLCJSZXF1ZXN0T3B0aW9ucy5jb25zdHJ1Y3RvciIsIlJlcXVlc3RPcHRpb25zLm1lcmdlIiwiQmFzZVJlcXVlc3RPcHRpb25zIiwiQmFzZVJlcXVlc3RPcHRpb25zLmNvbnN0cnVjdG9yIiwicGFyYW1QYXJzZXIiLCJVUkxTZWFyY2hQYXJhbXMiLCJVUkxTZWFyY2hQYXJhbXMuY29uc3RydWN0b3IiLCJVUkxTZWFyY2hQYXJhbXMuY2xvbmUiLCJVUkxTZWFyY2hQYXJhbXMuaGFzIiwiVVJMU2VhcmNoUGFyYW1zLmdldCIsIlVSTFNlYXJjaFBhcmFtcy5nZXRBbGwiLCJVUkxTZWFyY2hQYXJhbXMuc2V0IiwiVVJMU2VhcmNoUGFyYW1zLnNldEFsbCIsIlVSTFNlYXJjaFBhcmFtcy5hcHBlbmQiLCJVUkxTZWFyY2hQYXJhbXMuYXBwZW5kQWxsIiwiVVJMU2VhcmNoUGFyYW1zLnJlcGxhY2VBbGwiLCJVUkxTZWFyY2hQYXJhbXMudG9TdHJpbmciLCJVUkxTZWFyY2hQYXJhbXMuZGVsZXRlIiwiWEhSQ29ubmVjdGlvbiIsIlhIUkNvbm5lY3Rpb24uY29uc3RydWN0b3IiLCJYSFJCYWNrZW5kIiwiWEhSQmFja2VuZC5jb25zdHJ1Y3RvciIsIlhIUkJhY2tlbmQuY3JlYXRlQ29ubmVjdGlvbiIsIlJlc3BvbnNlIiwiUmVzcG9uc2UuY29uc3RydWN0b3IiLCJSZXNwb25zZS5ibG9iIiwiUmVzcG9uc2UuanNvbiIsIlJlc3BvbnNlLnRleHQiLCJSZXNwb25zZS5hcnJheUJ1ZmZlciIsIlJlc3BvbnNlT3B0aW9ucyIsIlJlc3BvbnNlT3B0aW9ucy5jb25zdHJ1Y3RvciIsIlJlc3BvbnNlT3B0aW9ucy5tZXJnZSIsIkJhc2VSZXNwb25zZU9wdGlvbnMiLCJCYXNlUmVzcG9uc2VPcHRpb25zLmNvbnN0cnVjdG9yIiwiQnJvd3NlclhociIsIkJyb3dzZXJYaHIuY29uc3RydWN0b3IiLCJCcm93c2VyWGhyLmJ1aWxkIiwiSlNPTlBDb25uZWN0aW9uIiwiSlNPTlBDb25uZWN0aW9uLmNvbnN0cnVjdG9yIiwiSlNPTlBDb25uZWN0aW9uXyIsIkpTT05QQ29ubmVjdGlvbl8uY29uc3RydWN0b3IiLCJKU09OUENvbm5lY3Rpb25fLmZpbmlzaGVkIiwiSlNPTlBCYWNrZW5kIiwiSlNPTlBCYWNrZW5kLmNvbnN0cnVjdG9yIiwiSlNPTlBCYWNrZW5kXyIsIkpTT05QQmFja2VuZF8uY29uc3RydWN0b3IiLCJKU09OUEJhY2tlbmRfLmNyZWF0ZUNvbm5lY3Rpb24iLCJfZ2V0SnNvbnBDb25uZWN0aW9ucyIsIkJyb3dzZXJKc29ucCIsIkJyb3dzZXJKc29ucC5jb25zdHJ1Y3RvciIsIkJyb3dzZXJKc29ucC5idWlsZCIsIkJyb3dzZXJKc29ucC5uZXh0UmVxdWVzdElEIiwiQnJvd3Nlckpzb25wLnJlcXVlc3RDYWxsYmFjayIsIkJyb3dzZXJKc29ucC5leHBvc2VDb25uZWN0aW9uIiwiQnJvd3Nlckpzb25wLnJlbW92ZUNvbm5lY3Rpb24iLCJCcm93c2VySnNvbnAuc2VuZCIsIkJyb3dzZXJKc29ucC5jbGVhbnVwIiwicm91dGVyRmFjdG9yeSIsInJvdXRlclByaW1hcnlDb21wb25lbnRGYWN0b3J5IiwiUm91dGVyIiwiUm91dGVyLmNvbnN0cnVjdG9yIiwiUm91dGVyLmNoaWxkUm91dGVyIiwiUm91dGVyLmF1eFJvdXRlciIsIlJvdXRlci5yZWdpc3RlclByaW1hcnlPdXRsZXQiLCJSb3V0ZXIucmVnaXN0ZXJBdXhPdXRsZXQiLCJSb3V0ZXIuaXNSb3V0ZUFjdGl2ZSIsIlJvdXRlci5jb25maWciLCJSb3V0ZXIubmF2aWdhdGUiLCJSb3V0ZXIubmF2aWdhdGVCeVVybCIsIlJvdXRlci5uYXZpZ2F0ZUJ5SW5zdHJ1Y3Rpb24iLCJSb3V0ZXIuX25hdmlnYXRlIiwiUm91dGVyLl9zZXR0bGVJbnN0cnVjdGlvbiIsIlJvdXRlci5fZW1pdE5hdmlnYXRpb25GaW5pc2giLCJSb3V0ZXIuX2FmdGVyUHJvbWlzZUZpbmlzaE5hdmlnYXRpbmciLCJSb3V0ZXIuX3JvdXRlckNhblJldXNlIiwiUm91dGVyLl9jYW5BY3RpdmF0ZSIsIlJvdXRlci5fcm91dGVyQ2FuRGVhY3RpdmF0ZSIsIlJvdXRlci5jb21taXQiLCJSb3V0ZXIuX3N0YXJ0TmF2aWdhdGluZyIsIlJvdXRlci5fZmluaXNoTmF2aWdhdGluZyIsIlJvdXRlci5zdWJzY3JpYmUiLCJSb3V0ZXIuZGVhY3RpdmF0ZSIsIlJvdXRlci5yZWNvZ25pemUiLCJSb3V0ZXIuX2dldEFuY2VzdG9ySW5zdHJ1Y3Rpb25zIiwiUm91dGVyLnJlbmF2aWdhdGUiLCJSb3V0ZXIuZ2VuZXJhdGUiLCJSb290Um91dGVyIiwiUm9vdFJvdXRlci5jb25zdHJ1Y3RvciIsIlJvb3RSb3V0ZXIuY29tbWl0IiwiUm9vdFJvdXRlci5kaXNwb3NlIiwiQ2hpbGRSb3V0ZXIiLCJDaGlsZFJvdXRlci5jb25zdHJ1Y3RvciIsIkNoaWxkUm91dGVyLm5hdmlnYXRlQnlVcmwiLCJDaGlsZFJvdXRlci5uYXZpZ2F0ZUJ5SW5zdHJ1Y3Rpb24iLCJjYW5BY3RpdmF0ZU9uZSIsIlJvdXRlUmVnaXN0cnkiLCJSb3V0ZVJlZ2lzdHJ5LmNvbnN0cnVjdG9yIiwiUm91dGVSZWdpc3RyeS5jb25maWciLCJSb3V0ZVJlZ2lzdHJ5LmNvbmZpZ0Zyb21Db21wb25lbnQiLCJSb3V0ZVJlZ2lzdHJ5LnJlY29nbml6ZSIsIlJvdXRlUmVnaXN0cnkuX3JlY29nbml6ZSIsIlJvdXRlUmVnaXN0cnkuX2F1eFJvdXRlc1RvVW5yZXNvbHZlZCIsIlJvdXRlUmVnaXN0cnkuZ2VuZXJhdGUiLCJSb3V0ZVJlZ2lzdHJ5Ll9nZW5lcmF0ZSIsIlJvdXRlUmVnaXN0cnkuaGFzUm91dGUiLCJSb3V0ZVJlZ2lzdHJ5LmdlbmVyYXRlRGVmYXVsdCIsInNwbGl0QW5kRmxhdHRlbkxpbmtQYXJhbXMiLCJtb3N0U3BlY2lmaWMiLCJhc3NlcnRUZXJtaW5hbENvbXBvbmVudCIsIlJvdXRlQ29uZmlnIiwiUm91dGVDb25maWcuY29uc3RydWN0b3IiLCJSb3V0ZSIsIlJvdXRlLmNvbnN0cnVjdG9yIiwiQXV4Um91dGUiLCJBdXhSb3V0ZS5jb25zdHJ1Y3RvciIsIkFzeW5jUm91dGUiLCJBc3luY1JvdXRlLmNvbnN0cnVjdG9yIiwiUmVkaXJlY3QiLCJSZWRpcmVjdC5jb25zdHJ1Y3RvciIsIlJvdXRlTWF0Y2giLCJSb3V0ZU1hdGNoLmNvbnN0cnVjdG9yIiwiUGF0aE1hdGNoIiwiUGF0aE1hdGNoLmNvbnN0cnVjdG9yIiwiUmVkaXJlY3RNYXRjaCIsIlJlZGlyZWN0TWF0Y2guY29uc3RydWN0b3IiLCJSZWRpcmVjdFJlY29nbml6ZXIiLCJSZWRpcmVjdFJlY29nbml6ZXIuY29uc3RydWN0b3IiLCJSZWRpcmVjdFJlY29nbml6ZXIucmVjb2duaXplIiwiUmVkaXJlY3RSZWNvZ25pemVyLmdlbmVyYXRlIiwiUm91dGVSZWNvZ25pemVyIiwiUm91dGVSZWNvZ25pemVyLmNvbnN0cnVjdG9yIiwiUm91dGVSZWNvZ25pemVyLnJlY29nbml6ZSIsIlJvdXRlUmVjb2duaXplci5nZW5lcmF0ZSIsIlJvdXRlUmVjb2duaXplci5nZW5lcmF0ZUNvbXBvbmVudFBhdGhWYWx1ZXMiLCJSb3V0ZVJlY29nbml6ZXIuX2dldEluc3RydWN0aW9uIiwiUm91dGVQYXJhbXMiLCJSb3V0ZVBhcmFtcy5jb25zdHJ1Y3RvciIsIlJvdXRlUGFyYW1zLmdldCIsIlJvdXRlRGF0YSIsIlJvdXRlRGF0YS5jb25zdHJ1Y3RvciIsIlJvdXRlRGF0YS5nZXQiLCJJbnN0cnVjdGlvbiIsIkluc3RydWN0aW9uLmNvbnN0cnVjdG9yIiwiSW5zdHJ1Y3Rpb24udXJsUGF0aCIsIkluc3RydWN0aW9uLnVybFBhcmFtcyIsIkluc3RydWN0aW9uLnNwZWNpZmljaXR5IiwiSW5zdHJ1Y3Rpb24udG9Sb290VXJsIiwiSW5zdHJ1Y3Rpb24uX3RvTm9uUm9vdFVybCIsIkluc3RydWN0aW9uLnRvVXJsUXVlcnkiLCJJbnN0cnVjdGlvbi5yZXBsYWNlQ2hpbGQiLCJJbnN0cnVjdGlvbi50b1VybFBhdGgiLCJJbnN0cnVjdGlvbi50b0xpbmtVcmwiLCJJbnN0cnVjdGlvbi5fdG9MaW5rVXJsIiwiSW5zdHJ1Y3Rpb24uX3N0cmluZ2lmeVBhdGhNYXRyaXhBdXhQcmVmaXhlZCIsIkluc3RydWN0aW9uLl9zdHJpbmdpZnlNYXRyaXhQYXJhbXMiLCJJbnN0cnVjdGlvbi5fc3RyaW5naWZ5UGF0aE1hdHJpeEF1eCIsIkluc3RydWN0aW9uLl9zdHJpbmdpZnlBdXgiLCJSZXNvbHZlZEluc3RydWN0aW9uIiwiUmVzb2x2ZWRJbnN0cnVjdGlvbi5jb25zdHJ1Y3RvciIsIlJlc29sdmVkSW5zdHJ1Y3Rpb24ucmVzb2x2ZUNvbXBvbmVudCIsIkRlZmF1bHRJbnN0cnVjdGlvbiIsIkRlZmF1bHRJbnN0cnVjdGlvbi5jb25zdHJ1Y3RvciIsIkRlZmF1bHRJbnN0cnVjdGlvbi5yZXNvbHZlQ29tcG9uZW50IiwiRGVmYXVsdEluc3RydWN0aW9uLnRvTGlua1VybCIsIkRlZmF1bHRJbnN0cnVjdGlvbi5fdG9MaW5rVXJsIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uLmNvbnN0cnVjdG9yIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uLnVybFBhdGgiLCJVbnJlc29sdmVkSW5zdHJ1Y3Rpb24udXJsUGFyYW1zIiwiVW5yZXNvbHZlZEluc3RydWN0aW9uLnJlc29sdmVDb21wb25lbnQiLCJSZWRpcmVjdEluc3RydWN0aW9uIiwiUmVkaXJlY3RJbnN0cnVjdGlvbi5jb25zdHJ1Y3RvciIsIkNvbXBvbmVudEluc3RydWN0aW9uIiwiQ29tcG9uZW50SW5zdHJ1Y3Rpb24uY29uc3RydWN0b3IiLCJUb3VjaE1hcCIsIlRvdWNoTWFwLmNvbnN0cnVjdG9yIiwiVG91Y2hNYXAuZ2V0IiwiVG91Y2hNYXAuZ2V0VW51c2VkIiwibm9ybWFsaXplU3RyaW5nIiwiQ29udGludWF0aW9uU2VnbWVudCIsIkNvbnRpbnVhdGlvblNlZ21lbnQuY29uc3RydWN0b3IiLCJDb250aW51YXRpb25TZWdtZW50LmdlbmVyYXRlIiwiQ29udGludWF0aW9uU2VnbWVudC5tYXRjaCIsIlN0YXRpY1NlZ21lbnQiLCJTdGF0aWNTZWdtZW50LmNvbnN0cnVjdG9yIiwiU3RhdGljU2VnbWVudC5tYXRjaCIsIlN0YXRpY1NlZ21lbnQuZ2VuZXJhdGUiLCJEeW5hbWljU2VnbWVudCIsIkR5bmFtaWNTZWdtZW50LmNvbnN0cnVjdG9yIiwiRHluYW1pY1NlZ21lbnQubWF0Y2giLCJEeW5hbWljU2VnbWVudC5nZW5lcmF0ZSIsIlN0YXJTZWdtZW50IiwiU3RhclNlZ21lbnQuY29uc3RydWN0b3IiLCJTdGFyU2VnbWVudC5tYXRjaCIsIlN0YXJTZWdtZW50LmdlbmVyYXRlIiwicGFyc2VQYXRoU3RyaW5nIiwicGF0aERzbEhhc2giLCJzcGxpdEJ5U2xhc2giLCJhc3NlcnRQYXRoIiwiUGF0aFJlY29nbml6ZXIiLCJQYXRoUmVjb2duaXplci5jb25zdHJ1Y3RvciIsIlBhdGhSZWNvZ25pemVyLnJlY29nbml6ZSIsIlBhdGhSZWNvZ25pemVyLmdlbmVyYXRlIiwiVXJsIiwiVXJsLmNvbnN0cnVjdG9yIiwiVXJsLnRvU3RyaW5nIiwiVXJsLnNlZ21lbnRUb1N0cmluZyIsIlVybC5fYXV4VG9TdHJpbmciLCJVcmwuX21hdHJpeFBhcmFtc1RvU3RyaW5nIiwiVXJsLl9jaGlsZFN0cmluZyIsIlJvb3RVcmwiLCJSb290VXJsLmNvbnN0cnVjdG9yIiwiUm9vdFVybC50b1N0cmluZyIsIlJvb3RVcmwuc2VnbWVudFRvU3RyaW5nIiwiUm9vdFVybC5fcXVlcnlQYXJhbXNUb1N0cmluZyIsInBhdGhTZWdtZW50c1RvVXJsIiwibWF0Y2hVcmxTZWdtZW50IiwiVXJsUGFyc2VyIiwiVXJsUGFyc2VyLmNvbnN0cnVjdG9yIiwiVXJsUGFyc2VyLnBlZWtTdGFydHNXaXRoIiwiVXJsUGFyc2VyLmNhcHR1cmUiLCJVcmxQYXJzZXIucGFyc2UiLCJVcmxQYXJzZXIucGFyc2VSb290IiwiVXJsUGFyc2VyLnBhcnNlU2VnbWVudCIsIlVybFBhcnNlci5wYXJzZVF1ZXJ5UGFyYW1zIiwiVXJsUGFyc2VyLnBhcnNlTWF0cml4UGFyYW1zIiwiVXJsUGFyc2VyLnBhcnNlUGFyYW0iLCJVcmxQYXJzZXIucGFyc2VBdXhpbGlhcnlSb3V0ZXMiLCJzZXJpYWxpemVQYXJhbXMiLCJDb21wb25lbnRSZWNvZ25pemVyIiwiQ29tcG9uZW50UmVjb2duaXplci5jb25zdHJ1Y3RvciIsIkNvbXBvbmVudFJlY29nbml6ZXIuY29uZmlnIiwiQ29tcG9uZW50UmVjb2duaXplci5fYXNzZXJ0Tm9IYXNoQ29sbGlzaW9uIiwiQ29tcG9uZW50UmVjb2duaXplci5yZWNvZ25pemUiLCJDb21wb25lbnRSZWNvZ25pemVyLnJlY29nbml6ZUF1eGlsaWFyeSIsIkNvbXBvbmVudFJlY29nbml6ZXIuaGFzUm91dGUiLCJDb21wb25lbnRSZWNvZ25pemVyLmNvbXBvbmVudExvYWRlZCIsIkNvbXBvbmVudFJlY29nbml6ZXIubG9hZENvbXBvbmVudCIsIkNvbXBvbmVudFJlY29nbml6ZXIuZ2VuZXJhdGUiLCJDb21wb25lbnRSZWNvZ25pemVyLmdlbmVyYXRlQXV4aWxpYXJ5IiwiQXN5bmNSb3V0ZUhhbmRsZXIiLCJBc3luY1JvdXRlSGFuZGxlci5jb25zdHJ1Y3RvciIsIkFzeW5jUm91dGVIYW5kbGVyLnJlc29sdmVDb21wb25lbnRUeXBlIiwiU3luY1JvdXRlSGFuZGxlciIsIlN5bmNSb3V0ZUhhbmRsZXIuY29uc3RydWN0b3IiLCJTeW5jUm91dGVIYW5kbGVyLnJlc29sdmVDb21wb25lbnRUeXBlIiwibm9ybWFsaXplUm91dGVDb25maWciLCJ3cmFwTG9hZGVyVG9SZWNvbmZpZ3VyZVJlZ2lzdHJ5IiwiYXNzZXJ0Q29tcG9uZW50RXhpc3RzIiwiTG9jYXRpb24iLCJMb2NhdGlvbi5jb25zdHJ1Y3RvciIsIkxvY2F0aW9uLnBhdGgiLCJMb2NhdGlvbi5ub3JtYWxpemUiLCJMb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwiLCJMb2NhdGlvbi5nbyIsIkxvY2F0aW9uLnJlcGxhY2VTdGF0ZSIsIkxvY2F0aW9uLmZvcndhcmQiLCJMb2NhdGlvbi5iYWNrIiwiTG9jYXRpb24uc3Vic2NyaWJlIiwiX3N0cmlwQmFzZUhyZWYiLCJzdHJpcEluZGV4SHRtbCIsInN0cmlwVHJhaWxpbmdTbGFzaCIsIkxvY2F0aW9uU3RyYXRlZ3kiLCJMb2NhdGlvblN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwibm9ybWFsaXplUXVlcnlQYXJhbXMiLCJqb2luV2l0aFNsYXNoIiwiZ2V0Q2FuQWN0aXZhdGVIb29rIiwiUm91dGVMaWZlY3ljbGVIb29rIiwiUm91dGVMaWZlY3ljbGVIb29rLmNvbnN0cnVjdG9yIiwiQ2FuQWN0aXZhdGUiLCJDYW5BY3RpdmF0ZS5jb25zdHJ1Y3RvciIsIlJvdXRlck91dGxldCIsIlJvdXRlck91dGxldC5jb25zdHJ1Y3RvciIsIlJvdXRlck91dGxldC5hY3RpdmF0ZSIsIlJvdXRlck91dGxldC5yZXVzZSIsIlJvdXRlck91dGxldC5kZWFjdGl2YXRlIiwiUm91dGVyT3V0bGV0LnJvdXRlckNhbkRlYWN0aXZhdGUiLCJSb3V0ZXJPdXRsZXQucm91dGVyQ2FuUmV1c2UiLCJSb3V0ZXJMaW5rIiwiUm91dGVyTGluay5jb25zdHJ1Y3RvciIsIlJvdXRlckxpbmsuaXNSb3V0ZUFjdGl2ZSIsIlJvdXRlckxpbmsucm91dGVQYXJhbXMiLCJSb3V0ZXJMaW5rLm9uQ2xpY2siLCJQbGF0Zm9ybUxvY2F0aW9uIiwiUGxhdGZvcm1Mb2NhdGlvbi5jb25zdHJ1Y3RvciIsIlBsYXRmb3JtTG9jYXRpb24uX2luaXQiLCJQbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSIsIlBsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZSIsIlBsYXRmb3JtTG9jYXRpb24ub25IYXNoQ2hhbmdlIiwiUGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZSIsIlBsYXRmb3JtTG9jYXRpb24uc2VhcmNoIiwiUGxhdGZvcm1Mb2NhdGlvbi5oYXNoIiwiUGxhdGZvcm1Mb2NhdGlvbi5wdXNoU3RhdGUiLCJQbGF0Zm9ybUxvY2F0aW9uLnJlcGxhY2VTdGF0ZSIsIlBsYXRmb3JtTG9jYXRpb24uZm9yd2FyZCIsIlBsYXRmb3JtTG9jYXRpb24uYmFjayIsIkhhc2hMb2NhdGlvblN0cmF0ZWd5IiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kuY29uc3RydWN0b3IiLCJIYXNoTG9jYXRpb25TdHJhdGVneS5vblBvcFN0YXRlIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kuZ2V0QmFzZUhyZWYiLCJIYXNoTG9jYXRpb25TdHJhdGVneS5wYXRoIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kucHJlcGFyZUV4dGVybmFsVXJsIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kucHVzaFN0YXRlIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kucmVwbGFjZVN0YXRlIiwiSGFzaExvY2F0aW9uU3RyYXRlZ3kuZm9yd2FyZCIsIkhhc2hMb2NhdGlvblN0cmF0ZWd5LmJhY2siLCJQYXRoTG9jYXRpb25TdHJhdGVneSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiUGF0aExvY2F0aW9uU3RyYXRlZ3kub25Qb3BTdGF0ZSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LmdldEJhc2VIcmVmIiwiUGF0aExvY2F0aW9uU3RyYXRlZ3kucHJlcGFyZUV4dGVybmFsVXJsIiwiUGF0aExvY2F0aW9uU3RyYXRlZ3kucGF0aCIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LnB1c2hTdGF0ZSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LnJlcGxhY2VTdGF0ZSIsIlBhdGhMb2NhdGlvblN0cmF0ZWd5LmZvcndhcmQiLCJQYXRoTG9jYXRpb25TdHJhdGVneS5iYWNrIiwiRml4ZWRQYXJ0IiwiRml4ZWRQYXJ0LmNvbnN0cnVjdG9yIiwiQXV4aWxpYXJ5U3RhcnQiLCJBdXhpbGlhcnlTdGFydC5jb25zdHJ1Y3RvciIsIkF1eGlsaWFyeUVuZCIsIkF1eGlsaWFyeUVuZC5jb25zdHJ1Y3RvciIsIlBhcmFtcyIsIlBhcmFtcy5jb25zdHJ1Y3RvciIsIlJvdXRlckxpbmtMZXhlciIsIlJvdXRlckxpbmtMZXhlci5jb25zdHJ1Y3RvciIsIlJvdXRlckxpbmtMZXhlci50b2tlbml6ZSIsIlJvdXRlckxpbmtMZXhlci5fcGFyc2VUb2tlbiIsIlJvdXRlckxpbmtMZXhlci5fcGFyc2VQYXJhbXMiLCJSb3V0ZXJMaW5rTGV4ZXIuX3BhcnNlRml4ZWRQYXJ0IiwiUm91dGVyTGlua0FzdEdlbmVyYXRvciIsIlJvdXRlckxpbmtBc3RHZW5lcmF0b3IuY29uc3RydWN0b3IiLCJSb3V0ZXJMaW5rQXN0R2VuZXJhdG9yLmdlbmVyYXRlIiwiUm91dGVyTGlua0FzdEdlbmVyYXRvci5fZ2VuQXV4aWxpYXJ5IiwiUm91dGVyTGlua0FzdFRyYW5zZm9ybWVyIiwiUm91dGVyTGlua0FzdFRyYW5zZm9ybWVyLmNvbnN0cnVjdG9yIiwiUm91dGVyTGlua0FzdFRyYW5zZm9ybWVyLnZpc2l0UXVvdGUiLCJwYXJzZVJvdXRlckxpbmtFeHByZXNzaW9uIiwiUm91dGVyTGlua1RyYW5zZm9ybSIsIlJvdXRlckxpbmtUcmFuc2Zvcm0uY29uc3RydWN0b3IiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0TmdDb250ZW50IiwiUm91dGVyTGlua1RyYW5zZm9ybS52aXNpdEVtYmVkZGVkVGVtcGxhdGUiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0RWxlbWVudCIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRWYXJpYWJsZSIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRFdmVudCIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRFbGVtZW50UHJvcGVydHkiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0QXR0ciIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXRCb3VuZFRleHQiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0VGV4dCIsIlJvdXRlckxpbmtUcmFuc2Zvcm0udmlzaXREaXJlY3RpdmUiLCJSb3V0ZXJMaW5rVHJhbnNmb3JtLnZpc2l0RGlyZWN0aXZlUHJvcGVydHkiLCJVcGdyYWRlQWRhcHRlciIsIlVwZ3JhZGVBZGFwdGVyLmNvbnN0cnVjdG9yIiwiVXBncmFkZUFkYXB0ZXIuZG93bmdyYWRlTmcyQ29tcG9uZW50IiwiVXBncmFkZUFkYXB0ZXIudXBncmFkZU5nMUNvbXBvbmVudCIsIlVwZ3JhZGVBZGFwdGVyLmJvb3RzdHJhcCIsIlVwZ3JhZGVBZGFwdGVyLmFkZFByb3ZpZGVyIiwiVXBncmFkZUFkYXB0ZXIudXBncmFkZU5nMVByb3ZpZGVyIiwiVXBncmFkZUFkYXB0ZXIuZG93bmdyYWRlTmcyUHJvdmlkZXIiLCJVcGdyYWRlQWRhcHRlci5jb21waWxlTmcyQ29tcG9uZW50cyIsIm5nMUNvbXBvbmVudERpcmVjdGl2ZSIsIm5nMUNvbXBvbmVudERpcmVjdGl2ZS5kaXJlY3RpdmVGYWN0b3J5IiwiVXBncmFkZUFkYXB0ZXJSZWYiLCJVcGdyYWRlQWRhcHRlclJlZi5jb25zdHJ1Y3RvciIsIlVwZ3JhZGVBZGFwdGVyUmVmLl9ib290c3RyYXBEb25lIiwiVXBncmFkZUFkYXB0ZXJSZWYucmVhZHkiLCJVcGdyYWRlQWRhcHRlclJlZi5kaXNwb3NlIiwiZ2V0Q29tcG9uZW50SW5mbyIsInBhcnNlRmllbGRzIiwib25FcnJvciIsImNvbnRyb2xsZXJLZXkiLCJEb3duZ3JhZGVOZzJDb21wb25lbnRBZGFwdGVyIiwiRG93bmdyYWRlTmcyQ29tcG9uZW50QWRhcHRlci5jb25zdHJ1Y3RvciIsIkRvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXIuYm9vdHN0cmFwTmcyIiwiRG93bmdyYWRlTmcyQ29tcG9uZW50QWRhcHRlci5zZXR1cElucHV0cyIsIkRvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXIucHJvamVjdENvbnRlbnQiLCJEb3duZ3JhZGVOZzJDb21wb25lbnRBZGFwdGVyLnNldHVwT3V0cHV0cyIsIkRvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXIucmVnaXN0ZXJDbGVhbnVwIiwiTmcxQ2hhbmdlIiwiTmcxQ2hhbmdlLmNvbnN0cnVjdG9yIiwiTmcxQ2hhbmdlLmlzRmlyc3RDaGFuZ2UiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIuY29uc3RydWN0b3IiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIuZXh0cmFjdERpcmVjdGl2ZSIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlci5ub3RTdXBwb3J0ZWQiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIuZXh0cmFjdEJpbmRpbmdzIiwiVXBncmFkZU5nMUNvbXBvbmVudEFkYXB0ZXJCdWlsZGVyLmNvbXBpbGVUZW1wbGF0ZSIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlci5jb21waWxlVGVtcGxhdGUuY29tcGlsZUh0bWwiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXIucmVzb2x2ZSIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyIiwiVXBncmFkZU5nMUNvbXBvbmVudEFkYXB0ZXIuY29uc3RydWN0b3IiLCJVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlci5uZ09uQ2hhbmdlcyIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyLm5nRG9DaGVjayIsIlVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyLnNldENvbXBvbmVudFByb3BlcnR5IiwiVXBncmFkZU5nMUNvbXBvbmVudEFkYXB0ZXIucmVzb2x2ZVJlcXVpcmVkIiwibm9OZyIsImJlZm9yZUVhY2hQcm92aWRlcnMiLCJfaXNQcm9taXNlTGlrZSIsInJ1bkluVGVzdFpvbmUiLCJfaXQiLCJiZWZvcmVFYWNoIiwiaXQiLCJ4aXQiLCJpaXQiLCJmaXQiLCJfZ2V0Um9vdFByb3ZpZGVycyIsIl9nZXRBcHBCaW5kaW5ncyIsIl9ydW50aW1lQ29tcGlsZXJCaW5kaW5ncyIsImNyZWF0ZVRlc3RJbmplY3RvciIsImNyZWF0ZVRlc3RJbmplY3RvcldpdGhSdW50aW1lQ29tcGlsZXIiLCJpbmplY3QiLCJpbmplY3RBc3luYyIsIkZ1bmN0aW9uV2l0aFBhcmFtVG9rZW5zIiwiRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMuY29uc3RydWN0b3IiLCJGdW5jdGlvbldpdGhQYXJhbVRva2Vucy5leGVjdXRlIiwiRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMuaGFzVG9rZW4iLCJNb2NrQW5pbWF0aW9uQnVpbGRlciIsIk1vY2tBbmltYXRpb25CdWlsZGVyLmNvbnN0cnVjdG9yIiwiTW9ja0FuaW1hdGlvbkJ1aWxkZXIuY3NzIiwiTW9ja0Nzc0FuaW1hdGlvbkJ1aWxkZXIiLCJNb2NrQ3NzQW5pbWF0aW9uQnVpbGRlci5jb25zdHJ1Y3RvciIsIk1vY2tDc3NBbmltYXRpb25CdWlsZGVyLnN0YXJ0IiwiTW9ja0Jyb3dzZXJBYnN0cmFjdGlvbiIsIk1vY2tCcm93c2VyQWJzdHJhY3Rpb24uY29uc3RydWN0b3IiLCJNb2NrQnJvd3NlckFic3RyYWN0aW9uLmRvZXNFbGFwc2VkVGltZUluY2x1ZGVzRGVsYXkiLCJNb2NrQW5pbWF0aW9uIiwiTW9ja0FuaW1hdGlvbi5jb25zdHJ1Y3RvciIsIk1vY2tBbmltYXRpb24ud2FpdCIsIk1vY2tBbmltYXRpb24uZmx1c2giLCJNb2NrRGlyZWN0aXZlUmVzb2x2ZXIiLCJNb2NrRGlyZWN0aXZlUmVzb2x2ZXIuY29uc3RydWN0b3IiLCJNb2NrRGlyZWN0aXZlUmVzb2x2ZXIucmVzb2x2ZSIsIk1vY2tEaXJlY3RpdmVSZXNvbHZlci5zZXRCaW5kaW5nc092ZXJyaWRlIiwiTW9ja0RpcmVjdGl2ZVJlc29sdmVyLnNldFZpZXdCaW5kaW5nc092ZXJyaWRlIiwiTW9ja0RpcmVjdGl2ZVJlc29sdmVyLnNldFByb3ZpZGVyc092ZXJyaWRlIiwiTW9ja0RpcmVjdGl2ZVJlc29sdmVyLnNldFZpZXdQcm92aWRlcnNPdmVycmlkZSIsIk1vY2tWaWV3UmVzb2x2ZXIiLCJNb2NrVmlld1Jlc29sdmVyLmNvbnN0cnVjdG9yIiwiTW9ja1ZpZXdSZXNvbHZlci5zZXRWaWV3IiwiTW9ja1ZpZXdSZXNvbHZlci5zZXRJbmxpbmVUZW1wbGF0ZSIsIk1vY2tWaWV3UmVzb2x2ZXIub3ZlcnJpZGVWaWV3RGlyZWN0aXZlIiwiTW9ja1ZpZXdSZXNvbHZlci5yZXNvbHZlIiwiTW9ja1ZpZXdSZXNvbHZlci5fY2hlY2tPdmVycmlkZWFibGUiLCJNb2NrTG9jYXRpb25TdHJhdGVneSIsIk1vY2tMb2NhdGlvblN0cmF0ZWd5LmNvbnN0cnVjdG9yIiwiTW9ja0xvY2F0aW9uU3RyYXRlZ3kuc2ltdWxhdGVQb3BTdGF0ZSIsIk1vY2tMb2NhdGlvblN0cmF0ZWd5LnBhdGgiLCJNb2NrTG9jYXRpb25TdHJhdGVneS5wcmVwYXJlRXh0ZXJuYWxVcmwiLCJNb2NrTG9jYXRpb25TdHJhdGVneS5wdXNoU3RhdGUiLCJNb2NrTG9jYXRpb25TdHJhdGVneS5yZXBsYWNlU3RhdGUiLCJNb2NrTG9jYXRpb25TdHJhdGVneS5vblBvcFN0YXRlIiwiTW9ja0xvY2F0aW9uU3RyYXRlZ3kuZ2V0QmFzZUhyZWYiLCJNb2NrTG9jYXRpb25TdHJhdGVneS5iYWNrIiwiTW9ja0xvY2F0aW9uU3RyYXRlZ3kuZm9yd2FyZCIsIl9Nb2NrUG9wU3RhdGVFdmVudCIsIl9Nb2NrUG9wU3RhdGVFdmVudC5jb25zdHJ1Y3RvciIsIk1vY2tOZ1pvbmUiLCJNb2NrTmdab25lLmNvbnN0cnVjdG9yIiwiTW9ja05nWm9uZS5vbkV2ZW50RG9uZSIsIk1vY2tOZ1pvbmUucnVuIiwiTW9ja05nWm9uZS5ydW5PdXRzaWRlQW5ndWxhciIsIk1vY2tOZ1pvbmUuc2ltdWxhdGVab25lRXhpdCIsIkNvbXBvbmVudEZpeHR1cmUiLCJDb21wb25lbnRGaXh0dXJlLmNvbnN0cnVjdG9yIiwiQ29tcG9uZW50Rml4dHVyZV8iLCJDb21wb25lbnRGaXh0dXJlXy5jb25zdHJ1Y3RvciIsIkNvbXBvbmVudEZpeHR1cmVfLmRldGVjdENoYW5nZXMiLCJDb21wb25lbnRGaXh0dXJlXy5kZXN0cm95IiwiVGVzdENvbXBvbmVudEJ1aWxkZXIiLCJUZXN0Q29tcG9uZW50QnVpbGRlci5jb25zdHJ1Y3RvciIsIlRlc3RDb21wb25lbnRCdWlsZGVyLl9jbG9uZSIsIlRlc3RDb21wb25lbnRCdWlsZGVyLm92ZXJyaWRlVGVtcGxhdGUiLCJUZXN0Q29tcG9uZW50QnVpbGRlci5vdmVycmlkZVZpZXciLCJUZXN0Q29tcG9uZW50QnVpbGRlci5vdmVycmlkZURpcmVjdGl2ZSIsIlRlc3RDb21wb25lbnRCdWlsZGVyLm92ZXJyaWRlUHJvdmlkZXJzIiwiVGVzdENvbXBvbmVudEJ1aWxkZXIub3ZlcnJpZGVCaW5kaW5ncyIsIlRlc3RDb21wb25lbnRCdWlsZGVyLm92ZXJyaWRlVmlld1Byb3ZpZGVycyIsIlRlc3RDb21wb25lbnRCdWlsZGVyLm92ZXJyaWRlVmlld0JpbmRpbmdzIiwiVGVzdENvbXBvbmVudEJ1aWxkZXIuY3JlYXRlQXN5bmMiLCJMb2ciLCJMb2cuY29uc3RydWN0b3IiLCJMb2cuYWRkIiwiTG9nLmZuIiwiTG9nLmNsZWFyIiwiTG9nLnJlc3VsdCIsIkJyb3dzZXJEZXRlY3Rpb24iLCJCcm93c2VyRGV0ZWN0aW9uLmNvbnN0cnVjdG9yIiwiQnJvd3NlckRldGVjdGlvbi5pc0ZpcmVmb3giLCJCcm93c2VyRGV0ZWN0aW9uLmlzQW5kcm9pZCIsIkJyb3dzZXJEZXRlY3Rpb24uaXNFZGdlIiwiQnJvd3NlckRldGVjdGlvbi5pc0lFIiwiQnJvd3NlckRldGVjdGlvbi5pc1dlYmtpdCIsIkJyb3dzZXJEZXRlY3Rpb24uaXNJT1M3IiwiQnJvd3NlckRldGVjdGlvbi5pc1Nsb3ciLCJCcm93c2VyRGV0ZWN0aW9uLnN1cHBvcnRzSW50bEFwaSIsImRpc3BhdGNoRXZlbnQiLCJlbCIsImNvbnRhaW5zUmVnZXhwIiwibm9ybWFsaXplQ1NTIiwic3RyaW5naWZ5RWxlbWVudCIsIlNlcmlhbGl6ZXIiLCJTZXJpYWxpemVyLmNvbnN0cnVjdG9yIiwiU2VyaWFsaXplci5zZXJpYWxpemUiLCJTZXJpYWxpemVyLmRlc2VyaWFsaXplIiwiU2VyaWFsaXplci5tYXBUb09iamVjdCIsIlNlcmlhbGl6ZXIub2JqZWN0VG9NYXAiLCJTZXJpYWxpemVyLmFsbG9jYXRlUmVuZGVyVmlld3MiLCJTZXJpYWxpemVyLl9zZXJpYWxpemVXb3JrZXJFbGVtZW50UmVmIiwiU2VyaWFsaXplci5fZGVzZXJpYWxpemVXb3JrZXJFbGVtZW50UmVmIiwiU2VyaWFsaXplci5fc2VyaWFsaXplUmVuZGVyVGVtcGxhdGUiLCJTZXJpYWxpemVyLl9kZXNlcmlhbGl6ZVJlbmRlclRlbXBsYXRlIiwic2VyaWFsaXplVGVtcGxhdGVDbWQiLCJkZXNlcmlhbGl6ZVRlbXBsYXRlQ21kIiwiUmVuZGVyVGVtcGxhdGVDbWRTZXJpYWxpemVyIiwiUmVuZGVyVGVtcGxhdGVDbWRTZXJpYWxpemVyLmNvbnN0cnVjdG9yIiwiUmVuZGVyVGVtcGxhdGVDbWRTZXJpYWxpemVyLnZpc2l0VGV4dCIsIlJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplci52aXNpdE5nQ29udGVudCIsIlJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplci52aXNpdEJlZ2luRWxlbWVudCIsIlJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplci52aXNpdEVuZEVsZW1lbnQiLCJSZW5kZXJUZW1wbGF0ZUNtZFNlcmlhbGl6ZXIudmlzaXRCZWdpbkNvbXBvbmVudCIsIlJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplci52aXNpdEVuZENvbXBvbmVudCIsIlJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplci52aXNpdEVtYmVkZGVkVGVtcGxhdGUiLCJXZWJXb3JrZXJFbGVtZW50UmVmIiwiV2ViV29ya2VyRWxlbWVudFJlZi5jb25zdHJ1Y3RvciIsIldlYldvcmtlclRlbXBsYXRlQ21kIiwiV2ViV29ya2VyVGVtcGxhdGVDbWQuY29uc3RydWN0b3IiLCJXZWJXb3JrZXJUZW1wbGF0ZUNtZC52aXNpdCIsIldlYldvcmtlclRleHRDbWQiLCJXZWJXb3JrZXJUZXh0Q21kLmNvbnN0cnVjdG9yIiwiV2ViV29ya2VyVGV4dENtZC52aXNpdCIsIldlYldvcmtlck5nQ29udGVudENtZCIsIldlYldvcmtlck5nQ29udGVudENtZC5jb25zdHJ1Y3RvciIsIldlYldvcmtlck5nQ29udGVudENtZC52aXNpdCIsIldlYldvcmtlckJlZ2luRWxlbWVudENtZCIsIldlYldvcmtlckJlZ2luRWxlbWVudENtZC5jb25zdHJ1Y3RvciIsIldlYldvcmtlckJlZ2luRWxlbWVudENtZC52aXNpdCIsIldlYldvcmtlckVuZEVsZW1lbnRDbWQiLCJXZWJXb3JrZXJFbmRFbGVtZW50Q21kLmNvbnN0cnVjdG9yIiwiV2ViV29ya2VyRW5kRWxlbWVudENtZC52aXNpdCIsIldlYldvcmtlckJlZ2luQ29tcG9uZW50Q21kIiwiV2ViV29ya2VyQmVnaW5Db21wb25lbnRDbWQuY29uc3RydWN0b3IiLCJXZWJXb3JrZXJCZWdpbkNvbXBvbmVudENtZC52aXNpdCIsIldlYldvcmtlckVuZENvbXBvbmVudENtZCIsIldlYldvcmtlckVuZENvbXBvbmVudENtZC5jb25zdHJ1Y3RvciIsIldlYldvcmtlckVuZENvbXBvbmVudENtZC52aXNpdCIsIldlYldvcmtlckVtYmVkZGVkVGVtcGxhdGVDbWQiLCJXZWJXb3JrZXJFbWJlZGRlZFRlbXBsYXRlQ21kLmNvbnN0cnVjdG9yIiwiV2ViV29ya2VyRW1iZWRkZWRUZW1wbGF0ZUNtZC52aXNpdCIsIlJlbmRlclByb3RvVmlld1JlZlN0b3JlIiwiUmVuZGVyUHJvdG9WaWV3UmVmU3RvcmUuY29uc3RydWN0b3IiLCJSZW5kZXJQcm90b1ZpZXdSZWZTdG9yZS5hbGxvY2F0ZSIsIlJlbmRlclByb3RvVmlld1JlZlN0b3JlLnN0b3JlIiwiUmVuZGVyUHJvdG9WaWV3UmVmU3RvcmUuZGVzZXJpYWxpemUiLCJSZW5kZXJQcm90b1ZpZXdSZWZTdG9yZS5zZXJpYWxpemUiLCJXZWJXb3JrZXJSZW5kZXJQcm90b1ZpZXdSZWYiLCJXZWJXb3JrZXJSZW5kZXJQcm90b1ZpZXdSZWYuY29uc3RydWN0b3IiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlIiwiUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZS5jb25zdHJ1Y3RvciIsIlJlbmRlclZpZXdXaXRoRnJhZ21lbnRzU3RvcmUuYWxsb2NhdGUiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLnN0b3JlIiwiUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZS5yZW1vdmUiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLl9yZW1vdmVSZWYiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLnNlcmlhbGl6ZVJlbmRlclZpZXdSZWYiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLnNlcmlhbGl6ZVJlbmRlckZyYWdtZW50UmVmIiwiUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZS5kZXNlcmlhbGl6ZVJlbmRlclZpZXdSZWYiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLmRlc2VyaWFsaXplUmVuZGVyRnJhZ21lbnRSZWYiLCJSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1N0b3JlLl9yZXRyaWV2ZSIsIlJlbmRlclZpZXdXaXRoRnJhZ21lbnRzU3RvcmUuX3NlcmlhbGl6ZVJlbmRlckZyYWdtZW50T3JWaWV3UmVmIiwiUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZS5zZXJpYWxpemVWaWV3V2l0aEZyYWdtZW50cyIsIlJlbmRlclZpZXdXaXRoRnJhZ21lbnRzU3RvcmUuZGVzZXJpYWxpemVWaWV3V2l0aEZyYWdtZW50cyIsIldlYldvcmtlclJlbmRlclZpZXdSZWYiLCJXZWJXb3JrZXJSZW5kZXJWaWV3UmVmLmNvbnN0cnVjdG9yIiwiV2ViV29ya2VyUmVuZGVyVmlld1JlZi5zZXJpYWxpemUiLCJXZWJXb3JrZXJSZW5kZXJWaWV3UmVmLmRlc2VyaWFsaXplIiwiV2ViV29ya2VyUmVuZGVyRnJhZ21lbnRSZWYiLCJXZWJXb3JrZXJSZW5kZXJGcmFnbWVudFJlZi5jb25zdHJ1Y3RvciIsIldlYldvcmtlclJlbmRlckZyYWdtZW50UmVmLnNlcmlhbGl6ZSIsIldlYldvcmtlclJlbmRlckZyYWdtZW50UmVmLmRlc2VyaWFsaXplIiwiY29tcGFyZU1hcCIsIm1lc3NhZ2UiLCJidWlsZEVycm9yIiwiZWxlbWVudFRleHQiLCJmYWtlQXN5bmMiLCJjbGVhclBlbmRpbmdUaW1lcnMiLCJ0aWNrIiwiZmx1c2hNaWNyb3Rhc2tzIiwiX3NldFRpbWVvdXQiLCJfY2xlYXJUaW1lb3V0IiwiX3NldEludGVydmFsIiwiX2NsZWFySW50ZXJ2YWwiLCJfZm5BbmRGbHVzaCIsIl9zY2hlZHVsZU1pY3JvdGFzayIsIl9kZXF1ZXVlVGltZXIiLCJfYXNzZXJ0SW5GYWtlQXN5bmNab25lIiwiTW9ja1hIUiIsIk1vY2tYSFIuY29uc3RydWN0b3IiLCJNb2NrWEhSLmdldCIsIk1vY2tYSFIuZXhwZWN0IiwiTW9ja1hIUi53aGVuIiwiTW9ja1hIUi5mbHVzaCIsIk1vY2tYSFIudmVyaWZ5Tm9PdXRzdGFuZGluZ0V4cGVjdGF0aW9ucyIsIk1vY2tYSFIuX3Byb2Nlc3NSZXF1ZXN0IiwiX1BlbmRpbmdSZXF1ZXN0IiwiX1BlbmRpbmdSZXF1ZXN0LmNvbnN0cnVjdG9yIiwiX1BlbmRpbmdSZXF1ZXN0LmNvbXBsZXRlIiwiX1BlbmRpbmdSZXF1ZXN0LmdldFByb21pc2UiLCJfRXhwZWN0YXRpb24iLCJfRXhwZWN0YXRpb24uY29uc3RydWN0b3IiLCJNb2NrQXBwbGljYXRpb25SZWYiLCJNb2NrQXBwbGljYXRpb25SZWYuY29uc3RydWN0b3IiLCJNb2NrQXBwbGljYXRpb25SZWYucmVnaXN0ZXJCb290c3RyYXBMaXN0ZW5lciIsIk1vY2tBcHBsaWNhdGlvblJlZi5yZWdpc3RlckRpc3Bvc2VMaXN0ZW5lciIsIk1vY2tBcHBsaWNhdGlvblJlZi5ib290c3RyYXAiLCJNb2NrQXBwbGljYXRpb25SZWYuaW5qZWN0b3IiLCJNb2NrQXBwbGljYXRpb25SZWYuem9uZSIsIk1vY2tBcHBsaWNhdGlvblJlZi5kaXNwb3NlIiwiTW9ja0FwcGxpY2F0aW9uUmVmLnRpY2siLCJNb2NrQXBwbGljYXRpb25SZWYuY29tcG9uZW50VHlwZXMiLCJNb2NrQ29ubmVjdGlvbiIsIk1vY2tDb25uZWN0aW9uLmNvbnN0cnVjdG9yIiwiTW9ja0Nvbm5lY3Rpb24ubW9ja1Jlc3BvbmQiLCJNb2NrQ29ubmVjdGlvbi5tb2NrRG93bmxvYWQiLCJNb2NrQ29ubmVjdGlvbi5tb2NrRXJyb3IiLCJNb2NrQmFja2VuZCIsIk1vY2tCYWNrZW5kLmNvbnN0cnVjdG9yIiwiTW9ja0JhY2tlbmQudmVyaWZ5Tm9QZW5kaW5nUmVxdWVzdHMiLCJNb2NrQmFja2VuZC5yZXNvbHZlQWxsQ29ubmVjdGlvbnMiLCJNb2NrQmFja2VuZC5jcmVhdGVDb25uZWN0aW9uIiwiU3B5TG9jYXRpb24iLCJTcHlMb2NhdGlvbi5jb25zdHJ1Y3RvciIsIlNweUxvY2F0aW9uLnNldEluaXRpYWxQYXRoIiwiU3B5TG9jYXRpb24uc2V0QmFzZUhyZWYiLCJTcHlMb2NhdGlvbi5wYXRoIiwiU3B5TG9jYXRpb24uc2ltdWxhdGVVcmxQb3AiLCJTcHlMb2NhdGlvbi5zaW11bGF0ZUhhc2hDaGFuZ2UiLCJTcHlMb2NhdGlvbi5wcmVwYXJlRXh0ZXJuYWxVcmwiLCJTcHlMb2NhdGlvbi5nbyIsIlNweUxvY2F0aW9uLnJlcGxhY2VTdGF0ZSIsIlNweUxvY2F0aW9uLmZvcndhcmQiLCJTcHlMb2NhdGlvbi5iYWNrIiwiU3B5TG9jYXRpb24uc3Vic2NyaWJlIiwiU3B5TG9jYXRpb24ubm9ybWFsaXplIl0sIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTztBQ1ZBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLHVCQUFlO0FBQ2Y7QUFDQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7OztBQUdBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0FDdENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7Ozs7OztBQ2pCQTs7OztJQUlHO0FBQ0gsOEJBQWMsQ0FBcUIsQ0FBQztBQUNwQyw4QkFBYyxFQUFpQixDQUFDO0FBQ2hDLDhCQUFjLEVBQXNCLENBQUM7QUFDckMsOEJBQWMsQ0FBZSxDQUFDO0FBQzlCLDhCQUFjLEVBQXFCLENBQUM7QUFDcEMsa0NBQTZCLENBQTBCLENBQUM7QUFBaEQsZ0RBQWdEO0FBQ3hELDZDQUFrRSxFQUE0QixDQUFDO0FBQXZGLCtDQUFRO0FBQUUsdURBQVk7QUFBRSxxREFBVztBQUFFLDJEQUFrRDtBQUMvRixnREFNTyxFQUErQixDQUFDO0FBTHJDLDhDQUFNO0FBQ04sNERBQWE7QUFDYixn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LElBQUlBLGlCQUFpQkEsR0FBWUEsRUFBRUEsQ0FBQ0E7U0FDcENBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLEVBQUVBLEdBQUdBLFdBQVdBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBO2FBQ3pEQSxJQUFJQSxnQkFBZ0JBLEdBQVVBLEVBQUVBLENBQUNBO2FBQ2pDQSxpQkFBaUJBLENBQUNBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0E7YUFDekNBLElBQUlBLFVBQVVBLEdBQUdBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ2hDQSxFQUFFQSxDQUFDQSxDQUFDQSxVQUFVQSxZQUFZQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDaENBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLFVBQVVBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBO3FCQUMzQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUMxREEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsaUJBQVVBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUNsQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZEQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDTkEsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTthQUNwQ0EsQ0FBQ0E7U0FDSEEsQ0FBQ0E7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QSxDQUFDQTtTQUMvQkEsZ0JBQVdBLEdBQWVBLElBQUlBLENBQUNBO1NBRzdCQSxJQUFJQSxNQUFNQSxHQUFHQSxHQUFHQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUV4QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDZkEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsUUFBUUEsQ0FBQ0E7YUFDakNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2hDQSxJQUFJQSxDQUFDQSxXQUFXQSxHQUFHQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN2Q0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREQsd0RBQWtCQSxHQUFsQkEsVUFBbUJBLEtBQWFBO1NBQzlCRSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUN0Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7U0FDdENBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBO1NBQ3RDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUN0Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0E7U0FDdENBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENB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LElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxNQUFNQSxLQUFLQSxLQUFLQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1REEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsaUJBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBO2FBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ25CQSxDQUFDQTtTQUVEQSxNQUFNQSxDQUFDQSxpQkFBU0EsQ0FBQ0E7S0FDbkJBLENBQUNBO0tBRURMLDhDQUFhQSxHQUFiQSxVQUFjQSxLQUFhQTtTQUN6Qk0sRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDakNBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ2pDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNqQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDakNBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ2pDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNqQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDakNBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO1NBQ2pDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQTthQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQTtTQUNqQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDakNBLE1BQU1BLElBQUlBLDZCQUFnQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7S0FDcENBLENBQUNBO0tBRUROLHNEQUFx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QSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQzlFQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO2FBQ2pGQSxHQUFHQSxHQUFHQSxNQUFNQSxHQUFHQSxFQUFFQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLFFBQVFBLEVBQUVBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLEVBQUVBLFVBQVVBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO1NBQ25GQSxDQUFFQTtTQUFBQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNYQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxZQUFZQSxrQ0FBcUJBLElBQUlBLENBQUNBLFlBQVlBLCtCQUFrQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzFFQSxDQUFDQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxFQUFFQSxRQUFRQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTthQUMvQkEsQ0FBQ0E7YUFDREEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDVkEsQ0FBQ0E7U0FFREEsSUFBSUEsR0FBR0EsQ0FBQ0E7U0FDUkEsSUFBSUEsQ0FBQ0E7YUFDSEEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ2ZBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxFQUFFQSxDQUFDQTtxQkFDaEJBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxDQUFDQTtxQkFDSkEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQ2xCQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsQ0FBQ0E7cUJBQ0pBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO3FCQUN0QkEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtxQkFDMUJBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxDQUFDQTtxQkFDSkEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQzlCQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsQ0FBQ0E7cUJBQ0pBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO3FCQUNsQ0EsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtxQkFDdENBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxDQUFDQTtxQkFDSkEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQzFDQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsQ0FBQ0E7cUJBQ0pBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO3FCQUM5Q0EsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLENBQUNBO3FCQUNKQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtxQkFDbERBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxFQUFFQTtxQkFDTEEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7cUJBQ3REQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO3FCQUMzREEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLEVBQUVBO3FCQUNMQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtxQkFDaEVBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxFQUFFQTtxQkFDTEEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3JFQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO3FCQUMxRUEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLEVBQUVBO3FCQUNMQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtxQkFDL0VBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxFQUFFQTtxQkFDTEEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3BGQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO3FCQUN6RkEsS0FBS0EsQ0FBQ0E7aUJBQ1JBLEtBQUtBLEVBQUVBO3FCQUNMQSxHQUFHQSxHQUFHQSxPQUFPQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUN6RUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7cUJBQ25CQSxLQUFLQSxDQUFDQTtpQkFDUkEsS0FBS0EsRUFBRUE7cUJBQ0xBLEdBQUdBLEdBQUdBLE9BQU9BLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQ3pFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtxQkFDeEJBLEtBQUtBLENBQUNBO2lCQUNSQSxLQUFLQSxFQUFFQTtxQkFDTEEsR0FBR0EsR0FBR0EsT0FBT0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FB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QUFDQTtTQUVEQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxJQUFJQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzVCQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNyQkEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FFREEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDWEEsQ0FBQ0E7S0FFTVYsdUJBQU1BLEdBQWJBLFVBQWlCQSxFQUFzQkEsRUFBRUEsRUFBc0JBO1NBQzdEVyxJQUFJQSxFQUFFQSxHQUFHQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtTQUN6QkEsSUFBSUEsRUFBRUEsR0FBR0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7U0FDekJBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLE1BQU1BLElBQUlBLEVBQUVBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO2FBQzNCQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUNmQSxDQUFDQTtTQUNEQSxJQUFJQSxHQUFHQSxDQUFDQTtTQUNSQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUNuQ0EsR0FBR0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDWkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3hCQSxNQUFN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QSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsV0FBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBakJBLENBQWlCQSxDQUFDQTthQUMzQ0EsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFdBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQXJCQSxDQUFxQkEsQ0FBQ0E7YUFDbkRBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxXQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUF6QkEsQ0FBeUJBLENBQUNBO2FBQzNEQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsV0FBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBN0JBLENBQTZCQSxDQUFDQTthQUNuRUEsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFdBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLEVBQWpDQSxDQUFpQ0EsQ0FBQ0E7YUFDM0VBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxXQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFyQ0EsQ0FBcUNBLENBQUNBO2FBQ25GQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsV0FBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBekNBLENBQXlDQSxDQUFDQTthQUMzRkEsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBOzRCQUNwQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsQ0FBQ0E7aUJBQTlDQSxDQUE4Q0EsQ0FBQ0E7YUFDNURBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDekNBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO2lCQUFuREEsQ0FBbURBLENBQUNBO2FBQ2pFQSxLQUFLQSxFQUFFQTtpQkFDTEEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0E7NEJBQzlDQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTtpQkFBeERBLENBQXdEQSxDQUFDQTthQUN0RUEsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBOzRCQUNuREEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7aUJBQTdEQSxDQUE2REEsQ0FBQ0E7YUFDM0VBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDeERBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBO2lCQUFsRUEsQ0FBa0VBLENBQUNBO2FBQ2hGQSxLQUFLQSxFQUFFQTtpQkFDTEEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0E7NEJBQzdEQSxJQUFJQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTtpQkFBdkVBLENBQXVFQSxDQUFDQTthQUNyRkEsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBOzRCQUNsRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0E7aUJBQTVFQSxDQUE0RUEsQ0FBQ0E7YUFDMUZBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDdkVBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQ3JFQSxHQUFHQSxDQUFDQTtpQkFEVkEsQ0FDVUEsQ0FBQ0E7YUFDeEJBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFDNUVBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQzFFQSxHQUFHQSxDQUFDQTtpQkFEVkEsQ0FDVUEsQ0FBQ0E7YUFDeEJBLEtBQUtBLEVBQUVBO2lCQUNMQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUMvRUEsR0FBR0E7NEJBQUtBLElBQUlBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQ3JFQSxHQUFHQSxFQUFFQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQTtpQkFEcEJBLENBQ29CQSxDQUFDQTthQUN2Q0EsS0FBS0EsRUFBRUE7aUJBQ0xBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQUVBLEdBQUdBLEVBQy9FQSxHQUFHQSxFQUFFQSxHQUFHQTs0QkFBS0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEs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QThCQSxDQUFDQTtTQUVuQ0EsSUFBSUEsSUFBSUEsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDZEEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsTUFBTUEsS0FBS0EsSUFBSUEsRUFBRUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0E7YUFDbkVBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUVEQSxJQUFJQSxRQUFRQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNsQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsZUFBZUEsRUFBRUEsTUFBTUEsS0FBS0EsSUFBSUEsRUFBRUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsYUFBYUEsRUFBRUEsQ0FBQ0E7YUFDbkZBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQ3hCQSxDQUFDQTtTQUVEQSxJQUFJQSxTQUFTQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNuQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsRUFBRUEsTUFBTUEsS0FBS0EsSUFBSUEsRUFBRUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsVUFBVUEsRUFBRUEsQ0FBQ0E7YUFDL0VBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQ3pCQSxDQUFDQTtTQUNEQSxJQUFJQSxLQUFLQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNmQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQTthQUMzRUEsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FD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QUFhQSxFQUFFQSxDQUFDQTthQUNwRkEsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO1NBQ25DQSxDQUFDQTtTQUNEQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxZQUFZQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxZQUFZQSxFQUFFQSxDQUFDQTthQUMvRUEsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO1NBQ2xDQSxDQUFDQTtTQUNEQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxjQUFjQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQTthQUMvRUEsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO1NBQ3BDQSxDQUFDQTtTQUNEQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQSxNQUFNQSxLQUFLQSxJQUFJQSxFQUFFQSxNQUFNQSxHQUFHQSxNQUFNQSxDQUFDQSxZQUFZQSxFQUFFQSxDQUFDQTthQUNoRkEsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO1NBQ25DQSxDQUFDQTtTQUVEQSxNQUFNQSxDQUFDQSxPQUFPQSxHQUFHQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxHQUFHQSxZQUFZQSxHQUFHQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQTthQUM3RUEsYUFBYUEsR0FBR0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsR0FBR0EsV0FBV0EsR0FBR0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUE7YUFDckZBLFlBQVlBLEdBQUdBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ25EQSxDQUFDQTtLQUVEbkIsZ0JBQWdCQTtLQUNoQkEsd0NBQVFBLEdBQVJBLFVBQVNBLEdBQUdBLEVBQUVBLEVBQVlBO1NBQ3hCb0IsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsWUFBWUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDUEEsR0FBSUEsQ0FBQ0EsT0FBT0EsQ0FBTUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7U0FDeENBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLDZCQUFnQkEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7U0FDcENBLENBQUNBO0tBQ0hBLENBQUNBO0tBQ0hwQiw0QkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQWhVWSw4QkFBcUIsd0JBZ1VqQztBQUdEO0tBaUJFcUIsd0JBQW1CQSxHQUFRQTtTQUFSQyxRQUFHQSxHQUFIQSxHQUFHQSxDQUFLQTtTQWhCM0JBLGtCQUFhQSxHQUFRQSxJQUFJQSxDQUFDQTtTQUMxQkEsaUJBQVlBLEdBQVFBLElBQUlBLENBQUNBO1NBRXpCQSxnQkFBZ0JBO1NBQ2hCQSxrQkFBYUEsR0FBbUJBLElBQUlBLENBQUNBO1NBQ3JDQSxnQkFBZ0JBO1NBQ2hCQSxVQUFLQSxHQUFtQkEsSUFBSUEsQ0FBQ0E7U0FDN0JBLGdCQUFnQkE7U0FDaEJBLGVBQVVBLEdBQW1CQSxJQUFJQSxDQUFDQTtTQUNsQ0EsZ0JBQWdCQTtTQUNoQkEsaUJBQVlBLEdBQW1CQSxJQUFJQSxDQUFDQTtTQUNwQ0EsZ0JBQWdCQTtTQUNoQkEsaUJBQVlBLEdBQW1CQSxJQUFJQSxDQUFDQTtTQUNwQ0EsZ0JBQWdCQTtTQUNoQkEsaUJBQVlBLEdBQW1CQSxJQUFJQSxDQUFDQTtLQUVOQSxDQUFDQTtLQUUvQkQsaUNBQVFBLEdBQVJBO1NBQ0VFLE1BQU1BLENBQUNBLHFCQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQTthQUNqREEsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBO2FBQ25CQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsR0FBR0EsR0FBR0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEdBQUdBLElBQUlBO2lCQUNoRUEsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBO0tBQ2xEQSxDQUFDQTtLQUNIRixxQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQXpCWSx1QkFBYyxpQkF5QjFCOzs7Ozs7Ozs7Ozs7QUN6V0Qsd0NBQTBCLEVBQWdDLENBQUM7QUFFM0Q7S0FBQUc7S0FHQUMsQ0FBQ0E7S0FGQ0QsbUJBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNoREYsc0JBQVFBLEdBQVJBLGNBQXFCRyxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUN0Q0gsVUFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQUhZLFlBQUcsTUFHZjtBQUVEOzs7Ozs7Ozs7Ozs7SUFZRztBQUNIO0tBQTJCSSx5QkFBR0E7S0FDNUJBLGVBQW1CQSxNQUFjQSxFQUFTQSx1QkFBK0JBLEVBQVNBLFFBQWFBO1NBQzdGQyxpQkFBT0EsQ0FBQ0E7U0FEU0EsV0FBTUEsR0FBTkEsTUFBTUEsQ0FBUUE7U0FBU0EsNEJBQXVCQSxHQUF2QkEsdUJBQXVCQSxDQUFRQTtTQUFTQSxhQUFRQSxHQUFSQSxRQUFRQSxDQUFLQTtLQUUvRkEsQ0FBQ0E7S0FDREQscUJBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNwRUYsd0JBQVFBLEdBQVJBLGNBQXFCRyxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUN4Q0gsWUFBQ0E7QUFBREEsRUFBQ0EsRUFOMEIsR0FBRyxFQU03QjtBQU5ZLGNBQUssUUFNakI7QUFFRDtLQUErQkksNkJBQUdBO0tBQWxDQTtTQUErQkMsOEJBQUdBO0tBSWxDQSxDQUFDQTtLQUhDRCx5QkFBS0EsR0FBTEEsVUFBTUEsT0FBbUJBO1NBQ3ZCRSxhQUFhQTtLQUNmQSxDQUFDQTtLQUNIRixnQkFBQ0E7QUFBREEsRUFBQ0EsRUFKOEIsR0FBRyxFQUlqQztBQUpZLGtCQUFTLFlBSXJCO0FBRUQ7S0FBc0NHLG9DQUFHQTtLQUF6Q0E7U0FBc0NDLDhCQUFHQTtLQUV6Q0EsQ0FBQ0E7S0FEQ0QsZ0NBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxxQkFBcUJBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ2pGRix1QkFBQ0E7QUFBREEsRUFBQ0EsRUFGcUMsR0FBRyxFQUV4QztBQUZZLHlCQUFnQixtQkFFNUI7QUFFRDs7SUFFRztBQUNIO0tBQTJCRyx5QkFBR0E7S0FDNUJBLGVBQW1CQSxXQUFrQkE7U0FBSUMsaUJBQU9BLENBQUNBO1NBQTlCQSxnQkFBV0EsR0FBWEEsV0FBV0EsQ0FBT0E7S0FBYUEsQ0FBQ0E7S0FDbkRELHFCQUFLQSxHQUFMQSxVQUFNQSxPQUFtQkEsSUFBU0UsTUFBTUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDdEVGLFlBQUNBO0FBQURBLEVBQUNBLEVBSDBCLEdBQUcsRUFHN0I7QUFIWSxjQUFLLFFBR2pCO0FBRUQ7S0FBaUNHLCtCQUFHQTtLQUNsQ0EscUJBQW1CQSxTQUFjQSxFQUFTQSxPQUFZQSxFQUFTQSxRQUFhQTtTQUFJQyxpQkFBT0EsQ0FBQ0E7U0FBckVBLGNBQVNBLEdBQVRBLFNBQVNBLENBQUtBO1NBQVNBLFlBQU9BLEdBQVBBLE9BQU9BLENBQUtBO1NBQVNBLGFBQVFBLEdBQVJBLFFBQVFBLENBQUtBO0tBQWFBLENBQUNBO0tBQzFGRCwyQkFBS0EsR0FBTEEsVUFBTUEsT0FBbUJBLElBQVNFLE1BQU1BLENBQUNBLE9BQU9BLENBQUNBLGdCQUFnQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDNUVGLGtCQUFDQTtBQUFEQSxFQUFDQSxFQUhnQyxHQUFHLEVBR25DO0FBSFksb0JBQVcsY0FHdkI7QUFFRDtLQUFrQ0csZ0NBQUdBO0tBQ25DQSxzQkFBbUJBLFFBQWFBLEVBQVNBLElBQVlBLEVBQVNBLE1BQWdCQTtTQUFJQyxpQkFBT0EsQ0FBQ0E7U0FBdkVBLGFBQVFBLEdBQVJBLFFBQVFBLENBQUtBO1NBQVNBLFNBQUlBLEdBQUpBLElBQUlBLENBQVFBO1NBQVNBLFdBQU1BLEdBQU5BLE1BQU1BLENBQVVBO0tBQWFBLENBQUNBO0tBQzVGRCw0QkFBS0EsR0FBTEEsVUFBTUEsT0FBbUJBLElBQVNFLE1BQU1BLENBQUNBLE9BQU9BLENBQUNBLGlCQUFpQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDN0VGLG1CQUFDQTtBQUFEQSxFQUFDQSxFQUhpQyxHQUFHLEVBR3BDO0FBSFkscUJBQVksZUFHeEI7QUFFRDtLQUFtQ0csaUNBQUdBO0tBQ3BDQSx1QkFBbUJBLFFBQWFBLEVBQVNBLElBQVlBLEVBQVNBLE1BQWdCQSxFQUMzREEsS0FBVUE7U0FDM0JDLGlCQUFPQSxDQUFDQTtTQUZTQSxhQUFRQSxHQUFSQSxRQUFRQSxDQUFLQTtTQUFTQSxTQUFJQSxHQUFKQSxJQUFJQSxDQUFRQTtTQUFTQSxXQUFNQSxHQUFOQSxNQUFNQSxDQUFVQTtTQUMzREEsVUFBS0EsR0FBTEEsS0FBS0EsQ0FBS0E7S0FFN0JBLENBQUNBO0tBQ0RELDZCQUFLQSxHQUFMQSxVQUFNQSxPQUFtQkEsSUFBU0UsTUFBTUEsQ0FBQ0EsT0FBT0EsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUM5RUYsb0JBQUNBO0FBQURBLEVBQUNBLEVBTmtDLEdBQUcsRUFNckM7QUFOWSxzQkFBYSxnQkFNekI7QUFFRDtLQUFzQ0csb0NBQUdBO0tBQ3ZDQSwwQkFBbUJBLFFBQWFBLEVBQVNBLElBQVlBLEVBQVNBLE1BQWdCQTtTQUFJQyxpQkFBT0EsQ0FBQ0E7U0FBdkVBLGFBQVFBLEdBQVJBLFFBQVFBLENBQUtBO1NBQVNBLFNBQUlBLEdBQUpBLElBQUlBLENBQVFBO1NBQVNBLFdBQU1BLEdBQU5BLE1BQU1BLENBQVVBO0tBQWFBLENBQUNBO0tBQzVGRCxnQ0FBS0EsR0FBTEEsVUFBTUEsT0FBbUJBLElBQVNFLE1BQU1BLENBQUNBLE9BQU9BLENBQUNBLHFCQUFxQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDakZGLHVCQUFDQTtBQUFEQSxFQUFDQSxFQUhxQyxHQUFHLEVBR3hDO0FBSFkseUJBQWdCLG1CQUc1QjtBQUVEO0tBQStCRyw2QkFBR0E7S0FDaENBLG1CQUFtQkEsR0FBUUEsRUFBU0EsR0FBUUE7U0FBSUMsaUJBQU9BLENBQUNBO1NBQXJDQSxRQUFHQSxHQUFIQSxHQUFHQSxDQUFLQTtTQUFTQSxRQUFHQSxHQUFIQSxHQUFHQSxDQUFLQTtLQUFhQSxDQUFDQTtLQUMxREQseUJBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUMxRUYsZ0JBQUNBO0FBQURBLEVBQUNBLEVBSDhCLEdBQUcsRUFHakM7QUFIWSxrQkFBUyxZQUdyQjtBQUVEO0tBQWdDRyw4QkFBR0E7S0FDakNBLG9CQUFtQkEsR0FBUUEsRUFBU0EsR0FBUUEsRUFBU0EsS0FBVUE7U0FBSUMsaUJBQU9BLENBQUNBO1NBQXhEQSxRQUFHQSxHQUFIQSxHQUFHQSxDQUFLQTtTQUFTQSxRQUFHQSxHQUFIQSxHQUFHQSxDQUFLQTtTQUFTQSxVQUFLQSxHQUFMQSxLQUFLQSxDQUFLQTtLQUFhQSxDQUFDQTtLQUM3RUQsMEJBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUMzRUYsaUJBQUNBO0FBQURBLEVBQUNBLEVBSCtCLEdBQUcsRUFHbEM7QUFIWSxtQkFBVSxhQUd0QjtBQUVEO0tBQWlDRywrQkFBR0E7S0FDbENBLHFCQUFtQkEsR0FBUUEsRUFBU0EsSUFBWUEsRUFBU0EsSUFBV0E7U0FBSUMsaUJBQU9BLENBQUNBO1NBQTdEQSxRQUFHQSxHQUFIQSxHQUFHQSxDQUFLQTtTQUFTQSxTQUFJQSxHQUFKQSxJQUFJQSxDQUFRQTtTQUFTQSxTQUFJQSxHQUFKQSxJQUFJQSxDQUFPQTtLQUFhQSxDQUFDQTtLQUNsRkQsMkJBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNyRUYsa0JBQUNBO0FBQURBLEVBQUNBLEVBSGdDLEdBQUcsRUFHbkM7QUFIWSxvQkFBVyxjQUd2QjtBQUVEO0tBQXNDRyxvQ0FBR0E7S0FDdkNBLDBCQUFtQkEsS0FBS0E7U0FBSUMsaUJBQU9BLENBQUNBO1NBQWpCQSxVQUFLQSxHQUFMQSxLQUFLQTtLQUFhQSxDQUFDQTtLQUN0Q0QsZ0NBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxxQkFBcUJBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ2pGRix1QkFBQ0E7QUFBREEsRUFBQ0EsRUFIcUMsR0FBRyxFQUd4QztBQUhZLHlCQUFnQixtQkFHNUI7QUFFRDtLQUFrQ0csZ0NBQUdBO0tBQ25DQSxzQkFBbUJBLFdBQWtCQTtTQUFJQyxpQkFBT0EsQ0FBQ0E7U0FBOUJBLGdCQUFXQSxHQUFYQSxXQUFXQSxDQUFPQTtLQUFhQSxDQUFDQTtLQUNuREQsNEJBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxpQkFBaUJBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQzdFRixtQkFBQ0E7QUFBREEsRUFBQ0EsRUFIaUMsR0FBRyxFQUdwQztBQUhZLHFCQUFZLGVBR3hCO0FBRUQ7S0FBZ0NHLDhCQUFHQTtLQUNqQ0Esb0JBQW1CQSxJQUFXQSxFQUFTQSxNQUFhQTtTQUFJQyxpQkFBT0EsQ0FBQ0E7U0FBN0NBLFNBQUlBLEdBQUpBLElBQUlBLENBQU9BO1NBQVNBLFdBQU1BLEdBQU5BLE1BQU1BLENBQU9BO0tBQWFBLENBQUNBO0tBQ2xFRCwwQkFBS0EsR0FBTEEsVUFBTUEsT0FBbUJBLElBQVNFLE1BQU1BLENBQUNBLE9BQU9BLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQzNFRixpQkFBQ0E7QUFBREEsRUFBQ0EsRUFIK0IsR0FBRyxFQUdsQztBQUhZLG1CQUFVLGFBR3RCO0FBRUQ7S0FBbUNHLGlDQUFHQTtLQUNwQ0EsdUJBQW1CQSxPQUFjQSxFQUFTQSxXQUFrQkE7U0FBSUMsaUJBQU9BLENBQUNBO1NBQXJEQSxZQUFPQSxHQUFQQSxPQUFPQSxDQUFPQTtTQUFTQSxnQkFBV0EsR0FBWEEsV0FBV0EsQ0FBT0E7S0FBYUEsQ0FBQ0E7S0FDMUVELDZCQUFLQSxHQUFMQSxVQUFNQSxPQUFtQkEsSUFBU0UsTUFBTUEsQ0FBQ0EsT0FBT0EsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUM5RUYsb0JBQUNBO0FBQURBLEVBQUNBLEVBSGtDLEdBQUcsRUFHckM7QUFIWSxzQkFBYSxnQkFHekI7QUFFRDtLQUE0QkcsMEJBQUdBO0tBQzdCQSxnQkFBbUJBLFNBQWlCQSxFQUFTQSxJQUFTQSxFQUFTQSxLQUFVQTtTQUFJQyxpQkFBT0EsQ0FBQ0E7U0FBbEVBLGNBQVNBLEdBQVRBLFNBQVNBLENBQVFBO1NBQVNBLFNBQUlBLEdBQUpBLElBQUlBLENBQUtBO1NBQVNBLFVBQUtBLEdBQUxBLEtBQUtBLENBQUtBO0tBQWFBLENBQUNBO0tBQ3ZGRCxzQkFBS0EsR0FBTEEsVUFBTUEsT0FBbUJBLElBQVNFLE1BQU1BLENBQUNBLE9BQU9BLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ3ZFRixhQUFDQTtBQUFEQSxFQUFDQSxFQUgyQixHQUFHLEVBRzlCO0FBSFksZUFBTSxTQUdsQjtBQUVEO0tBQStCRyw2QkFBR0E7S0FDaENBLG1CQUFtQkEsVUFBZUE7U0FBSUMsaUJBQU9BLENBQUNBO1NBQTNCQSxlQUFVQSxHQUFWQSxVQUFVQSxDQUFLQTtLQUFhQSxDQUFDQTtLQUNoREQseUJBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUMxRUYsZ0JBQUNBO0FBQURBLEVBQUNBLEVBSDhCLEdBQUcsRUFHakM7QUFIWSxrQkFBUyxZQUdyQjtBQUVEO0tBQWdDRyw4QkFBR0E7S0FDakNBLG9CQUFtQkEsUUFBYUEsRUFBU0EsSUFBWUEsRUFBU0EsRUFBWUEsRUFBU0EsSUFBV0E7U0FDNUZDLGlCQUFPQSxDQUFDQTtTQURTQSxhQUFRQSxHQUFSQSxRQUFRQSxDQUFLQTtTQUFTQSxTQUFJQSxHQUFKQSxJQUFJQSxDQUFRQTtTQUFTQSxPQUFFQSxHQUFGQSxFQUFFQSxDQUFVQTtTQUFTQSxTQUFJQSxHQUFKQSxJQUFJQSxDQUFPQTtLQUU5RkEsQ0FBQ0E7S0FDREQsMEJBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUMzRUYsaUJBQUNBO0FBQURBLEVBQUNBLEVBTCtCLEdBQUcsRUFLbEM7QUFMWSxtQkFBVSxhQUt0QjtBQUVEO0tBQW9DRyxrQ0FBR0E7S0FDckNBLHdCQUFtQkEsUUFBYUEsRUFBU0EsSUFBWUEsRUFBU0EsRUFBWUEsRUFBU0EsSUFBV0E7U0FDNUZDLGlCQUFPQSxDQUFDQTtTQURTQSxhQUFRQSxHQUFSQSxRQUFRQSxDQUFLQTtTQUFTQSxTQUFJQSxHQUFKQSxJQUFJQSxDQUFRQTtTQUFTQSxPQUFFQSxHQUFGQSxFQUFFQSxDQUFVQTtTQUFTQSxTQUFJQSxHQUFKQSxJQUFJQSxDQUFPQTtLQUU5RkEsQ0FBQ0E7S0FDREQsOEJBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxtQkFBbUJBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQy9FRixxQkFBQ0E7QUFBREEsRUFBQ0EsRUFMbUMsR0FBRyxFQUt0QztBQUxZLHVCQUFjLGlCQUsxQjtBQUVEO0tBQWtDRyxnQ0FBR0E7S0FDbkNBLHNCQUFtQkEsTUFBV0EsRUFBU0EsSUFBV0E7U0FBSUMsaUJBQU9BLENBQUNBO1NBQTNDQSxXQUFNQSxHQUFOQSxNQUFNQSxDQUFLQTtTQUFTQSxTQUFJQSxHQUFKQSxJQUFJQSxDQUFPQTtLQUFhQSxDQUFDQTtLQUNoRUQsNEJBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxpQkFBaUJBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQzdFRixtQkFBQ0E7QUFBREEsRUFBQ0EsRUFIaUMsR0FBRyxFQUdwQztBQUhZLHFCQUFZLGVBR3hCO0FBRUQ7S0FBbUNHLGlDQUFHQTtLQUNwQ0EsdUJBQW1CQSxHQUFRQSxFQUFTQSxNQUFjQSxFQUFTQSxRQUFnQkE7U0FBSUMsaUJBQU9BLENBQUNBO1NBQXBFQSxRQUFHQSxHQUFIQSxHQUFHQSxDQUFLQTtTQUFTQSxXQUFNQSxHQUFOQSxNQUFNQSxDQUFRQTtTQUFTQSxhQUFRQSxHQUFSQSxRQUFRQSxDQUFRQTtLQUFhQSxDQUFDQTtLQUN6RkQsNkJBQUtBLEdBQUxBLFVBQU1BLE9BQW1CQSxJQUFTRSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNuRUYsZ0NBQVFBLEdBQVJBLGNBQXFCRyxNQUFNQSxDQUFJQSxJQUFJQSxDQUFDQSxNQUFNQSxZQUFPQSxJQUFJQSxDQUFDQSxRQUFVQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNyRUgsb0JBQUNBO0FBQURBLEVBQUNBLEVBSmtDLEdBQUcsRUFJckM7QUFKWSxzQkFBYSxnQkFJekI7QUFFRDtLQUNFSSx5QkFBbUJBLEdBQVdBLEVBQVNBLFFBQWlCQSxFQUFTQSxJQUFZQSxFQUMxREEsVUFBeUJBO1NBRHpCQyxRQUFHQSxHQUFIQSxHQUFHQSxDQUFRQTtTQUFTQSxhQUFRQSxHQUFSQSxRQUFRQSxDQUFTQTtTQUFTQSxTQUFJQSxHQUFKQSxJQUFJQSxDQUFRQTtTQUMxREEsZUFBVUEsR0FBVkEsVUFBVUEsQ0FBZUE7S0FBR0EsQ0FBQ0E7S0FDbERELHNCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBSFksd0JBQWUsa0JBRzNCO0FBd0JEO0tBQUFFO0tBcUVBQyxDQUFDQTtLQXBFQ0QseUNBQVdBLEdBQVhBLFVBQVlBLEdBQVdBO1NBQ3JCRSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNyQkEsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDdEJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0tBQ2RBLENBQUNBO0tBQ0RGLHdDQUFVQSxHQUFWQSxVQUFXQSxHQUFVQSxJQUFTRyxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxHQUFHQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUN0RUgsOENBQWdCQSxHQUFoQkEsVUFBaUJBLEdBQWdCQTtTQUMvQkksR0FBR0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDMUJBLEdBQUdBLENBQUNBLE9BQU9BLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3hCQSxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUN6QkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7S0FDZEEsQ0FBQ0E7S0FDREosdUNBQVNBLEdBQVRBLFVBQVVBLEdBQWdCQTtTQUN4QkssR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3hCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtLQUNkQSxDQUFDQTtLQUNETCwrQ0FBaUJBLEdBQWpCQSxVQUFrQkEsR0FBaUJBO1NBQ2pDTSxHQUFHQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUN2QkEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDeEJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0tBQ2RBLENBQUNBO0tBQ0ROLG1EQUFxQkEsR0FBckJBLFVBQXNCQSxHQUFxQkEsSUFBU08sTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDbEVQLGdEQUFrQkEsR0FBbEJBLFVBQW1CQSxHQUFrQkEsSUFBU1EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDdEZSLDRDQUFjQSxHQUFkQSxVQUFlQSxHQUFjQTtTQUMzQlMsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtLQUNkQSxDQUFDQTtLQUNEVCw2Q0FBZUEsR0FBZkEsVUFBZ0JBLEdBQWVBO1NBQzdCVSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNwQkEsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3RCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtLQUNkQSxDQUFDQTtLQUNEViwrQ0FBaUJBLEdBQWpCQSxVQUFrQkEsR0FBaUJBLElBQVNXLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ3BGWCw2Q0FBZUEsR0FBZkEsVUFBZ0JBLEdBQWVBLElBQVNZLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQzNFWixtREFBcUJBLEdBQXJCQSxVQUFzQkEsR0FBcUJBLElBQVNhLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO0tBQ2xFYiw2Q0FBZUEsR0FBZkEsVUFBZ0JBLEdBQWVBO1NBQzdCYyxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUN6QkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7S0FDakNBLENBQUNBO0tBQ0RkLDRDQUFjQSxHQUFkQSxVQUFlQSxHQUFjQTtTQUMzQmUsR0FBR0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDM0JBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0tBQ2RBLENBQUNBO0tBQ0RmLCtDQUFpQkEsR0FBakJBLFVBQWtCQSxHQUFpQkE7U0FDakNnQixHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUN6QkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7S0FDZEEsQ0FBQ0E7S0FDRGhCLGdEQUFrQkEsR0FBbEJBLFVBQW1CQSxHQUFrQkE7U0FDbkNpQixHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUN6QkEsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDdEJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0tBQ2RBLENBQUNBO0tBQ0RqQixtREFBcUJBLEdBQXJCQSxVQUFzQkEsR0FBcUJBO1NBQ3pDa0IsR0FBR0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDekJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0tBQ2RBLENBQUNBO0tBQ0RsQixpREFBbUJBLEdBQW5CQSxVQUFvQkEsR0FBbUJBO1NBQ3JDbUIsR0FBR0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDekJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO0tBQ2pDQSxDQUFDQTtLQUNEbkIsc0NBQVFBLEdBQVJBLFVBQVNBLElBQVdBO1NBQXBCb0IsaUJBR0NBO1NBRkNBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLGFBQUdBLElBQUlBLFVBQUdBLENBQUNBLEtBQUtBLENBQUNBLEtBQUlBLENBQUNBLEVBQWZBLENBQWVBLENBQUNBLENBQUNBO1NBQ3JDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtLQUNkQSxDQUFDQTtLQUNEcEIsd0NBQVVBLEdBQVZBLFVBQVdBLEdBQVVBLElBQVNxQixNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUM5Q3JCLDBCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBckVZLDRCQUFtQixzQkFxRS9CO0FBRUQ7S0FBQXNCO0tBNkVBQyxDQUFDQTtLQTVFQ0QsOENBQXFCQSxHQUFyQkEsVUFBc0JBLEdBQXFCQSxJQUFTRSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUVqRUYsMkNBQWtCQSxHQUFsQkEsVUFBbUJBLEdBQWtCQTtTQUNuQ0csTUFBTUEsQ0FBQ0EsSUFBSUEsYUFBYUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsT0FBT0EsRUFBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDeEVBLENBQUNBO0tBRURILDhDQUFxQkEsR0FBckJBLFVBQXNCQSxHQUFxQkEsSUFBU0ksTUFBTUEsQ0FBQ0EsSUFBSUEsZ0JBQWdCQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUU3RkosMENBQWlCQSxHQUFqQkEsVUFBa0JBLEdBQWlCQTtTQUNqQ0ssTUFBTUEsQ0FBQ0EsSUFBSUEsWUFBWUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsRUFBRUEsR0FBR0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7S0FDMUVBLENBQUNBO0tBRURMLDJDQUFrQkEsR0FBbEJBLFVBQW1CQSxHQUFrQkE7U0FDbkNNLE1BQU1BLENBQUNBLElBQUlBLGFBQWFBLENBQUNBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLEVBQUVBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLEdBQUdBLENBQUNBLE1BQU1BLEVBQUVBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0tBQ3RGQSxDQUFDQTtLQUVETiw4Q0FBcUJBLEdBQXJCQSxVQUFzQkEsR0FBcUJBO1NBQ3pDTyxNQUFNQSxDQUFDQSxJQUFJQSxnQkFBZ0JBLENBQUNBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLEVBQUVBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLEdBQUdBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO0tBQzlFQSxDQUFDQTtLQUVEUCx3Q0FBZUEsR0FBZkEsVUFBZ0JBLEdBQWVBO1NBQzdCUSxNQUFNQSxDQUFDQSxJQUFJQSxVQUFVQSxDQUFDQSxHQUFHQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQSxJQUFJQSxFQUFFQSxHQUFHQSxDQUFDQSxFQUFFQSxFQUFFQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUM3RkEsQ0FBQ0E7S0FFRFIsNENBQW1CQSxHQUFuQkEsVUFBb0JBLEdBQW1CQTtTQUNyQ1MsTUFBTUEsQ0FBQ0EsSUFBSUEsY0FBY0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsRUFBRUEsR0FBR0EsQ0FBQ0EsRUFBRUEsRUFBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDakdBLENBQUNBO0tBRURULDBDQUFpQkEsR0FBakJBLFVBQWtCQSxHQUFpQkE7U0FDakNVLE1BQU1BLENBQUNBLElBQUlBLFlBQVlBLENBQUNBLEdBQUdBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO0tBQzNFQSxDQUFDQTtLQUVEViwwQ0FBaUJBLEdBQWpCQSxVQUFrQkEsR0FBaUJBO1NBQ2pDVyxNQUFNQSxDQUFDQSxJQUFJQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxHQUFHQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUMxREEsQ0FBQ0E7S0FFRFgsd0NBQWVBLEdBQWZBLFVBQWdCQSxHQUFlQTtTQUM3QlksTUFBTUEsQ0FBQ0EsSUFBSUEsVUFBVUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsRUFBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDN0RBLENBQUNBO0tBRURaLG9DQUFXQSxHQUFYQSxVQUFZQSxHQUFXQTtTQUNyQmEsTUFBTUEsQ0FBQ0EsSUFBSUEsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsU0FBU0EsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDaEZBLENBQUNBO0tBRURiLHVDQUFjQSxHQUFkQSxVQUFlQSxHQUFjQSxJQUFTYyxNQUFNQSxDQUFDQSxJQUFJQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxVQUFVQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUV6RmQseUNBQWdCQSxHQUFoQkEsVUFBaUJBLEdBQWdCQTtTQUMvQmUsTUFBTUEsQ0FBQ0EsSUFBSUEsV0FBV0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFDbERBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO0tBQ25EQSxDQUFDQTtLQUVEZixrQ0FBU0EsR0FBVEEsVUFBVUEsR0FBZ0JBO1NBQ3hCZ0IsTUFBTUEsQ0FBQ0EsSUFBSUEsV0FBV0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsR0FBR0EsQ0FBQ0EsSUFBSUEsRUFBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDakZBLENBQUNBO0tBRURoQix1Q0FBY0EsR0FBZEEsVUFBZUEsR0FBY0E7U0FDM0JpQixNQUFNQSxDQUFDQSxJQUFJQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNqRUEsQ0FBQ0E7S0FFRGpCLHdDQUFlQSxHQUFmQSxVQUFnQkEsR0FBZUE7U0FDN0JrQixNQUFNQSxDQUFDQSxJQUFJQSxVQUFVQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUN6RkEsQ0FBQ0E7S0FFRGxCLGlDQUFRQSxHQUFSQSxVQUFTQSxJQUFXQTtTQUNsQm1CLElBQUlBLEdBQUdBLEdBQUdBLHdCQUFXQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtTQUNuREEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDckNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQy9CQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQTtLQUNiQSxDQUFDQTtLQUVEbkIsbUNBQVVBLEdBQVZBLFVBQVdBLEdBQVVBLElBQVNvQixNQUFNQSxDQUFDQSxJQUFJQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxHQUFHQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUVqRnBCLG1DQUFVQSxHQUFWQSxVQUFXQSxHQUFVQTtTQUNuQnFCLE1BQU1BLENBQUNBLElBQUlBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLE1BQU1BLEVBQUVBLEdBQUdBLENBQUNBLHVCQUF1QkEsRUFBRUEsR0FBR0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7S0FDMUVBLENBQUNBO0tBQ0hyQixxQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQTdFWSx1QkFBYyxpQkE2RTFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMxVEQsd0NBQXlCLENBQWlDLENBQUM7QUFDM0Qsd0NBQXNDLEVBQWdDLENBQUM7QUFDdkUsa0NBQW9FLENBQTBCLENBQUM7QUFDL0Ysd0NBQTRCLEVBQWdDLENBQUM7QUFFN0QsWUFBWSxTQUFTO0tBQ25Cc0IsbURBQVNBO0tBQ1RBLHFEQUFVQTtLQUNWQSwrQ0FBT0E7S0FDUEEsNkNBQU1BO0tBQ05BLGlEQUFRQTtLQUNSQSw2Q0FBTUE7QUFDUkEsRUFBQ0EsRUFQVyxpQkFBUyxLQUFULGlCQUFTLFFBT3BCO0FBUEQsS0FBWSxTQUFTLEdBQVQsaUJBT1g7QUFFRDtLQUFBQztLQVlBQyxDQUFDQTtLQVZDRCx3QkFBUUEsR0FBUkEsVUFBU0EsSUFBWUE7U0FDbkJFLElBQUlBLE9BQU9BLEdBQUdBLElBQUlBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ2pDQSxJQUFJQSxNQUFNQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNoQkEsSUFBSUEsS0FBS0EsR0FBR0EsT0FBT0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7U0FDaENBLE9BQU9BLEtBQUtBLElBQUlBLElBQUlBLEVBQUVBLENBQUNBO2FBQ3JCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTthQUNuQkEsS0FBS0EsR0FBR0EsT0FBT0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7U0FDOUJBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBO0tBQ2hCQSxDQUFDQTtLQVhIRjtTQUFDQSx1QkFBVUEsRUFBRUE7O2VBWVpBO0tBQURBLFlBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFYWSxjQUFLLFFBV2pCO0FBRUQ7S0FDRUcsZUFBbUJBLEtBQWFBLEVBQVNBLElBQWVBLEVBQVNBLFFBQWdCQSxFQUM5REEsUUFBZ0JBO1NBRGhCQyxVQUFLQSxHQUFMQSxLQUFLQSxDQUFRQTtTQUFTQSxTQUFJQSxHQUFKQSxJQUFJQSxDQUFXQTtTQUFTQSxhQUFRQSxHQUFSQSxRQUFRQSxDQUFRQTtTQUM5REEsYUFBUUEsR0FBUkEsUUFBUUEsQ0FBUUE7S0FBR0EsQ0FBQ0E7S0FFdkNELDJCQUFXQSxHQUFYQSxVQUFZQSxJQUFZQTtTQUN0QkUsTUFBTUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsU0FBU0EsQ0FBQ0EsU0FBU0EsSUFBSUEsSUFBSUEsQ0FBQ0EsUUFBUUEsSUFBSUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7S0FDckVBLENBQUNBO0tBRURGLHdCQUFRQSxHQUFSQSxjQUFzQkcsTUFBTUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsU0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFL0RILHdCQUFRQSxHQUFSQSxjQUFzQkksTUFBTUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsU0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFL0RKLDBCQUFVQSxHQUFWQSxVQUFXQSxRQUFnQkE7U0FDekJLLE1BQU1BLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLFNBQVNBLENBQUNBLFFBQVFBLElBQUlBLElBQUlBLENBQUNBLFFBQVFBLElBQUlBLFFBQVFBLENBQUNBLENBQUNBO0tBQ3hFQSxDQUFDQTtLQUVETCw0QkFBWUEsR0FBWkEsY0FBMEJNLE1BQU1BLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLFNBQVNBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBRXZFTix5QkFBU0EsR0FBVEEsY0FBdUJPLE1BQU1BLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLFNBQVNBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBRWpFUCw0QkFBWUEsR0FBWkEsY0FBMEJRLE1BQU1BLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLFNBQVNBLENBQUNBLE9BQU9BLElBQUlBLElBQUlBLENBQUNBLFFBQVFBLElBQUlBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBRTlGUiw2QkFBYUEsR0FBYkEsY0FBMkJTLE1BQU1BLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLFNBQVNBLENBQUNBLE9BQU9BLElBQUlBLElBQUlBLENBQUNBLFFBQVFBLElBQUlBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBRWhHVCxrQ0FBa0JBLEdBQWxCQTtTQUNFVSxNQUFNQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxTQUFTQSxDQUFDQSxPQUFPQSxJQUFJQSxJQUFJQSxDQUFDQSxRQUFRQSxJQUFJQSxXQUFXQSxDQUFDQSxDQUFDQTtLQUMxRUEsQ0FBQ0E7S0FFRFYsNkJBQWFBLEdBQWJBLGNBQTJCVyxNQUFNQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxTQUFTQSxDQUFDQSxPQUFPQSxJQUFJQSxJQUFJQSxDQUFDQSxRQUFRQSxJQUFJQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUVoR1gsOEJBQWNBLEdBQWRBLGNBQTRCWSxNQUFNQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxTQUFTQSxDQUFDQSxPQUFPQSxJQUFJQSxJQUFJQSxDQUFDQSxRQUFRQSxJQUFJQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUVsR1osd0JBQVFBLEdBQVJBO1NBQ0VhLHlCQUF5QkE7U0FDekJBLE1BQU1BLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLFNBQVNBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO0tBQzlEQSxDQUFDQTtLQUVEYix3QkFBUUEsR0FBUkE7U0FDRWMsTUFBTUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbEJBLEtBQUtBLFNBQVNBLENBQUNBLFNBQVNBLENBQUNBO2FBQ3pCQSxLQUFLQSxTQUFTQSxDQUFDQSxVQUFVQSxDQUFDQTthQUMxQkEsS0FBS0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0E7YUFDdkJBLEtBQUtBLFNBQVNBLENBQUNBLFFBQVFBLENBQUNBO2FBQ3hCQSxLQUFLQSxTQUFTQSxDQUFDQSxNQUFNQTtpQkFDbkJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBO2FBQ3ZCQSxLQUFLQSxTQUFTQSxDQUFDQSxNQUFNQTtpQkFDbkJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ2xDQTtpQkFDRUEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7U0FDaEJBLENBQUNBO0tBQ0hBLENBQUNBO0tBQ0hkLFlBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFuRFksY0FBSyxRQW1EakI7QUFFRCw0QkFBMkIsS0FBYSxFQUFFLElBQVk7S0FDcERlLE1BQU1BLENBQUNBLElBQUlBLEtBQUtBLENBQUNBLEtBQUtBLEVBQUVBLFNBQVNBLENBQUNBLFNBQVNBLEVBQUVBLElBQUlBLEVBQUVBLG9CQUFhQSxDQUFDQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtBQUN2RkEsRUFBQ0E7QUFFRCw2QkFBNEIsS0FBYSxFQUFFLElBQVk7S0FDckRDLE1BQU1BLENBQUNBLElBQUlBLEtBQUtBLENBQUNBLEtBQUtBLEVBQUVBLFNBQVNBLENBQUNBLFVBQVVBLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO0FBQ3pEQSxFQUFDQTtBQUVELDBCQUF5QixLQUFhLEVBQUUsSUFBWTtLQUNsREMsTUFBTUEsQ0FBQ0EsSUFBSUEsS0FBS0EsQ0FBQ0EsS0FBS0EsRUFBRUEsU0FBU0EsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7QUFDdERBLEVBQUNBO0FBRUQsMkJBQTBCLEtBQWEsRUFBRSxJQUFZO0tBQ25EQyxNQUFNQSxDQUFDQSxJQUFJQSxLQUFLQSxDQUFDQSxLQUFLQSxFQUFFQSxTQUFTQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtBQUN2REEsRUFBQ0E7QUFFRCx5QkFBd0IsS0FBYSxFQUFFLElBQVk7S0FDakRDLE1BQU1BLENBQUNBLElBQUlBLEtBQUtBLENBQUNBLEtBQUtBLEVBQUVBLFNBQVNBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO0FBQ3JEQSxFQUFDQTtBQUVELHlCQUF3QixLQUFhLEVBQUUsQ0FBUztLQUM5Q0MsTUFBTUEsQ0FBQ0EsSUFBSUEsS0FBS0EsQ0FBQ0EsS0FBS0EsRUFBRUEsU0FBU0EsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7QUFDbkRBLEVBQUNBO0FBR1UsWUFBRyxHQUFVLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBRXJELGFBQUksR0FBRyxDQUFDLENBQUM7QUFDVCxhQUFJLEdBQUcsQ0FBQyxDQUFDO0FBQ1QsWUFBRyxHQUFHLEVBQUUsQ0FBQztBQUNULGNBQUssR0FBRyxFQUFFLENBQUM7QUFDWCxZQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ1QsWUFBRyxHQUFHLEVBQUUsQ0FBQztBQUNULGVBQU0sR0FBRyxFQUFFLENBQUM7QUFDWixjQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ1gsWUFBRyxHQUFHLEVBQUUsQ0FBQztBQUNULGNBQUssR0FBRyxFQUFFLENBQUM7QUFDWCxXQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ1IsaUJBQVEsR0FBRyxFQUFFLENBQUM7QUFDZCxtQkFBVSxHQUFHLEVBQUUsQ0FBQztBQUNoQixZQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ1QsZ0JBQU8sR0FBRyxFQUFFLENBQUM7QUFDYixnQkFBTyxHQUFHLEVBQUUsQ0FBQztBQUNiLGNBQUssR0FBRyxFQUFFLENBQUM7QUFDWCxjQUFLLEdBQUcsRUFBRSxDQUFDO0FBQ1gsZUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNaLGVBQU0sR0FBRyxFQUFFLENBQUM7QUFDWixnQkFBTyxHQUFHLEVBQUUsQ0FBQztBQUNiLGVBQU0sR0FBRyxFQUFFLENBQUM7QUFDWixlQUFNLEdBQUcsRUFBRSxDQUFDO0FBQ1osbUJBQVUsR0FBRyxFQUFFLENBQUM7QUFDaEIsWUFBRyxHQUFHLEVBQUUsQ0FBQztBQUNULFlBQUcsR0FBRyxFQUFFLENBQUM7QUFDVCxZQUFHLEdBQUcsRUFBRSxDQUFDO0FBQ1Qsa0JBQVMsR0FBRyxFQUFFLENBQUM7QUFFNUIsS0FBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBQ2QsS0FBTSxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRWQsS0FBTSxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUVuQixrQkFBUyxHQUFHLEVBQUUsQ0FBQztBQUNmLG1CQUFVLEdBQUcsRUFBRSxDQUFDO0FBQ2hCLGtCQUFTLEdBQUcsRUFBRSxDQUFDO0FBQzVCLEtBQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztBQUNsQixLQUFNLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFZCxLQUFNLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxFQUFFLEVBQUUsR0FBRyxHQUFHLEVBQUUsRUFBRSxHQUFHLEdBQUcsRUFBRSxFQUFFLEdBQUcsR0FBRyxDQUFDO0FBRWpGLGdCQUFPLEdBQUcsR0FBRyxDQUFDO0FBQ2QsYUFBSSxHQUFHLEdBQUcsQ0FBQztBQUNYLGdCQUFPLEdBQUcsR0FBRyxDQUFDO0FBQzNCLEtBQU0sS0FBSyxHQUFHLEdBQUcsQ0FBQztBQUdsQjtLQUFrQ0MsZ0NBQWFBO0tBQzdDQSxzQkFBbUJBLE9BQU9BO1NBQUlDLGlCQUFPQSxDQUFDQTtTQUFuQkEsWUFBT0EsR0FBUEEsT0FBT0E7S0FBYUEsQ0FBQ0E7S0FFeENELCtCQUFRQSxHQUFSQSxjQUFxQkUsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDN0NGLG1CQUFDQTtBQUFEQSxFQUFDQSxFQUppQywwQkFBYSxFQUk5QztBQUpZLHFCQUFZLGVBSXhCO0FBRUQ7S0FLRUcsa0JBQW1CQSxLQUFhQTtTQUFiQyxVQUFLQSxHQUFMQSxLQUFLQSxDQUFRQTtTQUhoQ0EsU0FBSUEsR0FBV0EsQ0FBQ0EsQ0FBQ0E7U0FDakJBLFVBQUtBLEdBQVdBLENBQUNBLENBQUNBLENBQUNBO1NBR2pCQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxLQUFLQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUMzQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7S0FDakJBLENBQUNBO0tBRURELDBCQUFPQSxHQUFQQTtTQUNFRSxJQUFJQSxDQUFDQSxJQUFJQTthQUNMQSxFQUFFQSxJQUFJQSxDQUFDQSxLQUFLQSxJQUFJQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxZQUFJQSxHQUFHQSxvQkFBYUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7S0FDNUZBLENBQUNBO0tBRURGLDRCQUFTQSxHQUFUQTtTQUNFRyxJQUFJQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxNQUFNQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxFQUFFQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxFQUFFQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUVuRkEsbUJBQW1CQTtTQUNuQkEsT0FBT0EsSUFBSUEsSUFBSUEsY0FBTUEsRUFBRUEsQ0FBQ0E7YUFDdEJBLEVBQUVBLENBQUNBLENBQUNBLEVBQUVBLEtBQUtBLElBQUlBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBO2lCQUN0QkEsSUFBSUEsR0FBR0EsWUFBSUEsQ0FBQ0E7aUJBQ1pBLEtBQUtBLENBQUNBO2FBQ1JBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNOQSxJQUFJQSxHQUFHQSxvQkFBYUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsS0FBS0EsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7YUFDaERBLENBQUNBO1NBQ0hBLENBQUNBO1NBRURBLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBO1NBQ2pCQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxLQUFLQSxDQUFDQTtTQUVuQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsSUFBSUEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDcEJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO1NBQ2RBLENBQUNBO1NBRURBLGtDQUFrQ0E7U0FDbENBLEVBQUVBLENBQUNBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsRUFBRUEsQ0FBQ0E7U0FDMURBLEVBQUVBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1NBRWpEQSxJQUFJQSxLQUFLQSxHQUFXQSxLQUFLQSxDQUFDQTtTQUMxQkEsTUFBTUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDYkEsS0FBS0EsZUFBT0E7aUJBQ1ZBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO2lCQUNmQSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxLQUFLQSxDQUFDQSxHQUFHQSxpQkFBaUJBLENBQUNBLEtBQUtBLEVBQUVBLGVBQU9BLENBQUNBLENBQUNBO2FBQ3pGQSxLQUFLQSxlQUFPQSxDQUFDQTthQUNiQSxLQUFLQSxlQUFPQSxDQUFDQTthQUNiQSxLQUFLQSxlQUFPQSxDQUFDQTthQUNiQSxLQUFLQSxlQUFPQSxDQUFDQTthQUNiQSxLQUFLQSxpQkFBU0EsQ0FBQ0E7YUFDZkEsS0FBS0EsaUJBQVNBLENBQUNBO2FBQ2ZBLEtBQUtBLGNBQU1BLENBQUNBO2FBQ1pBLEtBQUtBLGNBQU1BLENBQUNBO2FBQ1pBLEtBQUtBLGtCQUFVQTtpQkFDYkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDekNBLEtBQUtBLFdBQUdBLENBQUNBO2FBQ1RBLEtBQUtBLFdBQUdBO2lCQUNOQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxFQUFFQSxDQUFDQTthQUMzQkEsS0FBS0EsYUFBS0EsQ0FBQ0E7YUFDWEEsS0FBS0EsYUFBS0EsQ0FBQ0E7YUFDWEEsS0FBS0EsY0FBTUEsQ0FBQ0E7YUFDWkEsS0FBS0EsYUFBS0EsQ0FBQ0E7YUFDWEEsS0FBS0EsY0FBTUEsQ0FBQ0E7YUFDWkEsS0FBS0EsZ0JBQVFBLENBQUNBO2FBQ2RBLEtBQUtBLE1BQU1BO2lCQUNUQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxDQUFDQSxLQUFLQSxFQUFFQSxvQkFBYUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDcEVBLEtBQUtBLGlCQUFTQTtpQkFDWkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxLQUFLQSxFQUFFQSxHQUFHQSxFQUFFQSxlQUFPQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTthQUM1REEsS0FBS0EsV0FBR0EsQ0FBQ0E7YUFDVEEsS0FBS0EsV0FBR0E7aUJBQ05BLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsS0FBS0EsRUFBRUEsb0JBQWFBLENBQUNBLFlBQVlBLENBQUNBLElBQUlBLENBQUNBLEVBQUVBLFdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO2FBQ3JGQSxLQUFLQSxhQUFLQSxDQUFDQTthQUNYQSxLQUFLQSxXQUFHQTtpQkFDTkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxLQUFLQSxFQUFFQSxvQkFBYUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsV0FBR0EsRUFBRUEsR0FBR0EsRUFBRUEsV0FBR0EsRUFDdERBLEdBQUdBLENBQUNBLENBQUNBO2FBQ3ZDQSxLQUFLQSxrQkFBVUE7aUJBQ2JBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsS0FBS0EsRUFBRUEsR0FBR0EsRUFBRUEsa0JBQVVBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBO2FBQy9EQSxLQUFLQSxZQUFJQTtpQkFDUEEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxLQUFLQSxFQUFFQSxHQUFHQSxFQUFFQSxZQUFJQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTthQUN6REEsS0FBS0EsS0FBS0E7aUJBQ1JBLE9BQU9BLFlBQVlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO3FCQUFFQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTtpQkFDL0NBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBO1NBQzVCQSxDQUFDQTtTQUVEQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSwyQkFBeUJBLG9CQUFhQSxDQUFDQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUM1RUEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0E7S0FDZEEsQ0FBQ0E7S0FFREgsZ0NBQWFBLEdBQWJBLFVBQWNBLEtBQWFBLEVBQUVBLElBQVlBO1NBQ3ZDSSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUMxQkEsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7U0FDZkEsTUFBTUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtLQUN4Q0EsQ0FBQ0E7S0FHREosK0JBQVlBLEdBQVpBLFVBQWFBLEtBQWFBLEVBQUVBLEdBQVdBO1NBQ3JDSyxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxvQkFBYUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDdERBLE1BQU1BLENBQUNBLHVCQUFVQSxDQUFDQSxHQUFHQSxDQUFDQSxTQUFTQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUN2Q0EsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7U0FDZkEsTUFBTUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxLQUFLQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtLQUN0Q0EsQ0FBQ0E7S0FFREw7Ozs7Ozs7Ozs7UUFVR0E7S0FDSEEsc0NBQW1CQSxHQUFuQkEsVUFBb0JBLEtBQWFBLEVBQUVBLEdBQVdBLEVBQUVBLE9BQWVBLEVBQUVBLEdBQVdBLEVBQUVBLFNBQWtCQSxFQUM1RUEsS0FBY0E7U0FDaENNLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLG9CQUFhQSxDQUFDQSxVQUFVQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUN0REEsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7U0FDZkEsSUFBSUEsR0FBR0EsR0FBV0EsR0FBR0EsQ0FBQ0E7U0FDdEJBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLElBQUlBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBO2FBQ3pCQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTthQUNmQSxHQUFHQSxJQUFJQSxHQUFHQSxDQUFDQTtTQUNiQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsSUFBSUEsSUFBSUEsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO2FBQ2ZBLEdBQUdBLElBQUlBLEtBQUtBLENBQUNBO1NBQ2ZBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLHVCQUFVQSxDQUFDQSxHQUFHQSxDQUFDQSxTQUFTQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUN2Q0EsTUFBTUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxLQUFLQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtLQUN0Q0EsQ0FBQ0E7S0FFRE4saUNBQWNBLEdBQWRBO1NBQ0VPLE1BQU1BLENBQUNBLGlCQUFpQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDckNBLElBQUlBLEtBQUtBLEdBQVdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBO1NBQy9CQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTtTQUNmQSxPQUFPQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBO2FBQUVBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO1NBQ25EQSxJQUFJQSxHQUFHQSxHQUFXQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUMxREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsdUJBQVVBLENBQUNBLEdBQUdBLENBQUNBLFFBQVFBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ2xDQSxNQUFNQSxDQUFDQSxlQUFlQSxDQUFDQSxLQUFLQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUNyQ0EsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsTUFBTUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxLQUFLQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUN4Q0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFAsNkJBQVVBLEdBQVZBLFVBQVdBLEtBQWFBO1NBQ3RCUSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUMzQkEsSUFBSUEsTUFBTUEsR0FBWUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsS0FBS0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDN0NBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBLENBQUVBLHNCQUFzQkE7U0FDdkNBLE9BQU9BLElBQUlBLEVBQUVBLENBQUNBO2FBQ1pBLEVBQUVBLENBQUNBLENBQUNBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBRXpCQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxJQUFJQSxlQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDaENBLE1BQU1BLEdBQUdBLEtBQUtBLENBQUNBO2FBQ2pCQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDdENBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO2lCQUNmQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtxQkFBQ0EsSUFBSUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7aUJBQzlDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtxQkFBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0Esa0JBQWtCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDNURBLE1BQU1BLEdBQUdBLEtBQUtBLENBQUNBO2FBQ2pCQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDTkEsS0FBS0EsQ0FBQ0E7YUFDUkEsQ0FBQ0E7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c0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM3Q0EsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLHdDQUFzQ0EsR0FBR0EsQ0FBQ0EsSUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDNUVBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLElBQUlBLFFBQVFBLEdBQUdBLEdBQUdBLENBQUNBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ3hDQSxJQUFJQSxLQUFLQSxHQUFHQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNsQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLGFBQWFBLEVBQUVBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLEdBQUdBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLElBQUlBLEVBQzdEQSxRQUFRQSxDQUFDQSxDQUFDQTtTQUNuQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFIscURBQWVBLEdBQWZBLFVBQWdCQSxHQUFlQTtTQUM3QlMsSUFBSUEsR0FBR0EsR0FBR0EsR0FBR0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDOUJBLElBQUlBLEdBQUdBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQzlCQSxJQUFJQSxLQUFLQSxHQUFHQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNsQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLFVBQVVBLEVBQUVBLElBQUlBLEVBQUVBLElBQUlBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEtBQUtBLENBQUNBLEVBQUVBLElBQUlBLEVBQUVBLEdBQUdB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S0FBS0EsSUFBSUE7aUJBQ1BBLElBQUlBLFNBQVNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUN2QkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EseUJBQVVBLENBQUNBLGdCQUFnQkEsRUFBRUEsa0JBQWtCQSxFQUFFQSxJQUFJQSxFQUFFQSxFQUFFQSxFQUFFQSxTQUFTQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDNUZBLElBQUlBLEtBQUtBLEdBQUdBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNsQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0E7aUJBQ3JCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSx5QkFBVUEsQ0FBQ0EsV0FBV0EsRUFBRUEsTUFBTUEsRUFBRUEsMkNBQW1CQSxDQUFDQSxJQUFJQSxFQUN4REEsQ0FBQ0EsSUFBSUEsRUFBRUEsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsRUFBRUEsSUFBSUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFFdkRBLEtBQUtBLElBQUlBO2lCQUNQQSxJQUFJQSxTQUFTQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDdkJBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLHlCQUFVQSxDQUFDQSxhQUFhQSxFQUFFQSxlQUFlQSxFQUFFQSxJQUFJQSxFQUFFQSxFQUFFQSxFQUFFQSxTQUFTQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDdEZBLElBQUlBLEtBQUtBLEdBQUdBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2lCQUNsQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0E7aUJBQ3JCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSx5QkFBVUEsQ0FBQ0EsV0FBV0EsRUFBRUEsTUFBTUEs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QUN0Q0MsSUFBSUEsTUFBTUEsR0FBR0EsT0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0E7S0FDNUJBLElBQUlBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ3hDQSxJQUFJQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQTtLQUN4Q0EsSUFBSUEsRUFBRUEsR0FBR0EsTUFBTUEsR0FBR0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDeENBLElBQUlBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ3hDQSxJQUFJQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQTtLQUN4Q0EsSUFBSUEsRUFBRUEsR0FBR0EsTUFBTUEsR0FBR0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDeENBLElBQUlBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ3hDQSxJQUFJQSxFQUFFQSxHQUFHQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQTtLQUN4Q0EsSUFBSUEsRUFBRUEsR0FBR0EsTUFBTUEsR0FBR0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDeENBLElBQUlBLEVBQUVBLEdBQUdBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBO0tBQ3hDQSxNQUFNQSxDQUFDQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNuQkEsS0FBS0EsQ0FBQ0E7YUFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsSUFBS0EsU0FBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsRUFBZkEsQ0FBZUEsQ0FBQ0E7U0FDakNBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQTVCQSxDQUE0QkEsQ0FBQ0E7U0FDbERBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQXpDQSxDQUF5Q0EsQ0FBQ0E7U0FDbkVBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEVBQXREQSxDQUFzREEsQ0FBQ0E7U0FDcEZBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBO3dCQUNmQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQTthQUFuRUEsQ0FBbUVBLENBQUNBO1NBQ2pGQSxLQUFLQSxDQUFDQTthQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQTt3QkFDbkJBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBO2FBQWhGQSxDQUFnRkEsQ0FBQ0E7U0FDOUZBLEtBQUtBLENBQUNBO2FBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLFNBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLEdBQUdBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBO2lCQUNqREEsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsRUFEekNBLENBQ3lDQSxDQUFDQTtTQUNuRkEsS0FBS0EsQ0FBQ0E7YUFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsU0FBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsRUFBRUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7aUJBQ2pEQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQSxFQUFFQSxDQUFDQTtpQkFDakRBLEVBQUVBLEVBRkZBLENBRUVBLENBQUNBO1NBQ2hEQSxLQUFLQSxDQUFDQTthQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxF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QUFDQSxDQUFDQTtBQUNYQSxFQUFDQTtBQUVELDBDQUF5QztBQUN6QztLQUFBQztLQW1IQUMsQ0FBQ0E7S0FoSFFELDRCQUFRQSxHQUFmQSxjQUEyQkUsTUFBTUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDaENGLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsSUFBV0csTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDcENILDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV0ksTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDNUNKLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV0ssTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDcERMLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV00sTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDNUROLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV08sTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDcEVQLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV1EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDNUVSLDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBV1MsTUFBTUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDcEZULDRCQUFRQSxHQUFmQSxVQUFnQkEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUE7U0FDNUNVLE1BQU1BLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO0tBQzFDQSxDQUFDQTtLQUNNViw0QkFBUUEsR0FBZkEsVUFBZ0JBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBO1NBQ2hEVyxNQUFNQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQTtLQUM5Q0EsQ0FBQ0E7S0FFTVgsb0NBQWdCQSxHQUF2QkEsVUFBd0JB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LENBQUNBLENBQUNBLEVBQUVBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ2hEQSxDQUFDQTthQUNEQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQTtTQUNiQSxDQUFDQTtTQUVERCxNQUFNQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLGNBQU1BLFNBQUVBLEVBQUZBLENBQUVBLENBQUNBO2FBQ2xCQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsSUFBS0EsZUFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBZEEsQ0FBY0EsQ0FBQ0E7YUFDaENBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxlQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUFsQkEsQ0FBa0JBLENBQUNBO2FBQ3hDQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsZUFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBdEJBLENBQXNCQSxDQUFDQTthQUNoREEsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLGVBQVFBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBLEVBQTFCQSxDQUEwQkEsQ0FBQ0E7YUFDeERBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxlQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUE5QkEsQ0FBOEJBLENBQUNBO2FBQ2hFQSxLQUFLQSxDQUFDQTtpQkFDSkEsTUFBTUEsQ0FBQ0EsVUFBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsSUFBS0EsZUFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBbENBLENBQWtDQSxDQUFDQTthQUN4RUEsS0FBS0EsQ0FBQ0E7aUJBQ0pBLE1BQU1BLENBQUNBLFVBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLElBQUtBLGVBQVFBLENBQUNBLENBQUNBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBLEVBQXRDQSxDQUFzQ0EsQ0FBQ0E7YUFDaEZBLEtBQUtBLENBQUNBO2lCQUNKQSxNQUFNQSxDQUFDQSxVQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxJQUFLQSxlQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUExQ0EsQ0FBMENBLENB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QSwwQkFBYUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxDQUFDQTtLQUMvQ0EsQ0FBQ0E7S0FFT0gsa0RBQWtCQSxHQUExQkEsVUFBMkJBLFVBQWtCQSxFQUFFQSxLQUFrQkEsRUFBRUEsTUFBYUE7U0FDOUVJLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLEtBQUtBLHlCQUFVQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMxQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsVUFBVUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDN0NBLENBQUNBO1NBRURBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLEtBQUtBLHlCQUFVQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTthQUM1Q0EsSUFBSUEsU0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsS0FBS0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFDakRBLE1BQU1BLENBQUNBLFNBQVNBLEdBQUdBLEtBQUtBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLFVBQVVBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1NBQzdEQSxDQUFDQTtTQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxLQUFLQSx5QkFBVUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMvQ0EsSUFBSUEsU0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsS0FBS0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFDakRBLE1BQU1BLENBQUNBLFNBQVNBLEdBQUdBLENBQUNBLEdBQUdBLEtBQUtBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBO1NBQzdEQSxDQUFDQTtTQUVEQSxNQUFNQSxJQUFJQSwwQkFBYUEsQ0FBQ0EsbUJB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QUFhQSxDQUFDQTs2QkFBQ0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxTQUFTQSxFQUFFQSxTQUFTQSxDQUFDQSxDQUFDQTt5QkFFakVBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLEtBQUtBLEVBQUVBLFNBQVNBLEVBQUVBLE1BQU1BLENBQUNBLENBQUNBO3lCQUMxQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7eUJBRTlCQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQTtxQkFFaEJBLENBQUNBO3FCQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTt5QkFDTkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsS0FBS0EsRUFBRUEsU0FBU0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7eUJBQzFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTt5QkFDOUJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO3FCQUNkQSxDQUFDQTtpQkFDSEEsQ0FBQ0E7aUJBQUNBLElBQUlBLENBQUNBLENBQUNBO3FCQUNOQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxLQUFLQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQTtxQkFDL0JBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO2lCQUNkQSxDQUFDQTthQUNIQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDTkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsS0FBS0EsRUFBRUEsU0FBU0EsRUFBRUEsTUFBTUEsQ0FBQ0EsQ0FBQ0E7aUJBQzFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDOUJBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO2FBQ2RBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBRU90Qix3Q0FBUUEsR0FBaEJBLFVBQWlCQSxLQUFrQkEsRUFBRUEsT0FBT0E7U0FDMUN1QixJ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Q0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7S0FDekVBLENBQUNBO0tBRURELHNEQUF3QkEsR0FBeEJBO1NBQ0VFLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxXQUFXQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNqRkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBO1NBQ2pGQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDbkZBLENBQUNBO0tBRURGLG1EQUFxQkEsR0FBckJBO1NBQ0VHLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxXQUFXQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNoRkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBO1NBQ2hGQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsV0FBV0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7S0FDbEZBLENBQUNBO0tBRURILHFDQUFPQSxHQUFQQTtTQUNFSSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsT0FBT0EsRUFBRUEsQ0FBQ0E7U0FDbERBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTtTQUNsREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO0tBQ3BEQSxDQUFDQTtLQUVESix1Q0FBU0EsR0FBVEE7U0FDRUssRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBO1NBQ3BEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7U0FDcERBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQTtLQUN0REEsQ0FBQ0E7S0FFREwsa0RBQW9CQSxHQUFwQkE7U0FDRU0sRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZEQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZEQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZEQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRE4sK0NBQWlCQSxHQUFqQkE7U0FDRU8sRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3REQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3REQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3REQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFAsdUNBQVNBLEdBQVRBLFVBQVVBLEtBQW9CQTtTQUM1QlEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO2FBQ3hFQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNyQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO2FBQ3hFQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNyQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBO2FBQ3hFQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNyQkEsQ0FBQ0E7U0FDREEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLHFDQUFtQ0EsS0FBS0EsTUFBR0EsQ0FBQ0EsQ0FBQ0E7S0FDdkVBLENBQUNBO0tBeEVNUiwrQ0FBMkJBLEdBQUdBLENBQUNBLENBQUNBO0tBeUV6Q0EsMEJBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFFRDtLQUdFUyw4QkFBWUEsRUFBbUJBO1NBQzdCQyxJQUFJQSxDQUFDQSxPQUFPQSxHQUFHQSxFQUFFQSxDQUFDQSxNQUFNQSxDQUFDQSxjQUFjQSxDQUFDQSxHQUFHQSxDQUFDQSxXQUFDQSxJQUFJQSxXQUFJQSxRQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFuQkEsQ0FBbUJBLENBQUNBLENBQUNBO0tBQ3hFQSxDQUFDQTtLQUVERCx1REFBd0JBLEdBQXhCQTtTQUNFRSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTthQUM3Q0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeEJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFdBQVdBLENBQUNBO2lCQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNyQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREYsb0RBQXFCQSxHQUFyQkE7U0FDRUcsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDN0NBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3hCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQTtpQkFBQ0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0E7U0FDcENBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURILHNDQUFPQSxHQUFQQTtTQUNFSSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTthQUM3Q0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeEJBLENBQUNBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO1NBQ2RBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURKLHdDQUFTQSxHQUFUQTtTQUNFSyxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTthQUM3Q0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeEJBLENBQUNBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBO1NBQ2hCQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVETCxtREFBb0JBLEdBQXBCQTtTQUNFTSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTthQUM3Q0EsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FB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QVNBLFlBQVlBLGlCQUFpQkE7YUFDcEJBLENBQUNBLENBQUNBLFNBQVVBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2FBQ25EQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsWUFBWUEsaUJBQWlCQTthQUNwQkEsQ0FBQ0EsQ0FBQ0EsU0FBVUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBO1NBQ3ZCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxZQUFZQSxpQkFBaUJBO2FBQ3BCQSxDQUFDQSxDQUFDQSxTQUFVQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuREEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7U0FDdkJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLFlBQVlBLGlCQUFpQkE7YUFDcEJBLENBQUNBLENBQUNBLFNBQVVBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2FBQ25EQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsWUFBWUEsaUJBQWlCQTthQUNwQkEsQ0FBQ0EsQ0FBQ0EsU0FBVUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBO1NBQ3ZCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxZQUFZQSxpQkFBaUJBO2FBQ3BCQSxDQUFDQSxDQUFDQSxTQUFVQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuREEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7U0FDdkJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLFlBQVlBLGlCQUFpQkE7YUFDcEJBLENBQUNBLENBQUNBLFNBQVVBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2FBQ25EQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsWUFBWUEsaUJBQWlCQTthQUNwQkEsQ0FBQ0EsQ0FBQ0EsU0FBVUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDbkRBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBO1NBQ3ZCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxZQUFZQSxpQkFBaUJBO2FBQ3BCQSxDQUFDQSxDQUFDQSxTQUFVQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuREEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7U0FDdkJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLFlBQVlBLGlCQUFpQkE7YUFDcEJBLENBQUNBLENBQUNBLFNBQVVBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2FBQ25EQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQTtTQUN2QkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREosb0RBQVlBLEdBQVpBLGNBQXNCSyxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO0tBRTFETCxzREFBY0EsR0FBZEEsVUFBZUEsR0FBUUE7U0FDckJNLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLE1BQU1BLENBQUNBLHlCQUF5QkEsSUFBSUEsZ0JBQVNBLENBQUNBLEdBQUdBLENBQUNBO2FBQzNEQSxHQUFHQSxDQUFDQSxFQUFFQSxLQUFLQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLGFBQWFBLENBQUNBLE1BQU1BLENBQUNBO0tBQy9EQSxDQUFDQTtLQUVETixrRUFBMEJBLEdBQTFCQSxVQUEyQkEsS0FBb0JBLEVBQUVBLElBQVdBO1NBQzFETyxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBO1NBQzlCQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxhQUFhQSxDQUFDQTtTQUV4QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZFQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxvQkFBU0EsQ0FBQ0E7aUJBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDckZBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsS0FBS0EsS0FBS0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkVBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLG9CQUFTQSxDQUFDQTtpQkFBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTthQUNyRkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxLQUFLQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN2RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0Esb0JBQVNBLENBQUNBO2lCQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO2FBQ3JGQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNwQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZFQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxvQkFBU0EsQ0FBQ0E7aUJBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDckZBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsS0FBS0EsS0FBS0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkVBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLG9CQUFTQSxDQUFDQTtpQkFBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTthQUNyRkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxLQUFLQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN2RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0Esb0JBQVNBLENBQUNBO2lCQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO2FBQ3JGQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNwQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZFQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxvQkFBU0EsQ0FBQ0E7aUJBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDckZBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtTQUNEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsS0FBS0EsS0FBS0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkVBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEtBQUtBLG9CQUFTQSxDQUFDQTtpQkFBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxFQUFFQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQTthQUNyRkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDcEJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxLQUFLQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN2RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsS0FBS0Esb0JBQVNBLENBQUNBO2lCQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO2FBQ3JGQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNwQkEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEtBQUtBLEtBQUtBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZFQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxLQUFLQSxvQkFBU0EsQ0FBQ0E7aUJBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFDckZBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO1NBQ3BCQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUNIUCxvQ0FBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQUVEOzs7SUFHRztBQUNIO0tBQ0VRLHdDQUFtQkEsZ0JBQXlDQSxFQUFTQSxHQUFvQkE7U0FBdEVDLHFCQUFnQkEsR0FBaEJBLGdCQUFnQkEsQ0FBeUJBO1NBQVNBLFFBQUdBLEdBQUhBLEdBQUdBLENBQWlCQTtLQUFHQSxDQUFDQTtLQUU3RkQsZ0RBQU9BLEdBQVBBO1NBQ0VFLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0E7U0FDaENBLElBQUlBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLGFBQWFBLENBQUNBO1NBQzFCQSxHQUFHQSxDQUFDQSx3QkFBd0JBLEVBQUVBLENBQUNBO1NBRS9CQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUN6Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsaUJBQWlCQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3JFQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxvQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzlCQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzNFQSxDQUFDQTtTQUNIQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVERixrREFBU0EsR0FBVEE7U0FDRUcsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQTtTQUNoQ0Esd0JBQVdBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLG9CQUFTQSxDQUFDQSxDQUFDQTtLQUN4Q0EsQ0FBQ0E7S0FFREgsc0RBQWFBLEdBQWJBO1NBQ0VJLElBQUlBLEdBQUdBLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0E7U0FDaENBLElBQUlBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLGFBQWFBLENBQUNBO1NBRTFCQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUM1Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsaUJBQWlCQTtpQkFDdkJBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUVBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2lCQUN0REEsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7YUFDNUJBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURKLHFEQUFZQSxHQUFaQSxjQUFzQkssTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUU3REwsdURBQWNBLEdBQWRBLFVBQWVBLEdBQVFBO1NBQ3JCTSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxnQkFBZ0JBLENBQUNBLGFBQWFBLENBQUNBO1NBQzVDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxDQUFDQSx5QkFBeUJBLElBQUlBLGdCQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUMvRkEsQ0FBQ0E7S0FFRE4sbUVBQTBCQSxHQUExQkEsVUFBMkJBLEtBQW9CQSxFQUFFQSxJQUFXQTtTQUMxRE8sSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQTtTQUNoQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsR0FBR0EsQ0FBQ0EsYUFBYUEsQ0FBQ0E7U0FFMUJBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBO2FBQzVDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxLQUFLQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDaERBLEVBQUVBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLG9CQUFTQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDOUJBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzNFQSxDQUFDQTtpQkFDREEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDekJBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBQ0hQLHFDQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBRUQ7S0FDRVEsdUJBQW1CQSxRQUFnQkEsRUFBU0EsTUFBZ0JBLEVBQVNBLEtBQW9CQTtTQUF0RUMsYUFBUUEsR0FBUkEsUUFBUUEsQ0FBUUE7U0FBU0EsV0FBTUEsR0FBTkEsTUFBTUEsQ0FBVUE7U0FBU0EsVUFBS0EsR0FBTEEsS0FBS0EsQ0FBZUE7S0FBR0EsQ0FBQ0E7S0FFN0ZELHNCQUFJQSw2Q0FBa0JBO2NBQXRCQSxjQUFvQ0UsTUFBTUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUY7S0FDdEVBLG9CQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBSlksc0JBQWEsZ0JBSXpCO0FBRUQ7S0FJRUcsa0JBQW1CQSxhQUE0QkEsRUFBVUEsVUFBMkJBO1NBQWpFQyxrQkFBYUEsR0FBYkEsYUFBYUEsQ0FBZUE7U0FBVUEsZUFBVUEsR0FBVkEsVUFBVUEsQ0FBaUJBO0tBQUdBLENBQUNBO0tBRXhGRCxzQkFBSUEsaUNBQVdBO2NBQWZBLGNBQTZCRSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTs7O1FBQUFGO0tBRTNFQSx5QkFBTUEsR0FBTkE7U0FDRUcsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7YUFBQ0EsTUFBTUEsQ0FBQ0E7U0FDeEJBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO1NBQ2ZBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLEtBQUtBLENBQUNBO1NBRW5CQSw4REFBOERBO1NBQzlEQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxrQkFBa0JBLENBQUNBLENBQUNBLENBQUNBO2FBQzFDQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxtQkFBbUJBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO2FBQzNFQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbkNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLEVBQUVBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBO2FBQ2hGQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDTkEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsR0FBR0EsRUFBRUEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDNUNBLENBQUNBO1NBQ0hBLENBQUNBO1NBRURBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLGVBQWVBLEVBQUVBLENBQUNBO0tBQzlCQSxDQUFDQTtLQUVPSCwwQkFBT0EsR0FBZkE7U0FDRUksSUFBSUEsVUFBVUEsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDcEJBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3pDQSxJQUFJQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxPQUFPQSxFQUFFQSxDQUFDQTthQUNyQ0Esc0RBQXNEQTthQUN0REEsSUFBSUEsVUFBVUEsR0FDVkEsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0Esb0JBQW9CQSxFQUFFQSxDQUFDQSxDQUFDQTthQUNwRkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO2lCQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxVQUFVQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUNyRUEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsVUFBVUEsQ0FBQ0EsQ0FBQ0E7U0FDM0NBLENBQUNBO1NBQ0RBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO0tBQzlCQSxDQUFDQTs7S0FFT0oseUJBQU1BLEdBQWRBLFVBQWVBLEdBQW9CQSxFQUFFQSxVQUFpQkE7U0FDcERLLElBQUlBLElBQUlBLEdBQUdBLEdBQUdBLENBQUNBLE9BQU9BLEVBQUVBLENBQUNBO1NBQ3pCQSxJQUFJQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxHQUFHQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUNyREEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUEsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsZUFBZUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7YUFDMUVBLElBQUlBLE1BQU1BLEdBQUdBLElBQUlBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdENBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO2lCQUFDQSxRQUFRQSxDQUFDQTthQUM5QkEsc0VBQXNFQTthQUN0RUEsd0VBQXdFQTthQUN4RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsUUFBUUEsSUFBSUEsQ0FBQ0EsY0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsY0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7aUJBQ3pDQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxDQUFDQSxLQUFLQSxHQUFHQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDakZBLEtBQUtBLENBQUNBO2FBQ1JBLENBQUNBO2FBRURBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBLFdBQVdBO2lCQUNyQ0EsQ0FBQ0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsTUFBTUEsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsSUFBSUEsTUFBTUEsSUFBSUEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0E7aUJBQ25FQSxRQUFRQSxDQUFDQTthQUVYQSwrRUFBK0VBO2FBQy9FQSx3RUFBd0VBO2FBQ3hFQSx1RUFBdUVBO2FBQ3ZFQSw2Q0FBNkNBO2FBQzdDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTthQUN4Q0EsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDaENBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtpQkFBQ0EsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxFQUFFQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUM5REEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFT0wsaUNBQWNBLEdBQXRCQSxVQUF1QkEsR0FBb0JBLEVBQUVBLFVBQWlCQTtTQUM1RE0sRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMvQ0EsSUFBSUEsQ0FBQ0EseUJBQXlCQSxDQUFDQSxHQUFHQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUNsREEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7YUFDTkEsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxHQUFHQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUM1Q0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFT04sc0NBQW1CQSxHQUEzQkEsVUFBNEJBLEVBQW9CQSxFQUFFQSxVQUFpQkE7U0FDakVPLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLEtBQUtBLENBQUNBLE1BQU1BLEVBQUVBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBO2FBQ3pDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxFQUFFQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUMzQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFT1AsNkJBQVVBLEdBQWxCQSxVQUFtQkEsSUFBYUEsRUFBRUEsVUFBaUJBO1NBQ2pEUSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxhQUFhQSxHQUFHQSxJQUFJQSxDQUFDQSxlQUFlQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUNwRkEsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsY0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7aUJBQUNBLFFBQVFBLENBQUNBO2FBRTNCQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxHQUFHQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTthQUVyQ0EsSUFBSUEsRUFBRUEsR0FBR0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDaENBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQTtpQkFBQ0EsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxFQUFFQSxFQUFFQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUM5REEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFT1IsNENBQXlCQSxHQUFqQ0EsVUFBa0NBLEdBQW9CQSxFQUFFQSxVQUFpQkE7U0FDdkVTLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLENBQUNBLFdBQVdBLENBQUNBO1NBQzlDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxNQUFNQSxFQUFFQSxFQUFFQSxDQUFDQSxFQUFFQSxDQUFDQTthQUNuQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbENBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDakRBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBRU9ULHNDQUFtQkEsR0FBM0JBLFVBQTRCQSxHQUFvQkEsRUFBRUEsVUFBaUJBO1NBQ2pFVSxHQUFHQSxDQUFDQSwwQkFBMEJBLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEVBQUVBLFVBQVVBLENBQUNBLENBQUNBO0tBQ3ZFQSxDQUFDQTtLQUVEViw0QkFBU0EsR0FBVEEsY0FBb0JXLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO0tBRXZDWCwwQkFBT0EsR0FBUEE7U0FDRVksSUFBSUEsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsc0JBQVNBLEVBQU9BLENBQUNBO1NBQ2pDQSxJQUFJQSxDQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQTtLQUNwQkEsQ0FBQ0E7S0FDSFosZUFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQWhIWSxpQkFBUSxXQWdIcEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzdqQ0QsZ0NBT08sQ0FBc0IsQ0FBQztBQUM5QixrQ0FBaUMsQ0FBMEIsQ0FBQztBQUM1RCx3Q0FBNEIsRUFBZ0MsQ0FBQztBQUM3RCxLQUFZLFVBQVUsdUJBQU0sRUFBUSxDQUFDO0FBRXJDLHNDQUFrRixFQUFZLENBQUM7QUFHL0YsaUNBS08sRUFBOEIsQ0FBQztBQUN0QyxnREFBa0MsRUFBc0IsQ0FBQztBQUN6RCx1Q0FBMEIsRUFBYSxDQUFDO0FBQ3hDLDJDQUE4QixFQUFpQixDQUFDO0FBQ2hELHFDQUFtRCxFQUFvQixDQUFDO0FBQ3hFLGdEQUErQixFQUFzQixDQUFDO0FBRXREOzs7OztJQUtHO0FBQ0g7S0FBQWE7S0FxSkFDLENBQUNBO0tBL0lDRDs7UUFFR0E7S0FDSEEsdUNBQWNBLEdBQWRBLFVBQWVBLFdBQXdCQTtTQUNyQ0UsSUFBSUEsUUFBUUEsR0FBR0EsdUJBQVlBLENBQVVBLFdBQVdBLENBQUNBLENBQUNBO1NBQ2xEQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxLQUFLQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNyREEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLDhDQUE4Q0EsQ0FBQ0EsQ0FBQ0E7U0FDMUVBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLFdBQVdBLENBQUNBLFFBQVFBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBO0tBQ3REQSxDQUFDQTtLQXNJSEYscUJBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFySnFCLHVCQUFjLGlCQXFKbkM7QUFFRDtLQUNxQ0csbUNBQWNBO0tBR2pEQSx5QkFBb0JBLFNBQXNCQSxFQUFVQSxhQUE4QkEsRUFDOURBLE1BQTJCQSxFQUFVQSxTQUFtQkEsRUFDcEJBLGlCQUFpQkE7U0FDdkVDLGlCQUFPQSxDQUFDQTtTQUhVQSxjQUFTQSxHQUFUQSxTQUFTQSxDQUFhQTtTQUFVQSxrQkFBYUEsR0FBYkEsYUFBYUEsQ0FBaUJBO1NBQzlEQSxXQUFNQSxHQUFOQSxNQUFNQSxDQUFxQkE7U0FBVUEsY0FBU0EsR0FBVEEsU0FBU0EsQ0FBVUE7U0FnQzVFQSxnQkFBZ0JBO1NBQ2hCQSw2QkFBd0JBLEdBQWVBLHdCQUFjQSxDQUFDQSxxQ0FBcUNBLENBQUNBLENBQUNBO1NBb0I3RkEsZ0JBQWdCQTtTQUNoQkEsOEJBQXlCQSxHQUFlQSx3QkFBY0EsQ0FBQ0Esc0NBQXNDQSxDQUFDQSxDQUFDQTtTQWUvRkEsZ0JBQWdCQTtTQUNoQkEsd0NBQW1DQSxHQUMvQkEsd0JBQWNBLENBQUNBLGdEQUFnREEsQ0FBQ0EsQ0FBQ0E7U0FjckVBLGdCQUFnQkE7U0FDaEJBLG9DQUErQkEsR0FDM0JBLHdCQUFjQSxDQUFDQSw0Q0FBNENBLENBQUNBLENBQUNBO1NBcUVqRUEsZ0JBQWdCQTtTQUNoQkEsaUNBQTRCQSxHQUFHQSx3QkFBY0EsQ0FBQ0EsMENBQTBDQSxDQUFDQSxDQUFDQTtTQVUxRkEsZ0JBQWdCQTtTQUNoQkEsZ0NBQTJCQSxHQUFHQSx3QkFBY0EsQ0FBQ0EseUNBQXlDQSxDQUFDQSxDQUFDQTtTQW9CeEZBLGdCQUFnQkE7U0FDaEJBLGdDQUEyQkEsR0FBR0Esd0JBQWNBLENBQUNBLHlDQUF5Q0EsQ0FBQ0EsQ0FBQ0E7U0ExTHRGQSxJQUFJQSxDQUFDQSxpQkFBaUJBLEdBQUdBLGlCQUFpQkEsQ0FBQ0E7S0FDN0NBLENBQUNBO0tBRURELDBDQUFnQkEsR0FBaEJBLFVBQWlCQSxRQUFvQkE7U0FDbkNFLElBQUlBLFFBQVFBLEdBQUdBLHVCQUFZQSxDQUFlQSxRQUFTQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUNoRUEsTUFBTUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsZ0JBQWdCQSxDQUFlQSxRQUFTQSxDQUFDQSxpQkFBaUJBLENBQUNBO2NBQ3RFQSxtQkFBbUJBLEVBQUVBLENBQUNBO0tBQzdCQSxDQUFDQTtLQUVERix3REFBOEJBLEdBQTlCQSxVQUErQkEsWUFBd0JBLEVBQUVBLFlBQW9CQTtTQUMzRUcsSUFBSUEsUUFBUUEsR0FBR0EsdUJBQVlBLENBQWVBLFlBQWFBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO1NBQ3BFQSxJQUFJQSxpQkFBaUJBLEdBQWlCQSxZQUFhQSxDQUFDQSxpQkFBaUJBLENBQUNBO1NBQ3RFQSxJQUFJQSxhQUFhQSxHQUFHQSxRQUFRQSxDQUFDQSxhQUFhQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1NBQzlEQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMzQkEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLGdEQUE4Q0EsaUJBQW1CQSxDQUFDQSxDQUFDQTtTQUM3RkEsQ0FBQ0E7U0FDREEsSUFBSUEsU0FBU0EsR0FBR0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQTtTQUN4RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsY0FBT0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdkJBLE1BQU1BLElBQUlBLDBCQUFhQSxDQUFDQSw2QkFBMkJBLFlBQWNBLENBQUNBLENBQUNBO1NBQ3JFQSxDQUFDQTtTQUNEQSxNQUFNQSxDQUFDQSxhQUFhQSxDQUFDQSxXQUFXQSxDQUFDQSxhQUFhQSxDQUFDQSxhQUFhQSxHQUFHQSxTQUFTQSxDQUFDQSxDQUFDQTtLQUM1RUEsQ0FBQ0E7S0FFREgsc0NBQVlBLEdBQVpBLFVBQWFBLFlBQXdCQTtTQUNuQ0ksSUFBSUEsUUFBUUEsR0FBR0EsdUJBQVlBLENBQWVBLFlBQWFBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO1NBQ3BFQSxJQUFJQSxpQkFBaUJBLEdBQWlCQSxZQUFhQSxDQUFDQSxpQkFBaUJBLENBQUNBO1NBQ3RFQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxvQkFBb0JBLENBQUNBLFFBQVFBLEVBQUVBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7S0FDdkVBLENBQUNBO0tBS0RKLDRDQUFrQkEsR0FBbEJBLFVBQW1CQSxnQkFBOEJBLEVBQUVBLGdCQUF3QkEsRUFDeERBLFFBQWtCQTtTQUNuQ0ssSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0Esd0JBQXdCQSxFQUFFQSxDQUFDQTtTQUN4Q0EsSUFBSUEsYUFBYUEsR0FBNEJBLDRCQUFpQkEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQTtTQUNqRkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSwyQkFBMkJBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBO1NBQ2xFQSxJQUFJQSxtQkFBbUJBLEdBQUdBLGdCQUFnQkEsQ0FBQ0E7U0FDM0NBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDakNBLG1CQUFtQkEsR0FBR0EsYUFBYUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQSxDQUFDQTtTQUM3RkEsQ0FBQ0E7U0FDREEsSUFBSUEsdUJBQXVCQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxrQkFBa0JBLENBQzNEQSxhQUFhQSxDQUFDQSxNQUFNQSxFQUFFQSxhQUFhQSxDQUFDQSxTQUFTQSxDQUFDQSxpQkFBaUJBLEdBQUdBLENBQUNBLEVBQUVBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0E7U0FDOUZBLElBQUlBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLGFBQWFBLEVBQUVBLHVCQUF1QkEsQ0FBQ0EsQ0FBQ0E7U0FFNUVBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLFdBQVdBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQzVDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxtQkFBbUJBLENBQUNBLFFBQVFBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO1NBQ3BEQSxNQUFNQSxDQUFDQSxrQkFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7S0FDbkNBLENBQUNBO0tBS0RMLDZDQUFtQkEsR0FBbkJBLFVBQW9CQSxXQUF3QkE7U0FDMUNNLGtEQUFrREE7U0FDbERBLDhEQUE4REE7U0FDOURBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLHlCQUF5QkEsRUFBRUEsQ0FBQ0E7U0FDekNBLElBQUlBLFFBQVFBLEdBQUdBLHVCQUFZQSxDQUFVQSxXQUFXQSxDQUFDQSxDQUFDQTtTQUNsREEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7U0FDdkRBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLGFBQWFBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBQzlDQSxJQUFJQSxDQUFDQSxxQkFBcUJBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBO1NBQ3JDQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxlQUFlQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQTtTQUM3Q0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDNUNBLGtCQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNkQSxDQUFDQTtLQU1ETix1REFBNkJBLEdBQTdCQSxVQUE4QkEscUJBQWlDQSxFQUFFQSxLQUFhQSxFQUNoREEsV0FBd0JBO1NBQ3BETyxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxtQ0FBbUNBLEVBQUVBLENBQUNBO1NBQ25EQSxJQUFJQSxTQUFTQSxHQUFHQSw0QkFBaUJBLENBQWdCQSxXQUFZQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQTtTQUM1RUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsS0FBS0EsVUFBVUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDcERBLE1BQU1BLElBQUlBLDBCQUFhQSxDQUFDQSwwREFBMERBLENBQUNBLENBQUNBO1NBQ3RGQSxDQUFDQTtTQUNEQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLDJCQUEyQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7U0FDOURBLE1BQU1BLENBQUNBLGtCQUFRQSxDQUFDQSxDQUFDQSxFQUFFQSxJQUFJQSxDQUFDQSxzQkFBc0JBLENBQUNBLHFCQUFxQkEsRUFBRUEsS0FBS0EsRUFBRUEsU0FBU0EsRUFDdkNBLFdBQVdBLENBQUNBLFVBQVVBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO0tBQ2hGQSxDQUFDQTtLQU1EUCxtREFBeUJBLEdBQXpCQSxVQUEwQkEscUJBQWlDQSxFQUFFQSxLQUFhQSxFQUNoREEsWUFBMEJBLEVBQzFCQSwyQkFBK0NBO1NBQ3ZFUSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSwrQkFBK0JBLEVBQUVBLENBQUNBO1NBQy9DQSxJQUFJQSxTQUFTQSxHQUFHQSw0QkFBaUJBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBO1NBQ2hEQSxFQUFFQSxDQUFDQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxLQUFLQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNoREEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLHNEQUFzREEsQ0FBQ0EsQ0FBQ0E7U0FDbEZBLENBQUNBO1NBQ0RBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsMkJBQTJCQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtTQUM5REEsTUFBTUEsQ0FBQ0Esa0JBQVFBLENBQ1hBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLHNCQUFzQkEsQ0FBQ0EscUJBQXFCQSxFQUFFQSxLQUFLQSxFQUFFQSxTQUFTQSxFQUN2Q0EscUJBQXFCQSxFQUFFQSwyQkFBMkJBLENBQUNBLENBQUNBLENBQUNBO0tBQzFGQSxDQUFDQTtLQUVEUjs7OztRQUlHQTtLQUNIQSxnREFBc0JBLEdBQXRCQSxVQUF1QkEscUJBQWlDQSxFQUFFQSxLQUFhQSxFQUNoREEsU0FBa0NBLEVBQUVBLE9BQW1CQSxFQUN2REEsMkJBQStDQTtTQUNwRVMsSUFBSUEsVUFBVUEsR0FBR0EsdUJBQVlBLENBQWVBLHFCQUFzQkEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0E7U0FDL0VBLElBQUlBLGlCQUFpQkEsR0FBaUJBLHFCQUFzQkEsQ0FBQ0EsaUJBQWlCQSxDQUFDQTtTQUMvRUEsSUFBSUEsV0FBV0EsR0FBR0EsdUJBQVlBLENBQWVBLE9BQVFBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO1NBQ2xFQSxJQUFJQSx3QkFBd0JBLEdBQWlCQSxPQUFRQSxDQUFDQSxpQkFBaUJBLENBQUNBO1NBQ3hFQSxJQUFJQSxvQkFBb0JBLEdBQUdBLFdBQVdBLENBQUNBLGFBQWFBLENBQUNBLHdCQUF3QkEsQ0FBQ0EsQ0FBQ0E7U0FDL0VBLElBQUlBLElBQUlBLENBQUNBO1NBQ1RBLEVBQUVBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLEtBQUtBLFVBQVVBLENBQUNBLFFBQVFBLENBQUNBLFFBQVFBLElBQUlBLGdCQUFTQSxDQUFDQSxvQkFBb0JBLENBQUNBO2FBQ2xGQSxDQUFDQSxvQkFBb0JBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO2FBQ3JDQSxzRkFBc0ZBO2FBQ3RGQSxJQUFJQSxHQUFHQSxvQkFBb0JBLENBQUNBO2FBQzVCQSxJQUFJQSxDQUFDQSxpQkFBaUJBLENBQUNBLFVBQVVBLEVBQUVBLGlCQUFpQkEsRUFBRUEsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDckVBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLHdFQUF3RUE7YUFDeEVBLDBCQUEwQkE7YUFDMUJBLG1FQUFtRUE7YUFDbkVBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7YUFDekNBLElBQUlBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsVUFBVUEsRUFBRUEsaUJBQWlCQSxFQUFFQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNuRUEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7U0FDMUNBLENBQUNBO1NBQ0RBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLHFCQUFxQkEsQ0FBQ0EsVUFBVUEsRUFBRUEsaUJBQWlCQSxFQUFFQSxXQUFXQSxFQUMxQ0Esd0JBQXdCQSxFQUFFQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUV6RUEsSUFBSUEsQ0FBQ0E7YUFDSEEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxVQUFVQSxFQUFFQSxpQkFBaUJBLEVBQUVBLFdBQVdBLEVBQzFDQSx3QkFBd0JBLEVBQUVBLEtBQUtBLEVBQy9CQSwyQkFBMkJBLENBQUNBLENBQUNBO1NBQ2xFQSxDQUFFQTtTQUFBQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNYQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxxQkFBcUJBLENBQUNBLFVBQVVBLEVBQUVBLGlCQUFpQkEsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7YUFDeEVBLE1BQU1BLENBQUNBLENBQUNBO1NBQ1ZBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBO0tBQ2xCQSxDQUFDQTtLQUVEVCxnQkFBZ0JBO0tBQ2hCQSwyQ0FBaUJBLEdBQWpCQSxVQUFrQkEsVUFBOEJBLEVBQUVBLGlCQUF5QkEsRUFBRUEsS0FBYUEsRUFDeEVBLElBQXdCQTtTQUN4Q1UsSUFBSUEsVUFBVUEsR0FBR0EsVUFBVUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtTQUMzREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDaEJBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLDBCQUEwQkEsQ0FBQ0EsVUFBVUEsRUFBRUEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7U0FDN0VBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLElBQUlBLFFBQVFBLEdBQUdBLFVBQVVBLENBQUNBLGNBQWNBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDN0VBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLDJCQUEyQkEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsY0FBY0EsRUFBRUEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7U0FDM0ZBLENBQUNBO0tBQ0hBLENBQUNBO0tBS0RWLGdEQUFzQkEsR0FBdEJBLFVBQXVCQSxxQkFBaUNBLEVBQUVBLEtBQWFBO1NBQ3JFVyxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSw0QkFBNEJBLEVBQUVBLENBQUNBO1NBQzVDQSxJQUFJQSxVQUFVQSxHQUFHQSx1QkFBWUEsQ0FBZUEscUJBQXNCQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUMvRUEsSUFBSUEsaUJBQWlCQSxHQUFpQkEscUJBQXNCQSxDQUFDQSxpQkFBaUJBLENBQUNBO1NBQy9FQSxJQUFJQSxDQUFDQSx1QkFBdUJBLENBQUNBLFVBQVVBLEVBQUVBLGlCQUFpQkEsRUFBRUEsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDbkVBLGtCQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNkQSxDQUFDQTtLQUtEWCx1RkFBdUZBO0tBQ3ZGQSwrQ0FBcUJBLEdBQXJCQSxVQUFzQkEscUJBQWlDQSxFQUFFQSxLQUFhQSxFQUNoREEsT0FBZ0JBO1NBQ3BDWSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSwyQkFBMkJBLEVBQUVBLENBQUNBO1NBQzNDQSxJQUFJQSxJQUFJQSxHQUFHQSx1QkFBWUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7U0FDakNBLElBQUlBLFVBQVVBLEdBQUdBLHVCQUFZQSxDQUFlQSxxQkFBc0JBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO1NBQy9FQSxJQUFJQSxpQkFBaUJBLEdBQWlCQSxxQkFBc0JBLENBQUNBLGlCQUFpQkEsQ0FBQ0E7U0FDL0VBLCtFQUErRUE7U0FDL0VBLDJEQUEyREE7U0FDM0RBLGlGQUFpRkE7U0FDakZBLGlGQUFpRkE7U0FDakZBLDBDQUEwQ0E7U0FDMUNBLDBDQUEwQ0E7U0FDMUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLHFCQUFxQkEsQ0FBQ0EsVUFBVUEsRUFBRUEsaUJBQWlCQSxFQUFFQSxJQUFJQSxFQUFFQSxJQUFJQSxFQUFFQSxLQUFLQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUMxRkEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxVQUFVQSxFQUFFQSxpQkFBaUJBLEVBQUVBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO1NBQ25FQSxNQUFNQSxDQUFDQSxrQkFBUUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsT0FBT0EsQ0FBQ0EsQ0FBQ0E7S0FDOUJBLENBQUNBO0tBS0RaLHVGQUF1RkE7S0FDdkZBLCtDQUFxQkEsR0FBckJBLFVBQXNCQSxxQkFBaUNBLEVBQUVBLEtBQWFBO1NBQ3BFYSxJQUFJQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSwyQkFBMkJBLEVBQUVBLENBQUNBO1NBQzNDQSxJQUFJQSxVQUFVQSxHQUFHQSx1QkFBWUEsQ0FBZUEscUJBQXNCQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUMvRUEsSUFBSUEsaUJBQWlCQSxHQUFpQkEscUJBQXNCQSxDQUFDQSxpQkFBaUJBLENBQUNBO1NBQy9FQSxJQUFJQSxhQUFhQSxHQUFHQSxVQUFVQSxDQUFDQSxjQUFjQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1NBQ2pFQSxJQUFJQSxJQUFJQSxHQUFHQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUN0Q0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxVQUFVQSxFQUFFQSxpQkFBaUJBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO1NBQ3hFQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQTtTQUNuREEsTUFBTUEsQ0FBQ0Esa0JBQVFBLENBQUNBLENBQUNBLEVBQUVBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO0tBQy9CQSxDQUFDQTtLQUVEYixnQkFBZ0JBO0tBQ2hCQSx5Q0FBZUEsR0FBZkEsVUFBZ0JBLFNBQWtDQSxFQUNsQ0EsdUJBQWdEQTtTQUM5RGMsSUFBSUEsZ0JBQWdCQSxHQUNoQkEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsU0FBU0EsRUFBRUEsdUJBQXVCQSxFQUFFQSxJQUFJQSxFQUFFQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtTQUNyRkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxnQkFBZ0JBLENBQUNBLE1BQU1BLEVBQUVBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0E7U0FDN0VBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLGFBQWFBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsQ0FBQ0E7U0FDbkRBLE1BQU1BLENBQUNBLGdCQUFnQkEsQ0FBQ0E7S0FDMUJBLENBQUNBO0tBRURkLGdCQUFnQkE7S0FDaEJBLDJDQUFpQkEsR0FBakJBLFVBQWtCQSxTQUFrQ0E7U0FDbERlLElBQUlBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLE9BQU9BLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO1NBQzdDQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNsQkEsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FDdkJBLFNBQVNBLEVBQ1RBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLFVBQVVBLENBQUNBLFNBQVNBLENBQUNBLE1BQU1BLEVBQUVBLFNBQVNBLENBQUNBLFNBQVNBLENBQUNBLGlCQUFpQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDOUZBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0tBQ2RBLENBQUNBO0tBRURmLGdCQUFnQkE7S0FDaEJBLDRDQUFrQkEsR0FBbEJBLFVBQW1CQSxJQUF3QkE7U0FDekNnQixJQUFJQSxXQUFXQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNsREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDakJBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ3pDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtTQUMxQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRGhCLGdCQUFnQkE7S0FDaEJBLGlEQUF1QkEsR0FBdkJBLFVBQXdCQSxVQUE4QkEsRUFBRUEsaUJBQXlCQSxFQUN6REEsS0FBYUE7U0FDbkNpQixJQUFJQSxhQUFhQSxHQUFHQSxVQUFVQSxDQUFDQSxjQUFjQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1NBQ2pFQSxJQUFJQSxJQUFJQSxHQUFHQSxhQUFhQSxDQUFDQSxLQUFLQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUV0Q0EsSUFBSUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNqQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxVQUFVQSxFQUFFQSxpQkFBaUJBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO1NBQ3hFQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN4QkEsK0NBQStDQTthQUMvQ0EsMkJBQTJCQTthQUMzQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsQ0FBQ0E7U0FDckRBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLG1EQUFtREE7YUFDbkRBLDRCQUE0QkE7YUFDNUJBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLGFBQWFBLENBQUNBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO2FBQzFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxjQUFjQSxDQUFDQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQTthQUNuREEsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNoQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRGpCLGdCQUFnQkE7S0FDaEJBLCtDQUFxQkEsR0FBckJBLFVBQXNCQSxJQUF3QkE7U0FDNUNrQixFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDbENBLENBQUNBO1NBQ0RBLElBQUlBLGNBQWNBLEdBQUdBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBO1NBQ3pDQSxJQUFJQSxlQUFlQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQTtTQUN0Q0EsSUFBSUEsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsU0FBU0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDekVBLElBQUlBLGFBQWFBLEdBQUdBLElBQUlBLENBQUNBLGFBQWFBLENBQUNBO1NBQ3ZDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxPQUFPQSxHQUFHQSxlQUFlQSxFQUFFQSxPQUFPQSxJQUFJQSxhQUFhQSxFQUFFQSxPQUFPQSxFQUFFQSxFQUFFQSxDQUFDQTthQUN4RUEsSUFBSUEsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7YUFDbkNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLEdBQUdBLENBQUNBLEVBQUVBLFNBQVNBLEdBQUdBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLGNBQWNBLENBQUNBLE1BQU1BLEVBQ25FQSxTQUFTQSxFQUFFQSxFQUFFQSxhQUFhQSxFQUFFQSxFQUFFQSxDQUFDQTtpQkFDbENBLElBQUlBLEVBQUVBLEdBQUdBLGNBQWNBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBO2lCQUN2Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3FCQUNsQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7eUJBQzlDQSxJQUFJQSxDQUFDQSx1QkFBdUJBLENBQUNBLFFBQVFBLEVBQUVBLGFBQWFBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBO3FCQUMzREEsQ0FBQ0E7aUJBQ0hBLENBQUNBO2FBQ0hBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBeFJIbEI7U0FBQ0EsZUFBVUEsRUFBRUE7U0FNQ0EsV0FBQ0EsV0FBTUEsQ0FBQ0EsZUFBVUEsQ0FBQ0EsY0FBTUEsNENBQWdCQSxFQUFoQkEsQ0FBZ0JBLENBQUNBLENBQUNBOzt5QkFtUnhEQTtLQUFEQSxzQkFBQ0E7QUFBREEsRUFBQ0EsRUF4Um9DLGNBQWMsRUF3UmxEO0FBeFJZLHdCQUFlLGtCQXdSM0I7Ozs7Ozs7Ozs7Ozs7Ozs7QUNqZEQsZ0NBQStELENBQXNCLENBQUM7QUFDdEYsd0NBQTZELEVBQWdDLENBQUM7QUFDOUYsS0FBWSxHQUFHLHVCQUFNLEVBQW9CLENBQUM7QUFDMUMsa0NBQWlDLENBQTBCLENBQUM7QUFDNUQsS0FBWSxVQUFVLHVCQUFNLEVBQVEsQ0FBQztBQUVyQyx5Q0FBc0MsRUFBZSxDQUFDO0FBQ3RELDBDQUF3QyxFQUFnQixDQUFDO0FBR3pELG1DQUFvQixFQUErQixDQUFDO0FBRXBEO0tBRUVtQjtLQUFlQyxDQUFDQTtLQUVoQkQsa0RBQW9CQSxHQUFwQkEsVUFBcUJBLFVBQThCQSxFQUFFQSxpQkFBeUJBO1NBQzVFRSxJQUFJQSxHQUFHQSxHQUFHQSxVQUFVQSxDQUFDQSxnQkFBZ0JBLENBQUNBLGlCQUFpQkEsQ0FBQ0EsQ0FBQ0E7U0FDekRBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLFlBQVlBLEVBQUVBLENBQUNBO0tBQzVCQSxDQUFDQTtLQUVERix3Q0FBVUEsR0FBVkEsVUFBV0EscUJBQThDQSxFQUM5Q0EsdUJBQWdEQSxFQUNoREEsV0FBcUNBLEVBQUVBLFFBQWtCQTtTQUNsRUcsSUFBSUEsZUFBZUEsR0FBR0EsdUJBQXVCQSxDQUFDQSxZQUFZQSxDQUFDQTtTQUMzREEsSUFBSUEsVUFBVUEsR0FBR0EsdUJBQXVCQSxDQUFDQSxPQUFPQSxDQUFDQTtTQUVqREEsSUFBSUEsWUFBWUEsR0FBR0EscUJBQXFCQSxDQUFDQSxTQUFTQSxDQUFDQSxZQUFZQSxDQUFDQTtTQUNoRUEsSUFBSUEsU0FBU0EsR0FBR0EscUJBQXFCQSxDQUFDQSxTQUFTQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUMxREEsSUFBSUEsV0FBV0EsR0FBaUJBLHdCQUFXQSxDQUFDQSxlQUFlQSxDQUFDQSxZQUFZQSxDQUFDQSxDQUFDQTtTQUMxRUEsSUFBSUEsY0FBY0EsR0FBR0Esd0JBQVdBLENBQUNBLGVBQWVBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBO1NBQy9EQSxJQUFJQSxlQUFlQSxHQUEwQkEsd0JBQVdBLENBQUNBLGVBQWVBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBO1NBQ3ZGQSxJQUFJQSxnQkFBZ0JBLEdBQTBCQSx3QkFBV0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsQ0FBQ0E7U0FDeEZBLElBQUlBLEtBQUtBLEdBQUdBLHdCQUFXQSxDQUFDQSxlQUFlQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQTtTQUVuREEsSUFBSUEsYUFBYUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDdEJBLElBQUlBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBO1NBQ25CQSxJQUFJQSxXQUFXQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUNwQkEsSUFBSUEsa0NBQWtDQSxHQUFhQSx3QkFBV0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7U0FDMUZBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLFVBQVVBLEdBQUdBLENBQUNBLEVBQUVBLFVBQVVBLEdBQUdBLFNBQVNBLEVBQUVBLFVBQVVBLEVBQUVBLEVBQUVBLENBQUNBO2FBQzlEQSxJQUFJQSxxQkFBcUJBLEdBQUdBLGtDQUFrQ0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0E7YUFDM0VBLElBQUlBLHdCQUF3QkEsR0FDeEJBLGdCQUFTQSxDQUFDQSxxQkFBcUJBLENBQUNBLEdBQUdBLGdCQUFnQkEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQTthQUN0RkEsSUFBSUEsVUFBVUEsR0FDVkEsZ0JBQVNBLENBQUNBLHdCQUF3QkEsQ0FBQ0EsR0FBR0EsZUFBZUEsQ0FBQ0EscUJBQXFCQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQTthQUM3RkEsSUFBSUEsU0FBU0EsR0FDVEEsZ0JBQVNBLENBQUNBLHFCQUFxQkEsQ0FBQ0E7aUJBQzVCQSxVQUFVQSxDQUFDQSxLQUFLQSxDQUFDQSxjQUFjQSxDQUFDQSxxQkFBcUJBLEdBQUdBLFVBQVVBLENBQUNBLGFBQWFBLENBQUNBO3NCQUM1RUEsZUFBZUE7aUJBQ3BCQSxxQkFBcUJBLENBQUNBO2FBQzlCQSxJQUFJQSxjQUFjQSxHQUFHQSxJQUFJQSxDQUFDQTthQUMxQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsVUFBVUEsS0FBS0EsQ0FBQ0EsSUFBSUEsU0FBU0EsQ0FBQ0EsSUFBSUEsS0FBS0EsVUFBVUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3hFQSxjQUFjQSxHQUFHQSxlQUFlQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQSxDQUFDQTthQUNsREEsQ0FBQ0E7YUFDREEsSUFBSUEsV0FBV0EsR0FBR0EsSUFBSUEsVUFBVUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsUUFBUUEsRUFBRUEsU0FBU0EsRUFBRUEsVUFBVUEsRUFBRUEsYUFBYUEsRUFDOUNBLFVBQVVBLEVBQUVBLFNBQVNBLENBQUNBLFdBQVdBLEVBQUVBLFVBQVVBLEVBQzdDQSxjQUFjQSxFQUFFQSx3QkFBd0JBLENBQUNBLENBQUNBO2FBQ25GQSxLQUFLQSxDQUFDQSxVQUFVQSxDQUFDQSxHQUFHQSxXQUFXQSxDQUFDQTthQUNoQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLHFCQUFxQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3JDQSxlQUFlQSxDQUFDQSxxQkFBcUJBLENBQUNBLENBQUNBLFVBQVVBLEdBQUdBLFdBQVdBLENBQUNBO2FBQ2xFQSxDQUFDQTthQUNEQSxJQUFJQSxvQkFBb0JBLEdBQUdBLEVBQUVBLENBQUNBO2FBQzlCQSxJQUFJQSxnQkFBZ0JBLEdBQUdBLFVBQVVBLEdBQUdBLENBQUNBLENBQUNBO2FBQ3RDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxTQUFTQSxHQUFHQSxDQUFDQSxFQUFFQSxTQUFTQSxHQUFHQSxTQUFTQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxFQUFFQSxTQUFTQSxFQUFFQSxFQUFFQSxDQUFDQTtpQkFDakZBLElBQUlBLE1BQU1BLEdBQUdBLFNBQVNBLENBQUNBLGNBQWNBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO2lCQUNqREEsSUFBSUEsaUJBQWlCQSxHQUFHQSxhQUFhQSxHQUFHQSxTQUFTQSxDQUFDQTtpQkFDbERBLElBQUlBLGVBQWVBLEdBQUdBLElBQUlBLENBQUNBO2lCQUUzQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLE1BQU1BLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLE1BQU1BLENBQUNBLGVBQWVBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBLENBQUNBO3FCQUMzRUEsa0NBQWtDQSxDQUFDQSxnQkFBZ0JBLENBQUNBLEdBQUdBLGlCQUFpQkEsQ0FBQ0E7cUJBQ3pFQSxnQkFBZ0JBLElBQUlBLE1BQU1BLENBQUNBLGVBQWVBLENBQUNBLFNBQVNBLENBQUNBLFNBQVNBLENBQUNBO2lCQUNqRUEsQ0FBQ0E7aUJBRURBLDRDQUE0Q0E7aUJBQzVDQSxJQUFJQSxvQkFBb0JBLEdBQUdBLE1BQU1BLENBQUNBLG9CQUFvQkEsQ0FBQ0E7aUJBQ3ZEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0Esb0JBQW9CQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDcENBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxvQkFBb0JBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3lCQUMzQ0EsSUFBSUEscUJBQXFCQSxHQUNyQkEsZ0JBQWdCQSxDQUFDQSxhQUFhQSxHQUFHQSxvQkFBb0JBLENBQUNBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO3lCQUN4RUEsZUFBZUEsR0FBR0Esb0JBQW9CQSxDQUFDQSxXQUFXQSxDQUFDQSxxQkFBcUJBLENBQUNBLENBQUNBO3FCQUM1RUEsQ0FBQ0E7cUJBQUNBLElBQUlBLENBQUNBLENBQUNBO3lCQUNOQSxlQUFlQSxHQUFHQSxvQkFBb0JBLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLENBQUNBLENBQUNBO3lCQUN6REEsb0JBQW9CQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxDQUFDQSxDQUFDQTtxQkFDN0NBLENBQUNBO2lCQUNIQSxDQUFDQTtpQkFDREEsZ0JBQWdCQSxDQUFDQSxpQkFBaUJBLENBQUNBLEdBQUdBLGVBQWVBLENBQUNBO2lCQUV0REEsY0FBY0E7aUJBQ2RBLElBQUlBLEVBQUVBLEdBQUdBLElBQUlBLHlCQUFXQSxDQUFDQSxXQUFXQSxDQUFDQSxHQUFHQSxFQUFFQSxpQkFBaUJBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO2lCQUN2RUEsV0FBV0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQTtpQkFFdkNBLGtCQUFrQkE7aUJBQ2xCQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQy9CQSxJQUFJQSxXQUFXQSxHQUFHQSxnQkFBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsZUFBZUEsQ0FBQ0E7eUJBQ3pCQSxNQUFNQSxDQUFDQSxlQUFlQSxDQUFDQSxJQUFJQSxLQUFLQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQTt5QkFDaEVBLElBQUlBLDJCQUFZQSxDQUFDQSxFQUFFQSxDQUFDQTt5QkFDcEJBLElBQUlBLENBQUNBO3FCQUMzQkEsZUFBZUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQTt5QkFDOUJBLElBQUlBLEdBQUdBLENBQUNBLGVBQWVBLENBQUNBLFdBQVdBLEVBQUVBLFdBQVdBLEVBQUVBLEVBQUVBLEVBQUVBLFdBQVdBLENBQUNBLENBQUNBO2lCQUN6RUEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7YUFDREEsV0FBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EscUJBQXFCQSxDQUFDQSxXQUFXQSxDQUFDQSxFQUFFQSxnQkFBZ0JBLEVBQzlEQSxvQkFBb0JBLEVBQUVBLGVBQWVBLEVBQUVBLEtBQUtBLEVBQUVBLFdBQVdBLEVBQUVBLGNBQWNBLENBQUNBLENBQUNBO2FBQzVGQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsU0FBU0EsQ0FBQ0EsSUFBSUEsS0FBS0EsVUFBVUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzlFQSxVQUFVQSxDQUFDQSxjQUFjQSxDQUFDQSxZQUFZQSxDQUFDQSxXQUFXQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQTthQUNyRUEsQ0FBQ0E7YUFDREEsYUFBYUEsSUFBSUEsU0FBU0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsTUFBTUEsQ0FBQ0E7YUFDakRBLFVBQVVBLElBQUlBLFNBQVNBLENBQUNBLGdCQUFnQkEsQ0FBQ0E7U0FDM0NBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBQ2xCQSxDQUFDQTtLQUVESCxpREFBbUJBLEdBQW5CQSxVQUFvQkEsUUFBNEJBLEVBQUVBLFFBQWtCQTtTQUNsRUksSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsUUFBUUEsRUFBRUEsUUFBUUEsRUFBRUEsSUFBSUEsRUFBRUEsSUFBSUEsTUFBTUEsRUFBRUEsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7S0FDbEVBLENBQUNBO0tBRURKLGlFQUFpRUE7S0FDakVBLG1EQUFxQkEsR0FBckJBLFVBQXNCQSxVQUE4QkEsRUFBRUEsaUJBQXlCQSxFQUN6REEsV0FBK0JBLEVBQUVBLHdCQUFnQ0EsRUFDakVBLEtBQWFBLEVBQUVBLElBQXdCQTtTQUMzREssRUFBRUEsQ0FBQ0EsQ0FBQ0EsY0FBT0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDekJBLFdBQVdBLEdBQUdBLFVBQVVBLENBQUNBO2FBQ3pCQSx3QkFBd0JBLEdBQUdBLGlCQUFpQkEsQ0FBQ0E7U0FDL0NBLENBQUNBO1NBQ0RBLFVBQVVBLENBQUNBLGNBQWNBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBO1NBQy9EQSxJQUFJQSxhQUFhQSxHQUFHQSxVQUFVQSxDQUFDQSxjQUFjQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO1NBQ2pFQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxhQUFhQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMzQkEsYUFBYUEsR0FBR0EsSUFBSUEsVUFBVUEsQ0FBQ0EsZ0JBQWdCQSxFQUFFQSxDQUFDQTthQUNsREEsVUFBVUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxHQUFHQSxhQUFhQSxDQUFDQTtTQUMvREEsQ0FBQ0E7U0FDREEsd0JBQVdBLENBQUNBLE1BQU1BLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEVBQUVBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO1NBQ3JEQSxJQUFJQSxlQUFlQSxHQUFHQSxXQUFXQSxDQUFDQSxnQkFBZ0JBLENBQUNBLHdCQUF3QkEsQ0FBQ0EsQ0FBQ0E7U0FFN0VBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLG9CQUFvQkEsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7YUFDL0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxlQUFlQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDdENBLElBQUlBLENBQUNBLG9CQUFvQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsZUFBZUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7YUFDNURBLENBQUNBO1NBQ0hBLENBQUNBO1NBQ0RBLGVBQWVBLENBQUNBLDRCQUE0QkEsRUFBRUEsQ0FBQ0E7S0FDakRBLENBQUNBO0tBRURMLG1EQUFxQkEsR0FBckJBLFVBQXNCQSxVQUE4QkEsRUFBRUEsaUJBQXlCQSxFQUFFQSxLQUFhQTtTQUM1Rk0sSUFBSUEsYUFBYUEsR0FBR0EsVUFBVUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtTQUNqRUEsSUFBSUEsSUFBSUEsR0FBR0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FFdENBLFVBQVVBLENBQUNBLGdCQUFnQkEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQSw0QkFBNEJBLEVBQUVBLENBQUNBO1NBRTlFQSxJQUFJQSxDQUFDQSxjQUFjQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUM3QkEsd0JBQVdBLENBQUNBLFFBQVFBLENBQUNBLGFBQWFBLENBQUNBLEtBQUtBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO1NBQ2pEQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLE1BQU1BLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO2FBQzFEQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3ZDQSxHQUFHQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQTtTQUNmQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUdETixvREFBc0JBLEdBQXRCQSxVQUF1QkEsVUFBOEJBLEVBQUVBLGlCQUF5QkEsRUFDekRBLFdBQStCQSxFQUFFQSx3QkFBZ0NBLEVBQ2pFQSxLQUFhQSxFQUFFQSw0QkFBZ0RBO1NBQ3BGTyxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN6QkEsV0FBV0EsR0FBR0EsVUFBVUEsQ0FBQ0E7YUFDekJBLHdCQUF3QkEsR0FBR0EsaUJBQWlCQSxDQUFDQTtTQUMvQ0EsQ0FBQ0E7U0FDREEsSUFBSUEsYUFBYUEsR0FBR0EsVUFBVUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtTQUNqRUEsSUFBSUEsSUFBSUEsR0FBR0EsYUFBYUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDdENBLElBQUlBLGVBQWVBLEdBQUdBLFdBQVdBLENBQUNBLGdCQUFnQkEsQ0FBQ0Esd0JBQXdCQSxDQUFDQSxDQUFDQTtTQUU3RUEsSUFBSUEsUUFBUUEsR0FBR0EsZ0JBQVNBLENBQUNBLDRCQUE0QkEsQ0FBQ0E7YUFDbkNBLGFBQVFBLENBQUNBLHFCQUFxQkEsQ0FBQ0EsNEJBQTRCQSxDQUFDQTthQUM1REEsSUFBSUEsQ0FBQ0E7U0FDeEJBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLElBQUlBLEVBQUVBLFFBQVFBLEVBQUVBLGVBQWVBLENBQUNBLE9BQU9BLEVBQUVBLEVBQUVBLFdBQVdBLENBQUNBLE9BQU9BLEVBQzlEQSxXQUFXQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtLQUN4Q0EsQ0FBQ0E7S0FFRFAsZ0JBQWdCQTtLQUNoQkEsMENBQVlBLEdBQVpBLFVBQWFBLFFBQTRCQSxFQUFFQSwyQkFBcUNBLEVBQ25FQSxtQkFBd0NBLEVBQUVBLE9BQWVBLEVBQUVBLFlBQW9CQTtTQUMxRlEsSUFBSUEsT0FBT0EsR0FBR0EsUUFBUUEsQ0FBQ0EsVUFBVUEsQ0FBQ0E7U0FDbENBLElBQUlBLGFBQWFBLEdBQUdBLE9BQU9BLEdBQUdBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLFNBQVNBLENBQUNBLFNBQVNBLEdBQUdBLENBQUNBLENBQUNBO1NBQ3JFQSxPQUFPQSxPQUFPQSxJQUFJQSxhQUFhQSxFQUFFQSxDQUFDQTthQUNoQ0EsSUFBSUEsUUFBUUEsR0FBR0EsUUFBUUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsQ0FBQ0E7YUFDdkNBLElBQUlBLGFBQWFBLEdBQUdBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBO2FBQ25DQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxLQUFLQSxRQUFRQSxJQUFJQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxLQUFLQSxVQUFVQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbEZBLHVEQUF1REE7aUJBQ3ZEQSxPQUFPQSxJQUFJQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxTQUFTQSxDQUFDQSxTQUFTQSxDQUFDQTthQUNoREEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7aUJBQ05BLEVBQUVBLENBQUNBLENBQUNBLFFBQVFBLEtBQUtBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBO3FCQUMxQkEsa0NBQWtDQTtxQkFDbENBLDJCQUEyQkEsR0FBR0EsSUFBSUEsQ0FBQ0E7cUJBQ25DQSxZQUFZQSxHQUFHQSxJQUFJQSxDQUFDQTtxQkFDcEJBLG1CQUFtQkEsR0FBR0EsUUFBUUEsQ0FBQ0Esd0JBQXdCQSxDQUFDQTtxQkFDeERBLE9BQU9BLEdBQUdBLG1CQUFtQkEsQ0FBQ0EsWUFBWUEsRUFBRUEsQ0FBQ0E7aUJBQy9DQSxDQUFDQTtpQkFDREEsUUFBUUEsQ0FBQ0EsT0FBT0EsR0FBR0EsT0FBT0EsQ0FBQ0E7aUJBQzNCQSxRQUFRQSxDQUFDQSxNQUFNQSxDQUFDQSxNQUFNQSxHQUFHQSxZQUFZQSxDQUFDQTtpQkFDdENBLElBQUlBLE9BQU9BLEdBQUdBLGFBQWFBLENBQUNBLGNBQWNBLENBQUNBO2lCQUMzQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsU0FBU0EsR0FBR0EsQ0FBQ0EsRUFBRUEsU0FBU0EsR0FBR0EsT0FBT0EsQ0FBQ0EsTUFBTUEsRUFBRUEsU0FBU0EsRUFBRUEsRUFBRUEsQ0FBQ0E7cUJBQ2hFQSxJQUFJQSxpQkFBaUJBLEdBQUdBLFNBQVNBLEdBQUdBLFFBQVFBLENBQUNBLGFBQWFBLENBQUNBO3FCQUMzREEsSUFBSUEsZUFBZUEsR0FBR0EsUUFBUUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO3FCQUVuRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3lCQUMvQkEsZUFBZUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsMkJBQTJCQSxFQUFFQSxtQkFBbUJBLEVBQ2hEQSxRQUFRQSxDQUFDQSxlQUFlQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBLENBQUNBO3lCQUNyRUEsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxRQUFRQSxFQUFFQSxlQUFlQSxFQUFFQSxpQkFBaUJBLENBQUNBLENBQUNBO3lCQUN2RUEsSUFBSUEsQ0FBQ0EsbUJBQW1CQSxDQUFDQSxRQUFRQSxFQUFFQSxlQUFlQSxFQUFFQSxpQkFBaUJBLENBQUNBLENBQUNBO3FCQUN6RUEsQ0FBQ0E7aUJBQ0hBLENBQUNBO2lCQUNEQSxJQUFJQSxLQUFLQSxHQUFHQSxnQkFBU0EsQ0FBQ0EsbUJBQW1CQSxDQUFDQTtxQkFDMUJBLElBQUlBLGFBQUtBLENBQUNBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLEtBQUtBLEVBQUVBLG1CQUFtQkEsQ0FBQ0EsV0FBV0EsRUFBRUEsQ0FBQ0E7cUJBQ2xFQSxJQUFJQSxDQUFDQTtpQkFDckJBLFFBQVFBLENBQUNBLGNBQWNBLENBQUNBLE9BQU9BLENBQUNBLFFBQVFBLENBQUNBLE9BQU9BLEVBQUVBLFFBQVFBLENBQUNBLE1BQU1BLEVBQUVBLFFBQVFBLEVBQUVBLEtBQUtBLENBQUNBLENBQUNBO2lCQUNwRkEsT0FBT0EsRUFBRUEsQ0FBQ0E7YUFDWkEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFIsZ0JBQWdCQTtLQUNoQkEsaURBQW1CQSxHQUFuQkEsVUFBb0JBLElBQXdCQSxFQUFFQSxlQUFvQ0EsRUFDOURBLGVBQXVCQTtTQUN6Q1MsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLGVBQWVBLENBQUNBLDRCQUE0QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDOURBLGVBQWVBLENBQUNBLDRCQUE0QkEsRUFBRUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsVUFBQ0EsY0FBY0EsRUFBRUEsSUFBSUE7aUJBQzFFQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxjQUFjQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDNUJBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLEVBQUVBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLGVBQWVBLENBQUNBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBO2lCQUN6RUEsQ0FBQ0E7aUJBQUNBLElBQUlBLENBQUNBLENBQUNBO3FCQUNOQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxFQUFFQSxlQUFlQSxDQUFDQSxtQkFBbUJBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM3RUEsQ0FBQ0E7YUFDSEEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDTEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFRFQsZ0JBQWdCQTtLQUNoQkEsaURBQW1CQSxHQUFuQkEsVUFBb0JBLElBQXdCQSxFQUFFQSxlQUFvQ0EsRUFDOURBLGlCQUF5QkE7U0FDM0NVLElBQUlBLFFBQVFBLEdBQUdBLGVBQWVBLENBQUNBLHdCQUF3QkEsRUFBRUEsQ0FBQ0E7U0FDMURBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLGNBQWNBLEdBQUdBLENBQUNBLEVBQUVBLGNBQWNBLEdBQUdBLFFBQVFBLENBQUNBLE1BQU1BLEVBQUVBLEVBQUVBLGNBQWNBLEVBQUVBLENBQUNBO2FBQ2hGQSxJQUFJQSxpQkFBaUJBLEdBQUdBLFFBQVFBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBO2FBQ2pEQSxJQUFJQSxTQUFTQSxHQUFHQSxlQUFlQSxDQUFDQSxtQkFBbUJBLENBQUNBLGNBQWNBLENBQUNBLENBQUNBO2FBRXBFQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxVQUFVQSxHQUFHQSxDQUFDQSxFQUFFQSxVQUFVQSxHQUFHQSxpQkFBaUJBLENBQUNBLE1BQU1BLEVBQUVBLEVBQUVBLFVBQVVBLEVBQUVBLENBQUNBO2lCQUM3RUEsSUFBSUEsb0JBQW9CQSxHQUFHQSxpQkFBaUJBLENBQUNBLFVBQVVBLENBQUNBLENBQUNBO2lCQUN6REEsb0JBQW9CQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxFQUFFQSxpQkFBaUJBLEVBQUVBLFNBQVNBLENBQUNBLENBQUNBO2FBQ3JFQSxDQUFDQTtTQUNIQSxDQUFDQTtLQUNIQSxDQUFDQTtLQUVEViwyQ0FBYUEsR0FBYkEsVUFBY0EsUUFBNEJBO1NBQ3hDVyxJQUFJQSxhQUFhQSxHQUFHQSxRQUFRQSxDQUFDQSxVQUFVQSxHQUFHQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxTQUFTQSxDQUFDQSxTQUFTQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUNqRkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsT0FBT0EsR0FBR0EsUUFBUUEsQ0FBQ0EsVUFBVUEsRUFBRUEsT0FBT0EsSUFBSUEsYUFBYUEsRUFBRUEsT0FBT0EsRUFBRUEsRUFBRUEsQ0FBQ0E7YUFDNUVBLElBQUlBLFFBQVFBLEdBQUdBLFFBQVFBLENBQUNBLEtBQUtBLENBQUNBLE9BQU9BLENBQUNBLENBQUNBO2FBQ3ZDQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDeEJBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDL0JBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLFdBQVdBLEVBQUVBLENBQUNBO2lCQUNoQ0EsQ0FBQ0E7aUJBQ0RBLFFBQVFBLENBQUNBLE9BQU9BLEdBQUdBLElBQUlBLENBQUNBO2lCQUN4QkEsUUFBUUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7aUJBQ3BDQSxJQUFJQSxPQUFPQSxHQUFHQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxjQUFjQSxDQUFDQTtpQkFDNUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLEdBQUdBLENBQUNBLEVBQUVBLFNBQVNBLEdBQUdBLE9BQU9BLENBQUNBLE1BQU1BLEVBQUVBLFNBQVNBLEVBQUVBLEVBQUVBLENBQUNBO3FCQUNoRUEsSUFBSUEsR0FBR0EsR0FBR0EsUUFBUUEsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxRQUFRQSxDQUFDQSxhQUFhQSxHQUFHQSxTQUFTQSxDQUFDQSxDQUFDQTtxQkFDeEVBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTt5QkFDbkJBLEdBQUdBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBO3FCQUNsQkEsQ0FBQ0E7aUJBQ0hBLENBQUNBO2FBQ0hBLENBQUNBO1NBQ0hBLENBQUNBO0tBQ0hBLENBQUNBO0tBNVBIWDtTQUFDQSxlQUFVQSxFQUFFQTs7NkJBNlBaQTtLQUFEQSwwQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQTVQWSw0QkFBbUIsc0JBNFAvQjs7Ozs7Ozs7Ozs7O0FDelFELHdDQUEyQyxFQUFnQyxDQUFDO0FBSTVFOzs7Ozs7Ozs7SUFTRztBQUNIO0tBQUFZO0tBdUNBQyxDQUFDQTtLQUhDRCxzQkFBSUEscUNBQWFBO1NBbkJqQkE7Ozs7Ozs7Ozs7Ozs7Ozs7OztZQWtCR0E7Y0FDSEEsY0FBMkJFLE1BQU1BLENBQUNBLDBCQUFhQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTs7O1FBQUFGOztLQUVwREEsc0JBQUlBLGtDQUFVQTtjQUFkQSxjQUFrQ0csTUFBTUEsQ0FBQ0EsMEJBQWFBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUg7S0FDN0RBLGlCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBdkNxQixtQkFBVSxhQXVDL0I7QUFFRDtLQUFpQ0ksK0JBQVVBO0tBQ3pDQSxxQkFBbUJBLFVBQW1CQTtTQUUxQkE7Ozs7WUFJR0E7U0FDSUEsaUJBQXlCQSxFQUFVQSxTQUFtQkE7U0FDdkVDLGlCQUFPQSxDQUFDQTtTQVJTQSxlQUFVQSxHQUFWQSxVQUFVQSxDQUFTQTtTQU9uQkEsc0JBQWlCQSxHQUFqQkEsaUJBQWlCQSxDQUFRQTtTQUFVQSxjQUFTQSxHQUFUQSxTQUFTQSxDQUFVQTtLQUV6RUEsQ0FBQ0E7S0FFREQsc0JBQUlBLG1DQUFVQTtjQUFkQSxjQUFrQ0UsTUFBTUEsQ0FBWUEsSUFBSUEsQ0FBQ0EsVUFBV0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7Y0FDOUVGLFVBQWVBLEtBQUtBLElBQUlFLDBCQUFhQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQTs7O1FBRG9DRjtLQUU5RUEsc0JBQUlBLHNDQUFhQTtjQUFqQkEsY0FBMkJHLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLG9CQUFvQkEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBSDtLQUNoRkEsa0JBQUNBO0FBQURBLEVBQUNBLEVBZmdDLFVBQVUsRUFlMUM7QUFmWSxvQkFBVyxjQWV2Qjs7Ozs7Ozs7Ozs7O0FDdEVELHNDQUF5QyxFQUFZLENBQUM7QUFJdEQ7Ozs7Ozs7Ozs7O0lBV0c7QUFDSDtLQUFBSTtLQW1CQUMsQ0FBQ0E7S0FBREQsa0JBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFuQnFCLG9CQUFXLGNBbUJoQztBQUVEO0tBQWtDRSxnQ0FBV0E7S0FDM0NBLHNCQUFZQSxVQUFzQkE7U0FDaENDLGlCQUFPQSxDQUFDQTtTQUNSQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxVQUFVQSxDQUFDQTtLQUMvQkEsQ0FBQ0E7S0FFT0Qsb0NBQWFBLEdBQXJCQTtTQUNFRSxJQUFJQSxVQUFVQSxHQUFnQkEsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0E7U0FDOUNBLElBQUlBLFVBQVVBLEdBQUdBLHVCQUFZQSxDQUFDQSxVQUFVQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQTtTQUNyREEsTUFBTUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsaUJBQWlCQSxHQUFHQSxVQUFVQSxDQUFDQSxhQUFhQSxDQUFDQTtjQUMxRkEsZUFBZUEsQ0FBQ0E7S0FDdkJBLENBQUNBO0tBTURGLHNCQUFJQSxzQ0FBWUE7U0FKaEJBOzs7WUFHR0E7Y0FDSEEsY0FBbUNHLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGFBQWFBLEVBQUVBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUg7S0FFckVBLCtCQUFRQSxHQUFSQSxVQUFTQSxJQUFZQTtTQUNuQkksTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsYUFBYUEsRUFBRUEsQ0FBQ0Esd0JBQXdCQSxDQUFDQSxHQUFHQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtLQUNqRUEsQ0FBQ0E7S0FDSEosbUJBQUNBO0FBQURBLEVBQUNBLEVBdEJpQyxXQUFXLEVBc0I1QztBQXRCWSxxQkFBWSxlQXNCeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUMzREQsZ0NBQThDLENBQXNCLENBQUM7QUFFckUsa0NBQTZDLENBQTBCLENBQUM7QUFDeEUsd0NBQThCLEVBQWdDLENBQUM7QUFJbEQsK0JBQXNCLEdBQUcsaUJBQVUsQ0FBQyxJQUFJLGdCQUFXLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDO0FBRWxHO0tBT0VLLHFCQUE0Q0Esd0JBQXdCQTtTQUhwRUMsZ0JBQWdCQTtTQUNoQkEsNkJBQXdCQSxHQUFHQSxJQUFJQSxnQkFBR0EsRUFBc0RBLENBQUNBO1NBR3ZGQSxJQUFJQSxDQUFDQSx5QkFBeUJBLEdBQUdBLHdCQUF3QkEsQ0FBQ0E7S0FDNURBLENBQUNBO0tBRURELDZCQUFPQSxHQUFQQSxVQUFRQSxTQUFrQ0E7U0FDeENFLElBQUlBLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLHdCQUF3QkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7U0FDL0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxXQUFXQSxDQUFDQSxJQUFJQSxXQUFXQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNyREEsTUFBTUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDM0JBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO0tBQ2RBLENBQUNBO0tBRURGLGdDQUFVQSxHQUFWQSxVQUFXQSxJQUF3QkE7U0FDakNHLElBQUlBLFNBQVNBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBO1NBQzNCQSxJQUFJQSxXQUFXQSxHQUFHQSxJQUFJQSxDQUFDQSx3QkFBd0JBLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO1NBQy9EQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN6QkEsV0FBV0EsR0FBR0EsRUFBRUEsQ0FBQ0E7YUFDakJBLElBQUlBLENBQUNBLHdCQUF3QkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsU0FBU0EsRUFBRUEsV0FBV0EsQ0FBQ0EsQ0FBQ0E7U0FDNURBLENBQUNBO1NBQ0RBLElBQUlBLHFCQUFxQkEsR0FBR0EsV0FBV0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EseUJBQXlCQSxDQUFDQTtTQUNoRkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EscUJBQXFCQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMxQkEsV0FBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDekJBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLHFCQUFxQkEsQ0FBQ0E7S0FDL0JBLENBQUNBO0tBL0JISDtTQUFDQSxlQUFVQSxFQUFFQTtTQU9DQSxXQUFDQSxXQUFNQSxDQUFDQSw4QkFBc0JBLENBQUNBOztxQkF5QjVDQTtLQUFEQSxrQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQS9CWSxvQkFBVyxjQStCdkI7Ozs7Ozs7Ozs7Ozs7Ozs7QUN6Q0QsZ0NBQXlCLENBQXNCLENBQUM7QUFHaEQ7O0lBRUc7QUFDSDtLQUFBSTtLQUlBQyxDQUFDQTtLQUZDRCx1Q0FBYUEsR0FBYkEsVUFBY0EsSUFBd0JBLElBQUdFLENBQUNBO0tBQzFDRix5Q0FBZUEsR0FBZkEsVUFBZ0JBLElBQXdCQSxJQUFHRyxDQUFDQTtLQUg5Q0g7U0FBQ0EsZUFBVUEsRUFBRUE7O3lCQUlaQTtLQUFEQSxzQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQUhZLHdCQUFlLGtCQUczQjs7Ozs7Ozs7Ozs7O0FDVkQsd0NBQTBCLEVBQWdDLENBQUM7QUFDM0Qsd0NBQTRCLEVBQWdDLENBQUM7QUFFN0Qsa0NBQWlDLENBQTBCLENBQUM7QUFPNUQsc0NBQStELEVBQVksQ0FBQztBQUU1RTs7Ozs7Ozs7Ozs7Ozs7Ozs7OztJQW1CRztBQUNIO0tBQUFJO0tBaUZBQyxDQUFDQTtLQTFFQ0Q7O1FBRUdBO0tBQ0hBLGdDQUFLQSxHQUFMQTtTQUNFRSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUMxQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDakJBLENBQUNBO0tBQ0hBLENBQUNBO0tBVURGLHNCQUFJQSxvQ0FBTUE7U0FIVkE7O1lBRUdBO2NBQ0hBLGNBQXVCRyxNQUFNQSxDQUFDQSwwQkFBYUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBSDs7S0F5RGxEQSx1QkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQWpGcUIseUJBQWdCLG1CQWlGckM7QUFFRDtLQUF1Q0kscUNBQWdCQTtLQUNyREEsMkJBQW1CQSxXQUFxQ0EsRUFBRUEsT0FBbUJBO1NBQzNFQyxpQkFBT0EsQ0FBQ0E7U0FEU0EsZ0JBQVdBLEdBQVhBLFdBQVdBLENBQTBCQTtTQUV0REEsSUFBSUEsQ0FBQ0EsT0FBT0EsR0FBR0EsT0FBT0EsQ0FBQ0E7S0FDekJBLENBQUNBO0tBRU9ELHFDQUFTQSxHQUFqQkE7U0FDRUUsSUFBSUEsT0FBT0EsR0FBZ0JBLElBQUlBLENBQUNBLE9BQU9BLENBQUNBO1NBQ3hDQSxJQUFJQSxFQUFFQSxHQUFHQSx1QkFBWUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsVUFBVUEsQ0FBQ0EsQ0FBQ0EsY0FBY0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxDQUFDQTtTQUNwRkEsTUFBTUEsQ0FBQ0EsZ0JBQVNBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBLEtBQUtBLEdBQUdBLEVBQUVBLENBQUNBO0tBQ3ZDQSxDQUFDQTtLQUVERiwrQkFBR0EsR0FBSEEsVUFBSUEsS0FBYUEsSUFBYUcsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDbkVILHNCQUFJQSxxQ0FBTUE7Y0FBVkEsY0FBdUJJLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLEVBQUVBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUo7S0FFeERBLHVFQUF1RUE7S0FDdkVBLHdCQUF3QkE7S0FDeEJBLDhDQUFrQkEsR0FBbEJBLFVBQW1CQSxXQUF3QkEsRUFBRUEsS0FBa0JBO1NBQWxCSyxxQkFBa0JBLEdBQWxCQSxTQUFpQkEsQ0FBQ0E7U0FDN0RBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2FBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBO1NBQ3JDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSw2QkFBNkJBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLEtBQUtBLEVBQUVBLFdBQVdBLENBQUNBLENBQUNBO0tBQzFGQSxDQUFDQTtLQUVETCwwQ0FBY0EsR0FBZEEsVUFBZUEsWUFBaUNBLEVBQUVBLEtBQWtCQSxFQUNyREEsMkJBQXNEQTtTQUR0RE0sNEJBQWlDQSxHQUFqQ0EsbUJBQWlDQTtTQUFFQSxxQkFBa0JBLEdBQWxCQSxTQUFpQkEsQ0FBQ0E7U0FDckRBLDJDQUFzREEsR0FBdERBLGtDQUFzREE7U0FDbkVBLEVBQUVBLENBQUNBLENBQUNBLEtBQUtBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2FBQUNBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBO1NBQ3JDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxDQUFDQSx5QkFBeUJBLENBQUNBLElBQUlBLENBQUNBLE9BQU9BLEVBQUVBLEtBQUtBLEVBQUVBLFlBQVlBLEVBQ2pDQSwyQkFBMkJBLENBQUNBLENBQUNBO0tBQ2pGQSxDQUFDQTtLQUVETiw0Q0FBNENBO0tBQzVDQSxrQ0FBTUEsR0FBTkEsVUFBT0EsT0FBZ0JBLEVBQUVBLEtBQWtCQTtTQUFsQk8scUJBQWtCQSxHQUFsQkEsU0FBaUJBLENBQUNBO1NBQ3pDQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxDQUFDQTtTQUNyQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EscUJBQXFCQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxLQUFLQSxFQUFFQSxPQUFPQSxDQUFDQSxDQUFDQTtLQUM5RUEsQ0FBQ0E7S0FFRFAsbUNBQU9BLEdBQVBBLFVBQVFBLE9BQWdCQTtTQUN0QlEsTUFBTUEsQ0FBQ0Esd0JBQVdBLENBQUNBLE9BQU9BLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLEVBQUVBLEVBQUVBLHVCQUFZQSxDQUFDQSxPQUFPQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUN0RUEsQ0FBQ0E7S0FFRFIsNkJBQTZCQTtLQUM3QkEsa0NBQU1BLEdBQU5BLFVBQU9BLEtBQWtCQTtTQUFsQlMscUJBQWtCQSxHQUFsQkEsU0FBaUJBLENBQUNBO1NBQ3ZCQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUN6Q0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0Esc0JBQXNCQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUM3REEsb0RBQW9EQTtLQUN0REEsQ0FBQ0E7S0FFRFQsNENBQTRDQTtLQUM1Q0Esa0NBQU1BLEdBQU5BLFVBQU9BLEtBQWtCQTtTQUFsQlUscUJBQWtCQSxHQUFsQkEsU0FBaUJBLENBQUNBO1NBQ3ZCQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUFDQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUN6Q0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EscUJBQXFCQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxFQUFFQSxLQUFLQSxDQUFDQSxDQUFDQTtLQUNyRUEsQ0FBQ0E7S0FDSFYsd0JBQUNBO0FBQURBLEVBQUNBLEVBbkRzQyxnQkFBZ0IsRUFtRHREO0FBbkRZLDBCQUFpQixvQkFtRDdCOzs7Ozs7O0FDdEtELGtDQUFtQixDQUEwQixDQUFDO0FBQzlDLHdDQUE2QixFQUFjLENBQUM7QUFFNUMsMkJBQWlDLFdBQTJCLEVBQUUsS0FBSztLQUNqRVcsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsWUFBWUEsV0FBSUEsQ0FBQ0EsQ0FBQ0E7U0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7S0FFM0NBLElBQUlBLEtBQUtBLEdBQVNBLEtBQU1BLENBQUNBLFNBQVNBLENBQUNBO0tBRW5DQSxNQUFNQSxDQUFDQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNwQkEsS0FBS0EsMkJBQWNBLENBQUNBLGdCQUFnQkE7YUFDbENBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLGtCQUFrQkEsQ0FBQ0E7U0FDcENBLEtBQUtBLDJCQUFjQSxDQUFDQSxtQkFBbUJBO2FBQ3JDQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxxQkFBcUJBLENBQUNBO1NBQ3ZDQSxLQUFLQSwyQkFBY0EsQ0FBQ0EsYUFBYUE7YUFDL0JBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLEtBQUtBLENBQUNBLGVBQWVBLENBQUNBO1NBQ2pDQSxLQUFLQSwyQkFBY0EsQ0FBQ0EsZ0JBQWdCQTthQUNsQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0Esa0JBQWtCQSxDQUFDQTtTQUNwQ0EsS0FBS0EsMkJBQWNBLENBQUNBLFNBQVNBO2FBQzNCQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxXQUFXQSxDQUFDQTtTQUM3QkEsS0FBS0EsMkJBQWNBLENBQUNBLE9BQU9BO2FBQ3pCQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxTQUFTQSxDQUFDQTtTQUMzQkEsS0FBS0EsMkJBQWNBLENBQUNBLFNBQVNBO2FBQzNCQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxXQUFXQSxDQUFDQTtTQUM3QkEsS0FBS0EsMkJBQWNBLENBQUNBLE1BQU1BO2FBQ3hCQSxNQUFNQSxDQUFDQSxDQUFDQSxDQUFDQSxLQUFLQSxDQUFDQSxRQUFRQSxDQUFDQTtTQUMxQkE7YUFDRUEsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0E7S0FDakJBLENBQUNBO0FBQ0hBLEVBQUNBO0FBekJlLHlCQUFnQixtQkF5Qi9COzs7Ozs7O0FDekJELFlBQVksY0FBYztLQUN4QkMsdURBQU1BO0tBQ05BLDZEQUFTQTtLQUNUQSx5REFBT0E7S0FDUEEsNkRBQVNBO0tBQ1RBLDJFQUFnQkE7S0FDaEJBLGlGQUFtQkE7S0FDbkJBLHFFQUFhQTtLQUNiQSwyRUFBZ0JBO0FBQ2xCQSxFQUFDQSxFQVRXLHNCQUFjLEtBQWQsc0JBQWMsUUFTekI7QUFURCxLQUFZLGNBQWMsR0FBZCxzQkFTWDtBQUVEOztJQUVHO0FBQ1EsK0JBQXNCLEdBQUc7S0FDbEMsY0FBYyxDQUFDLE1BQU07S0FDckIsY0FBYyxDQUFDLFNBQVM7S0FDeEIsY0FBYyxDQUFDLE9BQU87S0FDdEIsY0FBYyxDQUFDLFNBQVM7S0FDeEIsY0FBYyxDQUFDLGdCQUFnQjtLQUMvQixjQUFjLENBQUMsbUJBQW1CO0tBQ2xDLGNBQWMsQ0FBQyxhQUFhO0tBQzVCLGNBQWMsQ0FBQyxnQkFBZ0I7RUFDaEMsQ0FBQzs7Ozs7OztBQzFCRix3Q0FBc0MsRUFBZ0MsQ0FBQztBQUN2RSxrQ0FBZ0MsQ0FBMEIsQ0FBQztBQUMzRCxtQ0FBdUMsRUFBMkIsQ0FBQztBQUduRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUF1Qkc7QUFDSDtLQUFBQztTQUNVQyxhQUFRQSxHQUFhQSxFQUFFQSxDQUFDQTtTQUN4QkEsYUFBUUEsR0FBR0EsSUFBSUEsb0JBQVlBLEVBQUVBLENBQUNBO0tBc0N4Q0EsQ0FBQ0E7S0FwQ0NELHNCQUFJQSw4QkFBT0E7Y0FBWEEsY0FBaUNFLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUY7S0FDeERBLHNCQUFJQSw2QkFBTUE7Y0FBVkEsY0FBdUJHLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBOzs7UUFBQUg7S0FDckRBLHNCQUFJQSw0QkFBS0E7Y0FBVEEsY0FBaUJJLE1BQU1BLENBQUNBLHdCQUFXQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTs7O1FBQUFKO0tBQzNEQSxzQkFBSUEsMkJBQUlBO2NBQVJBLGNBQWdCSyxNQUFNQSxDQUFDQSx3QkFBV0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7OztRQUFBTDtLQUV6REE7O1FBRUdBO0tBQ0hBLHVCQUFHQSxHQUFIQSxVQUFPQSxFQUFrQkEsSUFBU00sTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFakVOOztRQUVHQTtLQUNIQSwwQkFBTUEsR0FBTkEsVUFBT0EsRUFBd0JBLElBQVNPLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBRTFFUDs7UUFFR0E7S0FDSEEsMEJBQU1BLEdBQU5BLFVBQVVBLEVBQTBCQSxFQUFFQSxJQUFPQSxJQUFPUSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxDQUFDQSxNQUFNQSxDQUFDQSxFQUFFQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUU1RlI7O1FBRUdBO0tBQ0hBLDJCQUFPQSxHQUFQQSxjQUFpQlMsTUFBTUEsQ0FBQ0Esd0JBQVdBLENBQUNBLEtBQUtBLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO0tBRTNEVCxvQkFBQ0Esd0JBQWlCQSxFQUFFQSxDQUFDQSxHQUFyQkEsY0FBK0JVLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLHdCQUFpQkEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFN0VWLDRCQUFRQSxHQUFSQSxjQUFxQlcsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFdkRYOztRQUVHQTtLQUNIQSx5QkFBS0EsR0FBTEEsVUFBTUEsR0FBUUEsSUFBVVksSUFBSUEsQ0FBQ0EsUUFBUUEsR0FBR0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FFOUNaLGdCQUFnQkE7S0FDaEJBLG1DQUFlQSxHQUFmQSxjQUEwQmEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDdkRiLGdCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBeENZLGtCQUFTLFlBd0NyQjs7Ozs7OztBQ3JFWSwrQkFBc0IsR0FBRyxHQUFHLENBQUM7QUFFMUM7S0FDRWMscUJBQW1CQSxTQUFpQkEsRUFBU0EsU0FBaUJBLEVBQVNBLFVBQW1CQTtTQUF2RUMsY0FBU0EsR0FBVEEsU0FBU0EsQ0FBUUE7U0FBU0EsY0FBU0EsR0FBVEEsU0FBU0EsQ0FBUUE7U0FBU0EsZUFBVUEsR0FBVkEsVUFBVUEsQ0FBU0E7S0FBR0EsQ0FBQ0E7S0FFdkZELGlCQUFLQSxHQUFaQSxVQUFhQSxXQUFtQkE7U0FDOUJFLElBQUlBLFNBQVNBLEdBQUdBLFdBQVdBLEVBQUVBLFNBQVNBLEdBQUdBLFdBQVdBLEVBQUVBLFVBQVVBLEdBQUdBLEtBQUtBLENBQUNBO1NBQ3pFQSxJQUFJQSxZQUFZQSxHQUFHQSxXQUFXQSxDQUFDQSxPQUFPQSxDQUFDQSw4QkFBc0JBLENBQUNBLENBQUNBO1NBQy9EQSxFQUFFQSxDQUFDQSxDQUFDQSxZQUFZQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN0QkEsc0NBQXNDQTthQUN0Q0EsU0FBU0EsR0FBR0EsV0FBV0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsWUFBWUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0E7YUFDMURBLFNBQVNBLEdBQUdBLFdBQVdBLENBQUNBLFNBQVNBLENBQUNBLFlBQVlBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEVBQUVBLENBQUNBO2FBQzNEQSxVQUFVQSxHQUFHQSxJQUFJQSxDQUFDQTtTQUNwQkEsQ0FBQ0E7U0FDREEsTUFBTUEsQ0FBQ0EsSUFBSUEsV0FBV0EsQ0FBQ0EsU0FBU0EsRUFBRUEsU0FBU0EsRUFBRUEsVUFBVUEsQ0FBQ0EsQ0FBQ0E7S0FDM0RBLENBQUNBO0tBRURGLGlDQUFXQSxHQUFYQTtTQUNFRyxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxHQUFHQSxLQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxHQUFHQSw4QkFBc0JBLEdBQUdBLElBQUlBLENBQUNBLFNBQVdBO2FBQzdEQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQTtLQUMxQ0EsQ0FBQ0E7S0FDSEgsa0JBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFuQlksb0JBQVcsY0FtQnZCOzs7Ozs7Ozs7Ozs7Ozs7O0FDckJELGdDQUE0QyxDQUFzQixDQUFDO0FBQ25FLGtDQUFrRCxDQUEwQixDQUFDO0FBQzdFLHdDQUE0QixFQUFnQyxDQUFDO0FBQzdELHdDQUE0QyxFQUFnQyxDQUFDO0FBQzdFLHNDQVdPLENBQTRCLENBQUM7QUFDcEMsd0NBQXdCLEVBQXlDLENBQUM7QUFFbEUsK0JBQThCLElBQVM7S0FDckNJLE1BQU1BLENBQUNBLElBQUlBLFlBQVlBLDRCQUFpQkEsQ0FBQ0E7QUFDM0NBLEVBQUNBO0FBRUQ7Ozs7OztJQU1HO0FBQ0g7S0FBQUM7S0E4R0FDLENBQUNBO0tBNUdDRDs7UUFFR0E7S0FDSEEsbUNBQU9BLEdBQVBBLFVBQVFBLElBQVVBO1NBQ2hCRSxJQUFJQSxZQUFZQSxHQUFHQSxzQkFBU0EsQ0FBQ0EsV0FBV0EsQ0FBQ0Esc0JBQWlCQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUNsRUEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFlBQVlBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzVCQSxJQUFJQSxRQUFRQSxHQUFHQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxvQkFBb0JBLENBQUNBLENBQUNBO2FBQ3ZEQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3hCQSxJQUFJQSxnQkFBZ0JBLEdBQUdBLHNCQUFTQSxDQUFDQSxZQUFZQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtpQkFDcERBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLDBCQUEwQkEsQ0FBQ0EsUUFBUUEsRUFBRUEsZ0JBQWdCQSxDQUFDQSxDQUFDQTthQUNyRUEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FFREEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLHNDQUFvQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUdBLENBQUNBLENBQUNBO0tBQ2pGQSxDQUFDQTtLQUVPRixzREFBMEJBLEdBQWxDQSxVQUFtQ0EsRUFBcUJBLEVBQ3JCQSxnQkFBd0NBO1NBQ3pFRyxJQUFJQSxNQUFNQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNoQkEsSUFBSUEsT0FBT0EsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDakJBLElBQUlBLElBQUlBLEdBQTRCQSxFQUFFQSxDQUFDQTtTQUN2Q0EsSUFBSUEsT0FBT0EsR0FBeUJBLEVBQUVBLENBQUNBO1NBRXZDQSw2QkFBZ0JBLENBQUNBLE9BQU9BLENBQUNBLGdCQUFnQkEsRUFBRUEsVUFBQ0EsUUFBZUEsRUFBRUEsUUFBZ0JBO2FBQzNFQSxRQUFRQSxDQUFDQSxPQUFPQSxDQUFDQSxXQUFDQTtpQkFDaEJBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLHdCQUFhQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDL0JBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3lCQUNyQ0EsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBSUEsUUFBUUEsVUFBS0EsQ0FBQ0EsQ0FBQ0EsbUJBQXFCQSxDQUFDQSxDQUFDQTtxQkFDdkRBLENBQUNBO3FCQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTt5QkFDTkEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7cUJBQ3hCQSxDQUFDQTtpQkFDSEEsQ0FBQ0E7aUJBRURBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLHlCQUFjQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDaENBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3lCQUNyQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBSUEsUUFBUUEsVUFBS0EsQ0FBQ0EsQ0FBQ0EsbUJBQXFCQSxDQUFDQSxDQUFDQTtxQkFDeERBLENBQUNBO3FCQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTt5QkFDTkEsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0E7cUJBQ3pCQSxDQUFDQTtpQkFDSEEsQ0FBQ0E7aUJBRURBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLDhCQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3JDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsZ0JBQWdCQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTt5QkFDbENBLElBQUlBLENBQUNBLE9BQUlBLENBQUNBLENBQUNBLGdCQUFnQkEsT0FBR0EsQ0FBQ0EsR0FBR0EsUUFBUUEsQ0FBQ0E7cUJBQzdDQSxDQUFDQTtxQkFBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7eUJBQ05BLElBQUlBLENBQUNBLE9BQUlBLFFBQVFBLE9BQUdBLENBQUNBLEdBQUdBLFFBQVFBLENBQUNBO3FCQUNuQ0EsQ0FBQ0E7aUJBQ0hBLENBQUNBO2lCQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxZQUFZQSwrQkFBb0JBLENBQUNBLENBQUNBLENBQUNBO3FCQUN0Q0EsSUFBSUEsSUFBSUEsR0FBR0EsZ0JBQVNBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLEdBQVdBLENBQUNBLENBQUNBLElBQUtBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBO3FCQUMvREEsSUFBSUEsQ0FBQ0EsT0FBSUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsT0FBR0EsQ0FBQ0EsR0FBTUEsUUFBUUEsU0FBSUEsSUFBSUEsTUFBR0EsQ0FBQ0E7aUJBQ3BEQSxDQUFDQTtpQkFFREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsa0NBQXVCQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDekNBLE9BQU9BLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO2lCQUN4QkEsQ0FBQ0E7aUJBRURBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLCtCQUFvQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3RDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTtpQkFDeEJBLENBQUNBO2lCQUVEQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxZQUFZQSwrQkFBb0JBLENBQUNBLENBQUNBLENBQUNBO3FCQUN0Q0EsT0FBT0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7aUJBQ3hCQSxDQUFDQTtpQkFFREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsWUFBWUEsNEJBQWlCQSxDQUFDQSxDQUFDQSxDQUFDQTtxQkFDbkNBLE9BQU9BLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO2lCQUN4QkEsQ0FBQ0E7YUFDSEEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDTEEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDSEEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsRUFBRUEsRUFBRUEsTUFBTUEsRUFBRUEsT0FBT0EsRUFBRUEsSUFBSUEsRUFBRUEsT0FBT0EsQ0FBQ0EsQ0FBQ0E7S0FDekRBLENBQUNBO0tBRU9ILGtDQUFNQSxHQUFkQSxVQUFlQSxFQUFxQkEsRUFBRUEsTUFBZ0JBLEVBQUVBLE9BQWlCQSxFQUMxREEsSUFBNkJBLEVBQUVBLE9BQTZCQTtTQUN6RUksSUFBSUEsWUFBWUEsR0FBR0EsZ0JBQVNBLENBQUNBLEVBQUVBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLHdCQUFXQSxDQUFDQSxNQUFNQSxDQUFDQSxFQUFFQSxDQUFDQSxNQUFNQSxFQUFFQSxNQUFNQSxDQUFDQSxHQUFHQSxNQUFNQSxDQUFDQTtTQUN6RkEsSUFBSUEsYUFBYUEsR0FBR0EsZ0JBQVNBLENBQUNBLEVBQUVBLENBQUNBLE9BQU9BLENBQUNBLEdBQUdBLHdCQUFXQSxDQUFDQSxNQUFNQSxDQUFDQSxFQUFFQSxDQUFDQSxPQUFPQSxFQUFFQSxPQUFPQSxDQUFDQSxHQUFHQSxPQUFPQSxDQUFDQTtTQUM5RkEsSUFBSUEsVUFBVUEsR0FBR0EsZ0JBQVNBLENBQUNBLEVBQUVBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLDZCQUFnQkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsSUFBSUEsRUFBRUEsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7U0FDbkZBLElBQUlBLGFBQWFBLEdBQ2JBLGdCQUFTQSxDQUFDQSxFQUFFQSxDQUFDQSxPQUFPQSxDQUFDQSxHQUFHQSw2QkFBZ0JBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLENBQUNBLE9BQU9BLEVBQUVBLE9BQU9BLENBQUNBLEdBQUdBLE9BQU9BLENBQUNBO1NBRWxGQSxFQUFFQSxDQUFDQSxDQUFDQSxFQUFFQSxZQUFZQSw0QkFBaUJBLENBQUNBLENBQUNBLENBQUNBO2FBQ3BDQSxNQUFNQSxDQUFDQSxJQUFJQSw0QkFBaUJBLENBQUNBO2lCQUMzQkEsUUFBUUEsRUFBRUEsRUFBRUEsQ0FBQ0EsUUFBUUE7aUJBQ3JCQSxNQUFNQSxFQUFFQSxZQUFZQTtpQkFDcEJBLE9BQU9BLEVBQUVBLGFBQWFBO2lCQUN0QkEsSUFBSUEsRUFBRUEsVUFBVUE7aUJBQ2hCQSxRQUFRQSxFQUFFQSxFQUFFQSxDQUFDQSxRQUFRQTtpQkFDckJBLFFBQVFBLEVBQUVBLEVBQUVBLENBQUNBLFFBQVFBO2lCQUNyQkEsT0FBT0EsRUFBRUEsYUFBYUE7aUJBQ3RCQSxlQUFlQSxFQUFFQSxFQUFFQSxDQUFDQSxlQUFlQTtpQkFDbkNBLFNBQVNBLEVBQUVBLEVBQUVBLENBQUNBLFNBQVNBO2lCQUN2QkEsYUFBYUEsRUFBRUEsRUFBRUEsQ0FBQ0EsYUFBYUE7Y0FDaENBLENBQUNBLENBQUNBO1NBRUxBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLE1BQU1BLENBQUNBLElBQUlBLDRCQUFpQkEsQ0FBQ0E7aUJBQzNCQSxRQUFRQSxFQUFFQSxFQUFFQSxDQUFDQSxRQUFRQTtpQkFDckJBLE1BQU1BLEVBQUVBLFlBQVlBO2lCQUNwQkEsT0FBT0EsRUFBRUEsYUFBYUE7aUJBQ3RCQSxJQUFJQSxFQUFFQSxVQUFVQTtpQkFDaEJBLFFBQVFBLEVBQUVBLEVBQUVBLENBQUNBLFFBQVFBO2lCQUNyQkEsT0FBT0EsRUFBRUEsYUFBYUE7aUJBQ3RCQSxTQUFTQSxFQUFFQSxFQUFFQSxDQUFDQSxTQUFTQTtjQUN4QkEsQ0FBQ0EsQ0FBQ0E7U0FDTEEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0E3R0hKO1NBQUNBLGVBQVVBLEVBQUVBOzsyQkE4R1pBO0tBQURBLHdCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBN0dZLDBCQUFpQixvQkE2RzdCOzs7Ozs7Ozs7Ozs7Ozs7O0FDM0lELGdDQUF5QixDQUFzQixDQUFDO0FBQ2hELGtDQUEyQixFQUFrQixDQUFDO0FBQzlDLHdDQUFnQyxFQUF3QixDQUFDO0FBRXpELGtDQUFrRCxDQUEwQixDQUFDO0FBQzdFLHdDQUE0QixFQUFnQyxDQUFDO0FBQzdELHdDQUFrQixFQUFnQyxDQUFDO0FBRW5ELHdDQUF3QixFQUF5QyxDQUFDO0FBR2xFOztJQUVHO0FBQ0g7S0FBQUs7U0FFRUMsZ0JBQWdCQTtTQUNoQkEsV0FBTUEsR0FBR0EsSUFBSUEsZ0JBQUdBLEVBQXNCQSxDQUFDQTtLQWtGekNBLENBQUNBO0tBaEZDRCw4QkFBT0EsR0FBUEEsVUFBUUEsU0FBZUE7U0FDckJFLElBQUlBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBO1NBRXRDQSxFQUFFQSxDQUFDQSxDQUFDQSxjQUFPQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNsQkEsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7YUFDaENBLElBQUlBLENBQUNBLE1BQU1BLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO1NBQ25DQSxDQUFDQTtTQUVEQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQTtLQUNkQSxDQUFDQTtLQUVERixnQkFBZ0JBO0tBQ2hCQSwrQkFBUUEsR0FBUkEsVUFBU0EsU0FBZUE7U0FDdEJHLElBQUlBLFFBQTJCQSxDQUFDQTtTQUNoQ0EsSUFBSUEsUUFBc0JBLENBQUNBO1NBRTNCQSxzQkFBU0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsV0FBQ0E7YUFDeENBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLG1CQUFZQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDOUJBLFFBQVFBLEdBQUdBLENBQUNBLENBQUNBO2FBQ2ZBLENBQUNBO2FBQ0RBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLFlBQVlBLDhCQUFpQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQ25DQSxRQUFRQSxHQUFHQSxDQUFDQSxDQUFDQTthQUNmQSxDQUFDQTtTQUNIQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUVIQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeEJBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLFFBQVFBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLGNBQU9BLENBQUNBLFFBQVFBLENBQUNBLFdBQVdBLENBQUNBLElBQUlBLGNBQU9BLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUNyRkEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQ25CQSxnQkFBY0EsZ0JBQVNBLENBQUNBLFNBQVNBLENBQUNBLGtFQUErREEsQ0FBQ0EsQ0FBQ0E7YUFFekdBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxRQUFRQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQy9EQSxJQUFJQSxDQUFDQSw0QkFBNEJBLENBQUNBLFVBQVVBLEVBQUVBLFNBQVNBLENBQUNBLENBQUNBO2FBRTNEQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsV0FBV0EsQ0FBQ0EsSUFBSUEsZ0JBQVNBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUNsRUEsSUFBSUEsQ0FBQ0EsNEJBQTRCQSxDQUFDQSxhQUFhQSxFQUFFQSxTQUFTQSxDQUFDQSxDQUFDQTthQUU5REEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFFBQVFBLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLGdCQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDakVBLElBQUlBLENBQUNBLDRCQUE0QkEsQ0FBQ0EsWUFBWUEsRUFBRUEsU0FBU0EsQ0FBQ0EsQ0FBQ0E7YUFFN0RBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzVEQSxJQUFJQSxDQUFDQSw0QkFBNEJBLENBQUNBLE9BQU9BLEVBQUVBLFNBQVNBLENBQUNBLENBQUNBO2FBRXhEQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsYUFBYUEsQ0FBQ0EsSUFBSUEsZ0JBQVNBLENBQUNBLFFBQVFBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUNwRUEsSUFBSUEsQ0FBQ0EsNEJBQTRCQSxDQUFDQSxlQUFlQSxFQUFFQSxTQUFTQSxDQUFDQSxDQUFDQTthQUVoRUEsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLGdCQUFTQSxDQUFDQSxRQUFRQSxDQUFD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QUNBLENBQUNBLENBQUNBO0tBQ25DQSxJQUFJQSxTQUFTQSxHQUFHQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtLQUU3QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLEtBQUtBLENBQUNBLGVBQWVBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO1NBQzdDQSxNQUFNQSxDQUFDQSx3QkFBd0JBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0tBQ3pDQSxDQUFDQTtLQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNOQSxLQUFLQSxDQUFDQSxlQUFlQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxlQUFlQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtLQUNwRUEsQ0FBQ0E7S0FFREEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsZUFBZUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsSUFBSUEsZUFBZUEsQ0FBQ0EsSUFBSUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7U0FDcEVBLEVBQUVBLENBQUNBLENBQUNBLGNBQU9BLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3RCQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxHQUFHQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtTQUMxQkEsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsZUFBZUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDMUNBLE1BQU1BLENBQUNBLHdCQUF3QkEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7S0FDekNBLENBQUNBO0tBRURBLElBQUlBLElBQUlBLEdBQUdBLFNBQVNBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNB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QUM1QkEsR0FBR0EsSUFBSUEsSUFBSUEsQ0FBQ0EsT0FBT0EsQ0FBQ0E7U0FDdEJBLENBQUNBO1NBQ0RBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMvQkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsRUFBRUEsRUFBRUEsQ0FBQ0E7aUJBQ2hEQSxHQUFHQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxDQUFDQSxVQUFVQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNsQ0EsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FDREEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQzFCQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQTtpQkFDdkNBLElBQUlBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO2lCQUMvQkEsSUFBSUEsU0FBU0EsR0FBR0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0E7aUJBQ2hDQSxHQUFHQSxJQUFJQSxHQUFHQSxHQUFHQSxRQUFRQSxDQUFDQTtpQkFDdEJBLEVBQUVBLENBQUNBLENBQUNBLFNBQVNBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO3FCQUN6QkEsR0FBR0EsSUFBSUEsR0FBR0EsR0FBR0EsU0FBU0EsQ0FBQ0E7aUJBQ3pCQSxDQUFDQTtpQkFDREEsR0FBR0EsSUFB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QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3pCQSxVQUFVQSxHQUFHQSxJQUFJQSxDQUFDQTthQUNsQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsZ0JBQVNBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM1QkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsU0FBU0EsRUFBRUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsb0JBQW9CQSxFQUM5REEsV0FBV0EsQ0FBQ0EsQ0FBQ0E7YUFFbkNBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUNMQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDN0JBLElBQUlBLFVBQVVBLEdBQUdBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2lCQUM5QkEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsVUFBVUEsRUFBRUEsU0FBU0EsRUFBRUEsSUFBSUEsQ0FBQ0EsVUFBVUEsRUFBRUEsVUFBVUEsQ0FBQ0EsQ0FBQ0E7YUFFMUVBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLGdCQUFTQSxDQUFDQSxTQUFTQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbkNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBLEVBQUVBLFNBQVNBLEVBQUVBLElBQUlBLENBQUNBLFVBQVVBLEVBQUVBLG9CQUFvQkEsRUFDOURBLFlBQVlBLENBQUNBLENBQUNBO2FBRWpDQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxnQkFBU0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FB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Q0FBQ0EsZ0JBQWdCQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxDQUFDQTthQUN6Q0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsMEJBQWFBLENBQUNBLFNBQVNBLENBQUNBLENBQUNBLENBQUNBO2lCQUN0REEsSUFBSUEsQ0FBQ0EsY0FBY0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsUUFBUUEsRUFBRUEsQ0FBQ0EsQ0FBQ0E7YUFDdkNBLENBQUNBO2FBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLElBQUlBLEtBQUtBLDBCQUFhQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDeERBLElBQUlBLENBQUNBLGlCQUFpQkEsRUFBRUEsQ0FBQ0E7aUJBQ3pCQSxJQUFJQSxDQUFDQSxhQUFhQSxDQUFDQSxJQUFJQSxDQUFDQSxRQUFRQSxFQUFFQSxDQUFDQSxDQUFDQTthQUN0Q0EsQ0FBQ0E7YUFBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsSUFBSUEsS0FBS0EsMEJBQWFBLENBQUNBLGFBQWFBLENBQUNBLENBQUNBLENBQUNBO2lCQUMxREEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxFQUFFQSxDQUFDQTtpQkFDekJBLElBQUlBLENBQUNBLGVBQWVBLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLEVBQUVBLENBQUNBLENBQUNBO2FBQ3hDQSxDQUFDQTthQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxLQUFLQSwwQkFBYUEsQ0FBQ0EsSUFBSUE7aUJBQ3JDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxLQUFLQSwwQkFBYUEsQ0FBQ0EsUUFBUUE7aUJBQ3pDQSxJQUFJQSxDQUFDQSxJQUFJQSxD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eENBLElBQUlBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBO1NBQ3BDQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxHQUFHQSxNQUFNQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNqQ0EsUUFBUUEsR0FBR0EsTUFBTUEsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDL0JBLENBQUNBO1NBQ0RBLElBQUlBLE1BQU1BLEdBQUdBLFFBQVFBLENBQUNBO1NBQ3RCQSxJQUFJQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUNmQSxJQUFJQSxRQUFRQSxHQUFHQSxDQUFDQSxDQUFDQTtTQUVqQkEsT0FBT0EsTUFBTUEsR0FBR0EsR0FBR0EsSUFBSUEsUUFBUUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDcENBLFFBQVFBLEVBQUVBLENBQUNBO2FBQ1hBLE1BQU1BLEVBQUVBLENBQUNBO2FBQ1RBLEVBQUVBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2lCQUM3QkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsUUFBUUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3BCQSxLQUFLQSxDQUFDQTtpQkFDUkEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FFREEsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDWEEsUUFBUUEsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDYkEsT0FBT0EsTUFBTUEsR0FBR0EsR0FBR0EsSUFBSUEsTUFBTUEsR0FBR0EsTUFBTUEsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0E7YUFDbERBLE1BQU1BLEVBQUVBLENBQUNBO2FBQ1RBLE1BQU1BLEVBQUVBLENBQUNBO2FBQ1RBLEVBQUVBLENBQUNBLENBQUNBLE1BQU1BLENBQUNBLE1BQU1BLENBQUNBLElBQUlBLElBQUlBLENBQUNBLENBQUNBLENBQUNBO2lCQUMzQkEsRUFBRUEsQ0FBQ0EsQ0FBQ0EsRUFBRUEsUUFBUUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7cUJBQ3BCQSxLQUFLQSxDQUFDQTtpQkFDUkEsQ0FBQ0E7YUFDSEEsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FFREEsSUFBSUEsT0FBT0EsR0FBR0EsTUFBTUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsUUFBUUEsRUFBRUEsSUFBSUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsR0FBR0EsWUFBWUE7YUFDL0RBLE1BQU1BLENBQUNBLFNBQVNBLENBQUNBLElBQUlBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLEVBQUVBLE1BQU1BLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO1NBRWpFQSxNQUFNQSxDQUFJQSxJQUFJQSxDQUFDQSxHQUFHQSxZQUFNQSxPQUFPQSxhQUFPQSxJQUFJQSxDQUFDQSxRQUFVQSxDQUFDQTtLQUN4REEsQ0FBQ0E7S0FDSEYsaUJBQUNBO0FBQURBLEVBQUNBLElBQUE7QUF4Q3FCLG1CQUFVLGFBd0MvQjtBQUVEO0tBQ0VHLHlCQUFtQkEsS0FBb0JBLEVBQVNBLEdBQWtCQTtTQUEvQ0MsVUFBS0EsR0FBTEEsS0FBS0EsQ0FBZUE7U0FBU0EsUUFBR0EsR0FBSEEsR0FBR0EsQ0FBZUE7S0FBR0EsQ0FBQ0E7S0FFdEVELGtDQUFRQSxHQUFSQTtTQUNFRSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxTQUFTQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxFQUFFQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtLQUMvRUEsQ0FBQ0E7S0FDSEYsc0JBQUNBO0FBQURBLEVBQUNBLElBQUE7QUFOWSx3QkFBZSxrQkFNM0I7Ozs7Ozs7QUMzREQsa0NBTU8sQ0FBMEIsQ0FBQztBQUVsQywwRUFBeUU7QUFDekUsNERBQTJEO0FBQzNELG1FQUFrRTtBQUNsRSxxR0FBb0c7QUFDdkYsdUJBQWMsR0FBRyxpQkFBVSxDQUFDO0tBQ3ZDLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFNBQVMsRUFBRSxRQUFRO0tBQ25CLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLEtBQUssRUFBRSxHQUFHO0tBQ1YsS0FBSyxFQUFFLFFBQVE7S0FDZixLQUFLLEVBQUUsUUFBUTtLQUNmLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLEtBQUssRUFBRSxRQUFRO0tBQ2YsUUFBUSxFQUFFLFFBQVE7S0FDbEIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsS0FBSyxFQUFFLFFBQVE7S0FDZixLQUFLLEVBQUUsUUFBUTtLQUNmLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLEtBQUssRUFBRSxRQUFRO0tBQ2YsUUFBUSxFQUFFLFFBQVE7S0FDbEIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsS0FBSyxFQUFFLFFBQVE7S0FDZixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixNQUFNLEVBQUUsUUFBUTtLQUNoQixNQUFNLEVBQUUsUUFBUTtLQUNoQixTQUFTLEVBQUUsUUFBUTtLQUNuQixTQUFTLEVBQUUsUUFBUTtLQUNuQixPQUFPLEVBQUUsUUFBUTtLQUNqQixLQUFLLEVBQUUsUUFBUTtLQUNmLEtBQUssRUFBRSxRQUFRO0tBQ2YsS0FBSyxFQUFFLFFBQVE7S0FDZixLQUFLLEVBQUUsUUFBUTtLQUNmLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLElBQUksRUFBRSxRQUFRO0tBQ2QsSUFBSSxFQUFFLEdBQUc7S0FDVCxNQUFNLEVBQUUsUUFBUTtLQUNoQixNQUFNLEVBQUUsUUFBUTtLQUNoQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixLQUFLLEVBQUUsUUFBUTtLQUNmLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLElBQUksRUFBRSxRQUFRO0tBQ2QsUUFBUSxFQUFFLFFBQVE7S0FDbEIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsS0FBSyxFQUFFLFFBQVE7S0FDZixLQUFLLEVBQUUsUUFBUTtLQUNmLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLElBQUksRUFBRSxHQUFHO0tBQ1QsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsT0FBTyxFQUFFLFFBQVE7S0FDakIsUUFBUSxFQUFFLFFBQVE7S0FDbEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsSUFBSSxFQUFFLFFBQVE7S0FDZCxJQUFJLEVBQUUsUUFBUTtLQUNkLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLElBQUksRUFBRSxRQUFRO0tBQ2QsSUFBSSxFQUFFLFFBQVE7S0FDZCxLQUFLLEVBQUUsUUFBUTtLQUNmLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLElBQUksRUFBRSxRQUFRO0tBQ2QsSUFBSSxFQUFFLFFBQVE7S0FDZCxRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixTQUFTLEVBQUUsUUFBUTtLQUNuQixTQUFTLEVBQUUsUUFBUTtLQUNuQixPQUFPLEVBQUUsUUFBUTtLQUNqQixJQUFJLEVBQUUsUUFBUTtLQUNkLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLE1BQU0sRUFBRSxRQUFRO0tBQ2hCLEtBQUssRUFBRSxRQUFRO0tBQ2YsS0FBSyxFQUFFLFFBQVE7S0FDZixJQUFJLEVBQUUsUUFBUTtLQUNkLElBQUksRUFBRSxRQUFRO0tBQ2QsS0FBSyxFQUFFLFFBQVE7S0FDZixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixNQUFNLEVBQUUsUUFBUTtLQUNoQixNQUFNLEVBQUUsUUFBUTtLQUNoQixLQUFLLEVBQUUsUUFBUTtLQUNmLEtBQUssRUFBRSxRQUFRO0tBQ2YsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FDakIsT0FBTyxFQUFFLFFBQVE7S0FDakIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsS0FBSyxFQUFFLFFBQVE7S0FDZixRQUFRLEVBQUUsUUFBUTtLQUNsQixLQUFLLEVBQUUsUUFBUTtLQUNmLEtBQUssRUFBRSxRQUFRO0tBQ2YsS0FBSyxFQUFFLFFBQVE7S0FDZixRQUFRLEVBQUUsUUFBUTtLQUNsQixPQUFPLEVBQUUsUUFBUTtLQUNqQixPQUFPLEVBQUUsUUFBUTtLQUNqQixRQUFRLEVBQUUsUUFBUTtLQUNsQixRQUFRLEVBQUUsUUFBUTtLQUNsQixNQUFNLEVBQUUsUUFBUTtLQUNoQixNQUFNLEVBQUUsUUFBUTtLQUNoQixLQUFLLEVBQUUsUUFBUTtLQUNmLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLE9BQU8sRUFBRSxRQUFRO0tBQ2pCLFFBQVEsRUFBRSxRQUFRO0tBQ2xCLEtBQUssRUFBRSxRQUFRO0tBQ2YsUUFBUSxFQUFFLFFBQVE7S0FDbEIsS0FBSyxFQUFFLFFBQVE7S0FDZixNQUFNLEVBQUUsUUFBUTtLQUNoQixLQUFLLEVBQUUsUUFBUTtLQUNmLEtBQUssRUFBRSxRQUFRO0tBQ2YsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsTUFBTSxFQUFFLFFBQVE7S0FDaEIsT0FBTyxFQUFFLFFBQVE7S0FD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SUEsSUFBSUEsSUFBSUEsUUFBUUEsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDNUNBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBO1NBQ2xCQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxRQUFRQSxDQUFDQSxTQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxDQUFDQSxJQUFJQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMzREEsSUFBSUEsS0FBS0EsR0FBR0Esb0JBQWFBLENBQUNBLFFBQVFBLENBQUNBLElBQUlBLENBQUNBLFlBQVlBLENBQUNBLFFBQVFBLENBQUNBLEVBQUVBLEVBQUVBLENBQUNBLENBQUNBO2FBQ3BFQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxHQUFHQSxRQUFRQSxDQUFDQTtpQkFBQ0EsUUFBUUEsR0FBR0EsS0FBS0EsQ0FBQ0E7U0FDekNBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLFFBQVFBLENBQUNBLFNBQVNBLENBQUNBLFFBQVFBLENBQUNBLE1BQU1BLEdBQUdBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO2FBQzFEQSxJQUFJQSxFQUFFQSxHQUFHQSxvQkFBYUEsQ0FBQ0EsVUFBVUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsUUFBUUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0E7YUFDdEVBLElBQUlBLEtBQUtBLEdBQUdBLFdBQUlBLENBQUNBLEtBQUtBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBO2FBQzNCQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxHQUFHQSxRQUFRQSxDQUFDQTtpQkFBQ0EsUUFBUUEsR0FBR0EsS0FBS0EsQ0FBQ0E7U0FDekNBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLFFBQVFBLENBQUNBO0tBQ2xCQSxDQUFDQTtLQUVEYjs7OztRQUlHQTtLQUNIQSxnQ0FB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Ozs7Ozs7OztRQXdCR0E7S0FDSEEsOEJBQUtBLEdBQUxBLFVBQU1BLE9BQTRCQTtTQUNoQ0UsTUFBTUEsQ0FBQ0EsSUFBSUEsY0FBY0EsQ0FBQ0E7YUFDeEJBLE1BQU1BLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsTUFBTUEsR0FBR0EsSUFBSUEsQ0FBQ0EsTUFBTUE7YUFDdEZBLE9BQU9BLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsT0FBT0E7YUFDMUZBLElBQUlBLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUE7YUFDOUVBLEdBQUdBLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsR0FBR0EsT0FBT0EsQ0FBQ0EsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0E7YUFDMUVBLE1BQU1BLEVBQUVBLGdCQUFTQSxDQUFDQSxPQUFPQSxDQUFDQSxJQUFJQSxnQkFBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0E7aUJBQzNDQSxDQUFDQSxlQUFRQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxDQUFDQSxHQUFHQSxJQUFJQSxtQ0FBZUEsQ0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsQ0FBQ0E7cUJBQzNCQSxDQUFDQSxPQUFPQSxDQUFDQSxNQUFNQSxDQUFFQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQTtpQkFDeEVBLElBQUlBLENBQUNBLE1BQU1BO1VBQ3hCQSxDQUFDQSxDQUFDQTtLQUNMQSxDQUFDQTtLQUNIRixxQkFBQ0E7QUFBREEsRUFBQ0EsSUFBQTtBQXRFWSx1QkFBYyxpQkFzRTFCO0FBR0Q7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7SUEyQ0c7QUFDSDtLQUN3Q0csc0NBQWNBO0tBQ3BEQTtTQUFnQkMsa0JBQU1BLEVBQUNBLE1BQU1BLEVBQUVBLHFCQUFhQSxDQUFDQSxHQUFHQSxFQUFFQSxPQUFPQSxFQUFFQSxJQUFJQSxpQkFBT0EsRUFBRUEsRUFBQ0EsQ0FBQ0EsQ0FBQ0E7S0FBQ0EsQ0FBQ0E7S0FGL0VEO1NBQUNBLGlCQUFVQSxFQUFFQTs7NEJBR1pBO0tBQURBLHlCQUFDQTtBQUFEQSxFQUFDQSxFQUZ1QyxjQUFjLEVBRXJEO0FBRlksMkJBQWtCLHFCQUU5Qjs7Ozs7OztBQ3hKRCxrQ0FBNkMsQ0FBMEIsQ0FBQztBQUN4RSx3Q0FBK0QsRUFBZ0MsQ0FBQztBQUVoRyxzQkFBcUIsU0FBc0I7S0FBdEJFLHlCQUFzQkEsR0FBdEJBLGNBQXNCQTtLQUN6Q0EsSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsZ0JBQUdBLEVBQW9CQSxDQUFDQTtLQUN0Q0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsTUFBTUEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDekJBLElBQUlBLE1BQU1BLEdBQWFBLFNBQVNBLENBQUNBLEtBQUtBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1NBQzVDQSxNQUFNQSxDQUFDQSxPQUFPQSxDQUFDQSxVQUFDQSxLQUFhQTthQUMzQkEsSUFBSUEsS0FBS0EsR0FBYUEsS0FBS0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7YUFDdkNBLElBQUlBLEdBQUdBLEdBQUdBLEtBQUtBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ25CQSxJQUFJQSxHQUFHQSxHQUFHQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuQkEsSUFBSUEsSUFBSUEsR0FBR0EsZ0JBQVNBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLENBQUNBLEdBQUdBLEVBQUVBLENBQUNBO2FBQ3ZEQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQTthQUNmQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxFQUFFQSxJQUFJQSxDQUFDQSxDQUFDQTtTQUNyQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDTEEsQ0FBQ0E7S0FDREEsTUFBTUEsQ0FBQ0EsR0FBR0EsQ0FBQ0E7QUFDYkEsRUFBQ0E7QUFFRDs7Ozs7OztJQU9HO0FBQ0g7S0FFRUMseUJBQW1CQSxTQUFzQkE7U0FBN0JDLHlCQUE2QkEsR0FBN0JBLGNBQTZCQTtTQUF0QkEsY0FBU0EsR0FBVEEsU0FBU0EsQ0FBYUE7U0FBSUEsSUFBSUEsQ0FBQ0EsU0FBU0EsR0FBR0EsV0FBV0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0E7S0FBQ0EsQ0FBQ0E7S0FFdkZELCtCQUFLQSxHQUFMQTtTQUNFRSxJQUFJQSxLQUFLQSxHQUFHQSxJQUFJQSxlQUFlQSxFQUFFQSxDQUFDQTtTQUNsQ0EsS0FBS0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDdEJBLE1BQU1BLENBQUNBLEtBQUtBLENBQUNBO0tBQ2ZBLENBQUNBO0tBRURGLDZCQUFHQSxHQUFIQSxVQUFJQSxLQUFhQSxJQUFhRyxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUVqRUgsNkJBQUdBLEdBQUhBLFVBQUlBLEtBQWFBO1NBQ2ZJLElBQUlBLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1NBQzVDQSxFQUFFQSxDQUFDQSxDQUFDQSwrQkFBa0JBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBLENBQUNBO2FBQ3BDQSxNQUFNQSxDQUFDQSx3QkFBV0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsV0FBV0EsQ0FBQ0EsQ0FBQ0E7U0FDeENBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLENBQUNBO2FBQ05BLE1BQU1BLENBQUNBLElBQUlBLENBQUNBO1NBQ2RBLENBQUNBO0tBQ0hBLENBQUNBO0tBRURKLGdDQUFNQSxHQUFOQSxVQUFPQSxLQUFhQTtTQUNsQkssSUFBSUEsUUFBUUEsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDekNBLE1BQU1BLENBQUNBLGdCQUFTQSxDQUFDQSxRQUFRQSxDQUFDQSxHQUFHQSxRQUFRQSxHQUFHQSxFQUFFQSxDQUFDQTtLQUM3Q0EsQ0FBQ0E7S0FFREwsNkJBQUdBLEdBQUhBLFVBQUlBLEtBQWFBLEVBQUVBLEdBQVdBO1NBQzVCTSxJQUFJQSxRQUFRQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQTtTQUN6Q0EsSUFBSUEsSUFBSUEsR0FBR0EsZ0JBQVNBLENBQUNBLFFBQVFBLENBQUNBLEdBQUdBLFFBQVFBLEdBQUdBLEVBQUVBLENBQUNBO1NBQy9DQSx3QkFBV0EsQ0FBQ0EsS0FBS0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDeEJBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1NBQ2ZBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO0tBQ2xDQSxDQUFDQTtLQUVETixvQkFBb0JBO0tBQ3BCQSw4RUFBOEVBO0tBQzlFQSxFQUFFQTtLQUNGQSx1RUFBdUVBO0tBQ3ZFQSxFQUFFQTtLQUNGQSxxQ0FBcUNBO0tBQ3JDQSxnQ0FBTUEsR0FBTkEsVUFBT0EsWUFBNkJBO1NBQXBDTyxpQkFRQ0E7U0FQQ0EsWUFBWUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsVUFBQ0EsS0FBS0EsRUFBRUEsS0FBS0E7YUFDMUNBLElBQUlBLFFBQVFBLEdBQUdBLEtBQUlBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO2FBQ3pDQSxJQUFJQSxJQUFJQSxHQUFHQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsUUFBUUEsR0FBR0EsRUFBRUEsQ0FBQ0E7YUFDL0NBLHdCQUFXQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUN4QkEsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDcEJBLEtBQUlBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO1NBQ2xDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNMQSxDQUFDQTtLQUVEUCxnQ0FBTUEsR0FBTkEsVUFBT0EsS0FBYUEsRUFBRUEsR0FBV0E7U0FDL0JRLElBQUlBLFFBQVFBLEdBQUdBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1NBQ3pDQSxJQUFJQSxJQUFJQSxHQUFHQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsUUFBUUEsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDL0NBLElBQUlBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO1NBQ2ZBLElBQUlBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO0tBQ2xDQSxDQUFDQTtLQUVEUixvQkFBb0JBO0tBQ3BCQSw2RUFBNkVBO0tBQzdFQSw4QkFBOEJBO0tBQzlCQSxFQUFFQTtLQUNGQSx5RUFBeUVBO0tBQ3pFQSxFQUFFQTtLQUNGQSxxQ0FBcUNBO0tBQ3JDQSxtQ0FBU0EsR0FBVEEsVUFBVUEsWUFBNkJBO1NBQXZDUyxpQkFTQ0E7U0FSQ0EsWUFBWUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsVUFBQ0EsS0FBS0EsRUFBRUEsS0FBS0E7YUFDMUNBLElBQUlBLFFBQVFBLEdBQUdBLEtBQUlBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO2FBQ3pDQSxJQUFJQSxJQUFJQSxHQUFHQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsUUFBUUEsR0FBR0EsRUFBRUEsQ0FBQ0E7YUFDL0NBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBLEdBQUdBLENBQUNBLEVBQUVBLENBQUNBLEdBQUdBLEtBQUtBLENBQUNBLE1BQU1BLEVBQUVBLEVBQUVBLENBQUNBLEVBQUVBLENBQUNBO2lCQUN0Q0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDdEJBLENBQUNBO2FBQ0RBLEtBQUlBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLENBQUNBO1NBQ2xDQSxDQUFDQSxDQUFDQSxDQUFDQTtLQUNMQSxDQUFDQTtLQUdEVCxvQkFBb0JBO0tBQ3BCQSx1RUFBdUVBO0tBQ3ZFQSxrQ0FBa0NBO0tBQ2xDQSxFQUFFQTtLQUNGQSwyRUFBMkVBO0tBQzNFQSxFQUFFQTtLQUNGQSxxQ0FBcUNBO0tBQ3JDQSxvQ0FBVUEsR0FBVkEsVUFBV0EsWUFBNkJBO1NBQXhDVSxpQkFVQ0E7U0FUQ0EsWUFBWUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsVUFBQ0EsS0FBS0EsRUFBRUEsS0FBS0E7YUFDMUNBLElBQUlBLFFBQVFBLEdBQUdBLEtBQUlBLENBQUNBLFNBQVNBLENBQUNBLEdBQUdBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO2FBQ3pDQSxJQUFJQSxJQUFJQSxHQUFHQSxnQkFBU0EsQ0FBQ0EsUUFBUUEsQ0FBQ0EsR0FBR0EsUUFBUUEsR0FBR0EsRUFBRUEsQ0FBQ0E7YUFDL0NBLHdCQUFXQSxDQUFDQSxLQUFLQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUN4QkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsRUFBRUEsQ0FBQ0EsR0FBR0EsS0FBS0EsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsQ0FBQ0EsRUFBRUEsQ0FBQ0E7aUJBQ3RDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUN0QkEsQ0FBQ0E7YUFDREEsS0FBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsS0FBS0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0E7U0FDbENBLENBQUNBLENBQUNBLENBQUNBO0tBQ0xBLENBQUNBO0tBRURWLGtDQUFRQSxHQUFSQTtTQUNFVyxJQUFJQSxVQUFVQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUNwQkEsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsT0FBT0EsQ0FBQ0EsVUFBQ0EsTUFBTUEsRUFBRUEsQ0FBQ0EsSUFBT0EsTUFBTUEsQ0FBQ0EsT0FBT0EsQ0FBQ0EsV0FBQ0EsSUFBSUEsaUJBQVVBLENBQUNBLElBQUlBLENBQUNBLENBQUNBLEdBQUdBLEdBQUdBLEdBQUdBLENBQUNBLENBQUNBLEVBQTVCQSxDQUE0QkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7U0FDOUZBLE1BQU1BLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLENBQUNBO0tBQzlCQSxDQUFDQTtLQUVEWCxnQ0FBTUEsR0FBTkEsVUFBUUEsS0FBYUEsSUFBVVksSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsTUFBTUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7S0FDaEVaLHNCQUFDQTtBQUFEQSxFQUFDQSxJQUFB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U0EsR0FBR0EsZ0JBQWdCQSxDQUFDQTthQUM3QkEsU0FBU0EsR0FBR0EsRUFBRUEsQ0FBQ0E7YUFDZkEsU0FBU0EsR0FBR0EsRUFBRUEsQ0FBQ0E7U0FDakJBLENBQUNBO1NBQ0RBLE1BQU1BLENBQUNBLEVBQUNBLGdCQUFPQSxFQUFFQSxvQkFBU0EsRUFBRUEsb0JBQVNBLEVBQUVBLG9CQUFTQSxFQUFFQSx3QkFBV0EsRUFBQ0EsQ0FBQ0E7S0FDakVBLENBQUNBO0tBR0RGLGlDQUFRQSxHQUFSQSxVQUFTQSxNQUE0QkE7U0FDbkNHLElBQUlBLFdBQVdBLEdBQUdBLElBQUlBLFFBQVFBLENBQUNBLE1BQU1BLENBQUNBLENBQUNBO1NBRXZDQSxJQUFJQSxJQUFJQSxHQUFHQSxFQUFFQSxDQUFDQTtTQUVkQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxFQUFFQSxDQUFDQSxHQUFHQSxJQUFJQSxDQUFDQSxTQUFTQSxDQUFDQSxNQUFNQSxFQUFFQSxDQUFDQSxFQUFFQSxFQUFFQSxDQUFDQTthQUMvQ0EsSUFBSUEsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsU0FBU0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDaENBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLENBQUNBLE9BQU9BLFlBQVlBLG1CQUFtQkEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7aUJBQzlDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxPQUFPQSxDQUFDQSxRQUFRQSxDQUFDQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQTthQUMzQ0EsQ0FBQ0E7U0FDSEEsQ0FBQ0E7U0FDREEsSUFBSUEsT0FBT0EsR0FBR0EsSUFBSUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FFN0JBLElBQUlBLG1CQUFtQkEsR0FBR0EsV0FBV0EsQ0FBQ0EsU0FBU0EsRUFBRUEsQ0FBQ0E7U0FDbERBLElBQUlBLFNBQVNBLEdBQUdBLDRCQUFlQSxDQUFDQSxtQkFBbUJBLENBQUNBLENBQUNB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QUFDQSxNQUFNQSxDQUFDQSxDQUFDQTtLQUM3REEsQ0FBQ0E7S0FFREosaURBQWtCQSxHQUFsQkEsVUFBbUJBLFFBQWdCQTtTQUNqQ0ssSUFBSUEsR0FBR0EsR0FBR0EsaUNBQWFBLENBQUNBLElBQUlBLENBQUNBLFNBQVNBLEVBQUVBLFFBQVFBLENBQUNBLENBQUNBO1NBQ2xEQSxNQUFNQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxDQUFDQTtLQUM1Q0EsQ0FBQ0E7S0FFREwsd0NBQVNBLEdBQVRBLFVBQVVBLEtBQVVBLEVBQUVBLEtBQWFBLEVBQUVBLElBQVlBLEVBQUVBLFdBQW1CQTtTQUNwRU0sSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxHQUFHQSx3Q0FBb0JBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO1NBQzVFQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxRQUFRQSxDQUFDQTtTQUN4Q0EsQ0FBQ0E7U0FDREEsSUFBSUEsQ0FBQ0EsaUJBQWlCQSxDQUFDQSxTQUFTQSxDQUFDQSxLQUFLQSxFQUFFQSxLQUFLQSxFQUFFQSxHQUFHQSxDQUFDQSxDQUFDQTtLQUN0REEsQ0FBQ0E7S0FFRE4sMkNBQVlBLEdBQVpBLFVBQWFBLEtBQVVBLEVBQUVBLEtBQWFBLEVBQUVBLElBQVlBLEVBQUVBLFdBQW1CQTtTQUN2RU8sSUFBSUEsR0FBR0EsR0FBR0EsSUFBSUEsQ0FBQ0Esa0JBQWtCQSxDQUFDQSxJQUFJQSxHQUFHQSx3Q0FBb0JBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBLENBQUNBO1NBQzVFQSxFQUFFQSxDQUFDQSxDQUFDQSxHQUFHQSxDQUFDQSxNQUFNQSxJQUFJQSxDQUFD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Q3BDQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxJQUFJQSxDQUFDQSxXQUFXQSxFQUFFQSxDQUFDQSxDQUFDQTtTQUNsQ0EsQ0FBQ0E7U0FDREEsTUFBTUEsQ0FBQ0EsTUFBTUEsQ0FBQ0E7S0FDaEJBLENBQUNBO0tBRU9GLHFDQUFXQSxHQUFuQkE7U0FDRUcsSUFBSUEsQ0FBQ0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7U0FDN0JBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO2FBQ2JBLElBQUlBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBO2FBQ2JBLE1BQU1BLENBQUNBLElBQUlBLGNBQWNBLEVBQUVBLENBQUNBO1NBRTlCQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNwQkEsSUFBSUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0E7YUFDYkEsTUFBTUEsQ0FBQ0EsSUFBSUEsWUFBWUEsRUFBRUEsQ0FBQ0E7U0FFNUJBLENBQUNBO1NBQUNBLElBQUlBLENBQUNBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO2FBQ3BCQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxZQUFZQSxFQUFFQSxDQUFDQTtTQUU3QkEsQ0FBQ0E7U0FBQ0EsSUFBSUEsQ0FBQ0EsRUFBRUEsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsSUFBSUEsR0FBR0EsSUFBSUEsSUFBSUEsQ0FBQ0EsS0FBS0EsS0FBS0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0EsQ0FBQ0E7YUFDeENBLElBQUlBLENBQUNBLEtBQUtBLEVBQUVBLENBQUNBO2FBQ2JBLE1BQU1BLENBQUNBLElBQUlBLENBQUNBLGVBQWVBLEVBQUVBLENBQUNBO1NBRWhDQSxDQUFDQTtTQUFDQSxJQUFJQSxDQUFDQSxDQUFDQTthQUNOQSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxlQUFlQSxFQUFFQSxDQUFDQTtTQUNoQ0EsQ0FBQ0E7S0FDSEEsQ0FBQ0E7S0FFT0gsc0NBQVlBLEdBQXBCQTtTQUNFSSxJQUFJQSxLQUFLQSxHQUFHQSxJQUFJQSxDQUFDQSxLQUFLQSxDQUFDQTtTQUN2QkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0E7YUFDbERBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO2FBQzdCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDYkEsSUFBSUEsYUFBYUEsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsU0FBU0EsQ0FBQ0EsS0FBS0EsR0FBR0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsQ0FBQ0EsQ0FBQ0E7aUJBQzlEQSxJQUFJQSxDQUFDQSxLQUFLQSxFQUFFQSxDQUFDQTtpQkFDYkEsTUFBTUEsQ0FBQ0EsSUFBSUEsTUFBTUEsQ0FBQ0EsSUFBSUEsQ0FBQ0EsTUFBTUEsQ0FBQ0EsWUFBWUEsQ0FBQ0EsTUFBSUEsYUFBYUEsTUFBR0EsRUFBRUEsSUFBSUEsQ0FBQ0EsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7YUFDOUVBLENBQUNBO1NBQ0hBLENBQUNBO1NBQ0RBLE1BQU1BLElBQUlBLDBCQUFhQSxDQUFDQSxpQkFBaUJBLENBQUNBLENBQUNBO0tBQzdDQSxDQUFDQTtLQUVPSix5Q0FBZUEsR0FBdkJBO1NBQ0VLLElBQUlBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBO1NBQ3ZCQSxJQUFJQSxXQUFXQSxHQUFHQSxLQUFLQSxDQUFDQTtTQUd4QkEsR0FBR0EsQ0FBQ0EsQ0FBQ0EsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsR0FBR0EsSUFBSUEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsTUFBTUEsRUFBRUEsRUFBRUEsSUFBSUEsQ0FBQ0EsS0FBS0EsRUFBRUEsQ0FBQ0E7YUFDbERBLElBQUlBLENBQUNBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO2FBRTdCQSxFQUFFQSxDQUFDQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxDQUFDQSxDQUFDQSxJQUFJQSxHQUFHQSxJQUFJQSxXQUFXQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTtpQkFDbEVBLEtBQUtBLENBQUNBO2FBQ1JBLENBQUNBO2FBRURBLEVBQUVBLENBQUNBLENBQUNBLENBQUNBLElBQUlBLEdBQUdBLElBQUlBLENBQUNBLElBQUlBLEdBQUdBLENBQUNBLENBQUNBLENBQUNBO2lCQUN6QkEsV0FBV0EsR0FBR0EsSUFBSUEsQ0FBQ0E7YUFDckJBLENBQUNBO1NBQ0hBLENBQUNBO1NBRURBLElBQUlBLEtBQUtBLEdBQUdBLElBQUlBLENBQUNBLEdBQUdBLENBQUNBLFNBQVNBLENBQUNBLEtBQUtBLEVBQUVBLElBQUlBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO1NBRWxEQSxFQUFFQSxDQUFDQSxDQUFDQSxLQUFLQSxLQUFLQSxJQUFJQSxDQUFDQSxLQUFLQSxJQUFJQSxDQUFDQSxXQUFXQSxJQUFJQSxLQUFLQSxDQUFDQSxVQUFVQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQSxDQUFDQTthQUNuRUEsTUFBTUEsSUFBSUEsMEJBQWFBLENBQUNBLHFCQUFxQkEsQ0FBQ0EsQ0FBQ0E7U0FDakRBLENBQUNBO1NBRURBLE1BQU1BLENBQUNBLElBQUlBLFNBQVNBLENBQUNBLEtBQUtBLENBQUNBLENBQUNBO0tBQzlCQSxDQUFDQTtLQUNITCxzQkFB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Six3Q0FBU0EsR0FBVEEsVUFBVUEsR0FBUUEsRUFBRUEsS0FBYUEsRUFBRUEsSUFBWUEsRUFBRUEsS0FBYUE7U0FDNURLLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLEtBQUtBLENBQUNBO1NBRTNCQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxLQUFLQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQTtTQUN6REEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsR0FBR0EsQ0FBQ0E7U0FFeEJBLElBQUlBLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDL0NBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLENBQUNBLENBQUNBO0tBQ3BDQSxDQUFDQTtLQUVETCwyQ0FBWUEsR0FBWkEsVUFBYUEsR0FBUUEsRUFBRUEsS0FBYUEsRUFBRUEsSUFBWUEsRUFBRUEsS0FBYUE7U0FDL0RNLElBQUlBLENBQUNBLGFBQWFBLEdBQUdBLEtBQUtBLENBQUNBO1NBRTNCQSxJQUFJQSxHQUFHQSxHQUFHQSxJQUFJQSxHQUFHQSxDQUFDQSxLQUFLQSxDQUFDQSxNQUFNQSxHQUFHQSxDQUFDQSxHQUFHQSxDQUFDQSxHQUFHQSxHQUFHQSxLQUFLQSxDQUFDQSxHQUFHQSxFQUFFQSxDQUFDQSxDQUFDQTtTQUN6REEsSUFBSUEsQ0FBQ0EsWUFBWUEsR0FBR0EsR0FBR0EsQ0FBQ0E7U0FFeEJBLElBQUlBLFdBQVdBLEdBQUdBLElBQUlBLENBQUNBLGtCQUFrQkEsQ0FBQ0EsR0FBR0EsQ0FBQ0EsQ0FBQ0E7U0FDL0NBLElBQUlBLENBQUNBLFVBQVVBLENBQUNBLElBQUlBLENBQUNBLFdBQVdBLEdBQUdBLFdBQVdBLENBQUNBLENBQUNBO0tBQ2xEQSxDQUFDQTtLQUVETix5Q0FBVUEsR0FBVkEsVUFBV0EsRUFBd0JBLElB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T0FBT0EsRUFBRUEsUUFBUUEsQ0FBQ0EsQ0FBQ0E7S0FDL0VBLENBQUNBO0tBSURaLCtCQUFTQSxHQUFUQSxVQUFVQSxHQUFXQSxJQUFZYSxNQUFNQSxDQUFDQSxJQUFJQSxDQUFDQSxDQUFDQSxDQUFDQTtLQXhFakRiO1NBQUNBLGVBQVVBLEVBQUVBOztxQkF5RVpBO0tBQURBLGtCQUFDQTtBQUFEQSxFQUFDQSxJQUFBO0FBeEVZLG9CQUFXLGNBd0V2QiIsImZpbGUiOiJkaXN0L2pzL2J1bmRsZS9hbmd1bGFyMi1hbGwtdGVzdGluZy51bWQuZGV2LmpzIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKFwiUnhcIiksIHJlcXVpcmUoXCJyeGpzL29ic2VydmFibGUvZnJvbVByb21pc2VcIiksIHJlcXVpcmUoXCJyeGpzL29wZXJhdG9yL3RvUHJvbWlzZVwiKSwgcmVxdWlyZShcInJ4anMvc3ViamVjdC9SZXBsYXlTdWJqZWN0XCIpLCByZXF1aXJlKFwicnhqcy9vcGVyYXRvci90YWtlXCIpKTtcblx0ZWxzZSBpZih0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpXG5cdFx0ZGVmaW5lKFtcIlJ4XCIsIFwicnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlXCIsIFwicnhqcy9vcGVyYXRvci90b1Byb21pc2VcIiwgXCJyeGpzL3N1YmplY3QvUmVwbGF5U3ViamVjdFwiLCBcInJ4anMvb3BlcmF0b3IvdGFrZVwiXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJuZ1wiXSA9IGZhY3RvcnkocmVxdWlyZShcIlJ4XCIpLCByZXF1aXJlKFwicnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlXCIpLCByZXF1aXJlKFwicnhqcy9vcGVyYXRvci90b1Byb21pc2VcIiksIHJlcXVpcmUoXCJyeGpzL3N1YmplY3QvUmVwbGF5U3ViamVjdFwiKSwgcmVxdWlyZShcInJ4anMvb3BlcmF0b3IvdGFrZVwiKSk7XG5cdGVsc2Vcblx0XHRyb290W1wibmdcIl0gPSBmYWN0b3J5KHJvb3RbXCJSeFwiXSwgcm9vdFtcIlJ4XCJdW1wiT2JzZXJ2YWJsZVwiXSwgcm9vdFtcIlJ4XCJdW1wiT2JzZXJ2YWJsZVwiXVtcInByb3RvdHlwZVwiXSwgcm9vdFtcIlJ4XCJdLCByb290W1wiUnhcIl1bXCJPYnNlcnZhYmxlXCJdW1wicHJvdG90eXBlXCJdKTtcbn0pKHRoaXMsIGZ1bmN0aW9uKF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfNjJfXywgX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82M19fLCBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzY0X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMjc5X18sIF9fV0VCUEFDS19FWFRFUk5BTF9NT0RVTEVfMjgwX18pIHtcbnJldHVybiBcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiB3ZWJwYWNrL3VuaXZlcnNhbE1vZHVsZURlZmluaXRpb25cbiAqKi8iLCIgXHQvLyBUaGUgbW9kdWxlIGNhY2hlXG4gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuXG4gXHQvLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXG4gXHRcdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSlcbiBcdFx0XHRyZXR1cm4gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0uZXhwb3J0cztcblxuIFx0XHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuIFx0XHR2YXIgbW9kdWxlID0gaW5zdGFsbGVkTW9kdWxlc1ttb2R1bGVJZF0gPSB7XG4gXHRcdFx0ZXhwb3J0czoge30sXG4gXHRcdFx0aWQ6IG1vZHVsZUlkLFxuIFx0XHRcdGxvYWRlZDogZmFsc2VcbiBcdFx0fTtcblxuIFx0XHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cbiBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cbiBcdFx0Ly8gRmxhZyB0aGUgbW9kdWxlIGFzIGxvYWRlZFxuIFx0XHRtb2R1bGUubG9hZGVkID0gdHJ1ZTtcblxuIFx0XHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuIFx0XHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG4gXHR9XG5cblxuIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbiBcdF9fd2VicGFja19yZXF1aXJlX18ubSA9IG1vZHVsZXM7XG5cbiBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4gXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmMgPSBpbnN0YWxsZWRNb2R1bGVzO1xuXG4gXHQvLyBfX3dlYnBhY2tfcHVibGljX3BhdGhfX1xuIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcblxuIFx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG4gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIHdlYnBhY2svYm9vdHN0cmFwIDAwNWE1ZWUyNTAyYzUwNDE4MWI0XG4gKiovIiwiLy8gdGhpcyBidW5kbGUgaXMgYWxtb3N0IGlkZW50aWNhbCB0byB0aGUgYW5ndWxhcjIudW1kLmpzXG4vLyB0aGUgb25seSBkaWZmZXJlbmNlIGJlaW5nIFwidGVzdGluZ1wiIGV4cG9ydFxuZXhwb3J0cy5jb3JlID0gcmVxdWlyZSgnYW5ndWxhcjIvY29yZScpO1xuZXhwb3J0cy5jb21tb24gPSByZXF1aXJlKCdhbmd1bGFyMi9jb21tb24nKTtcbmV4cG9ydHMuY29tcGlsZXIgPSByZXF1aXJlKCdhbmd1bGFyMi9jb21waWxlcicpO1xuZXhwb3J0cy5wbGF0Zm9ybSA9IHtcbiAgYnJvd3NlcjogcmVxdWlyZSgnYW5ndWxhcjIvcGxhdGZvcm0vYnJvd3NlcicpLFxuICBjb21tb25fZG9tOiByZXF1aXJlKCdhbmd1bGFyMi9wbGF0Zm9ybS9jb21tb25fZG9tJylcbn07XG5leHBvcnRzLmh0dHAgPSByZXF1aXJlKCdhbmd1bGFyMi9odHRwJyk7XG5leHBvcnRzLnJvdXRlciA9IHJlcXVpcmUoJ2FuZ3VsYXIyL3JvdXRlcicpO1xuZXhwb3J0cy5yb3V0ZXJfbGlua19kc2wgPSByZXF1aXJlKCdhbmd1bGFyMi9yb3V0ZXIvcm91dGVyX2xpbmtfZHNsLmpzJyk7XG5leHBvcnRzLmluc3RydW1lbnRhdGlvbiA9IHJlcXVpcmUoJ2FuZ3VsYXIyL2luc3RydW1lbnRhdGlvbicpO1xuZXhwb3J0cy51cGdyYWRlID0gcmVxdWlyZSgnYW5ndWxhcjIvdXBncmFkZScpO1xuLy8gdGhpcyBpcyB0aGUgb25seSBkaWZmZXJlbmNlIGFzIGNvbXBhcmVkIHRvIHRoZSBhbmd1bGFyMi1hbGwudW1kLmpzIGJ1bmRsZVxuZXhwb3J0cy50ZXN0aW5nID0gcmVxdWlyZSgnYW5ndWxhcjIvdGVzdGluZycpO1xuZXhwb3J0cy5odHRwLnRlc3RpbmcgPSByZXF1aXJlKCdhbmd1bGFyMi9odHRwL3Rlc3RpbmcnKTtcbmV4cG9ydHMucm91dGVyLnRlc3RpbmcgPSByZXF1aXJlKCdhbmd1bGFyMi9yb3V0ZXIvdGVzdGluZycpO1xuXG5cblxuLyoqKioqKioqKioqKioqKioqXG4gKiogV0VCUEFDSyBGT09URVJcbiAqKiAuL3Rvb2xzL2J1aWxkL3dlYnBhY2svYW5ndWxhcjItYWxsLXRlc3RpbmcudW1kLmpzXG4gKiogbW9kdWxlIGlkID0gMVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiLyoqXG4gKiBAbW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN0YXJ0aW5nIHBvaW50IHRvIGltcG9ydCBhbGwgcHVibGljIGNvcmUgQVBJcy5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9tZXRhZGF0YSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9wcm9kX21vZGUnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9kaSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9mYWNhZGUvZmFjYWRlJztcbmV4cG9ydCB7ZW5hYmxlUHJvZE1vZGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5leHBvcnQge3BsYXRmb3JtLCBjcmVhdGVOZ1pvbmUsIFBsYXRmb3JtUmVmLCBBcHBsaWNhdGlvblJlZn0gZnJvbSAnLi9zcmMvY29yZS9hcHBsaWNhdGlvbl9yZWYnO1xuZXhwb3J0IHtcbiAgQVBQX0lELFxuICBBUFBfQ09NUE9ORU5ULFxuICBBUFBfSU5JVElBTElaRVIsXG4gIFBBQ0tBR0VfUk9PVF9VUkwsXG4gIFBMQVRGT1JNX0lOSVRJQUxJWkVSXG59IGZyb20gJy4vc3JjL2NvcmUvYXBwbGljYXRpb25fdG9rZW5zJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL2NvcmUvem9uZSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL3JlbmRlcic7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL2xpbmtlcic7XG5leHBvcnQge1xuICBEZWJ1Z0VsZW1lbnQsXG4gIFNjb3BlLFxuICBpbnNwZWN0RWxlbWVudCxcbiAgYXNOYXRpdmVFbGVtZW50c1xufSBmcm9tICcuL3NyYy9jb3JlL2RlYnVnL2RlYnVnX2VsZW1lbnQnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS90ZXN0YWJpbGl0eS90ZXN0YWJpbGl0eSc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24nO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9wbGF0Zm9ybV9kaXJlY3RpdmVzX2FuZF9waXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb3JlL3BsYXRmb3JtX2NvbW1vbl9wcm92aWRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29yZS9hcHBsaWNhdGlvbl9jb21tb25fcHJvdmlkZXJzJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL2NvcmUudHNcbiAqKi8iLCIvKipcbiAqIFRoaXMgaW5kaXJlY3Rpb24gaXMgbmVlZGVkIHRvIGZyZWUgdXAgQ29tcG9uZW50LCBldGMgc3ltYm9scyBpbiB0aGUgcHVibGljIEFQSVxuICogdG8gYmUgdXNlZCBieSB0aGUgZGVjb3JhdG9yIHZlcnNpb25zIG9mIHRoZXNlIGFubm90YXRpb25zLlxuICovXG5cbmV4cG9ydCB7XG4gIFF1ZXJ5TWV0YWRhdGEsXG4gIENvbnRlbnRDaGlsZHJlbk1ldGFkYXRhLFxuICBDb250ZW50Q2hpbGRNZXRhZGF0YSxcbiAgVmlld0NoaWxkcmVuTWV0YWRhdGEsXG4gIFZpZXdRdWVyeU1ldGFkYXRhLFxuICBWaWV3Q2hpbGRNZXRhZGF0YSxcbiAgQXR0cmlidXRlTWV0YWRhdGFcbn0gZnJvbSAnLi9tZXRhZGF0YS9kaSc7XG5cbmV4cG9ydCB7XG4gIENvbXBvbmVudE1ldGFkYXRhLFxuICBEaXJlY3RpdmVNZXRhZGF0YSxcbiAgUGlwZU1ldGFkYXRhLFxuICBJbnB1dE1ldGFkYXRhLFxuICBPdXRwdXRNZXRhZGF0YSxcbiAgSG9zdEJpbmRpbmdNZXRhZGF0YSxcbiAgSG9zdExpc3RlbmVyTWV0YWRhdGFcbn0gZnJvbSAnLi9tZXRhZGF0YS9kaXJlY3RpdmVzJztcblxuZXhwb3J0IHtWaWV3TWV0YWRhdGEsIFZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICcuL21ldGFkYXRhL3ZpZXcnO1xuXG5pbXBvcnQge1xuICBRdWVyeU1ldGFkYXRhLFxuICBDb250ZW50Q2hpbGRyZW5NZXRhZGF0YSxcbiAgQ29udGVudENoaWxkTWV0YWRhdGEsXG4gIFZpZXdDaGlsZHJlbk1ldGFkYXRhLFxuICBWaWV3Q2hpbGRNZXRhZGF0YSxcbiAgVmlld1F1ZXJ5TWV0YWRhdGEsXG4gIEF0dHJpYnV0ZU1ldGFkYXRhXG59IGZyb20gJy4vbWV0YWRhdGEvZGknO1xuXG5pbXBvcnQge1xuICBDb21wb25lbnRNZXRhZGF0YSxcbiAgRGlyZWN0aXZlTWV0YWRhdGEsXG4gIFBpcGVNZXRhZGF0YSxcbiAgSW5wdXRNZXRhZGF0YSxcbiAgT3V0cHV0TWV0YWRhdGEsXG4gIEhvc3RCaW5kaW5nTWV0YWRhdGEsXG4gIEhvc3RMaXN0ZW5lck1ldGFkYXRhXG59IGZyb20gJy4vbWV0YWRhdGEvZGlyZWN0aXZlcyc7XG5cbmltcG9ydCB7Vmlld01ldGFkYXRhLCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnLi9tZXRhZGF0YS92aWV3JztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbic7XG5cbmltcG9ydCB7XG4gIG1ha2VEZWNvcmF0b3IsXG4gIG1ha2VQYXJhbURlY29yYXRvcixcbiAgbWFrZVByb3BEZWNvcmF0b3IsXG4gIFR5cGVEZWNvcmF0b3IsXG4gIENsYXNzXG59IGZyb20gJy4vdXRpbC9kZWNvcmF0b3JzJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgRGlyZWN0aXZlTWV0YWRhdGF9IGRlY29yYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBTZWUge0BsaW5rIERpcmVjdGl2ZUZhY3Rvcnl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpcmVjdGl2ZURlY29yYXRvciBleHRlbmRzIFR5cGVEZWNvcmF0b3Ige31cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgQ29tcG9uZW50TWV0YWRhdGF9IGRlY29yYXRvciBmdW5jdGlvbi5cbiAqXG4gKiBTZWUge0BsaW5rIENvbXBvbmVudEZhY3Rvcnl9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbXBvbmVudERlY29yYXRvciBleHRlbmRzIFR5cGVEZWNvcmF0b3Ige1xuICAvKipcbiAgICogQ2hhaW4ge0BsaW5rIFZpZXdNZXRhZGF0YX0gYW5ub3RhdGlvbi5cbiAgICovXG4gIFZpZXcob2JqOiB7XG4gICAgdGVtcGxhdGVVcmw/OiBzdHJpbmcsXG4gICAgdGVtcGxhdGU/OiBzdHJpbmcsXG4gICAgZGlyZWN0aXZlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgcGlwZXM/OiBBcnJheTxUeXBlIHwgYW55W10+LFxuICAgIHJlbmRlcmVyPzogc3RyaW5nLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICB9KTogVmlld0RlY29yYXRvcjtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIHRoZSB7QGxpbmsgVmlld01ldGFkYXRhfSBkZWNvcmF0b3IgZnVuY3Rpb24uXG4gKlxuICogU2VlIHtAbGluayBWaWV3RmFjdG9yeX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVmlld0RlY29yYXRvciBleHRlbmRzIFR5cGVEZWNvcmF0b3Ige1xuICAvKipcbiAgICogQ2hhaW4ge0BsaW5rIFZpZXdNZXRhZGF0YX0gYW5ub3RhdGlvbi5cbiAgICovXG4gIFZpZXcob2JqOiB7XG4gICAgdGVtcGxhdGVVcmw/OiBzdHJpbmcsXG4gICAgdGVtcGxhdGU/OiBzdHJpbmcsXG4gICAgZGlyZWN0aXZlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgcGlwZXM/OiBBcnJheTxUeXBlIHwgYW55W10+LFxuICAgIHJlbmRlcmVyPzogc3RyaW5nLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICB9KTogVmlld0RlY29yYXRvcjtcbn1cblxuLyoqXG4gKiB7QGxpbmsgRGlyZWN0aXZlTWV0YWRhdGF9IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGFubm90YXRpb25zLCBkZWNvcmF0b3JzIG9yIERTTC5cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBUeXBlU2NyaXB0IERlY29yYXRvclxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL21ldGFkYXRhLnRzIHJlZ2lvbj0nZGlyZWN0aXZlJ31cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBFUzUgRFNMXG4gKlxuICogYGBgXG4gKiB2YXIgTXlEaXJlY3RpdmUgPSBuZ1xuICogICAuRGlyZWN0aXZlKHsuLi59KVxuICogICAuQ2xhc3Moe1xuICogICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHtcbiAqICAgICAgIC4uLlxuICogICAgIH1cbiAqICAgfSlcbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlIGFzIEVTNSBhbm5vdGF0aW9uXG4gKlxuICogYGBgXG4gKiB2YXIgTXlEaXJlY3RpdmUgPSBmdW5jdGlvbigpIHtcbiAqICAgLi4uXG4gKiB9O1xuICpcbiAqIE15RGlyZWN0aXZlLmFubm90YXRpb25zID0gW1xuICogICBuZXcgbmcuRGlyZWN0aXZlKHsuLi59KVxuICogXVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlyZWN0aXZlRmFjdG9yeSB7XG4gIChvYmo6IHtcbiAgICBzZWxlY3Rvcj86IHN0cmluZyxcbiAgICBpbnB1dHM/OiBzdHJpbmdbXSxcbiAgICBvdXRwdXRzPzogc3RyaW5nW10sXG4gICAgcHJvcGVydGllcz86IHN0cmluZ1tdLFxuICAgIGV2ZW50cz86IHN0cmluZ1tdLFxuICAgIGhvc3Q/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSxcbiAgICBiaW5kaW5ncz86IGFueVtdLFxuICAgIHByb3ZpZGVycz86IGFueVtdLFxuICAgIGV4cG9ydEFzPzogc3RyaW5nLFxuICAgIHF1ZXJpZXM/OiB7W2tleTogc3RyaW5nXTogYW55fVxuICB9KTogRGlyZWN0aXZlRGVjb3JhdG9yO1xuICBuZXcgKG9iajoge1xuICAgIHNlbGVjdG9yPzogc3RyaW5nLFxuICAgIGlucHV0cz86IHN0cmluZ1tdLFxuICAgIG91dHB1dHM/OiBzdHJpbmdbXSxcbiAgICBwcm9wZXJ0aWVzPzogc3RyaW5nW10sXG4gICAgZXZlbnRzPzogc3RyaW5nW10sXG4gICAgaG9zdD86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIGJpbmRpbmdzPzogYW55W10sXG4gICAgcHJvdmlkZXJzPzogYW55W10sXG4gICAgZXhwb3J0QXM/OiBzdHJpbmcsXG4gICAgcXVlcmllcz86IHtba2V5OiBzdHJpbmddOiBhbnl9XG4gIH0pOiBEaXJlY3RpdmVNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgQ29tcG9uZW50TWV0YWRhdGF9IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGFubm90YXRpb25zLCBkZWNvcmF0b3JzIG9yIERTTC5cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBUeXBlU2NyaXB0IERlY29yYXRvclxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL21ldGFkYXRhLnRzIHJlZ2lvbj0nY29tcG9uZW50J31cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBFUzUgRFNMXG4gKlxuICogYGBgXG4gKiB2YXIgTXlDb21wb25lbnQgPSBuZ1xuICogICAuQ29tcG9uZW50KHsuLi59KVxuICogICAuQ2xhc3Moe1xuICogICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHtcbiAqICAgICAgIC4uLlxuICogICAgIH1cbiAqICAgfSlcbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlIGFzIEVTNSBhbm5vdGF0aW9uXG4gKlxuICogYGBgXG4gKiB2YXIgTXlDb21wb25lbnQgPSBmdW5jdGlvbigpIHtcbiAqICAgLi4uXG4gKiB9O1xuICpcbiAqIE15Q29tcG9uZW50LmFubm90YXRpb25zID0gW1xuICogICBuZXcgbmcuQ29tcG9uZW50KHsuLi59KVxuICogXVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50RmFjdG9yeSB7XG4gIChvYmo6IHtcbiAgICBzZWxlY3Rvcj86IHN0cmluZyxcbiAgICBpbnB1dHM/OiBzdHJpbmdbXSxcbiAgICBvdXRwdXRzPzogc3RyaW5nW10sXG4gICAgcHJvcGVydGllcz86IHN0cmluZ1tdLFxuICAgIGV2ZW50cz86IHN0cmluZ1tdLFxuICAgIGhvc3Q/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSxcbiAgICAvKiBAZGVwcmVjYXRlZCAqL1xuICAgIGJpbmRpbmdzPzogYW55W10sXG4gICAgcHJvdmlkZXJzPzogYW55W10sXG4gICAgZXhwb3J0QXM/OiBzdHJpbmcsXG4gICAgbW9kdWxlSWQ/OiBzdHJpbmcsXG4gICAgcXVlcmllcz86IHtba2V5OiBzdHJpbmddOiBhbnl9LFxuICAgIHZpZXdCaW5kaW5ncz86IGFueVtdLFxuICAgIHZpZXdQcm92aWRlcnM/OiBhbnlbXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb24/OiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICB0ZW1wbGF0ZVVybD86IHN0cmluZyxcbiAgICB0ZW1wbGF0ZT86IHN0cmluZyxcbiAgICBzdHlsZVVybHM/OiBzdHJpbmdbXSxcbiAgICBzdHlsZXM/OiBzdHJpbmdbXSxcbiAgICBkaXJlY3RpdmVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBwaXBlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgZW5jYXBzdWxhdGlvbj86IFZpZXdFbmNhcHN1bGF0aW9uXG4gIH0pOiBDb21wb25lbnREZWNvcmF0b3I7XG4gIG5ldyAob2JqOiB7XG4gICAgc2VsZWN0b3I/OiBzdHJpbmcsXG4gICAgaW5wdXRzPzogc3RyaW5nW10sXG4gICAgb3V0cHV0cz86IHN0cmluZ1tdLFxuICAgIHByb3BlcnRpZXM/OiBzdHJpbmdbXSxcbiAgICBldmVudHM/OiBzdHJpbmdbXSxcbiAgICBob3N0Pzoge1trZXk6IHN0cmluZ106IHN0cmluZ30sXG4gICAgLyogQGRlcHJlY2F0ZWQgKi9cbiAgICBiaW5kaW5ncz86IGFueVtdLFxuICAgIHByb3ZpZGVycz86IGFueVtdLFxuICAgIGV4cG9ydEFzPzogc3RyaW5nLFxuICAgIG1vZHVsZUlkPzogc3RyaW5nLFxuICAgIHF1ZXJpZXM/OiB7W2tleTogc3RyaW5nXTogYW55fSxcbiAgICAvKiBAZGVwcmVjYXRlZCAqL1xuICAgIHZpZXdCaW5kaW5ncz86IGFueVtdLFxuICAgIHZpZXdQcm92aWRlcnM/OiBhbnlbXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb24/OiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICB0ZW1wbGF0ZVVybD86IHN0cmluZyxcbiAgICB0ZW1wbGF0ZT86IHN0cmluZyxcbiAgICBzdHlsZVVybHM/OiBzdHJpbmdbXSxcbiAgICBzdHlsZXM/OiBzdHJpbmdbXSxcbiAgICBkaXJlY3RpdmVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBwaXBlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgZW5jYXBzdWxhdGlvbj86IFZpZXdFbmNhcHN1bGF0aW9uXG4gIH0pOiBDb21wb25lbnRNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgVmlld01ldGFkYXRhfSBmYWN0b3J5IGZvciBjcmVhdGluZyBhbm5vdGF0aW9ucywgZGVjb3JhdG9ycyBvciBEU0wuXG4gKlxuICogIyMjIEV4YW1wbGUgYXMgVHlwZVNjcmlwdCBEZWNvcmF0b3JcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7Q29tcG9uZW50LCBWaWV3fSBmcm9tIFwiYW5ndWxhcjIvY29yZVwiO1xuICpcbiAqIEBDb21wb25lbnQoey4uLn0pXG4gKiBAVmlldyh7Li4ufSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgLi4uXG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlIGFzIEVTNSBEU0xcbiAqXG4gKiBgYGBcbiAqIHZhciBNeUNvbXBvbmVudCA9IG5nXG4gKiAgIC5Db21wb25lbnQoey4uLn0pXG4gKiAgIC5WaWV3KHsuLi59KVxuICogICAuQ2xhc3Moe1xuICogICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbigpIHtcbiAqICAgICAgIC4uLlxuICogICAgIH1cbiAqICAgfSlcbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlIGFzIEVTNSBhbm5vdGF0aW9uXG4gKlxuICogYGBgXG4gKiB2YXIgTXlDb21wb25lbnQgPSBmdW5jdGlvbigpIHtcbiAqICAgLi4uXG4gKiB9O1xuICpcbiAqIE15Q29tcG9uZW50LmFubm90YXRpb25zID0gW1xuICogICBuZXcgbmcuQ29tcG9uZW50KHsuLi59KSxcbiAqICAgbmV3IG5nLlZpZXcoey4uLn0pXG4gKiBdXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaWV3RmFjdG9yeSB7XG4gIChvYmo6IHtcbiAgICB0ZW1wbGF0ZVVybD86IHN0cmluZyxcbiAgICB0ZW1wbGF0ZT86IHN0cmluZyxcbiAgICBkaXJlY3RpdmVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBwaXBlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgZW5jYXBzdWxhdGlvbj86IFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICB9KTogVmlld0RlY29yYXRvcjtcbiAgbmV3IChvYmo6IHtcbiAgICB0ZW1wbGF0ZVVybD86IHN0cmluZyxcbiAgICB0ZW1wbGF0ZT86IHN0cmluZyxcbiAgICBkaXJlY3RpdmVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBwaXBlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgZW5jYXBzdWxhdGlvbj86IFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICB9KTogVmlld01ldGFkYXRhO1xufVxuXG4vKipcbiAqIHtAbGluayBBdHRyaWJ1dGVNZXRhZGF0YX0gZmFjdG9yeSBmb3IgY3JlYXRpbmcgYW5ub3RhdGlvbnMsIGRlY29yYXRvcnMgb3IgRFNMLlxuICpcbiAqICMjIyBFeGFtcGxlIGFzIFR5cGVTY3JpcHQgRGVjb3JhdG9yXG4gKlxuICoge0BleGFtcGxlIGNvcmUvdHMvbWV0YWRhdGEvbWV0YWRhdGEudHMgcmVnaW9uPSdhdHRyaWJ1dGVGYWN0b3J5J31cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBFUzUgRFNMXG4gKlxuICogYGBgXG4gKiB2YXIgTXlDb21wb25lbnQgPSBuZ1xuICogICAuQ29tcG9uZW50KHsuLi59KVxuICogICAuQ2xhc3Moe1xuICogICAgIGNvbnN0cnVjdG9yOiBbbmV3IG5nLkF0dHJpYnV0ZSgndGl0bGUnKSwgZnVuY3Rpb24odGl0bGUpIHtcbiAqICAgICAgIC4uLlxuICogICAgIH1dXG4gKiAgIH0pXG4gKiBgYGBcbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBFUzUgYW5ub3RhdGlvblxuICpcbiAqIGBgYFxuICogdmFyIE15Q29tcG9uZW50ID0gZnVuY3Rpb24odGl0bGUpIHtcbiAqICAgLi4uXG4gKiB9O1xuICpcbiAqIE15Q29tcG9uZW50LmFubm90YXRpb25zID0gW1xuICogICBuZXcgbmcuQ29tcG9uZW50KHsuLi59KVxuICogXVxuICogTXlDb21wb25lbnQucGFyYW1ldGVycyA9IFtcbiAqICAgW25ldyBuZy5BdHRyaWJ1dGUoJ3RpdGxlJyldXG4gKiBdXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBdHRyaWJ1dGVGYWN0b3J5IHtcbiAgKG5hbWU6IHN0cmluZyk6IFR5cGVEZWNvcmF0b3I7XG4gIG5ldyAobmFtZTogc3RyaW5nKTogQXR0cmlidXRlTWV0YWRhdGE7XG59XG5cbi8qKlxuICoge0BsaW5rIFF1ZXJ5TWV0YWRhdGF9IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGFubm90YXRpb25zLCBkZWNvcmF0b3JzIG9yIERTTC5cbiAqXG4gKiAjIyMgRXhhbXBsZSBhcyBUeXBlU2NyaXB0IERlY29yYXRvclxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtRdWVyeSwgUXVlcnlMaXN0LCBDb21wb25lbnR9IGZyb20gXCJhbmd1bGFyMi9jb3JlXCI7XG4gKlxuICogQENvbXBvbmVudCh7Li4ufSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IoQFF1ZXJ5KFNvbWVUeXBlKSBxdWVyeUxpc3Q6IFF1ZXJ5TGlzdDxTb21lVHlwZT4pIHtcbiAqICAgICAuLi5cbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogIyMjIEV4YW1wbGUgYXMgRVM1IERTTFxuICpcbiAqIGBgYFxuICogdmFyIE15Q29tcG9uZW50ID0gbmdcbiAqICAgLkNvbXBvbmVudCh7Li4ufSlcbiAqICAgLkNsYXNzKHtcbiAqICAgICBjb25zdHJ1Y3RvcjogW25ldyBuZy5RdWVyeShTb21lVHlwZSksIGZ1bmN0aW9uKHF1ZXJ5TGlzdCkge1xuICogICAgICAgLi4uXG4gKiAgICAgfV1cbiAqICAgfSlcbiAqIGBgYFxuICpcbiAqICMjIyBFeGFtcGxlIGFzIEVTNSBhbm5vdGF0aW9uXG4gKlxuICogYGBgXG4gKiB2YXIgTXlDb21wb25lbnQgPSBmdW5jdGlvbihxdWVyeUxpc3QpIHtcbiAqICAgLi4uXG4gKiB9O1xuICpcbiAqIE15Q29tcG9uZW50LmFubm90YXRpb25zID0gW1xuICogICBuZXcgbmcuQ29tcG9uZW50KHsuLi59KVxuICogXVxuICogTXlDb21wb25lbnQucGFyYW1ldGVycyA9IFtcbiAqICAgW25ldyBuZy5RdWVyeShTb21lVHlwZSldXG4gKiBdXG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBRdWVyeUZhY3Rvcnkge1xuICAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcsIHtkZXNjZW5kYW50c30/OiB7ZGVzY2VuZGFudHM/OiBib29sZWFufSk6IFBhcmFtZXRlckRlY29yYXRvcjtcbiAgbmV3IChzZWxlY3RvcjogVHlwZSB8IHN0cmluZywge2Rlc2NlbmRhbnRzfT86IHtkZXNjZW5kYW50cz86IGJvb2xlYW59KTogUXVlcnlNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciB7QGxpbmsgQ29udGVudENoaWxkcmVufS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb250ZW50Q2hpbGRyZW5GYWN0b3J5IHtcbiAgKHNlbGVjdG9yOiBUeXBlIHwgc3RyaW5nLCB7ZGVzY2VuZGFudHN9Pzoge2Rlc2NlbmRhbnRzPzogYm9vbGVhbn0pOiBhbnk7XG4gIG5ldyAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcsIHtkZXNjZW5kYW50c30/OiB7ZGVzY2VuZGFudHM/OiBib29sZWFufSk6IENvbnRlbnRDaGlsZHJlbk1ldGFkYXRhO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIHtAbGluayBDb250ZW50Q2hpbGR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRlbnRDaGlsZEZhY3Rvcnkge1xuICAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcpOiBhbnk7XG4gIG5ldyAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcpOiBDb250ZW50Q2hpbGRGYWN0b3J5O1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIHtAbGluayBWaWV3Q2hpbGRyZW59LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpZXdDaGlsZHJlbkZhY3Rvcnkge1xuICAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcpOiBhbnk7XG4gIG5ldyAoc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcpOiBWaWV3Q2hpbGRyZW5NZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciB7QGxpbmsgVmlld0NoaWxkfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaWV3Q2hpbGRGYWN0b3J5IHtcbiAgKHNlbGVjdG9yOiBUeXBlIHwgc3RyaW5nKTogYW55O1xuICBuZXcgKHNlbGVjdG9yOiBUeXBlIHwgc3RyaW5nKTogVmlld0NoaWxkRmFjdG9yeTtcbn1cblxuXG4vKipcbiAqIHtAbGluayBQaXBlTWV0YWRhdGF9IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGRlY29yYXRvcnMuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS90cy9tZXRhZGF0YS9tZXRhZGF0YS50cyByZWdpb249J3BpcGUnfVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFBpcGVGYWN0b3J5IHtcbiAgKG9iajoge25hbWU6IHN0cmluZywgcHVyZT86IGJvb2xlYW59KTogYW55O1xuICBuZXcgKG9iajoge25hbWU6IHN0cmluZywgcHVyZT86IGJvb2xlYW59KTogYW55O1xufVxuXG4vKipcbiAqIHtAbGluayBJbnB1dE1ldGFkYXRhfSBmYWN0b3J5IGZvciBjcmVhdGluZyBkZWNvcmF0b3JzLlxuICpcbiAqIFNlZSB7QGxpbmsgSW5wdXRNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5wdXRGYWN0b3J5IHtcbiAgKGJpbmRpbmdQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBhbnk7XG4gIG5ldyAoYmluZGluZ1Byb3BlcnR5TmFtZT86IHN0cmluZyk6IGFueTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgT3V0cHV0TWV0YWRhdGF9IGZhY3RvcnkgZm9yIGNyZWF0aW5nIGRlY29yYXRvcnMuXG4gKlxuICogU2VlIHtAbGluayBPdXRwdXRNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT3V0cHV0RmFjdG9yeSB7XG4gIChiaW5kaW5nUHJvcGVydHlOYW1lPzogc3RyaW5nKTogYW55O1xuICBuZXcgKGJpbmRpbmdQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBhbnk7XG59XG5cbi8qKlxuICoge0BsaW5rIEhvc3RCaW5kaW5nTWV0YWRhdGF9IGZhY3RvcnkgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdEJpbmRpbmdGYWN0b3J5IHtcbiAgKGhvc3RQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpOiBhbnk7XG4gIG5ldyAoaG9zdFByb3BlcnR5TmFtZT86IHN0cmluZyk6IGFueTtcbn1cblxuLyoqXG4gKiB7QGxpbmsgSG9zdExpc3RlbmVyTWV0YWRhdGF9IGZhY3RvcnkgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSG9zdExpc3RlbmVyRmFjdG9yeSB7XG4gIChldmVudE5hbWU6IHN0cmluZywgYXJncz86IHN0cmluZ1tdKTogYW55O1xuICBuZXcgKGV2ZW50TmFtZTogc3RyaW5nLCBhcmdzPzogc3RyaW5nW10pOiBhbnk7XG59XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gQ29tcG9uZW50TWV0YWRhdGEuXG4vKipcbiAqIERlY2xhcmUgcmV1c2FibGUgVUkgYnVpbGRpbmcgYmxvY2tzIGZvciBhbiBhcHBsaWNhdGlvbi5cbiAqXG4gKiBFYWNoIEFuZ3VsYXIgY29tcG9uZW50IHJlcXVpcmVzIGEgc2luZ2xlIGBAQ29tcG9uZW50YCBhbmQgYXQgbGVhc3Qgb25lIGBAVmlld2AgYW5ub3RhdGlvbi4gVGhlXG4gKiBgQENvbXBvbmVudGBcbiAqIGFubm90YXRpb24gc3BlY2lmaWVzIHdoZW4gYSBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkLCBhbmQgd2hpY2ggcHJvcGVydGllcyBhbmQgaG9zdExpc3RlbmVycyBpdFxuICogYmluZHMgdG8uXG4gKlxuICogV2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQsIEFuZ3VsYXJcbiAqIC0gY3JlYXRlcyBhIHNoYWRvdyBET00gZm9yIHRoZSBjb21wb25lbnQuXG4gKiAtIGxvYWRzIHRoZSBzZWxlY3RlZCB0ZW1wbGF0ZSBpbnRvIHRoZSBzaGFkb3cgRE9NLlxuICogLSBjcmVhdGVzIGFsbCB0aGUgaW5qZWN0YWJsZSBvYmplY3RzIGNvbmZpZ3VyZWQgd2l0aCBgcHJvdmlkZXJzYCBhbmQgYHZpZXdQcm92aWRlcnNgLlxuICpcbiAqIEFsbCB0ZW1wbGF0ZSBleHByZXNzaW9ucyBhbmQgc3RhdGVtZW50cyBhcmUgdGhlbiBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgY29tcG9uZW50IGluc3RhbmNlLlxuICpcbiAqIEZvciBkZXRhaWxzIG9uIHRoZSBgQFZpZXdgIGFubm90YXRpb24sIHNlZSB7QGxpbmsgVmlld01ldGFkYXRhfS5cbiAqXG4gKiAjIyBMaWZlY3ljbGUgaG9va3NcbiAqXG4gKiBXaGVuIHRoZSBjb21wb25lbnQgY2xhc3MgaW1wbGVtZW50cyBzb21lIHtAbGluayBhbmd1bGFyMi9saWZlY3ljbGVfaG9va3N9IHRoZSBjYWxsYmFja3MgYXJlXG4gKiBjYWxsZWQgYnkgdGhlIGNoYW5nZSBkZXRlY3Rpb24gYXQgZGVmaW5lZCBwb2ludHMgaW4gdGltZSBkdXJpbmcgdGhlIGxpZmUgb2YgdGhlIGNvbXBvbmVudC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL21ldGFkYXRhLnRzIHJlZ2lvbj0nY29tcG9uZW50J31cbiAqL1xuZXhwb3J0IHZhciBDb21wb25lbnQ6IENvbXBvbmVudEZhY3RvcnkgPVxuICAgIDxDb21wb25lbnRGYWN0b3J5Pm1ha2VEZWNvcmF0b3IoQ29tcG9uZW50TWV0YWRhdGEsIChmbjogYW55KSA9PiBmbi5WaWV3ID0gVmlldyk7XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gRGlyZWN0aXZlTWV0YWRhdGEuXG4vKipcbiAqIERpcmVjdGl2ZXMgYWxsb3cgeW91IHRvIGF0dGFjaCBiZWhhdmlvciB0byBlbGVtZW50cyBpbiB0aGUgRE9NLlxuICpcbiAqIHtAbGluayBEaXJlY3RpdmVNZXRhZGF0YX1zIHdpdGggYW4gZW1iZWRkZWQgdmlldyBhcmUgY2FsbGVkIHtAbGluayBDb21wb25lbnRNZXRhZGF0YX1zLlxuICpcbiAqIEEgZGlyZWN0aXZlIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGRpcmVjdGl2ZSBhbm5vdGF0aW9uIGFuZCBhIGNvbnRyb2xsZXIgY2xhc3MuIFdoZW4gdGhlXG4gKiBkaXJlY3RpdmUncyBgc2VsZWN0b3JgIG1hdGNoZXNcbiAqIGVsZW1lbnRzIGluIHRoZSBET00sIHRoZSBmb2xsb3dpbmcgc3RlcHMgb2NjdXI6XG4gKlxuICogMS4gRm9yIGVhY2ggZGlyZWN0aXZlLCB0aGUgYEVsZW1lbnRJbmplY3RvcmAgYXR0ZW1wdHMgdG8gcmVzb2x2ZSB0aGUgZGlyZWN0aXZlJ3MgY29uc3RydWN0b3JcbiAqIGFyZ3VtZW50cy5cbiAqIDIuIEFuZ3VsYXIgaW5zdGFudGlhdGVzIGRpcmVjdGl2ZXMgZm9yIGVhY2ggbWF0Y2hlZCBlbGVtZW50IHVzaW5nIGBFbGVtZW50SW5qZWN0b3JgIGluIGFcbiAqIGRlcHRoLWZpcnN0IG9yZGVyLFxuICogICAgYXMgZGVjbGFyZWQgaW4gdGhlIEhUTUwuXG4gKlxuICogIyMgVW5kZXJzdGFuZGluZyBIb3cgSW5qZWN0aW9uIFdvcmtzXG4gKlxuICogVGhlcmUgYXJlIHRocmVlIHN0YWdlcyBvZiBpbmplY3Rpb24gcmVzb2x1dGlvbi5cbiAqIC0gKlByZS1leGlzdGluZyBJbmplY3RvcnMqOlxuICogICAtIFRoZSB0ZXJtaW5hbCB7QGxpbmsgSW5qZWN0b3J9IGNhbm5vdCByZXNvbHZlIGRlcGVuZGVuY2llcy4gSXQgZWl0aGVyIHRocm93cyBhbiBlcnJvciBvciwgaWZcbiAqIHRoZSBkZXBlbmRlbmN5IHdhc1xuICogICAgIHNwZWNpZmllZCBhcyBgQE9wdGlvbmFsYCwgcmV0dXJucyBgbnVsbGAuXG4gKiAgIC0gVGhlIHBsYXRmb3JtIGluamVjdG9yIHJlc29sdmVzIGJyb3dzZXIgc2luZ2xldG9uIHJlc291cmNlcywgc3VjaCBhczogY29va2llcywgdGl0bGUsXG4gKiBsb2NhdGlvbiwgYW5kIG90aGVycy5cbiAqIC0gKkNvbXBvbmVudCBJbmplY3RvcnMqOiBFYWNoIGNvbXBvbmVudCBpbnN0YW5jZSBoYXMgaXRzIG93biB7QGxpbmsgSW5qZWN0b3J9LCBhbmQgdGhleSBmb2xsb3dcbiAqIHRoZSBzYW1lIHBhcmVudC1jaGlsZCBoaWVyYXJjaHlcbiAqICAgICBhcyB0aGUgY29tcG9uZW50IGluc3RhbmNlcyBpbiB0aGUgRE9NLlxuICogLSAqRWxlbWVudCBJbmplY3RvcnMqOiBFYWNoIGNvbXBvbmVudCBpbnN0YW5jZSBoYXMgYSBTaGFkb3cgRE9NLiBXaXRoaW4gdGhlIFNoYWRvdyBET00gZWFjaFxuICogZWxlbWVudCBoYXMgYW4gYEVsZW1lbnRJbmplY3RvcmBcbiAqICAgICB3aGljaCBmb2xsb3cgdGhlIHNhbWUgcGFyZW50LWNoaWxkIGhpZXJhcmNoeSBhcyB0aGUgRE9NIGVsZW1lbnRzIHRoZW1zZWx2ZXMuXG4gKlxuICogV2hlbiBhIHRlbXBsYXRlIGlzIGluc3RhbnRpYXRlZCwgaXQgYWxzbyBtdXN0IGluc3RhbnRpYXRlIHRoZSBjb3JyZXNwb25kaW5nIGRpcmVjdGl2ZXMgaW4gYVxuICogZGVwdGgtZmlyc3Qgb3JkZXIuIFRoZVxuICogY3VycmVudCBgRWxlbWVudEluamVjdG9yYCByZXNvbHZlcyB0aGUgY29uc3RydWN0b3IgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGRpcmVjdGl2ZS5cbiAqXG4gKiBBbmd1bGFyIHRoZW4gcmVzb2x2ZXMgZGVwZW5kZW5jaWVzIGFzIGZvbGxvd3MsIGFjY29yZGluZyB0byB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBhcHBlYXIgaW4gdGhlXG4gKiB7QGxpbmsgVmlld01ldGFkYXRhfTpcbiAqXG4gKiAxLiBEZXBlbmRlbmNpZXMgb24gdGhlIGN1cnJlbnQgZWxlbWVudFxuICogMi4gRGVwZW5kZW5jaWVzIG9uIGVsZW1lbnQgaW5qZWN0b3JzIGFuZCB0aGVpciBwYXJlbnRzIHVudGlsIGl0IGVuY291bnRlcnMgYSBTaGFkb3cgRE9NIGJvdW5kYXJ5XG4gKiAzLiBEZXBlbmRlbmNpZXMgb24gY29tcG9uZW50IGluamVjdG9ycyBhbmQgdGhlaXIgcGFyZW50cyB1bnRpbCBpdCBlbmNvdW50ZXJzIHRoZSByb290IGNvbXBvbmVudFxuICogNC4gRGVwZW5kZW5jaWVzIG9uIHByZS1leGlzdGluZyBpbmplY3RvcnNcbiAqXG4gKlxuICogVGhlIGBFbGVtZW50SW5qZWN0b3JgIGNhbiBpbmplY3Qgb3RoZXIgZGlyZWN0aXZlcywgZWxlbWVudC1zcGVjaWZpYyBzcGVjaWFsIG9iamVjdHMsIG9yIGl0IGNhblxuICogZGVsZWdhdGUgdG8gdGhlIHBhcmVudFxuICogaW5qZWN0b3IuXG4gKlxuICogVG8gaW5qZWN0IG90aGVyIGRpcmVjdGl2ZXMsIGRlY2xhcmUgdGhlIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBhczpcbiAqIC0gYGRpcmVjdGl2ZTpEaXJlY3RpdmVUeXBlYDogYSBkaXJlY3RpdmUgb24gdGhlIGN1cnJlbnQgZWxlbWVudCBvbmx5XG4gKiAtIGBASG9zdCgpIGRpcmVjdGl2ZTpEaXJlY3RpdmVUeXBlYDogYW55IGRpcmVjdGl2ZSB0aGF0IG1hdGNoZXMgdGhlIHR5cGUgYmV0d2VlbiB0aGUgY3VycmVudFxuICogZWxlbWVudCBhbmQgdGhlXG4gKiAgICBTaGFkb3cgRE9NIHJvb3QuXG4gKiAtIGBAUXVlcnkoRGlyZWN0aXZlVHlwZSkgcXVlcnk6UXVlcnlMaXN0PERpcmVjdGl2ZVR5cGU+YDogQSBsaXZlIGNvbGxlY3Rpb24gb2YgZGlyZWN0IGNoaWxkXG4gKiBkaXJlY3RpdmVzLlxuICogLSBgQFF1ZXJ5RGVzY2VuZGFudHMoRGlyZWN0aXZlVHlwZSkgcXVlcnk6UXVlcnlMaXN0PERpcmVjdGl2ZVR5cGU+YDogQSBsaXZlIGNvbGxlY3Rpb24gb2YgYW55XG4gKiBjaGlsZCBkaXJlY3RpdmVzLlxuICpcbiAqIFRvIGluamVjdCBlbGVtZW50LXNwZWNpZmljIHNwZWNpYWwgb2JqZWN0cywgZGVjbGFyZSB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIGFzOlxuICogLSBgZWxlbWVudDogRWxlbWVudFJlZmAgdG8gb2J0YWluIGEgcmVmZXJlbmNlIHRvIGxvZ2ljYWwgZWxlbWVudCBpbiB0aGUgdmlldy5cbiAqIC0gYHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWZgIHRvIGNvbnRyb2wgY2hpbGQgdGVtcGxhdGUgaW5zdGFudGlhdGlvbiwgZm9yXG4gKiB7QGxpbmsgRGlyZWN0aXZlTWV0YWRhdGF9IGRpcmVjdGl2ZXMgb25seVxuICogLSBgYmluZGluZ1Byb3BhZ2F0aW9uOiBCaW5kaW5nUHJvcGFnYXRpb25gIHRvIGNvbnRyb2wgY2hhbmdlIGRldGVjdGlvbiBpbiBhIG1vcmUgZ3JhbnVsYXIgd2F5LlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlbW9uc3RyYXRlcyBob3cgZGVwZW5kZW5jeSBpbmplY3Rpb24gcmVzb2x2ZXMgY29uc3RydWN0b3IgYXJndW1lbnRzIGluXG4gKiBwcmFjdGljZS5cbiAqXG4gKlxuICogQXNzdW1lIHRoaXMgSFRNTCB0ZW1wbGF0ZTpcbiAqXG4gKiBgYGBcbiAqIDxkaXYgZGVwZW5kZW5jeT1cIjFcIj5cbiAqICAgPGRpdiBkZXBlbmRlbmN5PVwiMlwiPlxuICogICAgIDxkaXYgZGVwZW5kZW5jeT1cIjNcIiBteS1kaXJlY3RpdmU+XG4gKiAgICAgICA8ZGl2IGRlcGVuZGVuY3k9XCI0XCI+XG4gKiAgICAgICAgIDxkaXYgZGVwZW5kZW5jeT1cIjVcIj48L2Rpdj5cbiAqICAgICAgIDwvZGl2PlxuICogICAgICAgPGRpdiBkZXBlbmRlbmN5PVwiNlwiPjwvZGl2PlxuICogICAgIDwvZGl2PlxuICogICA8L2Rpdj5cbiAqIDwvZGl2PlxuICogYGBgXG4gKlxuICogV2l0aCB0aGUgZm9sbG93aW5nIGBkZXBlbmRlbmN5YCBkZWNvcmF0b3IgYW5kIGBTb21lU2VydmljZWAgaW5qZWN0YWJsZSBjbGFzcy5cbiAqXG4gKiBgYGBcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIFNvbWVTZXJ2aWNlIHtcbiAqIH1cbiAqXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdbZGVwZW5kZW5jeV0nLFxuICogICBpbnB1dHM6IFtcbiAqICAgICAnaWQ6IGRlcGVuZGVuY3knXG4gKiAgIF1cbiAqIH0pXG4gKiBjbGFzcyBEZXBlbmRlbmN5IHtcbiAqICAgaWQ6c3RyaW5nO1xuICogfVxuICogYGBgXG4gKlxuICogTGV0J3Mgc3RlcCB0aHJvdWdoIHRoZSBkaWZmZXJlbnQgd2F5cyBpbiB3aGljaCBgTXlEaXJlY3RpdmVgIGNvdWxkIGJlIGRlY2xhcmVkLi4uXG4gKlxuICpcbiAqICMjIyBObyBpbmplY3Rpb25cbiAqXG4gKiBIZXJlIHRoZSBjb25zdHJ1Y3RvciBpcyBkZWNsYXJlZCB3aXRoIG5vIGFyZ3VtZW50cywgdGhlcmVmb3JlIG5vdGhpbmcgaXMgaW5qZWN0ZWQgaW50b1xuICogYE15RGlyZWN0aXZlYC5cbiAqXG4gKiBgYGBcbiAqIEBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tteS1kaXJlY3RpdmVdJyB9KVxuICogY2xhc3MgTXlEaXJlY3RpdmUge1xuICogICBjb25zdHJ1Y3RvcigpIHtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgd291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggbm8gZGVwZW5kZW5jaWVzLlxuICpcbiAqXG4gKiAjIyMgQ29tcG9uZW50LWxldmVsIGluamVjdGlvblxuICpcbiAqIERpcmVjdGl2ZXMgY2FuIGluamVjdCBhbnkgaW5qZWN0YWJsZSBpbnN0YW5jZSBmcm9tIHRoZSBjbG9zZXN0IGNvbXBvbmVudCBpbmplY3RvciBvciBhbnkgb2YgaXRzXG4gKiBwYXJlbnRzLlxuICpcbiAqIEhlcmUsIHRoZSBjb25zdHJ1Y3RvciBkZWNsYXJlcyBhIHBhcmFtZXRlciwgYHNvbWVTZXJ2aWNlYCwgYW5kIGluamVjdHMgdGhlIGBTb21lU2VydmljZWAgdHlwZVxuICogZnJvbSB0aGUgcGFyZW50XG4gKiBjb21wb25lbnQncyBpbmplY3Rvci5cbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW215LWRpcmVjdGl2ZV0nIH0pXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIGNvbnN0cnVjdG9yKHNvbWVTZXJ2aWNlOiBTb21lU2VydmljZSkge1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSB3b3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRlcGVuZGVuY3kgb24gYFNvbWVTZXJ2aWNlYC5cbiAqXG4gKlxuICogIyMjIEluamVjdGluZyBhIGRpcmVjdGl2ZSBmcm9tIHRoZSBjdXJyZW50IGVsZW1lbnRcbiAqXG4gKiBEaXJlY3RpdmVzIGNhbiBpbmplY3Qgb3RoZXIgZGlyZWN0aXZlcyBkZWNsYXJlZCBvbiB0aGUgY3VycmVudCBlbGVtZW50LlxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW215LWRpcmVjdGl2ZV0nIH0pXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIGNvbnN0cnVjdG9yKGRlcGVuZGVuY3k6IERlcGVuZGVuY3kpIHtcbiAqICAgICBleHBlY3QoZGVwZW5kZW5jeS5pZCkudG9FcXVhbCgzKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKiBUaGlzIGRpcmVjdGl2ZSB3b3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBgRGVwZW5kZW5jeWAgZGVjbGFyZWQgYXQgdGhlIHNhbWUgZWxlbWVudCwgaW4gdGhpcyBjYXNlXG4gKiBgZGVwZW5kZW5jeT1cIjNcImAuXG4gKlxuICogIyMjIEluamVjdGluZyBhIGRpcmVjdGl2ZSBmcm9tIGFueSBhbmNlc3RvciBlbGVtZW50c1xuICpcbiAqIERpcmVjdGl2ZXMgY2FuIGluamVjdCBvdGhlciBkaXJlY3RpdmVzIGRlY2xhcmVkIG9uIGFueSBhbmNlc3RvciBlbGVtZW50IChpbiB0aGUgY3VycmVudCBTaGFkb3dcbiAqIERPTSksIGkuZS4gb24gdGhlIGN1cnJlbnQgZWxlbWVudCwgdGhlXG4gKiBwYXJlbnQgZWxlbWVudCwgb3IgaXRzIHBhcmVudHMuXG4gKiBgYGBcbiAqIEBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tteS1kaXJlY3RpdmVdJyB9KVxuICogY2xhc3MgTXlEaXJlY3RpdmUge1xuICogICBjb25zdHJ1Y3RvcihASG9zdCgpIGRlcGVuZGVuY3k6IERlcGVuZGVuY3kpIHtcbiAqICAgICBleHBlY3QoZGVwZW5kZW5jeS5pZCkudG9FcXVhbCgyKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogYEBIb3N0YCBjaGVja3MgdGhlIGN1cnJlbnQgZWxlbWVudCwgdGhlIHBhcmVudCwgYXMgd2VsbCBhcyBpdHMgcGFyZW50cyByZWN1cnNpdmVseS4gSWZcbiAqIGBkZXBlbmRlbmN5PVwiMlwiYCBkaWRuJ3RcbiAqIGV4aXN0IG9uIHRoZSBkaXJlY3QgcGFyZW50LCB0aGlzIGluamVjdGlvbiB3b3VsZFxuICogaGF2ZSByZXR1cm5lZFxuICogYGRlcGVuZGVuY3k9XCIxXCJgLlxuICpcbiAqXG4gKiAjIyMgSW5qZWN0aW5nIGEgbGl2ZSBjb2xsZWN0aW9uIG9mIGRpcmVjdCBjaGlsZCBkaXJlY3RpdmVzXG4gKlxuICpcbiAqIEEgZGlyZWN0aXZlIGNhbiBhbHNvIHF1ZXJ5IGZvciBvdGhlciBjaGlsZCBkaXJlY3RpdmVzLiBTaW5jZSBwYXJlbnQgZGlyZWN0aXZlcyBhcmUgaW5zdGFudGlhdGVkXG4gKiBiZWZvcmUgY2hpbGQgZGlyZWN0aXZlcywgYSBkaXJlY3RpdmUgY2FuJ3Qgc2ltcGx5IGluamVjdCB0aGUgbGlzdCBvZiBjaGlsZCBkaXJlY3RpdmVzLiBJbnN0ZWFkLFxuICogdGhlIGRpcmVjdGl2ZSBpbmplY3RzIGEge0BsaW5rIFF1ZXJ5TGlzdH0sIHdoaWNoIHVwZGF0ZXMgaXRzIGNvbnRlbnRzIGFzIGNoaWxkcmVuIGFyZSBhZGRlZCxcbiAqIHJlbW92ZWQsIG9yIG1vdmVkIGJ5IGEgZGlyZWN0aXZlIHRoYXQgdXNlcyBhIHtAbGluayBWaWV3Q29udGFpbmVyUmVmfSBzdWNoIGFzIGEgYG5nRm9yYCwgYW5cbiAqIGBuZ0lmYCwgb3IgYW4gYG5nU3dpdGNoYC5cbiAqXG4gKiBgYGBcbiAqIEBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tteS1kaXJlY3RpdmVdJyB9KVxuICogY2xhc3MgTXlEaXJlY3RpdmUge1xuICogICBjb25zdHJ1Y3RvcihAUXVlcnkoRGVwZW5kZW5jeSkgZGVwZW5kZW5jaWVzOlF1ZXJ5TGlzdDxEZXBlbmRlbmN5Pikge1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSB3b3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIHtAbGluayBRdWVyeUxpc3R9IHdoaWNoIGNvbnRhaW5zIGBEZXBlbmRlbmN5YCA0IGFuZFxuICogNi4gSGVyZSwgYERlcGVuZGVuY3lgIDUgd291bGQgbm90IGJlIGluY2x1ZGVkLCBiZWNhdXNlIGl0IGlzIG5vdCBhIGRpcmVjdCBjaGlsZC5cbiAqXG4gKiAjIyMgSW5qZWN0aW5nIGEgbGl2ZSBjb2xsZWN0aW9uIG9mIGRlc2NlbmRhbnQgZGlyZWN0aXZlc1xuICpcbiAqIEJ5IHBhc3NpbmcgdGhlIGRlc2NlbmRhbnQgZmxhZyB0byBgQFF1ZXJ5YCBhYm92ZSwgd2UgY2FuIGluY2x1ZGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBjaGlsZFxuICogZWxlbWVudHMuXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbXktZGlyZWN0aXZlXScgfSlcbiAqIGNsYXNzIE15RGlyZWN0aXZlIHtcbiAqICAgY29uc3RydWN0b3IoQFF1ZXJ5KERlcGVuZGVuY3ksIHtkZXNjZW5kYW50czogdHJ1ZX0pIGRlcGVuZGVuY2llczpRdWVyeUxpc3Q8RGVwZW5kZW5jeT4pIHtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgd291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBRdWVyeSB3aGljaCB3b3VsZCBjb250YWluIGBEZXBlbmRlbmN5YCA0LCA1IGFuZCA2LlxuICpcbiAqICMjIyBPcHRpb25hbCBpbmplY3Rpb25cbiAqXG4gKiBUaGUgbm9ybWFsIGJlaGF2aW9yIG9mIGRpcmVjdGl2ZXMgaXMgdG8gcmV0dXJuIGFuIGVycm9yIHdoZW4gYSBzcGVjaWZpZWQgZGVwZW5kZW5jeSBjYW5ub3QgYmVcbiAqIHJlc29sdmVkLiBJZiB5b3VcbiAqIHdvdWxkIGxpa2UgdG8gaW5qZWN0IGBudWxsYCBvbiB1bnJlc29sdmVkIGRlcGVuZGVuY3kgaW5zdGVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGF0IGRlcGVuZGVuY3lcbiAqIHdpdGggYEBPcHRpb25hbCgpYC5cbiAqIFRoaXMgZXhwbGljaXRseSBwZXJtaXRzIHRoZSBhdXRob3Igb2YgYSB0ZW1wbGF0ZSB0byB0cmVhdCBzb21lIG9mIHRoZSBzdXJyb3VuZGluZyBkaXJlY3RpdmVzIGFzXG4gKiBvcHRpb25hbC5cbiAqXG4gKiBgYGBcbiAqIEBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tteS1kaXJlY3RpdmVdJyB9KVxuICogY2xhc3MgTXlEaXJlY3RpdmUge1xuICogICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBkZXBlbmRlbmN5OkRlcGVuZGVuY3kpIHtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgd291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBgRGVwZW5kZW5jeWAgZGlyZWN0aXZlIGZvdW5kIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gKiBJZiBub25lIGNhbiBiZVxuICogZm91bmQsIHRoZSBpbmplY3RvciBzdXBwbGllcyBgbnVsbGAgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvci5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIEhlcmUgd2UgdXNlIGEgZGVjb3JhdG9yIGRpcmVjdGl2ZSB0byBzaW1wbHkgZGVmaW5lIGJhc2ljIHRvb2wtdGlwIGJlaGF2aW9yLlxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7XG4gKiAgIHNlbGVjdG9yOiAnW3Rvb2x0aXBdJyxcbiAqICAgaW5wdXRzOiBbXG4gKiAgICAgJ3RleHQ6IHRvb2x0aXAnXG4gKiAgIF0sXG4gKiAgIGhvc3Q6IHtcbiAqICAgICAnKG1vdXNlZW50ZXIpJzogJ29uTW91c2VFbnRlcigpJyxcbiAqICAgICAnKG1vdXNlbGVhdmUpJzogJ29uTW91c2VMZWF2ZSgpJ1xuICogICB9XG4gKiB9KVxuICogY2xhc3MgVG9vbHRpcHtcbiAqICAgdGV4dDpzdHJpbmc7XG4gKiAgIG92ZXJsYXk6T3ZlcmxheTsgLy8gTk9UIFlFVCBJTVBMRU1FTlRFRFxuICogICBvdmVybGF5TWFuYWdlcjpPdmVybGF5TWFuYWdlcjsgLy8gTk9UIFlFVCBJTVBMRU1FTlRFRFxuICpcbiAqICAgY29uc3RydWN0b3Iob3ZlcmxheU1hbmFnZXI6T3ZlcmxheU1hbmFnZXIpIHtcbiAqICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICogICB9XG4gKlxuICogICBvbk1vdXNlRW50ZXIoKSB7XG4gKiAgICAgLy8gZXhhY3Qgc2lnbmF0dXJlIHRvIGJlIGRldGVybWluZWRcbiAqICAgICB0aGlzLm92ZXJsYXkgPSB0aGlzLm92ZXJsYXlNYW5hZ2VyLm9wZW4odGV4dCwgLi4uKTtcbiAqICAgfVxuICpcbiAqICAgb25Nb3VzZUxlYXZlKCkge1xuICogICAgIHRoaXMub3ZlcmxheS5jbG9zZSgpO1xuICogICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogSW4gb3VyIEhUTUwgdGVtcGxhdGUsIHdlIGNhbiB0aGVuIGFkZCB0aGlzIGJlaGF2aW9yIHRvIGEgYDxkaXY+YCBvciBhbnkgb3RoZXIgZWxlbWVudCB3aXRoIHRoZVxuICogYHRvb2x0aXBgIHNlbGVjdG9yLFxuICogbGlrZSBzbzpcbiAqXG4gKiBgYGBcbiAqIDxkaXYgdG9vbHRpcD1cInNvbWUgdGV4dCBoZXJlXCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBEaXJlY3RpdmVzIGNhbiBhbHNvIGNvbnRyb2wgdGhlIGluc3RhbnRpYXRpb24sIGRlc3RydWN0aW9uLCBhbmQgcG9zaXRpb25pbmcgb2YgaW5saW5lIHRlbXBsYXRlXG4gKiBlbGVtZW50czpcbiAqXG4gKiBBIGRpcmVjdGl2ZSB1c2VzIGEge0BsaW5rIFZpZXdDb250YWluZXJSZWZ9IHRvIGluc3RhbnRpYXRlLCBpbnNlcnQsIG1vdmUsIGFuZCBkZXN0cm95IHZpZXdzIGF0XG4gKiBydW50aW1lLlxuICogVGhlIHtAbGluayBWaWV3Q29udGFpbmVyUmVmfSBpcyBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIGA8dGVtcGxhdGU+YCBlbGVtZW50LCBhbmQgcmVwcmVzZW50cyBhXG4gKiBsb2NhdGlvbiBpbiB0aGUgY3VycmVudCB2aWV3XG4gKiB3aGVyZSB0aGVzZSBhY3Rpb25zIGFyZSBwZXJmb3JtZWQuXG4gKlxuICogVmlld3MgYXJlIGFsd2F5cyBjcmVhdGVkIGFzIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IHtAbGluayBWaWV3TWV0YWRhdGF9LCBhbmQgYXMgc2libGluZ3Mgb2YgdGhlXG4gKiBgPHRlbXBsYXRlPmAgZWxlbWVudC4gVGh1cyBhXG4gKiBkaXJlY3RpdmUgaW4gYSBjaGlsZCB2aWV3IGNhbm5vdCBpbmplY3QgdGhlIGRpcmVjdGl2ZSB0aGF0IGNyZWF0ZWQgaXQuXG4gKlxuICogU2luY2UgZGlyZWN0aXZlcyB0aGF0IGNyZWF0ZSB2aWV3cyB2aWEgVmlld0NvbnRhaW5lcnMgYXJlIGNvbW1vbiBpbiBBbmd1bGFyLCBhbmQgdXNpbmcgdGhlIGZ1bGxcbiAqIGA8dGVtcGxhdGU+YCBlbGVtZW50IHN5bnRheCBpcyB3b3JkeSwgQW5ndWxhclxuICogYWxzbyBzdXBwb3J0cyBhIHNob3J0aGFuZCBub3RhdGlvbjogYDxsaSAqZm9vPVwiYmFyXCI+YCBhbmQgYDxsaSB0ZW1wbGF0ZT1cImZvbzogYmFyXCI+YCBhcmVcbiAqIGVxdWl2YWxlbnQuXG4gKlxuICogVGh1cyxcbiAqXG4gKiBgYGBcbiAqIDx1bD5cbiAqICAgPGxpICpmb289XCJiYXJcIiB0aXRsZT1cInRleHRcIj48L2xpPlxuICogPC91bD5cbiAqIGBgYFxuICpcbiAqIEV4cGFuZHMgaW4gdXNlIHRvOlxuICpcbiAqIGBgYFxuICogPHVsPlxuICogICA8dGVtcGxhdGUgW2Zvb109XCJiYXJcIj5cbiAqICAgICA8bGkgdGl0bGU9XCJ0ZXh0XCI+PC9saT5cbiAqICAgPC90ZW1wbGF0ZT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBOb3RpY2UgdGhhdCBhbHRob3VnaCB0aGUgc2hvcnRoYW5kIHBsYWNlcyBgKmZvbz1cImJhclwiYCB3aXRoaW4gdGhlIGA8bGk+YCBlbGVtZW50LCB0aGUgYmluZGluZyBmb3JcbiAqIHRoZSBkaXJlY3RpdmVcbiAqIGNvbnRyb2xsZXIgaXMgY29ycmVjdGx5IGluc3RhbnRpYXRlZCBvbiB0aGUgYDx0ZW1wbGF0ZT5gIGVsZW1lbnQgcmF0aGVyIHRoYW4gdGhlIGA8bGk+YCBlbGVtZW50LlxuICpcbiAqICMjIExpZmVjeWNsZSBob29rc1xuICpcbiAqIFdoZW4gdGhlIGRpcmVjdGl2ZSBjbGFzcyBpbXBsZW1lbnRzIHNvbWUge0BsaW5rIGFuZ3VsYXIyL2xpZmVjeWNsZV9ob29rc30gdGhlIGNhbGxiYWNrcyBhcmVcbiAqIGNhbGxlZCBieSB0aGUgY2hhbmdlIGRldGVjdGlvbiBhdCBkZWZpbmVkIHBvaW50cyBpbiB0aW1lIGR1cmluZyB0aGUgbGlmZSBvZiB0aGUgZGlyZWN0aXZlLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogTGV0J3Mgc3VwcG9zZSB3ZSB3YW50IHRvIGltcGxlbWVudCB0aGUgYHVubGVzc2AgYmVoYXZpb3IsIHRvIGNvbmRpdGlvbmFsbHkgaW5jbHVkZSBhIHRlbXBsYXRlLlxuICpcbiAqIEhlcmUgaXMgYSBzaW1wbGUgZGlyZWN0aXZlIHRoYXQgdHJpZ2dlcnMgb24gYW4gYHVubGVzc2Agc2VsZWN0b3I6XG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdbdW5sZXNzXScsXG4gKiAgIGlucHV0czogWyd1bmxlc3MnXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBVbmxlc3Mge1xuICogICB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuICogICB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY7XG4gKiAgIHByZXZDb25kaXRpb246IGJvb2xlYW47XG4gKlxuICogICBjb25zdHJ1Y3Rvcih2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLCB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWYpIHtcbiAqICAgICB0aGlzLnZpZXdDb250YWluZXIgPSB2aWV3Q29udGFpbmVyO1xuICogICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAqICAgICB0aGlzLnByZXZDb25kaXRpb24gPSBudWxsO1xuICogICB9XG4gKlxuICogICBzZXQgdW5sZXNzKG5ld0NvbmRpdGlvbikge1xuICogICAgIGlmIChuZXdDb25kaXRpb24gJiYgKGlzQmxhbmsodGhpcy5wcmV2Q29uZGl0aW9uKSB8fCAhdGhpcy5wcmV2Q29uZGl0aW9uKSkge1xuICogICAgICAgdGhpcy5wcmV2Q29uZGl0aW9uID0gdHJ1ZTtcbiAqICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xuICogICAgIH0gZWxzZSBpZiAoIW5ld0NvbmRpdGlvbiAmJiAoaXNCbGFuayh0aGlzLnByZXZDb25kaXRpb24pIHx8IHRoaXMucHJldkNvbmRpdGlvbikpIHtcbiAqICAgICAgIHRoaXMucHJldkNvbmRpdGlvbiA9IGZhbHNlO1xuICogICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZSh0aGlzLnRlbXBsYXRlUmVmKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFdlIGNhbiB0aGVuIHVzZSB0aGlzIGB1bmxlc3NgIHNlbGVjdG9yIGluIGEgdGVtcGxhdGU6XG4gKiBgYGBcbiAqIDx1bD5cbiAqICAgPGxpICp1bmxlc3M9XCJleHByXCI+PC9saT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBPbmNlIHRoZSBkaXJlY3RpdmUgaW5zdGFudGlhdGVzIHRoZSBjaGlsZCB2aWV3LCB0aGUgc2hvcnRoYW5kIG5vdGF0aW9uIGZvciB0aGUgdGVtcGxhdGUgZXhwYW5kc1xuICogYW5kIHRoZSByZXN1bHQgaXM6XG4gKlxuICogYGBgXG4gKiA8dWw+XG4gKiAgIDx0ZW1wbGF0ZSBbdW5sZXNzXT1cImV4cFwiPlxuICogICAgIDxsaT48L2xpPlxuICogICA8L3RlbXBsYXRlPlxuICogICA8bGk+PC9saT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBOb3RlIGFsc28gdGhhdCBhbHRob3VnaCB0aGUgYDxsaT48L2xpPmAgdGVtcGxhdGUgc3RpbGwgZXhpc3RzIGluc2lkZSB0aGUgYDx0ZW1wbGF0ZT48L3RlbXBsYXRlPmAsXG4gKiB0aGUgaW5zdGFudGlhdGVkXG4gKiB2aWV3IG9jY3VycyBvbiB0aGUgc2Vjb25kIGA8bGk+PC9saT5gIHdoaWNoIGlzIGEgc2libGluZyB0byB0aGUgYDx0ZW1wbGF0ZT5gIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgRGlyZWN0aXZlOiBEaXJlY3RpdmVGYWN0b3J5ID0gPERpcmVjdGl2ZUZhY3Rvcnk+bWFrZURlY29yYXRvcihEaXJlY3RpdmVNZXRhZGF0YSk7XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gVmlld01ldGFkYXRhLlxuLyoqXG4gKiBNZXRhZGF0YSBwcm9wZXJ0aWVzIGF2YWlsYWJsZSBmb3IgY29uZmlndXJpbmcgVmlld3MuXG4gKlxuICogRWFjaCBBbmd1bGFyIGNvbXBvbmVudCByZXF1aXJlcyBhIHNpbmdsZSBgQENvbXBvbmVudGAgYW5kIGF0IGxlYXN0IG9uZSBgQFZpZXdgIGFubm90YXRpb24uIFRoZVxuICogYEBWaWV3YCBhbm5vdGF0aW9uIHNwZWNpZmllcyB0aGUgSFRNTCB0ZW1wbGF0ZSB0byB1c2UsIGFuZCBsaXN0cyB0aGUgZGlyZWN0aXZlcyB0aGF0IGFyZSBhY3RpdmVcbiAqIHdpdGhpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICogV2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQsIHRoZSB0ZW1wbGF0ZSBpcyBsb2FkZWQgaW50byB0aGUgY29tcG9uZW50J3Mgc2hhZG93IHJvb3QsIGFuZFxuICogdGhlIGV4cHJlc3Npb25zIGFuZCBzdGF0ZW1lbnRzIGluIHRoZSB0ZW1wbGF0ZSBhcmUgZXZhbHVhdGVkIGFnYWluc3QgdGhlIGNvbXBvbmVudC5cbiAqXG4gKiBGb3IgZGV0YWlscyBvbiB0aGUgYEBDb21wb25lbnRgIGFubm90YXRpb24sIHNlZSB7QGxpbmsgQ29tcG9uZW50TWV0YWRhdGF9LlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdncmVldCcsXG4gKiAgIHRlbXBsYXRlOiAnSGVsbG8ge3tuYW1lfX0hJyxcbiAqICAgZGlyZWN0aXZlczogW0dyZWV0VXNlciwgQm9sZF1cbiAqIH0pXG4gKiBjbGFzcyBHcmVldCB7XG4gKiAgIG5hbWU6IHN0cmluZztcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHRoaXMubmFtZSA9ICdXb3JsZCc7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdmFyIFZpZXc6IFZpZXdGYWN0b3J5ID1cbiAgICA8Vmlld0ZhY3Rvcnk+bWFrZURlY29yYXRvcihWaWV3TWV0YWRhdGEsIChmbjogYW55KSA9PiBmbi5WaWV3ID0gVmlldyk7XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoYXQgYSBjb25zdGFudCBhdHRyaWJ1dGUgdmFsdWUgc2hvdWxkIGJlIGluamVjdGVkLlxuICpcbiAqIFRoZSBkaXJlY3RpdmUgY2FuIGluamVjdCBjb25zdGFudCBzdHJpbmcgbGl0ZXJhbHMgb2YgaG9zdCBlbGVtZW50IGF0dHJpYnV0ZXMuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBTdXBwb3NlIHdlIGhhdmUgYW4gYDxpbnB1dD5gIGVsZW1lbnQgYW5kIHdhbnQgdG8ga25vdyBpdHMgYHR5cGVgLlxuICpcbiAqIGBgYGh0bWxcbiAqIDxpbnB1dCB0eXBlPVwidGV4dFwiPlxuICogYGBgXG4gKlxuICogQSBkZWNvcmF0b3IgY2FuIGluamVjdCBzdHJpbmcgbGl0ZXJhbCBgdGV4dGAgbGlrZSBzbzpcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS90cy9tZXRhZGF0YS9tZXRhZGF0YS50cyByZWdpb249J2F0dHJpYnV0ZU1ldGFkYXRhJ31cbiAqL1xuZXhwb3J0IHZhciBBdHRyaWJ1dGU6IEF0dHJpYnV0ZUZhY3RvcnkgPSBtYWtlUGFyYW1EZWNvcmF0b3IoQXR0cmlidXRlTWV0YWRhdGEpO1xuXG4vLyBUT0RPKGFsZXhlYWdsZSk6IHJlbW92ZSB0aGUgZHVwbGljYXRpb24gb2YgdGhpcyBkb2MuIEl0IGlzIGNvcGllZCBmcm9tIFF1ZXJ5TWV0YWRhdGEuXG4vKipcbiAqIERlY2xhcmVzIGFuIGluamVjdGFibGUgcGFyYW1ldGVyIHRvIGJlIGEgbGl2ZSBsaXN0IG9mIGRpcmVjdGl2ZXMgb3IgdmFyaWFibGVcbiAqIGJpbmRpbmdzIGZyb20gdGhlIGNvbnRlbnQgY2hpbGRyZW4gb2YgYSBkaXJlY3RpdmUuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2xZOW04SEx5N3owNnZEb1VhU04yP3A9cHJldmlldykpXG4gKlxuICogQXNzdW1lIHRoYXQgYDx0YWJzPmAgY29tcG9uZW50IHdvdWxkIGxpa2UgdG8gZ2V0IGEgbGlzdCBpdHMgY2hpbGRyZW4gYDxwYW5lPmBcbiAqIGNvbXBvbmVudHMgYXMgc2hvd24gaW4gdGhpcyBleGFtcGxlOlxuICpcbiAqIGBgYGh0bWxcbiAqIDx0YWJzPlxuICogICA8cGFuZSB0aXRsZT1cIk92ZXJ2aWV3XCI+Li4uPC9wYW5lPlxuICogICA8cGFuZSAqbmdGb3I9XCIjbyBvZiBvYmplY3RzXCIgW3RpdGxlXT1cIm8udGl0bGVcIj57e28udGV4dH19PC9wYW5lPlxuICogPC90YWJzPlxuICogYGBgXG4gKlxuICogVGhlIHByZWZlcnJlZCBzb2x1dGlvbiBpcyB0byBxdWVyeSBmb3IgYFBhbmVgIGRpcmVjdGl2ZXMgdXNpbmcgdGhpcyBkZWNvcmF0b3IuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAncGFuZScsXG4gKiAgIGlucHV0czogWyd0aXRsZSddXG4gKiB9KVxuICogY2xhc3MgUGFuZSB7XG4gKiAgIHRpdGxlOnN0cmluZztcbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICBzZWxlY3RvcjogJ3RhYnMnLFxuICogIHRlbXBsYXRlOiBgXG4gKiAgICA8dWw+XG4gKiAgICAgIDxsaSAqbmdGb3I9XCIjcGFuZSBvZiBwYW5lc1wiPnt7cGFuZS50aXRsZX19PC9saT5cbiAqICAgIDwvdWw+XG4gKiAgICA8Y29udGVudD48L2NvbnRlbnQ+XG4gKiAgYFxuICogfSlcbiAqIGNsYXNzIFRhYnMge1xuICogICBwYW5lczogUXVlcnlMaXN0PFBhbmU+O1xuICogICBjb25zdHJ1Y3RvcihAUXVlcnkoUGFuZSkgcGFuZXM6UXVlcnlMaXN0PFBhbmU+KSB7XG4gKiAgICAgdGhpcy5wYW5lcyA9IHBhbmVzO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBBIHF1ZXJ5IGNhbiBsb29rIGZvciB2YXJpYWJsZSBiaW5kaW5ncyBieSBwYXNzaW5nIGluIGEgc3RyaW5nIHdpdGggZGVzaXJlZCBiaW5kaW5nIHN5bWJvbC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvc1QyajI1Y0gxZFVSQXlCUkNLeDE/cD1wcmV2aWV3KSlcbiAqIGBgYGh0bWxcbiAqIDxzZWVrZXI+XG4gKiAgIDxkaXYgI2ZpbmRtZT4uLi48L2Rpdj5cbiAqIDwvc2Vla2VyPlxuICpcbiAqIEBDb21wb25lbnQoeyBzZWxlY3RvcjogJ2ZvbycgfSlcbiAqIGNsYXNzIHNlZWtlciB7XG4gKiAgIGNvbnN0cnVjdG9yKEBRdWVyeSgnZmluZG1lJykgZWxMaXN0OiBRdWVyeUxpc3Q8RWxlbWVudFJlZj4pIHsuLi59XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBJbiB0aGlzIGNhc2UgdGhlIG9iamVjdCB0aGF0IGlzIGluamVjdGVkIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGVcbiAqIGJpbmRpbmcuIEl0IGNhbiBiZSBhbiBFbGVtZW50UmVmLCBhIGRpcmVjdGl2ZSBvciBhIGNvbXBvbmVudC5cbiAqXG4gKiBQYXNzaW5nIGluIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdmFyaWFibGUgYmluZGluZ3Mgd2lsbCBxdWVyeSBmb3IgYWxsIG9mIHRoZW0uXG4gKlxuICogYGBgaHRtbFxuICogPHNlZWtlcj5cbiAqICAgPGRpdiAjZmluZE1lPi4uLjwvZGl2PlxuICogICA8ZGl2ICNmaW5kTWVUb28+Li4uPC9kaXY+XG4gKiA8L3NlZWtlcj5cbiAqXG4gKiAgQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnZm9vJ1xuICogfSlcbiAqIGNsYXNzIFNlZWtlciB7XG4gKiAgIGNvbnN0cnVjdG9yKEBRdWVyeSgnZmluZE1lLCBmaW5kTWVUb28nKSBlbExpc3Q6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPikgey4uLn1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIENvbmZpZ3VyZSB3aGV0aGVyIHF1ZXJ5IGxvb2tzIGZvciBkaXJlY3QgY2hpbGRyZW4gb3IgYWxsIGRlc2NlbmRhbnRzXG4gKiBvZiB0aGUgcXVlcnlpbmcgZWxlbWVudCwgYnkgdXNpbmcgdGhlIGBkZXNjZW5kYW50c2AgcGFyYW1ldGVyLlxuICogSXQgaXMgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvd3RHZUI5NzdidjdxdkE1RlRZbDk/cD1wcmV2aWV3KSlcbiAqIGBgYGh0bWxcbiAqIDxjb250YWluZXIgI2ZpcnN0PlxuICogICA8aXRlbT5hPC9pdGVtPlxuICogICA8aXRlbT5iPC9pdGVtPlxuICogICA8Y29udGFpbmVyICNzZWNvbmQ+XG4gKiAgICAgPGl0ZW0+YzwvaXRlbT5cbiAqICAgPC9jb250YWluZXI+XG4gKiA8L2NvbnRhaW5lcj5cbiAqIGBgYFxuICpcbiAqIFdoZW4gcXVlcnlpbmcgZm9yIGl0ZW1zLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpbGwgc2VlIG9ubHkgYGFgIGFuZCBgYmAgYnkgZGVmYXVsdCxcbiAqIGJ1dCB3aXRoIGBRdWVyeShUZXh0RGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KWAgaXQgd2lsbCBzZWUgYGNgIHRvby5cbiAqXG4gKiBUaGUgcXVlcmllZCBkaXJlY3RpdmVzIGFyZSBrZXB0IGluIGEgZGVwdGgtZmlyc3QgcHJlLW9yZGVyIHdpdGggcmVzcGVjdCB0byB0aGVpclxuICogcG9zaXRpb25zIGluIHRoZSBET00uXG4gKlxuICogUXVlcnkgZG9lcyBub3QgbG9vayBkZWVwIGludG8gYW55IHN1YmNvbXBvbmVudCB2aWV3cy5cbiAqXG4gKiBRdWVyeSBpcyB1cGRhdGVkIGFzIHBhcnQgb2YgdGhlIGNoYW5nZS1kZXRlY3Rpb24gY3ljbGUuIFNpbmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAqIGhhcHBlbnMgYWZ0ZXIgY29uc3RydWN0aW9uIG9mIGEgZGlyZWN0aXZlLCBRdWVyeUxpc3Qgd2lsbCBhbHdheXMgYmUgZW1wdHkgd2hlbiBvYnNlcnZlZCBpbiB0aGVcbiAqIGNvbnN0cnVjdG9yLlxuICpcbiAqIFRoZSBpbmplY3RlZCBvYmplY3QgaXMgYW4gdW5tb2RpZmlhYmxlIGxpdmUgbGlzdC5cbiAqIFNlZSB7QGxpbmsgUXVlcnlMaXN0fSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgdmFyIFF1ZXJ5OiBRdWVyeUZhY3RvcnkgPSBtYWtlUGFyYW1EZWNvcmF0b3IoUXVlcnlNZXRhZGF0YSk7XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gQ29udGVudENoaWxkcmVuTWV0YWRhdGEuXG4vKipcbiAqIENvbmZpZ3VyZXMgYSBjb250ZW50IHF1ZXJ5LlxuICpcbiAqIENvbnRlbnQgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJDb250ZW50SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdzb21lRGlyJ1xuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAQ29udGVudENoaWxkcmVuKENoaWxkRGlyZWN0aXZlKSBjb250ZW50Q2hpbGRyZW46IFF1ZXJ5TGlzdDxDaGlsZERpcmVjdGl2ZT47XG4gKlxuICogICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gKiAgICAgLy8gY29udGVudENoaWxkcmVuIGlzIHNldFxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHZhciBDb250ZW50Q2hpbGRyZW46IENvbnRlbnRDaGlsZHJlbkZhY3RvcnkgPSBtYWtlUHJvcERlY29yYXRvcihDb250ZW50Q2hpbGRyZW5NZXRhZGF0YSk7XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gQ29udGVudENoaWxkTWV0YWRhdGEuXG4vKipcbiAqIENvbmZpZ3VyZXMgYSBjb250ZW50IHF1ZXJ5LlxuICpcbiAqIENvbnRlbnQgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJDb250ZW50SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdzb21lRGlyJ1xuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAQ29udGVudENoaWxkKENoaWxkRGlyZWN0aXZlKSBjb250ZW50Q2hpbGQ7XG4gKlxuICogICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gKiAgICAgLy8gY29udGVudENoaWxkIGlzIHNldFxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IHZhciBDb250ZW50Q2hpbGQ6IENvbnRlbnRDaGlsZEZhY3RvcnkgPSBtYWtlUHJvcERlY29yYXRvcihDb250ZW50Q2hpbGRNZXRhZGF0YSk7XG5cbi8vIFRPRE8oYWxleGVhZ2xlKTogcmVtb3ZlIHRoZSBkdXBsaWNhdGlvbiBvZiB0aGlzIGRvYy4gSXQgaXMgY29waWVkIGZyb20gVmlld0NoaWxkcmVuTWV0YWRhdGEuXG4vKipcbiAqIENvbmZpZ3VyZXMgYSB2aWV3IHF1ZXJ5LlxuICpcbiAqIFZpZXcgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJWaWV3SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdzb21lRGlyJyxcbiAqICAgdGVtcGxhdGVVcmw6ICdzb21lVGVtcGxhdGUnLFxuICogICBkaXJlY3RpdmVzOiBbSXRlbURpcmVjdGl2ZV1cbiAqIH0pXG4gKiBjbGFzcyBTb21lRGlyIHtcbiAqICAgQFZpZXdDaGlsZHJlbihJdGVtRGlyZWN0aXZlKSB2aWV3Q2hpbGRyZW46IFF1ZXJ5TGlzdDxJdGVtRGlyZWN0aXZlPjtcbiAqXG4gKiAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAqICAgICAvLyB2aWV3Q2hpbGRyZW4gaXMgc2V0XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5leHBvcnQgdmFyIFZpZXdDaGlsZHJlbjogVmlld0NoaWxkcmVuRmFjdG9yeSA9IG1ha2VQcm9wRGVjb3JhdG9yKFZpZXdDaGlsZHJlbk1ldGFkYXRhKTtcblxuLy8gVE9ETyhhbGV4ZWFnbGUpOiByZW1vdmUgdGhlIGR1cGxpY2F0aW9uIG9mIHRoaXMgZG9jLiBJdCBpcyBjb3BpZWQgZnJvbSBWaWV3Q2hpbGRNZXRhZGF0YS5cbi8qKlxuICogQ29uZmlndXJlcyBhIHZpZXcgcXVlcnkuXG4gKlxuICogVmlldyBxdWVyaWVzIGFyZSBzZXQgYmVmb3JlIHRoZSBgbmdBZnRlclZpZXdJbml0YCBjYWxsYmFjayBpcyBjYWxsZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ3NvbWVEaXInLFxuICogICB0ZW1wbGF0ZVVybDogJ3NvbWVUZW1wbGF0ZScsXG4gKiAgIGRpcmVjdGl2ZXM6IFtJdGVtRGlyZWN0aXZlXVxuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAVmlld0NoaWxkKEl0ZW1EaXJlY3RpdmUpIHZpZXdDaGlsZDpJdGVtRGlyZWN0aXZlO1xuICpcbiAqICAgbmdBZnRlclZpZXdJbml0KCkge1xuICogICAgIC8vIHZpZXdDaGlsZCBpcyBzZXRcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCB2YXIgVmlld0NoaWxkOiBWaWV3Q2hpbGRGYWN0b3J5ID0gbWFrZVByb3BEZWNvcmF0b3IoVmlld0NoaWxkTWV0YWRhdGEpO1xuXG4vLyBUT0RPKGFsZXhlYWdsZSk6IHJlbW92ZSB0aGUgZHVwbGljYXRpb24gb2YgdGhpcyBkb2MuIEl0IGlzIGNvcGllZCBmcm9tIFZpZXdRdWVyeU1ldGFkYXRhLlxuLyoqXG4gKiBTaW1pbGFyIHRvIHtAbGluayBRdWVyeU1ldGFkYXRhfSwgYnV0IHF1ZXJ5aW5nIHRoZSBjb21wb25lbnQgdmlldywgaW5zdGVhZCBvZlxuICogdGhlIGNvbnRlbnQgY2hpbGRyZW4uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2VOc0ZIRGY3WWp5TTZJekt4TTFqP3A9cHJldmlldykpXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogQENvbXBvbmVudCh7Li4ufSlcbiAqIEBWaWV3KHtcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8aXRlbT4gYSA8L2l0ZW0+XG4gKiAgICAgPGl0ZW0+IGIgPC9pdGVtPlxuICogICAgIDxpdGVtPiBjIDwvaXRlbT5cbiAqICAgYFxuICogfSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgc2hvd246IGJvb2xlYW47XG4gKlxuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIEBRdWVyeShJdGVtKSBpdGVtczpRdWVyeUxpc3Q8SXRlbT4pIHtcbiAqICAgICBpdGVtcy5vbkNoYW5nZSgoKSA9PiBjb25zb2xlLmxvZyhpdGVtcy5sZW5ndGgpKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogU3VwcG9ydHMgdGhlIHNhbWUgcXVlcnlpbmcgcGFyYW1ldGVycyBhcyB7QGxpbmsgUXVlcnlNZXRhZGF0YX0sIGV4Y2VwdFxuICogYGRlc2NlbmRhbnRzYC4gVGhpcyBhbHdheXMgcXVlcmllcyB0aGUgd2hvbGUgdmlldy5cbiAqXG4gKiBBcyBgc2hvd25gIGlzIGZsaXBwZWQgYmV0d2VlbiB0cnVlIGFuZCBmYWxzZSwgaXRlbXMgd2lsbCBjb250YWluIHplcm8gb2Ygb25lXG4gKiBpdGVtcy5cbiAqXG4gKiBTcGVjaWZpZXMgdGhhdCBhIHtAbGluayBRdWVyeUxpc3R9IHNob3VsZCBiZSBpbmplY3RlZC5cbiAqXG4gKiBUaGUgaW5qZWN0ZWQgb2JqZWN0IGlzIGFuIGl0ZXJhYmxlIGFuZCBvYnNlcnZhYmxlIGxpdmUgbGlzdC5cbiAqIFNlZSB7QGxpbmsgUXVlcnlMaXN0fSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgdmFyIFZpZXdRdWVyeTogUXVlcnlGYWN0b3J5ID0gbWFrZVBhcmFtRGVjb3JhdG9yKFZpZXdRdWVyeU1ldGFkYXRhKTtcblxuLy8gVE9ETyhhbGV4ZWFnbGUpOiByZW1vdmUgdGhlIGR1cGxpY2F0aW9uIG9mIHRoaXMgZG9jLiBJdCBpcyBjb3BpZWQgZnJvbSBQaXBlTWV0YWRhdGEuXG4vKipcbiAqIERlY2xhcmUgcmV1c2FibGUgcGlwZSBmdW5jdGlvbi5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL21ldGFkYXRhLnRzIHJlZ2lvbj0ncGlwZSd9XG4gKi9cbmV4cG9ydCB2YXIgUGlwZTogUGlwZUZhY3RvcnkgPSA8UGlwZUZhY3Rvcnk+bWFrZURlY29yYXRvcihQaXBlTWV0YWRhdGEpO1xuXG4vLyBUT0RPKGFsZXhlYWdsZSk6IHJlbW92ZSB0aGUgZHVwbGljYXRpb24gb2YgdGhpcyBkb2MuIEl0IGlzIGNvcGllZCBmcm9tIElucHV0TWV0YWRhdGEuXG4vKipcbiAqIERlY2xhcmVzIGEgZGF0YS1ib3VuZCBpbnB1dCBwcm9wZXJ0eS5cbiAqXG4gKiBBbmd1bGFyIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyBkYXRhLWJvdW5kIHByb3BlcnRpZXMgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24uXG4gKlxuICogYElucHV0TWV0YWRhdGFgIHRha2VzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyB0aGUgbmFtZVxuICogdXNlZCB3aGVuIGluc3RhbnRpYXRpbmcgYSBjb21wb25lbnQgaW4gdGhlIHRlbXBsYXRlLiBXaGVuIG5vdCBwcm92aWRlZCxcbiAqIHRoZSBuYW1lIG9mIHRoZSBkZWNvcmF0ZWQgcHJvcGVydHkgaXMgdXNlZC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgY29tcG9uZW50IHdpdGggdHdvIGlucHV0IHByb3BlcnRpZXMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYmFuay1hY2NvdW50JyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICBCYW5rIE5hbWU6IHt7YmFua05hbWV9fVxuICogICAgIEFjY291bnQgSWQ6IHt7aWR9fVxuICogICBgXG4gKiB9KVxuICogY2xhc3MgQmFua0FjY291bnQge1xuICogICBASW5wdXQoKSBiYW5rTmFtZTogc3RyaW5nO1xuICogICBASW5wdXQoJ2FjY291bnQtaWQnKSBpZDogc3RyaW5nO1xuICpcbiAqICAgLy8gdGhpcyBwcm9wZXJ0eSBpcyBub3QgYm91bmQsIGFuZCB3b24ndCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgQW5ndWxhclxuICogICBub3JtYWxpemVkQmFua05hbWU6IHN0cmluZztcbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxiYW5rLWFjY291bnQgYmFuay1uYW1lPVwiUkJDXCIgYWNjb3VudC1pZD1cIjQ3NDdcIj48L2JhbmstYWNjb3VudD5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW0JhbmtBY2NvdW50XVxuICogfSlcbiAqIGNsYXNzIEFwcCB7fVxuICpcbiAqIGJvb3RzdHJhcChBcHApO1xuICogYGBgXG4gKi9cbmV4cG9ydCB2YXIgSW5wdXQ6IElucHV0RmFjdG9yeSA9IG1ha2VQcm9wRGVjb3JhdG9yKElucHV0TWV0YWRhdGEpO1xuXG4vLyBUT0RPKGFsZXhlYWdsZSk6IHJlbW92ZSB0aGUgZHVwbGljYXRpb24gb2YgdGhpcyBkb2MuIEl0IGlzIGNvcGllZCBmcm9tIE91dHB1dE1ldGFkYXRhLlxuLyoqXG4gKiBEZWNsYXJlcyBhbiBldmVudC1ib3VuZCBvdXRwdXQgcHJvcGVydHkuXG4gKlxuICogV2hlbiBhbiBvdXRwdXQgcHJvcGVydHkgZW1pdHMgYW4gZXZlbnQsIGFuIGV2ZW50IGhhbmRsZXIgYXR0YWNoZWQgdG8gdGhhdCBldmVudFxuICogdGhlIHRlbXBsYXRlIGlzIGludm9rZWQuXG4gKlxuICogYE91dHB1dE1ldGFkYXRhYCB0YWtlcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG5hbWVcbiAqIHVzZWQgd2hlbiBpbnN0YW50aWF0aW5nIGEgY29tcG9uZW50IGluIHRoZSB0ZW1wbGF0ZS4gV2hlbiBub3QgcHJvdmlkZWQsXG4gKiB0aGUgbmFtZSBvZiB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IGlzIHVzZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdpbnRlcnZhbC1kaXInLFxuICogfSlcbiAqIGNsYXNzIEludGVydmFsRGlyIHtcbiAqICAgQE91dHB1dCgpIGV2ZXJ5U2Vjb25kID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICogICBAT3V0cHV0KCdldmVyeUZpdmVTZWNvbmRzJykgZml2ZTVTZWNzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5ldmVyeVNlY29uZC5lbWl0KFwiZXZlbnRcIiksIDEwMDApO1xuICogICAgIHNldEludGVydmFsKCgpID0+IHRoaXMuZml2ZTVTZWNzLmVtaXQoXCJldmVudFwiKSwgNTAwMCk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxpbnRlcnZhbC1kaXIgKGV2ZXJ5LXNlY29uZCk9XCJldmVyeVNlY29uZCgpXCIgKGV2ZXJ5LWZpdmUtc2Vjb25kcyk9XCJldmVyeUZpdmVTZWNvbmRzKClcIj5cbiAqICAgICA8L2ludGVydmFsLWRpcj5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW0ludGVydmFsRGlyXVxuICogfSlcbiAqIGNsYXNzIEFwcCB7XG4gKiAgIGV2ZXJ5U2Vjb25kKCkgeyBjb25zb2xlLmxvZygnc2Vjb25kJyk7IH1cbiAqICAgZXZlcnlGaXZlU2Vjb25kcygpIHsgY29uc29sZS5sb2coJ2ZpdmUgc2Vjb25kcycpOyB9XG4gKiB9XG4gKiBib290c3RyYXAoQXBwKTtcbiAqIGBgYFxuICovXG5leHBvcnQgdmFyIE91dHB1dDogT3V0cHV0RmFjdG9yeSA9IG1ha2VQcm9wRGVjb3JhdG9yKE91dHB1dE1ldGFkYXRhKTtcblxuLy8gVE9ETyhhbGV4ZWFnbGUpOiByZW1vdmUgdGhlIGR1cGxpY2F0aW9uIG9mIHRoaXMgZG9jLiBJdCBpcyBjb3BpZWQgZnJvbSBIb3N0QmluZGluZ01ldGFkYXRhLlxuLyoqXG4gKiBEZWNsYXJlcyBhIGhvc3QgcHJvcGVydHkgYmluZGluZy5cbiAqXG4gKiBBbmd1bGFyIGF1dG9tYXRpY2FsbHkgY2hlY2tzIGhvc3QgcHJvcGVydHkgYmluZGluZ3MgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24uXG4gKiBJZiBhIGJpbmRpbmcgY2hhbmdlcywgaXQgd2lsbCB1cGRhdGUgdGhlIGhvc3QgZWxlbWVudCBvZiB0aGUgZGlyZWN0aXZlLlxuICpcbiAqIGBIb3N0QmluZGluZ01ldGFkYXRhYCB0YWtlcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIHByb3BlcnR5XG4gKiBuYW1lIG9mIHRoZSBob3N0IGVsZW1lbnQgdGhhdCB3aWxsIGJlIHVwZGF0ZWQuIFdoZW4gbm90IHByb3ZpZGVkLFxuICogdGhlIGNsYXNzIHByb3BlcnR5IG5hbWUgaXMgdXNlZC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgZGlyZWN0aXZlIHRoYXQgc2V0cyB0aGUgYHZhbGlkYCBhbmQgYGludmFsaWRgIGNsYXNzZXNcbiAqIG9uIHRoZSBET00gZWxlbWVudCB0aGF0IGhhcyBuZ01vZGVsIGRpcmVjdGl2ZSBvbiBpdC5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBARGlyZWN0aXZlKHtzZWxlY3RvcjogJ1tuZ01vZGVsXSd9KVxuICogY2xhc3MgTmdNb2RlbFN0YXR1cyB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250cm9sOk5nTW9kZWwpIHt9XG4gKiAgIEBIb3N0QmluZGluZygnW2NsYXNzLnZhbGlkXScpIGdldCB2YWxpZCB7IHJldHVybiB0aGlzLmNvbnRyb2wudmFsaWQ7IH1cbiAqICAgQEhvc3RCaW5kaW5nKCdbY2xhc3MuaW52YWxpZF0nKSBnZXQgaW52YWxpZCB7IHJldHVybiB0aGlzLmNvbnRyb2wuaW52YWxpZDsgfVxuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHRlbXBsYXRlOiBgPGlucHV0IFsobmdNb2RlbCldPVwicHJvcFwiPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVMsIE5nTW9kZWxTdGF0dXNdXG4gKiB9KVxuICogY2xhc3MgQXBwIHtcbiAqICAgcHJvcDtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKTtcbiAqIGBgYFxuICovXG5leHBvcnQgdmFyIEhvc3RCaW5kaW5nOiBIb3N0QmluZGluZ0ZhY3RvcnkgPSBtYWtlUHJvcERlY29yYXRvcihIb3N0QmluZGluZ01ldGFkYXRhKTtcblxuLy8gVE9ETyhhbGV4ZWFnbGUpOiByZW1vdmUgdGhlIGR1cGxpY2F0aW9uIG9mIHRoaXMgZG9jLiBJdCBpcyBjb3BpZWQgZnJvbSBIb3N0TGlzdGVuZXJNZXRhZGF0YS5cbi8qKlxuICogRGVjbGFyZXMgYSBob3N0IGxpc3RlbmVyLlxuICpcbiAqIEFuZ3VsYXIgd2lsbCBpbnZva2UgdGhlIGRlY29yYXRlZCBtZXRob2Qgd2hlbiB0aGUgaG9zdCBlbGVtZW50IGVtaXRzIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gKlxuICogSWYgdGhlIGRlY29yYXRlZCBtZXRob2QgcmV0dXJucyBgZmFsc2VgLCB0aGVuIGBwcmV2ZW50RGVmYXVsdGAgaXMgYXBwbGllZCBvbiB0aGUgRE9NXG4gKiBldmVudC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWNsYXJlcyBhIGRpcmVjdGl2ZSB0aGF0IGF0dGFjaGVzIGEgY2xpY2sgbGlzdGVuZXIgdG8gdGhlIGJ1dHRvbiBhbmRcbiAqIGNvdW50cyBjbGlja3MuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdidXR0b25bY291bnRpbmddJ30pXG4gKiBjbGFzcyBDb3VudENsaWNrcyB7XG4gKiAgIG51bWJlck9mQ2xpY2tzID0gMDtcbiAqXG4gKiAgIEBIb3N0TGlzdGVuZXIoJ2NsaWNrJywgWyckZXZlbnQudGFyZ2V0J10pXG4gKiAgIG9uQ2xpY2soYnRuKSB7XG4gKiAgICAgY29uc29sZS5sb2coXCJidXR0b25cIiwgYnRuLCBcIm51bWJlciBvZiBjbGlja3M6XCIsIHRoaXMubnVtYmVyT2ZDbGlja3MrKyk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYDxidXR0b24gY291bnRpbmc+SW5jcmVtZW50PC9idXR0b24+YCxcbiAqICAgZGlyZWN0aXZlczogW0NvdW50Q2xpY2tzXVxuICogfSlcbiAqIGNsYXNzIEFwcCB7fVxuICpcbiAqIGJvb3RzdHJhcChBcHApO1xuICogYGBgXG4gKi9cbmV4cG9ydCB2YXIgSG9zdExpc3RlbmVyOiBIb3N0TGlzdGVuZXJGYWN0b3J5ID0gbWFrZVByb3BEZWNvcmF0b3IoSG9zdExpc3RlbmVyTWV0YWRhdGEpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEudHNcbiAqKi8iLCJpbXBvcnQge0NPTlNULCBUeXBlLCBzdHJpbmdpZnksIGlzUHJlc2VudCwgaXNTdHJpbmd9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3Jlc29sdmVGb3J3YXJkUmVmfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0RlcGVuZGVuY3lNZXRhZGF0YX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGkvbWV0YWRhdGEnO1xuXG4vKipcbiAqIFNwZWNpZmllcyB0aGF0IGEgY29uc3RhbnQgYXR0cmlidXRlIHZhbHVlIHNob3VsZCBiZSBpbmplY3RlZC5cbiAqXG4gKiBUaGUgZGlyZWN0aXZlIGNhbiBpbmplY3QgY29uc3RhbnQgc3RyaW5nIGxpdGVyYWxzIG9mIGhvc3QgZWxlbWVudCBhdHRyaWJ1dGVzLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogU3VwcG9zZSB3ZSBoYXZlIGFuIGA8aW5wdXQ+YCBlbGVtZW50IGFuZCB3YW50IHRvIGtub3cgaXRzIGB0eXBlYC5cbiAqXG4gKiBgYGBodG1sXG4gKiA8aW5wdXQgdHlwZT1cInRleHRcIj5cbiAqIGBgYFxuICpcbiAqIEEgZGVjb3JhdG9yIGNhbiBpbmplY3Qgc3RyaW5nIGxpdGVyYWwgYHRleHRgIGxpa2Ugc286XG4gKlxuICoge0BleGFtcGxlIGNvcmUvdHMvbWV0YWRhdGEvbWV0YWRhdGEudHMgcmVnaW9uPSdhdHRyaWJ1dGVNZXRhZGF0YSd9XG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlTWV0YWRhdGEgZXh0ZW5kcyBEZXBlbmRlbmN5TWV0YWRhdGEge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYXR0cmlidXRlTmFtZTogc3RyaW5nKSB7IHN1cGVyKCk7IH1cblxuICBnZXQgdG9rZW4oKTogQXR0cmlidXRlTWV0YWRhdGEge1xuICAgIC8vIE5vcm1hbGx5IG9uZSB3b3VsZCBkZWZhdWx0IGEgdG9rZW4gdG8gYSB0eXBlIG9mIGFuIGluamVjdGVkIHZhbHVlIGJ1dCBoZXJlXG4gICAgLy8gdGhlIHR5cGUgb2YgYSB2YXJpYWJsZSBpcyBcInN0cmluZ1wiIGFuZCB3ZSBjYW4ndCB1c2UgcHJpbWl0aXZlIHR5cGUgYXMgYSByZXR1cm4gdmFsdWVcbiAgICAvLyBzbyB3ZSB1c2UgaW5zdGFuY2Ugb2YgQXR0cmlidXRlIGluc3RlYWQuIFRoaXMgZG9lc24ndCBtYXR0ZXIgbXVjaCBpbiBwcmFjdGljZSBhcyBhcmd1bWVudHNcbiAgICAvLyB3aXRoIEBBdHRyaWJ1dGUgYW5ub3RhdGlvbiBhcmUgaW5qZWN0ZWQgYnkgRWxlbWVudEluamVjdG9yIHRoYXQgZG9lc24ndCB0YWtlIHRva2VucyBpbnRvXG4gICAgLy8gYWNjb3VudC5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gYEBBdHRyaWJ1dGUoJHtzdHJpbmdpZnkodGhpcy5hdHRyaWJ1dGVOYW1lKX0pYDsgfVxufVxuXG4vKipcbiAqIERlY2xhcmVzIGFuIGluamVjdGFibGUgcGFyYW1ldGVyIHRvIGJlIGEgbGl2ZSBsaXN0IG9mIGRpcmVjdGl2ZXMgb3IgdmFyaWFibGVcbiAqIGJpbmRpbmdzIGZyb20gdGhlIGNvbnRlbnQgY2hpbGRyZW4gb2YgYSBkaXJlY3RpdmUuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2xZOW04SEx5N3owNnZEb1VhU04yP3A9cHJldmlldykpXG4gKlxuICogQXNzdW1lIHRoYXQgYDx0YWJzPmAgY29tcG9uZW50IHdvdWxkIGxpa2UgdG8gZ2V0IGEgbGlzdCBpdHMgY2hpbGRyZW4gYDxwYW5lPmBcbiAqIGNvbXBvbmVudHMgYXMgc2hvd24gaW4gdGhpcyBleGFtcGxlOlxuICpcbiAqIGBgYGh0bWxcbiAqIDx0YWJzPlxuICogICA8cGFuZSB0aXRsZT1cIk92ZXJ2aWV3XCI+Li4uPC9wYW5lPlxuICogICA8cGFuZSAqbmdGb3I9XCIjbyBvZiBvYmplY3RzXCIgW3RpdGxlXT1cIm8udGl0bGVcIj57e28udGV4dH19PC9wYW5lPlxuICogPC90YWJzPlxuICogYGBgXG4gKlxuICogVGhlIHByZWZlcnJlZCBzb2x1dGlvbiBpcyB0byBxdWVyeSBmb3IgYFBhbmVgIGRpcmVjdGl2ZXMgdXNpbmcgdGhpcyBkZWNvcmF0b3IuXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAncGFuZScsXG4gKiAgIGlucHV0czogWyd0aXRsZSddXG4gKiB9KVxuICogY2xhc3MgUGFuZSB7XG4gKiAgIHRpdGxlOnN0cmluZztcbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICBzZWxlY3RvcjogJ3RhYnMnLFxuICogIHRlbXBsYXRlOiBgXG4gKiAgICA8dWw+XG4gKiAgICAgIDxsaSAqbmdGb3I9XCIjcGFuZSBvZiBwYW5lc1wiPnt7cGFuZS50aXRsZX19PC9saT5cbiAqICAgIDwvdWw+XG4gKiAgICA8Y29udGVudD48L2NvbnRlbnQ+XG4gKiAgYFxuICogfSlcbiAqIGNsYXNzIFRhYnMge1xuICogICBwYW5lczogUXVlcnlMaXN0PFBhbmU+O1xuICogICBjb25zdHJ1Y3RvcihAUXVlcnkoUGFuZSkgcGFuZXM6UXVlcnlMaXN0PFBhbmU+KSB7XG4gICogICAgdGhpcy5wYW5lcyA9IHBhbmVzO1xuICAqICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBBIHF1ZXJ5IGNhbiBsb29rIGZvciB2YXJpYWJsZSBiaW5kaW5ncyBieSBwYXNzaW5nIGluIGEgc3RyaW5nIHdpdGggZGVzaXJlZCBiaW5kaW5nIHN5bWJvbC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvc1QyajI1Y0gxZFVSQXlCUkNLeDE/cD1wcmV2aWV3KSlcbiAqIGBgYGh0bWxcbiAqIDxzZWVrZXI+XG4gKiAgIDxkaXYgI2ZpbmRtZT4uLi48L2Rpdj5cbiAqIDwvc2Vla2VyPlxuICpcbiAqIEBDb21wb25lbnQoeyBzZWxlY3RvcjogJ3NlZWtlcicgfSlcbiAqIGNsYXNzIFNlZWtlciB7XG4gKiAgIGNvbnN0cnVjdG9yKEBRdWVyeSgnZmluZG1lJykgZWxMaXN0OiBRdWVyeUxpc3Q8RWxlbWVudFJlZj4pIHsuLi59XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBJbiB0aGlzIGNhc2UgdGhlIG9iamVjdCB0aGF0IGlzIGluamVjdGVkIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFyaWFibGVcbiAqIGJpbmRpbmcuIEl0IGNhbiBiZSBhbiBFbGVtZW50UmVmLCBhIGRpcmVjdGl2ZSBvciBhIGNvbXBvbmVudC5cbiAqXG4gKiBQYXNzaW5nIGluIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgdmFyaWFibGUgYmluZGluZ3Mgd2lsbCBxdWVyeSBmb3IgYWxsIG9mIHRoZW0uXG4gKlxuICogYGBgaHRtbFxuICogPHNlZWtlcj5cbiAqICAgPGRpdiAjZmluZC1tZT4uLi48L2Rpdj5cbiAqICAgPGRpdiAjZmluZC1tZS10b28+Li4uPC9kaXY+XG4gKiA8L3NlZWtlcj5cbiAqXG4gKiAgQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnc2Vla2VyJ1xuICogfSlcbiAqIGNsYXNzIFNlZWtlciB7XG4gKiAgIGNvbnN0cnVjdG9yKEBRdWVyeSgnZmluZE1lLCBmaW5kTWVUb28nKSBlbExpc3Q6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPikgey4uLn1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIENvbmZpZ3VyZSB3aGV0aGVyIHF1ZXJ5IGxvb2tzIGZvciBkaXJlY3QgY2hpbGRyZW4gb3IgYWxsIGRlc2NlbmRhbnRzXG4gKiBvZiB0aGUgcXVlcnlpbmcgZWxlbWVudCwgYnkgdXNpbmcgdGhlIGBkZXNjZW5kYW50c2AgcGFyYW1ldGVyLlxuICogSXQgaXMgc2V0IHRvIGBmYWxzZWAgYnkgZGVmYXVsdC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvd3RHZUI5NzdidjdxdkE1RlRZbDk/cD1wcmV2aWV3KSlcbiAqIGBgYGh0bWxcbiAqIDxjb250YWluZXIgI2ZpcnN0PlxuICogICA8aXRlbT5hPC9pdGVtPlxuICogICA8aXRlbT5iPC9pdGVtPlxuICogICA8Y29udGFpbmVyICNzZWNvbmQ+XG4gKiAgICAgPGl0ZW0+YzwvaXRlbT5cbiAqICAgPC9jb250YWluZXI+XG4gKiA8L2NvbnRhaW5lcj5cbiAqIGBgYFxuICpcbiAqIFdoZW4gcXVlcnlpbmcgZm9yIGl0ZW1zLCB0aGUgZmlyc3QgY29udGFpbmVyIHdpbGwgc2VlIG9ubHkgYGFgIGFuZCBgYmAgYnkgZGVmYXVsdCxcbiAqIGJ1dCB3aXRoIGBRdWVyeShUZXh0RGlyZWN0aXZlLCB7ZGVzY2VuZGFudHM6IHRydWV9KWAgaXQgd2lsbCBzZWUgYGNgIHRvby5cbiAqXG4gKiBUaGUgcXVlcmllZCBkaXJlY3RpdmVzIGFyZSBrZXB0IGluIGEgZGVwdGgtZmlyc3QgcHJlLW9yZGVyIHdpdGggcmVzcGVjdCB0byB0aGVpclxuICogcG9zaXRpb25zIGluIHRoZSBET00uXG4gKlxuICogUXVlcnkgZG9lcyBub3QgbG9vayBkZWVwIGludG8gYW55IHN1YmNvbXBvbmVudCB2aWV3cy5cbiAqXG4gKiBRdWVyeSBpcyB1cGRhdGVkIGFzIHBhcnQgb2YgdGhlIGNoYW5nZS1kZXRlY3Rpb24gY3ljbGUuIFNpbmNlIGNoYW5nZSBkZXRlY3Rpb25cbiAqIGhhcHBlbnMgYWZ0ZXIgY29uc3RydWN0aW9uIG9mIGEgZGlyZWN0aXZlLCBRdWVyeUxpc3Qgd2lsbCBhbHdheXMgYmUgZW1wdHkgd2hlbiBvYnNlcnZlZCBpbiB0aGVcbiAqIGNvbnN0cnVjdG9yLlxuICpcbiAqIFRoZSBpbmplY3RlZCBvYmplY3QgaXMgYW4gdW5tb2RpZmlhYmxlIGxpdmUgbGlzdC5cbiAqIFNlZSB7QGxpbmsgUXVlcnlMaXN0fSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIFF1ZXJ5TWV0YWRhdGEgZXh0ZW5kcyBEZXBlbmRlbmN5TWV0YWRhdGEge1xuICAvKipcbiAgICogd2hldGhlciB3ZSB3YW50IHRvIHF1ZXJ5IG9ubHkgZGlyZWN0IGNoaWxkcmVuIChmYWxzZSkgb3IgYWxsXG4gICAqIGNoaWxkcmVuICh0cnVlKS5cbiAgICovXG4gIGRlc2NlbmRhbnRzOiBib29sZWFuO1xuICBmaXJzdDogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zZWxlY3RvcjogVHlwZSB8IHN0cmluZyxcbiAgICAgICAgICAgICAge2Rlc2NlbmRhbnRzID0gZmFsc2UsIGZpcnN0ID0gZmFsc2V9OiB7ZGVzY2VuZGFudHM/OiBib29sZWFuLCBmaXJzdD86IGJvb2xlYW59ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZGVzY2VuZGFudHMgPSBkZXNjZW5kYW50cztcbiAgICB0aGlzLmZpcnN0ID0gZmlyc3Q7XG4gIH1cblxuICAvKipcbiAgICogYWx3YXlzIGBmYWxzZWAgdG8gZGlmZmVyZW50aWF0ZSBpdCB3aXRoIHtAbGluayBWaWV3UXVlcnlNZXRhZGF0YX0uXG4gICAqL1xuICBnZXQgaXNWaWV3UXVlcnkoKTogYm9vbGVhbiB7IHJldHVybiBmYWxzZTsgfVxuXG4gIC8qKlxuICAgKiB3aGF0IHRoaXMgaXMgcXVlcnlpbmcgZm9yLlxuICAgKi9cbiAgZ2V0IHNlbGVjdG9yKCkgeyByZXR1cm4gcmVzb2x2ZUZvcndhcmRSZWYodGhpcy5fc2VsZWN0b3IpOyB9XG5cbiAgLyoqXG4gICAqIHdoZXRoZXIgdGhpcyBpcyBxdWVyeWluZyBmb3IgYSB2YXJpYWJsZSBiaW5kaW5nIG9yIGEgZGlyZWN0aXZlLlxuICAgKi9cbiAgZ2V0IGlzVmFyQmluZGluZ1F1ZXJ5KCk6IGJvb2xlYW4geyByZXR1cm4gaXNTdHJpbmcodGhpcy5zZWxlY3Rvcik7IH1cblxuICAvKipcbiAgICogcmV0dXJucyBhIGxpc3Qgb2YgdmFyaWFibGUgYmluZGluZ3MgdGhpcyBpcyBxdWVyeWluZyBmb3IuXG4gICAqIE9ubHkgYXBwbGljYWJsZSBpZiB0aGlzIGlzIGEgdmFyaWFibGUgYmluZGluZ3MgcXVlcnkuXG4gICAqL1xuICBnZXQgdmFyQmluZGluZ3MoKTogc3RyaW5nW10geyByZXR1cm4gdGhpcy5zZWxlY3Rvci5zcGxpdCgnLCcpOyB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIGBAUXVlcnkoJHtzdHJpbmdpZnkodGhpcy5zZWxlY3Rvcil9KWA7IH1cbn1cblxuLy8gVE9ETzogYWRkIGFuIGV4YW1wbGUgYWZ0ZXIgQ29udGVudENoaWxkcmVuIGFuZCBWaWV3Q2hpbGRyZW4gYXJlIGluIG1hc3RlclxuLyoqXG4gKiBDb25maWd1cmVzIGEgY29udGVudCBxdWVyeS5cbiAqXG4gKiBDb250ZW50IHF1ZXJpZXMgYXJlIHNldCBiZWZvcmUgdGhlIGBuZ0FmdGVyQ29udGVudEluaXRgIGNhbGxiYWNrIGlzIGNhbGxlZC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7XG4gKiAgIHNlbGVjdG9yOiAnc29tZURpcidcbiAqIH0pXG4gKiBjbGFzcyBTb21lRGlyIHtcbiAqICAgQENvbnRlbnRDaGlsZHJlbihDaGlsZERpcmVjdGl2ZSkgY29udGVudENoaWxkcmVuOiBRdWVyeUxpc3Q8Q2hpbGREaXJlY3RpdmU+O1xuICpcbiAqICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICogICAgIC8vIGNvbnRlbnRDaGlsZHJlbiBpcyBzZXRcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgQ29udGVudENoaWxkcmVuTWV0YWRhdGEgZXh0ZW5kcyBRdWVyeU1ldGFkYXRhIHtcbiAgY29uc3RydWN0b3IoX3NlbGVjdG9yOiBUeXBlIHwgc3RyaW5nLCB7ZGVzY2VuZGFudHMgPSBmYWxzZX06IHtkZXNjZW5kYW50cz86IGJvb2xlYW59ID0ge30pIHtcbiAgICBzdXBlcihfc2VsZWN0b3IsIHtkZXNjZW5kYW50czogZGVzY2VuZGFudHN9KTtcbiAgfVxufVxuXG4vLyBUT0RPOiBhZGQgYW4gZXhhbXBsZSBhZnRlciBDb250ZW50Q2hpbGQgYW5kIFZpZXdDaGlsZCBhcmUgaW4gbWFzdGVyXG4vKipcbiAqIENvbmZpZ3VyZXMgYSBjb250ZW50IHF1ZXJ5LlxuICpcbiAqIENvbnRlbnQgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJDb250ZW50SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdzb21lRGlyJ1xuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAQ29udGVudENoaWxkKENoaWxkRGlyZWN0aXZlKSBjb250ZW50Q2hpbGQ7XG4gKlxuICogICBuZ0FmdGVyQ29udGVudEluaXQoKSB7XG4gKiAgICAgLy8gY29udGVudENoaWxkIGlzIHNldFxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBDb250ZW50Q2hpbGRNZXRhZGF0YSBleHRlbmRzIFF1ZXJ5TWV0YWRhdGEge1xuICBjb25zdHJ1Y3Rvcihfc2VsZWN0b3I6IFR5cGUgfCBzdHJpbmcpIHsgc3VwZXIoX3NlbGVjdG9yLCB7ZGVzY2VuZGFudHM6IHRydWUsIGZpcnN0OiB0cnVlfSk7IH1cbn1cblxuLyoqXG4gKiBTaW1pbGFyIHRvIHtAbGluayBRdWVyeU1ldGFkYXRhfSwgYnV0IHF1ZXJ5aW5nIHRoZSBjb21wb25lbnQgdmlldywgaW5zdGVhZCBvZlxuICogdGhlIGNvbnRlbnQgY2hpbGRyZW4uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2VOc0ZIRGY3WWp5TTZJekt4TTFqP3A9cHJldmlldykpXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogQENvbXBvbmVudCh7Li4ufSlcbiAqIEBWaWV3KHtcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8aXRlbT4gYSA8L2l0ZW0+XG4gKiAgICAgPGl0ZW0+IGIgPC9pdGVtPlxuICogICAgIDxpdGVtPiBjIDwvaXRlbT5cbiAqICAgYFxuICogfSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgc2hvd246IGJvb2xlYW47XG4gKlxuICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIEBRdWVyeShJdGVtKSBpdGVtczpRdWVyeUxpc3Q8SXRlbT4pIHtcbiAqICAgICBpdGVtcy5vbkNoYW5nZSgoKSA9PiBjb25zb2xlLmxvZyhpdGVtcy5sZW5ndGgpKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogU3VwcG9ydHMgdGhlIHNhbWUgcXVlcnlpbmcgcGFyYW1ldGVycyBhcyB7QGxpbmsgUXVlcnlNZXRhZGF0YX0sIGV4Y2VwdFxuICogYGRlc2NlbmRhbnRzYC4gVGhpcyBhbHdheXMgcXVlcmllcyB0aGUgd2hvbGUgdmlldy5cbiAqXG4gKiBBcyBgc2hvd25gIGlzIGZsaXBwZWQgYmV0d2VlbiB0cnVlIGFuZCBmYWxzZSwgaXRlbXMgd2lsbCBjb250YWluIHplcm8gb2Ygb25lXG4gKiBpdGVtcy5cbiAqXG4gKiBTcGVjaWZpZXMgdGhhdCBhIHtAbGluayBRdWVyeUxpc3R9IHNob3VsZCBiZSBpbmplY3RlZC5cbiAqXG4gKiBUaGUgaW5qZWN0ZWQgb2JqZWN0IGlzIGFuIGl0ZXJhYmxlIGFuZCBvYnNlcnZhYmxlIGxpdmUgbGlzdC5cbiAqIFNlZSB7QGxpbmsgUXVlcnlMaXN0fSBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIFZpZXdRdWVyeU1ldGFkYXRhIGV4dGVuZHMgUXVlcnlNZXRhZGF0YSB7XG4gIGNvbnN0cnVjdG9yKF9zZWxlY3RvcjogVHlwZSB8IHN0cmluZyxcbiAgICAgICAgICAgICAge2Rlc2NlbmRhbnRzID0gZmFsc2UsIGZpcnN0ID0gZmFsc2V9OiB7ZGVzY2VuZGFudHM/OiBib29sZWFuLCBmaXJzdD86IGJvb2xlYW59ID0ge30pIHtcbiAgICBzdXBlcihfc2VsZWN0b3IsIHtkZXNjZW5kYW50czogZGVzY2VuZGFudHMsIGZpcnN0OiBmaXJzdH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIGFsd2F5cyBgdHJ1ZWAgdG8gZGlmZmVyZW50aWF0ZSBpdCB3aXRoIHtAbGluayBRdWVyeU1ldGFkYXRhfS5cbiAgICovXG4gIGdldCBpc1ZpZXdRdWVyeSgpIHsgcmV0dXJuIHRydWU7IH1cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIGBAVmlld1F1ZXJ5KCR7c3RyaW5naWZ5KHRoaXMuc2VsZWN0b3IpfSlgOyB9XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBhIHZpZXcgcXVlcnkuXG4gKlxuICogVmlldyBxdWVyaWVzIGFyZSBzZXQgYmVmb3JlIHRoZSBgbmdBZnRlclZpZXdJbml0YCBjYWxsYmFjayBpcyBjYWxsZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ3NvbWVEaXInLFxuICogICB0ZW1wbGF0ZVVybDogJ3NvbWVUZW1wbGF0ZScsXG4gKiAgIGRpcmVjdGl2ZXM6IFtJdGVtRGlyZWN0aXZlXVxuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAVmlld0NoaWxkcmVuKEl0ZW1EaXJlY3RpdmUpIHZpZXdDaGlsZHJlbjogUXVlcnlMaXN0PEl0ZW1EaXJlY3RpdmU+O1xuICpcbiAqICAgbmdBZnRlclZpZXdJbml0KCkge1xuICogICAgIC8vIHZpZXdDaGlsZHJlbiBpcyBzZXRcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgVmlld0NoaWxkcmVuTWV0YWRhdGEgZXh0ZW5kcyBWaWV3UXVlcnlNZXRhZGF0YSB7XG4gIGNvbnN0cnVjdG9yKF9zZWxlY3RvcjogVHlwZSB8IHN0cmluZykgeyBzdXBlcihfc2VsZWN0b3IsIHtkZXNjZW5kYW50czogdHJ1ZX0pOyB9XG59XG5cbi8qKlxuICogQ29uZmlndXJlcyBhIHZpZXcgcXVlcnkuXG4gKlxuICogVmlldyBxdWVyaWVzIGFyZSBzZXQgYmVmb3JlIHRoZSBgbmdBZnRlclZpZXdJbml0YCBjYWxsYmFjayBpcyBjYWxsZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ3NvbWVEaXInLFxuICogICB0ZW1wbGF0ZVVybDogJ3NvbWVUZW1wbGF0ZScsXG4gKiAgIGRpcmVjdGl2ZXM6IFtJdGVtRGlyZWN0aXZlXVxuICogfSlcbiAqIGNsYXNzIFNvbWVEaXIge1xuICogICBAVmlld0NoaWxkKEl0ZW1EaXJlY3RpdmUpIHZpZXdDaGlsZDpJdGVtRGlyZWN0aXZlO1xuICpcbiAqICAgbmdBZnRlclZpZXdJbml0KCkge1xuICogICAgIC8vIHZpZXdDaGlsZCBpcyBzZXRcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgVmlld0NoaWxkTWV0YWRhdGEgZXh0ZW5kcyBWaWV3UXVlcnlNZXRhZGF0YSB7XG4gIGNvbnN0cnVjdG9yKF9zZWxlY3RvcjogVHlwZSB8IHN0cmluZykgeyBzdXBlcihfc2VsZWN0b3IsIHtkZXNjZW5kYW50czogdHJ1ZSwgZmlyc3Q6IHRydWV9KTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEvZGkudHNcbiAqKi8iLCIvLyBUT0RPKGp0ZXBsaXR6NjAyKTogTG9hZCBXb3JrZXJHbG9iYWxTY29wZSBmcm9tIGxpYi53ZWJ3b3JrZXIuZC50cyBmaWxlICMzNDkyXG5kZWNsYXJlIHZhciBXb3JrZXJHbG9iYWxTY29wZTtcbnZhciBnbG9iYWxTY29wZTogQnJvd3Nlck5vZGVHbG9iYWw7XG5pZiAodHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgaWYgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZiBpbnN0YW5jZW9mIFdvcmtlckdsb2JhbFNjb3BlKSB7XG4gICAgLy8gVE9ETzogUmVwbGFjZSBhbnkgd2l0aCBXb3JrZXJHbG9iYWxTY29wZSBmcm9tIGxpYi53ZWJ3b3JrZXIuZC50cyAjMzQ5MlxuICAgIGdsb2JhbFNjb3BlID0gPGFueT5zZWxmO1xuICB9IGVsc2Uge1xuICAgIGdsb2JhbFNjb3BlID0gPGFueT5nbG9iYWw7XG4gIH1cbn0gZWxzZSB7XG4gIGdsb2JhbFNjb3BlID0gPGFueT53aW5kb3c7XG59O1xuXG5leHBvcnQgY29uc3QgSVNfREFSVCA9IGZhbHNlO1xuXG4vLyBOZWVkIHRvIGRlY2xhcmUgYSBuZXcgdmFyaWFibGUgZm9yIGdsb2JhbCBoZXJlIHNpbmNlIFR5cGVTY3JpcHRcbi8vIGV4cG9ydHMgdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBzeW1ib2wuXG52YXIgX2dsb2JhbDogQnJvd3Nlck5vZGVHbG9iYWwgPSBnbG9iYWxTY29wZTtcblxuZXhwb3J0IHtfZ2xvYmFsIGFzIGdsb2JhbH07XG5cbmV4cG9ydCB2YXIgVHlwZSA9IEZ1bmN0aW9uO1xuXG4vKipcbiAqIFJ1bnRpbWUgcmVwcmVzZW50YXRpb24gYSB0eXBlIHRoYXQgYSBDb21wb25lbnQgb3Igb3RoZXIgb2JqZWN0IGlzIGluc3RhbmNlcyBvZi5cbiAqXG4gKiBBbiBleGFtcGxlIG9mIGEgYFR5cGVgIGlzIGBNeUN1c3RvbUNvbXBvbmVudGAgY2xhc3MsIHdoaWNoIGluIEphdmFTY3JpcHQgaXMgYmUgcmVwcmVzZW50ZWQgYnlcbiAqIHRoZSBgTXlDdXN0b21Db21wb25lbnRgIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFR5cGUgZXh0ZW5kcyBGdW5jdGlvbiB7fVxuXG4vKipcbiAqIFJ1bnRpbWUgcmVwcmVzZW50YXRpb24gb2YgYSB0eXBlIHRoYXQgaXMgY29uc3RydWN0YWJsZSAobm9uLWFic3RyYWN0KS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25jcmV0ZVR5cGUgZXh0ZW5kcyBUeXBlIHsgbmV3ICguLi5hcmdzKTogYW55OyB9XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUeXBlTmFtZUZvckRlYnVnZ2luZyh0eXBlOiBUeXBlKTogc3RyaW5nIHtcbiAgcmV0dXJuIHR5cGVbJ25hbWUnXTtcbn1cblxuXG5leHBvcnQgdmFyIE1hdGggPSBfZ2xvYmFsLk1hdGg7XG5leHBvcnQgdmFyIERhdGUgPSBfZ2xvYmFsLkRhdGU7XG5cbnZhciBfZGV2TW9kZTogYm9vbGVhbiA9IHRydWU7XG52YXIgX21vZGVMb2NrZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGxvY2tNb2RlKCkge1xuICBfbW9kZUxvY2tlZCA9IHRydWU7XG59XG5cbi8qKlxuICogRGlzYWJsZSBBbmd1bGFyJ3MgZGV2ZWxvcG1lbnQgbW9kZSwgd2hpY2ggdHVybnMgb2ZmIGFzc2VydGlvbnMgYW5kIG90aGVyXG4gKiBjaGVja3Mgd2l0aGluIHRoZSBmcmFtZXdvcmsuXG4gKlxuICogT25lIGltcG9ydGFudCBhc3NlcnRpb24gdGhpcyBkaXNhYmxlcyB2ZXJpZmllcyB0aGF0IGEgY2hhbmdlIGRldGVjdGlvbiBwYXNzXG4gKiBkb2VzIG5vdCByZXN1bHQgaW4gYWRkaXRpb25hbCBjaGFuZ2VzIHRvIGFueSBiaW5kaW5ncyAoYWxzbyBrbm93biBhc1xuICogdW5pZGlyZWN0aW9uYWwgZGF0YSBmbG93KS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVuYWJsZVByb2RNb2RlKCkge1xuICBpZiAoX21vZGVMb2NrZWQpIHtcbiAgICAvLyBDYW5ub3QgdXNlIEJhc2VFeGNlcHRpb24gYXMgdGhhdCBlbmRzIHVwIGltcG9ydGluZyBmcm9tIGZhY2FkZS9sYW5nLlxuICAgIHRocm93ICdDYW5ub3QgZW5hYmxlIHByb2QgbW9kZSBhZnRlciBwbGF0Zm9ybSBzZXR1cC4nO1xuICB9XG4gIF9kZXZNb2RlID0gZmFsc2U7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRpb25zRW5hYmxlZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIF9kZXZNb2RlO1xufVxuXG4vLyBUT0RPOiByZW1vdmUgY2FsbHMgdG8gYXNzZXJ0IGluIHByb2R1Y3Rpb24gZW52aXJvbm1lbnRcbi8vIE5vdGU6IENhbid0IGp1c3QgZXhwb3J0IHRoaXMgYW5kIGltcG9ydCBpbiBpbiBvdGhlciBmaWxlc1xuLy8gYXMgYGFzc2VydGAgaXMgYSByZXNlcnZlZCBrZXl3b3JkIGluIERhcnRcbl9nbG9iYWwuYXNzZXJ0ID0gZnVuY3Rpb24gYXNzZXJ0KGNvbmRpdGlvbikge1xuICAvLyBUT0RPOiB0byBiZSBmaXhlZCBwcm9wZXJseSB2aWEgIzI4MzAsIG5vb3AgZm9yIG5vd1xufTtcblxuLy8gVGhpcyBmdW5jdGlvbiBpcyBuZWVkZWQgb25seSB0byBwcm9wZXJseSBzdXBwb3J0IERhcnQncyBjb25zdCBleHByZXNzaW9uc1xuLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3RzMmRhcnQvcHVsbC8xNTEgZm9yIG1vcmUgaW5mb1xuZXhwb3J0IGZ1bmN0aW9uIENPTlNUX0VYUFI8VD4oZXhwcjogVCk6IFQge1xuICByZXR1cm4gZXhwcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIENPTlNUKCk6IENsYXNzRGVjb3JhdG9yICYgUHJvcGVydHlEZWNvcmF0b3Ige1xuICByZXR1cm4gKHRhcmdldCkgPT4gdGFyZ2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcmVzZW50KG9iajogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogIT09IHVuZGVmaW5lZCAmJiBvYmogIT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0JsYW5rKG9iajogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogPT09IHVuZGVmaW5lZCB8fCBvYmogPT09IG51bGw7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1N0cmluZyhvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJzdHJpbmdcIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24ob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09IFwiZnVuY3Rpb25cIjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVHlwZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNGdW5jdGlvbihvYmopO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTdHJpbmdNYXAob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdvYmplY3QnICYmIG9iaiAhPT0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvbWlzZShvYmo6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gb2JqIGluc3RhbmNlb2YgKDxhbnk+X2dsb2JhbCkuUHJvbWlzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXkob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzTnVtYmVyKG9iaik6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIG9iaiA9PT0gJ251bWJlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGUob2JqKTogYm9vbGVhbiB7XG4gIHJldHVybiBvYmogaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTihvYmoudmFsdWVPZigpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vb3AoKSB7fVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5KHRva2VuKTogc3RyaW5nIHtcbiAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBpZiAodG9rZW4gPT09IHVuZGVmaW5lZCB8fCB0b2tlbiA9PT0gbnVsbCkge1xuICAgIHJldHVybiAnJyArIHRva2VuO1xuICB9XG5cbiAgaWYgKHRva2VuLm5hbWUpIHtcbiAgICByZXR1cm4gdG9rZW4ubmFtZTtcbiAgfVxuXG4gIHZhciByZXMgPSB0b2tlbi50b1N0cmluZygpO1xuICB2YXIgbmV3TGluZUluZGV4ID0gcmVzLmluZGV4T2YoXCJcXG5cIik7XG4gIHJldHVybiAobmV3TGluZUluZGV4ID09PSAtMSkgPyByZXMgOiByZXMuc3Vic3RyaW5nKDAsIG5ld0xpbmVJbmRleCk7XG59XG5cbi8vIHNlcmlhbGl6ZSAvIGRlc2VyaWFsaXplIGVudW0gZXhpc3Qgb25seSBmb3IgY29uc2lzdGVuY3kgd2l0aCBkYXJ0IEFQSVxuLy8gZW51bXMgaW4gdHlwZXNjcmlwdCBkb24ndCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWRcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUVudW0odmFsKTogbnVtYmVyIHtcbiAgcmV0dXJuIHZhbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplRW51bSh2YWwsIHZhbHVlczogTWFwPG51bWJlciwgYW55Pik6IGFueSB7XG4gIHJldHVybiB2YWw7XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJpbmdXcmFwcGVyIHtcbiAgc3RhdGljIGZyb21DaGFyQ29kZShjb2RlOiBudW1iZXIpOiBzdHJpbmcgeyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKTsgfVxuXG4gIHN0YXRpYyBjaGFyQ29kZUF0KHM6IHN0cmluZywgaW5kZXg6IG51bWJlcik6IG51bWJlciB7IHJldHVybiBzLmNoYXJDb2RlQXQoaW5kZXgpOyB9XG5cbiAgc3RhdGljIHNwbGl0KHM6IHN0cmluZywgcmVnRXhwOiBSZWdFeHApOiBzdHJpbmdbXSB7IHJldHVybiBzLnNwbGl0KHJlZ0V4cCk7IH1cblxuICBzdGF0aWMgZXF1YWxzKHM6IHN0cmluZywgczI6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gcyA9PT0gczI7IH1cblxuICBzdGF0aWMgc3RyaXBMZWZ0KHM6IHN0cmluZywgY2hhclZhbDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAocyAmJiBzLmxlbmd0aCkge1xuICAgICAgdmFyIHBvcyA9IDA7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHNbaV0gIT0gY2hhclZhbCkgYnJlYWs7XG4gICAgICAgIHBvcysrO1xuICAgICAgfVxuICAgICAgcyA9IHMuc3Vic3RyaW5nKHBvcyk7XG4gICAgfVxuICAgIHJldHVybiBzO1xuICB9XG5cbiAgc3RhdGljIHN0cmlwUmlnaHQoczogc3RyaW5nLCBjaGFyVmFsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzICYmIHMubGVuZ3RoKSB7XG4gICAgICB2YXIgcG9zID0gcy5sZW5ndGg7XG4gICAgICBmb3IgKHZhciBpID0gcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICBpZiAoc1tpXSAhPSBjaGFyVmFsKSBicmVhaztcbiAgICAgICAgcG9zLS07XG4gICAgICB9XG4gICAgICBzID0gcy5zdWJzdHJpbmcoMCwgcG9zKTtcbiAgICB9XG4gICAgcmV0dXJuIHM7XG4gIH1cblxuICBzdGF0aWMgcmVwbGFjZShzOiBzdHJpbmcsIGZyb206IHN0cmluZywgcmVwbGFjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcy5yZXBsYWNlKGZyb20sIHJlcGxhY2UpO1xuICB9XG5cbiAgc3RhdGljIHJlcGxhY2VBbGwoczogc3RyaW5nLCBmcm9tOiBSZWdFeHAsIHJlcGxhY2U6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHMucmVwbGFjZShmcm9tLCByZXBsYWNlKTtcbiAgfVxuXG4gIHN0YXRpYyBzbGljZTxUPihzOiBzdHJpbmcsIGZyb206IG51bWJlciA9IDAsIHRvOiBudW1iZXIgPSBudWxsKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcy5zbGljZShmcm9tLCB0byA9PT0gbnVsbCA/IHVuZGVmaW5lZCA6IHRvKTtcbiAgfVxuXG4gIHN0YXRpYyByZXBsYWNlQWxsTWFwcGVkKHM6IHN0cmluZywgZnJvbTogUmVnRXhwLCBjYjogRnVuY3Rpb24pOiBzdHJpbmcge1xuICAgIHJldHVybiBzLnJlcGxhY2UoZnJvbSwgZnVuY3Rpb24oLi4ubWF0Y2hlcykge1xuICAgICAgLy8gUmVtb3ZlIG9mZnNldCAmIHN0cmluZyBmcm9tIHRoZSByZXN1bHQgYXJyYXlcbiAgICAgIG1hdGNoZXMuc3BsaWNlKC0yLCAyKTtcbiAgICAgIC8vIFRoZSBjYWxsYmFjayByZWNlaXZlcyBtYXRjaCwgcDEsIC4uLiwgcG5cbiAgICAgIHJldHVybiBjYihtYXRjaGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHN0YXRpYyBjb250YWlucyhzOiBzdHJpbmcsIHN1YnN0cjogc3RyaW5nKTogYm9vbGVhbiB7IHJldHVybiBzLmluZGV4T2Yoc3Vic3RyKSAhPSAtMTsgfVxuXG4gIHN0YXRpYyBjb21wYXJlKGE6IHN0cmluZywgYjogc3RyaW5nKTogbnVtYmVyIHtcbiAgICBpZiAoYSA8IGIpIHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9IGVsc2UgaWYgKGEgPiBiKSB7XG4gICAgICByZXR1cm4gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTdHJpbmdKb2luZXIge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFydHMgPSBbXSkge31cblxuICBhZGQocGFydDogc3RyaW5nKTogdm9pZCB7IHRoaXMucGFydHMucHVzaChwYXJ0KTsgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLnBhcnRzLmpvaW4oXCJcIik7IH1cbn1cblxuZXhwb3J0IGNsYXNzIE51bWJlclBhcnNlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIG5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZTogc3RyaW5nKSB7IHN1cGVyKCk7IH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5tZXNzYWdlOyB9XG59XG5cblxuZXhwb3J0IGNsYXNzIE51bWJlcldyYXBwZXIge1xuICBzdGF0aWMgdG9GaXhlZChuOiBudW1iZXIsIGZyYWN0aW9uRGlnaXRzOiBudW1iZXIpOiBzdHJpbmcgeyByZXR1cm4gbi50b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKTsgfVxuXG4gIHN0YXRpYyBlcXVhbChhOiBudW1iZXIsIGI6IG51bWJlcik6IGJvb2xlYW4geyByZXR1cm4gYSA9PT0gYjsgfVxuXG4gIHN0YXRpYyBwYXJzZUludEF1dG9SYWRpeCh0ZXh0OiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHZhciByZXN1bHQ6IG51bWJlciA9IHBhcnNlSW50KHRleHQpO1xuICAgIGlmIChpc05hTihyZXN1bHQpKSB7XG4gICAgICB0aHJvdyBuZXcgTnVtYmVyUGFyc2VFcnJvcihcIkludmFsaWQgaW50ZWdlciBsaXRlcmFsIHdoZW4gcGFyc2luZyBcIiArIHRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgc3RhdGljIHBhcnNlSW50KHRleHQ6IHN0cmluZywgcmFkaXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHJhZGl4ID09IDEwKSB7XG4gICAgICBpZiAoL14oXFwtfFxcKyk/WzAtOV0rJC8udGVzdCh0ZXh0KSkge1xuICAgICAgICByZXR1cm4gcGFyc2VJbnQodGV4dCwgcmFkaXgpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocmFkaXggPT0gMTYpIHtcbiAgICAgIGlmICgvXihcXC18XFwrKT9bMC05QUJDREVGYWJjZGVmXSskLy50ZXN0KHRleHQpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZUludCh0ZXh0LCByYWRpeCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByZXN1bHQ6IG51bWJlciA9IHBhcnNlSW50KHRleHQsIHJhZGl4KTtcbiAgICAgIGlmICghaXNOYU4ocmVzdWx0KSkge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgTnVtYmVyUGFyc2VFcnJvcihcIkludmFsaWQgaW50ZWdlciBsaXRlcmFsIHdoZW4gcGFyc2luZyBcIiArIHRleHQgKyBcIiBpbiBiYXNlIFwiICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYWRpeCk7XG4gIH1cblxuICAvLyBUT0RPOiBOYU4gaXMgYSB2YWxpZCBsaXRlcmFsIGJ1dCBpcyByZXR1cm5lZCBieSBwYXJzZUZsb2F0IHRvIGluZGljYXRlIGFuIGVycm9yLlxuICBzdGF0aWMgcGFyc2VGbG9hdCh0ZXh0OiBzdHJpbmcpOiBudW1iZXIgeyByZXR1cm4gcGFyc2VGbG9hdCh0ZXh0KTsgfVxuXG4gIHN0YXRpYyBnZXQgTmFOKCk6IG51bWJlciB7IHJldHVybiBOYU47IH1cblxuICBzdGF0aWMgaXNOYU4odmFsdWU6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gaXNOYU4odmFsdWUpOyB9XG5cbiAgc3RhdGljIGlzSW50ZWdlcih2YWx1ZTogYW55KTogYm9vbGVhbiB7IHJldHVybiBOdW1iZXIuaXNJbnRlZ2VyKHZhbHVlKTsgfVxufVxuXG5leHBvcnQgdmFyIFJlZ0V4cCA9IF9nbG9iYWwuUmVnRXhwO1xuXG5leHBvcnQgY2xhc3MgUmVnRXhwV3JhcHBlciB7XG4gIHN0YXRpYyBjcmVhdGUocmVnRXhwU3RyOiBzdHJpbmcsIGZsYWdzOiBzdHJpbmcgPSAnJyk6IFJlZ0V4cCB7XG4gICAgZmxhZ3MgPSBmbGFncy5yZXBsYWNlKC9nL2csICcnKTtcbiAgICByZXR1cm4gbmV3IF9nbG9iYWwuUmVnRXhwKHJlZ0V4cFN0ciwgZmxhZ3MgKyAnZycpO1xuICB9XG4gIHN0YXRpYyBmaXJzdE1hdGNoKHJlZ0V4cDogUmVnRXhwLCBpbnB1dDogc3RyaW5nKTogUmVnRXhwRXhlY0FycmF5IHtcbiAgICAvLyBSZXNldCBtdWx0aW1hdGNoIHJlZ2V4IHN0YXRlXG4gICAgcmVnRXhwLmxhc3RJbmRleCA9IDA7XG4gICAgcmV0dXJuIHJlZ0V4cC5leGVjKGlucHV0KTtcbiAgfVxuICBzdGF0aWMgdGVzdChyZWdFeHA6IFJlZ0V4cCwgaW5wdXQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJlZ0V4cC5sYXN0SW5kZXggPSAwO1xuICAgIHJldHVybiByZWdFeHAudGVzdChpbnB1dCk7XG4gIH1cbiAgc3RhdGljIG1hdGNoZXIocmVnRXhwOiBSZWdFeHAsIGlucHV0OiBzdHJpbmcpOiB7XG4gICAgcmU6IFJlZ0V4cDtcbiAgICBpbnB1dDogc3RyaW5nXG4gIH1cbiAge1xuICAgIC8vIFJlc2V0IHJlZ2V4IHN0YXRlIGZvciB0aGUgY2FzZVxuICAgIC8vIHNvbWVvbmUgZGlkIG5vdCBsb29wIG92ZXIgYWxsIG1hdGNoZXNcbiAgICAvLyBsYXN0IHRpbWUuXG4gICAgcmVnRXhwLmxhc3RJbmRleCA9IDA7XG4gICAgcmV0dXJuIHtyZTogcmVnRXhwLCBpbnB1dDogaW5wdXR9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWdFeHBNYXRjaGVyV3JhcHBlciB7XG4gIHN0YXRpYyBuZXh0KG1hdGNoZXI6IHtcbiAgICByZTogUmVnRXhwO1xuICAgIGlucHV0OiBzdHJpbmdcbiAgfSk6IFJlZ0V4cEV4ZWNBcnJheSB7XG4gICAgcmV0dXJuIG1hdGNoZXIucmUuZXhlYyhtYXRjaGVyLmlucHV0KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25XcmFwcGVyIHtcbiAgc3RhdGljIGFwcGx5KGZuOiBGdW5jdGlvbiwgcG9zQXJnczogYW55KTogYW55IHsgcmV0dXJuIGZuLmFwcGx5KG51bGwsIHBvc0FyZ3MpOyB9XG59XG5cbi8vIEpTIGhhcyBOYU4gIT09IE5hTlxuZXhwb3J0IGZ1bmN0aW9uIGxvb3NlSWRlbnRpY2FsKGEsIGIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGEgPT09IGIgfHwgdHlwZW9mIGEgPT09IFwibnVtYmVyXCIgJiYgdHlwZW9mIGIgPT09IFwibnVtYmVyXCIgJiYgaXNOYU4oYSkgJiYgaXNOYU4oYik7XG59XG5cbi8vIEpTIGNvbnNpZGVycyBOYU4gaXMgdGhlIHNhbWUgYXMgTmFOIGZvciBtYXAgS2V5ICh3aGlsZSBOYU4gIT09IE5hTiBvdGhlcndpc2UpXG4vLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWFwXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwS2V5PFQ+KHZhbHVlOiBUKTogVCB7XG4gIHJldHVybiB2YWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUJsYW5rKG9iajogT2JqZWN0KTogYW55IHtcbiAgcmV0dXJuIGlzQmxhbmsob2JqKSA/IG51bGwgOiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCb29sKG9iajogYm9vbGVhbik6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNCbGFuayhvYmopID8gZmFsc2UgOiBvYmo7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0pzT2JqZWN0KG86IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gbyAhPT0gbnVsbCAmJiAodHlwZW9mIG8gPT09IFwiZnVuY3Rpb25cIiB8fCB0eXBlb2YgbyA9PT0gXCJvYmplY3RcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmludChvYmo6IEVycm9yIHwgT2JqZWN0KSB7XG4gIGNvbnNvbGUubG9nKG9iaik7XG59XG5cbi8vIENhbid0IGJlIGFsbCB1cHBlcmNhc2UgYXMgb3VyIHRyYW5zcGlsZXIgd291bGQgdGhpbmsgaXQgaXMgYSBzcGVjaWFsIGRpcmVjdGl2ZS4uLlxuZXhwb3J0IGNsYXNzIEpzb24ge1xuICBzdGF0aWMgcGFyc2Uoczogc3RyaW5nKTogT2JqZWN0IHsgcmV0dXJuIF9nbG9iYWwuSlNPTi5wYXJzZShzKTsgfVxuICBzdGF0aWMgc3RyaW5naWZ5KGRhdGE6IE9iamVjdCk6IHN0cmluZyB7XG4gICAgLy8gRGFydCBkb2Vzbid0IHRha2UgMyBhcmd1bWVudHNcbiAgICByZXR1cm4gX2dsb2JhbC5KU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGF0ZVdyYXBwZXIge1xuICBzdGF0aWMgY3JlYXRlKHllYXI6IG51bWJlciwgbW9udGg6IG51bWJlciA9IDEsIGRheTogbnVtYmVyID0gMSwgaG91cjogbnVtYmVyID0gMCxcbiAgICAgICAgICAgICAgICBtaW51dGVzOiBudW1iZXIgPSAwLCBzZWNvbmRzOiBudW1iZXIgPSAwLCBtaWxsaXNlY29uZHM6IG51bWJlciA9IDApOiBEYXRlIHtcbiAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGggLSAxLCBkYXksIGhvdXIsIG1pbnV0ZXMsIHNlY29uZHMsIG1pbGxpc2Vjb25kcyk7XG4gIH1cbiAgc3RhdGljIGZyb21JU09TdHJpbmcoc3RyOiBzdHJpbmcpOiBEYXRlIHsgcmV0dXJuIG5ldyBEYXRlKHN0cik7IH1cbiAgc3RhdGljIGZyb21NaWxsaXMobXM6IG51bWJlcik6IERhdGUgeyByZXR1cm4gbmV3IERhdGUobXMpOyB9XG4gIHN0YXRpYyB0b01pbGxpcyhkYXRlOiBEYXRlKTogbnVtYmVyIHsgcmV0dXJuIGRhdGUuZ2V0VGltZSgpOyB9XG4gIHN0YXRpYyBub3coKTogRGF0ZSB7IHJldHVybiBuZXcgRGF0ZSgpOyB9XG4gIHN0YXRpYyB0b0pzb24oZGF0ZTogRGF0ZSk6IHN0cmluZyB7IHJldHVybiBkYXRlLnRvSlNPTigpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRWYWx1ZU9uUGF0aChnbG9iYWw6IGFueSwgcGF0aDogc3RyaW5nLCB2YWx1ZTogYW55KSB7XG4gIHZhciBwYXJ0cyA9IHBhdGguc3BsaXQoJy4nKTtcbiAgdmFyIG9iajogYW55ID0gZ2xvYmFsO1xuICB3aGlsZSAocGFydHMubGVuZ3RoID4gMSkge1xuICAgIHZhciBuYW1lID0gcGFydHMuc2hpZnQoKTtcbiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KG5hbWUpICYmIGlzUHJlc2VudChvYmpbbmFtZV0pKSB7XG4gICAgICBvYmogPSBvYmpbbmFtZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG9iaiA9IG9ialtuYW1lXSA9IHt9O1xuICAgIH1cbiAgfVxuICBpZiAob2JqID09PSB1bmRlZmluZWQgfHwgb2JqID09PSBudWxsKSB7XG4gICAgb2JqID0ge307XG4gIH1cbiAgb2JqW3BhcnRzLnNoaWZ0KCldID0gdmFsdWU7XG59XG5cbi8vIFdoZW4gU3ltYm9sLml0ZXJhdG9yIGRvZXNuJ3QgZXhpc3QsIHJldHJpZXZlcyB0aGUga2V5IHVzZWQgaW4gZXM2LXNoaW1cbmRlY2xhcmUgdmFyIFN5bWJvbDtcbnZhciBfc3ltYm9sSXRlcmF0b3IgPSBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIGdldFN5bWJvbEl0ZXJhdG9yKCk6IHN0cmluZyB8IHN5bWJvbCB7XG4gIGlmIChpc0JsYW5rKF9zeW1ib2xJdGVyYXRvcikpIHtcbiAgICBpZiAoaXNQcmVzZW50KFN5bWJvbCkgJiYgaXNQcmVzZW50KFN5bWJvbC5pdGVyYXRvcikpIHtcbiAgICAgIF9zeW1ib2xJdGVyYXRvciA9IFN5bWJvbC5pdGVyYXRvcjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZXM2LXNoaW0gc3BlY2lmaWMgbG9naWNcbiAgICAgIHZhciBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTWFwLnByb3RvdHlwZSk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgIGlmIChrZXkgIT09ICdlbnRyaWVzJyAmJiBrZXkgIT09ICdzaXplJyAmJlxuICAgICAgICAgICAgTWFwLnByb3RvdHlwZVtrZXldID09PSBNYXAucHJvdG90eXBlWydlbnRyaWVzJ10pIHtcbiAgICAgICAgICBfc3ltYm9sSXRlcmF0b3IgPSBrZXk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIF9zeW1ib2xJdGVyYXRvcjtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZy50c1xuICoqLyIsIi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgYGRpYCBtb2R1bGUgcHJvdmlkZXMgZGVwZW5kZW5jeSBpbmplY3Rpb24gY29udGFpbmVyIHNlcnZpY2VzLlxuICovXG5cbmV4cG9ydCB7XG4gIEluamVjdE1ldGFkYXRhLFxuICBPcHRpb25hbE1ldGFkYXRhLFxuICBJbmplY3RhYmxlTWV0YWRhdGEsXG4gIFNlbGZNZXRhZGF0YSxcbiAgSG9zdE1ldGFkYXRhLFxuICBTa2lwU2VsZk1ldGFkYXRhLFxuICBEZXBlbmRlbmN5TWV0YWRhdGFcbn0gZnJvbSAnLi9kaS9tZXRhZGF0YSc7XG5cbi8vIHdlIGhhdmUgdG8gcmVleHBvcnQgKiBiZWNhdXNlIERhcnQgYW5kIFRTIGV4cG9ydCB0d28gZGlmZmVyZW50IHNldHMgb2YgdHlwZXNcbmV4cG9ydCAqIGZyb20gJy4vZGkvZGVjb3JhdG9ycyc7XG5cbmV4cG9ydCB7Zm9yd2FyZFJlZiwgcmVzb2x2ZUZvcndhcmRSZWYsIEZvcndhcmRSZWZGbn0gZnJvbSAnLi9kaS9mb3J3YXJkX3JlZic7XG5leHBvcnQge0luamVjdG9yfSBmcm9tICcuL2RpL2luamVjdG9yJztcbmV4cG9ydCB7XG4gIEJpbmRpbmcsXG4gIFByb3ZpZGVyQnVpbGRlcixcbiAgUmVzb2x2ZWRCaW5kaW5nLFxuICBSZXNvbHZlZEZhY3RvcnksXG4gIERlcGVuZGVuY3ksXG4gIGJpbmQsXG5cbiAgUHJvdmlkZXIsXG4gIFJlc29sdmVkUHJvdmlkZXIsXG4gIHByb3ZpZGVcbn0gZnJvbSAnLi9kaS9wcm92aWRlcic7XG5leHBvcnQge0tleSwgVHlwZUxpdGVyYWx9IGZyb20gJy4vZGkva2V5JztcbmV4cG9ydCB7XG4gIE5vUHJvdmlkZXJFcnJvcixcbiAgQWJzdHJhY3RQcm92aWRlckVycm9yLFxuICBDeWNsaWNEZXBlbmRlbmN5RXJyb3IsXG4gIEluc3RhbnRpYXRpb25FcnJvcixcbiAgSW52YWxpZFByb3ZpZGVyRXJyb3IsXG4gIE5vQW5ub3RhdGlvbkVycm9yLFxuICBPdXRPZkJvdW5kc0Vycm9yXG59IGZyb20gJy4vZGkvZXhjZXB0aW9ucyc7XG5leHBvcnQge09wYXF1ZVRva2VufSBmcm9tICcuL2RpL29wYXF1ZV90b2tlbic7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS50c1xuICoqLyIsImltcG9ydCB7Q09OU1QsIENPTlNUX0VYUFIsIHN0cmluZ2lmeSwgaXNCbGFuaywgaXNQcmVzZW50fSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nXCI7XG5cbi8qKlxuICogQSBwYXJhbWV0ZXIgbWV0YWRhdGEgdGhhdCBzcGVjaWZpZXMgYSBkZXBlbmRlbmN5LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC82dUhZSks/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBFbmdpbmUge31cbiAqXG4gKiBASW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBDYXIge1xuICogICBlbmdpbmU7XG4gKiAgIGNvbnN0cnVjdG9yKEBJbmplY3QoXCJNeUVuZ2luZVwiKSBlbmdpbmU6RW5naW5lKSB7XG4gKiAgICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICBwcm92aWRlKFwiTXlFbmdpbmVcIiwge3VzZUNsYXNzOiBFbmdpbmV9KSxcbiAqICBDYXJcbiAqIF0pO1xuICpcbiAqIGV4cGVjdChpbmplY3Rvci5nZXQoQ2FyKS5lbmdpbmUgaW5zdGFuY2VvZiBFbmdpbmUpLnRvQmUodHJ1ZSk7XG4gKiBgYGBcbiAqXG4gKiBXaGVuIGBASW5qZWN0KClgIGlzIG5vdCBwcmVzZW50LCB7QGxpbmsgSW5qZWN0b3J9IHdpbGwgdXNlIHRoZSB0eXBlIGFubm90YXRpb24gb2YgdGhlIHBhcmFtZXRlci5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEVuZ2luZSB7fVxuICpcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIENhciB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6IEVuZ2luZSkge30gLy9zYW1lIGFzIGNvbnN0cnVjdG9yKEBJbmplY3QoRW5naW5lKSBlbmdpbmU6RW5naW5lKVxuICogfVxuICpcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0VuZ2luZSwgQ2FyXSk7XG4gKiBleHBlY3QoaW5qZWN0b3IuZ2V0KENhcikuZW5naW5lIGluc3RhbmNlb2YgRW5naW5lKS50b0JlKHRydWUpO1xuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgSW5qZWN0TWV0YWRhdGEge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdG9rZW4pIHt9XG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiBgQEluamVjdCgke3N0cmluZ2lmeSh0aGlzLnRva2VuKX0pYDsgfVxufVxuXG4vKipcbiAqIEEgcGFyYW1ldGVyIG1ldGFkYXRhIHRoYXQgbWFya3MgYSBkZXBlbmRlbmN5IGFzIG9wdGlvbmFsLiB7QGxpbmsgSW5qZWN0b3J9IHByb3ZpZGVzIGBudWxsYCBpZlxuICogdGhlIGRlcGVuZGVuY3kgaXMgbm90IGZvdW5kLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9Bc3J5T20/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBFbmdpbmUge31cbiAqXG4gKiBASW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBDYXIge1xuICogICBlbmdpbmU7XG4gKiAgIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIGVuZ2luZTpFbmdpbmUpIHtcbiAqICAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTtcbiAqICAgfVxuICogfVxuICpcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0Nhcl0pO1xuICogZXhwZWN0KGluamVjdG9yLmdldChDYXIpLmVuZ2luZSkudG9CZU51bGwoKTtcbiAqIGBgYFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIE9wdGlvbmFsTWV0YWRhdGEge1xuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gYEBPcHRpb25hbCgpYDsgfVxufVxuXG4vKipcbiAqIGBEZXBlbmRlbmN5TWV0YWRhdGFgIGlzIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBleHRlbmQgREkuXG4gKiBUaGlzIGlzIGludGVybmFsIHRvIEFuZ3VsYXIgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS5cbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBEZXBlbmRlbmN5TWV0YWRhdGEge1xuICBnZXQgdG9rZW4oKSB7IHJldHVybiBudWxsOyB9XG59XG5cbi8qKlxuICogQSBtYXJrZXIgbWV0YWRhdGEgdGhhdCBtYXJrcyBhIGNsYXNzIGFzIGF2YWlsYWJsZSB0byB7QGxpbmsgSW5qZWN0b3J9IGZvciBjcmVhdGlvbi5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvV2s0RE1RP3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQEluamVjdGFibGUoKVxuICogY2xhc3MgVXNlZnVsU2VydmljZSB7fVxuICpcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIE5lZWRzU2VydmljZSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBzZXJ2aWNlOlVzZWZ1bFNlcnZpY2UpIHt9XG4gKiB9XG4gKlxuICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbTmVlZHNTZXJ2aWNlLCBVc2VmdWxTZXJ2aWNlXSk7XG4gKiBleHBlY3QoaW5qZWN0b3IuZ2V0KE5lZWRzU2VydmljZSkuc2VydmljZSBpbnN0YW5jZW9mIFVzZWZ1bFNlcnZpY2UpLnRvQmUodHJ1ZSk7XG4gKiBgYGBcbiAqIHtAbGluayBJbmplY3Rvcn0gd2lsbCB0aHJvdyB7QGxpbmsgTm9Bbm5vdGF0aW9uRXJyb3J9IHdoZW4gdHJ5aW5nIHRvIGluc3RhbnRpYXRlIGEgY2xhc3MgdGhhdFxuICogZG9lcyBub3QgaGF2ZSBgQEluamVjdGFibGVgIG1hcmtlciwgYXMgc2hvd24gaW4gdGhlIGV4YW1wbGUgYmVsb3cuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgVXNlZnVsU2VydmljZSB7fVxuICpcbiAqIGNsYXNzIE5lZWRzU2VydmljZSB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBzZXJ2aWNlOlVzZWZ1bFNlcnZpY2UpIHt9XG4gKiB9XG4gKlxuICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbTmVlZHNTZXJ2aWNlLCBVc2VmdWxTZXJ2aWNlXSk7XG4gKiBleHBlY3QoKCkgPT4gaW5qZWN0b3IuZ2V0KE5lZWRzU2VydmljZSkpLnRvVGhyb3dFcnJvcigpO1xuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgSW5qZWN0YWJsZU1ldGFkYXRhIHtcbiAgY29uc3RydWN0b3IoKSB7fVxufVxuXG4vKipcbiAqIFNwZWNpZmllcyB0aGF0IGFuIHtAbGluayBJbmplY3Rvcn0gc2hvdWxkIHJldHJpZXZlIGEgZGVwZW5kZW5jeSBvbmx5IGZyb20gaXRzZWxmLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9OZWFnQWc/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBEZXBlbmRlbmN5IHtcbiAqIH1cbiAqXG4gKiBASW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBOZWVkc0RlcGVuZGVuY3kge1xuICogICBkZXBlbmRlbmN5O1xuICogICBjb25zdHJ1Y3RvcihAU2VsZigpIGRlcGVuZGVuY3k6RGVwZW5kZW5jeSkge1xuICogICAgIHRoaXMuZGVwZW5kZW5jeSA9IGRlcGVuZGVuY3k7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiB2YXIgaW5qID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbRGVwZW5kZW5jeSwgTmVlZHNEZXBlbmRlbmN5XSk7XG4gKiB2YXIgbmQgPSBpbmouZ2V0KE5lZWRzRGVwZW5kZW5jeSk7XG4gKlxuICogZXhwZWN0KG5kLmRlcGVuZGVuY3kgaW5zdGFuY2VvZiBEZXBlbmRlbmN5KS50b0JlKHRydWUpO1xuICpcbiAqIHZhciBpbmogPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtEZXBlbmRlbmN5XSk7XG4gKiB2YXIgY2hpbGQgPSBpbmoucmVzb2x2ZUFuZENyZWF0ZUNoaWxkKFtOZWVkc0RlcGVuZGVuY3ldKTtcbiAqIGV4cGVjdCgoKSA9PiBjaGlsZC5nZXQoTmVlZHNEZXBlbmRlbmN5KSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBTZWxmTWV0YWRhdGEge1xuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gYEBTZWxmKClgOyB9XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoYXQgdGhlIGRlcGVuZGVuY3kgcmVzb2x1dGlvbiBzaG91bGQgc3RhcnQgZnJvbSB0aGUgcGFyZW50IGluamVjdG9yLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9XY2hkemI/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBEZXBlbmRlbmN5IHtcbiAqIH1cbiAqXG4gKiBASW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBOZWVkc0RlcGVuZGVuY3kge1xuICogICBkZXBlbmRlbmN5O1xuICogICBjb25zdHJ1Y3RvcihAU2tpcFNlbGYoKSBkZXBlbmRlbmN5OkRlcGVuZGVuY3kpIHtcbiAqICAgICB0aGlzLmRlcGVuZGVuY3kgPSBkZXBlbmRlbmN5O1xuICogICB9XG4gKiB9XG4gKlxuICogdmFyIHBhcmVudCA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0RlcGVuZGVuY3ldKTtcbiAqIHZhciBjaGlsZCA9IHBhcmVudC5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQoW05lZWRzRGVwZW5kZW5jeV0pO1xuICogZXhwZWN0KGNoaWxkLmdldChOZWVkc0RlcGVuZGVuY3kpLmRlcGVuZGVuY3kgaW5zdGFuY2VvZiBEZXBlZGVuY3kpLnRvQmUodHJ1ZSk7XG4gKlxuICogdmFyIGluaiA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0RlcGVuZGVuY3ksIE5lZWRzRGVwZW5kZW5jeV0pO1xuICogZXhwZWN0KCgpID0+IGluai5nZXQoTmVlZHNEZXBlbmRlbmN5KSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBTa2lwU2VsZk1ldGFkYXRhIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIGBAU2tpcFNlbGYoKWA7IH1cbn1cblxuLyoqXG4gKiBTcGVjaWZpZXMgdGhhdCBhbiBpbmplY3RvciBzaG91bGQgcmV0cmlldmUgYSBkZXBlbmRlbmN5IGZyb20gYW55IGluamVjdG9yIHVudGlsIHJlYWNoaW5nIHRoZVxuICogY2xvc2VzdCBob3N0LlxuICpcbiAqIEluIEFuZ3VsYXIsIGEgY29tcG9uZW50IGVsZW1lbnQgaXMgYXV0b21hdGljYWxseSBkZWNsYXJlZCBhcyBhIGhvc3QgZm9yIGFsbCB0aGUgaW5qZWN0b3JzIGluXG4gKiBpdHMgdmlldy5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvR1g3OXBWP3A9cHJldmlldykpXG4gKlxuICogSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlIGBBcHBgIGNvbnRhaW5zIGBQYXJlbnRDbXBgLCB3aGljaCBjb250YWlucyBgQ2hpbGREaXJlY3RpdmVgLlxuICogU28gYFBhcmVudENtcGAgaXMgdGhlIGhvc3Qgb2YgYENoaWxkRGlyZWN0aXZlYC5cbiAqXG4gKiBgQ2hpbGREaXJlY3RpdmVgIGRlcGVuZHMgb24gdHdvIHNlcnZpY2VzOiBgSG9zdFNlcnZpY2VgIGFuZCBgT3RoZXJTZXJ2aWNlYC5cbiAqIGBIb3N0U2VydmljZWAgaXMgZGVmaW5lZCBhdCBgUGFyZW50Q21wYCwgYW5kIGBPdGhlclNlcnZpY2VgIGlzIGRlZmluZWQgYXQgYEFwcGAuXG4gKlxuICpgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBPdGhlclNlcnZpY2Uge31cbiAqIGNsYXNzIEhvc3RTZXJ2aWNlIHt9XG4gKlxuICogQERpcmVjdGl2ZSh7XG4gKiAgIHNlbGVjdG9yOiAnY2hpbGQtZGlyZWN0aXZlJ1xuICogfSlcbiAqIGNsYXNzIENoaWxkRGlyZWN0aXZlIHtcbiAqICAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEhvc3QoKSBvczpPdGhlclNlcnZpY2UsIEBPcHRpb25hbCgpIEBIb3N0KCkgaHM6SG9zdFNlcnZpY2Upe1xuICogICAgIGNvbnNvbGUubG9nKFwib3MgaXMgbnVsbFwiLCBvcyk7XG4gKiAgICAgY29uc29sZS5sb2coXCJocyBpcyBOT1QgbnVsbFwiLCBocyk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdwYXJlbnQtY21wJyxcbiAqICAgcHJvdmlkZXJzOiBbSG9zdFNlcnZpY2VdLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIERpcjogPGNoaWxkLWRpcmVjdGl2ZT48L2NoaWxkLWRpcmVjdGl2ZT5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW0NoaWxkRGlyZWN0aXZlXVxuICogfSlcbiAqIGNsYXNzIFBhcmVudENtcCB7XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgcHJvdmlkZXJzOiBbT3RoZXJTZXJ2aWNlXSxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICBQYXJlbnQ6IDxwYXJlbnQtY21wPjwvcGFyZW50LWNtcD5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW1BhcmVudENtcF1cbiAqIH0pXG4gKiBjbGFzcyBBcHAge1xuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHApO1xuICpgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBIb3N0TWV0YWRhdGEge1xuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gYEBIb3N0KClgOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS9tZXRhZGF0YS50c1xuICoqLyIsImltcG9ydCB7XG4gIEluamVjdE1ldGFkYXRhLFxuICBPcHRpb25hbE1ldGFkYXRhLFxuICBJbmplY3RhYmxlTWV0YWRhdGEsXG4gIFNlbGZNZXRhZGF0YSxcbiAgSG9zdE1ldGFkYXRhLFxuICBTa2lwU2VsZk1ldGFkYXRhXG59IGZyb20gJy4vbWV0YWRhdGEnO1xuaW1wb3J0IHttYWtlRGVjb3JhdG9yLCBtYWtlUGFyYW1EZWNvcmF0b3J9IGZyb20gJy4uL3V0aWwvZGVjb3JhdG9ycyc7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEluamVjdE1ldGFkYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbmplY3RGYWN0b3J5IHtcbiAgKHRva2VuOiBhbnkpOiBhbnk7XG4gIG5ldyAodG9rZW46IGFueSk6IEluamVjdE1ldGFkYXRhO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBPcHRpb25hbE1ldGFkYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcHRpb25hbEZhY3Rvcnkge1xuICAoKTogYW55O1xuICBuZXcgKCk6IE9wdGlvbmFsTWV0YWRhdGE7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEluamVjdGFibGVNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSW5qZWN0YWJsZUZhY3Rvcnkge1xuICAoKTogYW55O1xuICBuZXcgKCk6IEluamVjdGFibGVNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgU2VsZk1ldGFkYXRhfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTZWxmRmFjdG9yeSB7XG4gICgpOiBhbnk7XG4gIG5ldyAoKTogU2VsZk1ldGFkYXRhO1xufVxuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBIb3N0TWV0YWRhdGF9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEhvc3RGYWN0b3J5IHtcbiAgKCk6IGFueTtcbiAgbmV3ICgpOiBIb3N0TWV0YWRhdGE7XG59XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIFNraXBTZWxmTWV0YWRhdGF9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNraXBTZWxmRmFjdG9yeSB7XG4gICgpOiBhbnk7XG4gIG5ldyAoKTogU2tpcFNlbGZNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgSW5qZWN0TWV0YWRhdGF9LlxuICovXG5leHBvcnQgdmFyIEluamVjdDogSW5qZWN0RmFjdG9yeSA9IG1ha2VQYXJhbURlY29yYXRvcihJbmplY3RNZXRhZGF0YSk7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIE9wdGlvbmFsTWV0YWRhdGF9LlxuICovXG5leHBvcnQgdmFyIE9wdGlvbmFsOiBPcHRpb25hbEZhY3RvcnkgPSBtYWtlUGFyYW1EZWNvcmF0b3IoT3B0aW9uYWxNZXRhZGF0YSk7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEluamVjdGFibGVNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB2YXIgSW5qZWN0YWJsZTogSW5qZWN0YWJsZUZhY3RvcnkgPSA8SW5qZWN0YWJsZUZhY3Rvcnk+bWFrZURlY29yYXRvcihJbmplY3RhYmxlTWV0YWRhdGEpO1xuXG4vKipcbiAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIHtAbGluayBTZWxmTWV0YWRhdGF9LlxuICovXG5leHBvcnQgdmFyIFNlbGY6IFNlbGZGYWN0b3J5ID0gbWFrZVBhcmFtRGVjb3JhdG9yKFNlbGZNZXRhZGF0YSk7XG5cbi8qKlxuICogRmFjdG9yeSBmb3IgY3JlYXRpbmcge0BsaW5rIEhvc3RNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB2YXIgSG9zdDogSG9zdEZhY3RvcnkgPSBtYWtlUGFyYW1EZWNvcmF0b3IoSG9zdE1ldGFkYXRhKTtcblxuLyoqXG4gKiBGYWN0b3J5IGZvciBjcmVhdGluZyB7QGxpbmsgU2tpcFNlbGZNZXRhZGF0YX0uXG4gKi9cbmV4cG9ydCB2YXIgU2tpcFNlbGY6IFNraXBTZWxmRmFjdG9yeSA9IG1ha2VQYXJhbURlY29yYXRvcihTa2lwU2VsZk1ldGFkYXRhKTtcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS9kZWNvcmF0b3JzLnRzXG4gKiovIiwiaW1wb3J0IHtDb25jcmV0ZVR5cGUsIGdsb2JhbCwgVHlwZSwgaXNGdW5jdGlvbiwgc3RyaW5naWZ5fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqIERlY2xhcmVzIHRoZSBpbnRlcmZhY2UgdG8gYmUgdXNlZCB3aXRoIHtAbGluayBDbGFzc30uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2xhc3NEZWZpbml0aW9uIHtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGFyZ3VtZW50IGZvciBzcGVjaWZ5aW5nIHRoZSBzdXBlcmNsYXNzLlxuICAgKi9cbiAgZXh0ZW5kcz86IFR5cGU7XG5cbiAgLyoqXG4gICAqIFJlcXVpcmVkIGNvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciBhIGNsYXNzLlxuICAgKlxuICAgKiBUaGUgZnVuY3Rpb24gbWF5IGJlIG9wdGlvbmFsbHkgd3JhcHBlZCBpbiBhbiBgQXJyYXlgLCBpbiB3aGljaCBjYXNlIGFkZGl0aW9uYWwgcGFyYW1ldGVyXG4gICAqIGFubm90YXRpb25zIG1heSBiZSBzcGVjaWZpZWQuXG4gICAqIFRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGFuZCB0aGUgbnVtYmVyIG9mIHBhcmFtZXRlciBhbm5vdGF0aW9ucyBtdXN0IG1hdGNoLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIENsYXNzfSBmb3IgZXhhbXBsZSBvZiB1c2FnZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yOiBGdW5jdGlvbiB8IGFueVtdO1xuXG4gIC8qKlxuICAgKiBPdGhlciBtZXRob2RzIG9uIHRoZSBjbGFzcy4gTm90ZSB0aGF0IHZhbHVlcyBzaG91bGQgaGF2ZSB0eXBlICdGdW5jdGlvbicgYnV0IFRTIHJlcXVpcmVzXG4gICAqIGFsbCBwcm9wZXJ0aWVzIHRvIGhhdmUgYSBuYXJyb3dlciB0eXBlIHRoYW4gdGhlIGluZGV4IHNpZ25hdHVyZS5cbiAgICovXG4gIFt4OiBzdHJpbmddOiBUeXBlIHwgRnVuY3Rpb24gfCBhbnlbXTtcbn1cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYWxsIEFuZ3VsYXIgdHlwZSBkZWNvcmF0b3JzLCB3aGljaCBhbGxvd3MgdGhlbSB0byBiZSB1c2VkIGFzIEVTN1xuICogZGVjb3JhdG9ycyBhcyB3ZWxsIGFzXG4gKiBBbmd1bGFyIERTTCBzeW50YXguXG4gKlxuICogRFNMIHN5bnRheDpcbiAqXG4gKiBgYGBcbiAqIHZhciBNeUNsYXNzID0gbmdcbiAqICAgLkNvbXBvbmVudCh7Li4ufSlcbiAqICAgLlZpZXcoey4uLn0pXG4gKiAgIC5DbGFzcyh7Li4ufSk7XG4gKiBgYGBcbiAqXG4gKiBFUzcgc3ludGF4OlxuICpcbiAqIGBgYFxuICogQG5nLkNvbXBvbmVudCh7Li4ufSlcbiAqIEBuZy5WaWV3KHsuLi59KVxuICogY2xhc3MgTXlDbGFzcyB7Li4ufVxuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVHlwZURlY29yYXRvciB7XG4gIC8qKlxuICAgKiBJbnZva2UgYXMgRVM3IGRlY29yYXRvci5cbiAgICovXG4gIDxUIGV4dGVuZHMgVHlwZT4odHlwZTogVCk6IFQ7XG5cbiAgLy8gTWFrZSBUeXBlRGVjb3JhdG9yIGFzc2lnbmFibGUgdG8gYnVpbHQtaW4gUGFyYW1ldGVyRGVjb3JhdG9yIHR5cGUuXG4gIC8vIFBhcmFtZXRlckRlY29yYXRvciBpcyBkZWNsYXJlZCBpbiBsaWIuZC50cyBhcyBhIGBkZWNsYXJlIHR5cGVgXG4gIC8vIHNvIHdlIGNhbm5vdCBkZWNsYXJlIHRoaXMgaW50ZXJmYWNlIGFzIGEgc3VidHlwZS5cbiAgLy8gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzMzNzkjaXNzdWVjb21tZW50LTEyNjE2OTQxN1xuICAodGFyZ2V0OiBPYmplY3QsIHByb3BlcnR5S2V5Pzogc3RyaW5nIHwgc3ltYm9sLCBwYXJhbWV0ZXJJbmRleD86IG51bWJlcik6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFN0b3JhZ2UgZm9yIHRoZSBhY2N1bXVsYXRlZCBhbm5vdGF0aW9ucyBzbyBmYXIgdXNlZCBieSB0aGUgRFNMIHN5bnRheC5cbiAgICpcbiAgICogVXNlZCBieSB7QGxpbmsgQ2xhc3N9IHRvIGFubm90YXRlIHRoZSBnZW5lcmF0ZWQgY2xhc3MuXG4gICAqL1xuICBhbm5vdGF0aW9uczogYW55W107XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgY2xhc3MgZnJvbSB0aGUgZGVmaW5pdGlvbiBhbmQgYW5ub3RhdGUgaXQgd2l0aCB7QGxpbmsgVHlwZURlY29yYXRvciNhbm5vdGF0aW9uc30uXG4gICAqL1xuICBDbGFzcyhvYmo6IENsYXNzRGVmaW5pdGlvbik6IENvbmNyZXRlVHlwZTtcbn1cblxuZnVuY3Rpb24gZXh0cmFjdEFubm90YXRpb24oYW5ub3RhdGlvbjogYW55KTogYW55IHtcbiAgaWYgKGlzRnVuY3Rpb24oYW5ub3RhdGlvbikgJiYgYW5ub3RhdGlvbi5oYXNPd25Qcm9wZXJ0eSgnYW5ub3RhdGlvbicpKSB7XG4gICAgLy8gaXQgaXMgYSBkZWNvcmF0b3IsIGV4dHJhY3QgYW5ub3RhdGlvblxuICAgIGFubm90YXRpb24gPSBhbm5vdGF0aW9uLmFubm90YXRpb247XG4gIH1cbiAgcmV0dXJuIGFubm90YXRpb247XG59XG5cbmZ1bmN0aW9uIGFwcGx5UGFyYW1zKGZuT3JBcnJheTogKEZ1bmN0aW9uIHwgYW55W10pLCBrZXk6IHN0cmluZyk6IEZ1bmN0aW9uIHtcbiAgaWYgKGZuT3JBcnJheSA9PT0gT2JqZWN0IHx8IGZuT3JBcnJheSA9PT0gU3RyaW5nIHx8IGZuT3JBcnJheSA9PT0gRnVuY3Rpb24gfHxcbiAgICAgIGZuT3JBcnJheSA9PT0gTnVtYmVyIHx8IGZuT3JBcnJheSA9PT0gQXJyYXkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgdXNlIG5hdGl2ZSAke3N0cmluZ2lmeShmbk9yQXJyYXkpfSBhcyBjb25zdHJ1Y3RvcmApO1xuICB9XG4gIGlmIChpc0Z1bmN0aW9uKGZuT3JBcnJheSkpIHtcbiAgICByZXR1cm4gPEZ1bmN0aW9uPmZuT3JBcnJheTtcbiAgfSBlbHNlIGlmIChmbk9yQXJyYXkgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHZhciBhbm5vdGF0aW9uczogYW55W10gPSBmbk9yQXJyYXk7XG4gICAgdmFyIGZuOiBGdW5jdGlvbiA9IGZuT3JBcnJheVtmbk9yQXJyYXkubGVuZ3RoIC0gMV07XG4gICAgaWYgKCFpc0Z1bmN0aW9uKGZuKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBMYXN0IHBvc2l0aW9uIG9mIENsYXNzIG1ldGhvZCBhcnJheSBtdXN0IGJlIEZ1bmN0aW9uIGluIGtleSAke2tleX0gd2FzICcke3N0cmluZ2lmeShmbil9J2ApO1xuICAgIH1cbiAgICB2YXIgYW5ub0xlbmd0aCA9IGFubm90YXRpb25zLmxlbmd0aCAtIDE7XG4gICAgaWYgKGFubm9MZW5ndGggIT0gZm4ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYE51bWJlciBvZiBhbm5vdGF0aW9ucyAoJHthbm5vTGVuZ3RofSkgZG9lcyBub3QgbWF0Y2ggbnVtYmVyIG9mIGFyZ3VtZW50cyAoJHtmbi5sZW5ndGh9KSBpbiB0aGUgZnVuY3Rpb246ICR7c3RyaW5naWZ5KGZuKX1gKTtcbiAgICB9XG4gICAgdmFyIHBhcmFtc0Fubm90YXRpb25zOiBhbnlbXVtdID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGlpID0gYW5ub3RhdGlvbnMubGVuZ3RoIC0gMTsgaSA8IGlpOyBpKyspIHtcbiAgICAgIHZhciBwYXJhbUFubm90YXRpb25zOiBhbnlbXSA9IFtdO1xuICAgICAgcGFyYW1zQW5ub3RhdGlvbnMucHVzaChwYXJhbUFubm90YXRpb25zKTtcbiAgICAgIHZhciBhbm5vdGF0aW9uID0gYW5ub3RhdGlvbnNbaV07XG4gICAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgYW5ub3RhdGlvbi5sZW5ndGg7IGorKykge1xuICAgICAgICAgIHBhcmFtQW5ub3RhdGlvbnMucHVzaChleHRyYWN0QW5ub3RhdGlvbihhbm5vdGF0aW9uW2pdKSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoaXNGdW5jdGlvbihhbm5vdGF0aW9uKSkge1xuICAgICAgICBwYXJhbUFubm90YXRpb25zLnB1c2goZXh0cmFjdEFubm90YXRpb24oYW5ub3RhdGlvbikpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGFyYW1Bbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb24pO1xuICAgICAgfVxuICAgIH1cbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKCdwYXJhbWV0ZXJzJywgcGFyYW1zQW5ub3RhdGlvbnMsIGZuKTtcbiAgICByZXR1cm4gZm47XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgT25seSBGdW5jdGlvbiBvciBBcnJheSBpcyBzdXBwb3J0ZWQgaW4gQ2xhc3MgZGVmaW5pdGlvbiBmb3Iga2V5ICcke2tleX0nIGlzICcke3N0cmluZ2lmeShmbk9yQXJyYXkpfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFByb3ZpZGVzIGEgd2F5IGZvciBleHByZXNzaW5nIEVTNiBjbGFzc2VzIHdpdGggcGFyYW1ldGVyIGFubm90YXRpb25zIGluIEVTNS5cbiAqXG4gKiAjIyBCYXNpYyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiB2YXIgR3JlZXRlciA9IG5nLkNsYXNzKHtcbiAqICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKG5hbWUpIHtcbiAqICAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICogICB9LFxuICpcbiAqICAgZ3JlZXQ6IGZ1bmN0aW9uKCkge1xuICogICAgIGFsZXJ0KCdIZWxsbyAnICsgdGhpcy5uYW1lICsgJyEnKTtcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBpcyBlcXVpdmFsZW50IHRvIEVTNjpcbiAqXG4gKiBgYGBcbiAqIGNsYXNzIEdyZWV0ZXIge1xuICogICBjb25zdHJ1Y3RvcihuYW1lKSB7XG4gKiAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAqICAgfVxuICpcbiAqICAgZ3JlZXQoKSB7XG4gKiAgICAgYWxlcnQoJ0hlbGxvICcgKyB0aGlzLm5hbWUgKyAnIScpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBvciBlcXVpdmFsZW50IHRvIEVTNTpcbiAqXG4gKiBgYGBcbiAqIHZhciBHcmVldGVyID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAqICAgdGhpcy5uYW1lID0gbmFtZTtcbiAqIH1cbiAqXG4gKiBHcmVldGVyLnByb3RvdHlwZS5ncmVldCA9IGZ1bmN0aW9uICgpIHtcbiAqICAgYWxlcnQoJ0hlbGxvICcgKyB0aGlzLm5hbWUgKyAnIScpO1xuICogfVxuICogYGBgXG4gKlxuICogIyMjIEV4YW1wbGUgd2l0aCBwYXJhbWV0ZXIgYW5ub3RhdGlvbnNcbiAqXG4gKiBgYGBcbiAqIHZhciBNeVNlcnZpY2UgPSBuZy5DbGFzcyh7XG4gKiAgIGNvbnN0cnVjdG9yOiBbU3RyaW5nLCBbbmV3IFF1ZXJ5KCksIFF1ZXJ5TGlzdF0sIGZ1bmN0aW9uKG5hbWUsIHF1ZXJ5TGlzdCkge1xuICogICAgIC4uLlxuICogICB9XVxuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBpcyBlcXVpdmFsZW50IHRvIEVTNjpcbiAqXG4gKiBgYGBcbiAqIGNsYXNzIE15U2VydmljZSB7XG4gKiAgIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZywgQFF1ZXJ5KCkgcXVlcnlMaXN0OiBRdWVyeUxpc3QpIHtcbiAqICAgICAuLi5cbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogIyMjIEV4YW1wbGUgd2l0aCBpbmhlcml0YW5jZVxuICpcbiAqIGBgYFxuICogdmFyIFNoYXBlID0gbmcuQ2xhc3Moe1xuICogICBjb25zdHJ1Y3RvcjogKGNvbG9yKSB7XG4gKiAgICAgdGhpcy5jb2xvciA9IGNvbG9yO1xuICogICB9XG4gKiB9KTtcbiAqXG4gKiB2YXIgU3F1YXJlID0gbmcuQ2xhc3Moe1xuICogICBleHRlbmRzOiBTaGFwZSxcbiAqICAgY29uc3RydWN0b3I6IGZ1bmN0aW9uKGNvbG9yLCBzaXplKSB7XG4gKiAgICAgU2hhcGUuY2FsbCh0aGlzLCBjb2xvcik7XG4gKiAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENsYXNzKGNsc0RlZjogQ2xhc3NEZWZpbml0aW9uKTogQ29uY3JldGVUeXBlIHtcbiAgdmFyIGNvbnN0cnVjdG9yID0gYXBwbHlQYXJhbXMoXG4gICAgICBjbHNEZWYuaGFzT3duUHJvcGVydHkoJ2NvbnN0cnVjdG9yJykgPyBjbHNEZWYuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsICdjb25zdHJ1Y3RvcicpO1xuICB2YXIgcHJvdG8gPSBjb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIGlmIChjbHNEZWYuaGFzT3duUHJvcGVydHkoJ2V4dGVuZHMnKSkge1xuICAgIGlmIChpc0Z1bmN0aW9uKGNsc0RlZi5leHRlbmRzKSkge1xuICAgICAgKDxGdW5jdGlvbj5jb25zdHJ1Y3RvcikucHJvdG90eXBlID0gcHJvdG8gPVxuICAgICAgICAgIE9iamVjdC5jcmVhdGUoKDxGdW5jdGlvbj5jbHNEZWYuZXh0ZW5kcykucHJvdG90eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDbGFzcyBkZWZpbml0aW9uICdleHRlbmRzJyBwcm9wZXJ0eSBtdXN0IGJlIGEgY29uc3RydWN0b3IgZnVuY3Rpb24gd2FzOiAke3N0cmluZ2lmeShjbHNEZWYuZXh0ZW5kcyl9YCk7XG4gICAgfVxuICB9XG4gIGZvciAodmFyIGtleSBpbiBjbHNEZWYpIHtcbiAgICBpZiAoa2V5ICE9ICdleHRlbmRzJyAmJiBrZXkgIT0gJ3Byb3RvdHlwZScgJiYgY2xzRGVmLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgIHByb3RvW2tleV0gPSBhcHBseVBhcmFtcyhjbHNEZWZba2V5XSwga2V5KTtcbiAgICB9XG4gIH1cblxuICBpZiAodGhpcyAmJiB0aGlzLmFubm90YXRpb25zIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICBSZWZsZWN0LmRlZmluZU1ldGFkYXRhKCdhbm5vdGF0aW9ucycsIHRoaXMuYW5ub3RhdGlvbnMsIGNvbnN0cnVjdG9yKTtcbiAgfVxuXG4gIHJldHVybiA8Q29uY3JldGVUeXBlPmNvbnN0cnVjdG9yO1xufVxuXG52YXIgUmVmbGVjdCA9IGdsb2JhbC5SZWZsZWN0O1xuaWYgKCEoUmVmbGVjdCAmJiBSZWZsZWN0LmdldE1ldGFkYXRhKSkge1xuICB0aHJvdyAncmVmbGVjdC1tZXRhZGF0YSBzaGltIGlzIHJlcXVpcmVkIHdoZW4gdXNpbmcgY2xhc3MgZGVjb3JhdG9ycyc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlRGVjb3JhdG9yKFxuICAgIGFubm90YXRpb25DbHMsIGNoYWluRm46IChmbjogRnVuY3Rpb24pID0+IHZvaWQgPSBudWxsKTogKC4uLmFyZ3M6IGFueVtdKSA9PiAoY2xzOiBhbnkpID0+IGFueSB7XG4gIGZ1bmN0aW9uIERlY29yYXRvckZhY3Rvcnkob2JqT3JUeXBlKTogKGNsczogYW55KSA9PiBhbnkge1xuICAgIHZhciBhbm5vdGF0aW9uSW5zdGFuY2UgPSBuZXcgKDxhbnk+YW5ub3RhdGlvbkNscykob2JqT3JUeXBlKTtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGFubm90YXRpb25DbHMpIHtcbiAgICAgIHJldHVybiBhbm5vdGF0aW9uSW5zdGFuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBjaGFpbkFubm90YXRpb24gPVxuICAgICAgICAgIGlzRnVuY3Rpb24odGhpcykgJiYgdGhpcy5hbm5vdGF0aW9ucyBpbnN0YW5jZW9mIEFycmF5ID8gdGhpcy5hbm5vdGF0aW9ucyA6IFtdO1xuICAgICAgY2hhaW5Bbm5vdGF0aW9uLnB1c2goYW5ub3RhdGlvbkluc3RhbmNlKTtcbiAgICAgIHZhciBUeXBlRGVjb3JhdG9yOiBUeXBlRGVjb3JhdG9yID0gPFR5cGVEZWNvcmF0b3I+ZnVuY3Rpb24gVHlwZURlY29yYXRvcihjbHMpIHtcbiAgICAgICAgdmFyIGFubm90YXRpb25zID0gUmVmbGVjdC5nZXRPd25NZXRhZGF0YSgnYW5ub3RhdGlvbnMnLCBjbHMpO1xuICAgICAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zIHx8IFtdO1xuICAgICAgICBhbm5vdGF0aW9ucy5wdXNoKGFubm90YXRpb25JbnN0YW5jZSk7XG4gICAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoJ2Fubm90YXRpb25zJywgYW5ub3RhdGlvbnMsIGNscyk7XG4gICAgICAgIHJldHVybiBjbHM7XG4gICAgICB9O1xuICAgICAgVHlwZURlY29yYXRvci5hbm5vdGF0aW9ucyA9IGNoYWluQW5ub3RhdGlvbjtcbiAgICAgIFR5cGVEZWNvcmF0b3IuQ2xhc3MgPSBDbGFzcztcbiAgICAgIGlmIChjaGFpbkZuKSBjaGFpbkZuKFR5cGVEZWNvcmF0b3IpO1xuICAgICAgcmV0dXJuIFR5cGVEZWNvcmF0b3I7XG4gICAgfVxuICB9XG4gIERlY29yYXRvckZhY3RvcnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShhbm5vdGF0aW9uQ2xzLnByb3RvdHlwZSk7XG4gIHJldHVybiBEZWNvcmF0b3JGYWN0b3J5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVBhcmFtRGVjb3JhdG9yKGFubm90YXRpb25DbHMpOiBhbnkge1xuICBmdW5jdGlvbiBQYXJhbURlY29yYXRvckZhY3RvcnkoLi4uYXJncyk6IGFueSB7XG4gICAgdmFyIGFubm90YXRpb25JbnN0YW5jZSA9IE9iamVjdC5jcmVhdGUoYW5ub3RhdGlvbkNscy5wcm90b3R5cGUpO1xuICAgIGFubm90YXRpb25DbHMuYXBwbHkoYW5ub3RhdGlvbkluc3RhbmNlLCBhcmdzKTtcbiAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGFubm90YXRpb25DbHMpIHtcbiAgICAgIHJldHVybiBhbm5vdGF0aW9uSW5zdGFuY2U7XG4gICAgfSBlbHNlIHtcbiAgICAgICg8YW55PlBhcmFtRGVjb3JhdG9yKS5hbm5vdGF0aW9uID0gYW5ub3RhdGlvbkluc3RhbmNlO1xuICAgICAgcmV0dXJuIFBhcmFtRGVjb3JhdG9yO1xuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gUGFyYW1EZWNvcmF0b3IoY2xzLCB1bnVzZWRLZXksIGluZGV4KTogYW55IHtcbiAgICAgIHZhciBwYXJhbWV0ZXJzOiBhbnlbXVtdID0gUmVmbGVjdC5nZXRNZXRhZGF0YSgncGFyYW1ldGVycycsIGNscyk7XG4gICAgICBwYXJhbWV0ZXJzID0gcGFyYW1ldGVycyB8fCBbXTtcblxuICAgICAgLy8gdGhlcmUgbWlnaHQgYmUgZ2FwcyBpZiBzb21lIGluIGJldHdlZW4gcGFyYW1ldGVycyBkbyBub3QgaGF2ZSBhbm5vdGF0aW9ucy5cbiAgICAgIC8vIHdlIHBhZCB3aXRoIG51bGxzLlxuICAgICAgd2hpbGUgKHBhcmFtZXRlcnMubGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICAgIHBhcmFtZXRlcnMucHVzaChudWxsKTtcbiAgICAgIH1cblxuICAgICAgcGFyYW1ldGVyc1tpbmRleF0gPSBwYXJhbWV0ZXJzW2luZGV4XSB8fCBbXTtcbiAgICAgIHZhciBhbm5vdGF0aW9uc0ZvclBhcmFtOiBhbnlbXSA9IHBhcmFtZXRlcnNbaW5kZXhdO1xuICAgICAgYW5ub3RhdGlvbnNGb3JQYXJhbS5wdXNoKGFubm90YXRpb25JbnN0YW5jZSk7XG5cbiAgICAgIFJlZmxlY3QuZGVmaW5lTWV0YWRhdGEoJ3BhcmFtZXRlcnMnLCBwYXJhbWV0ZXJzLCBjbHMpO1xuICAgICAgcmV0dXJuIGNscztcbiAgICB9XG4gIH1cbiAgUGFyYW1EZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoYW5ub3RhdGlvbkNscy5wcm90b3R5cGUpO1xuICByZXR1cm4gUGFyYW1EZWNvcmF0b3JGYWN0b3J5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVByb3BEZWNvcmF0b3IoZGVjb3JhdG9yQ2xzKTogYW55IHtcbiAgZnVuY3Rpb24gUHJvcERlY29yYXRvckZhY3RvcnkoLi4uYXJncyk6IGFueSB7XG4gICAgdmFyIGRlY29yYXRvckluc3RhbmNlID0gT2JqZWN0LmNyZWF0ZShkZWNvcmF0b3JDbHMucHJvdG90eXBlKTtcbiAgICBkZWNvcmF0b3JDbHMuYXBwbHkoZGVjb3JhdG9ySW5zdGFuY2UsIGFyZ3MpO1xuXG4gICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBkZWNvcmF0b3JDbHMpIHtcbiAgICAgIHJldHVybiBkZWNvcmF0b3JJbnN0YW5jZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIFByb3BEZWNvcmF0b3IodGFyZ2V0OiBhbnksIG5hbWU6IHN0cmluZykge1xuICAgICAgICB2YXIgbWV0YSA9IFJlZmxlY3QuZ2V0T3duTWV0YWRhdGEoJ3Byb3BNZXRhZGF0YScsIHRhcmdldC5jb25zdHJ1Y3Rvcik7XG4gICAgICAgIG1ldGEgPSBtZXRhIHx8IHt9O1xuICAgICAgICBtZXRhW25hbWVdID0gbWV0YVtuYW1lXSB8fCBbXTtcbiAgICAgICAgbWV0YVtuYW1lXS51bnNoaWZ0KGRlY29yYXRvckluc3RhbmNlKTtcbiAgICAgICAgUmVmbGVjdC5kZWZpbmVNZXRhZGF0YSgncHJvcE1ldGFkYXRhJywgbWV0YSwgdGFyZ2V0LmNvbnN0cnVjdG9yKTtcbiAgICAgIH07XG4gICAgfVxuICB9XG4gIFByb3BEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoZGVjb3JhdG9yQ2xzLnByb3RvdHlwZSk7XG4gIHJldHVybiBQcm9wRGVjb3JhdG9yRmFjdG9yeTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL3V0aWwvZGVjb3JhdG9ycy50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgc3RyaW5naWZ5LCBpc0Z1bmN0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqIEFuIGludGVyZmFjZSB0aGF0IGEgZnVuY3Rpb24gcGFzc2VkIGludG8ge0BsaW5rIGZvcndhcmRSZWZ9IGhhcyB0byBpbXBsZW1lbnQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9kaS90cy9mb3J3YXJkX3JlZi9mb3J3YXJkX3JlZi50cyByZWdpb249J2ZvcndhcmRfcmVmX2ZuJ31cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGb3J3YXJkUmVmRm4geyAoKTogYW55OyB9XG5cbi8qKlxuICogQWxsb3dzIHRvIHJlZmVyIHRvIHJlZmVyZW5jZXMgd2hpY2ggYXJlIG5vdCB5ZXQgZGVmaW5lZC5cbiAqXG4gKiBGb3IgaW5zdGFuY2UsIGBmb3J3YXJkUmVmYCBpcyB1c2VkIHdoZW4gdGhlIGB0b2tlbmAgd2hpY2ggd2UgbmVlZCB0byByZWZlciB0byBmb3IgdGhlIHB1cnBvc2VzIG9mXG4gKiBESSBpcyBkZWNsYXJlZCxcbiAqIGJ1dCBub3QgeWV0IGRlZmluZWQuIEl0IGlzIGFsc28gdXNlZCB3aGVuIHRoZSBgdG9rZW5gIHdoaWNoIHdlIHVzZSB3aGVuIGNyZWF0aW5nIGEgcXVlcnkgaXMgbm90XG4gKiB5ZXQgZGVmaW5lZC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICoge0BleGFtcGxlIGNvcmUvZGkvdHMvZm9yd2FyZF9yZWYvZm9yd2FyZF9yZWYudHMgcmVnaW9uPSdmb3J3YXJkX3JlZid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmb3J3YXJkUmVmKGZvcndhcmRSZWZGbjogRm9yd2FyZFJlZkZuKTogVHlwZSB7XG4gICg8YW55PmZvcndhcmRSZWZGbikuX19mb3J3YXJkX3JlZl9fID0gZm9yd2FyZFJlZjtcbiAgKDxhbnk+Zm9yd2FyZFJlZkZuKS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3RyaW5naWZ5KHRoaXMoKSk7IH07XG4gIHJldHVybiAoPFR5cGU+PGFueT5mb3J3YXJkUmVmRm4pO1xufVxuXG4vKipcbiAqIExhemlseSByZXRyaWV2ZXMgdGhlIHJlZmVyZW5jZSB2YWx1ZSBmcm9tIGEgZm9yd2FyZFJlZi5cbiAqXG4gKiBBY3RzIGFzIHRoZSBpZGVudGl0eSBmdW5jdGlvbiB3aGVuIGdpdmVuIGEgbm9uLWZvcndhcmQtcmVmIHZhbHVlLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9HVTcybUpyazFmaW9kQ2hjbWlEUj9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHZhciByZWYgPSBmb3J3YXJkUmVmKCgpID0+IFwicmVmVmFsdWVcIik7XG4gKiBleHBlY3QocmVzb2x2ZUZvcndhcmRSZWYocmVmKSkudG9FcXVhbChcInJlZlZhbHVlXCIpO1xuICogZXhwZWN0KHJlc29sdmVGb3J3YXJkUmVmKFwicmVndWxhclZhbHVlXCIpKS50b0VxdWFsKFwicmVndWxhclZhbHVlXCIpO1xuICogYGBgXG4gKlxuICogU2VlOiB7QGxpbmsgZm9yd2FyZFJlZn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVGb3J3YXJkUmVmKHR5cGU6IGFueSk6IGFueSB7XG4gIGlmIChpc0Z1bmN0aW9uKHR5cGUpICYmIHR5cGUuaGFzT3duUHJvcGVydHkoJ19fZm9yd2FyZF9yZWZfXycpICYmXG4gICAgICB0eXBlLl9fZm9yd2FyZF9yZWZfXyA9PT0gZm9yd2FyZFJlZikge1xuICAgIHJldHVybiAoPEZvcndhcmRSZWZGbj50eXBlKSgpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB0eXBlO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS9mb3J3YXJkX3JlZi50c1xuICoqLyIsImltcG9ydCB7TWFwLCBNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIFJlc29sdmVkUHJvdmlkZXIsXG4gIFByb3ZpZGVyLFxuICBEZXBlbmRlbmN5LFxuICBQcm92aWRlckJ1aWxkZXIsXG4gIFJlc29sdmVkRmFjdG9yeSxcbiAgcHJvdmlkZSxcbiAgcmVzb2x2ZVByb3ZpZGVyc1xufSBmcm9tICcuL3Byb3ZpZGVyJztcbmltcG9ydCB7XG4gIEFic3RyYWN0UHJvdmlkZXJFcnJvcixcbiAgTm9Qcm92aWRlckVycm9yLFxuICBDeWNsaWNEZXBlbmRlbmN5RXJyb3IsXG4gIEluc3RhbnRpYXRpb25FcnJvcixcbiAgSW52YWxpZFByb3ZpZGVyRXJyb3IsXG4gIE91dE9mQm91bmRzRXJyb3Jcbn0gZnJvbSAnLi9leGNlcHRpb25zJztcbmltcG9ydCB7RnVuY3Rpb25XcmFwcGVyLCBUeXBlLCBpc1ByZXNlbnQsIGlzQmxhbmssIENPTlNUX0VYUFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0tleX0gZnJvbSAnLi9rZXknO1xuaW1wb3J0IHtTZWxmTWV0YWRhdGEsIEhvc3RNZXRhZGF0YSwgU2tpcFNlbGZNZXRhZGF0YX0gZnJvbSAnLi9tZXRhZGF0YSc7XG5cbi8vIFRocmVzaG9sZCBmb3IgdGhlIGR5bmFtaWMgdmVyc2lvblxuY29uc3QgX01BWF9DT05TVFJVQ1RJT05fQ09VTlRFUiA9IDEwO1xuXG5leHBvcnQgY29uc3QgVU5ERUZJTkVEOiBPYmplY3QgPSBDT05TVF9FWFBSKG5ldyBPYmplY3QoKSk7XG5cbi8qKlxuICogVmlzaWJpbGl0eSBvZiBhIHtAbGluayBQcm92aWRlcn0uXG4gKi9cbmV4cG9ydCBlbnVtIFZpc2liaWxpdHkge1xuICAvKipcbiAgICogQSBgUHVibGljYCB7QGxpbmsgUHJvdmlkZXJ9IGlzIG9ubHkgdmlzaWJsZSB0byByZWd1bGFyIChhcyBvcHBvc2VkIHRvIGhvc3QpIGNoaWxkIGluamVjdG9ycy5cbiAgICovXG4gIFB1YmxpYyxcbiAgLyoqXG4gICAqIEEgYFByaXZhdGVgIHtAbGluayBQcm92aWRlcn0gaXMgb25seSB2aXNpYmxlIHRvIGhvc3QgKGFzIG9wcG9zZWQgdG8gcmVndWxhcikgY2hpbGQgaW5qZWN0b3JzLlxuICAgKi9cbiAgUHJpdmF0ZSxcbiAgLyoqXG4gICAqIEEgYFB1YmxpY0FuZFByaXZhdGVgIHtAbGluayBQcm92aWRlcn0gaXMgdmlzaWJsZSB0byBib3RoIGhvc3QgYW5kIHJlZ3VsYXIgY2hpbGQgaW5qZWN0b3JzLlxuICAgKi9cbiAgUHVibGljQW5kUHJpdmF0ZVxufVxuXG5mdW5jdGlvbiBjYW5TZWUoc3JjOiBWaXNpYmlsaXR5LCBkc3Q6IFZpc2liaWxpdHkpOiBib29sZWFuIHtcbiAgcmV0dXJuIChzcmMgPT09IGRzdCkgfHxcbiAgICAgICAgIChkc3QgPT09IFZpc2liaWxpdHkuUHVibGljQW5kUHJpdmF0ZSB8fCBzcmMgPT09IFZpc2liaWxpdHkuUHVibGljQW5kUHJpdmF0ZSk7XG59XG5cblxuZXhwb3J0IGludGVyZmFjZSBQcm90b0luamVjdG9yU3RyYXRlZ3kge1xuICBnZXRQcm92aWRlckF0SW5kZXgoaW5kZXg6IG51bWJlcik6IFJlc29sdmVkUHJvdmlkZXI7XG4gIGNyZWF0ZUluamVjdG9yU3RyYXRlZ3koaW5qOiBJbmplY3Rvcik6IEluamVjdG9yU3RyYXRlZ3k7XG59XG5cbmV4cG9ydCBjbGFzcyBQcm90b0luamVjdG9ySW5saW5lU3RyYXRlZ3kgaW1wbGVtZW50cyBQcm90b0luamVjdG9yU3RyYXRlZ3kge1xuICBwcm92aWRlcjA6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjE6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjI6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjM6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjQ6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjU6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjY6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjc6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjg6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuICBwcm92aWRlcjk6IFJlc29sdmVkUHJvdmlkZXIgPSBudWxsO1xuXG4gIGtleUlkMDogbnVtYmVyID0gbnVsbDtcbiAga2V5SWQxOiBudW1iZXIgPSBudWxsO1xuICBrZXlJZDI6IG51bWJlciA9IG51bGw7XG4gIGtleUlkMzogbnVtYmVyID0gbnVsbDtcbiAga2V5SWQ0OiBudW1iZXIgPSBudWxsO1xuICBrZXlJZDU6IG51bWJlciA9IG51bGw7XG4gIGtleUlkNjogbnVtYmVyID0gbnVsbDtcbiAga2V5SWQ3OiBudW1iZXIgPSBudWxsO1xuICBrZXlJZDg6IG51bWJlciA9IG51bGw7XG4gIGtleUlkOTogbnVtYmVyID0gbnVsbDtcblxuICB2aXNpYmlsaXR5MDogVmlzaWJpbGl0eSA9IG51bGw7XG4gIHZpc2liaWxpdHkxOiBWaXNpYmlsaXR5ID0gbnVsbDtcbiAgdmlzaWJpbGl0eTI6IFZpc2liaWxpdHkgPSBudWxsO1xuICB2aXNpYmlsaXR5MzogVmlzaWJpbGl0eSA9IG51bGw7XG4gIHZpc2liaWxpdHk0OiBWaXNpYmlsaXR5ID0gbnVsbDtcbiAgdmlzaWJpbGl0eTU6IFZpc2liaWxpdHkgPSBudWxsO1xuICB2aXNpYmlsaXR5NjogVmlzaWJpbGl0eSA9IG51bGw7XG4gIHZpc2liaWxpdHk3OiBWaXNpYmlsaXR5ID0gbnVsbDtcbiAgdmlzaWJpbGl0eTg6IFZpc2liaWxpdHkgPSBudWxsO1xuICB2aXNpYmlsaXR5OTogVmlzaWJpbGl0eSA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJvdG9FSTogUHJvdG9JbmplY3RvciwgYnd2OiBQcm92aWRlcldpdGhWaXNpYmlsaXR5W10pIHtcbiAgICB2YXIgbGVuZ3RoID0gYnd2Lmxlbmd0aDtcblxuICAgIGlmIChsZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnByb3ZpZGVyMCA9IGJ3dlswXS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQwID0gYnd2WzBdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHkwID0gYnd2WzBdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLnByb3ZpZGVyMSA9IGJ3dlsxXS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQxID0gYnd2WzFdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHkxID0gYnd2WzFdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiAyKSB7XG4gICAgICB0aGlzLnByb3ZpZGVyMiA9IGJ3dlsyXS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQyID0gYnd2WzJdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHkyID0gYnd2WzJdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiAzKSB7XG4gICAgICB0aGlzLnByb3ZpZGVyMyA9IGJ3dlszXS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQzID0gYnd2WzNdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHkzID0gYnd2WzNdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA0KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyNCA9IGJ3dls0XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ0ID0gYnd2WzRdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk0ID0gYnd2WzRdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA1KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyNSA9IGJ3dls1XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ1ID0gYnd2WzVdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk1ID0gYnd2WzVdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA2KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyNiA9IGJ3dls2XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ2ID0gYnd2WzZdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk2ID0gYnd2WzZdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA3KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyNyA9IGJ3dls3XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ3ID0gYnd2WzddLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk3ID0gYnd2WzddLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA4KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyOCA9IGJ3dls4XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ4ID0gYnd2WzhdLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk4ID0gYnd2WzhdLnZpc2liaWxpdHk7XG4gICAgfVxuICAgIGlmIChsZW5ndGggPiA5KSB7XG4gICAgICB0aGlzLnByb3ZpZGVyOSA9IGJ3dls5XS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWQ5ID0gYnd2WzldLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdHk5ID0gYnd2WzldLnZpc2liaWxpdHk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHJvdmlkZXJBdEluZGV4KGluZGV4OiBudW1iZXIpOiBhbnkge1xuICAgIGlmIChpbmRleCA9PSAwKSByZXR1cm4gdGhpcy5wcm92aWRlcjA7XG4gICAgaWYgKGluZGV4ID09IDEpIHJldHVybiB0aGlzLnByb3ZpZGVyMTtcbiAgICBpZiAoaW5kZXggPT0gMikgcmV0dXJuIHRoaXMucHJvdmlkZXIyO1xuICAgIGlmIChpbmRleCA9PSAzKSByZXR1cm4gdGhpcy5wcm92aWRlcjM7XG4gICAgaWYgKGluZGV4ID09IDQpIHJldHVybiB0aGlzLnByb3ZpZGVyNDtcbiAgICBpZiAoaW5kZXggPT0gNSkgcmV0dXJuIHRoaXMucHJvdmlkZXI1O1xuICAgIGlmIChpbmRleCA9PSA2KSByZXR1cm4gdGhpcy5wcm92aWRlcjY7XG4gICAgaWYgKGluZGV4ID09IDcpIHJldHVybiB0aGlzLnByb3ZpZGVyNztcbiAgICBpZiAoaW5kZXggPT0gOCkgcmV0dXJuIHRoaXMucHJvdmlkZXI4O1xuICAgIGlmIChpbmRleCA9PSA5KSByZXR1cm4gdGhpcy5wcm92aWRlcjk7XG4gICAgdGhyb3cgbmV3IE91dE9mQm91bmRzRXJyb3IoaW5kZXgpO1xuICB9XG5cbiAgY3JlYXRlSW5qZWN0b3JTdHJhdGVneShpbmplY3RvcjogSW5qZWN0b3IpOiBJbmplY3RvclN0cmF0ZWd5IHtcbiAgICByZXR1cm4gbmV3IEluamVjdG9ySW5saW5lU3RyYXRlZ3koaW5qZWN0b3IsIHRoaXMpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm90b0luamVjdG9yRHluYW1pY1N0cmF0ZWd5IGltcGxlbWVudHMgUHJvdG9JbmplY3RvclN0cmF0ZWd5IHtcbiAgcHJvdmlkZXJzOiBSZXNvbHZlZFByb3ZpZGVyW107XG4gIGtleUlkczogbnVtYmVyW107XG4gIHZpc2liaWxpdGllczogVmlzaWJpbGl0eVtdO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RvSW5qOiBQcm90b0luamVjdG9yLCBid3Y6IFByb3ZpZGVyV2l0aFZpc2liaWxpdHlbXSkge1xuICAgIHZhciBsZW4gPSBid3YubGVuZ3RoO1xuXG4gICAgdGhpcy5wcm92aWRlcnMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUobGVuKTtcbiAgICB0aGlzLmtleUlkcyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShsZW4pO1xuICAgIHRoaXMudmlzaWJpbGl0aWVzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKGxlbik7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICB0aGlzLnByb3ZpZGVyc1tpXSA9IGJ3dltpXS5wcm92aWRlcjtcbiAgICAgIHRoaXMua2V5SWRzW2ldID0gYnd2W2ldLmdldEtleUlkKCk7XG4gICAgICB0aGlzLnZpc2liaWxpdGllc1tpXSA9IGJ3dltpXS52aXNpYmlsaXR5O1xuICAgIH1cbiAgfVxuXG4gIGdldFByb3ZpZGVyQXRJbmRleChpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMucHJvdmlkZXJzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IE91dE9mQm91bmRzRXJyb3IoaW5kZXgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wcm92aWRlcnNbaW5kZXhdO1xuICB9XG5cbiAgY3JlYXRlSW5qZWN0b3JTdHJhdGVneShlaTogSW5qZWN0b3IpOiBJbmplY3RvclN0cmF0ZWd5IHtcbiAgICByZXR1cm4gbmV3IEluamVjdG9yRHluYW1pY1N0cmF0ZWd5KHRoaXMsIGVpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvdG9JbmplY3RvciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N0cmF0ZWd5OiBQcm90b0luamVjdG9yU3RyYXRlZ3k7XG4gIG51bWJlck9mUHJvdmlkZXJzOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYnd2OiBQcm92aWRlcldpdGhWaXNpYmlsaXR5W10pIHtcbiAgICB0aGlzLm51bWJlck9mUHJvdmlkZXJzID0gYnd2Lmxlbmd0aDtcbiAgICB0aGlzLl9zdHJhdGVneSA9IGJ3di5sZW5ndGggPiBfTUFYX0NPTlNUUlVDVElPTl9DT1VOVEVSID9cbiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvdG9JbmplY3RvckR5bmFtaWNTdHJhdGVneSh0aGlzLCBid3YpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUHJvdG9JbmplY3RvcklubGluZVN0cmF0ZWd5KHRoaXMsIGJ3dik7XG4gIH1cblxuICBnZXRQcm92aWRlckF0SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueSB7IHJldHVybiB0aGlzLl9zdHJhdGVneS5nZXRQcm92aWRlckF0SW5kZXgoaW5kZXgpOyB9XG59XG5cblxuXG5leHBvcnQgaW50ZXJmYWNlIEluamVjdG9yU3RyYXRlZ3kge1xuICBnZXRPYmpCeUtleUlkKGtleUlkOiBudW1iZXIsIHZpc2liaWxpdHk6IFZpc2liaWxpdHkpOiBhbnk7XG4gIGdldE9iakF0SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueTtcbiAgZ2V0TWF4TnVtYmVyT2ZPYmplY3RzKCk6IG51bWJlcjtcblxuICBhdHRhY2gocGFyZW50OiBJbmplY3RvciwgaXNIb3N0OiBib29sZWFuKTogdm9pZDtcbiAgcmVzZXRDb25zdHJ1Y3Rpb25Db3VudGVyKCk6IHZvaWQ7XG4gIGluc3RhbnRpYXRlUHJvdmlkZXIocHJvdmlkZXI6IFJlc29sdmVkUHJvdmlkZXIsIHZpc2liaWxpdHk6IFZpc2liaWxpdHkpOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBJbmplY3RvcklubGluZVN0cmF0ZWd5IGltcGxlbWVudHMgSW5qZWN0b3JTdHJhdGVneSB7XG4gIG9iajA6IGFueSA9IFVOREVGSU5FRDtcbiAgb2JqMTogYW55ID0gVU5ERUZJTkVEO1xuICBvYmoyOiBhbnkgPSBVTkRFRklORUQ7XG4gIG9iajM6IGFueSA9IFVOREVGSU5FRDtcbiAgb2JqNDogYW55ID0gVU5ERUZJTkVEO1xuICBvYmo1OiBhbnkgPSBVTkRFRklORUQ7XG4gIG9iajY6IGFueSA9IFVOREVGSU5FRDtcbiAgb2JqNzogYW55ID0gVU5ERUZJTkVEO1xuICBvYmo4OiBhbnkgPSBVTkRFRklORUQ7XG4gIG9iajk6IGFueSA9IFVOREVGSU5FRDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5qZWN0b3I6IEluamVjdG9yLCBwdWJsaWMgcHJvdG9TdHJhdGVneTogUHJvdG9JbmplY3RvcklubGluZVN0cmF0ZWd5KSB7fVxuXG4gIHJlc2V0Q29uc3RydWN0aW9uQ291bnRlcigpOiB2b2lkIHsgdGhpcy5pbmplY3Rvci5fY29uc3RydWN0aW9uQ291bnRlciA9IDA7IH1cblxuICBpbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyOiBSZXNvbHZlZFByb3ZpZGVyLCB2aXNpYmlsaXR5OiBWaXNpYmlsaXR5KTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5pbmplY3Rvci5fbmV3KHByb3ZpZGVyLCB2aXNpYmlsaXR5KTtcbiAgfVxuXG4gIGF0dGFjaChwYXJlbnQ6IEluamVjdG9yLCBpc0hvc3Q6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB2YXIgaW5qID0gdGhpcy5pbmplY3RvcjtcbiAgICBpbmouX3BhcmVudCA9IHBhcmVudDtcbiAgICBpbmouX2lzSG9zdCA9IGlzSG9zdDtcbiAgfVxuXG4gIGdldE9iakJ5S2V5SWQoa2V5SWQ6IG51bWJlciwgdmlzaWJpbGl0eTogVmlzaWJpbGl0eSk6IGFueSB7XG4gICAgdmFyIHAgPSB0aGlzLnByb3RvU3RyYXRlZ3k7XG4gICAgdmFyIGluaiA9IHRoaXMuaW5qZWN0b3I7XG5cbiAgICBpZiAocC5rZXlJZDAgPT09IGtleUlkICYmIGNhblNlZShwLnZpc2liaWxpdHkwLCB2aXNpYmlsaXR5KSkge1xuICAgICAgaWYgKHRoaXMub2JqMCA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgIHRoaXMub2JqMCA9IGluai5fbmV3KHAucHJvdmlkZXIwLCBwLnZpc2liaWxpdHkwKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm9iajA7XG4gICAgfVxuICAgIGlmIChwLmtleUlkMSA9PT0ga2V5SWQgJiYgY2FuU2VlKHAudmlzaWJpbGl0eTEsIHZpc2liaWxpdHkpKSB7XG4gICAgICBpZiAodGhpcy5vYmoxID09PSBVTkRFRklORUQpIHtcbiAgICAgICAgdGhpcy5vYmoxID0gaW5qLl9uZXcocC5wcm92aWRlcjEsIHAudmlzaWJpbGl0eTEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMub2JqMTtcbiAgICB9XG4gICAgaWYgKHAua2V5SWQyID09PSBrZXlJZCAmJiBjYW5TZWUocC52aXNpYmlsaXR5MiwgdmlzaWJpbGl0eSkpIHtcbiAgICAgIGlmICh0aGlzLm9iajIgPT09IFVOREVGSU5FRCkge1xuICAgICAgICB0aGlzLm9iajIgPSBpbmouX25ldyhwLnByb3ZpZGVyMiwgcC52aXNpYmlsaXR5Mik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vYmoyO1xuICAgIH1cbiAgICBpZiAocC5rZXlJZDMgPT09IGtleUlkICYmIGNhblNlZShwLnZpc2liaWxpdHkzLCB2aXNpYmlsaXR5KSkge1xuICAgICAgaWYgKHRoaXMub2JqMyA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgIHRoaXMub2JqMyA9IGluai5fbmV3KHAucHJvdmlkZXIzLCBwLnZpc2liaWxpdHkzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm9iajM7XG4gICAgfVxuICAgIGlmIChwLmtleUlkNCA9PT0ga2V5SWQgJiYgY2FuU2VlKHAudmlzaWJpbGl0eTQsIHZpc2liaWxpdHkpKSB7XG4gICAgICBpZiAodGhpcy5vYmo0ID09PSBVTkRFRklORUQpIHtcbiAgICAgICAgdGhpcy5vYmo0ID0gaW5qLl9uZXcocC5wcm92aWRlcjQsIHAudmlzaWJpbGl0eTQpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMub2JqNDtcbiAgICB9XG4gICAgaWYgKHAua2V5SWQ1ID09PSBrZXlJZCAmJiBjYW5TZWUocC52aXNpYmlsaXR5NSwgdmlzaWJpbGl0eSkpIHtcbiAgICAgIGlmICh0aGlzLm9iajUgPT09IFVOREVGSU5FRCkge1xuICAgICAgICB0aGlzLm9iajUgPSBpbmouX25ldyhwLnByb3ZpZGVyNSwgcC52aXNpYmlsaXR5NSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vYmo1O1xuICAgIH1cbiAgICBpZiAocC5rZXlJZDYgPT09IGtleUlkICYmIGNhblNlZShwLnZpc2liaWxpdHk2LCB2aXNpYmlsaXR5KSkge1xuICAgICAgaWYgKHRoaXMub2JqNiA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgIHRoaXMub2JqNiA9IGluai5fbmV3KHAucHJvdmlkZXI2LCBwLnZpc2liaWxpdHk2KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm9iajY7XG4gICAgfVxuICAgIGlmIChwLmtleUlkNyA9PT0ga2V5SWQgJiYgY2FuU2VlKHAudmlzaWJpbGl0eTcsIHZpc2liaWxpdHkpKSB7XG4gICAgICBpZiAodGhpcy5vYmo3ID09PSBVTkRFRklORUQpIHtcbiAgICAgICAgdGhpcy5vYmo3ID0gaW5qLl9uZXcocC5wcm92aWRlcjcsIHAudmlzaWJpbGl0eTcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMub2JqNztcbiAgICB9XG4gICAgaWYgKHAua2V5SWQ4ID09PSBrZXlJZCAmJiBjYW5TZWUocC52aXNpYmlsaXR5OCwgdmlzaWJpbGl0eSkpIHtcbiAgICAgIGlmICh0aGlzLm9iajggPT09IFVOREVGSU5FRCkge1xuICAgICAgICB0aGlzLm9iajggPSBpbmouX25ldyhwLnByb3ZpZGVyOCwgcC52aXNpYmlsaXR5OCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5vYmo4O1xuICAgIH1cbiAgICBpZiAocC5rZXlJZDkgPT09IGtleUlkICYmIGNhblNlZShwLnZpc2liaWxpdHk5LCB2aXNpYmlsaXR5KSkge1xuICAgICAgaWYgKHRoaXMub2JqOSA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgIHRoaXMub2JqOSA9IGluai5fbmV3KHAucHJvdmlkZXI5LCBwLnZpc2liaWxpdHk5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLm9iajk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFVOREVGSU5FRDtcbiAgfVxuXG4gIGdldE9iakF0SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGluZGV4ID09IDApIHJldHVybiB0aGlzLm9iajA7XG4gICAgaWYgKGluZGV4ID09IDEpIHJldHVybiB0aGlzLm9iajE7XG4gICAgaWYgKGluZGV4ID09IDIpIHJldHVybiB0aGlzLm9iajI7XG4gICAgaWYgKGluZGV4ID09IDMpIHJldHVybiB0aGlzLm9iajM7XG4gICAgaWYgKGluZGV4ID09IDQpIHJldHVybiB0aGlzLm9iajQ7XG4gICAgaWYgKGluZGV4ID09IDUpIHJldHVybiB0aGlzLm9iajU7XG4gICAgaWYgKGluZGV4ID09IDYpIHJldHVybiB0aGlzLm9iajY7XG4gICAgaWYgKGluZGV4ID09IDcpIHJldHVybiB0aGlzLm9iajc7XG4gICAgaWYgKGluZGV4ID09IDgpIHJldHVybiB0aGlzLm9iajg7XG4gICAgaWYgKGluZGV4ID09IDkpIHJldHVybiB0aGlzLm9iajk7XG4gICAgdGhyb3cgbmV3IE91dE9mQm91bmRzRXJyb3IoaW5kZXgpO1xuICB9XG5cbiAgZ2V0TWF4TnVtYmVyT2ZPYmplY3RzKCk6IG51bWJlciB7IHJldHVybiBfTUFYX0NPTlNUUlVDVElPTl9DT1VOVEVSOyB9XG59XG5cblxuZXhwb3J0IGNsYXNzIEluamVjdG9yRHluYW1pY1N0cmF0ZWd5IGltcGxlbWVudHMgSW5qZWN0b3JTdHJhdGVneSB7XG4gIG9ianM6IGFueVtdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm90b1N0cmF0ZWd5OiBQcm90b0luamVjdG9yRHluYW1pY1N0cmF0ZWd5LCBwdWJsaWMgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5vYmpzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKHByb3RvU3RyYXRlZ3kucHJvdmlkZXJzLmxlbmd0aCk7XG4gICAgTGlzdFdyYXBwZXIuZmlsbCh0aGlzLm9ianMsIFVOREVGSU5FRCk7XG4gIH1cblxuICByZXNldENvbnN0cnVjdGlvbkNvdW50ZXIoKTogdm9pZCB7IHRoaXMuaW5qZWN0b3IuX2NvbnN0cnVjdGlvbkNvdW50ZXIgPSAwOyB9XG5cbiAgaW5zdGFudGlhdGVQcm92aWRlcihwcm92aWRlcjogUmVzb2x2ZWRQcm92aWRlciwgdmlzaWJpbGl0eTogVmlzaWJpbGl0eSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuaW5qZWN0b3IuX25ldyhwcm92aWRlciwgdmlzaWJpbGl0eSk7XG4gIH1cblxuICBhdHRhY2gocGFyZW50OiBJbmplY3RvciwgaXNIb3N0OiBib29sZWFuKTogdm9pZCB7XG4gICAgdmFyIGluaiA9IHRoaXMuaW5qZWN0b3I7XG4gICAgaW5qLl9wYXJlbnQgPSBwYXJlbnQ7XG4gICAgaW5qLl9pc0hvc3QgPSBpc0hvc3Q7XG4gIH1cblxuICBnZXRPYmpCeUtleUlkKGtleUlkOiBudW1iZXIsIHZpc2liaWxpdHk6IFZpc2liaWxpdHkpOiBhbnkge1xuICAgIHZhciBwID0gdGhpcy5wcm90b1N0cmF0ZWd5O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwLmtleUlkcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHAua2V5SWRzW2ldID09PSBrZXlJZCAmJiBjYW5TZWUocC52aXNpYmlsaXRpZXNbaV0sIHZpc2liaWxpdHkpKSB7XG4gICAgICAgIGlmICh0aGlzLm9ianNbaV0gPT09IFVOREVGSU5FRCkge1xuICAgICAgICAgIHRoaXMub2Jqc1tpXSA9IHRoaXMuaW5qZWN0b3IuX25ldyhwLnByb3ZpZGVyc1tpXSwgcC52aXNpYmlsaXRpZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMub2Jqc1tpXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gVU5ERUZJTkVEO1xuICB9XG5cbiAgZ2V0T2JqQXRJbmRleChpbmRleDogbnVtYmVyKTogYW55IHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMub2Jqcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBPdXRPZkJvdW5kc0Vycm9yKGluZGV4KTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5vYmpzW2luZGV4XTtcbiAgfVxuXG4gIGdldE1heE51bWJlck9mT2JqZWN0cygpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5vYmpzLmxlbmd0aDsgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvdmlkZXJXaXRoVmlzaWJpbGl0eSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcm92aWRlcjogUmVzb2x2ZWRQcm92aWRlciwgcHVibGljIHZpc2liaWxpdHk6IFZpc2liaWxpdHkpe307XG5cbiAgZ2V0S2V5SWQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMucHJvdmlkZXIua2V5LmlkOyB9XG59XG5cbi8qKlxuICogVXNlZCB0byBwcm92aWRlIGRlcGVuZGVuY2llcyB0aGF0IGNhbm5vdCBiZSBlYXNpbHkgZXhwcmVzc2VkIGFzIHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZXBlbmRlbmN5UHJvdmlkZXIge1xuICBnZXREZXBlbmRlbmN5KGluamVjdG9yOiBJbmplY3RvciwgcHJvdmlkZXI6IFJlc29sdmVkUHJvdmlkZXIsIGRlcGVuZGVuY3k6IERlcGVuZGVuY3kpOiBhbnk7XG59XG5cbi8qKlxuICogQSBkZXBlbmRlbmN5IGluamVjdGlvbiBjb250YWluZXIgdXNlZCBmb3IgaW5zdGFudGlhdGluZyBvYmplY3RzIGFuZCByZXNvbHZpbmcgZGVwZW5kZW5jaWVzLlxuICpcbiAqIEFuIGBJbmplY3RvcmAgaXMgYSByZXBsYWNlbWVudCBmb3IgYSBgbmV3YCBvcGVyYXRvciwgd2hpY2ggY2FuIGF1dG9tYXRpY2FsbHkgcmVzb2x2ZSB0aGVcbiAqIGNvbnN0cnVjdG9yIGRlcGVuZGVuY2llcy5cbiAqXG4gKiBJbiB0eXBpY2FsIHVzZSwgYXBwbGljYXRpb24gY29kZSBhc2tzIGZvciB0aGUgZGVwZW5kZW5jaWVzIGluIHRoZSBjb25zdHJ1Y3RvciBhbmQgdGhleSBhcmVcbiAqIHJlc29sdmVkIGJ5IHRoZSBgSW5qZWN0b3JgLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9qemplYzA/cD1wcmV2aWV3KSlcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhbiBgSW5qZWN0b3JgIGNvbmZpZ3VyZWQgdG8gY3JlYXRlIGBFbmdpbmVgIGFuZCBgQ2FyYC5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBASW5qZWN0YWJsZSgpXG4gKiBjbGFzcyBFbmdpbmUge1xuICogfVxuICpcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIENhciB7XG4gKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fVxuICogfVxuICpcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0NhciwgRW5naW5lXSk7XG4gKiB2YXIgY2FyID0gaW5qZWN0b3IuZ2V0KENhcik7XG4gKiBleHBlY3QoY2FyIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpO1xuICogZXhwZWN0KGNhci5lbmdpbmUgaW5zdGFuY2VvZiBFbmdpbmUpLnRvQmUodHJ1ZSk7XG4gKiBgYGBcbiAqXG4gKiBOb3RpY2UsIHdlIGRvbid0IHVzZSB0aGUgYG5ld2Agb3BlcmF0b3IgYmVjYXVzZSB3ZSBleHBsaWNpdGx5IHdhbnQgdG8gaGF2ZSB0aGUgYEluamVjdG9yYFxuICogcmVzb2x2ZSBhbGwgb2YgdGhlIG9iamVjdCdzIGRlcGVuZGVuY2llcyBhdXRvbWF0aWNhbGx5LlxuICovXG5leHBvcnQgY2xhc3MgSW5qZWN0b3Ige1xuICAvKipcbiAgICogVHVybnMgYW4gYXJyYXkgb2YgcHJvdmlkZXIgZGVmaW5pdGlvbnMgaW50byBhbiBhcnJheSBvZiByZXNvbHZlZCBwcm92aWRlcnMuXG4gICAqXG4gICAqIEEgcmVzb2x1dGlvbiBpcyBhIHByb2Nlc3Mgb2YgZmxhdHRlbmluZyBtdWx0aXBsZSBuZXN0ZWQgYXJyYXlzIGFuZCBjb252ZXJ0aW5nIGluZGl2aWR1YWxcbiAgICogcHJvdmlkZXJzIGludG8gYW4gYXJyYXkgb2Yge0BsaW5rIFJlc29sdmVkUHJvdmlkZXJ9cy5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0FpWFRIaT9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgRW5naW5lIHtcbiAgICogfVxuICAgKlxuICAgKiBASW5qZWN0YWJsZSgpXG4gICAqIGNsYXNzIENhciB7XG4gICAqICAgY29uc3RydWN0b3IocHVibGljIGVuZ2luZTpFbmdpbmUpIHt9XG4gICAqIH1cbiAgICpcbiAgICogdmFyIHByb3ZpZGVycyA9IEluamVjdG9yLnJlc29sdmUoW0NhciwgW1tFbmdpbmVdXV0pO1xuICAgKlxuICAgKiBleHBlY3QocHJvdmlkZXJzLmxlbmd0aCkudG9FcXVhbCgyKTtcbiAgICpcbiAgICogZXhwZWN0KHByb3ZpZGVyc1swXSBpbnN0YW5jZW9mIFJlc29sdmVkUHJvdmlkZXIpLnRvQmUodHJ1ZSk7XG4gICAqIGV4cGVjdChwcm92aWRlcnNbMF0ua2V5LmRpc3BsYXlOYW1lKS50b0JlKFwiQ2FyXCIpO1xuICAgKiBleHBlY3QocHJvdmlkZXJzWzBdLmRlcGVuZGVuY2llcy5sZW5ndGgpLnRvRXF1YWwoMSk7XG4gICAqIGV4cGVjdChwcm92aWRlcnNbMF0uZmFjdG9yeSkudG9CZURlZmluZWQoKTtcbiAgICpcbiAgICogZXhwZWN0KHByb3ZpZGVyc1sxXS5rZXkuZGlzcGxheU5hbWUpLnRvQmUoXCJFbmdpbmVcIik7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogU2VlIHtAbGluayBJbmplY3RvciNmcm9tUmVzb2x2ZWRQcm92aWRlcnN9IGZvciBtb3JlIGluZm8uXG4gICAqL1xuICBzdGF0aWMgcmVzb2x2ZShwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IFJlc29sdmVkUHJvdmlkZXJbXSB7XG4gICAgcmV0dXJuIHJlc29sdmVQcm92aWRlcnMocHJvdmlkZXJzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyBhbiBhcnJheSBvZiBwcm92aWRlcnMgYW5kIGNyZWF0ZXMgYW4gaW5qZWN0b3IgZnJvbSB0aG9zZSBwcm92aWRlcnMuXG4gICAqXG4gICAqIFRoZSBwYXNzZWQtaW4gcHJvdmlkZXJzIGNhbiBiZSBhbiBhcnJheSBvZiBgVHlwZWAsIHtAbGluayBQcm92aWRlcn0sXG4gICAqIG9yIGEgcmVjdXJzaXZlIGFycmF5IG9mIG1vcmUgcHJvdmlkZXJzLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvZVBPY2NBP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogQEluamVjdGFibGUoKVxuICAgKiBjbGFzcyBFbmdpbmUge1xuICAgKiB9XG4gICAqXG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgQ2FyIHtcbiAgICogICBjb25zdHJ1Y3RvcihwdWJsaWMgZW5naW5lOkVuZ2luZSkge31cbiAgICogfVxuICAgKlxuICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtDYXIsIEVuZ2luZV0pO1xuICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KENhcikgaW5zdGFuY2VvZiBDYXIpLnRvQmUodHJ1ZSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNsb3dlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGBmcm9tUmVzb2x2ZWRQcm92aWRlcnNgXG4gICAqIGJlY2F1c2UgaXQgbmVlZHMgdG8gcmVzb2x2ZSB0aGUgcGFzc2VkLWluIHByb3ZpZGVycyBmaXJzdC5cbiAgICogU2VlIHtAbGluayBJbmplY3RvciNyZXNvbHZlfSBhbmQge0BsaW5rIEluamVjdG9yI2Zyb21SZXNvbHZlZFByb3ZpZGVyc30uXG4gICAqL1xuICBzdGF0aWMgcmVzb2x2ZUFuZENyZWF0ZShwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IEluamVjdG9yIHtcbiAgICB2YXIgcmVzb2x2ZWRQcm92aWRlcnMgPSBJbmplY3Rvci5yZXNvbHZlKHByb3ZpZGVycyk7XG4gICAgcmV0dXJuIEluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyhyZXNvbHZlZFByb3ZpZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbmplY3RvciBmcm9tIHByZXZpb3VzbHkgcmVzb2x2ZWQgcHJvdmlkZXJzLlxuICAgKlxuICAgKiBUaGlzIEFQSSBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGNvbnN0cnVjdCBpbmplY3RvcnMgaW4gcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIHBhcnRzLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvS3JTTWNpP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogQEluamVjdGFibGUoKVxuICAgKiBjbGFzcyBFbmdpbmUge1xuICAgKiB9XG4gICAqXG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgQ2FyIHtcbiAgICogICBjb25zdHJ1Y3RvcihwdWJsaWMgZW5naW5lOkVuZ2luZSkge31cbiAgICogfVxuICAgKlxuICAgKiB2YXIgcHJvdmlkZXJzID0gSW5qZWN0b3IucmVzb2x2ZShbQ2FyLCBFbmdpbmVdKTtcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IuZnJvbVJlc29sdmVkUHJvdmlkZXJzKHByb3ZpZGVycyk7XG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXQoQ2FyKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTtcbiAgICogYGBgXG4gICAqL1xuICBzdGF0aWMgZnJvbVJlc29sdmVkUHJvdmlkZXJzKHByb3ZpZGVyczogUmVzb2x2ZWRQcm92aWRlcltdKTogSW5qZWN0b3Ige1xuICAgIHZhciBiZCA9IHByb3ZpZGVycy5tYXAoYiA9PiBuZXcgUHJvdmlkZXJXaXRoVmlzaWJpbGl0eShiLCBWaXNpYmlsaXR5LlB1YmxpYykpO1xuICAgIHZhciBwcm90byA9IG5ldyBQcm90b0luamVjdG9yKGJkKTtcbiAgICByZXR1cm4gbmV3IEluamVjdG9yKHByb3RvLCBudWxsLCBudWxsKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgc3RhdGljIGZyb21SZXNvbHZlZEJpbmRpbmdzKHByb3ZpZGVyczogUmVzb2x2ZWRQcm92aWRlcltdKTogSW5qZWN0b3Ige1xuICAgIHJldHVybiBJbmplY3Rvci5mcm9tUmVzb2x2ZWRQcm92aWRlcnMocHJvdmlkZXJzKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N0cmF0ZWd5OiBJbmplY3RvclN0cmF0ZWd5O1xuICAvKiogQGludGVybmFsICovXG4gIF9pc0hvc3Q6IGJvb2xlYW4gPSBmYWxzZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY29uc3RydWN0aW9uQ291bnRlcjogbnVtYmVyID0gMDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX3Byb3RvOiBhbnkgLyogUHJvdG9JbmplY3RvciAqLztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX3BhcmVudDogSW5qZWN0b3I7XG4gIC8qKlxuICAgKiBQcml2YXRlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihfcHJvdG86IGFueSAvKiBQcm90b0luamVjdG9yICovLCBfcGFyZW50OiBJbmplY3RvciA9IG51bGwsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2RlcFByb3ZpZGVyOiBhbnkgLyogRGVwZW5kZW5jeVByb3ZpZGVyICovID0gbnVsbCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZGVidWdDb250ZXh0OiBGdW5jdGlvbiA9IG51bGwpIHtcbiAgICB0aGlzLl9wcm90byA9IF9wcm90bztcbiAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50O1xuICAgIHRoaXMuX3N0cmF0ZWd5ID0gX3Byb3RvLl9zdHJhdGVneS5jcmVhdGVJbmplY3RvclN0cmF0ZWd5KHRoaXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZGVidWdDb250ZXh0KCk6IGFueSB7IHJldHVybiB0aGlzLl9kZWJ1Z0NvbnRleHQoKTsgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgYW4gaW5zdGFuY2UgZnJvbSB0aGUgaW5qZWN0b3IgYmFzZWQgb24gdGhlIHByb3ZpZGVkIHRva2VuLlxuICAgKiBUaHJvd3Mge0BsaW5rIE5vUHJvdmlkZXJFcnJvcn0gaWYgbm90IGZvdW5kLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvSGVYU0hnP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gICAqICAgcHJvdmlkZShcInZhbGlkVG9rZW5cIiwge3VzZVZhbHVlOiBcIlZhbHVlXCJ9KVxuICAgKiBdKTtcbiAgICogZXhwZWN0KGluamVjdG9yLmdldChcInZhbGlkVG9rZW5cIikpLnRvRXF1YWwoXCJWYWx1ZVwiKTtcbiAgICogZXhwZWN0KCgpID0+IGluamVjdG9yLmdldChcImludmFsaWRUb2tlblwiKSkudG9UaHJvd0Vycm9yKCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBgSW5qZWN0b3JgIHJldHVybnMgaXRzZWxmIHdoZW4gZ2l2ZW4gYEluamVjdG9yYCBhcyBhIHRva2VuLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW10pO1xuICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KEluamVjdG9yKSkudG9CZShpbmplY3Rvcik7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0KHRva2VuOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9nZXRCeUtleShLZXkuZ2V0KHRva2VuKSwgbnVsbCwgbnVsbCwgZmFsc2UsIFZpc2liaWxpdHkuUHVibGljQW5kUHJpdmF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGFuIGluc3RhbmNlIGZyb20gdGhlIGluamVjdG9yIGJhc2VkIG9uIHRoZSBwcm92aWRlZCB0b2tlbi5cbiAgICogUmV0dXJucyBudWxsIGlmIG5vdCBmb3VuZC5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3RwRWJFeT9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIHByb3ZpZGUoXCJ2YWxpZFRva2VuXCIsIHt1c2VWYWx1ZTogXCJWYWx1ZVwifSlcbiAgICogXSk7XG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXRPcHRpb25hbChcInZhbGlkVG9rZW5cIikpLnRvRXF1YWwoXCJWYWx1ZVwiKTtcbiAgICogZXhwZWN0KGluamVjdG9yLmdldE9wdGlvbmFsKFwiaW52YWxpZFRva2VuXCIpKS50b0JlKG51bGwpO1xuICAgKiBgYGBcbiAgICpcbiAgICogYEluamVjdG9yYCByZXR1cm5zIGl0c2VsZiB3aGVuIGdpdmVuIGBJbmplY3RvcmAgYXMgYSB0b2tlbi5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtdKTtcbiAgICogZXhwZWN0KGluamVjdG9yLmdldE9wdGlvbmFsKEluamVjdG9yKSkudG9CZShpbmplY3Rvcik7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0T3B0aW9uYWwodG9rZW46IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX2dldEJ5S2V5KEtleS5nZXQodG9rZW4pLCBudWxsLCBudWxsLCB0cnVlLCBWaXNpYmlsaXR5LlB1YmxpY0FuZFByaXZhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgZ2V0QXQoaW5kZXg6IG51bWJlcik6IGFueSB7IHJldHVybiB0aGlzLl9zdHJhdGVneS5nZXRPYmpBdEluZGV4KGluZGV4KTsgfVxuXG4gIC8qKlxuICAgKiBQYXJlbnQgb2YgdGhpcyBpbmplY3Rvci5cbiAgICpcbiAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIHRoZSBzZWN0aW9uIG9mIHRoZSB1c2VyIGd1aWRlIHRhbGtpbmcgYWJvdXQgaGllcmFyY2hpY2FsIGluamVjdGlvbi5cbiAgICogLS0+XG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9lb3NNR28/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB2YXIgcGFyZW50ID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXSk7XG4gICAqIHZhciBjaGlsZCA9IHBhcmVudC5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQoW10pO1xuICAgKiBleHBlY3QoY2hpbGQucGFyZW50KS50b0JlKHBhcmVudCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0IHBhcmVudCgpOiBJbmplY3RvciB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqIEludGVybmFsLiBEbyBub3QgdXNlLlxuICAgKiBXZSByZXR1cm4gYGFueWAgbm90IHRvIGV4cG9ydCB0aGUgSW5qZWN0b3JTdHJhdGVneSB0eXBlLlxuICAgKi9cbiAgZ2V0IGludGVybmFsU3RyYXRlZ3koKTogYW55IHsgcmV0dXJuIHRoaXMuX3N0cmF0ZWd5OyB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGFuIGFycmF5IG9mIHByb3ZpZGVycyBhbmQgY3JlYXRlcyBhIGNoaWxkIGluamVjdG9yIGZyb20gdGhvc2UgcHJvdmlkZXJzLlxuICAgKlxuICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgdG8gdGhlIHNlY3Rpb24gb2YgdGhlIHVzZXIgZ3VpZGUgdGFsa2luZyBhYm91dCBoaWVyYXJjaGljYWwgaW5qZWN0aW9uLlxuICAgKiAtLT5cbiAgICpcbiAgICogVGhlIHBhc3NlZC1pbiBwcm92aWRlcnMgY2FuIGJlIGFuIGFycmF5IG9mIGBUeXBlYCwge0BsaW5rIFByb3ZpZGVyfSxcbiAgICogb3IgYSByZWN1cnNpdmUgYXJyYXkgb2YgbW9yZSBwcm92aWRlcnMuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9vcEIzVDQ/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBQYXJlbnRQcm92aWRlciB7fVxuICAgKiBjbGFzcyBDaGlsZFByb3ZpZGVyIHt9XG4gICAqXG4gICAqIHZhciBwYXJlbnQgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtQYXJlbnRQcm92aWRlcl0pO1xuICAgKiB2YXIgY2hpbGQgPSBwYXJlbnQucmVzb2x2ZUFuZENyZWF0ZUNoaWxkKFtDaGlsZFByb3ZpZGVyXSk7XG4gICAqXG4gICAqIGV4cGVjdChjaGlsZC5nZXQoUGFyZW50UHJvdmlkZXIpIGluc3RhbmNlb2YgUGFyZW50UHJvdmlkZXIpLnRvQmUodHJ1ZSk7XG4gICAqIGV4cGVjdChjaGlsZC5nZXQoQ2hpbGRQcm92aWRlcikgaW5zdGFuY2VvZiBDaGlsZFByb3ZpZGVyKS50b0JlKHRydWUpO1xuICAgKiBleHBlY3QoY2hpbGQuZ2V0KFBhcmVudFByb3ZpZGVyKSkudG9CZShwYXJlbnQuZ2V0KFBhcmVudFByb3ZpZGVyKSk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIHNsb3dlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIGBjcmVhdGVDaGlsZEZyb21SZXNvbHZlZGBcbiAgICogYmVjYXVzZSBpdCBuZWVkcyB0byByZXNvbHZlIHRoZSBwYXNzZWQtaW4gcHJvdmlkZXJzIGZpcnN0LlxuICAgKiBTZWUge0BsaW5rIEluamVjdG9yI3Jlc29sdmV9IGFuZCB7QGxpbmsgSW5qZWN0b3IjY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWR9LlxuICAgKi9cbiAgcmVzb2x2ZUFuZENyZWF0ZUNoaWxkKHByb3ZpZGVyczogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+KTogSW5qZWN0b3Ige1xuICAgIHZhciByZXNvbHZlZFByb3ZpZGVycyA9IEluamVjdG9yLnJlc29sdmUocHJvdmlkZXJzKTtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZChyZXNvbHZlZFByb3ZpZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIGNoaWxkIGluamVjdG9yIGZyb20gcHJldmlvdXNseSByZXNvbHZlZCBwcm92aWRlcnMuXG4gICAqXG4gICAqIDwhLS0gVE9ETzogQWRkIGEgbGluayB0byB0aGUgc2VjdGlvbiBvZiB0aGUgdXNlciBndWlkZSB0YWxraW5nIGFib3V0IGhpZXJhcmNoaWNhbCBpbmplY3Rpb24uXG4gICAqIC0tPlxuICAgKlxuICAgKiBUaGlzIEFQSSBpcyB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGNvbnN0cnVjdCBpbmplY3RvcnMgaW4gcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIHBhcnRzLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvVmh5ZmpOP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY2xhc3MgUGFyZW50UHJvdmlkZXIge31cbiAgICogY2xhc3MgQ2hpbGRQcm92aWRlciB7fVxuICAgKlxuICAgKiB2YXIgcGFyZW50UHJvdmlkZXJzID0gSW5qZWN0b3IucmVzb2x2ZShbUGFyZW50UHJvdmlkZXJdKTtcbiAgICogdmFyIGNoaWxkUHJvdmlkZXJzID0gSW5qZWN0b3IucmVzb2x2ZShbQ2hpbGRQcm92aWRlcl0pO1xuICAgKlxuICAgKiB2YXIgcGFyZW50ID0gSW5qZWN0b3IuZnJvbVJlc29sdmVkUHJvdmlkZXJzKHBhcmVudFByb3ZpZGVycyk7XG4gICAqIHZhciBjaGlsZCA9IHBhcmVudC5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZChjaGlsZFByb3ZpZGVycyk7XG4gICAqXG4gICAqIGV4cGVjdChjaGlsZC5nZXQoUGFyZW50UHJvdmlkZXIpIGluc3RhbmNlb2YgUGFyZW50UHJvdmlkZXIpLnRvQmUodHJ1ZSk7XG4gICAqIGV4cGVjdChjaGlsZC5nZXQoQ2hpbGRQcm92aWRlcikgaW5zdGFuY2VvZiBDaGlsZFByb3ZpZGVyKS50b0JlKHRydWUpO1xuICAgKiBleHBlY3QoY2hpbGQuZ2V0KFBhcmVudFByb3ZpZGVyKSkudG9CZShwYXJlbnQuZ2V0KFBhcmVudFByb3ZpZGVyKSk7XG4gICAqIGBgYFxuICAgKi9cbiAgY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWQocHJvdmlkZXJzOiBSZXNvbHZlZFByb3ZpZGVyW10pOiBJbmplY3RvciB7XG4gICAgdmFyIGJkID0gcHJvdmlkZXJzLm1hcChiID0+IG5ldyBQcm92aWRlcldpdGhWaXNpYmlsaXR5KGIsIFZpc2liaWxpdHkuUHVibGljKSk7XG4gICAgdmFyIHByb3RvID0gbmV3IFByb3RvSW5qZWN0b3IoYmQpO1xuICAgIHZhciBpbmogPSBuZXcgSW5qZWN0b3IocHJvdG8sIG51bGwsIG51bGwpO1xuICAgIGluai5fcGFyZW50ID0gdGhpcztcbiAgICByZXR1cm4gaW5qO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIGEgcHJvdmlkZXIgYW5kIGluc3RhbnRpYXRlcyBhbiBvYmplY3QgaW4gdGhlIGNvbnRleHQgb2YgdGhlIGluamVjdG9yLlxuICAgKlxuICAgKiBUaGUgY3JlYXRlZCBvYmplY3QgZG9lcyBub3QgZ2V0IGNhY2hlZCBieSB0aGUgaW5qZWN0b3IuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC95dlZYb0I/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBASW5qZWN0YWJsZSgpXG4gICAqIGNsYXNzIEVuZ2luZSB7XG4gICAqIH1cbiAgICpcbiAgICogQEluamVjdGFibGUoKVxuICAgKiBjbGFzcyBDYXIge1xuICAgKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fVxuICAgKiB9XG4gICAqXG4gICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0VuZ2luZV0pO1xuICAgKlxuICAgKiB2YXIgY2FyID0gaW5qZWN0b3IucmVzb2x2ZUFuZEluc3RhbnRpYXRlKENhcik7XG4gICAqIGV4cGVjdChjYXIuZW5naW5lKS50b0JlKGluamVjdG9yLmdldChFbmdpbmUpKTtcbiAgICogZXhwZWN0KGNhcikubm90LnRvQmUoaW5qZWN0b3IucmVzb2x2ZUFuZEluc3RhbnRpYXRlKENhcikpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlc29sdmVBbmRJbnN0YW50aWF0ZShwcm92aWRlcjogVHlwZSB8IFByb3ZpZGVyKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5pbnN0YW50aWF0ZVJlc29sdmVkKEluamVjdG9yLnJlc29sdmUoW3Byb3ZpZGVyXSlbMF0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbnRpYXRlcyBhbiBvYmplY3QgdXNpbmcgYSByZXNvbHZlZCBwcm92aWRlciBpbiB0aGUgY29udGV4dCBvZiB0aGUgaW5qZWN0b3IuXG4gICAqXG4gICAqIFRoZSBjcmVhdGVkIG9iamVjdCBkb2VzIG5vdCBnZXQgY2FjaGVkIGJ5IHRoZSBpbmplY3Rvci5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3B0Q0ltUT9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgRW5naW5lIHtcbiAgICogfVxuICAgKlxuICAgKiBASW5qZWN0YWJsZSgpXG4gICAqIGNsYXNzIENhciB7XG4gICAqICAgY29uc3RydWN0b3IocHVibGljIGVuZ2luZTpFbmdpbmUpIHt9XG4gICAqIH1cbiAgICpcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbRW5naW5lXSk7XG4gICAqIHZhciBjYXJQcm92aWRlciA9IEluamVjdG9yLnJlc29sdmUoW0Nhcl0pWzBdO1xuICAgKiB2YXIgY2FyID0gaW5qZWN0b3IuaW5zdGFudGlhdGVSZXNvbHZlZChjYXJQcm92aWRlcik7XG4gICAqIGV4cGVjdChjYXIuZW5naW5lKS50b0JlKGluamVjdG9yLmdldChFbmdpbmUpKTtcbiAgICogZXhwZWN0KGNhcikubm90LnRvQmUoaW5qZWN0b3IuaW5zdGFudGlhdGVSZXNvbHZlZChjYXJQcm92aWRlcikpO1xuICAgKiBgYGBcbiAgICovXG4gIGluc3RhbnRpYXRlUmVzb2x2ZWQocHJvdmlkZXI6IFJlc29sdmVkUHJvdmlkZXIpOiBhbnkge1xuICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyLCBWaXNpYmlsaXR5LlB1YmxpY0FuZFByaXZhdGUpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbmV3KHByb3ZpZGVyOiBSZXNvbHZlZFByb3ZpZGVyLCB2aXNpYmlsaXR5OiBWaXNpYmlsaXR5KTogYW55IHtcbiAgICBpZiAodGhpcy5fY29uc3RydWN0aW9uQ291bnRlcisrID4gdGhpcy5fc3RyYXRlZ3kuZ2V0TWF4TnVtYmVyT2ZPYmplY3RzKCkpIHtcbiAgICAgIHRocm93IG5ldyBDeWNsaWNEZXBlbmRlbmN5RXJyb3IodGhpcywgcHJvdmlkZXIua2V5KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlUHJvdmlkZXIocHJvdmlkZXIsIHZpc2liaWxpdHkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfaW5zdGFudGlhdGVQcm92aWRlcihwcm92aWRlcjogUmVzb2x2ZWRQcm92aWRlciwgdmlzaWJpbGl0eTogVmlzaWJpbGl0eSk6IGFueSB7XG4gICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIpIHtcbiAgICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUocHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXMubGVuZ3RoKTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgcmVzW2ldID0gdGhpcy5faW5zdGFudGlhdGUocHJvdmlkZXIsIHByb3ZpZGVyLnJlc29sdmVkRmFjdG9yaWVzW2ldLCB2aXNpYmlsaXR5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZShwcm92aWRlciwgcHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXNbMF0sIHZpc2liaWxpdHkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2luc3RhbnRpYXRlKHByb3ZpZGVyOiBSZXNvbHZlZFByb3ZpZGVyLCByZXNvbHZlZEZhY3Rvcnk6IFJlc29sdmVkRmFjdG9yeSxcbiAgICAgICAgICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogVmlzaWJpbGl0eSk6IGFueSB7XG4gICAgdmFyIGZhY3RvcnkgPSByZXNvbHZlZEZhY3RvcnkuZmFjdG9yeTtcbiAgICB2YXIgZGVwcyA9IHJlc29sdmVkRmFjdG9yeS5kZXBlbmRlbmNpZXM7XG4gICAgdmFyIGxlbmd0aCA9IGRlcHMubGVuZ3RoO1xuXG4gICAgdmFyIGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCwgZDE1LCBkMTYsIGQxNywgZDE4LCBkMTk7XG4gICAgdHJ5IHtcbiAgICAgIGQwID0gbGVuZ3RoID4gMCA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1swXSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDEgPSBsZW5ndGggPiAxID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzFdLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkMiA9IGxlbmd0aCA+IDIgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMl0sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQzID0gbGVuZ3RoID4gMyA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1szXSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDQgPSBsZW5ndGggPiA0ID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzRdLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkNSA9IGxlbmd0aCA+IDUgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbNV0sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQ2ID0gbGVuZ3RoID4gNiA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1s2XSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDcgPSBsZW5ndGggPiA3ID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzddLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkOCA9IGxlbmd0aCA+IDggPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbOF0sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQ5ID0gbGVuZ3RoID4gOSA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1s5XSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDEwID0gbGVuZ3RoID4gMTAgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMTBdLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkMTEgPSBsZW5ndGggPiAxMSA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1sxMV0sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQxMiA9IGxlbmd0aCA+IDEyID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzEyXSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDEzID0gbGVuZ3RoID4gMTMgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMTNdLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkMTQgPSBsZW5ndGggPiAxNCA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1sxNF0sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQxNSA9IGxlbmd0aCA+IDE1ID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzE1XSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDE2ID0gbGVuZ3RoID4gMTYgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMTZdLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgICBkMTcgPSBsZW5ndGggPiAxNyA/IHRoaXMuX2dldEJ5RGVwZW5kZW5jeShwcm92aWRlciwgZGVwc1sxN10sIHZpc2liaWxpdHkpIDogbnVsbDtcbiAgICAgIGQxOCA9IGxlbmd0aCA+IDE4ID8gdGhpcy5fZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyLCBkZXBzWzE4XSwgdmlzaWJpbGl0eSkgOiBudWxsO1xuICAgICAgZDE5ID0gbGVuZ3RoID4gMTkgPyB0aGlzLl9nZXRCeURlcGVuZGVuY3kocHJvdmlkZXIsIGRlcHNbMTldLCB2aXNpYmlsaXR5KSA6IG51bGw7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBBYnN0cmFjdFByb3ZpZGVyRXJyb3IgfHwgZSBpbnN0YW5jZW9mIEluc3RhbnRpYXRpb25FcnJvcikge1xuICAgICAgICBlLmFkZEtleSh0aGlzLCBwcm92aWRlci5rZXkpO1xuICAgICAgfVxuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB2YXIgb2JqO1xuICAgIHRyeSB7XG4gICAgICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeSgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNjpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDc6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgODpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgOTpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEwOlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDExOlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTI6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcsIGQ4LCBkOSwgZDEwLCBkMTEpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDEzOlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE0OlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIsIGQxMyk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTU6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcsIGQ4LCBkOSwgZDEwLCBkMTEsIGQxMiwgZDEzLCBkMTQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE2OlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIsIGQxMywgZDE0LCBkMTUpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDE3OlxuICAgICAgICAgIG9iaiA9IGZhY3RvcnkoZDAsIGQxLCBkMiwgZDMsIGQ0LCBkNSwgZDYsIGQ3LCBkOCwgZDksIGQxMCwgZDExLCBkMTIsIGQxMywgZDE0LCBkMTUsIGQxNik7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTg6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcsIGQ4LCBkOSwgZDEwLCBkMTEsIGQxMiwgZDEzLCBkMTQsIGQxNSwgZDE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgZDE3KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOTpcbiAgICAgICAgICBvYmogPSBmYWN0b3J5KGQwLCBkMSwgZDIsIGQzLCBkNCwgZDUsIGQ2LCBkNywgZDgsIGQ5LCBkMTAsIGQxMSwgZDEyLCBkMTMsIGQxNCwgZDE1LCBkMTYsXG4gICAgICAgICAgICAgICAgICAgICAgICBkMTcsIGQxOCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjA6XG4gICAgICAgICAgb2JqID0gZmFjdG9yeShkMCwgZDEsIGQyLCBkMywgZDQsIGQ1LCBkNiwgZDcsIGQ4LCBkOSwgZDEwLCBkMTEsIGQxMiwgZDEzLCBkMTQsIGQxNSwgZDE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgZDE3LCBkMTgsIGQxOSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEluc3RhbnRpYXRpb25FcnJvcih0aGlzLCBlLCBlLnN0YWNrLCBwcm92aWRlci5rZXkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0QnlEZXBlbmRlbmN5KHByb3ZpZGVyOiBSZXNvbHZlZFByb3ZpZGVyLCBkZXA6IERlcGVuZGVuY3ksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlclZpc2liaWxpdHk6IFZpc2liaWxpdHkpOiBhbnkge1xuICAgIHZhciBzcGVjaWFsID0gaXNQcmVzZW50KHRoaXMuX2RlcFByb3ZpZGVyKSA/XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVwUHJvdmlkZXIuZ2V0RGVwZW5kZW5jeSh0aGlzLCBwcm92aWRlciwgZGVwKSA6XG4gICAgICAgICAgICAgICAgICAgICAgVU5ERUZJTkVEO1xuICAgIGlmIChzcGVjaWFsICE9PSBVTkRFRklORUQpIHtcbiAgICAgIHJldHVybiBzcGVjaWFsO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0QnlLZXkoZGVwLmtleSwgZGVwLmxvd2VyQm91bmRWaXNpYmlsaXR5LCBkZXAudXBwZXJCb3VuZFZpc2liaWxpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwLm9wdGlvbmFsLCBwcm92aWRlclZpc2liaWxpdHkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldEJ5S2V5KGtleTogS2V5LCBsb3dlckJvdW5kVmlzaWJpbGl0eTogT2JqZWN0LCB1cHBlckJvdW5kVmlzaWJpbGl0eTogT2JqZWN0LFxuICAgICAgICAgICAgICAgICAgICBvcHRpb25hbDogYm9vbGVhbiwgcHJvdmlkZXJWaXNpYmlsaXR5OiBWaXNpYmlsaXR5KTogYW55IHtcbiAgICBpZiAoa2V5ID09PSBJTkpFQ1RPUl9LRVkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlmICh1cHBlckJvdW5kVmlzaWJpbGl0eSBpbnN0YW5jZW9mIFNlbGZNZXRhZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEJ5S2V5U2VsZihrZXksIG9wdGlvbmFsLCBwcm92aWRlclZpc2liaWxpdHkpO1xuXG4gICAgfSBlbHNlIGlmICh1cHBlckJvdW5kVmlzaWJpbGl0eSBpbnN0YW5jZW9mIEhvc3RNZXRhZGF0YSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldEJ5S2V5SG9zdChrZXksIG9wdGlvbmFsLCBwcm92aWRlclZpc2liaWxpdHksIGxvd2VyQm91bmRWaXNpYmlsaXR5KTtcblxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2V0QnlLZXlEZWZhdWx0KGtleSwgb3B0aW9uYWwsIHByb3ZpZGVyVmlzaWJpbGl0eSwgbG93ZXJCb3VuZFZpc2liaWxpdHkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3Rocm93T3JOdWxsKGtleTogS2V5LCBvcHRpb25hbDogYm9vbGVhbik6IGFueSB7XG4gICAgaWYgKG9wdGlvbmFsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IE5vUHJvdmlkZXJFcnJvcih0aGlzLCBrZXkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldEJ5S2V5U2VsZihrZXk6IEtleSwgb3B0aW9uYWw6IGJvb2xlYW4sIHByb3ZpZGVyVmlzaWJpbGl0eTogVmlzaWJpbGl0eSk6IGFueSB7XG4gICAgdmFyIG9iaiA9IHRoaXMuX3N0cmF0ZWd5LmdldE9iakJ5S2V5SWQoa2V5LmlkLCBwcm92aWRlclZpc2liaWxpdHkpO1xuICAgIHJldHVybiAob2JqICE9PSBVTkRFRklORUQpID8gb2JqIDogdGhpcy5fdGhyb3dPck51bGwoa2V5LCBvcHRpb25hbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRCeUtleUhvc3Qoa2V5OiBLZXksIG9wdGlvbmFsOiBib29sZWFuLCBwcm92aWRlclZpc2liaWxpdHk6IFZpc2liaWxpdHksXG4gICAgICAgICAgICAgICAgbG93ZXJCb3VuZFZpc2liaWxpdHk6IE9iamVjdCk6IGFueSB7XG4gICAgdmFyIGluajogSW5qZWN0b3IgPSB0aGlzO1xuXG4gICAgaWYgKGxvd2VyQm91bmRWaXNpYmlsaXR5IGluc3RhbmNlb2YgU2tpcFNlbGZNZXRhZGF0YSkge1xuICAgICAgaWYgKGluai5faXNIb3N0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9nZXRQcml2YXRlRGVwZW5kZW5jeShrZXksIG9wdGlvbmFsLCBpbmopO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5qID0gaW5qLl9wYXJlbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgd2hpbGUgKGluaiAhPSBudWxsKSB7XG4gICAgICB2YXIgb2JqID0gaW5qLl9zdHJhdGVneS5nZXRPYmpCeUtleUlkKGtleS5pZCwgcHJvdmlkZXJWaXNpYmlsaXR5KTtcbiAgICAgIGlmIChvYmogIT09IFVOREVGSU5FRCkgcmV0dXJuIG9iajtcblxuICAgICAgaWYgKGlzUHJlc2VudChpbmouX3BhcmVudCkgJiYgaW5qLl9pc0hvc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFByaXZhdGVEZXBlbmRlbmN5KGtleSwgb3B0aW9uYWwsIGluaik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmogPSBpbmouX3BhcmVudDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGhyb3dPck51bGwoa2V5LCBvcHRpb25hbCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZXRQcml2YXRlRGVwZW5kZW5jeShrZXk6IEtleSwgb3B0aW9uYWw6IGJvb2xlYW4sIGluajogSW5qZWN0b3IpOiBhbnkge1xuICAgIHZhciBvYmogPSBpbmouX3BhcmVudC5fc3RyYXRlZ3kuZ2V0T2JqQnlLZXlJZChrZXkuaWQsIFZpc2liaWxpdHkuUHJpdmF0ZSk7XG4gICAgcmV0dXJuIChvYmogIT09IFVOREVGSU5FRCkgPyBvYmogOiB0aGlzLl90aHJvd09yTnVsbChrZXksIG9wdGlvbmFsKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dldEJ5S2V5RGVmYXVsdChrZXk6IEtleSwgb3B0aW9uYWw6IGJvb2xlYW4sIHByb3ZpZGVyVmlzaWJpbGl0eTogVmlzaWJpbGl0eSxcbiAgICAgICAgICAgICAgICAgICBsb3dlckJvdW5kVmlzaWJpbGl0eTogT2JqZWN0KTogYW55IHtcbiAgICB2YXIgaW5qOiBJbmplY3RvciA9IHRoaXM7XG5cbiAgICBpZiAobG93ZXJCb3VuZFZpc2liaWxpdHkgaW5zdGFuY2VvZiBTa2lwU2VsZk1ldGFkYXRhKSB7XG4gICAgICBwcm92aWRlclZpc2liaWxpdHkgPSBpbmouX2lzSG9zdCA/IFZpc2liaWxpdHkuUHVibGljQW5kUHJpdmF0ZSA6IFZpc2liaWxpdHkuUHVibGljO1xuICAgICAgaW5qID0gaW5qLl9wYXJlbnQ7XG4gICAgfVxuXG4gICAgd2hpbGUgKGluaiAhPSBudWxsKSB7XG4gICAgICB2YXIgb2JqID0gaW5qLl9zdHJhdGVneS5nZXRPYmpCeUtleUlkKGtleS5pZCwgcHJvdmlkZXJWaXNpYmlsaXR5KTtcbiAgICAgIGlmIChvYmogIT09IFVOREVGSU5FRCkgcmV0dXJuIG9iajtcblxuICAgICAgcHJvdmlkZXJWaXNpYmlsaXR5ID0gaW5qLl9pc0hvc3QgPyBWaXNpYmlsaXR5LlB1YmxpY0FuZFByaXZhdGUgOiBWaXNpYmlsaXR5LlB1YmxpYztcbiAgICAgIGluaiA9IGluai5fcGFyZW50O1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl90aHJvd09yTnVsbChrZXksIG9wdGlvbmFsKTtcbiAgfVxuXG4gIGdldCBkaXNwbGF5TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgSW5qZWN0b3IocHJvdmlkZXJzOiBbJHtfbWFwUHJvdmlkZXJzKHRoaXMsIGIgPT4gYCBcIiR7Yi5rZXkuZGlzcGxheU5hbWV9XCIgYCkuam9pbihcIiwgXCIpfV0pYDtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmRpc3BsYXlOYW1lOyB9XG59XG5cbnZhciBJTkpFQ1RPUl9LRVkgPSBLZXkuZ2V0KEluamVjdG9yKTtcblxuXG5mdW5jdGlvbiBfbWFwUHJvdmlkZXJzKGluamVjdG9yOiBJbmplY3RvciwgZm46IEZ1bmN0aW9uKTogYW55W10ge1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5qZWN0b3IuX3Byb3RvLm51bWJlck9mUHJvdmlkZXJzOyArK2kpIHtcbiAgICByZXMucHVzaChmbihpbmplY3Rvci5fcHJvdG8uZ2V0UHJvdmlkZXJBdEluZGV4KGkpKSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2RpL2luamVjdG9yLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgaXNKc09iamVjdCxcbiAgZ2xvYmFsLFxuICBpc1ByZXNlbnQsXG4gIGlzQmxhbmssXG4gIGlzQXJyYXksXG4gIGdldFN5bWJvbEl0ZXJhdG9yXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbmV4cG9ydCB2YXIgTWFwID0gZ2xvYmFsLk1hcDtcbmV4cG9ydCB2YXIgU2V0ID0gZ2xvYmFsLlNldDtcblxuLy8gU2FmYXJpIGFuZCBJbnRlcm5ldCBFeHBsb3JlciBkbyBub3Qgc3VwcG9ydCB0aGUgaXRlcmFibGUgcGFyYW1ldGVyIHRvIHRoZVxuLy8gTWFwIGNvbnN0cnVjdG9yLiAgV2Ugd29yayBhcm91bmQgdGhhdCBieSBtYW51YWxseSBhZGRpbmcgdGhlIGl0ZW1zLlxudmFyIGNyZWF0ZU1hcEZyb21QYWlyczogeyhwYWlyczogYW55W10pOiBNYXA8YW55LCBhbnk+fSA9IChmdW5jdGlvbigpIHtcbiAgdHJ5IHtcbiAgICBpZiAobmV3IE1hcCg8YW55PltbMSwgMl1dKS5zaXplID09PSAxKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlTWFwRnJvbVBhaXJzKHBhaXJzOiBhbnlbXSk6IE1hcDxhbnksIGFueT4geyByZXR1cm4gbmV3IE1hcChwYWlycyk7IH07XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU1hcEFuZFBvcHVsYXRlRnJvbVBhaXJzKHBhaXJzOiBhbnlbXSk6IE1hcDxhbnksIGFueT4ge1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpXTtcbiAgICAgIG1hcC5zZXQocGFpclswXSwgcGFpclsxXSk7XG4gICAgfVxuICAgIHJldHVybiBtYXA7XG4gIH07XG59KSgpO1xudmFyIGNyZWF0ZU1hcEZyb21NYXA6IHsobTogTWFwPGFueSwgYW55Pik6IE1hcDxhbnksIGFueT59ID0gKGZ1bmN0aW9uKCkge1xuICB0cnkge1xuICAgIGlmIChuZXcgTWFwKDxhbnk+bmV3IE1hcCgpKSkge1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNyZWF0ZU1hcEZyb21NYXAobTogTWFwPGFueSwgYW55Pik6IE1hcDxhbnksIGFueT4geyByZXR1cm4gbmV3IE1hcCg8YW55Pm0pOyB9O1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVNYXBBbmRQb3B1bGF0ZUZyb21NYXAobTogTWFwPGFueSwgYW55Pik6IE1hcDxhbnksIGFueT4ge1xuICAgIHZhciBtYXAgPSBuZXcgTWFwKCk7XG4gICAgbS5mb3JFYWNoKCh2LCBrKSA9PiB7IG1hcC5zZXQoaywgdik7IH0pO1xuICAgIHJldHVybiBtYXA7XG4gIH07XG59KSgpO1xudmFyIF9jbGVhclZhbHVlczogeyhtOiBNYXA8YW55LCBhbnk+KX0gPSAoZnVuY3Rpb24oKSB7XG4gIGlmICgoPGFueT4obmV3IE1hcCgpKS5rZXlzKCkpLm5leHQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gX2NsZWFyVmFsdWVzKG06IE1hcDxhbnksIGFueT4pIHtcbiAgICAgIHZhciBrZXlJdGVyYXRvciA9IG0ua2V5cygpO1xuICAgICAgdmFyIGs7XG4gICAgICB3aGlsZSAoISgoayA9ICg8YW55PmtleUl0ZXJhdG9yKS5uZXh0KCkpLmRvbmUpKSB7XG4gICAgICAgIG0uc2V0KGsudmFsdWUsIG51bGwpO1xuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIF9jbGVhclZhbHVlc1dpdGhGb3JlRWFjaChtOiBNYXA8YW55LCBhbnk+KSB7XG4gICAgICBtLmZvckVhY2goKHYsIGspID0+IHsgbS5zZXQoaywgbnVsbCk7IH0pO1xuICAgIH07XG4gIH1cbn0pKCk7XG4vLyBTYWZhcmkgZG9lc24ndCBpbXBsZW1lbnQgTWFwSXRlcmF0b3IubmV4dCgpLCB3aGljaCBpcyB1c2VkIGlzIFRyYWNldXIncyBwb2x5ZmlsbCBvZiBBcnJheS5mcm9tXG4vLyBUT0RPKG1sYXZhbCk6IHJlbW92ZSB0aGUgd29yayBhcm91bmQgb25jZSB3ZSBoYXZlIGEgd29ya2luZyBwb2x5ZmlsbCBvZiBBcnJheS5mcm9tXG52YXIgX2FycmF5RnJvbU1hcDogeyhtOiBNYXA8YW55LCBhbnk+LCBnZXRWYWx1ZXM6IGJvb2xlYW4pOiBhbnlbXX0gPSAoZnVuY3Rpb24oKSB7XG4gIHRyeSB7XG4gICAgaWYgKCg8YW55PihuZXcgTWFwKCkpLnZhbHVlcygpKS5uZXh0KSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTWFwKG06IE1hcDxhbnksIGFueT4sIGdldFZhbHVlczogYm9vbGVhbik6IGFueVtdIHtcbiAgICAgICAgcmV0dXJuIGdldFZhbHVlcyA/ICg8YW55PkFycmF5KS5mcm9tKG0udmFsdWVzKCkpIDogKDxhbnk+QXJyYXkpLmZyb20obS5rZXlzKCkpO1xuICAgICAgfTtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gY3JlYXRlQXJyYXlGcm9tTWFwV2l0aEZvcmVhY2gobTogTWFwPGFueSwgYW55PiwgZ2V0VmFsdWVzOiBib29sZWFuKTogYW55W10ge1xuICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUobS5zaXplKSwgaSA9IDA7XG4gICAgbS5mb3JFYWNoKCh2LCBrKSA9PiB7XG4gICAgICByZXNbaV0gPSBnZXRWYWx1ZXMgPyB2IDogaztcbiAgICAgIGkrKztcbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xufSkoKTtcblxuZXhwb3J0IGNsYXNzIE1hcFdyYXBwZXIge1xuICBzdGF0aWMgY2xvbmU8SywgVj4obTogTWFwPEssIFY+KTogTWFwPEssIFY+IHsgcmV0dXJuIGNyZWF0ZU1hcEZyb21NYXAobSk7IH1cbiAgc3RhdGljIGNyZWF0ZUZyb21TdHJpbmdNYXA8VD4oc3RyaW5nTWFwOiB7W2tleTogc3RyaW5nXTogVH0pOiBNYXA8c3RyaW5nLCBUPiB7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBNYXA8c3RyaW5nLCBUPigpO1xuICAgIGZvciAodmFyIHByb3AgaW4gc3RyaW5nTWFwKSB7XG4gICAgICByZXN1bHQuc2V0KHByb3AsIHN0cmluZ01hcFtwcm9wXSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgc3RhdGljIHRvU3RyaW5nTWFwPFQ+KG06IE1hcDxzdHJpbmcsIFQ+KToge1trZXk6IHN0cmluZ106IFR9IHtcbiAgICB2YXIgcjoge1trZXk6IHN0cmluZ106IFR9ID0ge307XG4gICAgbS5mb3JFYWNoKCh2LCBrKSA9PiByW2tdID0gdik7XG4gICAgcmV0dXJuIHI7XG4gIH1cbiAgc3RhdGljIGNyZWF0ZUZyb21QYWlycyhwYWlyczogYW55W10pOiBNYXA8YW55LCBhbnk+IHsgcmV0dXJuIGNyZWF0ZU1hcEZyb21QYWlycyhwYWlycyk7IH1cbiAgc3RhdGljIGNsZWFyVmFsdWVzKG06IE1hcDxhbnksIGFueT4pIHsgX2NsZWFyVmFsdWVzKG0pOyB9XG4gIHN0YXRpYyBpdGVyYWJsZTxUPihtOiBUKTogVCB7IHJldHVybiBtOyB9XG4gIHN0YXRpYyBrZXlzPEs+KG06IE1hcDxLLCBhbnk+KTogS1tdIHsgcmV0dXJuIF9hcnJheUZyb21NYXAobSwgZmFsc2UpOyB9XG4gIHN0YXRpYyB2YWx1ZXM8Vj4obTogTWFwPGFueSwgVj4pOiBWW10geyByZXR1cm4gX2FycmF5RnJvbU1hcChtLCB0cnVlKTsgfVxufVxuXG4vKipcbiAqIFdyYXBzIEphdmFzY3JpcHQgT2JqZWN0c1xuICovXG5leHBvcnQgY2xhc3MgU3RyaW5nTWFwV3JhcHBlciB7XG4gIHN0YXRpYyBjcmVhdGUoKToge1trOiAvKmFueSovIHN0cmluZ106IGFueX0ge1xuICAgIC8vIE5vdGU6IFdlIGFyZSBub3QgdXNpbmcgT2JqZWN0LmNyZWF0ZShudWxsKSBoZXJlIGR1ZSB0b1xuICAgIC8vIHBlcmZvcm1hbmNlIVxuICAgIC8vIGh0dHA6Ly9qc3BlcmYuY29tL25nMi1vYmplY3QtY3JlYXRlLW51bGxcbiAgICByZXR1cm4ge307XG4gIH1cbiAgc3RhdGljIGNvbnRhaW5zKG1hcDoge1trZXk6IHN0cmluZ106IGFueX0sIGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIG1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpO1xuICB9XG4gIHN0YXRpYyBnZXQ8Vj4obWFwOiB7W2tleTogc3RyaW5nXTogVn0sIGtleTogc3RyaW5nKTogViB7XG4gICAgcmV0dXJuIG1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpID8gbWFwW2tleV0gOiB1bmRlZmluZWQ7XG4gIH1cbiAgc3RhdGljIHNldDxWPihtYXA6IHtba2V5OiBzdHJpbmddOiBWfSwga2V5OiBzdHJpbmcsIHZhbHVlOiBWKSB7IG1hcFtrZXldID0gdmFsdWU7IH1cbiAgc3RhdGljIGtleXMobWFwOiB7W2tleTogc3RyaW5nXTogYW55fSk6IHN0cmluZ1tdIHsgcmV0dXJuIE9iamVjdC5rZXlzKG1hcCk7IH1cbiAgc3RhdGljIGlzRW1wdHkobWFwOiB7W2tleTogc3RyaW5nXTogYW55fSk6IGJvb2xlYW4ge1xuICAgIGZvciAodmFyIHByb3AgaW4gbWFwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHN0YXRpYyBkZWxldGUgKG1hcDoge1trZXk6IHN0cmluZ106IGFueX0sIGtleTogc3RyaW5nKSB7IGRlbGV0ZSBtYXBba2V5XTsgfVxuICBzdGF0aWMgZm9yRWFjaDxLLCBWPihtYXA6IHtba2V5OiBzdHJpbmddOiBWfSwgY2FsbGJhY2s6IC8qKFYsIEspID0+IHZvaWQqLyBGdW5jdGlvbikge1xuICAgIGZvciAodmFyIHByb3AgaW4gbWFwKSB7XG4gICAgICBpZiAobWFwLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIGNhbGxiYWNrKG1hcFtwcm9wXSwgcHJvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIG1lcmdlPFY+KG0xOiB7W2tleTogc3RyaW5nXTogVn0sIG0yOiB7W2tleTogc3RyaW5nXTogVn0pOiB7W2tleTogc3RyaW5nXTogVn0ge1xuICAgIHZhciBtOiB7W2tleTogc3RyaW5nXTogVn0gPSB7fTtcblxuICAgIGZvciAodmFyIGF0dHIgaW4gbTEpIHtcbiAgICAgIGlmIChtMS5oYXNPd25Qcm9wZXJ0eShhdHRyKSkge1xuICAgICAgICBtW2F0dHJdID0gbTFbYXR0cl07XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgYXR0ciBpbiBtMikge1xuICAgICAgaWYgKG0yLmhhc093blByb3BlcnR5KGF0dHIpKSB7XG4gICAgICAgIG1bYXR0cl0gPSBtMlthdHRyXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbTtcbiAgfVxuXG4gIHN0YXRpYyBlcXVhbHM8Vj4obTE6IHtba2V5OiBzdHJpbmddOiBWfSwgbTI6IHtba2V5OiBzdHJpbmddOiBWfSk6IGJvb2xlYW4ge1xuICAgIHZhciBrMSA9IE9iamVjdC5rZXlzKG0xKTtcbiAgICB2YXIgazIgPSBPYmplY3Qua2V5cyhtMik7XG4gICAgaWYgKGsxLmxlbmd0aCAhPSBrMi5sZW5ndGgpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGtleTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGsxLmxlbmd0aDsgaSsrKSB7XG4gICAgICBrZXkgPSBrMVtpXTtcbiAgICAgIGlmIChtMVtrZXldICE9PSBtMltrZXldKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGJvb2xlYW4tdmFsdWVkIGZ1bmN0aW9uIG92ZXIgYSB2YWx1ZSwgcG9zc2libHkgaW5jbHVkaW5nIGNvbnRleHQgaW5mb3JtYXRpb25cbiAqIHJlZ2FyZGluZyB0aGF0IHZhbHVlJ3MgcG9zaXRpb24gaW4gYW4gYXJyYXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUHJlZGljYXRlPFQ+IHsgKHZhbHVlOiBULCBpbmRleD86IG51bWJlciwgYXJyYXk/OiBUW10pOiBib29sZWFuOyB9XG5cbmV4cG9ydCBjbGFzcyBMaXN0V3JhcHBlciB7XG4gIC8vIEpTIGhhcyBubyB3YXkgdG8gZXhwcmVzcyBhIHN0YXRpY2FsbHkgZml4ZWQgc2l6ZSBsaXN0LCBidXQgZGFydCBkb2VzIHNvIHdlXG4gIC8vIGtlZXAgYm90aCBtZXRob2RzLlxuICBzdGF0aWMgY3JlYXRlRml4ZWRTaXplKHNpemU6IG51bWJlcik6IGFueVtdIHsgcmV0dXJuIG5ldyBBcnJheShzaXplKTsgfVxuICBzdGF0aWMgY3JlYXRlR3Jvd2FibGVTaXplKHNpemU6IG51bWJlcik6IGFueVtdIHsgcmV0dXJuIG5ldyBBcnJheShzaXplKTsgfVxuICBzdGF0aWMgY2xvbmU8VD4oYXJyYXk6IFRbXSk6IFRbXSB7IHJldHVybiBhcnJheS5zbGljZSgwKTsgfVxuICBzdGF0aWMgZm9yRWFjaFdpdGhJbmRleDxUPihhcnJheTogVFtdLCBmbjogKHQ6IFQsIG46IG51bWJlcikgPT4gdm9pZCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZuKGFycmF5W2ldLCBpKTtcbiAgICB9XG4gIH1cbiAgc3RhdGljIGZpcnN0PFQ+KGFycmF5OiBUW10pOiBUIHtcbiAgICBpZiAoIWFycmF5KSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gYXJyYXlbMF07XG4gIH1cbiAgc3RhdGljIGxhc3Q8VD4oYXJyYXk6IFRbXSk6IFQge1xuICAgIGlmICghYXJyYXkgfHwgYXJyYXkubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuICAgIHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTtcbiAgfVxuICBzdGF0aWMgaW5kZXhPZjxUPihhcnJheTogVFtdLCB2YWx1ZTogVCwgc3RhcnRJbmRleDogbnVtYmVyID0gMCk6IG51bWJlciB7XG4gICAgcmV0dXJuIGFycmF5LmluZGV4T2YodmFsdWUsIHN0YXJ0SW5kZXgpO1xuICB9XG4gIHN0YXRpYyBjb250YWluczxUPihsaXN0OiBUW10sIGVsOiBUKTogYm9vbGVhbiB7IHJldHVybiBsaXN0LmluZGV4T2YoZWwpICE9PSAtMTsgfVxuICBzdGF0aWMgcmV2ZXJzZWQ8VD4oYXJyYXk6IFRbXSk6IFRbXSB7XG4gICAgdmFyIGEgPSBMaXN0V3JhcHBlci5jbG9uZShhcnJheSk7XG4gICAgcmV0dXJuIGEucmV2ZXJzZSgpO1xuICB9XG4gIHN0YXRpYyBjb25jYXQoYTogYW55W10sIGI6IGFueVtdKTogYW55W10geyByZXR1cm4gYS5jb25jYXQoYik7IH1cbiAgc3RhdGljIGluc2VydDxUPihsaXN0OiBUW10sIGluZGV4OiBudW1iZXIsIHZhbHVlOiBUKSB7IGxpc3Quc3BsaWNlKGluZGV4LCAwLCB2YWx1ZSk7IH1cbiAgc3RhdGljIHJlbW92ZUF0PFQ+KGxpc3Q6IFRbXSwgaW5kZXg6IG51bWJlcik6IFQge1xuICAgIHZhciByZXMgPSBsaXN0W2luZGV4XTtcbiAgICBsaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBzdGF0aWMgcmVtb3ZlQWxsPFQ+KGxpc3Q6IFRbXSwgaXRlbXM6IFRbXSkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBpbmRleCA9IGxpc3QuaW5kZXhPZihpdGVtc1tpXSk7XG4gICAgICBsaXN0LnNwbGljZShpbmRleCwgMSk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyByZW1vdmU8VD4obGlzdDogVFtdLCBlbDogVCk6IGJvb2xlYW4ge1xuICAgIHZhciBpbmRleCA9IGxpc3QuaW5kZXhPZihlbCk7XG4gICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgc3RhdGljIGNsZWFyKGxpc3Q6IGFueVtdKSB7IGxpc3QubGVuZ3RoID0gMDsgfVxuICBzdGF0aWMgaXNFbXB0eShsaXN0OiBhbnlbXSk6IGJvb2xlYW4geyByZXR1cm4gbGlzdC5sZW5ndGggPT0gMDsgfVxuICBzdGF0aWMgZmlsbChsaXN0OiBhbnlbXSwgdmFsdWU6IGFueSwgc3RhcnQ6IG51bWJlciA9IDAsIGVuZDogbnVtYmVyID0gbnVsbCkge1xuICAgIGxpc3QuZmlsbCh2YWx1ZSwgc3RhcnQsIGVuZCA9PT0gbnVsbCA/IGxpc3QubGVuZ3RoIDogZW5kKTtcbiAgfVxuICBzdGF0aWMgZXF1YWxzKGE6IGFueVtdLCBiOiBhbnlbXSk6IGJvb2xlYW4ge1xuICAgIGlmIChhLmxlbmd0aCAhPSBiLmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgc3RhdGljIHNsaWNlPFQ+KGw6IFRbXSwgZnJvbTogbnVtYmVyID0gMCwgdG86IG51bWJlciA9IG51bGwpOiBUW10ge1xuICAgIHJldHVybiBsLnNsaWNlKGZyb20sIHRvID09PSBudWxsID8gdW5kZWZpbmVkIDogdG8pO1xuICB9XG4gIHN0YXRpYyBzcGxpY2U8VD4obDogVFtdLCBmcm9tOiBudW1iZXIsIGxlbmd0aDogbnVtYmVyKTogVFtdIHsgcmV0dXJuIGwuc3BsaWNlKGZyb20sIGxlbmd0aCk7IH1cbiAgc3RhdGljIHNvcnQ8VD4obDogVFtdLCBjb21wYXJlRm4/OiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKSB7XG4gICAgaWYgKGlzUHJlc2VudChjb21wYXJlRm4pKSB7XG4gICAgICBsLnNvcnQoY29tcGFyZUZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbC5zb3J0KCk7XG4gICAgfVxuICB9XG4gIHN0YXRpYyB0b1N0cmluZzxUPihsOiBUW10pOiBzdHJpbmcgeyByZXR1cm4gbC50b1N0cmluZygpOyB9XG4gIHN0YXRpYyB0b0pTT048VD4obDogVFtdKTogc3RyaW5nIHsgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGwpOyB9XG5cbiAgc3RhdGljIG1heGltdW08VD4obGlzdDogVFtdLCBwcmVkaWNhdGU6ICh0OiBUKSA9PiBudW1iZXIpOiBUIHtcbiAgICBpZiAobGlzdC5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciBzb2x1dGlvbiA9IG51bGw7XG4gICAgdmFyIG1heFZhbHVlID0gLUluZmluaXR5O1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsaXN0Lmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGNhbmRpZGF0ZSA9IGxpc3RbaW5kZXhdO1xuICAgICAgaWYgKGlzQmxhbmsoY2FuZGlkYXRlKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHZhciBjYW5kaWRhdGVWYWx1ZSA9IHByZWRpY2F0ZShjYW5kaWRhdGUpO1xuICAgICAgaWYgKGNhbmRpZGF0ZVZhbHVlID4gbWF4VmFsdWUpIHtcbiAgICAgICAgc29sdXRpb24gPSBjYW5kaWRhdGU7XG4gICAgICAgIG1heFZhbHVlID0gY2FuZGlkYXRlVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzb2x1dGlvbjtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNMaXN0TGlrZUl0ZXJhYmxlKG9iajogYW55KTogYm9vbGVhbiB7XG4gIGlmICghaXNKc09iamVjdChvYmopKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBpc0FycmF5KG9iaikgfHxcbiAgICAgICAgICghKG9iaiBpbnN0YW5jZW9mIE1hcCkgJiYgICAgICAvLyBKUyBNYXAgYXJlIGl0ZXJhYmxlcyBidXQgcmV0dXJuIGVudHJpZXMgYXMgW2ssIHZdXG4gICAgICAgICAgZ2V0U3ltYm9sSXRlcmF0b3IoKSBpbiBvYmopOyAgLy8gSlMgSXRlcmFibGUgaGF2ZSBhIFN5bWJvbC5pdGVyYXRvciBwcm9wXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlTGlzdExpa2Uob2JqOiBhbnksIGZuOiBGdW5jdGlvbikge1xuICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGZuKG9ialtpXSk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBpdGVyYXRvciA9IG9ialtnZXRTeW1ib2xJdGVyYXRvcigpXSgpO1xuICAgIHZhciBpdGVtO1xuICAgIHdoaWxlICghKChpdGVtID0gaXRlcmF0b3IubmV4dCgpKS5kb25lKSkge1xuICAgICAgZm4oaXRlbS52YWx1ZSk7XG4gICAgfVxuICB9XG59XG5cbi8vIFNhZmFyaSBhbmQgSW50ZXJuZXQgRXhwbG9yZXIgZG8gbm90IHN1cHBvcnQgdGhlIGl0ZXJhYmxlIHBhcmFtZXRlciB0byB0aGVcbi8vIFNldCBjb25zdHJ1Y3Rvci4gIFdlIHdvcmsgYXJvdW5kIHRoYXQgYnkgbWFudWFsbHkgYWRkaW5nIHRoZSBpdGVtcy5cbnZhciBjcmVhdGVTZXRGcm9tTGlzdDogeyhsc3Q6IGFueVtdKTogU2V0PGFueT59ID0gKGZ1bmN0aW9uKCkge1xuICB2YXIgdGVzdCA9IG5ldyBTZXQoWzEsIDIsIDNdKTtcbiAgaWYgKHRlc3Quc2l6ZSA9PT0gMykge1xuICAgIHJldHVybiBmdW5jdGlvbiBjcmVhdGVTZXRGcm9tTGlzdChsc3Q6IGFueVtdKTogU2V0PGFueT4geyByZXR1cm4gbmV3IFNldChsc3QpOyB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmdW5jdGlvbiBjcmVhdGVTZXRBbmRQb3B1bGF0ZUZyb21MaXN0KGxzdDogYW55W10pOiBTZXQ8YW55PiB7XG4gICAgICB2YXIgcmVzID0gbmV3IFNldChsc3QpO1xuICAgICAgaWYgKHJlcy5zaXplICE9PSBsc3QubGVuZ3RoKSB7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbHN0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgcmVzLmFkZChsc3RbaV0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gIH1cbn0pKCk7XG5leHBvcnQgY2xhc3MgU2V0V3JhcHBlciB7XG4gIHN0YXRpYyBjcmVhdGVGcm9tTGlzdDxUPihsc3Q6IFRbXSk6IFNldDxUPiB7IHJldHVybiBjcmVhdGVTZXRGcm9tTGlzdChsc3QpOyB9XG4gIHN0YXRpYyBoYXM8VD4oczogU2V0PFQ+LCBrZXk6IFQpOiBib29sZWFuIHsgcmV0dXJuIHMuaGFzKGtleSk7IH1cbiAgc3RhdGljIGRlbGV0ZTxLPihtOiBTZXQ8Sz4sIGs6IEspIHsgbS5kZWxldGUoayk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbi50c1xuICoqLyIsImltcG9ydCB7XG4gIFR5cGUsXG4gIGlzQmxhbmssXG4gIGlzUHJlc2VudCxcbiAgQ09OU1QsXG4gIENPTlNUX0VYUFIsXG4gIHN0cmluZ2lmeSxcbiAgaXNBcnJheSxcbiAgaXNUeXBlLFxuICBpc0Z1bmN0aW9uLFxuICBub3JtYWxpemVCb29sXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge01hcFdyYXBwZXIsIExpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtyZWZsZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5pbXBvcnQge0tleX0gZnJvbSAnLi9rZXknO1xuaW1wb3J0IHtcbiAgSW5qZWN0TWV0YWRhdGEsXG4gIEluamVjdGFibGVNZXRhZGF0YSxcbiAgT3B0aW9uYWxNZXRhZGF0YSxcbiAgU2VsZk1ldGFkYXRhLFxuICBIb3N0TWV0YWRhdGEsXG4gIFNraXBTZWxmTWV0YWRhdGEsXG4gIERlcGVuZGVuY3lNZXRhZGF0YVxufSBmcm9tICcuL21ldGFkYXRhJztcbmltcG9ydCB7XG4gIE5vQW5ub3RhdGlvbkVycm9yLFxuICBNaXhpbmdNdWx0aVByb3ZpZGVyc1dpdGhSZWd1bGFyUHJvdmlkZXJzRXJyb3IsXG4gIEludmFsaWRQcm92aWRlckVycm9yXG59IGZyb20gJy4vZXhjZXB0aW9ucyc7XG5pbXBvcnQge3Jlc29sdmVGb3J3YXJkUmVmfSBmcm9tICcuL2ZvcndhcmRfcmVmJztcblxuLyoqXG4gKiBgRGVwZW5kZW5jeWAgaXMgdXNlZCBieSB0aGUgZnJhbWV3b3JrIHRvIGV4dGVuZCBESS5cbiAqIFRoaXMgaXMgaW50ZXJuYWwgdG8gQW5ndWxhciBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5LlxuICovXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jeSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBrZXk6IEtleSwgcHVibGljIG9wdGlvbmFsOiBib29sZWFuLCBwdWJsaWMgbG93ZXJCb3VuZFZpc2liaWxpdHk6IGFueSxcbiAgICAgICAgICAgICAgcHVibGljIHVwcGVyQm91bmRWaXNpYmlsaXR5OiBhbnksIHB1YmxpYyBwcm9wZXJ0aWVzOiBhbnlbXSkge31cblxuICBzdGF0aWMgZnJvbUtleShrZXk6IEtleSk6IERlcGVuZGVuY3kgeyByZXR1cm4gbmV3IERlcGVuZGVuY3koa2V5LCBmYWxzZSwgbnVsbCwgbnVsbCwgW10pOyB9XG59XG5cbmNvbnN0IF9FTVBUWV9MSVNUID0gQ09OU1RfRVhQUihbXSk7XG5cbi8qKlxuICogRGVzY3JpYmVzIGhvdyB0aGUge0BsaW5rIEluamVjdG9yfSBzaG91bGQgaW5zdGFudGlhdGUgYSBnaXZlbiB0b2tlbi5cbiAqXG4gKiBTZWUge0BsaW5rIHByb3ZpZGV9LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9HTkF5ajZLNlBmWWcyTkJ6Z3daNT9wJTNEcHJldmlldyZwPXByZXZpZXcpKVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICogICBuZXcgUHJvdmlkZXIoXCJtZXNzYWdlXCIsIHsgdXNlVmFsdWU6ICdIZWxsbycgfSlcbiAqIF0pO1xuICpcbiAqIGV4cGVjdChpbmplY3Rvci5nZXQoXCJtZXNzYWdlXCIpKS50b0VxdWFsKCdIZWxsbycpO1xuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgUHJvdmlkZXIge1xuICAvKipcbiAgICogVG9rZW4gdXNlZCB3aGVuIHJldHJpZXZpbmcgdGhpcyBwcm92aWRlci4gVXN1YWxseSwgaXQgaXMgYSB0eXBlIHtAbGluayBUeXBlfS5cbiAgICovXG4gIHRva2VuO1xuXG4gIC8qKlxuICAgKiBCaW5kcyBhIERJIHRva2VuIHRvIGFuIGltcGxlbWVudGF0aW9uIGNsYXNzLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvUlNURzg2cWdtb3hDeWo5U1dQd1k/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogQmVjYXVzZSBgdXNlRXhpc3RpbmdgIGFuZCBgdXNlQ2xhc3NgIGFyZSBvZnRlbiBjb25mdXNlZCwgdGhlIGV4YW1wbGUgY29udGFpbnNcbiAgICogYm90aCB1c2UgY2FzZXMgZm9yIGVhc3kgY29tcGFyaXNvbi5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBWZWhpY2xlIHt9XG4gICAqXG4gICAqIGNsYXNzIENhciBleHRlbmRzIFZlaGljbGUge31cbiAgICpcbiAgICogdmFyIGluamVjdG9yQ2xhc3MgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBDYXIsXG4gICAqICAgbmV3IFByb3ZpZGVyKFZlaGljbGUsIHsgdXNlQ2xhc3M6IENhciB9KVxuICAgKiBdKTtcbiAgICogdmFyIGluamVjdG9yQWxpYXMgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBDYXIsXG4gICAqICAgbmV3IFByb3ZpZGVyKFZlaGljbGUsIHsgdXNlRXhpc3Rpbmc6IENhciB9KVxuICAgKiBdKTtcbiAgICpcbiAgICogZXhwZWN0KGluamVjdG9yQ2xhc3MuZ2V0KFZlaGljbGUpKS5ub3QudG9CZShpbmplY3RvckNsYXNzLmdldChDYXIpKTtcbiAgICogZXhwZWN0KGluamVjdG9yQ2xhc3MuZ2V0KFZlaGljbGUpIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3JBbGlhcy5nZXQoVmVoaWNsZSkpLnRvQmUoaW5qZWN0b3JBbGlhcy5nZXQoQ2FyKSk7XG4gICAqIGV4cGVjdChpbmplY3RvckFsaWFzLmdldChWZWhpY2xlKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTtcbiAgICogYGBgXG4gICAqL1xuICB1c2VDbGFzczogVHlwZTtcblxuICAvKipcbiAgICogQmluZHMgYSBESSB0b2tlbiB0byBhIHZhbHVlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvVUZWc01WUUlEZTdsNHdhV3ppRVM/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgamF2YXNjcmlwdFxuICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBuZXcgUHJvdmlkZXIoXCJtZXNzYWdlXCIsIHsgdXNlVmFsdWU6ICdIZWxsbycgfSlcbiAgICogXSk7XG4gICAqXG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXQoXCJtZXNzYWdlXCIpKS50b0VxdWFsKCdIZWxsbycpO1xuICAgKiBgYGBcbiAgICovXG4gIHVzZVZhbHVlO1xuXG4gIC8qKlxuICAgKiBCaW5kcyBhIERJIHRva2VuIHRvIGFuIGV4aXN0aW5nIHRva2VuLlxuICAgKlxuICAgKiB7QGxpbmsgSW5qZWN0b3J9IHJldHVybnMgdGhlIHNhbWUgaW5zdGFuY2UgYXMgaWYgdGhlIHByb3ZpZGVkIHRva2VuIHdhcyB1c2VkLlxuICAgKiBUaGlzIGlzIGluIGNvbnRyYXN0IHRvIGB1c2VDbGFzc2Agd2hlcmUgYSBzZXBhcmF0ZSBpbnN0YW5jZSBvZiBgdXNlQ2xhc3NgIGlzIHJldHVybmVkLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvUXNhdHNPSko2UDhUMmZNZTlncjg/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogQmVjYXVzZSBgdXNlRXhpc3RpbmdgIGFuZCBgdXNlQ2xhc3NgIGFyZSBvZnRlbiBjb25mdXNlZCB0aGUgZXhhbXBsZSBjb250YWluc1xuICAgKiBib3RoIHVzZSBjYXNlcyBmb3IgZWFzeSBjb21wYXJpc29uLlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNsYXNzIFZlaGljbGUge31cbiAgICpcbiAgICogY2xhc3MgQ2FyIGV4dGVuZHMgVmVoaWNsZSB7fVxuICAgKlxuICAgKiB2YXIgaW5qZWN0b3JBbGlhcyA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIENhcixcbiAgICogICBuZXcgUHJvdmlkZXIoVmVoaWNsZSwgeyB1c2VFeGlzdGluZzogQ2FyIH0pXG4gICAqIF0pO1xuICAgKiB2YXIgaW5qZWN0b3JDbGFzcyA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIENhcixcbiAgICogICBuZXcgUHJvdmlkZXIoVmVoaWNsZSwgeyB1c2VDbGFzczogQ2FyIH0pXG4gICAqIF0pO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3JBbGlhcy5nZXQoVmVoaWNsZSkpLnRvQmUoaW5qZWN0b3JBbGlhcy5nZXQoQ2FyKSk7XG4gICAqIGV4cGVjdChpbmplY3RvckFsaWFzLmdldChWZWhpY2xlKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTtcbiAgICpcbiAgICogZXhwZWN0KGluamVjdG9yQ2xhc3MuZ2V0KFZlaGljbGUpKS5ub3QudG9CZShpbmplY3RvckNsYXNzLmdldChDYXIpKTtcbiAgICogZXhwZWN0KGluamVjdG9yQ2xhc3MuZ2V0KFZlaGljbGUpIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpO1xuICAgKiBgYGBcbiAgICovXG4gIHVzZUV4aXN0aW5nO1xuXG4gIC8qKlxuICAgKiBCaW5kcyBhIERJIHRva2VuIHRvIGEgZnVuY3Rpb24gd2hpY2ggY29tcHV0ZXMgdGhlIHZhbHVlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvU2NveHkwcEpOcUtHQVBaWTFWVkM/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBuZXcgUHJvdmlkZXIoTnVtYmVyLCB7IHVzZUZhY3Rvcnk6ICgpID0+IHsgcmV0dXJuIDErMjsgfX0pLFxuICAgKiAgIG5ldyBQcm92aWRlcihTdHJpbmcsIHsgdXNlRmFjdG9yeTogKHZhbHVlKSA9PiB7IHJldHVybiBcIlZhbHVlOiBcIiArIHZhbHVlOyB9LFxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgZGVwczogW051bWJlcl0gfSlcbiAgICogXSk7XG4gICAqXG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXQoTnVtYmVyKSkudG9FcXVhbCgzKTtcbiAgICogZXhwZWN0KGluamVjdG9yLmdldChTdHJpbmcpKS50b0VxdWFsKCdWYWx1ZTogMycpO1xuICAgKiBgYGBcbiAgICpcbiAgICogVXNlZCBpbiBjb25qdWN0aW9uIHdpdGggZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgdXNlRmFjdG9yeTogRnVuY3Rpb247XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHNldCBvZiBkZXBlbmRlbmNpZXNcbiAgICogKGFzIGB0b2tlbmBzKSB3aGljaCBzaG91bGQgYmUgaW5qZWN0ZWQgaW50byB0aGUgZmFjdG9yeSBmdW5jdGlvbi5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L1Njb3h5MHBKTnFLR0FQWlkxVlZDP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gICAqICAgbmV3IFByb3ZpZGVyKE51bWJlciwgeyB1c2VGYWN0b3J5OiAoKSA9PiB7IHJldHVybiAxKzI7IH19KSxcbiAgICogICBuZXcgUHJvdmlkZXIoU3RyaW5nLCB7IHVzZUZhY3Rvcnk6ICh2YWx1ZSkgPT4geyByZXR1cm4gXCJWYWx1ZTogXCIgKyB2YWx1ZTsgfSxcbiAgICogICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IFtOdW1iZXJdIH0pXG4gICAqIF0pO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KE51bWJlcikpLnRvRXF1YWwoMyk7XG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXQoU3RyaW5nKSkudG9FcXVhbCgnVmFsdWU6IDMnKTtcbiAgICogYGBgXG4gICAqXG4gICAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgdXNlRmFjdG9yeWAuXG4gICAqL1xuICBkZXBlbmRlbmNpZXM6IE9iamVjdFtdO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX211bHRpOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKHRva2VuLCB7dXNlQ2xhc3MsIHVzZVZhbHVlLCB1c2VFeGlzdGluZywgdXNlRmFjdG9yeSwgZGVwcywgbXVsdGl9OiB7XG4gICAgdXNlQ2xhc3M/OiBUeXBlLFxuICAgIHVzZVZhbHVlPzogYW55LFxuICAgIHVzZUV4aXN0aW5nPzogYW55LFxuICAgIHVzZUZhY3Rvcnk/OiBGdW5jdGlvbixcbiAgICBkZXBzPzogT2JqZWN0W10sXG4gICAgbXVsdGk/OiBib29sZWFuXG4gIH0pIHtcbiAgICB0aGlzLnRva2VuID0gdG9rZW47XG4gICAgdGhpcy51c2VDbGFzcyA9IHVzZUNsYXNzO1xuICAgIHRoaXMudXNlVmFsdWUgPSB1c2VWYWx1ZTtcbiAgICB0aGlzLnVzZUV4aXN0aW5nID0gdXNlRXhpc3Rpbmc7XG4gICAgdGhpcy51c2VGYWN0b3J5ID0gdXNlRmFjdG9yeTtcbiAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcHM7XG4gICAgdGhpcy5fbXVsdGkgPSBtdWx0aTtcbiAgfVxuXG4gIC8vIFRPRE86IFByb3ZpZGUgYSBmdWxsIHdvcmtpbmcgZXhhbXBsZSBhZnRlciBhbHBoYTM4IGlzIHJlbGVhc2VkLlxuICAvKipcbiAgICogQ3JlYXRlcyBtdWx0aXBsZSBwcm92aWRlcnMgbWF0Y2hpbmcgdGhlIHNhbWUgdG9rZW4gKGEgbXVsdGktcHJvdmlkZXIpLlxuICAgKlxuICAgKiBNdWx0aS1wcm92aWRlcnMgYXJlIHVzZWQgZm9yIGNyZWF0aW5nIHBsdWdnYWJsZSBzZXJ2aWNlLCB3aGVyZSB0aGUgc3lzdGVtIGNvbWVzXG4gICAqIHdpdGggc29tZSBkZWZhdWx0IHByb3ZpZGVycywgYW5kIHRoZSB1c2VyIGNhbiByZWdpc3RlciBhZGRpdG9uYWwgcHJvdmlkZXJzLlxuICAgKiBUaGUgY29tYmluYXRpb24gb2YgdGhlIGRlZmF1bHQgcHJvdmlkZXJzIGFuZCB0aGUgYWRkaXRpb25hbCBwcm92aWRlcnMgd2lsbCBiZVxuICAgKiB1c2VkIHRvIGRyaXZlIHRoZSBiZWhhdmlvciBvZiB0aGUgc3lzdGVtLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIG5ldyBQcm92aWRlcihcIlN0cmluZ3NcIiwgeyB1c2VWYWx1ZTogXCJTdHJpbmcxXCIsIG11bHRpOiB0cnVlfSksXG4gICAqICAgbmV3IFByb3ZpZGVyKFwiU3RyaW5nc1wiLCB7IHVzZVZhbHVlOiBcIlN0cmluZzJcIiwgbXVsdGk6IHRydWV9KVxuICAgKiBdKTtcbiAgICpcbiAgICogZXhwZWN0KGluamVjdG9yLmdldChcIlN0cmluZ3NcIikpLnRvRXF1YWwoW1wiU3RyaW5nMVwiLCBcIlN0cmluZzJcIl0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogTXVsdGktcHJvdmlkZXJzIGFuZCByZWd1bGFyIHByb3ZpZGVycyBjYW5ub3QgYmUgbWl4ZWQuIFRoZSBmb2xsb3dpbmdcbiAgICogd2lsbCB0aHJvdyBhbiBleGNlcHRpb246XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gICAqICAgbmV3IFByb3ZpZGVyKFwiU3RyaW5nc1wiLCB7IHVzZVZhbHVlOiBcIlN0cmluZzFcIiwgbXVsdGk6IHRydWUgfSksXG4gICAqICAgbmV3IFByb3ZpZGVyKFwiU3RyaW5nc1wiLCB7IHVzZVZhbHVlOiBcIlN0cmluZzJcIn0pXG4gICAqIF0pO1xuICAgKiBgYGBcbiAgICovXG4gIGdldCBtdWx0aSgpOiBib29sZWFuIHsgcmV0dXJuIG5vcm1hbGl6ZUJvb2wodGhpcy5fbXVsdGkpOyB9XG59XG5cbi8qKlxuICogU2VlIHtAbGluayBQcm92aWRlcn0gaW5zdGVhZC5cbiAqXG4gKiBAZGVwcmVjYXRlZFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEJpbmRpbmcgZXh0ZW5kcyBQcm92aWRlciB7XG4gIGNvbnN0cnVjdG9yKHRva2VuLCB7dG9DbGFzcywgdG9WYWx1ZSwgdG9BbGlhcywgdG9GYWN0b3J5LCBkZXBzLCBtdWx0aX06IHtcbiAgICB0b0NsYXNzPzogVHlwZSxcbiAgICB0b1ZhbHVlPzogYW55LFxuICAgIHRvQWxpYXM/OiBhbnksXG4gICAgdG9GYWN0b3J5OiBGdW5jdGlvbiwgZGVwcz86IE9iamVjdFtdLCBtdWx0aT86IGJvb2xlYW5cbiAgfSkge1xuICAgIHN1cGVyKHRva2VuLCB7XG4gICAgICB1c2VDbGFzczogdG9DbGFzcyxcbiAgICAgIHVzZVZhbHVlOiB0b1ZhbHVlLFxuICAgICAgdXNlRXhpc3Rpbmc6IHRvQWxpYXMsXG4gICAgICB1c2VGYWN0b3J5OiB0b0ZhY3RvcnksXG4gICAgICBkZXBzOiBkZXBzLFxuICAgICAgbXVsdGk6IG11bHRpXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIGdldCB0b0NsYXNzKCkgeyByZXR1cm4gdGhpcy51c2VDbGFzczsgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgZ2V0IHRvQWxpYXMoKSB7IHJldHVybiB0aGlzLnVzZUV4aXN0aW5nOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBnZXQgdG9GYWN0b3J5KCkgeyByZXR1cm4gdGhpcy51c2VGYWN0b3J5OyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBnZXQgdG9WYWx1ZSgpIHsgcmV0dXJuIHRoaXMudXNlVmFsdWU7IH1cbn1cblxuLyoqXG4gKiBBbiBpbnRlcm5hbCByZXNvbHZlZCByZXByZXNlbnRhdGlvbiBvZiBhIHtAbGluayBQcm92aWRlcn0gdXNlZCBieSB0aGUge0BsaW5rIEluamVjdG9yfS5cbiAqXG4gKiBJdCBpcyB1c3VhbGx5IGNyZWF0ZWQgYXV0b21hdGljYWxseSBieSBgSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZWAuXG4gKlxuICogSXQgY2FuIGJlIGNyZWF0ZWQgbWFudWFsbHksIGFzIGZvbGxvd3M6XG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L1JmRW5oaDhrVUVJMEczcXNuSWVUP3AlM0RwcmV2aWV3JnA9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogdmFyIHJlc29sdmVkUHJvdmlkZXJzID0gSW5qZWN0b3IucmVzb2x2ZShbbmV3IFByb3ZpZGVyKCdtZXNzYWdlJywge3VzZVZhbHVlOiAnSGVsbG8nfSldKTtcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyhyZXNvbHZlZFByb3ZpZGVycyk7XG4gKlxuICogZXhwZWN0KGluamVjdG9yLmdldCgnbWVzc2FnZScpKS50b0VxdWFsKCdIZWxsbycpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVzb2x2ZWRQcm92aWRlciB7XG4gIC8qKlxuICAgKiBBIGtleSwgdXN1YWxseSBhIGBUeXBlYC5cbiAgICovXG4gIGtleTogS2V5O1xuXG4gIC8qKlxuICAgKiBGYWN0b3J5IGZ1bmN0aW9uIHdoaWNoIGNhbiByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgYW4gb2JqZWN0IHJlcHJlc2VudGVkIGJ5IGEga2V5LlxuICAgKi9cbiAgcmVzb2x2ZWRGYWN0b3JpZXM6IFJlc29sdmVkRmFjdG9yeVtdO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHByb3ZpZGVyIGlzIGEgbXVsdGktcHJvdmlkZXIgb3IgYSByZWd1bGFyIHByb3ZpZGVyLlxuICAgKi9cbiAgbXVsdGlQcm92aWRlcjogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBTZWUge0BsaW5rIFJlc29sdmVkUHJvdmlkZXJ9IGluc3RlYWQuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvbHZlZEJpbmRpbmcgZXh0ZW5kcyBSZXNvbHZlZFByb3ZpZGVyIHt9XG5cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZFByb3ZpZGVyXyBpbXBsZW1lbnRzIFJlc29sdmVkQmluZGluZyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBrZXk6IEtleSwgcHVibGljIHJlc29sdmVkRmFjdG9yaWVzOiBSZXNvbHZlZEZhY3RvcnlbXSxcbiAgICAgICAgICAgICAgcHVibGljIG11bHRpUHJvdmlkZXI6IGJvb2xlYW4pIHt9XG5cbiAgZ2V0IHJlc29sdmVkRmFjdG9yeSgpOiBSZXNvbHZlZEZhY3RvcnkgeyByZXR1cm4gdGhpcy5yZXNvbHZlZEZhY3Rvcmllc1swXTsgfVxufVxuXG4vKipcbiAqIEFuIGludGVybmFsIHJlc29sdmVkIHJlcHJlc2VudGF0aW9uIG9mIGEgZmFjdG9yeSBmdW5jdGlvbiBjcmVhdGVkIGJ5IHJlc29sdmluZyB7QGxpbmsgUHJvdmlkZXJ9LlxuICovXG5leHBvcnQgY2xhc3MgUmVzb2x2ZWRGYWN0b3J5IHtcbiAgY29uc3RydWN0b3IoXG4gICAgICAvKipcbiAgICAgICAqIEZhY3RvcnkgZnVuY3Rpb24gd2hpY2ggY2FuIHJldHVybiBhbiBpbnN0YW5jZSBvZiBhbiBvYmplY3QgcmVwcmVzZW50ZWQgYnkgYSBrZXkuXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyBmYWN0b3J5OiBGdW5jdGlvbixcblxuICAgICAgLyoqXG4gICAgICAgKiBBcmd1bWVudHMgKGRlcGVuZGVuY2llcykgdG8gdGhlIGBmYWN0b3J5YCBmdW5jdGlvbi5cbiAgICAgICAqL1xuICAgICAgcHVibGljIGRlcGVuZGVuY2llczogRGVwZW5kZW5jeVtdKSB7fVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUHJvdmlkZXJ9LlxuICpcbiAqIFRvIGNvbnN0cnVjdCBhIHtAbGluayBQcm92aWRlcn0sIGJpbmQgYSBgdG9rZW5gIHRvIGVpdGhlciBhIGNsYXNzLCBhIHZhbHVlLCBhIGZhY3RvcnkgZnVuY3Rpb24sXG4gKiBvclxuICogdG8gYW4gZXhpc3RpbmcgYHRva2VuYC5cbiAqIFNlZSB7QGxpbmsgUHJvdmlkZXJCdWlsZGVyfSBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIFRoZSBgdG9rZW5gIGlzIG1vc3QgY29tbW9ubHkgYSBjbGFzcyBvciB7QGxpbmsgYW5ndWxhcjIvZGkvT3BhcXVlVG9rZW59LlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kKHRva2VuKTogUHJvdmlkZXJCdWlsZGVyIHtcbiAgcmV0dXJuIG5ldyBQcm92aWRlckJ1aWxkZXIodG9rZW4pO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB7QGxpbmsgUHJvdmlkZXJ9LlxuICpcbiAqIFNlZSB7QGxpbmsgUHJvdmlkZXJ9IGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogPCEtLSBUT0RPOiBpbXByb3ZlIHRoZSBkb2NzIC0tPlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvdmlkZSh0b2tlbiwge3VzZUNsYXNzLCB1c2VWYWx1ZSwgdXNlRXhpc3RpbmcsIHVzZUZhY3RvcnksIGRlcHMsIG11bHRpfToge1xuICB1c2VDbGFzcz86IFR5cGUsXG4gIHVzZVZhbHVlPzogYW55LFxuICB1c2VFeGlzdGluZz86IGFueSxcbiAgdXNlRmFjdG9yeT86IEZ1bmN0aW9uLFxuICBkZXBzPzogT2JqZWN0W10sXG4gIG11bHRpPzogYm9vbGVhblxufSk6IFByb3ZpZGVyIHtcbiAgcmV0dXJuIG5ldyBQcm92aWRlcih0b2tlbiwge1xuICAgIHVzZUNsYXNzOiB1c2VDbGFzcyxcbiAgICB1c2VWYWx1ZTogdXNlVmFsdWUsXG4gICAgdXNlRXhpc3Rpbmc6IHVzZUV4aXN0aW5nLFxuICAgIHVzZUZhY3Rvcnk6IHVzZUZhY3RvcnksXG4gICAgZGVwczogZGVwcyxcbiAgICBtdWx0aTogbXVsdGlcbiAgfSk7XG59XG5cbi8qKlxuICogSGVscGVyIGNsYXNzIGZvciB0aGUge0BsaW5rIGJpbmR9IGZ1bmN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUHJvdmlkZXJCdWlsZGVyIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRva2VuKSB7fVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhIERJIHRva2VuIHRvIGEgY2xhc3MuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9acEJDU1lxdjZlMnVkNUtYTGR4UT9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBCZWNhdXNlIGB0b0FsaWFzYCBhbmQgYHRvQ2xhc3NgIGFyZSBvZnRlbiBjb25mdXNlZCwgdGhlIGV4YW1wbGUgY29udGFpbnNcbiAgICogYm90aCB1c2UgY2FzZXMgZm9yIGVhc3kgY29tcGFyaXNvbi5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBWZWhpY2xlIHt9XG4gICAqXG4gICAqIGNsYXNzIENhciBleHRlbmRzIFZlaGljbGUge31cbiAgICpcbiAgICogdmFyIGluamVjdG9yQ2xhc3MgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBDYXIsXG4gICAqICAgcHJvdmlkZShWZWhpY2xlLCB7dXNlQ2xhc3M6IENhcn0pXG4gICAqIF0pO1xuICAgKiB2YXIgaW5qZWN0b3JBbGlhcyA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIENhcixcbiAgICogICBwcm92aWRlKFZlaGljbGUsIHt1c2VFeGlzdGluZzogQ2FyfSlcbiAgICogXSk7XG4gICAqXG4gICAqIGV4cGVjdChpbmplY3RvckNsYXNzLmdldChWZWhpY2xlKSkubm90LnRvQmUoaW5qZWN0b3JDbGFzcy5nZXQoQ2FyKSk7XG4gICAqIGV4cGVjdChpbmplY3RvckNsYXNzLmdldChWZWhpY2xlKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTtcbiAgICpcbiAgICogZXhwZWN0KGluamVjdG9yQWxpYXMuZ2V0KFZlaGljbGUpKS50b0JlKGluamVjdG9yQWxpYXMuZ2V0KENhcikpO1xuICAgKiBleHBlY3QoaW5qZWN0b3JBbGlhcy5nZXQoVmVoaWNsZSkgaW5zdGFuY2VvZiBDYXIpLnRvQmUodHJ1ZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgdG9DbGFzcyh0eXBlOiBUeXBlKTogUHJvdmlkZXIge1xuICAgIGlmICghaXNUeXBlKHR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgVHJ5aW5nIHRvIGNyZWF0ZSBhIGNsYXNzIHByb3ZpZGVyIGJ1dCBcIiR7c3RyaW5naWZ5KHR5cGUpfVwiIGlzIG5vdCBhIGNsYXNzIWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3ZpZGVyKHRoaXMudG9rZW4sIHt1c2VDbGFzczogdHlwZX0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgREkgdG9rZW4gdG8gYSB2YWx1ZS5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0cwMjRQRkhtREwwY0pGZ2ZaSzhPP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gICAqICAgcHJvdmlkZSgnbWVzc2FnZScsIHt1c2VWYWx1ZTogJ0hlbGxvJ30pXG4gICAqIF0pO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KCdtZXNzYWdlJykpLnRvRXF1YWwoJ0hlbGxvJyk7XG4gICAqIGBgYFxuICAgKi9cbiAgdG9WYWx1ZSh2YWx1ZTogYW55KTogUHJvdmlkZXIgeyByZXR1cm4gbmV3IFByb3ZpZGVyKHRoaXMudG9rZW4sIHt1c2VWYWx1ZTogdmFsdWV9KTsgfVxuXG4gIC8qKlxuICAgKiBCaW5kcyBhIERJIHRva2VuIHRvIGFuIGV4aXN0aW5nIHRva2VuLlxuICAgKlxuICAgKiBBbmd1bGFyIHdpbGwgcmV0dXJuIHRoZSBzYW1lIGluc3RhbmNlIGFzIGlmIHRoZSBwcm92aWRlZCB0b2tlbiB3YXMgdXNlZC4gKFRoaXMgaXNcbiAgICogaW4gY29udHJhc3QgdG8gYHVzZUNsYXNzYCB3aGVyZSBhIHNlcGFyYXRlIGluc3RhbmNlIG9mIGB1c2VDbGFzc2Agd2lsbCBiZSByZXR1cm5lZC4pXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC91QmFvRjJwTjVjZmM1QWZaYXBOdz9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBCZWNhdXNlIGB0b0FsaWFzYCBhbmQgYHRvQ2xhc3NgIGFyZSBvZnRlbiBjb25mdXNlZCwgdGhlIGV4YW1wbGUgY29udGFpbnNcbiAgICogYm90aCB1c2UgY2FzZXMgZm9yIGVhc3kgY29tcGFyaXNvbi5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBWZWhpY2xlIHt9XG4gICAqXG4gICAqIGNsYXNzIENhciBleHRlbmRzIFZlaGljbGUge31cbiAgICpcbiAgICogdmFyIGluamVjdG9yQWxpYXMgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICBDYXIsXG4gICAqICAgcHJvdmlkZShWZWhpY2xlLCB7dXNlRXhpc3Rpbmc6IENhcn0pXG4gICAqIF0pO1xuICAgKiB2YXIgaW5qZWN0b3JDbGFzcyA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIENhcixcbiAgICogICBwcm92aWRlKFZlaGljbGUsIHt1c2VDbGFzczogQ2FyfSlcbiAgICogXSk7XG4gICAqXG4gICAqIGV4cGVjdChpbmplY3RvckFsaWFzLmdldChWZWhpY2xlKSkudG9CZShpbmplY3RvckFsaWFzLmdldChDYXIpKTtcbiAgICogZXhwZWN0KGluamVjdG9yQWxpYXMuZ2V0KFZlaGljbGUpIGluc3RhbmNlb2YgQ2FyKS50b0JlKHRydWUpO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3JDbGFzcy5nZXQoVmVoaWNsZSkpLm5vdC50b0JlKGluamVjdG9yQ2xhc3MuZ2V0KENhcikpO1xuICAgKiBleHBlY3QoaW5qZWN0b3JDbGFzcy5nZXQoVmVoaWNsZSkgaW5zdGFuY2VvZiBDYXIpLnRvQmUodHJ1ZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgdG9BbGlhcyhhbGlhc1Rva2VuOiAvKlR5cGUqLyBhbnkpOiBQcm92aWRlciB7XG4gICAgaWYgKGlzQmxhbmsoYWxpYXNUb2tlbikpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBDYW4gbm90IGFsaWFzICR7c3RyaW5naWZ5KHRoaXMudG9rZW4pfSB0byBhIGJsYW5rIHZhbHVlIWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3ZpZGVyKHRoaXMudG9rZW4sIHt1c2VFeGlzdGluZzogYWxpYXNUb2tlbn0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEJpbmRzIGEgREkgdG9rZW4gdG8gYSBmdW5jdGlvbiB3aGljaCBjb21wdXRlcyB0aGUgdmFsdWUuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9PZWpOSWZUVDN6YjFpQnhhSVlPYj9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICAgKiAgIHByb3ZpZGUoTnVtYmVyLCB7dXNlRmFjdG9yeTogKCkgPT4geyByZXR1cm4gMSsyOyB9fSksXG4gICAqICAgcHJvdmlkZShTdHJpbmcsIHt1c2VGYWN0b3J5OiAodikgPT4geyByZXR1cm4gXCJWYWx1ZTogXCIgKyB2OyB9LCBkZXBzOiBbTnVtYmVyXX0pXG4gICAqIF0pO1xuICAgKlxuICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KE51bWJlcikpLnRvRXF1YWwoMyk7XG4gICAqIGV4cGVjdChpbmplY3Rvci5nZXQoU3RyaW5nKSkudG9FcXVhbCgnVmFsdWU6IDMnKTtcbiAgICogYGBgXG4gICAqL1xuICB0b0ZhY3RvcnkoZmFjdG9yeTogRnVuY3Rpb24sIGRlcGVuZGVuY2llcz86IGFueVtdKTogUHJvdmlkZXIge1xuICAgIGlmICghaXNGdW5jdGlvbihmYWN0b3J5KSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXG4gICAgICAgICAgYFRyeWluZyB0byBjcmVhdGUgYSBmYWN0b3J5IHByb3ZpZGVyIGJ1dCBcIiR7c3RyaW5naWZ5KGZhY3RvcnkpfVwiIGlzIG5vdCBhIGZ1bmN0aW9uIWApO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFByb3ZpZGVyKHRoaXMudG9rZW4sIHt1c2VGYWN0b3J5OiBmYWN0b3J5LCBkZXBzOiBkZXBlbmRlbmNpZXN9KTtcbiAgfVxufVxuXG4vKipcbiAqIFJlc29sdmUgYSBzaW5nbGUgcHJvdmlkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlRmFjdG9yeShwcm92aWRlcjogUHJvdmlkZXIpOiBSZXNvbHZlZEZhY3Rvcnkge1xuICB2YXIgZmFjdG9yeUZuOiBGdW5jdGlvbjtcbiAgdmFyIHJlc29sdmVkRGVwcztcbiAgaWYgKGlzUHJlc2VudChwcm92aWRlci51c2VDbGFzcykpIHtcbiAgICB2YXIgdXNlQ2xhc3MgPSByZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlci51c2VDbGFzcyk7XG4gICAgZmFjdG9yeUZuID0gcmVmbGVjdG9yLmZhY3RvcnkodXNlQ2xhc3MpO1xuICAgIHJlc29sdmVkRGVwcyA9IF9kZXBlbmRlbmNpZXNGb3IodXNlQ2xhc3MpO1xuICB9IGVsc2UgaWYgKGlzUHJlc2VudChwcm92aWRlci51c2VFeGlzdGluZykpIHtcbiAgICBmYWN0b3J5Rm4gPSAoYWxpYXNJbnN0YW5jZSkgPT4gYWxpYXNJbnN0YW5jZTtcbiAgICByZXNvbHZlZERlcHMgPSBbRGVwZW5kZW5jeS5mcm9tS2V5KEtleS5nZXQocHJvdmlkZXIudXNlRXhpc3RpbmcpKV07XG4gIH0gZWxzZSBpZiAoaXNQcmVzZW50KHByb3ZpZGVyLnVzZUZhY3RvcnkpKSB7XG4gICAgZmFjdG9yeUZuID0gcHJvdmlkZXIudXNlRmFjdG9yeTtcbiAgICByZXNvbHZlZERlcHMgPSBfY29uc3RydWN0RGVwZW5kZW5jaWVzKHByb3ZpZGVyLnVzZUZhY3RvcnksIHByb3ZpZGVyLmRlcGVuZGVuY2llcyk7XG4gIH0gZWxzZSB7XG4gICAgZmFjdG9yeUZuID0gKCkgPT4gcHJvdmlkZXIudXNlVmFsdWU7XG4gICAgcmVzb2x2ZWREZXBzID0gX0VNUFRZX0xJU1Q7XG4gIH1cbiAgcmV0dXJuIG5ldyBSZXNvbHZlZEZhY3RvcnkoZmFjdG9yeUZuLCByZXNvbHZlZERlcHMpO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSB7QGxpbmsgUHJvdmlkZXJ9IGludG8ge0BsaW5rIFJlc29sdmVkUHJvdmlkZXJ9LlxuICpcbiAqIHtAbGluayBJbmplY3Rvcn0gaW50ZXJuYWxseSBvbmx5IHVzZXMge0BsaW5rIFJlc29sdmVkUHJvdmlkZXJ9LCB7QGxpbmsgUHJvdmlkZXJ9IGNvbnRhaW5zXG4gKiBjb252ZW5pZW5jZSBwcm92aWRlciBzeW50YXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlUHJvdmlkZXIocHJvdmlkZXI6IFByb3ZpZGVyKTogUmVzb2x2ZWRQcm92aWRlciB7XG4gIHJldHVybiBuZXcgUmVzb2x2ZWRQcm92aWRlcl8oS2V5LmdldChwcm92aWRlci50b2tlbiksIFtyZXNvbHZlRmFjdG9yeShwcm92aWRlcildLCBmYWxzZSk7XG59XG5cbi8qKlxuICogUmVzb2x2ZSBhIGxpc3Qgb2YgUHJvdmlkZXJzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVByb3ZpZGVycyhwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IFJlc29sdmVkUHJvdmlkZXJbXSB7XG4gIHZhciBub3JtYWxpemVkID0gX2NyZWF0ZUxpc3RPZlByb3ZpZGVycyhfbm9ybWFsaXplUHJvdmlkZXJzKFxuICAgICAgcHJvdmlkZXJzLCBuZXcgTWFwPG51bWJlciwgX05vcm1hbGl6ZWRQcm92aWRlciB8IF9Ob3JtYWxpemVkUHJvdmlkZXJbXT4oKSkpO1xuICByZXR1cm4gbm9ybWFsaXplZC5tYXAoYiA9PiB7XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBfTm9ybWFsaXplZFByb3ZpZGVyKSB7XG4gICAgICByZXR1cm4gbmV3IFJlc29sdmVkUHJvdmlkZXJfKGIua2V5LCBbYi5yZXNvbHZlZEZhY3RvcnldLCBmYWxzZSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGFyciA9IDxfTm9ybWFsaXplZFByb3ZpZGVyW10+YjtcbiAgICAgIHJldHVybiBuZXcgUmVzb2x2ZWRQcm92aWRlcl8oYXJyWzBdLmtleSwgYXJyLm1hcChfID0+IF8ucmVzb2x2ZWRGYWN0b3J5KSwgdHJ1ZSk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBUaGUgYWxnb3JpdGhtIHdvcmtzIGFzIGZvbGxvd3M6XG4gKlxuICogW1Byb3ZpZGVyXSAtPiBbX05vcm1hbGl6ZWRQcm92aWRlcnxbX05vcm1hbGl6ZWRQcm92aWRlcl1dIC0+IFtSZXNvbHZlZFByb3ZpZGVyXVxuICpcbiAqIF9Ob3JtYWxpemVkUHJvdmlkZXIgaXMgZXNzZW50aWFsbHkgYSByZXNvbHZlZCBwcm92aWRlciBiZWZvcmUgaXQgd2FzIGdyb3VwZWQgYnkga2V5LlxuICovXG5jbGFzcyBfTm9ybWFsaXplZFByb3ZpZGVyIHtcbiAgY29uc3RydWN0b3IocHVibGljIGtleTogS2V5LCBwdWJsaWMgcmVzb2x2ZWRGYWN0b3J5OiBSZXNvbHZlZEZhY3RvcnkpIHt9XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVMaXN0T2ZQcm92aWRlcnMoZmxhdHRlbmVkUHJvdmlkZXJzOiBNYXA8bnVtYmVyLCBhbnk+KTogYW55W10ge1xuICByZXR1cm4gTWFwV3JhcHBlci52YWx1ZXMoZmxhdHRlbmVkUHJvdmlkZXJzKTtcbn1cblxuZnVuY3Rpb24gX25vcm1hbGl6ZVByb3ZpZGVycyhwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IFByb3ZpZGVyQnVpbGRlciB8IGFueVtdPixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzOiBNYXA8bnVtYmVyLCBfTm9ybWFsaXplZFByb3ZpZGVyIHwgX05vcm1hbGl6ZWRQcm92aWRlcltdPik6XG4gICAgTWFwPG51bWJlciwgX05vcm1hbGl6ZWRQcm92aWRlciB8IF9Ob3JtYWxpemVkUHJvdmlkZXJbXT4ge1xuICBwcm92aWRlcnMuZm9yRWFjaChiID0+IHtcbiAgICBpZiAoYiBpbnN0YW5jZW9mIFR5cGUpIHtcbiAgICAgIF9ub3JtYWxpemVQcm92aWRlcihwcm92aWRlKGIsIHt1c2VDbGFzczogYn0pLCByZXMpO1xuXG4gICAgfSBlbHNlIGlmIChiIGluc3RhbmNlb2YgUHJvdmlkZXIpIHtcbiAgICAgIF9ub3JtYWxpemVQcm92aWRlcihiLCByZXMpO1xuXG4gICAgfSBlbHNlIGlmIChiIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIF9ub3JtYWxpemVQcm92aWRlcnMoYiwgcmVzKTtcblxuICAgIH0gZWxzZSBpZiAoYiBpbnN0YW5jZW9mIFByb3ZpZGVyQnVpbGRlcikge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm92aWRlckVycm9yKGIudG9rZW4pO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdmlkZXJFcnJvcihiKTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIF9ub3JtYWxpemVQcm92aWRlcihiOiBQcm92aWRlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXM6IE1hcDxudW1iZXIsIF9Ob3JtYWxpemVkUHJvdmlkZXIgfCBfTm9ybWFsaXplZFByb3ZpZGVyW10+KTogdm9pZCB7XG4gIHZhciBrZXkgPSBLZXkuZ2V0KGIudG9rZW4pO1xuICB2YXIgZmFjdG9yeSA9IHJlc29sdmVGYWN0b3J5KGIpO1xuICB2YXIgbm9ybWFsaXplZCA9IG5ldyBfTm9ybWFsaXplZFByb3ZpZGVyKGtleSwgZmFjdG9yeSk7XG5cbiAgaWYgKGIubXVsdGkpIHtcbiAgICB2YXIgZXhpc3RpbmdQcm92aWRlciA9IHJlcy5nZXQoa2V5LmlkKTtcblxuICAgIGlmIChleGlzdGluZ1Byb3ZpZGVyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGV4aXN0aW5nUHJvdmlkZXIucHVzaChub3JtYWxpemVkKTtcblxuICAgIH0gZWxzZSBpZiAoaXNCbGFuayhleGlzdGluZ1Byb3ZpZGVyKSkge1xuICAgICAgcmVzLnNldChrZXkuaWQsIFtub3JtYWxpemVkXSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IE1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvcihleGlzdGluZ1Byb3ZpZGVyLCBiKTtcbiAgICB9XG5cbiAgfSBlbHNlIHtcbiAgICB2YXIgZXhpc3RpbmdQcm92aWRlciA9IHJlcy5nZXQoa2V5LmlkKTtcblxuICAgIGlmIChleGlzdGluZ1Byb3ZpZGVyIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIHRocm93IG5ldyBNaXhpbmdNdWx0aVByb3ZpZGVyc1dpdGhSZWd1bGFyUHJvdmlkZXJzRXJyb3IoZXhpc3RpbmdQcm92aWRlciwgYik7XG4gICAgfVxuXG4gICAgcmVzLnNldChrZXkuaWQsIG5vcm1hbGl6ZWQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9jb25zdHJ1Y3REZXBlbmRlbmNpZXMoZmFjdG9yeUZ1bmN0aW9uOiBGdW5jdGlvbiwgZGVwZW5kZW5jaWVzOiBhbnlbXSk6IERlcGVuZGVuY3lbXSB7XG4gIGlmIChpc0JsYW5rKGRlcGVuZGVuY2llcykpIHtcbiAgICByZXR1cm4gX2RlcGVuZGVuY2llc0ZvcihmYWN0b3J5RnVuY3Rpb24pO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXJhbXM6IGFueVtdW10gPSBkZXBlbmRlbmNpZXMubWFwKHQgPT4gW3RdKTtcbiAgICByZXR1cm4gZGVwZW5kZW5jaWVzLm1hcCh0ID0+IF9leHRyYWN0VG9rZW4oZmFjdG9yeUZ1bmN0aW9uLCB0LCBwYXJhbXMpKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfZGVwZW5kZW5jaWVzRm9yKHR5cGVPckZ1bmMpOiBEZXBlbmRlbmN5W10ge1xuICB2YXIgcGFyYW1zID0gcmVmbGVjdG9yLnBhcmFtZXRlcnModHlwZU9yRnVuYyk7XG4gIGlmIChpc0JsYW5rKHBhcmFtcykpIHJldHVybiBbXTtcbiAgaWYgKHBhcmFtcy5zb21lKGlzQmxhbmspKSB7XG4gICAgdGhyb3cgbmV3IE5vQW5ub3RhdGlvbkVycm9yKHR5cGVPckZ1bmMsIHBhcmFtcyk7XG4gIH1cbiAgcmV0dXJuIHBhcmFtcy5tYXAoKHA6IGFueVtdKSA9PiBfZXh0cmFjdFRva2VuKHR5cGVPckZ1bmMsIHAsIHBhcmFtcykpO1xufVxuXG5mdW5jdGlvbiBfZXh0cmFjdFRva2VuKHR5cGVPckZ1bmMsIG1ldGFkYXRhIC8qYW55W10gfCBhbnkqLywgcGFyYW1zOiBhbnlbXVtdKTogRGVwZW5kZW5jeSB7XG4gIHZhciBkZXBQcm9wcyA9IFtdO1xuICB2YXIgdG9rZW4gPSBudWxsO1xuICB2YXIgb3B0aW9uYWwgPSBmYWxzZTtcblxuICBpZiAoIWlzQXJyYXkobWV0YWRhdGEpKSB7XG4gICAgaWYgKG1ldGFkYXRhIGluc3RhbmNlb2YgSW5qZWN0TWV0YWRhdGEpIHtcbiAgICAgIHJldHVybiBfY3JlYXRlRGVwZW5kZW5jeShtZXRhZGF0YS50b2tlbiwgb3B0aW9uYWwsIG51bGwsIG51bGwsIGRlcFByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIF9jcmVhdGVEZXBlbmRlbmN5KG1ldGFkYXRhLCBvcHRpb25hbCwgbnVsbCwgbnVsbCwgZGVwUHJvcHMpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBsb3dlckJvdW5kVmlzaWJpbGl0eSA9IG51bGw7XG4gIHZhciB1cHBlckJvdW5kVmlzaWJpbGl0eSA9IG51bGw7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtZXRhZGF0YS5sZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJhbU1ldGFkYXRhID0gbWV0YWRhdGFbaV07XG5cbiAgICBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIFR5cGUpIHtcbiAgICAgIHRva2VuID0gcGFyYW1NZXRhZGF0YTtcblxuICAgIH0gZWxzZSBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIEluamVjdE1ldGFkYXRhKSB7XG4gICAgICB0b2tlbiA9IHBhcmFtTWV0YWRhdGEudG9rZW47XG5cbiAgICB9IGVsc2UgaWYgKHBhcmFtTWV0YWRhdGEgaW5zdGFuY2VvZiBPcHRpb25hbE1ldGFkYXRhKSB7XG4gICAgICBvcHRpb25hbCA9IHRydWU7XG5cbiAgICB9IGVsc2UgaWYgKHBhcmFtTWV0YWRhdGEgaW5zdGFuY2VvZiBTZWxmTWV0YWRhdGEpIHtcbiAgICAgIHVwcGVyQm91bmRWaXNpYmlsaXR5ID0gcGFyYW1NZXRhZGF0YTtcblxuICAgIH0gZWxzZSBpZiAocGFyYW1NZXRhZGF0YSBpbnN0YW5jZW9mIEhvc3RNZXRhZGF0YSkge1xuICAgICAgdXBwZXJCb3VuZFZpc2liaWxpdHkgPSBwYXJhbU1ldGFkYXRhO1xuXG4gICAgfSBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgU2tpcFNlbGZNZXRhZGF0YSkge1xuICAgICAgbG93ZXJCb3VuZFZpc2liaWxpdHkgPSBwYXJhbU1ldGFkYXRhO1xuXG4gICAgfSBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgRGVwZW5kZW5jeU1ldGFkYXRhKSB7XG4gICAgICBpZiAoaXNQcmVzZW50KHBhcmFtTWV0YWRhdGEudG9rZW4pKSB7XG4gICAgICAgIHRva2VuID0gcGFyYW1NZXRhZGF0YS50b2tlbjtcbiAgICAgIH1cbiAgICAgIGRlcFByb3BzLnB1c2gocGFyYW1NZXRhZGF0YSk7XG4gICAgfVxuICB9XG5cbiAgdG9rZW4gPSByZXNvbHZlRm9yd2FyZFJlZih0b2tlbik7XG5cbiAgaWYgKGlzUHJlc2VudCh0b2tlbikpIHtcbiAgICByZXR1cm4gX2NyZWF0ZURlcGVuZGVuY3kodG9rZW4sIG9wdGlvbmFsLCBsb3dlckJvdW5kVmlzaWJpbGl0eSwgdXBwZXJCb3VuZFZpc2liaWxpdHksIGRlcFByb3BzKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgTm9Bbm5vdGF0aW9uRXJyb3IodHlwZU9yRnVuYywgcGFyYW1zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfY3JlYXRlRGVwZW5kZW5jeSh0b2tlbiwgb3B0aW9uYWwsIGxvd2VyQm91bmRWaXNpYmlsaXR5LCB1cHBlckJvdW5kVmlzaWJpbGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcFByb3BzKTogRGVwZW5kZW5jeSB7XG4gIHJldHVybiBuZXcgRGVwZW5kZW5jeShLZXkuZ2V0KHRva2VuKSwgb3B0aW9uYWwsIGxvd2VyQm91bmRWaXNpYmlsaXR5LCB1cHBlckJvdW5kVmlzaWJpbGl0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcFByb3BzKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2RpL3Byb3ZpZGVyLnRzXG4gKiovIiwiaW1wb3J0IHtFeGNlcHRpb25IYW5kbGVyfSBmcm9tICcuL2V4Y2VwdGlvbl9oYW5kbGVyJztcblxuZXhwb3J0IHtFeGNlcHRpb25IYW5kbGVyfSBmcm9tICcuL2V4Y2VwdGlvbl9oYW5kbGVyJztcblxuZXhwb3J0IGNsYXNzIEJhc2VFeGNlcHRpb24gZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyBzdGFjazogYW55O1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZTogc3RyaW5nID0gXCItLVwiKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5zdGFjayA9ICg8YW55Pm5ldyBFcnJvcihtZXNzYWdlKSkuc3RhY2s7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5tZXNzYWdlOyB9XG59XG5cbi8qKlxuICogV3JhcHMgYW4gZXhjZXB0aW9uIGFuZCBwcm92aWRlcyBhZGRpdGlvbmFsIGNvbnRleHQgb3IgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBXcmFwcGVkRXhjZXB0aW9uIGV4dGVuZHMgRXJyb3Ige1xuICBwcml2YXRlIF93cmFwcGVyU3RhY2s6IGFueTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF93cmFwcGVyTWVzc2FnZTogc3RyaW5nLCBwcml2YXRlIF9vcmlnaW5hbEV4Y2VwdGlvbiwgcHJpdmF0ZSBfb3JpZ2luYWxTdGFjaz8sXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NvbnRleHQ/KSB7XG4gICAgc3VwZXIoX3dyYXBwZXJNZXNzYWdlKTtcbiAgICB0aGlzLl93cmFwcGVyU3RhY2sgPSAoPGFueT5uZXcgRXJyb3IoX3dyYXBwZXJNZXNzYWdlKSkuc3RhY2s7XG4gIH1cblxuICBnZXQgd3JhcHBlck1lc3NhZ2UoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3dyYXBwZXJNZXNzYWdlOyB9XG5cbiAgZ2V0IHdyYXBwZXJTdGFjaygpOiBhbnkgeyByZXR1cm4gdGhpcy5fd3JhcHBlclN0YWNrOyB9XG5cblxuICBnZXQgb3JpZ2luYWxFeGNlcHRpb24oKTogYW55IHsgcmV0dXJuIHRoaXMuX29yaWdpbmFsRXhjZXB0aW9uOyB9XG5cbiAgZ2V0IG9yaWdpbmFsU3RhY2soKTogYW55IHsgcmV0dXJuIHRoaXMuX29yaWdpbmFsU3RhY2s7IH1cblxuXG4gIGdldCBjb250ZXh0KCk6IGFueSB7IHJldHVybiB0aGlzLl9jb250ZXh0OyB9XG5cbiAgZ2V0IG1lc3NhZ2UoKTogc3RyaW5nIHsgcmV0dXJuIEV4Y2VwdGlvbkhhbmRsZXIuZXhjZXB0aW9uVG9TdHJpbmcodGhpcyk7IH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5tZXNzYWdlOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVHlwZUVycm9yKG1lc3NhZ2U/OiBzdHJpbmcpOiBFcnJvciB7XG4gIHJldHVybiBuZXcgVHlwZUVycm9yKG1lc3NhZ2UpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5pbXBsZW1lbnRlZCgpOiBhbnkge1xuICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbigndW5pbXBsZW1lbnRlZCcpO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zLnRzXG4gKiovIiwiaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIHByaW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgaXNMaXN0TGlrZUl0ZXJhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5jbGFzcyBfQXJyYXlMb2dnZXIge1xuICByZXM6IGFueVtdID0gW107XG4gIGxvZyhzOiBhbnkpOiB2b2lkIHsgdGhpcy5yZXMucHVzaChzKTsgfVxuICBsb2dFcnJvcihzOiBhbnkpOiB2b2lkIHsgdGhpcy5yZXMucHVzaChzKTsgfVxuICBsb2dHcm91cChzOiBhbnkpOiB2b2lkIHsgdGhpcy5yZXMucHVzaChzKTsgfVxuICBsb2dHcm91cEVuZCgpe307XG59XG5cbi8qKlxuICogUHJvdmlkZXMgYSBob29rIGZvciBjZW50cmFsaXplZCBleGNlcHRpb24gaGFuZGxpbmcuXG4gKlxuICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYEV4Y2VwdGlvbkhhbmRsZXJgIHByaW50cyBlcnJvciBtZXNzYWdlcyB0byB0aGUgYENvbnNvbGVgLiBUb1xuICogaW50ZXJjZXB0IGVycm9yIGhhbmRsaW5nLFxuICogd3JpdGUgYSBjdXN0b20gZXhjZXB0aW9uIGhhbmRsZXIgdGhhdCByZXBsYWNlcyB0aGlzIGRlZmF1bHQgYXMgYXBwcm9wcmlhdGUgZm9yIHlvdXIgYXBwLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICpcbiAqIGNsYXNzIE15RXhjZXB0aW9uSGFuZGxlciBpbXBsZW1lbnRzIEV4Y2VwdGlvbkhhbmRsZXIge1xuICogICBjYWxsKGVycm9yLCBzdGFja1RyYWNlID0gbnVsbCwgcmVhc29uID0gbnVsbCkge1xuICogICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBleGNlcHRpb25cbiAqICAgfVxuICogfVxuICpcbiAqIGJvb3RzdHJhcChNeUFwcCwgW3Byb3ZpZGUoRXhjZXB0aW9uSGFuZGxlciwge3VzZUNsYXNzOiBNeUV4Y2VwdGlvbkhhbmRsZXJ9KV0pXG4gKlxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBFeGNlcHRpb25IYW5kbGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfbG9nZ2VyOiBhbnksIHByaXZhdGUgX3JldGhyb3dFeGNlcHRpb246IGJvb2xlYW4gPSB0cnVlKSB7fVxuXG4gIHN0YXRpYyBleGNlcHRpb25Ub1N0cmluZyhleGNlcHRpb246IGFueSwgc3RhY2tUcmFjZTogYW55ID0gbnVsbCwgcmVhc29uOiBzdHJpbmcgPSBudWxsKTogc3RyaW5nIHtcbiAgICB2YXIgbCA9IG5ldyBfQXJyYXlMb2dnZXIoKTtcbiAgICB2YXIgZSA9IG5ldyBFeGNlcHRpb25IYW5kbGVyKGwsIGZhbHNlKTtcbiAgICBlLmNhbGwoZXhjZXB0aW9uLCBzdGFja1RyYWNlLCByZWFzb24pO1xuICAgIHJldHVybiBsLnJlcy5qb2luKFwiXFxuXCIpO1xuICB9XG5cbiAgY2FsbChleGNlcHRpb246IGFueSwgc3RhY2tUcmFjZTogYW55ID0gbnVsbCwgcmVhc29uOiBzdHJpbmcgPSBudWxsKTogdm9pZCB7XG4gICAgdmFyIG9yaWdpbmFsRXhjZXB0aW9uID0gdGhpcy5fZmluZE9yaWdpbmFsRXhjZXB0aW9uKGV4Y2VwdGlvbik7XG4gICAgdmFyIG9yaWdpbmFsU3RhY2sgPSB0aGlzLl9maW5kT3JpZ2luYWxTdGFjayhleGNlcHRpb24pO1xuICAgIHZhciBjb250ZXh0ID0gdGhpcy5fZmluZENvbnRleHQoZXhjZXB0aW9uKTtcblxuICAgIHRoaXMuX2xvZ2dlci5sb2dHcm91cChgRVhDRVBUSU9OOiAke3RoaXMuX2V4dHJhY3RNZXNzYWdlKGV4Y2VwdGlvbil9YCk7XG5cbiAgICBpZiAoaXNQcmVzZW50KHN0YWNrVHJhY2UpICYmIGlzQmxhbmsob3JpZ2luYWxTdGFjaykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5sb2dFcnJvcihcIlNUQUNLVFJBQ0U6XCIpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmxvZ0Vycm9yKHRoaXMuX2xvbmdTdGFja1RyYWNlKHN0YWNrVHJhY2UpKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KHJlYXNvbikpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5sb2dFcnJvcihgUkVBU09OOiAke3JlYXNvbn1gKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KG9yaWdpbmFsRXhjZXB0aW9uKSkge1xuICAgICAgdGhpcy5fbG9nZ2VyLmxvZ0Vycm9yKGBPUklHSU5BTCBFWENFUFRJT046ICR7dGhpcy5fZXh0cmFjdE1lc3NhZ2Uob3JpZ2luYWxFeGNlcHRpb24pfWApO1xuICAgIH1cblxuICAgIGlmIChpc1ByZXNlbnQob3JpZ2luYWxTdGFjaykpIHtcbiAgICAgIHRoaXMuX2xvZ2dlci5sb2dFcnJvcihcIk9SSUdJTkFMIFNUQUNLVFJBQ0U6XCIpO1xuICAgICAgdGhpcy5fbG9nZ2VyLmxvZ0Vycm9yKHRoaXMuX2xvbmdTdGFja1RyYWNlKG9yaWdpbmFsU3RhY2spKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KGNvbnRleHQpKSB7XG4gICAgICB0aGlzLl9sb2dnZXIubG9nRXJyb3IoXCJFUlJPUiBDT05URVhUOlwiKTtcbiAgICAgIHRoaXMuX2xvZ2dlci5sb2dFcnJvcihjb250ZXh0KTtcbiAgICB9XG5cbiAgICB0aGlzLl9sb2dnZXIubG9nR3JvdXBFbmQoKTtcblxuICAgIC8vIFdlIHJldGhyb3cgZXhjZXB0aW9ucywgc28gb3BlcmF0aW9ucyBsaWtlICdib290c3RyYXAnIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yXG4gICAgLy8gd2hlbiBhbiBleGNlcHRpb24gaGFwcGVucy4gSWYgd2UgZG8gbm90IHJldGhyb3csIGJvb3RzdHJhcCB3aWxsIGFsd2F5cyBzdWNjZWVkLlxuICAgIGlmICh0aGlzLl9yZXRocm93RXhjZXB0aW9uKSB0aHJvdyBleGNlcHRpb247XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9leHRyYWN0TWVzc2FnZShleGNlcHRpb246IGFueSk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24gPyBleGNlcHRpb24ud3JhcHBlck1lc3NhZ2UgOiBleGNlcHRpb24udG9TdHJpbmcoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2xvbmdTdGFja1RyYWNlKHN0YWNrVHJhY2U6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIGlzTGlzdExpa2VJdGVyYWJsZShzdGFja1RyYWNlKSA/ICg8YW55W10+c3RhY2tUcmFjZSkuam9pbihcIlxcblxcbi0tLS0tYXN5bmMgZ2FwLS0tLS1cXG5cIikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1RyYWNlLnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9maW5kQ29udGV4dChleGNlcHRpb246IGFueSk6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghKGV4Y2VwdGlvbiBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24pKSByZXR1cm4gbnVsbDtcbiAgICAgIHJldHVybiBpc1ByZXNlbnQoZXhjZXB0aW9uLmNvbnRleHQpID8gZXhjZXB0aW9uLmNvbnRleHQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maW5kQ29udGV4dChleGNlcHRpb24ub3JpZ2luYWxFeGNlcHRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGV4Y2VwdGlvbi5jb250ZXh0IGNhbiB0aHJvdyBhbiBleGNlcHRpb24uIGlmIGl0IGhhcHBlbnMsIHdlIGlnbm9yZSB0aGUgY29udGV4dC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2ZpbmRPcmlnaW5hbEV4Y2VwdGlvbihleGNlcHRpb246IGFueSk6IGFueSB7XG4gICAgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgV3JhcHBlZEV4Y2VwdGlvbikpIHJldHVybiBudWxsO1xuXG4gICAgdmFyIGUgPSBleGNlcHRpb24ub3JpZ2luYWxFeGNlcHRpb247XG4gICAgd2hpbGUgKGUgaW5zdGFuY2VvZiBXcmFwcGVkRXhjZXB0aW9uICYmIGlzUHJlc2VudChlLm9yaWdpbmFsRXhjZXB0aW9uKSkge1xuICAgICAgZSA9IGUub3JpZ2luYWxFeGNlcHRpb247XG4gICAgfVxuXG4gICAgcmV0dXJuIGU7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9maW5kT3JpZ2luYWxTdGFjayhleGNlcHRpb246IGFueSk6IGFueSB7XG4gICAgaWYgKCEoZXhjZXB0aW9uIGluc3RhbmNlb2YgV3JhcHBlZEV4Y2VwdGlvbikpIHJldHVybiBudWxsO1xuXG4gICAgdmFyIGUgPSBleGNlcHRpb247XG4gICAgdmFyIHN0YWNrID0gZXhjZXB0aW9uLm9yaWdpbmFsU3RhY2s7XG4gICAgd2hpbGUgKGUgaW5zdGFuY2VvZiBXcmFwcGVkRXhjZXB0aW9uICYmIGlzUHJlc2VudChlLm9yaWdpbmFsRXhjZXB0aW9uKSkge1xuICAgICAgZSA9IGUub3JpZ2luYWxFeGNlcHRpb247XG4gICAgICBpZiAoZSBpbnN0YW5jZW9mIFdyYXBwZWRFeGNlcHRpb24gJiYgaXNQcmVzZW50KGUub3JpZ2luYWxFeGNlcHRpb24pKSB7XG4gICAgICAgIHN0YWNrID0gZS5vcmlnaW5hbFN0YWNrO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGFjaztcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25faGFuZGxlci50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7UmVmbGVjdG9yfSBmcm9tICcuL3JlZmxlY3Rvcic7XG5leHBvcnQge1JlZmxlY3RvciwgUmVmbGVjdGlvbkluZm99IGZyb20gJy4vcmVmbGVjdG9yJztcbmltcG9ydCB7UmVmbGVjdGlvbkNhcGFiaWxpdGllc30gZnJvbSAnLi9yZWZsZWN0aW9uX2NhcGFiaWxpdGllcyc7XG5cbi8qKlxuICogVGhlIHtAbGluayBSZWZsZWN0b3J9IHVzZWQgaW50ZXJuYWxseSBpbiBBbmd1bGFyIHRvIGFjY2VzcyBtZXRhZGF0YVxuICogYWJvdXQgc3ltYm9scy5cbiAqL1xuZXhwb3J0IHZhciByZWZsZWN0b3IgPSBuZXcgUmVmbGVjdG9yKG5ldyBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzKCkpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uLnRzXG4gKiovIiwiaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7XG4gIExpc3RXcmFwcGVyLFxuICBNYXAsXG4gIE1hcFdyYXBwZXIsXG4gIFNldCxcbiAgU2V0V3JhcHBlcixcbiAgU3RyaW5nTWFwV3JhcHBlclxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtTZXR0ZXJGbiwgR2V0dGVyRm4sIE1ldGhvZEZufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7UGxhdGZvcm1SZWZsZWN0aW9uQ2FwYWJpbGl0aWVzfSBmcm9tICcuL3BsYXRmb3JtX3JlZmxlY3Rpb25fY2FwYWJpbGl0aWVzJztcbmV4cG9ydCB7U2V0dGVyRm4sIEdldHRlckZuLCBNZXRob2RGbn0gZnJvbSAnLi90eXBlcyc7XG5leHBvcnQge1BsYXRmb3JtUmVmbGVjdGlvbkNhcGFiaWxpdGllc30gZnJvbSAnLi9wbGF0Zm9ybV9yZWZsZWN0aW9uX2NhcGFiaWxpdGllcyc7XG5cbi8qKlxuICogUmVmbGVjdGl2ZSBpbmZvcm1hdGlvbiBhYm91dCBhIHN5bWJvbCwgaW5jbHVkaW5nIGFubm90YXRpb25zLCBpbnRlcmZhY2VzLCBhbmQgb3RoZXIgbWV0YWRhdGEuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWZsZWN0aW9uSW5mbyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBhbm5vdGF0aW9ucz86IGFueVtdLCBwdWJsaWMgcGFyYW1ldGVycz86IGFueVtdW10sIHB1YmxpYyBmYWN0b3J5PzogRnVuY3Rpb24sXG4gICAgICAgICAgICAgIHB1YmxpYyBpbnRlcmZhY2VzPzogYW55W10sIHB1YmxpYyBwcm9wTWV0YWRhdGE/OiB7W2tleTogc3RyaW5nXTogYW55W119KSB7fVxufVxuXG4vKipcbiAqIFByb3ZpZGVzIGFjY2VzcyB0byByZWZsZWN0aW9uIGRhdGEgYWJvdXQgc3ltYm9scy4gVXNlZCBpbnRlcm5hbGx5IGJ5IEFuZ3VsYXJcbiAqIHRvIHBvd2VyIGRlcGVuZGVuY3kgaW5qZWN0aW9uIGFuZCBjb21waWxhdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlZmxlY3RvciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2luamVjdGFibGVJbmZvID0gbmV3IE1hcDxhbnksIFJlZmxlY3Rpb25JbmZvPigpO1xuICAvKiogQGludGVybmFsICovXG4gIF9nZXR0ZXJzID0gbmV3IE1hcDxzdHJpbmcsIEdldHRlckZuPigpO1xuICAvKiogQGludGVybmFsICovXG4gIF9zZXR0ZXJzID0gbmV3IE1hcDxzdHJpbmcsIFNldHRlckZuPigpO1xuICAvKiogQGludGVybmFsICovXG4gIF9tZXRob2RzID0gbmV3IE1hcDxzdHJpbmcsIE1ldGhvZEZuPigpO1xuICAvKiogQGludGVybmFsICovXG4gIF91c2VkS2V5czogU2V0PGFueT47XG4gIHJlZmxlY3Rpb25DYXBhYmlsaXRpZXM6IFBsYXRmb3JtUmVmbGVjdGlvbkNhcGFiaWxpdGllcztcblxuICBjb25zdHJ1Y3RvcihyZWZsZWN0aW9uQ2FwYWJpbGl0aWVzOiBQbGF0Zm9ybVJlZmxlY3Rpb25DYXBhYmlsaXRpZXMpIHtcbiAgICB0aGlzLl91c2VkS2V5cyA9IG51bGw7XG4gICAgdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzID0gcmVmbGVjdGlvbkNhcGFiaWxpdGllcztcbiAgfVxuXG4gIGlzUmVmbGVjdGlvbkVuYWJsZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuaXNSZWZsZWN0aW9uRW5hYmxlZCgpOyB9XG5cbiAgLyoqXG4gICAqIENhdXNlcyBgdGhpc2AgcmVmbGVjdG9yIHRvIHRyYWNrIGtleXMgdXNlZCB0byBhY2Nlc3NcbiAgICoge0BsaW5rIFJlZmxlY3Rpb25JbmZvfSBvYmplY3RzLlxuICAgKi9cbiAgdHJhY2tVc2FnZSgpOiB2b2lkIHsgdGhpcy5fdXNlZEtleXMgPSBuZXcgU2V0KCk7IH1cblxuICAvKipcbiAgICogTGlzdHMgdHlwZXMgZm9yIHdoaWNoIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24gd2FzIG5vdCByZXF1ZXN0ZWQgc2luY2VcbiAgICoge0BsaW5rICN0cmFja1VzYWdlfSB3YXMgY2FsbGVkLiBUaGlzIGxpc3QgY291bGQgbGF0ZXIgYmUgYXVkaXRlZCBhc1xuICAgKiBwb3RlbnRpYWwgZGVhZCBjb2RlLlxuICAgKi9cbiAgbGlzdFVudXNlZEtleXMoKTogYW55W10ge1xuICAgIGlmICh0aGlzLl91c2VkS2V5cyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignVXNhZ2UgdHJhY2tpbmcgaXMgZGlzYWJsZWQnKTtcbiAgICB9XG4gICAgdmFyIGFsbFR5cGVzID0gTWFwV3JhcHBlci5rZXlzKHRoaXMuX2luamVjdGFibGVJbmZvKTtcbiAgICByZXR1cm4gYWxsVHlwZXMuZmlsdGVyKGtleSA9PiAhU2V0V3JhcHBlci5oYXModGhpcy5fdXNlZEtleXMsIGtleSkpO1xuICB9XG5cbiAgcmVnaXN0ZXJGdW5jdGlvbihmdW5jOiBGdW5jdGlvbiwgZnVuY0luZm86IFJlZmxlY3Rpb25JbmZvKTogdm9pZCB7XG4gICAgdGhpcy5faW5qZWN0YWJsZUluZm8uc2V0KGZ1bmMsIGZ1bmNJbmZvKTtcbiAgfVxuXG4gIHJlZ2lzdGVyVHlwZSh0eXBlOiBUeXBlLCB0eXBlSW5mbzogUmVmbGVjdGlvbkluZm8pOiB2b2lkIHtcbiAgICB0aGlzLl9pbmplY3RhYmxlSW5mby5zZXQodHlwZSwgdHlwZUluZm8pO1xuICB9XG5cbiAgcmVnaXN0ZXJHZXR0ZXJzKGdldHRlcnM6IHtba2V5OiBzdHJpbmddOiBHZXR0ZXJGbn0pOiB2b2lkIHsgX21lcmdlTWFwcyh0aGlzLl9nZXR0ZXJzLCBnZXR0ZXJzKTsgfVxuXG4gIHJlZ2lzdGVyU2V0dGVycyhzZXR0ZXJzOiB7W2tleTogc3RyaW5nXTogU2V0dGVyRm59KTogdm9pZCB7IF9tZXJnZU1hcHModGhpcy5fc2V0dGVycywgc2V0dGVycyk7IH1cblxuICByZWdpc3Rlck1ldGhvZHMobWV0aG9kczoge1trZXk6IHN0cmluZ106IE1ldGhvZEZufSk6IHZvaWQgeyBfbWVyZ2VNYXBzKHRoaXMuX21ldGhvZHMsIG1ldGhvZHMpOyB9XG5cbiAgZmFjdG9yeSh0eXBlOiBUeXBlKTogRnVuY3Rpb24ge1xuICAgIGlmICh0aGlzLl9jb250YWluc1JlZmxlY3Rpb25JbmZvKHR5cGUpKSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5fZ2V0UmVmbGVjdGlvbkluZm8odHlwZSkuZmFjdG9yeTtcbiAgICAgIHJldHVybiBpc1ByZXNlbnQocmVzKSA/IHJlcyA6IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuZmFjdG9yeSh0eXBlKTtcbiAgICB9XG4gIH1cblxuICBwYXJhbWV0ZXJzKHR5cGVPckZ1bmM6IC8qVHlwZSovIGFueSk6IGFueVtdIHtcbiAgICBpZiAodGhpcy5faW5qZWN0YWJsZUluZm8uaGFzKHR5cGVPckZ1bmMpKSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5fZ2V0UmVmbGVjdGlvbkluZm8odHlwZU9yRnVuYykucGFyYW1ldGVycztcbiAgICAgIHJldHVybiBpc1ByZXNlbnQocmVzKSA/IHJlcyA6IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnBhcmFtZXRlcnModHlwZU9yRnVuYyk7XG4gICAgfVxuICB9XG5cbiAgYW5ub3RhdGlvbnModHlwZU9yRnVuYzogLypUeXBlKi8gYW55KTogYW55W10ge1xuICAgIGlmICh0aGlzLl9pbmplY3RhYmxlSW5mby5oYXModHlwZU9yRnVuYykpIHtcbiAgICAgIHZhciByZXMgPSB0aGlzLl9nZXRSZWZsZWN0aW9uSW5mbyh0eXBlT3JGdW5jKS5hbm5vdGF0aW9ucztcbiAgICAgIHJldHVybiBpc1ByZXNlbnQocmVzKSA/IHJlcyA6IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmFubm90YXRpb25zKHR5cGVPckZ1bmMpO1xuICAgIH1cbiAgfVxuXG4gIHByb3BNZXRhZGF0YSh0eXBlT3JGdW5jOiAvKlR5cGUqLyBhbnkpOiB7W2tleTogc3RyaW5nXTogYW55W119IHtcbiAgICBpZiAodGhpcy5faW5qZWN0YWJsZUluZm8uaGFzKHR5cGVPckZ1bmMpKSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5fZ2V0UmVmbGVjdGlvbkluZm8odHlwZU9yRnVuYykucHJvcE1ldGFkYXRhO1xuICAgICAgcmV0dXJuIGlzUHJlc2VudChyZXMpID8gcmVzIDoge307XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvcE1ldGFkYXRhKHR5cGVPckZ1bmMpO1xuICAgIH1cbiAgfVxuXG4gIGludGVyZmFjZXModHlwZTogVHlwZSk6IGFueVtdIHtcbiAgICBpZiAodGhpcy5faW5qZWN0YWJsZUluZm8uaGFzKHR5cGUpKSB7XG4gICAgICB2YXIgcmVzID0gdGhpcy5fZ2V0UmVmbGVjdGlvbkluZm8odHlwZSkuaW50ZXJmYWNlcztcbiAgICAgIHJldHVybiBpc1ByZXNlbnQocmVzKSA/IHJlcyA6IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmludGVyZmFjZXModHlwZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0dGVyKG5hbWU6IHN0cmluZyk6IEdldHRlckZuIHtcbiAgICBpZiAodGhpcy5fZ2V0dGVycy5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZXR0ZXJzLmdldChuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5nZXR0ZXIobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgc2V0dGVyKG5hbWU6IHN0cmluZyk6IFNldHRlckZuIHtcbiAgICBpZiAodGhpcy5fc2V0dGVycy5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXR0ZXJzLmdldChuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5zZXR0ZXIobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgbWV0aG9kKG5hbWU6IHN0cmluZyk6IE1ldGhvZEZuIHtcbiAgICBpZiAodGhpcy5fbWV0aG9kcy5oYXMobmFtZSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tZXRob2RzLmdldChuYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5tZXRob2QobmFtZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0UmVmbGVjdGlvbkluZm8odHlwZU9yRnVuYykge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fdXNlZEtleXMpKSB7XG4gICAgICB0aGlzLl91c2VkS2V5cy5hZGQodHlwZU9yRnVuYyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9pbmplY3RhYmxlSW5mby5nZXQodHlwZU9yRnVuYyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9jb250YWluc1JlZmxlY3Rpb25JbmZvKHR5cGVPckZ1bmMpIHsgcmV0dXJuIHRoaXMuX2luamVjdGFibGVJbmZvLmhhcyh0eXBlT3JGdW5jKTsgfVxuXG4gIGltcG9ydFVyaSh0eXBlOiBUeXBlKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5pbXBvcnRVcmkodHlwZSk7IH1cbn1cblxuZnVuY3Rpb24gX21lcmdlTWFwcyh0YXJnZXQ6IE1hcDxhbnksIGFueT4sIGNvbmZpZzoge1trZXk6IHN0cmluZ106IEZ1bmN0aW9ufSk6IHZvaWQge1xuICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goY29uZmlnLCAodiwgaykgPT4gdGFyZ2V0LnNldChrLCB2KSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9yZWZsZWN0aW9uL3JlZmxlY3Rvci50c1xuICoqLyIsImltcG9ydCB7XG4gIFR5cGUsXG4gIGlzUHJlc2VudCxcbiAgaXNGdW5jdGlvbixcbiAgZ2xvYmFsLFxuICBzdHJpbmdpZnksXG4gIENvbmNyZXRlVHlwZVxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtHZXR0ZXJGbiwgU2V0dGVyRm4sIE1ldGhvZEZufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7UGxhdGZvcm1SZWZsZWN0aW9uQ2FwYWJpbGl0aWVzfSBmcm9tICcuL3BsYXRmb3JtX3JlZmxlY3Rpb25fY2FwYWJpbGl0aWVzJztcblxuZXhwb3J0IGNsYXNzIFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgaW1wbGVtZW50cyBQbGF0Zm9ybVJlZmxlY3Rpb25DYXBhYmlsaXRpZXMge1xuICBwcml2YXRlIF9yZWZsZWN0OiBhbnk7XG5cbiAgY29uc3RydWN0b3IocmVmbGVjdD86IGFueSkgeyB0aGlzLl9yZWZsZWN0ID0gaXNQcmVzZW50KHJlZmxlY3QpID8gcmVmbGVjdCA6IGdsb2JhbC5SZWZsZWN0OyB9XG5cbiAgaXNSZWZsZWN0aW9uRW5hYmxlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cblxuICBmYWN0b3J5KHQ6IENvbmNyZXRlVHlwZSk6IEZ1bmN0aW9uIHtcbiAgICBzd2l0Y2ggKHQubGVuZ3RoKSB7XG4gICAgICBjYXNlIDA6XG4gICAgICAgIHJldHVybiAoKSA9PiBuZXcgdCgpO1xuICAgICAgY2FzZSAxOlxuICAgICAgICByZXR1cm4gKGExKSA9PiBuZXcgdChhMSk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiAoYTEsIGEyKSA9PiBuZXcgdChhMSwgYTIpO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMpID0+IG5ldyB0KGExLCBhMiwgYTMpO1xuICAgICAgY2FzZSA0OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0KSA9PiBuZXcgdChhMSwgYTIsIGEzLCBhNCk7XG4gICAgICBjYXNlIDU6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1KSA9PiBuZXcgdChhMSwgYTIsIGEzLCBhNCwgYTUpO1xuICAgICAgY2FzZSA2OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpID0+IG5ldyB0KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpO1xuICAgICAgY2FzZSA3OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSA9PiBuZXcgdChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk7XG4gICAgICBjYXNlIDg6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSA9PiBuZXcgdChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgpO1xuICAgICAgY2FzZSA5OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpID0+IG5ldyB0KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpO1xuICAgICAgY2FzZSAxMDpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTApID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwKTtcbiAgICAgIGNhc2UgMTE6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEpO1xuICAgICAgY2FzZSAxMjpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyKSA9PlxuICAgICAgICAgICAgICAgICAgIG5ldyB0KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIpO1xuICAgICAgY2FzZSAxMzpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzKTtcbiAgICAgIGNhc2UgMTQ6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQpO1xuICAgICAgY2FzZSAxNTpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1KSA9PlxuICAgICAgICAgICAgICAgICAgIG5ldyB0KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUpO1xuICAgICAgY2FzZSAxNjpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2KTtcbiAgICAgIGNhc2UgMTc6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGExNyk7XG4gICAgICBjYXNlIDE4OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNiwgYTE3LCBhMTgpID0+XG4gICAgICAgICAgICAgICAgICAgbmV3IHQoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgYTE4KTtcbiAgICAgIGNhc2UgMTk6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4LCBhOSwgYTEwLCBhMTEsIGExMiwgYTEzLCBhMTQsIGExNSwgYTE2LCBhMTcsIGExOCxcbiAgICAgICAgICAgICAgICBhMTkpID0+IG5ldyB0KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTksIGExMCwgYTExLCBhMTIsIGExMywgYTE0LCBhMTUsIGExNixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGExNywgYTE4LCBhMTkpO1xuICAgICAgY2FzZSAyMDpcbiAgICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LCBhMTYsIGExNywgYTE4LFxuICAgICAgICAgICAgICAgIGExOSwgYTIwKSA9PiBuZXcgdChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5LCBhMTAsIGExMSwgYTEyLCBhMTMsIGExNCwgYTE1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhMTYsIGExNywgYTE4LCBhMTksIGEyMCk7XG4gICAgfTtcblxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBjcmVhdGUgYSBmYWN0b3J5IGZvciAnJHtzdHJpbmdpZnkodCl9JyBiZWNhdXNlIGl0cyBjb25zdHJ1Y3RvciBoYXMgbW9yZSB0aGFuIDIwIGFyZ3VtZW50c2ApO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfemlwVHlwZXNBbmRBbm5vdGFpb25zKHBhcmFtVHlwZXMsIHBhcmFtQW5ub3RhdGlvbnMpOiBhbnlbXVtdIHtcbiAgICB2YXIgcmVzdWx0O1xuXG4gICAgaWYgKHR5cGVvZiBwYXJhbVR5cGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHBhcmFtQW5ub3RhdGlvbnMubGVuZ3RoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gbmV3IEFycmF5KHBhcmFtVHlwZXMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkrKykge1xuICAgICAgLy8gVFMgb3V0cHV0cyBPYmplY3QgZm9yIHBhcmFtZXRlcnMgd2l0aG91dCB0eXBlcywgd2hpbGUgVHJhY2V1ciBvbWl0c1xuICAgICAgLy8gdGhlIGFubm90YXRpb25zLiBGb3Igbm93IHdlIHByZXNlcnZlIHRoZSBUcmFjZXVyIGJlaGF2aW9yIHRvIGFpZFxuICAgICAgLy8gbWlncmF0aW9uLCBidXQgdGhpcyBjYW4gYmUgcmV2aXNpdGVkLlxuICAgICAgaWYgKHR5cGVvZiBwYXJhbVR5cGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXN1bHRbaV0gPSBbXTtcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1UeXBlc1tpXSAhPSBPYmplY3QpIHtcbiAgICAgICAgcmVzdWx0W2ldID0gW3BhcmFtVHlwZXNbaV1dO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2ldID0gW107XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KHBhcmFtQW5ub3RhdGlvbnMpICYmIGlzUHJlc2VudChwYXJhbUFubm90YXRpb25zW2ldKSkge1xuICAgICAgICByZXN1bHRbaV0gPSByZXN1bHRbaV0uY29uY2F0KHBhcmFtQW5ub3RhdGlvbnNbaV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcGFyYW1ldGVycyh0eXBlT3JGdW5jOiBUeXBlKTogYW55W11bXSB7XG4gICAgLy8gUHJlZmVyIHRoZSBkaXJlY3QgQVBJLlxuICAgIGlmIChpc1ByZXNlbnQoKDxhbnk+dHlwZU9yRnVuYykucGFyYW1ldGVycykpIHtcbiAgICAgIHJldHVybiAoPGFueT50eXBlT3JGdW5jKS5wYXJhbWV0ZXJzO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3JlZmxlY3QpICYmIGlzUHJlc2VudCh0aGlzLl9yZWZsZWN0LmdldE1ldGFkYXRhKSkge1xuICAgICAgdmFyIHBhcmFtQW5ub3RhdGlvbnMgPSB0aGlzLl9yZWZsZWN0LmdldE1ldGFkYXRhKCdwYXJhbWV0ZXJzJywgdHlwZU9yRnVuYyk7XG4gICAgICB2YXIgcGFyYW1UeXBlcyA9IHRoaXMuX3JlZmxlY3QuZ2V0TWV0YWRhdGEoJ2Rlc2lnbjpwYXJhbXR5cGVzJywgdHlwZU9yRnVuYyk7XG4gICAgICBpZiAoaXNQcmVzZW50KHBhcmFtVHlwZXMpIHx8IGlzUHJlc2VudChwYXJhbUFubm90YXRpb25zKSkge1xuICAgICAgICByZXR1cm4gdGhpcy5femlwVHlwZXNBbmRBbm5vdGFpb25zKHBhcmFtVHlwZXMsIHBhcmFtQW5ub3RhdGlvbnMpO1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBUaGUgYXJyYXkgaGFzIHRvIGJlIGZpbGxlZCB3aXRoIGB1bmRlZmluZWRgIGJlY2F1c2UgaG9sZXMgd291bGQgYmUgc2tpcHBlZCBieSBgc29tZWBcbiAgICBsZXQgcGFyYW1ldGVycyA9IG5ldyBBcnJheSgoPGFueT50eXBlT3JGdW5jLmxlbmd0aCkpO1xuICAgIHBhcmFtZXRlcnMuZmlsbCh1bmRlZmluZWQpO1xuICAgIHJldHVybiBwYXJhbWV0ZXJzO1xuICB9XG5cbiAgYW5ub3RhdGlvbnModHlwZU9yRnVuYzogVHlwZSk6IGFueVtdIHtcbiAgICAvLyBQcmVmZXIgdGhlIGRpcmVjdCBBUEkuXG4gICAgaWYgKGlzUHJlc2VudCgoPGFueT50eXBlT3JGdW5jKS5hbm5vdGF0aW9ucykpIHtcbiAgICAgIHZhciBhbm5vdGF0aW9ucyA9ICg8YW55PnR5cGVPckZ1bmMpLmFubm90YXRpb25zO1xuICAgICAgaWYgKGlzRnVuY3Rpb24oYW5ub3RhdGlvbnMpICYmIGFubm90YXRpb25zLmFubm90YXRpb25zKSB7XG4gICAgICAgIGFubm90YXRpb25zID0gYW5ub3RhdGlvbnMuYW5ub3RhdGlvbnM7XG4gICAgICB9XG4gICAgICByZXR1cm4gYW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fcmVmbGVjdCkgJiYgaXNQcmVzZW50KHRoaXMuX3JlZmxlY3QuZ2V0TWV0YWRhdGEpKSB7XG4gICAgICB2YXIgYW5ub3RhdGlvbnMgPSB0aGlzLl9yZWZsZWN0LmdldE1ldGFkYXRhKCdhbm5vdGF0aW9ucycsIHR5cGVPckZ1bmMpO1xuICAgICAgaWYgKGlzUHJlc2VudChhbm5vdGF0aW9ucykpIHJldHVybiBhbm5vdGF0aW9ucztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcHJvcE1ldGFkYXRhKHR5cGVPckZ1bmM6IGFueSk6IHtba2V5OiBzdHJpbmddOiBhbnlbXX0ge1xuICAgIC8vIFByZWZlciB0aGUgZGlyZWN0IEFQSS5cbiAgICBpZiAoaXNQcmVzZW50KCg8YW55PnR5cGVPckZ1bmMpLnByb3BNZXRhZGF0YSkpIHtcbiAgICAgIHZhciBwcm9wTWV0YWRhdGEgPSAoPGFueT50eXBlT3JGdW5jKS5wcm9wTWV0YWRhdGE7XG4gICAgICBpZiAoaXNGdW5jdGlvbihwcm9wTWV0YWRhdGEpICYmIHByb3BNZXRhZGF0YS5wcm9wTWV0YWRhdGEpIHtcbiAgICAgICAgcHJvcE1ldGFkYXRhID0gcHJvcE1ldGFkYXRhLnByb3BNZXRhZGF0YTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm9wTWV0YWRhdGE7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fcmVmbGVjdCkgJiYgaXNQcmVzZW50KHRoaXMuX3JlZmxlY3QuZ2V0TWV0YWRhdGEpKSB7XG4gICAgICB2YXIgcHJvcE1ldGFkYXRhID0gdGhpcy5fcmVmbGVjdC5nZXRNZXRhZGF0YSgncHJvcE1ldGFkYXRhJywgdHlwZU9yRnVuYyk7XG4gICAgICBpZiAoaXNQcmVzZW50KHByb3BNZXRhZGF0YSkpIHJldHVybiBwcm9wTWV0YWRhdGE7XG4gICAgfVxuICAgIHJldHVybiB7fTtcbiAgfVxuXG4gIGludGVyZmFjZXModHlwZTogVHlwZSk6IGFueVtdIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcIkphdmFTY3JpcHQgZG9lcyBub3Qgc3VwcG9ydCBpbnRlcmZhY2VzXCIpO1xuICB9XG5cbiAgZ2V0dGVyKG5hbWU6IHN0cmluZyk6IEdldHRlckZuIHsgcmV0dXJuIDxHZXR0ZXJGbj5uZXcgRnVuY3Rpb24oJ28nLCAncmV0dXJuIG8uJyArIG5hbWUgKyAnOycpOyB9XG5cbiAgc2V0dGVyKG5hbWU6IHN0cmluZyk6IFNldHRlckZuIHtcbiAgICByZXR1cm4gPFNldHRlckZuPm5ldyBGdW5jdGlvbignbycsICd2JywgJ3JldHVybiBvLicgKyBuYW1lICsgJyA9IHY7Jyk7XG4gIH1cblxuICBtZXRob2QobmFtZTogc3RyaW5nKTogTWV0aG9kRm4ge1xuICAgIGxldCBmdW5jdGlvbkJvZHkgPSBgaWYgKCFvLiR7bmFtZX0pIHRocm93IG5ldyBFcnJvcignXCIke25hbWV9XCIgaXMgdW5kZWZpbmVkJyk7XG4gICAgICAgIHJldHVybiBvLiR7bmFtZX0uYXBwbHkobywgYXJncyk7YDtcbiAgICByZXR1cm4gPE1ldGhvZEZuPm5ldyBGdW5jdGlvbignbycsICdhcmdzJywgZnVuY3Rpb25Cb2R5KTtcbiAgfVxuXG4gIC8vIFRoZXJlIGlzIG5vdCBhIGNvbmNlcHQgb2YgaW1wb3J0IHVyaSBpbiBKcywgYnV0IHRoaXMgaXMgdXNlZnVsIGluIGRldmVsb3BpbmcgRGFydCBhcHBsaWNhdGlvbnMuXG4gIGltcG9ydFVyaSh0eXBlOiBUeXBlKTogc3RyaW5nIHsgcmV0dXJuICcuLyc7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbl9jYXBhYmlsaXRpZXMudHNcbiAqKi8iLCJpbXBvcnQge3N0cmluZ2lmeSwgQ09OU1QsIFR5cGUsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1R5cGVMaXRlcmFsfSBmcm9tICcuL3R5cGVfbGl0ZXJhbCc7XG5pbXBvcnQge3Jlc29sdmVGb3J3YXJkUmVmfSBmcm9tICcuL2ZvcndhcmRfcmVmJztcblxuZXhwb3J0IHtUeXBlTGl0ZXJhbH0gZnJvbSAnLi90eXBlX2xpdGVyYWwnO1xuXG4vKipcbiAqIEEgdW5pcXVlIG9iamVjdCB1c2VkIGZvciByZXRyaWV2aW5nIGl0ZW1zIGZyb20gdGhlIHtAbGluayBJbmplY3Rvcn0uXG4gKlxuICogS2V5cyBoYXZlOlxuICogLSBhIHN5c3RlbS13aWRlIHVuaXF1ZSBgaWRgLlxuICogLSBhIGB0b2tlbmAuXG4gKlxuICogYEtleWAgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHtAbGluayBJbmplY3Rvcn0gYmVjYXVzZSBpdHMgc3lzdGVtLXdpZGUgdW5pcXVlIGBpZGAgYWxsb3dzIHRoZVxuICogaW5qZWN0b3IgdG8gc3RvcmUgY3JlYXRlZCBvYmplY3RzIGluIGEgbW9yZSBlZmZpY2llbnQgd2F5LlxuICpcbiAqIGBLZXlgIHNob3VsZCBub3QgYmUgY3JlYXRlZCBkaXJlY3RseS4ge0BsaW5rIEluamVjdG9yfSBjcmVhdGVzIGtleXMgYXV0b21hdGljYWxseSB3aGVuIHJlc29sdmluZ1xuICogcHJvdmlkZXJzLlxuICovXG5leHBvcnQgY2xhc3MgS2V5IHtcbiAgLyoqXG4gICAqIFByaXZhdGVcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0b2tlbjogT2JqZWN0LCBwdWJsaWMgaWQ6IG51bWJlcikge1xuICAgIGlmIChpc0JsYW5rKHRva2VuKSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1Rva2VuIG11c3QgYmUgZGVmaW5lZCEnKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIHN0cmluZ2lmaWVkIHRva2VuLlxuICAgKi9cbiAgZ2V0IGRpc3BsYXlOYW1lKCk6IHN0cmluZyB7IHJldHVybiBzdHJpbmdpZnkodGhpcy50b2tlbik7IH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIGEgYEtleWAgZm9yIGEgdG9rZW4uXG4gICAqL1xuICBzdGF0aWMgZ2V0KHRva2VuOiBPYmplY3QpOiBLZXkgeyByZXR1cm4gX2dsb2JhbEtleVJlZ2lzdHJ5LmdldChyZXNvbHZlRm9yd2FyZFJlZih0b2tlbikpOyB9XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5cyByZWdpc3RlcmVkIGluIHRoZSBzeXN0ZW0uXG4gICAqL1xuICBzdGF0aWMgZ2V0IG51bWJlck9mS2V5cygpOiBudW1iZXIgeyByZXR1cm4gX2dsb2JhbEtleVJlZ2lzdHJ5Lm51bWJlck9mS2V5czsgfVxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgY2xhc3MgS2V5UmVnaXN0cnkge1xuICBwcml2YXRlIF9hbGxLZXlzID0gbmV3IE1hcDxPYmplY3QsIEtleT4oKTtcblxuICBnZXQodG9rZW46IE9iamVjdCk6IEtleSB7XG4gICAgaWYgKHRva2VuIGluc3RhbmNlb2YgS2V5KSByZXR1cm4gdG9rZW47XG5cbiAgICAvLyBUT0RPOiB3b3JrYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMxMjNcbiAgICB2YXIgdGhlVG9rZW4gPSB0b2tlbjtcbiAgICBpZiAodG9rZW4gaW5zdGFuY2VvZiBUeXBlTGl0ZXJhbCkge1xuICAgICAgdGhlVG9rZW4gPSB0b2tlbi50eXBlO1xuICAgIH1cbiAgICB0b2tlbiA9IHRoZVRva2VuO1xuXG4gICAgaWYgKHRoaXMuX2FsbEtleXMuaGFzKHRva2VuKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2FsbEtleXMuZ2V0KHRva2VuKTtcbiAgICB9XG5cbiAgICB2YXIgbmV3S2V5ID0gbmV3IEtleSh0b2tlbiwgS2V5Lm51bWJlck9mS2V5cyk7XG4gICAgdGhpcy5fYWxsS2V5cy5zZXQodG9rZW4sIG5ld0tleSk7XG4gICAgcmV0dXJuIG5ld0tleTtcbiAgfVxuXG4gIGdldCBudW1iZXJPZktleXMoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2FsbEtleXMuc2l6ZTsgfVxufVxuXG52YXIgX2dsb2JhbEtleVJlZ2lzdHJ5ID0gbmV3IEtleVJlZ2lzdHJ5KCk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS9rZXkudHNcbiAqKi8iLCIvKipcbiAqIFR5cGUgbGl0ZXJhbHMgaXMgYSBEYXJ0LW9ubHkgZmVhdHVyZS4gVGhpcyBpcyBoZXJlIG9ubHkgc28gd2UgY2FuIHgtY29tcGlsZVxuICogdG8gbXVsdGlwbGUgbGFuZ3VhZ2VzLlxuICovXG5leHBvcnQgY2xhc3MgVHlwZUxpdGVyYWwge1xuICBnZXQgdHlwZSgpOiBhbnkgeyB0aHJvdyBuZXcgRXJyb3IoXCJUeXBlIGxpdGVyYWxzIGFyZSBvbmx5IHN1cHBvcnRlZCBpbiBEYXJ0XCIpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS90eXBlX2xpdGVyYWwudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtzdHJpbmdpZnksIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb24sIHVuaW1wbGVtZW50ZWR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge0tleX0gZnJvbSAnLi9rZXknO1xuaW1wb3J0IHtJbmplY3Rvcn0gZnJvbSAnLi9pbmplY3Rvcic7XG5cbmZ1bmN0aW9uIGZpbmRGaXJzdENsb3NlZEN5Y2xlKGtleXM6IGFueVtdKTogYW55W10ge1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkge1xuICAgIGlmIChMaXN0V3JhcHBlci5jb250YWlucyhyZXMsIGtleXNbaV0pKSB7XG4gICAgICByZXMucHVzaChrZXlzW2ldKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlcy5wdXNoKGtleXNbaV0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXM6IGFueVtdKTogc3RyaW5nIHtcbiAgaWYgKGtleXMubGVuZ3RoID4gMSkge1xuICAgIHZhciByZXZlcnNlZCA9IGZpbmRGaXJzdENsb3NlZEN5Y2xlKExpc3RXcmFwcGVyLnJldmVyc2VkKGtleXMpKTtcbiAgICB2YXIgdG9rZW5TdHJzID0gcmV2ZXJzZWQubWFwKGsgPT4gc3RyaW5naWZ5KGsudG9rZW4pKTtcbiAgICByZXR1cm4gXCIgKFwiICsgdG9rZW5TdHJzLmpvaW4oJyAtPiAnKSArIFwiKVwiO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBcIlwiO1xuICB9XG59XG5cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBhbGwgZXJyb3JzIGFyaXNpbmcgZnJvbSBtaXNjb25maWd1cmVkIHByb3ZpZGVycy5cbiAqL1xuZXhwb3J0IGNsYXNzIEFic3RyYWN0UHJvdmlkZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICAvKiogQGludGVybmFsICovXG4gIG1lc3NhZ2U6IHN0cmluZztcblxuICAvKiogQGludGVybmFsICovXG4gIGtleXM6IEtleVtdO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgaW5qZWN0b3JzOiBJbmplY3RvcltdO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZTogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBrZXk6IEtleSwgY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZTogRnVuY3Rpb24pIHtcbiAgICBzdXBlcihcIkRJIEV4Y2VwdGlvblwiKTtcbiAgICB0aGlzLmtleXMgPSBba2V5XTtcbiAgICB0aGlzLmluamVjdG9ycyA9IFtpbmplY3Rvcl07XG4gICAgdGhpcy5jb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlID0gY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZTtcbiAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2UodGhpcy5rZXlzKTtcbiAgfVxuXG4gIGFkZEtleShpbmplY3RvcjogSW5qZWN0b3IsIGtleTogS2V5KTogdm9pZCB7XG4gICAgdGhpcy5pbmplY3RvcnMucHVzaChpbmplY3Rvcik7XG4gICAgdGhpcy5rZXlzLnB1c2goa2V5KTtcbiAgICB0aGlzLm1lc3NhZ2UgPSB0aGlzLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2UodGhpcy5rZXlzKTtcbiAgfVxuXG4gIGdldCBjb250ZXh0KCkgeyByZXR1cm4gdGhpcy5pbmplY3RvcnNbdGhpcy5pbmplY3RvcnMubGVuZ3RoIC0gMV0uZGVidWdDb250ZXh0KCk7IH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0cnlpbmcgdG8gcmV0cmlldmUgYSBkZXBlbmRlbmN5IGJ5IGBLZXlgIGZyb20ge0BsaW5rIEluamVjdG9yfSwgYnV0IHRoZVxuICoge0BsaW5rIEluamVjdG9yfSBkb2VzIG5vdCBoYXZlIGEge0BsaW5rIFByb3ZpZGVyfSBmb3Ige0BsaW5rIEtleX0uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3ZxOEQzRlJCOWFHYm5XSnF0RVBFP3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQSB7XG4gKiAgIGNvbnN0cnVjdG9yKGI6Qikge31cbiAqIH1cbiAqXG4gKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pKS50b1Rocm93RXJyb3IoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgTm9Qcm92aWRlckVycm9yIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlckVycm9yIHtcbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBrZXk6IEtleSkge1xuICAgIHN1cGVyKGluamVjdG9yLCBrZXksIGZ1bmN0aW9uKGtleXM6IGFueVtdKSB7XG4gICAgICB2YXIgZmlyc3QgPSBzdHJpbmdpZnkoTGlzdFdyYXBwZXIuZmlyc3Qoa2V5cykudG9rZW4pO1xuICAgICAgcmV0dXJuIGBObyBwcm92aWRlciBmb3IgJHtmaXJzdH0hJHtjb25zdHJ1Y3RSZXNvbHZpbmdQYXRoKGtleXMpfWA7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiBkZXBlbmRlbmNpZXMgZm9ybSBhIGN5Y2xlLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC93WVFkTm9zMFR6cWwzZWkxRVY5aj9wPWluZm8pKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW1xuICogICBwcm92aWRlKFwib25lXCIsIHt1c2VGYWN0b3J5OiAodHdvKSA9PiBcInR3b1wiLCBkZXBzOiBbW25ldyBJbmplY3QoXCJ0d29cIildXX0pLFxuICogICBwcm92aWRlKFwidHdvXCIsIHt1c2VGYWN0b3J5OiAob25lKSA9PiBcIm9uZVwiLCBkZXBzOiBbW25ldyBJbmplY3QoXCJvbmVcIildXX0pXG4gKiBdKTtcbiAqXG4gKiBleHBlY3QoKCkgPT4gaW5qZWN0b3IuZ2V0KFwib25lXCIpKS50b1Rocm93RXJyb3IoKTtcbiAqIGBgYFxuICpcbiAqIFJldHJpZXZpbmcgYEFgIG9yIGBCYCB0aHJvd3MgYSBgQ3ljbGljRGVwZW5kZW5jeUVycm9yYCBhcyB0aGUgZ3JhcGggYWJvdmUgY2Fubm90IGJlIGNvbnN0cnVjdGVkLlxuICovXG5leHBvcnQgY2xhc3MgQ3ljbGljRGVwZW5kZW5jeUVycm9yIGV4dGVuZHMgQWJzdHJhY3RQcm92aWRlckVycm9yIHtcbiAgY29uc3RydWN0b3IoaW5qZWN0b3I6IEluamVjdG9yLCBrZXk6IEtleSkge1xuICAgIHN1cGVyKGluamVjdG9yLCBrZXksIGZ1bmN0aW9uKGtleXM6IGFueVtdKSB7XG4gICAgICByZXR1cm4gYENhbm5vdCBpbnN0YW50aWF0ZSBjeWNsaWMgZGVwZW5kZW5jeSEke2NvbnN0cnVjdFJlc29sdmluZ1BhdGgoa2V5cyl9YDtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGEgY29uc3RydWN0aW5nIHR5cGUgcmV0dXJucyB3aXRoIGFuIEVycm9yLlxuICpcbiAqIFRoZSBgSW5zdGFudGlhdGlvbkVycm9yYCBjbGFzcyBjb250YWlucyB0aGUgb3JpZ2luYWwgZXJyb3IgcGx1cyB0aGUgZGVwZW5kZW5jeSBncmFwaCB3aGljaCBjYXVzZWRcbiAqIHRoaXMgb2JqZWN0IHRvIGJlIGluc3RhbnRpYXRlZC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvN2FXWWRjcVRRc1AwZU5xRWRVQWY/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjbGFzcyBBIHtcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlJyk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtBXSk7XG5cbiAqIHRyeSB7XG4gKiAgIGluamVjdG9yLmdldChBKTtcbiAqIH0gY2F0Y2ggKGUpIHtcbiAqICAgZXhwZWN0KGUgaW5zdGFuY2VvZiBJbnN0YW50aWF0aW9uRXJyb3IpLnRvQmUodHJ1ZSk7XG4gKiAgIGV4cGVjdChlLm9yaWdpbmFsRXhjZXB0aW9uLm1lc3NhZ2UpLnRvRXF1YWwoXCJtZXNzYWdlXCIpO1xuICogICBleHBlY3QoZS5vcmlnaW5hbFN0YWNrKS50b0JlRGVmaW5lZCgpO1xuICogfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnN0YW50aWF0aW9uRXJyb3IgZXh0ZW5kcyBXcmFwcGVkRXhjZXB0aW9uIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBrZXlzOiBLZXlbXTtcblxuICAvKiogQGludGVybmFsICovXG4gIGluamVjdG9yczogSW5qZWN0b3JbXTtcblxuICBjb25zdHJ1Y3RvcihpbmplY3RvcjogSW5qZWN0b3IsIG9yaWdpbmFsRXhjZXB0aW9uLCBvcmlnaW5hbFN0YWNrLCBrZXk6IEtleSkge1xuICAgIHN1cGVyKFwiREkgRXhjZXB0aW9uXCIsIG9yaWdpbmFsRXhjZXB0aW9uLCBvcmlnaW5hbFN0YWNrLCBudWxsKTtcbiAgICB0aGlzLmtleXMgPSBba2V5XTtcbiAgICB0aGlzLmluamVjdG9ycyA9IFtpbmplY3Rvcl07XG4gIH1cblxuICBhZGRLZXkoaW5qZWN0b3I6IEluamVjdG9yLCBrZXk6IEtleSk6IHZvaWQge1xuICAgIHRoaXMuaW5qZWN0b3JzLnB1c2goaW5qZWN0b3IpO1xuICAgIHRoaXMua2V5cy5wdXNoKGtleSk7XG4gIH1cblxuICBnZXQgd3JhcHBlck1lc3NhZ2UoKTogc3RyaW5nIHtcbiAgICB2YXIgZmlyc3QgPSBzdHJpbmdpZnkoTGlzdFdyYXBwZXIuZmlyc3QodGhpcy5rZXlzKS50b2tlbik7XG4gICAgcmV0dXJuIGBFcnJvciBkdXJpbmcgaW5zdGFudGlhdGlvbiBvZiAke2ZpcnN0fSEke2NvbnN0cnVjdFJlc29sdmluZ1BhdGgodGhpcy5rZXlzKX0uYDtcbiAgfVxuXG4gIGdldCBjYXVzZUtleSgpOiBLZXkgeyByZXR1cm4gdGhpcy5rZXlzWzBdOyB9XG5cbiAgZ2V0IGNvbnRleHQoKSB7IHJldHVybiB0aGlzLmluamVjdG9yc1t0aGlzLmluamVjdG9ycy5sZW5ndGggLSAxXS5kZWJ1Z0NvbnRleHQoKTsgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGFuIG9iamVjdCBvdGhlciB0aGVuIHtAbGluayBQcm92aWRlcn0gKG9yIGBUeXBlYCkgaXMgcGFzc2VkIHRvIHtAbGluayBJbmplY3Rvcn1cbiAqIGNyZWF0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9ZYXRDRmJQQU1DTDBKU1NRNG12SD9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcIm5vdCBhIHR5cGVcIl0pKS50b1Rocm93RXJyb3IoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgSW52YWxpZFByb3ZpZGVyRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IocHJvdmlkZXIpIHtcbiAgICBzdXBlcihcIkludmFsaWQgcHJvdmlkZXIgLSBvbmx5IGluc3RhbmNlcyBvZiBQcm92aWRlciBhbmQgVHlwZSBhcmUgYWxsb3dlZCwgZ290OiBcIiArXG4gICAgICAgICAgcHJvdmlkZXIudG9TdHJpbmcoKSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUaHJvd24gd2hlbiB0aGUgY2xhc3MgaGFzIG5vIGFubm90YXRpb24gaW5mb3JtYXRpb24uXG4gKlxuICogTGFjayBvZiBhbm5vdGF0aW9uIGluZm9ybWF0aW9uIHByZXZlbnRzIHRoZSB7QGxpbmsgSW5qZWN0b3J9IGZyb20gZGV0ZXJtaW5pbmcgd2hpY2ggZGVwZW5kZW5jaWVzXG4gKiBuZWVkIHRvIGJlIGluamVjdGVkIGludG8gdGhlIGNvbnN0cnVjdG9yLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9ySG5adGxOUzd2Sk9QUTZwY1ZrbT9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNsYXNzIEEge1xuICogICBjb25zdHJ1Y3RvcihiKSB7fVxuICogfVxuICpcbiAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtBXSkpLnRvVGhyb3dFcnJvcigpO1xuICogYGBgXG4gKlxuICogVGhpcyBlcnJvciBpcyBhbHNvIHRocm93biB3aGVuIHRoZSBjbGFzcyBub3QgbWFya2VkIHdpdGgge0BsaW5rIEluamVjdGFibGV9IGhhcyBwYXJhbWV0ZXIgdHlwZXMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQiB7fVxuICpcbiAqIGNsYXNzIEEge1xuICogICBjb25zdHJ1Y3RvcihiOkIpIHt9IC8vIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJhbWV0ZXIgdHlwZXMgb2YgQSBpcyBhdmFpbGFibGUgYXQgcnVudGltZS5cbiAqIH1cbiAqXG4gKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQSxCXSkpLnRvVGhyb3dFcnJvcigpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBOb0Fubm90YXRpb25FcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcih0eXBlT3JGdW5jLCBwYXJhbXM6IGFueVtdW10pIHtcbiAgICBzdXBlcihOb0Fubm90YXRpb25FcnJvci5fZ2VuTWVzc2FnZSh0eXBlT3JGdW5jLCBwYXJhbXMpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9nZW5NZXNzYWdlKHR5cGVPckZ1bmMsIHBhcmFtczogYW55W11bXSkge1xuICAgIHZhciBzaWduYXR1cmUgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBwYXJhbXMubGVuZ3RoOyBpIDwgaWk7IGkrKykge1xuICAgICAgdmFyIHBhcmFtZXRlciA9IHBhcmFtc1tpXTtcbiAgICAgIGlmIChpc0JsYW5rKHBhcmFtZXRlcikgfHwgcGFyYW1ldGVyLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgIHNpZ25hdHVyZS5wdXNoKCc/Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaWduYXR1cmUucHVzaChwYXJhbWV0ZXIubWFwKHN0cmluZ2lmeSkuam9pbignICcpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFwiQ2Fubm90IHJlc29sdmUgYWxsIHBhcmFtZXRlcnMgZm9yIFwiICsgc3RyaW5naWZ5KHR5cGVPckZ1bmMpICsgXCIoXCIgK1xuICAgICAgICAgICBzaWduYXR1cmUuam9pbignLCAnKSArIFwiKS4gXCIgKyAnTWFrZSBzdXJlIHRoZXkgYWxsIGhhdmUgdmFsaWQgdHlwZSBvciBhbm5vdGF0aW9ucy4nO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIHdoZW4gZ2V0dGluZyBhbiBvYmplY3QgYnkgaW5kZXguXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2JSczBTWDJPVFFpSnpxdmpnbDhQP3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY2xhc3MgQSB7fVxuICpcbiAqIHZhciBpbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoW0FdKTtcbiAqXG4gKiBleHBlY3QoKCkgPT4gaW5qZWN0b3IuZ2V0QXQoMTAwKSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE91dE9mQm91bmRzRXJyb3IgZXh0ZW5kcyBCYXNlRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoaW5kZXgpIHsgc3VwZXIoYEluZGV4ICR7aW5kZXh9IGlzIG91dC1vZi1ib3VuZHMuYCk7IH1cbn1cblxuLy8gVE9ETzogYWRkIGEgd29ya2luZyBleGFtcGxlIGFmdGVyIGFscGhhMzggaXMgcmVsZWFzZWRcbi8qKlxuICogVGhyb3duIHdoZW4gYSBtdWx0aSBwcm92aWRlciBhbmQgYSByZWd1bGFyIHByb3ZpZGVyIGFyZSBib3VuZCB0byB0aGUgc2FtZSB0b2tlbi5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICAgbmV3IFByb3ZpZGVyKFwiU3RyaW5nc1wiLCB7dXNlVmFsdWU6IFwic3RyaW5nMVwiLCBtdWx0aTogdHJ1ZX0pLFxuICogICBuZXcgUHJvdmlkZXIoXCJTdHJpbmdzXCIsIHt1c2VWYWx1ZTogXCJzdHJpbmcyXCIsIG11bHRpOiBmYWxzZX0pXG4gKiBdKSkudG9UaHJvd0Vycm9yKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcihwcm92aWRlcjEsIHByb3ZpZGVyMikge1xuICAgIHN1cGVyKFwiQ2Fubm90IG1peCBtdWx0aSBwcm92aWRlcnMgYW5kIHJlZ3VsYXIgcHJvdmlkZXJzLCBnb3Q6IFwiICsgcHJvdmlkZXIxLnRvU3RyaW5nKCkgKyBcIiBcIiArXG4gICAgICAgICAgcHJvdmlkZXIyLnRvU3RyaW5nKCkpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9kaS9leGNlcHRpb25zLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCBpbiBhIERJIFByb3ZpZGVyLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9ZczllelhwajJNbm95M1VjOEtCcD9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIHZhciB0ID0gbmV3IE9wYXF1ZVRva2VuKFwidmFsdWVcIik7XG4gKlxuICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gKiAgIHByb3ZpZGUodCwge3VzZVZhbHVlOiBcInByb3ZpZGVkVmFsdWVcIn0pXG4gKiBdKTtcbiAqXG4gKiBleHBlY3QoaW5qZWN0b3IuZ2V0KHQpKS50b0VxdWFsKFwiYmluZGluZ1ZhbHVlXCIpO1xuICogYGBgXG4gKlxuICogVXNpbmcgYW4gYE9wYXF1ZVRva2VuYCBpcyBwcmVmZXJhYmxlIHRvIHVzaW5nIHN0cmluZ3MgYXMgdG9rZW5zIGJlY2F1c2Ugb2YgcG9zc2libGUgY29sbGlzaW9uc1xuICogY2F1c2VkIGJ5IG11bHRpcGxlIHByb3ZpZGVycyB1c2luZyB0aGUgc2FtZSBzdHJpbmcgYXMgdHdvIGRpZmZlcmVudCB0b2tlbnMuXG4gKlxuICogVXNpbmcgYW4gYE9wYXF1ZVRva2VuYCBpcyBwcmVmZXJhYmxlIHRvIHVzaW5nIGFuIGBPYmplY3RgIGFzIHRva2VucyBiZWNhdXNlIGl0IHByb3ZpZGVzIGJldHRlclxuICogZXJyb3IgbWVzc2FnZXMuXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgT3BhcXVlVG9rZW4ge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kZXNjOiBzdHJpbmcpIHt9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIGBUb2tlbiAke3RoaXMuX2Rlc2N9YDsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvZGkvb3BhcXVlX3Rva2VuLnRzXG4gKiovIiwiaW1wb3J0IHtpc1ByZXNlbnQsIENPTlNULCBDT05TVF9FWFBSLCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtJbmplY3RhYmxlTWV0YWRhdGF9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpL21ldGFkYXRhJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24nO1xuaW1wb3J0IHtWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEvdmlldyc7XG5cbi8qKlxuICogRGlyZWN0aXZlcyBhbGxvdyB5b3UgdG8gYXR0YWNoIGJlaGF2aW9yIHRvIGVsZW1lbnRzIGluIHRoZSBET00uXG4gKlxuICoge0BsaW5rIERpcmVjdGl2ZU1ldGFkYXRhfXMgd2l0aCBhbiBlbWJlZGRlZCB2aWV3IGFyZSBjYWxsZWQge0BsaW5rIENvbXBvbmVudE1ldGFkYXRhfXMuXG4gKlxuICogQSBkaXJlY3RpdmUgY29uc2lzdHMgb2YgYSBzaW5nbGUgZGlyZWN0aXZlIGFubm90YXRpb24gYW5kIGEgY29udHJvbGxlciBjbGFzcy4gV2hlbiB0aGVcbiAqIGRpcmVjdGl2ZSdzIGBzZWxlY3RvcmAgbWF0Y2hlc1xuICogZWxlbWVudHMgaW4gdGhlIERPTSwgdGhlIGZvbGxvd2luZyBzdGVwcyBvY2N1cjpcbiAqXG4gKiAxLiBGb3IgZWFjaCBkaXJlY3RpdmUsIHRoZSBgRWxlbWVudEluamVjdG9yYCBhdHRlbXB0cyB0byByZXNvbHZlIHRoZSBkaXJlY3RpdmUncyBjb25zdHJ1Y3RvclxuICogYXJndW1lbnRzLlxuICogMi4gQW5ndWxhciBpbnN0YW50aWF0ZXMgZGlyZWN0aXZlcyBmb3IgZWFjaCBtYXRjaGVkIGVsZW1lbnQgdXNpbmcgYEVsZW1lbnRJbmplY3RvcmAgaW4gYVxuICogZGVwdGgtZmlyc3Qgb3JkZXIsXG4gKiAgICBhcyBkZWNsYXJlZCBpbiB0aGUgSFRNTC5cbiAqXG4gKiAjIyBVbmRlcnN0YW5kaW5nIEhvdyBJbmplY3Rpb24gV29ya3NcbiAqXG4gKiBUaGVyZSBhcmUgdGhyZWUgc3RhZ2VzIG9mIGluamVjdGlvbiByZXNvbHV0aW9uLlxuICogLSAqUHJlLWV4aXN0aW5nIEluamVjdG9ycyo6XG4gKiAgIC0gVGhlIHRlcm1pbmFsIHtAbGluayBJbmplY3Rvcn0gY2Fubm90IHJlc29sdmUgZGVwZW5kZW5jaWVzLiBJdCBlaXRoZXIgdGhyb3dzIGFuIGVycm9yIG9yLCBpZlxuICogdGhlIGRlcGVuZGVuY3kgd2FzXG4gKiAgICAgc3BlY2lmaWVkIGFzIGBAT3B0aW9uYWxgLCByZXR1cm5zIGBudWxsYC5cbiAqICAgLSBUaGUgcGxhdGZvcm0gaW5qZWN0b3IgcmVzb2x2ZXMgYnJvd3NlciBzaW5nbGV0b24gcmVzb3VyY2VzLCBzdWNoIGFzOiBjb29raWVzLCB0aXRsZSxcbiAqIGxvY2F0aW9uLCBhbmQgb3RoZXJzLlxuICogLSAqQ29tcG9uZW50IEluamVjdG9ycyo6IEVhY2ggY29tcG9uZW50IGluc3RhbmNlIGhhcyBpdHMgb3duIHtAbGluayBJbmplY3Rvcn0sIGFuZCB0aGV5IGZvbGxvd1xuICogdGhlIHNhbWUgcGFyZW50LWNoaWxkIGhpZXJhcmNoeVxuICogICAgIGFzIHRoZSBjb21wb25lbnQgaW5zdGFuY2VzIGluIHRoZSBET00uXG4gKiAtICpFbGVtZW50IEluamVjdG9ycyo6IEVhY2ggY29tcG9uZW50IGluc3RhbmNlIGhhcyBhIFNoYWRvdyBET00uIFdpdGhpbiB0aGUgU2hhZG93IERPTSBlYWNoXG4gKiBlbGVtZW50IGhhcyBhbiBgRWxlbWVudEluamVjdG9yYFxuICogICAgIHdoaWNoIGZvbGxvdyB0aGUgc2FtZSBwYXJlbnQtY2hpbGQgaGllcmFyY2h5IGFzIHRoZSBET00gZWxlbWVudHMgdGhlbXNlbHZlcy5cbiAqXG4gKiBXaGVuIGEgdGVtcGxhdGUgaXMgaW5zdGFudGlhdGVkLCBpdCBhbHNvIG11c3QgaW5zdGFudGlhdGUgdGhlIGNvcnJlc3BvbmRpbmcgZGlyZWN0aXZlcyBpbiBhXG4gKiBkZXB0aC1maXJzdCBvcmRlci4gVGhlXG4gKiBjdXJyZW50IGBFbGVtZW50SW5qZWN0b3JgIHJlc29sdmVzIHRoZSBjb25zdHJ1Y3RvciBkZXBlbmRlbmNpZXMgZm9yIGVhY2ggZGlyZWN0aXZlLlxuICpcbiAqIEFuZ3VsYXIgdGhlbiByZXNvbHZlcyBkZXBlbmRlbmNpZXMgYXMgZm9sbG93cywgYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGVcbiAqIHtAbGluayBWaWV3TWV0YWRhdGF9OlxuICpcbiAqIDEuIERlcGVuZGVuY2llcyBvbiB0aGUgY3VycmVudCBlbGVtZW50XG4gKiAyLiBEZXBlbmRlbmNpZXMgb24gZWxlbWVudCBpbmplY3RvcnMgYW5kIHRoZWlyIHBhcmVudHMgdW50aWwgaXQgZW5jb3VudGVycyBhIFNoYWRvdyBET00gYm91bmRhcnlcbiAqIDMuIERlcGVuZGVuY2llcyBvbiBjb21wb25lbnQgaW5qZWN0b3JzIGFuZCB0aGVpciBwYXJlbnRzIHVudGlsIGl0IGVuY291bnRlcnMgdGhlIHJvb3QgY29tcG9uZW50XG4gKiA0LiBEZXBlbmRlbmNpZXMgb24gcHJlLWV4aXN0aW5nIGluamVjdG9yc1xuICpcbiAqXG4gKiBUaGUgYEVsZW1lbnRJbmplY3RvcmAgY2FuIGluamVjdCBvdGhlciBkaXJlY3RpdmVzLCBlbGVtZW50LXNwZWNpZmljIHNwZWNpYWwgb2JqZWN0cywgb3IgaXQgY2FuXG4gKiBkZWxlZ2F0ZSB0byB0aGUgcGFyZW50XG4gKiBpbmplY3Rvci5cbiAqXG4gKiBUbyBpbmplY3Qgb3RoZXIgZGlyZWN0aXZlcywgZGVjbGFyZSB0aGUgY29uc3RydWN0b3IgcGFyYW1ldGVyIGFzOlxuICogLSBgZGlyZWN0aXZlOkRpcmVjdGl2ZVR5cGVgOiBhIGRpcmVjdGl2ZSBvbiB0aGUgY3VycmVudCBlbGVtZW50IG9ubHlcbiAqIC0gYEBIb3N0KCkgZGlyZWN0aXZlOkRpcmVjdGl2ZVR5cGVgOiBhbnkgZGlyZWN0aXZlIHRoYXQgbWF0Y2hlcyB0aGUgdHlwZSBiZXR3ZWVuIHRoZSBjdXJyZW50XG4gKiBlbGVtZW50IGFuZCB0aGVcbiAqICAgIFNoYWRvdyBET00gcm9vdC5cbiAqIC0gYEBRdWVyeShEaXJlY3RpdmVUeXBlKSBxdWVyeTpRdWVyeUxpc3Q8RGlyZWN0aXZlVHlwZT5gOiBBIGxpdmUgY29sbGVjdGlvbiBvZiBkaXJlY3QgY2hpbGRcbiAqIGRpcmVjdGl2ZXMuXG4gKiAtIGBAUXVlcnlEZXNjZW5kYW50cyhEaXJlY3RpdmVUeXBlKSBxdWVyeTpRdWVyeUxpc3Q8RGlyZWN0aXZlVHlwZT5gOiBBIGxpdmUgY29sbGVjdGlvbiBvZiBhbnlcbiAqIGNoaWxkIGRpcmVjdGl2ZXMuXG4gKlxuICogVG8gaW5qZWN0IGVsZW1lbnQtc3BlY2lmaWMgc3BlY2lhbCBvYmplY3RzLCBkZWNsYXJlIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgYXM6XG4gKiAtIGBlbGVtZW50OiBFbGVtZW50UmVmYCB0byBvYnRhaW4gYSByZWZlcmVuY2UgdG8gbG9naWNhbCBlbGVtZW50IGluIHRoZSB2aWV3LlxuICogLSBgdmlld0NvbnRhaW5lcjogVmlld0NvbnRhaW5lclJlZmAgdG8gY29udHJvbCBjaGlsZCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9uLCBmb3JcbiAqIHtAbGluayBEaXJlY3RpdmVNZXRhZGF0YX0gZGlyZWN0aXZlcyBvbmx5XG4gKiAtIGBiaW5kaW5nUHJvcGFnYXRpb246IEJpbmRpbmdQcm9wYWdhdGlvbmAgdG8gY29udHJvbCBjaGFuZ2UgZGV0ZWN0aW9uIGluIGEgbW9yZSBncmFudWxhciB3YXkuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVtb25zdHJhdGVzIGhvdyBkZXBlbmRlbmN5IGluamVjdGlvbiByZXNvbHZlcyBjb25zdHJ1Y3RvciBhcmd1bWVudHMgaW5cbiAqIHByYWN0aWNlLlxuICpcbiAqXG4gKiBBc3N1bWUgdGhpcyBIVE1MIHRlbXBsYXRlOlxuICpcbiAqIGBgYFxuICogPGRpdiBkZXBlbmRlbmN5PVwiMVwiPlxuICogICA8ZGl2IGRlcGVuZGVuY3k9XCIyXCI+XG4gKiAgICAgPGRpdiBkZXBlbmRlbmN5PVwiM1wiIG15LWRpcmVjdGl2ZT5cbiAqICAgICAgIDxkaXYgZGVwZW5kZW5jeT1cIjRcIj5cbiAqICAgICAgICAgPGRpdiBkZXBlbmRlbmN5PVwiNVwiPjwvZGl2PlxuICogICAgICAgPC9kaXY+XG4gKiAgICAgICA8ZGl2IGRlcGVuZGVuY3k9XCI2XCI+PC9kaXY+XG4gKiAgICAgPC9kaXY+XG4gKiAgIDwvZGl2PlxuICogPC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBXaXRoIHRoZSBmb2xsb3dpbmcgYGRlcGVuZGVuY3lgIGRlY29yYXRvciBhbmQgYFNvbWVTZXJ2aWNlYCBpbmplY3RhYmxlIGNsYXNzLlxuICpcbiAqIGBgYFxuICogQEluamVjdGFibGUoKVxuICogY2xhc3MgU29tZVNlcnZpY2Uge1xuICogfVxuICpcbiAqIEBEaXJlY3RpdmUoe1xuICogICBzZWxlY3RvcjogJ1tkZXBlbmRlbmN5XScsXG4gKiAgIGlucHV0czogW1xuICogICAgICdpZDogZGVwZW5kZW5jeSdcbiAqICAgXVxuICogfSlcbiAqIGNsYXNzIERlcGVuZGVuY3kge1xuICogICBpZDpzdHJpbmc7XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBMZXQncyBzdGVwIHRocm91Z2ggdGhlIGRpZmZlcmVudCB3YXlzIGluIHdoaWNoIGBNeURpcmVjdGl2ZWAgY291bGQgYmUgZGVjbGFyZWQuLi5cbiAqXG4gKlxuICogIyMjIE5vIGluamVjdGlvblxuICpcbiAqIEhlcmUgdGhlIGNvbnN0cnVjdG9yIGlzIGRlY2xhcmVkIHdpdGggbm8gYXJndW1lbnRzLCB0aGVyZWZvcmUgbm90aGluZyBpcyBpbmplY3RlZCBpbnRvXG4gKiBgTXlEaXJlY3RpdmVgLlxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW215LWRpcmVjdGl2ZV0nIH0pXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGRpcmVjdGl2ZSB3b3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBubyBkZXBlbmRlbmNpZXMuXG4gKlxuICpcbiAqICMjIyBDb21wb25lbnQtbGV2ZWwgaW5qZWN0aW9uXG4gKlxuICogRGlyZWN0aXZlcyBjYW4gaW5qZWN0IGFueSBpbmplY3RhYmxlIGluc3RhbmNlIGZyb20gdGhlIGNsb3Nlc3QgY29tcG9uZW50IGluamVjdG9yIG9yIGFueSBvZiBpdHNcbiAqIHBhcmVudHMuXG4gKlxuICogSGVyZSwgdGhlIGNvbnN0cnVjdG9yIGRlY2xhcmVzIGEgcGFyYW1ldGVyLCBgc29tZVNlcnZpY2VgLCBhbmQgaW5qZWN0cyB0aGUgYFNvbWVTZXJ2aWNlYCB0eXBlXG4gKiBmcm9tIHRoZSBwYXJlbnRcbiAqIGNvbXBvbmVudCdzIGluamVjdG9yLlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbXktZGlyZWN0aXZlXScgfSlcbiAqIGNsYXNzIE15RGlyZWN0aXZlIHtcbiAqICAgY29uc3RydWN0b3Ioc29tZVNlcnZpY2U6IFNvbWVTZXJ2aWNlKSB7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIHdvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGVwZW5kZW5jeSBvbiBgU29tZVNlcnZpY2VgLlxuICpcbiAqXG4gKiAjIyMgSW5qZWN0aW5nIGEgZGlyZWN0aXZlIGZyb20gdGhlIGN1cnJlbnQgZWxlbWVudFxuICpcbiAqIERpcmVjdGl2ZXMgY2FuIGluamVjdCBvdGhlciBkaXJlY3RpdmVzIGRlY2xhcmVkIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbXktZGlyZWN0aXZlXScgfSlcbiAqIGNsYXNzIE15RGlyZWN0aXZlIHtcbiAqICAgY29uc3RydWN0b3IoZGVwZW5kZW5jeTogRGVwZW5kZW5jeSkge1xuICogICAgIGV4cGVjdChkZXBlbmRlbmN5LmlkKS50b0VxdWFsKDMpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqIFRoaXMgZGlyZWN0aXZlIHdvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGBEZXBlbmRlbmN5YCBkZWNsYXJlZCBhdCB0aGUgc2FtZSBlbGVtZW50LCBpbiB0aGlzIGNhc2VcbiAqIGBkZXBlbmRlbmN5PVwiM1wiYC5cbiAqXG4gKiAjIyMgSW5qZWN0aW5nIGEgZGlyZWN0aXZlIGZyb20gYW55IGFuY2VzdG9yIGVsZW1lbnRzXG4gKlxuICogRGlyZWN0aXZlcyBjYW4gaW5qZWN0IG90aGVyIGRpcmVjdGl2ZXMgZGVjbGFyZWQgb24gYW55IGFuY2VzdG9yIGVsZW1lbnQgKGluIHRoZSBjdXJyZW50IFNoYWRvd1xuICogRE9NKSwgaS5lLiBvbiB0aGUgY3VycmVudCBlbGVtZW50LCB0aGVcbiAqIHBhcmVudCBlbGVtZW50LCBvciBpdHMgcGFyZW50cy5cbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW215LWRpcmVjdGl2ZV0nIH0pXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIGNvbnN0cnVjdG9yKEBIb3N0KCkgZGVwZW5kZW5jeTogRGVwZW5kZW5jeSkge1xuICogICAgIGV4cGVjdChkZXBlbmRlbmN5LmlkKS50b0VxdWFsKDIpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBgQEhvc3RgIGNoZWNrcyB0aGUgY3VycmVudCBlbGVtZW50LCB0aGUgcGFyZW50LCBhcyB3ZWxsIGFzIGl0cyBwYXJlbnRzIHJlY3Vyc2l2ZWx5LiBJZlxuICogYGRlcGVuZGVuY3k9XCIyXCJgIGRpZG4ndFxuICogZXhpc3Qgb24gdGhlIGRpcmVjdCBwYXJlbnQsIHRoaXMgaW5qZWN0aW9uIHdvdWxkXG4gKiBoYXZlIHJldHVybmVkXG4gKiBgZGVwZW5kZW5jeT1cIjFcImAuXG4gKlxuICpcbiAqICMjIyBJbmplY3RpbmcgYSBsaXZlIGNvbGxlY3Rpb24gb2YgZGlyZWN0IGNoaWxkIGRpcmVjdGl2ZXNcbiAqXG4gKlxuICogQSBkaXJlY3RpdmUgY2FuIGFsc28gcXVlcnkgZm9yIG90aGVyIGNoaWxkIGRpcmVjdGl2ZXMuIFNpbmNlIHBhcmVudCBkaXJlY3RpdmVzIGFyZSBpbnN0YW50aWF0ZWRcbiAqIGJlZm9yZSBjaGlsZCBkaXJlY3RpdmVzLCBhIGRpcmVjdGl2ZSBjYW4ndCBzaW1wbHkgaW5qZWN0IHRoZSBsaXN0IG9mIGNoaWxkIGRpcmVjdGl2ZXMuIEluc3RlYWQsXG4gKiB0aGUgZGlyZWN0aXZlIGluamVjdHMgYSB7QGxpbmsgUXVlcnlMaXN0fSwgd2hpY2ggdXBkYXRlcyBpdHMgY29udGVudHMgYXMgY2hpbGRyZW4gYXJlIGFkZGVkLFxuICogcmVtb3ZlZCwgb3IgbW92ZWQgYnkgYSBkaXJlY3RpdmUgdGhhdCB1c2VzIGEge0BsaW5rIFZpZXdDb250YWluZXJSZWZ9IHN1Y2ggYXMgYSBgbmdGb3JgLCBhblxuICogYG5nSWZgLCBvciBhbiBgbmdTd2l0Y2hgLlxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7IHNlbGVjdG9yOiAnW215LWRpcmVjdGl2ZV0nIH0pXG4gKiBjbGFzcyBNeURpcmVjdGl2ZSB7XG4gKiAgIGNvbnN0cnVjdG9yKEBRdWVyeShEZXBlbmRlbmN5KSBkZXBlbmRlbmNpZXM6UXVlcnlMaXN0PERlcGVuZGVuY3k+KSB7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIHdvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEge0BsaW5rIFF1ZXJ5TGlzdH0gd2hpY2ggY29udGFpbnMgYERlcGVuZGVuY3lgIDQgYW5kXG4gKiBgRGVwZW5kZW5jeWAgNi4gSGVyZSwgYERlcGVuZGVuY3lgIDUgd291bGQgbm90IGJlIGluY2x1ZGVkLCBiZWNhdXNlIGl0IGlzIG5vdCBhIGRpcmVjdCBjaGlsZC5cbiAqXG4gKiAjIyMgSW5qZWN0aW5nIGEgbGl2ZSBjb2xsZWN0aW9uIG9mIGRlc2NlbmRhbnQgZGlyZWN0aXZlc1xuICpcbiAqIEJ5IHBhc3NpbmcgdGhlIGRlc2NlbmRhbnQgZmxhZyB0byBgQFF1ZXJ5YCBhYm92ZSwgd2UgY2FuIGluY2x1ZGUgdGhlIGNoaWxkcmVuIG9mIHRoZSBjaGlsZFxuICogZWxlbWVudHMuXG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHsgc2VsZWN0b3I6ICdbbXktZGlyZWN0aXZlXScgfSlcbiAqIGNsYXNzIE15RGlyZWN0aXZlIHtcbiAqICAgY29uc3RydWN0b3IoQFF1ZXJ5KERlcGVuZGVuY3ksIHtkZXNjZW5kYW50czogdHJ1ZX0pIGRlcGVuZGVuY2llczpRdWVyeUxpc3Q8RGVwZW5kZW5jeT4pIHtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgd291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBRdWVyeSB3aGljaCB3b3VsZCBjb250YWluIGBEZXBlbmRlbmN5YCA0LCA1IGFuZCA2LlxuICpcbiAqICMjIyBPcHRpb25hbCBpbmplY3Rpb25cbiAqXG4gKiBUaGUgbm9ybWFsIGJlaGF2aW9yIG9mIGRpcmVjdGl2ZXMgaXMgdG8gcmV0dXJuIGFuIGVycm9yIHdoZW4gYSBzcGVjaWZpZWQgZGVwZW5kZW5jeSBjYW5ub3QgYmVcbiAqIHJlc29sdmVkLiBJZiB5b3VcbiAqIHdvdWxkIGxpa2UgdG8gaW5qZWN0IGBudWxsYCBvbiB1bnJlc29sdmVkIGRlcGVuZGVuY3kgaW5zdGVhZCwgeW91IGNhbiBhbm5vdGF0ZSB0aGF0IGRlcGVuZGVuY3lcbiAqIHdpdGggYEBPcHRpb25hbCgpYC5cbiAqIFRoaXMgZXhwbGljaXRseSBwZXJtaXRzIHRoZSBhdXRob3Igb2YgYSB0ZW1wbGF0ZSB0byB0cmVhdCBzb21lIG9mIHRoZSBzdXJyb3VuZGluZyBkaXJlY3RpdmVzIGFzXG4gKiBvcHRpb25hbC5cbiAqXG4gKiBgYGBcbiAqIEBEaXJlY3RpdmUoeyBzZWxlY3RvcjogJ1tteS1kaXJlY3RpdmVdJyB9KVxuICogY2xhc3MgTXlEaXJlY3RpdmUge1xuICogICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBkZXBlbmRlbmN5OkRlcGVuZGVuY3kpIHtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogVGhpcyBkaXJlY3RpdmUgd291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggYSBgRGVwZW5kZW5jeWAgZGlyZWN0aXZlIGZvdW5kIG9uIHRoZSBjdXJyZW50IGVsZW1lbnQuXG4gKiBJZiBub25lIGNhbiBiZVxuICogZm91bmQsIHRoZSBpbmplY3RvciBzdXBwbGllcyBgbnVsbGAgaW5zdGVhZCBvZiB0aHJvd2luZyBhbiBlcnJvci5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIEhlcmUgd2UgdXNlIGEgZGVjb3JhdG9yIGRpcmVjdGl2ZSB0byBzaW1wbHkgZGVmaW5lIGJhc2ljIHRvb2wtdGlwIGJlaGF2aW9yLlxuICpcbiAqIGBgYFxuICogQERpcmVjdGl2ZSh7XG4gKiAgIHNlbGVjdG9yOiAnW3Rvb2x0aXBdJyxcbiAqICAgaW5wdXRzOiBbXG4gKiAgICAgJ3RleHQ6IHRvb2x0aXAnXG4gKiAgIF0sXG4gKiAgIGhvc3Q6IHtcbiAqICAgICAnKG1vdXNlZW50ZXIpJzogJ29uTW91c2VFbnRlcigpJyxcbiAqICAgICAnKG1vdXNlbGVhdmUpJzogJ29uTW91c2VMZWF2ZSgpJ1xuICogICB9XG4gKiB9KVxuICogY2xhc3MgVG9vbHRpcHtcbiAqICAgdGV4dDpzdHJpbmc7XG4gKiAgIG92ZXJsYXk6T3ZlcmxheTsgLy8gTk9UIFlFVCBJTVBMRU1FTlRFRFxuICogICBvdmVybGF5TWFuYWdlcjpPdmVybGF5TWFuYWdlcjsgLy8gTk9UIFlFVCBJTVBMRU1FTlRFRFxuICpcbiAqICAgY29uc3RydWN0b3Iob3ZlcmxheU1hbmFnZXI6T3ZlcmxheU1hbmFnZXIpIHtcbiAqICAgICB0aGlzLm92ZXJsYXkgPSBvdmVybGF5O1xuICogICB9XG4gKlxuICogICBvbk1vdXNlRW50ZXIoKSB7XG4gKiAgICAgLy8gZXhhY3Qgc2lnbmF0dXJlIHRvIGJlIGRldGVybWluZWRcbiAqICAgICB0aGlzLm92ZXJsYXkgPSB0aGlzLm92ZXJsYXlNYW5hZ2VyLm9wZW4odGV4dCwgLi4uKTtcbiAqICAgfVxuICpcbiAqICAgb25Nb3VzZUxlYXZlKCkge1xuICogICAgIHRoaXMub3ZlcmxheS5jbG9zZSgpO1xuICogICAgIHRoaXMub3ZlcmxheSA9IG51bGw7XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICogSW4gb3VyIEhUTUwgdGVtcGxhdGUsIHdlIGNhbiB0aGVuIGFkZCB0aGlzIGJlaGF2aW9yIHRvIGEgYDxkaXY+YCBvciBhbnkgb3RoZXIgZWxlbWVudCB3aXRoIHRoZVxuICogYHRvb2x0aXBgIHNlbGVjdG9yLFxuICogbGlrZSBzbzpcbiAqXG4gKiBgYGBcbiAqIDxkaXYgdG9vbHRpcD1cInNvbWUgdGV4dCBoZXJlXCI+PC9kaXY+XG4gKiBgYGBcbiAqXG4gKiBEaXJlY3RpdmVzIGNhbiBhbHNvIGNvbnRyb2wgdGhlIGluc3RhbnRpYXRpb24sIGRlc3RydWN0aW9uLCBhbmQgcG9zaXRpb25pbmcgb2YgaW5saW5lIHRlbXBsYXRlXG4gKiBlbGVtZW50czpcbiAqXG4gKiBBIGRpcmVjdGl2ZSB1c2VzIGEge0BsaW5rIFZpZXdDb250YWluZXJSZWZ9IHRvIGluc3RhbnRpYXRlLCBpbnNlcnQsIG1vdmUsIGFuZCBkZXN0cm95IHZpZXdzIGF0XG4gKiBydW50aW1lLlxuICogVGhlIHtAbGluayBWaWV3Q29udGFpbmVyUmVmfSBpcyBjcmVhdGVkIGFzIGEgcmVzdWx0IG9mIGA8dGVtcGxhdGU+YCBlbGVtZW50LCBhbmQgcmVwcmVzZW50cyBhXG4gKiBsb2NhdGlvbiBpbiB0aGUgY3VycmVudCB2aWV3XG4gKiB3aGVyZSB0aGVzZSBhY3Rpb25zIGFyZSBwZXJmb3JtZWQuXG4gKlxuICogVmlld3MgYXJlIGFsd2F5cyBjcmVhdGVkIGFzIGNoaWxkcmVuIG9mIHRoZSBjdXJyZW50IHtAbGluayBWaWV3TWV0YWRhdGF9LCBhbmQgYXMgc2libGluZ3Mgb2YgdGhlXG4gKiBgPHRlbXBsYXRlPmAgZWxlbWVudC4gVGh1cyBhXG4gKiBkaXJlY3RpdmUgaW4gYSBjaGlsZCB2aWV3IGNhbm5vdCBpbmplY3QgdGhlIGRpcmVjdGl2ZSB0aGF0IGNyZWF0ZWQgaXQuXG4gKlxuICogU2luY2UgZGlyZWN0aXZlcyB0aGF0IGNyZWF0ZSB2aWV3cyB2aWEgVmlld0NvbnRhaW5lcnMgYXJlIGNvbW1vbiBpbiBBbmd1bGFyLCBhbmQgdXNpbmcgdGhlIGZ1bGxcbiAqIGA8dGVtcGxhdGU+YCBlbGVtZW50IHN5bnRheCBpcyB3b3JkeSwgQW5ndWxhclxuICogYWxzbyBzdXBwb3J0cyBhIHNob3J0aGFuZCBub3RhdGlvbjogYDxsaSAqZm9vPVwiYmFyXCI+YCBhbmQgYDxsaSB0ZW1wbGF0ZT1cImZvbzogYmFyXCI+YCBhcmVcbiAqIGVxdWl2YWxlbnQuXG4gKlxuICogVGh1cyxcbiAqXG4gKiBgYGBcbiAqIDx1bD5cbiAqICAgPGxpICpmb289XCJiYXJcIiB0aXRsZT1cInRleHRcIj48L2xpPlxuICogPC91bD5cbiAqIGBgYFxuICpcbiAqIEV4cGFuZHMgaW4gdXNlIHRvOlxuICpcbiAqIGBgYFxuICogPHVsPlxuICogICA8dGVtcGxhdGUgW2Zvb109XCJiYXJcIj5cbiAqICAgICA8bGkgdGl0bGU9XCJ0ZXh0XCI+PC9saT5cbiAqICAgPC90ZW1wbGF0ZT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBOb3RpY2UgdGhhdCBhbHRob3VnaCB0aGUgc2hvcnRoYW5kIHBsYWNlcyBgKmZvbz1cImJhclwiYCB3aXRoaW4gdGhlIGA8bGk+YCBlbGVtZW50LCB0aGUgYmluZGluZyBmb3JcbiAqIHRoZSBkaXJlY3RpdmVcbiAqIGNvbnRyb2xsZXIgaXMgY29ycmVjdGx5IGluc3RhbnRpYXRlZCBvbiB0aGUgYDx0ZW1wbGF0ZT5gIGVsZW1lbnQgcmF0aGVyIHRoYW4gdGhlIGA8bGk+YCBlbGVtZW50LlxuICpcbiAqICMjIExpZmVjeWNsZSBob29rc1xuICpcbiAqIFdoZW4gdGhlIGRpcmVjdGl2ZSBjbGFzcyBpbXBsZW1lbnRzIHNvbWUge0BsaW5rIGFuZ3VsYXIyL2xpZmVjeWNsZV9ob29rc30gdGhlIGNhbGxiYWNrcyBhcmVcbiAqIGNhbGxlZCBieSB0aGUgY2hhbmdlIGRldGVjdGlvbiBhdCBkZWZpbmVkIHBvaW50cyBpbiB0aW1lIGR1cmluZyB0aGUgbGlmZSBvZiB0aGUgZGlyZWN0aXZlLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogTGV0J3Mgc3VwcG9zZSB3ZSB3YW50IHRvIGltcGxlbWVudCB0aGUgYHVubGVzc2AgYmVoYXZpb3IsIHRvIGNvbmRpdGlvbmFsbHkgaW5jbHVkZSBhIHRlbXBsYXRlLlxuICpcbiAqIEhlcmUgaXMgYSBzaW1wbGUgZGlyZWN0aXZlIHRoYXQgdHJpZ2dlcnMgb24gYW4gYHVubGVzc2Agc2VsZWN0b3I6XG4gKlxuICogYGBgXG4gKiBARGlyZWN0aXZlKHtcbiAqICAgc2VsZWN0b3I6ICdbdW5sZXNzXScsXG4gKiAgIGlucHV0czogWyd1bmxlc3MnXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBVbmxlc3Mge1xuICogICB2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmO1xuICogICB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWY7XG4gKiAgIHByZXZDb25kaXRpb246IGJvb2xlYW47XG4gKlxuICogICBjb25zdHJ1Y3Rvcih2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLCB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWYpIHtcbiAqICAgICB0aGlzLnZpZXdDb250YWluZXIgPSB2aWV3Q29udGFpbmVyO1xuICogICAgIHRoaXMudGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjtcbiAqICAgICB0aGlzLnByZXZDb25kaXRpb24gPSBudWxsO1xuICogICB9XG4gKlxuICogICBzZXQgdW5sZXNzKG5ld0NvbmRpdGlvbikge1xuICogICAgIGlmIChuZXdDb25kaXRpb24gJiYgKGlzQmxhbmsodGhpcy5wcmV2Q29uZGl0aW9uKSB8fCAhdGhpcy5wcmV2Q29uZGl0aW9uKSkge1xuICogICAgICAgdGhpcy5wcmV2Q29uZGl0aW9uID0gdHJ1ZTtcbiAqICAgICAgIHRoaXMudmlld0NvbnRhaW5lci5jbGVhcigpO1xuICogICAgIH0gZWxzZSBpZiAoIW5ld0NvbmRpdGlvbiAmJiAoaXNCbGFuayh0aGlzLnByZXZDb25kaXRpb24pIHx8IHRoaXMucHJldkNvbmRpdGlvbikpIHtcbiAqICAgICAgIHRoaXMucHJldkNvbmRpdGlvbiA9IGZhbHNlO1xuICogICAgICAgdGhpcy52aWV3Q29udGFpbmVyLmNyZWF0ZSh0aGlzLnRlbXBsYXRlUmVmKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFdlIGNhbiB0aGVuIHVzZSB0aGlzIGB1bmxlc3NgIHNlbGVjdG9yIGluIGEgdGVtcGxhdGU6XG4gKiBgYGBcbiAqIDx1bD5cbiAqICAgPGxpICp1bmxlc3M9XCJleHByXCI+PC9saT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBPbmNlIHRoZSBkaXJlY3RpdmUgaW5zdGFudGlhdGVzIHRoZSBjaGlsZCB2aWV3LCB0aGUgc2hvcnRoYW5kIG5vdGF0aW9uIGZvciB0aGUgdGVtcGxhdGUgZXhwYW5kc1xuICogYW5kIHRoZSByZXN1bHQgaXM6XG4gKlxuICogYGBgXG4gKiA8dWw+XG4gKiAgIDx0ZW1wbGF0ZSBbdW5sZXNzXT1cImV4cFwiPlxuICogICAgIDxsaT48L2xpPlxuICogICA8L3RlbXBsYXRlPlxuICogICA8bGk+PC9saT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBOb3RlIGFsc28gdGhhdCBhbHRob3VnaCB0aGUgYDxsaT48L2xpPmAgdGVtcGxhdGUgc3RpbGwgZXhpc3RzIGluc2lkZSB0aGUgYDx0ZW1wbGF0ZT48L3RlbXBsYXRlPmAsXG4gKiB0aGUgaW5zdGFudGlhdGVkXG4gKiB2aWV3IG9jY3VycyBvbiB0aGUgc2Vjb25kIGA8bGk+PC9saT5gIHdoaWNoIGlzIGEgc2libGluZyB0byB0aGUgYDx0ZW1wbGF0ZT5gIGVsZW1lbnQuXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlTWV0YWRhdGEgZXh0ZW5kcyBJbmplY3RhYmxlTWV0YWRhdGEge1xuICAvKipcbiAgICogVGhlIENTUyBzZWxlY3RvciB0aGF0IHRyaWdnZXJzIHRoZSBpbnN0YW50aWF0aW9uIG9mIGEgZGlyZWN0aXZlLlxuICAgKlxuICAgKiBBbmd1bGFyIG9ubHkgYWxsb3dzIGRpcmVjdGl2ZXMgdG8gdHJpZ2dlciBvbiBDU1Mgc2VsZWN0b3JzIHRoYXQgZG8gbm90IGNyb3NzIGVsZW1lbnRcbiAgICogYm91bmRhcmllcy5cbiAgICpcbiAgICogYHNlbGVjdG9yYCBtYXkgYmUgZGVjbGFyZWQgYXMgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAqXG4gICAqIC0gYGVsZW1lbnQtbmFtZWA6IHNlbGVjdCBieSBlbGVtZW50IG5hbWUuXG4gICAqIC0gYC5jbGFzc2A6IHNlbGVjdCBieSBjbGFzcyBuYW1lLlxuICAgKiAtIGBbYXR0cmlidXRlXWA6IHNlbGVjdCBieSBhdHRyaWJ1dGUgbmFtZS5cbiAgICogLSBgW2F0dHJpYnV0ZT12YWx1ZV1gOiBzZWxlY3QgYnkgYXR0cmlidXRlIG5hbWUgYW5kIHZhbHVlLlxuICAgKiAtIGA6bm90KHN1Yl9zZWxlY3RvcilgOiBzZWxlY3Qgb25seSBpZiB0aGUgZWxlbWVudCBkb2VzIG5vdCBtYXRjaCB0aGUgYHN1Yl9zZWxlY3RvcmAuXG4gICAqIC0gYHNlbGVjdG9yMSwgc2VsZWN0b3IyYDogc2VsZWN0IGlmIGVpdGhlciBgc2VsZWN0b3IxYCBvciBgc2VsZWN0b3IyYCBtYXRjaGVzLlxuICAgKlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBTdXBwb3NlIHdlIGhhdmUgYSBkaXJlY3RpdmUgd2l0aCBhbiBgaW5wdXRbdHlwZT10ZXh0XWAgc2VsZWN0b3IuXG4gICAqXG4gICAqIEFuZCB0aGUgZm9sbG93aW5nIEhUTUw6XG4gICAqXG4gICAqIGBgYGh0bWxcbiAgICogPGZvcm0+XG4gICAqICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCI+XG4gICAqICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiPlxuICAgKiA8Zm9ybT5cbiAgICogYGBgXG4gICAqXG4gICAqIFRoZSBkaXJlY3RpdmUgd291bGQgb25seSBiZSBpbnN0YW50aWF0ZWQgb24gdGhlIGA8aW5wdXQgdHlwZT1cInRleHRcIj5gIGVsZW1lbnQuXG4gICAqXG4gICAqL1xuICBzZWxlY3Rvcjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBFbnVtZXJhdGVzIHRoZSBzZXQgb2YgZGF0YS1ib3VuZCBpbnB1dCBwcm9wZXJ0aWVzIGZvciBhIGRpcmVjdGl2ZVxuICAgKlxuICAgKiBBbmd1bGFyIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyBpbnB1dCBwcm9wZXJ0aWVzIGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgKlxuICAgKiBUaGUgYGlucHV0c2AgcHJvcGVydHkgZGVmaW5lcyBhIHNldCBvZiBgZGlyZWN0aXZlUHJvcGVydHlgIHRvIGBiaW5kaW5nUHJvcGVydHlgXG4gICAqIGNvbmZpZ3VyYXRpb246XG4gICAqXG4gICAqIC0gYGRpcmVjdGl2ZVByb3BlcnR5YCBzcGVjaWZpZXMgdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aGVyZSB0aGUgdmFsdWUgaXMgd3JpdHRlbi5cbiAgICogLSBgYmluZGluZ1Byb3BlcnR5YCBzcGVjaWZpZXMgdGhlIERPTSBwcm9wZXJ0eSB3aGVyZSB0aGUgdmFsdWUgaXMgcmVhZCBmcm9tLlxuICAgKlxuICAgKiBXaGVuIGBiaW5kaW5nUHJvcGVydHlgIGlzIG5vdCBwcm92aWRlZCwgaXQgaXMgYXNzdW1lZCB0byBiZSBlcXVhbCB0byBgZGlyZWN0aXZlUHJvcGVydHlgLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvaXZoZlhZP3A9cHJldmlldykpXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgY29tcG9uZW50IHdpdGggdHdvIGRhdGEtYm91bmQgcHJvcGVydGllcy5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBAQ29tcG9uZW50KHtcbiAgICogICBzZWxlY3RvcjogJ2JhbmstYWNjb3VudCcsXG4gICAqICAgaW5wdXRzOiBbJ2JhbmtOYW1lJywgJ2lkOiBhY2NvdW50LWlkJ10sXG4gICAqICAgdGVtcGxhdGU6IGBcbiAgICogICAgIEJhbmsgTmFtZToge3tiYW5rTmFtZX19XG4gICAqICAgICBBY2NvdW50IElkOiB7e2lkfX1cbiAgICogICBgXG4gICAqIH0pXG4gICAqIGNsYXNzIEJhbmtBY2NvdW50IHtcbiAgICogICBiYW5rTmFtZTogc3RyaW5nO1xuICAgKiAgIGlkOiBzdHJpbmc7XG4gICAqXG4gICAqICAgLy8gdGhpcyBwcm9wZXJ0eSBpcyBub3QgYm91bmQsIGFuZCB3b24ndCBiZSBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQgYnkgQW5ndWxhclxuICAgKiAgIG5vcm1hbGl6ZWRCYW5rTmFtZTogc3RyaW5nO1xuICAgKiB9XG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAgICogICB0ZW1wbGF0ZTogYFxuICAgKiAgICAgPGJhbmstYWNjb3VudCBiYW5rLW5hbWU9XCJSQkNcIiBhY2NvdW50LWlkPVwiNDc0N1wiPjwvYmFuay1hY2NvdW50PlxuICAgKiAgIGAsXG4gICAqICAgZGlyZWN0aXZlczogW0JhbmtBY2NvdW50XVxuICAgKiB9KVxuICAgKiBjbGFzcyBBcHAge31cbiAgICpcbiAgICogYm9vdHN0cmFwKEFwcCk7XG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgZ2V0IGlucHV0cygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9wcm9wZXJ0aWVzKSAmJiB0aGlzLl9wcm9wZXJ0aWVzLmxlbmd0aCA+IDAgPyB0aGlzLl9wcm9wZXJ0aWVzIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0cztcbiAgfVxuICBnZXQgcHJvcGVydGllcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLmlucHV0czsgfVxuICBwcml2YXRlIF9pbnB1dHM6IHN0cmluZ1tdO1xuICBwcml2YXRlIF9wcm9wZXJ0aWVzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRW51bWVyYXRlcyB0aGUgc2V0IG9mIGV2ZW50LWJvdW5kIG91dHB1dCBwcm9wZXJ0aWVzLlxuICAgKlxuICAgKiBXaGVuIGFuIG91dHB1dCBwcm9wZXJ0eSBlbWl0cyBhbiBldmVudCwgYW4gZXZlbnQgaGFuZGxlciBhdHRhY2hlZCB0byB0aGF0IGV2ZW50XG4gICAqIHRoZSB0ZW1wbGF0ZSBpcyBpbnZva2VkLlxuICAgKlxuICAgKiBUaGUgYG91dHB1dHNgIHByb3BlcnR5IGRlZmluZXMgYSBzZXQgb2YgYGRpcmVjdGl2ZVByb3BlcnR5YCB0byBgYmluZGluZ1Byb3BlcnR5YFxuICAgKiBjb25maWd1cmF0aW9uOlxuICAgKlxuICAgKiAtIGBkaXJlY3RpdmVQcm9wZXJ0eWAgc3BlY2lmaWVzIHRoZSBjb21wb25lbnQgcHJvcGVydHkgdGhhdCBlbWl0cyBldmVudHMuXG4gICAqIC0gYGJpbmRpbmdQcm9wZXJ0eWAgc3BlY2lmaWVzIHRoZSBET00gcHJvcGVydHkgdGhlIGV2ZW50IGhhbmRsZXIgaXMgYXR0YWNoZWQgdG8uXG4gICAqXG4gICAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9kNUNOcTc/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ2ludGVydmFsLWRpcicsXG4gICAqICAgb3V0cHV0czogWydldmVyeVNlY29uZCcsICdmaXZlNVNlY3M6IGV2ZXJ5Rml2ZVNlY29uZHMnXVxuICAgKiB9KVxuICAgKiBjbGFzcyBJbnRlcnZhbERpciB7XG4gICAqICAgZXZlcnlTZWNvbmQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAqICAgZml2ZTVTZWNzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgKlxuICAgKiAgIGNvbnN0cnVjdG9yKCkge1xuICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5ldmVyeVNlY29uZC5lbWl0KFwiZXZlbnRcIiksIDEwMDApO1xuICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gdGhpcy5maXZlNVNlY3MuZW1pdChcImV2ZW50XCIpLCA1MDAwKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICAgKiAgIHRlbXBsYXRlOiBgXG4gICAqICAgICA8aW50ZXJ2YWwtZGlyIChldmVyeS1zZWNvbmQpPVwiZXZlcnlTZWNvbmQoKVwiIChldmVyeS1maXZlLXNlY29uZHMpPVwiZXZlcnlGaXZlU2Vjb25kcygpXCI+XG4gICAqICAgICA8L2ludGVydmFsLWRpcj5cbiAgICogICBgLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtJbnRlcnZhbERpcl1cbiAgICogfSlcbiAgICogY2xhc3MgQXBwIHtcbiAgICogICBldmVyeVNlY29uZCgpIHsgY29uc29sZS5sb2coJ3NlY29uZCcpOyB9XG4gICAqICAgZXZlcnlGaXZlU2Vjb25kcygpIHsgY29uc29sZS5sb2coJ2ZpdmUgc2Vjb25kcycpOyB9XG4gICAqIH1cbiAgICogYm9vdHN0cmFwKEFwcCk7XG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgZ2V0IG91dHB1dHMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBpc1ByZXNlbnQodGhpcy5fZXZlbnRzKSAmJiB0aGlzLl9ldmVudHMubGVuZ3RoID4gMCA/IHRoaXMuX2V2ZW50cyA6IHRoaXMuX291dHB1dHM7XG4gIH1cbiAgZ2V0IGV2ZW50cygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLm91dHB1dHM7IH1cbiAgcHJpdmF0ZSBfb3V0cHV0czogc3RyaW5nW107XG4gIHByaXZhdGUgX2V2ZW50czogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZnkgdGhlIGV2ZW50cywgYWN0aW9ucywgcHJvcGVydGllcyBhbmQgYXR0cmlidXRlcyByZWxhdGVkIHRvIHRoZSBob3N0IGVsZW1lbnQuXG4gICAqXG4gICAqICMjIEhvc3QgTGlzdGVuZXJzXG4gICAqXG4gICAqIFNwZWNpZmllcyB3aGljaCBET00gZXZlbnRzIGEgZGlyZWN0aXZlIGxpc3RlbnMgdG8gdmlhIGEgc2V0IG9mIGAoZXZlbnQpYCB0byBgbWV0aG9kYFxuICAgKiBrZXktdmFsdWUgcGFpcnM6XG4gICAqXG4gICAqIC0gYGV2ZW50YDogdGhlIERPTSBldmVudCB0aGF0IHRoZSBkaXJlY3RpdmUgbGlzdGVucyB0by5cbiAgICogLSBgc3RhdGVtZW50YDogdGhlIHN0YXRlbWVudCB0byBleGVjdXRlIHdoZW4gdGhlIGV2ZW50IG9jY3Vycy5cbiAgICogSWYgdGhlIGV2YWx1YXRpb24gb2YgdGhlIHN0YXRlbWVudCByZXR1cm5zIGBmYWxzZWAsIHRoZW4gYHByZXZlbnREZWZhdWx0YGlzIGFwcGxpZWQgb24gdGhlIERPTVxuICAgKiBldmVudC5cbiAgICpcbiAgICogVG8gbGlzdGVuIHRvIGdsb2JhbCBldmVudHMsIGEgdGFyZ2V0IG11c3QgYmUgYWRkZWQgdG8gdGhlIGV2ZW50IG5hbWUuXG4gICAqIFRoZSB0YXJnZXQgY2FuIGJlIGB3aW5kb3dgLCBgZG9jdW1lbnRgIG9yIGBib2R5YC5cbiAgICpcbiAgICogV2hlbiB3cml0aW5nIGEgZGlyZWN0aXZlIGV2ZW50IGJpbmRpbmcsIHlvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgJGV2ZW50IGxvY2FsIHZhcmlhYmxlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvRGxBNUtVP3A9cHJldmlldykpXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWNsYXJlcyBhIGRpcmVjdGl2ZSB0aGF0IGF0dGFjaGVzIGEgY2xpY2sgbGlzdGVuZXIgdG8gdGhlIGJ1dHRvbiBhbmRcbiAgICogY291bnRzIGNsaWNrcy5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ2J1dHRvbltjb3VudGluZ10nLFxuICAgKiAgIGhvc3Q6IHtcbiAgICogICAgICcoY2xpY2spJzogJ29uQ2xpY2soJGV2ZW50LnRhcmdldCknXG4gICAqICAgfVxuICAgKiB9KVxuICAgKiBjbGFzcyBDb3VudENsaWNrcyB7XG4gICAqICAgbnVtYmVyT2ZDbGlja3MgPSAwO1xuICAgKlxuICAgKiAgIG9uQ2xpY2soYnRuKSB7XG4gICAqICAgICBjb25zb2xlLmxvZyhcImJ1dHRvblwiLCBidG4sIFwibnVtYmVyIG9mIGNsaWNrczpcIiwgdGhpcy5udW1iZXJPZkNsaWNrcysrKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICAgKiAgIHRlbXBsYXRlOiBgPGJ1dHRvbiBjb3VudGluZz5JbmNyZW1lbnQ8L2J1dHRvbj5gLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtDb3VudENsaWNrc11cbiAgICogfSlcbiAgICogY2xhc3MgQXBwIHt9XG4gICAqXG4gICAqIGJvb3RzdHJhcChBcHApO1xuICAgKiBgYGBcbiAgICpcbiAgICogIyMgSG9zdCBQcm9wZXJ0eSBCaW5kaW5nc1xuICAgKlxuICAgKiBTcGVjaWZpZXMgd2hpY2ggRE9NIHByb3BlcnRpZXMgYSBkaXJlY3RpdmUgdXBkYXRlcy5cbiAgICpcbiAgICogQW5ndWxhciBhdXRvbWF0aWNhbGx5IGNoZWNrcyBob3N0IHByb3BlcnR5IGJpbmRpbmdzIGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uLlxuICAgKiBJZiBhIGJpbmRpbmcgY2hhbmdlcywgaXQgd2lsbCB1cGRhdGUgdGhlIGhvc3QgZWxlbWVudCBvZiB0aGUgZGlyZWN0aXZlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvZ05nMEVEP3A9cHJldmlldykpXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGEgZGlyZWN0aXZlIHRoYXQgc2V0cyB0aGUgYHZhbGlkYCBhbmQgYGludmFsaWRgIGNsYXNzZXNcbiAgICogb24gdGhlIERPTSBlbGVtZW50IHRoYXQgaGFzIG5nTW9kZWwgZGlyZWN0aXZlIG9uIGl0LlxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBEaXJlY3RpdmUoe1xuICAgKiAgIHNlbGVjdG9yOiAnW25nTW9kZWxdJyxcbiAgICogICBob3N0OiB7XG4gICAqICAgICAnW2NsYXNzLnZhbGlkXSc6ICd2YWxpZCcsXG4gICAqICAgICAnW2NsYXNzLmludmFsaWRdJzogJ2ludmFsaWQnXG4gICAqICAgfVxuICAgKiB9KVxuICAgKiBjbGFzcyBOZ01vZGVsU3RhdHVzIHtcbiAgICogICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udHJvbDpOZ01vZGVsKSB7fVxuICAgKiAgIGdldCB2YWxpZCB7IHJldHVybiB0aGlzLmNvbnRyb2wudmFsaWQ7IH1cbiAgICogICBnZXQgaW52YWxpZCB7IHJldHVybiB0aGlzLmNvbnRyb2wuaW52YWxpZDsgfVxuICAgKiB9XG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAgICogICB0ZW1wbGF0ZTogYDxpbnB1dCBbKG5nTW9kZWwpXT1cInByb3BcIj5gLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVMsIE5nTW9kZWxTdGF0dXNdXG4gICAqIH0pXG4gICAqIGNsYXNzIEFwcCB7XG4gICAqICAgcHJvcDtcbiAgICogfVxuICAgKlxuICAgKiBib290c3RyYXAoQXBwKTtcbiAgICogYGBgXG4gICAqXG4gICAqICMjIEF0dHJpYnV0ZXNcbiAgICpcbiAgICogU3BlY2lmaWVzIHN0YXRpYyBhdHRyaWJ1dGVzIHRoYXQgc2hvdWxkIGJlIHByb3BhZ2F0ZWQgdG8gYSBob3N0IGVsZW1lbnQuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIEluIHRoaXMgZXhhbXBsZSB1c2luZyBgbXktYnV0dG9uYCBkaXJlY3RpdmUgKGV4LjogYDxkaXYgbXktYnV0dG9uPjwvZGl2PmApIG9uIGEgaG9zdCBlbGVtZW50XG4gICAqIChoZXJlOiBgPGRpdj5gICkgd2lsbCBlbnN1cmUgdGhhdCB0aGlzIGVsZW1lbnQgd2lsbCBnZXQgdGhlIFwiYnV0dG9uXCIgcm9sZS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ1tteS1idXR0b25dJyxcbiAgICogICBob3N0OiB7XG4gICAqICAgICAncm9sZSc6ICdidXR0b24nXG4gICAqICAgfVxuICAgKiB9KVxuICAgKiBjbGFzcyBNeUJ1dHRvbiB7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBob3N0OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuICAvKipcbiAgICogRGVmaW5lcyB0aGUgc2V0IG9mIGluamVjdGFibGUgb2JqZWN0cyB0aGF0IGFyZSB2aXNpYmxlIHRvIGEgRGlyZWN0aXZlIGFuZCBpdHMgbGlnaHQgRE9NXG4gICAqIGNoaWxkcmVuLlxuICAgKlxuICAgKiAjIyBTaW1wbGUgRXhhbXBsZVxuICAgKlxuICAgKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBjbGFzcyB0aGF0IGNhbiBiZSBpbmplY3RlZDpcbiAgICpcbiAgICogYGBgXG4gICAqIGNsYXNzIEdyZWV0ZXIge1xuICAgKiAgICBncmVldChuYW1lOnN0cmluZykge1xuICAgKiAgICAgIHJldHVybiAnSGVsbG8gJyArIG5hbWUgKyAnISc7XG4gICAqICAgIH1cbiAgICogfVxuICAgKlxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ2dyZWV0JyxcbiAgICogICBiaW5kaW5nczogW1xuICAgKiAgICAgR3JlZXRlclxuICAgKiAgIF1cbiAgICogfSlcbiAgICogY2xhc3MgSGVsbG9Xb3JsZCB7XG4gICAqICAgZ3JlZXRlcjpHcmVldGVyO1xuICAgKlxuICAgKiAgIGNvbnN0cnVjdG9yKGdyZWV0ZXI6R3JlZXRlcikge1xuICAgKiAgICAgdGhpcy5ncmVldGVyID0gZ3JlZXRlcjtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBnZXQgcHJvdmlkZXJzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuX2JpbmRpbmdzKSAmJiB0aGlzLl9iaW5kaW5ncy5sZW5ndGggPiAwID8gdGhpcy5fYmluZGluZ3MgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcm92aWRlcnM7XG4gIH1cbiAgLyoqIEBkZXByZWNhdGVkICovXG4gIGdldCBiaW5kaW5ncygpOiBhbnlbXSB7IHJldHVybiB0aGlzLnByb3ZpZGVyczsgfVxuICBwcml2YXRlIF9wcm92aWRlcnM6IGFueVtdO1xuICBwcml2YXRlIF9iaW5kaW5nczogYW55W107XG5cbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIG5hbWUgdGhhdCBjYW4gYmUgdXNlZCBpbiB0aGUgdGVtcGxhdGUgdG8gYXNzaWduIHRoaXMgZGlyZWN0aXZlIHRvIGEgdmFyaWFibGUuXG4gICAqXG4gICAqICMjIFNpbXBsZSBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ2NoaWxkLWRpcicsXG4gICAqICAgZXhwb3J0QXM6ICdjaGlsZCdcbiAgICogfSlcbiAgICogY2xhc3MgQ2hpbGREaXIge1xuICAgKiB9XG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnbWFpbicsXG4gICAqICAgdGVtcGxhdGU6IGA8Y2hpbGQtZGlyICNjPVwiY2hpbGRcIj48L2NoaWxkLWRpcj5gLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtDaGlsZERpcl1cbiAgICogfSlcbiAgICogY2xhc3MgTWFpbkNvbXBvbmVudCB7XG4gICAqIH1cbiAgICpcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRBczogc3RyaW5nO1xuXG4gIC8vIFRPRE86IGFkZCBhbiBleGFtcGxlIGFmdGVyIENvbnRlbnRDaGlsZHJlbiBhbmQgVmlld0NoaWxkcmVuIGFyZSBpbiBtYXN0ZXJcbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIHF1ZXJpZXMgdGhhdCB3aWxsIGJlIGluamVjdGVkIGludG8gdGhlIGRpcmVjdGl2ZS5cbiAgICpcbiAgICogQ29udGVudCBxdWVyaWVzIGFyZSBzZXQgYmVmb3JlIHRoZSBgbmdBZnRlckNvbnRlbnRJbml0YCBjYWxsYmFjayBpcyBjYWxsZWQuXG4gICAqIFZpZXcgcXVlcmllcyBhcmUgc2V0IGJlZm9yZSB0aGUgYG5nQWZ0ZXJWaWV3SW5pdGAgY2FsbGJhY2sgaXMgY2FsbGVkLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdzb21lRGlyJyxcbiAgICogICBxdWVyaWVzOiB7XG4gICAqICAgICBjb250ZW50Q2hpbGRyZW46IG5ldyBDb250ZW50Q2hpbGRyZW4oQ2hpbGREaXJlY3RpdmUpLFxuICAgKiAgICAgdmlld0NoaWxkcmVuOiBuZXcgVmlld0NoaWxkcmVuKENoaWxkRGlyZWN0aXZlKVxuICAgKiAgIH0sXG4gICAqICAgdGVtcGxhdGU6ICc8Y2hpbGQtZGlyZWN0aXZlPjwvY2hpbGQtZGlyZWN0aXZlPicsXG4gICAqICAgZGlyZWN0aXZlczogW0NoaWxkRGlyZWN0aXZlXVxuICAgKiB9KVxuICAgKiBjbGFzcyBTb21lRGlyIHtcbiAgICogICBjb250ZW50Q2hpbGRyZW46IFF1ZXJ5TGlzdDxDaGlsZERpcmVjdGl2ZT4sXG4gICAqICAgdmlld0NoaWxkcmVuOiBRdWVyeUxpc3Q8Q2hpbGREaXJlY3RpdmU+XG4gICAqXG4gICAqICAgbmdBZnRlckNvbnRlbnRJbml0KCkge1xuICAgKiAgICAgLy8gY29udGVudENoaWxkcmVuIGlzIHNldFxuICAgKiAgIH1cbiAgICpcbiAgICogICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAqICAgICAvLyB2aWV3Q2hpbGRyZW4gaXMgc2V0XG4gICAqICAgfVxuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcXVlcmllczoge1trZXk6IHN0cmluZ106IGFueX07XG5cbiAgY29uc3RydWN0b3Ioe3NlbGVjdG9yLCBpbnB1dHMsIG91dHB1dHMsIHByb3BlcnRpZXMsIGV2ZW50cywgaG9zdCwgYmluZGluZ3MsIHByb3ZpZGVycywgZXhwb3J0QXMsXG4gICAgICAgICAgICAgICBxdWVyaWVzfToge1xuICAgIHNlbGVjdG9yPzogc3RyaW5nLFxuICAgIGlucHV0cz86IHN0cmluZ1tdLFxuICAgIG91dHB1dHM/OiBzdHJpbmdbXSxcbiAgICBwcm9wZXJ0aWVzPzogc3RyaW5nW10sXG4gICAgZXZlbnRzPzogc3RyaW5nW10sXG4gICAgaG9zdD86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIHByb3ZpZGVycz86IGFueVtdLFxuICAgIC8qKiBAZGVwcmVjYXRlZCAqLyBiaW5kaW5ncz86IGFueVtdLFxuICAgIGV4cG9ydEFzPzogc3RyaW5nLFxuICAgIHF1ZXJpZXM/OiB7W2tleTogc3RyaW5nXTogYW55fVxuICB9ID0ge30pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjtcbiAgICB0aGlzLl9pbnB1dHMgPSBpbnB1dHM7XG4gICAgdGhpcy5fcHJvcGVydGllcyA9IHByb3BlcnRpZXM7XG4gICAgdGhpcy5fb3V0cHV0cyA9IG91dHB1dHM7XG4gICAgdGhpcy5fZXZlbnRzID0gZXZlbnRzO1xuICAgIHRoaXMuaG9zdCA9IGhvc3Q7XG4gICAgdGhpcy5leHBvcnRBcyA9IGV4cG9ydEFzO1xuICAgIHRoaXMucXVlcmllcyA9IHF1ZXJpZXM7XG4gICAgdGhpcy5fcHJvdmlkZXJzID0gcHJvdmlkZXJzO1xuICAgIHRoaXMuX2JpbmRpbmdzID0gYmluZGluZ3M7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNsYXJlIHJldXNhYmxlIFVJIGJ1aWxkaW5nIGJsb2NrcyBmb3IgYW4gYXBwbGljYXRpb24uXG4gKlxuICogRWFjaCBBbmd1bGFyIGNvbXBvbmVudCByZXF1aXJlcyBhIHNpbmdsZSBgQENvbXBvbmVudGAgYW5ub3RhdGlvbi4gVGhlXG4gKiBgQENvbXBvbmVudGBcbiAqIGFubm90YXRpb24gc3BlY2lmaWVzIHdoZW4gYSBjb21wb25lbnQgaXMgaW5zdGFudGlhdGVkLCBhbmQgd2hpY2ggcHJvcGVydGllcyBhbmQgaG9zdExpc3RlbmVycyBpdFxuICogYmluZHMgdG8uXG4gKlxuICogV2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQsIEFuZ3VsYXJcbiAqIC0gY3JlYXRlcyBhIHNoYWRvdyBET00gZm9yIHRoZSBjb21wb25lbnQuXG4gKiAtIGxvYWRzIHRoZSBzZWxlY3RlZCB0ZW1wbGF0ZSBpbnRvIHRoZSBzaGFkb3cgRE9NLlxuICogLSBjcmVhdGVzIGFsbCB0aGUgaW5qZWN0YWJsZSBvYmplY3RzIGNvbmZpZ3VyZWQgd2l0aCBgcHJvdmlkZXJzYCBhbmQgYHZpZXdQcm92aWRlcnNgLlxuICpcbiAqIEFsbCB0ZW1wbGF0ZSBleHByZXNzaW9ucyBhbmQgc3RhdGVtZW50cyBhcmUgdGhlbiBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgY29tcG9uZW50IGluc3RhbmNlLlxuICpcbiAqIEZvciBkZXRhaWxzIG9uIHRoZSBgQFZpZXdgIGFubm90YXRpb24sIHNlZSB7QGxpbmsgVmlld01ldGFkYXRhfS5cbiAqXG4gKiAjIyBMaWZlY3ljbGUgaG9va3NcbiAqXG4gKiBXaGVuIHRoZSBjb21wb25lbnQgY2xhc3MgaW1wbGVtZW50cyBzb21lIHtAbGluayBhbmd1bGFyMi9saWZlY3ljbGVfaG9va3N9IHRoZSBjYWxsYmFja3MgYXJlXG4gKiBjYWxsZWQgYnkgdGhlIGNoYW5nZSBkZXRlY3Rpb24gYXQgZGVmaW5lZCBwb2ludHMgaW4gdGltZSBkdXJpbmcgdGhlIGxpZmUgb2YgdGhlIGNvbXBvbmVudC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3RzL21ldGFkYXRhL21ldGFkYXRhLnRzIHJlZ2lvbj0nY29tcG9uZW50J31cbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBDb21wb25lbnRNZXRhZGF0YSBleHRlbmRzIERpcmVjdGl2ZU1ldGFkYXRhIHtcbiAgLyoqXG4gICAqIERlZmluZXMgdGhlIHVzZWQgY2hhbmdlIGRldGVjdGlvbiBzdHJhdGVneS5cbiAgICpcbiAgICogV2hlbiBhIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQsIEFuZ3VsYXIgY3JlYXRlcyBhIGNoYW5nZSBkZXRlY3Rvciwgd2hpY2ggaXMgcmVzcG9uc2libGUgZm9yXG4gICAqIHByb3BhZ2F0aW5nIHRoZSBjb21wb25lbnQncyBiaW5kaW5ncy5cbiAgICpcbiAgICogVGhlIGBjaGFuZ2VEZXRlY3Rpb25gIHByb3BlcnR5IGRlZmluZXMsIHdoZXRoZXIgdGhlIGNoYW5nZSBkZXRlY3Rpb24gd2lsbCBiZSBjaGVja2VkIGV2ZXJ5IHRpbWVcbiAgICogb3Igb25seSB3aGVuIHRoZSBjb21wb25lbnQgdGVsbHMgaXQgdG8gZG8gc28uXG4gICAqL1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5O1xuXG4gIC8qKlxuICAgKiBEZWZpbmVzIHRoZSBzZXQgb2YgaW5qZWN0YWJsZSBvYmplY3RzIHRoYXQgYXJlIHZpc2libGUgdG8gaXRzIHZpZXcgRE9NIGNoaWxkcmVuLlxuICAgKlxuICAgKiAjIyBTaW1wbGUgRXhhbXBsZVxuICAgKlxuICAgKiBIZXJlIGlzIGFuIGV4YW1wbGUgb2YgYSBjbGFzcyB0aGF0IGNhbiBiZSBpbmplY3RlZDpcbiAgICpcbiAgICogYGBgXG4gICAqIGNsYXNzIEdyZWV0ZXIge1xuICAgKiAgICBncmVldChuYW1lOnN0cmluZykge1xuICAgKiAgICAgIHJldHVybiAnSGVsbG8gJyArIG5hbWUgKyAnISc7XG4gICAqICAgIH1cbiAgICogfVxuICAgKlxuICAgKiBARGlyZWN0aXZlKHtcbiAgICogICBzZWxlY3RvcjogJ25lZWRzLWdyZWV0ZXInXG4gICAqIH0pXG4gICAqIGNsYXNzIE5lZWRzR3JlZXRlciB7XG4gICAqICAgZ3JlZXRlcjpHcmVldGVyO1xuICAgKlxuICAgKiAgIGNvbnN0cnVjdG9yKGdyZWV0ZXI6R3JlZXRlcikge1xuICAgKiAgICAgdGhpcy5ncmVldGVyID0gZ3JlZXRlcjtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdncmVldCcsXG4gICAqICAgdmlld1Byb3ZpZGVyczogW1xuICAgKiAgICAgR3JlZXRlclxuICAgKiAgIF0sXG4gICAqICAgdGVtcGxhdGU6IGA8bmVlZHMtZ3JlZXRlcj48L25lZWRzLWdyZWV0ZXI+YCxcbiAgICogICBkaXJlY3RpdmVzOiBbTmVlZHNHcmVldGVyXVxuICAgKiB9KVxuICAgKiBjbGFzcyBIZWxsb1dvcmxkIHtcbiAgICogfVxuICAgKlxuICAgKiBgYGBcbiAgICovXG4gIGdldCB2aWV3UHJvdmlkZXJzKCk6IGFueVtdIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuX3ZpZXdCaW5kaW5ncykgJiYgdGhpcy5fdmlld0JpbmRpbmdzLmxlbmd0aCA+IDAgPyB0aGlzLl92aWV3QmluZGluZ3MgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdQcm92aWRlcnM7XG4gIH1cbiAgZ2V0IHZpZXdCaW5kaW5ncygpOiBhbnlbXSB7IHJldHVybiB0aGlzLnZpZXdQcm92aWRlcnM7IH1cbiAgcHJpdmF0ZSBfdmlld1Byb3ZpZGVyczogYW55W107XG4gIHByaXZhdGUgX3ZpZXdCaW5kaW5nczogYW55W107XG5cbiAgLyoqXG4gICAqIFRoZSBtb2R1bGUgaWQgb2YgdGhlIG1vZHVsZSB0aGF0IGNvbnRhaW5zIHRoZSBjb21wb25lbnQuXG4gICAqIE5lZWRlZCB0byBiZSBhYmxlIHRvIHJlc29sdmUgcmVsYXRpdmUgdXJscyBmb3IgdGVtcGxhdGVzIGFuZCBzdHlsZXMuXG4gICAqIEluIERhcnQsIHRoaXMgY2FuIGJlIGRldGVybWluZWQgYXV0b21hdGljYWxseSBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBzZXQuXG4gICAqIEluIENvbW1vbkpTLCB0aGlzIGNhbiBhbHdheXMgYmUgc2V0IHRvIGBtb2R1bGUuaWRgLlxuICAgKlxuICAgKiAjIyBTaW1wbGUgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogQERpcmVjdGl2ZSh7XG4gICAqICAgc2VsZWN0b3I6ICdzb21lRGlyJyxcbiAgICogICBtb2R1bGVJZDogbW9kdWxlLmlkXG4gICAqIH0pXG4gICAqIGNsYXNzIFNvbWVEaXIge1xuICAgKiB9XG4gICAqXG4gICAqIGBgYFxuICAgKi9cbiAgbW9kdWxlSWQ6IHN0cmluZztcblxuICB0ZW1wbGF0ZVVybDogc3RyaW5nO1xuXG4gIHRlbXBsYXRlOiBzdHJpbmc7XG5cbiAgc3R5bGVVcmxzOiBzdHJpbmdbXTtcblxuICBzdHlsZXM6IHN0cmluZ1tdO1xuXG4gIGRpcmVjdGl2ZXM6IEFycmF5PFR5cGUgfCBhbnlbXT47XG5cbiAgcGlwZXM6IEFycmF5PFR5cGUgfCBhbnlbXT47XG5cbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb247XG5cbiAgY29uc3RydWN0b3Ioe3NlbGVjdG9yLCBpbnB1dHMsIG91dHB1dHMsIHByb3BlcnRpZXMsIGV2ZW50cywgaG9zdCwgZXhwb3J0QXMsIG1vZHVsZUlkLCBiaW5kaW5ncyxcbiAgICAgICAgICAgICAgIHByb3ZpZGVycywgdmlld0JpbmRpbmdzLCB2aWV3UHJvdmlkZXJzLFxuICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uID0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCwgcXVlcmllcywgdGVtcGxhdGVVcmwsIHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgc3R5bGVVcmxzLCBzdHlsZXMsIGRpcmVjdGl2ZXMsIHBpcGVzLCBlbmNhcHN1bGF0aW9ufToge1xuICAgIHNlbGVjdG9yPzogc3RyaW5nLFxuICAgIGlucHV0cz86IHN0cmluZ1tdLFxuICAgIG91dHB1dHM/OiBzdHJpbmdbXSxcbiAgICBwcm9wZXJ0aWVzPzogc3RyaW5nW10sXG4gICAgZXZlbnRzPzogc3RyaW5nW10sXG4gICAgaG9zdD86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIC8qKiBAZGVwcmVjYXRlZCAqLyBiaW5kaW5ncz86IGFueVtdLFxuICAgIHByb3ZpZGVycz86IGFueVtdLFxuICAgIGV4cG9ydEFzPzogc3RyaW5nLFxuICAgIG1vZHVsZUlkPzogc3RyaW5nLFxuICAgIC8qKiBAZGVwcmVjYXRlZCAqLyB2aWV3QmluZGluZ3M/OiBhbnlbXSxcbiAgICB2aWV3UHJvdmlkZXJzPzogYW55W10sXG4gICAgcXVlcmllcz86IHtba2V5OiBzdHJpbmddOiBhbnl9LFxuICAgIGNoYW5nZURldGVjdGlvbj86IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIHRlbXBsYXRlVXJsPzogc3RyaW5nLFxuICAgIHRlbXBsYXRlPzogc3RyaW5nLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIGRpcmVjdGl2ZXM/OiBBcnJheTxUeXBlIHwgYW55W10+LFxuICAgIHBpcGVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBlbmNhcHN1bGF0aW9uPzogVmlld0VuY2Fwc3VsYXRpb25cbiAgfSA9IHt9KSB7XG4gICAgc3VwZXIoe1xuICAgICAgc2VsZWN0b3I6IHNlbGVjdG9yLFxuICAgICAgaW5wdXRzOiBpbnB1dHMsXG4gICAgICBvdXRwdXRzOiBvdXRwdXRzLFxuICAgICAgcHJvcGVydGllczogcHJvcGVydGllcyxcbiAgICAgIGV2ZW50czogZXZlbnRzLFxuICAgICAgaG9zdDogaG9zdCxcbiAgICAgIGV4cG9ydEFzOiBleHBvcnRBcyxcbiAgICAgIGJpbmRpbmdzOiBiaW5kaW5ncyxcbiAgICAgIHByb3ZpZGVyczogcHJvdmlkZXJzLFxuICAgICAgcXVlcmllczogcXVlcmllc1xuICAgIH0pO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rpb24gPSBjaGFuZ2VEZXRlY3Rpb247XG4gICAgdGhpcy5fdmlld1Byb3ZpZGVycyA9IHZpZXdQcm92aWRlcnM7XG4gICAgdGhpcy5fdmlld0JpbmRpbmdzID0gdmlld0JpbmRpbmdzO1xuICAgIHRoaXMudGVtcGxhdGVVcmwgPSB0ZW1wbGF0ZVVybDtcbiAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7XG4gICAgdGhpcy5zdHlsZVVybHMgPSBzdHlsZVVybHM7XG4gICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7XG4gICAgdGhpcy5kaXJlY3RpdmVzID0gZGlyZWN0aXZlcztcbiAgICB0aGlzLnBpcGVzID0gcGlwZXM7XG4gICAgdGhpcy5lbmNhcHN1bGF0aW9uID0gZW5jYXBzdWxhdGlvbjtcbiAgICB0aGlzLm1vZHVsZUlkID0gbW9kdWxlSWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWNsYXJlIHJldXNhYmxlIHBpcGUgZnVuY3Rpb24uXG4gKlxuICogQSBcInB1cmVcIiBwaXBlIGlzIG9ubHkgcmUtZXZhbHVhdGVkIHdoZW4gZWl0aGVyIHRoZSBpbnB1dCBvciBhbnkgb2YgdGhlIGFyZ3VtZW50cyBjaGFuZ2UuXG4gKlxuICogV2hlbiBub3Qgc3BlY2lmaWVkLCBwaXBlcyBkZWZhdWx0IHRvIGJlaW5nIHB1cmUuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS90cy9tZXRhZGF0YS9tZXRhZGF0YS50cyByZWdpb249J3BpcGUnfVxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIFBpcGVNZXRhZGF0YSBleHRlbmRzIEluamVjdGFibGVNZXRhZGF0YSB7XG4gIG5hbWU6IHN0cmluZztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHVyZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcih7bmFtZSwgcHVyZX06IHtuYW1lOiBzdHJpbmcsIHB1cmU/OiBib29sZWFufSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLl9wdXJlID0gcHVyZTtcbiAgfVxuXG4gIGdldCBwdXJlKCk6IGJvb2xlYW4geyByZXR1cm4gaXNQcmVzZW50KHRoaXMuX3B1cmUpID8gdGhpcy5fcHVyZSA6IHRydWU7IH1cbn1cblxuLyoqXG4gKiBEZWNsYXJlcyBhIGRhdGEtYm91bmQgaW5wdXQgcHJvcGVydHkuXG4gKlxuICogQW5ndWxhciBhdXRvbWF0aWNhbGx5IHVwZGF0ZXMgZGF0YS1ib3VuZCBwcm9wZXJ0aWVzIGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uLlxuICpcbiAqIGBJbnB1dE1ldGFkYXRhYCB0YWtlcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgdGhhdCBzcGVjaWZpZXMgdGhlIG5hbWVcbiAqIHVzZWQgd2hlbiBpbnN0YW50aWF0aW5nIGEgY29tcG9uZW50IGluIHRoZSB0ZW1wbGF0ZS4gV2hlbiBub3QgcHJvdmlkZWQsXG4gKiB0aGUgbmFtZSBvZiB0aGUgZGVjb3JhdGVkIHByb3BlcnR5IGlzIHVzZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhIGNvbXBvbmVudCB3aXRoIHR3byBpbnB1dCBwcm9wZXJ0aWVzLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2JhbmstYWNjb3VudCcsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgQmFuayBOYW1lOiB7e2JhbmtOYW1lfX1cbiAqICAgICBBY2NvdW50IElkOiB7e2lkfX1cbiAqICAgYFxuICogfSlcbiAqIGNsYXNzIEJhbmtBY2NvdW50IHtcbiAqICAgQElucHV0KCkgYmFua05hbWU6IHN0cmluZztcbiAqICAgQElucHV0KCdhY2NvdW50LWlkJykgaWQ6IHN0cmluZztcbiAqXG4gKiAgIC8vIHRoaXMgcHJvcGVydHkgaXMgbm90IGJvdW5kLCBhbmQgd29uJ3QgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkIGJ5IEFuZ3VsYXJcbiAqICAgbm9ybWFsaXplZEJhbmtOYW1lOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8YmFuay1hY2NvdW50IGJhbmstbmFtZT1cIlJCQ1wiIGFjY291bnQtaWQ9XCI0NzQ3XCI+PC9iYW5rLWFjY291bnQ+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtCYW5rQWNjb3VudF1cbiAqIH0pXG4gKiBjbGFzcyBBcHAge31cbiAqXG4gKiBib290c3RyYXAoQXBwKTtcbiAqIGBgYFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIElucHV0TWV0YWRhdGEge1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIC8qKlxuICAgICAgICogTmFtZSB1c2VkIHdoZW4gaW5zdGFudGlhdGluZyBhIGNvbXBvbmVudCBpbiB0aGUgdGVtbGF0ZS5cbiAgICAgICAqL1xuICAgICAgcHVibGljIGJpbmRpbmdQcm9wZXJ0eU5hbWU/OiBzdHJpbmcpIHt9XG59XG5cbi8qKlxuICogRGVjbGFyZXMgYW4gZXZlbnQtYm91bmQgb3V0cHV0IHByb3BlcnR5LlxuICpcbiAqIFdoZW4gYW4gb3V0cHV0IHByb3BlcnR5IGVtaXRzIGFuIGV2ZW50LCBhbiBldmVudCBoYW5kbGVyIGF0dGFjaGVkIHRvIHRoYXQgZXZlbnRcbiAqIHRoZSB0ZW1wbGF0ZSBpcyBpbnZva2VkLlxuICpcbiAqIGBPdXRwdXRNZXRhZGF0YWAgdGFrZXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIHRoZSBuYW1lXG4gKiB1c2VkIHdoZW4gaW5zdGFudGlhdGluZyBhIGNvbXBvbmVudCBpbiB0aGUgdGVtcGxhdGUuIFdoZW4gbm90IHByb3ZpZGVkLFxuICogdGhlIG5hbWUgb2YgdGhlIGRlY29yYXRlZCBwcm9wZXJ0eSBpcyB1c2VkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQERpcmVjdGl2ZSh7XG4gKiAgIHNlbGVjdG9yOiAnaW50ZXJ2YWwtZGlyJyxcbiAqIH0pXG4gKiBjbGFzcyBJbnRlcnZhbERpciB7XG4gKiAgIEBPdXRwdXQoKSBldmVyeVNlY29uZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAqICAgQE91dHB1dCgnZXZlcnlGaXZlU2Vjb25kcycpIGZpdmU1U2VjcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIHNldEludGVydmFsKCgpID0+IHRoaXMuZXZlcnlTZWNvbmQuZW1pdChcImV2ZW50XCIpLCAxMDAwKTtcbiAqICAgICBzZXRJbnRlcnZhbCgoKSA9PiB0aGlzLmZpdmU1U2Vjcy5lbWl0KFwiZXZlbnRcIiksIDUwMDApO1xuICogICB9XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8aW50ZXJ2YWwtZGlyIChldmVyeS1zZWNvbmQpPVwiZXZlcnlTZWNvbmQoKVwiIChldmVyeS1maXZlLXNlY29uZHMpPVwiZXZlcnlGaXZlU2Vjb25kcygpXCI+XG4gKiAgICAgPC9pbnRlcnZhbC1kaXI+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtJbnRlcnZhbERpcl1cbiAqIH0pXG4gKiBjbGFzcyBBcHAge1xuICogICBldmVyeVNlY29uZCgpIHsgY29uc29sZS5sb2coJ3NlY29uZCcpOyB9XG4gKiAgIGV2ZXJ5Rml2ZVNlY29uZHMoKSB7IGNvbnNvbGUubG9nKCdmaXZlIHNlY29uZHMnKTsgfVxuICogfVxuICogYm9vdHN0cmFwKEFwcCk7XG4gKiBgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBPdXRwdXRNZXRhZGF0YSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBiaW5kaW5nUHJvcGVydHlOYW1lPzogc3RyaW5nKSB7fVxufVxuXG4vKipcbiAqIERlY2xhcmVzIGEgaG9zdCBwcm9wZXJ0eSBiaW5kaW5nLlxuICpcbiAqIEFuZ3VsYXIgYXV0b21hdGljYWxseSBjaGVja3MgaG9zdCBwcm9wZXJ0eSBiaW5kaW5ncyBkdXJpbmcgY2hhbmdlIGRldGVjdGlvbi5cbiAqIElmIGEgYmluZGluZyBjaGFuZ2VzLCBpdCB3aWxsIHVwZGF0ZSB0aGUgaG9zdCBlbGVtZW50IG9mIHRoZSBkaXJlY3RpdmUuXG4gKlxuICogYEhvc3RCaW5kaW5nTWV0YWRhdGFgIHRha2VzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyB0aGUgcHJvcGVydHlcbiAqIG5hbWUgb2YgdGhlIGhvc3QgZWxlbWVudCB0aGF0IHdpbGwgYmUgdXBkYXRlZC4gV2hlbiBub3QgcHJvdmlkZWQsXG4gKiB0aGUgY2xhc3MgcHJvcGVydHkgbmFtZSBpcyB1c2VkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYSBkaXJlY3RpdmUgdGhhdCBzZXRzIHRoZSBgdmFsaWRgIGFuZCBgaW52YWxpZGAgY2xhc3Nlc1xuICogb24gdGhlIERPTSBlbGVtZW50IHRoYXQgaGFzIG5nTW9kZWwgZGlyZWN0aXZlIG9uIGl0LlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW25nTW9kZWxdJ30pXG4gKiBjbGFzcyBOZ01vZGVsU3RhdHVzIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIGNvbnRyb2w6TmdNb2RlbCkge31cbiAqICAgQEhvc3RCaW5kaW5nKCdbY2xhc3MudmFsaWRdJykgZ2V0IHZhbGlkIHsgcmV0dXJuIHRoaXMuY29udHJvbC52YWxpZDsgfVxuICogICBASG9zdEJpbmRpbmcoJ1tjbGFzcy5pbnZhbGlkXScpIGdldCBpbnZhbGlkIHsgcmV0dXJuIHRoaXMuY29udHJvbC5pbnZhbGlkOyB9XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGA8aW5wdXQgWyhuZ01vZGVsKV09XCJwcm9wXCI+YCxcbiAqICAgZGlyZWN0aXZlczogW0ZPUk1fRElSRUNUSVZFUywgTmdNb2RlbFN0YXR1c11cbiAqIH0pXG4gKiBjbGFzcyBBcHAge1xuICogICBwcm9wO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHApO1xuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgSG9zdEJpbmRpbmdNZXRhZGF0YSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBob3N0UHJvcGVydHlOYW1lPzogc3RyaW5nKSB7fVxufVxuXG4vKipcbiAqIERlY2xhcmVzIGEgaG9zdCBsaXN0ZW5lci5cbiAqXG4gKiBBbmd1bGFyIHdpbGwgaW52b2tlIHRoZSBkZWNvcmF0ZWQgbWV0aG9kIHdoZW4gdGhlIGhvc3QgZWxlbWVudCBlbWl0cyB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICpcbiAqIElmIHRoZSBkZWNvcmF0ZWQgbWV0aG9kIHJldHVybnMgYGZhbHNlYCwgdGhlbiBgcHJldmVudERlZmF1bHRgIGlzIGFwcGxpZWQgb24gdGhlIERPTVxuICogZXZlbnQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVjbGFyZXMgYSBkaXJlY3RpdmUgdGhhdCBhdHRhY2hlcyBhIGNsaWNrIGxpc3RlbmVyIHRvIHRoZSBidXR0b24gYW5kXG4gKiBjb3VudHMgY2xpY2tzLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnYnV0dG9uW2NvdW50aW5nXSd9KVxuICogY2xhc3MgQ291bnRDbGlja3Mge1xuICogICBudW1iZXJPZkNsaWNrcyA9IDA7XG4gKlxuICogICBASG9zdExpc3RlbmVyKCdjbGljaycsIFsnJGV2ZW50LnRhcmdldCddKVxuICogICBvbkNsaWNrKGJ0bikge1xuICogICAgIGNvbnNvbGUubG9nKFwiYnV0dG9uXCIsIGJ0biwgXCJudW1iZXIgb2YgY2xpY2tzOlwiLCB0aGlzLm51bWJlck9mQ2xpY2tzKyspO1xuICogICB9XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGA8YnV0dG9uIGNvdW50aW5nPkluY3JlbWVudDwvYnV0dG9uPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtDb3VudENsaWNrc11cbiAqIH0pXG4gKiBjbGFzcyBBcHAge31cbiAqXG4gKiBib290c3RyYXAoQXBwKTtcbiAqIGBgYFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEhvc3RMaXN0ZW5lck1ldGFkYXRhIHtcbiAgY29uc3RydWN0b3IocHVibGljIGV2ZW50TmFtZTogc3RyaW5nLCBwdWJsaWMgYXJncz86IHN0cmluZ1tdKSB7fVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEvZGlyZWN0aXZlcy50c1xuICoqLyIsIi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBDaGFuZ2UgZGV0ZWN0aW9uIGVuYWJsZXMgZGF0YSBiaW5kaW5nIGluIEFuZ3VsYXIuXG4gKi9cblxuZXhwb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG5cbiAgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFeGNlcHRpb24sXG4gIENoYW5nZURldGVjdGlvbkVycm9yLFxuXG4gIENoYW5nZURldGVjdG9yUmVmLFxuXG4gIFdyYXBwZWRWYWx1ZSxcbiAgU2ltcGxlQ2hhbmdlLFxuICBQaXBlVHJhbnNmb3JtLFxuICBJdGVyYWJsZURpZmZlcnMsXG4gIEl0ZXJhYmxlRGlmZmVyLFxuICBJdGVyYWJsZURpZmZlckZhY3RvcnksXG4gIEtleVZhbHVlRGlmZmVycyxcbiAgS2V5VmFsdWVEaWZmZXIsXG4gIEtleVZhbHVlRGlmZmVyRmFjdG9yeVxufSBmcm9tICcuL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbic7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uLnRzXG4gKiovIiwiaW1wb3J0IHtJdGVyYWJsZURpZmZlcnMsIEl0ZXJhYmxlRGlmZmVyRmFjdG9yeX0gZnJvbSAnLi9kaWZmZXJzL2l0ZXJhYmxlX2RpZmZlcnMnO1xuaW1wb3J0IHtEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5fSBmcm9tICcuL2RpZmZlcnMvZGVmYXVsdF9pdGVyYWJsZV9kaWZmZXInO1xuaW1wb3J0IHtLZXlWYWx1ZURpZmZlcnMsIEtleVZhbHVlRGlmZmVyRmFjdG9yeX0gZnJvbSAnLi9kaWZmZXJzL2tleXZhbHVlX2RpZmZlcnMnO1xuaW1wb3J0IHtEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5fSBmcm9tICcuL2RpZmZlcnMvZGVmYXVsdF9rZXl2YWx1ZV9kaWZmZXInO1xuaW1wb3J0IHtDT05TVCwgQ09OU1RfRVhQUiwgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5leHBvcnQge1xuICBBU1RXaXRoU291cmNlLFxuICBBU1QsXG4gIEFzdFRyYW5zZm9ybWVyLFxuICBQcm9wZXJ0eVJlYWQsXG4gIExpdGVyYWxBcnJheSxcbiAgSW1wbGljaXRSZWNlaXZlclxufSBmcm9tICcuL3BhcnNlci9hc3QnO1xuXG5leHBvcnQge0xleGVyfSBmcm9tICcuL3BhcnNlci9sZXhlcic7XG5leHBvcnQge1BhcnNlcn0gZnJvbSAnLi9wYXJzZXIvcGFyc2VyJztcbmV4cG9ydCB7TG9jYWxzfSBmcm9tICcuL3BhcnNlci9sb2NhbHMnO1xuXG5leHBvcnQge1xuICBEZWh5ZHJhdGVkRXhjZXB0aW9uLFxuICBFeHByZXNzaW9uQ2hhbmdlZEFmdGVySXRIYXNCZWVuQ2hlY2tlZEV4Y2VwdGlvbixcbiAgQ2hhbmdlRGV0ZWN0aW9uRXJyb3Jcbn0gZnJvbSAnLi9leGNlcHRpb25zJztcbmV4cG9ydCB7XG4gIFByb3RvQ2hhbmdlRGV0ZWN0b3IsXG4gIENoYW5nZURldGVjdG9yLFxuICBDaGFuZ2VEaXNwYXRjaGVyLFxuICBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24sXG4gIERlYnVnQ29udGV4dCxcbiAgQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWdcbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmV4cG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENIQU5HRV9ERVRFQ1RJT05fU1RSQVRFR1lfVkFMVUVTfSBmcm9tICcuL2NvbnN0YW50cyc7XG5leHBvcnQge0R5bmFtaWNQcm90b0NoYW5nZURldGVjdG9yfSBmcm9tICcuL3Byb3RvX2NoYW5nZV9kZXRlY3Rvcic7XG5leHBvcnQge0ppdFByb3RvQ2hhbmdlRGV0ZWN0b3J9IGZyb20gJy4vaml0X3Byb3RvX2NoYW5nZV9kZXRlY3Rvcic7XG5leHBvcnQge0JpbmRpbmdSZWNvcmQsIEJpbmRpbmdUYXJnZXR9IGZyb20gJy4vYmluZGluZ19yZWNvcmQnO1xuZXhwb3J0IHtEaXJlY3RpdmVJbmRleCwgRGlyZWN0aXZlUmVjb3JkfSBmcm9tICcuL2RpcmVjdGl2ZV9yZWNvcmQnO1xuZXhwb3J0IHtEeW5hbWljQ2hhbmdlRGV0ZWN0b3J9IGZyb20gJy4vZHluYW1pY19jaGFuZ2VfZGV0ZWN0b3InO1xuZXhwb3J0IHtDaGFuZ2VEZXRlY3RvclJlZn0gZnJvbSAnLi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmV4cG9ydCB7SXRlcmFibGVEaWZmZXJzLCBJdGVyYWJsZURpZmZlciwgSXRlcmFibGVEaWZmZXJGYWN0b3J5fSBmcm9tICcuL2RpZmZlcnMvaXRlcmFibGVfZGlmZmVycyc7XG5leHBvcnQge0tleVZhbHVlRGlmZmVycywgS2V5VmFsdWVEaWZmZXIsIEtleVZhbHVlRGlmZmVyRmFjdG9yeX0gZnJvbSAnLi9kaWZmZXJzL2tleXZhbHVlX2RpZmZlcnMnO1xuZXhwb3J0IHtQaXBlVHJhbnNmb3JtfSBmcm9tICcuL3BpcGVfdHJhbnNmb3JtJztcbmV4cG9ydCB7V3JhcHBlZFZhbHVlLCBTaW1wbGVDaGFuZ2V9IGZyb20gJy4vY2hhbmdlX2RldGVjdGlvbl91dGlsJztcblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRpZmZpbmcgZm9yIGBPYmplY3RgcyBhbmQgYE1hcGBzLlxuICovXG5leHBvcnQgY29uc3Qga2V5VmFsRGlmZjogS2V5VmFsdWVEaWZmZXJGYWN0b3J5W10gPVxuICAgIENPTlNUX0VYUFIoW0NPTlNUX0VYUFIobmV3IERlZmF1bHRLZXlWYWx1ZURpZmZlckZhY3RvcnkoKSldKTtcblxuLyoqXG4gKiBTdHJ1Y3R1cmFsIGRpZmZpbmcgZm9yIGBJdGVyYWJsZWAgdHlwZXMgc3VjaCBhcyBgQXJyYXlgcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGl0ZXJhYmxlRGlmZjogSXRlcmFibGVEaWZmZXJGYWN0b3J5W10gPVxuICAgIENPTlNUX0VYUFIoW0NPTlNUX0VYUFIobmV3IERlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkoKSldKTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRJdGVyYWJsZURpZmZlcnMgPSBDT05TVF9FWFBSKG5ldyBJdGVyYWJsZURpZmZlcnMoaXRlcmFibGVEaWZmKSk7XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0S2V5VmFsdWVEaWZmZXJzID0gQ09OU1RfRVhQUihuZXcgS2V5VmFsdWVEaWZmZXJzKGtleVZhbERpZmYpKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbi50c1xuICoqLyIsImltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBDT05TVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0NoYW5nZURldGVjdG9yUmVmfSBmcm9tICcuLi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmltcG9ydCB7UHJvdmlkZXIsIFNraXBTZWxmTWV0YWRhdGEsIE9wdGlvbmFsTWV0YWRhdGEsIEluamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcblxuLyoqXG4gKiBBIHN0cmF0ZWd5IGZvciB0cmFja2luZyBjaGFuZ2VzIG92ZXIgdGltZSB0byBhbiBpdGVyYWJsZS4gVXNlZCBmb3Ige0BsaW5rIE5nRm9yfSB0b1xuICogcmVzcG9uZCB0byBjaGFuZ2VzIGluIGFuIGl0ZXJhYmxlIGJ5IGVmZmVjdGluZyBlcXVpdmFsZW50IGNoYW5nZXMgaW4gdGhlIERPTS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVyYWJsZURpZmZlciB7XG4gIGRpZmYob2JqZWN0OiBPYmplY3QpOiBhbnk7XG4gIG9uRGVzdHJveSgpO1xufVxuXG4vKipcbiAqIFByb3ZpZGVzIGEgZmFjdG9yeSBmb3Ige0BsaW5rIEl0ZXJhYmxlRGlmZmVyfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJdGVyYWJsZURpZmZlckZhY3Rvcnkge1xuICBzdXBwb3J0cyhvYmplY3RzOiBPYmplY3QpOiBib29sZWFuO1xuICBjcmVhdGUoY2RSZWY6IENoYW5nZURldGVjdG9yUmVmKTogSXRlcmFibGVEaWZmZXI7XG59XG5cbi8qKlxuICogQSByZXBvc2l0b3J5IG9mIGRpZmZlcmVudCBpdGVyYWJsZSBkaWZmaW5nIHN0cmF0ZWdpZXMgdXNlZCBieSBOZ0ZvciwgTmdDbGFzcywgYW5kIG90aGVycy5cbiAqL1xuQEluamVjdGFibGUoKVxuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBJdGVyYWJsZURpZmZlcnMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZmFjdG9yaWVzOiBJdGVyYWJsZURpZmZlckZhY3RvcnlbXSkge31cblxuICBzdGF0aWMgY3JlYXRlKGZhY3RvcmllczogSXRlcmFibGVEaWZmZXJGYWN0b3J5W10sIHBhcmVudD86IEl0ZXJhYmxlRGlmZmVycyk6IEl0ZXJhYmxlRGlmZmVycyB7XG4gICAgaWYgKGlzUHJlc2VudChwYXJlbnQpKSB7XG4gICAgICB2YXIgY29waWVkID0gTGlzdFdyYXBwZXIuY2xvbmUocGFyZW50LmZhY3Rvcmllcyk7XG4gICAgICBmYWN0b3JpZXMgPSBmYWN0b3JpZXMuY29uY2F0KGNvcGllZCk7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlRGlmZmVycyhmYWN0b3JpZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlRGlmZmVycyhmYWN0b3JpZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUYWtlcyBhbiBhcnJheSBvZiB7QGxpbmsgSXRlcmFibGVEaWZmZXJGYWN0b3J5fSBhbmQgcmV0dXJucyBhIHByb3ZpZGVyIHVzZWQgdG8gZXh0ZW5kIHRoZVxuICAgKiBpbmhlcml0ZWQge0BsaW5rIEl0ZXJhYmxlRGlmZmVyc30gaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgZmFjdG9yaWVzIGFuZCByZXR1cm4gYSBuZXdcbiAgICoge0BsaW5rIEl0ZXJhYmxlRGlmZmVyc30gaW5zdGFuY2UuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gZXh0ZW5kIGFuIGV4aXN0aW5nIGxpc3Qgb2YgZmFjdG9yaWVzLFxuICAgICAgICAgKiB3aGljaCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byB0aGUgaW5qZWN0b3IgZm9yIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4uXG4gICAgICAgICAqIFRoaXMgc3RlcCBpcyBhbGwgdGhhdCdzIHJlcXVpcmVkIHRvIG1ha2UgYSBuZXcge0BsaW5rIEl0ZXJhYmxlRGlmZmVyfSBhdmFpbGFibGUuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiBAQ29tcG9uZW50KHtcbiAgICogICB2aWV3UHJvdmlkZXJzOiBbXG4gICAqICAgICBJdGVyYWJsZURpZmZlcnMuZXh0ZW5kKFtuZXcgSW1tdXRhYmxlTGlzdERpZmZlcigpXSlcbiAgICogICBdXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGV4dGVuZChmYWN0b3JpZXM6IEl0ZXJhYmxlRGlmZmVyRmFjdG9yeVtdKTogUHJvdmlkZXIge1xuICAgIHJldHVybiBuZXcgUHJvdmlkZXIoSXRlcmFibGVEaWZmZXJzLCB7XG4gICAgICB1c2VGYWN0b3J5OiAocGFyZW50OiBJdGVyYWJsZURpZmZlcnMpID0+IHtcbiAgICAgICAgaWYgKGlzQmxhbmsocGFyZW50KSkge1xuICAgICAgICAgIC8vIFR5cGljYWxseSB3b3VsZCBvY2N1ciB3aGVuIGNhbGxpbmcgSXRlcmFibGVEaWZmZXJzLmV4dGVuZCBpbnNpZGUgb2YgZGVwZW5kZW5jaWVzIHBhc3NlZFxuICAgICAgICAgIC8vIHRvXG4gICAgICAgICAgLy8gYm9vdHN0cmFwKCksIHdoaWNoIHdvdWxkIG92ZXJyaWRlIGRlZmF1bHQgcGlwZXMgaW5zdGVhZCBvZiBleHRlbmRpbmcgdGhlbS5cbiAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignQ2Fubm90IGV4dGVuZCBJdGVyYWJsZURpZmZlcnMgd2l0aG91dCBhIHBhcmVudCBpbmplY3RvcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBJdGVyYWJsZURpZmZlcnMuY3JlYXRlKGZhY3RvcmllcywgcGFyZW50KTtcbiAgICAgIH0sXG4gICAgICAvLyBEZXBlbmRlbmN5IHRlY2huaWNhbGx5IGlzbid0IG9wdGlvbmFsLCBidXQgd2UgY2FuIHByb3ZpZGUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGlzIHdheS5cbiAgICAgIGRlcHM6IFtbSXRlcmFibGVEaWZmZXJzLCBuZXcgU2tpcFNlbGZNZXRhZGF0YSgpLCBuZXcgT3B0aW9uYWxNZXRhZGF0YSgpXV1cbiAgICB9KTtcbiAgfVxuXG4gIGZpbmQoaXRlcmFibGU6IE9iamVjdCk6IEl0ZXJhYmxlRGlmZmVyRmFjdG9yeSB7XG4gICAgdmFyIGZhY3RvcnkgPSB0aGlzLmZhY3Rvcmllcy5maW5kKGYgPT4gZi5zdXBwb3J0cyhpdGVyYWJsZSkpO1xuICAgIGlmIChpc1ByZXNlbnQoZmFjdG9yeSkpIHtcbiAgICAgIHJldHVybiBmYWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ2Fubm90IGZpbmQgYSBkaWZmZXIgc3VwcG9ydGluZyBvYmplY3QgJyR7aXRlcmFibGV9J2ApO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9kaWZmZXJzL2l0ZXJhYmxlX2RpZmZlcnMudHNcbiAqKi8iLCJpbXBvcnQge0NPTlNUfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtcbiAgaXNMaXN0TGlrZUl0ZXJhYmxlLFxuICBpdGVyYXRlTGlzdExpa2UsXG4gIExpc3RXcmFwcGVyLFxuICBNYXBXcmFwcGVyXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCB7XG4gIGlzQmxhbmssXG4gIGlzUHJlc2VudCxcbiAgc3RyaW5naWZ5LFxuICBnZXRNYXBLZXksXG4gIGxvb3NlSWRlbnRpY2FsLFxuICBpc0FycmF5XG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWZ9IGZyb20gJy4uL2NoYW5nZV9kZXRlY3Rvcl9yZWYnO1xuaW1wb3J0IHtJdGVyYWJsZURpZmZlciwgSXRlcmFibGVEaWZmZXJGYWN0b3J5fSBmcm9tICcuLi9kaWZmZXJzL2l0ZXJhYmxlX2RpZmZlcnMnO1xuXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIERlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkgaW1wbGVtZW50cyBJdGVyYWJsZURpZmZlckZhY3Rvcnkge1xuICBzdXBwb3J0cyhvYmo6IE9iamVjdCk6IGJvb2xlYW4geyByZXR1cm4gaXNMaXN0TGlrZUl0ZXJhYmxlKG9iaik7IH1cbiAgY3JlYXRlKGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZik6IGFueSB7IHJldHVybiBuZXcgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyKCk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIERlZmF1bHRJdGVyYWJsZURpZmZlciBpbXBsZW1lbnRzIEl0ZXJhYmxlRGlmZmVyIHtcbiAgcHJpdmF0ZSBfY29sbGVjdGlvbiA9IG51bGw7XG4gIHByaXZhdGUgX2xlbmd0aDogbnVtYmVyID0gbnVsbDtcbiAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHVzZWQgcmVjb3JkcyBhdCBhbnkgcG9pbnQgaW4gdGltZSAoZHVyaW5nICYgYWNyb3NzIGBfY2hlY2soKWAgY2FsbHMpXG4gIHByaXZhdGUgX2xpbmtlZFJlY29yZHM6IF9EdXBsaWNhdGVNYXAgPSBudWxsO1xuICAvLyBLZWVwcyB0cmFjayBvZiB0aGUgcmVtb3ZlZCByZWNvcmRzIGF0IGFueSBwb2ludCBpbiB0aW1lIGR1cmluZyBgX2NoZWNrKClgIGNhbGxzLlxuICBwcml2YXRlIF91bmxpbmtlZFJlY29yZHM6IF9EdXBsaWNhdGVNYXAgPSBudWxsO1xuICBwcml2YXRlIF9wcmV2aW91c0l0SGVhZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX2l0SGVhZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX2l0VGFpbDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX2FkZGl0aW9uc0hlYWQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBudWxsO1xuICBwcml2YXRlIF9hZGRpdGlvbnNUYWlsOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgcHJpdmF0ZSBfbW92ZXNIZWFkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgcHJpdmF0ZSBfbW92ZXNUYWlsOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmVtb3ZhbHNIZWFkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmVtb3ZhbHNUYWlsOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcblxuICBnZXQgY29sbGVjdGlvbigpIHsgcmV0dXJuIHRoaXMuX2NvbGxlY3Rpb247IH1cblxuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLl9sZW5ndGg7IH1cblxuICBmb3JFYWNoSXRlbShmbjogRnVuY3Rpb24pIHtcbiAgICB2YXIgcmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkO1xuICAgIGZvciAocmVjb3JkID0gdGhpcy5faXRIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkge1xuICAgICAgZm4ocmVjb3JkKTtcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoUHJldmlvdXNJdGVtKGZuOiBGdW5jdGlvbikge1xuICAgIHZhciByZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQ7XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c0l0SGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRQcmV2aW91cykge1xuICAgICAgZm4ocmVjb3JkKTtcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoQWRkZWRJdGVtKGZuOiBGdW5jdGlvbikge1xuICAgIHZhciByZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQ7XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7XG4gICAgICBmbihyZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGZvckVhY2hNb3ZlZEl0ZW0oZm46IEZ1bmN0aW9uKSB7XG4gICAgdmFyIHJlY29yZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZDtcbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRNb3ZlZCkge1xuICAgICAgZm4ocmVjb3JkKTtcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoUmVtb3ZlZEl0ZW0oZm46IEZ1bmN0aW9uKSB7XG4gICAgdmFyIHJlY29yZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZDtcbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3JlbW92YWxzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRSZW1vdmVkKSB7XG4gICAgICBmbihyZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGRpZmYoY29sbGVjdGlvbjogYW55KTogRGVmYXVsdEl0ZXJhYmxlRGlmZmVyIHtcbiAgICBpZiAoaXNCbGFuayhjb2xsZWN0aW9uKSkgY29sbGVjdGlvbiA9IFtdO1xuICAgIGlmICghaXNMaXN0TGlrZUl0ZXJhYmxlKGNvbGxlY3Rpb24pKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgRXJyb3IgdHJ5aW5nIHRvIGRpZmYgJyR7Y29sbGVjdGlvbn0nYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuY2hlY2soY29sbGVjdGlvbikpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvbkRlc3Ryb3koKSB7fVxuXG4gIC8vIHRvZG8odmljYik6IG9wdGltIGZvciBVbm1vZGlmaWFibGVMaXN0VmlldyAoZnJvemVuIGFycmF5cylcbiAgY2hlY2soY29sbGVjdGlvbjogYW55KTogYm9vbGVhbiB7XG4gICAgdGhpcy5fcmVzZXQoKTtcblxuICAgIHZhciByZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSB0aGlzLl9pdEhlYWQ7XG4gICAgdmFyIG1heUJlRGlydHk6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICB2YXIgaW5kZXg6IG51bWJlcjtcbiAgICB2YXIgaXRlbTtcblxuICAgIGlmIChpc0FycmF5KGNvbGxlY3Rpb24pKSB7XG4gICAgICB2YXIgbGlzdCA9IGNvbGxlY3Rpb247XG4gICAgICB0aGlzLl9sZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblxuICAgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIGl0ZW0gPSBsaXN0W2luZGV4XTtcbiAgICAgICAgaWYgKHJlY29yZCA9PT0gbnVsbCB8fCAhbG9vc2VJZGVudGljYWwocmVjb3JkLml0ZW0sIGl0ZW0pKSB7XG4gICAgICAgICAgcmVjb3JkID0gdGhpcy5fbWlzbWF0Y2gocmVjb3JkLCBpdGVtLCBpbmRleCk7XG4gICAgICAgICAgbWF5QmVEaXJ0eSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWF5QmVEaXJ0eSkge1xuICAgICAgICAgIC8vIFRPRE8obWlza28pOiBjYW4gd2UgbGltaXQgdGhpcyB0byBkdXBsaWNhdGVzIG9ubHk/XG4gICAgICAgICAgcmVjb3JkID0gdGhpcy5fdmVyaWZ5UmVpbnNlcnRpb24ocmVjb3JkLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVjb3JkID0gcmVjb3JkLl9uZXh0O1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbmRleCA9IDA7XG4gICAgICBpdGVyYXRlTGlzdExpa2UoY29sbGVjdGlvbiwgKGl0ZW0pID0+IHtcbiAgICAgICAgaWYgKHJlY29yZCA9PT0gbnVsbCB8fCAhbG9vc2VJZGVudGljYWwocmVjb3JkLml0ZW0sIGl0ZW0pKSB7XG4gICAgICAgICAgcmVjb3JkID0gdGhpcy5fbWlzbWF0Y2gocmVjb3JkLCBpdGVtLCBpbmRleCk7XG4gICAgICAgICAgbWF5QmVEaXJ0eSA9IHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAobWF5QmVEaXJ0eSkge1xuICAgICAgICAgIC8vIFRPRE8obWlza28pOiBjYW4gd2UgbGltaXQgdGhpcyB0byBkdXBsaWNhdGVzIG9ubHk/XG4gICAgICAgICAgcmVjb3JkID0gdGhpcy5fdmVyaWZ5UmVpbnNlcnRpb24ocmVjb3JkLCBpdGVtLCBpbmRleCk7XG4gICAgICAgIH1cbiAgICAgICAgcmVjb3JkID0gcmVjb3JkLl9uZXh0O1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9sZW5ndGggPSBpbmRleDtcbiAgICB9XG5cbiAgICB0aGlzLl90cnVuY2F0ZShyZWNvcmQpO1xuICAgIHRoaXMuX2NvbGxlY3Rpb24gPSBjb2xsZWN0aW9uO1xuICAgIHJldHVybiB0aGlzLmlzRGlydHk7XG4gIH1cblxuICAvLyBDb2xsZWN0aW9uQ2hhbmdlcyBpcyBjb25zaWRlcmVkIGRpcnR5IGlmIGl0IGhhcyBhbnkgYWRkaXRpb25zLCBtb3ZlcyBvciByZW1vdmFscy5cbiAgZ2V0IGlzRGlydHkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FkZGl0aW9uc0hlYWQgIT09IG51bGwgfHwgdGhpcy5fbW92ZXNIZWFkICE9PSBudWxsIHx8IHRoaXMuX3JlbW92YWxzSGVhZCAhPT0gbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldCB0aGUgc3RhdGUgb2YgdGhlIGNoYW5nZSBvYmplY3RzIHRvIHNob3cgbm8gY2hhbmdlcy4gVGhpcyBtZWFucyBzZXQgcHJldmlvdXNLZXkgdG9cbiAgICogY3VycmVudEtleSwgYW5kIGNsZWFyIGFsbCBvZiB0aGUgcXVldWVzIChhZGRpdGlvbnMsIG1vdmVzLCByZW1vdmFscykuXG4gICAqIFNldCB0aGUgcHJldmlvdXNJbmRleGVzIG9mIG1vdmVkIGFuZCBhZGRlZCBpdGVtcyB0byB0aGVpciBjdXJyZW50SW5kZXhlc1xuICAgKiBSZXNldCB0aGUgbGlzdCBvZiBhZGRpdGlvbnMsIG1vdmVzIGFuZCByZW1vdmFsc1xuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9yZXNldCgpIHtcbiAgICBpZiAodGhpcy5pc0RpcnR5KSB7XG4gICAgICB2YXIgcmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkO1xuICAgICAgdmFyIG5leHRSZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQ7XG5cbiAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNJdEhlYWQgPSB0aGlzLl9pdEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7XG4gICAgICAgIHJlY29yZC5fbmV4dFByZXZpb3VzID0gcmVjb3JkLl9uZXh0O1xuICAgICAgfVxuXG4gICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHtcbiAgICAgICAgcmVjb3JkLnByZXZpb3VzSW5kZXggPSByZWNvcmQuY3VycmVudEluZGV4O1xuICAgICAgfVxuICAgICAgdGhpcy5fYWRkaXRpb25zSGVhZCA9IHRoaXMuX2FkZGl0aW9uc1RhaWwgPSBudWxsO1xuXG4gICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSBuZXh0UmVjb3JkKSB7XG4gICAgICAgIHJlY29yZC5wcmV2aW91c0luZGV4ID0gcmVjb3JkLmN1cnJlbnRJbmRleDtcbiAgICAgICAgbmV4dFJlY29yZCA9IHJlY29yZC5fbmV4dE1vdmVkO1xuICAgICAgfVxuICAgICAgdGhpcy5fbW92ZXNIZWFkID0gdGhpcy5fbW92ZXNUYWlsID0gbnVsbDtcbiAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IHRoaXMuX3JlbW92YWxzVGFpbCA9IG51bGw7XG5cbiAgICAgIC8vIHRvZG8odmljYikgd2hlbiBhc3NlcnQgZ2V0cyBzdXBwb3J0ZWRcbiAgICAgIC8vIGFzc2VydCghdGhpcy5pc0RpcnR5KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyB0aGUgY29yZSBmdW5jdGlvbiB3aGljaCBoYW5kbGVzIGRpZmZlcmVuY2VzIGJldHdlZW4gY29sbGVjdGlvbnMuXG4gICAqXG4gICAqIC0gYHJlY29yZGAgaXMgdGhlIHJlY29yZCB3aGljaCB3ZSBzYXcgYXQgdGhpcyBwb3NpdGlvbiBsYXN0IHRpbWUuIElmIG51bGwgdGhlbiBpdCBpcyBhIG5ld1xuICAgKiAgIGl0ZW0uXG4gICAqIC0gYGl0ZW1gIGlzIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGNvbGxlY3Rpb25cbiAgICogLSBgaW5kZXhgIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvblxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF9taXNtYXRjaChyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQsIGl0ZW0sIGluZGV4OiBudW1iZXIpOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIHtcbiAgICAvLyBUaGUgcHJldmlvdXMgcmVjb3JkIGFmdGVyIHdoaWNoIHdlIHdpbGwgYXBwZW5kIHRoZSBjdXJyZW50IG9uZS5cbiAgICB2YXIgcHJldmlvdXNSZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQ7XG5cbiAgICBpZiAocmVjb3JkID09PSBudWxsKSB7XG4gICAgICBwcmV2aW91c1JlY29yZCA9IHRoaXMuX2l0VGFpbDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJldmlvdXNSZWNvcmQgPSByZWNvcmQuX3ByZXY7XG4gICAgICAvLyBSZW1vdmUgdGhlIHJlY29yZCBmcm9tIHRoZSBjb2xsZWN0aW9uIHNpbmNlIHdlIGtub3cgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGl0ZW0uXG4gICAgICB0aGlzLl9yZW1vdmUocmVjb3JkKTtcbiAgICB9XG5cbiAgICAvLyBBdHRlbXB0IHRvIHNlZSBpZiB3ZSBoYXZlIHNlZW4gdGhlIGl0ZW0gYmVmb3JlLlxuICAgIHJlY29yZCA9IHRoaXMuX2xpbmtlZFJlY29yZHMgPT09IG51bGwgPyBudWxsIDogdGhpcy5fbGlua2VkUmVjb3Jkcy5nZXQoaXRlbSwgaW5kZXgpO1xuICAgIGlmIChyZWNvcmQgIT09IG51bGwpIHtcbiAgICAgIC8vIFdlIGhhdmUgc2VlbiB0aGlzIGJlZm9yZSwgd2UgbmVlZCB0byBtb3ZlIGl0IGZvcndhcmQgaW4gdGhlIGNvbGxlY3Rpb24uXG4gICAgICB0aGlzLl9tb3ZlQWZ0ZXIocmVjb3JkLCBwcmV2aW91c1JlY29yZCwgaW5kZXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBOZXZlciBzZWVuIGl0LCBjaGVjayBldmljdGVkIGxpc3QuXG4gICAgICByZWNvcmQgPSB0aGlzLl91bmxpbmtlZFJlY29yZHMgPT09IG51bGwgPyBudWxsIDogdGhpcy5fdW5saW5rZWRSZWNvcmRzLmdldChpdGVtKTtcbiAgICAgIGlmIChyZWNvcmQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSXQgaXMgYW4gaXRlbSB3aGljaCB3ZSBoYXZlIGV2aWN0ZWQgZWFybGllcjogcmVpbnNlcnQgaXQgYmFjayBpbnRvIHRoZSBsaXN0LlxuICAgICAgICB0aGlzLl9yZWluc2VydEFmdGVyKHJlY29yZCwgcHJldmlvdXNSZWNvcmQsIGluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEl0IGlzIGEgbmV3IGl0ZW06IGFkZCBpdC5cbiAgICAgICAgcmVjb3JkID0gdGhpcy5fYWRkQWZ0ZXIobmV3IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQoaXRlbSksIHByZXZpb3VzUmVjb3JkLCBpbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBjaGVjayBpcyBvbmx5IG5lZWRlZCBpZiBhbiBhcnJheSBjb250YWlucyBkdXBsaWNhdGVzLiAoU2hvcnQgY2lyY3VpdCBvZiBub3RoaW5nIGRpcnR5KVxuICAgKlxuICAgKiBVc2UgY2FzZTogYFthLCBhXWAgPT4gYFtiLCBhLCBhXWBcbiAgICpcbiAgICogSWYgd2UgZGlkIG5vdCBoYXZlIHRoaXMgY2hlY2sgdGhlbiB0aGUgaW5zZXJ0aW9uIG9mIGBiYCB3b3VsZDpcbiAgICogICAxKSBldmljdCBmaXJzdCBgYWBcbiAgICogICAyKSBpbnNlcnQgYGJgIGF0IGAwYCBpbmRleC5cbiAgICogICAzKSBsZWF2ZSBgYWAgYXQgaW5kZXggYDFgIGFzIGlzLiA8LS0gdGhpcyBpcyB3cm9uZyFcbiAgICogICAzKSByZWluc2VydCBgYWAgYXQgaW5kZXggMi4gPC0tIHRoaXMgaXMgd3JvbmchXG4gICAqXG4gICAqIFRoZSBjb3JyZWN0IGJlaGF2aW9yIGlzOlxuICAgKiAgIDEpIGV2aWN0IGZpcnN0IGBhYFxuICAgKiAgIDIpIGluc2VydCBgYmAgYXQgYDBgIGluZGV4LlxuICAgKiAgIDMpIHJlaW5zZXJ0IGBhYCBhdCBpbmRleCAxLlxuICAgKiAgIDMpIG1vdmUgYGFgIGF0IGZyb20gYDFgIHRvIGAyYC5cbiAgICpcbiAgICpcbiAgICogRG91YmxlIGNoZWNrIHRoYXQgd2UgaGF2ZSBub3QgZXZpY3RlZCBhIGR1cGxpY2F0ZSBpdGVtLiBXZSBuZWVkIHRvIGNoZWNrIGlmIHRoZSBpdGVtIHR5cGUgbWF5XG4gICAqIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQ6XG4gICAqIFRoZSBpbnNlcnRpb24gb2YgYiB3aWxsIGV2aWN0IHRoZSBmaXJzdCAnYScuIElmIHdlIGRvbid0IHJlaW5zZXJ0IGl0IG5vdyBpdCB3aWxsIGJlIHJlaW5zZXJ0ZWRcbiAgICogYXQgdGhlIGVuZC4gV2hpY2ggd2lsbCBzaG93IHVwIGFzIHRoZSB0d28gJ2EncyBzd2l0Y2hpbmcgcG9zaXRpb24uIFRoaXMgaXMgaW5jb3JyZWN0LCBzaW5jZSBhXG4gICAqIGJldHRlciB3YXkgdG8gdGhpbmsgb2YgaXQgaXMgYXMgaW5zZXJ0IG9mICdiJyByYXRoZXIgdGhlbiBzd2l0Y2ggJ2EnIHdpdGggJ2InIGFuZCB0aGVuIGFkZCAnYSdcbiAgICogYXQgdGhlIGVuZC5cbiAgICpcbiAgICogQGludGVybmFsXG4gICAqL1xuICBfdmVyaWZ5UmVpbnNlcnRpb24ocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLCBpdGVtLCBpbmRleDogbnVtYmVyKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgdmFyIHJlaW5zZXJ0UmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID1cbiAgICAgICAgdGhpcy5fdW5saW5rZWRSZWNvcmRzID09PSBudWxsID8gbnVsbCA6IHRoaXMuX3VubGlua2VkUmVjb3Jkcy5nZXQoaXRlbSk7XG4gICAgaWYgKHJlaW5zZXJ0UmVjb3JkICE9PSBudWxsKSB7XG4gICAgICByZWNvcmQgPSB0aGlzLl9yZWluc2VydEFmdGVyKHJlaW5zZXJ0UmVjb3JkLCByZWNvcmQuX3ByZXYsIGluZGV4KTtcbiAgICB9IGVsc2UgaWYgKHJlY29yZC5jdXJyZW50SW5kZXggIT0gaW5kZXgpIHtcbiAgICAgIHJlY29yZC5jdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICAgIHRoaXMuX2FkZFRvTW92ZXMocmVjb3JkLCBpbmRleCk7XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHJpZCBvZiBhbnkgZXhjZXNzIHtAbGluayBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkfXMgZnJvbSB0aGUgcHJldmlvdXMgY29sbGVjdGlvblxuICAgKlxuICAgKiAtIGByZWNvcmRgIFRoZSBmaXJzdCBleGNlc3Mge0BsaW5rIENvbGxlY3Rpb25DaGFuZ2VSZWNvcmR9LlxuICAgKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF90cnVuY2F0ZShyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQpIHtcbiAgICAvLyBBbnl0aGluZyBhZnRlciB0aGF0IG5lZWRzIHRvIGJlIHJlbW92ZWQ7XG4gICAgd2hpbGUgKHJlY29yZCAhPT0gbnVsbCkge1xuICAgICAgdmFyIG5leHRSZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSByZWNvcmQuX25leHQ7XG4gICAgICB0aGlzLl9hZGRUb1JlbW92YWxzKHRoaXMuX3VubGluayhyZWNvcmQpKTtcbiAgICAgIHJlY29yZCA9IG5leHRSZWNvcmQ7XG4gICAgfVxuICAgIGlmICh0aGlzLl91bmxpbmtlZFJlY29yZHMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3VubGlua2VkUmVjb3Jkcy5jbGVhcigpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9hZGRpdGlvbnNUYWlsICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5fbW92ZXNUYWlsICE9PSBudWxsKSB7XG4gICAgICB0aGlzLl9tb3Zlc1RhaWwuX25leHRNb3ZlZCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9pdFRhaWwgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2l0VGFpbC5fbmV4dCA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLl9yZW1vdmFsc1RhaWwgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3JlaW5zZXJ0QWZ0ZXIocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLCBwcmV2UmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLFxuICAgICAgICAgICAgICAgICBpbmRleDogbnVtYmVyKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgaWYgKHRoaXMuX3VubGlua2VkUmVjb3JkcyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fdW5saW5rZWRSZWNvcmRzLnJlbW92ZShyZWNvcmQpO1xuICAgIH1cbiAgICB2YXIgcHJldiA9IHJlY29yZC5fcHJldlJlbW92ZWQ7XG4gICAgdmFyIG5leHQgPSByZWNvcmQuX25leHRSZW1vdmVkO1xuXG4gICAgaWYgKHByZXYgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG5leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXYuX25leHRSZW1vdmVkID0gbmV4dDtcbiAgICB9XG4gICAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHByZXY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQuX3ByZXZSZW1vdmVkID0gcHJldjtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnNlcnRBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KTtcbiAgICB0aGlzLl9hZGRUb01vdmVzKHJlY29yZCwgaW5kZXgpO1xuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tb3ZlQWZ0ZXIocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLCBwcmV2UmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLFxuICAgICAgICAgICAgIGluZGV4OiBudW1iZXIpOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIHtcbiAgICB0aGlzLl91bmxpbmsocmVjb3JkKTtcbiAgICB0aGlzLl9pbnNlcnRBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KTtcbiAgICB0aGlzLl9hZGRUb01vdmVzKHJlY29yZCwgaW5kZXgpO1xuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9hZGRBZnRlcihyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQsIHByZXZSZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQsXG4gICAgICAgICAgICBpbmRleDogbnVtYmVyKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgdGhpcy5faW5zZXJ0QWZ0ZXIocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCk7XG5cbiAgICBpZiAodGhpcy5fYWRkaXRpb25zVGFpbCA9PT0gbnVsbCkge1xuICAgICAgLy8gdG9kbyh2aWNiKVxuICAgICAgLy8gYXNzZXJ0KHRoaXMuX2FkZGl0aW9uc0hlYWQgPT09IG51bGwpO1xuICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQgPSByZWNvcmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRvZG8odmljYilcbiAgICAgIC8vIGFzc2VydChfYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID09PSBudWxsKTtcbiAgICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRBZGRlZCA9PT0gbnVsbCk7XG4gICAgICB0aGlzLl9hZGRpdGlvbnNUYWlsID0gdGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID0gcmVjb3JkO1xuICAgIH1cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaW5zZXJ0QWZ0ZXIocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLCBwcmV2UmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLFxuICAgICAgICAgICAgICAgaW5kZXg6IG51bWJlcik6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQge1xuICAgIC8vIHRvZG8odmljYilcbiAgICAvLyBhc3NlcnQocmVjb3JkICE9IHByZXZSZWNvcmQpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHQgPT09IG51bGwpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX3ByZXYgPT09IG51bGwpO1xuXG4gICAgdmFyIG5leHQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBwcmV2UmVjb3JkID09PSBudWxsID8gdGhpcy5faXRIZWFkIDogcHJldlJlY29yZC5fbmV4dDtcbiAgICAvLyB0b2RvKHZpY2IpXG4gICAgLy8gYXNzZXJ0KG5leHQgIT0gcmVjb3JkKTtcbiAgICAvLyBhc3NlcnQocHJldlJlY29yZCAhPSByZWNvcmQpO1xuICAgIHJlY29yZC5fbmV4dCA9IG5leHQ7XG4gICAgcmVjb3JkLl9wcmV2ID0gcHJldlJlY29yZDtcbiAgICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5faXRUYWlsID0gcmVjb3JkO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Ll9wcmV2ID0gcmVjb3JkO1xuICAgIH1cbiAgICBpZiAocHJldlJlY29yZCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5faXRIZWFkID0gcmVjb3JkO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmV2UmVjb3JkLl9uZXh0ID0gcmVjb3JkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9saW5rZWRSZWNvcmRzID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9saW5rZWRSZWNvcmRzID0gbmV3IF9EdXBsaWNhdGVNYXAoKTtcbiAgICB9XG4gICAgdGhpcy5fbGlua2VkUmVjb3Jkcy5wdXQocmVjb3JkKTtcblxuICAgIHJlY29yZC5jdXJyZW50SW5kZXggPSBpbmRleDtcbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcmVtb3ZlKHJlY29yZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCk6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQge1xuICAgIHJldHVybiB0aGlzLl9hZGRUb1JlbW92YWxzKHRoaXMuX3VubGluayhyZWNvcmQpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3VubGluayhyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQpOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIHtcbiAgICBpZiAodGhpcy5fbGlua2VkUmVjb3JkcyAhPT0gbnVsbCkge1xuICAgICAgdGhpcy5fbGlua2VkUmVjb3Jkcy5yZW1vdmUocmVjb3JkKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldiA9IHJlY29yZC5fcHJldjtcbiAgICB2YXIgbmV4dCA9IHJlY29yZC5fbmV4dDtcblxuICAgIC8vIHRvZG8odmljYilcbiAgICAvLyBhc3NlcnQoKHJlY29yZC5fcHJldiA9IG51bGwpID09PSBudWxsKTtcbiAgICAvLyBhc3NlcnQoKHJlY29yZC5fbmV4dCA9IG51bGwpID09PSBudWxsKTtcblxuICAgIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9pdEhlYWQgPSBuZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmV2Ll9uZXh0ID0gbmV4dDtcbiAgICB9XG4gICAgaWYgKG5leHQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2l0VGFpbCA9IHByZXY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQuX3ByZXYgPSBwcmV2O1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9hZGRUb01vdmVzKHJlY29yZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCwgdG9JbmRleDogbnVtYmVyKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgLy8gdG9kbyh2aWNiKVxuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRNb3ZlZCA9PT0gbnVsbCk7XG5cbiAgICBpZiAocmVjb3JkLnByZXZpb3VzSW5kZXggPT09IHRvSW5kZXgpIHtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX21vdmVzVGFpbCA9PT0gbnVsbCkge1xuICAgICAgLy8gdG9kbyh2aWNiKVxuICAgICAgLy8gYXNzZXJ0KF9tb3Zlc0hlYWQgPT09IG51bGwpO1xuICAgICAgdGhpcy5fbW92ZXNUYWlsID0gdGhpcy5fbW92ZXNIZWFkID0gcmVjb3JkO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0b2RvKHZpY2IpXG4gICAgICAvLyBhc3NlcnQoX21vdmVzVGFpbC5fbmV4dE1vdmVkID09PSBudWxsKTtcbiAgICAgIHRoaXMuX21vdmVzVGFpbCA9IHRoaXMuX21vdmVzVGFpbC5fbmV4dE1vdmVkID0gcmVjb3JkO1xuICAgIH1cblxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9hZGRUb1JlbW92YWxzKHJlY29yZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCk6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQge1xuICAgIGlmICh0aGlzLl91bmxpbmtlZFJlY29yZHMgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3VubGlua2VkUmVjb3JkcyA9IG5ldyBfRHVwbGljYXRlTWFwKCk7XG4gICAgfVxuICAgIHRoaXMuX3VubGlua2VkUmVjb3Jkcy5wdXQocmVjb3JkKTtcbiAgICByZWNvcmQuY3VycmVudEluZGV4ID0gbnVsbDtcbiAgICByZWNvcmQuX25leHRSZW1vdmVkID0gbnVsbDtcblxuICAgIGlmICh0aGlzLl9yZW1vdmFsc1RhaWwgPT09IG51bGwpIHtcbiAgICAgIC8vIHRvZG8odmljYilcbiAgICAgIC8vIGFzc2VydChfcmVtb3ZhbHNIZWFkID09PSBudWxsKTtcbiAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHRoaXMuX3JlbW92YWxzSGVhZCA9IHJlY29yZDtcbiAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0b2RvKHZpY2IpXG4gICAgICAvLyBhc3NlcnQoX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPT09IG51bGwpO1xuICAgICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dFJlbW92ZWQgPT09IG51bGwpO1xuICAgICAgcmVjb3JkLl9wcmV2UmVtb3ZlZCA9IHRoaXMuX3JlbW92YWxzVGFpbDtcbiAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHRoaXMuX3JlbW92YWxzVGFpbC5fbmV4dFJlbW92ZWQgPSByZWNvcmQ7XG4gICAgfVxuICAgIHJldHVybiByZWNvcmQ7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciByZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQ7XG5cbiAgICB2YXIgbGlzdCA9IFtdO1xuICAgIGZvciAocmVjb3JkID0gdGhpcy5faXRIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkge1xuICAgICAgbGlzdC5wdXNoKHJlY29yZCk7XG4gICAgfVxuXG4gICAgdmFyIHByZXZpb3VzID0gW107XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c0l0SGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRQcmV2aW91cykge1xuICAgICAgcHJldmlvdXMucHVzaChyZWNvcmQpO1xuICAgIH1cblxuICAgIHZhciBhZGRpdGlvbnMgPSBbXTtcbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHtcbiAgICAgIGFkZGl0aW9ucy5wdXNoKHJlY29yZCk7XG4gICAgfVxuICAgIHZhciBtb3ZlcyA9IFtdO1xuICAgIGZvciAocmVjb3JkID0gdGhpcy5fbW92ZXNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dE1vdmVkKSB7XG4gICAgICBtb3Zlcy5wdXNoKHJlY29yZCk7XG4gICAgfVxuXG4gICAgdmFyIHJlbW92YWxzID0gW107XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9yZW1vdmFsc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UmVtb3ZlZCkge1xuICAgICAgcmVtb3ZhbHMucHVzaChyZWNvcmQpO1xuICAgIH1cblxuICAgIHJldHVybiBcImNvbGxlY3Rpb246IFwiICsgbGlzdC5qb2luKCcsICcpICsgXCJcXG5cIiArIFwicHJldmlvdXM6IFwiICsgcHJldmlvdXMuam9pbignLCAnKSArIFwiXFxuXCIgK1xuICAgICAgICAgICBcImFkZGl0aW9uczogXCIgKyBhZGRpdGlvbnMuam9pbignLCAnKSArIFwiXFxuXCIgKyBcIm1vdmVzOiBcIiArIG1vdmVzLmpvaW4oJywgJykgKyBcIlxcblwiICtcbiAgICAgICAgICAgXCJyZW1vdmFsczogXCIgKyByZW1vdmFscy5qb2luKCcsICcpICsgXCJcXG5cIjtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gIGN1cnJlbnRJbmRleDogbnVtYmVyID0gbnVsbDtcbiAgcHJldmlvdXNJbmRleDogbnVtYmVyID0gbnVsbDtcblxuICAvKiogQGludGVybmFsICovXG4gIF9uZXh0UHJldmlvdXM6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIF9wcmV2OiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbmV4dDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXZEdXA6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIF9uZXh0RHVwOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJldlJlbW92ZWQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIF9uZXh0UmVtb3ZlZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25leHRBZGRlZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25leHRNb3ZlZDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGl0ZW06IGFueSkge31cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnByZXZpb3VzSW5kZXggPT09IHRoaXMuY3VycmVudEluZGV4ID9cbiAgICAgICAgICAgICAgIHN0cmluZ2lmeSh0aGlzLml0ZW0pIDpcbiAgICAgICAgICAgICAgIHN0cmluZ2lmeSh0aGlzLml0ZW0pICsgJ1snICsgc3RyaW5naWZ5KHRoaXMucHJldmlvdXNJbmRleCkgKyAnLT4nICtcbiAgICAgICAgICAgICAgICAgICBzdHJpbmdpZnkodGhpcy5jdXJyZW50SW5kZXgpICsgJ10nO1xuICB9XG59XG5cbi8vIEEgbGlua2VkIGxpc3Qgb2YgQ29sbGVjdGlvbkNoYW5nZVJlY29yZHMgd2l0aCB0aGUgc2FtZSBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLml0ZW1cbmNsYXNzIF9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2hlYWQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIF90YWlsOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkID0gbnVsbDtcblxuICAvKipcbiAgICogQXBwZW5kIHRoZSByZWNvcmQgdG8gdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy5cbiAgICpcbiAgICogTm90ZTogYnkgZGVzaWduIGFsbCByZWNvcmRzIGluIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMgaG9sZCB0aGUgc2FtZSB2YWx1ZSBpbiByZWNvcmQuaXRlbS5cbiAgICovXG4gIGFkZChyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faGVhZCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5faGVhZCA9IHRoaXMuX3RhaWwgPSByZWNvcmQ7XG4gICAgICByZWNvcmQuX25leHREdXAgPSBudWxsO1xuICAgICAgcmVjb3JkLl9wcmV2RHVwID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gdG9kbyh2aWNiKVxuICAgICAgLy8gYXNzZXJ0KHJlY29yZC5pdGVtID09ICBfaGVhZC5pdGVtIHx8XG4gICAgICAvLyAgICAgICByZWNvcmQuaXRlbSBpcyBudW0gJiYgcmVjb3JkLml0ZW0uaXNOYU4gJiYgX2hlYWQuaXRlbSBpcyBudW0gJiYgX2hlYWQuaXRlbS5pc05hTik7XG4gICAgICB0aGlzLl90YWlsLl9uZXh0RHVwID0gcmVjb3JkO1xuICAgICAgcmVjb3JkLl9wcmV2RHVwID0gdGhpcy5fdGFpbDtcbiAgICAgIHJlY29yZC5fbmV4dER1cCA9IG51bGw7XG4gICAgICB0aGlzLl90YWlsID0gcmVjb3JkO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgYSBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIGhhdmluZyBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkLml0ZW0gPT0gaXRlbSBhbmRcbiAgLy8gQ29sbGVjdGlvbkNoYW5nZVJlY29yZC5jdXJyZW50SW5kZXggPj0gYWZ0ZXJJbmRleFxuICBnZXQoaXRlbTogYW55LCBhZnRlckluZGV4OiBudW1iZXIpOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIHtcbiAgICB2YXIgcmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkO1xuICAgIGZvciAocmVjb3JkID0gdGhpcy5faGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHREdXApIHtcbiAgICAgIGlmICgoYWZ0ZXJJbmRleCA9PT0gbnVsbCB8fCBhZnRlckluZGV4IDwgcmVjb3JkLmN1cnJlbnRJbmRleCkgJiZcbiAgICAgICAgICBsb29zZUlkZW50aWNhbChyZWNvcmQuaXRlbSwgaXRlbSkpIHtcbiAgICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIG9uZSB7QGxpbmsgQ29sbGVjdGlvbkNoYW5nZVJlY29yZH0gZnJvbSB0aGUgbGlzdCBvZiBkdXBsaWNhdGVzLlxuICAgKlxuICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcyBpcyBlbXB0eS5cbiAgICovXG4gIHJlbW92ZShyZWNvcmQ6IENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQpOiBib29sZWFuIHtcbiAgICAvLyB0b2RvKHZpY2IpXG4gICAgLy8gYXNzZXJ0KCgpIHtcbiAgICAvLyAgLy8gdmVyaWZ5IHRoYXQgdGhlIHJlY29yZCBiZWluZyByZW1vdmVkIGlzIGluIHRoZSBsaXN0LlxuICAgIC8vICBmb3IgKENvbGxlY3Rpb25DaGFuZ2VSZWNvcmQgY3Vyc29yID0gX2hlYWQ7IGN1cnNvciAhPSBudWxsOyBjdXJzb3IgPSBjdXJzb3IuX25leHREdXApIHtcbiAgICAvLyAgICBpZiAoaWRlbnRpY2FsKGN1cnNvciwgcmVjb3JkKSkgcmV0dXJuIHRydWU7XG4gICAgLy8gIH1cbiAgICAvLyAgcmV0dXJuIGZhbHNlO1xuICAgIC8vfSk7XG5cbiAgICB2YXIgcHJldjogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IHJlY29yZC5fcHJldkR1cDtcbiAgICB2YXIgbmV4dDogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCA9IHJlY29yZC5fbmV4dER1cDtcbiAgICBpZiAocHJldiA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5faGVhZCA9IG5leHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZXYuX25leHREdXAgPSBuZXh0O1xuICAgIH1cbiAgICBpZiAobmV4dCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fdGFpbCA9IHByZXY7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5leHQuX3ByZXZEdXAgPSBwcmV2O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5faGVhZCA9PT0gbnVsbDtcbiAgfVxufVxuXG5jbGFzcyBfRHVwbGljYXRlTWFwIHtcbiAgbWFwID0gbmV3IE1hcDxhbnksIF9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdD4oKTtcblxuICBwdXQocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkKSB7XG4gICAgLy8gdG9kbyh2aWNiKSBoYW5kbGUgY29ybmVyIGNhc2VzXG4gICAgdmFyIGtleSA9IGdldE1hcEtleShyZWNvcmQuaXRlbSk7XG5cbiAgICB2YXIgZHVwbGljYXRlcyA9IHRoaXMubWFwLmdldChrZXkpO1xuICAgIGlmICghaXNQcmVzZW50KGR1cGxpY2F0ZXMpKSB7XG4gICAgICBkdXBsaWNhdGVzID0gbmV3IF9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdCgpO1xuICAgICAgdGhpcy5tYXAuc2V0KGtleSwgZHVwbGljYXRlcyk7XG4gICAgfVxuICAgIGR1cGxpY2F0ZXMuYWRkKHJlY29yZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGB2YWx1ZWAgdXNpbmcga2V5LiBCZWNhdXNlIHRoZSBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkIHZhbHVlIG1heWJlIG9uZSB3aGljaCB3ZVxuICAgKiBoYXZlIGFscmVhZHkgaXRlcmF0ZWQgb3Zlciwgd2UgdXNlIHRoZSBhZnRlckluZGV4IHRvIHByZXRlbmQgaXQgaXMgbm90IHRoZXJlLlxuICAgKlxuICAgKiBVc2UgY2FzZTogYFthLCBiLCBjLCBhLCBhXWAgaWYgd2UgYXJlIGF0IGluZGV4IGAzYCB3aGljaCBpcyB0aGUgc2Vjb25kIGBhYCB0aGVuIGFza2luZyBpZiB3ZVxuICAgKiBoYXZlIGFueSBtb3JlIGBhYHMgbmVlZHMgdG8gcmV0dXJuIHRoZSBsYXN0IGBhYCBub3QgdGhlIGZpcnN0IG9yIHNlY29uZC5cbiAgICovXG4gIGdldCh2YWx1ZTogYW55LCBhZnRlckluZGV4OiBudW1iZXIgPSBudWxsKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgdmFyIGtleSA9IGdldE1hcEtleSh2YWx1ZSk7XG5cbiAgICB2YXIgcmVjb3JkTGlzdCA9IHRoaXMubWFwLmdldChrZXkpO1xuICAgIHJldHVybiBpc0JsYW5rKHJlY29yZExpc3QpID8gbnVsbCA6IHJlY29yZExpc3QuZ2V0KHZhbHVlLCBhZnRlckluZGV4KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEge0BsaW5rIENvbGxlY3Rpb25DaGFuZ2VSZWNvcmR9IGZyb20gdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy5cbiAgICpcbiAgICogVGhlIGxpc3Qgb2YgZHVwbGljYXRlcyBhbHNvIGlzIHJlbW92ZWQgZnJvbSB0aGUgbWFwIGlmIGl0IGdldHMgZW1wdHkuXG4gICAqL1xuICByZW1vdmUocmVjb3JkOiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkKTogQ29sbGVjdGlvbkNoYW5nZVJlY29yZCB7XG4gICAgdmFyIGtleSA9IGdldE1hcEtleShyZWNvcmQuaXRlbSk7XG4gICAgLy8gdG9kbyh2aWNiKVxuICAgIC8vIGFzc2VydCh0aGlzLm1hcC5jb250YWluc0tleShrZXkpKTtcbiAgICB2YXIgcmVjb3JkTGlzdDogX0R1cGxpY2F0ZUl0ZW1SZWNvcmRMaXN0ID0gdGhpcy5tYXAuZ2V0KGtleSk7XG4gICAgLy8gUmVtb3ZlIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMgd2hlbiBpdCBnZXRzIGVtcHR5XG4gICAgaWYgKHJlY29yZExpc3QucmVtb3ZlKHJlY29yZCkpIHtcbiAgICAgIHRoaXMubWFwLmRlbGV0ZShrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVjb3JkO1xuICB9XG5cbiAgZ2V0IGlzRW1wdHkoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1hcC5zaXplID09PSAwOyB9XG5cbiAgY2xlYXIoKSB7IHRoaXMubWFwLmNsZWFyKCk7IH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gJ19EdXBsaWNhdGVNYXAoJyArIHN0cmluZ2lmeSh0aGlzLm1hcCkgKyAnKSc7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vZGlmZmVycy9kZWZhdWx0X2l0ZXJhYmxlX2RpZmZlci50c1xuICoqLyIsImltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBDT05TVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0NoYW5nZURldGVjdG9yUmVmfSBmcm9tICcuLi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmltcG9ydCB7UHJvdmlkZXIsIFNraXBTZWxmTWV0YWRhdGEsIE9wdGlvbmFsTWV0YWRhdGEsIEluamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcblxuLyoqXG4gKiBBIGRpZmZlciB0aGF0IHRyYWNrcyBjaGFuZ2VzIG1hZGUgdG8gYW4gb2JqZWN0IG92ZXIgdGltZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBLZXlWYWx1ZURpZmZlciB7XG4gIGRpZmYob2JqZWN0OiBPYmplY3QpO1xuICBvbkRlc3Ryb3koKTtcbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIGZhY3RvcnkgZm9yIHtAbGluayBLZXlWYWx1ZURpZmZlcn0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2V5VmFsdWVEaWZmZXJGYWN0b3J5IHtcbiAgc3VwcG9ydHMob2JqZWN0czogT2JqZWN0KTogYm9vbGVhbjtcbiAgY3JlYXRlKGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZik6IEtleVZhbHVlRGlmZmVyO1xufVxuXG4vKipcbiAqIEEgcmVwb3NpdG9yeSBvZiBkaWZmZXJlbnQgTWFwIGRpZmZpbmcgc3RyYXRlZ2llcyB1c2VkIGJ5IE5nQ2xhc3MsIE5nU3R5bGUsIGFuZCBvdGhlcnMuXG4gKi9cbkBJbmplY3RhYmxlKClcbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgS2V5VmFsdWVEaWZmZXJzIHtcbiAgY29uc3RydWN0b3IocHVibGljIGZhY3RvcmllczogS2V5VmFsdWVEaWZmZXJGYWN0b3J5W10pIHt9XG5cbiAgc3RhdGljIGNyZWF0ZShmYWN0b3JpZXM6IEtleVZhbHVlRGlmZmVyRmFjdG9yeVtdLCBwYXJlbnQ/OiBLZXlWYWx1ZURpZmZlcnMpOiBLZXlWYWx1ZURpZmZlcnMge1xuICAgIGlmIChpc1ByZXNlbnQocGFyZW50KSkge1xuICAgICAgdmFyIGNvcGllZCA9IExpc3RXcmFwcGVyLmNsb25lKHBhcmVudC5mYWN0b3JpZXMpO1xuICAgICAgZmFjdG9yaWVzID0gZmFjdG9yaWVzLmNvbmNhdChjb3BpZWQpO1xuICAgICAgcmV0dXJuIG5ldyBLZXlWYWx1ZURpZmZlcnMoZmFjdG9yaWVzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBLZXlWYWx1ZURpZmZlcnMoZmFjdG9yaWVzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGFrZXMgYW4gYXJyYXkgb2Yge0BsaW5rIEtleVZhbHVlRGlmZmVyRmFjdG9yeX0gYW5kIHJldHVybnMgYSBwcm92aWRlciB1c2VkIHRvIGV4dGVuZCB0aGVcbiAgICogaW5oZXJpdGVkIHtAbGluayBLZXlWYWx1ZURpZmZlcnN9IGluc3RhbmNlIHdpdGggdGhlIHByb3ZpZGVkIGZhY3RvcmllcyBhbmQgcmV0dXJuIGEgbmV3XG4gICAqIHtAbGluayBLZXlWYWx1ZURpZmZlcnN9IGluc3RhbmNlLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGV4dGVuZCBhbiBleGlzdGluZyBsaXN0IG9mIGZhY3RvcmllcyxcbiAgICAgICAgICogd2hpY2ggd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIGluamVjdG9yIGZvciB0aGlzIGNvbXBvbmVudCBhbmQgaXRzIGNoaWxkcmVuLlxuICAgICAgICAgKiBUaGlzIHN0ZXAgaXMgYWxsIHRoYXQncyByZXF1aXJlZCB0byBtYWtlIGEgbmV3IHtAbGluayBLZXlWYWx1ZURpZmZlcn0gYXZhaWxhYmxlLlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgdmlld1Byb3ZpZGVyczogW1xuICAgKiAgICAgS2V5VmFsdWVEaWZmZXJzLmV4dGVuZChbbmV3IEltbXV0YWJsZU1hcERpZmZlcigpXSlcbiAgICogICBdXG4gICAqIH0pXG4gICAqIGBgYFxuICAgKi9cbiAgc3RhdGljIGV4dGVuZChmYWN0b3JpZXM6IEtleVZhbHVlRGlmZmVyRmFjdG9yeVtdKTogUHJvdmlkZXIge1xuICAgIHJldHVybiBuZXcgUHJvdmlkZXIoS2V5VmFsdWVEaWZmZXJzLCB7XG4gICAgICB1c2VGYWN0b3J5OiAocGFyZW50OiBLZXlWYWx1ZURpZmZlcnMpID0+IHtcbiAgICAgICAgaWYgKGlzQmxhbmsocGFyZW50KSkge1xuICAgICAgICAgIC8vIFR5cGljYWxseSB3b3VsZCBvY2N1ciB3aGVuIGNhbGxpbmcgS2V5VmFsdWVEaWZmZXJzLmV4dGVuZCBpbnNpZGUgb2YgZGVwZW5kZW5jaWVzIHBhc3NlZFxuICAgICAgICAgIC8vIHRvXG4gICAgICAgICAgLy8gYm9vdHN0cmFwKCksIHdoaWNoIHdvdWxkIG92ZXJyaWRlIGRlZmF1bHQgcGlwZXMgaW5zdGVhZCBvZiBleHRlbmRpbmcgdGhlbS5cbiAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignQ2Fubm90IGV4dGVuZCBLZXlWYWx1ZURpZmZlcnMgd2l0aG91dCBhIHBhcmVudCBpbmplY3RvcicpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBLZXlWYWx1ZURpZmZlcnMuY3JlYXRlKGZhY3RvcmllcywgcGFyZW50KTtcbiAgICAgIH0sXG4gICAgICAvLyBEZXBlbmRlbmN5IHRlY2huaWNhbGx5IGlzbid0IG9wdGlvbmFsLCBidXQgd2UgY2FuIHByb3ZpZGUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGlzIHdheS5cbiAgICAgIGRlcHM6IFtbS2V5VmFsdWVEaWZmZXJzLCBuZXcgU2tpcFNlbGZNZXRhZGF0YSgpLCBuZXcgT3B0aW9uYWxNZXRhZGF0YSgpXV1cbiAgICB9KTtcbiAgfVxuXG4gIGZpbmQoa3Y6IE9iamVjdCk6IEtleVZhbHVlRGlmZmVyRmFjdG9yeSB7XG4gICAgdmFyIGZhY3RvcnkgPSB0aGlzLmZhY3Rvcmllcy5maW5kKGYgPT4gZi5zdXBwb3J0cyhrdikpO1xuICAgIGlmIChpc1ByZXNlbnQoZmFjdG9yeSkpIHtcbiAgICAgIHJldHVybiBmYWN0b3J5O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ2Fubm90IGZpbmQgYSBkaWZmZXIgc3VwcG9ydGluZyBvYmplY3QgJyR7a3Z9J2ApO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9kaWZmZXJzL2tleXZhbHVlX2RpZmZlcnMudHNcbiAqKi8iLCJpbXBvcnQge01hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge3N0cmluZ2lmeSwgbG9vc2VJZGVudGljYWwsIGlzSnNPYmplY3QsIENPTlNULCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZn0gZnJvbSAnLi4vY2hhbmdlX2RldGVjdG9yX3JlZic7XG5pbXBvcnQge0tleVZhbHVlRGlmZmVyLCBLZXlWYWx1ZURpZmZlckZhY3Rvcnl9IGZyb20gJy4uL2RpZmZlcnMva2V5dmFsdWVfZGlmZmVycyc7XG5cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgRGVmYXVsdEtleVZhbHVlRGlmZmVyRmFjdG9yeSBpbXBsZW1lbnRzIEtleVZhbHVlRGlmZmVyRmFjdG9yeSB7XG4gIHN1cHBvcnRzKG9iajogYW55KTogYm9vbGVhbiB7IHJldHVybiBvYmogaW5zdGFuY2VvZiBNYXAgfHwgaXNKc09iamVjdChvYmopOyB9XG5cbiAgY3JlYXRlKGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZik6IEtleVZhbHVlRGlmZmVyIHsgcmV0dXJuIG5ldyBEZWZhdWx0S2V5VmFsdWVEaWZmZXIoKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdEtleVZhbHVlRGlmZmVyIGltcGxlbWVudHMgS2V5VmFsdWVEaWZmZXIge1xuICBwcml2YXRlIF9yZWNvcmRzOiBNYXA8YW55LCBhbnk+ID0gbmV3IE1hcCgpO1xuICBwcml2YXRlIF9tYXBIZWFkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX3ByZXZpb3VzTWFwSGVhZDogS1ZDaGFuZ2VSZWNvcmQgPSBudWxsO1xuICBwcml2YXRlIF9jaGFuZ2VzSGVhZDogS1ZDaGFuZ2VSZWNvcmQgPSBudWxsO1xuICBwcml2YXRlIF9jaGFuZ2VzVGFpbDogS1ZDaGFuZ2VSZWNvcmQgPSBudWxsO1xuICBwcml2YXRlIF9hZGRpdGlvbnNIZWFkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX2FkZGl0aW9uc1RhaWw6IEtWQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgcHJpdmF0ZSBfcmVtb3ZhbHNIZWFkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIHByaXZhdGUgX3JlbW92YWxzVGFpbDogS1ZDaGFuZ2VSZWNvcmQgPSBudWxsO1xuXG4gIGdldCBpc0RpcnR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbnNIZWFkICE9PSBudWxsIHx8IHRoaXMuX2NoYW5nZXNIZWFkICE9PSBudWxsIHx8XG4gICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCAhPT0gbnVsbDtcbiAgfVxuXG4gIGZvckVhY2hJdGVtKGZuOiBGdW5jdGlvbikge1xuICAgIHZhciByZWNvcmQ6IEtWQ2hhbmdlUmVjb3JkO1xuICAgIGZvciAocmVjb3JkID0gdGhpcy5fbWFwSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHQpIHtcbiAgICAgIGZuKHJlY29yZCk7XG4gICAgfVxuICB9XG5cbiAgZm9yRWFjaFByZXZpb3VzSXRlbShmbjogRnVuY3Rpb24pIHtcbiAgICB2YXIgcmVjb3JkOiBLVkNoYW5nZVJlY29yZDtcbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3ByZXZpb3VzTWFwSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRQcmV2aW91cykge1xuICAgICAgZm4ocmVjb3JkKTtcbiAgICB9XG4gIH1cblxuICBmb3JFYWNoQ2hhbmdlZEl0ZW0oZm46IEZ1bmN0aW9uKSB7XG4gICAgdmFyIHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQ7XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9jaGFuZ2VzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRDaGFuZ2VkKSB7XG4gICAgICBmbihyZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGZvckVhY2hBZGRlZEl0ZW0oZm46IEZ1bmN0aW9uKSB7XG4gICAgdmFyIHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQ7XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7XG4gICAgICBmbihyZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGZvckVhY2hSZW1vdmVkSXRlbShmbjogRnVuY3Rpb24pIHtcbiAgICB2YXIgcmVjb3JkOiBLVkNoYW5nZVJlY29yZDtcbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3JlbW92YWxzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRSZW1vdmVkKSB7XG4gICAgICBmbihyZWNvcmQpO1xuICAgIH1cbiAgfVxuXG4gIGRpZmYobWFwOiBNYXA8YW55LCBhbnk+KTogYW55IHtcbiAgICBpZiAoaXNCbGFuayhtYXApKSBtYXAgPSBNYXBXcmFwcGVyLmNyZWF0ZUZyb21QYWlycyhbXSk7XG4gICAgaWYgKCEobWFwIGluc3RhbmNlb2YgTWFwIHx8IGlzSnNPYmplY3QobWFwKSkpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBFcnJvciB0cnlpbmcgdG8gZGlmZiAnJHttYXB9J2ApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNoZWNrKG1hcCkpIHtcbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBvbkRlc3Ryb3koKSB7fVxuXG4gIGNoZWNrKG1hcDogTWFwPGFueSwgYW55Pik6IGJvb2xlYW4ge1xuICAgIHRoaXMuX3Jlc2V0KCk7XG4gICAgdmFyIHJlY29yZHMgPSB0aGlzLl9yZWNvcmRzO1xuICAgIHZhciBvbGRTZXFSZWNvcmQ6IEtWQ2hhbmdlUmVjb3JkID0gdGhpcy5fbWFwSGVhZDtcbiAgICB2YXIgbGFzdE9sZFNlcVJlY29yZDogS1ZDaGFuZ2VSZWNvcmQgPSBudWxsO1xuICAgIHZhciBsYXN0TmV3U2VxUmVjb3JkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gICAgdmFyIHNlcUNoYW5nZWQ6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHRoaXMuX2ZvckVhY2gobWFwLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgdmFyIG5ld1NlcVJlY29yZDtcbiAgICAgIGlmIChvbGRTZXFSZWNvcmQgIT09IG51bGwgJiYga2V5ID09PSBvbGRTZXFSZWNvcmQua2V5KSB7XG4gICAgICAgIG5ld1NlcVJlY29yZCA9IG9sZFNlcVJlY29yZDtcbiAgICAgICAgaWYgKCFsb29zZUlkZW50aWNhbCh2YWx1ZSwgb2xkU2VxUmVjb3JkLmN1cnJlbnRWYWx1ZSkpIHtcbiAgICAgICAgICBvbGRTZXFSZWNvcmQucHJldmlvdXNWYWx1ZSA9IG9sZFNlcVJlY29yZC5jdXJyZW50VmFsdWU7XG4gICAgICAgICAgb2xkU2VxUmVjb3JkLmN1cnJlbnRWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgIHRoaXMuX2FkZFRvQ2hhbmdlcyhvbGRTZXFSZWNvcmQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXFDaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgaWYgKG9sZFNlcVJlY29yZCAhPT0gbnVsbCkge1xuICAgICAgICAgIG9sZFNlcVJlY29yZC5fbmV4dCA9IG51bGw7XG4gICAgICAgICAgdGhpcy5fcmVtb3ZlRnJvbVNlcShsYXN0T2xkU2VxUmVjb3JkLCBvbGRTZXFSZWNvcmQpO1xuICAgICAgICAgIHRoaXMuX2FkZFRvUmVtb3ZhbHMob2xkU2VxUmVjb3JkKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVjb3Jkcy5oYXMoa2V5KSkge1xuICAgICAgICAgIG5ld1NlcVJlY29yZCA9IHJlY29yZHMuZ2V0KGtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmV3U2VxUmVjb3JkID0gbmV3IEtWQ2hhbmdlUmVjb3JkKGtleSk7XG4gICAgICAgICAgcmVjb3Jkcy5zZXQoa2V5LCBuZXdTZXFSZWNvcmQpO1xuICAgICAgICAgIG5ld1NlcVJlY29yZC5jdXJyZW50VmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICB0aGlzLl9hZGRUb0FkZGl0aW9ucyhuZXdTZXFSZWNvcmQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzZXFDaGFuZ2VkKSB7XG4gICAgICAgIGlmICh0aGlzLl9pc0luUmVtb3ZhbHMobmV3U2VxUmVjb3JkKSkge1xuICAgICAgICAgIHRoaXMuX3JlbW92ZUZyb21SZW1vdmFscyhuZXdTZXFSZWNvcmQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsYXN0TmV3U2VxUmVjb3JkID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLl9tYXBIZWFkID0gbmV3U2VxUmVjb3JkO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxhc3ROZXdTZXFSZWNvcmQuX25leHQgPSBuZXdTZXFSZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGxhc3RPbGRTZXFSZWNvcmQgPSBvbGRTZXFSZWNvcmQ7XG4gICAgICBsYXN0TmV3U2VxUmVjb3JkID0gbmV3U2VxUmVjb3JkO1xuICAgICAgb2xkU2VxUmVjb3JkID0gb2xkU2VxUmVjb3JkID09PSBudWxsID8gbnVsbCA6IG9sZFNlcVJlY29yZC5fbmV4dDtcbiAgICB9KTtcbiAgICB0aGlzLl90cnVuY2F0ZShsYXN0T2xkU2VxUmVjb3JkLCBvbGRTZXFSZWNvcmQpO1xuICAgIHJldHVybiB0aGlzLmlzRGlydHk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9yZXNldCgpIHtcbiAgICBpZiAodGhpcy5pc0RpcnR5KSB7XG4gICAgICB2YXIgcmVjb3JkOiBLVkNoYW5nZVJlY29yZDtcbiAgICAgIC8vIFJlY29yZCB0aGUgc3RhdGUgb2YgdGhlIG1hcHBpbmdcbiAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNNYXBIZWFkID0gdGhpcy5fbWFwSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHQpIHtcbiAgICAgICAgcmVjb3JkLl9uZXh0UHJldmlvdXMgPSByZWNvcmQuX25leHQ7XG4gICAgICB9XG5cbiAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fY2hhbmdlc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0Q2hhbmdlZCkge1xuICAgICAgICByZWNvcmQucHJldmlvdXNWYWx1ZSA9IHJlY29yZC5jdXJyZW50VmFsdWU7XG4gICAgICB9XG5cbiAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fYWRkaXRpb25zSGVhZDsgcmVjb3JkICE9IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7XG4gICAgICAgIHJlY29yZC5wcmV2aW91c1ZhbHVlID0gcmVjb3JkLmN1cnJlbnRWYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gdG9kbyh2aWNiKSBvbmNlIGFzc2VydCBpcyBzdXBwb3J0ZWRcbiAgICAgIC8vIGFzc2VydCgoKSB7XG4gICAgICAvLyAgdmFyIHIgPSBfY2hhbmdlc0hlYWQ7XG4gICAgICAvLyAgd2hpbGUgKHIgIT0gbnVsbCkge1xuICAgICAgLy8gICAgdmFyIG5leHRSZWNvcmQgPSByLl9uZXh0Q2hhbmdlZDtcbiAgICAgIC8vICAgIHIuX25leHRDaGFuZ2VkID0gbnVsbDtcbiAgICAgIC8vICAgIHIgPSBuZXh0UmVjb3JkO1xuICAgICAgLy8gIH1cbiAgICAgIC8vXG4gICAgICAvLyAgciA9IF9hZGRpdGlvbnNIZWFkO1xuICAgICAgLy8gIHdoaWxlIChyICE9IG51bGwpIHtcbiAgICAgIC8vICAgIHZhciBuZXh0UmVjb3JkID0gci5fbmV4dEFkZGVkO1xuICAgICAgLy8gICAgci5fbmV4dEFkZGVkID0gbnVsbDtcbiAgICAgIC8vICAgIHIgPSBuZXh0UmVjb3JkO1xuICAgICAgLy8gIH1cbiAgICAgIC8vXG4gICAgICAvLyAgciA9IF9yZW1vdmFsc0hlYWQ7XG4gICAgICAvLyAgd2hpbGUgKHIgIT0gbnVsbCkge1xuICAgICAgLy8gICAgdmFyIG5leHRSZWNvcmQgPSByLl9uZXh0UmVtb3ZlZDtcbiAgICAgIC8vICAgIHIuX25leHRSZW1vdmVkID0gbnVsbDtcbiAgICAgIC8vICAgIHIgPSBuZXh0UmVjb3JkO1xuICAgICAgLy8gIH1cbiAgICAgIC8vXG4gICAgICAvLyAgcmV0dXJuIHRydWU7XG4gICAgICAvL30pO1xuICAgICAgdGhpcy5fY2hhbmdlc0hlYWQgPSB0aGlzLl9jaGFuZ2VzVGFpbCA9IG51bGw7XG4gICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gdGhpcy5fYWRkaXRpb25zVGFpbCA9IG51bGw7XG4gICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgPSB0aGlzLl9yZW1vdmFsc1RhaWwgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3RydW5jYXRlKGxhc3RSZWNvcmQ6IEtWQ2hhbmdlUmVjb3JkLCByZWNvcmQ6IEtWQ2hhbmdlUmVjb3JkKSB7XG4gICAgd2hpbGUgKHJlY29yZCAhPT0gbnVsbCkge1xuICAgICAgaWYgKGxhc3RSZWNvcmQgPT09IG51bGwpIHtcbiAgICAgICAgdGhpcy5fbWFwSGVhZCA9IG51bGw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXN0UmVjb3JkLl9uZXh0ID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHZhciBuZXh0UmVjb3JkID0gcmVjb3JkLl9uZXh0O1xuICAgICAgLy8gdG9kbyh2aWNiKSBhc3NlcnRcbiAgICAgIC8vIGFzc2VydCgoKCkge1xuICAgICAgLy8gIHJlY29yZC5fbmV4dCA9IG51bGw7XG4gICAgICAvLyAgcmV0dXJuIHRydWU7XG4gICAgICAvL30pKTtcbiAgICAgIHRoaXMuX2FkZFRvUmVtb3ZhbHMocmVjb3JkKTtcbiAgICAgIGxhc3RSZWNvcmQgPSByZWNvcmQ7XG4gICAgICByZWNvcmQgPSBuZXh0UmVjb3JkO1xuICAgIH1cblxuICAgIGZvciAodmFyIHJlYzogS1ZDaGFuZ2VSZWNvcmQgPSB0aGlzLl9yZW1vdmFsc0hlYWQ7IHJlYyAhPT0gbnVsbDsgcmVjID0gcmVjLl9uZXh0UmVtb3ZlZCkge1xuICAgICAgcmVjLnByZXZpb3VzVmFsdWUgPSByZWMuY3VycmVudFZhbHVlO1xuICAgICAgcmVjLmN1cnJlbnRWYWx1ZSA9IG51bGw7XG4gICAgICB0aGlzLl9yZWNvcmRzLmRlbGV0ZShyZWMua2V5KTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9pc0luUmVtb3ZhbHMocmVjb3JkOiBLVkNoYW5nZVJlY29yZCkge1xuICAgIHJldHVybiByZWNvcmQgPT09IHRoaXMuX3JlbW92YWxzSGVhZCB8fCByZWNvcmQuX25leHRSZW1vdmVkICE9PSBudWxsIHx8XG4gICAgICAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgIT09IG51bGw7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9hZGRUb1JlbW92YWxzKHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQpIHtcbiAgICAvLyB0b2RvKHZpY2IpIGFzc2VydFxuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHQgPT0gbnVsbCk7XG4gICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dEFkZGVkID09IG51bGwpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRDaGFuZ2VkID09IG51bGwpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRSZW1vdmVkID09IG51bGwpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX3ByZXZSZW1vdmVkID09IG51bGwpO1xuICAgIGlmICh0aGlzLl9yZW1vdmFsc0hlYWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IHRoaXMuX3JlbW92YWxzVGFpbCA9IHJlY29yZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZCA9IHJlY29yZDtcbiAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSB0aGlzLl9yZW1vdmFsc1RhaWw7XG4gICAgICB0aGlzLl9yZW1vdmFsc1RhaWwgPSByZWNvcmQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcmVtb3ZlRnJvbVNlcShwcmV2OiBLVkNoYW5nZVJlY29yZCwgcmVjb3JkOiBLVkNoYW5nZVJlY29yZCkge1xuICAgIHZhciBuZXh0ID0gcmVjb3JkLl9uZXh0O1xuICAgIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9tYXBIZWFkID0gbmV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJldi5fbmV4dCA9IG5leHQ7XG4gICAgfVxuICAgIC8vIHRvZG8odmljYikgYXNzZXJ0XG4gICAgLy8gYXNzZXJ0KCgoKSB7XG4gICAgLy8gIHJlY29yZC5fbmV4dCA9IG51bGw7XG4gICAgLy8gIHJldHVybiB0cnVlO1xuICAgIC8vfSkoKSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9yZW1vdmVGcm9tUmVtb3ZhbHMocmVjb3JkOiBLVkNoYW5nZVJlY29yZCkge1xuICAgIC8vIHRvZG8odmljYikgYXNzZXJ0XG4gICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0QWRkZWQgPT0gbnVsbCk7XG4gICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dENoYW5nZWQgPT0gbnVsbCk7XG5cbiAgICB2YXIgcHJldiA9IHJlY29yZC5fcHJldlJlbW92ZWQ7XG4gICAgdmFyIG5leHQgPSByZWNvcmQuX25leHRSZW1vdmVkO1xuICAgIGlmIChwcmV2ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgPSBuZXh0O1xuICAgIH0gZWxzZSB7XG4gICAgICBwcmV2Ll9uZXh0UmVtb3ZlZCA9IG5leHQ7XG4gICAgfVxuICAgIGlmIChuZXh0ID09PSBudWxsKSB7XG4gICAgICB0aGlzLl9yZW1vdmFsc1RhaWwgPSBwcmV2O1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Ll9wcmV2UmVtb3ZlZCA9IHByZXY7XG4gICAgfVxuICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSByZWNvcmQuX25leHRSZW1vdmVkID0gbnVsbDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FkZFRvQWRkaXRpb25zKHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQpIHtcbiAgICAvLyB0b2RvKHZpY2IpOiBhc3NlcnRcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0ID09IG51bGwpO1xuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRBZGRlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0Q2hhbmdlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0UmVtb3ZlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9wcmV2UmVtb3ZlZCA9PSBudWxsKTtcbiAgICBpZiAodGhpcy5fYWRkaXRpb25zSGVhZCA9PT0gbnVsbCkge1xuICAgICAgdGhpcy5fYWRkaXRpb25zSGVhZCA9IHRoaXMuX2FkZGl0aW9uc1RhaWwgPSByZWNvcmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FkZGl0aW9uc1RhaWwuX25leHRBZGRlZCA9IHJlY29yZDtcbiAgICAgIHRoaXMuX2FkZGl0aW9uc1RhaWwgPSByZWNvcmQ7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfYWRkVG9DaGFuZ2VzKHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQpIHtcbiAgICAvLyB0b2RvKHZpY2IpIGFzc2VydFxuICAgIC8vIGFzc2VydChyZWNvcmQuX25leHRBZGRlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0Q2hhbmdlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0UmVtb3ZlZCA9PSBudWxsKTtcbiAgICAvLyBhc3NlcnQocmVjb3JkLl9wcmV2UmVtb3ZlZCA9PSBudWxsKTtcbiAgICBpZiAodGhpcy5fY2hhbmdlc0hlYWQgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2NoYW5nZXNIZWFkID0gdGhpcy5fY2hhbmdlc1RhaWwgPSByZWNvcmQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2NoYW5nZXNUYWlsLl9uZXh0Q2hhbmdlZCA9IHJlY29yZDtcbiAgICAgIHRoaXMuX2NoYW5nZXNUYWlsID0gcmVjb3JkO1xuICAgIH1cbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgdmFyIGl0ZW1zID0gW107XG4gICAgdmFyIHByZXZpb3VzID0gW107XG4gICAgdmFyIGNoYW5nZXMgPSBbXTtcbiAgICB2YXIgYWRkaXRpb25zID0gW107XG4gICAgdmFyIHJlbW92YWxzID0gW107XG4gICAgdmFyIHJlY29yZDogS1ZDaGFuZ2VSZWNvcmQ7XG5cbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21hcEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7XG4gICAgICBpdGVtcy5wdXNoKHN0cmluZ2lmeShyZWNvcmQpKTtcbiAgICB9XG4gICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c01hcEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UHJldmlvdXMpIHtcbiAgICAgIHByZXZpb3VzLnB1c2goc3RyaW5naWZ5KHJlY29yZCkpO1xuICAgIH1cbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2NoYW5nZXNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dENoYW5nZWQpIHtcbiAgICAgIGNoYW5nZXMucHVzaChzdHJpbmdpZnkocmVjb3JkKSk7XG4gICAgfVxuICAgIGZvciAocmVjb3JkID0gdGhpcy5fYWRkaXRpb25zSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRBZGRlZCkge1xuICAgICAgYWRkaXRpb25zLnB1c2goc3RyaW5naWZ5KHJlY29yZCkpO1xuICAgIH1cbiAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3JlbW92YWxzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRSZW1vdmVkKSB7XG4gICAgICByZW1vdmFscy5wdXNoKHN0cmluZ2lmeShyZWNvcmQpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gXCJtYXA6IFwiICsgaXRlbXMuam9pbignLCAnKSArIFwiXFxuXCIgKyBcInByZXZpb3VzOiBcIiArIHByZXZpb3VzLmpvaW4oJywgJykgKyBcIlxcblwiICtcbiAgICAgICAgICAgXCJhZGRpdGlvbnM6IFwiICsgYWRkaXRpb25zLmpvaW4oJywgJykgKyBcIlxcblwiICsgXCJjaGFuZ2VzOiBcIiArIGNoYW5nZXMuam9pbignLCAnKSArIFwiXFxuXCIgK1xuICAgICAgICAgICBcInJlbW92YWxzOiBcIiArIHJlbW92YWxzLmpvaW4oJywgJykgKyBcIlxcblwiO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZm9yRWFjaChvYmosIGZuOiBGdW5jdGlvbikge1xuICAgIGlmIChvYmogaW5zdGFuY2VvZiBNYXApIHtcbiAgICAgICg8TWFwPGFueSwgYW55Pj5vYmopLmZvckVhY2goPGFueT5mbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChvYmosIGZuKTtcbiAgICB9XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgS1ZDaGFuZ2VSZWNvcmQge1xuICBwcmV2aW91c1ZhbHVlOiBhbnkgPSBudWxsO1xuICBjdXJyZW50VmFsdWU6IGFueSA9IG51bGw7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbmV4dFByZXZpb3VzOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25leHQ6IEtWQ2hhbmdlUmVjb3JkID0gbnVsbDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbmV4dEFkZGVkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25leHRSZW1vdmVkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ByZXZSZW1vdmVkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25leHRDaGFuZ2VkOiBLVkNoYW5nZVJlY29yZCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGtleTogYW55KSB7fVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGxvb3NlSWRlbnRpY2FsKHRoaXMucHJldmlvdXNWYWx1ZSwgdGhpcy5jdXJyZW50VmFsdWUpID9cbiAgICAgICAgICAgICAgIHN0cmluZ2lmeSh0aGlzLmtleSkgOlxuICAgICAgICAgICAgICAgKHN0cmluZ2lmeSh0aGlzLmtleSkgKyAnWycgKyBzdHJpbmdpZnkodGhpcy5wcmV2aW91c1ZhbHVlKSArICctPicgK1xuICAgICAgICAgICAgICAgIHN0cmluZ2lmeSh0aGlzLmN1cnJlbnRWYWx1ZSkgKyAnXScpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2RpZmZlcnMvZGVmYXVsdF9rZXl2YWx1ZV9kaWZmZXIudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uXCI7XG5cbmV4cG9ydCBjbGFzcyBBU1Qge1xuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIG51bGw7IH1cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIFwiQVNUXCI7IH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcXVvdGVkIGV4cHJlc3Npb24gb2YgdGhlIGZvcm06XG4gKlxuICogcXVvdGUgPSBwcmVmaXggYDpgIHVuaW50ZXJwcmV0ZWRFeHByZXNzaW9uXG4gKiBwcmVmaXggPSBpZGVudGlmaWVyXG4gKiB1bmludGVycHJldGVkRXhwcmVzc2lvbiA9IGFyYml0cmFyeSBzdHJpbmdcbiAqXG4gKiBBIHF1b3RlZCBleHByZXNzaW9uIGlzIG1lYW50IHRvIGJlIHByZS1wcm9jZXNzZWQgYnkgYW4gQVNUIHRyYW5zZm9ybWVyIHRoYXRcbiAqIGNvbnZlcnRzIGl0IGludG8gYW5vdGhlciBBU1QgdGhhdCBubyBsb25nZXIgY29udGFpbnMgcXVvdGVkIGV4cHJlc3Npb25zLlxuICogSXQgaXMgbWVhbnQgdG8gYWxsb3cgdGhpcmQtcGFydHkgZGV2ZWxvcGVycyB0byBleHRlbmQgQW5ndWxhciB0ZW1wbGF0ZVxuICogZXhwcmVzc2lvbiBsYW5ndWFnZS4gVGhlIGB1bmludGVycHJldGVkRXhwcmVzc2lvbmAgcGFydCBvZiB0aGUgcXVvdGUgaXNcbiAqIHRoZXJlZm9yZSBub3QgaW50ZXJwcmV0ZWQgYnkgdGhlIEFuZ3VsYXIncyBvd24gZXhwcmVzc2lvbiBwYXJzZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBRdW90ZSBleHRlbmRzIEFTVCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwcmVmaXg6IHN0cmluZywgcHVibGljIHVuaW50ZXJwcmV0ZWRFeHByZXNzaW9uOiBzdHJpbmcsIHB1YmxpYyBsb2NhdGlvbjogYW55KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRRdW90ZSh0aGlzKTsgfVxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gXCJRdW90ZVwiOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbXB0eUV4cHIgZXh0ZW5kcyBBU1Qge1xuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKSB7XG4gICAgLy8gZG8gbm90aGluZ1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbXBsaWNpdFJlY2VpdmVyIGV4dGVuZHMgQVNUIHtcbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0SW1wbGljaXRSZWNlaXZlcih0aGlzKTsgfVxufVxuXG4vKipcbiAqIE11bHRpcGxlIGV4cHJlc3Npb25zIHNlcGFyYXRlZCBieSBhIHNlbWljb2xvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYWluIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIGV4cHJlc3Npb25zOiBhbnlbXSkgeyBzdXBlcigpOyB9XG4gIHZpc2l0KHZpc2l0b3I6IEFzdFZpc2l0b3IpOiBhbnkgeyByZXR1cm4gdmlzaXRvci52aXNpdENoYWluKHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb25kaXRpb25hbCBleHRlbmRzIEFTVCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb25kaXRpb246IEFTVCwgcHVibGljIHRydWVFeHA6IEFTVCwgcHVibGljIGZhbHNlRXhwOiBBU1QpIHsgc3VwZXIoKTsgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRDb25kaXRpb25hbCh0aGlzKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgUHJvcGVydHlSZWFkIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlY2VpdmVyOiBBU1QsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBnZXR0ZXI6IEZ1bmN0aW9uKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0UHJvcGVydHlSZWFkKHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9wZXJ0eVdyaXRlIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlY2VpdmVyOiBBU1QsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBzZXR0ZXI6IEZ1bmN0aW9uLFxuICAgICAgICAgICAgICBwdWJsaWMgdmFsdWU6IEFTVCkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0UHJvcGVydHlXcml0ZSh0aGlzKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgU2FmZVByb3BlcnR5UmVhZCBleHRlbmRzIEFTVCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWNlaXZlcjogQVNULCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgZ2V0dGVyOiBGdW5jdGlvbikgeyBzdXBlcigpOyB9XG4gIHZpc2l0KHZpc2l0b3I6IEFzdFZpc2l0b3IpOiBhbnkgeyByZXR1cm4gdmlzaXRvci52aXNpdFNhZmVQcm9wZXJ0eVJlYWQodGhpcyk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIEtleWVkUmVhZCBleHRlbmRzIEFTVCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBvYmo6IEFTVCwgcHVibGljIGtleTogQVNUKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0S2V5ZWRSZWFkKHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBLZXllZFdyaXRlIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIG9iajogQVNULCBwdWJsaWMga2V5OiBBU1QsIHB1YmxpYyB2YWx1ZTogQVNUKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0S2V5ZWRXcml0ZSh0aGlzKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgQmluZGluZ1BpcGUgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXhwOiBBU1QsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBhcmdzOiBhbnlbXSkgeyBzdXBlcigpOyB9XG4gIHZpc2l0KHZpc2l0b3I6IEFzdFZpc2l0b3IpOiBhbnkgeyByZXR1cm4gdmlzaXRvci52aXNpdFBpcGUodGhpcyk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIExpdGVyYWxQcmltaXRpdmUgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWUpIHsgc3VwZXIoKTsgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRMaXRlcmFsUHJpbWl0aXZlKHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXRlcmFsQXJyYXkgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXhwcmVzc2lvbnM6IGFueVtdKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0TGl0ZXJhbEFycmF5KHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBMaXRlcmFsTWFwIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIGtleXM6IGFueVtdLCBwdWJsaWMgdmFsdWVzOiBhbnlbXSkgeyBzdXBlcigpOyB9XG4gIHZpc2l0KHZpc2l0b3I6IEFzdFZpc2l0b3IpOiBhbnkgeyByZXR1cm4gdmlzaXRvci52aXNpdExpdGVyYWxNYXAodGhpcyk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIEludGVycG9sYXRpb24gZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc3RyaW5nczogYW55W10sIHB1YmxpYyBleHByZXNzaW9uczogYW55W10pIHsgc3VwZXIoKTsgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRJbnRlcnBvbGF0aW9uKHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBCaW5hcnkgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgb3BlcmF0aW9uOiBzdHJpbmcsIHB1YmxpYyBsZWZ0OiBBU1QsIHB1YmxpYyByaWdodDogQVNUKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0QmluYXJ5KHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcmVmaXhOb3QgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXhwcmVzc2lvbjogQVNUKSB7IHN1cGVyKCk7IH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0UHJlZml4Tm90KHRoaXMpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBNZXRob2RDYWxsIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlY2VpdmVyOiBBU1QsIHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBmbjogRnVuY3Rpb24sIHB1YmxpYyBhcmdzOiBhbnlbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgdmlzaXQodmlzaXRvcjogQXN0VmlzaXRvcik6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0TWV0aG9kQ2FsbCh0aGlzKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgU2FmZU1ldGhvZENhbGwgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVjZWl2ZXI6IEFTVCwgcHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIGZuOiBGdW5jdGlvbiwgcHVibGljIGFyZ3M6IGFueVtdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRTYWZlTWV0aG9kQ2FsbCh0aGlzKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25DYWxsIGV4dGVuZHMgQVNUIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRhcmdldDogQVNULCBwdWJsaWMgYXJnczogYW55W10pIHsgc3VwZXIoKTsgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRGdW5jdGlvbkNhbGwodGhpcyk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIEFTVFdpdGhTb3VyY2UgZXh0ZW5kcyBBU1Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYXN0OiBBU1QsIHB1YmxpYyBzb3VyY2U6IHN0cmluZywgcHVibGljIGxvY2F0aW9uOiBzdHJpbmcpIHsgc3VwZXIoKTsgfVxuICB2aXNpdCh2aXNpdG9yOiBBc3RWaXNpdG9yKTogYW55IHsgcmV0dXJuIHRoaXMuYXN0LnZpc2l0KHZpc2l0b3IpOyB9XG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiBgJHt0aGlzLnNvdXJjZX0gaW4gJHt0aGlzLmxvY2F0aW9ufWA7IH1cbn1cblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlQmluZGluZyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBrZXk6IHN0cmluZywgcHVibGljIGtleUlzVmFyOiBib29sZWFuLCBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICBwdWJsaWMgZXhwcmVzc2lvbjogQVNUV2l0aFNvdXJjZSkge31cbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3RWaXNpdG9yIHtcbiAgdmlzaXRCaW5hcnkoYXN0OiBCaW5hcnkpOiBhbnk7XG4gIHZpc2l0Q2hhaW4oYXN0OiBDaGFpbik6IGFueTtcbiAgdmlzaXRDb25kaXRpb25hbChhc3Q6IENvbmRpdGlvbmFsKTogYW55O1xuICB2aXNpdEZ1bmN0aW9uQ2FsbChhc3Q6IEZ1bmN0aW9uQ2FsbCk6IGFueTtcbiAgdmlzaXRJbXBsaWNpdFJlY2VpdmVyKGFzdDogSW1wbGljaXRSZWNlaXZlcik6IGFueTtcbiAgdmlzaXRJbnRlcnBvbGF0aW9uKGFzdDogSW50ZXJwb2xhdGlvbik6IGFueTtcbiAgdmlzaXRLZXllZFJlYWQoYXN0OiBLZXllZFJlYWQpOiBhbnk7XG4gIHZpc2l0S2V5ZWRXcml0ZShhc3Q6IEtleWVkV3JpdGUpOiBhbnk7XG4gIHZpc2l0TGl0ZXJhbEFycmF5KGFzdDogTGl0ZXJhbEFycmF5KTogYW55O1xuICB2aXNpdExpdGVyYWxNYXAoYXN0OiBMaXRlcmFsTWFwKTogYW55O1xuICB2aXNpdExpdGVyYWxQcmltaXRpdmUoYXN0OiBMaXRlcmFsUHJpbWl0aXZlKTogYW55O1xuICB2aXNpdE1ldGhvZENhbGwoYXN0OiBNZXRob2RDYWxsKTogYW55O1xuICB2aXNpdFBpcGUoYXN0OiBCaW5kaW5nUGlwZSk6IGFueTtcbiAgdmlzaXRQcmVmaXhOb3QoYXN0OiBQcmVmaXhOb3QpOiBhbnk7XG4gIHZpc2l0UHJvcGVydHlSZWFkKGFzdDogUHJvcGVydHlSZWFkKTogYW55O1xuICB2aXNpdFByb3BlcnR5V3JpdGUoYXN0OiBQcm9wZXJ0eVdyaXRlKTogYW55O1xuICB2aXNpdFF1b3RlKGFzdDogUXVvdGUpOiBhbnk7XG4gIHZpc2l0U2FmZU1ldGhvZENhbGwoYXN0OiBTYWZlTWV0aG9kQ2FsbCk6IGFueTtcbiAgdmlzaXRTYWZlUHJvcGVydHlSZWFkKGFzdDogU2FmZVByb3BlcnR5UmVhZCk6IGFueTtcbn1cblxuZXhwb3J0IGNsYXNzIFJlY3Vyc2l2ZUFzdFZpc2l0b3IgaW1wbGVtZW50cyBBc3RWaXNpdG9yIHtcbiAgdmlzaXRCaW5hcnkoYXN0OiBCaW5hcnkpOiBhbnkge1xuICAgIGFzdC5sZWZ0LnZpc2l0KHRoaXMpO1xuICAgIGFzdC5yaWdodC52aXNpdCh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdENoYWluKGFzdDogQ2hhaW4pOiBhbnkgeyByZXR1cm4gdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpOyB9XG4gIHZpc2l0Q29uZGl0aW9uYWwoYXN0OiBDb25kaXRpb25hbCk6IGFueSB7XG4gICAgYXN0LmNvbmRpdGlvbi52aXNpdCh0aGlzKTtcbiAgICBhc3QudHJ1ZUV4cC52aXNpdCh0aGlzKTtcbiAgICBhc3QuZmFsc2VFeHAudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRQaXBlKGFzdDogQmluZGluZ1BpcGUpOiBhbnkge1xuICAgIGFzdC5leHAudmlzaXQodGhpcyk7XG4gICAgdGhpcy52aXNpdEFsbChhc3QuYXJncyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRGdW5jdGlvbkNhbGwoYXN0OiBGdW5jdGlvbkNhbGwpOiBhbnkge1xuICAgIGFzdC50YXJnZXQudmlzaXQodGhpcyk7XG4gICAgdGhpcy52aXNpdEFsbChhc3QuYXJncyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRJbXBsaWNpdFJlY2VpdmVyKGFzdDogSW1wbGljaXRSZWNlaXZlcik6IGFueSB7IHJldHVybiBudWxsOyB9XG4gIHZpc2l0SW50ZXJwb2xhdGlvbihhc3Q6IEludGVycG9sYXRpb24pOiBhbnkgeyByZXR1cm4gdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpOyB9XG4gIHZpc2l0S2V5ZWRSZWFkKGFzdDogS2V5ZWRSZWFkKTogYW55IHtcbiAgICBhc3Qub2JqLnZpc2l0KHRoaXMpO1xuICAgIGFzdC5rZXkudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRLZXllZFdyaXRlKGFzdDogS2V5ZWRXcml0ZSk6IGFueSB7XG4gICAgYXN0Lm9iai52aXNpdCh0aGlzKTtcbiAgICBhc3Qua2V5LnZpc2l0KHRoaXMpO1xuICAgIGFzdC52YWx1ZS52aXNpdCh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdExpdGVyYWxBcnJheShhc3Q6IExpdGVyYWxBcnJheSk6IGFueSB7IHJldHVybiB0aGlzLnZpc2l0QWxsKGFzdC5leHByZXNzaW9ucyk7IH1cbiAgdmlzaXRMaXRlcmFsTWFwKGFzdDogTGl0ZXJhbE1hcCk6IGFueSB7IHJldHVybiB0aGlzLnZpc2l0QWxsKGFzdC52YWx1ZXMpOyB9XG4gIHZpc2l0TGl0ZXJhbFByaW1pdGl2ZShhc3Q6IExpdGVyYWxQcmltaXRpdmUpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxuICB2aXNpdE1ldGhvZENhbGwoYXN0OiBNZXRob2RDYWxsKTogYW55IHtcbiAgICBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MpO1xuICB9XG4gIHZpc2l0UHJlZml4Tm90KGFzdDogUHJlZml4Tm90KTogYW55IHtcbiAgICBhc3QuZXhwcmVzc2lvbi52aXNpdCh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdFByb3BlcnR5UmVhZChhc3Q6IFByb3BlcnR5UmVhZCk6IGFueSB7XG4gICAgYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0UHJvcGVydHlXcml0ZShhc3Q6IFByb3BlcnR5V3JpdGUpOiBhbnkge1xuICAgIGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICBhc3QudmFsdWUudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRTYWZlUHJvcGVydHlSZWFkKGFzdDogU2FmZVByb3BlcnR5UmVhZCk6IGFueSB7XG4gICAgYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0U2FmZU1ldGhvZENhbGwoYXN0OiBTYWZlTWV0aG9kQ2FsbCk6IGFueSB7XG4gICAgYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnZpc2l0QWxsKGFzdC5hcmdzKTtcbiAgfVxuICB2aXNpdEFsbChhc3RzOiBBU1RbXSk6IGFueSB7XG4gICAgYXN0cy5mb3JFYWNoKGFzdCA9PiBhc3QudmlzaXQodGhpcykpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0UXVvdGUoYXN0OiBRdW90ZSk6IGFueSB7IHJldHVybiBudWxsOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBBc3RUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIEFzdFZpc2l0b3Ige1xuICB2aXNpdEltcGxpY2l0UmVjZWl2ZXIoYXN0OiBJbXBsaWNpdFJlY2VpdmVyKTogQVNUIHsgcmV0dXJuIGFzdDsgfVxuXG4gIHZpc2l0SW50ZXJwb2xhdGlvbihhc3Q6IEludGVycG9sYXRpb24pOiBBU1Qge1xuICAgIHJldHVybiBuZXcgSW50ZXJwb2xhdGlvbihhc3Quc3RyaW5ncywgdGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpKTtcbiAgfVxuXG4gIHZpc2l0TGl0ZXJhbFByaW1pdGl2ZShhc3Q6IExpdGVyYWxQcmltaXRpdmUpOiBBU1QgeyByZXR1cm4gbmV3IExpdGVyYWxQcmltaXRpdmUoYXN0LnZhbHVlKTsgfVxuXG4gIHZpc2l0UHJvcGVydHlSZWFkKGFzdDogUHJvcGVydHlSZWFkKTogQVNUIHtcbiAgICByZXR1cm4gbmV3IFByb3BlcnR5UmVhZChhc3QucmVjZWl2ZXIudmlzaXQodGhpcyksIGFzdC5uYW1lLCBhc3QuZ2V0dGVyKTtcbiAgfVxuXG4gIHZpc2l0UHJvcGVydHlXcml0ZShhc3Q6IFByb3BlcnR5V3JpdGUpOiBBU1Qge1xuICAgIHJldHVybiBuZXcgUHJvcGVydHlXcml0ZShhc3QucmVjZWl2ZXIudmlzaXQodGhpcyksIGFzdC5uYW1lLCBhc3Quc2V0dGVyLCBhc3QudmFsdWUpO1xuICB9XG5cbiAgdmlzaXRTYWZlUHJvcGVydHlSZWFkKGFzdDogU2FmZVByb3BlcnR5UmVhZCk6IEFTVCB7XG4gICAgcmV0dXJuIG5ldyBTYWZlUHJvcGVydHlSZWFkKGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKSwgYXN0Lm5hbWUsIGFzdC5nZXR0ZXIpO1xuICB9XG5cbiAgdmlzaXRNZXRob2RDYWxsKGFzdDogTWV0aG9kQ2FsbCk6IEFTVCB7XG4gICAgcmV0dXJuIG5ldyBNZXRob2RDYWxsKGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKSwgYXN0Lm5hbWUsIGFzdC5mbiwgdGhpcy52aXNpdEFsbChhc3QuYXJncykpO1xuICB9XG5cbiAgdmlzaXRTYWZlTWV0aG9kQ2FsbChhc3Q6IFNhZmVNZXRob2RDYWxsKTogQVNUIHtcbiAgICByZXR1cm4gbmV3IFNhZmVNZXRob2RDYWxsKGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKSwgYXN0Lm5hbWUsIGFzdC5mbiwgdGhpcy52aXNpdEFsbChhc3QuYXJncykpO1xuICB9XG5cbiAgdmlzaXRGdW5jdGlvbkNhbGwoYXN0OiBGdW5jdGlvbkNhbGwpOiBBU1Qge1xuICAgIHJldHVybiBuZXcgRnVuY3Rpb25DYWxsKGFzdC50YXJnZXQudmlzaXQodGhpcyksIHRoaXMudmlzaXRBbGwoYXN0LmFyZ3MpKTtcbiAgfVxuXG4gIHZpc2l0TGl0ZXJhbEFycmF5KGFzdDogTGl0ZXJhbEFycmF5KTogQVNUIHtcbiAgICByZXR1cm4gbmV3IExpdGVyYWxBcnJheSh0aGlzLnZpc2l0QWxsKGFzdC5leHByZXNzaW9ucykpO1xuICB9XG5cbiAgdmlzaXRMaXRlcmFsTWFwKGFzdDogTGl0ZXJhbE1hcCk6IEFTVCB7XG4gICAgcmV0dXJuIG5ldyBMaXRlcmFsTWFwKGFzdC5rZXlzLCB0aGlzLnZpc2l0QWxsKGFzdC52YWx1ZXMpKTtcbiAgfVxuXG4gIHZpc2l0QmluYXJ5KGFzdDogQmluYXJ5KTogQVNUIHtcbiAgICByZXR1cm4gbmV3IEJpbmFyeShhc3Qub3BlcmF0aW9uLCBhc3QubGVmdC52aXNpdCh0aGlzKSwgYXN0LnJpZ2h0LnZpc2l0KHRoaXMpKTtcbiAgfVxuXG4gIHZpc2l0UHJlZml4Tm90KGFzdDogUHJlZml4Tm90KTogQVNUIHsgcmV0dXJuIG5ldyBQcmVmaXhOb3QoYXN0LmV4cHJlc3Npb24udmlzaXQodGhpcykpOyB9XG5cbiAgdmlzaXRDb25kaXRpb25hbChhc3Q6IENvbmRpdGlvbmFsKTogQVNUIHtcbiAgICByZXR1cm4gbmV3IENvbmRpdGlvbmFsKGFzdC5jb25kaXRpb24udmlzaXQodGhpcyksIGFzdC50cnVlRXhwLnZpc2l0KHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LmZhbHNlRXhwLnZpc2l0KHRoaXMpKTtcbiAgfVxuXG4gIHZpc2l0UGlwZShhc3Q6IEJpbmRpbmdQaXBlKTogQVNUIHtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdQaXBlKGFzdC5leHAudmlzaXQodGhpcyksIGFzdC5uYW1lLCB0aGlzLnZpc2l0QWxsKGFzdC5hcmdzKSk7XG4gIH1cblxuICB2aXNpdEtleWVkUmVhZChhc3Q6IEtleWVkUmVhZCk6IEFTVCB7XG4gICAgcmV0dXJuIG5ldyBLZXllZFJlYWQoYXN0Lm9iai52aXNpdCh0aGlzKSwgYXN0LmtleS52aXNpdCh0aGlzKSk7XG4gIH1cblxuICB2aXNpdEtleWVkV3JpdGUoYXN0OiBLZXllZFdyaXRlKTogQVNUIHtcbiAgICByZXR1cm4gbmV3IEtleWVkV3JpdGUoYXN0Lm9iai52aXNpdCh0aGlzKSwgYXN0LmtleS52aXNpdCh0aGlzKSwgYXN0LnZhbHVlLnZpc2l0KHRoaXMpKTtcbiAgfVxuXG4gIHZpc2l0QWxsKGFzdHM6IGFueVtdKTogYW55W10ge1xuICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUoYXN0cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN0cy5sZW5ndGg7ICsraSkge1xuICAgICAgcmVzW2ldID0gYXN0c1tpXS52aXNpdCh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIHZpc2l0Q2hhaW4oYXN0OiBDaGFpbik6IEFTVCB7IHJldHVybiBuZXcgQ2hhaW4odGhpcy52aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpKTsgfVxuXG4gIHZpc2l0UXVvdGUoYXN0OiBRdW90ZSk6IEFTVCB7XG4gICAgcmV0dXJuIG5ldyBRdW90ZShhc3QucHJlZml4LCBhc3QudW5pbnRlcnByZXRlZEV4cHJlc3Npb24sIGFzdC5sb2NhdGlvbik7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcGFyc2VyL2FzdC50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGkvZGVjb3JhdG9ycyc7XG5pbXBvcnQge0xpc3RXcmFwcGVyLCBTZXRXcmFwcGVyfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uXCI7XG5pbXBvcnQge051bWJlcldyYXBwZXIsIFN0cmluZ0pvaW5lciwgU3RyaW5nV3JhcHBlciwgaXNQcmVzZW50fSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nXCI7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5cbmV4cG9ydCBlbnVtIFRva2VuVHlwZSB7XG4gIENoYXJhY3RlcixcbiAgSWRlbnRpZmllcixcbiAgS2V5d29yZCxcbiAgU3RyaW5nLFxuICBPcGVyYXRvcixcbiAgTnVtYmVyXG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMZXhlciB7XG4gIHRva2VuaXplKHRleHQ6IHN0cmluZyk6IGFueVtdIHtcbiAgICB2YXIgc2Nhbm5lciA9IG5ldyBfU2Nhbm5lcih0ZXh0KTtcbiAgICB2YXIgdG9rZW5zID0gW107XG4gICAgdmFyIHRva2VuID0gc2Nhbm5lci5zY2FuVG9rZW4oKTtcbiAgICB3aGlsZSAodG9rZW4gIT0gbnVsbCkge1xuICAgICAgdG9rZW5zLnB1c2godG9rZW4pO1xuICAgICAgdG9rZW4gPSBzY2FubmVyLnNjYW5Ub2tlbigpO1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBUb2tlbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbmRleDogbnVtYmVyLCBwdWJsaWMgdHlwZTogVG9rZW5UeXBlLCBwdWJsaWMgbnVtVmFsdWU6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIHN0clZhbHVlOiBzdHJpbmcpIHt9XG5cbiAgaXNDaGFyYWN0ZXIoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLkNoYXJhY3RlciAmJiB0aGlzLm51bVZhbHVlID09IGNvZGUpO1xuICB9XG5cbiAgaXNOdW1iZXIoKTogYm9vbGVhbiB7IHJldHVybiAodGhpcy50eXBlID09IFRva2VuVHlwZS5OdW1iZXIpOyB9XG5cbiAgaXNTdHJpbmcoKTogYm9vbGVhbiB7IHJldHVybiAodGhpcy50eXBlID09IFRva2VuVHlwZS5TdHJpbmcpOyB9XG5cbiAgaXNPcGVyYXRvcihvcGVyYXRlcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICh0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLk9wZXJhdG9yICYmIHRoaXMuc3RyVmFsdWUgPT0gb3BlcmF0ZXIpO1xuICB9XG5cbiAgaXNJZGVudGlmaWVyKCk6IGJvb2xlYW4geyByZXR1cm4gKHRoaXMudHlwZSA9PSBUb2tlblR5cGUuSWRlbnRpZmllcik7IH1cblxuICBpc0tleXdvcmQoKTogYm9vbGVhbiB7IHJldHVybiAodGhpcy50eXBlID09IFRva2VuVHlwZS5LZXl3b3JkKTsgfVxuXG4gIGlzS2V5d29yZFZhcigpOiBib29sZWFuIHsgcmV0dXJuICh0aGlzLnR5cGUgPT0gVG9rZW5UeXBlLktleXdvcmQgJiYgdGhpcy5zdHJWYWx1ZSA9PSBcInZhclwiKTsgfVxuXG4gIGlzS2V5d29yZE51bGwoKTogYm9vbGVhbiB7IHJldHVybiAodGhpcy50eXBlID09IFRva2VuVHlwZS5LZXl3b3JkICYmIHRoaXMuc3RyVmFsdWUgPT0gXCJudWxsXCIpOyB9XG5cbiAgaXNLZXl3b3JkVW5kZWZpbmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy50eXBlID09IFRva2VuVHlwZS5LZXl3b3JkICYmIHRoaXMuc3RyVmFsdWUgPT0gXCJ1bmRlZmluZWRcIik7XG4gIH1cblxuICBpc0tleXdvcmRUcnVlKCk6IGJvb2xlYW4geyByZXR1cm4gKHRoaXMudHlwZSA9PSBUb2tlblR5cGUuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09IFwidHJ1ZVwiKTsgfVxuXG4gIGlzS2V5d29yZEZhbHNlKCk6IGJvb2xlYW4geyByZXR1cm4gKHRoaXMudHlwZSA9PSBUb2tlblR5cGUuS2V5d29yZCAmJiB0aGlzLnN0clZhbHVlID09IFwiZmFsc2VcIik7IH1cblxuICB0b051bWJlcigpOiBudW1iZXIge1xuICAgIC8vIC0xIGluc3RlYWQgb2YgTlVMTCBvaz9cbiAgICByZXR1cm4gKHRoaXMudHlwZSA9PSBUb2tlblR5cGUuTnVtYmVyKSA/IHRoaXMubnVtVmFsdWUgOiAtMTtcbiAgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgIGNhc2UgVG9rZW5UeXBlLkNoYXJhY3RlcjpcbiAgICAgIGNhc2UgVG9rZW5UeXBlLklkZW50aWZpZXI6XG4gICAgICBjYXNlIFRva2VuVHlwZS5LZXl3b3JkOlxuICAgICAgY2FzZSBUb2tlblR5cGUuT3BlcmF0b3I6XG4gICAgICBjYXNlIFRva2VuVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiB0aGlzLnN0clZhbHVlO1xuICAgICAgY2FzZSBUb2tlblR5cGUuTnVtYmVyOlxuICAgICAgICByZXR1cm4gdGhpcy5udW1WYWx1ZS50b1N0cmluZygpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIG5ld0NoYXJhY3RlclRva2VuKGluZGV4OiBudW1iZXIsIGNvZGU6IG51bWJlcik6IFRva2VuIHtcbiAgcmV0dXJuIG5ldyBUb2tlbihpbmRleCwgVG9rZW5UeXBlLkNoYXJhY3RlciwgY29kZSwgU3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUoY29kZSkpO1xufVxuXG5mdW5jdGlvbiBuZXdJZGVudGlmaWVyVG9rZW4oaW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nKTogVG9rZW4ge1xuICByZXR1cm4gbmV3IFRva2VuKGluZGV4LCBUb2tlblR5cGUuSWRlbnRpZmllciwgMCwgdGV4dCk7XG59XG5cbmZ1bmN0aW9uIG5ld0tleXdvcmRUb2tlbihpbmRleDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiBUb2tlbiB7XG4gIHJldHVybiBuZXcgVG9rZW4oaW5kZXgsIFRva2VuVHlwZS5LZXl3b3JkLCAwLCB0ZXh0KTtcbn1cblxuZnVuY3Rpb24gbmV3T3BlcmF0b3JUb2tlbihpbmRleDogbnVtYmVyLCB0ZXh0OiBzdHJpbmcpOiBUb2tlbiB7XG4gIHJldHVybiBuZXcgVG9rZW4oaW5kZXgsIFRva2VuVHlwZS5PcGVyYXRvciwgMCwgdGV4dCk7XG59XG5cbmZ1bmN0aW9uIG5ld1N0cmluZ1Rva2VuKGluZGV4OiBudW1iZXIsIHRleHQ6IHN0cmluZyk6IFRva2VuIHtcbiAgcmV0dXJuIG5ldyBUb2tlbihpbmRleCwgVG9rZW5UeXBlLlN0cmluZywgMCwgdGV4dCk7XG59XG5cbmZ1bmN0aW9uIG5ld051bWJlclRva2VuKGluZGV4OiBudW1iZXIsIG46IG51bWJlcik6IFRva2VuIHtcbiAgcmV0dXJuIG5ldyBUb2tlbihpbmRleCwgVG9rZW5UeXBlLk51bWJlciwgbiwgXCJcIik7XG59XG5cblxuZXhwb3J0IHZhciBFT0Y6IFRva2VuID0gbmV3IFRva2VuKC0xLCBUb2tlblR5cGUuQ2hhcmFjdGVyLCAwLCBcIlwiKTtcblxuZXhwb3J0IGNvbnN0ICRFT0YgPSAwO1xuZXhwb3J0IGNvbnN0ICRUQUIgPSA5O1xuZXhwb3J0IGNvbnN0ICRMRiA9IDEwO1xuZXhwb3J0IGNvbnN0ICRWVEFCID0gMTE7XG5leHBvcnQgY29uc3QgJEZGID0gMTI7XG5leHBvcnQgY29uc3QgJENSID0gMTM7XG5leHBvcnQgY29uc3QgJFNQQUNFID0gMzI7XG5leHBvcnQgY29uc3QgJEJBTkcgPSAzMztcbmV4cG9ydCBjb25zdCAkRFEgPSAzNDtcbmV4cG9ydCBjb25zdCAkSEFTSCA9IDM1O1xuZXhwb3J0IGNvbnN0ICQkID0gMzY7XG5leHBvcnQgY29uc3QgJFBFUkNFTlQgPSAzNztcbmV4cG9ydCBjb25zdCAkQU1QRVJTQU5EID0gMzg7XG5leHBvcnQgY29uc3QgJFNRID0gMzk7XG5leHBvcnQgY29uc3QgJExQQVJFTiA9IDQwO1xuZXhwb3J0IGNvbnN0ICRSUEFSRU4gPSA0MTtcbmV4cG9ydCBjb25zdCAkU1RBUiA9IDQyO1xuZXhwb3J0IGNvbnN0ICRQTFVTID0gNDM7XG5leHBvcnQgY29uc3QgJENPTU1BID0gNDQ7XG5leHBvcnQgY29uc3QgJE1JTlVTID0gNDU7XG5leHBvcnQgY29uc3QgJFBFUklPRCA9IDQ2O1xuZXhwb3J0IGNvbnN0ICRTTEFTSCA9IDQ3O1xuZXhwb3J0IGNvbnN0ICRDT0xPTiA9IDU4O1xuZXhwb3J0IGNvbnN0ICRTRU1JQ09MT04gPSA1OTtcbmV4cG9ydCBjb25zdCAkTFQgPSA2MDtcbmV4cG9ydCBjb25zdCAkRVEgPSA2MTtcbmV4cG9ydCBjb25zdCAkR1QgPSA2MjtcbmV4cG9ydCBjb25zdCAkUVVFU1RJT04gPSA2MztcblxuY29uc3QgJDAgPSA0ODtcbmNvbnN0ICQ5ID0gNTc7XG5cbmNvbnN0ICRBID0gNjUsICRFID0gNjksICRaID0gOTA7XG5cbmV4cG9ydCBjb25zdCAkTEJSQUNLRVQgPSA5MTtcbmV4cG9ydCBjb25zdCAkQkFDS1NMQVNIID0gOTI7XG5leHBvcnQgY29uc3QgJFJCUkFDS0VUID0gOTM7XG5jb25zdCAkQ0FSRVQgPSA5NDtcbmNvbnN0ICRfID0gOTU7XG5cbmNvbnN0ICRhID0gOTcsICRlID0gMTAxLCAkZiA9IDEwMiwgJG4gPSAxMTAsICRyID0gMTE0LCAkdCA9IDExNiwgJHUgPSAxMTcsICR2ID0gMTE4LCAkeiA9IDEyMjtcblxuZXhwb3J0IGNvbnN0ICRMQlJBQ0UgPSAxMjM7XG5leHBvcnQgY29uc3QgJEJBUiA9IDEyNDtcbmV4cG9ydCBjb25zdCAkUkJSQUNFID0gMTI1O1xuY29uc3QgJE5CU1AgPSAxNjA7XG5cblxuZXhwb3J0IGNsYXNzIFNjYW5uZXJFcnJvciBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbWVzc2FnZSkgeyBzdXBlcigpOyB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMubWVzc2FnZTsgfVxufVxuXG5jbGFzcyBfU2Nhbm5lciB7XG4gIGxlbmd0aDogbnVtYmVyO1xuICBwZWVrOiBudW1iZXIgPSAwO1xuICBpbmRleDogbnVtYmVyID0gLTE7XG5cbiAgY29uc3RydWN0b3IocHVibGljIGlucHV0OiBzdHJpbmcpIHtcbiAgICB0aGlzLmxlbmd0aCA9IGlucHV0Lmxlbmd0aDtcbiAgICB0aGlzLmFkdmFuY2UoKTtcbiAgfVxuXG4gIGFkdmFuY2UoKSB7XG4gICAgdGhpcy5wZWVrID1cbiAgICAgICAgKyt0aGlzLmluZGV4ID49IHRoaXMubGVuZ3RoID8gJEVPRiA6IFN0cmluZ1dyYXBwZXIuY2hhckNvZGVBdCh0aGlzLmlucHV0LCB0aGlzLmluZGV4KTtcbiAgfVxuXG4gIHNjYW5Ub2tlbigpOiBUb2tlbiB7XG4gICAgdmFyIGlucHV0ID0gdGhpcy5pbnB1dCwgbGVuZ3RoID0gdGhpcy5sZW5ndGgsIHBlZWsgPSB0aGlzLnBlZWssIGluZGV4ID0gdGhpcy5pbmRleDtcblxuICAgIC8vIFNraXAgd2hpdGVzcGFjZS5cbiAgICB3aGlsZSAocGVlayA8PSAkU1BBQ0UpIHtcbiAgICAgIGlmICgrK2luZGV4ID49IGxlbmd0aCkge1xuICAgICAgICBwZWVrID0gJEVPRjtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWVrID0gU3RyaW5nV3JhcHBlci5jaGFyQ29kZUF0KGlucHV0LCBpbmRleCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5wZWVrID0gcGVlaztcbiAgICB0aGlzLmluZGV4ID0gaW5kZXg7XG5cbiAgICBpZiAoaW5kZXggPj0gbGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgaWRlbnRpZmllcnMgYW5kIG51bWJlcnMuXG4gICAgaWYgKGlzSWRlbnRpZmllclN0YXJ0KHBlZWspKSByZXR1cm4gdGhpcy5zY2FuSWRlbnRpZmllcigpO1xuICAgIGlmIChpc0RpZ2l0KHBlZWspKSByZXR1cm4gdGhpcy5zY2FuTnVtYmVyKGluZGV4KTtcblxuICAgIHZhciBzdGFydDogbnVtYmVyID0gaW5kZXg7XG4gICAgc3dpdGNoIChwZWVrKSB7XG4gICAgICBjYXNlICRQRVJJT0Q6XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICByZXR1cm4gaXNEaWdpdCh0aGlzLnBlZWspID8gdGhpcy5zY2FuTnVtYmVyKHN0YXJ0KSA6IG5ld0NoYXJhY3RlclRva2VuKHN0YXJ0LCAkUEVSSU9EKTtcbiAgICAgIGNhc2UgJExQQVJFTjpcbiAgICAgIGNhc2UgJFJQQVJFTjpcbiAgICAgIGNhc2UgJExCUkFDRTpcbiAgICAgIGNhc2UgJFJCUkFDRTpcbiAgICAgIGNhc2UgJExCUkFDS0VUOlxuICAgICAgY2FzZSAkUkJSQUNLRVQ6XG4gICAgICBjYXNlICRDT01NQTpcbiAgICAgIGNhc2UgJENPTE9OOlxuICAgICAgY2FzZSAkU0VNSUNPTE9OOlxuICAgICAgICByZXR1cm4gdGhpcy5zY2FuQ2hhcmFjdGVyKHN0YXJ0LCBwZWVrKTtcbiAgICAgIGNhc2UgJFNROlxuICAgICAgY2FzZSAkRFE6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5TdHJpbmcoKTtcbiAgICAgIGNhc2UgJEhBU0g6XG4gICAgICBjYXNlICRQTFVTOlxuICAgICAgY2FzZSAkTUlOVVM6XG4gICAgICBjYXNlICRTVEFSOlxuICAgICAgY2FzZSAkU0xBU0g6XG4gICAgICBjYXNlICRQRVJDRU5UOlxuICAgICAgY2FzZSAkQ0FSRVQ6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5PcGVyYXRvcihzdGFydCwgU3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUocGVlaykpO1xuICAgICAgY2FzZSAkUVVFU1RJT046XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsICc/JywgJFBFUklPRCwgJy4nKTtcbiAgICAgIGNhc2UgJExUOlxuICAgICAgY2FzZSAkR1Q6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsIFN0cmluZ1dyYXBwZXIuZnJvbUNoYXJDb2RlKHBlZWspLCAkRVEsICc9Jyk7XG4gICAgICBjYXNlICRCQU5HOlxuICAgICAgY2FzZSAkRVE6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsIFN0cmluZ1dyYXBwZXIuZnJvbUNoYXJDb2RlKHBlZWspLCAkRVEsICc9JywgJEVRLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICc9Jyk7XG4gICAgICBjYXNlICRBTVBFUlNBTkQ6XG4gICAgICAgIHJldHVybiB0aGlzLnNjYW5Db21wbGV4T3BlcmF0b3Ioc3RhcnQsICcmJywgJEFNUEVSU0FORCwgJyYnKTtcbiAgICAgIGNhc2UgJEJBUjpcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhbkNvbXBsZXhPcGVyYXRvcihzdGFydCwgJ3wnLCAkQkFSLCAnfCcpO1xuICAgICAgY2FzZSAkTkJTUDpcbiAgICAgICAgd2hpbGUgKGlzV2hpdGVzcGFjZSh0aGlzLnBlZWspKSB0aGlzLmFkdmFuY2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2NhblRva2VuKCk7XG4gICAgfVxuXG4gICAgdGhpcy5lcnJvcihgVW5leHBlY3RlZCBjaGFyYWN0ZXIgWyR7U3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUocGVlayl9XWAsIDApO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgc2NhbkNoYXJhY3RlcihzdGFydDogbnVtYmVyLCBjb2RlOiBudW1iZXIpOiBUb2tlbiB7XG4gICAgYXNzZXJ0KHRoaXMucGVlayA9PSBjb2RlKTtcbiAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gbmV3Q2hhcmFjdGVyVG9rZW4oc3RhcnQsIGNvZGUpO1xuICB9XG5cblxuICBzY2FuT3BlcmF0b3Ioc3RhcnQ6IG51bWJlciwgc3RyOiBzdHJpbmcpOiBUb2tlbiB7XG4gICAgYXNzZXJ0KHRoaXMucGVlayA9PSBTdHJpbmdXcmFwcGVyLmNoYXJDb2RlQXQoc3RyLCAwKSk7XG4gICAgYXNzZXJ0KFNldFdyYXBwZXIuaGFzKE9QRVJBVE9SUywgc3RyKSk7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG5ld09wZXJhdG9yVG9rZW4oc3RhcnQsIHN0cik7XG4gIH1cblxuICAvKipcbiAgICogVG9rZW5pemUgYSAyLzMgY2hhciBsb25nIG9wZXJhdG9yXG4gICAqXG4gICAqIEBwYXJhbSBzdGFydCBzdGFydCBpbmRleCBpbiB0aGUgZXhwcmVzc2lvblxuICAgKiBAcGFyYW0gb25lIGZpcnN0IHN5bWJvbCAoYWx3YXlzIHBhcnQgb2YgdGhlIG9wZXJhdG9yKVxuICAgKiBAcGFyYW0gdHdvQ29kZSBjb2RlIHBvaW50IGZvciB0aGUgc2Vjb25kIHN5bWJvbFxuICAgKiBAcGFyYW0gdHdvIHNlY29uZCBzeW1ib2wgKHBhcnQgb2YgdGhlIG9wZXJhdG9yIHdoZW4gdGhlIHNlY29uZCBjb2RlIHBvaW50IG1hdGNoZXMpXG4gICAqIEBwYXJhbSB0aHJlZUNvZGUgY29kZSBwb2ludCBmb3IgdGhlIHRoaXJkIHN5bWJvbFxuICAgKiBAcGFyYW0gdGhyZWUgdGhpcmQgc3ltYm9sIChwYXJ0IG9mIHRoZSBvcGVyYXRvciB3aGVuIHByb3ZpZGVkIGFuZCBtYXRjaGVzIHNvdXJjZSBleHByZXNzaW9uKVxuICAgKiBAcmV0dXJucyB7VG9rZW59XG4gICAqL1xuICBzY2FuQ29tcGxleE9wZXJhdG9yKHN0YXJ0OiBudW1iZXIsIG9uZTogc3RyaW5nLCB0d29Db2RlOiBudW1iZXIsIHR3bzogc3RyaW5nLCB0aHJlZUNvZGU/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgdGhyZWU/OiBzdHJpbmcpOiBUb2tlbiB7XG4gICAgYXNzZXJ0KHRoaXMucGVlayA9PSBTdHJpbmdXcmFwcGVyLmNoYXJDb2RlQXQob25lLCAwKSk7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgdmFyIHN0cjogc3RyaW5nID0gb25lO1xuICAgIGlmICh0aGlzLnBlZWsgPT0gdHdvQ29kZSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBzdHIgKz0gdHdvO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRocmVlQ29kZSkgJiYgdGhpcy5wZWVrID09IHRocmVlQ29kZSkge1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICBzdHIgKz0gdGhyZWU7XG4gICAgfVxuICAgIGFzc2VydChTZXRXcmFwcGVyLmhhcyhPUEVSQVRPUlMsIHN0cikpO1xuICAgIHJldHVybiBuZXdPcGVyYXRvclRva2VuKHN0YXJ0LCBzdHIpO1xuICB9XG5cbiAgc2NhbklkZW50aWZpZXIoKTogVG9rZW4ge1xuICAgIGFzc2VydChpc0lkZW50aWZpZXJTdGFydCh0aGlzLnBlZWspKTtcbiAgICB2YXIgc3RhcnQ6IG51bWJlciA9IHRoaXMuaW5kZXg7XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgd2hpbGUgKGlzSWRlbnRpZmllclBhcnQodGhpcy5wZWVrKSkgdGhpcy5hZHZhbmNlKCk7XG4gICAgdmFyIHN0cjogc3RyaW5nID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcoc3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgIGlmIChTZXRXcmFwcGVyLmhhcyhLRVlXT1JEUywgc3RyKSkge1xuICAgICAgcmV0dXJuIG5ld0tleXdvcmRUb2tlbihzdGFydCwgc3RyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ld0lkZW50aWZpZXJUb2tlbihzdGFydCwgc3RyKTtcbiAgICB9XG4gIH1cblxuICBzY2FuTnVtYmVyKHN0YXJ0OiBudW1iZXIpOiBUb2tlbiB7XG4gICAgYXNzZXJ0KGlzRGlnaXQodGhpcy5wZWVrKSk7XG4gICAgdmFyIHNpbXBsZTogYm9vbGVhbiA9ICh0aGlzLmluZGV4ID09PSBzdGFydCk7XG4gICAgdGhpcy5hZHZhbmNlKCk7ICAvLyBTa2lwIGluaXRpYWwgZGlnaXQuXG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmIChpc0RpZ2l0KHRoaXMucGVlaykpIHtcbiAgICAgICAgLy8gRG8gbm90aGluZy5cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrID09ICRQRVJJT0QpIHtcbiAgICAgICAgc2ltcGxlID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKGlzRXhwb25lbnRTdGFydCh0aGlzLnBlZWspKSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICBpZiAoaXNFeHBvbmVudFNpZ24odGhpcy5wZWVrKSkgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgIGlmICghaXNEaWdpdCh0aGlzLnBlZWspKSB0aGlzLmVycm9yKCdJbnZhbGlkIGV4cG9uZW50JywgLTEpO1xuICAgICAgICBzaW1wbGUgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgfVxuICAgIHZhciBzdHI6IHN0cmluZyA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCB0aGlzLmluZGV4KTtcbiAgICAvLyBUT0RPXG4gICAgdmFyIHZhbHVlOiBudW1iZXIgPVxuICAgICAgICBzaW1wbGUgPyBOdW1iZXJXcmFwcGVyLnBhcnNlSW50QXV0b1JhZGl4KHN0cikgOiBOdW1iZXJXcmFwcGVyLnBhcnNlRmxvYXQoc3RyKTtcbiAgICByZXR1cm4gbmV3TnVtYmVyVG9rZW4oc3RhcnQsIHZhbHVlKTtcbiAgfVxuXG4gIHNjYW5TdHJpbmcoKTogVG9rZW4ge1xuICAgIGFzc2VydCh0aGlzLnBlZWsgPT0gJFNRIHx8IHRoaXMucGVlayA9PSAkRFEpO1xuICAgIHZhciBzdGFydDogbnVtYmVyID0gdGhpcy5pbmRleDtcbiAgICB2YXIgcXVvdGU6IG51bWJlciA9IHRoaXMucGVlaztcbiAgICB0aGlzLmFkdmFuY2UoKTsgIC8vIFNraXAgaW5pdGlhbCBxdW90ZS5cblxuICAgIHZhciBidWZmZXI6IFN0cmluZ0pvaW5lcjtcbiAgICB2YXIgbWFya2VyOiBudW1iZXIgPSB0aGlzLmluZGV4O1xuICAgIHZhciBpbnB1dDogc3RyaW5nID0gdGhpcy5pbnB1dDtcblxuICAgIHdoaWxlICh0aGlzLnBlZWsgIT0gcXVvdGUpIHtcbiAgICAgIGlmICh0aGlzLnBlZWsgPT0gJEJBQ0tTTEFTSCkge1xuICAgICAgICBpZiAoYnVmZmVyID09IG51bGwpIGJ1ZmZlciA9IG5ldyBTdHJpbmdKb2luZXIoKTtcbiAgICAgICAgYnVmZmVyLmFkZChpbnB1dC5zdWJzdHJpbmcobWFya2VyLCB0aGlzLmluZGV4KSk7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB2YXIgdW5lc2NhcGVkQ29kZTogbnVtYmVyO1xuICAgICAgICBpZiAodGhpcy5wZWVrID09ICR1KSB7XG4gICAgICAgICAgLy8gNCBjaGFyYWN0ZXIgaGV4IGNvZGUgZm9yIHVuaWNvZGUgY2hhcmFjdGVyLlxuICAgICAgICAgIHZhciBoZXg6IHN0cmluZyA9IGlucHV0LnN1YnN0cmluZyh0aGlzLmluZGV4ICsgMSwgdGhpcy5pbmRleCArIDUpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICB1bmVzY2FwZWRDb2RlID0gTnVtYmVyV3JhcHBlci5wYXJzZUludChoZXgsIDE2KTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yKGBJbnZhbGlkIHVuaWNvZGUgZXNjYXBlIFtcXFxcdSR7aGV4fV1gLCAwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yICh2YXIgaTogbnVtYmVyID0gMDsgaSA8IDU7IGkrKykge1xuICAgICAgICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuZXNjYXBlZENvZGUgPSB1bmVzY2FwZSh0aGlzLnBlZWspO1xuICAgICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgICB9XG4gICAgICAgIGJ1ZmZlci5hZGQoU3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUodW5lc2NhcGVkQ29kZSkpO1xuICAgICAgICBtYXJrZXIgPSB0aGlzLmluZGV4O1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsgPT0gJEVPRikge1xuICAgICAgICB0aGlzLmVycm9yKCdVbnRlcm1pbmF0ZWQgcXVvdGUnLCAwKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBsYXN0OiBzdHJpbmcgPSBpbnB1dC5zdWJzdHJpbmcobWFya2VyLCB0aGlzLmluZGV4KTtcbiAgICB0aGlzLmFkdmFuY2UoKTsgIC8vIFNraXAgdGVybWluYXRpbmcgcXVvdGUuXG5cbiAgICAvLyBDb21wdXRlIHRoZSB1bmVzY2FwZWQgc3RyaW5nIHZhbHVlLlxuICAgIHZhciB1bmVzY2FwZWQ6IHN0cmluZyA9IGxhc3Q7XG4gICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7XG4gICAgICBidWZmZXIuYWRkKGxhc3QpO1xuICAgICAgdW5lc2NhcGVkID0gYnVmZmVyLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIHJldHVybiBuZXdTdHJpbmdUb2tlbihzdGFydCwgdW5lc2NhcGVkKTtcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgb2Zmc2V0OiBudW1iZXIpIHtcbiAgICB2YXIgcG9zaXRpb246IG51bWJlciA9IHRoaXMuaW5kZXggKyBvZmZzZXQ7XG4gICAgdGhyb3cgbmV3IFNjYW5uZXJFcnJvcihcbiAgICAgICAgYExleGVyIEVycm9yOiAke21lc3NhZ2V9IGF0IGNvbHVtbiAke3Bvc2l0aW9ufSBpbiBleHByZXNzaW9uIFske3RoaXMuaW5wdXR9XWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChjb2RlID49ICRUQUIgJiYgY29kZSA8PSAkU1BBQ0UpIHx8IChjb2RlID09ICROQlNQKTtcbn1cblxuZnVuY3Rpb24gaXNJZGVudGlmaWVyU3RhcnQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoJGEgPD0gY29kZSAmJiBjb2RlIDw9ICR6KSB8fCAoJEEgPD0gY29kZSAmJiBjb2RlIDw9ICRaKSB8fCAoY29kZSA9PSAkXykgfHwgKGNvZGUgPT0gJCQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGlmaWVyKGlucHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGlucHV0Lmxlbmd0aCA9PSAwKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzY2FubmVyID0gbmV3IF9TY2FubmVyKGlucHV0KTtcbiAgaWYgKCFpc0lkZW50aWZpZXJTdGFydChzY2FubmVyLnBlZWspKSByZXR1cm4gZmFsc2U7XG4gIHNjYW5uZXIuYWR2YW5jZSgpO1xuICB3aGlsZSAoc2Nhbm5lci5wZWVrICE9PSAkRU9GKSB7XG4gICAgaWYgKCFpc0lkZW50aWZpZXJQYXJ0KHNjYW5uZXIucGVlaykpIHJldHVybiBmYWxzZTtcbiAgICBzY2FubmVyLmFkdmFuY2UoKTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNJZGVudGlmaWVyUGFydChjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuICgkYSA8PSBjb2RlICYmIGNvZGUgPD0gJHopIHx8ICgkQSA8PSBjb2RlICYmIGNvZGUgPD0gJFopIHx8ICgkMCA8PSBjb2RlICYmIGNvZGUgPD0gJDkpIHx8XG4gICAgICAgICAoY29kZSA9PSAkXykgfHwgKGNvZGUgPT0gJCQpO1xufVxuXG5mdW5jdGlvbiBpc0RpZ2l0KGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gJDAgPD0gY29kZSAmJiBjb2RlIDw9ICQ5O1xufVxuXG5mdW5jdGlvbiBpc0V4cG9uZW50U3RhcnQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb2RlID09ICRlIHx8IGNvZGUgPT0gJEU7XG59XG5cbmZ1bmN0aW9uIGlzRXhwb25lbnRTaWduKGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gY29kZSA9PSAkTUlOVVMgfHwgY29kZSA9PSAkUExVUztcbn1cblxuZnVuY3Rpb24gdW5lc2NhcGUoY29kZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgc3dpdGNoIChjb2RlKSB7XG4gICAgY2FzZSAkbjpcbiAgICAgIHJldHVybiAkTEY7XG4gICAgY2FzZSAkZjpcbiAgICAgIHJldHVybiAkRkY7XG4gICAgY2FzZSAkcjpcbiAgICAgIHJldHVybiAkQ1I7XG4gICAgY2FzZSAkdDpcbiAgICAgIHJldHVybiAkVEFCO1xuICAgIGNhc2UgJHY6XG4gICAgICByZXR1cm4gJFZUQUI7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBjb2RlO1xuICB9XG59XG5cbnZhciBPUEVSQVRPUlMgPSBTZXRXcmFwcGVyLmNyZWF0ZUZyb21MaXN0KFtcbiAgJysnLFxuICAnLScsXG4gICcqJyxcbiAgJy8nLFxuICAnJScsXG4gICdeJyxcbiAgJz0nLFxuICAnPT0nLFxuICAnIT0nLFxuICAnPT09JyxcbiAgJyE9PScsXG4gICc8JyxcbiAgJz4nLFxuICAnPD0nLFxuICAnPj0nLFxuICAnJiYnLFxuICAnfHwnLFxuICAnJicsXG4gICd8JyxcbiAgJyEnLFxuICAnPycsXG4gICcjJyxcbiAgJz8uJ1xuXSk7XG5cblxudmFyIEtFWVdPUkRTID1cbiAgICBTZXRXcmFwcGVyLmNyZWF0ZUZyb21MaXN0KFsndmFyJywgJ251bGwnLCAndW5kZWZpbmVkJywgJ3RydWUnLCAnZmFsc2UnLCAnaWYnLCAnZWxzZSddKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcGFyc2VyL2xleGVyLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaS9kZWNvcmF0b3JzJztcbmltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBTdHJpbmdXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIExleGVyLFxuICBFT0YsXG4gIGlzSWRlbnRpZmllcixcbiAgVG9rZW4sXG4gICRQRVJJT0QsXG4gICRDT0xPTixcbiAgJFNFTUlDT0xPTixcbiAgJExCUkFDS0VULFxuICAkUkJSQUNLRVQsXG4gICRDT01NQSxcbiAgJExCUkFDRSxcbiAgJFJCUkFDRSxcbiAgJExQQVJFTixcbiAgJFJQQVJFTlxufSBmcm9tICcuL2xleGVyJztcbmltcG9ydCB7cmVmbGVjdG9yLCBSZWZsZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5pbXBvcnQge1xuICBBU1QsXG4gIEVtcHR5RXhwcixcbiAgSW1wbGljaXRSZWNlaXZlcixcbiAgUHJvcGVydHlSZWFkLFxuICBQcm9wZXJ0eVdyaXRlLFxuICBTYWZlUHJvcGVydHlSZWFkLFxuICBMaXRlcmFsUHJpbWl0aXZlLFxuICBCaW5hcnksXG4gIFByZWZpeE5vdCxcbiAgQ29uZGl0aW9uYWwsXG4gIEJpbmRpbmdQaXBlLFxuICBDaGFpbixcbiAgS2V5ZWRSZWFkLFxuICBLZXllZFdyaXRlLFxuICBMaXRlcmFsQXJyYXksXG4gIExpdGVyYWxNYXAsXG4gIEludGVycG9sYXRpb24sXG4gIE1ldGhvZENhbGwsXG4gIFNhZmVNZXRob2RDYWxsLFxuICBGdW5jdGlvbkNhbGwsXG4gIFRlbXBsYXRlQmluZGluZyxcbiAgQVNUV2l0aFNvdXJjZSxcbiAgQXN0VmlzaXRvcixcbiAgUXVvdGVcbn0gZnJvbSAnLi9hc3QnO1xuXG5cbnZhciBfaW1wbGljaXRSZWNlaXZlciA9IG5ldyBJbXBsaWNpdFJlY2VpdmVyKCk7XG4vLyBUT0RPKHRib3NjaCk6IENhbm5vdCBtYWtlIHRoaXMgY29uc3QvZmluYWwgcmlnaHQgbm93IGJlY2F1c2Ugb2YgdGhlIHRyYW5zcGlsZXIuLi5cbnZhciBJTlRFUlBPTEFUSU9OX1JFR0VYUCA9IC9cXHtcXHsoLio/KVxcfVxcfS9nO1xuXG5jbGFzcyBQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGlucHV0OiBzdHJpbmcsIGVyckxvY2F0aW9uOiBzdHJpbmcsIGN0eExvY2F0aW9uPzogYW55KSB7XG4gICAgc3VwZXIoYFBhcnNlciBFcnJvcjogJHttZXNzYWdlfSAke2VyckxvY2F0aW9ufSBbJHtpbnB1dH1dIGluICR7Y3R4TG9jYXRpb259YCk7XG4gIH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBhcnNlciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3JlZmxlY3RvcjogUmVmbGVjdG9yO1xuXG4gIGNvbnN0cnVjdG9yKC8qKiBAaW50ZXJuYWwgKi9cbiAgICAgICAgICAgICAgcHVibGljIF9sZXhlcjogTGV4ZXIsIHByb3ZpZGVkUmVmbGVjdG9yOiBSZWZsZWN0b3IgPSBudWxsKSB7XG4gICAgdGhpcy5fcmVmbGVjdG9yID0gaXNQcmVzZW50KHByb3ZpZGVkUmVmbGVjdG9yKSA/IHByb3ZpZGVkUmVmbGVjdG9yIDogcmVmbGVjdG9yO1xuICB9XG5cbiAgcGFyc2VBY3Rpb24oaW5wdXQ6IHN0cmluZywgbG9jYXRpb246IGFueSk6IEFTVFdpdGhTb3VyY2Uge1xuICAgIHRoaXMuX2NoZWNrTm9JbnRlcnBvbGF0aW9uKGlucHV0LCBsb2NhdGlvbik7XG4gICAgdmFyIHRva2VucyA9IHRoaXMuX2xleGVyLnRva2VuaXplKGlucHV0KTtcbiAgICB2YXIgYXN0ID0gbmV3IF9QYXJzZUFTVChpbnB1dCwgbG9jYXRpb24sIHRva2VucywgdGhpcy5fcmVmbGVjdG9yLCB0cnVlKS5wYXJzZUNoYWluKCk7XG4gICAgcmV0dXJuIG5ldyBBU1RXaXRoU291cmNlKGFzdCwgaW5wdXQsIGxvY2F0aW9uKTtcbiAgfVxuXG4gIHBhcnNlQmluZGluZyhpbnB1dDogc3RyaW5nLCBsb2NhdGlvbjogYW55KTogQVNUV2l0aFNvdXJjZSB7XG4gICAgdmFyIGFzdCA9IHRoaXMuX3BhcnNlQmluZGluZ0FzdChpbnB1dCwgbG9jYXRpb24pO1xuICAgIHJldHVybiBuZXcgQVNUV2l0aFNvdXJjZShhc3QsIGlucHV0LCBsb2NhdGlvbik7XG4gIH1cblxuICBwYXJzZVNpbXBsZUJpbmRpbmcoaW5wdXQ6IHN0cmluZywgbG9jYXRpb246IHN0cmluZyk6IEFTVFdpdGhTb3VyY2Uge1xuICAgIHZhciBhc3QgPSB0aGlzLl9wYXJzZUJpbmRpbmdBc3QoaW5wdXQsIGxvY2F0aW9uKTtcbiAgICBpZiAoIVNpbXBsZUV4cHJlc3Npb25DaGVja2VyLmNoZWNrKGFzdCkpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbihcbiAgICAgICAgICAnSG9zdCBiaW5kaW5nIGV4cHJlc3Npb24gY2FuIG9ubHkgY29udGFpbiBmaWVsZCBhY2Nlc3MgYW5kIGNvbnN0YW50cycsIGlucHV0LCBsb2NhdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQVNUV2l0aFNvdXJjZShhc3QsIGlucHV0LCBsb2NhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZUJpbmRpbmdBc3QoaW5wdXQ6IHN0cmluZywgbG9jYXRpb246IHN0cmluZyk6IEFTVCB7XG4gICAgLy8gUXVvdGVzIGV4cHJlc3Npb25zIHVzZSAzcmQtcGFydHkgZXhwcmVzc2lvbiBsYW5ndWFnZS4gV2UgZG9uJ3Qgd2FudCB0byB1c2VcbiAgICAvLyBvdXIgbGV4ZXIgb3IgcGFyc2VyIGZvciB0aGF0LCBzbyB3ZSBjaGVjayBmb3IgdGhhdCBhaGVhZCBvZiB0aW1lLlxuICAgIHZhciBxdW90ZSA9IHRoaXMuX3BhcnNlUXVvdGUoaW5wdXQsIGxvY2F0aW9uKTtcblxuICAgIGlmIChpc1ByZXNlbnQocXVvdGUpKSB7XG4gICAgICByZXR1cm4gcXVvdGU7XG4gICAgfVxuXG4gICAgdGhpcy5fY2hlY2tOb0ludGVycG9sYXRpb24oaW5wdXQsIGxvY2F0aW9uKTtcbiAgICB2YXIgdG9rZW5zID0gdGhpcy5fbGV4ZXIudG9rZW5pemUoaW5wdXQpO1xuICAgIHJldHVybiBuZXcgX1BhcnNlQVNUKGlucHV0LCBsb2NhdGlvbiwgdG9rZW5zLCB0aGlzLl9yZWZsZWN0b3IsIGZhbHNlKS5wYXJzZUNoYWluKCk7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZVF1b3RlKGlucHV0OiBzdHJpbmcsIGxvY2F0aW9uOiBhbnkpOiBBU1Qge1xuICAgIGlmIChpc0JsYW5rKGlucHV0KSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHByZWZpeFNlcGFyYXRvckluZGV4ID0gaW5wdXQuaW5kZXhPZignOicpO1xuICAgIGlmIChwcmVmaXhTZXBhcmF0b3JJbmRleCA9PSAtMSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHByZWZpeCA9IGlucHV0LnN1YnN0cmluZygwLCBwcmVmaXhTZXBhcmF0b3JJbmRleCkudHJpbSgpO1xuICAgIGlmICghaXNJZGVudGlmaWVyKHByZWZpeCkpIHJldHVybiBudWxsO1xuICAgIHZhciB1bmludGVycHJldGVkRXhwcmVzc2lvbiA9IGlucHV0LnN1YnN0cmluZyhwcmVmaXhTZXBhcmF0b3JJbmRleCArIDEpO1xuICAgIHJldHVybiBuZXcgUXVvdGUocHJlZml4LCB1bmludGVycHJldGVkRXhwcmVzc2lvbiwgbG9jYXRpb24pO1xuICB9XG5cbiAgcGFyc2VUZW1wbGF0ZUJpbmRpbmdzKGlucHV0OiBzdHJpbmcsIGxvY2F0aW9uOiBhbnkpOiBUZW1wbGF0ZUJpbmRpbmdbXSB7XG4gICAgdmFyIHRva2VucyA9IHRoaXMuX2xleGVyLnRva2VuaXplKGlucHV0KTtcbiAgICByZXR1cm4gbmV3IF9QYXJzZUFTVChpbnB1dCwgbG9jYXRpb24sIHRva2VucywgdGhpcy5fcmVmbGVjdG9yLCBmYWxzZSkucGFyc2VUZW1wbGF0ZUJpbmRpbmdzKCk7XG4gIH1cblxuICBwYXJzZUludGVycG9sYXRpb24oaW5wdXQ6IHN0cmluZywgbG9jYXRpb246IGFueSk6IEFTVFdpdGhTb3VyY2Uge1xuICAgIHZhciBwYXJ0cyA9IFN0cmluZ1dyYXBwZXIuc3BsaXQoaW5wdXQsIElOVEVSUE9MQVRJT05fUkVHRVhQKTtcbiAgICBpZiAocGFydHMubGVuZ3RoIDw9IDEpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgc3RyaW5ncyA9IFtdO1xuICAgIHZhciBleHByZXNzaW9ucyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcnQ6IHN0cmluZyA9IHBhcnRzW2ldO1xuICAgICAgaWYgKGkgJSAyID09PSAwKSB7XG4gICAgICAgIC8vIGZpeGVkIHN0cmluZ1xuICAgICAgICBzdHJpbmdzLnB1c2gocGFydCk7XG4gICAgICB9IGVsc2UgaWYgKHBhcnQudHJpbSgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuX2xleGVyLnRva2VuaXplKHBhcnQpO1xuICAgICAgICB2YXIgYXN0ID0gbmV3IF9QYXJzZUFTVChpbnB1dCwgbG9jYXRpb24sIHRva2VucywgdGhpcy5fcmVmbGVjdG9yLCBmYWxzZSkucGFyc2VDaGFpbigpO1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKGFzdCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oJ0JsYW5rIGV4cHJlc3Npb25zIGFyZSBub3QgYWxsb3dlZCBpbiBpbnRlcnBvbGF0ZWQgc3RyaW5ncycsIGlucHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGF0IGNvbHVtbiAke3RoaXMuX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4ocGFydHMsIGkpfSBpbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXcgQVNUV2l0aFNvdXJjZShuZXcgSW50ZXJwb2xhdGlvbihzdHJpbmdzLCBleHByZXNzaW9ucyksIGlucHV0LCBsb2NhdGlvbik7XG4gIH1cblxuICB3cmFwTGl0ZXJhbFByaW1pdGl2ZShpbnB1dDogc3RyaW5nLCBsb2NhdGlvbjogYW55KTogQVNUV2l0aFNvdXJjZSB7XG4gICAgcmV0dXJuIG5ldyBBU1RXaXRoU291cmNlKG5ldyBMaXRlcmFsUHJpbWl0aXZlKGlucHV0KSwgaW5wdXQsIGxvY2F0aW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NoZWNrTm9JbnRlcnBvbGF0aW9uKGlucHV0OiBzdHJpbmcsIGxvY2F0aW9uOiBhbnkpOiB2b2lkIHtcbiAgICB2YXIgcGFydHMgPSBTdHJpbmdXcmFwcGVyLnNwbGl0KGlucHV0LCBJTlRFUlBPTEFUSU9OX1JFR0VYUCk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbignR290IGludGVycG9sYXRpb24gKHt7fX0pIHdoZXJlIGV4cHJlc3Npb24gd2FzIGV4cGVjdGVkJywgaW5wdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGF0IGNvbHVtbiAke3RoaXMuX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4ocGFydHMsIDEpfSBpbmAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2ZpbmRJbnRlcnBvbGF0aW9uRXJyb3JDb2x1bW4ocGFydHM6IHN0cmluZ1tdLCBwYXJ0SW5FcnJJZHg6IG51bWJlcik6IG51bWJlciB7XG4gICAgdmFyIGVyckxvY2F0aW9uID0gJyc7XG4gICAgZm9yICh2YXIgaiA9IDA7IGogPCBwYXJ0SW5FcnJJZHg7IGorKykge1xuICAgICAgZXJyTG9jYXRpb24gKz0gaiAlIDIgPT09IDAgPyBwYXJ0c1tqXSA6IGB7eyR7cGFydHNbal19fX1gO1xuICAgIH1cblxuICAgIHJldHVybiBlcnJMb2NhdGlvbi5sZW5ndGg7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIF9QYXJzZUFTVCB7XG4gIGluZGV4OiBudW1iZXIgPSAwO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5wdXQ6IHN0cmluZywgcHVibGljIGxvY2F0aW9uOiBhbnksIHB1YmxpYyB0b2tlbnM6IGFueVtdLFxuICAgICAgICAgICAgICBwdWJsaWMgcmVmbGVjdG9yOiBSZWZsZWN0b3IsIHB1YmxpYyBwYXJzZUFjdGlvbjogYm9vbGVhbikge31cblxuICBwZWVrKG9mZnNldDogbnVtYmVyKTogVG9rZW4ge1xuICAgIHZhciBpID0gdGhpcy5pbmRleCArIG9mZnNldDtcbiAgICByZXR1cm4gaSA8IHRoaXMudG9rZW5zLmxlbmd0aCA/IHRoaXMudG9rZW5zW2ldIDogRU9GO1xuICB9XG5cbiAgZ2V0IG5leHQoKTogVG9rZW4geyByZXR1cm4gdGhpcy5wZWVrKDApOyB9XG5cbiAgZ2V0IGlucHV0SW5kZXgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gKHRoaXMuaW5kZXggPCB0aGlzLnRva2Vucy5sZW5ndGgpID8gdGhpcy5uZXh0LmluZGV4IDogdGhpcy5pbnB1dC5sZW5ndGg7XG4gIH1cblxuICBhZHZhbmNlKCkgeyB0aGlzLmluZGV4Kys7IH1cblxuICBvcHRpb25hbENoYXJhY3Rlcihjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5uZXh0LmlzQ2hhcmFjdGVyKGNvZGUpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgb3B0aW9uYWxLZXl3b3JkVmFyKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnBlZWtLZXl3b3JkVmFyKCkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwZWVrS2V5d29yZFZhcigpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMubmV4dC5pc0tleXdvcmRWYXIoKSB8fCB0aGlzLm5leHQuaXNPcGVyYXRvcignIycpOyB9XG5cbiAgZXhwZWN0Q2hhcmFjdGVyKGNvZGU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKGNvZGUpKSByZXR1cm47XG4gICAgdGhpcy5lcnJvcihgTWlzc2luZyBleHBlY3RlZCAke1N0cmluZ1dyYXBwZXIuZnJvbUNoYXJDb2RlKGNvZGUpfWApO1xuICB9XG5cblxuICBvcHRpb25hbE9wZXJhdG9yKG9wOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5uZXh0LmlzT3BlcmF0b3Iob3ApKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZXhwZWN0T3BlcmF0b3Iob3BlcmF0b3I6IHN0cmluZykge1xuICAgIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3Iob3BlcmF0b3IpKSByZXR1cm47XG4gICAgdGhpcy5lcnJvcihgTWlzc2luZyBleHBlY3RlZCBvcGVyYXRvciAke29wZXJhdG9yfWApO1xuICB9XG5cbiAgZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZCgpOiBzdHJpbmcge1xuICAgIHZhciBuID0gdGhpcy5uZXh0O1xuICAgIGlmICghbi5pc0lkZW50aWZpZXIoKSAmJiAhbi5pc0tleXdvcmQoKSkge1xuICAgICAgdGhpcy5lcnJvcihgVW5leHBlY3RlZCB0b2tlbiAke259LCBleHBlY3RlZCBpZGVudGlmaWVyIG9yIGtleXdvcmRgKTtcbiAgICB9XG4gICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgcmV0dXJuIG4udG9TdHJpbmcoKTtcbiAgfVxuXG4gIGV4cGVjdElkZW50aWZpZXJPcktleXdvcmRPclN0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciBuID0gdGhpcy5uZXh0O1xuICAgIGlmICghbi5pc0lkZW50aWZpZXIoKSAmJiAhbi5pc0tleXdvcmQoKSAmJiAhbi5pc1N0cmluZygpKSB7XG4gICAgICB0aGlzLmVycm9yKGBVbmV4cGVjdGVkIHRva2VuICR7bn0sIGV4cGVjdGVkIGlkZW50aWZpZXIsIGtleXdvcmQsIG9yIHN0cmluZ2ApO1xuICAgIH1cbiAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICByZXR1cm4gbi50b1N0cmluZygpO1xuICB9XG5cbiAgcGFyc2VDaGFpbigpOiBBU1Qge1xuICAgIHZhciBleHBycyA9IFtdO1xuICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VQaXBlKCk7XG4gICAgICBleHBycy5wdXNoKGV4cHIpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICBpZiAoIXRoaXMucGFyc2VBY3Rpb24pIHtcbiAgICAgICAgICB0aGlzLmVycm9yKFwiQmluZGluZyBleHByZXNzaW9uIGNhbm5vdCBjb250YWluIGNoYWluZWQgZXhwcmVzc2lvblwiKTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICB9ICAvLyByZWFkIGFsbCBzZW1pY29sb25zXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaW5kZXggPCB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5lcnJvcihgVW5leHBlY3RlZCB0b2tlbiAnJHt0aGlzLm5leHR9J2ApO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZXhwcnMubGVuZ3RoID09IDApIHJldHVybiBuZXcgRW1wdHlFeHByKCk7XG4gICAgaWYgKGV4cHJzLmxlbmd0aCA9PSAxKSByZXR1cm4gZXhwcnNbMF07XG4gICAgcmV0dXJuIG5ldyBDaGFpbihleHBycyk7XG4gIH1cblxuICBwYXJzZVBpcGUoKTogQVNUIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZUV4cHJlc3Npb24oKTtcbiAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKFwifFwiKSkge1xuICAgICAgaWYgKHRoaXMucGFyc2VBY3Rpb24pIHtcbiAgICAgICAgdGhpcy5lcnJvcihcIkNhbm5vdCBoYXZlIGEgcGlwZSBpbiBhbiBhY3Rpb24gZXhwcmVzc2lvblwiKTtcbiAgICAgIH1cblxuICAgICAgZG8ge1xuICAgICAgICB2YXIgbmFtZSA9IHRoaXMuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZCgpO1xuICAgICAgICB2YXIgYXJncyA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkQ09MT04pKSB7XG4gICAgICAgICAgYXJncy5wdXNoKHRoaXMucGFyc2VFeHByZXNzaW9uKCkpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3VsdCA9IG5ldyBCaW5kaW5nUGlwZShyZXN1bHQsIG5hbWUsIGFyZ3MpO1xuICAgICAgfSB3aGlsZSAodGhpcy5vcHRpb25hbE9wZXJhdG9yKFwifFwiKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHBhcnNlRXhwcmVzc2lvbigpOiBBU1QgeyByZXR1cm4gdGhpcy5wYXJzZUNvbmRpdGlvbmFsKCk7IH1cblxuICBwYXJzZUNvbmRpdGlvbmFsKCk6IEFTVCB7XG4gICAgdmFyIHN0YXJ0ID0gdGhpcy5pbnB1dEluZGV4O1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlTG9naWNhbE9yKCk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCc/JykpIHtcbiAgICAgIHZhciB5ZXMgPSB0aGlzLnBhcnNlUGlwZSgpO1xuICAgICAgaWYgKCF0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRDT0xPTikpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMuaW5wdXRJbmRleDtcbiAgICAgICAgdmFyIGV4cHJlc3Npb24gPSB0aGlzLmlucHV0LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgdGhpcy5lcnJvcihgQ29uZGl0aW9uYWwgZXhwcmVzc2lvbiAke2V4cHJlc3Npb259IHJlcXVpcmVzIGFsbCAzIGV4cHJlc3Npb25zYCk7XG4gICAgICB9XG4gICAgICB2YXIgbm8gPSB0aGlzLnBhcnNlUGlwZSgpO1xuICAgICAgcmV0dXJuIG5ldyBDb25kaXRpb25hbChyZXN1bHQsIHllcywgbm8pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgfVxuXG4gIHBhcnNlTG9naWNhbE9yKCk6IEFTVCB7XG4gICAgLy8gJ3x8J1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlTG9naWNhbEFuZCgpO1xuICAgIHdoaWxlICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJ3x8JykpIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkoJ3x8JywgcmVzdWx0LCB0aGlzLnBhcnNlTG9naWNhbEFuZCgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHBhcnNlTG9naWNhbEFuZCgpOiBBU1Qge1xuICAgIC8vICcmJidcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZUVxdWFsaXR5KCk7XG4gICAgd2hpbGUgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignJiYnKSkge1xuICAgICAgcmVzdWx0ID0gbmV3IEJpbmFyeSgnJiYnLCByZXN1bHQsIHRoaXMucGFyc2VFcXVhbGl0eSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHBhcnNlRXF1YWxpdHkoKTogQVNUIHtcbiAgICAvLyAnPT0nLCchPScsJz09PScsJyE9PSdcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZVJlbGF0aW9uYWwoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignPT0nKSkge1xuICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KCc9PScsIHJlc3VsdCwgdGhpcy5wYXJzZVJlbGF0aW9uYWwoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignPT09JykpIHtcbiAgICAgICAgcmVzdWx0ID0gbmV3IEJpbmFyeSgnPT09JywgcmVzdWx0LCB0aGlzLnBhcnNlUmVsYXRpb25hbCgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCchPScpKSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkoJyE9JywgcmVzdWx0LCB0aGlzLnBhcnNlUmVsYXRpb25hbCgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCchPT0nKSkge1xuICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KCchPT0nLCByZXN1bHQsIHRoaXMucGFyc2VSZWxhdGlvbmFsKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwYXJzZVJlbGF0aW9uYWwoKTogQVNUIHtcbiAgICAvLyAnPCcsICc+JywgJzw9JywgJz49J1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlQWRkaXRpdmUoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignPCcpKSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkoJzwnLCByZXN1bHQsIHRoaXMucGFyc2VBZGRpdGl2ZSgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCc+JykpIHtcbiAgICAgICAgcmVzdWx0ID0gbmV3IEJpbmFyeSgnPicsIHJlc3VsdCwgdGhpcy5wYXJzZUFkZGl0aXZlKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJzw9JykpIHtcbiAgICAgICAgcmVzdWx0ID0gbmV3IEJpbmFyeSgnPD0nLCByZXN1bHQsIHRoaXMucGFyc2VBZGRpdGl2ZSgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCc+PScpKSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkoJz49JywgcmVzdWx0LCB0aGlzLnBhcnNlQWRkaXRpdmUoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHBhcnNlQWRkaXRpdmUoKTogQVNUIHtcbiAgICAvLyAnKycsICctJ1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlTXVsdGlwbGljYXRpdmUoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignKycpKSB7XG4gICAgICAgIHJlc3VsdCA9IG5ldyBCaW5hcnkoJysnLCByZXN1bHQsIHRoaXMucGFyc2VNdWx0aXBsaWNhdGl2ZSgpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCctJykpIHtcbiAgICAgICAgcmVzdWx0ID0gbmV3IEJpbmFyeSgnLScsIHJlc3VsdCwgdGhpcy5wYXJzZU11bHRpcGxpY2F0aXZlKCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwYXJzZU11bHRpcGxpY2F0aXZlKCk6IEFTVCB7XG4gICAgLy8gJyonLCAnJScsICcvJ1xuICAgIHZhciByZXN1bHQgPSB0aGlzLnBhcnNlUHJlZml4KCk7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJyonKSkge1xuICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KCcqJywgcmVzdWx0LCB0aGlzLnBhcnNlUHJlZml4KCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJyUnKSkge1xuICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KCclJywgcmVzdWx0LCB0aGlzLnBhcnNlUHJlZml4KCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJy8nKSkge1xuICAgICAgICByZXN1bHQgPSBuZXcgQmluYXJ5KCcvJywgcmVzdWx0LCB0aGlzLnBhcnNlUHJlZml4KCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwYXJzZVByZWZpeCgpOiBBU1Qge1xuICAgIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJysnKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VQcmVmaXgoKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcignLScpKSB7XG4gICAgICByZXR1cm4gbmV3IEJpbmFyeSgnLScsIG5ldyBMaXRlcmFsUHJpbWl0aXZlKDApLCB0aGlzLnBhcnNlUHJlZml4KCkpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKCchJykpIHtcbiAgICAgIHJldHVybiBuZXcgUHJlZml4Tm90KHRoaXMucGFyc2VQcmVmaXgoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnBhcnNlQ2FsbENoYWluKCk7XG4gICAgfVxuICB9XG5cbiAgcGFyc2VDYWxsQ2hhaW4oKTogQVNUIHtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5wYXJzZVByaW1hcnkoKTtcbiAgICB3aGlsZSAodHJ1ZSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJFBFUklPRCkpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZUFjY2Vzc01lbWJlck9yTWV0aG9kQ2FsbChyZXN1bHQsIGZhbHNlKTtcblxuICAgICAgfSBlbHNlIGlmICh0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJz8uJykpIHtcbiAgICAgICAgcmVzdWx0ID0gdGhpcy5wYXJzZUFjY2Vzc01lbWJlck9yTWV0aG9kQ2FsbChyZXN1bHQsIHRydWUpO1xuXG4gICAgICB9IGVsc2UgaWYgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJExCUkFDS0VUKSkge1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5wYXJzZVBpcGUoKTtcbiAgICAgICAgdGhpcy5leHBlY3RDaGFyYWN0ZXIoJFJCUkFDS0VUKTtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcihcIj1cIikpIHtcbiAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uYWwoKTtcbiAgICAgICAgICByZXN1bHQgPSBuZXcgS2V5ZWRXcml0ZShyZXN1bHQsIGtleSwgdmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IG5ldyBLZXllZFJlYWQocmVzdWx0LCBrZXkpO1xuICAgICAgICB9XG5cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkTFBBUkVOKSkge1xuICAgICAgICB2YXIgYXJncyA9IHRoaXMucGFyc2VDYWxsQXJndW1lbnRzKCk7XG4gICAgICAgIHRoaXMuZXhwZWN0Q2hhcmFjdGVyKCRSUEFSRU4pO1xuICAgICAgICByZXN1bHQgPSBuZXcgRnVuY3Rpb25DYWxsKHJlc3VsdCwgYXJncyk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcGFyc2VQcmltYXJ5KCk6IEFTVCB7XG4gICAgaWYgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJExQQVJFTikpIHtcbiAgICAgIGxldCByZXN1bHQgPSB0aGlzLnBhcnNlUGlwZSgpO1xuICAgICAgdGhpcy5leHBlY3RDaGFyYWN0ZXIoJFJQQVJFTik7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSBpZiAodGhpcy5uZXh0LmlzS2V5d29yZE51bGwoKSB8fCB0aGlzLm5leHQuaXNLZXl3b3JkVW5kZWZpbmVkKCkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsUHJpbWl0aXZlKG51bGwpO1xuXG4gICAgfSBlbHNlIGlmICh0aGlzLm5leHQuaXNLZXl3b3JkVHJ1ZSgpKSB7XG4gICAgICB0aGlzLmFkdmFuY2UoKTtcbiAgICAgIHJldHVybiBuZXcgTGl0ZXJhbFByaW1pdGl2ZSh0cnVlKTtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5uZXh0LmlzS2V5d29yZEZhbHNlKCkpIHtcbiAgICAgIHRoaXMuYWR2YW5jZSgpO1xuICAgICAgcmV0dXJuIG5ldyBMaXRlcmFsUHJpbWl0aXZlKGZhbHNlKTtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkTEJSQUNLRVQpKSB7XG4gICAgICB2YXIgZWxlbWVudHMgPSB0aGlzLnBhcnNlRXhwcmVzc2lvbkxpc3QoJFJCUkFDS0VUKTtcbiAgICAgIHRoaXMuZXhwZWN0Q2hhcmFjdGVyKCRSQlJBQ0tFVCk7XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWxBcnJheShlbGVtZW50cyk7XG5cbiAgICB9IGVsc2UgaWYgKHRoaXMubmV4dC5pc0NoYXJhY3RlcigkTEJSQUNFKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VMaXRlcmFsTWFwKCk7XG5cbiAgICB9IGVsc2UgaWYgKHRoaXMubmV4dC5pc0lkZW50aWZpZXIoKSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyc2VBY2Nlc3NNZW1iZXJPck1ldGhvZENhbGwoX2ltcGxpY2l0UmVjZWl2ZXIsIGZhbHNlKTtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5uZXh0LmlzTnVtYmVyKCkpIHtcbiAgICAgIHZhciB2YWx1ZSA9IHRoaXMubmV4dC50b051bWJlcigpO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWxQcmltaXRpdmUodmFsdWUpO1xuXG4gICAgfSBlbHNlIGlmICh0aGlzLm5leHQuaXNTdHJpbmcoKSkge1xuICAgICAgdmFyIGxpdGVyYWxWYWx1ZSA9IHRoaXMubmV4dC50b1N0cmluZygpO1xuICAgICAgdGhpcy5hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gbmV3IExpdGVyYWxQcmltaXRpdmUobGl0ZXJhbFZhbHVlKTtcblxuICAgIH0gZWxzZSBpZiAodGhpcy5pbmRleCA+PSB0aGlzLnRva2Vucy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuZXJyb3IoYFVuZXhwZWN0ZWQgZW5kIG9mIGV4cHJlc3Npb246ICR7dGhpcy5pbnB1dH1gKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmVycm9yKGBVbmV4cGVjdGVkIHRva2VuICR7dGhpcy5uZXh0fWApO1xuICAgIH1cbiAgICAvLyBlcnJvcigpIHRocm93cywgc28gd2UgZG9uJ3QgcmVhY2ggaGVyZS5cbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcIkZlbGwgdGhyb3VnaCBhbGwgY2FzZXMgaW4gcGFyc2VQcmltYXJ5XCIpO1xuICB9XG5cbiAgcGFyc2VFeHByZXNzaW9uTGlzdCh0ZXJtaW5hdG9yOiBudW1iZXIpOiBhbnlbXSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIGlmICghdGhpcy5uZXh0LmlzQ2hhcmFjdGVyKHRlcm1pbmF0b3IpKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRoaXMucGFyc2VQaXBlKCkpO1xuICAgICAgfSB3aGlsZSAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkQ09NTUEpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHBhcnNlTGl0ZXJhbE1hcCgpOiBMaXRlcmFsTWFwIHtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkTEJSQUNFKTtcbiAgICBpZiAoIXRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJFJCUkFDRSkpIHtcbiAgICAgIGRvIHtcbiAgICAgICAgdmFyIGtleSA9IHRoaXMuZXhwZWN0SWRlbnRpZmllck9yS2V5d29yZE9yU3RyaW5nKCk7XG4gICAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkQ09MT04pO1xuICAgICAgICB2YWx1ZXMucHVzaCh0aGlzLnBhcnNlUGlwZSgpKTtcbiAgICAgIH0gd2hpbGUgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJENPTU1BKSk7XG4gICAgICB0aGlzLmV4cGVjdENoYXJhY3RlcigkUkJSQUNFKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBMaXRlcmFsTWFwKGtleXMsIHZhbHVlcyk7XG4gIH1cblxuICBwYXJzZUFjY2Vzc01lbWJlck9yTWV0aG9kQ2FsbChyZWNlaXZlcjogQVNULCBpc1NhZmU6IGJvb2xlYW4gPSBmYWxzZSk6IEFTVCB7XG4gICAgbGV0IGlkID0gdGhpcy5leHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkKCk7XG5cbiAgICBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkTFBBUkVOKSkge1xuICAgICAgbGV0IGFyZ3MgPSB0aGlzLnBhcnNlQ2FsbEFyZ3VtZW50cygpO1xuICAgICAgdGhpcy5leHBlY3RDaGFyYWN0ZXIoJFJQQVJFTik7XG4gICAgICBsZXQgZm4gPSB0aGlzLnJlZmxlY3Rvci5tZXRob2QoaWQpO1xuICAgICAgcmV0dXJuIGlzU2FmZSA/IG5ldyBTYWZlTWV0aG9kQ2FsbChyZWNlaXZlciwgaWQsIGZuLCBhcmdzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgbmV3IE1ldGhvZENhbGwocmVjZWl2ZXIsIGlkLCBmbiwgYXJncyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzU2FmZSkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKFwiPVwiKSkge1xuICAgICAgICAgIHRoaXMuZXJyb3IoXCJUaGUgJz8uJyBvcGVyYXRvciBjYW5ub3QgYmUgdXNlZCBpbiB0aGUgYXNzaWdubWVudFwiKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFNhZmVQcm9wZXJ0eVJlYWQocmVjZWl2ZXIsIGlkLCB0aGlzLnJlZmxlY3Rvci5nZXR0ZXIoaWQpKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9uYWxPcGVyYXRvcihcIj1cIikpIHtcbiAgICAgICAgICBpZiAoIXRoaXMucGFyc2VBY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3IoXCJCaW5kaW5ncyBjYW5ub3QgY29udGFpbiBhc3NpZ25tZW50c1wiKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsZXQgdmFsdWUgPSB0aGlzLnBhcnNlQ29uZGl0aW9uYWwoKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFByb3BlcnR5V3JpdGUocmVjZWl2ZXIsIGlkLCB0aGlzLnJlZmxlY3Rvci5zZXR0ZXIoaWQpLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBQcm9wZXJ0eVJlYWQocmVjZWl2ZXIsIGlkLCB0aGlzLnJlZmxlY3Rvci5nZXR0ZXIoaWQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcGFyc2VDYWxsQXJndW1lbnRzKCk6IEJpbmRpbmdQaXBlW10ge1xuICAgIGlmICh0aGlzLm5leHQuaXNDaGFyYWN0ZXIoJFJQQVJFTikpIHJldHVybiBbXTtcbiAgICB2YXIgcG9zaXRpb25hbHMgPSBbXTtcbiAgICBkbyB7XG4gICAgICBwb3NpdGlvbmFscy5wdXNoKHRoaXMucGFyc2VQaXBlKCkpO1xuICAgIH0gd2hpbGUgKHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJENPTU1BKSk7XG4gICAgcmV0dXJuIHBvc2l0aW9uYWxzO1xuICB9XG5cbiAgcGFyc2VCbG9ja0NvbnRlbnQoKTogQVNUIHtcbiAgICBpZiAoIXRoaXMucGFyc2VBY3Rpb24pIHtcbiAgICAgIHRoaXMuZXJyb3IoXCJCaW5kaW5nIGV4cHJlc3Npb24gY2Fubm90IGNvbnRhaW4gY2hhaW5lZCBleHByZXNzaW9uXCIpO1xuICAgIH1cbiAgICB2YXIgZXhwcnMgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCAmJiAhdGhpcy5uZXh0LmlzQ2hhcmFjdGVyKCRSQlJBQ0UpKSB7XG4gICAgICB2YXIgZXhwciA9IHRoaXMucGFyc2VFeHByZXNzaW9uKCk7XG4gICAgICBleHBycy5wdXNoKGV4cHIpO1xuXG4gICAgICBpZiAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICB3aGlsZSAodGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICB9ICAvLyByZWFkIGFsbCBzZW1pY29sb25zXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChleHBycy5sZW5ndGggPT0gMCkgcmV0dXJuIG5ldyBFbXB0eUV4cHIoKTtcbiAgICBpZiAoZXhwcnMubGVuZ3RoID09IDEpIHJldHVybiBleHByc1swXTtcblxuICAgIHJldHVybiBuZXcgQ2hhaW4oZXhwcnMpO1xuICB9XG5cblxuICAvKipcbiAgICogQW4gaWRlbnRpZmllciwgYSBrZXl3b3JkLCBhIHN0cmluZyB3aXRoIGFuIG9wdGlvbmFsIGAtYCBpbmJldHdlZW4uXG4gICAqL1xuICBleHBlY3RUZW1wbGF0ZUJpbmRpbmdLZXkoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzdWx0ID0gJyc7XG4gICAgdmFyIG9wZXJhdG9yRm91bmQgPSBmYWxzZTtcbiAgICBkbyB7XG4gICAgICByZXN1bHQgKz0gdGhpcy5leHBlY3RJZGVudGlmaWVyT3JLZXl3b3JkT3JTdHJpbmcoKTtcbiAgICAgIG9wZXJhdG9yRm91bmQgPSB0aGlzLm9wdGlvbmFsT3BlcmF0b3IoJy0nKTtcbiAgICAgIGlmIChvcGVyYXRvckZvdW5kKSB7XG4gICAgICAgIHJlc3VsdCArPSAnLSc7XG4gICAgICB9XG4gICAgfSB3aGlsZSAob3BlcmF0b3JGb3VuZCk7XG5cbiAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7XG4gIH1cblxuICBwYXJzZVRlbXBsYXRlQmluZGluZ3MoKTogYW55W10ge1xuICAgIHZhciBiaW5kaW5ncyA9IFtdO1xuICAgIHZhciBwcmVmaXggPSBudWxsO1xuICAgIHdoaWxlICh0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICB2YXIga2V5SXNWYXI6IGJvb2xlYW4gPSB0aGlzLm9wdGlvbmFsS2V5d29yZFZhcigpO1xuICAgICAgdmFyIGtleSA9IHRoaXMuZXhwZWN0VGVtcGxhdGVCaW5kaW5nS2V5KCk7XG4gICAgICBpZiAoIWtleUlzVmFyKSB7XG4gICAgICAgIGlmIChwcmVmaXggPT0gbnVsbCkge1xuICAgICAgICAgIHByZWZpeCA9IGtleTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBrZXkgPSBwcmVmaXggKyBrZXlbMF0udG9VcHBlckNhc2UoKSArIGtleS5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMub3B0aW9uYWxDaGFyYWN0ZXIoJENPTE9OKTtcbiAgICAgIHZhciBuYW1lID0gbnVsbDtcbiAgICAgIHZhciBleHByZXNzaW9uID0gbnVsbDtcbiAgICAgIGlmIChrZXlJc1Zhcikge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25hbE9wZXJhdG9yKFwiPVwiKSkge1xuICAgICAgICAgIG5hbWUgPSB0aGlzLmV4cGVjdFRlbXBsYXRlQmluZGluZ0tleSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5hbWUgPSAnXFwkaW1wbGljaXQnO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMubmV4dCAhPT0gRU9GICYmICF0aGlzLnBlZWtLZXl3b3JkVmFyKCkpIHtcbiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5pbnB1dEluZGV4O1xuICAgICAgICB2YXIgYXN0ID0gdGhpcy5wYXJzZVBpcGUoKTtcbiAgICAgICAgdmFyIHNvdXJjZSA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0LCB0aGlzLmlucHV0SW5kZXgpO1xuICAgICAgICBleHByZXNzaW9uID0gbmV3IEFTVFdpdGhTb3VyY2UoYXN0LCBzb3VyY2UsIHRoaXMubG9jYXRpb24pO1xuICAgICAgfVxuICAgICAgYmluZGluZ3MucHVzaChuZXcgVGVtcGxhdGVCaW5kaW5nKGtleSwga2V5SXNWYXIsIG5hbWUsIGV4cHJlc3Npb24pKTtcbiAgICAgIGlmICghdGhpcy5vcHRpb25hbENoYXJhY3RlcigkU0VNSUNPTE9OKSkge1xuICAgICAgICB0aGlzLm9wdGlvbmFsQ2hhcmFjdGVyKCRDT01NQSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiaW5kaW5ncztcbiAgfVxuXG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZywgaW5kZXg6IG51bWJlciA9IG51bGwpIHtcbiAgICBpZiAoaXNCbGFuayhpbmRleCkpIGluZGV4ID0gdGhpcy5pbmRleDtcblxuICAgIHZhciBsb2NhdGlvbiA9IChpbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCkgPyBgYXQgY29sdW1uICR7dGhpcy50b2tlbnNbaW5kZXhdLmluZGV4ICsgMX0gaW5gIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGF0IHRoZSBlbmQgb2YgdGhlIGV4cHJlc3Npb25gO1xuXG4gICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKG1lc3NhZ2UsIHRoaXMuaW5wdXQsIGxvY2F0aW9uLCB0aGlzLmxvY2F0aW9uKTtcbiAgfVxufVxuXG5jbGFzcyBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlciBpbXBsZW1lbnRzIEFzdFZpc2l0b3Ige1xuICBzdGF0aWMgY2hlY2soYXN0OiBBU1QpOiBib29sZWFuIHtcbiAgICB2YXIgcyA9IG5ldyBTaW1wbGVFeHByZXNzaW9uQ2hlY2tlcigpO1xuICAgIGFzdC52aXNpdChzKTtcbiAgICByZXR1cm4gcy5zaW1wbGU7XG4gIH1cblxuICBzaW1wbGUgPSB0cnVlO1xuXG4gIHZpc2l0SW1wbGljaXRSZWNlaXZlcihhc3Q6IEltcGxpY2l0UmVjZWl2ZXIpIHt9XG5cbiAgdmlzaXRJbnRlcnBvbGF0aW9uKGFzdDogSW50ZXJwb2xhdGlvbikgeyB0aGlzLnNpbXBsZSA9IGZhbHNlOyB9XG5cbiAgdmlzaXRMaXRlcmFsUHJpbWl0aXZlKGFzdDogTGl0ZXJhbFByaW1pdGl2ZSkge31cblxuICB2aXNpdFByb3BlcnR5UmVhZChhc3Q6IFByb3BlcnR5UmVhZCkge31cblxuICB2aXNpdFByb3BlcnR5V3JpdGUoYXN0OiBQcm9wZXJ0eVdyaXRlKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdFNhZmVQcm9wZXJ0eVJlYWQoYXN0OiBTYWZlUHJvcGVydHlSZWFkKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdE1ldGhvZENhbGwoYXN0OiBNZXRob2RDYWxsKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdFNhZmVNZXRob2RDYWxsKGFzdDogU2FmZU1ldGhvZENhbGwpIHsgdGhpcy5zaW1wbGUgPSBmYWxzZTsgfVxuXG4gIHZpc2l0RnVuY3Rpb25DYWxsKGFzdDogRnVuY3Rpb25DYWxsKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdExpdGVyYWxBcnJheShhc3Q6IExpdGVyYWxBcnJheSkgeyB0aGlzLnZpc2l0QWxsKGFzdC5leHByZXNzaW9ucyk7IH1cblxuICB2aXNpdExpdGVyYWxNYXAoYXN0OiBMaXRlcmFsTWFwKSB7IHRoaXMudmlzaXRBbGwoYXN0LnZhbHVlcyk7IH1cblxuICB2aXNpdEJpbmFyeShhc3Q6IEJpbmFyeSkgeyB0aGlzLnNpbXBsZSA9IGZhbHNlOyB9XG5cbiAgdmlzaXRQcmVmaXhOb3QoYXN0OiBQcmVmaXhOb3QpIHsgdGhpcy5zaW1wbGUgPSBmYWxzZTsgfVxuXG4gIHZpc2l0Q29uZGl0aW9uYWwoYXN0OiBDb25kaXRpb25hbCkgeyB0aGlzLnNpbXBsZSA9IGZhbHNlOyB9XG5cbiAgdmlzaXRQaXBlKGFzdDogQmluZGluZ1BpcGUpIHsgdGhpcy5zaW1wbGUgPSBmYWxzZTsgfVxuXG4gIHZpc2l0S2V5ZWRSZWFkKGFzdDogS2V5ZWRSZWFkKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdEtleWVkV3JpdGUoYXN0OiBLZXllZFdyaXRlKSB7IHRoaXMuc2ltcGxlID0gZmFsc2U7IH1cblxuICB2aXNpdEFsbChhc3RzOiBhbnlbXSk6IGFueVtdIHtcbiAgICB2YXIgcmVzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKGFzdHMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFzdHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHJlc1tpXSA9IGFzdHNbaV0udmlzaXQodGhpcyk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICB2aXNpdENoYWluKGFzdDogQ2hhaW4pIHsgdGhpcy5zaW1wbGUgPSBmYWxzZTsgfVxuXG4gIHZpc2l0UXVvdGUoYXN0OiBRdW90ZSkgeyB0aGlzLnNpbXBsZSA9IGZhbHNlOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9wYXJzZXIudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIE1hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmV4cG9ydCBjbGFzcyBMb2NhbHMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyZW50OiBMb2NhbHMsIHB1YmxpYyBjdXJyZW50OiBNYXA8YW55LCBhbnk+KSB7fVxuXG4gIGNvbnRhaW5zKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmN1cnJlbnQuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucGFyZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmNvbnRhaW5zKG5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGdldChuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIGlmICh0aGlzLmN1cnJlbnQuaGFzKG5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5jdXJyZW50LmdldChuYW1lKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucGFyZW50KSkge1xuICAgICAgcmV0dXJuIHRoaXMucGFyZW50LmdldChuYW1lKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ2Fubm90IGZpbmQgJyR7bmFtZX0nYCk7XG4gIH1cblxuICBzZXQobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgLy8gVE9ETyhyYWRvKTogY29uc2lkZXIgcmVtb3ZpbmcgdGhpcyBjaGVjayBpZiB3ZSBjYW4gZ3VhcmFudGVlIHRoaXMgaXMgbm90XG4gICAgLy8gZXhwb3NlZCB0byB0aGUgcHVibGljIEFQSS5cbiAgICAvLyBUT0RPOiB2c2F2a2luIG1heWJlIGl0IHNob3VsZCBjaGVjayBvbmx5IHRoZSBsb2NhbCBtYXBcbiAgICBpZiAodGhpcy5jdXJyZW50LmhhcyhuYW1lKSkge1xuICAgICAgdGhpcy5jdXJyZW50LnNldChuYW1lLCB2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgIGBTZXR0aW5nIG9mIG5ldyBrZXlzIHBvc3QtY29uc3RydWN0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuIEtleTogJHtuYW1lfS5gKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclZhbHVlcygpOiB2b2lkIHsgTWFwV3JhcHBlci5jbGVhclZhbHVlcyh0aGlzLmN1cnJlbnQpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9sb2NhbHMudHNcbiAqKi8iLCJpbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gXCJhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnNcIjtcblxuLyoqXG4gKiBBbiBlcnJvciB0aHJvd24gaWYgYXBwbGljYXRpb24gY2hhbmdlcyBtb2RlbCBicmVha2luZyB0aGUgdG9wLWRvd24gZGF0YSBmbG93LlxuICpcbiAqIFRoaXMgZXhjZXB0aW9uIGlzIG9ubHkgdGhyb3duIGluIGRldiBtb2RlLlxuICpcbiAqIDwhLS0gVE9ETzogQWRkIGEgbGluayBvbmNlIHRoZSBkZXYgbW9kZSBvcHRpb24gaXMgY29uZmlndXJhYmxlIC0tPlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAncGFyZW50JyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8Y2hpbGQgW3Byb3BdPVwicGFyZW50UHJvcFwiPjwvY2hpbGQ+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtmb3J3YXJkUmVmKCgpID0+IENoaWxkKV1cbiAqIH0pXG4gKiBjbGFzcyBQYXJlbnQge1xuICogICBwYXJlbnRQcm9wID0gXCJpbml0XCI7XG4gKiB9XG4gKlxuICogQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdjaGlsZCcsIGlucHV0czogWydwcm9wJ119KVxuICogY2xhc3MgQ2hpbGQge1xuICogICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyZW50OiBQYXJlbnQpIHt9XG4gKlxuICogICBzZXQgcHJvcCh2KSB7XG4gKiAgICAgLy8gdGhpcyB1cGRhdGVzIHRoZSBwYXJlbnQgcHJvcGVydHksIHdoaWNoIGlzIGRpc2FsbG93ZWQgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb25cbiAqICAgICAvLyB0aGlzIHdpbGwgcmVzdWx0IGluIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXhjZXB0aW9uXG4gKiAgICAgdGhpcy5wYXJlbnQucGFyZW50UHJvcCA9IFwidXBkYXRlZFwiO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKGV4cDogc3RyaW5nLCBvbGRWYWx1ZTogYW55LCBjdXJyVmFsdWU6IGFueSwgY29udGV4dDogYW55KSB7XG4gICAgc3VwZXIoYEV4cHJlc3Npb24gJyR7ZXhwfScgaGFzIGNoYW5nZWQgYWZ0ZXIgaXQgd2FzIGNoZWNrZWQuIGAgK1xuICAgICAgICAgIGBQcmV2aW91cyB2YWx1ZTogJyR7b2xkVmFsdWV9Jy4gQ3VycmVudCB2YWx1ZTogJyR7Y3VyclZhbHVlfSdgKTtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGFuIGV4cHJlc3Npb24gZXZhbHVhdGlvbiByYWlzZXMgYW4gZXhjZXB0aW9uLlxuICpcbiAqIFRoaXMgZXJyb3Igd3JhcHMgdGhlIG9yaWdpbmFsIGV4Y2VwdGlvbiB0byBhdHRhY2ggYWRkaXRpb25hbCBjb250ZXh0dWFsIGluZm9ybWF0aW9uIHRoYXQgY2FuXG4gKiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZy5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvMkt5d296P3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdjaGlsZCcsIGlucHV0czogWydwcm9wJ119KVxuICogY2xhc3MgQ2hpbGQge1xuICogICBwcm9wO1xuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgPGNoaWxkIFtwcm9wXT1cImZpZWxkLmZpcnN0XCI+PC9jaGlsZD5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW0NoaWxkXVxuICogfSlcbiAqIGNsYXNzIEFwcCB7XG4gKiAgIGZpZWxkID0gbnVsbDtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKTtcbiAqIGBgYFxuICpcbiAqIFlvdSBjYW4gYWNjZXNzIHRoZSBvcmlnaW5hbCBleGNlcHRpb24gYW5kIHN0YWNrIHRocm91Z2ggdGhlIGBvcmlnaW5hbEV4Y2VwdGlvbmAgYW5kXG4gKiBgb3JpZ2luYWxTdGFja2AgcHJvcGVydGllcy5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYW5nZURldGVjdGlvbkVycm9yIGV4dGVuZHMgV3JhcHBlZEV4Y2VwdGlvbiB7XG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXhwcmVzc2lvbiB0aGF0IHRyaWdnZXJlZCB0aGUgZXhjZXB0aW9uLlxuICAgKi9cbiAgbG9jYXRpb246IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihleHA6IHN0cmluZywgb3JpZ2luYWxFeGNlcHRpb246IGFueSwgb3JpZ2luYWxTdGFjazogYW55LCBjb250ZXh0OiBhbnkpIHtcbiAgICBzdXBlcihgJHtvcmlnaW5hbEV4Y2VwdGlvbn0gaW4gWyR7ZXhwfV1gLCBvcmlnaW5hbEV4Y2VwdGlvbiwgb3JpZ2luYWxTdGFjaywgY29udGV4dCk7XG4gICAgdGhpcy5sb2NhdGlvbiA9IGV4cDtcbiAgfVxufVxuXG4vKipcbiAqIFRocm93biB3aGVuIGNoYW5nZSBkZXRlY3RvciBleGVjdXRlcyBvbiBkZWh5ZHJhdGVkIHZpZXcuXG4gKlxuICogVGhpcyBlcnJvciBpbmRpY2F0ZXMgYSBidWcgaW4gdGhlIGZyYW1ld29yay5cbiAqXG4gKiBUaGlzIGlzIGFuIGludGVybmFsIEFuZ3VsYXIgZXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBEZWh5ZHJhdGVkRXhjZXB0aW9uIGV4dGVuZHMgQmFzZUV4Y2VwdGlvbiB7XG4gIGNvbnN0cnVjdG9yKCkgeyBzdXBlcignQXR0ZW1wdCB0byBkZXRlY3QgY2hhbmdlcyBvbiBhIGRlaHlkcmF0ZWQgZGV0ZWN0b3IuJyk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vZXhjZXB0aW9ucy50c1xuICoqLyIsImltcG9ydCB7TG9jYWxzfSBmcm9tICcuL3BhcnNlci9sb2NhbHMnO1xuaW1wb3J0IHtCaW5kaW5nVGFyZ2V0LCBCaW5kaW5nUmVjb3JkfSBmcm9tICcuL2JpbmRpbmdfcmVjb3JkJztcbmltcG9ydCB7RGlyZWN0aXZlSW5kZXgsIERpcmVjdGl2ZVJlY29yZH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWZ9IGZyb20gJy4vY2hhbmdlX2RldGVjdG9yX3JlZic7XG5cbmV4cG9ydCBjbGFzcyBEZWJ1Z0NvbnRleHQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogYW55LCBwdWJsaWMgY29tcG9uZW50RWxlbWVudDogYW55LCBwdWJsaWMgZGlyZWN0aXZlOiBhbnksXG4gICAgICAgICAgICAgIHB1YmxpYyBjb250ZXh0OiBhbnksIHB1YmxpYyBsb2NhbHM6IGFueSwgcHVibGljIGluamVjdG9yOiBhbnkpIHt9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2hhbmdlRGlzcGF0Y2hlciB7XG4gIGdldERlYnVnQ29udGV4dChlbGVtZW50SW5kZXg6IG51bWJlciwgZGlyZWN0aXZlSW5kZXg6IERpcmVjdGl2ZUluZGV4KTogRGVidWdDb250ZXh0O1xuICBub3RpZnlPbkJpbmRpbmcoYmluZGluZ1RhcmdldDogQmluZGluZ1RhcmdldCwgdmFsdWU6IGFueSk6IHZvaWQ7XG4gIGxvZ0JpbmRpbmdVcGRhdGUoYmluZGluZ1RhcmdldDogQmluZGluZ1RhcmdldCwgdmFsdWU6IGFueSk6IHZvaWQ7XG4gIG5vdGlmeUFmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZDtcbiAgbm90aWZ5QWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENoYW5nZURldGVjdG9yIHtcbiAgcGFyZW50OiBDaGFuZ2VEZXRlY3RvcjtcbiAgbW9kZTogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k7XG4gIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWY7XG5cbiAgYWRkQ29udGVudENoaWxkKGNkOiBDaGFuZ2VEZXRlY3Rvcik6IHZvaWQ7XG4gIGFkZFZpZXdDaGlsZChjZDogQ2hhbmdlRGV0ZWN0b3IpOiB2b2lkO1xuICByZW1vdmVDb250ZW50Q2hpbGQoY2Q6IENoYW5nZURldGVjdG9yKTogdm9pZDtcbiAgcmVtb3ZlVmlld0NoaWxkKGNkOiBDaGFuZ2VEZXRlY3Rvcik6IHZvaWQ7XG4gIHJlbW92ZSgpOiB2b2lkO1xuICBoeWRyYXRlKGNvbnRleHQ6IGFueSwgbG9jYWxzOiBMb2NhbHMsIGRpcmVjdGl2ZXM6IGFueSwgcGlwZXM6IGFueSk6IHZvaWQ7XG4gIGRlaHlkcmF0ZSgpOiB2b2lkO1xuICBtYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlKCk6IHZvaWQ7XG5cbiAgaGFuZGxlRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcsIGVsSW5kZXg6IG51bWJlciwgbG9jYWxzOiBMb2NhbHMpO1xuICBkZXRlY3RDaGFuZ2VzKCk6IHZvaWQ7XG4gIGNoZWNrTm9DaGFuZ2VzKCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvdG9DaGFuZ2VEZXRlY3RvciB7IGluc3RhbnRpYXRlKGRpc3BhdGNoZXI6IENoYW5nZURpc3BhdGNoZXIpOiBDaGFuZ2VEZXRlY3RvcjsgfVxuXG5leHBvcnQgY2xhc3MgQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZ2VuRGVidWdJbmZvOiBib29sZWFuLCBwdWJsaWMgbG9nQmluZGluZ1VwZGF0ZTogYm9vbGVhbixcbiAgICAgICAgICAgICAgcHVibGljIHVzZUppdDogYm9vbGVhbikge31cbn1cblxuZXhwb3J0IGNsYXNzIENoYW5nZURldGVjdG9yRGVmaW5pdGlvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgc3RyYXRlZ3k6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgICAgICAgICAgICBwdWJsaWMgdmFyaWFibGVOYW1lczogc3RyaW5nW10sIHB1YmxpYyBiaW5kaW5nUmVjb3JkczogQmluZGluZ1JlY29yZFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgZXZlbnRSZWNvcmRzOiBCaW5kaW5nUmVjb3JkW10sIHB1YmxpYyBkaXJlY3RpdmVSZWNvcmRzOiBEaXJlY3RpdmVSZWNvcmRbXSxcbiAgICAgICAgICAgICAgcHVibGljIGdlbkNvbmZpZzogQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcpIHt9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2ludGVyZmFjZXMudHNcbiAqKi8iLCJpbXBvcnQge1N0cmluZ1dyYXBwZXIsIG5vcm1hbGl6ZUJvb2wsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjaGFuZ2UgZGV0ZWN0b3IuXG4gKi9cbmV4cG9ydCBlbnVtIENoYW5nZURldGVjdG9yU3RhdGUge1xuICAvKipcbiAgICogYE5ldmVyQ2hlY2tlZGAgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIGRldGVjdG9yIGhhcyBub3QgYmVlbiBjaGVja2VkIHlldCwgYW5kXG4gICAqIGluaXRpYWxpemF0aW9uIG1ldGhvZHMgc2hvdWxkIGJlIGNhbGxlZCBkdXJpbmcgZGV0ZWN0aW9uLlxuICAgKi9cbiAgTmV2ZXJDaGVja2VkLFxuXG4gIC8qKlxuICAgKiBgQ2hlY2tlZEJlZm9yZWAgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIGRldGVjdG9yIGhhcyBzdWNjZXNzZnVsbHkgY29tcGxldGVkIGF0IGxlYXN0XG4gICAqIG9uZSBkZXRlY3Rpb24gcHJldmlvdXNseS5cbiAgICovXG4gIENoZWNrZWRCZWZvcmUsXG5cbiAgLyoqXG4gICAqIGBFcnJvcmVkYCBtZWFucyB0aGF0IHRoZSBjaGFuZ2UgZGV0ZWN0b3IgZW5jb3VudGVyZWQgYW4gZXJyb3IgY2hlY2tpbmcgYSBiaW5kaW5nXG4gICAqIG9yIGNhbGxpbmcgYSBkaXJlY3RpdmUgbGlmZWN5Y2xlIG1ldGhvZCBhbmQgaXMgbm93IGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gQ2hhbmdlXG4gICAqIGRldGVjdG9ycyBpbiB0aGlzIHN0YXRlIHdpbGwgbm8gbG9uZ2VyIGRldGVjdCBjaGFuZ2VzLlxuICAgKi9cbiAgRXJyb3JlZFxufVxuXG4vKipcbiAqIERlc2NyaWJlcyB3aXRoaW4gdGhlIGNoYW5nZSBkZXRlY3RvciB3aGljaCBzdHJhdGVneSB3aWxsIGJlIHVzZWQgdGhlIG5leHQgdGltZSBjaGFuZ2VcbiAqIGRldGVjdGlvbiBpcyB0cmlnZ2VyZWQuXG4gKi9cbmV4cG9ydCBlbnVtIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IHtcbiAgLyoqXG4gICAqIGBDaGVja2VkT25jZWAgbWVhbnMgdGhhdCBhZnRlciBjYWxsaW5nIGRldGVjdENoYW5nZXMgdGhlIG1vZGUgb2YgdGhlIGNoYW5nZSBkZXRlY3RvclxuICAgKiB3aWxsIGJlY29tZSBgQ2hlY2tlZGAuXG4gICAqL1xuICBDaGVja09uY2UsXG5cbiAgLyoqXG4gICAqIGBDaGVja2VkYCBtZWFucyB0aGF0IHRoZSBjaGFuZ2UgZGV0ZWN0b3Igc2hvdWxkIGJlIHNraXBwZWQgdW50aWwgaXRzIG1vZGUgY2hhbmdlcyB0b1xuICAgKiBgQ2hlY2tPbmNlYC5cbiAgICovXG4gIENoZWNrZWQsXG5cbiAgLyoqXG4gICAqIGBDaGVja0Fsd2F5c2AgbWVhbnMgdGhhdCBhZnRlciBjYWxsaW5nIGRldGVjdENoYW5nZXMgdGhlIG1vZGUgb2YgdGhlIGNoYW5nZSBkZXRlY3RvclxuICAgKiB3aWxsIHJlbWFpbiBgQ2hlY2tBbHdheXNgLlxuICAgKi9cbiAgQ2hlY2tBbHdheXMsXG5cbiAgLyoqXG4gICAqIGBEZXRhY2hlZGAgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIGRldGVjdG9yIHN1YiB0cmVlIGlzIG5vdCBhIHBhcnQgb2YgdGhlIG1haW4gdHJlZSBhbmRcbiAgICogc2hvdWxkIGJlIHNraXBwZWQuXG4gICAqL1xuICBEZXRhY2hlZCxcblxuICAvKipcbiAgICogYE9uUHVzaGAgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIGRldGVjdG9yJ3MgbW9kZSB3aWxsIGJlIHNldCB0byBgQ2hlY2tPbmNlYCBkdXJpbmcgaHlkcmF0aW9uLlxuICAgKi9cbiAgT25QdXNoLFxuXG4gIC8qKlxuICAgKiBgRGVmYXVsdGAgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIGRldGVjdG9yJ3MgbW9kZSB3aWxsIGJlIHNldCB0byBgQ2hlY2tBbHdheXNgIGR1cmluZyBoeWRyYXRpb24uXG4gICAqL1xuICBEZWZhdWx0LFxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gICAqL1xuICBPblB1c2hPYnNlcnZlXG59XG5cbi8qKlxuICogTGlzdCBvZiBwb3NzaWJsZSB7QGxpbmsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IHZhbHVlcy5cbiAqL1xuZXhwb3J0IHZhciBDSEFOR0VfREVURUNUSU9OX1NUUkFURUdZX1ZBTFVFUyA9IFtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuQ2hlY2tPbmNlLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5DaGVja2VkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5DaGVja0Fsd2F5cyxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGV0YWNoZWQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoT2JzZXJ2ZVxuXTtcblxuLyoqXG4gKiBMaXN0IG9mIHBvc3NpYmxlIHtAbGluayBDaGFuZ2VEZXRlY3RvclN0YXRlfSB2YWx1ZXMuXG4gKi9cbmV4cG9ydCB2YXIgQ0hBTkdFX0RFVEVDVE9SX1NUQVRFX1ZBTFVFUyA9IFtcbiAgQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5OZXZlckNoZWNrZWQsXG4gIENoYW5nZURldGVjdG9yU3RhdGUuQ2hlY2tlZEJlZm9yZSxcbiAgQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5FcnJvcmVkXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3koXG4gICAgY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5KTogYm9vbGVhbiB7XG4gIHJldHVybiBpc0JsYW5rKGNoYW5nZURldGVjdGlvblN0cmF0ZWd5KSB8fFxuICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQ7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NvbnN0YW50cy50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgaXNCbGFuaywgaXNQcmVzZW50LCBpc1N0cmluZ30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCB7XG4gIFByb3BlcnR5UmVhZCxcbiAgUHJvcGVydHlXcml0ZSxcbiAgS2V5ZWRXcml0ZSxcbiAgQVNULFxuICBBU1RXaXRoU291cmNlLFxuICBBc3RWaXNpdG9yLFxuICBCaW5hcnksXG4gIENoYWluLFxuICBDb25kaXRpb25hbCxcbiAgQmluZGluZ1BpcGUsXG4gIEZ1bmN0aW9uQ2FsbCxcbiAgSW1wbGljaXRSZWNlaXZlcixcbiAgSW50ZXJwb2xhdGlvbixcbiAgS2V5ZWRSZWFkLFxuICBMaXRlcmFsQXJyYXksXG4gIExpdGVyYWxNYXAsXG4gIExpdGVyYWxQcmltaXRpdmUsXG4gIE1ldGhvZENhbGwsXG4gIFByZWZpeE5vdCxcbiAgUXVvdGUsXG4gIFNhZmVQcm9wZXJ0eVJlYWQsXG4gIFNhZmVNZXRob2RDYWxsXG59IGZyb20gJy4vcGFyc2VyL2FzdCc7XG5cbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3IsIFByb3RvQ2hhbmdlRGV0ZWN0b3IsIENoYW5nZURldGVjdG9yRGVmaW5pdGlvbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uVXRpbH0gZnJvbSAnLi9jaGFuZ2VfZGV0ZWN0aW9uX3V0aWwnO1xuaW1wb3J0IHtEeW5hbWljQ2hhbmdlRGV0ZWN0b3J9IGZyb20gJy4vZHluYW1pY19jaGFuZ2VfZGV0ZWN0b3InO1xuaW1wb3J0IHtCaW5kaW5nUmVjb3JkLCBCaW5kaW5nVGFyZ2V0fSBmcm9tICcuL2JpbmRpbmdfcmVjb3JkJztcbmltcG9ydCB7RGlyZWN0aXZlUmVjb3JkLCBEaXJlY3RpdmVJbmRleH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcbmltcG9ydCB7RXZlbnRCaW5kaW5nfSBmcm9tICcuL2V2ZW50X2JpbmRpbmcnO1xuXG5pbXBvcnQge2NvYWxlc2NlfSBmcm9tICcuL2NvYWxlc2NlJztcbmltcG9ydCB7UHJvdG9SZWNvcmQsIFJlY29yZFR5cGV9IGZyb20gJy4vcHJvdG9fcmVjb3JkJztcblxuZXhwb3J0IGNsYXNzIER5bmFtaWNQcm90b0NoYW5nZURldGVjdG9yIGltcGxlbWVudHMgUHJvdG9DaGFuZ2VEZXRlY3RvciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3Byb3BlcnR5QmluZGluZ1JlY29yZHM6IFByb3RvUmVjb3JkW107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3Byb3BlcnR5QmluZGluZ1RhcmdldHM6IEJpbmRpbmdUYXJnZXRbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZXZlbnRCaW5kaW5nUmVjb3JkczogRXZlbnRCaW5kaW5nW107XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2RpcmVjdGl2ZUluZGljZXM6IERpcmVjdGl2ZUluZGV4W107XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGVmaW5pdGlvbjogQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uKSB7XG4gICAgdGhpcy5fcHJvcGVydHlCaW5kaW5nUmVjb3JkcyA9IGNyZWF0ZVByb3BlcnR5UmVjb3JkcyhfZGVmaW5pdGlvbik7XG4gICAgdGhpcy5fZXZlbnRCaW5kaW5nUmVjb3JkcyA9IGNyZWF0ZUV2ZW50UmVjb3JkcyhfZGVmaW5pdGlvbik7XG4gICAgdGhpcy5fcHJvcGVydHlCaW5kaW5nVGFyZ2V0cyA9IHRoaXMuX2RlZmluaXRpb24uYmluZGluZ1JlY29yZHMubWFwKGIgPT4gYi50YXJnZXQpO1xuICAgIHRoaXMuX2RpcmVjdGl2ZUluZGljZXMgPSB0aGlzLl9kZWZpbml0aW9uLmRpcmVjdGl2ZVJlY29yZHMubWFwKGQgPT4gZC5kaXJlY3RpdmVJbmRleCk7XG4gIH1cblxuICBpbnN0YW50aWF0ZShkaXNwYXRjaGVyOiBhbnkpOiBDaGFuZ2VEZXRlY3RvciB7XG4gICAgcmV0dXJuIG5ldyBEeW5hbWljQ2hhbmdlRGV0ZWN0b3IoXG4gICAgICAgIHRoaXMuX2RlZmluaXRpb24uaWQsIGRpc3BhdGNoZXIsIHRoaXMuX3Byb3BlcnR5QmluZGluZ1JlY29yZHMubGVuZ3RoLFxuICAgICAgICB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdUYXJnZXRzLCB0aGlzLl9kaXJlY3RpdmVJbmRpY2VzLCB0aGlzLl9kZWZpbml0aW9uLnN0cmF0ZWd5LFxuICAgICAgICB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdSZWNvcmRzLCB0aGlzLl9ldmVudEJpbmRpbmdSZWNvcmRzLCB0aGlzLl9kZWZpbml0aW9uLmRpcmVjdGl2ZVJlY29yZHMsXG4gICAgICAgIHRoaXMuX2RlZmluaXRpb24uZ2VuQ29uZmlnKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlSZWNvcmRzKGRlZmluaXRpb246IENoYW5nZURldGVjdG9yRGVmaW5pdGlvbik6IFByb3RvUmVjb3JkW10ge1xuICB2YXIgcmVjb3JkQnVpbGRlciA9IG5ldyBQcm90b1JlY29yZEJ1aWxkZXIoKTtcbiAgTGlzdFdyYXBwZXIuZm9yRWFjaFdpdGhJbmRleChkZWZpbml0aW9uLmJpbmRpbmdSZWNvcmRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiLCBpbmRleCkgPT4gcmVjb3JkQnVpbGRlci5hZGQoYiwgZGVmaW5pdGlvbi52YXJpYWJsZU5hbWVzLCBpbmRleCkpO1xuICByZXR1cm4gY29hbGVzY2UocmVjb3JkQnVpbGRlci5yZWNvcmRzKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUV2ZW50UmVjb3JkcyhkZWZpbml0aW9uOiBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24pOiBFdmVudEJpbmRpbmdbXSB7XG4gIC8vIFRPRE86IHZzYXZraW46IHJlbW92ZSAkZXZlbnQgd2hlbiB0aGUgY29tcGlsZXIgaGFuZGxlcyByZW5kZXItc2lkZSB2YXJpYWJsZXMgcHJvcGVybHlcbiAgdmFyIHZhck5hbWVzID0gTGlzdFdyYXBwZXIuY29uY2F0KFsnJGV2ZW50J10sIGRlZmluaXRpb24udmFyaWFibGVOYW1lcyk7XG4gIHJldHVybiBkZWZpbml0aW9uLmV2ZW50UmVjb3Jkcy5tYXAoZXIgPT4ge1xuICAgIHZhciByZWNvcmRzID0gX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLmNyZWF0ZShlciwgdmFyTmFtZXMpO1xuICAgIHZhciBkaXJJbmRleCA9IGVyLmltcGxpY2l0UmVjZWl2ZXIgaW5zdGFuY2VvZiBEaXJlY3RpdmVJbmRleCA/IGVyLmltcGxpY2l0UmVjZWl2ZXIgOiBudWxsO1xuICAgIHJldHVybiBuZXcgRXZlbnRCaW5kaW5nKGVyLnRhcmdldC5uYW1lLCBlci50YXJnZXQuZWxlbWVudEluZGV4LCBkaXJJbmRleCwgcmVjb3Jkcyk7XG4gIH0pO1xufVxuXG5leHBvcnQgY2xhc3MgUHJvdG9SZWNvcmRCdWlsZGVyIHtcbiAgcmVjb3JkczogUHJvdG9SZWNvcmRbXSA9IFtdO1xuXG4gIGFkZChiOiBCaW5kaW5nUmVjb3JkLCB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXSwgYmluZGluZ0luZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgb2xkTGFzdCA9IExpc3RXcmFwcGVyLmxhc3QodGhpcy5yZWNvcmRzKTtcbiAgICBpZiAoaXNQcmVzZW50KG9sZExhc3QpICYmIG9sZExhc3QuYmluZGluZ1JlY29yZC5kaXJlY3RpdmVSZWNvcmQgPT0gYi5kaXJlY3RpdmVSZWNvcmQpIHtcbiAgICAgIG9sZExhc3QubGFzdEluRGlyZWN0aXZlID0gZmFsc2U7XG4gICAgfVxuICAgIHZhciBudW1iZXJPZlJlY29yZHNCZWZvcmUgPSB0aGlzLnJlY29yZHMubGVuZ3RoO1xuICAgIHRoaXMuX2FwcGVuZFJlY29yZHMoYiwgdmFyaWFibGVOYW1lcywgYmluZGluZ0luZGV4KTtcbiAgICB2YXIgbmV3TGFzdCA9IExpc3RXcmFwcGVyLmxhc3QodGhpcy5yZWNvcmRzKTtcbiAgICBpZiAoaXNQcmVzZW50KG5ld0xhc3QpICYmIG5ld0xhc3QgIT09IG9sZExhc3QpIHtcbiAgICAgIG5ld0xhc3QubGFzdEluQmluZGluZyA9IHRydWU7XG4gICAgICBuZXdMYXN0Lmxhc3RJbkRpcmVjdGl2ZSA9IHRydWU7XG4gICAgICB0aGlzLl9zZXRBcmd1bWVudFRvUHVyZUZ1bmN0aW9uKG51bWJlck9mUmVjb3Jkc0JlZm9yZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc2V0QXJndW1lbnRUb1B1cmVGdW5jdGlvbihzdGFydEluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICBmb3IgKHZhciBpID0gc3RhcnRJbmRleDsgaSA8IHRoaXMucmVjb3Jkcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHJlYyA9IHRoaXMucmVjb3Jkc1tpXTtcbiAgICAgIGlmIChyZWMuaXNQdXJlRnVuY3Rpb24oKSkge1xuICAgICAgICByZWMuYXJncy5mb3JFYWNoKHJlY29yZEluZGV4ID0+IHRoaXMucmVjb3Jkc1tyZWNvcmRJbmRleCAtIDFdLmFyZ3VtZW50VG9QdXJlRnVuY3Rpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWMubW9kZSA9PT0gUmVjb3JkVHlwZS5QaXBlKSB7XG4gICAgICAgIHJlYy5hcmdzLmZvckVhY2gocmVjb3JkSW5kZXggPT4gdGhpcy5yZWNvcmRzW3JlY29yZEluZGV4IC0gMV0uYXJndW1lbnRUb1B1cmVGdW5jdGlvbiA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpO1xuICAgICAgICB0aGlzLnJlY29yZHNbcmVjLmNvbnRleHRJbmRleCAtIDFdLmFyZ3VtZW50VG9QdXJlRnVuY3Rpb24gPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FwcGVuZFJlY29yZHMoYjogQmluZGluZ1JlY29yZCwgdmFyaWFibGVOYW1lczogc3RyaW5nW10sIGJpbmRpbmdJbmRleDogbnVtYmVyKSB7XG4gICAgaWYgKGIuaXNEaXJlY3RpdmVMaWZlY3ljbGUoKSkge1xuICAgICAgdGhpcy5yZWNvcmRzLnB1c2gobmV3IFByb3RvUmVjb3JkKFJlY29yZFR5cGUuRGlyZWN0aXZlTGlmZWN5Y2xlLCBiLmxpZmVjeWNsZUV2ZW50LCBudWxsLCBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgLTEsIG51bGwsIHRoaXMucmVjb3Jkcy5sZW5ndGggKyAxLCBiLCBmYWxzZSwgZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlLCBudWxsKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIF9Db252ZXJ0QXN0SW50b1Byb3RvUmVjb3Jkcy5hcHBlbmQodGhpcy5yZWNvcmRzLCBiLCB2YXJpYWJsZU5hbWVzLCBiaW5kaW5nSW5kZXgpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMgaW1wbGVtZW50cyBBc3RWaXNpdG9yIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVjb3JkczogUHJvdG9SZWNvcmRbXSwgcHJpdmF0ZSBfYmluZGluZ1JlY29yZDogQmluZGluZ1JlY29yZCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdmFyaWFibGVOYW1lczogc3RyaW5nW10sIHByaXZhdGUgX2JpbmRpbmdJbmRleDogbnVtYmVyKSB7fVxuXG4gIHN0YXRpYyBhcHBlbmQocmVjb3JkczogUHJvdG9SZWNvcmRbXSwgYjogQmluZGluZ1JlY29yZCwgdmFyaWFibGVOYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgYmluZGluZ0luZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgYyA9IG5ldyBfQ29udmVydEFzdEludG9Qcm90b1JlY29yZHMocmVjb3JkcywgYiwgdmFyaWFibGVOYW1lcywgYmluZGluZ0luZGV4KTtcbiAgICBiLmFzdC52aXNpdChjKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGUoYjogQmluZGluZ1JlY29yZCwgdmFyaWFibGVOYW1lczogYW55W10pOiBQcm90b1JlY29yZFtdIHtcbiAgICB2YXIgcmVjID0gW107XG4gICAgX0NvbnZlcnRBc3RJbnRvUHJvdG9SZWNvcmRzLmFwcGVuZChyZWMsIGIsIHZhcmlhYmxlTmFtZXMsIG51bGwpO1xuICAgIHJlY1tyZWMubGVuZ3RoIC0gMV0ubGFzdEluQmluZGluZyA9IHRydWU7XG4gICAgcmV0dXJuIHJlYztcbiAgfVxuXG4gIHZpc2l0SW1wbGljaXRSZWNlaXZlcihhc3Q6IEltcGxpY2l0UmVjZWl2ZXIpOiBhbnkgeyByZXR1cm4gdGhpcy5fYmluZGluZ1JlY29yZC5pbXBsaWNpdFJlY2VpdmVyOyB9XG5cbiAgdmlzaXRJbnRlcnBvbGF0aW9uKGFzdDogSW50ZXJwb2xhdGlvbik6IG51bWJlciB7XG4gICAgdmFyIGFyZ3MgPSB0aGlzLl92aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpO1xuICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5JbnRlcnBvbGF0ZSwgXCJpbnRlcnBvbGF0ZVwiLCBfaW50ZXJwb2xhdGlvbkZuKGFzdC5zdHJpbmdzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsIGFzdC5zdHJpbmdzLCAwKTtcbiAgfVxuXG4gIHZpc2l0TGl0ZXJhbFByaW1pdGl2ZShhc3Q6IExpdGVyYWxQcmltaXRpdmUpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5Db25zdCwgXCJsaXRlcmFsXCIsIGFzdC52YWx1ZSwgW10sIG51bGwsIDApO1xuICB9XG5cbiAgdmlzaXRQcm9wZXJ0eVJlYWQoYXN0OiBQcm9wZXJ0eVJlYWQpOiBudW1iZXIge1xuICAgIHZhciByZWNlaXZlciA9IGFzdC5yZWNlaXZlci52aXNpdCh0aGlzKTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3ZhcmlhYmxlTmFtZXMpICYmIExpc3RXcmFwcGVyLmNvbnRhaW5zKHRoaXMuX3ZhcmlhYmxlTmFtZXMsIGFzdC5uYW1lKSAmJlxuICAgICAgICBhc3QucmVjZWl2ZXIgaW5zdGFuY2VvZiBJbXBsaWNpdFJlY2VpdmVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuTG9jYWwsIGFzdC5uYW1lLCBhc3QubmFtZSwgW10sIG51bGwsIHJlY2VpdmVyKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlByb3BlcnR5UmVhZCwgYXN0Lm5hbWUsIGFzdC5nZXR0ZXIsIFtdLCBudWxsLCByZWNlaXZlcik7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRQcm9wZXJ0eVdyaXRlKGFzdDogUHJvcGVydHlXcml0ZSk6IG51bWJlciB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl92YXJpYWJsZU5hbWVzKSAmJiBMaXN0V3JhcHBlci5jb250YWlucyh0aGlzLl92YXJpYWJsZU5hbWVzLCBhc3QubmFtZSkgJiZcbiAgICAgICAgYXN0LnJlY2VpdmVyIGluc3RhbmNlb2YgSW1wbGljaXRSZWNlaXZlcikge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYENhbm5vdCByZWFzc2lnbiBhIHZhcmlhYmxlIGJpbmRpbmcgJHthc3QubmFtZX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHJlY2VpdmVyID0gYXN0LnJlY2VpdmVyLnZpc2l0KHRoaXMpO1xuICAgICAgdmFyIHZhbHVlID0gYXN0LnZhbHVlLnZpc2l0KHRoaXMpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlByb3BlcnR5V3JpdGUsIGFzdC5uYW1lLCBhc3Quc2V0dGVyLCBbdmFsdWVdLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlcik7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRLZXllZFdyaXRlKGFzdDogS2V5ZWRXcml0ZSk6IG51bWJlciB7XG4gICAgdmFyIG9iaiA9IGFzdC5vYmoudmlzaXQodGhpcyk7XG4gICAgdmFyIGtleSA9IGFzdC5rZXkudmlzaXQodGhpcyk7XG4gICAgdmFyIHZhbHVlID0gYXN0LnZhbHVlLnZpc2l0KHRoaXMpO1xuICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5LZXllZFdyaXRlLCBudWxsLCBudWxsLCBba2V5LCB2YWx1ZV0sIG51bGwsIG9iaik7XG4gIH1cblxuICB2aXNpdFNhZmVQcm9wZXJ0eVJlYWQoYXN0OiBTYWZlUHJvcGVydHlSZWFkKTogbnVtYmVyIHtcbiAgICB2YXIgcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlNhZmVQcm9wZXJ0eSwgYXN0Lm5hbWUsIGFzdC5nZXR0ZXIsIFtdLCBudWxsLCByZWNlaXZlcik7XG4gIH1cblxuICB2aXNpdE1ldGhvZENhbGwoYXN0OiBNZXRob2RDYWxsKTogbnVtYmVyIHtcbiAgICB2YXIgcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgdmFyIGFyZ3MgPSB0aGlzLl92aXNpdEFsbChhc3QuYXJncyk7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl92YXJpYWJsZU5hbWVzKSAmJiBMaXN0V3JhcHBlci5jb250YWlucyh0aGlzLl92YXJpYWJsZU5hbWVzLCBhc3QubmFtZSkpIHtcbiAgICAgIHZhciB0YXJnZXQgPSB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5Mb2NhbCwgYXN0Lm5hbWUsIGFzdC5uYW1lLCBbXSwgbnVsbCwgcmVjZWl2ZXIpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLkludm9rZUNsb3N1cmUsIFwiY2xvc3VyZVwiLCBudWxsLCBhcmdzLCBudWxsLCB0YXJnZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuSW52b2tlTWV0aG9kLCBhc3QubmFtZSwgYXN0LmZuLCBhcmdzLCBudWxsLCByZWNlaXZlcik7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRTYWZlTWV0aG9kQ2FsbChhc3Q6IFNhZmVNZXRob2RDYWxsKTogbnVtYmVyIHtcbiAgICB2YXIgcmVjZWl2ZXIgPSBhc3QucmVjZWl2ZXIudmlzaXQodGhpcyk7XG4gICAgdmFyIGFyZ3MgPSB0aGlzLl92aXNpdEFsbChhc3QuYXJncyk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlNhZmVNZXRob2RJbnZva2UsIGFzdC5uYW1lLCBhc3QuZm4sIGFyZ3MsIG51bGwsIHJlY2VpdmVyKTtcbiAgfVxuXG4gIHZpc2l0RnVuY3Rpb25DYWxsKGFzdDogRnVuY3Rpb25DYWxsKTogbnVtYmVyIHtcbiAgICB2YXIgdGFyZ2V0ID0gYXN0LnRhcmdldC52aXNpdCh0aGlzKTtcbiAgICB2YXIgYXJncyA9IHRoaXMuX3Zpc2l0QWxsKGFzdC5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuSW52b2tlQ2xvc3VyZSwgXCJjbG9zdXJlXCIsIG51bGwsIGFyZ3MsIG51bGwsIHRhcmdldCk7XG4gIH1cblxuICB2aXNpdExpdGVyYWxBcnJheShhc3Q6IExpdGVyYWxBcnJheSk6IG51bWJlciB7XG4gICAgdmFyIHByaW1pdGl2ZU5hbWUgPSBgYXJyYXlGbiR7YXN0LmV4cHJlc3Npb25zLmxlbmd0aH1gO1xuICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5Db2xsZWN0aW9uTGl0ZXJhbCwgcHJpbWl0aXZlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hcnJheUZuKGFzdC5leHByZXNzaW9ucy5sZW5ndGgpLCB0aGlzLl92aXNpdEFsbChhc3QuZXhwcmVzc2lvbnMpLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7XG4gIH1cblxuICB2aXNpdExpdGVyYWxNYXAoYXN0OiBMaXRlcmFsTWFwKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuQ29sbGVjdGlvbkxpdGVyYWwsIF9tYXBQcmltaXRpdmVOYW1lKGFzdC5rZXlzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5nZURldGVjdGlvblV0aWwubWFwRm4oYXN0LmtleXMpLCB0aGlzLl92aXNpdEFsbChhc3QudmFsdWVzKSwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDApO1xuICB9XG5cbiAgdmlzaXRCaW5hcnkoYXN0OiBCaW5hcnkpOiBudW1iZXIge1xuICAgIHZhciBsZWZ0ID0gYXN0LmxlZnQudmlzaXQodGhpcyk7XG4gICAgc3dpdGNoIChhc3Qub3BlcmF0aW9uKSB7XG4gICAgICBjYXNlICcmJic6XG4gICAgICAgIHZhciBicmFuY2hFbmQgPSBbbnVsbF07XG4gICAgICAgIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlNraXBSZWNvcmRzSWZOb3QsIFwiU2tpcFJlY29yZHNJZk5vdFwiLCBudWxsLCBbXSwgYnJhbmNoRW5kLCBsZWZ0KTtcbiAgICAgICAgdmFyIHJpZ2h0ID0gYXN0LnJpZ2h0LnZpc2l0KHRoaXMpO1xuICAgICAgICBicmFuY2hFbmRbMF0gPSByaWdodDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlByaW1pdGl2ZU9wLCBcImNvbmRcIiwgQ2hhbmdlRGV0ZWN0aW9uVXRpbC5jb25kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsZWZ0LCByaWdodCwgbGVmdF0sIG51bGwsIDApO1xuXG4gICAgICBjYXNlICd8fCc6XG4gICAgICAgIHZhciBicmFuY2hFbmQgPSBbbnVsbF07XG4gICAgICAgIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlNraXBSZWNvcmRzSWYsIFwiU2tpcFJlY29yZHNJZlwiLCBudWxsLCBbXSwgYnJhbmNoRW5kLCBsZWZ0KTtcbiAgICAgICAgdmFyIHJpZ2h0ID0gYXN0LnJpZ2h0LnZpc2l0KHRoaXMpO1xuICAgICAgICBicmFuY2hFbmRbMF0gPSByaWdodDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLlByaW1pdGl2ZU9wLCBcImNvbmRcIiwgQ2hhbmdlRGV0ZWN0aW9uVXRpbC5jb25kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsZWZ0LCBsZWZ0LCByaWdodF0sIG51bGwsIDApO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB2YXIgcmlnaHQgPSBhc3QucmlnaHQudmlzaXQodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5QcmltaXRpdmVPcCwgX29wZXJhdGlvblRvUHJpbWl0aXZlTmFtZShhc3Qub3BlcmF0aW9uKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb3BlcmF0aW9uVG9GdW5jdGlvbihhc3Qub3BlcmF0aW9uKSwgW2xlZnQsIHJpZ2h0XSwgbnVsbCwgMCk7XG4gICAgfVxuICB9XG5cbiAgdmlzaXRQcmVmaXhOb3QoYXN0OiBQcmVmaXhOb3QpOiBudW1iZXIge1xuICAgIHZhciBleHAgPSBhc3QuZXhwcmVzc2lvbi52aXNpdCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuUHJpbWl0aXZlT3AsIFwib3BlcmF0aW9uX25lZ2F0ZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fbmVnYXRlLCBbZXhwXSwgbnVsbCwgMCk7XG4gIH1cblxuICB2aXNpdENvbmRpdGlvbmFsKGFzdDogQ29uZGl0aW9uYWwpOiBudW1iZXIge1xuICAgIHZhciBjb25kaXRpb24gPSBhc3QuY29uZGl0aW9uLnZpc2l0KHRoaXMpO1xuICAgIHZhciBzdGFydE9mRmFsc2VCcmFuY2ggPSBbbnVsbF07XG4gICAgdmFyIGVuZE9mRmFsc2VCcmFuY2ggPSBbbnVsbF07XG4gICAgdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuU2tpcFJlY29yZHNJZk5vdCwgXCJTa2lwUmVjb3Jkc0lmTm90XCIsIG51bGwsIFtdLCBzdGFydE9mRmFsc2VCcmFuY2gsXG4gICAgICAgICAgICAgICAgICAgIGNvbmRpdGlvbik7XG4gICAgdmFyIHdoZW5UcnVlID0gYXN0LnRydWVFeHAudmlzaXQodGhpcyk7XG4gICAgdmFyIHNraXAgPVxuICAgICAgICB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5Ta2lwUmVjb3JkcywgXCJTa2lwUmVjb3Jkc1wiLCBudWxsLCBbXSwgZW5kT2ZGYWxzZUJyYW5jaCwgMCk7XG4gICAgdmFyIHdoZW5GYWxzZSA9IGFzdC5mYWxzZUV4cC52aXNpdCh0aGlzKTtcbiAgICBzdGFydE9mRmFsc2VCcmFuY2hbMF0gPSBza2lwO1xuICAgIGVuZE9mRmFsc2VCcmFuY2hbMF0gPSB3aGVuRmFsc2U7XG5cbiAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuUHJpbWl0aXZlT3AsIFwiY29uZFwiLCBDaGFuZ2VEZXRlY3Rpb25VdGlsLmNvbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBbY29uZGl0aW9uLCB3aGVuVHJ1ZSwgd2hlbkZhbHNlXSwgbnVsbCwgMCk7XG4gIH1cblxuICB2aXNpdFBpcGUoYXN0OiBCaW5kaW5nUGlwZSk6IG51bWJlciB7XG4gICAgdmFyIHZhbHVlID0gYXN0LmV4cC52aXNpdCh0aGlzKTtcbiAgICB2YXIgYXJncyA9IHRoaXMuX3Zpc2l0QWxsKGFzdC5hcmdzKTtcbiAgICByZXR1cm4gdGhpcy5fYWRkUmVjb3JkKFJlY29yZFR5cGUuUGlwZSwgYXN0Lm5hbWUsIGFzdC5uYW1lLCBhcmdzLCBudWxsLCB2YWx1ZSk7XG4gIH1cblxuICB2aXNpdEtleWVkUmVhZChhc3Q6IEtleWVkUmVhZCk6IG51bWJlciB7XG4gICAgdmFyIG9iaiA9IGFzdC5vYmoudmlzaXQodGhpcyk7XG4gICAgdmFyIGtleSA9IGFzdC5rZXkudmlzaXQodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuX2FkZFJlY29yZChSZWNvcmRUeXBlLktleWVkUmVhZCwgXCJrZXllZEFjY2Vzc1wiLCBDaGFuZ2VEZXRlY3Rpb25VdGlsLmtleWVkQWNjZXNzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgW2tleV0sIG51bGwsIG9iaik7XG4gIH1cblxuICB2aXNpdENoYWluKGFzdDogQ2hhaW4pOiBudW1iZXIge1xuICAgIHZhciBhcmdzID0gYXN0LmV4cHJlc3Npb25zLm1hcChlID0+IGUudmlzaXQodGhpcykpO1xuICAgIHJldHVybiB0aGlzLl9hZGRSZWNvcmQoUmVjb3JkVHlwZS5DaGFpbiwgXCJjaGFpblwiLCBudWxsLCBhcmdzLCBudWxsLCAwKTtcbiAgfVxuXG4gIHZpc2l0UXVvdGUoYXN0OiBRdW90ZSk6IHZvaWQge1xuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICBgQ2F1Z2h0IHVuaW50ZXJwcmV0ZWQgZXhwcmVzc2lvbiBhdCAke2FzdC5sb2NhdGlvbn06ICR7YXN0LnVuaW50ZXJwcmV0ZWRFeHByZXNzaW9ufS4gYCArXG4gICAgICAgIGBFeHByZXNzaW9uIHByZWZpeCAke2FzdC5wcmVmaXh9IGRpZCBub3QgbWF0Y2ggYSB0ZW1wbGF0ZSB0cmFuc2Zvcm1lciB0byBpbnRlcnByZXQgdGhlIGV4cHJlc3Npb24uYCk7XG4gIH1cblxuICBwcml2YXRlIF92aXNpdEFsbChhc3RzOiBhbnlbXSkge1xuICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUoYXN0cy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN0cy5sZW5ndGg7ICsraSkge1xuICAgICAgcmVzW2ldID0gYXN0c1tpXS52aXNpdCh0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgYFByb3RvUmVjb3JkYCBhbmQgcmV0dXJucyBpdHMgc2VsZkluZGV4LlxuICAgKi9cbiAgcHJpdmF0ZSBfYWRkUmVjb3JkKHR5cGUsIG5hbWUsIGZ1bmNPclZhbHVlLCBhcmdzLCBmaXhlZEFyZ3MsIGNvbnRleHQpOiBudW1iZXIge1xuICAgIHZhciBzZWxmSW5kZXggPSB0aGlzLl9yZWNvcmRzLmxlbmd0aCArIDE7XG4gICAgaWYgKGNvbnRleHQgaW5zdGFuY2VvZiBEaXJlY3RpdmVJbmRleCkge1xuICAgICAgdGhpcy5fcmVjb3Jkcy5wdXNoKG5ldyBQcm90b1JlY29yZCh0eXBlLCBuYW1lLCBmdW5jT3JWYWx1ZSwgYXJncywgZml4ZWRBcmdzLCAtMSwgY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZkluZGV4LCB0aGlzLl9iaW5kaW5nUmVjb3JkLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmluZGluZ0luZGV4KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3JlY29yZHMucHVzaChuZXcgUHJvdG9SZWNvcmQodHlwZSwgbmFtZSwgZnVuY09yVmFsdWUsIGFyZ3MsIGZpeGVkQXJncywgY29udGV4dCwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZkluZGV4LCB0aGlzLl9iaW5kaW5nUmVjb3JkLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmluZGluZ0luZGV4KSk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmSW5kZXg7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBfYXJyYXlGbihsZW5ndGg6IG51bWJlcik6IEZ1bmN0aW9uIHtcbiAgc3dpdGNoIChsZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuMDtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuMTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuMjtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuMztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNDtcbiAgICBjYXNlIDU6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNTtcbiAgICBjYXNlIDY6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNjtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuNztcbiAgICBjYXNlIDg6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuODtcbiAgICBjYXNlIDk6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5hcnJheUZuOTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYERvZXMgbm90IHN1cHBvcnQgbGl0ZXJhbCBtYXBzIHdpdGggbW9yZSB0aGFuIDkgZWxlbWVudHNgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfbWFwUHJpbWl0aXZlTmFtZShrZXlzOiBhbnlbXSkge1xuICB2YXIgc3RyaW5naWZpZWRLZXlzID0ga2V5cy5tYXAoayA9PiBpc1N0cmluZyhrKSA/IGBcIiR7a31cImAgOiBgJHtrfWApLmpvaW4oJywgJyk7XG4gIHJldHVybiBgbWFwRm4oWyR7c3RyaW5naWZpZWRLZXlzfV0pYDtcbn1cblxuZnVuY3Rpb24gX29wZXJhdGlvblRvUHJpbWl0aXZlTmFtZShvcGVyYXRpb246IHN0cmluZyk6IHN0cmluZyB7XG4gIHN3aXRjaCAob3BlcmF0aW9uKSB7XG4gICAgY2FzZSAnKyc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fYWRkXCI7XG4gICAgY2FzZSAnLSc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fc3VidHJhY3RcIjtcbiAgICBjYXNlICcqJzpcbiAgICAgIHJldHVybiBcIm9wZXJhdGlvbl9tdWx0aXBseVwiO1xuICAgIGNhc2UgJy8nOlxuICAgICAgcmV0dXJuIFwib3BlcmF0aW9uX2RpdmlkZVwiO1xuICAgIGNhc2UgJyUnOlxuICAgICAgcmV0dXJuIFwib3BlcmF0aW9uX3JlbWFpbmRlclwiO1xuICAgIGNhc2UgJz09JzpcbiAgICAgIHJldHVybiBcIm9wZXJhdGlvbl9lcXVhbHNcIjtcbiAgICBjYXNlICchPSc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fbm90X2VxdWFsc1wiO1xuICAgIGNhc2UgJz09PSc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25faWRlbnRpY2FsXCI7XG4gICAgY2FzZSAnIT09JzpcbiAgICAgIHJldHVybiBcIm9wZXJhdGlvbl9ub3RfaWRlbnRpY2FsXCI7XG4gICAgY2FzZSAnPCc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fbGVzc190aGVuXCI7XG4gICAgY2FzZSAnPic6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fZ3JlYXRlcl90aGVuXCI7XG4gICAgY2FzZSAnPD0nOlxuICAgICAgcmV0dXJuIFwib3BlcmF0aW9uX2xlc3Nfb3JfZXF1YWxzX3RoZW5cIjtcbiAgICBjYXNlICc+PSc6XG4gICAgICByZXR1cm4gXCJvcGVyYXRpb25fZ3JlYXRlcl9vcl9lcXVhbHNfdGhlblwiO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgVW5zdXBwb3J0ZWQgb3BlcmF0aW9uICR7b3BlcmF0aW9ufWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9vcGVyYXRpb25Ub0Z1bmN0aW9uKG9wZXJhdGlvbjogc3RyaW5nKTogRnVuY3Rpb24ge1xuICBzd2l0Y2ggKG9wZXJhdGlvbikge1xuICAgIGNhc2UgJysnOlxuICAgICAgcmV0dXJuIENoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2FkZDtcbiAgICBjYXNlICctJzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9zdWJ0cmFjdDtcbiAgICBjYXNlICcqJzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9tdWx0aXBseTtcbiAgICBjYXNlICcvJzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9kaXZpZGU7XG4gICAgY2FzZSAnJSc6XG4gICAgICByZXR1cm4gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5vcGVyYXRpb25fcmVtYWluZGVyO1xuICAgIGNhc2UgJz09JzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9lcXVhbHM7XG4gICAgY2FzZSAnIT0nOlxuICAgICAgcmV0dXJuIENoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX25vdF9lcXVhbHM7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9pZGVudGljYWw7XG4gICAgY2FzZSAnIT09JzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9ub3RfaWRlbnRpY2FsO1xuICAgIGNhc2UgJzwnOlxuICAgICAgcmV0dXJuIENoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2xlc3NfdGhlbjtcbiAgICBjYXNlICc+JzpcbiAgICAgIHJldHVybiBDaGFuZ2VEZXRlY3Rpb25VdGlsLm9wZXJhdGlvbl9ncmVhdGVyX3RoZW47XG4gICAgY2FzZSAnPD0nOlxuICAgICAgcmV0dXJuIENoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2xlc3Nfb3JfZXF1YWxzX3RoZW47XG4gICAgY2FzZSAnPj0nOlxuICAgICAgcmV0dXJuIENoYW5nZURldGVjdGlvblV0aWwub3BlcmF0aW9uX2dyZWF0ZXJfb3JfZXF1YWxzX3RoZW47XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBVbnN1cHBvcnRlZCBvcGVyYXRpb24gJHtvcGVyYXRpb259YCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcyh2KTogc3RyaW5nIHtcbiAgcmV0dXJuIGlzUHJlc2VudCh2KSA/IGAke3Z9YCA6ICcnO1xufVxuXG5mdW5jdGlvbiBfaW50ZXJwb2xhdGlvbkZuKHN0cmluZ3M6IGFueVtdKSB7XG4gIHZhciBsZW5ndGggPSBzdHJpbmdzLmxlbmd0aDtcbiAgdmFyIGMwID0gbGVuZ3RoID4gMCA/IHN0cmluZ3NbMF0gOiBudWxsO1xuICB2YXIgYzEgPSBsZW5ndGggPiAxID8gc3RyaW5nc1sxXSA6IG51bGw7XG4gIHZhciBjMiA9IGxlbmd0aCA+IDIgPyBzdHJpbmdzWzJdIDogbnVsbDtcbiAgdmFyIGMzID0gbGVuZ3RoID4gMyA/IHN0cmluZ3NbM10gOiBudWxsO1xuICB2YXIgYzQgPSBsZW5ndGggPiA0ID8gc3RyaW5nc1s0XSA6IG51bGw7XG4gIHZhciBjNSA9IGxlbmd0aCA+IDUgPyBzdHJpbmdzWzVdIDogbnVsbDtcbiAgdmFyIGM2ID0gbGVuZ3RoID4gNiA/IHN0cmluZ3NbNl0gOiBudWxsO1xuICB2YXIgYzcgPSBsZW5ndGggPiA3ID8gc3RyaW5nc1s3XSA6IG51bGw7XG4gIHZhciBjOCA9IGxlbmd0aCA+IDggPyBzdHJpbmdzWzhdIDogbnVsbDtcbiAgdmFyIGM5ID0gbGVuZ3RoID4gOSA/IHN0cmluZ3NbOV0gOiBudWxsO1xuICBzd2l0Y2ggKGxlbmd0aCAtIDEpIHtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gKGExKSA9PiBjMCArIHMoYTEpICsgYzE7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIChhMSwgYTIpID0+IGMwICsgcyhhMSkgKyBjMSArIHMoYTIpICsgYzI7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIChhMSwgYTIsIGEzKSA9PiBjMCArIHMoYTEpICsgYzEgKyBzKGEyKSArIGMyICsgcyhhMykgKyBjMztcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0KSA9PiBjMCArIHMoYTEpICsgYzEgKyBzKGEyKSArIGMyICsgcyhhMykgKyBjMyArIHMoYTQpICsgYzQ7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUpID0+XG4gICAgICAgICAgICAgICAgIGMwICsgcyhhMSkgKyBjMSArIHMoYTIpICsgYzIgKyBzKGEzKSArIGMzICsgcyhhNCkgKyBjNCArIHMoYTUpICsgYzU7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIChhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KSA9PlxuICAgICAgICAgICAgICAgICBjMCArIHMoYTEpICsgYzEgKyBzKGEyKSArIGMyICsgcyhhMykgKyBjMyArIHMoYTQpICsgYzQgKyBzKGE1KSArIGM1ICsgcyhhNikgKyBjNjtcbiAgICBjYXNlIDc6XG4gICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3KSA9PiBjMCArIHMoYTEpICsgYzEgKyBzKGEyKSArIGMyICsgcyhhMykgKyBjMyArIHMoYTQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM0ICsgcyhhNSkgKyBjNSArIHMoYTYpICsgYzYgKyBzKGE3KSArIGM3O1xuICAgIGNhc2UgODpcbiAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcsIGE4KSA9PiBjMCArIHMoYTEpICsgYzEgKyBzKGEyKSArIGMyICsgcyhhMykgKyBjMyArIHMoYTQpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjNCArIHMoYTUpICsgYzUgKyBzKGE2KSArIGM2ICsgcyhhNykgKyBjNyArIHMoYTgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjODtcbiAgICBjYXNlIDk6XG4gICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpID0+IGMwICsgcyhhMSkgKyBjMSArIHMoYTIpICsgYzIgKyBzKGEzKSArIGMzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcyhhNCkgKyBjNCArIHMoYTUpICsgYzUgKyBzKGE2KSArIGM2ICsgcyhhNykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjNyArIHMoYTgpICsgYzggKyBzKGE5KSArIGM5O1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgRG9lcyBub3Qgc3VwcG9ydCBtb3JlIHRoYW4gOSBleHByZXNzaW9uc2ApO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3Byb3RvX2NoYW5nZV9kZXRlY3Rvci50c1xuICoqLyIsImltcG9ydCB7XG4gIENPTlNUX0VYUFIsXG4gIGlzUHJlc2VudCxcbiAgaXNCbGFuayxcbiAgVHlwZSxcbiAgU3RyaW5nV3JhcHBlcixcbiAgbG9vc2VJZGVudGljYWxcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1Byb3RvUmVjb3JkfSBmcm9tICcuL3Byb3RvX3JlY29yZCc7XG5pbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBpc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneX0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtpbXBsZW1lbnRzT25EZXN0cm95fSBmcm9tICcuL3BpcGVfbGlmZWN5Y2xlX3JlZmxlY3Rvcic7XG5pbXBvcnQge0JpbmRpbmdUYXJnZXR9IGZyb20gJy4vYmluZGluZ19yZWNvcmQnO1xuaW1wb3J0IHtEaXJlY3RpdmVJbmRleH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcbmltcG9ydCB7U2VsZWN0ZWRQaXBlfSBmcm9tICcuL3BpcGVzJztcblxuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IHRoZSByZXN1bHQgb2YgYSB7QGxpbmsgUGlwZU1ldGFkYXRhfSB0cmFuc2Zvcm1hdGlvbiBoYXMgY2hhbmdlZCBldmVuIHRob3VnaCB0aGVcbiAqIHJlZmVyZW5jZVxuICogaGFzIG5vdCBjaGFuZ2VkLlxuICpcbiAqIFRoZSB3cmFwcGVkIHZhbHVlIHdpbGwgYmUgdW53cmFwcGVkIGJ5IGNoYW5nZSBkZXRlY3Rpb24sIGFuZCB0aGUgdW53cmFwcGVkIHZhbHVlIHdpbGwgYmUgc3RvcmVkLlxuICpcbiAqIEV4YW1wbGU6XG4gKlxuICogYGBgXG4gKiBpZiAodGhpcy5fbGF0ZXN0VmFsdWUgPT09IHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUpIHtcbiAqICAgIHJldHVybiB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlO1xuICogIH0gZWxzZSB7XG4gKiAgICB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlID0gdGhpcy5fbGF0ZXN0VmFsdWU7XG4gKiAgICByZXR1cm4gV3JhcHBlZFZhbHVlLndyYXAodGhpcy5fbGF0ZXN0VmFsdWUpOyAvLyB0aGlzIHdpbGwgZm9yY2UgdXBkYXRlXG4gKiAgfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBXcmFwcGVkVmFsdWUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgd3JhcHBlZDogYW55KSB7fVxuXG4gIHN0YXRpYyB3cmFwKHZhbHVlOiBhbnkpOiBXcmFwcGVkVmFsdWUge1xuICAgIHZhciB3ID0gX3dyYXBwZWRWYWx1ZXNbX3dyYXBwZWRJbmRleCsrICUgNV07XG4gICAgdy53cmFwcGVkID0gdmFsdWU7XG4gICAgcmV0dXJuIHc7XG4gIH1cbn1cblxudmFyIF93cmFwcGVkVmFsdWVzID0gW1xuICBuZXcgV3JhcHBlZFZhbHVlKG51bGwpLFxuICBuZXcgV3JhcHBlZFZhbHVlKG51bGwpLFxuICBuZXcgV3JhcHBlZFZhbHVlKG51bGwpLFxuICBuZXcgV3JhcHBlZFZhbHVlKG51bGwpLFxuICBuZXcgV3JhcHBlZFZhbHVlKG51bGwpXG5dO1xuXG52YXIgX3dyYXBwZWRJbmRleCA9IDA7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGJhc2ljIGNoYW5nZSBmcm9tIGEgcHJldmlvdXMgdG8gYSBuZXcgdmFsdWUuXG4gKi9cbmV4cG9ydCBjbGFzcyBTaW1wbGVDaGFuZ2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJldmlvdXNWYWx1ZTogYW55LCBwdWJsaWMgY3VycmVudFZhbHVlOiBhbnkpIHt9XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIG5ldyB2YWx1ZSBpcyB0aGUgZmlyc3QgdmFsdWUgYXNzaWduZWQuXG4gICAqL1xuICBpc0ZpcnN0Q2hhbmdlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wcmV2aW91c1ZhbHVlID09PSBDaGFuZ2VEZXRlY3Rpb25VdGlsLnVuaW5pdGlhbGl6ZWQ7IH1cbn1cblxudmFyIF9zaW1wbGVDaGFuZ2VzSW5kZXggPSAwO1xudmFyIF9zaW1wbGVDaGFuZ2VzID0gW1xuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpLFxuICBuZXcgU2ltcGxlQ2hhbmdlKG51bGwsIG51bGwpXG5dO1xuXG5mdW5jdGlvbiBfc2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSk6IFNpbXBsZUNoYW5nZSB7XG4gIHZhciBpbmRleCA9IF9zaW1wbGVDaGFuZ2VzSW5kZXgrKyAlIDIwO1xuICB2YXIgcyA9IF9zaW1wbGVDaGFuZ2VzW2luZGV4XTtcbiAgcy5wcmV2aW91c1ZhbHVlID0gcHJldmlvdXNWYWx1ZTtcbiAgcy5jdXJyZW50VmFsdWUgPSBjdXJyZW50VmFsdWU7XG4gIHJldHVybiBzO1xufVxuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpyZXF1aXJlUGFyYW1ldGVyVHlwZSAqL1xuZXhwb3J0IGNsYXNzIENoYW5nZURldGVjdGlvblV0aWwge1xuICBzdGF0aWMgdW5pbml0aWFsaXplZDogT2JqZWN0ID0gQ09OU1RfRVhQUjxPYmplY3Q+KG5ldyBPYmplY3QoKSk7XG5cbiAgc3RhdGljIGFycmF5Rm4wKCk6IGFueVtdIHsgcmV0dXJuIFtdOyB9XG4gIHN0YXRpYyBhcnJheUZuMShhMSk6IGFueVtdIHsgcmV0dXJuIFthMV07IH1cbiAgc3RhdGljIGFycmF5Rm4yKGExLCBhMik6IGFueVtdIHsgcmV0dXJuIFthMSwgYTJdOyB9XG4gIHN0YXRpYyBhcnJheUZuMyhhMSwgYTIsIGEzKTogYW55W10geyByZXR1cm4gW2ExLCBhMiwgYTNdOyB9XG4gIHN0YXRpYyBhcnJheUZuNChhMSwgYTIsIGEzLCBhNCk6IGFueVtdIHsgcmV0dXJuIFthMSwgYTIsIGEzLCBhNF07IH1cbiAgc3RhdGljIGFycmF5Rm41KGExLCBhMiwgYTMsIGE0LCBhNSk6IGFueVtdIHsgcmV0dXJuIFthMSwgYTIsIGEzLCBhNCwgYTVdOyB9XG4gIHN0YXRpYyBhcnJheUZuNihhMSwgYTIsIGEzLCBhNCwgYTUsIGE2KTogYW55W10geyByZXR1cm4gW2ExLCBhMiwgYTMsIGE0LCBhNSwgYTZdOyB9XG4gIHN0YXRpYyBhcnJheUZuNyhhMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNyk6IGFueVtdIHsgcmV0dXJuIFthMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhN107IH1cbiAgc3RhdGljIGFycmF5Rm44KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCk6IGFueVtdIHtcbiAgICByZXR1cm4gW2ExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOF07XG4gIH1cbiAgc3RhdGljIGFycmF5Rm45KGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpOiBhbnlbXSB7XG4gICAgcmV0dXJuIFthMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhNywgYTgsIGE5XTtcbiAgfVxuXG4gIHN0YXRpYyBvcGVyYXRpb25fbmVnYXRlKHZhbHVlKTogYW55IHsgcmV0dXJuICF2YWx1ZTsgfVxuICBzdGF0aWMgb3BlcmF0aW9uX2FkZChsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ICsgcmlnaHQ7IH1cbiAgc3RhdGljIG9wZXJhdGlvbl9zdWJ0cmFjdChsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0IC0gcmlnaHQ7IH1cbiAgc3RhdGljIG9wZXJhdGlvbl9tdWx0aXBseShsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ICogcmlnaHQ7IH1cbiAgc3RhdGljIG9wZXJhdGlvbl9kaXZpZGUobGVmdCwgcmlnaHQpOiBhbnkgeyByZXR1cm4gbGVmdCAvIHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25fcmVtYWluZGVyKGxlZnQsIHJpZ2h0KTogYW55IHsgcmV0dXJuIGxlZnQgJSByaWdodDsgfVxuICBzdGF0aWMgb3BlcmF0aW9uX2VxdWFscyhsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ID09IHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25fbm90X2VxdWFscyhsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ICE9IHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25faWRlbnRpY2FsKGxlZnQsIHJpZ2h0KTogYW55IHsgcmV0dXJuIGxlZnQgPT09IHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25fbm90X2lkZW50aWNhbChsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ICE9PSByaWdodDsgfVxuICBzdGF0aWMgb3BlcmF0aW9uX2xlc3NfdGhlbihsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0IDwgcmlnaHQ7IH1cbiAgc3RhdGljIG9wZXJhdGlvbl9ncmVhdGVyX3RoZW4obGVmdCwgcmlnaHQpOiBhbnkgeyByZXR1cm4gbGVmdCA+IHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25fbGVzc19vcl9lcXVhbHNfdGhlbihsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0IDw9IHJpZ2h0OyB9XG4gIHN0YXRpYyBvcGVyYXRpb25fZ3JlYXRlcl9vcl9lcXVhbHNfdGhlbihsZWZ0LCByaWdodCk6IGFueSB7IHJldHVybiBsZWZ0ID49IHJpZ2h0OyB9XG4gIHN0YXRpYyBjb25kKGNvbmQsIHRydWVWYWwsIGZhbHNlVmFsKTogYW55IHsgcmV0dXJuIGNvbmQgPyB0cnVlVmFsIDogZmFsc2VWYWw7IH1cblxuICBzdGF0aWMgbWFwRm4oa2V5czogYW55W10pOiBhbnkge1xuICAgIGZ1bmN0aW9uIGJ1aWxkTWFwKHZhbHVlcyk6IHtbazogLyphbnkqLyBzdHJpbmddOiBhbnl9IHtcbiAgICAgIHZhciByZXMgPSBTdHJpbmdNYXBXcmFwcGVyLmNyZWF0ZSgpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIFN0cmluZ01hcFdyYXBwZXIuc2V0KHJlcywga2V5c1tpXSwgdmFsdWVzW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgc3dpdGNoIChrZXlzLmxlbmd0aCkge1xuICAgICAgY2FzZSAwOlxuICAgICAgICByZXR1cm4gKCkgPT4gW107XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiAoYTEpID0+IGJ1aWxkTWFwKFthMV0pO1xuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gKGExLCBhMikgPT4gYnVpbGRNYXAoW2ExLCBhMl0pO1xuICAgICAgY2FzZSAzOlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMpID0+IGJ1aWxkTWFwKFthMSwgYTIsIGEzXSk7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQpID0+IGJ1aWxkTWFwKFthMSwgYTIsIGEzLCBhNF0pO1xuICAgICAgY2FzZSA1OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSkgPT4gYnVpbGRNYXAoW2ExLCBhMiwgYTMsIGE0LCBhNV0pO1xuICAgICAgY2FzZSA2OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYpID0+IGJ1aWxkTWFwKFthMSwgYTIsIGEzLCBhNCwgYTUsIGE2XSk7XG4gICAgICBjYXNlIDc6XG4gICAgICAgIHJldHVybiAoYTEsIGEyLCBhMywgYTQsIGE1LCBhNiwgYTcpID0+IGJ1aWxkTWFwKFthMSwgYTIsIGEzLCBhNCwgYTUsIGE2LCBhN10pO1xuICAgICAgY2FzZSA4OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCkgPT4gYnVpbGRNYXAoW2ExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOF0pO1xuICAgICAgY2FzZSA5OlxuICAgICAgICByZXR1cm4gKGExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTkpID0+XG4gICAgICAgICAgICAgICAgICAgYnVpbGRNYXAoW2ExLCBhMiwgYTMsIGE0LCBhNSwgYTYsIGE3LCBhOCwgYTldKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBEb2VzIG5vdCBzdXBwb3J0IGxpdGVyYWwgbWFwcyB3aXRoIG1vcmUgdGhhbiA5IGVsZW1lbnRzYCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGtleWVkQWNjZXNzKG9iaiwgYXJncyk6IGFueSB7IHJldHVybiBvYmpbYXJnc1swXV07IH1cblxuICBzdGF0aWMgdW53cmFwVmFsdWUodmFsdWU6IGFueSk6IGFueSB7XG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgV3JhcHBlZFZhbHVlKSB7XG4gICAgICByZXR1cm4gdmFsdWUud3JhcHBlZDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyBjaGFuZ2VEZXRlY3Rpb25Nb2RlKHN0cmF0ZWd5OiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSk6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5IHtcbiAgICByZXR1cm4gaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3koc3RyYXRlZ3kpID8gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuQ2hlY2tBbHdheXMgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5DaGVja09uY2U7XG4gIH1cblxuICBzdGF0aWMgc2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWU6IGFueSwgY3VycmVudFZhbHVlOiBhbnkpOiBTaW1wbGVDaGFuZ2Uge1xuICAgIHJldHVybiBfc2ltcGxlQ2hhbmdlKHByZXZpb3VzVmFsdWUsIGN1cnJlbnRWYWx1ZSk7XG4gIH1cblxuICBzdGF0aWMgaXNWYWx1ZUJsYW5rKHZhbHVlOiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIGlzQmxhbmsodmFsdWUpOyB9XG5cbiAgc3RhdGljIHModmFsdWU6IGFueSk6IHN0cmluZyB7IHJldHVybiBpc1ByZXNlbnQodmFsdWUpID8gYCR7dmFsdWV9YCA6ICcnOyB9XG5cbiAgc3RhdGljIHByb3RvQnlJbmRleChwcm90b3M6IFByb3RvUmVjb3JkW10sIHNlbGZJbmRleDogbnVtYmVyKTogUHJvdG9SZWNvcmQge1xuICAgIHJldHVybiBzZWxmSW5kZXggPCAxID9cbiAgICAgICAgICAgICAgIG51bGwgOlxuICAgICAgICAgICAgICAgcHJvdG9zW3NlbGZJbmRleCAtIDFdOyAgLy8gc2VsZiBpbmRleCBpcyBzaGlmdGVkIGJ5IG9uZSBiZWNhdXNlIG9mIGNvbnRleHRcbiAgfVxuXG4gIHN0YXRpYyBjYWxsUGlwZU9uRGVzdHJveShzZWxlY3RlZFBpcGU6IFNlbGVjdGVkUGlwZSk6IHZvaWQge1xuICAgIGlmIChpbXBsZW1lbnRzT25EZXN0cm95KHNlbGVjdGVkUGlwZS5waXBlKSkge1xuICAgICAgKDxhbnk+c2VsZWN0ZWRQaXBlLnBpcGUpLm5nT25EZXN0cm95KCk7XG4gICAgfVxuICB9XG5cbiAgc3RhdGljIGJpbmRpbmdUYXJnZXQobW9kZTogc3RyaW5nLCBlbGVtZW50SW5kZXg6IG51bWJlciwgbmFtZTogc3RyaW5nLCB1bml0OiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgIGRlYnVnOiBzdHJpbmcpOiBCaW5kaW5nVGFyZ2V0IHtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdUYXJnZXQobW9kZSwgZWxlbWVudEluZGV4LCBuYW1lLCB1bml0LCBkZWJ1Zyk7XG4gIH1cblxuICBzdGF0aWMgZGlyZWN0aXZlSW5kZXgoZWxlbWVudEluZGV4OiBudW1iZXIsIGRpcmVjdGl2ZUluZGV4OiBudW1iZXIpOiBEaXJlY3RpdmVJbmRleCB7XG4gICAgcmV0dXJuIG5ldyBEaXJlY3RpdmVJbmRleChlbGVtZW50SW5kZXgsIGRpcmVjdGl2ZUluZGV4KTtcbiAgfVxuXG4gIHN0YXRpYyBsb29zZU5vdElkZW50aWNhbChhOiBhbnksIGI6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gIWxvb3NlSWRlbnRpY2FsKGEsIGIpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb25fdXRpbC50c1xuICoqLyIsImV4cG9ydCBmdW5jdGlvbiBpbXBsZW1lbnRzT25EZXN0cm95KHBpcGU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gcGlwZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUubmdPbkRlc3Ryb3k7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BpcGVfbGlmZWN5Y2xlX3JlZmxlY3Rvci50c1xuICoqLyIsImltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtTZXR0ZXJGbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi90eXBlcyc7XG5pbXBvcnQge0FTVH0gZnJvbSAnLi9wYXJzZXIvYXN0JztcbmltcG9ydCB7RGlyZWN0aXZlSW5kZXgsIERpcmVjdGl2ZVJlY29yZH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcblxuY29uc3QgRElSRUNUSVZFX0xJRkVDWUNMRSA9IFwiZGlyZWN0aXZlTGlmZWN5Y2xlXCI7XG5jb25zdCBCSU5ESU5HID0gXCJuYXRpdmVcIjtcblxuY29uc3QgRElSRUNUSVZFID0gXCJkaXJlY3RpdmVcIjtcbmNvbnN0IEVMRU1FTlRfUFJPUEVSVFkgPSBcImVsZW1lbnRQcm9wZXJ0eVwiO1xuY29uc3QgRUxFTUVOVF9BVFRSSUJVVEUgPSBcImVsZW1lbnRBdHRyaWJ1dGVcIjtcbmNvbnN0IEVMRU1FTlRfQ0xBU1MgPSBcImVsZW1lbnRDbGFzc1wiO1xuY29uc3QgRUxFTUVOVF9TVFlMRSA9IFwiZWxlbWVudFN0eWxlXCI7XG5jb25zdCBURVhUX05PREUgPSBcInRleHROb2RlXCI7XG5jb25zdCBFVkVOVCA9IFwiZXZlbnRcIjtcbmNvbnN0IEhPU1RfRVZFTlQgPSBcImhvc3RFdmVudFwiO1xuXG5leHBvcnQgY2xhc3MgQmluZGluZ1RhcmdldCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtb2RlOiBzdHJpbmcsIHB1YmxpYyBlbGVtZW50SW5kZXg6IG51bWJlciwgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHVibGljIHVuaXQ6IHN0cmluZywgcHVibGljIGRlYnVnOiBzdHJpbmcpIHt9XG5cbiAgaXNEaXJlY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1vZGUgPT09IERJUkVDVElWRTsgfVxuXG4gIGlzRWxlbWVudFByb3BlcnR5KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBFTEVNRU5UX1BST1BFUlRZOyB9XG5cbiAgaXNFbGVtZW50QXR0cmlidXRlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBFTEVNRU5UX0FUVFJJQlVURTsgfVxuXG4gIGlzRWxlbWVudENsYXNzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBFTEVNRU5UX0NMQVNTOyB9XG5cbiAgaXNFbGVtZW50U3R5bGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1vZGUgPT09IEVMRU1FTlRfU1RZTEU7IH1cblxuICBpc1RleHROb2RlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBURVhUX05PREU7IH1cbn1cblxuZXhwb3J0IGNsYXNzIEJpbmRpbmdSZWNvcmQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbW9kZTogc3RyaW5nLCBwdWJsaWMgdGFyZ2V0OiBCaW5kaW5nVGFyZ2V0LCBwdWJsaWMgaW1wbGljaXRSZWNlaXZlcjogYW55LFxuICAgICAgICAgICAgICBwdWJsaWMgYXN0OiBBU1QsIHB1YmxpYyBzZXR0ZXI6IFNldHRlckZuLCBwdWJsaWMgbGlmZWN5Y2xlRXZlbnQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHVibGljIGRpcmVjdGl2ZVJlY29yZDogRGlyZWN0aXZlUmVjb3JkKSB7fVxuXG4gIGlzRGlyZWN0aXZlTGlmZWN5Y2xlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBESVJFQ1RJVkVfTElGRUNZQ0xFOyB9XG5cbiAgY2FsbE9uQ2hhbmdlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuZGlyZWN0aXZlUmVjb3JkKSAmJiB0aGlzLmRpcmVjdGl2ZVJlY29yZC5jYWxsT25DaGFuZ2VzO1xuICB9XG5cbiAgaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc0JsYW5rKHRoaXMuZGlyZWN0aXZlUmVjb3JkKSB8fCB0aGlzLmRpcmVjdGl2ZVJlY29yZC5pc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb24oKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVEaXJlY3RpdmVEb0NoZWNrKGRpcmVjdGl2ZVJlY29yZDogRGlyZWN0aXZlUmVjb3JkKTogQmluZGluZ1JlY29yZCB7XG4gICAgcmV0dXJuIG5ldyBCaW5kaW5nUmVjb3JkKERJUkVDVElWRV9MSUZFQ1lDTEUsIG51bGwsIDAsIG51bGwsIG51bGwsIFwiRG9DaGVja1wiLCBkaXJlY3RpdmVSZWNvcmQpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGl2ZU9uSW5pdChkaXJlY3RpdmVSZWNvcmQ6IERpcmVjdGl2ZVJlY29yZCk6IEJpbmRpbmdSZWNvcmQge1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChESVJFQ1RJVkVfTElGRUNZQ0xFLCBudWxsLCAwLCBudWxsLCBudWxsLCBcIk9uSW5pdFwiLCBkaXJlY3RpdmVSZWNvcmQpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZURpcmVjdGl2ZU9uQ2hhbmdlcyhkaXJlY3RpdmVSZWNvcmQ6IERpcmVjdGl2ZVJlY29yZCk6IEJpbmRpbmdSZWNvcmQge1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChESVJFQ1RJVkVfTElGRUNZQ0xFLCBudWxsLCAwLCBudWxsLCBudWxsLCBcIk9uQ2hhbmdlc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVSZWNvcmQpO1xuICB9XG5cblxuXG4gIHN0YXRpYyBjcmVhdGVGb3JEaXJlY3RpdmUoYXN0OiBBU1QsIHByb3BlcnR5TmFtZTogc3RyaW5nLCBzZXR0ZXI6IFNldHRlckZuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZVJlY29yZDogRGlyZWN0aXZlUmVjb3JkKTogQmluZGluZ1JlY29yZCB7XG4gICAgdmFyIGVsZW1lbnRJbmRleCA9IGRpcmVjdGl2ZVJlY29yZC5kaXJlY3RpdmVJbmRleC5lbGVtZW50SW5kZXg7XG4gICAgdmFyIHQgPSBuZXcgQmluZGluZ1RhcmdldChESVJFQ1RJVkUsIGVsZW1lbnRJbmRleCwgcHJvcGVydHlOYW1lLCBudWxsLCBhc3QudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIG5ldyBCaW5kaW5nUmVjb3JkKERJUkVDVElWRSwgdCwgMCwgYXN0LCBzZXR0ZXIsIG51bGwsIGRpcmVjdGl2ZVJlY29yZCk7XG4gIH1cblxuXG5cbiAgc3RhdGljIGNyZWF0ZUZvckVsZW1lbnRQcm9wZXJ0eShhc3Q6IEFTVCwgZWxlbWVudEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBCaW5kaW5nUmVjb3JkIHtcbiAgICB2YXIgdCA9IG5ldyBCaW5kaW5nVGFyZ2V0KEVMRU1FTlRfUFJPUEVSVFksIGVsZW1lbnRJbmRleCwgcHJvcGVydHlOYW1lLCBudWxsLCBhc3QudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIG5ldyBCaW5kaW5nUmVjb3JkKEJJTkRJTkcsIHQsIDAsIGFzdCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRm9yRWxlbWVudEF0dHJpYnV0ZShhc3Q6IEFTVCwgZWxlbWVudEluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IEJpbmRpbmdSZWNvcmQge1xuICAgIHZhciB0ID0gbmV3IEJpbmRpbmdUYXJnZXQoRUxFTUVOVF9BVFRSSUJVVEUsIGVsZW1lbnRJbmRleCwgYXR0cmlidXRlTmFtZSwgbnVsbCwgYXN0LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChCSU5ESU5HLCB0LCAwLCBhc3QsIG51bGwsIG51bGwsIG51bGwpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZvckVsZW1lbnRDbGFzcyhhc3Q6IEFTVCwgZWxlbWVudEluZGV4OiBudW1iZXIsIGNsYXNzTmFtZTogc3RyaW5nKTogQmluZGluZ1JlY29yZCB7XG4gICAgdmFyIHQgPSBuZXcgQmluZGluZ1RhcmdldChFTEVNRU5UX0NMQVNTLCBlbGVtZW50SW5kZXgsIGNsYXNzTmFtZSwgbnVsbCwgYXN0LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChCSU5ESU5HLCB0LCAwLCBhc3QsIG51bGwsIG51bGwsIG51bGwpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZvckVsZW1lbnRTdHlsZShhc3Q6IEFTVCwgZWxlbWVudEluZGV4OiBudW1iZXIsIHN0eWxlTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXQ6IHN0cmluZyk6IEJpbmRpbmdSZWNvcmQge1xuICAgIHZhciB0ID0gbmV3IEJpbmRpbmdUYXJnZXQoRUxFTUVOVF9TVFlMRSwgZWxlbWVudEluZGV4LCBzdHlsZU5hbWUsIHVuaXQsIGFzdC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdSZWNvcmQoQklORElORywgdCwgMCwgYXN0LCBudWxsLCBudWxsLCBudWxsKTtcbiAgfVxuXG5cblxuICBzdGF0aWMgY3JlYXRlRm9ySG9zdFByb3BlcnR5KGRpcmVjdGl2ZUluZGV4OiBEaXJlY3RpdmVJbmRleCwgYXN0OiBBU1QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lOiBzdHJpbmcpOiBCaW5kaW5nUmVjb3JkIHtcbiAgICB2YXIgdCA9IG5ldyBCaW5kaW5nVGFyZ2V0KEVMRU1FTlRfUFJPUEVSVFksIGRpcmVjdGl2ZUluZGV4LmVsZW1lbnRJbmRleCwgcHJvcGVydHlOYW1lLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChCSU5ESU5HLCB0LCBkaXJlY3RpdmVJbmRleCwgYXN0LCBudWxsLCBudWxsLCBudWxsKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVGb3JIb3N0QXR0cmlidXRlKGRpcmVjdGl2ZUluZGV4OiBEaXJlY3RpdmVJbmRleCwgYXN0OiBBU1QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyk6IEJpbmRpbmdSZWNvcmQge1xuICAgIHZhciB0ID0gbmV3IEJpbmRpbmdUYXJnZXQoRUxFTUVOVF9BVFRSSUJVVEUsIGRpcmVjdGl2ZUluZGV4LmVsZW1lbnRJbmRleCwgYXR0cmlidXRlTmFtZSwgbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdSZWNvcmQoQklORElORywgdCwgZGlyZWN0aXZlSW5kZXgsIGFzdCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRm9ySG9zdENsYXNzKGRpcmVjdGl2ZUluZGV4OiBEaXJlY3RpdmVJbmRleCwgYXN0OiBBU1QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBzdHJpbmcpOiBCaW5kaW5nUmVjb3JkIHtcbiAgICB2YXIgdCA9IG5ldyBCaW5kaW5nVGFyZ2V0KEVMRU1FTlRfQ0xBU1MsIGRpcmVjdGl2ZUluZGV4LmVsZW1lbnRJbmRleCwgY2xhc3NOYW1lLCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChCSU5ESU5HLCB0LCBkaXJlY3RpdmVJbmRleCwgYXN0LCBudWxsLCBudWxsLCBudWxsKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVGb3JIb3N0U3R5bGUoZGlyZWN0aXZlSW5kZXg6IERpcmVjdGl2ZUluZGV4LCBhc3Q6IEFTVCwgc3R5bGVOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdDogc3RyaW5nKTogQmluZGluZ1JlY29yZCB7XG4gICAgdmFyIHQgPSBuZXcgQmluZGluZ1RhcmdldChFTEVNRU5UX1NUWUxFLCBkaXJlY3RpdmVJbmRleC5lbGVtZW50SW5kZXgsIHN0eWxlTmFtZSwgdW5pdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdSZWNvcmQoQklORElORywgdCwgZGlyZWN0aXZlSW5kZXgsIGFzdCwgbnVsbCwgbnVsbCwgbnVsbCk7XG4gIH1cblxuXG5cbiAgc3RhdGljIGNyZWF0ZUZvclRleHROb2RlKGFzdDogQVNULCBlbGVtZW50SW5kZXg6IG51bWJlcik6IEJpbmRpbmdSZWNvcmQge1xuICAgIHZhciB0ID0gbmV3IEJpbmRpbmdUYXJnZXQoVEVYVF9OT0RFLCBlbGVtZW50SW5kZXgsIG51bGwsIG51bGwsIGFzdC50b1N0cmluZygpKTtcbiAgICByZXR1cm4gbmV3IEJpbmRpbmdSZWNvcmQoQklORElORywgdCwgMCwgYXN0LCBudWxsLCBudWxsLCBudWxsKTtcbiAgfVxuXG5cblxuICBzdGF0aWMgY3JlYXRlRm9yRXZlbnQoYXN0OiBBU1QsIGV2ZW50TmFtZTogc3RyaW5nLCBlbGVtZW50SW5kZXg6IG51bWJlcik6IEJpbmRpbmdSZWNvcmQge1xuICAgIHZhciB0ID0gbmV3IEJpbmRpbmdUYXJnZXQoRVZFTlQsIGVsZW1lbnRJbmRleCwgZXZlbnROYW1lLCBudWxsLCBhc3QudG9TdHJpbmcoKSk7XG4gICAgcmV0dXJuIG5ldyBCaW5kaW5nUmVjb3JkKEVWRU5ULCB0LCAwLCBhc3QsIG51bGwsIG51bGwsIG51bGwpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZvckhvc3RFdmVudChhc3Q6IEFTVCwgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlUmVjb3JkOiBEaXJlY3RpdmVSZWNvcmQpOiBCaW5kaW5nUmVjb3JkIHtcbiAgICB2YXIgZGlyZWN0aXZlSW5kZXggPSBkaXJlY3RpdmVSZWNvcmQuZGlyZWN0aXZlSW5kZXg7XG4gICAgdmFyIHQgPVxuICAgICAgICBuZXcgQmluZGluZ1RhcmdldChIT1NUX0VWRU5ULCBkaXJlY3RpdmVJbmRleC5lbGVtZW50SW5kZXgsIGV2ZW50TmFtZSwgbnVsbCwgYXN0LnRvU3RyaW5nKCkpO1xuICAgIHJldHVybiBuZXcgQmluZGluZ1JlY29yZChIT1NUX0VWRU5ULCB0LCBkaXJlY3RpdmVJbmRleCwgYXN0LCBudWxsLCBudWxsLCBkaXJlY3RpdmVSZWNvcmQpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2JpbmRpbmdfcmVjb3JkLnRzXG4gKiovIiwiaW1wb3J0IHtTdHJpbmdXcmFwcGVyLCBub3JtYWxpemVCb29sLCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtpc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGNsYXNzIERpcmVjdGl2ZUluZGV4IHtcbiAgY29uc3RydWN0b3IocHVibGljIGVsZW1lbnRJbmRleDogbnVtYmVyLCBwdWJsaWMgZGlyZWN0aXZlSW5kZXg6IG51bWJlcikge31cblxuICBnZXQgbmFtZSgpIHsgcmV0dXJuIGAke3RoaXMuZWxlbWVudEluZGV4fV8ke3RoaXMuZGlyZWN0aXZlSW5kZXh9YDsgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlUmVjb3JkIHtcbiAgZGlyZWN0aXZlSW5kZXg6IERpcmVjdGl2ZUluZGV4O1xuICBjYWxsQWZ0ZXJDb250ZW50SW5pdDogYm9vbGVhbjtcbiAgY2FsbEFmdGVyQ29udGVudENoZWNrZWQ6IGJvb2xlYW47XG4gIGNhbGxBZnRlclZpZXdJbml0OiBib29sZWFuO1xuICBjYWxsQWZ0ZXJWaWV3Q2hlY2tlZDogYm9vbGVhbjtcbiAgY2FsbE9uQ2hhbmdlczogYm9vbGVhbjtcbiAgY2FsbERvQ2hlY2s6IGJvb2xlYW47XG4gIGNhbGxPbkluaXQ6IGJvb2xlYW47XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k7XG5cbiAgY29uc3RydWN0b3Ioe2RpcmVjdGl2ZUluZGV4LCBjYWxsQWZ0ZXJDb250ZW50SW5pdCwgY2FsbEFmdGVyQ29udGVudENoZWNrZWQsIGNhbGxBZnRlclZpZXdJbml0LFxuICAgICAgICAgICAgICAgY2FsbEFmdGVyVmlld0NoZWNrZWQsIGNhbGxPbkNoYW5nZXMsIGNhbGxEb0NoZWNrLCBjYWxsT25Jbml0LCBjaGFuZ2VEZXRlY3Rpb259OiB7XG4gICAgZGlyZWN0aXZlSW5kZXg/OiBEaXJlY3RpdmVJbmRleCxcbiAgICBjYWxsQWZ0ZXJDb250ZW50SW5pdD86IGJvb2xlYW4sXG4gICAgY2FsbEFmdGVyQ29udGVudENoZWNrZWQ/OiBib29sZWFuLFxuICAgIGNhbGxBZnRlclZpZXdJbml0PzogYm9vbGVhbixcbiAgICBjYWxsQWZ0ZXJWaWV3Q2hlY2tlZD86IGJvb2xlYW4sXG4gICAgY2FsbE9uQ2hhbmdlcz86IGJvb2xlYW4sXG4gICAgY2FsbERvQ2hlY2s/OiBib29sZWFuLFxuICAgIGNhbGxPbkluaXQ/OiBib29sZWFuLFxuICAgIGNoYW5nZURldGVjdGlvbj86IENoYW5nZURldGVjdGlvblN0cmF0ZWd5XG4gIH0gPSB7fSkge1xuICAgIHRoaXMuZGlyZWN0aXZlSW5kZXggPSBkaXJlY3RpdmVJbmRleDtcbiAgICB0aGlzLmNhbGxBZnRlckNvbnRlbnRJbml0ID0gbm9ybWFsaXplQm9vbChjYWxsQWZ0ZXJDb250ZW50SW5pdCk7XG4gICAgdGhpcy5jYWxsQWZ0ZXJDb250ZW50Q2hlY2tlZCA9IG5vcm1hbGl6ZUJvb2woY2FsbEFmdGVyQ29udGVudENoZWNrZWQpO1xuICAgIHRoaXMuY2FsbE9uQ2hhbmdlcyA9IG5vcm1hbGl6ZUJvb2woY2FsbE9uQ2hhbmdlcyk7XG4gICAgdGhpcy5jYWxsQWZ0ZXJWaWV3SW5pdCA9IG5vcm1hbGl6ZUJvb2woY2FsbEFmdGVyVmlld0luaXQpO1xuICAgIHRoaXMuY2FsbEFmdGVyVmlld0NoZWNrZWQgPSBub3JtYWxpemVCb29sKGNhbGxBZnRlclZpZXdDaGVja2VkKTtcbiAgICB0aGlzLmNhbGxEb0NoZWNrID0gbm9ybWFsaXplQm9vbChjYWxsRG9DaGVjayk7XG4gICAgdGhpcy5jYWxsT25Jbml0ID0gbm9ybWFsaXplQm9vbChjYWxsT25Jbml0KTtcbiAgICB0aGlzLmNoYW5nZURldGVjdGlvbiA9IGNoYW5nZURldGVjdGlvbjtcbiAgfVxuXG4gIGlzRGVmYXVsdENoYW5nZURldGVjdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kodGhpcy5jaGFuZ2VEZXRlY3Rpb24pO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2RpcmVjdGl2ZV9yZWNvcmQudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudCwgaXNCbGFuaywgRnVuY3Rpb25XcmFwcGVyLCBTdHJpbmdXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlciwgU3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcblxuaW1wb3J0IHtBYnN0cmFjdENoYW5nZURldGVjdG9yfSBmcm9tICcuL2Fic3RyYWN0X2NoYW5nZV9kZXRlY3Rvcic7XG5pbXBvcnQge0V2ZW50QmluZGluZ30gZnJvbSAnLi9ldmVudF9iaW5kaW5nJztcbmltcG9ydCB7QmluZGluZ1JlY29yZCwgQmluZGluZ1RhcmdldH0gZnJvbSAnLi9iaW5kaW5nX3JlY29yZCc7XG5pbXBvcnQge0RpcmVjdGl2ZVJlY29yZCwgRGlyZWN0aXZlSW5kZXh9IGZyb20gJy4vZGlyZWN0aXZlX3JlY29yZCc7XG5pbXBvcnQge0xvY2Fsc30gZnJvbSAnLi9wYXJzZXIvbG9jYWxzJztcbmltcG9ydCB7Q2hhbmdlRGlzcGF0Y2hlciwgQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWd9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0NoYW5nZURldGVjdGlvblV0aWwsIFNpbXBsZUNoYW5nZX0gZnJvbSAnLi9jaGFuZ2VfZGV0ZWN0aW9uX3V0aWwnO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ2hhbmdlRGV0ZWN0b3JTdGF0ZX0gZnJvbSAnLi9jb25zdGFudHMnO1xuaW1wb3J0IHtQcm90b1JlY29yZCwgUmVjb3JkVHlwZX0gZnJvbSAnLi9wcm90b19yZWNvcmQnO1xuXG5leHBvcnQgY2xhc3MgRHluYW1pY0NoYW5nZURldGVjdG9yIGV4dGVuZHMgQWJzdHJhY3RDaGFuZ2VEZXRlY3Rvcjxhbnk+IHtcbiAgdmFsdWVzOiBhbnlbXTtcbiAgY2hhbmdlczogYW55W107XG4gIGxvY2FsUGlwZXM6IGFueVtdO1xuICBwcmV2Q29udGV4dHM6IGFueVtdO1xuICBkaXJlY3RpdmVzOiBhbnkgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGlkOiBzdHJpbmcsIGRpc3BhdGNoZXI6IENoYW5nZURpc3BhdGNoZXIsIG51bWJlck9mUHJvcGVydHlQcm90b1JlY29yZHM6IG51bWJlcixcbiAgICAgICAgICAgICAgcHJvcGVydHlCaW5kaW5nVGFyZ2V0czogQmluZGluZ1RhcmdldFtdLCBkaXJlY3RpdmVJbmRpY2VzOiBEaXJlY3RpdmVJbmRleFtdLFxuICAgICAgICAgICAgICBzdHJhdGVneTogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIHByaXZhdGUgX3JlY29yZHM6IFByb3RvUmVjb3JkW10sXG4gICAgICAgICAgICAgIHByaXZhdGUgX2V2ZW50QmluZGluZ3M6IEV2ZW50QmluZGluZ1tdLCBwcml2YXRlIF9kaXJlY3RpdmVSZWNvcmRzOiBEaXJlY3RpdmVSZWNvcmRbXSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZ2VuQ29uZmlnOiBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZykge1xuICAgIHN1cGVyKGlkLCBkaXNwYXRjaGVyLCBudW1iZXJPZlByb3BlcnR5UHJvdG9SZWNvcmRzLCBwcm9wZXJ0eUJpbmRpbmdUYXJnZXRzLCBkaXJlY3RpdmVJbmRpY2VzLFxuICAgICAgICAgIHN0cmF0ZWd5KTtcbiAgICB2YXIgbGVuID0gX3JlY29yZHMubGVuZ3RoICsgMTtcbiAgICB0aGlzLnZhbHVlcyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShsZW4pO1xuICAgIHRoaXMubG9jYWxQaXBlcyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShsZW4pO1xuICAgIHRoaXMucHJldkNvbnRleHRzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKGxlbik7XG4gICAgdGhpcy5jaGFuZ2VzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKGxlbik7XG5cbiAgICB0aGlzLmRlaHlkcmF0ZURpcmVjdGl2ZXMoZmFsc2UpO1xuICB9XG5cbiAgaGFuZGxlRXZlbnRJbnRlcm5hbChldmVudE5hbWU6IHN0cmluZywgZWxJbmRleDogbnVtYmVyLCBsb2NhbHM6IExvY2Fscyk6IGJvb2xlYW4ge1xuICAgIHZhciBwcmV2ZW50RGVmYXVsdCA9IGZhbHNlO1xuXG4gICAgdGhpcy5fbWF0Y2hpbmdFdmVudEJpbmRpbmdzKGV2ZW50TmFtZSwgZWxJbmRleClcbiAgICAgICAgLmZvckVhY2gocmVjID0+IHtcbiAgICAgICAgICB2YXIgcmVzID0gdGhpcy5fcHJvY2Vzc0V2ZW50QmluZGluZyhyZWMsIGxvY2Fscyk7XG4gICAgICAgICAgaWYgKHJlcyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHByZXZlbnREZWZhdWx0ID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHByZXZlbnREZWZhdWx0O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcHJvY2Vzc0V2ZW50QmluZGluZyhlYjogRXZlbnRCaW5kaW5nLCBsb2NhbHM6IExvY2Fscyk6IGFueSB7XG4gICAgdmFyIHZhbHVlcyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShlYi5yZWNvcmRzLmxlbmd0aCk7XG4gICAgdmFsdWVzWzBdID0gdGhpcy52YWx1ZXNbMF07XG5cbiAgICBmb3IgKHZhciBwcm90b0lkeCA9IDA7IHByb3RvSWR4IDwgZWIucmVjb3Jkcy5sZW5ndGg7ICsrcHJvdG9JZHgpIHtcbiAgICAgIHZhciBwcm90byA9IGViLnJlY29yZHNbcHJvdG9JZHhdO1xuXG4gICAgICBpZiAocHJvdG8uaXNTa2lwUmVjb3JkKCkpIHtcbiAgICAgICAgcHJvdG9JZHggKz0gdGhpcy5fY29tcHV0ZVNraXBMZW5ndGgocHJvdG9JZHgsIHByb3RvLCB2YWx1ZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlcyA9IHRoaXMuX2NhbGN1bGF0ZUN1cnJWYWx1ZShwcm90bywgdmFsdWVzLCBsb2NhbHMpO1xuICAgICAgICBpZiAocHJvdG8ubGFzdEluQmluZGluZykge1xuICAgICAgICAgIHRoaXMuX21hcmtQYXRoQXNDaGVja09uY2UocHJvdG8pO1xuICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fd3JpdGVTZWxmKHByb3RvLCByZXMsIHZhbHVlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcIkNhbm5vdCBiZSByZWFjaGVkXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29tcHV0ZVNraXBMZW5ndGgocHJvdG9JbmRleDogbnVtYmVyLCBwcm90bzogUHJvdG9SZWNvcmQsIHZhbHVlczogYW55W10pOiBudW1iZXIge1xuICAgIGlmIChwcm90by5tb2RlID09PSBSZWNvcmRUeXBlLlNraXBSZWNvcmRzKSB7XG4gICAgICByZXR1cm4gcHJvdG8uZml4ZWRBcmdzWzBdIC0gcHJvdG9JbmRleCAtIDE7XG4gICAgfVxuXG4gICAgaWYgKHByb3RvLm1vZGUgPT09IFJlY29yZFR5cGUuU2tpcFJlY29yZHNJZikge1xuICAgICAgbGV0IGNvbmRpdGlvbiA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgICAgcmV0dXJuIGNvbmRpdGlvbiA/IHByb3RvLmZpeGVkQXJnc1swXSAtIHByb3RvSW5kZXggLSAxIDogMDtcbiAgICB9XG5cbiAgICBpZiAocHJvdG8ubW9kZSA9PT0gUmVjb3JkVHlwZS5Ta2lwUmVjb3Jkc0lmTm90KSB7XG4gICAgICBsZXQgY29uZGl0aW9uID0gdGhpcy5fcmVhZENvbnRleHQocHJvdG8sIHZhbHVlcyk7XG4gICAgICByZXR1cm4gY29uZGl0aW9uID8gMCA6IHByb3RvLmZpeGVkQXJnc1swXSAtIHByb3RvSW5kZXggLSAxO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFwiQ2Fubm90IGJlIHJlYWNoZWRcIik7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tYXJrUGF0aEFzQ2hlY2tPbmNlKHByb3RvOiBQcm90b1JlY29yZCk6IHZvaWQge1xuICAgIGlmICghcHJvdG8uYmluZGluZ1JlY29yZC5pc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb24oKSkge1xuICAgICAgdmFyIGRpciA9IHByb3RvLmJpbmRpbmdSZWNvcmQuZGlyZWN0aXZlUmVjb3JkO1xuICAgICAgdGhpcy5fZ2V0RGV0ZWN0b3JGb3IoZGlyLmRpcmVjdGl2ZUluZGV4KS5tYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbWF0Y2hpbmdFdmVudEJpbmRpbmdzKGV2ZW50TmFtZTogc3RyaW5nLCBlbEluZGV4OiBudW1iZXIpOiBFdmVudEJpbmRpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50QmluZGluZ3MuZmlsdGVyKGViID0+IGViLmV2ZW50TmFtZSA9PSBldmVudE5hbWUgJiYgZWIuZWxJbmRleCA9PT0gZWxJbmRleCk7XG4gIH1cblxuICBoeWRyYXRlRGlyZWN0aXZlcyhkaXJlY3RpdmVzOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZhbHVlc1swXSA9IHRoaXMuY29udGV4dDtcbiAgICB0aGlzLmRpcmVjdGl2ZXMgPSBkaXJlY3RpdmVzO1xuXG4gICAgaWYgKHRoaXMuc3RyYXRlZ3kgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaE9ic2VydmUpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5kaXJlY3RpdmVJbmRpY2VzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBpbmRleCA9IHRoaXMuZGlyZWN0aXZlSW5kaWNlc1tpXTtcbiAgICAgICAgc3VwZXIub2JzZXJ2ZURpcmVjdGl2ZShkaXJlY3RpdmVzLmdldERpcmVjdGl2ZUZvcihpbmRleCksIGkpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlaHlkcmF0ZURpcmVjdGl2ZXMoZGVzdHJveVBpcGVzOiBib29sZWFuKSB7XG4gICAgaWYgKGRlc3Ryb3lQaXBlcykge1xuICAgICAgdGhpcy5fZGVzdHJveVBpcGVzKCk7XG4gICAgfVxuICAgIHRoaXMudmFsdWVzWzBdID0gbnVsbDtcbiAgICB0aGlzLmRpcmVjdGl2ZXMgPSBudWxsO1xuICAgIExpc3RXcmFwcGVyLmZpbGwodGhpcy52YWx1ZXMsIENoYW5nZURldGVjdGlvblV0aWwudW5pbml0aWFsaXplZCwgMSk7XG4gICAgTGlzdFdyYXBwZXIuZmlsbCh0aGlzLmNoYW5nZXMsIGZhbHNlKTtcbiAgICBMaXN0V3JhcHBlci5maWxsKHRoaXMubG9jYWxQaXBlcywgbnVsbCk7XG4gICAgTGlzdFdyYXBwZXIuZmlsbCh0aGlzLnByZXZDb250ZXh0cywgQ2hhbmdlRGV0ZWN0aW9uVXRpbC51bmluaXRpYWxpemVkKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2Rlc3Ryb3lQaXBlcygpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubG9jYWxQaXBlcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmxvY2FsUGlwZXNbaV0pKSB7XG4gICAgICAgIENoYW5nZURldGVjdGlvblV0aWwuY2FsbFBpcGVPbkRlc3Ryb3kodGhpcy5sb2NhbFBpcGVzW2ldKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBjaGVja05vQ2hhbmdlcygpOiB2b2lkIHsgdGhpcy5ydW5EZXRlY3RDaGFuZ2VzKHRydWUpOyB9XG5cbiAgZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkc0ludGVybmFsKHRocm93T25DaGFuZ2U6IGJvb2xlYW4pIHtcbiAgICB2YXIgcHJvdG9zID0gdGhpcy5fcmVjb3JkcztcblxuICAgIHZhciBjaGFuZ2VzID0gbnVsbDtcbiAgICB2YXIgaXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgZm9yICh2YXIgcHJvdG9JZHggPSAwOyBwcm90b0lkeCA8IHByb3Rvcy5sZW5ndGg7ICsrcHJvdG9JZHgpIHtcbiAgICAgIHZhciBwcm90bzogUHJvdG9SZWNvcmQgPSBwcm90b3NbcHJvdG9JZHhdO1xuICAgICAgdmFyIGJpbmRpbmdSZWNvcmQgPSBwcm90by5iaW5kaW5nUmVjb3JkO1xuICAgICAgdmFyIGRpcmVjdGl2ZVJlY29yZCA9IGJpbmRpbmdSZWNvcmQuZGlyZWN0aXZlUmVjb3JkO1xuXG4gICAgICBpZiAodGhpcy5fZmlyc3RJbkJpbmRpbmcocHJvdG8pKSB7XG4gICAgICAgIHRoaXMucHJvcGVydHlCaW5kaW5nSW5kZXggPSBwcm90by5wcm9wZXJ0eUJpbmRpbmdJbmRleDtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb3RvLmlzTGlmZUN5Y2xlUmVjb3JkKCkpIHtcbiAgICAgICAgaWYgKHByb3RvLm5hbWUgPT09IFwiRG9DaGVja1wiICYmICF0aHJvd09uQ2hhbmdlKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0RGlyZWN0aXZlRm9yKGRpcmVjdGl2ZVJlY29yZC5kaXJlY3RpdmVJbmRleCkubmdEb0NoZWNrKCk7XG4gICAgICAgIH0gZWxzZSBpZiAocHJvdG8ubmFtZSA9PT0gXCJPbkluaXRcIiAmJiAhdGhyb3dPbkNoYW5nZSAmJlxuICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPT0gQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5OZXZlckNoZWNrZWQpIHtcbiAgICAgICAgICB0aGlzLl9nZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlUmVjb3JkLmRpcmVjdGl2ZUluZGV4KS5uZ09uSW5pdCgpO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3RvLm5hbWUgPT09IFwiT25DaGFuZ2VzXCIgJiYgaXNQcmVzZW50KGNoYW5nZXMpICYmICF0aHJvd09uQ2hhbmdlKSB7XG4gICAgICAgICAgdGhpcy5fZ2V0RGlyZWN0aXZlRm9yKGRpcmVjdGl2ZVJlY29yZC5kaXJlY3RpdmVJbmRleCkubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocHJvdG8uaXNTa2lwUmVjb3JkKCkpIHtcbiAgICAgICAgcHJvdG9JZHggKz0gdGhpcy5fY29tcHV0ZVNraXBMZW5ndGgocHJvdG9JZHgsIHByb3RvLCB0aGlzLnZhbHVlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgY2hhbmdlID0gdGhpcy5fY2hlY2socHJvdG8sIHRocm93T25DaGFuZ2UsIHRoaXMudmFsdWVzLCB0aGlzLmxvY2Fscyk7XG4gICAgICAgIGlmIChpc1ByZXNlbnQoY2hhbmdlKSkge1xuICAgICAgICAgIHRoaXMuX3VwZGF0ZURpcmVjdGl2ZU9yRWxlbWVudChjaGFuZ2UsIGJpbmRpbmdSZWNvcmQpO1xuICAgICAgICAgIGlzQ2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgY2hhbmdlcyA9IHRoaXMuX2FkZENoYW5nZShiaW5kaW5nUmVjb3JkLCBjaGFuZ2UsIGNoYW5nZXMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChwcm90by5sYXN0SW5EaXJlY3RpdmUpIHtcbiAgICAgICAgY2hhbmdlcyA9IG51bGw7XG4gICAgICAgIGlmIChpc0NoYW5nZWQgJiYgIWJpbmRpbmdSZWNvcmQuaXNEZWZhdWx0Q2hhbmdlRGV0ZWN0aW9uKCkpIHtcbiAgICAgICAgICB0aGlzLl9nZXREZXRlY3RvckZvcihkaXJlY3RpdmVSZWNvcmQuZGlyZWN0aXZlSW5kZXgpLm1hcmtBc0NoZWNrT25jZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaXNDaGFuZ2VkID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZmlyc3RJbkJpbmRpbmcocjogUHJvdG9SZWNvcmQpOiBib29sZWFuIHtcbiAgICB2YXIgcHJldiA9IENoYW5nZURldGVjdGlvblV0aWwucHJvdG9CeUluZGV4KHRoaXMuX3JlY29yZHMsIHIuc2VsZkluZGV4IC0gMSk7XG4gICAgcmV0dXJuIGlzQmxhbmsocHJldikgfHwgcHJldi5iaW5kaW5nUmVjb3JkICE9PSByLmJpbmRpbmdSZWNvcmQ7XG4gIH1cblxuICBhZnRlckNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3NJbnRlcm5hbCgpIHtcbiAgICB2YXIgZGlycyA9IHRoaXMuX2RpcmVjdGl2ZVJlY29yZHM7XG4gICAgZm9yICh2YXIgaSA9IGRpcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHZhciBkaXIgPSBkaXJzW2ldO1xuICAgICAgaWYgKGRpci5jYWxsQWZ0ZXJDb250ZW50SW5pdCAmJiB0aGlzLnN0YXRlID09IENoYW5nZURldGVjdG9yU3RhdGUuTmV2ZXJDaGVja2VkKSB7XG4gICAgICAgIHRoaXMuX2dldERpcmVjdGl2ZUZvcihkaXIuZGlyZWN0aXZlSW5kZXgpLm5nQWZ0ZXJDb250ZW50SW5pdCgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyLmNhbGxBZnRlckNvbnRlbnRDaGVja2VkKSB7XG4gICAgICAgIHRoaXMuX2dldERpcmVjdGl2ZUZvcihkaXIuZGlyZWN0aXZlSW5kZXgpLm5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrc0ludGVybmFsKCkge1xuICAgIHZhciBkaXJzID0gdGhpcy5fZGlyZWN0aXZlUmVjb3JkcztcbiAgICBmb3IgKHZhciBpID0gZGlycy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdmFyIGRpciA9IGRpcnNbaV07XG4gICAgICBpZiAoZGlyLmNhbGxBZnRlclZpZXdJbml0ICYmIHRoaXMuc3RhdGUgPT0gQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5OZXZlckNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy5fZ2V0RGlyZWN0aXZlRm9yKGRpci5kaXJlY3RpdmVJbmRleCkubmdBZnRlclZpZXdJbml0KCk7XG4gICAgICB9XG4gICAgICBpZiAoZGlyLmNhbGxBZnRlclZpZXdDaGVja2VkKSB7XG4gICAgICAgIHRoaXMuX2dldERpcmVjdGl2ZUZvcihkaXIuZGlyZWN0aXZlSW5kZXgpLm5nQWZ0ZXJWaWV3Q2hlY2tlZCgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBfdXBkYXRlRGlyZWN0aXZlT3JFbGVtZW50KGNoYW5nZSwgYmluZGluZ1JlY29yZCkge1xuICAgIGlmIChpc0JsYW5rKGJpbmRpbmdSZWNvcmQuZGlyZWN0aXZlUmVjb3JkKSkge1xuICAgICAgc3VwZXIubm90aWZ5RGlzcGF0Y2hlcihjaGFuZ2UuY3VycmVudFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGRpcmVjdGl2ZUluZGV4ID0gYmluZGluZ1JlY29yZC5kaXJlY3RpdmVSZWNvcmQuZGlyZWN0aXZlSW5kZXg7XG4gICAgICBiaW5kaW5nUmVjb3JkLnNldHRlcih0aGlzLl9nZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlSW5kZXgpLCBjaGFuZ2UuY3VycmVudFZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZ2VuQ29uZmlnLmxvZ0JpbmRpbmdVcGRhdGUpIHtcbiAgICAgIHN1cGVyLmxvZ0JpbmRpbmdVcGRhdGUoY2hhbmdlLmN1cnJlbnRWYWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9hZGRDaGFuZ2UoYmluZGluZ1JlY29yZDogQmluZGluZ1JlY29yZCwgY2hhbmdlLCBjaGFuZ2VzKSB7XG4gICAgaWYgKGJpbmRpbmdSZWNvcmQuY2FsbE9uQ2hhbmdlcygpKSB7XG4gICAgICByZXR1cm4gc3VwZXIuYWRkQ2hhbmdlKGNoYW5nZXMsIGNoYW5nZS5wcmV2aW91c1ZhbHVlLCBjaGFuZ2UuY3VycmVudFZhbHVlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNoYW5nZXM7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9nZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlSW5kZXgpIHtcbiAgICByZXR1cm4gdGhpcy5kaXJlY3RpdmVzLmdldERpcmVjdGl2ZUZvcihkaXJlY3RpdmVJbmRleCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2dldERldGVjdG9yRm9yKGRpcmVjdGl2ZUluZGV4KSB7IHJldHVybiB0aGlzLmRpcmVjdGl2ZXMuZ2V0RGV0ZWN0b3JGb3IoZGlyZWN0aXZlSW5kZXgpOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9jaGVjayhwcm90bzogUHJvdG9SZWNvcmQsIHRocm93T25DaGFuZ2U6IGJvb2xlYW4sIHZhbHVlczogYW55W10sXG4gICAgICAgICAgICAgICAgIGxvY2FsczogTG9jYWxzKTogU2ltcGxlQ2hhbmdlIHtcbiAgICBpZiAocHJvdG8uaXNQaXBlUmVjb3JkKCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9waXBlQ2hlY2socHJvdG8sIHRocm93T25DaGFuZ2UsIHZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZWZlcmVuY2VDaGVjayhwcm90bywgdGhyb3dPbkNoYW5nZSwgdmFsdWVzLCBsb2NhbHMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBfcmVmZXJlbmNlQ2hlY2socHJvdG86IFByb3RvUmVjb3JkLCB0aHJvd09uQ2hhbmdlOiBib29sZWFuLCB2YWx1ZXM6IGFueVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhbHM6IExvY2Fscykge1xuICAgIGlmICh0aGlzLl9wdXJlRnVuY0FuZEFyZ3NEaWROb3RDaGFuZ2UocHJvdG8pKSB7XG4gICAgICB0aGlzLl9zZXRDaGFuZ2VkKHByb3RvLCBmYWxzZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY3VyclZhbHVlID0gdGhpcy5fY2FsY3VsYXRlQ3VyclZhbHVlKHByb3RvLCB2YWx1ZXMsIGxvY2Fscyk7XG4gICAgaWYgKHRoaXMuc3RyYXRlZ3kgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaE9ic2VydmUpIHtcbiAgICAgIHN1cGVyLm9ic2VydmVWYWx1ZShjdXJyVmFsdWUsIHByb3RvLnNlbGZJbmRleCk7XG4gICAgfVxuXG4gICAgaWYgKHByb3RvLnNob3VsZEJlQ2hlY2tlZCgpKSB7XG4gICAgICB2YXIgcHJldlZhbHVlID0gdGhpcy5fcmVhZFNlbGYocHJvdG8sIHZhbHVlcyk7XG4gICAgICBpZiAoQ2hhbmdlRGV0ZWN0aW9uVXRpbC5sb29zZU5vdElkZW50aWNhbChwcmV2VmFsdWUsIGN1cnJWYWx1ZSkpIHtcbiAgICAgICAgaWYgKHByb3RvLmxhc3RJbkJpbmRpbmcpIHtcbiAgICAgICAgICB2YXIgY2hhbmdlID0gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5zaW1wbGVDaGFuZ2UocHJldlZhbHVlLCBjdXJyVmFsdWUpO1xuICAgICAgICAgIGlmICh0aHJvd09uQ2hhbmdlKSB0aGlzLnRocm93T25DaGFuZ2VFcnJvcihwcmV2VmFsdWUsIGN1cnJWYWx1ZSk7XG5cbiAgICAgICAgICB0aGlzLl93cml0ZVNlbGYocHJvdG8sIGN1cnJWYWx1ZSwgdmFsdWVzKTtcbiAgICAgICAgICB0aGlzLl9zZXRDaGFuZ2VkKHByb3RvLCB0cnVlKTtcbiAgICAgICAgICByZXR1cm4gY2hhbmdlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3dyaXRlU2VsZihwcm90bywgY3VyclZhbHVlLCB2YWx1ZXMpO1xuICAgICAgICAgIHRoaXMuX3NldENoYW5nZWQocHJvdG8sIHRydWUpO1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9zZXRDaGFuZ2VkKHByb3RvLCBmYWxzZSk7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3dyaXRlU2VsZihwcm90bywgY3VyclZhbHVlLCB2YWx1ZXMpO1xuICAgICAgdGhpcy5fc2V0Q2hhbmdlZChwcm90bywgdHJ1ZSk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jYWxjdWxhdGVDdXJyVmFsdWUocHJvdG86IFByb3RvUmVjb3JkLCB2YWx1ZXM6IGFueVtdLCBsb2NhbHM6IExvY2Fscykge1xuICAgIHN3aXRjaCAocHJvdG8ubW9kZSkge1xuICAgICAgY2FzZSBSZWNvcmRUeXBlLlNlbGY6XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkQ29udGV4dChwcm90bywgdmFsdWVzKTtcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLkNvbnN0OlxuICAgICAgICByZXR1cm4gcHJvdG8uZnVuY09yVmFsdWU7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Qcm9wZXJ0eVJlYWQ6XG4gICAgICAgIHZhciBjb250ZXh0ID0gdGhpcy5fcmVhZENvbnRleHQocHJvdG8sIHZhbHVlcyk7XG4gICAgICAgIHJldHVybiBwcm90by5mdW5jT3JWYWx1ZShjb250ZXh0KTtcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLlNhZmVQcm9wZXJ0eTpcbiAgICAgICAgdmFyIGNvbnRleHQgPSB0aGlzLl9yZWFkQ29udGV4dChwcm90bywgdmFsdWVzKTtcbiAgICAgICAgcmV0dXJuIGlzQmxhbmsoY29udGV4dCkgPyBudWxsIDogcHJvdG8uZnVuY09yVmFsdWUoY29udGV4dCk7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Qcm9wZXJ0eVdyaXRlOlxuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9yZWFkQXJncyhwcm90bywgdmFsdWVzKVswXTtcbiAgICAgICAgcHJvdG8uZnVuY09yVmFsdWUoY29udGV4dCwgdmFsdWUpO1xuICAgICAgICByZXR1cm4gdmFsdWU7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5LZXllZFdyaXRlOlxuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICB2YXIga2V5ID0gdGhpcy5fcmVhZEFyZ3MocHJvdG8sIHZhbHVlcylbMF07XG4gICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX3JlYWRBcmdzKHByb3RvLCB2YWx1ZXMpWzFdO1xuICAgICAgICBjb250ZXh0W2tleV0gPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuTG9jYWw6XG4gICAgICAgIHJldHVybiBsb2NhbHMuZ2V0KHByb3RvLm5hbWUpO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuSW52b2tlTWV0aG9kOlxuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICB2YXIgYXJncyA9IHRoaXMuX3JlYWRBcmdzKHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gcHJvdG8uZnVuY09yVmFsdWUoY29udGV4dCwgYXJncyk7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5TYWZlTWV0aG9kSW52b2tlOlxuICAgICAgICB2YXIgY29udGV4dCA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICBpZiAoaXNCbGFuayhjb250ZXh0KSkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHZhciBhcmdzID0gdGhpcy5fcmVhZEFyZ3MocHJvdG8sIHZhbHVlcyk7XG4gICAgICAgIHJldHVybiBwcm90by5mdW5jT3JWYWx1ZShjb250ZXh0LCBhcmdzKTtcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLktleWVkUmVhZDpcbiAgICAgICAgdmFyIGFyZyA9IHRoaXMuX3JlYWRBcmdzKHByb3RvLCB2YWx1ZXMpWzBdO1xuICAgICAgICByZXR1cm4gdGhpcy5fcmVhZENvbnRleHQocHJvdG8sIHZhbHVlcylbYXJnXTtcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLkNoYWluOlxuICAgICAgICB2YXIgYXJncyA9IHRoaXMuX3JlYWRBcmdzKHByb3RvLCB2YWx1ZXMpO1xuICAgICAgICByZXR1cm4gYXJnc1thcmdzLmxlbmd0aCAtIDFdO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuSW52b2tlQ2xvc3VyZTpcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uV3JhcHBlci5hcHBseSh0aGlzLl9yZWFkQ29udGV4dChwcm90bywgdmFsdWVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZWFkQXJncyhwcm90bywgdmFsdWVzKSk7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5JbnRlcnBvbGF0ZTpcbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5QcmltaXRpdmVPcDpcbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Db2xsZWN0aW9uTGl0ZXJhbDpcbiAgICAgICAgcmV0dXJuIEZ1bmN0aW9uV3JhcHBlci5hcHBseShwcm90by5mdW5jT3JWYWx1ZSwgdGhpcy5fcmVhZEFyZ3MocHJvdG8sIHZhbHVlcykpO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgVW5rbm93biBvcGVyYXRpb24gJHtwcm90by5tb2RlfWApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3BpcGVDaGVjayhwcm90bzogUHJvdG9SZWNvcmQsIHRocm93T25DaGFuZ2U6IGJvb2xlYW4sIHZhbHVlczogYW55W10pIHtcbiAgICB2YXIgY29udGV4dCA9IHRoaXMuX3JlYWRDb250ZXh0KHByb3RvLCB2YWx1ZXMpO1xuICAgIHZhciBzZWxlY3RlZFBpcGUgPSB0aGlzLl9waXBlRm9yKHByb3RvLCBjb250ZXh0KTtcbiAgICBpZiAoIXNlbGVjdGVkUGlwZS5wdXJlIHx8IHRoaXMuX2FyZ3NPckNvbnRleHRDaGFuZ2VkKHByb3RvKSkge1xuICAgICAgdmFyIGFyZ3MgPSB0aGlzLl9yZWFkQXJncyhwcm90bywgdmFsdWVzKTtcbiAgICAgIHZhciBjdXJyVmFsdWUgPSBzZWxlY3RlZFBpcGUucGlwZS50cmFuc2Zvcm0oY29udGV4dCwgYXJncyk7XG5cbiAgICAgIGlmIChwcm90by5zaG91bGRCZUNoZWNrZWQoKSkge1xuICAgICAgICB2YXIgcHJldlZhbHVlID0gdGhpcy5fcmVhZFNlbGYocHJvdG8sIHZhbHVlcyk7XG4gICAgICAgIGlmIChDaGFuZ2VEZXRlY3Rpb25VdGlsLmxvb3NlTm90SWRlbnRpY2FsKHByZXZWYWx1ZSwgY3VyclZhbHVlKSkge1xuICAgICAgICAgIGN1cnJWYWx1ZSA9IENoYW5nZURldGVjdGlvblV0aWwudW53cmFwVmFsdWUoY3VyclZhbHVlKTtcblxuICAgICAgICAgIGlmIChwcm90by5sYXN0SW5CaW5kaW5nKSB7XG4gICAgICAgICAgICB2YXIgY2hhbmdlID0gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5zaW1wbGVDaGFuZ2UocHJldlZhbHVlLCBjdXJyVmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRocm93T25DaGFuZ2UpIHRoaXMudGhyb3dPbkNoYW5nZUVycm9yKHByZXZWYWx1ZSwgY3VyclZhbHVlKTtcblxuICAgICAgICAgICAgdGhpcy5fd3JpdGVTZWxmKHByb3RvLCBjdXJyVmFsdWUsIHZhbHVlcyk7XG4gICAgICAgICAgICB0aGlzLl9zZXRDaGFuZ2VkKHByb3RvLCB0cnVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIGNoYW5nZTtcblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93cml0ZVNlbGYocHJvdG8sIGN1cnJWYWx1ZSwgdmFsdWVzKTtcbiAgICAgICAgICAgIHRoaXMuX3NldENoYW5nZWQocHJvdG8sIHRydWUpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuX3NldENoYW5nZWQocHJvdG8sIGZhbHNlKTtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fd3JpdGVTZWxmKHByb3RvLCBjdXJyVmFsdWUsIHZhbHVlcyk7XG4gICAgICAgIHRoaXMuX3NldENoYW5nZWQocHJvdG8sIHRydWUpO1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9waXBlRm9yKHByb3RvOiBQcm90b1JlY29yZCwgY29udGV4dCkge1xuICAgIHZhciBzdG9yZWRQaXBlID0gdGhpcy5fcmVhZFBpcGUocHJvdG8pO1xuICAgIGlmIChpc1ByZXNlbnQoc3RvcmVkUGlwZSkpIHJldHVybiBzdG9yZWRQaXBlO1xuXG4gICAgdmFyIHBpcGUgPSB0aGlzLnBpcGVzLmdldChwcm90by5uYW1lKTtcbiAgICB0aGlzLl93cml0ZVBpcGUocHJvdG8sIHBpcGUpO1xuICAgIHJldHVybiBwaXBlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVhZENvbnRleHQocHJvdG86IFByb3RvUmVjb3JkLCB2YWx1ZXM6IGFueVtdKSB7XG4gICAgaWYgKHByb3RvLmNvbnRleHRJbmRleCA9PSAtMSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2dldERpcmVjdGl2ZUZvcihwcm90by5kaXJlY3RpdmVJbmRleCk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXNbcHJvdG8uY29udGV4dEluZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlYWRTZWxmKHByb3RvOiBQcm90b1JlY29yZCwgdmFsdWVzOiBhbnlbXSkgeyByZXR1cm4gdmFsdWVzW3Byb3RvLnNlbGZJbmRleF07IH1cblxuICBwcml2YXRlIF93cml0ZVNlbGYocHJvdG86IFByb3RvUmVjb3JkLCB2YWx1ZSwgdmFsdWVzOiBhbnlbXSkgeyB2YWx1ZXNbcHJvdG8uc2VsZkluZGV4XSA9IHZhbHVlOyB9XG5cbiAgcHJpdmF0ZSBfcmVhZFBpcGUocHJvdG86IFByb3RvUmVjb3JkKSB7IHJldHVybiB0aGlzLmxvY2FsUGlwZXNbcHJvdG8uc2VsZkluZGV4XTsgfVxuXG4gIHByaXZhdGUgX3dyaXRlUGlwZShwcm90bzogUHJvdG9SZWNvcmQsIHZhbHVlKSB7IHRoaXMubG9jYWxQaXBlc1twcm90by5zZWxmSW5kZXhdID0gdmFsdWU7IH1cblxuICBwcml2YXRlIF9zZXRDaGFuZ2VkKHByb3RvOiBQcm90b1JlY29yZCwgdmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAocHJvdG8uYXJndW1lbnRUb1B1cmVGdW5jdGlvbikgdGhpcy5jaGFuZ2VzW3Byb3RvLnNlbGZJbmRleF0gPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgX3B1cmVGdW5jQW5kQXJnc0RpZE5vdENoYW5nZShwcm90bzogUHJvdG9SZWNvcmQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gcHJvdG8uaXNQdXJlRnVuY3Rpb24oKSAmJiAhdGhpcy5fYXJnc0NoYW5nZWQocHJvdG8pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXJnc0NoYW5nZWQocHJvdG86IFByb3RvUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgdmFyIGFyZ3MgPSBwcm90by5hcmdzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKHRoaXMuY2hhbmdlc1thcmdzW2ldXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXJnc09yQ29udGV4dENoYW5nZWQocHJvdG86IFByb3RvUmVjb3JkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FyZ3NDaGFuZ2VkKHByb3RvKSB8fCB0aGlzLmNoYW5nZXNbcHJvdG8uY29udGV4dEluZGV4XTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlYWRBcmdzKHByb3RvOiBQcm90b1JlY29yZCwgdmFsdWVzOiBhbnlbXSkge1xuICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUocHJvdG8uYXJncy5sZW5ndGgpO1xuICAgIHZhciBhcmdzID0gcHJvdG8uYXJncztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyArK2kpIHtcbiAgICAgIHJlc1tpXSA9IHZhbHVlc1thcmdzW2ldXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9keW5hbWljX2NoYW5nZV9kZXRlY3Rvci50c1xuICoqLyIsImltcG9ydCB7YXNzZXJ0aW9uc0VuYWJsZWQsIGlzUHJlc2VudCwgaXNCbGFuaywgU3RyaW5nV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0NoYW5nZURldGVjdGlvblV0aWx9IGZyb20gJy4vY2hhbmdlX2RldGVjdGlvbl91dGlsJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JSZWYsIENoYW5nZURldGVjdG9yUmVmX30gZnJvbSAnLi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmltcG9ydCB7RGlyZWN0aXZlSW5kZXh9IGZyb20gJy4vZGlyZWN0aXZlX3JlY29yZCc7XG5pbXBvcnQge0NoYW5nZURldGVjdG9yLCBDaGFuZ2VEaXNwYXRjaGVyfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtQaXBlc30gZnJvbSAnLi9waXBlcyc7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25FcnJvcixcbiAgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFeGNlcHRpb24sXG4gIERlaHlkcmF0ZWRFeGNlcHRpb25cbn0gZnJvbSAnLi9leGNlcHRpb25zJztcbmltcG9ydCB7QmluZGluZ1RhcmdldH0gZnJvbSAnLi9iaW5kaW5nX3JlY29yZCc7XG5pbXBvcnQge0xvY2Fsc30gZnJvbSAnLi9wYXJzZXIvbG9jYWxzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksIENoYW5nZURldGVjdG9yU3RhdGV9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7d3RmQ3JlYXRlU2NvcGUsIHd0ZkxlYXZlLCBXdGZTY29wZUZufSBmcm9tICcuLi9wcm9maWxlL3Byb2ZpbGUnO1xuaW1wb3J0IHtpc09ic2VydmFibGV9IGZyb20gJy4vb2JzZXJ2YWJsZV9mYWNhZGUnO1xuXG5cbnZhciBfc2NvcGVfY2hlY2s6IFd0ZlNjb3BlRm4gPSB3dGZDcmVhdGVTY29wZShgQ2hhbmdlRGV0ZWN0b3IjY2hlY2soYXNjaWkgaWQsIGJvb2wgdGhyb3dPbkNoYW5nZSlgKTtcblxuY2xhc3MgX0NvbnRleHQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogYW55LCBwdWJsaWMgY29tcG9uZW50RWxlbWVudDogYW55LCBwdWJsaWMgY29udGV4dDogYW55LFxuICAgICAgICAgICAgICBwdWJsaWMgbG9jYWxzOiBhbnksIHB1YmxpYyBpbmplY3RvcjogYW55LCBwdWJsaWMgZXhwcmVzc2lvbjogYW55KSB7fVxufVxuXG5leHBvcnQgY2xhc3MgQWJzdHJhY3RDaGFuZ2VEZXRlY3RvcjxUPiBpbXBsZW1lbnRzIENoYW5nZURldGVjdG9yIHtcbiAgY29udGVudENoaWxkcmVuOiBhbnlbXSA9IFtdO1xuICB2aWV3Q2hpbGRyZW46IGFueVtdID0gW107XG4gIHBhcmVudDogQ2hhbmdlRGV0ZWN0b3I7XG4gIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWY7XG5cbiAgLy8gVGhlIG5hbWVzIG9mIHRoZSBiZWxvdyBmaWVsZHMgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCBjb2RlZ2VuX25hbWVfdXRpbC50cyBvclxuICAvLyBjaGFuZ2UgZGV0ZWN0aW9uIHdpbGwgZmFpbC5cbiAgc3RhdGU6IENoYW5nZURldGVjdG9yU3RhdGUgPSBDaGFuZ2VEZXRlY3RvclN0YXRlLk5ldmVyQ2hlY2tlZDtcbiAgY29udGV4dDogVDtcbiAgbG9jYWxzOiBMb2NhbHMgPSBudWxsO1xuICBtb2RlOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSA9IG51bGw7XG4gIHBpcGVzOiBQaXBlcyA9IG51bGw7XG4gIHByb3BlcnR5QmluZGluZ0luZGV4OiBudW1iZXI7XG5cbiAgLy8gVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4gV29ya3Mgb25seSBpbiBEYXJ0LlxuICBzdWJzY3JpcHRpb25zOiBhbnlbXTtcbiAgc3RyZWFtczogYW55W107XG5cbiAgY29uc3RydWN0b3IocHVibGljIGlkOiBzdHJpbmcsIHB1YmxpYyBkaXNwYXRjaGVyOiBDaGFuZ2VEaXNwYXRjaGVyLFxuICAgICAgICAgICAgICBwdWJsaWMgbnVtYmVyT2ZQcm9wZXJ0eVByb3RvUmVjb3JkczogbnVtYmVyLCBwdWJsaWMgYmluZGluZ1RhcmdldHM6IEJpbmRpbmdUYXJnZXRbXSxcbiAgICAgICAgICAgICAgcHVibGljIGRpcmVjdGl2ZUluZGljZXM6IERpcmVjdGl2ZUluZGV4W10sIHB1YmxpYyBzdHJhdGVneTogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kpIHtcbiAgICB0aGlzLnJlZiA9IG5ldyBDaGFuZ2VEZXRlY3RvclJlZl8odGhpcyk7XG4gIH1cblxuICBhZGRDb250ZW50Q2hpbGQoY2Q6IENoYW5nZURldGVjdG9yKTogdm9pZCB7XG4gICAgdGhpcy5jb250ZW50Q2hpbGRyZW4ucHVzaChjZCk7XG4gICAgY2QucGFyZW50ID0gdGhpcztcbiAgfVxuXG4gIHJlbW92ZUNvbnRlbnRDaGlsZChjZDogQ2hhbmdlRGV0ZWN0b3IpOiB2b2lkIHsgTGlzdFdyYXBwZXIucmVtb3ZlKHRoaXMuY29udGVudENoaWxkcmVuLCBjZCk7IH1cblxuICBhZGRWaWV3Q2hpbGQoY2Q6IENoYW5nZURldGVjdG9yKTogdm9pZCB7XG4gICAgdGhpcy52aWV3Q2hpbGRyZW4ucHVzaChjZCk7XG4gICAgY2QucGFyZW50ID0gdGhpcztcbiAgfVxuXG4gIHJlbW92ZVZpZXdDaGlsZChjZDogQ2hhbmdlRGV0ZWN0b3IpOiB2b2lkIHsgTGlzdFdyYXBwZXIucmVtb3ZlKHRoaXMudmlld0NoaWxkcmVuLCBjZCk7IH1cblxuICByZW1vdmUoKTogdm9pZCB7IHRoaXMucGFyZW50LnJlbW92ZUNvbnRlbnRDaGlsZCh0aGlzKTsgfVxuXG4gIGhhbmRsZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBlbEluZGV4OiBudW1iZXIsIGxvY2FsczogTG9jYWxzKTogYm9vbGVhbiB7XG4gICAgdmFyIHJlcyA9IHRoaXMuaGFuZGxlRXZlbnRJbnRlcm5hbChldmVudE5hbWUsIGVsSW5kZXgsIGxvY2Fscyk7XG4gICAgdGhpcy5tYXJrUGF0aFRvUm9vdEFzQ2hlY2tPbmNlKCk7XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuXG4gIGhhbmRsZUV2ZW50SW50ZXJuYWwoZXZlbnROYW1lOiBzdHJpbmcsIGVsSW5kZXg6IG51bWJlciwgbG9jYWxzOiBMb2NhbHMpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHsgdGhpcy5ydW5EZXRlY3RDaGFuZ2VzKGZhbHNlKTsgfVxuXG4gIGNoZWNrTm9DaGFuZ2VzKCk6IHZvaWQge1xuICAgIGlmIChhc3NlcnRpb25zRW5hYmxlZCgpKSB7XG4gICAgICB0aGlzLnJ1bkRldGVjdENoYW5nZXModHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcnVuRGV0ZWN0Q2hhbmdlcyh0aHJvd09uQ2hhbmdlOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubW9kZSA9PT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGV0YWNoZWQgfHxcbiAgICAgICAgdGhpcy5tb2RlID09PSBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5DaGVja2VkIHx8IHRoaXMuc3RhdGUgPT09IENoYW5nZURldGVjdG9yU3RhdGUuRXJyb3JlZClcbiAgICAgIHJldHVybjtcbiAgICB2YXIgcyA9IF9zY29wZV9jaGVjayh0aGlzLmlkLCB0aHJvd09uQ2hhbmdlKTtcblxuICAgIHRoaXMuZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkcyh0aHJvd09uQ2hhbmdlKTtcblxuICAgIHRoaXMuX2RldGVjdENoYW5nZXNDb250ZW50Q2hpbGRyZW4odGhyb3dPbkNoYW5nZSk7XG4gICAgaWYgKCF0aHJvd09uQ2hhbmdlKSB0aGlzLmFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrcygpO1xuXG4gICAgdGhpcy5fZGV0ZWN0Q2hhbmdlc0luVmlld0NoaWxkcmVuKHRocm93T25DaGFuZ2UpO1xuICAgIGlmICghdGhyb3dPbkNoYW5nZSkgdGhpcy5hZnRlclZpZXdMaWZlY3ljbGVDYWxsYmFja3MoKTtcblxuICAgIGlmICh0aGlzLm1vZGUgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrT25jZSlcbiAgICAgIHRoaXMubW9kZSA9IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrZWQ7XG5cbiAgICB0aGlzLnN0YXRlID0gQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5DaGVja2VkQmVmb3JlO1xuICAgIHd0ZkxlYXZlKHMpO1xuICB9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4uIFN1YmNsYXNzZXMgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBgZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkc0ludGVybmFsYCB3aGljaCBkb2VzIHRoZSB3b3JrIG9mIGRldGVjdGluZyBjaGFuZ2VzXG4gIC8vIGFuZCB3aGljaCB0aGlzIG1ldGhvZCB3aWxsIGNhbGwuXG4gIC8vIFRoaXMgbWV0aG9kIGV4cGVjdHMgdGhhdCBgZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkc0ludGVybmFsYCB3aWxsIHNldCB0aGUgcHJvcGVydHlcbiAgLy8gYHRoaXMucHJvcGVydHlCaW5kaW5nSW5kZXhgIHRvIHRoZSBwcm9wZXJ0eUJpbmRpbmdJbmRleCBvZiB0aGUgZmlyc3QgcHJvdG8gcmVjb3JkLiBUaGlzIGlzIHRvXG4gIC8vIGZhY2lsaXRhdGUgZXJyb3IgcmVwb3J0aW5nLlxuICBkZXRlY3RDaGFuZ2VzSW5SZWNvcmRzKHRocm93T25DaGFuZ2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaHlkcmF0ZWQoKSkge1xuICAgICAgdGhpcy50aHJvd0RlaHlkcmF0ZWRFcnJvcigpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgdGhpcy5kZXRlY3RDaGFuZ2VzSW5SZWNvcmRzSW50ZXJuYWwodGhyb3dPbkNoYW5nZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gdGhyb3dPbkNoYW5nZSBlcnJvcnMgYXJlbid0IGNvdW50ZWQgYXMgZmF0YWwgZXJyb3JzLlxuICAgICAgaWYgKCEoZSBpbnN0YW5jZW9mIEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXhjZXB0aW9uKSkge1xuICAgICAgICB0aGlzLnN0YXRlID0gQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5FcnJvcmVkO1xuICAgICAgfVxuICAgICAgdGhpcy5fdGhyb3dFcnJvcihlLCBlLnN0YWNrKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwZXJmb3JtIGFueSB3b3JrIG5lY2Vzc2FyeSB0byBkZXRlY3QgYW5kIHJlcG9ydFxuICAvLyBjaGFuZ2VzLiBGb3IgZXhhbXBsZSwgY2hhbmdlcyBzaG91bGQgYmUgcmVwb3J0ZWQgdmlhIGBDaGFuZ2VEZXRlY3Rpb25VdGlsLmFkZENoYW5nZWAsIGxpZmVjeWNsZVxuICAvLyBtZXRob2RzIHNob3VsZCBiZSBjYWxsZWQsIGV0Yy5cbiAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYWxzbyBzZXQgYHRoaXMucHJvcGVydHlCaW5kaW5nSW5kZXhgIHRvIHRoZSBwcm9wZXJ0eUJpbmRpbmdJbmRleCBvZlxuICAvLyB0aGVcbiAgLy8gZmlyc3QgcHJvdG8gcmVjb3JkIHRvIGZhY2lsaXRhdGUgZXJyb3IgcmVwb3J0aW5nLiBTZWUge0BsaW5rICNkZXRlY3RDaGFuZ2VzSW5SZWNvcmRzfS5cbiAgZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkc0ludGVybmFsKHRocm93T25DaGFuZ2U6IGJvb2xlYW4pOiB2b2lkIHt9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4uIFN1YmNsYXNzZXMgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBgaHlkcmF0ZURpcmVjdGl2ZXNgLlxuICBoeWRyYXRlKGNvbnRleHQ6IFQsIGxvY2FsczogTG9jYWxzLCBkaXJlY3RpdmVzOiBhbnksIHBpcGVzOiBQaXBlcyk6IHZvaWQge1xuICAgIHRoaXMubW9kZSA9IENoYW5nZURldGVjdGlvblV0aWwuY2hhbmdlRGV0ZWN0aW9uTW9kZSh0aGlzLnN0cmF0ZWd5KTtcbiAgICB0aGlzLmNvbnRleHQgPSBjb250ZXh0O1xuXG4gICAgaWYgKHRoaXMuc3RyYXRlZ3kgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaE9ic2VydmUpIHtcbiAgICAgIHRoaXMub2JzZXJ2ZUNvbXBvbmVudChjb250ZXh0KTtcbiAgICB9XG5cbiAgICB0aGlzLmxvY2FscyA9IGxvY2FscztcbiAgICB0aGlzLnBpcGVzID0gcGlwZXM7XG4gICAgdGhpcy5oeWRyYXRlRGlyZWN0aXZlcyhkaXJlY3RpdmVzKTtcbiAgICB0aGlzLnN0YXRlID0gQ2hhbmdlRGV0ZWN0b3JTdGF0ZS5OZXZlckNoZWNrZWQ7XG4gIH1cblxuICAvLyBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBoeWRyYXRlIGFueSBkaXJlY3RpdmVzLlxuICBoeWRyYXRlRGlyZWN0aXZlcyhkaXJlY3RpdmVzOiBhbnkpOiB2b2lkIHt9XG5cbiAgLy8gVGhpcyBtZXRob2QgaXMgbm90IGludGVuZGVkIHRvIGJlIG92ZXJyaWRkZW4uIFN1YmNsYXNzZXMgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBhblxuICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBgZGVoeWRyYXRlRGlyZWN0aXZlc2AuXG4gIGRlaHlkcmF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRlaHlkcmF0ZURpcmVjdGl2ZXModHJ1ZSk7XG5cbiAgICAvLyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gICAgaWYgKHRoaXMuc3RyYXRlZ3kgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaE9ic2VydmUpIHtcbiAgICAgIHRoaXMuX3Vuc3Vic3JpYmVGcm9tT2JzZXJ2YWJsZXMoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRleHQgPSBudWxsO1xuICAgIHRoaXMubG9jYWxzID0gbnVsbDtcbiAgICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgfVxuXG4gIC8vIFN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGRlaHlkcmF0ZSBhbnkgZGlyZWN0aXZlcy4gVGhpcyBtZXRob2Qgc2hvdWxkIHJldmVyc2VcbiAgLy8gYW55IHdvcmsgZG9uZSBpbiBgaHlkcmF0ZURpcmVjdGl2ZXNgLlxuICBkZWh5ZHJhdGVEaXJlY3RpdmVzKGRlc3Ryb3lQaXBlczogYm9vbGVhbik6IHZvaWQge31cblxuICBoeWRyYXRlZCgpOiBib29sZWFuIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmNvbnRleHQpOyB9XG5cbiAgYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzKCk6IHZvaWQge1xuICAgIHRoaXMuZGlzcGF0Y2hlci5ub3RpZnlBZnRlckNvbnRlbnRDaGVja2VkKCk7XG4gICAgdGhpcy5hZnRlckNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3NJbnRlcm5hbCgpO1xuICB9XG5cbiAgYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwoKTogdm9pZCB7fVxuXG4gIGFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrcygpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoZXIubm90aWZ5QWZ0ZXJWaWV3Q2hlY2tlZCgpO1xuICAgIHRoaXMuYWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwoKTtcbiAgfVxuXG4gIGFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrc0ludGVybmFsKCk6IHZvaWQge31cblxuICAvKiogQGludGVybmFsICovXG4gIF9kZXRlY3RDaGFuZ2VzQ29udGVudENoaWxkcmVuKHRocm93T25DaGFuZ2U6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB2YXIgYyA9IHRoaXMuY29udGVudENoaWxkcmVuO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYy5sZW5ndGg7ICsraSkge1xuICAgICAgY1tpXS5ydW5EZXRlY3RDaGFuZ2VzKHRocm93T25DaGFuZ2UpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2RldGVjdENoYW5nZXNJblZpZXdDaGlsZHJlbih0aHJvd09uQ2hhbmdlOiBib29sZWFuKTogdm9pZCB7XG4gICAgdmFyIGMgPSB0aGlzLnZpZXdDaGlsZHJlbjtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNbaV0ucnVuRGV0ZWN0Q2hhbmdlcyh0aHJvd09uQ2hhbmdlKTtcbiAgICB9XG4gIH1cblxuICBtYXJrQXNDaGVja09uY2UoKTogdm9pZCB7IHRoaXMubW9kZSA9IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrT25jZTsgfVxuXG4gIG1hcmtQYXRoVG9Sb290QXNDaGVja09uY2UoKTogdm9pZCB7XG4gICAgdmFyIGM6IENoYW5nZURldGVjdG9yID0gdGhpcztcbiAgICB3aGlsZSAoaXNQcmVzZW50KGMpICYmIGMubW9kZSAhPT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGV0YWNoZWQpIHtcbiAgICAgIGlmIChjLm1vZGUgPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrZWQpIGMubW9kZSA9IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrT25jZTtcbiAgICAgIGMgPSBjLnBhcmVudDtcbiAgICB9XG4gIH1cblxuICAvLyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gIHByaXZhdGUgX3Vuc3Vic3JpYmVGcm9tT2JzZXJ2YWJsZXMoKTogdm9pZCB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnN1YnNjcmlwdGlvbnMpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuc3Vic2NyaXB0aW9ucy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgcyA9IHRoaXMuc3Vic2NyaXB0aW9uc1tpXTtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLnN1YnNjcmlwdGlvbnNbaV0pKSB7XG4gICAgICAgICAgcy5jYW5jZWwoKTtcbiAgICAgICAgICB0aGlzLnN1YnNjcmlwdGlvbnNbaV0gPSBudWxsO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gVGhpcyBpcyBhbiBleHBlcmltZW50YWwgZmVhdHVyZS4gV29ya3Mgb25seSBpbiBEYXJ0LlxuICBvYnNlcnZlVmFsdWUodmFsdWU6IGFueSwgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZUFycmF5VG9TdG9yZU9ic2VydmFibGVzKCk7XG4gICAgICBpZiAoaXNCbGFuayh0aGlzLnN1YnNjcmlwdGlvbnNbaW5kZXhdKSkge1xuICAgICAgICB0aGlzLnN0cmVhbXNbaW5kZXhdID0gdmFsdWUuY2hhbmdlcztcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zW2luZGV4XSA9IHZhbHVlLmNoYW5nZXMubGlzdGVuKChfKSA9PiB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuc3RyZWFtc1tpbmRleF0gIT09IHZhbHVlLmNoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zW2luZGV4XS5jYW5jZWwoKTtcbiAgICAgICAgdGhpcy5zdHJlYW1zW2luZGV4XSA9IHZhbHVlLmNoYW5nZXM7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1tpbmRleF0gPSB2YWx1ZS5jaGFuZ2VzLmxpc3RlbigoXykgPT4gdGhpcy5yZWYubWFya0ZvckNoZWNrKCkpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvLyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gIG9ic2VydmVEaXJlY3RpdmUodmFsdWU6IGFueSwgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgaWYgKGlzT2JzZXJ2YWJsZSh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2NyZWF0ZUFycmF5VG9TdG9yZU9ic2VydmFibGVzKCk7XG4gICAgICB2YXIgYXJyYXlJbmRleCA9IHRoaXMubnVtYmVyT2ZQcm9wZXJ0eVByb3RvUmVjb3JkcyArIGluZGV4ICsgMjsgIC8vICsxIGlzIGNvbXBvbmVudFxuICAgICAgdGhpcy5zdHJlYW1zW2FycmF5SW5kZXhdID0gdmFsdWUuY2hhbmdlcztcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1thcnJheUluZGV4XSA9IHZhbHVlLmNoYW5nZXMubGlzdGVuKChfKSA9PiB0aGlzLnJlZi5tYXJrRm9yQ2hlY2soKSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGZlYXR1cmUuIFdvcmtzIG9ubHkgaW4gRGFydC5cbiAgb2JzZXJ2ZUNvbXBvbmVudCh2YWx1ZTogYW55KTogYW55IHtcbiAgICBpZiAoaXNPYnNlcnZhYmxlKHZhbHVlKSkge1xuICAgICAgdGhpcy5fY3JlYXRlQXJyYXlUb1N0b3JlT2JzZXJ2YWJsZXMoKTtcbiAgICAgIHZhciBpbmRleCA9IHRoaXMubnVtYmVyT2ZQcm9wZXJ0eVByb3RvUmVjb3JkcyArIDE7XG4gICAgICB0aGlzLnN0cmVhbXNbaW5kZXhdID0gdmFsdWUuY2hhbmdlcztcbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9uc1tpbmRleF0gPSB2YWx1ZS5jaGFuZ2VzLmxpc3RlbigoXykgPT4gdGhpcy5yZWYubWFya0ZvckNoZWNrKCkpO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVBcnJheVRvU3RvcmVPYnNlcnZhYmxlcygpOiB2b2lkIHtcbiAgICBpZiAoaXNCbGFuayh0aGlzLnN1YnNjcmlwdGlvbnMpKSB7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUodGhpcy5udW1iZXJPZlByb3BlcnR5UHJvdG9SZWNvcmRzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluZGljZXMubGVuZ3RoICsgMik7XG4gICAgICB0aGlzLnN0cmVhbXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUodGhpcy5udW1iZXJPZlByb3BlcnR5UHJvdG9SZWNvcmRzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluZGljZXMubGVuZ3RoICsgMik7XG4gICAgfVxuICB9XG5cbiAgZ2V0RGlyZWN0aXZlRm9yKGRpcmVjdGl2ZXM6IGFueSwgaW5kZXg6IG51bWJlcik6IGFueSB7XG4gICAgcmV0dXJuIGRpcmVjdGl2ZXMuZ2V0RGlyZWN0aXZlRm9yKHRoaXMuZGlyZWN0aXZlSW5kaWNlc1tpbmRleF0pO1xuICB9XG5cbiAgZ2V0RGV0ZWN0b3JGb3IoZGlyZWN0aXZlczogYW55LCBpbmRleDogbnVtYmVyKTogQ2hhbmdlRGV0ZWN0b3Ige1xuICAgIHJldHVybiBkaXJlY3RpdmVzLmdldERldGVjdG9yRm9yKHRoaXMuZGlyZWN0aXZlSW5kaWNlc1tpbmRleF0pO1xuICB9XG5cbiAgbm90aWZ5RGlzcGF0Y2hlcih2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy5kaXNwYXRjaGVyLm5vdGlmeU9uQmluZGluZyh0aGlzLl9jdXJyZW50QmluZGluZygpLCB2YWx1ZSk7XG4gIH1cblxuICBsb2dCaW5kaW5nVXBkYXRlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLmRpc3BhdGNoZXIubG9nQmluZGluZ1VwZGF0ZSh0aGlzLl9jdXJyZW50QmluZGluZygpLCB2YWx1ZSk7XG4gIH1cblxuICBhZGRDaGFuZ2UoY2hhbmdlczoge1trZXk6IHN0cmluZ106IGFueX0sIG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgaWYgKGlzQmxhbmsoY2hhbmdlcykpIHtcbiAgICAgIGNoYW5nZXMgPSB7fTtcbiAgICB9XG4gICAgY2hhbmdlc1t0aGlzLl9jdXJyZW50QmluZGluZygpLm5hbWVdID0gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5zaW1wbGVDaGFuZ2Uob2xkVmFsdWUsIG5ld1ZhbHVlKTtcbiAgICByZXR1cm4gY2hhbmdlcztcbiAgfVxuXG4gIHByaXZhdGUgX3Rocm93RXJyb3IoZXhjZXB0aW9uOiBhbnksIHN0YWNrOiBhbnkpOiB2b2lkIHtcbiAgICB2YXIgZXJyb3I7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBjID0gdGhpcy5kaXNwYXRjaGVyLmdldERlYnVnQ29udGV4dCh0aGlzLl9jdXJyZW50QmluZGluZygpLmVsZW1lbnRJbmRleCwgbnVsbCk7XG4gICAgICB2YXIgY29udGV4dCA9IGlzUHJlc2VudChjKSA/IG5ldyBfQ29udGV4dChjLmVsZW1lbnQsIGMuY29tcG9uZW50RWxlbWVudCwgYy5jb250ZXh0LCBjLmxvY2FscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMuaW5qZWN0b3IsIHRoaXMuX2N1cnJlbnRCaW5kaW5nKCkuZGVidWcpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgIGVycm9yID0gbmV3IENoYW5nZURldGVjdGlvbkVycm9yKHRoaXMuX2N1cnJlbnRCaW5kaW5nKCkuZGVidWcsIGV4Y2VwdGlvbiwgc3RhY2ssIGNvbnRleHQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGlmIGFuIGVycm9yIGhhcHBlbnMgZHVyaW5nIGdldHRpbmcgdGhlIGRlYnVnIGNvbnRleHQsIHdlIHRocm93IGEgQ2hhbmdlRGV0ZWN0aW9uRXJyb3JcbiAgICAgIC8vIHdpdGhvdXQgdGhlIGV4dHJhIGluZm9ybWF0aW9uLlxuICAgICAgZXJyb3IgPSBuZXcgQ2hhbmdlRGV0ZWN0aW9uRXJyb3IobnVsbCwgZXhjZXB0aW9uLCBzdGFjaywgbnVsbCk7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgdGhyb3dPbkNoYW5nZUVycm9yKG9sZFZhbHVlOiBhbnksIG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aHJvdyBuZXcgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFeGNlcHRpb24odGhpcy5fY3VycmVudEJpbmRpbmcoKS5kZWJ1ZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkVmFsdWUsIG5ld1ZhbHVlLCBudWxsKTtcbiAgfVxuXG4gIHRocm93RGVoeWRyYXRlZEVycm9yKCk6IHZvaWQgeyB0aHJvdyBuZXcgRGVoeWRyYXRlZEV4Y2VwdGlvbigpOyB9XG5cbiAgcHJpdmF0ZSBfY3VycmVudEJpbmRpbmcoKTogQmluZGluZ1RhcmdldCB7XG4gICAgcmV0dXJuIHRoaXMuYmluZGluZ1RhcmdldHNbdGhpcy5wcm9wZXJ0eUJpbmRpbmdJbmRleF07XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vYWJzdHJhY3RfY2hhbmdlX2RldGVjdG9yLnRzXG4gKiovIiwiaW1wb3J0IHtDaGFuZ2VEZXRlY3Rvcn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJy4vY29uc3RhbnRzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENoYW5nZURldGVjdG9yUmVmIHtcbiAgLyoqXG4gICAqIE1hcmtzIGFsbCB7QGxpbmsgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kjT25QdXNofSBhbmNlc3RvcnMgYXMgdG8gYmUgY2hlY2tlZC5cbiAgICpcbiAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBPblB1c2ggY29tcG9uZW50cyAtLT5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0dDNTEyYj9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnY21wJyxcbiAgICogICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgICogICB0ZW1wbGF0ZTogYE51bWJlciBvZiB0aWNrczoge3tudW1iZXJPZlRpY2tzfX1gXG4gICAqIH0pXG4gICAqIGNsYXNzIENtcCB7XG4gICAqICAgbnVtYmVyT2ZUaWNrcyA9IDA7XG4gICAqXG4gICAqICAgY29uc3RydWN0b3IocmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgKiAgICAgICB0aGlzLm51bWJlck9mVGlja3MgKytcbiAgICogICAgICAgLy8gdGhlIGZvbGxvd2luZyBpcyByZXF1aXJlZCwgb3RoZXJ3aXNlIHRoZSB2aWV3IHdpbGwgbm90IGJlIHVwZGF0ZWRcbiAgICogICAgICAgdGhpcy5yZWYubWFya0ZvckNoZWNrKCk7XG4gICAqICAgICB9LCAxMDAwKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICAgKiAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgKiAgIHRlbXBsYXRlOiBgXG4gICAqICAgICA8Y21wPjxjbXA+XG4gICAqICAgYCxcbiAgICogICBkaXJlY3RpdmVzOiBbQ21wXVxuICAgKiB9KVxuICAgKiBjbGFzcyBBcHAge1xuICAgKiB9XG4gICAqXG4gICAqIGJvb3RzdHJhcChBcHApO1xuICAgKiBgYGBcbiAgICovXG4gIGFic3RyYWN0IG1hcmtGb3JDaGVjaygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBEZXRhY2hlcyB0aGUgY2hhbmdlIGRldGVjdG9yIGZyb20gdGhlIGNoYW5nZSBkZXRlY3RvciB0cmVlLlxuICAgKlxuICAgKiBUaGUgZGV0YWNoZWQgY2hhbmdlIGRldGVjdG9yIHdpbGwgbm90IGJlIGNoZWNrZWQgdW50aWwgaXQgaXMgcmVhdHRhY2hlZC5cbiAgICpcbiAgICogVGhpcyBjYW4gYWxzbyBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgge0BsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGVjdENoYW5nZXN9IHRvIGltcGxlbWVudFxuICAgKiBsb2NhbCBjaGFuZ2VcbiAgICogZGV0ZWN0aW9uIGNoZWNrcy5cbiAgICpcbiAgICogPCEtLSBUT0RPOiBBZGQgYSBsaW5rIHRvIGEgY2hhcHRlciBvbiBkZXRhY2gvcmVhdHRhY2gvbG9jYWwgZGlnZXN0IC0tPlxuICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpdmUgZGVtbyBvbmNlIHJlZi5kZXRlY3RDaGFuZ2VzIGlzIG1lcmdlZCBpbnRvIG1hc3RlciAtLT5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlZmluZXMgYSBjb21wb25lbnQgd2l0aCBhIGxhcmdlIGxpc3Qgb2YgcmVhZG9ubHkgZGF0YS5cbiAgICogSW1hZ2luZSB0aGUgZGF0YSBjaGFuZ2VzIGNvbnN0YW50bHksIG1hbnkgdGltZXMgcGVyIHNlY29uZC4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsXG4gICAqIHdlIHdhbnQgdG8gY2hlY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdCBldmVyeSBmaXZlIHNlY29uZHMuIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZ1xuICAgKiB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yIGFuZCBkb2luZyBhIGxvY2FsIGNoZWNrIGV2ZXJ5IGZpdmUgc2Vjb25kcy5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBEYXRhUHJvdmlkZXIge1xuICAgKiAgIC8vIGluIGEgcmVhbCBhcHBsaWNhdGlvbiB0aGUgcmV0dXJuZWQgZGF0YSB3aWxsIGJlIGRpZmZlcmVudCBldmVyeSB0aW1lXG4gICAqICAgZ2V0IGRhdGEoKSB7XG4gICAqICAgICByZXR1cm4gWzEsMiwzLDQsNV07XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnZ2lhbnQtbGlzdCcsXG4gICAqICAgdGVtcGxhdGU6IGBcbiAgICogICAgIDxsaSAqbmdGb3I9XCIjZCBvZiBkYXRhUHJvdmlkZXIuZGF0YVwiPkRhdGEge3tkfX08L2xpZz5cbiAgICogICBgLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtOZ0Zvcl1cbiAgICogfSlcbiAgICogY2xhc3MgR2lhbnRMaXN0IHtcbiAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGF0YVByb3ZpZGVyOkRhdGFQcm92aWRlcikge1xuICAgKiAgICAgcmVmLmRldGFjaCgpO1xuICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgKiAgICAgICB0aGlzLnJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAqICAgICB9LCA1MDAwKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICAgKiAgIHByb3ZpZGVyczogW0RhdGFQcm92aWRlcl0sXG4gICAqICAgdGVtcGxhdGU6IGBcbiAgICogICAgIDxnaWFudC1saXN0PjxnaWFudC1saXN0PlxuICAgKiAgIGAsXG4gICAqICAgZGlyZWN0aXZlczogW0dpYW50TGlzdF1cbiAgICogfSlcbiAgICogY2xhc3MgQXBwIHtcbiAgICogfVxuICAgKlxuICAgKiBib290c3RyYXAoQXBwKTtcbiAgICogYGBgXG4gICAqL1xuICBhYnN0cmFjdCBkZXRhY2goKTogdm9pZDtcblxuICAvKipcbiAgICogQ2hlY2tzIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgYW5kIGl0cyBjaGlsZHJlbi5cbiAgICpcbiAgICogVGhpcyBjYW4gYWxzbyBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgge0BsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaH0gdG8gaW1wbGVtZW50IGxvY2FsXG4gICAqIGNoYW5nZSBkZXRlY3Rpb25cbiAgICogY2hlY2tzLlxuICAgKlxuICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgdG8gYSBjaGFwdGVyIG9uIGRldGFjaC9yZWF0dGFjaC9sb2NhbCBkaWdlc3QgLS0+XG4gICAqIDwhLS0gVE9ETzogQWRkIGEgbGl2ZSBkZW1vIG9uY2UgcmVmLmRldGVjdENoYW5nZXMgaXMgbWVyZ2VkIGludG8gbWFzdGVyIC0tPlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGNvbXBvbmVudCB3aXRoIGEgbGFyZ2UgbGlzdCBvZiByZWFkb25seSBkYXRhLlxuICAgKiBJbWFnaW5lLCB0aGUgZGF0YSBjaGFuZ2VzIGNvbnN0YW50bHksIG1hbnkgdGltZXMgcGVyIHNlY29uZC4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsXG4gICAqIHdlIHdhbnQgdG8gY2hlY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdCBldmVyeSBmaXZlIHNlY29uZHMuXG4gICAqXG4gICAqIFdlIGNhbiBkbyB0aGF0IGJ5IGRldGFjaGluZyB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yIGFuZCBkb2luZyBhIGxvY2FsIGNoYW5nZSBkZXRlY3Rpb25cbiAgICogY2hlY2tcbiAgICogZXZlcnkgZml2ZSBzZWNvbmRzLlxuICAgKlxuICAgKiBTZWUge0BsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaH0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gICAqL1xuICBhYnN0cmFjdCBkZXRlY3RDaGFuZ2VzKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENoZWNrcyB0aGUgY2hhbmdlIGRldGVjdG9yIGFuZCBpdHMgY2hpbGRyZW4sIGFuZCB0aHJvd3MgaWYgYW55IGNoYW5nZXMgYXJlIGRldGVjdGVkLlxuICAgKlxuICAgKiBUaGlzIGlzIHVzZWQgaW4gZGV2ZWxvcG1lbnQgbW9kZSB0byB2ZXJpZnkgdGhhdCBydW5uaW5nIGNoYW5nZSBkZXRlY3Rpb24gZG9lc24ndCBpbnRyb2R1Y2VcbiAgICogb3RoZXIgY2hhbmdlcy5cbiAgICovXG4gIGFic3RyYWN0IGNoZWNrTm9DaGFuZ2VzKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlYXR0YWNoIHRoZSBjaGFuZ2UgZGV0ZWN0b3IgdG8gdGhlIGNoYW5nZSBkZXRlY3RvciB0cmVlLlxuICAgKlxuICAgKiBUaGlzIGFsc28gbWFya3MgT25QdXNoIGFuY2VzdG9ycyBhcyB0byBiZSBjaGVja2VkLiBUaGlzIHJlYXR0YWNoZWQgY2hhbmdlIGRldGVjdG9yIHdpbGwgYmVcbiAgICogY2hlY2tlZCBkdXJpbmcgdGhlIG5leHQgY2hhbmdlIGRldGVjdGlvbiBydW4uXG4gICAqXG4gICAqIDwhLS0gVE9ETzogQWRkIGEgbGluayB0byBhIGNoYXB0ZXIgb24gZGV0YWNoL3JlYXR0YWNoL2xvY2FsIGRpZ2VzdCAtLT5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2FVaFpoYT9wPXByZXZpZXcpKVxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhIGNvbXBvbmVudCBkaXNwbGF5aW5nIGBsaXZlYCBkYXRhLiBUaGUgY29tcG9uZW50IHdpbGwgZGV0YWNoXG4gICAqIGl0cyBjaGFuZ2UgZGV0ZWN0b3IgZnJvbSB0aGUgbWFpbiBjaGFuZ2UgZGV0ZWN0b3IgdHJlZSB3aGVuIHRoZSBjb21wb25lbnQncyBsaXZlIHByb3BlcnR5XG4gICAqIGlzIHNldCB0byBmYWxzZS5cbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjbGFzcyBEYXRhUHJvdmlkZXIge1xuICAgKiAgIGRhdGEgPSAxO1xuICAgKlxuICAgKiAgIGNvbnN0cnVjdG9yKCkge1xuICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICAgKiAgICAgICB0aGlzLmRhdGEgPSB0aGlzLmRhdGEgKiAyO1xuICAgKiAgICAgfSwgNTAwKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdsaXZlLWRhdGEnLFxuICAgKiAgIGlucHV0czogWydsaXZlJ10sXG4gICAqICAgdGVtcGxhdGU6IGBEYXRhOiB7e2RhdGFQcm92aWRlci5kYXRhfX1gXG4gICAqIH0pXG4gICAqIGNsYXNzIExpdmVEYXRhIHtcbiAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYsIHByaXZhdGUgZGF0YVByb3ZpZGVyOkRhdGFQcm92aWRlcikge31cbiAgICpcbiAgICogICBzZXQgbGl2ZSh2YWx1ZSkge1xuICAgKiAgICAgaWYgKHZhbHVlKVxuICAgKiAgICAgICB0aGlzLnJlZi5yZWF0dGFjaCgpO1xuICAgKiAgICAgZWxzZVxuICAgKiAgICAgICB0aGlzLnJlZi5kZXRhY2goKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICAgKiAgIHByb3ZpZGVyczogW0RhdGFQcm92aWRlcl0sXG4gICAqICAgdGVtcGxhdGU6IGBcbiAgICogICAgIExpdmUgVXBkYXRlOiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJsaXZlXCI+XG4gICAqICAgICA8bGl2ZS1kYXRhIFtsaXZlXT1cImxpdmVcIj48bGl2ZS1kYXRhPlxuICAgKiAgIGAsXG4gICAqICAgZGlyZWN0aXZlczogW0xpdmVEYXRhLCBGT1JNX0RJUkVDVElWRVNdXG4gICAqIH0pXG4gICAqIGNsYXNzIEFwcCB7XG4gICAqICAgbGl2ZSA9IHRydWU7XG4gICAqIH1cbiAgICpcbiAgICogYm9vdHN0cmFwKEFwcCk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWJzdHJhY3QgcmVhdHRhY2goKTogdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIENoYW5nZURldGVjdG9yUmVmXyBleHRlbmRzIENoYW5nZURldGVjdG9yUmVmIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY2Q6IENoYW5nZURldGVjdG9yKSB7IHN1cGVyKCk7IH1cblxuICBtYXJrRm9yQ2hlY2soKTogdm9pZCB7IHRoaXMuX2NkLm1hcmtQYXRoVG9Sb290QXNDaGVja09uY2UoKTsgfVxuICBkZXRhY2goKTogdm9pZCB7IHRoaXMuX2NkLm1vZGUgPSBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZXRhY2hlZDsgfVxuICBkZXRlY3RDaGFuZ2VzKCk6IHZvaWQgeyB0aGlzLl9jZC5kZXRlY3RDaGFuZ2VzKCk7IH1cbiAgY2hlY2tOb0NoYW5nZXMoKTogdm9pZCB7IHRoaXMuX2NkLmNoZWNrTm9DaGFuZ2VzKCk7IH1cbiAgcmVhdHRhY2goKTogdm9pZCB7XG4gICAgdGhpcy5fY2QubW9kZSA9IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkNoZWNrQWx3YXlzO1xuICAgIHRoaXMubWFya0ZvckNoZWNrKCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdG9yX3JlZi50c1xuICoqLyIsImV4cG9ydCB7V3RmU2NvcGVGbn0gZnJvbSAnLi93dGZfaW1wbCc7XG5cbmltcG9ydCAqIGFzIGltcGwgZnJvbSBcIi4vd3RmX2ltcGxcIjtcblxuLy8gQ2hhbmdlIGV4cG9ydHMgdG8gY29uc3Qgb25jZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci90czJkYXJ0L2lzc3Vlcy8xNTBcblxuLyoqXG4gKiBUcnVlIGlmIFdURiBpcyBlbmFibGVkLlxuICovXG5leHBvcnQgdmFyIHd0ZkVuYWJsZWQgPSBpbXBsLmRldGVjdFdURigpO1xuXG5mdW5jdGlvbiBub29wU2NvcGUoYXJnMD86IGFueSwgYXJnMT86IGFueSk6IGFueSB7XG4gIHJldHVybiBudWxsO1xufVxuXG4vKipcbiAqIENyZWF0ZSB0cmFjZSBzY29wZS5cbiAqXG4gKiBTY29wZXMgbXVzdCBiZSBzdHJpY3RseSBuZXN0ZWQgYW5kIGFyZSBhbmFsb2dvdXMgdG8gc3RhY2sgZnJhbWVzLCBidXRcbiAqIGRvIG5vdCBoYXZlIHRvIGZvbGxvdyB0aGUgc3RhY2sgZnJhbWVzLiBJbnN0ZWFkIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdGhleSBmb2xsb3cgbG9naWNhbFxuICogbmVzdGluZy4gWW91IG1heSB3YW50IHRvIHVzZVxuICogW0V2ZW50XG4gKiBTaWduYXR1cmVzXShodHRwOi8vZ29vZ2xlLmdpdGh1Yi5pby90cmFjaW5nLWZyYW1ld29yay9pbnN0cnVtZW50aW5nLWNvZGUuaHRtbCNjdXN0b20tZXZlbnRzKVxuICogYXMgdGhleSBhcmUgZGVmaW5lZCBpbiBXVEYuXG4gKlxuICogVXNlZCB0byBtYXJrIHNjb3BlIGVudHJ5LiBUaGUgcmV0dXJuIHZhbHVlIGlzIHVzZWQgdG8gbGVhdmUgdGhlIHNjb3BlLlxuICpcbiAqICAgICB2YXIgbXlTY29wZSA9IHd0ZkNyZWF0ZVNjb3BlKCdNeUNsYXNzI215TWV0aG9kKGFzY2lpIHNvbWVWYWwpJyk7XG4gKlxuICogICAgIHNvbWVNZXRob2QoKSB7XG4gKiAgICAgICAgdmFyIHMgPSBteVNjb3BlKCdGb28nKTsgLy8gJ0ZvbycgZ2V0cyBzdG9yZWQgaW4gdHJhY2luZyBVSVxuICogICAgICAgIC8vIERPIFNPTUUgV09SSyBIRVJFXG4gKiAgICAgICAgcmV0dXJuIHd0ZkxlYXZlKHMsIDEyMyk7IC8vIFJldHVybiB2YWx1ZSAxMjNcbiAqICAgICB9XG4gKlxuICogTm90ZSwgYWRkaW5nIHRyeS1maW5hbGx5IGJsb2NrIGFyb3VuZCB0aGUgd29yayB0byBlbnN1cmUgdGhhdCBgd3RmTGVhdmVgIGdldHMgY2FsbGVkIGNhblxuICogbmVnYXRpdmVseSBpbXBhY3QgdGhlIHBlcmZvcm1hbmNlIG9mIHlvdXIgYXBwbGljYXRpb24uIEZvciB0aGlzIHJlYXNvbiB3ZSByZWNvbW1lbmQgdGhhdFxuICogeW91IGRvbid0IGFkZCB0aGVtIHRvIGVuc3VyZSB0aGF0IGB3dGZMZWF2ZWAgZ2V0cyBjYWxsZWQuIEluIHByb2R1Y3Rpb24gYHd0ZkxlYXZlYCBpcyBhIG5vb3AgYW5kXG4gKiBzbyB0cnktZmluYWxseSBibG9jayBoYXMgbm8gdmFsdWUuIFdoZW4gZGVidWdnaW5nIHBlcmYgaXNzdWVzLCBza2lwcGluZyBgd3RmTGVhdmVgLCBkbyB0b1xuICogZXhjZXB0aW9uLCB3aWxsIHByb2R1Y2UgaW5jb3JyZWN0IHRyYWNlLCBidXQgcHJlc2VuY2Ugb2YgZXhjZXB0aW9uIHNpZ25pZmllcyBsb2dpYyBlcnJvciB3aGljaFxuICogbmVlZHMgdG8gYmUgZml4ZWQgYmVmb3JlIHRoZSBhcHAgc2hvdWxkIGJlIHByb2ZpbGVkLiBBZGQgdHJ5LWZpbmFsbHkgb25seSB3aGVuIHlvdSBleHBlY3QgdGhhdFxuICogYW4gZXhjZXB0aW9uIGlzIGV4cGVjdGVkIGR1cmluZyBub3JtYWwgZXhlY3V0aW9uIHdoaWxlIHByb2ZpbGluZy5cbiAqXG4gKi9cbmV4cG9ydCB2YXIgd3RmQ3JlYXRlU2NvcGU6IChzaWduYXR1cmU6IHN0cmluZywgZmxhZ3M/OiBhbnkpID0+IGltcGwuV3RmU2NvcGVGbiA9XG4gICAgd3RmRW5hYmxlZCA/IGltcGwuY3JlYXRlU2NvcGUgOiAoc2lnbmF0dXJlOiBzdHJpbmcsIGZsYWdzPzogYW55KSA9PiBub29wU2NvcGU7XG5cbi8qKlxuICogVXNlZCB0byBtYXJrIGVuZCBvZiBTY29wZS5cbiAqXG4gKiAtIGBzY29wZWAgdG8gZW5kLlxuICogLSBgcmV0dXJuVmFsdWVgIChvcHRpb25hbCkgdG8gYmUgcGFzc2VkIHRvIHRoZSBXVEYuXG4gKlxuICogUmV0dXJucyB0aGUgYHJldHVyblZhbHVlIGZvciBlYXN5IGNoYWluaW5nLlxuICovXG5leHBvcnQgdmFyIHd0ZkxlYXZlOjxUPihzY29wZTogYW55LCByZXR1cm5WYWx1ZT86IFQpID0+IFQgPVxuICAgIHd0ZkVuYWJsZWQgPyBpbXBsLmxlYXZlIDogKHM6IGFueSwgcj86IGFueSkgPT4gcjtcblxuLyoqXG4gKiBVc2VkIHRvIG1hcmsgQXN5bmMgc3RhcnQuIEFzeW5jIGFyZSBzaW1pbGFyIHRvIHNjb3BlIGJ1dCB0aGV5IGRvbid0IGhhdmUgdG8gYmUgc3RyaWN0bHkgbmVzdGVkLlxuICogVGhlIHJldHVybiB2YWx1ZSBpcyB1c2VkIGluIHRoZSBjYWxsIHRvIFtlbmRBc3luY10uIEFzeW5jIHJhbmdlcyBvbmx5IHdvcmsgaWYgV1RGIGhhcyBiZWVuXG4gKiBlbmFibGVkLlxuICpcbiAqICAgICBzb21lTWV0aG9kKCkge1xuICogICAgICAgIHZhciBzID0gd3RmU3RhcnRUaW1lUmFuZ2UoJ0hUVFA6R0VUJywgJ3NvbWUudXJsJyk7XG4gKiAgICAgICAgdmFyIGZ1dHVyZSA9IG5ldyBGdXR1cmUuZGVsYXkoNSkudGhlbigoXykge1xuICogICAgICAgICAgd3RmRW5kVGltZVJhbmdlKHMpO1xuICogICAgICAgIH0pO1xuICogICAgIH1cbiAqL1xuZXhwb3J0IHZhciB3dGZTdGFydFRpbWVSYW5nZTogKHJhbmdlVHlwZTogc3RyaW5nLCBhY3Rpb246IHN0cmluZykgPT4gYW55ID1cbiAgICB3dGZFbmFibGVkID8gaW1wbC5zdGFydFRpbWVSYW5nZSA6IChyYW5nZVR5cGU6IHN0cmluZywgYWN0aW9uOiBzdHJpbmcpID0+IG51bGw7XG5cbi8qKlxuICogRW5kcyBhIGFzeW5jIHRpbWUgcmFuZ2Ugb3BlcmF0aW9uLlxuICogW3JhbmdlXSBpcyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gW3d0ZlN0YXJ0VGltZVJhbmdlXSBBc3luYyByYW5nZXMgb25seSB3b3JrIGlmIFdURiBoYXMgYmVlblxuICogZW5hYmxlZC5cbiAqL1xuZXhwb3J0IHZhciB3dGZFbmRUaW1lUmFuZ2U6IChyYW5nZTogYW55KSA9PiB2b2lkID0gd3RmRW5hYmxlZCA/IGltcGwuZW5kVGltZVJhbmdlIDogKHI6IGFueSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcHJvZmlsZS9wcm9maWxlLnRzXG4gKiovIiwiaW1wb3J0IHtnbG9iYWx9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogQSBzY29wZSBmdW5jdGlvbiBmb3IgdGhlIFdlYiBUcmFjaW5nIEZyYW1ld29yayAoV1RGKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXdGZTY29wZUZuIHsgKGFyZzA/OiBhbnksIGFyZzE/OiBhbnkpOiBhbnk7IH1cblxuaW50ZXJmYWNlIFdURiB7XG4gIHRyYWNlOiBUcmFjZTtcbn1cblxuaW50ZXJmYWNlIFRyYWNlIHtcbiAgZXZlbnRzOiBFdmVudHM7XG4gIGxlYXZlU2NvcGUoc2NvcGU6IFNjb3BlLCByZXR1cm5WYWx1ZTogYW55KTtcbiAgYmVnaW5UaW1lUmFuZ2UocmFuZ2VUeXBlOiBzdHJpbmcsIGFjdGlvbjogc3RyaW5nKTogUmFuZ2U7XG4gIGVuZFRpbWVSYW5nZShyYW5nZTogUmFuZ2UpO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlIHt9XG5cbmludGVyZmFjZSBFdmVudHMge1xuICBjcmVhdGVTY29wZShzaWduYXR1cmU6IHN0cmluZywgZmxhZ3M6IGFueSk6IFNjb3BlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjb3BlIHsgKC4uLmFyZ3MpOiBhbnk7IH1cblxudmFyIHRyYWNlOiBUcmFjZTtcbnZhciBldmVudHM6IEV2ZW50cztcblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdFdURigpOiBib29sZWFuIHtcbiAgdmFyIHd0ZjogV1RGID0gZ2xvYmFsWyd3dGYnXTtcbiAgaWYgKHd0Zikge1xuICAgIHRyYWNlID0gd3RmWyd0cmFjZSddO1xuICAgIGlmICh0cmFjZSkge1xuICAgICAgZXZlbnRzID0gdHJhY2VbJ2V2ZW50cyddO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjb3BlKHNpZ25hdHVyZTogc3RyaW5nLCBmbGFnczogYW55ID0gbnVsbCk6IGFueSB7XG4gIHJldHVybiBldmVudHMuY3JlYXRlU2NvcGUoc2lnbmF0dXJlLCBmbGFncyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBsZWF2ZTxUPihzY29wZTogU2NvcGUsIHJldHVyblZhbHVlPzogVCk6IFQge1xuICB0cmFjZS5sZWF2ZVNjb3BlKHNjb3BlLCByZXR1cm5WYWx1ZSk7XG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0VGltZVJhbmdlKHJhbmdlVHlwZTogc3RyaW5nLCBhY3Rpb246IHN0cmluZyk6IFJhbmdlIHtcbiAgcmV0dXJuIHRyYWNlLmJlZ2luVGltZVJhbmdlKHJhbmdlVHlwZSwgYWN0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuZFRpbWVSYW5nZShyYW5nZTogUmFuZ2UpOiB2b2lkIHtcbiAgdHJhY2UuZW5kVGltZVJhbmdlKHJhbmdlKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL3Byb2ZpbGUvd3RmX2ltcGwudHNcbiAqKi8iLCJleHBvcnQgZnVuY3Rpb24gaXNPYnNlcnZhYmxlKHZhbHVlOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vb2JzZXJ2YWJsZV9mYWNhZGUudHNcbiAqKi8iLCJpbXBvcnQge0JpbmRpbmdSZWNvcmR9IGZyb20gJy4vYmluZGluZ19yZWNvcmQnO1xuaW1wb3J0IHtEaXJlY3RpdmVJbmRleH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcblxuZXhwb3J0IGVudW0gUmVjb3JkVHlwZSB7XG4gIFNlbGYsXG4gIENvbnN0LFxuICBQcmltaXRpdmVPcCxcbiAgUHJvcGVydHlSZWFkLFxuICBQcm9wZXJ0eVdyaXRlLFxuICBMb2NhbCxcbiAgSW52b2tlTWV0aG9kLFxuICBJbnZva2VDbG9zdXJlLFxuICBLZXllZFJlYWQsXG4gIEtleWVkV3JpdGUsXG4gIFBpcGUsXG4gIEludGVycG9sYXRlLFxuICBTYWZlUHJvcGVydHksXG4gIENvbGxlY3Rpb25MaXRlcmFsLFxuICBTYWZlTWV0aG9kSW52b2tlLFxuICBEaXJlY3RpdmVMaWZlY3ljbGUsXG4gIENoYWluLFxuICBTa2lwUmVjb3Jkc0lmLCAgICAgLy8gU2tpcCByZWNvcmRzIHdoZW4gdGhlIGNvbmRpdGlvbiBpcyB0cnVlXG4gIFNraXBSZWNvcmRzSWZOb3QsICAvLyBTa2lwIHJlY29yZHMgd2hlbiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlXG4gIFNraXBSZWNvcmRzICAgICAgICAvLyBTa2lwIHJlY29yZHMgdW5jb25kaXRpb25hbGx5XG59XG5cbmV4cG9ydCBjbGFzcyBQcm90b1JlY29yZCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBtb2RlOiBSZWNvcmRUeXBlLCBwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgZnVuY09yVmFsdWUsIHB1YmxpYyBhcmdzOiBhbnlbXSxcbiAgICAgICAgICAgICAgcHVibGljIGZpeGVkQXJnczogYW55W10sIHB1YmxpYyBjb250ZXh0SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIGRpcmVjdGl2ZUluZGV4OiBEaXJlY3RpdmVJbmRleCwgcHVibGljIHNlbGZJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgYmluZGluZ1JlY29yZDogQmluZGluZ1JlY29yZCwgcHVibGljIGxhc3RJbkJpbmRpbmc6IGJvb2xlYW4sXG4gICAgICAgICAgICAgIHB1YmxpYyBsYXN0SW5EaXJlY3RpdmU6IGJvb2xlYW4sIHB1YmxpYyBhcmd1bWVudFRvUHVyZUZ1bmN0aW9uOiBib29sZWFuLFxuICAgICAgICAgICAgICBwdWJsaWMgcmVmZXJlbmNlZEJ5U2VsZjogYm9vbGVhbiwgcHVibGljIHByb3BlcnR5QmluZGluZ0luZGV4OiBudW1iZXIpIHt9XG5cbiAgaXNQdXJlRnVuY3Rpb24oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gUmVjb3JkVHlwZS5JbnRlcnBvbGF0ZSB8fCB0aGlzLm1vZGUgPT09IFJlY29yZFR5cGUuQ29sbGVjdGlvbkxpdGVyYWw7XG4gIH1cblxuICBpc1VzZWRCeU90aGVyUmVjb3JkKCk6IGJvb2xlYW4geyByZXR1cm4gIXRoaXMubGFzdEluQmluZGluZyB8fCB0aGlzLnJlZmVyZW5jZWRCeVNlbGY7IH1cblxuICBzaG91bGRCZUNoZWNrZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYXJndW1lbnRUb1B1cmVGdW5jdGlvbiB8fCB0aGlzLmxhc3RJbkJpbmRpbmcgfHwgdGhpcy5pc1B1cmVGdW5jdGlvbigpIHx8XG4gICAgICAgICAgIHRoaXMuaXNQaXBlUmVjb3JkKCk7XG4gIH1cblxuICBpc1BpcGVSZWNvcmQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1vZGUgPT09IFJlY29yZFR5cGUuUGlwZTsgfVxuXG4gIGlzQ29uZGl0aW9uYWxTa2lwUmVjb3JkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm1vZGUgPT09IFJlY29yZFR5cGUuU2tpcFJlY29yZHNJZk5vdCB8fCB0aGlzLm1vZGUgPT09IFJlY29yZFR5cGUuU2tpcFJlY29yZHNJZjtcbiAgfVxuXG4gIGlzVW5jb25kaXRpb25hbFNraXBSZWNvcmQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLm1vZGUgPT09IFJlY29yZFR5cGUuU2tpcFJlY29yZHM7IH1cblxuICBpc1NraXBSZWNvcmQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNDb25kaXRpb25hbFNraXBSZWNvcmQoKSB8fCB0aGlzLmlzVW5jb25kaXRpb25hbFNraXBSZWNvcmQoKTtcbiAgfVxuXG4gIGlzTGlmZUN5Y2xlUmVjb3JkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5tb2RlID09PSBSZWNvcmRUeXBlLkRpcmVjdGl2ZUxpZmVjeWNsZTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9wcm90b19yZWNvcmQudHNcbiAqKi8iLCJpbXBvcnQge0RpcmVjdGl2ZUluZGV4fSBmcm9tICcuL2RpcmVjdGl2ZV9yZWNvcmQnO1xuaW1wb3J0IHtQcm90b1JlY29yZH0gZnJvbSAnLi9wcm90b19yZWNvcmQnO1xuXG5leHBvcnQgY2xhc3MgRXZlbnRCaW5kaW5nIHtcbiAgY29uc3RydWN0b3IocHVibGljIGV2ZW50TmFtZTogc3RyaW5nLCBwdWJsaWMgZWxJbmRleDogbnVtYmVyLCBwdWJsaWMgZGlySW5kZXg6IERpcmVjdGl2ZUluZGV4LFxuICAgICAgICAgICAgICBwdWJsaWMgcmVjb3JkczogUHJvdG9SZWNvcmRbXSkge31cbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2V2ZW50X2JpbmRpbmcudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudCwgaXNCbGFuaywgbG9vc2VJZGVudGljYWx9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0xpc3RXcmFwcGVyLCBNYXB9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1JlY29yZFR5cGUsIFByb3RvUmVjb3JkfSBmcm9tICcuL3Byb3RvX3JlY29yZCc7XG5cbi8qKlxuICogUmVtb3ZlcyBcImR1cGxpY2F0ZVwiIHJlY29yZHMuIEl0IGFzc3VtZXMgdGhhdCByZWNvcmQgZXZhbHVhdGlvbiBkb2VzIG5vdCBoYXZlIHNpZGUtZWZmZWN0cy5cbiAqXG4gKiBSZWNvcmRzIHRoYXQgYXJlIG5vdCBsYXN0IGluIGJpbmRpbmdzIGFyZSByZW1vdmVkIGFuZCBhbGwgdGhlIGluZGljZXMgb2YgdGhlIHJlY29yZHMgdGhhdCBkZXBlbmRcbiAqIG9uIHRoZW0gYXJlIHVwZGF0ZWQuXG4gKlxuICogUmVjb3JkcyB0aGF0IGFyZSBsYXN0IGluIGJpbmRpbmdzIENBTk5PVCBiZSByZW1vdmVkLCBhbmQgaW5zdGVhZCBhcmUgcmVwbGFjZWQgd2l0aCB2ZXJ5IGNoZWFwXG4gKiBTRUxGIHJlY29yZHMuXG4gKlxuICogQGludGVybmFsXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2FsZXNjZShzcmNSZWNvcmRzOiBQcm90b1JlY29yZFtdKTogUHJvdG9SZWNvcmRbXSB7XG4gIGxldCBkc3RSZWNvcmRzID0gW107XG4gIGxldCBleGNsdWRlZElkeHMgPSBbXTtcbiAgbGV0IGluZGV4TWFwOiBNYXA8bnVtYmVyLCBudW1iZXI+ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcbiAgbGV0IHNraXBEZXB0aCA9IDA7XG4gIGxldCBza2lwU291cmNlczogUHJvdG9SZWNvcmRbXSA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShzcmNSZWNvcmRzLmxlbmd0aCk7XG5cbiAgZm9yIChsZXQgcHJvdG9JbmRleCA9IDA7IHByb3RvSW5kZXggPCBzcmNSZWNvcmRzLmxlbmd0aDsgcHJvdG9JbmRleCsrKSB7XG4gICAgbGV0IHNraXBSZWNvcmQgPSBza2lwU291cmNlc1twcm90b0luZGV4XTtcbiAgICBpZiAoaXNQcmVzZW50KHNraXBSZWNvcmQpKSB7XG4gICAgICBza2lwRGVwdGgtLTtcbiAgICAgIHNraXBSZWNvcmQuZml4ZWRBcmdzWzBdID0gZHN0UmVjb3Jkcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgbGV0IHNyYyA9IHNyY1JlY29yZHNbcHJvdG9JbmRleF07XG4gICAgbGV0IGRzdCA9IF9jbG9uZUFuZFVwZGF0ZUluZGV4ZXMoc3JjLCBkc3RSZWNvcmRzLCBpbmRleE1hcCk7XG5cbiAgICBpZiAoZHN0LmlzU2tpcFJlY29yZCgpKSB7XG4gICAgICBkc3RSZWNvcmRzLnB1c2goZHN0KTtcbiAgICAgIHNraXBEZXB0aCsrO1xuICAgICAgc2tpcFNvdXJjZXNbZHN0LmZpeGVkQXJnc1swXV0gPSBkc3Q7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCByZWNvcmQgPSBfbWF5QmVBZGRSZWNvcmQoZHN0LCBkc3RSZWNvcmRzLCBleGNsdWRlZElkeHMsIHNraXBEZXB0aCA+IDApO1xuICAgICAgaW5kZXhNYXAuc2V0KHNyYy5zZWxmSW5kZXgsIHJlY29yZC5zZWxmSW5kZXgpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBfb3B0aW1pemVTa2lwcyhkc3RSZWNvcmRzKTtcbn1cblxuLyoqXG4gKiAtIENvbmRpdGlvbmFsIHNraXAgb2YgMSByZWNvcmQgZm9sbG93ZWQgYnkgYW4gdW5jb25kaXRpb25hbCBza2lwIG9mIE4gYXJlIHJlcGxhY2VkIGJ5ICBhXG4gKiAgIGNvbmRpdGlvbmFsIHNraXAgb2YgTiB3aXRoIHRoZSBuZWdhdGVkIGNvbmRpdGlvbixcbiAqIC0gU2tpcHMgb2YgMCByZWNvcmRzIGFyZSByZW1vdmVkXG4gKi9cbmZ1bmN0aW9uIF9vcHRpbWl6ZVNraXBzKHNyY1JlY29yZHM6IFByb3RvUmVjb3JkW10pOiBQcm90b1JlY29yZFtdIHtcbiAgbGV0IGRzdFJlY29yZHMgPSBbXTtcbiAgbGV0IHNraXBTb3VyY2VzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKHNyY1JlY29yZHMubGVuZ3RoKTtcbiAgbGV0IGluZGV4TWFwOiBNYXA8bnVtYmVyLCBudW1iZXI+ID0gbmV3IE1hcDxudW1iZXIsIG51bWJlcj4oKTtcblxuICBmb3IgKGxldCBwcm90b0luZGV4ID0gMDsgcHJvdG9JbmRleCA8IHNyY1JlY29yZHMubGVuZ3RoOyBwcm90b0luZGV4KyspIHtcbiAgICBsZXQgc2tpcFJlY29yZCA9IHNraXBTb3VyY2VzW3Byb3RvSW5kZXhdO1xuICAgIGlmIChpc1ByZXNlbnQoc2tpcFJlY29yZCkpIHtcbiAgICAgIHNraXBSZWNvcmQuZml4ZWRBcmdzWzBdID0gZHN0UmVjb3Jkcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgbGV0IHNyYyA9IHNyY1JlY29yZHNbcHJvdG9JbmRleF07XG5cbiAgICBpZiAoc3JjLmlzU2tpcFJlY29yZCgpKSB7XG4gICAgICBpZiAoc3JjLmlzQ29uZGl0aW9uYWxTa2lwUmVjb3JkKCkgJiYgc3JjLmZpeGVkQXJnc1swXSA9PT0gcHJvdG9JbmRleCArIDIgJiZcbiAgICAgICAgICBwcm90b0luZGV4IDwgc3JjUmVjb3Jkcy5sZW5ndGggLSAxICYmXG4gICAgICAgICAgc3JjUmVjb3Jkc1twcm90b0luZGV4ICsgMV0ubW9kZSA9PT0gUmVjb3JkVHlwZS5Ta2lwUmVjb3Jkcykge1xuICAgICAgICBzcmMubW9kZSA9IHNyYy5tb2RlID09PSBSZWNvcmRUeXBlLlNraXBSZWNvcmRzSWYgPyBSZWNvcmRUeXBlLlNraXBSZWNvcmRzSWZOb3QgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWNvcmRUeXBlLlNraXBSZWNvcmRzSWY7XG4gICAgICAgIHNyYy5maXhlZEFyZ3NbMF0gPSBzcmNSZWNvcmRzW3Byb3RvSW5kZXggKyAxXS5maXhlZEFyZ3NbMF07XG4gICAgICAgIHByb3RvSW5kZXgrKztcbiAgICAgIH1cblxuICAgICAgaWYgKHNyYy5maXhlZEFyZ3NbMF0gPiBwcm90b0luZGV4ICsgMSkge1xuICAgICAgICBsZXQgZHN0ID0gX2Nsb25lQW5kVXBkYXRlSW5kZXhlcyhzcmMsIGRzdFJlY29yZHMsIGluZGV4TWFwKTtcbiAgICAgICAgZHN0UmVjb3Jkcy5wdXNoKGRzdCk7XG4gICAgICAgIHNraXBTb3VyY2VzW2RzdC5maXhlZEFyZ3NbMF1dID0gZHN0O1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBkc3QgPSBfY2xvbmVBbmRVcGRhdGVJbmRleGVzKHNyYywgZHN0UmVjb3JkcywgaW5kZXhNYXApO1xuICAgICAgZHN0UmVjb3Jkcy5wdXNoKGRzdCk7XG4gICAgICBpbmRleE1hcC5zZXQoc3JjLnNlbGZJbmRleCwgZHN0LnNlbGZJbmRleCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRzdFJlY29yZHM7XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IHJlY29yZCBvciByZS11c2Ugb25lIG9mIHRoZSBleGlzdGluZyByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBfbWF5QmVBZGRSZWNvcmQocmVjb3JkOiBQcm90b1JlY29yZCwgZHN0UmVjb3JkczogUHJvdG9SZWNvcmRbXSwgZXhjbHVkZWRJZHhzOiBudW1iZXJbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZDogYm9vbGVhbik6IFByb3RvUmVjb3JkIHtcbiAgbGV0IG1hdGNoID0gX2ZpbmRGaXJzdE1hdGNoKHJlY29yZCwgZHN0UmVjb3JkcywgZXhjbHVkZWRJZHhzKTtcblxuICBpZiAoaXNQcmVzZW50KG1hdGNoKSkge1xuICAgIGlmIChyZWNvcmQubGFzdEluQmluZGluZykge1xuICAgICAgZHN0UmVjb3Jkcy5wdXNoKF9jcmVhdGVTZWxmUmVjb3JkKHJlY29yZCwgbWF0Y2guc2VsZkluZGV4LCBkc3RSZWNvcmRzLmxlbmd0aCArIDEpKTtcbiAgICAgIG1hdGNoLnJlZmVyZW5jZWRCeVNlbGYgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAocmVjb3JkLmFyZ3VtZW50VG9QdXJlRnVuY3Rpb24pIHtcbiAgICAgICAgbWF0Y2guYXJndW1lbnRUb1B1cmVGdW5jdGlvbiA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG1hdGNoO1xuICB9XG5cbiAgaWYgKGV4Y2x1ZGVkKSB7XG4gICAgZXhjbHVkZWRJZHhzLnB1c2gocmVjb3JkLnNlbGZJbmRleCk7XG4gIH1cblxuICBkc3RSZWNvcmRzLnB1c2gocmVjb3JkKTtcbiAgcmV0dXJuIHJlY29yZDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBmaXJzdCBgUHJvdG9SZWNvcmRgIHRoYXQgbWF0Y2hlcyB0aGUgcmVjb3JkLlxuICovXG5mdW5jdGlvbiBfZmluZEZpcnN0TWF0Y2gocmVjb3JkOiBQcm90b1JlY29yZCwgZHN0UmVjb3JkczogUHJvdG9SZWNvcmRbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlZElkeHM6IG51bWJlcltdKTogUHJvdG9SZWNvcmQge1xuICByZXR1cm4gZHN0UmVjb3Jkcy5maW5kKFxuICAgICAgLy8gVE9ETyh2aWNiKTogb3B0aW1pemUgZXhjbHVkZWRJZHhzLmluZGV4T2YgKHNvcnRlZCBhcnJheSlcbiAgICAgIHJyID0+IGV4Y2x1ZGVkSWR4cy5pbmRleE9mKHJyLnNlbGZJbmRleCkgPT0gLTEgJiYgcnIubW9kZSAhPT0gUmVjb3JkVHlwZS5EaXJlY3RpdmVMaWZlY3ljbGUgJiZcbiAgICAgICAgICAgIF9oYXZlU2FtZURpckluZGV4KHJyLCByZWNvcmQpICYmIHJyLm1vZGUgPT09IHJlY29yZC5tb2RlICYmXG4gICAgICAgICAgICBsb29zZUlkZW50aWNhbChyci5mdW5jT3JWYWx1ZSwgcmVjb3JkLmZ1bmNPclZhbHVlKSAmJlxuICAgICAgICAgICAgcnIuY29udGV4dEluZGV4ID09PSByZWNvcmQuY29udGV4dEluZGV4ICYmIGxvb3NlSWRlbnRpY2FsKHJyLm5hbWUsIHJlY29yZC5uYW1lKSAmJlxuICAgICAgICAgICAgTGlzdFdyYXBwZXIuZXF1YWxzKHJyLmFyZ3MsIHJlY29yZC5hcmdzKSk7XG59XG5cbi8qKlxuICogQ2xvbmUgdGhlIGBQcm90b1JlY29yZGAgYW5kIGNoYW5nZXMgdGhlIGluZGV4ZXMgZm9yIHRoZSBvbmVzIGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSBmb3I6XG4gKiAtIHRoZSBhcmd1bWVudHMsXG4gKiAtIHRoZSBjb250ZXh0LFxuICogLSBzZWxmXG4gKi9cbmZ1bmN0aW9uIF9jbG9uZUFuZFVwZGF0ZUluZGV4ZXMocmVjb3JkOiBQcm90b1JlY29yZCwgZHN0UmVjb3JkczogUHJvdG9SZWNvcmRbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhNYXA6IE1hcDxudW1iZXIsIG51bWJlcj4pOiBQcm90b1JlY29yZCB7XG4gIGxldCBhcmdzID0gcmVjb3JkLmFyZ3MubWFwKHNyYyA9PiBfc3JjVG9Ec3RTZWxmSW5kZXgoaW5kZXhNYXAsIHNyYykpO1xuICBsZXQgY29udGV4dEluZGV4ID0gX3NyY1RvRHN0U2VsZkluZGV4KGluZGV4TWFwLCByZWNvcmQuY29udGV4dEluZGV4KTtcbiAgbGV0IHNlbGZJbmRleCA9IGRzdFJlY29yZHMubGVuZ3RoICsgMTtcblxuICByZXR1cm4gbmV3IFByb3RvUmVjb3JkKHJlY29yZC5tb2RlLCByZWNvcmQubmFtZSwgcmVjb3JkLmZ1bmNPclZhbHVlLCBhcmdzLCByZWNvcmQuZml4ZWRBcmdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRJbmRleCwgcmVjb3JkLmRpcmVjdGl2ZUluZGV4LCBzZWxmSW5kZXgsIHJlY29yZC5iaW5kaW5nUmVjb3JkLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5sYXN0SW5CaW5kaW5nLCByZWNvcmQubGFzdEluRGlyZWN0aXZlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZC5hcmd1bWVudFRvUHVyZUZ1bmN0aW9uLCByZWNvcmQucmVmZXJlbmNlZEJ5U2VsZixcbiAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQucHJvcGVydHlCaW5kaW5nSW5kZXgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IGluIHRoZSBkZXN0aW5hdGlvbiBhcnJheSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRleCBpbiB0aGUgc3JjIGFycmF5LlxuICogV2hlbiB0aGUgZWxlbWVudCBpcyBub3QgcHJlc2VudCBpbiB0aGUgZGVzdGluYXRpb24gYXJyYXksIHJldHVybiB0aGUgc291cmNlIGluZGV4LlxuICovXG5mdW5jdGlvbiBfc3JjVG9Ec3RTZWxmSW5kZXgoaW5kZXhNYXA6IE1hcDxudW1iZXIsIG51bWJlcj4sIHNyY0lkeDogbnVtYmVyKTogbnVtYmVyIHtcbiAgdmFyIGRzdElkeCA9IGluZGV4TWFwLmdldChzcmNJZHgpO1xuICByZXR1cm4gaXNQcmVzZW50KGRzdElkeCkgPyBkc3RJZHggOiBzcmNJZHg7XG59XG5cbmZ1bmN0aW9uIF9jcmVhdGVTZWxmUmVjb3JkKHI6IFByb3RvUmVjb3JkLCBjb250ZXh0SW5kZXg6IG51bWJlciwgc2VsZkluZGV4OiBudW1iZXIpOiBQcm90b1JlY29yZCB7XG4gIHJldHVybiBuZXcgUHJvdG9SZWNvcmQoUmVjb3JkVHlwZS5TZWxmLCBcInNlbGZcIiwgbnVsbCwgW10sIHIuZml4ZWRBcmdzLCBjb250ZXh0SW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgci5kaXJlY3RpdmVJbmRleCwgc2VsZkluZGV4LCByLmJpbmRpbmdSZWNvcmQsIHIubGFzdEluQmluZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICByLmxhc3RJbkRpcmVjdGl2ZSwgZmFsc2UsIGZhbHNlLCByLnByb3BlcnR5QmluZGluZ0luZGV4KTtcbn1cblxuZnVuY3Rpb24gX2hhdmVTYW1lRGlySW5kZXgoYTogUHJvdG9SZWNvcmQsIGI6IFByb3RvUmVjb3JkKTogYm9vbGVhbiB7XG4gIHZhciBkaTEgPSBpc0JsYW5rKGEuZGlyZWN0aXZlSW5kZXgpID8gbnVsbCA6IGEuZGlyZWN0aXZlSW5kZXguZGlyZWN0aXZlSW5kZXg7XG4gIHZhciBlaTEgPSBpc0JsYW5rKGEuZGlyZWN0aXZlSW5kZXgpID8gbnVsbCA6IGEuZGlyZWN0aXZlSW5kZXguZWxlbWVudEluZGV4O1xuXG4gIHZhciBkaTIgPSBpc0JsYW5rKGIuZGlyZWN0aXZlSW5kZXgpID8gbnVsbCA6IGIuZGlyZWN0aXZlSW5kZXguZGlyZWN0aXZlSW5kZXg7XG4gIHZhciBlaTIgPSBpc0JsYW5rKGIuZGlyZWN0aXZlSW5kZXgpID8gbnVsbCA6IGIuZGlyZWN0aXZlSW5kZXguZWxlbWVudEluZGV4O1xuXG4gIHJldHVybiBkaTEgPT09IGRpMiAmJiBlaTEgPT09IGVpMjtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY29hbGVzY2UudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc1ByZXNlbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbmltcG9ydCB7UHJvdG9DaGFuZ2VEZXRlY3RvciwgQ2hhbmdlRGV0ZWN0b3IsIENoYW5nZURldGVjdG9yRGVmaW5pdGlvbn0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0b3JKSVRHZW5lcmF0b3J9IGZyb20gJy4vY2hhbmdlX2RldGVjdGlvbl9qaXRfZ2VuZXJhdG9yJztcblxuZXhwb3J0IGNsYXNzIEppdFByb3RvQ2hhbmdlRGV0ZWN0b3IgaW1wbGVtZW50cyBQcm90b0NoYW5nZURldGVjdG9yIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZmFjdG9yeTogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBkZWZpbml0aW9uOiBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24pIHtcbiAgICB0aGlzLl9mYWN0b3J5ID0gdGhpcy5fY3JlYXRlRmFjdG9yeShkZWZpbml0aW9uKTtcbiAgfVxuXG4gIHN0YXRpYyBpc1N1cHBvcnRlZCgpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cblxuICBpbnN0YW50aWF0ZShkaXNwYXRjaGVyOiBhbnkpOiBDaGFuZ2VEZXRlY3RvciB7IHJldHVybiB0aGlzLl9mYWN0b3J5KGRpc3BhdGNoZXIpOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY3JlYXRlRmFjdG9yeShkZWZpbml0aW9uOiBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24pIHtcbiAgICByZXR1cm4gbmV3IENoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yKGRlZmluaXRpb24sICd1dGlsJywgJ0Fic3RyYWN0Q2hhbmdlRGV0ZWN0b3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NoYW5nZURldGVjdG9yU3RhdHVzJylcbiAgICAgICAgLmdlbmVyYXRlKCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vaml0X3Byb3RvX2NoYW5nZV9kZXRlY3Rvci50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgYXNzZXJ0aW9uc0VuYWJsZWQsIGlzQmxhbmssIGlzUHJlc2VudCwgU3RyaW5nV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCB7QWJzdHJhY3RDaGFuZ2VEZXRlY3Rvcn0gZnJvbSAnLi9hYnN0cmFjdF9jaGFuZ2VfZGV0ZWN0b3InO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25VdGlsfSBmcm9tICcuL2NoYW5nZV9kZXRlY3Rpb25fdXRpbCc7XG5pbXBvcnQge0RpcmVjdGl2ZUluZGV4LCBEaXJlY3RpdmVSZWNvcmR9IGZyb20gJy4vZGlyZWN0aXZlX3JlY29yZCc7XG5cbmltcG9ydCB7UHJvdG9SZWNvcmQsIFJlY29yZFR5cGV9IGZyb20gJy4vcHJvdG9fcmVjb3JkJztcbmltcG9ydCB7Q29kZWdlbk5hbWVVdGlsLCBzYW5pdGl6ZU5hbWV9IGZyb20gJy4vY29kZWdlbl9uYW1lX3V0aWwnO1xuaW1wb3J0IHtDb2RlZ2VuTG9naWNVdGlsfSBmcm9tICcuL2NvZGVnZW5fbG9naWNfdXRpbCc7XG5pbXBvcnQge2NvZGlmeX0gZnJvbSAnLi9jb2RlZ2VuX2ZhY2FkZSc7XG5pbXBvcnQge0V2ZW50QmluZGluZ30gZnJvbSAnLi9ldmVudF9iaW5kaW5nJztcbmltcG9ydCB7QmluZGluZ1RhcmdldH0gZnJvbSAnLi9iaW5kaW5nX3JlY29yZCc7XG5pbXBvcnQge0NoYW5nZURldGVjdG9yR2VuQ29uZmlnLCBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb259IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0NoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclN0YXRlfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge2NyZWF0ZVByb3BlcnR5UmVjb3JkcywgY3JlYXRlRXZlbnRSZWNvcmRzfSBmcm9tICcuL3Byb3RvX2NoYW5nZV9kZXRlY3Rvcic7XG5cbi8qKlxuICogVGhlIGNvZGUgZ2VuZXJhdG9yIHRha2VzIGEgbGlzdCBvZiBwcm90byByZWNvcmRzIGFuZCBjcmVhdGVzIGEgZnVuY3Rpb24vY2xhc3NcbiAqIHRoYXQgXCJlbXVsYXRlc1wiIHdoYXQgdGhlIGRldmVsb3BlciB3b3VsZCB3cml0ZSBieSBoYW5kIHRvIGltcGxlbWVudCB0aGUgc2FtZVxuICoga2luZCBvZiBiZWhhdmlvdXIuXG4gKlxuICogVGhpcyBjb2RlIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgRGFydCB0cmFuc2Zvcm1lcidzXG4gKiBgYW5ndWxhcjIudHJhbnNmb3JtLnRlbXBsYXRlX2NvbXBpbGVyLmNoYW5nZV9kZXRlY3Rvcl9jb2RlZ2VuYCBsaWJyYXJ5LiBJZiB5b3UgbWFrZSB1cGRhdGVzXG4gKiBoZXJlLCBwbGVhc2UgbWFrZSBlcXVpdmFsZW50IGNoYW5nZXMgdGhlcmUuXG4qL1xuY29uc3QgSVNfQ0hBTkdFRF9MT0NBTCA9IFwiaXNDaGFuZ2VkXCI7XG5jb25zdCBDSEFOR0VTX0xPQ0FMID0gXCJjaGFuZ2VzXCI7XG5cbmV4cG9ydCBjbGFzcyBDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvciB7XG4gIHByaXZhdGUgX2xvZ2ljOiBDb2RlZ2VuTG9naWNVdGlsO1xuICBwcml2YXRlIF9uYW1lczogQ29kZWdlbk5hbWVVdGlsO1xuICBwcml2YXRlIF9lbmRPZkJsb2NrSWR4czogbnVtYmVyW107XG4gIHByaXZhdGUgaWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3Rpb25TdHJhdGVneTogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k7XG4gIHByaXZhdGUgcmVjb3JkczogUHJvdG9SZWNvcmRbXTtcbiAgcHJpdmF0ZSBwcm9wZXJ0eUJpbmRpbmdUYXJnZXRzOiBCaW5kaW5nVGFyZ2V0W107XG4gIHByaXZhdGUgZXZlbnRCaW5kaW5nczogRXZlbnRCaW5kaW5nW107XG4gIHByaXZhdGUgZGlyZWN0aXZlUmVjb3JkczogYW55W107XG4gIHByaXZhdGUgZ2VuQ29uZmlnOiBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZztcbiAgdHlwZU5hbWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihkZWZpbml0aW9uOiBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24sIHByaXZhdGUgY2hhbmdlRGV0ZWN0aW9uVXRpbFZhck5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBhYnN0cmFjdENoYW5nZURldGVjdG9yVmFyTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICBwcml2YXRlIGNoYW5nZURldGVjdG9yU3RhdGVWYXJOYW1lOiBzdHJpbmcpIHtcbiAgICB2YXIgcHJvcGVydHlCaW5kaW5nUmVjb3JkcyA9IGNyZWF0ZVByb3BlcnR5UmVjb3JkcyhkZWZpbml0aW9uKTtcbiAgICB2YXIgZXZlbnRCaW5kaW5nUmVjb3JkcyA9IGNyZWF0ZUV2ZW50UmVjb3JkcyhkZWZpbml0aW9uKTtcbiAgICB2YXIgcHJvcGVydHlCaW5kaW5nVGFyZ2V0cyA9IGRlZmluaXRpb24uYmluZGluZ1JlY29yZHMubWFwKGIgPT4gYi50YXJnZXQpO1xuICAgIHRoaXMuaWQgPSBkZWZpbml0aW9uLmlkO1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgPSBkZWZpbml0aW9uLnN0cmF0ZWd5O1xuICAgIHRoaXMuZ2VuQ29uZmlnID0gZGVmaW5pdGlvbi5nZW5Db25maWc7XG5cbiAgICB0aGlzLnJlY29yZHMgPSBwcm9wZXJ0eUJpbmRpbmdSZWNvcmRzO1xuICAgIHRoaXMucHJvcGVydHlCaW5kaW5nVGFyZ2V0cyA9IHByb3BlcnR5QmluZGluZ1RhcmdldHM7XG4gICAgdGhpcy5ldmVudEJpbmRpbmdzID0gZXZlbnRCaW5kaW5nUmVjb3JkcztcbiAgICB0aGlzLmRpcmVjdGl2ZVJlY29yZHMgPSBkZWZpbml0aW9uLmRpcmVjdGl2ZVJlY29yZHM7XG4gICAgdGhpcy5fbmFtZXMgPSBuZXcgQ29kZWdlbk5hbWVVdGlsKHRoaXMucmVjb3JkcywgdGhpcy5ldmVudEJpbmRpbmdzLCB0aGlzLmRpcmVjdGl2ZVJlY29yZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0aW9uVXRpbFZhck5hbWUpO1xuICAgIHRoaXMuX2xvZ2ljID1cbiAgICAgICAgbmV3IENvZGVnZW5Mb2dpY1V0aWwodGhpcy5fbmFtZXMsIHRoaXMuY2hhbmdlRGV0ZWN0aW9uVXRpbFZhck5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3JTdGF0ZVZhck5hbWUsIHRoaXMuY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kpO1xuICAgIHRoaXMudHlwZU5hbWUgPSBzYW5pdGl6ZU5hbWUoYENoYW5nZURldGVjdG9yXyR7dGhpcy5pZH1gKTtcbiAgfVxuXG4gIGdlbmVyYXRlKCk6IEZ1bmN0aW9uIHtcbiAgICB2YXIgZmFjdG9yeVNvdXJjZSA9IGBcbiAgICAgICR7dGhpcy5nZW5lcmF0ZVNvdXJjZSgpfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKGRpc3BhdGNoZXIpIHtcbiAgICAgICAgcmV0dXJuIG5ldyAke3RoaXMudHlwZU5hbWV9KGRpc3BhdGNoZXIpO1xuICAgICAgfVxuICAgIGA7XG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbih0aGlzLmFic3RyYWN0Q2hhbmdlRGV0ZWN0b3JWYXJOYW1lLCB0aGlzLmNoYW5nZURldGVjdGlvblV0aWxWYXJOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3RvclN0YXRlVmFyTmFtZSwgZmFjdG9yeVNvdXJjZSkoXG4gICAgICAgIEFic3RyYWN0Q2hhbmdlRGV0ZWN0b3IsIENoYW5nZURldGVjdGlvblV0aWwsIENoYW5nZURldGVjdG9yU3RhdGUpO1xuICB9XG5cbiAgZ2VuZXJhdGVTb3VyY2UoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYFxuICAgICAgdmFyICR7dGhpcy50eXBlTmFtZX0gPSBmdW5jdGlvbiAke3RoaXMudHlwZU5hbWV9KGRpc3BhdGNoZXIpIHtcbiAgICAgICAgJHt0aGlzLmFic3RyYWN0Q2hhbmdlRGV0ZWN0b3JWYXJOYW1lfS5jYWxsKFxuICAgICAgICAgICAgdGhpcywgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmlkKX0sIGRpc3BhdGNoZXIsICR7dGhpcy5yZWNvcmRzLmxlbmd0aH0sXG4gICAgICAgICAgICAke3RoaXMudHlwZU5hbWV9Lmdlbl9wcm9wZXJ0eUJpbmRpbmdUYXJnZXRzLCAke3RoaXMudHlwZU5hbWV9Lmdlbl9kaXJlY3RpdmVJbmRpY2VzLFxuICAgICAgICAgICAgJHtjb2RpZnkodGhpcy5jaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSl9KTtcbiAgICAgICAgdGhpcy5kZWh5ZHJhdGVEaXJlY3RpdmVzKGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCR7dGhpcy5hYnN0cmFjdENoYW5nZURldGVjdG9yVmFyTmFtZX0ucHJvdG90eXBlKTtcblxuICAgICAgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUuZGV0ZWN0Q2hhbmdlc0luUmVjb3Jkc0ludGVybmFsID0gZnVuY3Rpb24odGhyb3dPbkNoYW5nZSkge1xuICAgICAgICAke3RoaXMuX25hbWVzLmdlbkluaXRMb2NhbHMoKX1cbiAgICAgICAgdmFyICR7SVNfQ0hBTkdFRF9MT0NBTH0gPSBmYWxzZTtcbiAgICAgICAgdmFyICR7Q0hBTkdFU19MT0NBTH0gPSBudWxsO1xuXG4gICAgICAgICR7dGhpcy5fZ2VuQWxsUmVjb3Jkcyh0aGlzLnJlY29yZHMpfVxuICAgICAgfVxuXG4gICAgICAke3RoaXMuX21heWJlR2VuSGFuZGxlRXZlbnRJbnRlcm5hbCgpfVxuXG4gICAgICAke3RoaXMuX21heWJlR2VuQWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzKCl9XG5cbiAgICAgICR7dGhpcy5fbWF5YmVHZW5BZnRlclZpZXdMaWZlY3ljbGVDYWxsYmFja3MoKX1cblxuICAgICAgJHt0aGlzLl9tYXliZUdlbkh5ZHJhdGVEaXJlY3RpdmVzKCl9XG5cbiAgICAgICR7dGhpcy5fbWF5YmVHZW5EZWh5ZHJhdGVEaXJlY3RpdmVzKCl9XG5cbiAgICAgICR7dGhpcy5fZ2VuUHJvcGVydHlCaW5kaW5nVGFyZ2V0cygpfVxuXG4gICAgICAke3RoaXMuX2dlbkRpcmVjdGl2ZUluZGljZXMoKX1cbiAgICBgO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuUHJvcGVydHlCaW5kaW5nVGFyZ2V0cygpOiBzdHJpbmcge1xuICAgIHZhciB0YXJnZXRzID0gdGhpcy5fbG9naWMuZ2VuUHJvcGVydHlCaW5kaW5nVGFyZ2V0cyh0aGlzLnByb3BlcnR5QmluZGluZ1RhcmdldHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2VuQ29uZmlnLmdlbkRlYnVnSW5mbyk7XG4gICAgcmV0dXJuIGAke3RoaXMudHlwZU5hbWV9Lmdlbl9wcm9wZXJ0eUJpbmRpbmdUYXJnZXRzID0gJHt0YXJnZXRzfTtgO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuRGlyZWN0aXZlSW5kaWNlcygpOiBzdHJpbmcge1xuICAgIHZhciBpbmRpY2VzID0gdGhpcy5fbG9naWMuZ2VuRGlyZWN0aXZlSW5kaWNlcyh0aGlzLmRpcmVjdGl2ZVJlY29yZHMpO1xuICAgIHJldHVybiBgJHt0aGlzLnR5cGVOYW1lfS5nZW5fZGlyZWN0aXZlSW5kaWNlcyA9ICR7aW5kaWNlc307YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21heWJlR2VuSGFuZGxlRXZlbnRJbnRlcm5hbCgpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmV2ZW50QmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGhhbmRsZXJzID0gdGhpcy5ldmVudEJpbmRpbmdzLm1hcChlYiA9PiB0aGlzLl9nZW5FdmVudEJpbmRpbmcoZWIpKS5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUuaGFuZGxlRXZlbnRJbnRlcm5hbCA9IGZ1bmN0aW9uKGV2ZW50TmFtZSwgZWxJbmRleCwgbG9jYWxzKSB7XG4gICAgICAgICAgdmFyICR7dGhpcy5fbmFtZXMuZ2V0UHJldmVudERlZmF1bHRBY2Nlc29yKCl9ID0gZmFsc2U7XG4gICAgICAgICAgJHt0aGlzLl9uYW1lcy5nZW5Jbml0RXZlbnRMb2NhbHMoKX1cbiAgICAgICAgICAke2hhbmRsZXJzfVxuICAgICAgICAgIHJldHVybiAke3RoaXMuX25hbWVzLmdldFByZXZlbnREZWZhdWx0QWNjZXNvcigpfTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkV2ZW50QmluZGluZyhlYjogRXZlbnRCaW5kaW5nKTogc3RyaW5nIHtcbiAgICBsZXQgY29kZXM6IFN0cmluZ1tdID0gW107XG4gICAgdGhpcy5fZW5kT2ZCbG9ja0lkeHMgPSBbXTtcblxuICAgIExpc3RXcmFwcGVyLmZvckVhY2hXaXRoSW5kZXgoZWIucmVjb3JkcywgKHIsIGkpID0+IHtcbiAgICAgIGxldCBjb2RlO1xuXG4gICAgICBpZiAoci5pc0NvbmRpdGlvbmFsU2tpcFJlY29yZCgpKSB7XG4gICAgICAgIGNvZGUgPSB0aGlzLl9nZW5Db25kaXRpb25hbFNraXAociwgdGhpcy5fbmFtZXMuZ2V0RXZlbnRMb2NhbE5hbWUoZWIsIGkpKTtcbiAgICAgIH0gZWxzZSBpZiAoci5pc1VuY29uZGl0aW9uYWxTa2lwUmVjb3JkKCkpIHtcbiAgICAgICAgY29kZSA9IHRoaXMuX2dlblVuY29uZGl0aW9uYWxTa2lwKHIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29kZSA9IHRoaXMuX2dlbkV2ZW50QmluZGluZ0V2YWwoZWIsIHIpO1xuICAgICAgfVxuXG4gICAgICBjb2RlICs9IHRoaXMuX2dlbkVuZE9mU2tpcEJsb2NrKGkpO1xuXG4gICAgICBjb2Rlcy5wdXNoKGNvZGUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIGBcbiAgICBpZiAoZXZlbnROYW1lID09PSBcIiR7ZWIuZXZlbnROYW1lfVwiICYmIGVsSW5kZXggPT09ICR7ZWIuZWxJbmRleH0pIHtcbiAgICAgICR7Y29kZXMuam9pbihcIlxcblwiKX1cbiAgICB9YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkV2ZW50QmluZGluZ0V2YWwoZWI6IEV2ZW50QmluZGluZywgcjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIGlmIChyLmxhc3RJbkJpbmRpbmcpIHtcbiAgICAgIHZhciBldmFsUmVjb3JkID0gdGhpcy5fbG9naWMuZ2VuRXZlbnRCaW5kaW5nRXZhbFZhbHVlKGViLCByKTtcbiAgICAgIHZhciBtYXJrUGF0aCA9IHRoaXMuX2dlbk1hcmtQYXRoVG9Sb290QXNDaGVja09uY2Uocik7XG4gICAgICB2YXIgcHJldkRlZmF1bHQgPSB0aGlzLl9nZW5VcGRhdGVQcmV2ZW50RGVmYXVsdChlYiwgcik7XG4gICAgICByZXR1cm4gYCR7ZXZhbFJlY29yZH1cXG4ke21hcmtQYXRofVxcbiR7cHJldkRlZmF1bHR9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2xvZ2ljLmdlbkV2ZW50QmluZGluZ0V2YWxWYWx1ZShlYiwgcik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuTWFya1BhdGhUb1Jvb3RBc0NoZWNrT25jZShyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgdmFyIGJyID0gci5iaW5kaW5nUmVjb3JkO1xuICAgIGlmIChici5pc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb24oKSkge1xuICAgICAgcmV0dXJuIFwiXCI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLl9uYW1lcy5nZXREZXRlY3Rvck5hbWUoYnIuZGlyZWN0aXZlUmVjb3JkLmRpcmVjdGl2ZUluZGV4KX0ubWFya1BhdGhUb1Jvb3RBc0NoZWNrT25jZSgpO2A7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuVXBkYXRlUHJldmVudERlZmF1bHQoZWI6IEV2ZW50QmluZGluZywgcjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHZhciBsb2NhbCA9IHRoaXMuX25hbWVzLmdldEV2ZW50TG9jYWxOYW1lKGViLCByLnNlbGZJbmRleCk7XG4gICAgcmV0dXJuIGBpZiAoJHtsb2NhbH0gPT09IGZhbHNlKSB7ICR7dGhpcy5fbmFtZXMuZ2V0UHJldmVudERlZmF1bHRBY2Nlc29yKCl9ID0gdHJ1ZX07YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21heWJlR2VuRGVoeWRyYXRlRGlyZWN0aXZlcygpOiBzdHJpbmcge1xuICAgIHZhciBkZXN0cm95UGlwZXNDb2RlID0gdGhpcy5fbmFtZXMuZ2VuUGlwZU9uRGVzdHJveSgpO1xuICAgIGlmIChkZXN0cm95UGlwZXNDb2RlKSB7XG4gICAgICBkZXN0cm95UGlwZXNDb2RlID0gYGlmIChkZXN0cm95UGlwZXMpIHsgJHtkZXN0cm95UGlwZXNDb2RlfSB9YDtcbiAgICB9XG4gICAgdmFyIGRlaHlkcmF0ZUZpZWxkc0NvZGUgPSB0aGlzLl9uYW1lcy5nZW5EZWh5ZHJhdGVGaWVsZHMoKTtcbiAgICBpZiAoIWRlc3Ryb3lQaXBlc0NvZGUgJiYgIWRlaHlkcmF0ZUZpZWxkc0NvZGUpIHJldHVybiAnJztcbiAgICByZXR1cm4gYCR7dGhpcy50eXBlTmFtZX0ucHJvdG90eXBlLmRlaHlkcmF0ZURpcmVjdGl2ZXMgPSBmdW5jdGlvbihkZXN0cm95UGlwZXMpIHtcbiAgICAgICAgJHtkZXN0cm95UGlwZXNDb2RlfVxuICAgICAgICAke2RlaHlkcmF0ZUZpZWxkc0NvZGV9XG4gICAgfWA7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tYXliZUdlbkh5ZHJhdGVEaXJlY3RpdmVzKCk6IHN0cmluZyB7XG4gICAgdmFyIGh5ZHJhdGVEaXJlY3RpdmVzQ29kZSA9IHRoaXMuX2xvZ2ljLmdlbkh5ZHJhdGVEaXJlY3RpdmVzKHRoaXMuZGlyZWN0aXZlUmVjb3Jkcyk7XG4gICAgdmFyIGh5ZHJhdGVEZXRlY3RvcnNDb2RlID0gdGhpcy5fbG9naWMuZ2VuSHlkcmF0ZURldGVjdG9ycyh0aGlzLmRpcmVjdGl2ZVJlY29yZHMpO1xuICAgIGlmICghaHlkcmF0ZURpcmVjdGl2ZXNDb2RlICYmICFoeWRyYXRlRGV0ZWN0b3JzQ29kZSkgcmV0dXJuICcnO1xuICAgIHJldHVybiBgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUuaHlkcmF0ZURpcmVjdGl2ZXMgPSBmdW5jdGlvbihkaXJlY3RpdmVzKSB7XG4gICAgICAke2h5ZHJhdGVEaXJlY3RpdmVzQ29kZX1cbiAgICAgICR7aHlkcmF0ZURldGVjdG9yc0NvZGV9XG4gICAgfWA7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tYXliZUdlbkFmdGVyQ29udGVudExpZmVjeWNsZUNhbGxiYWNrcygpOiBzdHJpbmcge1xuICAgIHZhciBub3RpZmljYXRpb25zID0gdGhpcy5fbG9naWMuZ2VuQ29udGVudExpZmVjeWNsZUNhbGxiYWNrcyh0aGlzLmRpcmVjdGl2ZVJlY29yZHMpO1xuICAgIGlmIChub3RpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBkaXJlY3RpdmVOb3RpZmljYXRpb25zID0gbm90aWZpY2F0aW9ucy5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUuYWZ0ZXJDb250ZW50TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAke2RpcmVjdGl2ZU5vdGlmaWNhdGlvbnN9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tYXliZUdlbkFmdGVyVmlld0xpZmVjeWNsZUNhbGxiYWNrcygpOiBzdHJpbmcge1xuICAgIHZhciBub3RpZmljYXRpb25zID0gdGhpcy5fbG9naWMuZ2VuVmlld0xpZmVjeWNsZUNhbGxiYWNrcyh0aGlzLmRpcmVjdGl2ZVJlY29yZHMpO1xuICAgIGlmIChub3RpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBkaXJlY3RpdmVOb3RpZmljYXRpb25zID0gbm90aWZpY2F0aW9ucy5qb2luKFwiXFxuXCIpO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgJHt0aGlzLnR5cGVOYW1lfS5wcm90b3R5cGUuYWZ0ZXJWaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzSW50ZXJuYWwgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAke2RpcmVjdGl2ZU5vdGlmaWNhdGlvbnN9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5BbGxSZWNvcmRzKHJzOiBQcm90b1JlY29yZFtdKTogc3RyaW5nIHtcbiAgICB2YXIgY29kZXM6IFN0cmluZ1tdID0gW107XG4gICAgdGhpcy5fZW5kT2ZCbG9ja0lkeHMgPSBbXTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGxldCBjb2RlO1xuICAgICAgbGV0IHIgPSByc1tpXTtcblxuICAgICAgaWYgKHIuaXNMaWZlQ3ljbGVSZWNvcmQoKSkge1xuICAgICAgICBjb2RlID0gdGhpcy5fZ2VuRGlyZWN0aXZlTGlmZWN5Y2xlKHIpO1xuICAgICAgfSBlbHNlIGlmIChyLmlzUGlwZVJlY29yZCgpKSB7XG4gICAgICAgIGNvZGUgPSB0aGlzLl9nZW5QaXBlQ2hlY2socik7XG4gICAgICB9IGVsc2UgaWYgKHIuaXNDb25kaXRpb25hbFNraXBSZWNvcmQoKSkge1xuICAgICAgICBjb2RlID0gdGhpcy5fZ2VuQ29uZGl0aW9uYWxTa2lwKHIsIHRoaXMuX25hbWVzLmdldExvY2FsTmFtZShyLmNvbnRleHRJbmRleCkpO1xuICAgICAgfSBlbHNlIGlmIChyLmlzVW5jb25kaXRpb25hbFNraXBSZWNvcmQoKSkge1xuICAgICAgICBjb2RlID0gdGhpcy5fZ2VuVW5jb25kaXRpb25hbFNraXAocik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2RlID0gdGhpcy5fZ2VuUmVmZXJlbmNlQ2hlY2socik7XG4gICAgICB9XG5cbiAgICAgIGNvZGUgPSBgXG4gICAgICAgICR7dGhpcy5fbWF5YmVGaXJzdEluQmluZGluZyhyKX1cbiAgICAgICAgJHtjb2RlfVxuICAgICAgICAke3RoaXMuX21heWJlR2VuTGFzdEluRGlyZWN0aXZlKHIpfVxuICAgICAgICAke3RoaXMuX2dlbkVuZE9mU2tpcEJsb2NrKGkpfVxuICAgICAgYDtcblxuICAgICAgY29kZXMucHVzaChjb2RlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29kZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkNvbmRpdGlvbmFsU2tpcChyOiBQcm90b1JlY29yZCwgY29uZGl0aW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBtYXliZU5lZ2F0ZSA9IHIubW9kZSA9PT0gUmVjb3JkVHlwZS5Ta2lwUmVjb3Jkc0lmID8gJyEnIDogJyc7XG4gICAgdGhpcy5fZW5kT2ZCbG9ja0lkeHMucHVzaChyLmZpeGVkQXJnc1swXSAtIDEpO1xuXG4gICAgcmV0dXJuIGBpZiAoJHttYXliZU5lZ2F0ZX0ke2NvbmRpdGlvbn0pIHtgO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuVW5jb25kaXRpb25hbFNraXAocjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHRoaXMuX2VuZE9mQmxvY2tJZHhzLnBvcCgpO1xuICAgIHRoaXMuX2VuZE9mQmxvY2tJZHhzLnB1c2goci5maXhlZEFyZ3NbMF0gLSAxKTtcbiAgICByZXR1cm4gYH0gZWxzZSB7YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkVuZE9mU2tpcEJsb2NrKHByb3RvSW5kZXg6IG51bWJlcik6IHN0cmluZyB7XG4gICAgaWYgKCFMaXN0V3JhcHBlci5pc0VtcHR5KHRoaXMuX2VuZE9mQmxvY2tJZHhzKSkge1xuICAgICAgbGV0IGVuZE9mQmxvY2sgPSBMaXN0V3JhcHBlci5sYXN0KHRoaXMuX2VuZE9mQmxvY2tJZHhzKTtcbiAgICAgIGlmIChwcm90b0luZGV4ID09PSBlbmRPZkJsb2NrKSB7XG4gICAgICAgIHRoaXMuX2VuZE9mQmxvY2tJZHhzLnBvcCgpO1xuICAgICAgICByZXR1cm4gJ30nO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkRpcmVjdGl2ZUxpZmVjeWNsZShyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgaWYgKHIubmFtZSA9PT0gXCJEb0NoZWNrXCIpIHtcbiAgICAgIHJldHVybiB0aGlzLl9nZW5PbkNoZWNrKHIpO1xuICAgIH0gZWxzZSBpZiAoci5uYW1lID09PSBcIk9uSW5pdFwiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2VuT25Jbml0KHIpO1xuICAgIH0gZWxzZSBpZiAoci5uYW1lID09PSBcIk9uQ2hhbmdlc1wiKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZ2VuT25DaGFuZ2Uocik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBVbmtub3duIGxpZmVjeWNsZSBldmVudCAnJHtyLm5hbWV9J2ApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlblBpcGVDaGVjayhyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgdmFyIGNvbnRleHQgPSB0aGlzLl9uYW1lcy5nZXRMb2NhbE5hbWUoci5jb250ZXh0SW5kZXgpO1xuICAgIHZhciBhcmdTdHJpbmcgPSByLmFyZ3MubWFwKChhcmcpID0+IHRoaXMuX25hbWVzLmdldExvY2FsTmFtZShhcmcpKS5qb2luKFwiLCBcIik7XG5cbiAgICB2YXIgb2xkVmFsdWUgPSB0aGlzLl9uYW1lcy5nZXRGaWVsZE5hbWUoci5zZWxmSW5kZXgpO1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuX25hbWVzLmdldExvY2FsTmFtZShyLnNlbGZJbmRleCk7XG5cbiAgICB2YXIgcGlwZSA9IHRoaXMuX25hbWVzLmdldFBpcGVOYW1lKHIuc2VsZkluZGV4KTtcbiAgICB2YXIgcGlwZU5hbWUgPSByLm5hbWU7XG5cbiAgICB2YXIgaW5pdCA9IGBcbiAgICAgIGlmICgke3BpcGV9ID09PSAke3RoaXMuY2hhbmdlRGV0ZWN0aW9uVXRpbFZhck5hbWV9LnVuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgJHtwaXBlfSA9ICR7dGhpcy5fbmFtZXMuZ2V0UGlwZXNBY2Nlc3Nvck5hbWUoKX0uZ2V0KCcke3BpcGVOYW1lfScpO1xuICAgICAgfVxuICAgIGA7XG4gICAgdmFyIHJlYWQgPSBgJHtuZXdWYWx1ZX0gPSAke3BpcGV9LnBpcGUudHJhbnNmb3JtKCR7Y29udGV4dH0sIFske2FyZ1N0cmluZ31dKTtgO1xuXG4gICAgdmFyIGNvbnRleE9yQXJnQ2hlY2sgPSByLmFyZ3MubWFwKChhKSA9PiB0aGlzLl9uYW1lcy5nZXRDaGFuZ2VOYW1lKGEpKTtcbiAgICBjb250ZXhPckFyZ0NoZWNrLnB1c2godGhpcy5fbmFtZXMuZ2V0Q2hhbmdlTmFtZShyLmNvbnRleHRJbmRleCkpO1xuICAgIHZhciBjb25kaXRpb24gPSBgISR7cGlwZX0ucHVyZSB8fCAoJHtjb250ZXhPckFyZ0NoZWNrLmpvaW4oXCIgfHwgXCIpfSlgO1xuXG4gICAgdmFyIGNoZWNrID0gYFxuICAgICAgaWYgKCR7dGhpcy5jaGFuZ2VEZXRlY3Rpb25VdGlsVmFyTmFtZX0ubG9vc2VOb3RJZGVudGljYWwoJHtvbGRWYWx1ZX0sICR7bmV3VmFsdWV9KSkge1xuICAgICAgICAke25ld1ZhbHVlfSA9ICR7dGhpcy5jaGFuZ2VEZXRlY3Rpb25VdGlsVmFyTmFtZX0udW53cmFwVmFsdWUoJHtuZXdWYWx1ZX0pXG4gICAgICAgICR7dGhpcy5fZ2VuQ2hhbmdlTWFya2VyKHIpfVxuICAgICAgICAke3RoaXMuX2dlblVwZGF0ZURpcmVjdGl2ZU9yRWxlbWVudChyKX1cbiAgICAgICAgJHt0aGlzLl9nZW5BZGRUb0NoYW5nZXMocil9XG4gICAgICAgICR7b2xkVmFsdWV9ID0gJHtuZXdWYWx1ZX07XG4gICAgICB9XG4gICAgYDtcblxuICAgIHZhciBnZW5Db2RlID0gci5zaG91bGRCZUNoZWNrZWQoKSA/IGAke3JlYWR9JHtjaGVja31gIDogcmVhZDtcblxuICAgIGlmIChyLmlzVXNlZEJ5T3RoZXJSZWNvcmQoKSkge1xuICAgICAgcmV0dXJuIGAke2luaXR9IGlmICgke2NvbmRpdGlvbn0pIHsgJHtnZW5Db2RlfSB9IGVsc2UgeyAke25ld1ZhbHVlfSA9ICR7b2xkVmFsdWV9OyB9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGAke2luaXR9IGlmICgke2NvbmRpdGlvbn0pIHsgJHtnZW5Db2RlfSB9YDtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5SZWZlcmVuY2VDaGVjayhyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5fbmFtZXMuZ2V0RmllbGROYW1lKHIuc2VsZkluZGV4KTtcbiAgICB2YXIgbmV3VmFsdWUgPSB0aGlzLl9uYW1lcy5nZXRMb2NhbE5hbWUoci5zZWxmSW5kZXgpO1xuICAgIHZhciByZWFkID0gYFxuICAgICAgJHt0aGlzLl9sb2dpYy5nZW5Qcm9wZXJ0eUJpbmRpbmdFdmFsVmFsdWUocil9XG4gICAgYDtcblxuICAgIHZhciBjaGVjayA9IGBcbiAgICAgIGlmICgke3RoaXMuY2hhbmdlRGV0ZWN0aW9uVXRpbFZhck5hbWV9Lmxvb3NlTm90SWRlbnRpY2FsKCR7b2xkVmFsdWV9LCAke25ld1ZhbHVlfSkpIHtcbiAgICAgICAgJHt0aGlzLl9nZW5DaGFuZ2VNYXJrZXIocil9XG4gICAgICAgICR7dGhpcy5fZ2VuVXBkYXRlRGlyZWN0aXZlT3JFbGVtZW50KHIpfVxuICAgICAgICAke3RoaXMuX2dlbkFkZFRvQ2hhbmdlcyhyKX1cbiAgICAgICAgJHtvbGRWYWx1ZX0gPSAke25ld1ZhbHVlfTtcbiAgICAgIH1cbiAgICBgO1xuXG4gICAgdmFyIGdlbkNvZGUgPSByLnNob3VsZEJlQ2hlY2tlZCgpID8gYCR7cmVhZH0ke2NoZWNrfWAgOiByZWFkO1xuXG4gICAgaWYgKHIuaXNQdXJlRnVuY3Rpb24oKSkge1xuICAgICAgdmFyIGNvbmRpdGlvbiA9IHIuYXJncy5tYXAoKGEpID0+IHRoaXMuX25hbWVzLmdldENoYW5nZU5hbWUoYSkpLmpvaW4oXCIgfHwgXCIpO1xuICAgICAgaWYgKHIuaXNVc2VkQnlPdGhlclJlY29yZCgpKSB7XG4gICAgICAgIHJldHVybiBgaWYgKCR7Y29uZGl0aW9ufSkgeyAke2dlbkNvZGV9IH0gZWxzZSB7ICR7bmV3VmFsdWV9ID0gJHtvbGRWYWx1ZX07IH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGBpZiAoJHtjb25kaXRpb259KSB7ICR7Z2VuQ29kZX0gfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBnZW5Db2RlO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbkNoYW5nZU1hcmtlcihyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHIuYXJndW1lbnRUb1B1cmVGdW5jdGlvbiA/IGAke3RoaXMuX25hbWVzLmdldENoYW5nZU5hbWUoci5zZWxmSW5kZXgpfSA9IHRydWVgIDogYGA7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5VcGRhdGVEaXJlY3RpdmVPckVsZW1lbnQocjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIGlmICghci5sYXN0SW5CaW5kaW5nKSByZXR1cm4gXCJcIjtcblxuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuX25hbWVzLmdldExvY2FsTmFtZShyLnNlbGZJbmRleCk7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5fbmFtZXMuZ2V0RmllbGROYW1lKHIuc2VsZkluZGV4KTtcbiAgICB2YXIgbm90aWZ5RGVidWcgPSB0aGlzLmdlbkNvbmZpZy5sb2dCaW5kaW5nVXBkYXRlID8gYHRoaXMubG9nQmluZGluZ1VwZGF0ZSgke25ld1ZhbHVlfSk7YCA6IFwiXCI7XG5cbiAgICB2YXIgYnIgPSByLmJpbmRpbmdSZWNvcmQ7XG4gICAgaWYgKGJyLnRhcmdldC5pc0RpcmVjdGl2ZSgpKSB7XG4gICAgICB2YXIgZGlyZWN0aXZlUHJvcGVydHkgPVxuICAgICAgICAgIGAke3RoaXMuX25hbWVzLmdldERpcmVjdGl2ZU5hbWUoYnIuZGlyZWN0aXZlUmVjb3JkLmRpcmVjdGl2ZUluZGV4KX0uJHtici50YXJnZXQubmFtZX1gO1xuICAgICAgcmV0dXJuIGBcbiAgICAgICAgJHt0aGlzLl9nZW5UaHJvd09uQ2hhbmdlQ2hlY2sob2xkVmFsdWUsIG5ld1ZhbHVlKX1cbiAgICAgICAgJHtkaXJlY3RpdmVQcm9wZXJ0eX0gPSAke25ld1ZhbHVlfTtcbiAgICAgICAgJHtub3RpZnlEZWJ1Z31cbiAgICAgICAgJHtJU19DSEFOR0VEX0xPQ0FMfSA9IHRydWU7XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgICAke3RoaXMuX2dlblRocm93T25DaGFuZ2VDaGVjayhvbGRWYWx1ZSwgbmV3VmFsdWUpfVxuICAgICAgICB0aGlzLm5vdGlmeURpc3BhdGNoZXIoJHtuZXdWYWx1ZX0pO1xuICAgICAgICAke25vdGlmeURlYnVnfVxuICAgICAgYDtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5UaHJvd09uQ2hhbmdlQ2hlY2sob2xkVmFsdWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGFzc2VydGlvbnNFbmFibGVkKCkpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICAgIGlmKHRocm93T25DaGFuZ2UpIHtcbiAgICAgICAgICB0aGlzLnRocm93T25DaGFuZ2VFcnJvcigke29sZFZhbHVlfSwgJHtuZXdWYWx1ZX0pO1xuICAgICAgICB9XG4gICAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5BZGRUb0NoYW5nZXMocjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHZhciBuZXdWYWx1ZSA9IHRoaXMuX25hbWVzLmdldExvY2FsTmFtZShyLnNlbGZJbmRleCk7XG4gICAgdmFyIG9sZFZhbHVlID0gdGhpcy5fbmFtZXMuZ2V0RmllbGROYW1lKHIuc2VsZkluZGV4KTtcbiAgICBpZiAoIXIuYmluZGluZ1JlY29yZC5jYWxsT25DaGFuZ2VzKCkpIHJldHVybiBcIlwiO1xuICAgIHJldHVybiBgJHtDSEFOR0VTX0xPQ0FMfSA9IHRoaXMuYWRkQ2hhbmdlKCR7Q0hBTkdFU19MT0NBTH0sICR7b2xkVmFsdWV9LCAke25ld1ZhbHVlfSk7YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21heWJlRmlyc3RJbkJpbmRpbmcocjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHZhciBwcmV2ID0gQ2hhbmdlRGV0ZWN0aW9uVXRpbC5wcm90b0J5SW5kZXgodGhpcy5yZWNvcmRzLCByLnNlbGZJbmRleCAtIDEpO1xuICAgIHZhciBmaXJzdEluQmluZGluZyA9IGlzQmxhbmsocHJldikgfHwgcHJldi5iaW5kaW5nUmVjb3JkICE9PSByLmJpbmRpbmdSZWNvcmQ7XG4gICAgcmV0dXJuIGZpcnN0SW5CaW5kaW5nICYmICFyLmJpbmRpbmdSZWNvcmQuaXNEaXJlY3RpdmVMaWZlY3ljbGUoKSA/XG4gICAgICAgICAgICAgICBgJHt0aGlzLl9uYW1lcy5nZXRQcm9wZXJ0eUJpbmRpbmdJbmRleCgpfSA9ICR7ci5wcm9wZXJ0eUJpbmRpbmdJbmRleH07YCA6XG4gICAgICAgICAgICAgICAnJztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21heWJlR2VuTGFzdEluRGlyZWN0aXZlKHI6IFByb3RvUmVjb3JkKTogc3RyaW5nIHtcbiAgICBpZiAoIXIubGFzdEluRGlyZWN0aXZlKSByZXR1cm4gXCJcIjtcbiAgICByZXR1cm4gYFxuICAgICAgJHtDSEFOR0VTX0xPQ0FMfSA9IG51bGw7XG4gICAgICAke3RoaXMuX2dlbk5vdGlmeU9uUHVzaERldGVjdG9ycyhyKX1cbiAgICAgICR7SVNfQ0hBTkdFRF9MT0NBTH0gPSBmYWxzZTtcbiAgICBgO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuT25DaGVjayhyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgdmFyIGJyID0gci5iaW5kaW5nUmVjb3JkO1xuICAgIHJldHVybiBgaWYgKCF0aHJvd09uQ2hhbmdlKSAke3RoaXMuX25hbWVzLmdldERpcmVjdGl2ZU5hbWUoYnIuZGlyZWN0aXZlUmVjb3JkLmRpcmVjdGl2ZUluZGV4KX0ubmdEb0NoZWNrKCk7YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbk9uSW5pdChyOiBQcm90b1JlY29yZCk6IHN0cmluZyB7XG4gICAgdmFyIGJyID0gci5iaW5kaW5nUmVjb3JkO1xuICAgIHJldHVybiBgaWYgKCF0aHJvd09uQ2hhbmdlICYmICR7dGhpcy5fbmFtZXMuZ2V0U3RhdGVOYW1lKCl9ID09PSAke3RoaXMuY2hhbmdlRGV0ZWN0b3JTdGF0ZVZhck5hbWV9Lk5ldmVyQ2hlY2tlZCkgJHt0aGlzLl9uYW1lcy5nZXREaXJlY3RpdmVOYW1lKGJyLmRpcmVjdGl2ZVJlY29yZC5kaXJlY3RpdmVJbmRleCl9Lm5nT25Jbml0KCk7YDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2dlbk9uQ2hhbmdlKHI6IFByb3RvUmVjb3JkKTogc3RyaW5nIHtcbiAgICB2YXIgYnIgPSByLmJpbmRpbmdSZWNvcmQ7XG4gICAgcmV0dXJuIGBpZiAoIXRocm93T25DaGFuZ2UgJiYgJHtDSEFOR0VTX0xPQ0FMfSkgJHt0aGlzLl9uYW1lcy5nZXREaXJlY3RpdmVOYW1lKGJyLmRpcmVjdGl2ZVJlY29yZC5kaXJlY3RpdmVJbmRleCl9Lm5nT25DaGFuZ2VzKCR7Q0hBTkdFU19MT0NBTH0pO2A7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9nZW5Ob3RpZnlPblB1c2hEZXRlY3RvcnMocjogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHZhciBiciA9IHIuYmluZGluZ1JlY29yZDtcbiAgICBpZiAoIXIubGFzdEluRGlyZWN0aXZlIHx8IGJyLmlzRGVmYXVsdENoYW5nZURldGVjdGlvbigpKSByZXR1cm4gXCJcIjtcbiAgICB2YXIgcmV0VmFsID0gYFxuICAgICAgaWYoJHtJU19DSEFOR0VEX0xPQ0FMfSkge1xuICAgICAgICAke3RoaXMuX25hbWVzLmdldERldGVjdG9yTmFtZShici5kaXJlY3RpdmVSZWNvcmQuZGlyZWN0aXZlSW5kZXgpfS5tYXJrQXNDaGVja09uY2UoKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIHJldHVybiByZXRWYWw7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbl9qaXRfZ2VuZXJhdG9yLnRzXG4gKiovIiwiaW1wb3J0IHtSZWdFeHBXcmFwcGVyLCBTdHJpbmdXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlciwgTWFwfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5pbXBvcnQge0RpcmVjdGl2ZUluZGV4fSBmcm9tICcuL2RpcmVjdGl2ZV9yZWNvcmQnO1xuXG5pbXBvcnQge1Byb3RvUmVjb3JkfSBmcm9tICcuL3Byb3RvX3JlY29yZCc7XG5pbXBvcnQge0V2ZW50QmluZGluZ30gZnJvbSAnLi9ldmVudF9iaW5kaW5nJztcblxuLy8gVGhlIG5hbWVzIG9mIHRoZXNlIGZpZWxkcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIGFic3RyYWN0X2NoYW5nZV9kZXRlY3Rvci50cyBvciBjaGFuZ2Vcbi8vIGRldGVjdGlvbiB3aWxsIGZhaWwuXG5jb25zdCBfU1RBVEVfQUNDRVNTT1IgPSBcInN0YXRlXCI7XG5jb25zdCBfQ09OVEVYVF9BQ0NFU1NPUiA9IFwiY29udGV4dFwiO1xuY29uc3QgX1BST1BfQklORElOR19JTkRFWCA9IFwicHJvcGVydHlCaW5kaW5nSW5kZXhcIjtcbmNvbnN0IF9ESVJFQ1RJVkVTX0FDQ0VTU09SID0gXCJkaXJlY3RpdmVJbmRpY2VzXCI7XG5jb25zdCBfRElTUEFUQ0hFUl9BQ0NFU1NPUiA9IFwiZGlzcGF0Y2hlclwiO1xuY29uc3QgX0xPQ0FMU19BQ0NFU1NPUiA9IFwibG9jYWxzXCI7XG5jb25zdCBfTU9ERV9BQ0NFU1NPUiA9IFwibW9kZVwiO1xuY29uc3QgX1BJUEVTX0FDQ0VTU09SID0gXCJwaXBlc1wiO1xuY29uc3QgX1BST1RPU19BQ0NFU1NPUiA9IFwicHJvdG9zXCI7XG5leHBvcnQgY29uc3QgQ09OVEVYVF9BQ0NFU1NPUiA9IFwiY29udGV4dFwiO1xuXG4vLyBgY29udGV4dGAgaXMgYWx3YXlzIGZpcnN0LlxuZXhwb3J0IGNvbnN0IENPTlRFWFRfSU5ERVggPSAwO1xuY29uc3QgX0ZJRUxEX1BSRUZJWCA9ICd0aGlzLic7XG5cbnZhciBfd2hpdGVTcGFjZVJlZ0V4cCA9IC9cXFcvZztcblxuLyoqXG4gKiBSZXR1cm5zIGBzYCB3aXRoIGFsbCBub24taWRlbnRpZmllciBjaGFyYWN0ZXJzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzYW5pdGl6ZU5hbWUoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChzLCBfd2hpdGVTcGFjZVJlZ0V4cCwgJycpO1xufVxuXG4vKipcbiAqIENsYXNzIHJlc3BvbnNpYmxlIGZvciBwcm92aWRpbmcgZmllbGQgYW5kIGxvY2FsIHZhcmlhYmxlIG5hbWVzIGZvciBjaGFuZ2UgZGV0ZWN0b3IgY2xhc3Nlcy5cbiAqIEFsc28gcHJvdmlkZXMgc29tZSBjb252ZW5pZW5jZSBmdW5jdGlvbnMsIGZvciBleGFtcGxlLCBkZWNsYXJpbmcgdmFyaWFibGVzLCBkZXN0cm95aW5nIHBpcGVzLFxuICogYW5kIGRlaHlkcmF0aW5nIHRoZSBkZXRlY3Rvci5cbiAqL1xuZXhwb3J0IGNsYXNzIENvZGVnZW5OYW1lVXRpbCB7XG4gIC8qKlxuICAgKiBSZWNvcmQgbmFtZXMgc2FuaXRpemVkIGZvciB1c2UgYXMgZmllbGRzLlxuICAgKiBTZWUgW3Nhbml0aXplTmFtZV0gZm9yIGRldGFpbHMuXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX3Nhbml0aXplZE5hbWVzOiBzdHJpbmdbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc2FuaXRpemVkRXZlbnROYW1lcyA9IG5ldyBNYXA8RXZlbnRCaW5kaW5nLCBzdHJpbmdbXT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yZWNvcmRzOiBQcm90b1JlY29yZFtdLCBwcml2YXRlIF9ldmVudEJpbmRpbmdzOiBFdmVudEJpbmRpbmdbXSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZGlyZWN0aXZlUmVjb3JkczogYW55W10sIHByaXZhdGUgX3V0aWxOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl9zYW5pdGl6ZWROYW1lcyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZSh0aGlzLl9yZWNvcmRzLmxlbmd0aCArIDEpO1xuICAgIHRoaXMuX3Nhbml0aXplZE5hbWVzW0NPTlRFWFRfSU5ERVhdID0gQ09OVEVYVF9BQ0NFU1NPUjtcbiAgICBmb3IgKHZhciBpID0gMCwgaUxlbiA9IHRoaXMuX3JlY29yZHMubGVuZ3RoOyBpIDwgaUxlbjsgKytpKSB7XG4gICAgICB0aGlzLl9zYW5pdGl6ZWROYW1lc1tpICsgMV0gPSBzYW5pdGl6ZU5hbWUoYCR7dGhpcy5fcmVjb3Jkc1tpXS5uYW1lfSR7aX1gKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBlYkluZGV4ID0gMDsgZWJJbmRleCA8IF9ldmVudEJpbmRpbmdzLmxlbmd0aDsgKytlYkluZGV4KSB7XG4gICAgICB2YXIgZWIgPSBfZXZlbnRCaW5kaW5nc1tlYkluZGV4XTtcbiAgICAgIHZhciBuYW1lcyA9IFtDT05URVhUX0FDQ0VTU09SXTtcbiAgICAgIGZvciAodmFyIGkgPSAwLCBpTGVuID0gZWIucmVjb3Jkcy5sZW5ndGg7IGkgPCBpTGVuOyArK2kpIHtcbiAgICAgICAgbmFtZXMucHVzaChzYW5pdGl6ZU5hbWUoYCR7ZWIucmVjb3Jkc1tpXS5uYW1lfSR7aX1fJHtlYkluZGV4fWApKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX3Nhbml0aXplZEV2ZW50TmFtZXMuc2V0KGViLCBuYW1lcyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfYWRkRmllbGRQcmVmaXgobmFtZTogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIGAke19GSUVMRF9QUkVGSVh9JHtuYW1lfWA7IH1cblxuICBnZXREaXNwYXRjaGVyTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fYWRkRmllbGRQcmVmaXgoX0RJU1BBVENIRVJfQUNDRVNTT1IpOyB9XG5cbiAgZ2V0UGlwZXNBY2Nlc3Nvck5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FkZEZpZWxkUHJlZml4KF9QSVBFU19BQ0NFU1NPUik7IH1cblxuICBnZXRQcm90b3NOYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9hZGRGaWVsZFByZWZpeChfUFJPVE9TX0FDQ0VTU09SKTsgfVxuXG4gIGdldERpcmVjdGl2ZXNBY2Nlc3Nvck5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FkZEZpZWxkUHJlZml4KF9ESVJFQ1RJVkVTX0FDQ0VTU09SKTsgfVxuXG4gIGdldExvY2Fsc0FjY2Vzc29yTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fYWRkRmllbGRQcmVmaXgoX0xPQ0FMU19BQ0NFU1NPUik7IH1cblxuICBnZXRTdGF0ZU5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FkZEZpZWxkUHJlZml4KF9TVEFURV9BQ0NFU1NPUik7IH1cblxuICBnZXRNb2RlTmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fYWRkRmllbGRQcmVmaXgoX01PREVfQUNDRVNTT1IpOyB9XG5cbiAgZ2V0UHJvcGVydHlCaW5kaW5nSW5kZXgoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FkZEZpZWxkUHJlZml4KF9QUk9QX0JJTkRJTkdfSU5ERVgpOyB9XG5cbiAgZ2V0TG9jYWxOYW1lKGlkeDogbnVtYmVyKTogc3RyaW5nIHsgcmV0dXJuIGBsXyR7dGhpcy5fc2FuaXRpemVkTmFtZXNbaWR4XX1gOyB9XG5cbiAgZ2V0RXZlbnRMb2NhbE5hbWUoZWI6IEV2ZW50QmluZGluZywgaWR4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBgbF8ke3RoaXMuX3Nhbml0aXplZEV2ZW50TmFtZXMuZ2V0KGViKVtpZHhdfWA7XG4gIH1cblxuICBnZXRDaGFuZ2VOYW1lKGlkeDogbnVtYmVyKTogc3RyaW5nIHsgcmV0dXJuIGBjXyR7dGhpcy5fc2FuaXRpemVkTmFtZXNbaWR4XX1gOyB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIGEgc3RhdGVtZW50IGluaXRpYWxpemluZyBsb2NhbCB2YXJpYWJsZXMgdXNlZCB3aGVuIGRldGVjdGluZyBjaGFuZ2VzLlxuICAgKi9cbiAgZ2VuSW5pdExvY2FscygpOiBzdHJpbmcge1xuICAgIHZhciBkZWNsYXJhdGlvbnMgPSBbXTtcbiAgICB2YXIgYXNzaWdubWVudHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMCwgaUxlbiA9IHRoaXMuZ2V0RmllbGRDb3VudCgpOyBpIDwgaUxlbjsgKytpKSB7XG4gICAgICBpZiAoaSA9PSBDT05URVhUX0lOREVYKSB7XG4gICAgICAgIGRlY2xhcmF0aW9ucy5wdXNoKGAke3RoaXMuZ2V0TG9jYWxOYW1lKGkpfSA9ICR7dGhpcy5nZXRGaWVsZE5hbWUoaSl9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgcmVjID0gdGhpcy5fcmVjb3Jkc1tpIC0gMV07XG4gICAgICAgIGlmIChyZWMuYXJndW1lbnRUb1B1cmVGdW5jdGlvbikge1xuICAgICAgICAgIHZhciBjaGFuZ2VOYW1lID0gdGhpcy5nZXRDaGFuZ2VOYW1lKGkpO1xuICAgICAgICAgIGRlY2xhcmF0aW9ucy5wdXNoKGAke3RoaXMuZ2V0TG9jYWxOYW1lKGkpfSwke2NoYW5nZU5hbWV9YCk7XG4gICAgICAgICAgYXNzaWdubWVudHMucHVzaChjaGFuZ2VOYW1lKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWNsYXJhdGlvbnMucHVzaChgJHt0aGlzLmdldExvY2FsTmFtZShpKX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICB2YXIgYXNzaWdubWVudHNDb2RlID1cbiAgICAgICAgTGlzdFdyYXBwZXIuaXNFbXB0eShhc3NpZ25tZW50cykgPyAnJyA6IGAke2Fzc2lnbm1lbnRzLmpvaW4oJz0nKX0gPSBmYWxzZTtgO1xuICAgIHJldHVybiBgdmFyICR7ZGVjbGFyYXRpb25zLmpvaW4oJywnKX07JHthc3NpZ25tZW50c0NvZGV9YDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHN0YXRlbWVudCBpbml0aWFsaXppbmcgbG9jYWwgdmFyaWFibGVzIGZvciBldmVudCBoYW5kbGVycy5cbiAgICovXG4gIGdlbkluaXRFdmVudExvY2FscygpOiBzdHJpbmcge1xuICAgIHZhciByZXMgPSBbYCR7dGhpcy5nZXRMb2NhbE5hbWUoQ09OVEVYVF9JTkRFWCl9ID0gJHt0aGlzLmdldEZpZWxkTmFtZShDT05URVhUX0lOREVYKX1gXTtcbiAgICB0aGlzLl9zYW5pdGl6ZWRFdmVudE5hbWVzLmZvckVhY2goKG5hbWVzLCBlYikgPT4ge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAoaSAhPT0gQ09OVEVYVF9JTkRFWCkge1xuICAgICAgICAgIHJlcy5wdXNoKGAke3RoaXMuZ2V0RXZlbnRMb2NhbE5hbWUoZWIsIGkpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlcy5sZW5ndGggPiAxID8gYHZhciAke3Jlcy5qb2luKCcsJyl9O2AgOiAnJztcbiAgfVxuXG4gIGdldFByZXZlbnREZWZhdWx0QWNjZXNvcigpOiBzdHJpbmcgeyByZXR1cm4gXCJwcmV2ZW50RGVmYXVsdFwiOyB9XG5cbiAgZ2V0RmllbGRDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fc2FuaXRpemVkTmFtZXMubGVuZ3RoOyB9XG5cbiAgZ2V0RmllbGROYW1lKGlkeDogbnVtYmVyKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2FkZEZpZWxkUHJlZml4KHRoaXMuX3Nhbml0aXplZE5hbWVzW2lkeF0pOyB9XG5cbiAgZ2V0QWxsRmllbGROYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgdmFyIGZpZWxkTGlzdCA9IFtdO1xuICAgIGZvciAodmFyIGsgPSAwLCBrTGVuID0gdGhpcy5nZXRGaWVsZENvdW50KCk7IGsgPCBrTGVuOyArK2spIHtcbiAgICAgIGlmIChrID09PSAwIHx8IHRoaXMuX3JlY29yZHNbayAtIDFdLnNob3VsZEJlQ2hlY2tlZCgpKSB7XG4gICAgICAgIGZpZWxkTGlzdC5wdXNoKHRoaXMuZ2V0RmllbGROYW1lKGspKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMCwgaUxlbiA9IHRoaXMuX3JlY29yZHMubGVuZ3RoOyBpIDwgaUxlbjsgKytpKSB7XG4gICAgICB2YXIgcmVjID0gdGhpcy5fcmVjb3Jkc1tpXTtcbiAgICAgIGlmIChyZWMuaXNQaXBlUmVjb3JkKCkpIHtcbiAgICAgICAgZmllbGRMaXN0LnB1c2godGhpcy5nZXRQaXBlTmFtZShyZWMuc2VsZkluZGV4KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaiA9IDAsIGpMZW4gPSB0aGlzLl9kaXJlY3RpdmVSZWNvcmRzLmxlbmd0aDsgaiA8IGpMZW47ICsraikge1xuICAgICAgdmFyIGRSZWMgPSB0aGlzLl9kaXJlY3RpdmVSZWNvcmRzW2pdO1xuICAgICAgZmllbGRMaXN0LnB1c2godGhpcy5nZXREaXJlY3RpdmVOYW1lKGRSZWMuZGlyZWN0aXZlSW5kZXgpKTtcbiAgICAgIGlmICghZFJlYy5pc0RlZmF1bHRDaGFuZ2VEZXRlY3Rpb24oKSkge1xuICAgICAgICBmaWVsZExpc3QucHVzaCh0aGlzLmdldERldGVjdG9yTmFtZShkUmVjLmRpcmVjdGl2ZUluZGV4KSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmaWVsZExpc3Q7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHN0YXRlbWVudHMgd2hpY2ggY2xlYXIgYWxsIGZpZWxkcyBzbyB0aGF0IHRoZSBjaGFuZ2UgZGV0ZWN0b3IgaXMgZGVoeWRyYXRlZC5cbiAgICovXG4gIGdlbkRlaHlkcmF0ZUZpZWxkcygpOiBzdHJpbmcge1xuICAgIHZhciBmaWVsZHMgPSB0aGlzLmdldEFsbEZpZWxkTmFtZXMoKTtcbiAgICBMaXN0V3JhcHBlci5yZW1vdmVBdChmaWVsZHMsIENPTlRFWFRfSU5ERVgpO1xuICAgIGlmIChMaXN0V3JhcHBlci5pc0VtcHR5KGZpZWxkcykpIHJldHVybiAnJztcblxuICAgIC8vIEF0IGxlYXN0IG9uZSBhc3NpZ25tZW50LlxuICAgIGZpZWxkcy5wdXNoKGAke3RoaXMuX3V0aWxOYW1lfS51bmluaXRpYWxpemVkO2ApO1xuICAgIHJldHVybiBmaWVsZHMuam9pbignID0gJyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIHN0YXRlbWVudHMgZGVzdHJveWluZyBhbGwgcGlwZSB2YXJpYWJsZXMuXG4gICAqL1xuICBnZW5QaXBlT25EZXN0cm95KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3JlY29yZHMuZmlsdGVyKHIgPT4gci5pc1BpcGVSZWNvcmQoKSlcbiAgICAgICAgLm1hcChyID0+IGAke3RoaXMuX3V0aWxOYW1lfS5jYWxsUGlwZU9uRGVzdHJveSgke3RoaXMuZ2V0UGlwZU5hbWUoci5zZWxmSW5kZXgpfSk7YClcbiAgICAgICAgLmpvaW4oJ1xcbicpO1xuICB9XG5cbiAgZ2V0UGlwZU5hbWUoaWR4OiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9hZGRGaWVsZFByZWZpeChgJHt0aGlzLl9zYW5pdGl6ZWROYW1lc1tpZHhdfV9waXBlYCk7XG4gIH1cblxuICBnZXREaXJlY3RpdmVOYW1lKGQ6IERpcmVjdGl2ZUluZGV4KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYWRkRmllbGRQcmVmaXgoYGRpcmVjdGl2ZV8ke2QubmFtZX1gKTtcbiAgfVxuXG4gIGdldERldGVjdG9yTmFtZShkOiBEaXJlY3RpdmVJbmRleCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9hZGRGaWVsZFByZWZpeChgZGV0ZWN0b3JfJHtkLm5hbWV9YCk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY29kZWdlbl9uYW1lX3V0aWwudHNcbiAqKi8iLCJpbXBvcnQge0lTX0RBUlQsIEpzb24sIFN0cmluZ1dyYXBwZXIsIGlzUHJlc2VudCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7Q29kZWdlbk5hbWVVdGlsfSBmcm9tICcuL2NvZGVnZW5fbmFtZV91dGlsJztcbmltcG9ydCB7Y29kaWZ5LCBjb21iaW5lR2VuZXJhdGVkU3RyaW5ncywgcmF3U3RyaW5nfSBmcm9tICcuL2NvZGVnZW5fZmFjYWRlJztcbmltcG9ydCB7UHJvdG9SZWNvcmQsIFJlY29yZFR5cGV9IGZyb20gJy4vcHJvdG9fcmVjb3JkJztcbmltcG9ydCB7QmluZGluZ1RhcmdldH0gZnJvbSAnLi9iaW5kaW5nX3JlY29yZCc7XG5pbXBvcnQge0RpcmVjdGl2ZVJlY29yZH0gZnJvbSAnLi9kaXJlY3RpdmVfcmVjb3JkJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3l9IGZyb20gJy4vY29uc3RhbnRzJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcblxuLyoqXG4gKiBDbGFzcyByZXNwb25zaWJsZSBmb3IgcHJvdmlkaW5nIGNoYW5nZSBkZXRlY3Rpb24gbG9naWMgZm9yIGNoYW5nZSBkZXRlY3RvciBjbGFzc2VzLlxuICovXG5leHBvcnQgY2xhc3MgQ29kZWdlbkxvZ2ljVXRpbCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX25hbWVzOiBDb2RlZ2VuTmFtZVV0aWwsIHByaXZhdGUgX3V0aWxOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NoYW5nZURldGVjdG9yU3RhdGVOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kpIHt9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlcyBhIHN0YXRlbWVudCB3aGljaCB1cGRhdGVzIHRoZSBsb2NhbCB2YXJpYWJsZSByZXByZXNlbnRpbmcgYHByb3RvUmVjYCB3aXRoIHRoZSBjdXJyZW50XG4gICAqIHZhbHVlIG9mIHRoZSByZWNvcmQuIFVzZWQgYnkgcHJvcGVydHkgYmluZGluZ3MuXG4gICAqL1xuICBnZW5Qcm9wZXJ0eUJpbmRpbmdFdmFsVmFsdWUocHJvdG9SZWM6IFByb3RvUmVjb3JkKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZ2VuRXZhbFZhbHVlKHByb3RvUmVjLCBpZHggPT4gdGhpcy5fbmFtZXMuZ2V0TG9jYWxOYW1lKGlkeCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uYW1lcy5nZXRMb2NhbHNBY2Nlc3Nvck5hbWUoKSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc3RhdGVtZW50IHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHZhcmlhYmxlIHJlcHJlc2VudGluZyBgcHJvdG9SZWNgIHdpdGggdGhlIGN1cnJlbnRcbiAgICogdmFsdWUgb2YgdGhlIHJlY29yZC4gVXNlZCBieSBldmVudCBiaW5kaW5ncy5cbiAgICovXG4gIGdlbkV2ZW50QmluZGluZ0V2YWxWYWx1ZShldmVudFJlY29yZDogYW55LCBwcm90b1JlYzogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9nZW5FdmFsVmFsdWUocHJvdG9SZWMsIGlkeCA9PiB0aGlzLl9uYW1lcy5nZXRFdmVudExvY2FsTmFtZShldmVudFJlY29yZCwgaWR4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibG9jYWxzXCIpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2VuRXZhbFZhbHVlKHByb3RvUmVjOiBQcm90b1JlY29yZCwgZ2V0TG9jYWxOYW1lOiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2Fsc0FjY2Vzc29yOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBjb250ZXh0ID0gKHByb3RvUmVjLmNvbnRleHRJbmRleCA9PSAtMSkgP1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX25hbWVzLmdldERpcmVjdGl2ZU5hbWUocHJvdG9SZWMuZGlyZWN0aXZlSW5kZXgpIDpcbiAgICAgICAgICAgICAgICAgICAgICBnZXRMb2NhbE5hbWUocHJvdG9SZWMuY29udGV4dEluZGV4KTtcbiAgICB2YXIgYXJnU3RyaW5nID0gcHJvdG9SZWMuYXJncy5tYXAoYXJnID0+IGdldExvY2FsTmFtZShhcmcpKS5qb2luKFwiLCBcIik7XG5cbiAgICB2YXIgcmhzOiBzdHJpbmc7XG4gICAgc3dpdGNoIChwcm90b1JlYy5tb2RlKSB7XG4gICAgICBjYXNlIFJlY29yZFR5cGUuU2VsZjpcbiAgICAgICAgcmhzID0gY29udGV4dDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Db25zdDpcbiAgICAgICAgcmhzID0gY29kaWZ5KHByb3RvUmVjLmZ1bmNPclZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Qcm9wZXJ0eVJlYWQ6XG4gICAgICAgIHJocyA9IHRoaXMuX29ic2VydmUoYCR7Y29udGV4dH0uJHtwcm90b1JlYy5uYW1lfWAsIHByb3RvUmVjKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5TYWZlUHJvcGVydHk6XG4gICAgICAgIHZhciByZWFkID0gdGhpcy5fb2JzZXJ2ZShgJHtjb250ZXh0fS4ke3Byb3RvUmVjLm5hbWV9YCwgcHJvdG9SZWMpO1xuICAgICAgICByaHMgPVxuICAgICAgICAgICAgYCR7dGhpcy5fdXRpbE5hbWV9LmlzVmFsdWVCbGFuaygke2NvbnRleHR9KSA/IG51bGwgOiAke3RoaXMuX29ic2VydmUocmVhZCwgcHJvdG9SZWMpfWA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuUHJvcGVydHlXcml0ZTpcbiAgICAgICAgcmhzID0gYCR7Y29udGV4dH0uJHtwcm90b1JlYy5uYW1lfSA9ICR7Z2V0TG9jYWxOYW1lKHByb3RvUmVjLmFyZ3NbMF0pfWA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuTG9jYWw6XG4gICAgICAgIHJocyA9IHRoaXMuX29ic2VydmUoYCR7bG9jYWxzQWNjZXNzb3J9LmdldCgke3Jhd1N0cmluZyhwcm90b1JlYy5uYW1lKX0pYCwgcHJvdG9SZWMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLkludm9rZU1ldGhvZDpcbiAgICAgICAgcmhzID0gdGhpcy5fb2JzZXJ2ZShgJHtjb250ZXh0fS4ke3Byb3RvUmVjLm5hbWV9KCR7YXJnU3RyaW5nfSlgLCBwcm90b1JlYyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuU2FmZU1ldGhvZEludm9rZTpcbiAgICAgICAgdmFyIGludm9rZSA9IGAke2NvbnRleHR9LiR7cHJvdG9SZWMubmFtZX0oJHthcmdTdHJpbmd9KWA7XG4gICAgICAgIHJocyA9XG4gICAgICAgICAgICBgJHt0aGlzLl91dGlsTmFtZX0uaXNWYWx1ZUJsYW5rKCR7Y29udGV4dH0pID8gbnVsbCA6ICR7dGhpcy5fb2JzZXJ2ZShpbnZva2UsIHByb3RvUmVjKX1gO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLkludm9rZUNsb3N1cmU6XG4gICAgICAgIHJocyA9IGAke2NvbnRleHR9KCR7YXJnU3RyaW5nfSlgO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLlByaW1pdGl2ZU9wOlxuICAgICAgICByaHMgPSBgJHt0aGlzLl91dGlsTmFtZX0uJHtwcm90b1JlYy5uYW1lfSgke2FyZ1N0cmluZ30pYDtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgUmVjb3JkVHlwZS5Db2xsZWN0aW9uTGl0ZXJhbDpcbiAgICAgICAgcmhzID0gYCR7dGhpcy5fdXRpbE5hbWV9LiR7cHJvdG9SZWMubmFtZX0oJHthcmdTdHJpbmd9KWA7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIFJlY29yZFR5cGUuSW50ZXJwb2xhdGU6XG4gICAgICAgIHJocyA9IHRoaXMuX2dlbkludGVycG9sYXRpb24ocHJvdG9SZWMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLktleWVkUmVhZDpcbiAgICAgICAgcmhzID0gdGhpcy5fb2JzZXJ2ZShgJHtjb250ZXh0fVske2dldExvY2FsTmFtZShwcm90b1JlYy5hcmdzWzBdKX1dYCwgcHJvdG9SZWMpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLktleWVkV3JpdGU6XG4gICAgICAgIHJocyA9IGAke2NvbnRleHR9WyR7Z2V0TG9jYWxOYW1lKHByb3RvUmVjLmFyZ3NbMF0pfV0gPSAke2dldExvY2FsTmFtZShwcm90b1JlYy5hcmdzWzFdKX1gO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBSZWNvcmRUeXBlLkNoYWluOlxuICAgICAgICByaHMgPSAnbnVsbCc7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgVW5rbm93biBvcGVyYXRpb24gJHtwcm90b1JlYy5tb2RlfWApO1xuICAgIH1cbiAgICByZXR1cm4gYCR7Z2V0TG9jYWxOYW1lKHByb3RvUmVjLnNlbGZJbmRleCl9ID0gJHtyaHN9O2A7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9vYnNlcnZlKGV4cDogc3RyaW5nLCByZWM6IFByb3RvUmVjb3JkKTogc3RyaW5nIHtcbiAgICAvLyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gICAgaWYgKHRoaXMuX2NoYW5nZURldGVjdGlvbiA9PT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoT2JzZXJ2ZSkge1xuICAgICAgcmV0dXJuIGB0aGlzLm9ic2VydmVWYWx1ZSgke2V4cH0sICR7cmVjLnNlbGZJbmRleH0pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGV4cDtcbiAgICB9XG4gIH1cblxuICBnZW5Qcm9wZXJ0eUJpbmRpbmdUYXJnZXRzKHByb3BlcnR5QmluZGluZ1RhcmdldHM6IEJpbmRpbmdUYXJnZXRbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5EZWJ1Z0luZm86IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHZhciBicyA9IHByb3BlcnR5QmluZGluZ1RhcmdldHMubWFwKGIgPT4ge1xuICAgICAgaWYgKGlzQmxhbmsoYikpIHJldHVybiBcIm51bGxcIjtcblxuICAgICAgdmFyIGRlYnVnID0gZ2VuRGVidWdJbmZvID8gY29kaWZ5KGIuZGVidWcpIDogXCJudWxsXCI7XG4gICAgICByZXR1cm4gYCR7dGhpcy5fdXRpbE5hbWV9LmJpbmRpbmdUYXJnZXQoJHtjb2RpZnkoYi5tb2RlKX0sICR7Yi5lbGVtZW50SW5kZXh9LCAke2NvZGlmeShiLm5hbWUpfSwgJHtjb2RpZnkoYi51bml0KX0sICR7ZGVidWd9KWA7XG4gICAgfSk7XG4gICAgcmV0dXJuIGBbJHticy5qb2luKFwiLCBcIil9XWA7XG4gIH1cblxuICBnZW5EaXJlY3RpdmVJbmRpY2VzKGRpcmVjdGl2ZVJlY29yZHM6IERpcmVjdGl2ZVJlY29yZFtdKTogc3RyaW5nIHtcbiAgICB2YXIgYnMgPSBkaXJlY3RpdmVSZWNvcmRzLm1hcChcbiAgICAgICAgYiA9PlxuICAgICAgICAgICAgYCR7dGhpcy5fdXRpbE5hbWV9LmRpcmVjdGl2ZUluZGV4KCR7Yi5kaXJlY3RpdmVJbmRleC5lbGVtZW50SW5kZXh9LCAke2IuZGlyZWN0aXZlSW5kZXguZGlyZWN0aXZlSW5kZXh9KWApO1xuICAgIHJldHVybiBgWyR7YnMuam9pbihcIiwgXCIpfV1gO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2VuSW50ZXJwb2xhdGlvbihwcm90b1JlYzogUHJvdG9SZWNvcmQpOiBzdHJpbmcge1xuICAgIHZhciBpVmFscyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvdG9SZWMuYXJncy5sZW5ndGg7ICsraSkge1xuICAgICAgaVZhbHMucHVzaChjb2RpZnkocHJvdG9SZWMuZml4ZWRBcmdzW2ldKSk7XG4gICAgICBpVmFscy5wdXNoKGAke3RoaXMuX3V0aWxOYW1lfS5zKCR7dGhpcy5fbmFtZXMuZ2V0TG9jYWxOYW1lKHByb3RvUmVjLmFyZ3NbaV0pfSlgKTtcbiAgICB9XG4gICAgaVZhbHMucHVzaChjb2RpZnkocHJvdG9SZWMuZml4ZWRBcmdzW3Byb3RvUmVjLmFyZ3MubGVuZ3RoXSkpO1xuICAgIHJldHVybiBjb21iaW5lR2VuZXJhdGVkU3RyaW5ncyhpVmFscyk7XG4gIH1cblxuICBnZW5IeWRyYXRlRGlyZWN0aXZlcyhkaXJlY3RpdmVSZWNvcmRzOiBEaXJlY3RpdmVSZWNvcmRbXSk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyZWN0aXZlUmVjb3Jkcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHIgPSBkaXJlY3RpdmVSZWNvcmRzW2ldO1xuICAgICAgcmVzLnB1c2goYCR7dGhpcy5fbmFtZXMuZ2V0RGlyZWN0aXZlTmFtZShyLmRpcmVjdGl2ZUluZGV4KX0gPSAke3RoaXMuX2dlblJlYWREaXJlY3RpdmUoaSl9O2ApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzLmpvaW4oXCJcXG5cIik7XG4gIH1cblxuICBwcml2YXRlIF9nZW5SZWFkRGlyZWN0aXZlKGluZGV4OiBudW1iZXIpIHtcbiAgICAvLyBUaGlzIGlzIGFuIGV4cGVyaW1lbnRhbCBmZWF0dXJlLiBXb3JrcyBvbmx5IGluIERhcnQuXG4gICAgaWYgKHRoaXMuX2NoYW5nZURldGVjdGlvbiA9PT0gQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoT2JzZXJ2ZSkge1xuICAgICAgcmV0dXJuIGB0aGlzLm9ic2VydmVEaXJlY3RpdmUodGhpcy5nZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlcywgJHtpbmRleH0pLCAke2luZGV4fSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYHRoaXMuZ2V0RGlyZWN0aXZlRm9yKGRpcmVjdGl2ZXMsICR7aW5kZXh9KWA7XG4gICAgfVxuICB9XG5cbiAgZ2VuSHlkcmF0ZURldGVjdG9ycyhkaXJlY3RpdmVSZWNvcmRzOiBEaXJlY3RpdmVSZWNvcmRbXSk6IHN0cmluZyB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyZWN0aXZlUmVjb3Jkcy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIHIgPSBkaXJlY3RpdmVSZWNvcmRzW2ldO1xuICAgICAgaWYgKCFyLmlzRGVmYXVsdENoYW5nZURldGVjdGlvbigpKSB7XG4gICAgICAgIHJlcy5wdXNoKFxuICAgICAgICAgICAgYCR7dGhpcy5fbmFtZXMuZ2V0RGV0ZWN0b3JOYW1lKHIuZGlyZWN0aXZlSW5kZXgpfSA9IHRoaXMuZ2V0RGV0ZWN0b3JGb3IoZGlyZWN0aXZlcywgJHtpfSk7YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXMuam9pbihcIlxcblwiKTtcbiAgfVxuXG4gIGdlbkNvbnRlbnRMaWZlY3ljbGVDYWxsYmFja3MoZGlyZWN0aXZlUmVjb3JkczogRGlyZWN0aXZlUmVjb3JkW10pOiBzdHJpbmdbXSB7XG4gICAgdmFyIHJlcyA9IFtdO1xuICAgIHZhciBlcSA9IElTX0RBUlQgPyAnPT0nIDogJz09PSc7XG4gICAgLy8gTk9URShrZWdsdW5lcSk6IE9yZGVyIGlzIGltcG9ydGFudCFcbiAgICBmb3IgKHZhciBpID0gZGlyZWN0aXZlUmVjb3Jkcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdmFyIGRpciA9IGRpcmVjdGl2ZVJlY29yZHNbaV07XG4gICAgICBpZiAoZGlyLmNhbGxBZnRlckNvbnRlbnRJbml0KSB7XG4gICAgICAgIHJlcy5wdXNoKFxuICAgICAgICAgICAgYGlmKCR7dGhpcy5fbmFtZXMuZ2V0U3RhdGVOYW1lKCl9ICR7ZXF9ICR7dGhpcy5fY2hhbmdlRGV0ZWN0b3JTdGF0ZU5hbWV9Lk5ldmVyQ2hlY2tlZCkgJHt0aGlzLl9uYW1lcy5nZXREaXJlY3RpdmVOYW1lKGRpci5kaXJlY3RpdmVJbmRleCl9Lm5nQWZ0ZXJDb250ZW50SW5pdCgpO2ApO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyLmNhbGxBZnRlckNvbnRlbnRDaGVja2VkKSB7XG4gICAgICAgIHJlcy5wdXNoKGAke3RoaXMuX25hbWVzLmdldERpcmVjdGl2ZU5hbWUoZGlyLmRpcmVjdGl2ZUluZGV4KX0ubmdBZnRlckNvbnRlbnRDaGVja2VkKCk7YCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBnZW5WaWV3TGlmZWN5Y2xlQ2FsbGJhY2tzKGRpcmVjdGl2ZVJlY29yZHM6IERpcmVjdGl2ZVJlY29yZFtdKTogc3RyaW5nW10ge1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgZXEgPSBJU19EQVJUID8gJz09JyA6ICc9PT0nO1xuICAgIC8vIE5PVEUoa2VnbHVuZXEpOiBPcmRlciBpcyBpbXBvcnRhbnQhXG4gICAgZm9yICh2YXIgaSA9IGRpcmVjdGl2ZVJlY29yZHMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgIHZhciBkaXIgPSBkaXJlY3RpdmVSZWNvcmRzW2ldO1xuICAgICAgaWYgKGRpci5jYWxsQWZ0ZXJWaWV3SW5pdCkge1xuICAgICAgICByZXMucHVzaChcbiAgICAgICAgICAgIGBpZigke3RoaXMuX25hbWVzLmdldFN0YXRlTmFtZSgpfSAke2VxfSAke3RoaXMuX2NoYW5nZURldGVjdG9yU3RhdGVOYW1lfS5OZXZlckNoZWNrZWQpICR7dGhpcy5fbmFtZXMuZ2V0RGlyZWN0aXZlTmFtZShkaXIuZGlyZWN0aXZlSW5kZXgpfS5uZ0FmdGVyVmlld0luaXQoKTtgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpci5jYWxsQWZ0ZXJWaWV3Q2hlY2tlZCkge1xuICAgICAgICByZXMucHVzaChgJHt0aGlzLl9uYW1lcy5nZXREaXJlY3RpdmVOYW1lKGRpci5kaXJlY3RpdmVJbmRleCl9Lm5nQWZ0ZXJWaWV3Q2hlY2tlZCgpO2ApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NvZGVnZW5fbG9naWNfdXRpbC50c1xuICoqLyIsIlxuLyoqXG4gKiBDb252ZXJ0cyBgZnVuY09yVmFsdWVgIHRvIGEgc3RyaW5nIHdoaWNoIGNhbiBiZSB1c2VkIGluIGdlbmVyYXRlZCBjb2RlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29kaWZ5KG9iajogYW55KTogc3RyaW5nIHtcbiAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYXdTdHJpbmcoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gYCcke3N0cn0nYDtcbn1cblxuLyoqXG4gKiBDb21iaW5lIHRoZSBzdHJpbmdzIG9mIGdlbmVyYXRlZCBjb2RlIGludG8gYSBzaW5nbGUgaW50ZXJwb2xhdGVkIHN0cmluZy5cbiAqIEVhY2ggZWxlbWVudCBvZiBgdmFsc2AgaXMgZXhwZWN0ZWQgdG8gYmUgYSBzdHJpbmcgbGl0ZXJhbCBvciBhIGNvZGVnZW4nZFxuICogY2FsbCB0byBhIG1ldGhvZCByZXR1cm5pbmcgYSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lR2VuZXJhdGVkU3RyaW5ncyh2YWxzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gIHJldHVybiB2YWxzLmpvaW4oJyArICcpO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jb2RlZ2VuX2ZhY2FkZS50c1xuICoqLyIsImltcG9ydCB7Q09OU1QsIFR5cGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogRGVmaW5lcyB0ZW1wbGF0ZSBhbmQgc3R5bGUgZW5jYXBzdWxhdGlvbiBvcHRpb25zIGF2YWlsYWJsZSBmb3IgQ29tcG9uZW50J3Mge0BsaW5rIFZpZXd9LlxuICpcbiAqIFNlZSB7QGxpbmsgVmlld01ldGFkYXRhI2VuY2Fwc3VsYXRpb259LlxuICovXG5leHBvcnQgZW51bSBWaWV3RW5jYXBzdWxhdGlvbiB7XG4gIC8qKlxuICAgKiBFbXVsYXRlIGBOYXRpdmVgIHNjb3Bpbmcgb2Ygc3R5bGVzIGJ5IGFkZGluZyBhbiBhdHRyaWJ1dGUgY29udGFpbmluZyBzdXJyb2dhdGUgaWQgdG8gdGhlIEhvc3RcbiAgICogRWxlbWVudCBhbmQgcHJlLXByb2Nlc3NpbmcgdGhlIHN0eWxlIHJ1bGVzIHByb3ZpZGVkIHZpYVxuICAgKiB7QGxpbmsgVmlld01ldGFkYXRhI3N0eWxlc30gb3Ige0BsaW5rIFZpZXdNZXRhZGF0YSNzdHlsZXNVcmxzfSwgYW5kIGFkZGluZyB0aGUgbmV3IEhvc3QgRWxlbWVudFxuICAgKiBhdHRyaWJ1dGUgdG8gYWxsIHNlbGVjdG9ycy5cbiAgICpcbiAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBvcHRpb24uXG4gICAqL1xuICBFbXVsYXRlZCxcbiAgLyoqXG4gICAqIFVzZSB0aGUgbmF0aXZlIGVuY2Fwc3VsYXRpb24gbWVjaGFuaXNtIG9mIHRoZSByZW5kZXJlci5cbiAgICpcbiAgICogRm9yIHRoZSBET00gdGhpcyBtZWFucyB1c2luZyBbU2hhZG93IERPTV0oaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9zaGFkb3cvKSBhbmRcbiAgICogY3JlYXRpbmcgYSBTaGFkb3dSb290IGZvciBDb21wb25lbnQncyBIb3N0IEVsZW1lbnQuXG4gICAqL1xuICBOYXRpdmUsXG4gIC8qKlxuICAgKiBEb24ndCBwcm92aWRlIGFueSB0ZW1wbGF0ZSBvciBzdHlsZSBlbmNhcHN1bGF0aW9uLlxuICAgKi9cbiAgTm9uZVxufVxuXG5leHBvcnQgdmFyIFZJRVdfRU5DQVBTVUxBVElPTl9WQUxVRVMgPVxuICAgIFtWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCwgVmlld0VuY2Fwc3VsYXRpb24uTmF0aXZlLCBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXTtcblxuXG4vKipcbiAqIE1ldGFkYXRhIHByb3BlcnRpZXMgYXZhaWxhYmxlIGZvciBjb25maWd1cmluZyBWaWV3cy5cbiAqXG4gKiBFYWNoIEFuZ3VsYXIgY29tcG9uZW50IHJlcXVpcmVzIGEgc2luZ2xlIGBAQ29tcG9uZW50YCBhbmQgYXQgbGVhc3Qgb25lIGBAVmlld2AgYW5ub3RhdGlvbi4gVGhlXG4gKiBgQFZpZXdgIGFubm90YXRpb24gc3BlY2lmaWVzIHRoZSBIVE1MIHRlbXBsYXRlIHRvIHVzZSwgYW5kIGxpc3RzIHRoZSBkaXJlY3RpdmVzIHRoYXQgYXJlIGFjdGl2ZVxuICogd2l0aGluIHRoZSB0ZW1wbGF0ZS5cbiAqXG4gKiBXaGVuIGEgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCwgdGhlIHRlbXBsYXRlIGlzIGxvYWRlZCBpbnRvIHRoZSBjb21wb25lbnQncyBzaGFkb3cgcm9vdCwgYW5kXG4gKiB0aGUgZXhwcmVzc2lvbnMgYW5kIHN0YXRlbWVudHMgaW4gdGhlIHRlbXBsYXRlIGFyZSBldmFsdWF0ZWQgYWdhaW5zdCB0aGUgY29tcG9uZW50LlxuICpcbiAqIEZvciBkZXRhaWxzIG9uIHRoZSBgQENvbXBvbmVudGAgYW5ub3RhdGlvbiwgc2VlIHtAbGluayBDb21wb25lbnRNZXRhZGF0YX0uXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2dyZWV0JyxcbiAqICAgdGVtcGxhdGU6ICdIZWxsbyB7e25hbWV9fSEnLFxuICogICBkaXJlY3RpdmVzOiBbR3JlZXRVc2VyLCBCb2xkXVxuICogfSlcbiAqIGNsYXNzIEdyZWV0IHtcbiAqICAgbmFtZTogc3RyaW5nO1xuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgdGhpcy5uYW1lID0gJ1dvcmxkJztcbiAqICAgfVxuICogfVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgVmlld01ldGFkYXRhIHtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIHRlbXBsYXRlIFVSTCBmb3IgYW4gQW5ndWxhciBjb21wb25lbnQuXG4gICAqXG4gICAqIE5PVEU6IE9ubHkgb25lIG9mIGB0ZW1wbGF0ZVVybGAgb3IgYHRlbXBsYXRlYCBjYW4gYmUgZGVmaW5lZCBwZXIgVmlldy5cbiAgICpcbiAgICogPCEtLSBUT0RPOiB3aGF0J3MgdGhlIHVybCByZWxhdGl2ZSB0bz8gLS0+XG4gICAqL1xuICB0ZW1wbGF0ZVVybDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgYW4gaW5saW5lIHRlbXBsYXRlIGZvciBhbiBBbmd1bGFyIGNvbXBvbmVudC5cbiAgICpcbiAgICogTk9URTogT25seSBvbmUgb2YgYHRlbXBsYXRlVXJsYCBvciBgdGVtcGxhdGVgIGNhbiBiZSBkZWZpbmVkIHBlciBWaWV3LlxuICAgKi9cbiAgdGVtcGxhdGU6IHN0cmluZztcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHN0eWxlc2hlZXQgVVJMcyBmb3IgYW4gQW5ndWxhciBjb21wb25lbnQuXG4gICAqXG4gICAqIDwhLS0gVE9ETzogd2hhdCdzIHRoZSB1cmwgcmVsYXRpdmUgdG8/IC0tPlxuICAgKi9cbiAgc3R5bGVVcmxzOiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIGFuIGlubGluZSBzdHlsZXNoZWV0IGZvciBhbiBBbmd1bGFyIGNvbXBvbmVudC5cbiAgICovXG4gIHN0eWxlczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGxpc3Qgb2YgZGlyZWN0aXZlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGhpbiBhIHRlbXBsYXRlLlxuICAgKlxuICAgKiBEaXJlY3RpdmVzIG11c3QgYmUgbGlzdGVkIGV4cGxpY2l0bHkgdG8gcHJvdmlkZSBwcm9wZXIgY29tcG9uZW50IGVuY2Fwc3VsYXRpb24uXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYGphdmFzY3JpcHRcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdteS1jb21wb25lbnQnLFxuICAgKiAgIGRpcmVjdGl2ZXM6IFtOZ0Zvcl1cbiAgICogICB0ZW1wbGF0ZTogJ1xuICAgKiAgIDx1bD5cbiAgICogICAgIDxsaSAqbmdGb3I9XCIjaXRlbSBvZiBpdGVtc1wiPnt7aXRlbX19PC9saT5cbiAgICogICA8L3VsPidcbiAgICogfSlcbiAgICogY2xhc3MgTXlDb21wb25lbnQge1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgZGlyZWN0aXZlczogQXJyYXk8VHlwZSB8IGFueVtdPjtcblxuICBwaXBlczogQXJyYXk8VHlwZSB8IGFueVtdPjtcblxuICAvKipcbiAgICogU3BlY2lmeSBob3cgdGhlIHRlbXBsYXRlIGFuZCB0aGUgc3R5bGVzIHNob3VsZCBiZSBlbmNhcHN1bGF0ZWQuXG4gICAqIFRoZSBkZWZhdWx0IGlzIHtAbGluayBWaWV3RW5jYXBzdWxhdGlvbiNFbXVsYXRlZCBgVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWRgfSBpZiB0aGUgdmlld1xuICAgKiBoYXMgc3R5bGVzLFxuICAgKiBvdGhlcndpc2Uge0BsaW5rIFZpZXdFbmNhcHN1bGF0aW9uI05vbmUgYFZpZXdFbmNhcHN1bGF0aW9uLk5vbmVgfS5cbiAgICovXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHt0ZW1wbGF0ZVVybCwgdGVtcGxhdGUsIGRpcmVjdGl2ZXMsIHBpcGVzLCBlbmNhcHN1bGF0aW9uLCBzdHlsZXMsIHN0eWxlVXJsc306IHtcbiAgICB0ZW1wbGF0ZVVybD86IHN0cmluZyxcbiAgICB0ZW1wbGF0ZT86IHN0cmluZyxcbiAgICBkaXJlY3RpdmVzPzogQXJyYXk8VHlwZSB8IGFueVtdPixcbiAgICBwaXBlcz86IEFycmF5PFR5cGUgfCBhbnlbXT4sXG4gICAgZW5jYXBzdWxhdGlvbj86IFZpZXdFbmNhcHN1bGF0aW9uLFxuICAgIHN0eWxlcz86IHN0cmluZ1tdLFxuICAgIHN0eWxlVXJscz86IHN0cmluZ1tdLFxuICB9ID0ge30pIHtcbiAgICB0aGlzLnRlbXBsYXRlVXJsID0gdGVtcGxhdGVVcmw7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICAgIHRoaXMuc3R5bGVVcmxzID0gc3R5bGVVcmxzO1xuICAgIHRoaXMuc3R5bGVzID0gc3R5bGVzO1xuICAgIHRoaXMuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7XG4gICAgdGhpcy5waXBlcyA9IHBpcGVzO1xuICAgIHRoaXMuZW5jYXBzdWxhdGlvbiA9IGVuY2Fwc3VsYXRpb247XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL3ZpZXcudHNcbiAqKi8iLCIvLyBQdWJsaWMgQVBJIGZvciB1dGlsXG5leHBvcnQge0NsYXNzLCBDbGFzc0RlZmluaXRpb24sIFR5cGVEZWNvcmF0b3J9IGZyb20gJy4vdXRpbC9kZWNvcmF0b3JzJztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS91dGlsLnRzXG4gKiovIiwiZXhwb3J0IHtlbmFibGVQcm9kTW9kZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9wcm9kX21vZGUudHNcbiAqKi8iLCIvLyBQdWJsaWMgQVBJIGZvciBGYWNhZGVcbmV4cG9ydCB7Q29uY3JldGVUeXBlLCBUeXBlfSBmcm9tICcuL2xhbmcnO1xuZXhwb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJy4vYXN5bmMnO1xuZXhwb3J0IHtXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICcuL2V4Y2VwdGlvbnMnO1xuZXhwb3J0IHtFeGNlcHRpb25IYW5kbGVyfSBmcm9tICcuL2V4Y2VwdGlvbl9oYW5kbGVyJztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvZmFjYWRlLnRzXG4gKiovIiwiaW1wb3J0IHtnbG9iYWwsIGlzUHJlc2VudCwgbm9vcH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbi8vIFdlIG1ha2Ugc3VyZSBwcm9taXNlcyBhcmUgaW4gYSBzZXBhcmF0ZSBmaWxlIHNvIHRoYXQgd2UgY2FuIHVzZSBwcm9taXNlc1xuLy8gd2l0aG91dCBkZXBlbmRpbmcgb24gcnhqcy5cbmltcG9ydCB7UHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9wcm9taXNlJztcbmV4cG9ydCB7UHJvbWlzZVdyYXBwZXIsIFByb21pc2UsIFByb21pc2VDb21wbGV0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvcHJvbWlzZSc7XG5cbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcy9TdWJqZWN0JztcbmltcG9ydCB7U3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzL1N1YnNjcmlwdGlvbic7XG5pbXBvcnQge09wZXJhdG9yfSBmcm9tICdyeGpzL09wZXJhdG9yJztcblxuaW1wb3J0IHtQcm9taXNlT2JzZXJ2YWJsZX0gZnJvbSAncnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlJztcbmltcG9ydCB7dG9Qcm9taXNlfSBmcm9tICdyeGpzL29wZXJhdG9yL3RvUHJvbWlzZSc7XG5cbmV4cG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcbmV4cG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcy9TdWJqZWN0JztcblxuZXhwb3J0IG5hbWVzcGFjZSBOb2RlSlMge1xuICBleHBvcnQgaW50ZXJmYWNlIFRpbWVyIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBUaW1lcldyYXBwZXIge1xuICBzdGF0aWMgc2V0VGltZW91dChmbjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkLCBtaWxsaXM6IG51bWJlcik6IE5vZGVKUy5UaW1lciB7XG4gICAgcmV0dXJuIGdsb2JhbC5zZXRUaW1lb3V0KGZuLCBtaWxsaXMpO1xuICB9XG4gIHN0YXRpYyBjbGVhclRpbWVvdXQoaWQ6IE5vZGVKUy5UaW1lcik6IHZvaWQgeyBnbG9iYWwuY2xlYXJUaW1lb3V0KGlkKTsgfVxuXG4gIHN0YXRpYyBzZXRJbnRlcnZhbChmbjogKC4uLmFyZ3M6IGFueVtdKSA9PiB2b2lkLCBtaWxsaXM6IG51bWJlcik6IE5vZGVKUy5UaW1lciB7XG4gICAgcmV0dXJuIGdsb2JhbC5zZXRJbnRlcnZhbChmbiwgbWlsbGlzKTtcbiAgfVxuICBzdGF0aWMgY2xlYXJJbnRlcnZhbChpZDogTm9kZUpTLlRpbWVyKTogdm9pZCB7IGdsb2JhbC5jbGVhckludGVydmFsKGlkKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgT2JzZXJ2YWJsZVdyYXBwZXIge1xuICAvLyBUT0RPKHZzYXZraW4pOiB3aGVuIHdlIHVzZSByeG5leHQsIHRyeSBpbmZlcnJpbmcgdGhlIGdlbmVyaWMgdHlwZSBmcm9tIHRoZSBmaXJzdCBhcmdcbiAgc3RhdGljIHN1YnNjcmliZTxUPihlbWl0dGVyOiBhbnksIG9uTmV4dDogKHZhbHVlOiBUKSA9PiB2b2lkLCBvbkVycm9yPzogKGV4Y2VwdGlvbjogYW55KSA9PiB2b2lkLFxuICAgICAgICAgICAgICAgICAgICAgIG9uQ29tcGxldGU6ICgpID0+IHZvaWQgPSAoKSA9PiB7fSk6IE9iamVjdCB7XG4gICAgb25FcnJvciA9ICh0eXBlb2Ygb25FcnJvciA9PT0gXCJmdW5jdGlvblwiKSAmJiBvbkVycm9yIHx8IG5vb3A7XG4gICAgb25Db21wbGV0ZSA9ICh0eXBlb2Ygb25Db21wbGV0ZSA9PT0gXCJmdW5jdGlvblwiKSAmJiBvbkNvbXBsZXRlIHx8IG5vb3A7XG4gICAgcmV0dXJuIGVtaXR0ZXIuc3Vic2NyaWJlKHtuZXh0OiBvbk5leHQsIGVycm9yOiBvbkVycm9yLCBjb21wbGV0ZTogb25Db21wbGV0ZX0pO1xuICB9XG5cbiAgc3RhdGljIGlzT2JzZXJ2YWJsZShvYnM6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gISFvYnMuc3Vic2NyaWJlOyB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgd2hldGhlciBgb2JzYCBoYXMgYW55IHN1YnNjcmliZXJzIGxpc3RlbmluZyB0byBldmVudHMuXG4gICAqL1xuICBzdGF0aWMgaGFzU3Vic2NyaWJlcnMob2JzOiBFdmVudEVtaXR0ZXI8YW55Pik6IGJvb2xlYW4geyByZXR1cm4gb2JzLm9ic2VydmVycy5sZW5ndGggPiAwOyB9XG5cbiAgc3RhdGljIGRpc3Bvc2Uoc3Vic2NyaXB0aW9uOiBhbnkpIHsgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgLSB1c2UgY2FsbEVtaXQoKSBpbnN0ZWFkXG4gICAqL1xuICBzdGF0aWMgY2FsbE5leHQoZW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4sIHZhbHVlOiBhbnkpIHsgZW1pdHRlci5uZXh0KHZhbHVlKTsgfVxuXG4gIHN0YXRpYyBjYWxsRW1pdChlbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiwgdmFsdWU6IGFueSkgeyBlbWl0dGVyLmVtaXQodmFsdWUpOyB9XG5cbiAgc3RhdGljIGNhbGxFcnJvcihlbWl0dGVyOiBFdmVudEVtaXR0ZXI8YW55PiwgZXJyb3I6IGFueSkgeyBlbWl0dGVyLmVycm9yKGVycm9yKTsgfVxuXG4gIHN0YXRpYyBjYWxsQ29tcGxldGUoZW1pdHRlcjogRXZlbnRFbWl0dGVyPGFueT4pIHsgZW1pdHRlci5jb21wbGV0ZSgpOyB9XG5cbiAgc3RhdGljIGZyb21Qcm9taXNlKHByb21pc2U6IFByb21pc2U8YW55Pik6IE9ic2VydmFibGU8YW55PiB7XG4gICAgcmV0dXJuIFByb21pc2VPYnNlcnZhYmxlLmNyZWF0ZShwcm9taXNlKTtcbiAgfVxuXG4gIHN0YXRpYyB0b1Byb21pc2Uob2JqOiBPYnNlcnZhYmxlPGFueT4pOiBQcm9taXNlPGFueT4geyByZXR1cm4gdG9Qcm9taXNlLmNhbGwob2JqKTsgfVxufVxuXG4vKipcbiAqIFVzZSBieSBkaXJlY3RpdmVzIGFuZCBjb21wb25lbnRzIHRvIGVtaXQgY3VzdG9tIEV2ZW50cy5cbiAqXG4gKiAjIyMgRXhhbXBsZXNcbiAqXG4gKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIGBaaXBweWAgYWx0ZXJuYXRpdmVseSBlbWl0cyBgb3BlbmAgYW5kIGBjbG9zZWAgZXZlbnRzIHdoZW4gaXRzXG4gKiB0aXRsZSBnZXRzIGNsaWNrZWQ6XG4gKlxuICogYGBgXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICd6aXBweScsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgIDxkaXYgY2xhc3M9XCJ6aXBweVwiPlxuICogICAgIDxkaXYgKGNsaWNrKT1cInRvZ2dsZSgpXCI+VG9nZ2xlPC9kaXY+XG4gKiAgICAgPGRpdiBbaGlkZGVuXT1cIiF2aXNpYmxlXCI+XG4gKiAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gKiAgICAgPC9kaXY+XG4gKiAgPC9kaXY+YH0pXG4gKiBleHBvcnQgY2xhc3MgWmlwcHkge1xuICogICB2aXNpYmxlOiBib29sZWFuID0gdHJ1ZTtcbiAqICAgQE91dHB1dCgpIG9wZW46IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICogICBAT3V0cHV0KCkgY2xvc2U6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICpcbiAqICAgdG9nZ2xlKCkge1xuICogICAgIHRoaXMudmlzaWJsZSA9ICF0aGlzLnZpc2libGU7XG4gKiAgICAgaWYgKHRoaXMudmlzaWJsZSkge1xuICogICAgICAgdGhpcy5vcGVuLmVtaXQobnVsbCk7XG4gKiAgICAgfSBlbHNlIHtcbiAqICAgICAgIHRoaXMuY2xvc2UuZW1pdChudWxsKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICpcbiAqIFVzZSBSeC5PYnNlcnZhYmxlIGJ1dCBwcm92aWRlcyBhbiBhZGFwdGVyIHRvIG1ha2UgaXQgd29yayBhcyBzcGVjaWZpZWQgaGVyZTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9qaHVzYWluL29ic2VydmFibGUtc3BlY1xuICpcbiAqIE9uY2UgYSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNwZWMgaXMgYXZhaWxhYmxlLCBzd2l0Y2ggdG8gaXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFdmVudEVtaXR0ZXI8VD4gZXh0ZW5kcyBTdWJqZWN0PFQ+IHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaXNBc3luYzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBbRXZlbnRFbWl0dGVyXSwgd2hpY2ggZGVwZW5kaW5nIG9uIFtpc0FzeW5jXSxcbiAgICogZGVsaXZlcnMgZXZlbnRzIHN5bmNocm9ub3VzbHkgb3IgYXN5bmNocm9ub3VzbHkuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihpc0FzeW5jOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5faXNBc3luYyA9IGlzQXN5bmM7XG4gIH1cblxuICBlbWl0KHZhbHVlOiBUKSB7IHN1cGVyLm5leHQodmFsdWUpOyB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIC0gdXNlIC5lbWl0KHZhbHVlKSBpbnN0ZWFkXG4gICAqL1xuICBuZXh0KHZhbHVlOiBhbnkpIHsgc3VwZXIubmV4dCh2YWx1ZSk7IH1cblxuICBzdWJzY3JpYmUoZ2VuZXJhdG9yT3JOZXh0PzogYW55LCBlcnJvcj86IGFueSwgY29tcGxldGU/OiBhbnkpOiBhbnkge1xuICAgIGxldCBzY2hlZHVsZXJGbjtcbiAgICBsZXQgZXJyb3JGbiA9IChlcnI6IGFueSkgPT4gbnVsbDtcbiAgICBsZXQgY29tcGxldGVGbiA9ICgpID0+IG51bGw7XG5cbiAgICBpZiAoZ2VuZXJhdG9yT3JOZXh0ICYmIHR5cGVvZiBnZW5lcmF0b3JPck5leHQgPT09ICdvYmplY3QnKSB7XG4gICAgICBzY2hlZHVsZXJGbiA9IHRoaXMuX2lzQXN5bmMgPyAodmFsdWUpID0+IHsgc2V0VGltZW91dCgoKSA9PiBnZW5lcmF0b3JPck5leHQubmV4dCh2YWx1ZSkpOyB9IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSkgPT4geyBnZW5lcmF0b3JPck5leHQubmV4dCh2YWx1ZSk7IH07XG5cbiAgICAgIGlmIChnZW5lcmF0b3JPck5leHQuZXJyb3IpIHtcbiAgICAgICAgZXJyb3JGbiA9IHRoaXMuX2lzQXN5bmMgPyAoZXJyKSA9PiB7IHNldFRpbWVvdXQoKCkgPT4gZ2VuZXJhdG9yT3JOZXh0LmVycm9yKGVycikpOyB9IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXJyKSA9PiB7IGdlbmVyYXRvck9yTmV4dC5lcnJvcihlcnIpOyB9O1xuICAgICAgfVxuXG4gICAgICBpZiAoZ2VuZXJhdG9yT3JOZXh0LmNvbXBsZXRlKSB7XG4gICAgICAgIGNvbXBsZXRlRm4gPSB0aGlzLl9pc0FzeW5jID8gKCkgPT4geyBzZXRUaW1lb3V0KCgpID0+IGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSgpKTsgfSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4geyBnZW5lcmF0b3JPck5leHQuY29tcGxldGUoKTsgfTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVyRm4gPSB0aGlzLl9pc0FzeW5jID8gKHZhbHVlKSA9PiB7IHNldFRpbWVvdXQoKCkgPT4gZ2VuZXJhdG9yT3JOZXh0KHZhbHVlKSk7IH0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlKSA9PiB7IGdlbmVyYXRvck9yTmV4dCh2YWx1ZSk7IH07XG5cbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICBlcnJvckZuID1cbiAgICAgICAgICAgIHRoaXMuX2lzQXN5bmMgPyAoZXJyKSA9PiB7IHNldFRpbWVvdXQoKCkgPT4gZXJyb3IoZXJyKSk7IH0gOiAoZXJyKSA9PiB7IGVycm9yKGVycik7IH07XG4gICAgICB9XG5cbiAgICAgIGlmIChjb21wbGV0ZSkge1xuICAgICAgICBjb21wbGV0ZUZuID1cbiAgICAgICAgICAgIHRoaXMuX2lzQXN5bmMgPyAoKSA9PiB7IHNldFRpbWVvdXQoKCkgPT4gY29tcGxldGUoKSk7IH0gOiAoKSA9PiB7IGNvbXBsZXRlKCk7IH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN1cGVyLnN1YnNjcmliZShzY2hlZHVsZXJGbiwgZXJyb3JGbiwgY29tcGxldGVGbik7XG4gIH1cbn1cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jLnRzXG4gKiovIiwiLy8gUHJvbWlzZXMgYXJlIHB1dCBpbnRvIHRoZWlyIG93biBmYWNhZGUgZmlsZSBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgd2l0aG91dFxuLy8gaW50cm9kdWNpbmcgYSBkZXBlbmRlbmN5IG9uIHJ4anMuIFRoZXkgYXJlIHJlLWV4cG9ydGVkIHRocm91Z2ggZmFjYWRlL2FzeW5jLlxuZXhwb3J0IHtQcm9taXNlfTtcblxuZXhwb3J0IGludGVyZmFjZSBQcm9taXNlQ29tcGxldGVyPFI+IHtcbiAgcHJvbWlzZTogUHJvbWlzZTxSPjtcbiAgcmVzb2x2ZTogKHZhbHVlPzogUiB8IFByb21pc2VMaWtlPFI+KSA9PiB2b2lkO1xuICByZWplY3Q6IChlcnJvcj86IGFueSwgc3RhY2tUcmFjZT86IHN0cmluZykgPT4gdm9pZDtcbn1cblxuZXhwb3J0IGNsYXNzIFByb21pc2VXcmFwcGVyIHtcbiAgc3RhdGljIHJlc29sdmU8VD4ob2JqOiBUKTogUHJvbWlzZTxUPiB7IHJldHVybiBQcm9taXNlLnJlc29sdmUob2JqKTsgfVxuXG4gIHN0YXRpYyByZWplY3Qob2JqOiBhbnksIF8pOiBQcm9taXNlPGFueT4geyByZXR1cm4gUHJvbWlzZS5yZWplY3Qob2JqKTsgfVxuXG4gIC8vIE5vdGU6IFdlIGNhbid0IHJlbmFtZSB0aGlzIG1ldGhvZCBpbnRvIGBjYXRjaGAsIGFzIHRoaXMgaXMgbm90IGEgdmFsaWRcbiAgLy8gbWV0aG9kIG5hbWUgaW4gRGFydC5cbiAgc3RhdGljIGNhdGNoRXJyb3I8VD4ocHJvbWlzZTogUHJvbWlzZTxUPixcbiAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcjogKGVycm9yOiBhbnkpID0+IFQgfCBQcm9taXNlTGlrZTxUPik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBwcm9taXNlLmNhdGNoKG9uRXJyb3IpO1xuICB9XG5cbiAgc3RhdGljIGFsbChwcm9taXNlczogYW55W10pOiBQcm9taXNlPGFueT4ge1xuICAgIGlmIChwcm9taXNlcy5sZW5ndGggPT0gMCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfVxuXG4gIHN0YXRpYyB0aGVuPFQsIFU+KHByb21pc2U6IFByb21pc2U8VD4sIHN1Y2Nlc3M6ICh2YWx1ZTogVCkgPT4gVSB8IFByb21pc2VMaWtlPFU+LFxuICAgICAgICAgICAgICAgICAgICByZWplY3Rpb24/OiAoZXJyb3I6IGFueSwgc3RhY2s/OiBhbnkpID0+IFUgfCBQcm9taXNlTGlrZTxVPik6IFByb21pc2U8VT4ge1xuICAgIHJldHVybiBwcm9taXNlLnRoZW4oc3VjY2VzcywgcmVqZWN0aW9uKTtcbiAgfVxuXG4gIHN0YXRpYyB3cmFwPFQ+KGNvbXB1dGF0aW9uOiAoKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXMsIHJlaikgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmVzKGNvbXB1dGF0aW9uKCkpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZWooZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBzdGF0aWMgc2NoZWR1bGVNaWNyb3Rhc2soY29tcHV0YXRpb246ICgpID0+IGFueSk6IHZvaWQge1xuICAgIFByb21pc2VXcmFwcGVyLnRoZW4oUHJvbWlzZVdyYXBwZXIucmVzb2x2ZShudWxsKSwgY29tcHV0YXRpb24sIChfKSA9PiB7fSk7XG4gIH1cblxuICBzdGF0aWMgaXNQcm9taXNlKG9iajogYW55KTogYm9vbGVhbiB7IHJldHVybiBvYmogaW5zdGFuY2VvZiBQcm9taXNlOyB9XG5cbiAgc3RhdGljIGNvbXBsZXRlcigpOiBQcm9taXNlQ29tcGxldGVyPGFueT4ge1xuICAgIHZhciByZXNvbHZlO1xuICAgIHZhciByZWplY3Q7XG5cbiAgICB2YXIgcCA9IG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlcywgcmVqKSB7XG4gICAgICByZXNvbHZlID0gcmVzO1xuICAgICAgcmVqZWN0ID0gcmVqO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtwcm9taXNlOiBwLCByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdH07XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvcHJvbWlzZS50c1xuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82Ml9fO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwgXCJSeFwiXG4gKiogbW9kdWxlIGlkID0gNjJcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82M19fO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInJ4anMvb2JzZXJ2YWJsZS9mcm9tUHJvbWlzZVwiLFwiY29tbW9uanMyXCI6XCJyeGpzL29ic2VydmFibGUvZnJvbVByb21pc2VcIixcImFtZFwiOlwicnhqcy9vYnNlcnZhYmxlL2Zyb21Qcm9taXNlXCIsXCJyb290XCI6W1wiUnhcIixcIk9ic2VydmFibGVcIl19XG4gKiogbW9kdWxlIGlkID0gNjNcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV82NF9fO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInJ4anMvb3BlcmF0b3IvdG9Qcm9taXNlXCIsXCJjb21tb25qczJcIjpcInJ4anMvb3BlcmF0b3IvdG9Qcm9taXNlXCIsXCJhbWRcIjpcInJ4anMvb3BlcmF0b3IvdG9Qcm9taXNlXCIsXCJyb290XCI6W1wiUnhcIixcIk9ic2VydmFibGVcIixcInByb3RvdHlwZVwiXX1cbiAqKiBtb2R1bGUgaWQgPSA2NFxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwiaW1wb3J0IHtOZ1pvbmV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3pvbmUvbmdfem9uZSc7XG5pbXBvcnQge1xuICBUeXBlLFxuICBpc0JsYW5rLFxuICBpc1ByZXNlbnQsXG4gIGFzc2VydGlvbnNFbmFibGVkLFxuICBwcmludCxcbiAgSVNfREFSVFxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtwcm92aWRlLCBQcm92aWRlciwgSW5qZWN0b3IsIE9wYXF1ZVRva2VufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1xuICBBUFBfQ09NUE9ORU5UX1JFRl9QUk9NSVNFLFxuICBBUFBfQ09NUE9ORU5ULFxuICBBUFBfSURfUkFORE9NX1BST1ZJREVSLFxuICBQTEFURk9STV9JTklUSUFMSVpFUixcbiAgQVBQX0lOSVRJQUxJWkVSXG59IGZyb20gJy4vYXBwbGljYXRpb25fdG9rZW5zJztcbmltcG9ydCB7XG4gIFByb21pc2UsXG4gIFByb21pc2VXcmFwcGVyLFxuICBQcm9taXNlQ29tcGxldGVyLFxuICBPYnNlcnZhYmxlV3JhcHBlclxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1Rlc3RhYmlsaXR5UmVnaXN0cnksIFRlc3RhYmlsaXR5fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS90ZXN0YWJpbGl0eS90ZXN0YWJpbGl0eSc7XG5pbXBvcnQge1xuICBDb21wb25lbnRSZWYsXG4gIER5bmFtaWNDb21wb25lbnRMb2FkZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2R5bmFtaWNfY29tcG9uZW50X2xvYWRlcic7XG5pbXBvcnQge1xuICBCYXNlRXhjZXB0aW9uLFxuICBXcmFwcGVkRXhjZXB0aW9uLFxuICBFeGNlcHRpb25IYW5kbGVyLFxuICB1bmltcGxlbWVudGVkXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge2ludGVybmFsVmlld30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcmVmJztcbmltcG9ydCB7Q29uc29sZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY29uc29sZSc7XG5pbXBvcnQge3d0ZkxlYXZlLCB3dGZDcmVhdGVTY29wZSwgV3RmU2NvcGVGbn0gZnJvbSAnLi9wcm9maWxlL3Byb2ZpbGUnO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmltcG9ydCB7bG9ja01vZGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogQ29uc3RydWN0IHByb3ZpZGVycyBzcGVjaWZpYyB0byBhbiBpbmRpdmlkdWFsIHJvb3QgY29tcG9uZW50LlxuICovXG5mdW5jdGlvbiBfY29tcG9uZW50UHJvdmlkZXJzKGFwcENvbXBvbmVudFR5cGU6IFR5cGUpOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4ge1xuICByZXR1cm4gW1xuICAgIHByb3ZpZGUoQVBQX0NPTVBPTkVOVCwge3VzZVZhbHVlOiBhcHBDb21wb25lbnRUeXBlfSksXG4gICAgcHJvdmlkZShBUFBfQ09NUE9ORU5UX1JFRl9QUk9NSVNFLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB1c2VGYWN0b3J5OiAoZHluYW1pY0NvbXBvbmVudExvYWRlcjogRHluYW1pY0NvbXBvbmVudExvYWRlciwgYXBwUmVmOiBBcHBsaWNhdGlvblJlZl8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBDb21wb25lbnRSZWYgZm9yIGRpc3Bvc2FsIGxhdGVyLlxuICAgICAgICAgICAgICAgIHZhciByZWY6IENvbXBvbmVudFJlZjtcbiAgICAgICAgICAgICAgICAvLyBUT0RPKHJhZG8pOiBpbnZlc3RpZ2F0ZSB3aGV0aGVyIHRvIHN1cHBvcnQgcHJvdmlkZXJzIG9uIHJvb3QgY29tcG9uZW50LlxuICAgICAgICAgICAgICAgIHJldHVybiBkeW5hbWljQ29tcG9uZW50TG9hZGVyLmxvYWRBc1Jvb3QoYXBwQ29tcG9uZW50VHlwZSwgbnVsbCwgaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7IGFwcFJlZi5fdW5sb2FkQ29tcG9uZW50KHJlZik7IH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChjb21wb25lbnRSZWYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZWYgPSBjb21wb25lbnRSZWY7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChjb21wb25lbnRSZWYubG9jYXRpb24ubmF0aXZlRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdG9yLmdldChUZXN0YWJpbGl0eVJlZ2lzdHJ5KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWdpc3RlckFwcGxpY2F0aW9uKGNvbXBvbmVudFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdG9yLmdldChUZXN0YWJpbGl0eSkpO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50UmVmO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgZGVwczogW0R5bmFtaWNDb21wb25lbnRMb2FkZXIsIEFwcGxpY2F0aW9uUmVmLCBJbmplY3Rvcl1cbiAgICAgICAgICAgIH0pLFxuICAgIHByb3ZpZGUoYXBwQ29tcG9uZW50VHlwZSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdXNlRmFjdG9yeTogKHA6IFByb21pc2U8YW55PikgPT4gcC50aGVuKHJlZiA9PiByZWYuaW5zdGFuY2UpLFxuICAgICAgICAgICAgICBkZXBzOiBbQVBQX0NPTVBPTkVOVF9SRUZfUFJPTUlTRV1cbiAgICAgICAgICAgIH0pLFxuICBdO1xufVxuXG4vKipcbiAqIENyZWF0ZSBhbiBBbmd1bGFyIHpvbmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVOZ1pvbmUoKTogTmdab25lIHtcbiAgcmV0dXJuIG5ldyBOZ1pvbmUoe2VuYWJsZUxvbmdTdGFja1RyYWNlOiBhc3NlcnRpb25zRW5hYmxlZCgpfSk7XG59XG5cbnZhciBfcGxhdGZvcm06IFBsYXRmb3JtUmVmO1xudmFyIF9wbGF0Zm9ybVByb3ZpZGVyczogYW55W107XG5cbi8qKlxuICogSW5pdGlhbGl6ZSB0aGUgQW5ndWxhciAncGxhdGZvcm0nIG9uIHRoZSBwYWdlLlxuICpcbiAqIFNlZSB7QGxpbmsgUGxhdGZvcm1SZWZ9IGZvciBkZXRhaWxzIG9uIHRoZSBBbmd1bGFyIHBsYXRmb3JtLlxuICpcbiAqIEl0IGlzIGFsc28gcG9zc2libGUgdG8gc3BlY2lmeSBwcm92aWRlcnMgdG8gYmUgbWFkZSBpbiB0aGUgbmV3IHBsYXRmb3JtLiBUaGVzZSBwcm92aWRlcnNcbiAqIHdpbGwgYmUgc2hhcmVkIGJldHdlZW4gYWxsIGFwcGxpY2F0aW9ucyBvbiB0aGUgcGFnZS4gRm9yIGV4YW1wbGUsIGFuIGFic3RyYWN0aW9uIGZvclxuICogdGhlIGJyb3dzZXIgY29va2llIGphciBzaG91bGQgYmUgYm91bmQgYXQgdGhlIHBsYXRmb3JtIGxldmVsLCBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lXG4gKiBjb29raWUgamFyIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgYXBwbGljYXRpb25zIG9uIHRoZSBwYWdlIHdpbGwgYmUgYWNjZXNzaW5nIGl0LlxuICpcbiAqIFRoZSBwbGF0Zm9ybSBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIGFzIGxvbmcgYXMgdGhlIHNhbWUgbGlzdCBvZiBwcm92aWRlcnNcbiAqIGlzIHBhc3NlZCBpbnRvIGVhY2ggY2FsbC4gSWYgdGhlIHBsYXRmb3JtIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEgZGlmZmVyZW50IHNldCBvZlxuICogcHJvdmlkZXMsIEFuZ3VsYXIgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwbGF0Zm9ybShwcm92aWRlcnM/OiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiBQbGF0Zm9ybVJlZiB7XG4gIGxvY2tNb2RlKCk7XG4gIGlmIChpc1ByZXNlbnQoX3BsYXRmb3JtKSkge1xuICAgIGlmIChMaXN0V3JhcHBlci5lcXVhbHMoX3BsYXRmb3JtUHJvdmlkZXJzLCBwcm92aWRlcnMpKSB7XG4gICAgICByZXR1cm4gX3BsYXRmb3JtO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcInBsYXRmb3JtIGNhbm5vdCBiZSBpbml0aWFsaXplZCB3aXRoIGRpZmZlcmVudCBzZXRzIG9mIHByb3ZpZGVycy5cIik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBfY3JlYXRlUGxhdGZvcm0ocHJvdmlkZXJzKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3Bvc2UgdGhlIGV4aXN0aW5nIHBsYXRmb3JtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZVBsYXRmb3JtKCk6IHZvaWQge1xuICBpZiAoaXNQcmVzZW50KF9wbGF0Zm9ybSkpIHtcbiAgICBfcGxhdGZvcm0uZGlzcG9zZSgpO1xuICAgIF9wbGF0Zm9ybSA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVBsYXRmb3JtKHByb3ZpZGVycz86IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IFBsYXRmb3JtUmVmIHtcbiAgX3BsYXRmb3JtUHJvdmlkZXJzID0gcHJvdmlkZXJzO1xuICBsZXQgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKHByb3ZpZGVycyk7XG4gIF9wbGF0Zm9ybSA9IG5ldyBQbGF0Zm9ybVJlZl8oaW5qZWN0b3IsICgpID0+IHtcbiAgICBfcGxhdGZvcm0gPSBudWxsO1xuICAgIF9wbGF0Zm9ybVByb3ZpZGVycyA9IG51bGw7XG4gIH0pO1xuICBfcnVuUGxhdGZvcm1Jbml0aWFsaXplcnMoaW5qZWN0b3IpO1xuICByZXR1cm4gX3BsYXRmb3JtO1xufVxuXG5mdW5jdGlvbiBfcnVuUGxhdGZvcm1Jbml0aWFsaXplcnMoaW5qZWN0b3I6IEluamVjdG9yKTogdm9pZCB7XG4gIGxldCBpbml0czogRnVuY3Rpb25bXSA9IGluamVjdG9yLmdldE9wdGlvbmFsKFBMQVRGT1JNX0lOSVRJQUxJWkVSKTtcbiAgaWYgKGlzUHJlc2VudChpbml0cykpIGluaXRzLmZvckVhY2goaW5pdCA9PiBpbml0KCkpO1xufVxuXG4vKipcbiAqIFRoZSBBbmd1bGFyIHBsYXRmb3JtIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgQW5ndWxhciBvbiBhIHdlYiBwYWdlLiBFYWNoIHBhZ2VcbiAqIGhhcyBleGFjdGx5IG9uZSBwbGF0Zm9ybSwgYW5kIHNlcnZpY2VzIChzdWNoIGFzIHJlZmxlY3Rpb24pIHdoaWNoIGFyZSBjb21tb25cbiAqIHRvIGV2ZXJ5IEFuZ3VsYXIgYXBwbGljYXRpb24gcnVubmluZyBvbiB0aGUgcGFnZSBhcmUgYm91bmQgaW4gaXRzIHNjb3BlLlxuICpcbiAqIEEgcGFnZSdzIHBsYXRmb3JtIGlzIGluaXRpYWxpemVkIGltcGxpY2l0bHkgd2hlbiB7QGxpbmsgYm9vdHN0cmFwfSgpIGlzIGNhbGxlZCwgb3JcbiAqIGV4cGxpY2l0bHkgYnkgY2FsbGluZyB7QGxpbmsgcGxhdGZvcm19KCkuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBQbGF0Zm9ybVJlZiB7XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBwbGF0Zm9ybSBpcyBkaXNwb3NlZC5cbiAgICovXG4gIGFic3RyYWN0IHJlZ2lzdGVyRGlzcG9zZUxpc3RlbmVyKGRpc3Bvc2U6ICgpID0+IHZvaWQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgcGxhdGZvcm0ge0BsaW5rIEluamVjdG9yfSwgd2hpY2ggaXMgdGhlIHBhcmVudCBpbmplY3RvciBmb3JcbiAgICogZXZlcnkgQW5ndWxhciBhcHBsaWNhdGlvbiBvbiB0aGUgcGFnZSBhbmQgcHJvdmlkZXMgc2luZ2xldG9uIHByb3ZpZGVycy5cbiAgICovXG4gIGdldCBpbmplY3RvcigpOiBJbmplY3RvciB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG5cbiAgLyoqXG4gICAqIEluc3RhbnRpYXRlIGEgbmV3IEFuZ3VsYXIgYXBwbGljYXRpb24gb24gdGhlIHBhZ2UuXG4gICAqXG4gICAqICMjIyBXaGF0IGlzIGFuIGFwcGxpY2F0aW9uP1xuICAgKlxuICAgKiBFYWNoIEFuZ3VsYXIgYXBwbGljYXRpb24gaGFzIGl0cyBvd24gem9uZSwgY2hhbmdlIGRldGVjdGlvbiwgY29tcGlsZXIsXG4gICAqIHJlbmRlcmVyLCBhbmQgb3RoZXIgZnJhbWV3b3JrIGNvbXBvbmVudHMuIEFuIGFwcGxpY2F0aW9uIGhvc3RzIG9uZSBvciBtb3JlXG4gICAqIHJvb3QgY29tcG9uZW50cywgd2hpY2ggY2FuIGJlIGluaXRpYWxpemVkIHZpYSBgQXBwbGljYXRpb25SZWYuYm9vdHN0cmFwKClgLlxuICAgKlxuICAgKiAjIyMgQXBwbGljYXRpb24gUHJvdmlkZXJzXG4gICAqXG4gICAqIEFuZ3VsYXIgYXBwbGljYXRpb25zIHJlcXVpcmUgbnVtZXJvdXMgcHJvdmlkZXJzIHRvIGJlIHByb3Blcmx5IGluc3RhbnRpYXRlZC5cbiAgICogV2hlbiB1c2luZyBgYXBwbGljYXRpb24oKWAgdG8gY3JlYXRlIGEgbmV3IGFwcCBvbiB0aGUgcGFnZSwgdGhlc2UgcHJvdmlkZXJzXG4gICAqIG11c3QgYmUgcHJvdmlkZWQuIEZvcnR1bmF0ZWx5LCB0aGVyZSBhcmUgaGVscGVyIGZ1bmN0aW9ucyB0byBjb25maWd1cmVcbiAgICogdHlwaWNhbCBwcm92aWRlcnMsIGFzIHNob3duIGluIHRoZSBleGFtcGxlIGJlbG93LlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgY29yZS90cy9wbGF0Zm9ybS9wbGF0Zm9ybS50cyByZWdpb249J2xvbmdmb3JtJ31cbiAgICogIyMjIFNlZSBBbHNvXG4gICAqXG4gICAqIFNlZSB0aGUge0BsaW5rIGJvb3RzdHJhcH0gZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBkZXRhaWxzLlxuICAgKi9cbiAgYWJzdHJhY3QgYXBwbGljYXRpb24ocHJvdmlkZXJzOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiBBcHBsaWNhdGlvblJlZjtcblxuICAvKipcbiAgICogSW5zdGFudGlhdGUgYSBuZXcgQW5ndWxhciBhcHBsaWNhdGlvbiBvbiB0aGUgcGFnZSwgdXNpbmcgcHJvdmlkZXJzIHdoaWNoXG4gICAqIGFyZSBvbmx5IGF2YWlsYWJsZSBhc3luY2hyb25vdXNseS4gT25lIHN1Y2ggdXNlIGNhc2UgaXMgdG8gaW5pdGlhbGl6ZSBhblxuICAgKiBhcHBsaWNhdGlvbiBydW5uaW5nIGluIGEgd2ViIHdvcmtlci5cbiAgICpcbiAgICogIyMjIFVzYWdlXG4gICAqXG4gICAqIGBiaW5kaW5nRm5gIGlzIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgbmV3IGFwcGxpY2F0aW9uJ3Mgem9uZS5cbiAgICogSXQgc2hvdWxkIHJldHVybiBhIGBQcm9taXNlYCB0byBhIGxpc3Qgb2YgcHJvdmlkZXJzIHRvIGJlIHVzZWQgZm9yIHRoZVxuICAgKiBuZXcgYXBwbGljYXRpb24uIE9uY2UgdGhpcyBwcm9taXNlIHJlc29sdmVzLCB0aGUgYXBwbGljYXRpb24gd2lsbCBiZVxuICAgKiBjb25zdHJ1Y3RlZCBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgYSBub3JtYWwgYGFwcGxpY2F0aW9uKClgLlxuICAgKi9cbiAgYWJzdHJhY3QgYXN5bmNBcHBsaWNhdGlvbihiaW5kaW5nRm46ICh6b25lOiBOZ1pvbmUpID0+IFByb21pc2U8QXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+PixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM/OiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiBQcm9taXNlPEFwcGxpY2F0aW9uUmVmPjtcblxuICAvKipcbiAgICogRGVzdHJveSB0aGUgQW5ndWxhciBwbGF0Zm9ybSBhbmQgYWxsIEFuZ3VsYXIgYXBwbGljYXRpb25zIG9uIHRoZSBwYWdlLlxuICAgKi9cbiAgYWJzdHJhY3QgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgUGxhdGZvcm1SZWZfIGV4dGVuZHMgUGxhdGZvcm1SZWYge1xuICAvKiogQGludGVybmFsICovXG4gIF9hcHBsaWNhdGlvbnM6IEFwcGxpY2F0aW9uUmVmW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGlzcG9zZUxpc3RlbmVyczogRnVuY3Rpb25bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvciwgcHJpdmF0ZSBfZGlzcG9zZTogKCkgPT4gdm9pZCkgeyBzdXBlcigpOyB9XG5cbiAgcmVnaXN0ZXJEaXNwb3NlTGlzdGVuZXIoZGlzcG9zZTogKCkgPT4gdm9pZCk6IHZvaWQgeyB0aGlzLl9kaXNwb3NlTGlzdGVuZXJzLnB1c2goZGlzcG9zZSk7IH1cblxuICBnZXQgaW5qZWN0b3IoKTogSW5qZWN0b3IgeyByZXR1cm4gdGhpcy5faW5qZWN0b3I7IH1cblxuICBhcHBsaWNhdGlvbihwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IEFwcGxpY2F0aW9uUmVmIHtcbiAgICB2YXIgYXBwID0gdGhpcy5faW5pdEFwcChjcmVhdGVOZ1pvbmUoKSwgcHJvdmlkZXJzKTtcbiAgICByZXR1cm4gYXBwO1xuICB9XG5cbiAgYXN5bmNBcHBsaWNhdGlvbihiaW5kaW5nRm46ICh6b25lOiBOZ1pvbmUpID0+IFByb21pc2U8QXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+PixcbiAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvdmlkZXJzPzogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+KTogUHJvbWlzZTxBcHBsaWNhdGlvblJlZj4ge1xuICAgIHZhciB6b25lID0gY3JlYXRlTmdab25lKCk7XG4gICAgdmFyIGNvbXBsZXRlciA9IFByb21pc2VXcmFwcGVyLmNvbXBsZXRlcigpO1xuICAgIHpvbmUucnVuKCgpID0+IHtcbiAgICAgIFByb21pc2VXcmFwcGVyLnRoZW4oYmluZGluZ0ZuKHpvbmUpLCAocHJvdmlkZXJzOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pID0+IHtcbiAgICAgICAgaWYgKGlzUHJlc2VudChhZGRpdGlvbmFsUHJvdmlkZXJzKSkge1xuICAgICAgICAgIHByb3ZpZGVycyA9IExpc3RXcmFwcGVyLmNvbmNhdChwcm92aWRlcnMsIGFkZGl0aW9uYWxQcm92aWRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIGNvbXBsZXRlci5yZXNvbHZlKHRoaXMuX2luaXRBcHAoem9uZSwgcHJvdmlkZXJzKSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29tcGxldGVyLnByb21pc2U7XG4gIH1cblxuICBwcml2YXRlIF9pbml0QXBwKHpvbmU6IE5nWm9uZSwgcHJvdmlkZXJzOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiBBcHBsaWNhdGlvblJlZiB7XG4gICAgdmFyIGluamVjdG9yOiBJbmplY3RvcjtcbiAgICB2YXIgYXBwOiBBcHBsaWNhdGlvblJlZjtcbiAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICBwcm92aWRlcnMgPSBMaXN0V3JhcHBlci5jb25jYXQocHJvdmlkZXJzLCBbXG4gICAgICAgIHByb3ZpZGUoTmdab25lLCB7dXNlVmFsdWU6IHpvbmV9KSxcbiAgICAgICAgcHJvdmlkZShBcHBsaWNhdGlvblJlZiwge3VzZUZhY3Rvcnk6ICgpOiBBcHBsaWNhdGlvblJlZiA9PiBhcHAsIGRlcHM6IFtdfSlcbiAgICAgIF0pO1xuXG4gICAgICB2YXIgZXhjZXB0aW9uSGFuZGxlcjtcbiAgICAgIHRyeSB7XG4gICAgICAgIGluamVjdG9yID0gdGhpcy5pbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlQ2hpbGQocHJvdmlkZXJzKTtcbiAgICAgICAgZXhjZXB0aW9uSGFuZGxlciA9IGluamVjdG9yLmdldChFeGNlcHRpb25IYW5kbGVyKTtcbiAgICAgICAgem9uZS5vdmVycmlkZU9uRXJyb3JIYW5kbGVyKChlLCBzKSA9PiBleGNlcHRpb25IYW5kbGVyLmNhbGwoZSwgcykpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoaXNQcmVzZW50KGV4Y2VwdGlvbkhhbmRsZXIpKSB7XG4gICAgICAgICAgZXhjZXB0aW9uSGFuZGxlci5jYWxsKGUsIGUuc3RhY2spO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHByaW50KGUudG9TdHJpbmcoKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICBhcHAgPSBuZXcgQXBwbGljYXRpb25SZWZfKHRoaXMsIHpvbmUsIGluamVjdG9yKTtcbiAgICB0aGlzLl9hcHBsaWNhdGlvbnMucHVzaChhcHApO1xuICAgIF9ydW5BcHBJbml0aWFsaXplcnMoaW5qZWN0b3IpO1xuICAgIHJldHVybiBhcHA7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIExpc3RXcmFwcGVyLmNsb25lKHRoaXMuX2FwcGxpY2F0aW9ucykuZm9yRWFjaCgoYXBwKSA9PiBhcHAuZGlzcG9zZSgpKTtcbiAgICB0aGlzLl9kaXNwb3NlTGlzdGVuZXJzLmZvckVhY2goKGRpc3Bvc2UpID0+IGRpc3Bvc2UoKSk7XG4gICAgdGhpcy5fZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfYXBwbGljYXRpb25EaXNwb3NlZChhcHA6IEFwcGxpY2F0aW9uUmVmKTogdm9pZCB7IExpc3RXcmFwcGVyLnJlbW92ZSh0aGlzLl9hcHBsaWNhdGlvbnMsIGFwcCk7IH1cbn1cblxuZnVuY3Rpb24gX3J1bkFwcEluaXRpYWxpemVycyhpbmplY3RvcjogSW5qZWN0b3IpOiB2b2lkIHtcbiAgbGV0IGluaXRzOiBGdW5jdGlvbltdID0gaW5qZWN0b3IuZ2V0T3B0aW9uYWwoQVBQX0lOSVRJQUxJWkVSKTtcbiAgaWYgKGlzUHJlc2VudChpbml0cykpIGluaXRzLmZvckVhY2goaW5pdCA9PiBpbml0KCkpO1xufVxuXG4vKipcbiAqIEEgcmVmZXJlbmNlIHRvIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gcnVubmluZyBvbiBhIHBhZ2UuXG4gKlxuICogRm9yIG1vcmUgYWJvdXQgQW5ndWxhciBhcHBsaWNhdGlvbnMsIHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3Ige0BsaW5rIGJvb3RzdHJhcH0uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBBcHBsaWNhdGlvblJlZiB7XG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIHRvIGJlIGNhbGxlZCBlYWNoIHRpbWUgYGJvb3RzdHJhcCgpYCBpcyBjYWxsZWQgdG8gYm9vdHN0cmFwXG4gICAqIGEgbmV3IHJvb3QgY29tcG9uZW50LlxuICAgKi9cbiAgYWJzdHJhY3QgcmVnaXN0ZXJCb290c3RyYXBMaXN0ZW5lcihsaXN0ZW5lcjogKHJlZjogQ29tcG9uZW50UmVmKSA9PiB2b2lkKTogdm9pZDtcblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gaXMgZGlzcG9zZWQuXG4gICAqL1xuICBhYnN0cmFjdCByZWdpc3RlckRpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlOiAoKSA9PiB2b2lkKTogdm9pZDtcblxuICAvKipcbiAgICogQm9vdHN0cmFwIGEgbmV3IGNvbXBvbmVudCBhdCB0aGUgcm9vdCBsZXZlbCBvZiB0aGUgYXBwbGljYXRpb24uXG4gICAqXG4gICAqICMjIyBCb290c3RyYXAgcHJvY2Vzc1xuICAgKlxuICAgKiBXaGVuIGJvb3RzdHJhcHBpbmcgYSBuZXcgcm9vdCBjb21wb25lbnQgaW50byBhbiBhcHBsaWNhdGlvbiwgQW5ndWxhciBtb3VudHMgdGhlXG4gICAqIHNwZWNpZmllZCBhcHBsaWNhdGlvbiBjb21wb25lbnQgb250byBET00gZWxlbWVudHMgaWRlbnRpZmllZCBieSB0aGUgW2NvbXBvbmVudFR5cGVdJ3NcbiAgICogc2VsZWN0b3IgYW5kIGtpY2tzIG9mZiBhdXRvbWF0aWMgY2hhbmdlIGRldGVjdGlvbiB0byBmaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSBjb21wb25lbnQuXG4gICAqXG4gICAqICMjIyBPcHRpb25hbCBQcm92aWRlcnNcbiAgICpcbiAgICogUHJvdmlkZXJzIGZvciB0aGUgZ2l2ZW4gY29tcG9uZW50IGNhbiBvcHRpb25hbGx5IGJlIG92ZXJyaWRkZW4gdmlhIHRoZSBgcHJvdmlkZXJzYFxuICAgKiBwYXJhbWV0ZXIuIFRoZXNlIHByb3ZpZGVycyB3aWxsIG9ubHkgYXBwbHkgZm9yIHRoZSByb290IGNvbXBvbmVudCBiZWluZyBhZGRlZCBhbmQgYW55XG4gICAqIGNoaWxkIGNvbXBvbmVudHMgdW5kZXIgaXQuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqIHtAZXhhbXBsZSBjb3JlL3RzL3BsYXRmb3JtL3BsYXRmb3JtLnRzIHJlZ2lvbj0nbG9uZ2Zvcm0nfVxuICAgKi9cbiAgYWJzdHJhY3QgYm9vdHN0cmFwKGNvbXBvbmVudFR5cGU6IFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM/OiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiBQcm9taXNlPENvbXBvbmVudFJlZj47XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBhcHBsaWNhdGlvbiB7QGxpbmsgSW5qZWN0b3J9LlxuICAgKi9cbiAgZ2V0IGluamVjdG9yKCk6IEluamVjdG9yIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIGFwcGxpY2F0aW9uIHtAbGluayBOZ1pvbmV9LlxuICAgKi9cbiAgZ2V0IHpvbmUoKTogTmdab25lIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogRGlzcG9zZSBvZiB0aGlzIGFwcGxpY2F0aW9uIGFuZCBhbGwgb2YgaXRzIGNvbXBvbmVudHMuXG4gICAqL1xuICBhYnN0cmFjdCBkaXNwb3NlKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIEludm9rZSB0aGlzIG1ldGhvZCB0byBleHBsaWNpdGx5IHByb2Nlc3MgY2hhbmdlIGRldGVjdGlvbiBhbmQgaXRzIHNpZGUtZWZmZWN0cy5cbiAgICpcbiAgICogSW4gZGV2ZWxvcG1lbnQgbW9kZSwgYHRpY2soKWAgYWxzbyBwZXJmb3JtcyBhIHNlY29uZCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlIHRvIGVuc3VyZSB0aGF0IG5vXG4gICAqIGZ1cnRoZXIgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuIElmIGFkZGl0aW9uYWwgY2hhbmdlcyBhcmUgcGlja2VkIHVwIGR1cmluZyB0aGlzIHNlY29uZCBjeWNsZSxcbiAgICogYmluZGluZ3MgaW4gdGhlIGFwcCBoYXZlIHNpZGUtZWZmZWN0cyB0aGF0IGNhbm5vdCBiZSByZXNvbHZlZCBpbiBhIHNpbmdsZSBjaGFuZ2UgZGV0ZWN0aW9uXG4gICAqIHBhc3MuXG4gICAqIEluIHRoaXMgY2FzZSwgQW5ndWxhciB0aHJvd3MgYW4gZXJyb3IsIHNpbmNlIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gY2FuIG9ubHkgaGF2ZSBvbmUgY2hhbmdlXG4gICAqIGRldGVjdGlvbiBwYXNzIGR1cmluZyB3aGljaCBhbGwgY2hhbmdlIGRldGVjdGlvbiBtdXN0IGNvbXBsZXRlLlxuICAgKi9cbiAgYWJzdHJhY3QgdGljaygpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBHZXQgYSBsaXN0IG9mIGNvbXBvbmVudCB0eXBlcyByZWdpc3RlcmVkIHRvIHRoaXMgYXBwbGljYXRpb24uXG4gICAqL1xuICBnZXQgY29tcG9uZW50VHlwZXMoKTogVHlwZVtdIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcbn1cblxuZXhwb3J0IGNsYXNzIEFwcGxpY2F0aW9uUmVmXyBleHRlbmRzIEFwcGxpY2F0aW9uUmVmIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX3RpY2tTY29wZTogV3RmU2NvcGVGbiA9IHd0ZkNyZWF0ZVNjb3BlKCdBcHBsaWNhdGlvblJlZiN0aWNrKCknKTtcblxuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2Jvb3RzdHJhcExpc3RlbmVyczogRnVuY3Rpb25bXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2Rpc3Bvc2VMaXN0ZW5lcnM6IEZ1bmN0aW9uW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9yb290Q29tcG9uZW50czogQ29tcG9uZW50UmVmW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9yb290Q29tcG9uZW50VHlwZXM6IFR5cGVbXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX2NoYW5nZURldGVjdG9yUmVmczogQ2hhbmdlRGV0ZWN0b3JSZWZbXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIHByaXZhdGUgX3J1bm5pbmdUaWNrOiBib29sZWFuID0gZmFsc2U7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBfZW5mb3JjZU5vTmV3Q2hhbmdlczogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3BsYXRmb3JtOiBQbGF0Zm9ybVJlZl8sIHByaXZhdGUgX3pvbmU6IE5nWm9uZSwgcHJpdmF0ZSBfaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3pvbmUpKSB7XG4gICAgICBPYnNlcnZhYmxlV3JhcHBlci5zdWJzY3JpYmUodGhpcy5fem9uZS5vblR1cm5Eb25lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfKSA9PiB7IHRoaXMuX3pvbmUucnVuKCgpID0+IHsgdGhpcy50aWNrKCk7IH0pOyB9KTtcbiAgICB9XG4gICAgdGhpcy5fZW5mb3JjZU5vTmV3Q2hhbmdlcyA9IGFzc2VydGlvbnNFbmFibGVkKCk7XG4gIH1cblxuICByZWdpc3RlckJvb3RzdHJhcExpc3RlbmVyKGxpc3RlbmVyOiAocmVmOiBDb21wb25lbnRSZWYpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLl9ib290c3RyYXBMaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gIH1cblxuICByZWdpc3RlckRpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlOiAoKSA9PiB2b2lkKTogdm9pZCB7IHRoaXMuX2Rpc3Bvc2VMaXN0ZW5lcnMucHVzaChkaXNwb3NlKTsgfVxuXG4gIHJlZ2lzdGVyQ2hhbmdlRGV0ZWN0b3IoY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmKTogdm9pZCB7XG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWZzLnB1c2goY2hhbmdlRGV0ZWN0b3IpO1xuICB9XG5cbiAgdW5yZWdpc3RlckNoYW5nZURldGVjdG9yKGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZik6IHZvaWQge1xuICAgIExpc3RXcmFwcGVyLnJlbW92ZSh0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZnMsIGNoYW5nZURldGVjdG9yKTtcbiAgfVxuXG4gIGJvb3RzdHJhcChjb21wb25lbnRUeXBlOiBUeXBlLFxuICAgICAgICAgICAgcHJvdmlkZXJzPzogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+KTogUHJvbWlzZTxDb21wb25lbnRSZWY+IHtcbiAgICB2YXIgY29tcGxldGVyID0gUHJvbWlzZVdyYXBwZXIuY29tcGxldGVyKCk7XG4gICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgdmFyIGNvbXBvbmVudFByb3ZpZGVycyA9IF9jb21wb25lbnRQcm92aWRlcnMoY29tcG9uZW50VHlwZSk7XG4gICAgICBpZiAoaXNQcmVzZW50KHByb3ZpZGVycykpIHtcbiAgICAgICAgY29tcG9uZW50UHJvdmlkZXJzLnB1c2gocHJvdmlkZXJzKTtcbiAgICAgIH1cbiAgICAgIHZhciBleGNlcHRpb25IYW5kbGVyID0gdGhpcy5faW5qZWN0b3IuZ2V0KEV4Y2VwdGlvbkhhbmRsZXIpO1xuICAgICAgdGhpcy5fcm9vdENvbXBvbmVudFR5cGVzLnB1c2goY29tcG9uZW50VHlwZSk7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgaW5qZWN0b3I6IEluamVjdG9yID0gdGhpcy5faW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZUNoaWxkKGNvbXBvbmVudFByb3ZpZGVycyk7XG4gICAgICAgIHZhciBjb21wUmVmVG9rZW46IFByb21pc2U8Q29tcG9uZW50UmVmPiA9IGluamVjdG9yLmdldChBUFBfQ09NUE9ORU5UX1JFRl9QUk9NSVNFKTtcbiAgICAgICAgdmFyIHRpY2sgPSAoY29tcG9uZW50UmVmKSA9PiB7XG4gICAgICAgICAgdGhpcy5fbG9hZENvbXBvbmVudChjb21wb25lbnRSZWYpO1xuICAgICAgICAgIGNvbXBsZXRlci5yZXNvbHZlKGNvbXBvbmVudFJlZik7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHRpY2tSZXN1bHQgPSBQcm9taXNlV3JhcHBlci50aGVuKGNvbXBSZWZUb2tlbiwgdGljayk7XG5cbiAgICAgICAgLy8gVEhJUyBNVVNUIE9OTFkgUlVOIElOIERBUlQuXG4gICAgICAgIC8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gcmVwb3J0IGFuIGVycm9yIHdoZW4gbm8gY29tcG9uZW50cyB3aXRoIGEgbWF0Y2hpbmcgc2VsZWN0b3IgZm91bmQuXG4gICAgICAgIC8vIE90aGVyd2lzZSB0aGUgcHJvbWlzZSB3aWxsIG5ldmVyIGJlIGNvbXBsZXRlZC5cbiAgICAgICAgLy8gRG9pbmcgdGhpcyBpbiBKUyBjYXVzZXMgYW4gZXh0cmEgZXJyb3IgbWVzc2FnZSB0byBhcHBlYXIuXG4gICAgICAgIGlmIChJU19EQVJUKSB7XG4gICAgICAgICAgUHJvbWlzZVdyYXBwZXIudGhlbih0aWNrUmVzdWx0LCAoXykgPT4ge30pO1xuICAgICAgICB9XG5cbiAgICAgICAgUHJvbWlzZVdyYXBwZXIudGhlbih0aWNrUmVzdWx0LCBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlcnIsIHN0YWNrVHJhY2UpID0+IGNvbXBsZXRlci5yZWplY3QoZXJyLCBzdGFja1RyYWNlKSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIuY2FsbChlLCBlLnN0YWNrKTtcbiAgICAgICAgY29tcGxldGVyLnJlamVjdChlLCBlLnN0YWNrKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gY29tcGxldGVyLnByb21pc2UudGhlbihfID0+IHtcbiAgICAgIGxldCBjID0gdGhpcy5faW5qZWN0b3IuZ2V0KENvbnNvbGUpO1xuICAgICAgbGV0IG1vZGVEZXNjcmlwdGlvbiA9XG4gICAgICAgICAgYXNzZXJ0aW9uc0VuYWJsZWQoKSA/XG4gICAgICAgICAgICAgIFwiaW4gdGhlIGRldmVsb3BtZW50IG1vZGUuIENhbGwgZW5hYmxlUHJvZE1vZGUoKSB0byBlbmFibGUgdGhlIHByb2R1Y3Rpb24gbW9kZS5cIiA6XG4gICAgICAgICAgICAgIFwiaW4gdGhlIHByb2R1Y3Rpb24gbW9kZS4gQ2FsbCBlbmFibGVEZXZNb2RlKCkgdG8gZW5hYmxlIHRoZSBkZXZlbG9wbWVudCBtb2RlLlwiO1xuICAgICAgYy5sb2coYEFuZ3VsYXIgMiBpcyBydW5uaW5nICR7bW9kZURlc2NyaXB0aW9ufWApO1xuICAgICAgcmV0dXJuIF87XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9sb2FkQ29tcG9uZW50KHJlZik6IHZvaWQge1xuICAgIHZhciBhcHBDaGFuZ2VEZXRlY3RvciA9IGludGVybmFsVmlldyhyZWYuaG9zdFZpZXcpLmNoYW5nZURldGVjdG9yO1xuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmcy5wdXNoKGFwcENoYW5nZURldGVjdG9yLnJlZik7XG4gICAgdGhpcy50aWNrKCk7XG4gICAgdGhpcy5fcm9vdENvbXBvbmVudHMucHVzaChyZWYpO1xuICAgIHRoaXMuX2Jvb3RzdHJhcExpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5lcikgPT4gbGlzdGVuZXIocmVmKSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF91bmxvYWRDb21wb25lbnQocmVmKTogdm9pZCB7XG4gICAgaWYgKCFMaXN0V3JhcHBlci5jb250YWlucyh0aGlzLl9yb290Q29tcG9uZW50cywgcmVmKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnVucmVnaXN0ZXJDaGFuZ2VEZXRlY3RvcihpbnRlcm5hbFZpZXcocmVmLmhvc3RWaWV3KS5jaGFuZ2VEZXRlY3Rvci5yZWYpO1xuICAgIExpc3RXcmFwcGVyLnJlbW92ZSh0aGlzLl9yb290Q29tcG9uZW50cywgcmVmKTtcbiAgfVxuXG4gIGdldCBpbmplY3RvcigpOiBJbmplY3RvciB7IHJldHVybiB0aGlzLl9pbmplY3RvcjsgfVxuXG4gIGdldCB6b25lKCk6IE5nWm9uZSB7IHJldHVybiB0aGlzLl96b25lOyB9XG5cbiAgdGljaygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fcnVubmluZ1RpY2spIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFwiQXBwbGljYXRpb25SZWYudGljayBpcyBjYWxsZWQgcmVjdXJzaXZlbHlcIik7XG4gICAgfVxuXG4gICAgdmFyIHMgPSBBcHBsaWNhdGlvblJlZl8uX3RpY2tTY29wZSgpO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLl9ydW5uaW5nVGljayA9IHRydWU7XG4gICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZnMuZm9yRWFjaCgoZGV0ZWN0b3IpID0+IGRldGVjdG9yLmRldGVjdENoYW5nZXMoKSk7XG4gICAgICBpZiAodGhpcy5fZW5mb3JjZU5vTmV3Q2hhbmdlcykge1xuICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZnMuZm9yRWFjaCgoZGV0ZWN0b3IpID0+IGRldGVjdG9yLmNoZWNrTm9DaGFuZ2VzKCkpO1xuICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICB0aGlzLl9ydW5uaW5nVGljayA9IGZhbHNlO1xuICAgICAgd3RmTGVhdmUocyk7XG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAvLyBUT0RPKGFseGh1Yik6IERpc3Bvc2Ugb2YgdGhlIE5nWm9uZS5cbiAgICBMaXN0V3JhcHBlci5jbG9uZSh0aGlzLl9yb290Q29tcG9uZW50cykuZm9yRWFjaCgocmVmKSA9PiByZWYuZGlzcG9zZSgpKTtcbiAgICB0aGlzLl9kaXNwb3NlTGlzdGVuZXJzLmZvckVhY2goKGRpc3Bvc2UpID0+IGRpc3Bvc2UoKSk7XG4gICAgdGhpcy5fcGxhdGZvcm0uX2FwcGxpY2F0aW9uRGlzcG9zZWQodGhpcyk7XG4gIH1cblxuICBnZXQgY29tcG9uZW50VHlwZXMoKTogYW55W10geyByZXR1cm4gdGhpcy5fcm9vdENvbXBvbmVudFR5cGVzOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9hcHBsaWNhdGlvbl9yZWYudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyLCBTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtub3JtYWxpemVCbGFuaywgaXNQcmVzZW50LCBnbG9iYWx9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge09ic2VydmFibGVXcmFwcGVyLCBFdmVudEVtaXR0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHt3dGZMZWF2ZSwgd3RmQ3JlYXRlU2NvcGUsIFd0ZlNjb3BlRm59IGZyb20gJy4uL3Byb2ZpbGUvcHJvZmlsZSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmdab25lWm9uZSBleHRlbmRzIFpvbmUge1xuICAvKiogQGludGVybmFsICovXG4gIF9pbm5lclpvbmU6IGJvb2xlYW47XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBhIGZ1bmN0aW9uIHdpdGggemVybyBhcmd1bWVudHMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgWmVyb0FyZ0Z1bmN0aW9uIHsgKCk6IHZvaWQ7IH1cblxuLyoqXG4gKiBGdW5jdGlvbiB0eXBlIGZvciBhbiBlcnJvciBoYW5kbGVyLCB3aGljaCB0YWtlcyBhbiBlcnJvciBhbmQgYSBzdGFjayB0cmFjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFcnJvckhhbmRsaW5nRm4geyAoZXJyb3I6IGFueSwgc3RhY2tUcmFjZTogYW55KTogdm9pZDsgfVxuXG4vKipcbiAqIFN0b3JlcyBlcnJvciBpbmZvcm1hdGlvbjsgZGVsaXZlcmVkIHZpYSBbTmdab25lLm9uRXJyb3JdIHN0cmVhbS5cbiAqL1xuZXhwb3J0IGNsYXNzIE5nWm9uZUVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIGVycm9yOiBhbnksIHB1YmxpYyBzdGFja1RyYWNlOiBhbnkpIHt9XG59XG5cbi8qKlxuICogQW4gaW5qZWN0YWJsZSBzZXJ2aWNlIGZvciBleGVjdXRpbmcgd29yayBpbnNpZGUgb3Igb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lLlxuICpcbiAqIFRoZSBtb3N0IGNvbW1vbiB1c2Ugb2YgdGhpcyBzZXJ2aWNlIGlzIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlIHdoZW4gc3RhcnRpbmcgYSB3b3JrIGNvbnNpc3Rpbmcgb2ZcbiAqIG9uZSBvciBtb3JlIGFzeW5jaHJvbm91cyB0YXNrcyB0aGF0IGRvbid0IHJlcXVpcmUgVUkgdXBkYXRlcyBvciBlcnJvciBoYW5kbGluZyB0byBiZSBoYW5kbGVkIGJ5XG4gKiBBbmd1bGFyLiBTdWNoIHRhc2tzIGNhbiBiZSBraWNrZWQgb2ZmIHZpYSB7QGxpbmsgI3J1bk91dHNpZGVBbmd1bGFyfSBhbmQgaWYgbmVlZGVkLCB0aGVzZSB0YXNrc1xuICogY2FuIHJlZW50ZXIgdGhlIEFuZ3VsYXIgem9uZSB2aWEge0BsaW5rICNydW59LlxuICpcbiAqIDwhLS0gVE9ETzogYWRkL2ZpeCBsaW5rcyB0bzpcbiAqICAgLSBkb2NzIGV4cGxhaW5pbmcgem9uZXMgYW5kIHRoZSB1c2Ugb2Ygem9uZXMgaW4gQW5ndWxhciBhbmQgY2hhbmdlLWRldGVjdGlvblxuICogICAtIGxpbmsgdG8gcnVuT3V0c2lkZUFuZ3VsYXIvcnVuICh0aHJvdWdob3V0IHRoaXMgZmlsZSEpXG4gKiAgIC0tPlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9sWTltOEhMeTd6MDZ2RG9VYVNOMj9wPXByZXZpZXcpKVxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudCwgVmlldywgTmdab25lfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7TmdJZn0gZnJvbSAnYW5ndWxhcjIvY29tbW9uJztcbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICduZy16b25lLWRlbW8nLlxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxoMj5EZW1vOiBOZ1pvbmU8L2gyPlxuICpcbiAqICAgICA8cD5Qcm9ncmVzczoge3twcm9ncmVzc319JTwvcD5cbiAqICAgICA8cCAqbmdJZj1cInByb2dyZXNzID49IDEwMFwiPkRvbmUgcHJvY2Vzc2luZyB7e2xhYmVsfX0gb2YgQW5ndWxhciB6b25lITwvcD5cbiAqXG4gKiAgICAgPGJ1dHRvbiAoY2xpY2spPVwicHJvY2Vzc1dpdGhpbkFuZ3VsYXJab25lKClcIj5Qcm9jZXNzIHdpdGhpbiBBbmd1bGFyIHpvbmU8L2J1dHRvbj5cbiAqICAgICA8YnV0dG9uIChjbGljayk9XCJwcm9jZXNzT3V0c2lkZU9mQW5ndWxhclpvbmUoKVwiPlByb2Nlc3Mgb3V0c2lkZSBvZiBBbmd1bGFyIHpvbmU8L2J1dHRvbj5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW05nSWZdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE5nWm9uZURlbW8ge1xuICogICBwcm9ncmVzczogbnVtYmVyID0gMDtcbiAqICAgbGFiZWw6IHN0cmluZztcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgX25nWm9uZTogTmdab25lKSB7fVxuICpcbiAqICAgLy8gTG9vcCBpbnNpZGUgdGhlIEFuZ3VsYXIgem9uZVxuICogICAvLyBzbyB0aGUgVUkgRE9FUyByZWZyZXNoIGFmdGVyIGVhY2ggc2V0VGltZW91dCBjeWNsZVxuICogICBwcm9jZXNzV2l0aGluQW5ndWxhclpvbmUoKSB7XG4gKiAgICAgdGhpcy5sYWJlbCA9ICdpbnNpZGUnO1xuICogICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICogICAgIHRoaXMuX2luY3JlYXNlUHJvZ3Jlc3MoKCkgPT4gY29uc29sZS5sb2coJ0luc2lkZSBEb25lIScpKTtcbiAqICAgfVxuICpcbiAqICAgLy8gTG9vcCBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmVcbiAqICAgLy8gc28gdGhlIFVJIERPRVMgTk9UIHJlZnJlc2ggYWZ0ZXIgZWFjaCBzZXRUaW1lb3V0IGN5Y2xlXG4gKiAgIHByb2Nlc3NPdXRzaWRlT2ZBbmd1bGFyWm9uZSgpIHtcbiAqICAgICB0aGlzLmxhYmVsID0gJ291dHNpZGUnO1xuICogICAgIHRoaXMucHJvZ3Jlc3MgPSAwO1xuICogICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gKiAgICAgICB0aGlzLl9pbmNyZWFzZVByb2dyZXNzKCgpID0+IHtcbiAqICAgICAgIC8vIHJlZW50ZXIgdGhlIEFuZ3VsYXIgem9uZSBhbmQgZGlzcGxheSBkb25lXG4gKiAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHtjb25zb2xlLmxvZygnT3V0c2lkZSBEb25lIScpIH0pO1xuICogICAgIH19KSk7XG4gKiAgIH1cbiAqXG4gKlxuICogICBfaW5jcmVhc2VQcm9ncmVzcyhkb25lQ2FsbGJhY2s6ICgpID0+IHZvaWQpIHtcbiAqICAgICB0aGlzLnByb2dyZXNzICs9IDE7XG4gKiAgICAgY29uc29sZS5sb2coYEN1cnJlbnQgcHJvZ3Jlc3M6ICR7dGhpcy5wcm9ncmVzc30lYCk7XG4gKlxuICogICAgIGlmICh0aGlzLnByb2dyZXNzIDwgMTAwKSB7XG4gKiAgICAgICB3aW5kb3cuc2V0VGltZW91dCgoKSA9PiB0aGlzLl9pbmNyZWFzZVByb2dyZXNzKGRvbmVDYWxsYmFjaykpLCAxMClcbiAqICAgICB9IGVsc2Uge1xuICogICAgICAgZG9uZUNhbGxiYWNrKCk7XG4gKiAgICAgfVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIE5nWm9uZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3J1blNjb3BlOiBXdGZTY29wZUZuID0gd3RmQ3JlYXRlU2NvcGUoYE5nWm9uZSNydW4oKWApO1xuICAvKiogQGludGVybmFsICovXG4gIF9taWNyb3Rhc2tTY29wZTogV3RmU2NvcGVGbiA9IHd0ZkNyZWF0ZVNjb3BlKGBOZ1pvbmUjbWljcm90YXNrKClgKTtcblxuICAvLyBDb2RlIGV4ZWN1dGVkIGluIF9tb3VudFpvbmUgZG9lcyBub3QgdHJpZ2dlciB0aGUgb25UdXJuRG9uZS5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbW91bnRab25lO1xuICAvLyBfaW5uZXJab25lIGlzIHRoZSBjaGlsZCBvZiBfbW91bnRab25lLiBBbnkgY29kZSBleGVjdXRlZCBpbiB0aGlzIHpvbmUgd2lsbCB0cmlnZ2VyIHRoZVxuICAvLyBvblR1cm5Eb25lIGhvb2sgYXQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBWTSB0dXJuLlxuICAvKiogQGludGVybmFsICovXG4gIF9pbm5lclpvbmU7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25UdXJuU3RhcnQ6IFplcm9BcmdGdW5jdGlvbjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25UdXJuRG9uZTogWmVyb0FyZ0Z1bmN0aW9uO1xuICAvKiogQGludGVybmFsICovXG4gIF9vbkV2ZW50RG9uZTogWmVyb0FyZ0Z1bmN0aW9uO1xuICAvKiogQGludGVybmFsICovXG4gIF9vbkVycm9ySGFuZGxlcjogRXJyb3JIYW5kbGluZ0ZuO1xuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uVHVyblN0YXJ0RXZlbnRzOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25UdXJuRG9uZUV2ZW50czogRXZlbnRFbWl0dGVyPGFueT47XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uRXZlbnREb25lRXZlbnRzOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfb25FcnJvckV2ZW50czogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgLy8gTnVtYmVyIG9mIG1pY3JvdGFza3MgcGVuZGluZyBmcm9tIF9pbm5lclpvbmUgKCYgZGVzY2VuZGFudHMpXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3BlbmRpbmdNaWNyb3Rhc2tzOiBudW1iZXIgPSAwO1xuICAvLyBXaGV0aGVyIHNvbWUgY29kZSBoYXMgYmVlbiBleGVjdXRlZCBpbiB0aGUgX2lubmVyWm9uZSAoJiBkZXNjZW5kYW50cykgaW4gdGhlIGN1cnJlbnQgdHVyblxuICAvKiogQGludGVybmFsICovXG4gIF9oYXNFeGVjdXRlZENvZGVJbklubmVyWm9uZTogYm9vbGVhbiA9IGZhbHNlO1xuICAvLyBydW4oKSBjYWxsIGRlcHRoIGluIF9tb3VudFpvbmUuIDAgYXQgdGhlIGVuZCBvZiBhIG1hY3JvdGFza1xuICAvLyB6b25lLnJ1bigoKSA9PiB7ICAgICAgICAgLy8gdG9wLWxldmVsIGNhbGxcbiAgLy8gICB6b25lLnJ1bigoKSA9PiB7fSk7ICAgIC8vIG5lc3RlZCBjYWxsIC0+IGluLXR1cm5cbiAgLy8gfSk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX25lc3RlZFJ1bjogbnVtYmVyID0gMDtcblxuICAvLyBUT0RPKHZpY2IpOiBpbXBsZW1lbnQgdGhpcyBjbGFzcyBwcm9wZXJseSBmb3Igbm9kZS5qcyBlbnZpcm9ubWVudFxuICAvLyBUaGlzIGRpc2FibGVkIGZsYWcgaXMgb25seSBoZXJlIHRvIHBsZWFzZSBjanMgdGVzdHNcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGlzYWJsZWQ6IGJvb2xlYW47XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaW5WbVR1cm5Eb25lOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcGVuZGluZ1RpbWVvdXRzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge2Jvb2x9IGVuYWJsZUxvbmdTdGFja1RyYWNlIHdoZXRoZXIgdG8gZW5hYmxlIGxvbmcgc3RhY2sgdHJhY2UuIFRoZXkgc2hvdWxkIG9ubHkgYmVcbiAgICogICAgICAgICAgICAgICBlbmFibGVkIGluIGRldmVsb3BtZW50IG1vZGUgYXMgdGhleSBzaWduaWZpY2FudGx5IGltcGFjdCBwZXJmLlxuICAgKi9cbiAgY29uc3RydWN0b3Ioe2VuYWJsZUxvbmdTdGFja1RyYWNlfSkge1xuICAgIGlmIChnbG9iYWwuem9uZSkge1xuICAgICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuX21vdW50Wm9uZSA9IGdsb2JhbC56b25lO1xuICAgICAgdGhpcy5faW5uZXJab25lID0gdGhpcy5fY3JlYXRlSW5uZXJab25lKHRoaXMuX21vdW50Wm9uZSwgZW5hYmxlTG9uZ1N0YWNrVHJhY2UpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9kaXNhYmxlZCA9IHRydWU7XG4gICAgICB0aGlzLl9tb3VudFpvbmUgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLl9vblR1cm5TdGFydEV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuICAgIHRoaXMuX29uVHVybkRvbmVFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcbiAgICB0aGlzLl9vbkV2ZW50RG9uZUV2ZW50cyA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpO1xuICAgIHRoaXMuX29uRXJyb3JFdmVudHMgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB6b25lIGhvb2sgdGhhdCBpcyBjYWxsZWQganVzdCBiZWZvcmUgYSBicm93c2VyIHRhc2sgdGhhdCBpcyBoYW5kbGVkIGJ5IEFuZ3VsYXJcbiAgICogZXhlY3V0ZXMuXG4gICAqXG4gICAqIFRoZSBob29rIGlzIGNhbGxlZCBvbmNlIHBlciBicm93c2VyIHRhc2sgdGhhdCBpcyBoYW5kbGVkIGJ5IEFuZ3VsYXIuXG4gICAqXG4gICAqIFNldHRpbmcgdGhlIGhvb2sgb3ZlcnJpZGVzIGFueSBwcmV2aW91c2x5IHNldCBob29rLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB0aGlzIEFQSSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gVXNlIGBvblR1cm5TdGFydGAgaW5zdGVhZC5cbiAgICovXG4gIG92ZXJyaWRlT25UdXJuU3RhcnQob25UdXJuU3RhcnRIb29rOiBaZXJvQXJnRnVuY3Rpb24pOiB2b2lkIHtcbiAgICB0aGlzLl9vblR1cm5TdGFydCA9IG5vcm1hbGl6ZUJsYW5rKG9uVHVyblN0YXJ0SG9vayk7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgc3Vic2NyaWJlcnMganVzdCBiZWZvcmUgQW5ndWxhciBldmVudCB0dXJuIHN0YXJ0cy5cbiAgICpcbiAgICogRW1pdHMgYW4gZXZlbnQgb25jZSBwZXIgYnJvd3NlciB0YXNrIHRoYXQgaXMgaGFuZGxlZCBieSBBbmd1bGFyLlxuICAgKi9cbiAgZ2V0IG9uVHVyblN0YXJ0KCk6IC8qIFN1YmplY3QgKi8gYW55IHsgcmV0dXJuIHRoaXMuX29uVHVyblN0YXJ0RXZlbnRzOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbm90aWZ5T25UdXJuU3RhcnQocGFyZW50UnVuKTogdm9pZCB7XG4gICAgcGFyZW50UnVuLmNhbGwodGhpcy5faW5uZXJab25lLCAoKSA9PiB7IHRoaXMuX29uVHVyblN0YXJ0RXZlbnRzLmVtaXQobnVsbCk7IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHpvbmUgaG9vayB0aGF0IGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciBBbmd1bGFyIHpvbmUgaXMgZG9uZSBwcm9jZXNzaW5nIHRoZSBjdXJyZW50XG4gICAqIHRhc2sgYW5kIGFueSBtaWNyb3Rhc2tzIHNjaGVkdWxlZCBmcm9tIHRoYXQgdGFzay5cbiAgICpcbiAgICogVGhpcyBpcyB3aGVyZSB3ZSB0eXBpY2FsbHkgZG8gY2hhbmdlLWRldGVjdGlvbi5cbiAgICpcbiAgICogVGhlIGhvb2sgaXMgY2FsbGVkIG9uY2UgcGVyIGJyb3dzZXIgdGFzayB0aGF0IGlzIGhhbmRsZWQgYnkgQW5ndWxhci5cbiAgICpcbiAgICogU2V0dGluZyB0aGUgaG9vayBvdmVycmlkZXMgYW55IHByZXZpb3VzbHkgc2V0IGhvb2suXG4gICAqXG4gICAqIEBkZXByZWNhdGVkIHRoaXMgQVBJIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLiBVc2UgYG9uVHVybkRvbmVgIGluc3RlYWQuXG4gICAqL1xuICBvdmVycmlkZU9uVHVybkRvbmUob25UdXJuRG9uZUhvb2s6IFplcm9BcmdGdW5jdGlvbik6IHZvaWQge1xuICAgIHRoaXMuX29uVHVybkRvbmUgPSBub3JtYWxpemVCbGFuayhvblR1cm5Eb25lSG9vayk7XG4gIH1cblxuICAvKipcbiAgICogTm90aWZpZXMgc3Vic2NyaWJlcnMgaW1tZWRpYXRlbHkgYWZ0ZXIgQW5ndWxhciB6b25lIGlzIGRvbmUgcHJvY2Vzc2luZ1xuICAgKiB0aGUgY3VycmVudCB0dXJuIGFuZCBhbnkgbWljcm90YXNrcyBzY2hlZHVsZWQgZnJvbSB0aGF0IHR1cm4uXG4gICAqXG4gICAqIFVzZWQgYnkgQW5ndWxhciBhcyBhIHNpZ25hbCB0byBraWNrIG9mZiBjaGFuZ2UtZGV0ZWN0aW9uLlxuICAgKi9cbiAgZ2V0IG9uVHVybkRvbmUoKSB7IHJldHVybiB0aGlzLl9vblR1cm5Eb25lRXZlbnRzOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbm90aWZ5T25UdXJuRG9uZShwYXJlbnRSdW4pOiB2b2lkIHtcbiAgICBwYXJlbnRSdW4uY2FsbCh0aGlzLl9pbm5lclpvbmUsICgpID0+IHsgdGhpcy5fb25UdXJuRG9uZUV2ZW50cy5lbWl0KG51bGwpOyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB6b25lIGhvb2sgdGhhdCBpcyBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGBvblR1cm5Eb25lYCBjYWxsYmFjayBpcyBjYWxsZWQgYW5kIGFueVxuICAgKiBtaWNyb3N0YXNrcyBzY2hlZHVsZWQgZnJvbSB3aXRoaW4gdGhhdCBjYWxsYmFjayBhcmUgZHJhaW5lZC5cbiAgICpcbiAgICogYG9uRXZlbnREb25lRm5gIGlzIGV4ZWN1dGVkIG91dHNpZGUgQW5ndWxhciB6b25lLCB3aGljaCBtZWFucyB0aGF0IHdlIHdpbGwgbm8gbG9uZ2VyIGF0dGVtcHQgdG9cbiAgICogc3luYyB0aGUgVUkgd2l0aCBhbnkgbW9kZWwgY2hhbmdlcyB0aGF0IG9jY3VyIHdpdGhpbiB0aGlzIGNhbGxiYWNrLlxuICAgKlxuICAgKiBUaGlzIGhvb2sgaXMgdXNlZnVsIGZvciB2YWxpZGF0aW5nIGFwcGxpY2F0aW9uIHN0YXRlIChlLmcuIGluIGEgdGVzdCkuXG4gICAqXG4gICAqIFNldHRpbmcgdGhlIGhvb2sgb3ZlcnJpZGVzIGFueSBwcmV2aW91c2x5IHNldCBob29rLlxuICAgKlxuICAgKiBAZGVwcmVjYXRlZCB0aGlzIEFQSSB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4gVXNlIGBvbkV2ZW50RG9uZWAgaW5zdGVhZC5cbiAgICovXG4gIG92ZXJyaWRlT25FdmVudERvbmUob25FdmVudERvbmVGbjogWmVyb0FyZ0Z1bmN0aW9uLCBvcHRfd2FpdEZvckFzeW5jOiBib29sZWFuID0gZmFsc2UpOiB2b2lkIHtcbiAgICB2YXIgbm9ybWFsaXplZE9uRXZlbnREb25lID0gbm9ybWFsaXplQmxhbmsob25FdmVudERvbmVGbik7XG4gICAgaWYgKG9wdF93YWl0Rm9yQXN5bmMpIHtcbiAgICAgIHRoaXMuX29uRXZlbnREb25lID0gKCkgPT4ge1xuICAgICAgICBpZiAoIXRoaXMuX3BlbmRpbmdUaW1lb3V0cy5sZW5ndGgpIHtcbiAgICAgICAgICBub3JtYWxpemVkT25FdmVudERvbmUoKTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fb25FdmVudERvbmUgPSBub3JtYWxpemVkT25FdmVudERvbmU7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIHN1YnNjcmliZXJzIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBmaW5hbCBgb25UdXJuRG9uZWAgY2FsbGJhY2tcbiAgICogYmVmb3JlIGVuZGluZyBWTSBldmVudC5cbiAgICpcbiAgICogVGhpcyBldmVudCBpcyB1c2VmdWwgZm9yIHZhbGlkYXRpbmcgYXBwbGljYXRpb24gc3RhdGUgKGUuZy4gaW4gYSB0ZXN0KS5cbiAgICovXG4gIGdldCBvbkV2ZW50RG9uZSgpIHsgcmV0dXJuIHRoaXMuX29uRXZlbnREb25lRXZlbnRzOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbm90aWZ5T25FdmVudERvbmUoKTogdm9pZCB7XG4gICAgdGhpcy5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7IHRoaXMuX29uRXZlbnREb25lRXZlbnRzLmVtaXQobnVsbCk7IH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBvdXRzdGFuZGluZyBtaWNyb3Rhc2tzLlxuICAgKi9cbiAgZ2V0IGhhc1BlbmRpbmdNaWNyb3Rhc2tzKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcGVuZGluZ01pY3JvdGFza3MgPiAwOyB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBvdXRzdGFuZGluZyB0aW1lcnMuXG4gICAqL1xuICBnZXQgaGFzUGVuZGluZ1RpbWVycygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3BlbmRpbmdUaW1lb3V0cy5sZW5ndGggPiAwOyB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlcmUgYXJlIGFueSBvdXRzdGFuZGluZyBhc3ljaG5yb25vdXMgdGFza3Mgb2YgYW55IGtpbmQgdGhhdCBhcmVcbiAgICogc2NoZWR1bGVkIHRvIHJ1biB3aXRoaW4gQW5ndWxhciB6b25lLlxuICAgKlxuICAgKiBVc2VmdWwgYXMgYSBzaWduYWwgb2YgVUkgc3RhYmlsaXR5LiBGb3IgZXhhbXBsZSwgd2hlbiBhIHRlc3QgcmVhY2hlcyBhXG4gICAqIHBvaW50IHdoZW4gW2hhc1BlbmRpbmdBc3luY1Rhc2tzXSBpcyBgZmFsc2VgIGl0IG1pZ2h0IGJlIGEgZ29vZCB0aW1lIHRvIHJ1blxuICAgKiB0ZXN0IGV4cGVjdGF0aW9ucy5cbiAgICovXG4gIGdldCBoYXNQZW5kaW5nQXN5bmNUYXNrcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuaGFzUGVuZGluZ01pY3JvdGFza3MgfHwgdGhpcy5oYXNQZW5kaW5nVGltZXJzOyB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHpvbmUgaG9vayB0aGF0IGlzIGNhbGxlZCB3aGVuIGFuIGVycm9yIGlzIHRocm93biBpbiB0aGUgQW5ndWxhciB6b25lLlxuICAgKlxuICAgKiBTZXR0aW5nIHRoZSBob29rIG92ZXJyaWRlcyBhbnkgcHJldmlvdXNseSBzZXQgaG9vay5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgdGhpcyBBUEkgd2lsbCBiZSByZW1vdmVkIGluIHRoZSBmdXR1cmUuIFVzZSBgb25FcnJvcmAgaW5zdGVhZC5cbiAgICovXG4gIG92ZXJyaWRlT25FcnJvckhhbmRsZXIoZXJyb3JIYW5kbGVyOiBFcnJvckhhbmRsaW5nRm4pIHtcbiAgICB0aGlzLl9vbkVycm9ySGFuZGxlciA9IG5vcm1hbGl6ZUJsYW5rKGVycm9ySGFuZGxlcik7XG4gIH1cblxuICBnZXQgb25FcnJvcigpIHsgcmV0dXJuIHRoaXMuX29uRXJyb3JFdmVudHM7IH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24gc3luY2hyb25vdXNseSB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZSBhbmQgcmV0dXJucyB2YWx1ZSByZXR1cm5lZCBieVxuICAgKiB0aGUgZnVuY3Rpb24uXG4gICAqXG4gICAqIFJ1bm5pbmcgZnVuY3Rpb25zIHZpYSBgcnVuYCBhbGxvd3MgeW91IHRvIHJlZW50ZXIgQW5ndWxhciB6b25lIGZyb20gYSB0YXNrIHRoYXQgd2FzIGV4ZWN1dGVkXG4gICAqIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZSAodHlwaWNhbGx5IHN0YXJ0ZWQgdmlhIHtAbGluayAjcnVuT3V0c2lkZUFuZ3VsYXJ9KS5cbiAgICpcbiAgICogQW55IGZ1dHVyZSB0YXNrcyBvciBtaWNyb3Rhc2tzIHNjaGVkdWxlZCBmcm9tIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIHdpbGwgY29udGludWUgZXhlY3V0aW5nIGZyb21cbiAgICogd2l0aGluIHRoZSBBbmd1bGFyIHpvbmUuXG4gICAqL1xuICBydW4oZm46ICgpID0+IGFueSk6IGFueSB7XG4gICAgaWYgKHRoaXMuX2Rpc2FibGVkKSB7XG4gICAgICByZXR1cm4gZm4oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHMgPSB0aGlzLl9ydW5TY29wZSgpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyWm9uZS5ydW4oZm4pO1xuICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgd3RmTGVhdmUocyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSBgZm5gIGZ1bmN0aW9uIHN5bmNocm9ub3VzbHkgaW4gQW5ndWxhcidzIHBhcmVudCB6b25lIGFuZCByZXR1cm5zIHZhbHVlIHJldHVybmVkIGJ5XG4gICAqIHRoZSBmdW5jdGlvbi5cbiAgICpcbiAgICogUnVubmluZyBmdW5jdGlvbnMgdmlhIGBydW5PdXRzaWRlQW5ndWxhcmAgYWxsb3dzIHlvdSB0byBlc2NhcGUgQW5ndWxhcidzIHpvbmUgYW5kIGRvIHdvcmsgdGhhdFxuICAgKiBkb2Vzbid0IHRyaWdnZXIgQW5ndWxhciBjaGFuZ2UtZGV0ZWN0aW9uIG9yIGlzIHN1YmplY3QgdG8gQW5ndWxhcidzIGVycm9yIGhhbmRsaW5nLlxuICAgKlxuICAgKiBBbnkgZnV0dXJlIHRhc2tzIG9yIG1pY3JvdGFza3Mgc2NoZWR1bGVkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24gd2lsbCBjb250aW51ZSBleGVjdXRpbmcgZnJvbVxuICAgKiBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUuXG4gICAqXG4gICAqIFVzZSB7QGxpbmsgI3J1bn0gdG8gcmVlbnRlciB0aGUgQW5ndWxhciB6b25lIGFuZCBkbyB3b3JrIHRoYXQgdXBkYXRlcyB0aGUgYXBwbGljYXRpb24gbW9kZWwuXG4gICAqL1xuICBydW5PdXRzaWRlQW5ndWxhcihmbjogKCkgPT4gYW55KTogYW55IHtcbiAgICBpZiAodGhpcy5fZGlzYWJsZWQpIHtcbiAgICAgIHJldHVybiBmbigpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5fbW91bnRab25lLnJ1bihmbik7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY3JlYXRlSW5uZXJab25lKHpvbmUsIGVuYWJsZUxvbmdTdGFja1RyYWNlKSB7XG4gICAgdmFyIG1pY3JvdGFza1Njb3BlID0gdGhpcy5fbWljcm90YXNrU2NvcGU7XG4gICAgdmFyIG5nWm9uZSA9IHRoaXM7XG4gICAgdmFyIGVycm9ySGFuZGxpbmc7XG5cbiAgICBpZiAoZW5hYmxlTG9uZ1N0YWNrVHJhY2UpIHtcbiAgICAgIGVycm9ySGFuZGxpbmcgPSBTdHJpbmdNYXBXcmFwcGVyLm1lcmdlKFxuICAgICAgICAgIFpvbmUubG9uZ1N0YWNrVHJhY2Vab25lLCB7b25FcnJvcjogZnVuY3Rpb24oZSkgeyBuZ1pvbmUuX25vdGlmeU9uRXJyb3IodGhpcywgZSk7IH19KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3JIYW5kbGluZyA9IHtvbkVycm9yOiBmdW5jdGlvbihlKSB7IG5nWm9uZS5fbm90aWZ5T25FcnJvcih0aGlzLCBlKTsgfX07XG4gICAgfVxuXG4gICAgcmV0dXJuIHpvbmUuZm9yayhlcnJvckhhbmRsaW5nKVxuICAgICAgICAuZm9yayh7XG4gICAgICAgICAgJyRydW4nOiBmdW5jdGlvbihwYXJlbnRSdW4pIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBuZ1pvbmUuX25lc3RlZFJ1bisrO1xuICAgICAgICAgICAgICAgIGlmICghbmdab25lLl9oYXNFeGVjdXRlZENvZGVJbklubmVyWm9uZSkge1xuICAgICAgICAgICAgICAgICAgbmdab25lLl9oYXNFeGVjdXRlZENvZGVJbklubmVyWm9uZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICBuZ1pvbmUuX25vdGlmeU9uVHVyblN0YXJ0KHBhcmVudFJ1bik7XG4gICAgICAgICAgICAgICAgICBpZiAobmdab25lLl9vblR1cm5TdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJlbnRSdW4uY2FsbChuZ1pvbmUuX2lubmVyWm9uZSwgbmdab25lLl9vblR1cm5TdGFydCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwYXJlbnRSdW4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgICBuZ1pvbmUuX25lc3RlZFJ1bi0tO1xuICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBtb3JlIHBlbmRpbmcgbWljcm90YXNrcywgd2UgYXJlIGF0IHRoZSBlbmQgb2YgYSBWTSB0dXJuIChvciBpblxuICAgICAgICAgICAgICAgIC8vIG9uVHVyblN0YXJ0KVxuICAgICAgICAgICAgICAgIC8vIF9uZXN0ZWRSdW4gd2lsbCBiZSAwIGF0IHRoZSBlbmQgb2YgYSBtYWNyb3Rhc2tzIChpdCBjb3VsZCBiZSA+IDAgd2hlbiB0aGVyZSBhcmVcbiAgICAgICAgICAgICAgICAvLyBuZXN0ZWQgY2FsbHNcbiAgICAgICAgICAgICAgICAvLyB0byBydW4oKSkuXG4gICAgICAgICAgICAgICAgaWYgKG5nWm9uZS5fcGVuZGluZ01pY3JvdGFza3MgPT0gMCAmJiBuZ1pvbmUuX25lc3RlZFJ1biA9PSAwICYmXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLl9pblZtVHVybkRvbmUpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChuZ1pvbmUuX2hhc0V4ZWN1dGVkQ29kZUluSW5uZXJab25lKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5WbVR1cm5Eb25lID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICBuZ1pvbmUuX25vdGlmeU9uVHVybkRvbmUocGFyZW50UnVuKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAobmdab25lLl9vblR1cm5Eb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRSdW4uY2FsbChuZ1pvbmUuX2lubmVyWm9uZSwgbmdab25lLl9vblR1cm5Eb25lKTtcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5WbVR1cm5Eb25lID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgbmdab25lLl9oYXNFeGVjdXRlZENvZGVJbklubmVyWm9uZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgIGlmIChuZ1pvbmUuX3BlbmRpbmdNaWNyb3Rhc2tzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5nWm9uZS5fbm90aWZ5T25FdmVudERvbmUoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChuZ1pvbmUuX29uRXZlbnREb25lKSkge1xuICAgICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcihuZ1pvbmUuX29uRXZlbnREb25lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICckc2NoZWR1bGVNaWNyb3Rhc2snOiBmdW5jdGlvbihwYXJlbnRTY2hlZHVsZU1pY3JvdGFzaykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgIG5nWm9uZS5fcGVuZGluZ01pY3JvdGFza3MrKztcbiAgICAgICAgICAgICAgdmFyIG1pY3JvdGFzayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHZhciBzID0gbWljcm90YXNrU2NvcGUoKTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgbmdab25lLl9wZW5kaW5nTWljcm90YXNrcy0tO1xuICAgICAgICAgICAgICAgICAgd3RmTGVhdmUocyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBwYXJlbnRTY2hlZHVsZU1pY3JvdGFzay5jYWxsKHRoaXMsIG1pY3JvdGFzayk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0sXG4gICAgICAgICAgJyRzZXRUaW1lb3V0JzogZnVuY3Rpb24ocGFyZW50U2V0VGltZW91dCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGZuOiBGdW5jdGlvbiwgZGVsYXk6IG51bWJlciwgLi4uYXJncykge1xuICAgICAgICAgICAgICB2YXIgaWQ7XG4gICAgICAgICAgICAgIHZhciBjYiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlKG5nWm9uZS5fcGVuZGluZ1RpbWVvdXRzLCBpZCk7XG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIGlkID0gcGFyZW50U2V0VGltZW91dChjYiwgZGVsYXksIGFyZ3MpO1xuICAgICAgICAgICAgICBuZ1pvbmUuX3BlbmRpbmdUaW1lb3V0cy5wdXNoKGlkKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9LFxuICAgICAgICAgICckY2xlYXJUaW1lb3V0JzogZnVuY3Rpb24ocGFyZW50Q2xlYXJUaW1lb3V0KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oaWQ6IG51bWJlcikge1xuICAgICAgICAgICAgICBwYXJlbnRDbGVhclRpbWVvdXQoaWQpO1xuICAgICAgICAgICAgICBMaXN0V3JhcHBlci5yZW1vdmUobmdab25lLl9wZW5kaW5nVGltZW91dHMsIGlkKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfSxcbiAgICAgICAgICBfaW5uZXJab25lOiB0cnVlXG4gICAgICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbm90aWZ5T25FcnJvcih6b25lLCBlKTogdm9pZCB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9vbkVycm9ySGFuZGxlcikgfHwgT2JzZXJ2YWJsZVdyYXBwZXIuaGFzU3Vic2NyaWJlcnModGhpcy5fb25FcnJvckV2ZW50cykpIHtcbiAgICAgIHZhciB0cmFjZSA9IFtub3JtYWxpemVCbGFuayhlLnN0YWNrKV07XG5cbiAgICAgIHdoaWxlICh6b25lICYmIHpvbmUuY29uc3RydWN0ZWRBdEV4Y2VwdGlvbikge1xuICAgICAgICB0cmFjZS5wdXNoKHpvbmUuY29uc3RydWN0ZWRBdEV4Y2VwdGlvbi5nZXQoKSk7XG4gICAgICAgIHpvbmUgPSB6b25lLnBhcmVudDtcbiAgICAgIH1cbiAgICAgIGlmIChPYnNlcnZhYmxlV3JhcHBlci5oYXNTdWJzY3JpYmVycyh0aGlzLl9vbkVycm9yRXZlbnRzKSkge1xuICAgICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLl9vbkVycm9yRXZlbnRzLCBuZXcgTmdab25lRXJyb3IoZSwgdHJhY2UpKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5fb25FcnJvckhhbmRsZXIpKSB7XG4gICAgICAgIHRoaXMuX29uRXJyb3JIYW5kbGVyKGUsIHRyYWNlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coJyMjIF9ub3RpZnlPbkVycm9yICMjJyk7XG4gICAgICBjb25zb2xlLmxvZyhlLnN0YWNrKTtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS96b25lL25nX3pvbmUudHNcbiAqKi8iLCJpbXBvcnQge09wYXF1ZVRva2VuLCBQcm92aWRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtDT05TVF9FWFBSLCBNYXRoLCBTdHJpbmdXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqICBAaW50ZXJuYWxcbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9DT01QT05FTlRfUkVGX1BST01JU0UgPSBDT05TVF9FWFBSKG5ldyBPcGFxdWVUb2tlbignUHJvbWlzZTxDb21wb25lbnRSZWY+JykpO1xuXG4vKipcbiAqIEFuIHtAbGluayBhbmd1bGFyMi9kaS9PcGFxdWVUb2tlbn0gcmVwcmVzZW50aW5nIHRoZSBhcHBsaWNhdGlvbiByb290IHR5cGUgaW4gdGhlIHtAbGlua1xuICogSW5qZWN0b3J9LlxuICpcbiAqIGBgYFxuICogQENvbXBvbmVudCguLi4pXG4gKiBjbGFzcyBNeUFwcCB7XG4gKiAgIC4uLlxuICogfVxuICpcbiAqIGJvb3RzdHJhcChNeUFwcCkudGhlbigoYXBwUmVmOkFwcGxpY2F0aW9uUmVmKSB7XG4gKiAgIGV4cGVjdChhcHBSZWYuaW5qZWN0b3IuZ2V0KGFwcENvbXBvbmVudFR5cGVUb2tlbikpLnRvRXF1YWwoTXlBcHApO1xuICogfSk7XG4gKlxuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfQ09NUE9ORU5UOiBPcGFxdWVUb2tlbiA9IENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKCdBcHBDb21wb25lbnQnKSk7XG5cbi8qKlxuICogQSBESSBUb2tlbiByZXByZXNlbnRpbmcgYSB1bmlxdWUgc3RyaW5nIGlkIGFzc2lnbmVkIHRvIHRoZSBhcHBsaWNhdGlvbiBieSBBbmd1bGFyIGFuZCB1c2VkXG4gKiBwcmltYXJpbHkgZm9yIHByZWZpeGluZyBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIGFuZCBDU1Mgc3R5bGVzIHdoZW5cbiAqIHtAbGluayBWaWV3RW5jYXBzdWxhdGlvbiNFbXVsYXRlZH0gaXMgYmVpbmcgdXNlZC5cbiAqXG4gKiBJZiB5b3UgbmVlZCB0byBhdm9pZCByYW5kb21seSBnZW5lcmF0ZWQgdmFsdWUgdG8gYmUgdXNlZCBhcyBhbiBhcHBsaWNhdGlvbiBpZCwgeW91IGNhbiBwcm92aWRlXG4gKiBhIGN1c3RvbSB2YWx1ZSB2aWEgYSBESSBwcm92aWRlciA8IS0tIFRPRE86IHByb3ZpZGVyIC0tPiBjb25maWd1cmluZyB0aGUgcm9vdCB7QGxpbmsgSW5qZWN0b3J9XG4gKiB1c2luZyB0aGlzIHRva2VuLlxuICovXG5leHBvcnQgY29uc3QgQVBQX0lEOiBPcGFxdWVUb2tlbiA9IENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKCdBcHBJZCcpKTtcblxuZnVuY3Rpb24gX2FwcElkUmFuZG9tUHJvdmlkZXJGYWN0b3J5KCkge1xuICByZXR1cm4gYCR7X3JhbmRvbUNoYXIoKX0ke19yYW5kb21DaGFyKCl9JHtfcmFuZG9tQ2hhcigpfWA7XG59XG5cbi8qKlxuICogUHJvdmlkZXJzIHRoYXQgd2lsbCBnZW5lcmF0ZSBhIHJhbmRvbSBBUFBfSURfVE9LRU4uXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfSURfUkFORE9NX1BST1ZJREVSOiBQcm92aWRlciA9XG4gICAgQ09OU1RfRVhQUihuZXcgUHJvdmlkZXIoQVBQX0lELCB7dXNlRmFjdG9yeTogX2FwcElkUmFuZG9tUHJvdmlkZXJGYWN0b3J5LCBkZXBzOiBbXX0pKTtcblxuZnVuY3Rpb24gX3JhbmRvbUNoYXIoKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIuZnJvbUNoYXJDb2RlKDk3ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjUpKTtcbn1cblxuLyoqXG4gKiBBIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCB3aGVuIGEgcGxhdGZvcm0gaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBQTEFURk9STV9JTklUSUFMSVpFUjogT3BhcXVlVG9rZW4gPVxuICAgIENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKFwiUGxhdGZvcm0gSW5pdGlhbGl6ZXJcIikpO1xuXG4vKipcbiAqIEEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYW4gYXBwbGljYXRpb24gaXMgaW5pdGlhbGl6ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBBUFBfSU5JVElBTElaRVI6IE9wYXF1ZVRva2VuID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oXCJBcHBsaWNhdGlvbiBJbml0aWFsaXplclwiKSk7XG5cbi8qKlxuICogQSB0b2tlbiB3aGljaCBpbmRpY2F0ZXMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBhcHBsaWNhdGlvblxuICovXG5leHBvcnQgY29uc3QgUEFDS0FHRV9ST09UX1VSTDogT3BhcXVlVG9rZW4gPVxuICAgIENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKFwiQXBwbGljYXRpb24gUGFja2FnZXMgUm9vdCBVUkxcIikpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fdG9rZW5zLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge01hcCwgTWFwV3JhcHBlciwgTGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0NPTlNULCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtOZ1pvbmV9IGZyb20gJy4uL3pvbmUvbmdfem9uZSc7XG5pbXBvcnQge1Byb21pc2VXcmFwcGVyLCBPYnNlcnZhYmxlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cblxuLyoqXG4gKiBUaGUgVGVzdGFiaWxpdHkgc2VydmljZSBwcm92aWRlcyB0ZXN0aW5nIGhvb2tzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGZyb21cbiAqIHRoZSBicm93c2VyIGFuZCBieSBzZXJ2aWNlcyBzdWNoIGFzIFByb3RyYWN0b3IuIEVhY2ggYm9vdHN0cmFwcGVkIEFuZ3VsYXJcbiAqIGFwcGxpY2F0aW9uIG9uIHRoZSBwYWdlIHdpbGwgaGF2ZSBhbiBpbnN0YW5jZSBvZiBUZXN0YWJpbGl0eS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRlc3RhYmlsaXR5IHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcGVuZGluZ0NvdW50OiBudW1iZXIgPSAwO1xuICAvKiogQGludGVybmFsICovXG4gIF9jYWxsYmFja3M6IEZ1bmN0aW9uW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaXNBbmd1bGFyRXZlbnRQZW5kaW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKF9uZ1pvbmU6IE5nWm9uZSkgeyB0aGlzLl93YXRjaEFuZ3VsYXJFdmVudHMoX25nWm9uZSk7IH1cblxuICAvKiogQGludGVybmFsICovXG4gIF93YXRjaEFuZ3VsYXJFdmVudHMoX25nWm9uZTogTmdab25lKTogdm9pZCB7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlKF9uZ1pvbmUub25UdXJuU3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChfKSA9PiB7IHRoaXMuX2lzQW5ndWxhckV2ZW50UGVuZGluZyA9IHRydWU7IH0pO1xuXG4gICAgX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBPYnNlcnZhYmxlV3JhcHBlci5zdWJzY3JpYmUoX25nWm9uZS5vbkV2ZW50RG9uZSwgKF8pID0+IHtcbiAgICAgICAgaWYgKCFfbmdab25lLmhhc1BlbmRpbmdUaW1lcnMpIHtcbiAgICAgICAgICB0aGlzLl9pc0FuZ3VsYXJFdmVudFBlbmRpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLl9ydW5DYWxsYmFja3NJZlJlYWR5KCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgaW5jcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50KCk6IG51bWJlciB7XG4gICAgdGhpcy5fcGVuZGluZ0NvdW50ICs9IDE7XG4gICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdDb3VudDtcbiAgfVxuXG4gIGRlY3JlYXNlUGVuZGluZ1JlcXVlc3RDb3VudCgpOiBudW1iZXIge1xuICAgIHRoaXMuX3BlbmRpbmdDb3VudCAtPSAxO1xuICAgIGlmICh0aGlzLl9wZW5kaW5nQ291bnQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbigncGVuZGluZyBhc3luYyByZXF1ZXN0cyBiZWxvdyB6ZXJvJyk7XG4gICAgfVxuICAgIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKTtcbiAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0NvdW50O1xuICB9XG5cbiAgaXNTdGFibGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9wZW5kaW5nQ291bnQgPT0gMCAmJiAhdGhpcy5faXNBbmd1bGFyRXZlbnRQZW5kaW5nOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcnVuQ2FsbGJhY2tzSWZSZWFkeSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNTdGFibGUoKSkge1xuICAgICAgcmV0dXJuOyAgLy8gTm90IHJlYWR5XG4gICAgfVxuXG4gICAgLy8gU2NoZWR1bGVzIHRoZSBjYWxsIGJhY2tzIGluIGEgbmV3IGZyYW1lIHNvIHRoYXQgaXQgaXMgYWx3YXlzIGFzeW5jLlxuICAgIFByb21pc2VXcmFwcGVyLnJlc29sdmUobnVsbCkudGhlbigoXykgPT4ge1xuICAgICAgd2hpbGUgKHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgKHRoaXMuX2NhbGxiYWNrcy5wb3AoKSkoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHdoZW5TdGFibGUoY2FsbGJhY2s6IEZ1bmN0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5fY2FsbGJhY2tzLnB1c2goY2FsbGJhY2spO1xuICAgIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKTtcbiAgfVxuXG4gIGdldFBlbmRpbmdSZXF1ZXN0Q291bnQoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3BlbmRpbmdDb3VudDsgfVxuXG4gIC8vIFRoaXMgb25seSBhY2NvdW50cyBmb3Igbmdab25lLCBhbmQgbm90IHBlbmRpbmcgY291bnRzLiBVc2UgYHdoZW5TdGFibGVgIHRvXG4gIC8vIGNoZWNrIGZvciBzdGFiaWxpdHkuXG4gIGlzQW5ndWxhckV2ZW50UGVuZGluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX2lzQW5ndWxhckV2ZW50UGVuZGluZzsgfVxuXG4gIGZpbmRCaW5kaW5ncyh1c2luZzogYW55LCBwcm92aWRlcjogc3RyaW5nLCBleGFjdE1hdGNoOiBib29sZWFuKTogYW55W10ge1xuICAgIC8vIFRPRE8oanVsaWVtcik6IGltcGxlbWVudC5cbiAgICByZXR1cm4gW107XG4gIH1cblxuICBmaW5kUHJvdmlkZXJzKHVzaW5nOiBhbnksIHByb3ZpZGVyOiBzdHJpbmcsIGV4YWN0TWF0Y2g6IGJvb2xlYW4pOiBhbnlbXSB7XG4gICAgLy8gVE9ETyhqdWxpZW1yKTogaW1wbGVtZW50LlxuICAgIHJldHVybiBbXTtcbiAgfVxufVxuXG4vKipcbiAqIEEgZ2xvYmFsIHJlZ2lzdHJ5IG9mIHtAbGluayBUZXN0YWJpbGl0eX0gaW5zdGFuY2VzIGZvciBzcGVjaWZpYyBlbGVtZW50cy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFRlc3RhYmlsaXR5UmVnaXN0cnkge1xuICAvKiogQGludGVybmFsICovXG4gIF9hcHBsaWNhdGlvbnMgPSBuZXcgTWFwPGFueSwgVGVzdGFiaWxpdHk+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7IF90ZXN0YWJpbGl0eUdldHRlci5hZGRUb1dpbmRvdyh0aGlzKTsgfVxuXG4gIHJlZ2lzdGVyQXBwbGljYXRpb24odG9rZW46IGFueSwgdGVzdGFiaWxpdHk6IFRlc3RhYmlsaXR5KSB7XG4gICAgdGhpcy5fYXBwbGljYXRpb25zLnNldCh0b2tlbiwgdGVzdGFiaWxpdHkpO1xuICB9XG5cbiAgZ2V0VGVzdGFiaWxpdHkoZWxlbTogYW55KTogVGVzdGFiaWxpdHkgeyByZXR1cm4gdGhpcy5fYXBwbGljYXRpb25zLmdldChlbGVtKTsgfVxuXG4gIGdldEFsbFRlc3RhYmlsaXRpZXMoKTogVGVzdGFiaWxpdHlbXSB7IHJldHVybiBNYXBXcmFwcGVyLnZhbHVlcyh0aGlzLl9hcHBsaWNhdGlvbnMpOyB9XG5cbiAgZmluZFRlc3RhYmlsaXR5SW5UcmVlKGVsZW06IE5vZGUsIGZpbmRJbkFuY2VzdG9yczogYm9vbGVhbiA9IHRydWUpOiBUZXN0YWJpbGl0eSB7XG4gICAgcmV0dXJuIF90ZXN0YWJpbGl0eUdldHRlci5maW5kVGVzdGFiaWxpdHlJblRyZWUodGhpcywgZWxlbSwgZmluZEluQW5jZXN0b3JzKTtcbiAgfVxufVxuXG4vKipcbiAqIEFkYXB0ZXIgaW50ZXJmYWNlIGZvciByZXRyaWV2aW5nIHRoZSBgVGVzdGFiaWxpdHlgIHNlcnZpY2UgYXNzb2NpYXRlZCBmb3IgYVxuICogcGFydGljdWxhciBjb250ZXh0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFRlc3RhYmlsaXR5IHtcbiAgYWRkVG9XaW5kb3cocmVnaXN0cnk6IFRlc3RhYmlsaXR5UmVnaXN0cnkpOiB2b2lkO1xuICBmaW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnk6IFRlc3RhYmlsaXR5UmVnaXN0cnksIGVsZW06IGFueSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRJbkFuY2VzdG9yczogYm9vbGVhbik6IFRlc3RhYmlsaXR5O1xufVxuXG5AQ09OU1QoKVxuY2xhc3MgX05vb3BHZXRUZXN0YWJpbGl0eSBpbXBsZW1lbnRzIEdldFRlc3RhYmlsaXR5IHtcbiAgYWRkVG9XaW5kb3cocmVnaXN0cnk6IFRlc3RhYmlsaXR5UmVnaXN0cnkpOiB2b2lkIHt9XG4gIGZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeTogVGVzdGFiaWxpdHlSZWdpc3RyeSwgZWxlbTogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZEluQW5jZXN0b3JzOiBib29sZWFuKTogVGVzdGFiaWxpdHkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbi8qKlxuICogU2V0IHRoZSB7QGxpbmsgR2V0VGVzdGFiaWxpdHl9IGltcGxlbWVudGF0aW9uIHVzZWQgYnkgdGhlIEFuZ3VsYXIgdGVzdGluZyBmcmFtZXdvcmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRUZXN0YWJpbGl0eUdldHRlcihnZXR0ZXI6IEdldFRlc3RhYmlsaXR5KTogdm9pZCB7XG4gIF90ZXN0YWJpbGl0eUdldHRlciA9IGdldHRlcjtcbn1cblxudmFyIF90ZXN0YWJpbGl0eUdldHRlcjogR2V0VGVzdGFiaWxpdHkgPSBDT05TVF9FWFBSKG5ldyBfTm9vcEdldFRlc3RhYmlsaXR5KCkpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvdGVzdGFiaWxpdHkvdGVzdGFiaWxpdHkudHNcbiAqKi8iLCJpbXBvcnQge0tleSwgSW5qZWN0b3IsIFJlc29sdmVkUHJvdmlkZXIsIFByb3ZpZGVyLCBwcm92aWRlLCBJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0NvbXBpbGVyfSBmcm9tICcuL2NvbXBpbGVyJztcbmltcG9ydCB7aXNUeXBlLCBUeXBlLCBzdHJpbmdpZnksIGlzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7UHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge0FwcFZpZXdNYW5hZ2VyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19tYW5hZ2VyJztcbmltcG9ydCB7RWxlbWVudFJlZn0gZnJvbSAnLi9lbGVtZW50X3JlZic7XG5pbXBvcnQge1ZpZXdSZWYsIEhvc3RWaWV3UmVmfSBmcm9tICcuL3ZpZXdfcmVmJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGEgQ29tcG9uZW50IGNyZWF0ZWQgdmlhIHtAbGluayBEeW5hbWljQ29tcG9uZW50TG9hZGVyfS5cbiAqXG4gKiBgQ29tcG9uZW50UmVmYCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIENvbXBvbmVudCBJbnN0YW5jZSBhcyB3ZWxsIG90aGVyIG9iamVjdHMgcmVsYXRlZCB0byB0aGlzXG4gKiBDb21wb25lbnQgSW5zdGFuY2UgYW5kIGFsbG93cyB5b3UgdG8gZGVzdHJveSB0aGUgQ29tcG9uZW50IEluc3RhbmNlIHZpYSB0aGUge0BsaW5rICNkaXNwb3NlfVxuICogbWV0aG9kLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tcG9uZW50UmVmIHtcbiAgLyoqXG4gICAqIFRoZSBpbmplY3RvciBwcm92aWRlZCB7QGxpbmsgRHluYW1pY0NvbXBvbmVudExvYWRlciNsb2FkQXNSb290fS5cbiAgICpcbiAgICogVE9ETyhpKTogdGhpcyBhcGkgaXMgdXNlbGVzcyBhbmQgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGFuIGluamVjdG9yIHJldHJpZXZlZCBmcm9tXG4gICAqICAgICB0aGUgSG9zdEVsZW1lbnRSZWYsIHdoaWNoIGlzIGN1cnJlbnRseSBub3QgcG9zc2libGUuXG4gICAqL1xuICBpbmplY3RvcjogSW5qZWN0b3I7XG5cbiAgLyoqXG4gICAqIExvY2F0aW9uIG9mIHRoZSBIb3N0IEVsZW1lbnQgb2YgdGhpcyBDb21wb25lbnQgSW5zdGFuY2UuXG4gICAqL1xuICBsb2NhdGlvbjogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogVGhlIGluc3RhbmNlIG9mIHRoZSBDb21wb25lbnQuXG4gICAqL1xuICBpbnN0YW5jZTogYW55O1xuXG4gIC8qKlxuICAgKiBUaGUgdXNlciBkZWZpbmVkIGNvbXBvbmVudCB0eXBlLCByZXByZXNlbnRlZCB2aWEgdGhlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLlxuICAgKlxuICAgKiA8IS0tIFRPRE86IGN1c3RvbWl6ZSB3b3JkaW5nIGZvciBEYXJ0IGRvY3MgLS0+XG4gICAqL1xuICBjb21wb25lbnRUeXBlOiBUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUge0BsaW5rIFZpZXdSZWZ9IG9mIHRoZSBIb3N0IFZpZXcgb2YgdGhpcyBDb21wb25lbnQgaW5zdGFuY2UuXG4gICAqL1xuICBnZXQgaG9zdFZpZXcoKTogSG9zdFZpZXdSZWYgeyByZXR1cm4gdGhpcy5sb2NhdGlvbi5wYXJlbnRWaWV3OyB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKlxuICAgKiBUaGUgaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudC5cbiAgICpcbiAgICogVE9ETyhpKTogdGhpcyBhcGkgc2hvdWxkIGJlIHJlbW92ZWRcbiAgICovXG4gIGdldCBob3N0Q29tcG9uZW50KCk6IGFueSB7IHJldHVybiB0aGlzLmluc3RhbmNlOyB9XG5cbiAgLyoqXG4gICAqIERlc3Ryb3lzIHRoZSBjb21wb25lbnQgaW5zdGFuY2UgYW5kIGFsbCBvZiB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFzc29jaWF0ZWQgd2l0aCBpdC5cbiAgICpcbiAgICogVE9ETyhpKTogcmVuYW1lIHRvIGRlc3Ryb3kgdG8gYmUgY29uc2lzdGVudCB3aXRoIEFwcFZpZXdNYW5hZ2VyIGFuZCBWaWV3Q29udGFpbmVyUmVmXG4gICAqL1xuICBhYnN0cmFjdCBkaXNwb3NlKCk7XG59XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRSZWZfIGV4dGVuZHMgQ29tcG9uZW50UmVmIHtcbiAgLyoqXG4gICAqIFRPRE8oaSk6IHJlZmFjdG9yIGludG8gcHVibGljL3ByaXZhdGUgZmllbGRzXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihsb2NhdGlvbjogRWxlbWVudFJlZiwgaW5zdGFuY2U6IGFueSwgY29tcG9uZW50VHlwZTogVHlwZSwgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgICAgICAgICAgICBwcml2YXRlIF9kaXNwb3NlOiAoKSA9PiB2b2lkKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxvY2F0aW9uID0gbG9jYXRpb247XG4gICAgdGhpcy5pbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7XG4gICAgdGhpcy5pbmplY3RvciA9IGluamVjdG9yO1xuICB9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgQ29tcG9uZW50IGluc3RhbmNlLlxuICAgKlxuICAgKiBUT0RPKGkpOiB0aGlzIGFwaSBzaG91bGQgYmUgcmVtb3ZlZFxuICAgKi9cbiAgZ2V0IGhvc3RDb21wb25lbnRUeXBlKCk6IFR5cGUgeyByZXR1cm4gdGhpcy5jb21wb25lbnRUeXBlOyB9XG5cbiAgZGlzcG9zZSgpIHsgdGhpcy5fZGlzcG9zZSgpOyB9XG59XG5cbi8qKlxuICogU2VydmljZSBmb3IgaW5zdGFudGlhdGluZyBhIENvbXBvbmVudCBhbmQgYXR0YWNoaW5nIGl0IHRvIGEgVmlldyBhdCBhIHNwZWNpZmllZCBsb2NhdGlvbi5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIER5bmFtaWNDb21wb25lbnRMb2FkZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIENvbXBvbmVudCBgdHlwZWAgYW5kIGF0dGFjaGVzIGl0IHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZVxuICAgKiBwbGF0Zm9ybS1zcGVjaWZpYyBnbG9iYWwgdmlldyB0aGF0IG1hdGNoZXMgdGhlIGNvbXBvbmVudCdzIHNlbGVjdG9yLlxuICAgKlxuICAgKiBJbiBhIGJyb3dzZXIgdGhlIHBsYXRmb3JtLXNwZWNpZmljIGdsb2JhbCB2aWV3IGlzIHRoZSBtYWluIERPTSBEb2N1bWVudC5cbiAgICpcbiAgICogSWYgbmVlZGVkLCB0aGUgY29tcG9uZW50J3Mgc2VsZWN0b3IgY2FuIGJlIG92ZXJyaWRkZW4gdmlhIGBvdmVycmlkZVNlbGVjdG9yYC5cbiAgICpcbiAgICogWW91IGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgYGluamVjdG9yYCBhbmQgdGhpcyB7QGxpbmsgSW5qZWN0b3J9IHdpbGwgYmUgdXNlZCB0byBpbnN0YW50aWF0ZSB0aGVcbiAgICogQ29tcG9uZW50LlxuICAgKlxuICAgKiBUbyBiZSBub3RpZmllZCB3aGVuIHRoaXMgQ29tcG9uZW50IGluc3RhbmNlIGlzIGRlc3Ryb3llZCwgeW91IGNhbiBhbHNvIG9wdGlvbmFsbHkgcHJvdmlkZVxuICAgKiBgb25EaXNwb3NlYCBjYWxsYmFjay5cbiAgICpcbiAgICogUmV0dXJucyBhIHByb21pc2UgZm9yIHRoZSB7QGxpbmsgQ29tcG9uZW50UmVmfSByZXByZXNlbnRpbmcgdGhlIG5ld2x5IGNyZWF0ZWQgQ29tcG9uZW50LlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdjaGlsZC1jb21wb25lbnQnLFxuICAgKiAgIHRlbXBsYXRlOiAnQ2hpbGQnXG4gICAqIH0pXG4gICAqIGNsYXNzIENoaWxkQ29tcG9uZW50IHtcbiAgICogfVxuICAgKlxuICAgKiBAQ29tcG9uZW50KHtcbiAgICogICBzZWxlY3RvcjogJ215LWFwcCcsXG4gICAqICAgdGVtcGxhdGU6ICdQYXJlbnQgKDxjaGlsZCBpZD1cImNoaWxkXCI+PC9jaGlsZD4pJ1xuICAgKiB9KVxuICAgKiBjbGFzcyBNeUFwcCB7XG4gICAqICAgY29uc3RydWN0b3IoZGNsOiBEeW5hbWljQ29tcG9uZW50TG9hZGVyLCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICogICAgIGRjbC5sb2FkQXNSb290KENoaWxkQ29tcG9uZW50LCAnI2NoaWxkJywgaW5qZWN0b3IpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBib290c3RyYXAoTXlBcHApO1xuICAgKiBgYGBcbiAgICpcbiAgICogUmVzdWx0aW5nIERPTTpcbiAgICpcbiAgICogYGBgXG4gICAqIDxteS1hcHA+XG4gICAqICAgUGFyZW50IChcbiAgICogICAgIDxjaGlsZCBpZD1cImNoaWxkXCI+Q2hpbGQ8L2NoaWxkPlxuICAgKiAgIClcbiAgICogPC9teS1hcHA+XG4gICAqIGBgYFxuICAgKi9cbiAgYWJzdHJhY3QgbG9hZEFzUm9vdCh0eXBlOiBUeXBlLCBvdmVycmlkZVNlbGVjdG9yOiBzdHJpbmcsIGluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICBvbkRpc3Bvc2U/OiAoKSA9PiB2b2lkKTogUHJvbWlzZTxDb21wb25lbnRSZWY+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIGEgQ29tcG9uZW50IGFuZCBhdHRhY2hlcyBpdCB0byBhIFZpZXcgQ29udGFpbmVyIGxvY2F0ZWQgaW5zaWRlIG9mIHRoZVxuICAgKiBDb21wb25lbnQgVmlldyBvZiBhbm90aGVyIENvbXBvbmVudCBpbnN0YW5jZS5cbiAgICpcbiAgICogVGhlIHRhcmdldGVkIENvbXBvbmVudCBJbnN0YW5jZSBpcyBzcGVjaWZpZWQgdmlhIGl0cyBgaG9zdExvY2F0aW9uYCB7QGxpbmsgRWxlbWVudFJlZn0uIFRoZVxuICAgKiBsb2NhdGlvbiB3aXRoaW4gdGhlIENvbXBvbmVudCBWaWV3IG9mIHRoaXMgQ29tcG9uZW50IEluc3RhbmNlIGlzIHNwZWNpZmllZCB2aWEgYGFuY2hvck5hbWVgXG4gICAqIFRlbXBsYXRlIFZhcmlhYmxlIE5hbWUuXG4gICAqXG4gICAqIFlvdSBjYW4gb3B0aW9uYWxseSBwcm92aWRlIGBwcm92aWRlcnNgIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIEluamVjdG9yfSBwcm92aXNpb25lZCBmb3IgdGhpc1xuICAgKiBDb21wb25lbnQgSW5zdGFuY2UuXG4gICAqXG4gICAqIFJldHVybnMgYSBwcm9taXNlIGZvciB0aGUge0BsaW5rIENvbXBvbmVudFJlZn0gcmVwcmVzZW50aW5nIHRoZSBuZXdseSBjcmVhdGVkIENvbXBvbmVudC5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnY2hpbGQtY29tcG9uZW50JyxcbiAgICogICB0ZW1wbGF0ZTogJ0NoaWxkJ1xuICAgKiB9KVxuICAgKiBjbGFzcyBDaGlsZENvbXBvbmVudCB7XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgKiAgIHRlbXBsYXRlOiAnUGFyZW50ICg8ZGl2ICNjaGlsZD48L2Rpdj4pJ1xuICAgKiB9KVxuICAgKiBjbGFzcyBNeUFwcCB7XG4gICAqICAgY29uc3RydWN0b3IoZGNsOiBEeW5hbWljQ29tcG9uZW50TG9hZGVyLCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAqICAgICBkY2wubG9hZEludG9Mb2NhdGlvbihDaGlsZENvbXBvbmVudCwgZWxlbWVudFJlZiwgJ2NoaWxkJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIGJvb3RzdHJhcChNeUFwcCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBSZXN1bHRpbmcgRE9NOlxuICAgKlxuICAgKiBgYGBcbiAgICogPG15LWFwcD5cbiAgICogICAgUGFyZW50IChcbiAgICogICAgICA8ZGl2ICNjaGlsZD1cIlwiIGNsYXNzPVwibmctYmluZGluZ1wiPjwvZGl2PlxuICAgKiAgICAgIDxjaGlsZC1jb21wb25lbnQgY2xhc3M9XCJuZy1iaW5kaW5nXCI+Q2hpbGQ8L2NoaWxkLWNvbXBvbmVudD5cbiAgICogICAgKVxuICAgKiA8L215LWFwcD5cbiAgICogYGBgXG4gICAqL1xuICBhYnN0cmFjdCBsb2FkSW50b0xvY2F0aW9uKHR5cGU6IFR5cGUsIGhvc3RMb2NhdGlvbjogRWxlbWVudFJlZiwgYW5jaG9yTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVycz86IFJlc29sdmVkUHJvdmlkZXJbXSk6IFByb21pc2U8Q29tcG9uZW50UmVmPjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIENvbXBvbmVudCBhbmQgYXR0YWNoZXMgaXQgdG8gdGhlIFZpZXcgQ29udGFpbmVyIGZvdW5kIGF0IHRoZVxuICAgKiBgbG9jYXRpb25gIHNwZWNpZmllZCBhcyB7QGxpbmsgRWxlbWVudFJlZn0uXG4gICAqXG4gICAqIFlvdSBjYW4gb3B0aW9uYWxseSBwcm92aWRlIGBwcm92aWRlcnNgIHRvIGNvbmZpZ3VyZSB0aGUge0BsaW5rIEluamVjdG9yfSBwcm92aXNpb25lZCBmb3IgdGhpc1xuICAgKiBDb21wb25lbnQgSW5zdGFuY2UuXG4gICAqXG4gICAqIFJldHVybnMgYSBwcm9taXNlIGZvciB0aGUge0BsaW5rIENvbXBvbmVudFJlZn0gcmVwcmVzZW50aW5nIHRoZSBuZXdseSBjcmVhdGVkIENvbXBvbmVudC5cbiAgICpcbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnY2hpbGQtY29tcG9uZW50JyxcbiAgICogICB0ZW1wbGF0ZTogJ0NoaWxkJ1xuICAgKiB9KVxuICAgKiBjbGFzcyBDaGlsZENvbXBvbmVudCB7XG4gICAqIH1cbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICAgKiAgIHRlbXBsYXRlOiAnUGFyZW50J1xuICAgKiB9KVxuICAgKiBjbGFzcyBNeUFwcCB7XG4gICAqICAgY29uc3RydWN0b3IoZGNsOiBEeW5hbWljQ29tcG9uZW50TG9hZGVyLCBlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAqICAgICBkY2wubG9hZE5leHRUb0xvY2F0aW9uKENoaWxkQ29tcG9uZW50LCBlbGVtZW50UmVmKTtcbiAgICogICB9XG4gICAqIH1cbiAgICpcbiAgICogYm9vdHN0cmFwKE15QXBwKTtcbiAgICogYGBgXG4gICAqXG4gICAqIFJlc3VsdGluZyBET006XG4gICAqXG4gICAqIGBgYFxuICAgKiA8bXktYXBwPlBhcmVudDwvbXktYXBwPlxuICAgKiA8Y2hpbGQtY29tcG9uZW50PkNoaWxkPC9jaGlsZC1jb21wb25lbnQ+XG4gICAqIGBgYFxuICAgKi9cbiAgYWJzdHJhY3QgbG9hZE5leHRUb0xvY2F0aW9uKHR5cGU6IFR5cGUsIGxvY2F0aW9uOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzPzogUmVzb2x2ZWRQcm92aWRlcltdKTogUHJvbWlzZTxDb21wb25lbnRSZWY+O1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRHluYW1pY0NvbXBvbmVudExvYWRlcl8gZXh0ZW5kcyBEeW5hbWljQ29tcG9uZW50TG9hZGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfY29tcGlsZXI6IENvbXBpbGVyLCBwcml2YXRlIF92aWV3TWFuYWdlcjogQXBwVmlld01hbmFnZXIpIHsgc3VwZXIoKTsgfVxuXG4gIGxvYWRBc1Jvb3QodHlwZTogVHlwZSwgb3ZlcnJpZGVTZWxlY3Rvcjogc3RyaW5nLCBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgICAgICAgb25EaXNwb3NlPzogKCkgPT4gdm9pZCk6IFByb21pc2U8Q29tcG9uZW50UmVmPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbXBpbGVyLmNvbXBpbGVJbkhvc3QodHlwZSkudGhlbihob3N0UHJvdG9WaWV3UmVmID0+IHtcbiAgICAgIHZhciBob3N0Vmlld1JlZiA9XG4gICAgICAgICAgdGhpcy5fdmlld01hbmFnZXIuY3JlYXRlUm9vdEhvc3RWaWV3KGhvc3RQcm90b1ZpZXdSZWYsIG92ZXJyaWRlU2VsZWN0b3IsIGluamVjdG9yKTtcbiAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHRoaXMuX3ZpZXdNYW5hZ2VyLmdldEhvc3RFbGVtZW50KGhvc3RWaWV3UmVmKTtcbiAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLl92aWV3TWFuYWdlci5nZXRDb21wb25lbnQobmV3TG9jYXRpb24pO1xuXG4gICAgICB2YXIgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgaWYgKGlzUHJlc2VudChvbkRpc3Bvc2UpKSB7XG4gICAgICAgICAgb25EaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdmlld01hbmFnZXIuZGVzdHJveVJvb3RIb3N0Vmlldyhob3N0Vmlld1JlZik7XG4gICAgICB9O1xuICAgICAgcmV0dXJuIG5ldyBDb21wb25lbnRSZWZfKG5ld0xvY2F0aW9uLCBjb21wb25lbnQsIHR5cGUsIGluamVjdG9yLCBkaXNwb3NlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGxvYWRJbnRvTG9jYXRpb24odHlwZTogVHlwZSwgaG9zdExvY2F0aW9uOiBFbGVtZW50UmVmLCBhbmNob3JOYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBSZXNvbHZlZFByb3ZpZGVyW10gPSBudWxsKTogUHJvbWlzZTxDb21wb25lbnRSZWY+IHtcbiAgICByZXR1cm4gdGhpcy5sb2FkTmV4dFRvTG9jYXRpb24oXG4gICAgICAgIHR5cGUsIHRoaXMuX3ZpZXdNYW5hZ2VyLmdldE5hbWVkRWxlbWVudEluQ29tcG9uZW50Vmlldyhob3N0TG9jYXRpb24sIGFuY2hvck5hbWUpLFxuICAgICAgICBwcm92aWRlcnMpO1xuICB9XG5cbiAgbG9hZE5leHRUb0xvY2F0aW9uKHR5cGU6IFR5cGUsIGxvY2F0aW9uOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBSZXNvbHZlZFByb3ZpZGVyW10gPSBudWxsKTogUHJvbWlzZTxDb21wb25lbnRSZWY+IHtcbiAgICByZXR1cm4gdGhpcy5fY29tcGlsZXIuY29tcGlsZUluSG9zdCh0eXBlKS50aGVuKGhvc3RQcm90b1ZpZXdSZWYgPT4ge1xuICAgICAgdmFyIHZpZXdDb250YWluZXIgPSB0aGlzLl92aWV3TWFuYWdlci5nZXRWaWV3Q29udGFpbmVyKGxvY2F0aW9uKTtcbiAgICAgIHZhciBob3N0Vmlld1JlZiA9XG4gICAgICAgICAgdmlld0NvbnRhaW5lci5jcmVhdGVIb3N0Vmlldyhob3N0UHJvdG9WaWV3UmVmLCB2aWV3Q29udGFpbmVyLmxlbmd0aCwgcHJvdmlkZXJzKTtcbiAgICAgIHZhciBuZXdMb2NhdGlvbiA9IHRoaXMuX3ZpZXdNYW5hZ2VyLmdldEhvc3RFbGVtZW50KGhvc3RWaWV3UmVmKTtcbiAgICAgIHZhciBjb21wb25lbnQgPSB0aGlzLl92aWV3TWFuYWdlci5nZXRDb21wb25lbnQobmV3TG9jYXRpb24pO1xuXG4gICAgICB2YXIgZGlzcG9zZSA9ICgpID0+IHtcbiAgICAgICAgdmFyIGluZGV4ID0gdmlld0NvbnRhaW5lci5pbmRleE9mKDxWaWV3UmVmPmhvc3RWaWV3UmVmKTtcbiAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgIHZpZXdDb250YWluZXIucmVtb3ZlKGluZGV4KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50UmVmXyhuZXdMb2NhdGlvbiwgY29tcG9uZW50LCB0eXBlLCBudWxsLCBkaXNwb3NlKTtcbiAgICB9KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2R5bmFtaWNfY29tcG9uZW50X2xvYWRlci50c1xuICoqLyIsImltcG9ydCB7UHJvdG9WaWV3UmVmfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19yZWYnO1xuaW1wb3J0IHtQcm90b1ZpZXdGYWN0b3J5fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvcHJvdG9fdmlld19mYWN0b3J5JztcblxuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1R5cGUsIGlzQmxhbmssIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7UHJvbWlzZSwgUHJvbWlzZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtyZWZsZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5pbXBvcnQge0NvbXBpbGVkSG9zdFRlbXBsYXRlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdGVtcGxhdGVfY29tbWFuZHMnO1xuXG4vKipcbiAqIExvdy1sZXZlbCBzZXJ2aWNlIGZvciBjb21waWxpbmcge0BsaW5rIENvbXBvbmVudH1zIGludG8ge0BsaW5rIFByb3RvVmlld1JlZiBQcm90b1ZpZXdzfXMsIHdoaWNoXG4gKiBjYW4gbGF0ZXIgYmUgdXNlZCB0byBjcmVhdGUgYW5kIHJlbmRlciBhIENvbXBvbmVudCBpbnN0YW5jZS5cbiAqXG4gKiBNb3N0IGFwcGxpY2F0aW9ucyBzaG91bGQgaW5zdGVhZCB1c2UgaGlnaGVyLWxldmVsIHtAbGluayBEeW5hbWljQ29tcG9uZW50TG9hZGVyfSBzZXJ2aWNlLCB3aGljaFxuICogYm90aCBjb21waWxlcyBhbmQgaW5zdGFudGlhdGVzIGEgQ29tcG9uZW50LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29tcGlsZXIge1xuICBhYnN0cmFjdCBjb21waWxlSW5Ib3N0KGNvbXBvbmVudFR5cGU6IFR5cGUpOiBQcm9taXNlPFByb3RvVmlld1JlZj47XG4gIGFic3RyYWN0IGNsZWFyQ2FjaGUoKTtcbn1cblxuZnVuY3Rpb24gX2lzQ29tcGlsZWRIb3N0VGVtcGxhdGUodHlwZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiB0eXBlIGluc3RhbmNlb2YgQ29tcGlsZWRIb3N0VGVtcGxhdGU7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb21waWxlcl8gZXh0ZW5kcyBDb21waWxlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3Byb3RvVmlld0ZhY3Rvcnk6IFByb3RvVmlld0ZhY3RvcnkpIHsgc3VwZXIoKTsgfVxuXG4gIGNvbXBpbGVJbkhvc3QoY29tcG9uZW50VHlwZTogVHlwZSk6IFByb21pc2U8UHJvdG9WaWV3UmVmPiB7XG4gICAgdmFyIG1ldGFkYXRhcyA9IHJlZmxlY3Rvci5hbm5vdGF0aW9ucyhjb21wb25lbnRUeXBlKTtcbiAgICB2YXIgY29tcGlsZWRIb3N0VGVtcGxhdGUgPSBtZXRhZGF0YXMuZmluZChfaXNDb21waWxlZEhvc3RUZW1wbGF0ZSk7XG5cbiAgICBpZiAoaXNCbGFuayhjb21waWxlZEhvc3RUZW1wbGF0ZSkpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgIGBObyBwcmVjb21waWxlZCB0ZW1wbGF0ZSBmb3IgY29tcG9uZW50ICR7c3RyaW5naWZ5KGNvbXBvbmVudFR5cGUpfSBmb3VuZGApO1xuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZVdyYXBwZXIucmVzb2x2ZSh0aGlzLl9jcmVhdGVQcm90b1ZpZXcoY29tcGlsZWRIb3N0VGVtcGxhdGUpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVByb3RvVmlldyhjb21waWxlZEhvc3RUZW1wbGF0ZTogQ29tcGlsZWRIb3N0VGVtcGxhdGUpOiBQcm90b1ZpZXdSZWYge1xuICAgIHJldHVybiB0aGlzLl9wcm90b1ZpZXdGYWN0b3J5LmNyZWF0ZUhvc3QoY29tcGlsZWRIb3N0VGVtcGxhdGUpLnJlZjtcbiAgfVxuXG4gIGNsZWFyQ2FjaGUoKSB7IHRoaXMuX3Byb3RvVmlld0ZhY3RvcnkuY2xlYXJDYWNoZSgpOyB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcm5hbENyZWF0ZVByb3RvVmlldyhjb21waWxlcjogQ29tcGlsZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRIb3N0VGVtcGxhdGU6IENvbXBpbGVkSG9zdFRlbXBsYXRlKTogUHJvdG9WaWV3UmVmIHtcbiAgcmV0dXJuICg8YW55PmNvbXBpbGVyKS5fY3JlYXRlUHJvdG9WaWV3KGNvbXBpbGVkSG9zdFRlbXBsYXRlKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9jb21waWxlci50c1xuICoqLyIsImltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rLCBUeXBlLCBpc0FycmF5LCBpc051bWJlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuaW1wb3J0IHtSZW5kZXJQcm90b1ZpZXdSZWYsIFJlbmRlckNvbXBvbmVudFRlbXBsYXRlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpJztcblxuaW1wb3J0IHtPcHRpb25hbCwgSW5qZWN0YWJsZSwgUHJvdmlkZXIsIHJlc29sdmVGb3J3YXJkUmVmLCBJbmplY3R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcblxuaW1wb3J0IHtQaXBlUHJvdmlkZXJ9IGZyb20gJy4uL3BpcGVzL3BpcGVfcHJvdmlkZXInO1xuaW1wb3J0IHtQcm90b1BpcGVzfSBmcm9tICcuLi9waXBlcy9waXBlcyc7XG5cbmltcG9ydCB7QXBwUHJvdG9WaWV3LCBBcHBQcm90b1ZpZXdNZXJnZUluZm8sIFZpZXdUeXBlfSBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHtFbGVtZW50QmluZGVyfSBmcm9tICcuL2VsZW1lbnRfYmluZGVyJztcbmltcG9ydCB7UHJvdG9FbGVtZW50SW5qZWN0b3IsIERpcmVjdGl2ZVByb3ZpZGVyfSBmcm9tICcuL2VsZW1lbnRfaW5qZWN0b3InO1xuaW1wb3J0IHtEaXJlY3RpdmVSZXNvbHZlcn0gZnJvbSAnLi9kaXJlY3RpdmVfcmVzb2x2ZXInO1xuaW1wb3J0IHtWaWV3UmVzb2x2ZXJ9IGZyb20gJy4vdmlld19yZXNvbHZlcic7XG5pbXBvcnQge1BpcGVSZXNvbHZlcn0gZnJvbSAnLi9waXBlX3Jlc29sdmVyJztcbmltcG9ydCB7Vmlld01ldGFkYXRhLCBWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnLi4vbWV0YWRhdGEvdmlldyc7XG5pbXBvcnQge1BMQVRGT1JNX1BJUEVTfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9wbGF0Zm9ybV9kaXJlY3RpdmVzX2FuZF9waXBlcyc7XG5cbmltcG9ydCB7XG4gIHZpc2l0QWxsQ29tbWFuZHMsXG4gIENvbXBpbGVkQ29tcG9uZW50VGVtcGxhdGUsXG4gIENvbXBpbGVkSG9zdFRlbXBsYXRlLFxuICBUZW1wbGF0ZUNtZCxcbiAgQ29tbWFuZFZpc2l0b3IsXG4gIEVtYmVkZGVkVGVtcGxhdGVDbWQsXG4gIEJlZ2luQ29tcG9uZW50Q21kLFxuICBCZWdpbkVsZW1lbnRDbWQsXG4gIElCZWdpbkVsZW1lbnRDbWQsXG4gIFRleHRDbWQsXG4gIE5nQ29udGVudENtZFxufSBmcm9tICcuL3RlbXBsYXRlX2NvbW1hbmRzJztcblxuaW1wb3J0IHtSZW5kZXJlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL2FwaSc7XG5pbXBvcnQge0FQUF9JRH0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fdG9rZW5zJztcblxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHJvdG9WaWV3RmFjdG9yeSB7XG4gIHByaXZhdGUgX2NhY2hlOiBNYXA8c3RyaW5nLCBBcHBQcm90b1ZpZXc+ID0gbmV3IE1hcDxzdHJpbmcsIEFwcFByb3RvVmlldz4oKTtcbiAgcHJpdmF0ZSBfbmV4dFRlbXBsYXRlSWQ6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KFBMQVRGT1JNX1BJUEVTKSBwcml2YXRlIF9wbGF0Zm9ybVBpcGVzOiBBcnJheTxUeXBlIHwgYW55W10+LFxuICAgICAgICAgICAgICBwcml2YXRlIF9kaXJlY3RpdmVSZXNvbHZlcjogRGlyZWN0aXZlUmVzb2x2ZXIsIHByaXZhdGUgX3ZpZXdSZXNvbHZlcjogVmlld1Jlc29sdmVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9waXBlUmVzb2x2ZXI6IFBpcGVSZXNvbHZlciwgQEluamVjdChBUFBfSUQpIHByaXZhdGUgX2FwcElkOiBzdHJpbmcpIHt9XG5cbiAgY2xlYXJDYWNoZSgpIHsgdGhpcy5fY2FjaGUuY2xlYXIoKTsgfVxuXG4gIGNyZWF0ZUhvc3QoY29tcGlsZWRIb3N0VGVtcGxhdGU6IENvbXBpbGVkSG9zdFRlbXBsYXRlKTogQXBwUHJvdG9WaWV3IHtcbiAgICB2YXIgY29tcGlsZWRUZW1wbGF0ZSA9IGNvbXBpbGVkSG9zdFRlbXBsYXRlLnRlbXBsYXRlO1xuICAgIHZhciByZXN1bHQgPSB0aGlzLl9jYWNoZS5nZXQoY29tcGlsZWRUZW1wbGF0ZS5pZCk7XG4gICAgaWYgKGlzQmxhbmsocmVzdWx0KSkge1xuICAgICAgdmFyIGVtcHR5TWFwOiB7W2tleTogc3RyaW5nXTogUGlwZVByb3ZpZGVyfSA9IHt9O1xuICAgICAgdmFyIHNob3J0SWQgPSBgJHt0aGlzLl9hcHBJZH0tJHt0aGlzLl9uZXh0VGVtcGxhdGVJZCsrfWA7XG4gICAgICB0aGlzLl9yZW5kZXJlci5yZWdpc3RlckNvbXBvbmVudFRlbXBsYXRlKG5ldyBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZShcbiAgICAgICAgICBjb21waWxlZFRlbXBsYXRlLmlkLCBzaG9ydElkLCBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLCBjb21waWxlZFRlbXBsYXRlLmNvbW1hbmRzLCBbXSkpO1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgICBuZXcgQXBwUHJvdG9WaWV3KGNvbXBpbGVkVGVtcGxhdGUuaWQsIGNvbXBpbGVkVGVtcGxhdGUuY29tbWFuZHMsIFZpZXdUeXBlLkhPU1QsIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjb21waWxlZFRlbXBsYXRlLmNoYW5nZURldGVjdG9yRmFjdG9yeSwgbnVsbCwgbmV3IFByb3RvUGlwZXMoZW1wdHlNYXApKTtcbiAgICAgIHRoaXMuX2NhY2hlLnNldChjb21waWxlZFRlbXBsYXRlLmlkLCByZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlQ29tcG9uZW50KGNtZDogQmVnaW5Db21wb25lbnRDbWQpOiBBcHBQcm90b1ZpZXcge1xuICAgIHZhciBuZXN0ZWRQcm90b1ZpZXcgPSB0aGlzLl9jYWNoZS5nZXQoY21kLnRlbXBsYXRlSWQpO1xuICAgIGlmIChpc0JsYW5rKG5lc3RlZFByb3RvVmlldykpIHtcbiAgICAgIHZhciBjb21wb25lbnQgPSBjbWQuZGlyZWN0aXZlc1swXTtcbiAgICAgIHZhciB2aWV3ID0gdGhpcy5fdmlld1Jlc29sdmVyLnJlc29sdmUoY29tcG9uZW50KTtcbiAgICAgIHZhciBjb21waWxlZFRlbXBsYXRlID0gY21kLnRlbXBsYXRlR2V0dGVyKCk7XG4gICAgICB2YXIgc3R5bGVzID0gX2ZsYXR0ZW5TdHlsZUFycihjb21waWxlZFRlbXBsYXRlLnN0eWxlcywgW10pO1xuICAgICAgdmFyIHNob3J0SWQgPSBgJHt0aGlzLl9hcHBJZH0tJHt0aGlzLl9uZXh0VGVtcGxhdGVJZCsrfWA7XG4gICAgICB0aGlzLl9yZW5kZXJlci5yZWdpc3RlckNvbXBvbmVudFRlbXBsYXRlKG5ldyBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZShcbiAgICAgICAgICBjb21waWxlZFRlbXBsYXRlLmlkLCBzaG9ydElkLCBjbWQuZW5jYXBzdWxhdGlvbiwgY29tcGlsZWRUZW1wbGF0ZS5jb21tYW5kcywgc3R5bGVzKSk7XG4gICAgICB2YXIgYm91bmRQaXBlcyA9IHRoaXMuX2ZsYXR0ZW5QaXBlcyh2aWV3KS5tYXAocGlwZSA9PiB0aGlzLl9iaW5kUGlwZShwaXBlKSk7XG5cbiAgICAgIG5lc3RlZFByb3RvVmlldyA9IG5ldyBBcHBQcm90b1ZpZXcoXG4gICAgICAgICAgY29tcGlsZWRUZW1wbGF0ZS5pZCwgY29tcGlsZWRUZW1wbGF0ZS5jb21tYW5kcywgVmlld1R5cGUuQ09NUE9ORU5ULCB0cnVlLFxuICAgICAgICAgIGNvbXBpbGVkVGVtcGxhdGUuY2hhbmdlRGV0ZWN0b3JGYWN0b3J5LCBudWxsLCBQcm90b1BpcGVzLmZyb21Qcm92aWRlcnMoYm91bmRQaXBlcykpO1xuICAgICAgLy8gTm90ZTogVGhlIGNhY2hlIGlzIHVwZGF0ZWQgYmVmb3JlIHJlY3Vyc2luZ1xuICAgICAgLy8gdG8gYmUgYWJsZSB0byByZXNvbHZlIGN5Y2xlc1xuICAgICAgdGhpcy5fY2FjaGUuc2V0KGNvbXBpbGVkVGVtcGxhdGUuaWQsIG5lc3RlZFByb3RvVmlldyk7XG4gICAgICB0aGlzLl9pbml0aWFsaXplUHJvdG9WaWV3KG5lc3RlZFByb3RvVmlldywgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBuZXN0ZWRQcm90b1ZpZXc7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVFbWJlZGRlZFRlbXBsYXRlKGNtZDogRW1iZWRkZWRUZW1wbGF0ZUNtZCwgcGFyZW50OiBBcHBQcm90b1ZpZXcpOiBBcHBQcm90b1ZpZXcge1xuICAgIHZhciBuZXN0ZWRQcm90b1ZpZXcgPSBuZXcgQXBwUHJvdG9WaWV3KFxuICAgICAgICBwYXJlbnQudGVtcGxhdGVJZCwgY21kLmNoaWxkcmVuLCBWaWV3VHlwZS5FTUJFRERFRCwgY21kLmlzTWVyZ2VkLCBjbWQuY2hhbmdlRGV0ZWN0b3JGYWN0b3J5LFxuICAgICAgICBhcnJheVRvTWFwKGNtZC52YXJpYWJsZU5hbWVBbmRWYWx1ZXMsIHRydWUpLCBuZXcgUHJvdG9QaXBlcyhwYXJlbnQucGlwZXMuY29uZmlnKSk7XG4gICAgaWYgKGNtZC5pc01lcmdlZCkge1xuICAgICAgdGhpcy5pbml0aWFsaXplUHJvdG9WaWV3SWZOZWVkZWQobmVzdGVkUHJvdG9WaWV3KTtcbiAgICB9XG4gICAgcmV0dXJuIG5lc3RlZFByb3RvVmlldztcbiAgfVxuXG4gIGluaXRpYWxpemVQcm90b1ZpZXdJZk5lZWRlZChwcm90b1ZpZXc6IEFwcFByb3RvVmlldykge1xuICAgIGlmICghcHJvdG9WaWV3LmlzSW5pdGlhbGl6ZWQoKSkge1xuICAgICAgdmFyIHJlbmRlciA9IHRoaXMuX3JlbmRlcmVyLmNyZWF0ZVByb3RvVmlldyhwcm90b1ZpZXcudGVtcGxhdGVJZCwgcHJvdG9WaWV3LnRlbXBsYXRlQ21kcyk7XG4gICAgICB0aGlzLl9pbml0aWFsaXplUHJvdG9WaWV3KHByb3RvVmlldywgcmVuZGVyKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9pbml0aWFsaXplUHJvdG9WaWV3KHByb3RvVmlldzogQXBwUHJvdG9WaWV3LCByZW5kZXI6IFJlbmRlclByb3RvVmlld1JlZikge1xuICAgIHZhciBpbml0aWFsaXplciA9IG5ldyBfUHJvdG9WaWV3SW5pdGlhbGl6ZXIocHJvdG9WaWV3LCB0aGlzLl9kaXJlY3RpdmVSZXNvbHZlciwgdGhpcyk7XG4gICAgdmlzaXRBbGxDb21tYW5kcyhpbml0aWFsaXplciwgcHJvdG9WaWV3LnRlbXBsYXRlQ21kcyk7XG4gICAgdmFyIG1lcmdlSW5mbyA9XG4gICAgICAgIG5ldyBBcHBQcm90b1ZpZXdNZXJnZUluZm8oaW5pdGlhbGl6ZXIubWVyZ2VFbWJlZGRlZFZpZXdDb3VudCwgaW5pdGlhbGl6ZXIubWVyZ2VFbGVtZW50Q291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXIubWVyZ2VWaWV3Q291bnQpO1xuICAgIHByb3RvVmlldy5pbml0KHJlbmRlciwgaW5pdGlhbGl6ZXIuZWxlbWVudEJpbmRlcnMsIGluaXRpYWxpemVyLmJvdW5kVGV4dENvdW50LCBtZXJnZUluZm8sXG4gICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXIudmFyaWFibGVMb2NhdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYmluZFBpcGUodHlwZU9yUHJvdmlkZXIpOiBQaXBlUHJvdmlkZXIge1xuICAgIGxldCBtZXRhID0gdGhpcy5fcGlwZVJlc29sdmVyLnJlc29sdmUodHlwZU9yUHJvdmlkZXIpO1xuICAgIHJldHVybiBQaXBlUHJvdmlkZXIuY3JlYXRlRnJvbVR5cGUodHlwZU9yUHJvdmlkZXIsIG1ldGEpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZmxhdHRlblBpcGVzKHZpZXc6IFZpZXdNZXRhZGF0YSk6IGFueVtdIHtcbiAgICBsZXQgcGlwZXMgPSBbXTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BsYXRmb3JtUGlwZXMpKSB7XG4gICAgICBfZmxhdHRlbkFycmF5KHRoaXMuX3BsYXRmb3JtUGlwZXMsIHBpcGVzKTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudCh2aWV3LnBpcGVzKSkge1xuICAgICAgX2ZsYXR0ZW5BcnJheSh2aWV3LnBpcGVzLCBwaXBlcyk7XG4gICAgfVxuICAgIHJldHVybiBwaXBlcztcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBvbmVudChwcm90b1ZpZXdGYWN0b3J5OiBQcm90b1ZpZXdGYWN0b3J5LCBjbWQ6IEJlZ2luQ29tcG9uZW50Q21kKTogQXBwUHJvdG9WaWV3IHtcbiAgcmV0dXJuICg8YW55PnByb3RvVmlld0ZhY3RvcnkpLl9jcmVhdGVDb21wb25lbnQoY21kKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZShwcm90b1ZpZXdGYWN0b3J5OiBQcm90b1ZpZXdGYWN0b3J5LCBjbWQ6IEVtYmVkZGVkVGVtcGxhdGVDbWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogQXBwUHJvdG9WaWV3KTogQXBwUHJvdG9WaWV3IHtcbiAgcmV0dXJuICg8YW55PnByb3RvVmlld0ZhY3RvcnkpLl9jcmVhdGVFbWJlZGRlZFRlbXBsYXRlKGNtZCwgcGFyZW50KTtcbn1cblxuY2xhc3MgX1Byb3RvVmlld0luaXRpYWxpemVyIGltcGxlbWVudHMgQ29tbWFuZFZpc2l0b3Ige1xuICB2YXJpYWJsZUxvY2F0aW9uczogTWFwPHN0cmluZywgbnVtYmVyPiA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGJvdW5kVGV4dENvdW50OiBudW1iZXIgPSAwO1xuICBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyID0gMDtcbiAgZWxlbWVudEJpbmRlclN0YWNrOiBFbGVtZW50QmluZGVyW10gPSBbXTtcbiAgZGlzdGFuY2VUb1BhcmVudEVsZW1lbnRCaW5kZXI6IG51bWJlciA9IDA7XG4gIGRpc3RhbmNlVG9QYXJlbnRQcm90b0VsZW1lbnRJbmplY3RvcjogbnVtYmVyID0gMDtcbiAgZWxlbWVudEJpbmRlcnM6IEVsZW1lbnRCaW5kZXJbXSA9IFtdO1xuICBtZXJnZUVtYmVkZGVkVmlld0NvdW50OiBudW1iZXIgPSAwO1xuICBtZXJnZUVsZW1lbnRDb3VudDogbnVtYmVyID0gMDtcbiAgbWVyZ2VWaWV3Q291bnQ6IG51bWJlciA9IDE7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcHJvdG9WaWV3OiBBcHBQcm90b1ZpZXcsIHByaXZhdGUgX2RpcmVjdGl2ZVJlc29sdmVyOiBEaXJlY3RpdmVSZXNvbHZlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcHJvdG9WaWV3RmFjdG9yeTogUHJvdG9WaWV3RmFjdG9yeSkge31cblxuICB2aXNpdFRleHQoY21kOiBUZXh0Q21kLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIGlmIChjbWQuaXNCb3VuZCkge1xuICAgICAgdGhpcy5ib3VuZFRleHRDb3VudCsrO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdE5nQ29udGVudChjbWQ6IE5nQ29udGVudENtZCwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIG51bGw7IH1cbiAgdmlzaXRCZWdpbkVsZW1lbnQoY21kOiBCZWdpbkVsZW1lbnRDbWQsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgaWYgKGNtZC5pc0JvdW5kKSB7XG4gICAgICB0aGlzLl92aXNpdEJlZ2luQm91bmRFbGVtZW50KGNtZCwgbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX3Zpc2l0QmVnaW5FbGVtZW50KGNtZCwgbnVsbCwgbnVsbCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RW5kRWxlbWVudChjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gdGhpcy5fdmlzaXRFbmRFbGVtZW50KCk7IH1cbiAgdmlzaXRCZWdpbkNvbXBvbmVudChjbWQ6IEJlZ2luQ29tcG9uZW50Q21kLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHZhciBuZXN0ZWRQcm90b1ZpZXcgPSBjcmVhdGVDb21wb25lbnQodGhpcy5fcHJvdG9WaWV3RmFjdG9yeSwgY21kKTtcbiAgICByZXR1cm4gdGhpcy5fdmlzaXRCZWdpbkJvdW5kRWxlbWVudChjbWQsIG5lc3RlZFByb3RvVmlldyk7XG4gIH1cbiAgdmlzaXRFbmRDb21wb25lbnQoY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIHRoaXMuX3Zpc2l0RW5kRWxlbWVudCgpOyB9XG4gIHZpc2l0RW1iZWRkZWRUZW1wbGF0ZShjbWQ6IEVtYmVkZGVkVGVtcGxhdGVDbWQsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdmFyIG5lc3RlZFByb3RvVmlldyA9IGNyZWF0ZUVtYmVkZGVkVGVtcGxhdGUodGhpcy5fcHJvdG9WaWV3RmFjdG9yeSwgY21kLCB0aGlzLl9wcm90b1ZpZXcpO1xuICAgIGlmIChjbWQuaXNNZXJnZWQpIHtcbiAgICAgIHRoaXMubWVyZ2VFbWJlZGRlZFZpZXdDb3VudCsrO1xuICAgIH1cbiAgICB0aGlzLl92aXNpdEJlZ2luQm91bmRFbGVtZW50KGNtZCwgbmVzdGVkUHJvdG9WaWV3KTtcbiAgICByZXR1cm4gdGhpcy5fdmlzaXRFbmRFbGVtZW50KCk7XG4gIH1cblxuICBwcml2YXRlIF92aXNpdEJlZ2luQm91bmRFbGVtZW50KGNtZDogSUJlZ2luRWxlbWVudENtZCwgbmVzdGVkUHJvdG9WaWV3OiBBcHBQcm90b1ZpZXcpOiBhbnkge1xuICAgIGlmIChpc1ByZXNlbnQobmVzdGVkUHJvdG9WaWV3KSAmJiBuZXN0ZWRQcm90b1ZpZXcuaXNNZXJnYWJsZSkge1xuICAgICAgdGhpcy5tZXJnZUVsZW1lbnRDb3VudCArPSBuZXN0ZWRQcm90b1ZpZXcubWVyZ2VJbmZvLmVsZW1lbnRDb3VudDtcbiAgICAgIHRoaXMubWVyZ2VWaWV3Q291bnQgKz0gbmVzdGVkUHJvdG9WaWV3Lm1lcmdlSW5mby52aWV3Q291bnQ7XG4gICAgICB0aGlzLm1lcmdlRW1iZWRkZWRWaWV3Q291bnQgKz0gbmVzdGVkUHJvdG9WaWV3Lm1lcmdlSW5mby5lbWJlZGRlZFZpZXdDb3VudDtcbiAgICB9XG4gICAgdmFyIGVsZW1lbnRCaW5kZXIgPSBfY3JlYXRlRWxlbWVudEJpbmRlcihcbiAgICAgICAgdGhpcy5fZGlyZWN0aXZlUmVzb2x2ZXIsIG5lc3RlZFByb3RvVmlldywgdGhpcy5lbGVtZW50QmluZGVyU3RhY2ssIHRoaXMuYm91bmRFbGVtZW50SW5kZXgsXG4gICAgICAgIHRoaXMuZGlzdGFuY2VUb1BhcmVudEVsZW1lbnRCaW5kZXIsIHRoaXMuZGlzdGFuY2VUb1BhcmVudFByb3RvRWxlbWVudEluamVjdG9yLCBjbWQpO1xuICAgIHRoaXMuZWxlbWVudEJpbmRlcnMucHVzaChlbGVtZW50QmluZGVyKTtcbiAgICB2YXIgcHJvdG9FbGVtZW50SW5qZWN0b3IgPSBlbGVtZW50QmluZGVyLnByb3RvRWxlbWVudEluamVjdG9yO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY21kLnZhcmlhYmxlTmFtZUFuZFZhbHVlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgdGhpcy52YXJpYWJsZUxvY2F0aW9ucy5zZXQoPHN0cmluZz5jbWQudmFyaWFibGVOYW1lQW5kVmFsdWVzW2ldLCB0aGlzLmJvdW5kRWxlbWVudEluZGV4KTtcbiAgICB9XG4gICAgdGhpcy5ib3VuZEVsZW1lbnRJbmRleCsrO1xuICAgIHRoaXMubWVyZ2VFbGVtZW50Q291bnQrKztcbiAgICByZXR1cm4gdGhpcy5fdmlzaXRCZWdpbkVsZW1lbnQoY21kLCBlbGVtZW50QmluZGVyLCBwcm90b0VsZW1lbnRJbmplY3Rvcik7XG4gIH1cblxuICBwcml2YXRlIF92aXNpdEJlZ2luRWxlbWVudChjbWQ6IElCZWdpbkVsZW1lbnRDbWQsIGVsZW1lbnRCaW5kZXI6IEVsZW1lbnRCaW5kZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvRWxlbWVudEluamVjdG9yOiBQcm90b0VsZW1lbnRJbmplY3Rvcik6IGFueSB7XG4gICAgdGhpcy5kaXN0YW5jZVRvUGFyZW50RWxlbWVudEJpbmRlciA9XG4gICAgICAgIGlzUHJlc2VudChlbGVtZW50QmluZGVyKSA/IDEgOiB0aGlzLmRpc3RhbmNlVG9QYXJlbnRFbGVtZW50QmluZGVyICsgMTtcbiAgICB0aGlzLmRpc3RhbmNlVG9QYXJlbnRQcm90b0VsZW1lbnRJbmplY3RvciA9XG4gICAgICAgIGlzUHJlc2VudChwcm90b0VsZW1lbnRJbmplY3RvcikgPyAxIDogdGhpcy5kaXN0YW5jZVRvUGFyZW50UHJvdG9FbGVtZW50SW5qZWN0b3IgKyAxO1xuICAgIHRoaXMuZWxlbWVudEJpbmRlclN0YWNrLnB1c2goZWxlbWVudEJpbmRlcik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBwcml2YXRlIF92aXNpdEVuZEVsZW1lbnQoKTogYW55IHtcbiAgICB2YXIgcGFyZW50RWxlbWVudEJpbmRlciA9IHRoaXMuZWxlbWVudEJpbmRlclN0YWNrLnBvcCgpO1xuICAgIHZhciBwYXJlbnRQcm90b0VsZW1lbnRJbmplY3RvciA9XG4gICAgICAgIGlzUHJlc2VudChwYXJlbnRFbGVtZW50QmluZGVyKSA/IHBhcmVudEVsZW1lbnRCaW5kZXIucHJvdG9FbGVtZW50SW5qZWN0b3IgOiBudWxsO1xuICAgIHRoaXMuZGlzdGFuY2VUb1BhcmVudEVsZW1lbnRCaW5kZXIgPSBpc1ByZXNlbnQocGFyZW50RWxlbWVudEJpbmRlcikgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudEJpbmRlci5kaXN0YW5jZVRvUGFyZW50IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzdGFuY2VUb1BhcmVudEVsZW1lbnRCaW5kZXIgLSAxO1xuICAgIHRoaXMuZGlzdGFuY2VUb1BhcmVudFByb3RvRWxlbWVudEluamVjdG9yID0gaXNQcmVzZW50KHBhcmVudFByb3RvRWxlbWVudEluamVjdG9yKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50UHJvdG9FbGVtZW50SW5qZWN0b3IuZGlzdGFuY2VUb1BhcmVudCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXN0YW5jZVRvUGFyZW50UHJvdG9FbGVtZW50SW5qZWN0b3IgLSAxO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cblxuZnVuY3Rpb24gX2NyZWF0ZUVsZW1lbnRCaW5kZXIoZGlyZWN0aXZlUmVzb2x2ZXI6IERpcmVjdGl2ZVJlc29sdmVyLCBuZXN0ZWRQcm90b1ZpZXc6IEFwcFByb3RvVmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRCaW5kZXJTdGFjazogRWxlbWVudEJpbmRlcltdLCBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzdGFuY2VUb1BhcmVudEJpbmRlcjogbnVtYmVyLCBkaXN0YW5jZVRvUGFyZW50UGVpOiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWdpbkVsZW1lbnRDbWQ6IElCZWdpbkVsZW1lbnRDbWQpOiBFbGVtZW50QmluZGVyIHtcbiAgdmFyIHBhcmVudEVsZW1lbnRCaW5kZXI6IEVsZW1lbnRCaW5kZXIgPSBudWxsO1xuICB2YXIgcGFyZW50UHJvdG9FbGVtZW50SW5qZWN0b3I6IFByb3RvRWxlbWVudEluamVjdG9yID0gbnVsbDtcbiAgaWYgKGRpc3RhbmNlVG9QYXJlbnRCaW5kZXIgPiAwKSB7XG4gICAgcGFyZW50RWxlbWVudEJpbmRlciA9IGVsZW1lbnRCaW5kZXJTdGFja1tlbGVtZW50QmluZGVyU3RhY2subGVuZ3RoIC0gZGlzdGFuY2VUb1BhcmVudEJpbmRlcl07XG4gIH1cbiAgaWYgKGlzQmxhbmsocGFyZW50RWxlbWVudEJpbmRlcikpIHtcbiAgICBkaXN0YW5jZVRvUGFyZW50QmluZGVyID0gLTE7XG4gIH1cbiAgaWYgKGRpc3RhbmNlVG9QYXJlbnRQZWkgPiAwKSB7XG4gICAgdmFyIHBlaUJpbmRlciA9IGVsZW1lbnRCaW5kZXJTdGFja1tlbGVtZW50QmluZGVyU3RhY2subGVuZ3RoIC0gZGlzdGFuY2VUb1BhcmVudFBlaV07XG4gICAgaWYgKGlzUHJlc2VudChwZWlCaW5kZXIpKSB7XG4gICAgICBwYXJlbnRQcm90b0VsZW1lbnRJbmplY3RvciA9IHBlaUJpbmRlci5wcm90b0VsZW1lbnRJbmplY3RvcjtcbiAgICB9XG4gIH1cbiAgaWYgKGlzQmxhbmsocGFyZW50UHJvdG9FbGVtZW50SW5qZWN0b3IpKSB7XG4gICAgZGlzdGFuY2VUb1BhcmVudFBlaSA9IC0xO1xuICB9XG4gIHZhciBjb21wb25lbnREaXJlY3RpdmVQcm92aWRlcjogRGlyZWN0aXZlUHJvdmlkZXIgPSBudWxsO1xuICB2YXIgaXNFbWJlZGRlZFRlbXBsYXRlID0gZmFsc2U7XG4gIHZhciBkaXJlY3RpdmVQcm92aWRlcnM6IERpcmVjdGl2ZVByb3ZpZGVyW10gPVxuICAgICAgYmVnaW5FbGVtZW50Q21kLmRpcmVjdGl2ZXMubWFwKHR5cGUgPT4gcHJvdmlkZURpcmVjdGl2ZShkaXJlY3RpdmVSZXNvbHZlciwgdHlwZSkpO1xuICBpZiAoYmVnaW5FbGVtZW50Q21kIGluc3RhbmNlb2YgQmVnaW5Db21wb25lbnRDbWQpIHtcbiAgICBjb21wb25lbnREaXJlY3RpdmVQcm92aWRlciA9IGRpcmVjdGl2ZVByb3ZpZGVyc1swXTtcbiAgfSBlbHNlIGlmIChiZWdpbkVsZW1lbnRDbWQgaW5zdGFuY2VvZiBFbWJlZGRlZFRlbXBsYXRlQ21kKSB7XG4gICAgaXNFbWJlZGRlZFRlbXBsYXRlID0gdHJ1ZTtcbiAgfVxuXG4gIHZhciBwcm90b0VsZW1lbnRJbmplY3RvciA9IG51bGw7XG4gIC8vIENyZWF0ZSBhIHByb3RvRWxlbWVudEluamVjdG9yIGZvciBhbnkgZWxlbWVudCB0aGF0IGVpdGhlciBoYXMgYmluZGluZ3MgKm9yKiBoYXMgb25lXG4gIC8vIG9yIG1vcmUgdmFyLSBkZWZpbmVkICpvciogZm9yIDx0ZW1wbGF0ZT4gZWxlbWVudHM6XG4gIC8vIC0gRWxlbWVudHMgd2l0aCBhIHZhci0gZGVmaW5lZCBuZWVkIGEgdGhlaXIgb3duIGVsZW1lbnQgaW5qZWN0b3JcbiAgLy8gICBzbyB0aGF0LCB3aGVuIGh5ZHJhdGluZywgJGltcGxpY2l0IGNhbiBiZSBzZXQgdG8gdGhlIGVsZW1lbnQuXG4gIC8vIC0gPHRlbXBsYXRlPiBlbGVtZW50cyBuZWVkIHRoZWlyIG93biBFbGVtZW50SW5qZWN0b3Igc28gdGhhdCB3ZSBjYW4gcXVlcnkgdGhlaXIgVGVtcGxhdGVSZWZcbiAgdmFyIGhhc1ZhcmlhYmxlcyA9IGJlZ2luRWxlbWVudENtZC52YXJpYWJsZU5hbWVBbmRWYWx1ZXMubGVuZ3RoID4gMDtcbiAgaWYgKGRpcmVjdGl2ZVByb3ZpZGVycy5sZW5ndGggPiAwIHx8IGhhc1ZhcmlhYmxlcyB8fCBpc0VtYmVkZGVkVGVtcGxhdGUpIHtcbiAgICB2YXIgZGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gICAgaWYgKCFpc0VtYmVkZGVkVGVtcGxhdGUpIHtcbiAgICAgIGRpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3MgPSBjcmVhdGVEaXJlY3RpdmVWYXJpYWJsZUJpbmRpbmdzKFxuICAgICAgICAgIGJlZ2luRWxlbWVudENtZC52YXJpYWJsZU5hbWVBbmRWYWx1ZXMsIGRpcmVjdGl2ZVByb3ZpZGVycyk7XG4gICAgfVxuICAgIHByb3RvRWxlbWVudEluamVjdG9yID0gUHJvdG9FbGVtZW50SW5qZWN0b3IuY3JlYXRlKFxuICAgICAgICBwYXJlbnRQcm90b0VsZW1lbnRJbmplY3RvciwgYm91bmRFbGVtZW50SW5kZXgsIGRpcmVjdGl2ZVByb3ZpZGVycyxcbiAgICAgICAgaXNQcmVzZW50KGNvbXBvbmVudERpcmVjdGl2ZVByb3ZpZGVyKSwgZGlzdGFuY2VUb1BhcmVudFBlaSwgZGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyk7XG4gICAgcHJvdG9FbGVtZW50SW5qZWN0b3IuYXR0cmlidXRlcyA9IGFycmF5VG9NYXAoYmVnaW5FbGVtZW50Q21kLmF0dHJOYW1lQW5kVmFsdWVzLCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gbmV3IEVsZW1lbnRCaW5kZXIoYm91bmRFbGVtZW50SW5kZXgsIHBhcmVudEVsZW1lbnRCaW5kZXIsIGRpc3RhbmNlVG9QYXJlbnRCaW5kZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b0VsZW1lbnRJbmplY3RvciwgY29tcG9uZW50RGlyZWN0aXZlUHJvdmlkZXIsIG5lc3RlZFByb3RvVmlldyk7XG59XG5cbmZ1bmN0aW9uIHByb3ZpZGVEaXJlY3RpdmUoZGlyZWN0aXZlUmVzb2x2ZXI6IERpcmVjdGl2ZVJlc29sdmVyLCB0eXBlOiBUeXBlKTogRGlyZWN0aXZlUHJvdmlkZXIge1xuICBsZXQgYW5ub3RhdGlvbiA9IGRpcmVjdGl2ZVJlc29sdmVyLnJlc29sdmUodHlwZSk7XG4gIHJldHVybiBEaXJlY3RpdmVQcm92aWRlci5jcmVhdGVGcm9tVHlwZSh0eXBlLCBhbm5vdGF0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZURpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3MoXG4gICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+LFxuICAgIGRpcmVjdGl2ZVByb3ZpZGVyczogRGlyZWN0aXZlUHJvdmlkZXJbXSk6IE1hcDxzdHJpbmcsIG51bWJlcj4ge1xuICB2YXIgZGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFyaWFibGVOYW1lQW5kVmFsdWVzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgdmFyIHRlbXBsYXRlTmFtZSA9IDxzdHJpbmc+dmFyaWFibGVOYW1lQW5kVmFsdWVzW2ldO1xuICAgIHZhciBkaXJJbmRleCA9IDxudW1iZXI+dmFyaWFibGVOYW1lQW5kVmFsdWVzW2kgKyAxXTtcbiAgICBpZiAoaXNOdW1iZXIoZGlySW5kZXgpKSB7XG4gICAgICBkaXJlY3RpdmVWYXJpYWJsZUJpbmRpbmdzLnNldCh0ZW1wbGF0ZU5hbWUsIGRpckluZGV4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYSB2YXJpYWJsZSB3aXRob3V0IGEgZGlyZWN0aXZlIGluZGV4IC0+IHJlZmVyZW5jZSB0aGUgZWxlbWVudFxuICAgICAgZGlyZWN0aXZlVmFyaWFibGVCaW5kaW5ncy5zZXQodGVtcGxhdGVOYW1lLCBudWxsKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3M7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb01hcChhcnI6IHN0cmluZ1tdLCBpbnZlcnNlOiBib29sZWFuKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gIHZhciByZXN1bHQgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gMikge1xuICAgIGlmIChpbnZlcnNlKSB7XG4gICAgICByZXN1bHQuc2V0KGFycltpICsgMV0sIGFycltpXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC5zZXQoYXJyW2ldLCBhcnJbaSArIDFdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gX2ZsYXR0ZW5BcnJheSh0cmVlOiBhbnlbXSwgb3V0OiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pOiB2b2lkIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cmVlLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFyIGl0ZW0gPSByZXNvbHZlRm9yd2FyZFJlZih0cmVlW2ldKTtcbiAgICBpZiAoaXNBcnJheShpdGVtKSkge1xuICAgICAgX2ZsYXR0ZW5BcnJheShpdGVtLCBvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gX2ZsYXR0ZW5TdHlsZUFycihhcnI6IEFycmF5PHN0cmluZyB8IGFueVtdPiwgb3V0OiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgZW50cnkgPSBhcnJbaV07XG4gICAgaWYgKGlzQXJyYXkoZW50cnkpKSB7XG4gICAgICBfZmxhdHRlblN0eWxlQXJyKDxhbnlbXT5lbnRyeSwgb3V0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0LnB1c2goPHN0cmluZz5lbnRyeSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvcHJvdG9fdmlld19mYWN0b3J5LnRzXG4gKiovIiwiaW1wb3J0IHt1bmltcGxlbWVudGVkfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtNYXB9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1ZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBBbmd1bGFyIFByb3RvVmlldyBpbiB0aGUgUmVuZGVyaW5nIENvbnRleHQuXG4gKlxuICogV2hlbiB5b3UgaW1wbGVtZW50IGEgY3VzdG9tIHtAbGluayBSZW5kZXJlcn0sIGBSZW5kZXJQcm90b1ZpZXdSZWZgIHNwZWNpZmllcyB3aGF0IFJlbmRlciBWaWV3XG4gKiB5b3VyIHJlbmRlcmVyIHNob3VsZCBjcmVhdGUuXG4gKlxuICogYFJlbmRlclByb3RvVmlld1JlZmAgaXMgYSBjb3VudGVycGFydCB0byB7QGxpbmsgUHJvdG9WaWV3UmVmfSBhdmFpbGFibGUgaW4gdGhlIEFwcGxpY2F0aW9uXG4gKiBDb250ZXh0LiBCdXQgdW5saWtlIGBQcm90b1ZpZXdSZWZgLCBgUmVuZGVyUHJvdG9WaWV3UmVmYCBjb250YWlucyBhbGwgc3RhdGljIG5lc3RlZCBQcm90byBWaWV3c1xuICogdGhhdCBhcmUgcmVjdXJzaXZlbHkgbWVyZ2VkIGludG8gYSBzaW5nbGUgUmVuZGVyIFByb3RvIFZpZXcuXG5cbiAqXG4gKiA8IS0tIFRPRE86IHRoaXMgaXMgY3JlYXRlZCBieSBSZW5kZXJlciNjcmVhdGVQcm90b1ZpZXcgaW4gdGhlIG5ldyBjb21waWxlciAtLT5cbiAqL1xuZXhwb3J0IGNsYXNzIFJlbmRlclByb3RvVmlld1JlZiB7fVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBsaXN0IG9mIHNpYmxpbmcgTm9kZXMgdGhhdCBjYW4gYmUgbW92ZWQgYnkgdGhlIHtAbGluayBSZW5kZXJlcn0gaW5kZXBlbmRlbnRseSBvZlxuICogb3RoZXIgUmVuZGVyIEZyYWdtZW50cy5cbiAqXG4gKiBBbnkge0BsaW5rIFJlbmRlclZpZXdSZWZ9IGhhcyBvbmUgUmVuZGVyIEZyYWdtZW50LlxuICpcbiAqIEFkZGl0aW9uYWxseSBhbnkgVmlldyB3aXRoIGFuIEVtYmVkZGVkIFZpZXcgdGhhdCBjb250YWlucyBhIHtAbGluayBOZ0NvbnRlbnRBc3QgVmlldyBQcm9qZWN0aW9ufVxuICogcmVzdWx0cyBpbiBhZGRpdGlvbmFsIFJlbmRlciBGcmFnbWVudC5cbiAqL1xuLypcbiAgPGRpdj5mb288L2Rpdj5cbiAge3tiYXJ9fVxuXG5cbiAgPGRpdj5mb288L2Rpdj4gLT4gdmlldyAxIC8gZnJhZ21lbnQgMVxuICA8dWw+XG4gICAgPHRlbXBsYXRlIG5nRm9yPlxuICAgICAgPGxpPnt7Zmd9fTwvbGk+IC0+IHZpZXcgMiAvIGZyYWdtZW50IDFcbiAgICA8L3RlbXBsYXRlPlxuICA8L3VsPlxuICB7e2Jhcn19XG5cblxuICA8ZGl2PmZvbzwvZGl2PiAtPiB2aWV3IDEgLyBmcmFnbWVudCAxXG4gIDx1bD5cbiAgICA8dGVtcGxhdGUgbmdJZj5cbiAgICAgIDxsaT48bmctY29udGVudD48Lz48L2xpPiAtPiB2aWV3IDEgLyBmcmFnbWVudCAyXG4gICAgPC90ZW1wbGF0ZT5cbiAgICA8dGVtcGxhdGUgbmdGb3I+XG4gICAgICA8bGk+PG5nLWNvbnRlbnQ+PC8+PC9saT4gLT5cbiAgICAgIDxsaT48L2xpPiAgICAgICAgICAgICAgICAtPiB2aWV3IDEgLyBmcmFnbWVudCAyICsgdmlldyAyIC8gZnJhZ21lbnQgMS4ubi0xXG4gICAgPC90ZW1wbGF0ZT5cbiAgPC91bD5cbiAge3tiYXJ9fVxuICovXG4vLyBUT0RPKGkpOiByZWZhY3RvciBpbnRvIGFuIGludGVyZmFjZVxuZXhwb3J0IGNsYXNzIFJlbmRlckZyYWdtZW50UmVmIHt9XG5cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEFuZ3VsYXIgVmlldyBpbiB0aGUgUmVuZGVyaW5nIENvbnRleHQuXG4gKlxuICogYFJlbmRlclZpZXdSZWZgIHNwZWNpZmllcyB0byB0aGUge0BsaW5rIFJlbmRlcmVyfSB3aGF0IFZpZXcgdG8gdXBkYXRlIG9yIGRlc3Ryb3kuXG4gKlxuICogVW5saWtlIGEge0BsaW5rIFZpZXdSZWZ9IGF2YWlsYWJsZSBpbiB0aGUgQXBwbGljYXRpb24gQ29udGV4dCwgUmVuZGVyIFZpZXcgY29udGFpbnMgYWxsIHRoZVxuICogc3RhdGljIENvbXBvbmVudCBWaWV3cyB0aGF0IGhhdmUgYmVlbiByZWN1cnNpdmVseSBtZXJnZWQgaW50byBhIHNpbmdsZSBSZW5kZXIgVmlldy5cbiAqXG4gKiBFYWNoIGBSZW5kZXJWaWV3UmVmYCBjb250YWlucyBvbmUgb3IgbW9yZSB7QGxpbmsgUmVuZGVyRnJhZ21lbnRSZWYgUmVuZGVyIEZyYWdtZW50c30sIHRoZXNlXG4gKiBGcmFnbWVudHMgYXJlIGNyZWF0ZWQsIGh5ZHJhdGVkLCBkZWh5ZHJhdGVkIGFuZCBkZXN0cm95ZWQgYXMgYSBzaW5nbGUgdW5pdCB0b2dldGhlciB3aXRoIHRoZVxuICogVmlldy5cbiAqL1xuLy8gVE9ETyhpKTogcmVmYWN0b3IgaW50byBhbiBpbnRlcmZhY2VcbmV4cG9ydCBjbGFzcyBSZW5kZXJWaWV3UmVmIHt9XG5cbi8qKlxuICogQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgY29tbWFuZHMgdG8gdGhlIEFuZ3VsYXIgcmVuZGVyZXIsIHVzaW5nIHRoZSB2aXNpdG9yIHBhdHRlcm4uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJUZW1wbGF0ZUNtZCB7XG4gIGFic3RyYWN0IHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnk7XG59XG5cbi8qKlxuICogQ29tbWFuZCB0byBiZWdpbiByZW5kZXJpbmcuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJCZWdpbkNtZCBleHRlbmRzIFJlbmRlclRlbXBsYXRlQ21kIHtcbiAgZ2V0IG5nQ29udGVudEluZGV4KCk6IG51bWJlciB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG4gIGdldCBpc0JvdW5kKCk6IGJvb2xlYW4geyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xufVxuXG4vKipcbiAqIENvbW1hbmQgdG8gcmVuZGVyIHRleHQuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJUZXh0Q21kIGV4dGVuZHMgUmVuZGVyQmVnaW5DbWQge1xuICBnZXQgdmFsdWUoKTogc3RyaW5nIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcbn1cblxuLyoqXG4gKiBDb21tYW5kIHRvIHJlbmRlciBwcm9qZWN0ZWQgY29udGVudC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlck5nQ29udGVudENtZCBleHRlbmRzIFJlbmRlclRlbXBsYXRlQ21kIHtcbiAgLy8gVGhlIGluZGV4IG9mIHRoaXMgTmdDb250ZW50IGVsZW1lbnRcbiAgZ2V0IGluZGV4KCk6IG51bWJlciB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG4gIC8vIFRoZSBpbmRleCBvZiB0aGUgTmdDb250ZW50IGVsZW1lbnQgaW50byB3aGljaCB0aGlzXG4gIC8vIE5nQ29udGVudCBlbGVtZW50IHNob3VsZCBiZSBwcm9qZWN0ZWQgKGlmIGFueSlcbiAgZ2V0IG5nQ29udGVudEluZGV4KCk6IG51bWJlciB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG59XG5cbi8qKlxuICogQ29tbWFuZCB0byBiZWdpbiByZW5kZXJpbmcgYW4gZWxlbWVudC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlckJlZ2luRWxlbWVudENtZCBleHRlbmRzIFJlbmRlckJlZ2luQ21kIHtcbiAgZ2V0IG5hbWUoKTogc3RyaW5nIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcbiAgZ2V0IGF0dHJOYW1lQW5kVmFsdWVzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcbiAgZ2V0IGV2ZW50VGFyZ2V0QW5kTmFtZXMoKTogc3RyaW5nW10geyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xufVxuXG4vKipcbiAqIENvbW1hbmQgdG8gYmVnaW4gcmVuZGVyaW5nIGEgY29tcG9uZW50LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUmVuZGVyQmVnaW5Db21wb25lbnRDbWQgZXh0ZW5kcyBSZW5kZXJCZWdpbkVsZW1lbnRDbWQge1xuICBnZXQgdGVtcGxhdGVJZCgpOiBzdHJpbmcgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xufVxuXG4vKipcbiAqIENvbW1hbmQgdG8gcmVuZGVyIGEgY29tcG9uZW50J3MgdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZW5kZXJFbWJlZGRlZFRlbXBsYXRlQ21kIGV4dGVuZHMgUmVuZGVyQmVnaW5FbGVtZW50Q21kIHtcbiAgZ2V0IGlzTWVyZ2VkKCk6IGJvb2xlYW4geyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xuICBnZXQgY2hpbGRyZW4oKTogUmVuZGVyVGVtcGxhdGVDbWRbXSB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH07XG59XG5cbi8qKlxuICogVmlzaXRvciBmb3IgYSB7QGxpbmsgUmVuZGVyVGVtcGxhdGVDbWR9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckNvbW1hbmRWaXNpdG9yIHtcbiAgdmlzaXRUZXh0KGNtZDogUmVuZGVyVGV4dENtZCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdE5nQ29udGVudChjbWQ6IFJlbmRlck5nQ29udGVudENtZCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEJlZ2luRWxlbWVudChjbWQ6IFJlbmRlckJlZ2luRWxlbWVudENtZCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEVuZEVsZW1lbnQoY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEJlZ2luQ29tcG9uZW50KGNtZDogUmVuZGVyQmVnaW5Db21wb25lbnRDbWQsIGNvbnRleHQ6IGFueSk6IGFueTtcbiAgdmlzaXRFbmRDb21wb25lbnQoY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEVtYmVkZGVkVGVtcGxhdGUoY21kOiBSZW5kZXJFbWJlZGRlZFRlbXBsYXRlQ21kLCBjb250ZXh0OiBhbnkpOiBhbnk7XG59XG5cblxuLyoqXG4gKiBDb250YWluZXIgY2xhc3MgcHJvZHVjZWQgYnkgYSB7QGxpbmsgUmVuZGVyZXJ9IHdoZW4gY3JlYXRpbmcgYSBSZW5kZXIgVmlldy5cbiAqXG4gKiBBbiBpbnN0YW5jZSBvZiBgUmVuZGVyVmlld1dpdGhGcmFnbWVudHNgIGNvbnRhaW5zIGEge0BsaW5rIFJlbmRlclZpZXdSZWZ9IGFuZCBhbiBhcnJheSBvZlxuICoge0BsaW5rIFJlbmRlckZyYWdtZW50UmVmfXMgYmVsb25naW5nIHRvIHRoaXMgUmVuZGVyIFZpZXcuXG4gKi9cbi8vIFRPRE8oaSk6IHJlZmFjdG9yIHRoaXMgYnkgUmVuZGVyVmlld1dpdGhGcmFnbWVudHMgYW5kIGFkZGluZyBmcmFnbWVudHMgZGlyZWN0bHkgdG8gUmVuZGVyVmlld1JlZlxuZXhwb3J0IGNsYXNzIFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzIHtcbiAgY29uc3RydWN0b3IoXG4gICAgICAvKipcbiAgICAgICAqIFJlZmVyZW5jZSB0byB0aGUge0BsaW5rIFJlbmRlclZpZXdSZWZ9LlxuICAgICAgICovXG4gICAgICBwdWJsaWMgdmlld1JlZjogUmVuZGVyVmlld1JlZixcbiAgICAgIC8qKlxuICAgICAgICogQXJyYXkgb2Yge0BsaW5rIFJlbmRlckZyYWdtZW50UmVmfXMgb3JkZXJlZCBpbiB0aGUgZGVwdGgtZmlyc3Qgb3JkZXIuXG4gICAgICAgKi9cbiAgICAgIHB1YmxpYyBmcmFnbWVudFJlZnM6IFJlbmRlckZyYWdtZW50UmVmW10pIHt9XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBFbGVtZW50IHRoYXQgaXMgcGFydCBvZiBhIHtAbGluayBSZW5kZXJWaWV3UmVmIFJlbmRlciBWaWV3fS5cbiAqXG4gKiBgUmVuZGVyRWxlbWVudFJlZmAgaXMgYSBjb3VudGVycGFydCB0byB7QGxpbmsgRWxlbWVudFJlZn0gYXZhaWxhYmxlIGluIHRoZSBBcHBsaWNhdGlvbiBDb250ZXh0LlxuICpcbiAqIFdoZW4gdXNpbmcgYFJlbmRlcmVyYCBmcm9tIHRoZSBBcHBsaWNhdGlvbiBDb250ZXh0LCBgRWxlbWVudFJlZmAgY2FuIGJlIHVzZWQgaW5zdGVhZCBvZlxuICogYFJlbmRlckVsZW1lbnRSZWZgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckVsZW1lbnRSZWYge1xuICAvKipcbiAgICogUmVmZXJlbmNlIHRvIHRoZSBSZW5kZXIgVmlldyB0aGF0IGNvbnRhaW5zIHRoaXMgRWxlbWVudC5cbiAgICovXG4gIHJlbmRlclZpZXc6IFJlbmRlclZpZXdSZWY7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKlxuICAgKiBJbmRleCBvZiB0aGUgRWxlbWVudCAoaW4gdGhlIGRlcHRoLWZpcnN0IG9yZGVyKSBpbnNpZGUgdGhlIFJlbmRlciBWaWV3LlxuICAgKlxuICAgKiBUaGlzIGluZGV4IGlzIHVzZWQgaW50ZXJuYWxseSBieSBBbmd1bGFyIHRvIGxvY2F0ZSBlbGVtZW50cy5cbiAgICovXG4gIGJvdW5kRWxlbWVudEluZGV4OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGVtcGxhdGUgZm9yIHJlbmRlcmluZyBhIGNvbXBvbmVudCwgaW5jbHVkaW5nIGNvbW1hbmRzIGFuZCBzdHlsZXMuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgc2hvcnRJZDogc3RyaW5nLCBwdWJsaWMgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgICAgICAgICAgIHB1YmxpYyBjb21tYW5kczogUmVuZGVyVGVtcGxhdGVDbWRbXSwgcHVibGljIHN0eWxlczogc3RyaW5nW10pIHt9XG59XG5cbi8qKlxuICogSW5qZWN0YWJsZSBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgYSBsb3ctbGV2ZWwgaW50ZXJmYWNlIGZvciBtb2RpZnlpbmcgdGhlIFVJLlxuICpcbiAqIFVzZSB0aGlzIHNlcnZpY2UgdG8gYnlwYXNzIEFuZ3VsYXIncyB0ZW1wbGF0aW5nIGFuZCBtYWtlIGN1c3RvbSBVSSBjaGFuZ2VzIHRoYXQgY2FuJ3QgYmVcbiAqIGV4cHJlc3NlZCBkZWNsYXJhdGl2ZWx5LiBGb3IgZXhhbXBsZSBpZiB5b3UgbmVlZCB0byBzZXQgYSBwcm9wZXJ0eSBvciBhbiBhdHRyaWJ1dGUgd2hvc2UgbmFtZSBpc1xuICogbm90IHN0YXRpY2FsbHkga25vd24sIHVzZSB7QGxpbmsgI3NldEVsZW1lbnRQcm9wZXJ0eX0gb3Ige0BsaW5rICNzZXRFbGVtZW50QXR0cmlidXRlfVxuICogcmVzcGVjdGl2ZWx5LlxuICpcbiAqIElmIHlvdSBhcmUgaW1wbGVtZW50aW5nIGEgY3VzdG9tIHJlbmRlcmVyLCB5b3UgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuXG4gKlxuICogVGhlIGRlZmF1bHQgUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gaXMgYERvbVJlbmRlcmVyYC4gQWxzbyBhdmFpbGFibGUgaXMgYFdlYldvcmtlclJlbmRlcmVyYC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlbmRlcmVyIHtcbiAgLyoqXG4gICAqIFJlZ2lzdGVycyBhIGNvbXBvbmVudCB0ZW1wbGF0ZSByZXByZXNlbnRlZCBhcyBhcnJheXMgb2Yge0BsaW5rIFJlbmRlclRlbXBsYXRlQ21kfXMgYW5kIHN0eWxlc1xuICAgKiB3aXRoIHRoZSBSZW5kZXJlci5cbiAgICpcbiAgICogT25jZSBhIHRlbXBsYXRlIGlzIHJlZ2lzdGVyZWQgaXQgY2FuIGJlIHJlZmVyZW5jZWQgdmlhIHtAbGluayBSZW5kZXJCZWdpbkNvbXBvbmVudENtZH0gd2hlblxuICAgKiB7QGxpbmsgI2NyZWF0ZVByb3RvVmlldyBjcmVhdGluZyBSZW5kZXIgUHJvdG9WaWV3fS5cbiAgICovXG4gIGFic3RyYWN0IHJlZ2lzdGVyQ29tcG9uZW50VGVtcGxhdGUodGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlKTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHtAbGluayBSZW5kZXJQcm90b1ZpZXdSZWZ9IGZyb20gYW4gYXJyYXkgb2Yge0BsaW5rIFJlbmRlclRlbXBsYXRlQ21kfWBzLlxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlUHJvdG9WaWV3KGNvbXBvbmVudFRlbXBsYXRlSWQ6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHM6IFJlbmRlclRlbXBsYXRlQ21kW10pOiBSZW5kZXJQcm90b1ZpZXdSZWY7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBSb290IEhvc3QgVmlldyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYGhvc3RQcm90b1ZpZXdSZWZgLlxuICAgKlxuICAgKiBgZnJhZ21lbnRDb3VudGAgaXMgdGhlIG51bWJlciBvZiBuZXN0ZWQge0BsaW5rIFJlbmRlckZyYWdtZW50UmVmfXMgaW4gdGhpcyBWaWV3LiBUaGlzIHBhcmFtZXRlclxuICAgKiBpcyBub24tb3B0aW9uYWwgc28gdGhhdCB0aGUgcmVuZGVyZXIgY2FuIGNyZWF0ZSBhIHJlc3VsdCBzeW5jaHJvbm91c2x5IGV2ZW4gd2hlbiBhcHBsaWNhdGlvblxuICAgKiBydW5zIGluIGEgZGlmZmVyZW50IGNvbnRleHQgKGUuZy4gaW4gYSBXZWIgV29ya2VyKS5cbiAgICpcbiAgICogYGhvc3RFbGVtZW50U2VsZWN0b3JgIGlzIGEgKENTUykgc2VsZWN0b3IgZm9yIHF1ZXJ5aW5nIHRoZSBtYWluIGRvY3VtZW50IHRvIGZpbmQgdGhlIEhvc3RcbiAgICogRWxlbWVudC4gVGhlIG5ld2x5IGNyZWF0ZWQgUm9vdCBIb3N0IFZpZXcgc2hvdWxkIGJlIGF0dGFjaGVkIHRvIHRoaXMgZWxlbWVudC5cbiAgICpcbiAgICogUmV0dXJucyBhbiBpbnN0YW5jZSBvZiB7QGxpbmsgUmVuZGVyVmlld1dpdGhGcmFnbWVudHN9LCByZXByZXNlbnRpbmcgdGhlIFJlbmRlciBWaWV3LlxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlUm9vdEhvc3RWaWV3KGhvc3RQcm90b1ZpZXdSZWY6IFJlbmRlclByb3RvVmlld1JlZiwgZnJhZ21lbnRDb3VudDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdEVsZW1lbnRTZWxlY3Rvcjogc3RyaW5nKTogUmVuZGVyVmlld1dpdGhGcmFnbWVudHM7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBSZW5kZXIgVmlldyBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYHByb3RvVmlld1JlZmAuXG4gICAqXG4gICAqIGBmcmFnbWVudENvdW50YCBpcyB0aGUgbnVtYmVyIG9mIG5lc3RlZCB7QGxpbmsgUmVuZGVyRnJhZ21lbnRSZWZ9cyBpbiB0aGlzIFZpZXcuIFRoaXMgcGFyYW1ldGVyXG4gICAqIGlzIG5vbi1vcHRpb25hbCBzbyB0aGF0IHRoZSByZW5kZXJlciBjYW4gY3JlYXRlIGEgcmVzdWx0IHN5bmNocm9ub3VzbHkgZXZlbiB3aGVuIGFwcGxpY2F0aW9uXG4gICAqIHJ1bnMgaW4gYSBkaWZmZXJlbnQgY29udGV4dCAoZS5nLiBpbiBhIFdlYiBXb3JrZXIpLlxuICAgKlxuICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIHtAbGluayBSZW5kZXJWaWV3V2l0aEZyYWdtZW50c30sIHJlcHJlc2VudGluZyB0aGUgUmVuZGVyIFZpZXcuXG4gICAqL1xuICBhYnN0cmFjdCBjcmVhdGVWaWV3KHByb3RvVmlld1JlZjogUmVuZGVyUHJvdG9WaWV3UmVmLFxuICAgICAgICAgICAgICAgICAgICAgIGZyYWdtZW50Q291bnQ6IG51bWJlcik6IFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhIFJlbmRlciBWaWV3IHNwZWNpZmllZCB2aWEgYHZpZXdSZWZgLlxuICAgKlxuICAgKiBUaGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkIG9ubHkgb24gYSBWaWV3IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBkZWh5ZHJhdGVkIGFuZFxuICAgKiBhbGwgb2YgaXRzIFJlbmRlciBGcmFnbWVudHMgaGF2ZSBiZWVuIGRldGFjaGVkLlxuICAgKlxuICAgKiBEZXN0cm95aW5nIGEgVmlldyBpbmRpY2F0ZXMgdG8gdGhlIFJlbmRlcmVyIHRoYXQgdGhpcyBWaWV3IGlzIG5vdCBnb2luZyB0byBiZSByZWZlcmVuY2VkIGluIGFueVxuICAgKiBmdXR1cmUgb3BlcmF0aW9ucy4gSWYgdGhlIFJlbmRlcmVyIGNyZWF0ZWQgYW55IHJlbmRlcmVyLXNwZWNpZmljIG9iamVjdHMgZm9yIHRoaXMgVmlldywgdGhlc2VcbiAgICogb2JqZWN0cyBzaG91bGQgbm93IGJlIGRlc3Ryb3llZCB0byBwcmV2ZW50IG1lbW9yeSBsZWFrcy5cbiAgICovXG4gIGFic3RyYWN0IGRlc3Ryb3lWaWV3KHZpZXdSZWY6IFJlbmRlclZpZXdSZWYpO1xuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyB0aGUgTm9kZXMgb2YgYSBSZW5kZXIgRnJhZ21lbnQgYWZ0ZXIgdGhlIGxhc3QgTm9kZSBvZiBgcHJldmlvdXNGcmFnbWVudFJlZmAuXG4gICAqL1xuICBhYnN0cmFjdCBhdHRhY2hGcmFnbWVudEFmdGVyRnJhZ21lbnQocHJldmlvdXNGcmFnbWVudFJlZjogUmVuZGVyRnJhZ21lbnRSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFnbWVudFJlZjogUmVuZGVyRnJhZ21lbnRSZWYpO1xuXG4gIC8qKlxuICAgKiBBdHRhY2hlcyB0aGUgTm9kZXMgb2YgdGhlIFJlbmRlciBGcmFnbWVudCBhZnRlciBhbiBFbGVtZW50LlxuICAgKi9cbiAgYWJzdHJhY3QgYXR0YWNoRnJhZ21lbnRBZnRlckVsZW1lbnQoZWxlbWVudFJlZjogUmVuZGVyRWxlbWVudFJlZiwgZnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmKTtcblxuICAvKipcbiAgICogRGV0YWNoZXMgdGhlIE5vZGVzIG9mIGEgUmVuZGVyIEZyYWdtZW50IGZyb20gdGhlaXIgcGFyZW50LlxuICAgKlxuICAgKiBUaGlzIG9wZXJhdGlvbnMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uIGEgVmlldyB0aGF0IGhhcyBiZWVuIGFscmVhZHlcbiAgICoge0BsaW5rICNkZWh5ZHJhdGVWaWV3IGRlaHlkcmF0ZWR9LlxuICAgKi9cbiAgYWJzdHJhY3QgZGV0YWNoRnJhZ21lbnQoZnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmKTtcblxuICAvKipcbiAgICogTm90aWZpZXMgYSBjdXN0b20gUmVuZGVyZXIgdG8gaW5pdGlhbGl6ZSBhIFJlbmRlciBWaWV3LlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgQW5ndWxhciBhZnRlciBhIFJlbmRlciBWaWV3IGhhcyBiZWVuIGNyZWF0ZWQsIG9yIHdoZW4gYSBwcmV2aW91c2x5XG4gICAqIGRlaHlkcmF0ZWQgUmVuZGVyIFZpZXcgaXMgYWJvdXQgdG8gYmUgcmV1c2VkLlxuICAgKi9cbiAgYWJzdHJhY3QgaHlkcmF0ZVZpZXcodmlld1JlZjogUmVuZGVyVmlld1JlZik7XG5cbiAgLyoqXG4gICAqIE5vdGlmaWVzIGEgY3VzdG9tIFJlbmRlcmVyIHRoYXQgYSBSZW5kZXIgVmlldyBpcyBubyBsb25nZXIgYWN0aXZlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgQW5ndWxhciBiZWZvcmUgYSBSZW5kZXIgVmlldyB3aWxsIGJlIGRlc3Ryb3llZCwgb3Igd2hlbiBhIGh5ZHJhdGVkXG4gICAqIFJlbmRlciBWaWV3IGlzIGFib3V0IHRvIGJlIHB1dCBpbnRvIGEgcG9vbCBmb3IgZnV0dXJlIHJldXNlLlxuICAgKi9cbiAgYWJzdHJhY3QgZGVoeWRyYXRlVmlldyh2aWV3UmVmOiBSZW5kZXJWaWV3UmVmKTtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyBuYXRpdmUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIGBsb2NhdGlvbmAsIG9yIGBudWxsYCBpZiBkaXJlY3QgYWNjZXNzXG4gICAqIHRvIG5hdGl2ZSBlbGVtZW50cyBpcyBub3Qgc3VwcG9ydGVkIChlLmcuIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHJ1bnMgaW4gYSB3ZWIgd29ya2VyKS5cbiAgICpcbiAgICogPGRpdiBjbGFzcz1cImNhbGxvdXQgaXMtY3JpdGljYWxcIj5cbiAgICogICA8aGVhZGVyPlVzZSB3aXRoIGNhdXRpb248L2hlYWRlcj5cbiAgICogICA8cD5cbiAgICogICAgVXNlIHRoaXMgYXBpIGFzIHRoZSBsYXN0IHJlc29ydCB3aGVuIGRpcmVjdCBhY2Nlc3MgdG8gRE9NIGlzIG5lZWRlZC4gVXNlIHRlbXBsYXRpbmcgYW5kXG4gICAqICAgIGRhdGEtYmluZGluZywgb3Igb3RoZXIge0BsaW5rIFJlbmRlcmVyfSBtZXRob2RzIGluc3RlYWQuXG4gICAqICAgPC9wPlxuICAgKiAgIDxwPlxuICAgKiAgICBSZWx5aW5nIG9uIGRpcmVjdCBET00gYWNjZXNzIGNyZWF0ZXMgdGlnaHQgY291cGxpbmcgYmV0d2VlbiB5b3VyIGFwcGxpY2F0aW9uIGFuZCByZW5kZXJpbmdcbiAgICogICAgbGF5ZXJzIHdoaWNoIHdpbGwgbWFrZSBpdCBpbXBvc3NpYmxlIHRvIHNlcGFyYXRlIHRoZSB0d28gYW5kIGRlcGxveSB5b3VyIGFwcGxpY2F0aW9uIGludG8gYVxuICAgKiAgICB3ZWIgd29ya2VyLlxuICAgKiAgIDwvcD5cbiAgICogPC9kaXY+XG4gICAqL1xuICBhYnN0cmFjdCBnZXROYXRpdmVFbGVtZW50U3luYyhsb2NhdGlvbjogUmVuZGVyRWxlbWVudFJlZik6IGFueTtcblxuICAvKipcbiAgICogU2V0cyBhIHByb3BlcnR5IG9uIHRoZSBFbGVtZW50IHNwZWNpZmllZCB2aWEgYGxvY2F0aW9uYC5cbiAgICovXG4gIGFic3RyYWN0IHNldEVsZW1lbnRQcm9wZXJ0eShsb2NhdGlvbjogUmVuZGVyRWxlbWVudFJlZiwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHByb3BlcnR5VmFsdWU6IGFueSk7XG5cbiAgLyoqXG4gICAqIFNldHMgYW4gYXR0cmlidXRlIG9uIHRoZSBFbGVtZW50IHNwZWNpZmllZCB2aWEgYGxvY2F0aW9uYC5cbiAgICpcbiAgICogSWYgYGF0dHJpYnV0ZVZhbHVlYCBpcyBgbnVsbGAsIHRoZSBhdHRyaWJ1dGUgaXMgcmVtb3ZlZC5cbiAgICovXG4gIGFic3RyYWN0IHNldEVsZW1lbnRBdHRyaWJ1dGUobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZTogc3RyaW5nKTtcblxuICBhYnN0cmFjdCBzZXRCaW5kaW5nRGVidWdJbmZvKGxvY2F0aW9uOiBSZW5kZXJFbGVtZW50UmVmLCBwcm9wZXJ0eU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlOiBzdHJpbmcpO1xuXG4gIC8qKlxuICAgKiBTZXRzIGEgKENTUykgY2xhc3Mgb24gdGhlIEVsZW1lbnQgc3BlY2lmaWVkIHZpYSBgbG9jYXRpb25gLlxuICAgKlxuICAgKiBgaXNBZGRgIHNwZWNpZmllcyBpZiB0aGUgY2xhc3Mgc2hvdWxkIGJlIGFkZGVkIG9yIHJlbW92ZWQuXG4gICAqL1xuICBhYnN0cmFjdCBzZXRFbGVtZW50Q2xhc3MobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIGNsYXNzTmFtZTogc3RyaW5nLCBpc0FkZDogYm9vbGVhbik7XG5cbiAgLyoqXG4gICAqIFNldHMgYSAoQ1NTKSBpbmxpbmUgc3R5bGUgb24gdGhlIEVsZW1lbnQgc3BlY2lmaWVkIHZpYSBgbG9jYXRpb25gLlxuICAgKlxuICAgKiBJZiBgc3R5bGVWYWx1ZWAgaXMgYG51bGxgLCB0aGUgc3R5bGUgaXMgcmVtb3ZlZC5cbiAgICovXG4gIGFic3RyYWN0IHNldEVsZW1lbnRTdHlsZShsb2NhdGlvbjogUmVuZGVyRWxlbWVudFJlZiwgc3R5bGVOYW1lOiBzdHJpbmcsIHN0eWxlVmFsdWU6IHN0cmluZyk7XG5cbiAgLyoqXG4gICAqIENhbGxzIGEgbWV0aG9kIG9uIHRoZSBFbGVtZW50IHNwZWNpZmllZCB2aWEgYGxvY2F0aW9uYC5cbiAgICovXG4gIGFic3RyYWN0IGludm9rZUVsZW1lbnRNZXRob2QobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIG1ldGhvZE5hbWU6IHN0cmluZywgYXJnczogYW55W10pO1xuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBpbnRlcnBvbGF0ZWQgVGV4dE5vZGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCB0byB0aGUgYHRleHRgIHZhbHVlLlxuICAgKlxuICAgKiBgdGV4dE5vZGVJbmRleGAgaXMgdGhlIGRlcHRoLWZpcnN0IGluZGV4IG9mIHRoZSBOb2RlIGFtb25nIGludGVycG9sYXRlZCBOb2RlcyBpbiB0aGUgUmVuZGVyXG4gICAqIFZpZXcuXG4gICAqL1xuICBhYnN0cmFjdCBzZXRUZXh0KHZpZXdSZWY6IFJlbmRlclZpZXdSZWYsIHRleHROb2RlSW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nKTtcblxuICAvKipcbiAgICogU2V0cyBhIGRpc3BhdGNoZXIgdG8gcmVsYXkgYWxsIGV2ZW50cyB0cmlnZ2VyZWQgaW4gdGhlIGdpdmVuIFJlbmRlciBWaWV3LlxuICAgKlxuICAgKiBFYWNoIFJlbmRlciBWaWV3IGNhbiBoYXZlIG9ubHkgb25lIEV2ZW50IERpc3BhdGNoZXIsIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyxcbiAgICogdGhlIGxhc3QgcHJvdmlkZWQgZGlzcGF0Y2hlciB3aWxsIGJlIHVzZWQuXG4gICAqL1xuICBhYnN0cmFjdCBzZXRFdmVudERpc3BhdGNoZXIodmlld1JlZjogUmVuZGVyVmlld1JlZiwgZGlzcGF0Y2hlcjogUmVuZGVyRXZlbnREaXNwYXRjaGVyKTtcbn1cblxuLyoqXG4gKiBBIGRpc3BhdGNoZXIgdGhhdCByZWxheXMgYWxsIGV2ZW50cyB0aGF0IG9jY3VyIGluIGEgUmVuZGVyIFZpZXcuXG4gKlxuICogVXNlIHtAbGluayBSZW5kZXJlciNzZXRFdmVudERpc3BhdGNoZXJ9IHRvIHJlZ2lzdGVyIGEgZGlzcGF0Y2hlciBmb3IgYSBwYXJ0aWN1bGFyIFJlbmRlciBWaWV3LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlckV2ZW50RGlzcGF0Y2hlciB7XG4gIC8qKlxuICAgKiBDYWxsZWQgd2hlbiBFdmVudCBjYWxsZWQgYGV2ZW50TmFtZWAgd2FzIHRyaWdnZXJlZCBvbiBhbiBFbGVtZW50IHdpdGggYW4gRXZlbnQgQmluZGluZyBmb3IgdGhpc1xuICAgKiBFdmVudC5cbiAgICpcbiAgICogYGVsZW1lbnRJbmRleGAgc3BlY2lmaWVzIHRoZSBkZXB0aC1maXJzdCBpbmRleCBvZiB0aGUgRWxlbWVudCBpbiB0aGUgUmVuZGVyIFZpZXcuXG4gICAqXG4gICAqIGBsb2NhbHNgIGlzIGEgbWFwIGZvciBsb2NhbCB2YXJpYWJsZSB0byB2YWx1ZSBtYXBwaW5nIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbiBldmFsdWF0aW5nIHRoZVxuICAgKiBFdmVudCBCaW5kaW5nIGV4cHJlc3Npb24uXG4gICAqXG4gICAqIFJldHVybnMgYGZhbHNlYCBpZiBgcHJldmVudERlZmF1bHRgIHNob3VsZCBiZSBjYWxsZWQgdG8gc3RvcCB0aGUgZGVmYXVsdCBiZWhhdmlvciBvZiB0aGUgRXZlbnRcbiAgICogaW4gdGhlIFJlbmRlcmluZyBDb250ZXh0LlxuICAgKi9cbiAgZGlzcGF0Y2hSZW5kZXJFdmVudChlbGVtZW50SW5kZXg6IG51bWJlciwgZXZlbnROYW1lOiBzdHJpbmcsIGxvY2FsczogTWFwPHN0cmluZywgYW55Pik6IGJvb2xlYW47XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpLnRzXG4gKiovIiwiaW1wb3J0IHtUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtSZXNvbHZlZEZhY3RvcnksIHJlc29sdmVQcm92aWRlciwgUmVzb2x2ZWRQcm92aWRlcl99IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpL3Byb3ZpZGVyJztcbmltcG9ydCB7S2V5LCBSZXNvbHZlZFByb3ZpZGVyLCBQcm92aWRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtQaXBlTWV0YWRhdGF9IGZyb20gJy4uL21ldGFkYXRhL2RpcmVjdGl2ZXMnO1xuXG5leHBvcnQgY2xhc3MgUGlwZVByb3ZpZGVyIGV4dGVuZHMgUmVzb2x2ZWRQcm92aWRlcl8ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgcHVyZTogYm9vbGVhbiwga2V5OiBLZXksXG4gICAgICAgICAgICAgIHJlc29sdmVkRmFjdG9yaWVzOiBSZXNvbHZlZEZhY3RvcnlbXSwgbXVsdGlCaW5kaW5nOiBib29sZWFuKSB7XG4gICAgc3VwZXIoa2V5LCByZXNvbHZlZEZhY3RvcmllcywgbXVsdGlCaW5kaW5nKTtcbiAgfVxuXG4gIHN0YXRpYyBjcmVhdGVGcm9tVHlwZSh0eXBlOiBUeXBlLCBtZXRhZGF0YTogUGlwZU1ldGFkYXRhKTogUGlwZVByb3ZpZGVyIHtcbiAgICB2YXIgcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXIodHlwZSwge3VzZUNsYXNzOiB0eXBlfSk7XG4gICAgdmFyIHJiID0gcmVzb2x2ZVByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICByZXR1cm4gbmV3IFBpcGVQcm92aWRlcihtZXRhZGF0YS5uYW1lLCBtZXRhZGF0YS5wdXJlLCByYi5rZXksIHJiLnJlc29sdmVkRmFjdG9yaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJiLm11bHRpUHJvdmlkZXIpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9waXBlcy9waXBlX3Byb3ZpZGVyLnRzXG4gKiovIiwiaW1wb3J0IHtpc0JsYW5rLCBpc1ByZXNlbnQsIENPTlNULCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtcbiAgSW5qZWN0YWJsZSxcbiAgT3B0aW9uYWxNZXRhZGF0YSxcbiAgU2tpcFNlbGZNZXRhZGF0YSxcbiAgUHJvdmlkZXIsXG4gIEluamVjdG9yLFxuICBiaW5kXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7UGlwZVByb3ZpZGVyfSBmcm9tICcuL3BpcGVfcHJvdmlkZXInO1xuaW1wb3J0ICogYXMgY2QgZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9waXBlcyc7XG5cbmV4cG9ydCBjbGFzcyBQcm90b1BpcGVzIHtcbiAgc3RhdGljIGZyb21Qcm92aWRlcnMocHJvdmlkZXJzOiBQaXBlUHJvdmlkZXJbXSk6IFByb3RvUGlwZXMge1xuICAgIHZhciBjb25maWc6IHtba2V5OiBzdHJpbmddOiBQaXBlUHJvdmlkZXJ9ID0ge307XG4gICAgcHJvdmlkZXJzLmZvckVhY2goYiA9PiBjb25maWdbYi5uYW1lXSA9IGIpO1xuICAgIHJldHVybiBuZXcgUHJvdG9QaXBlcyhjb25maWcpO1xuICB9XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICAvKipcbiAgICAgICogTWFwIG9mIHtAbGluayBQaXBlTWV0YWRhdGF9IG5hbWVzIHRvIHtAbGluayBQaXBlTWV0YWRhdGF9IGltcGxlbWVudGF0aW9ucy5cbiAgICAgICovXG4gICAgICBwdWJsaWMgY29uZmlnOiB7W2tleTogc3RyaW5nXTogUGlwZVByb3ZpZGVyfSkge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICB9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IFBpcGVQcm92aWRlciB7XG4gICAgdmFyIHByb3ZpZGVyID0gdGhpcy5jb25maWdbbmFtZV07XG4gICAgaWYgKGlzQmxhbmsocHJvdmlkZXIpKSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ2Fubm90IGZpbmQgcGlwZSAnJHtuYW1lfScuYCk7XG4gICAgcmV0dXJuIHByb3ZpZGVyO1xuICB9XG59XG5cblxuXG5leHBvcnQgY2xhc3MgUGlwZXMgaW1wbGVtZW50cyBjZC5QaXBlcyB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NvbmZpZzoge1trZXk6IHN0cmluZ106IGNkLlNlbGVjdGVkUGlwZX0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJvdG86IFByb3RvUGlwZXMsIHB1YmxpYyBpbmplY3RvcjogSW5qZWN0b3IpIHt9XG5cbiAgZ2V0KG5hbWU6IHN0cmluZyk6IGNkLlNlbGVjdGVkUGlwZSB7XG4gICAgdmFyIGNhY2hlZCA9IFN0cmluZ01hcFdyYXBwZXIuZ2V0KHRoaXMuX2NvbmZpZywgbmFtZSk7XG4gICAgaWYgKGlzUHJlc2VudChjYWNoZWQpKSByZXR1cm4gY2FjaGVkO1xuXG4gICAgdmFyIHAgPSB0aGlzLnByb3RvLmdldChuYW1lKTtcbiAgICB2YXIgdHJhbnNmb3JtID0gdGhpcy5pbmplY3Rvci5pbnN0YW50aWF0ZVJlc29sdmVkKHApO1xuICAgIHZhciByZXMgPSBuZXcgY2QuU2VsZWN0ZWRQaXBlKHRyYW5zZm9ybSwgcC5wdXJlKTtcblxuICAgIGlmIChwLnB1cmUpIHtcbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuc2V0KHRoaXMuX2NvbmZpZywgbmFtZSwgcmVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9waXBlcy9waXBlcy50c1xuICoqLyIsImltcG9ydCB7UGlwZVRyYW5zZm9ybX0gZnJvbSAnLi9waXBlX3RyYW5zZm9ybSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGlwZXMgeyBnZXQobmFtZTogc3RyaW5nKTogU2VsZWN0ZWRQaXBlOyB9XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RlZFBpcGUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGlwZTogUGlwZVRyYW5zZm9ybSwgcHVibGljIHB1cmU6IGJvb2xlYW4pIHt9XG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9waXBlcy50c1xuICoqLyIsImltcG9ydCB7XG4gIExpc3RXcmFwcGVyLFxuICBNYXBXcmFwcGVyLFxuICBNYXAsXG4gIFN0cmluZ01hcFdyYXBwZXIsXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvcixcbiAgQ2hhbmdlRGlzcGF0Y2hlcixcbiAgRGlyZWN0aXZlSW5kZXgsXG4gIEJpbmRpbmdUYXJnZXQsXG4gIExvY2FscyxcbiAgUHJvdG9DaGFuZ2VEZXRlY3RvclxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb24nO1xuaW1wb3J0IHtEZWJ1Z0NvbnRleHR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7XG4gIFByb3RvRWxlbWVudEluamVjdG9yLFxuICBFbGVtZW50SW5qZWN0b3IsXG4gIFByZUJ1aWx0T2JqZWN0cyxcbiAgRGlyZWN0aXZlUHJvdmlkZXJcbn0gZnJvbSAnLi9lbGVtZW50X2luamVjdG9yJztcbmltcG9ydCB7RWxlbWVudEJpbmRlcn0gZnJvbSAnLi9lbGVtZW50X2JpbmRlcic7XG5pbXBvcnQge2lzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCAqIGFzIHJlbmRlckFwaSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpJztcbmltcG9ydCB7UmVuZGVyRXZlbnREaXNwYXRjaGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpJztcbmltcG9ydCB7Vmlld1JlZiwgUHJvdG9WaWV3UmVmLCBpbnRlcm5hbFZpZXd9IGZyb20gJy4vdmlld19yZWYnO1xuaW1wb3J0IHtFbGVtZW50UmVmfSBmcm9tICcuL2VsZW1lbnRfcmVmJztcbmltcG9ydCB7UHJvdG9QaXBlc30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcGlwZXMvcGlwZXMnO1xuaW1wb3J0IHtjYW1lbENhc2VUb0Rhc2hDYXNlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvdXRpbCc7XG5pbXBvcnQge1RlbXBsYXRlQ21kfSBmcm9tICcuL3RlbXBsYXRlX2NvbW1hbmRzJztcbmltcG9ydCB7Vmlld1JlZl8sIFByb3RvVmlld1JlZl99IGZyb20gXCIuL3ZpZXdfcmVmXCI7XG5cbmV4cG9ydCB7RGVidWdDb250ZXh0fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2ludGVyZmFjZXMnO1xuXG5jb25zdCBSRUZMRUNUX1BSRUZJWDogc3RyaW5nID0gJ25nLXJlZmxlY3QtJztcblxuZXhwb3J0IGVudW0gVmlld1R5cGUge1xuICAvLyBBIHZpZXcgdGhhdCBjb250YWlucyB0aGUgaG9zdCBlbGVtZW50IHdpdGggYm91bmQgY29tcG9uZW50IGRpcmVjdGl2ZS5cbiAgLy8gQ29udGFpbnMgYSBDT01QT05FTlQgdmlld1xuICBIT1NULFxuICAvLyBUaGUgdmlldyBvZiB0aGUgY29tcG9uZW50XG4gIC8vIENhbiBjb250YWluIDAgdG8gbiBFTUJFRERFRCB2aWV3c1xuICBDT01QT05FTlQsXG4gIC8vIEEgdmlldyB0aGF0IGlzIGVtYmVkZGVkIGludG8gYW5vdGhlciBWaWV3IHZpYSBhIDx0ZW1wbGF0ZT4gZWxlbWVudFxuICAvLyBpbnNpZGUgb2YgYSBDT01QT05FTlQgdmlld1xuICBFTUJFRERFRFxufVxuXG5leHBvcnQgY2xhc3MgQXBwVmlld0NvbnRhaW5lciB7XG4gIC8vIFRoZSBvcmRlciBpbiB0aGlzIGxpc3QgbWF0Y2hlcyB0aGUgRE9NIG9yZGVyLlxuICB2aWV3czogQXBwVmlld1tdID0gW107XG59XG5cbi8qKlxuICogQ29zdCBvZiBtYWtpbmcgb2JqZWN0czogaHR0cDovL2pzcGVyZi5jb20vaW5zdGFudGlhdGUtc2l6ZS1vZi1vYmplY3RcbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBBcHBWaWV3IGltcGxlbWVudHMgQ2hhbmdlRGlzcGF0Y2hlciwgUmVuZGVyRXZlbnREaXNwYXRjaGVyIHtcbiAgLy8gQXBwVmlld3MgdGhhdCBoYXZlIGJlZW4gbWVyZ2VkIGluIGRlcHRoIGZpcnN0IG9yZGVyLlxuICAvLyBUaGlzIGxpc3QgaXMgc2hhcmVkIGJldHdlZW4gYWxsIG1lcmdlZCB2aWV3cy4gVXNlIHRoaXMuZWxlbWVudE9mZnNldCB0byBnZXQgdGhlIGxvY2FsXG4gIC8vIGVudHJpZXMuXG4gIHZpZXdzOiBBcHBWaWV3W10gPSBudWxsO1xuICAvLyByb290IGVsZW1lbnRJbmplY3RvcnMgb2YgdGhpcyBBcHBWaWV3XG4gIC8vIFRoaXMgbGlzdCBpcyBsb2NhbCB0byB0aGlzIEFwcFZpZXcgYW5kIG5vdCBzaGFyZWQgd2l0aCBvdGhlciBWaWV3cy5cbiAgcm9vdEVsZW1lbnRJbmplY3RvcnM6IEVsZW1lbnRJbmplY3RvcltdO1xuICAvLyBFbGVtZW50SW5qZWN0b3JzIG9mIGFsbCBBcHBWaWV3cyBpbiB2aWV3cyBncm91cGVkIGJ5IHZpZXcuXG4gIC8vIFRoaXMgbGlzdCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgbWVyZ2VkIHZpZXdzLiBVc2UgdGhpcy5lbGVtZW50T2Zmc2V0IHRvIGdldCB0aGUgbG9jYWxcbiAgLy8gZW50cmllcy5cbiAgZWxlbWVudEluamVjdG9yczogRWxlbWVudEluamVjdG9yW10gPSBudWxsO1xuICAvLyBWaWV3Q29udGFpbmVycyBvZiBhbGwgQXBwVmlld3MgaW4gdmlld3MgZ3JvdXBlZCBieSB2aWV3LlxuICAvLyBUaGlzIGxpc3QgaXMgc2hhcmVkIGJldHdlZW4gYWxsIG1lcmdlZCB2aWV3cy4gVXNlIHRoaXMuZWxlbWVudE9mZnNldCB0byBnZXQgdGhlIGxvY2FsXG4gIC8vIGVudHJpZXMuXG4gIHZpZXdDb250YWluZXJzOiBBcHBWaWV3Q29udGFpbmVyW10gPSBudWxsO1xuICAvLyBQcmVCdWlsdE9iamVjdHMgb2YgYWxsIEFwcFZpZXdzIGluIHZpZXdzIGdyb3VwZWQgYnkgdmlldy5cbiAgLy8gVGhpcyBsaXN0IGlzIHNoYXJlZCBiZXR3ZWVuIGFsbCBtZXJnZWQgdmlld3MuIFVzZSB0aGlzLmVsZW1lbnRPZmZzZXQgdG8gZ2V0IHRoZSBsb2NhbFxuICAvLyBlbnRyaWVzLlxuICBwcmVCdWlsdE9iamVjdHM6IFByZUJ1aWx0T2JqZWN0c1tdID0gbnVsbDtcbiAgLy8gRWxlbWVudFJlZiBvZiBhbGwgQXBwVmlld3MgaW4gdmlld3MgZ3JvdXBlZCBieSB2aWV3LlxuICAvLyBUaGlzIGxpc3QgaXMgc2hhcmVkIGJldHdlZW4gYWxsIG1lcmdlZCB2aWV3cy4gVXNlIHRoaXMuZWxlbWVudE9mZnNldCB0byBnZXQgdGhlIGxvY2FsXG4gIC8vIGVudHJpZXMuXG4gIGVsZW1lbnRSZWZzOiBFbGVtZW50UmVmW107XG5cbiAgcmVmOiBWaWV3UmVmO1xuICBjaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3IgPSBudWxsO1xuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBhZ2FpbnN0IHdoaWNoIGRhdGEtYmluZGluZyBleHByZXNzaW9ucyBpbiB0aGlzIHZpZXcgYXJlIGV2YWx1YXRlZCBhZ2FpbnN0LlxuICAgKiBUaGlzIGlzIGFsd2F5cyBhIGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICovXG5cbiAgY29udGV4dDogYW55ID0gbnVsbDtcblxuICAvKipcbiAgICogVmFyaWFibGVzLCBsb2NhbCB0byB0aGlzIHZpZXcsIHRoYXQgY2FuIGJlIHVzZWQgaW4gYmluZGluZyBleHByZXNzaW9ucyAoaW4gYWRkaXRpb24gdG8gdGhlXG4gICAqIGNvbnRleHQpLiBUaGlzIGlzIHVzZWQgZm9yIHRoaW5nIGxpa2UgYDx2aWRlbyAjcGxheWVyPmAgb3JcbiAgICogYDxsaSB0ZW1wbGF0ZT1cImZvciAjaXRlbSBvZiBpdGVtc1wiPmAsIHdoZXJlIFwicGxheWVyXCIgYW5kIFwiaXRlbVwiIGFyZSBsb2NhbHMsIHJlc3BlY3RpdmVseS5cbiAgICovXG4gIGxvY2FsczogTG9jYWxzO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZW5kZXJlcjogcmVuZGVyQXBpLlJlbmRlcmVyLCBwdWJsaWMgcHJvdG86IEFwcFByb3RvVmlldyxcbiAgICAgICAgICAgICAgcHVibGljIHZpZXdPZmZzZXQ6IG51bWJlciwgcHVibGljIGVsZW1lbnRPZmZzZXQ6IG51bWJlciwgcHVibGljIHRleHRPZmZzZXQ6IG51bWJlcixcbiAgICAgICAgICAgICAgcHJvdG9Mb2NhbHM6IE1hcDxzdHJpbmcsIGFueT4sIHB1YmxpYyByZW5kZXI6IHJlbmRlckFwaS5SZW5kZXJWaWV3UmVmLFxuICAgICAgICAgICAgICBwdWJsaWMgcmVuZGVyRnJhZ21lbnQ6IHJlbmRlckFwaS5SZW5kZXJGcmFnbWVudFJlZixcbiAgICAgICAgICAgICAgcHVibGljIGNvbnRhaW5lckVsZW1lbnRJbmplY3RvcjogRWxlbWVudEluamVjdG9yKSB7XG4gICAgdGhpcy5yZWYgPSBuZXcgVmlld1JlZl8odGhpcyk7XG5cbiAgICB0aGlzLmxvY2FscyA9IG5ldyBMb2NhbHMobnVsbCwgTWFwV3JhcHBlci5jbG9uZShwcm90b0xvY2FscykpOyAgLy8gVE9ETyBvcHRpbWl6ZSB0aGlzXG4gIH1cblxuICBpbml0KGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvciwgZWxlbWVudEluamVjdG9yczogRWxlbWVudEluamVjdG9yW10sXG4gICAgICAgcm9vdEVsZW1lbnRJbmplY3RvcnM6IEVsZW1lbnRJbmplY3RvcltdLCBwcmVCdWlsdE9iamVjdHM6IFByZUJ1aWx0T2JqZWN0c1tdLFxuICAgICAgIHZpZXdzOiBBcHBWaWV3W10sIGVsZW1lbnRSZWZzOiBFbGVtZW50UmVmW10sIHZpZXdDb250YWluZXJzOiBBcHBWaWV3Q29udGFpbmVyW10pIHtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yID0gY2hhbmdlRGV0ZWN0b3I7XG4gICAgdGhpcy5lbGVtZW50SW5qZWN0b3JzID0gZWxlbWVudEluamVjdG9ycztcbiAgICB0aGlzLnJvb3RFbGVtZW50SW5qZWN0b3JzID0gcm9vdEVsZW1lbnRJbmplY3RvcnM7XG4gICAgdGhpcy5wcmVCdWlsdE9iamVjdHMgPSBwcmVCdWlsdE9iamVjdHM7XG4gICAgdGhpcy52aWV3cyA9IHZpZXdzO1xuICAgIHRoaXMuZWxlbWVudFJlZnMgPSBlbGVtZW50UmVmcztcbiAgICB0aGlzLnZpZXdDb250YWluZXJzID0gdmlld0NvbnRhaW5lcnM7XG4gIH1cblxuICBzZXRMb2NhbChjb250ZXh0TmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmh5ZHJhdGVkKCkpIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdDYW5ub3Qgc2V0IGxvY2FscyBvbiBkZWh5ZHJhdGVkIHZpZXcuJyk7XG4gICAgaWYgKCF0aGlzLnByb3RvLnRlbXBsYXRlVmFyaWFibGVCaW5kaW5ncy5oYXMoY29udGV4dE5hbWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0ZW1wbGF0ZU5hbWUgPSB0aGlzLnByb3RvLnRlbXBsYXRlVmFyaWFibGVCaW5kaW5ncy5nZXQoY29udGV4dE5hbWUpO1xuICAgIHRoaXMubG9jYWxzLnNldCh0ZW1wbGF0ZU5hbWUsIHZhbHVlKTtcbiAgfVxuXG4gIGh5ZHJhdGVkKCk6IGJvb2xlYW4geyByZXR1cm4gaXNQcmVzZW50KHRoaXMuY29udGV4dCk7IH1cblxuICAvKipcbiAgICogVHJpZ2dlcnMgdGhlIGV2ZW50IGhhbmRsZXJzIGZvciB0aGUgZWxlbWVudCBhbmQgdGhlIGRpcmVjdGl2ZXMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIGNhbGxlZCBmcm9tIGRpcmVjdGl2ZSBFdmVudEVtaXR0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEBwYXJhbSB7Kn0gZXZlbnRPYmpcbiAgICogQHBhcmFtIHtudW1iZXJ9IGJvdW5kRWxlbWVudEluZGV4XG4gICAqL1xuICB0cmlnZ2VyRXZlbnRIYW5kbGVycyhldmVudE5hbWU6IHN0cmluZywgZXZlbnRPYmo6IEV2ZW50LCBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdmFyIGxvY2FscyA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gICAgbG9jYWxzLnNldCgnJGV2ZW50JywgZXZlbnRPYmopO1xuICAgIHRoaXMuZGlzcGF0Y2hFdmVudChib3VuZEVsZW1lbnRJbmRleCwgZXZlbnROYW1lLCBsb2NhbHMpO1xuICB9XG5cbiAgLy8gZGlzcGF0Y2ggdG8gZWxlbWVudCBpbmplY3RvciBvciB0ZXh0IG5vZGVzIGJhc2VkIG9uIGNvbnRleHRcbiAgbm90aWZ5T25CaW5kaW5nKGI6IEJpbmRpbmdUYXJnZXQsIGN1cnJlbnRWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgaWYgKGIuaXNUZXh0Tm9kZSgpKSB7XG4gICAgICB0aGlzLnJlbmRlcmVyLnNldFRleHQodGhpcy5yZW5kZXIsIGIuZWxlbWVudEluZGV4ICsgdGhpcy50ZXh0T2Zmc2V0LCBjdXJyZW50VmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgZWxlbWVudFJlZiA9IHRoaXMuZWxlbWVudFJlZnNbdGhpcy5lbGVtZW50T2Zmc2V0ICsgYi5lbGVtZW50SW5kZXhdO1xuICAgICAgaWYgKGIuaXNFbGVtZW50UHJvcGVydHkoKSkge1xuICAgICAgICB0aGlzLnJlbmRlcmVyLnNldEVsZW1lbnRQcm9wZXJ0eShlbGVtZW50UmVmLCBiLm5hbWUsIGN1cnJlbnRWYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGIuaXNFbGVtZW50QXR0cmlidXRlKCkpIHtcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50QXR0cmlidXRlKGVsZW1lbnRSZWYsIGIubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJlc2VudChjdXJyZW50VmFsdWUpID8gYCR7Y3VycmVudFZhbHVlfWAgOiBudWxsKTtcbiAgICAgIH0gZWxzZSBpZiAoYi5pc0VsZW1lbnRDbGFzcygpKSB7XG4gICAgICAgIHRoaXMucmVuZGVyZXIuc2V0RWxlbWVudENsYXNzKGVsZW1lbnRSZWYsIGIubmFtZSwgY3VycmVudFZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoYi5pc0VsZW1lbnRTdHlsZSgpKSB7XG4gICAgICAgIHZhciB1bml0ID0gaXNQcmVzZW50KGIudW5pdCkgPyBiLnVuaXQgOiAnJztcbiAgICAgICAgdGhpcy5yZW5kZXJlci5zZXRFbGVtZW50U3R5bGUoZWxlbWVudFJlZiwgYi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZXNlbnQoY3VycmVudFZhbHVlKSA/IGAke2N1cnJlbnRWYWx1ZX0ke3VuaXR9YCA6IG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1Vuc3VwcG9ydGVkIGRpcmVjdGl2ZSByZWNvcmQnKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBsb2dCaW5kaW5nVXBkYXRlKGI6IEJpbmRpbmdUYXJnZXQsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoYi5pc0RpcmVjdGl2ZSgpIHx8IGIuaXNFbGVtZW50UHJvcGVydHkoKSkge1xuICAgICAgdmFyIGVsZW1lbnRSZWYgPSB0aGlzLmVsZW1lbnRSZWZzW3RoaXMuZWxlbWVudE9mZnNldCArIGIuZWxlbWVudEluZGV4XTtcbiAgICAgIHRoaXMucmVuZGVyZXIuc2V0QmluZGluZ0RlYnVnSW5mbyhcbiAgICAgICAgICBlbGVtZW50UmVmLCBgJHtSRUZMRUNUX1BSRUZJWH0ke2NhbWVsQ2FzZVRvRGFzaENhc2UoYi5uYW1lKX1gLCBgJHt2YWx1ZX1gKTtcbiAgICB9XG4gIH1cblxuICBub3RpZnlBZnRlckNvbnRlbnRDaGVja2VkKCk6IHZvaWQge1xuICAgIHZhciBlaUNvdW50ID0gdGhpcy5wcm90by5lbGVtZW50QmluZGVycy5sZW5ndGg7XG4gICAgdmFyIGVpID0gdGhpcy5lbGVtZW50SW5qZWN0b3JzO1xuICAgIGZvciAodmFyIGkgPSBlaUNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChpc1ByZXNlbnQoZWlbaSArIHRoaXMuZWxlbWVudE9mZnNldF0pKSBlaVtpICsgdGhpcy5lbGVtZW50T2Zmc2V0XS5uZ0FmdGVyQ29udGVudENoZWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBub3RpZnlBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHZhciBlaUNvdW50ID0gdGhpcy5wcm90by5lbGVtZW50QmluZGVycy5sZW5ndGg7XG4gICAgdmFyIGVpID0gdGhpcy5lbGVtZW50SW5qZWN0b3JzO1xuICAgIGZvciAodmFyIGkgPSBlaUNvdW50IC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChpc1ByZXNlbnQoZWlbaSArIHRoaXMuZWxlbWVudE9mZnNldF0pKSBlaVtpICsgdGhpcy5lbGVtZW50T2Zmc2V0XS5uZ0FmdGVyVmlld0NoZWNrZWQoKTtcbiAgICB9XG4gIH1cblxuICBnZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlOiBEaXJlY3RpdmVJbmRleCk6IGFueSB7XG4gICAgdmFyIGVsZW1lbnRJbmplY3RvciA9IHRoaXMuZWxlbWVudEluamVjdG9yc1t0aGlzLmVsZW1lbnRPZmZzZXQgKyBkaXJlY3RpdmUuZWxlbWVudEluZGV4XTtcbiAgICByZXR1cm4gZWxlbWVudEluamVjdG9yLmdldERpcmVjdGl2ZUF0SW5kZXgoZGlyZWN0aXZlLmRpcmVjdGl2ZUluZGV4KTtcbiAgfVxuXG4gIGdldE5lc3RlZFZpZXcoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlcik6IEFwcFZpZXcge1xuICAgIHZhciBlbGkgPSB0aGlzLmVsZW1lbnRJbmplY3RvcnNbYm91bmRFbGVtZW50SW5kZXhdO1xuICAgIHJldHVybiBpc1ByZXNlbnQoZWxpKSA/IGVsaS5nZXROZXN0ZWRWaWV3KCkgOiBudWxsO1xuICB9XG5cbiAgZ2V0Q29udGFpbmVyRWxlbWVudCgpOiBFbGVtZW50UmVmIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuY29udGFpbmVyRWxlbWVudEluamVjdG9yKSA/XG4gICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lckVsZW1lbnRJbmplY3Rvci5nZXRFbGVtZW50UmVmKCkgOlxuICAgICAgICAgICAgICAgbnVsbDtcbiAgfVxuXG4gIGdldERlYnVnQ29udGV4dChlbGVtZW50SW5kZXg6IG51bWJlciwgZGlyZWN0aXZlSW5kZXg6IERpcmVjdGl2ZUluZGV4KTogRGVidWdDb250ZXh0IHtcbiAgICB0cnkge1xuICAgICAgdmFyIG9mZnNldHRlZEluZGV4ID0gdGhpcy5lbGVtZW50T2Zmc2V0ICsgZWxlbWVudEluZGV4O1xuICAgICAgdmFyIGhhc1JlZkZvckluZGV4ID0gb2Zmc2V0dGVkSW5kZXggPCB0aGlzLmVsZW1lbnRSZWZzLmxlbmd0aDtcblxuICAgICAgdmFyIGVsZW1lbnRSZWYgPSBoYXNSZWZGb3JJbmRleCA/IHRoaXMuZWxlbWVudFJlZnNbdGhpcy5lbGVtZW50T2Zmc2V0ICsgZWxlbWVudEluZGV4XSA6IG51bGw7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5nZXRDb250YWluZXJFbGVtZW50KCk7XG4gICAgICB2YXIgZWkgPSBoYXNSZWZGb3JJbmRleCA/IHRoaXMuZWxlbWVudEluamVjdG9yc1t0aGlzLmVsZW1lbnRPZmZzZXQgKyBlbGVtZW50SW5kZXhdIDogbnVsbDtcblxuICAgICAgdmFyIGVsZW1lbnQgPSBpc1ByZXNlbnQoZWxlbWVudFJlZikgPyBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgOiBudWxsO1xuICAgICAgdmFyIGNvbXBvbmVudEVsZW1lbnQgPSBpc1ByZXNlbnQoY29udGFpbmVyKSA/IGNvbnRhaW5lci5uYXRpdmVFbGVtZW50IDogbnVsbDtcbiAgICAgIHZhciBkaXJlY3RpdmUgPSBpc1ByZXNlbnQoZGlyZWN0aXZlSW5kZXgpID8gdGhpcy5nZXREaXJlY3RpdmVGb3IoZGlyZWN0aXZlSW5kZXgpIDogbnVsbDtcbiAgICAgIHZhciBpbmplY3RvciA9IGlzUHJlc2VudChlaSkgPyBlaS5nZXRJbmplY3RvcigpIDogbnVsbDtcblxuICAgICAgcmV0dXJuIG5ldyBEZWJ1Z0NvbnRleHQoZWxlbWVudCwgY29tcG9uZW50RWxlbWVudCwgZGlyZWN0aXZlLCB0aGlzLmNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbG9jYWxzVG9TdHJpbmdNYXAodGhpcy5sb2NhbHMpLCBpbmplY3Rvcik7XG5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBUT0RPOiB2c2F2a2luIGxvZyB0aGUgZXhjZXB0aW9uIG9uY2Ugd2UgaGF2ZSBhIGdvb2Qgd2F5IHRvIGxvZyBlcnJvcnMgYW5kIHdhcm5pbmdzXG4gICAgICAvLyBpZiBhbiBlcnJvciBoYXBwZW5zIGR1cmluZyBnZXR0aW5nIHRoZSBkZWJ1ZyBjb250ZXh0LCB3ZSByZXR1cm4gbnVsbC5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldERldGVjdG9yRm9yKGRpcmVjdGl2ZTogRGlyZWN0aXZlSW5kZXgpOiBhbnkge1xuICAgIHZhciBjaGlsZFZpZXcgPSB0aGlzLmdldE5lc3RlZFZpZXcodGhpcy5lbGVtZW50T2Zmc2V0ICsgZGlyZWN0aXZlLmVsZW1lbnRJbmRleCk7XG4gICAgcmV0dXJuIGlzUHJlc2VudChjaGlsZFZpZXcpID8gY2hpbGRWaWV3LmNoYW5nZURldGVjdG9yIDogbnVsbDtcbiAgfVxuXG4gIGludm9rZUVsZW1lbnRNZXRob2QoZWxlbWVudEluZGV4OiBudW1iZXIsIG1ldGhvZE5hbWU6IHN0cmluZywgYXJnczogYW55W10pIHtcbiAgICB0aGlzLnJlbmRlcmVyLmludm9rZUVsZW1lbnRNZXRob2QodGhpcy5lbGVtZW50UmVmc1tlbGVtZW50SW5kZXhdLCBtZXRob2ROYW1lLCBhcmdzKTtcbiAgfVxuXG4gIC8vIGltcGxlbWVudGF0aW9uIG9mIFJlbmRlckV2ZW50RGlzcGF0Y2hlciNkaXNwYXRjaFJlbmRlckV2ZW50XG4gIGRpc3BhdGNoUmVuZGVyRXZlbnQoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgbG9jYWxzOiBNYXA8c3RyaW5nLCBhbnk+KTogYm9vbGVhbiB7XG4gICAgdmFyIGVsZW1lbnRSZWYgPSB0aGlzLmVsZW1lbnRSZWZzW2JvdW5kRWxlbWVudEluZGV4XTtcbiAgICB2YXIgdmlldyA9IGludGVybmFsVmlldyhlbGVtZW50UmVmLnBhcmVudFZpZXcpO1xuICAgIHJldHVybiB2aWV3LmRpc3BhdGNoRXZlbnQoZWxlbWVudFJlZi5ib3VuZEVsZW1lbnRJbmRleCwgZXZlbnROYW1lLCBsb2NhbHMpO1xuICB9XG5cblxuICAvLyByZXR1cm5zIGZhbHNlIGlmIHByZXZlbnREZWZhdWx0IG11c3QgYmUgYXBwbGllZCB0byB0aGUgRE9NIGV2ZW50XG4gIGRpc3BhdGNoRXZlbnQoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgZXZlbnROYW1lOiBzdHJpbmcsIGxvY2FsczogTWFwPHN0cmluZywgYW55Pik6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICBpZiAodGhpcy5oeWRyYXRlZCgpKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5jaGFuZ2VEZXRlY3Rvci5oYW5kbGVFdmVudChldmVudE5hbWUsIGJvdW5kRWxlbWVudEluZGV4IC0gdGhpcy5lbGVtZW50T2Zmc2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IExvY2Fscyh0aGlzLmxvY2FscywgbG9jYWxzKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB2YXIgYyA9IHRoaXMuZ2V0RGVidWdDb250ZXh0KGJvdW5kRWxlbWVudEluZGV4IC0gdGhpcy5lbGVtZW50T2Zmc2V0LCBudWxsKTtcbiAgICAgIHZhciBjb250ZXh0ID0gaXNQcmVzZW50KGMpID8gbmV3IF9Db250ZXh0KGMuZWxlbWVudCwgYy5jb21wb25lbnRFbGVtZW50LCBjLmNvbnRleHQsIGMubG9jYWxzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYy5pbmplY3RvcikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsO1xuICAgICAgdGhyb3cgbmV3IEV2ZW50RXZhbHVhdGlvbkVycm9yKGV2ZW50TmFtZSwgZSwgZS5zdGFjaywgY29udGV4dCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IG93bkJpbmRlcnNDb3VudCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5wcm90by5lbGVtZW50QmluZGVycy5sZW5ndGg7IH1cbn1cblxuZnVuY3Rpb24gX2xvY2Fsc1RvU3RyaW5nTWFwKGxvY2FsczogTG9jYWxzKToge1trZXk6IHN0cmluZ106IGFueX0ge1xuICB2YXIgcmVzID0ge307XG4gIHZhciBjID0gbG9jYWxzO1xuICB3aGlsZSAoaXNQcmVzZW50KGMpKSB7XG4gICAgcmVzID0gU3RyaW5nTWFwV3JhcHBlci5tZXJnZShyZXMsIE1hcFdyYXBwZXIudG9TdHJpbmdNYXAoYy5jdXJyZW50KSk7XG4gICAgYyA9IGMucGFyZW50O1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbi8qKlxuICogRXJyb3IgY29udGV4dCBpbmNsdWRlZCB3aGVuIGFuIGV2ZW50IGhhbmRsZXIgdGhyb3dzIGFuIGV4Y2VwdGlvbi5cbiAqL1xuY2xhc3MgX0NvbnRleHQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudDogYW55LCBwdWJsaWMgY29tcG9uZW50RWxlbWVudDogYW55LCBwdWJsaWMgY29udGV4dDogYW55LFxuICAgICAgICAgICAgICBwdWJsaWMgbG9jYWxzOiBhbnksIHB1YmxpYyBpbmplY3RvcjogYW55KSB7fVxufVxuXG4vKipcbiAqIFdyYXBzIGFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYW4gZXZlbnQgaGFuZGxlci5cbiAqL1xuY2xhc3MgRXZlbnRFdmFsdWF0aW9uRXJyb3IgZXh0ZW5kcyBXcmFwcGVkRXhjZXB0aW9uIHtcbiAgY29uc3RydWN0b3IoZXZlbnROYW1lOiBzdHJpbmcsIG9yaWdpbmFsRXhjZXB0aW9uOiBhbnksIG9yaWdpbmFsU3RhY2s6IGFueSwgY29udGV4dDogYW55KSB7XG4gICAgc3VwZXIoYEVycm9yIGR1cmluZyBldmFsdWF0aW9uIG9mIFwiJHtldmVudE5hbWV9XCJgLCBvcmlnaW5hbEV4Y2VwdGlvbiwgb3JpZ2luYWxTdGFjaywgY29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEFwcFByb3RvVmlld01lcmdlSW5mbyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbWJlZGRlZFZpZXdDb3VudDogbnVtYmVyLCBwdWJsaWMgZWxlbWVudENvdW50OiBudW1iZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyB2aWV3Q291bnQ6IG51bWJlcikge31cbn1cblxuLyoqXG4gKlxuICovXG5leHBvcnQgY2xhc3MgQXBwUHJvdG9WaWV3IHtcbiAgcmVmOiBQcm90b1ZpZXdSZWY7XG4gIHByb3RvTG9jYWxzOiBNYXA8c3RyaW5nLCBhbnk+O1xuXG4gIGVsZW1lbnRCaW5kZXJzOiBFbGVtZW50QmluZGVyW10gPSBudWxsO1xuICBtZXJnZUluZm86IEFwcFByb3RvVmlld01lcmdlSW5mbyA9IG51bGw7XG4gIHZhcmlhYmxlTG9jYXRpb25zOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbnVsbDtcbiAgdGV4dEJpbmRpbmdDb3VudCA9IG51bGw7XG4gIHJlbmRlcjogcmVuZGVyQXBpLlJlbmRlclByb3RvVmlld1JlZiA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlSWQ6IHN0cmluZywgcHVibGljIHRlbXBsYXRlQ21kczogVGVtcGxhdGVDbWRbXSwgcHVibGljIHR5cGU6IFZpZXdUeXBlLFxuICAgICAgICAgICAgICBwdWJsaWMgaXNNZXJnYWJsZTogYm9vbGVhbiwgcHVibGljIGNoYW5nZURldGVjdG9yRmFjdG9yeTogRnVuY3Rpb24sXG4gICAgICAgICAgICAgIHB1YmxpYyB0ZW1wbGF0ZVZhcmlhYmxlQmluZGluZ3M6IE1hcDxzdHJpbmcsIHN0cmluZz4sIHB1YmxpYyBwaXBlczogUHJvdG9QaXBlcykge1xuICAgIHRoaXMucmVmID0gbmV3IFByb3RvVmlld1JlZl8odGhpcyk7XG4gIH1cblxuICBpbml0KHJlbmRlcjogcmVuZGVyQXBpLlJlbmRlclByb3RvVmlld1JlZiwgZWxlbWVudEJpbmRlcnM6IEVsZW1lbnRCaW5kZXJbXSxcbiAgICAgICB0ZXh0QmluZGluZ0NvdW50OiBudW1iZXIsIG1lcmdlSW5mbzogQXBwUHJvdG9WaWV3TWVyZ2VJbmZvLFxuICAgICAgIHZhcmlhYmxlTG9jYXRpb25zOiBNYXA8c3RyaW5nLCBudW1iZXI+KSB7XG4gICAgdGhpcy5yZW5kZXIgPSByZW5kZXI7XG4gICAgdGhpcy5lbGVtZW50QmluZGVycyA9IGVsZW1lbnRCaW5kZXJzO1xuICAgIHRoaXMudGV4dEJpbmRpbmdDb3VudCA9IHRleHRCaW5kaW5nQ291bnQ7XG4gICAgdGhpcy5tZXJnZUluZm8gPSBtZXJnZUluZm87XG4gICAgdGhpcy52YXJpYWJsZUxvY2F0aW9ucyA9IHZhcmlhYmxlTG9jYXRpb25zO1xuICAgIHRoaXMucHJvdG9Mb2NhbHMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy50ZW1wbGF0ZVZhcmlhYmxlQmluZGluZ3MpKSB7XG4gICAgICB0aGlzLnRlbXBsYXRlVmFyaWFibGVCaW5kaW5ncy5mb3JFYWNoKFxuICAgICAgICAgICh0ZW1wbGF0ZU5hbWUsIF8pID0+IHsgdGhpcy5wcm90b0xvY2Fscy5zZXQodGVtcGxhdGVOYW1lLCBudWxsKTsgfSk7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodmFyaWFibGVMb2NhdGlvbnMpKSB7XG4gICAgICAvLyBUaGUgdmlldydzIGxvY2FscyBuZWVkcyB0byBoYXZlIGEgZnVsbCBzZXQgb2YgdmFyaWFibGUgbmFtZXMgYXQgY29uc3RydWN0aW9uIHRpbWVcbiAgICAgIC8vIGluIG9yZGVyIHRvIHByZXZlbnQgbmV3IHZhcmlhYmxlcyBmcm9tIGJlaW5nIHNldCBsYXRlciBpbiB0aGUgbGlmZWN5Y2xlLiBTaW5jZSB3ZSBkb24ndFxuICAgICAgLy8gd2FudFxuICAgICAgLy8gdG8gYWN0dWFsbHkgY3JlYXRlIHZhcmlhYmxlIGJpbmRpbmdzIGZvciB0aGUgJGltcGxpY2l0IGJpbmRpbmdzLCBhZGQgdG8gdGhlXG4gICAgICAvLyBwcm90b0xvY2FscyBtYW51YWxseS5cbiAgICAgIHZhcmlhYmxlTG9jYXRpb25zLmZvckVhY2goKF8sIHRlbXBsYXRlTmFtZSkgPT4geyB0aGlzLnByb3RvTG9jYWxzLnNldCh0ZW1wbGF0ZU5hbWUsIG51bGwpOyB9KTtcbiAgICB9XG4gIH1cblxuICBpc0luaXRpYWxpemVkKCk6IGJvb2xlYW4geyByZXR1cm4gaXNQcmVzZW50KHRoaXMuZWxlbWVudEJpbmRlcnMpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlldy50c1xuICoqLyIsImltcG9ydCB7aXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHt1bmltcGxlbWVudGVkfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0ICogYXMgdmlld01vZHVsZSBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3RvclJlZn0gZnJvbSAnLi4vY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0b3JfcmVmJztcbmltcG9ydCB7UmVuZGVyVmlld1JlZiwgUmVuZGVyRnJhZ21lbnRSZWZ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci9hcGknO1xuXG4vLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgcHJpdmFjeSBpbiBEYXJ0IGFzIHdlIGRvbid0IGhhdmUgbGlicmFyeSBwYXJ0c1xuZXhwb3J0IGZ1bmN0aW9uIGludGVybmFsVmlldyh2aWV3UmVmOiBWaWV3UmVmKTogdmlld01vZHVsZS5BcHBWaWV3IHtcbiAgcmV0dXJuICg8Vmlld1JlZl8+dmlld1JlZikuX3ZpZXc7XG59XG5cbi8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBwcml2YWN5IGluIERhcnQgYXMgd2UgZG9uJ3QgaGF2ZSBsaWJyYXJ5IHBhcnRzXG5leHBvcnQgZnVuY3Rpb24gaW50ZXJuYWxQcm90b1ZpZXcocHJvdG9WaWV3UmVmOiBQcm90b1ZpZXdSZWYpOiB2aWV3TW9kdWxlLkFwcFByb3RvVmlldyB7XG4gIHJldHVybiBpc1ByZXNlbnQocHJvdG9WaWV3UmVmKSA/ICg8UHJvdG9WaWV3UmVmXz5wcm90b1ZpZXdSZWYpLl9wcm90b1ZpZXcgOiBudWxsO1xufVxuXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIFZpZXcgY29udGFpbmluZyBhIHNpbmdsZSBFbGVtZW50IHRoYXQgaXMgdGhlIEhvc3QgRWxlbWVudCBvZiBhIHtAbGluayBDb21wb25lbnR9XG4gKiBpbnN0YW5jZS5cbiAqXG4gKiBBIEhvc3QgVmlldyBpcyBjcmVhdGVkIGZvciBldmVyeSBkeW5hbWljYWxseSBjcmVhdGVkIENvbXBvbmVudCB0aGF0IHdhcyBjb21waWxlZCBvbiBpdHMgb3duIChhc1xuICogb3Bwb3NlZCB0byBhcyBhIHBhcnQgb2YgYW5vdGhlciBDb21wb25lbnQncyBUZW1wbGF0ZSkgdmlhIHtAbGluayBDb21waWxlciNjb21waWxlSW5Ib3N0fSBvciBvbmVcbiAqIG9mIHRoZSBoaWdoZXItbGV2ZWwgQVBJczoge0BsaW5rIEFwcFZpZXdNYW5hZ2VyI2NyZWF0ZVJvb3RIb3N0Vmlld30sXG4gKiB7QGxpbmsgQXBwVmlld01hbmFnZXIjY3JlYXRlSG9zdFZpZXdJbkNvbnRhaW5lcn0sIHtAbGluayBWaWV3Q29udGFpbmVyUmVmI2NyZWF0ZUhvc3RWaWV3fS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIb3N0Vmlld1JlZiB7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIGNoYW5nZURldGVjdG9yUmVmOiBDaGFuZ2VEZXRlY3RvclJlZjtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEFuZ3VsYXIgVmlldy5cbiAqXG4gKiA8IS0tIFRPRE86IG1vdmUgdGhlIG5leHQgdHdvIHBhcmFncmFwaHMgdG8gdGhlIGRldiBndWlkZSAtLT5cbiAqIEEgVmlldyBpcyBhIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrIG9mIHRoZSBhcHBsaWNhdGlvbiBVSS4gSXQgaXMgdGhlIHNtYWxsZXN0IGdyb3VwaW5nIG9mXG4gKiBFbGVtZW50cyB3aGljaCBhcmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkIHRvZ2V0aGVyLlxuICpcbiAqIFByb3BlcnRpZXMgb2YgZWxlbWVudHMgaW4gYSBWaWV3IGNhbiBjaGFuZ2UsIGJ1dCB0aGUgc3RydWN0dXJlIChudW1iZXIgYW5kIG9yZGVyKSBvZiBlbGVtZW50cyBpblxuICogYSBWaWV3IGNhbm5vdC4gQ2hhbmdpbmcgdGhlIHN0cnVjdHVyZSBvZiBFbGVtZW50cyBjYW4gb25seSBiZSBkb25lIGJ5IGluc2VydGluZywgbW92aW5nIG9yXG4gKiByZW1vdmluZyBuZXN0ZWQgVmlld3MgdmlhIGEge0BsaW5rIFZpZXdDb250YWluZXJSZWZ9LiBFYWNoIFZpZXcgY2FuIGNvbnRhaW4gbWFueSBWaWV3IENvbnRhaW5lcnMuXG4gKiA8IS0tIC9UT0RPIC0tPlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogR2l2ZW4gdGhpcyB0ZW1wbGF0ZS4uLlxuICpcbiAqIGBgYFxuICogQ291bnQ6IHt7aXRlbXMubGVuZ3RofX1cbiAqIDx1bD5cbiAqICAgPGxpICpuZ0Zvcj1cInZhciBpdGVtIG9mIGl0ZW1zXCI+e3tpdGVtfX08L2xpPlxuICogPC91bD5cbiAqIGBgYFxuICpcbiAqIC4uLiB3ZSBoYXZlIHR3byB7QGxpbmsgUHJvdG9WaWV3UmVmfXM6XG4gKlxuICogT3V0ZXIge0BsaW5rIFByb3RvVmlld1JlZn06XG4gKiBgYGBcbiAqIENvdW50OiB7e2l0ZW1zLmxlbmd0aH19XG4gKiA8dWw+XG4gKiAgIDx0ZW1wbGF0ZSBuZ0ZvciB2YXItaXRlbSBbbmdGb3JPZl09XCJpdGVtc1wiPjwvdGVtcGxhdGU+XG4gKiA8L3VsPlxuICogYGBgXG4gKlxuICogSW5uZXIge0BsaW5rIFByb3RvVmlld1JlZn06XG4gKiBgYGBcbiAqICAgPGxpPnt7aXRlbX19PC9saT5cbiAqIGBgYFxuICpcbiAqIE5vdGljZSB0aGF0IHRoZSBvcmlnaW5hbCB0ZW1wbGF0ZSBpcyBicm9rZW4gZG93biBpbnRvIHR3byBzZXBhcmF0ZSB7QGxpbmsgUHJvdG9WaWV3UmVmfXMuXG4gKlxuICogVGhlIG91dGVyL2lubmVyIHtAbGluayBQcm90b1ZpZXdSZWZ9cyBhcmUgdGhlbiBhc3NlbWJsZWQgaW50byB2aWV3cyBsaWtlIHNvOlxuICpcbiAqIGBgYFxuICogPCEtLSBWaWV3UmVmOiBvdXRlci0wIC0tPlxuICogQ291bnQ6IDJcbiAqIDx1bD5cbiAqICAgPHRlbXBsYXRlIHZpZXctY29udGFpbmVyLXJlZj48L3RlbXBsYXRlPlxuICogICA8IS0tIFZpZXdSZWY6IGlubmVyLTEgLS0+PGxpPmZpcnN0PC9saT48IS0tIC9WaWV3UmVmOiBpbm5lci0xIC0tPlxuICogICA8IS0tIFZpZXdSZWY6IGlubmVyLTIgLS0+PGxpPnNlY29uZDwvbGk+PCEtLSAvVmlld1JlZjogaW5uZXItMiAtLT5cbiAqIDwvdWw+XG4gKiA8IS0tIC9WaWV3UmVmOiBvdXRlci0wIC0tPlxuICogYGBgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBWaWV3UmVmIGltcGxlbWVudHMgSG9zdFZpZXdSZWYge1xuICAvKipcbiAgICogU2V0cyBgdmFsdWVgIG9mIGxvY2FsIHZhcmlhYmxlIGNhbGxlZCBgdmFyaWFibGVOYW1lYCBpbiB0aGlzIFZpZXcuXG4gICAqL1xuICBhYnN0cmFjdCBzZXRMb2NhbCh2YXJpYWJsZU5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk6IHZvaWQ7XG5cbiAgZ2V0IGNoYW5nZURldGVjdG9yUmVmKCk6IENoYW5nZURldGVjdG9yUmVmIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxuICBzZXQgY2hhbmdlRGV0ZWN0b3JSZWYodmFsdWU6IENoYW5nZURldGVjdG9yUmVmKSB7XG4gICAgdW5pbXBsZW1lbnRlZCgpOyAgLy8gVE9ETzogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xMlxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWaWV3UmVmXyBleHRlbmRzIFZpZXdSZWYge1xuICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvclJlZjogQ2hhbmdlRGV0ZWN0b3JSZWYgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfdmlldzogdmlld01vZHVsZS5BcHBWaWV3O1xuICBjb25zdHJ1Y3Rvcihfdmlldzogdmlld01vZHVsZS5BcHBWaWV3KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLl92aWV3ID0gX3ZpZXc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGBSZW5kZXJWaWV3UmVmYFxuICAgKi9cbiAgZ2V0IHJlbmRlcigpOiBSZW5kZXJWaWV3UmVmIHsgcmV0dXJuIHRoaXMuX3ZpZXcucmVuZGVyOyB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBgUmVuZGVyRnJhZ21lbnRSZWZgXG4gICAqL1xuICBnZXQgcmVuZGVyRnJhZ21lbnQoKTogUmVuZGVyRnJhZ21lbnRSZWYgeyByZXR1cm4gdGhpcy5fdmlldy5yZW5kZXJGcmFnbWVudDsgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYENoYW5nZURldGVjdG9yUmVmYFxuICAgKi9cbiAgZ2V0IGNoYW5nZURldGVjdG9yUmVmKCk6IENoYW5nZURldGVjdG9yUmVmIHtcbiAgICBpZiAodGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPT09IG51bGwpIHtcbiAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmID0gdGhpcy5fdmlldy5jaGFuZ2VEZXRlY3Rvci5yZWY7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZjtcbiAgfVxuXG4gIHNldExvY2FsKHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7IHRoaXMuX3ZpZXcuc2V0TG9jYWwodmFyaWFibGVOYW1lLCB2YWx1ZSk7IH1cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEFuZ3VsYXIgUHJvdG9WaWV3LlxuICpcbiAqIEEgUHJvdG9WaWV3IGlzIGEgcHJvdG90eXBpY2FsIHtAbGluayBWaWV3UmVmIFZpZXd9IHRoYXQgaXMgdGhlIHJlc3VsdCBvZiBUZW1wbGF0ZSBjb21waWxhdGlvbiBhbmRcbiAqIGlzIHVzZWQgYnkgQW5ndWxhciB0byBlZmZpY2llbnRseSBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhpcyBWaWV3IGJhc2VkIG9uIHRoZSBjb21waWxlZCBUZW1wbGF0ZS5cbiAqXG4gKiBNb3N0IFByb3RvVmlld3MgYXJlIGNyZWF0ZWQgYW5kIHVzZWQgaW50ZXJuYWxseSBieSBBbmd1bGFyIGFuZCB5b3UgZG9uJ3QgbmVlZCB0byBrbm93IGFib3V0IHRoZW0sXG4gKiBleGNlcHQgaW4gYWR2YW5jZWQgdXNlLWNhc2VzIHdoZXJlIHlvdSBjb21waWxlIGNvbXBvbmVudHMgeW91cnNlbGYgdmlhIHRoZSBsb3ctbGV2ZWxcbiAqIHtAbGluayBDb21waWxlciNjb21waWxlSW5Ib3N0fSBBUEkuXG4gKlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogR2l2ZW4gdGhpcyB0ZW1wbGF0ZTpcbiAqXG4gKiBgYGBcbiAqIENvdW50OiB7e2l0ZW1zLmxlbmd0aH19XG4gKiA8dWw+XG4gKiAgIDxsaSAqbmdGb3I9XCJ2YXIgaXRlbSBvZiBpdGVtc1wiPnt7aXRlbX19PC9saT5cbiAqIDwvdWw+XG4gKiBgYGBcbiAqXG4gKiBBbmd1bGFyIGRlc3VnYXJzIGFuZCBjb21waWxlcyB0aGUgdGVtcGxhdGUgaW50byB0d28gUHJvdG9WaWV3czpcbiAqXG4gKiBPdXRlciBQcm90b1ZpZXc6XG4gKiBgYGBcbiAqIENvdW50OiB7e2l0ZW1zLmxlbmd0aH19XG4gKiA8dWw+XG4gKiAgIDx0ZW1wbGF0ZSBuZ0ZvciB2YXItaXRlbSBbbmdGb3JPZl09XCJpdGVtc1wiPjwvdGVtcGxhdGU+XG4gKiA8L3VsPlxuICogYGBgXG4gKlxuICogSW5uZXIgUHJvdG9WaWV3OlxuICogYGBgXG4gKiAgIDxsaT57e2l0ZW19fTwvbGk+XG4gKiBgYGBcbiAqXG4gKiBOb3RpY2UgdGhhdCB0aGUgb3JpZ2luYWwgdGVtcGxhdGUgaXMgYnJva2VuIGRvd24gaW50byB0d28gc2VwYXJhdGUgUHJvdG9WaWV3cy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFByb3RvVmlld1JlZiB7fVxuXG5leHBvcnQgY2xhc3MgUHJvdG9WaWV3UmVmXyBleHRlbmRzIFByb3RvVmlld1JlZiB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHVibGljIF9wcm90b1ZpZXc6IHZpZXdNb2R1bGUuQXBwUHJvdG9WaWV3O1xuICBjb25zdHJ1Y3RvcihfcHJvdG9WaWV3OiB2aWV3TW9kdWxlLkFwcFByb3RvVmlldykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcHJvdG9WaWV3ID0gX3Byb3RvVmlldztcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcmVmLnRzXG4gKiovIiwiaW1wb3J0IHtTdHJpbmdXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG52YXIgQ0FNRUxfQ0FTRV9SRUdFWFAgPSAvKFtBLVpdKS9nO1xudmFyIERBU0hfQ0FTRV9SRUdFWFAgPSAvLShbYS16XSkvZztcblxuXG5leHBvcnQgZnVuY3Rpb24gY2FtZWxDYXNlVG9EYXNoQ2FzZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChpbnB1dCwgQ0FNRUxfQ0FTRV9SRUdFWFAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0pID0+IHsgcmV0dXJuICctJyArIG1bMV0udG9Mb3dlckNhc2UoKTsgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoQ2FzZVRvQ2FtZWxDYXNlKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsTWFwcGVkKGlucHV0LCBEQVNIX0NBU0VfUkVHRVhQLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtKSA9PiB7IHJldHVybiBtWzFdLnRvVXBwZXJDYXNlKCk7IH0pO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3V0aWwudHNcbiAqKi8iLCJpbXBvcnQge2lzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQgKiBhcyBlaU1vZHVsZSBmcm9tICcuL2VsZW1lbnRfaW5qZWN0b3InO1xuaW1wb3J0IHtEaXJlY3RpdmVQcm92aWRlcn0gZnJvbSAnLi9lbGVtZW50X2luamVjdG9yJztcbmltcG9ydCAqIGFzIHZpZXdNb2R1bGUgZnJvbSAnLi92aWV3JztcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRCaW5kZXIge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5kZXg6IG51bWJlciwgcHVibGljIHBhcmVudDogRWxlbWVudEJpbmRlciwgcHVibGljIGRpc3RhbmNlVG9QYXJlbnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIHByb3RvRWxlbWVudEluamVjdG9yOiBlaU1vZHVsZS5Qcm90b0VsZW1lbnRJbmplY3RvcixcbiAgICAgICAgICAgICAgcHVibGljIGNvbXBvbmVudERpcmVjdGl2ZTogRGlyZWN0aXZlUHJvdmlkZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyBuZXN0ZWRQcm90b1ZpZXc6IHZpZXdNb2R1bGUuQXBwUHJvdG9WaWV3KSB7XG4gICAgaWYgKGlzQmxhbmsoaW5kZXgpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignbnVsbCBpbmRleCBub3QgYWxsb3dlZC4nKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9lbGVtZW50X2JpbmRlci50c1xuICoqLyIsImltcG9ydCB7XG4gIGlzUHJlc2VudCxcbiAgaXNCbGFuayxcbiAgVHlwZSxcbiAgc3RyaW5naWZ5LFxuICBDT05TVF9FWFBSLFxuICBTdHJpbmdXcmFwcGVyXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge0V2ZW50RW1pdHRlciwgT2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlciwgU3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIEluamVjdG9yLFxuICBLZXksXG4gIERlcGVuZGVuY3ksXG4gIHByb3ZpZGUsXG4gIFByb3ZpZGVyLFxuICBSZXNvbHZlZFByb3ZpZGVyLFxuICBOb1Byb3ZpZGVyRXJyb3IsXG4gIEFic3RyYWN0UHJvdmlkZXJFcnJvcixcbiAgQ3ljbGljRGVwZW5kZW5jeUVycm9yLFxuICByZXNvbHZlRm9yd2FyZFJlZlxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1xuICBVTkRFRklORUQsXG4gIFByb3RvSW5qZWN0b3IsXG4gIFZpc2liaWxpdHksXG4gIEluamVjdG9ySW5saW5lU3RyYXRlZ3ksXG4gIEluamVjdG9yRHluYW1pY1N0cmF0ZWd5LFxuICBQcm92aWRlcldpdGhWaXNpYmlsaXR5LFxuICBEZXBlbmRlbmN5UHJvdmlkZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGkvaW5qZWN0b3InO1xuaW1wb3J0IHtyZXNvbHZlUHJvdmlkZXIsIFJlc29sdmVkRmFjdG9yeSwgUmVzb2x2ZWRQcm92aWRlcl99IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpL3Byb3ZpZGVyJztcblxuaW1wb3J0IHtBdHRyaWJ1dGVNZXRhZGF0YSwgUXVlcnlNZXRhZGF0YX0gZnJvbSAnLi4vbWV0YWRhdGEvZGknO1xuXG5pbXBvcnQge0FwcFZpZXdDb250YWluZXIsIEFwcFZpZXd9IGZyb20gJy4vdmlldyc7XG4vKiBjaXJjdWxhciAqLyBpbXBvcnQgKiBhcyBhdm1Nb2R1bGUgZnJvbSAnLi92aWV3X21hbmFnZXInO1xuaW1wb3J0IHtWaWV3Q29udGFpbmVyUmVmfSBmcm9tICcuL3ZpZXdfY29udGFpbmVyX3JlZic7XG5pbXBvcnQge0VsZW1lbnRSZWZ9IGZyb20gJy4vZWxlbWVudF9yZWYnO1xuaW1wb3J0IHtUZW1wbGF0ZVJlZn0gZnJvbSAnLi90ZW1wbGF0ZV9yZWYnO1xuaW1wb3J0IHtEaXJlY3RpdmVNZXRhZGF0YSwgQ29tcG9uZW50TWV0YWRhdGF9IGZyb20gJy4uL21ldGFkYXRhL2RpcmVjdGl2ZXMnO1xuaW1wb3J0IHtoYXNMaWZlY3ljbGVIb29rfSBmcm9tICcuL2RpcmVjdGl2ZV9saWZlY3ljbGVfcmVmbGVjdG9yJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9yLFxuICBDaGFuZ2VEZXRlY3RvclJlZlxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb24nO1xuaW1wb3J0IHtRdWVyeUxpc3R9IGZyb20gJy4vcXVlcnlfbGlzdCc7XG5pbXBvcnQge3JlZmxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcbmltcG9ydCB7U2V0dGVyRm59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vdHlwZXMnO1xuaW1wb3J0IHtFdmVudENvbmZpZ30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2V2ZW50X2NvbmZpZyc7XG5pbXBvcnQge0FmdGVyVmlld0NoZWNrZWR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9pbnRlcmZhY2VzJztcbmltcG9ydCB7UGlwZVByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9waXBlcy9waXBlX3Byb3ZpZGVyJztcblxuaW1wb3J0IHtMaWZlY3ljbGVIb29rc30gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7Vmlld0NvbnRhaW5lclJlZl99IGZyb20gXCIuL3ZpZXdfY29udGFpbmVyX3JlZlwiO1xuXG52YXIgX3N0YXRpY0tleXM7XG5cbmV4cG9ydCBjbGFzcyBTdGF0aWNLZXlzIHtcbiAgdmlld01hbmFnZXJJZDogbnVtYmVyO1xuICB0ZW1wbGF0ZVJlZklkOiBudW1iZXI7XG4gIHZpZXdDb250YWluZXJJZDogbnVtYmVyO1xuICBjaGFuZ2VEZXRlY3RvclJlZklkOiBudW1iZXI7XG4gIGVsZW1lbnRSZWZJZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMudmlld01hbmFnZXJJZCA9IEtleS5nZXQoYXZtTW9kdWxlLkFwcFZpZXdNYW5hZ2VyKS5pZDtcbiAgICB0aGlzLnRlbXBsYXRlUmVmSWQgPSBLZXkuZ2V0KFRlbXBsYXRlUmVmKS5pZDtcbiAgICB0aGlzLnZpZXdDb250YWluZXJJZCA9IEtleS5nZXQoVmlld0NvbnRhaW5lclJlZikuaWQ7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3RvclJlZklkID0gS2V5LmdldChDaGFuZ2VEZXRlY3RvclJlZikuaWQ7XG4gICAgdGhpcy5lbGVtZW50UmVmSWQgPSBLZXkuZ2V0KEVsZW1lbnRSZWYpLmlkO1xuICB9XG5cbiAgc3RhdGljIGluc3RhbmNlKCk6IFN0YXRpY0tleXMge1xuICAgIGlmIChpc0JsYW5rKF9zdGF0aWNLZXlzKSkgX3N0YXRpY0tleXMgPSBuZXcgU3RhdGljS2V5cygpO1xuICAgIHJldHVybiBfc3RhdGljS2V5cztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVHJlZU5vZGU8VCBleHRlbmRzIFRyZWVOb2RlPGFueT4+IHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcGFyZW50OiBUO1xuICBjb25zdHJ1Y3RvcihwYXJlbnQ6IFQpIHtcbiAgICBpZiAoaXNQcmVzZW50KHBhcmVudCkpIHtcbiAgICAgIHBhcmVudC5hZGRDaGlsZCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGFyZW50ID0gbnVsbDtcbiAgICB9XG4gIH1cblxuICBhZGRDaGlsZChjaGlsZDogVCk6IHZvaWQgeyBjaGlsZC5fcGFyZW50ID0gdGhpczsgfVxuXG4gIHJlbW92ZSgpOiB2b2lkIHsgdGhpcy5fcGFyZW50ID0gbnVsbDsgfVxuXG4gIGdldCBwYXJlbnQoKSB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH1cbn1cblxuZXhwb3J0IGNsYXNzIERpcmVjdGl2ZURlcGVuZGVuY3kgZXh0ZW5kcyBEZXBlbmRlbmN5IHtcbiAgY29uc3RydWN0b3Ioa2V5OiBLZXksIG9wdGlvbmFsOiBib29sZWFuLCBsb3dlckJvdW5kVmlzaWJpbGl0eTogT2JqZWN0LFxuICAgICAgICAgICAgICB1cHBlckJvdW5kVmlzaWJpbGl0eTogT2JqZWN0LCBwcm9wZXJ0aWVzOiBhbnlbXSwgcHVibGljIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHVibGljIHF1ZXJ5RGVjb3JhdG9yOiBRdWVyeU1ldGFkYXRhKSB7XG4gICAgc3VwZXIoa2V5LCBvcHRpb25hbCwgbG93ZXJCb3VuZFZpc2liaWxpdHksIHVwcGVyQm91bmRWaXNpYmlsaXR5LCBwcm9wZXJ0aWVzKTtcbiAgICB0aGlzLl92ZXJpZnkoKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZlcmlmeSgpOiB2b2lkIHtcbiAgICB2YXIgY291bnQgPSAwO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeURlY29yYXRvcikpIGNvdW50Kys7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmF0dHJpYnV0ZU5hbWUpKSBjb3VudCsrO1xuICAgIGlmIChjb3VudCA+IDEpXG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICAnQSBkaXJlY3RpdmUgaW5qZWN0YWJsZSBjYW4gY29udGFpbiBvbmx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIEBBdHRyaWJ1dGUgb3IgQFF1ZXJ5LicpO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZyb20oZDogRGVwZW5kZW5jeSk6IERlcGVuZGVuY3kge1xuICAgIHJldHVybiBuZXcgRGlyZWN0aXZlRGVwZW5kZW5jeShcbiAgICAgICAgZC5rZXksIGQub3B0aW9uYWwsIGQubG93ZXJCb3VuZFZpc2liaWxpdHksIGQudXBwZXJCb3VuZFZpc2liaWxpdHksIGQucHJvcGVydGllcyxcbiAgICAgICAgRGlyZWN0aXZlRGVwZW5kZW5jeS5fYXR0cmlidXRlTmFtZShkLnByb3BlcnRpZXMpLCBEaXJlY3RpdmVEZXBlbmRlbmN5Ll9xdWVyeShkLnByb3BlcnRpZXMpKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9hdHRyaWJ1dGVOYW1lKHByb3BlcnRpZXM6IGFueVtdKTogc3RyaW5nIHtcbiAgICB2YXIgcCA9IDxBdHRyaWJ1dGVNZXRhZGF0YT5wcm9wZXJ0aWVzLmZpbmQocCA9PiBwIGluc3RhbmNlb2YgQXR0cmlidXRlTWV0YWRhdGEpO1xuICAgIHJldHVybiBpc1ByZXNlbnQocCkgPyBwLmF0dHJpYnV0ZU5hbWUgOiBudWxsO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX3F1ZXJ5KHByb3BlcnRpZXM6IGFueVtdKTogUXVlcnlNZXRhZGF0YSB7XG4gICAgcmV0dXJuIDxRdWVyeU1ldGFkYXRhPnByb3BlcnRpZXMuZmluZChwID0+IHAgaW5zdGFuY2VvZiBRdWVyeU1ldGFkYXRhKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlUHJvdmlkZXIgZXh0ZW5kcyBSZXNvbHZlZFByb3ZpZGVyXyB7XG4gIHB1YmxpYyBjYWxsT25EZXN0cm95OiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGtleTogS2V5LCBmYWN0b3J5OiBGdW5jdGlvbiwgZGVwczogRGVwZW5kZW5jeVtdLCBwdWJsaWMgbWV0YWRhdGE6IERpcmVjdGl2ZU1ldGFkYXRhLFxuICAgICAgICAgICAgICBwdWJsaWMgcHJvdmlkZXJzOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4sXG4gICAgICAgICAgICAgIHB1YmxpYyB2aWV3UHJvdmlkZXJzOiBBcnJheTxUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXT4pIHtcbiAgICBzdXBlcihrZXksIFtuZXcgUmVzb2x2ZWRGYWN0b3J5KGZhY3RvcnksIGRlcHMpXSwgZmFsc2UpO1xuICAgIHRoaXMuY2FsbE9uRGVzdHJveSA9IGhhc0xpZmVjeWNsZUhvb2soTGlmZWN5Y2xlSG9va3MuT25EZXN0cm95LCBrZXkudG9rZW4pO1xuICB9XG5cbiAgZ2V0IGRpc3BsYXlOYW1lKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmtleS5kaXNwbGF5TmFtZTsgfVxuXG4gIGdldCBxdWVyaWVzKCk6IFF1ZXJ5TWV0YWRhdGFXaXRoU2V0dGVyW10ge1xuICAgIGlmIChpc0JsYW5rKHRoaXMubWV0YWRhdGEucXVlcmllcykpIHJldHVybiBbXTtcblxuICAgIHZhciByZXMgPSBbXTtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2godGhpcy5tZXRhZGF0YS5xdWVyaWVzLCAobWV0YSwgZmllbGROYW1lKSA9PiB7XG4gICAgICB2YXIgc2V0dGVyID0gcmVmbGVjdG9yLnNldHRlcihmaWVsZE5hbWUpO1xuICAgICAgcmVzLnB1c2gobmV3IFF1ZXJ5TWV0YWRhdGFXaXRoU2V0dGVyKHNldHRlciwgbWV0YSkpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICBnZXQgZXZlbnRFbWl0dGVycygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLm1ldGFkYXRhKSAmJiBpc1ByZXNlbnQodGhpcy5tZXRhZGF0YS5vdXRwdXRzKSA/IHRoaXMubWV0YWRhdGEub3V0cHV0cyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdO1xuICB9XG5cbiAgc3RhdGljIGNyZWF0ZUZyb21Qcm92aWRlcihwcm92aWRlcjogUHJvdmlkZXIsIG1ldGE6IERpcmVjdGl2ZU1ldGFkYXRhKTogRGlyZWN0aXZlUHJvdmlkZXIge1xuICAgIGlmIChpc0JsYW5rKG1ldGEpKSB7XG4gICAgICBtZXRhID0gbmV3IERpcmVjdGl2ZU1ldGFkYXRhKCk7XG4gICAgfVxuXG4gICAgdmFyIHJiID0gcmVzb2x2ZVByb3ZpZGVyKHByb3ZpZGVyKTtcbiAgICB2YXIgcmYgPSByYi5yZXNvbHZlZEZhY3Rvcmllc1swXTtcbiAgICB2YXIgZGVwcyA9IHJmLmRlcGVuZGVuY2llcy5tYXAoRGlyZWN0aXZlRGVwZW5kZW5jeS5jcmVhdGVGcm9tKTtcblxuICAgIHZhciBwcm92aWRlcnMgPSBpc1ByZXNlbnQobWV0YS5wcm92aWRlcnMpID8gbWV0YS5wcm92aWRlcnMgOiBbXTtcbiAgICB2YXIgdmlld0JpbmRpZ3MgPSBtZXRhIGluc3RhbmNlb2YgQ29tcG9uZW50TWV0YWRhdGEgJiYgaXNQcmVzZW50KG1ldGEudmlld1Byb3ZpZGVycykgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnZpZXdQcm92aWRlcnMgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBbXTtcbiAgICByZXR1cm4gbmV3IERpcmVjdGl2ZVByb3ZpZGVyKHJiLmtleSwgcmYuZmFjdG9yeSwgZGVwcywgbWV0YSwgcHJvdmlkZXJzLCB2aWV3QmluZGlncyk7XG4gIH1cblxuICBzdGF0aWMgY3JlYXRlRnJvbVR5cGUodHlwZTogVHlwZSwgYW5ub3RhdGlvbjogRGlyZWN0aXZlTWV0YWRhdGEpOiBEaXJlY3RpdmVQcm92aWRlciB7XG4gICAgdmFyIHByb3ZpZGVyID0gbmV3IFByb3ZpZGVyKHR5cGUsIHt1c2VDbGFzczogdHlwZX0pO1xuICAgIHJldHVybiBEaXJlY3RpdmVQcm92aWRlci5jcmVhdGVGcm9tUHJvdmlkZXIocHJvdmlkZXIsIGFubm90YXRpb24pO1xuICB9XG59XG5cbi8vIFRPRE8ocmFkbyk6IGJlbmNobWFyayBhbmQgY29uc2lkZXIgcm9sbGluZyBpbiBhcyBFbGVtZW50SW5qZWN0b3IgZmllbGRzLlxuZXhwb3J0IGNsYXNzIFByZUJ1aWx0T2JqZWN0cyB7XG4gIG5lc3RlZFZpZXc6IEFwcFZpZXcgPSBudWxsO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmlld01hbmFnZXI6IGF2bU1vZHVsZS5BcHBWaWV3TWFuYWdlciwgcHVibGljIHZpZXc6IEFwcFZpZXcsXG4gICAgICAgICAgICAgIHB1YmxpYyBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBwdWJsaWMgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgUXVlcnlNZXRhZGF0YVdpdGhTZXR0ZXIge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc2V0dGVyOiBTZXR0ZXJGbiwgcHVibGljIG1ldGFkYXRhOiBRdWVyeU1ldGFkYXRhKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgRXZlbnRFbWl0dGVyQWNjZXNzb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXZlbnROYW1lOiBzdHJpbmcsIHB1YmxpYyBnZXR0ZXI6IEZ1bmN0aW9uKSB7fVxuXG4gIHN1YnNjcmliZSh2aWV3OiBBcHBWaWV3LCBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLCBkaXJlY3RpdmU6IE9iamVjdCk6IE9iamVjdCB7XG4gICAgdmFyIGV2ZW50RW1pdHRlciA9IHRoaXMuZ2V0dGVyKGRpcmVjdGl2ZSk7XG4gICAgcmV0dXJuIE9ic2VydmFibGVXcmFwcGVyLnN1YnNjcmliZTxFdmVudD4oXG4gICAgICAgIGV2ZW50RW1pdHRlcixcbiAgICAgICAgZXZlbnRPYmogPT4gdmlldy50cmlnZ2VyRXZlbnRIYW5kbGVycyh0aGlzLmV2ZW50TmFtZSwgZXZlbnRPYmosIGJvdW5kRWxlbWVudEluZGV4KSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NyZWF0ZUV2ZW50RW1pdHRlckFjY2Vzc29ycyhid3Y6IFByb3ZpZGVyV2l0aFZpc2liaWxpdHkpOiBFdmVudEVtaXR0ZXJBY2Nlc3NvcltdIHtcbiAgdmFyIHByb3ZpZGVyID0gYnd2LnByb3ZpZGVyO1xuICBpZiAoIShwcm92aWRlciBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyKSkgcmV0dXJuIFtdO1xuICB2YXIgZGIgPSA8RGlyZWN0aXZlUHJvdmlkZXI+cHJvdmlkZXI7XG4gIHJldHVybiBkYi5ldmVudEVtaXR0ZXJzLm1hcChldmVudENvbmZpZyA9PiB7XG4gICAgdmFyIHBhcnNlZEV2ZW50ID0gRXZlbnRDb25maWcucGFyc2UoZXZlbnRDb25maWcpO1xuICAgIHJldHVybiBuZXcgRXZlbnRFbWl0dGVyQWNjZXNzb3IocGFyc2VkRXZlbnQuZXZlbnROYW1lLCByZWZsZWN0b3IuZ2V0dGVyKHBhcnNlZEV2ZW50LmZpZWxkTmFtZSkpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gX2NyZWF0ZVByb3RvUXVlcnlSZWZzKHByb3ZpZGVyczogUHJvdmlkZXJXaXRoVmlzaWJpbGl0eVtdKTogUHJvdG9RdWVyeVJlZltdIHtcbiAgdmFyIHJlcyA9IFtdO1xuICBMaXN0V3JhcHBlci5mb3JFYWNoV2l0aEluZGV4KHByb3ZpZGVycywgKGIsIGkpID0+IHtcbiAgICBpZiAoYi5wcm92aWRlciBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyKSB7XG4gICAgICB2YXIgZGlyZWN0aXZlUHJvdmlkZXIgPSA8RGlyZWN0aXZlUHJvdmlkZXI+Yi5wcm92aWRlcjtcbiAgICAgIC8vIGZpZWxkIHF1ZXJpZXNcbiAgICAgIHZhciBxdWVyaWVzOiBRdWVyeU1ldGFkYXRhV2l0aFNldHRlcltdID0gZGlyZWN0aXZlUHJvdmlkZXIucXVlcmllcztcbiAgICAgIHF1ZXJpZXMuZm9yRWFjaChxID0+IHJlcy5wdXNoKG5ldyBQcm90b1F1ZXJ5UmVmKGksIHEuc2V0dGVyLCBxLm1ldGFkYXRhKSkpO1xuXG4gICAgICAvLyBxdWVyaWVzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGFmdGVyIGNvbnN0cnVjdG9yIHF1ZXJpZXMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWRcbiAgICAgIHZhciBkZXBzOiBEaXJlY3RpdmVEZXBlbmRlbmN5W10gPVxuICAgICAgICAgIDxEaXJlY3RpdmVEZXBlbmRlbmN5W10+ZGlyZWN0aXZlUHJvdmlkZXIucmVzb2x2ZWRGYWN0b3J5LmRlcGVuZGVuY2llcztcbiAgICAgIGRlcHMuZm9yRWFjaChkID0+IHtcbiAgICAgICAgaWYgKGlzUHJlc2VudChkLnF1ZXJ5RGVjb3JhdG9yKSkgcmVzLnB1c2gobmV3IFByb3RvUXVlcnlSZWYoaSwgbnVsbCwgZC5xdWVyeURlY29yYXRvcikpO1xuICAgICAgfSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNsYXNzIFByb3RvRWxlbWVudEluamVjdG9yIHtcbiAgdmlldzogQXBwVmlldztcbiAgYXR0cmlidXRlczogTWFwPHN0cmluZywgc3RyaW5nPjtcbiAgZXZlbnRFbWl0dGVyQWNjZXNzb3JzOiBFdmVudEVtaXR0ZXJBY2Nlc3NvcltdW107XG4gIHByb3RvUXVlcnlSZWZzOiBQcm90b1F1ZXJ5UmVmW107XG4gIHByb3RvSW5qZWN0b3I6IFByb3RvSW5qZWN0b3I7XG5cbiAgc3RhdGljIGNyZWF0ZShwYXJlbnQ6IFByb3RvRWxlbWVudEluamVjdG9yLCBpbmRleDogbnVtYmVyLCBwcm92aWRlcnM6IERpcmVjdGl2ZVByb3ZpZGVyW10sXG4gICAgICAgICAgICAgICAgZmlyc3RQcm92aWRlcklzQ29tcG9uZW50OiBib29sZWFuLCBkaXN0YW5jZVRvUGFyZW50OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgZGlyZWN0aXZlVmFyaWFibGVCaW5kaW5nczogTWFwPHN0cmluZywgbnVtYmVyPik6IFByb3RvRWxlbWVudEluamVjdG9yIHtcbiAgICB2YXIgYmQgPSBbXTtcblxuICAgIFByb3RvRWxlbWVudEluamVjdG9yLl9jcmVhdGVEaXJlY3RpdmVQcm92aWRlcldpdGhWaXNpYmlsaXR5KHByb3ZpZGVycywgYmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RQcm92aWRlcklzQ29tcG9uZW50KTtcbiAgICBpZiAoZmlyc3RQcm92aWRlcklzQ29tcG9uZW50KSB7XG4gICAgICBQcm90b0VsZW1lbnRJbmplY3Rvci5fY3JlYXRlVmlld1Byb3ZpZGVyc1dpdGhWaXNpYmlsaXR5KHByb3ZpZGVycywgYmQpO1xuICAgIH1cblxuICAgIFByb3RvRWxlbWVudEluamVjdG9yLl9jcmVhdGVQcm92aWRlcnNXaXRoVmlzaWJpbGl0eShwcm92aWRlcnMsIGJkKTtcbiAgICByZXR1cm4gbmV3IFByb3RvRWxlbWVudEluamVjdG9yKHBhcmVudCwgaW5kZXgsIGJkLCBkaXN0YW5jZVRvUGFyZW50LCBmaXJzdFByb3ZpZGVySXNDb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmVWYXJpYWJsZUJpbmRpbmdzKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9jcmVhdGVEaXJlY3RpdmVQcm92aWRlcldpdGhWaXNpYmlsaXR5KGRpclByb3ZpZGVyczogRGlyZWN0aXZlUHJvdmlkZXJbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmQ6IFByb3ZpZGVyV2l0aFZpc2liaWxpdHlbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RQcm92aWRlcklzQ29tcG9uZW50OiBib29sZWFuKSB7XG4gICAgZGlyUHJvdmlkZXJzLmZvckVhY2goZGlyUHJvdmlkZXIgPT4ge1xuICAgICAgYmQucHVzaChQcm90b0VsZW1lbnRJbmplY3Rvci5fY3JlYXRlUHJvdmlkZXJXaXRoVmlzaWJpbGl0eShcbiAgICAgICAgICBmaXJzdFByb3ZpZGVySXNDb21wb25lbnQsIGRpclByb3ZpZGVyLCBkaXJQcm92aWRlcnMsIGRpclByb3ZpZGVyKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfY3JlYXRlUHJvdmlkZXJzV2l0aFZpc2liaWxpdHkoZGlyUHJvdmlkZXJzOiBEaXJlY3RpdmVQcm92aWRlcltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmQ6IFByb3ZpZGVyV2l0aFZpc2liaWxpdHlbXSkge1xuICAgIHZhciBwcm92aWRlcnNGcm9tQWxsRGlyZWN0aXZlcyA9IFtdO1xuICAgIGRpclByb3ZpZGVycy5mb3JFYWNoKGRpclByb3ZpZGVyID0+IHtcbiAgICAgIHByb3ZpZGVyc0Zyb21BbGxEaXJlY3RpdmVzID1cbiAgICAgICAgICBMaXN0V3JhcHBlci5jb25jYXQocHJvdmlkZXJzRnJvbUFsbERpcmVjdGl2ZXMsIGRpclByb3ZpZGVyLnByb3ZpZGVycyk7XG4gICAgfSk7XG5cbiAgICB2YXIgcmVzb2x2ZWQgPSBJbmplY3Rvci5yZXNvbHZlKHByb3ZpZGVyc0Zyb21BbGxEaXJlY3RpdmVzKTtcbiAgICByZXNvbHZlZC5mb3JFYWNoKGIgPT4gYmQucHVzaChuZXcgUHJvdmlkZXJXaXRoVmlzaWJpbGl0eShiLCBWaXNpYmlsaXR5LlB1YmxpYykpKTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIF9jcmVhdGVQcm92aWRlcldpdGhWaXNpYmlsaXR5KGZpcnN0UHJvdmlkZXJJc0NvbXBvbmVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlyUHJvdmlkZXI6IERpcmVjdGl2ZVByb3ZpZGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJQcm92aWRlcnM6IERpcmVjdGl2ZVByb3ZpZGVyW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyOiBSZXNvbHZlZFByb3ZpZGVyKSB7XG4gICAgdmFyIGlzQ29tcG9uZW50ID0gZmlyc3RQcm92aWRlcklzQ29tcG9uZW50ICYmIGRpclByb3ZpZGVyc1swXSA9PT0gZGlyUHJvdmlkZXI7XG4gICAgcmV0dXJuIG5ldyBQcm92aWRlcldpdGhWaXNpYmlsaXR5KFxuICAgICAgICBwcm92aWRlciwgaXNDb21wb25lbnQgPyBWaXNpYmlsaXR5LlB1YmxpY0FuZFByaXZhdGUgOiBWaXNpYmlsaXR5LlB1YmxpYyk7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBfY3JlYXRlVmlld1Byb3ZpZGVyc1dpdGhWaXNpYmlsaXR5KGRpclByb3ZpZGVyczogRGlyZWN0aXZlUHJvdmlkZXJbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZDogUHJvdmlkZXJXaXRoVmlzaWJpbGl0eVtdKSB7XG4gICAgdmFyIHJlc29sdmVkVmlld1Byb3ZpZGVycyA9IEluamVjdG9yLnJlc29sdmUoZGlyUHJvdmlkZXJzWzBdLnZpZXdQcm92aWRlcnMpO1xuICAgIHJlc29sdmVkVmlld1Byb3ZpZGVycy5mb3JFYWNoKGIgPT4gYmQucHVzaChuZXcgUHJvdmlkZXJXaXRoVmlzaWJpbGl0eShiLCBWaXNpYmlsaXR5LlByaXZhdGUpKSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfZmlyc3RQcm92aWRlcklzQ29tcG9uZW50OiBib29sZWFuO1xuXG5cbiAgY29uc3RydWN0b3IocHVibGljIHBhcmVudDogUHJvdG9FbGVtZW50SW5qZWN0b3IsIHB1YmxpYyBpbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBid3Y6IFByb3ZpZGVyV2l0aFZpc2liaWxpdHlbXSwgcHVibGljIGRpc3RhbmNlVG9QYXJlbnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgX2ZpcnN0UHJvdmlkZXJJc0NvbXBvbmVudDogYm9vbGVhbixcbiAgICAgICAgICAgICAgcHVibGljIGRpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3M6IE1hcDxzdHJpbmcsIG51bWJlcj4pIHtcbiAgICB0aGlzLl9maXJzdFByb3ZpZGVySXNDb21wb25lbnQgPSBfZmlyc3RQcm92aWRlcklzQ29tcG9uZW50O1xuICAgIHZhciBsZW5ndGggPSBid3YubGVuZ3RoO1xuICAgIHRoaXMucHJvdG9JbmplY3RvciA9IG5ldyBQcm90b0luamVjdG9yKGJ3dik7XG4gICAgdGhpcy5ldmVudEVtaXR0ZXJBY2Nlc3NvcnMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUobGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgICB0aGlzLmV2ZW50RW1pdHRlckFjY2Vzc29yc1tpXSA9IF9jcmVhdGVFdmVudEVtaXR0ZXJBY2Nlc3NvcnMoYnd2W2ldKTtcbiAgICB9XG4gICAgdGhpcy5wcm90b1F1ZXJ5UmVmcyA9IF9jcmVhdGVQcm90b1F1ZXJ5UmVmcyhid3YpO1xuICB9XG5cbiAgaW5zdGFudGlhdGUocGFyZW50OiBFbGVtZW50SW5qZWN0b3IpOiBFbGVtZW50SW5qZWN0b3Ige1xuICAgIHJldHVybiBuZXcgRWxlbWVudEluamVjdG9yKHRoaXMsIHBhcmVudCk7XG4gIH1cblxuICBkaXJlY3RQYXJlbnQoKTogUHJvdG9FbGVtZW50SW5qZWN0b3IgeyByZXR1cm4gdGhpcy5kaXN0YW5jZVRvUGFyZW50IDwgMiA/IHRoaXMucGFyZW50IDogbnVsbDsgfVxuXG4gIGdldCBoYXNCaW5kaW5ncygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuZXZlbnRFbWl0dGVyQWNjZXNzb3JzLmxlbmd0aCA+IDA7IH1cblxuICBnZXRQcm92aWRlckF0SW5kZXgoaW5kZXg6IG51bWJlcik6IGFueSB7IHJldHVybiB0aGlzLnByb3RvSW5qZWN0b3IuZ2V0UHJvdmlkZXJBdEluZGV4KGluZGV4KTsgfVxufVxuXG5jbGFzcyBfQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBhbnksIHB1YmxpYyBjb21wb25lbnRFbGVtZW50OiBhbnksIHB1YmxpYyBpbmplY3RvcjogYW55KSB7fVxufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudEluamVjdG9yIGV4dGVuZHMgVHJlZU5vZGU8RWxlbWVudEluamVjdG9yPiBpbXBsZW1lbnRzIERlcGVuZGVuY3lQcm92aWRlcixcbiAgICBBZnRlclZpZXdDaGVja2VkIHtcbiAgcHJpdmF0ZSBfaG9zdDogRWxlbWVudEluamVjdG9yO1xuICBwcml2YXRlIF9wcmVCdWlsdE9iamVjdHM6IFByZUJ1aWx0T2JqZWN0cyA9IG51bGw7XG4gIHByaXZhdGUgX3F1ZXJ5U3RyYXRlZ3k6IF9RdWVyeVN0cmF0ZWd5O1xuXG4gIGh5ZHJhdGVkOiBib29sZWFuO1xuXG4gIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcjtcbiAgcHJpdmF0ZSBfc3RyYXRlZ3k6IF9FbGVtZW50SW5qZWN0b3JTdHJhdGVneTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBwdWJsaWMgX3Byb3RvOiBQcm90b0VsZW1lbnRJbmplY3RvcjtcblxuICBjb25zdHJ1Y3RvcihfcHJvdG86IFByb3RvRWxlbWVudEluamVjdG9yLCBwYXJlbnQ6IEVsZW1lbnRJbmplY3Rvcikge1xuICAgIHN1cGVyKHBhcmVudCk7XG4gICAgdGhpcy5fcHJvdG8gPSBfcHJvdG87XG4gICAgdGhpcy5faW5qZWN0b3IgPVxuICAgICAgICBuZXcgSW5qZWN0b3IodGhpcy5fcHJvdG8ucHJvdG9JbmplY3RvciwgbnVsbCwgdGhpcywgKCkgPT4gdGhpcy5fZGVidWdDb250ZXh0KCkpO1xuXG4gICAgLy8gd2UgY291cGxlIG91cnNlbHZlcyB0byB0aGUgaW5qZWN0b3Igc3RyYXRlZ3kgdG8gYXZvaWQgcG9seW1vcHJoaWMgY2FsbHNcbiAgICB2YXIgaW5qZWN0b3JTdHJhdGVneSA9IDxhbnk+dGhpcy5faW5qZWN0b3IuaW50ZXJuYWxTdHJhdGVneTtcbiAgICB0aGlzLl9zdHJhdGVneSA9IGluamVjdG9yU3RyYXRlZ3kgaW5zdGFuY2VvZiBJbmplY3RvcklubGluZVN0cmF0ZWd5ID9cbiAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRWxlbWVudEluamVjdG9ySW5saW5lU3RyYXRlZ3koaW5qZWN0b3JTdHJhdGVneSwgdGhpcykgOlxuICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbGVtZW50SW5qZWN0b3JEeW5hbWljU3RyYXRlZ3koaW5qZWN0b3JTdHJhdGVneSwgdGhpcyk7XG5cbiAgICB0aGlzLmh5ZHJhdGVkID0gZmFsc2U7XG5cbiAgICB0aGlzLl9xdWVyeVN0cmF0ZWd5ID0gdGhpcy5fYnVpbGRRdWVyeVN0cmF0ZWd5KCk7XG4gIH1cblxuICBkZWh5ZHJhdGUoKTogdm9pZCB7XG4gICAgdGhpcy5oeWRyYXRlZCA9IGZhbHNlO1xuICAgIHRoaXMuX2hvc3QgPSBudWxsO1xuICAgIHRoaXMuX3ByZUJ1aWx0T2JqZWN0cyA9IG51bGw7XG4gICAgdGhpcy5fc3RyYXRlZ3kuY2FsbE9uRGVzdHJveSgpO1xuICAgIHRoaXMuX3N0cmF0ZWd5LmRlaHlkcmF0ZSgpO1xuICAgIHRoaXMuX3F1ZXJ5U3RyYXRlZ3kuZGVoeWRyYXRlKCk7XG4gIH1cblxuICBoeWRyYXRlKGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3RvcjogSW5qZWN0b3IsIGhvc3Q6IEVsZW1lbnRJbmplY3RvcixcbiAgICAgICAgICBwcmVCdWlsdE9iamVjdHM6IFByZUJ1aWx0T2JqZWN0cyk6IHZvaWQge1xuICAgIHRoaXMuX2hvc3QgPSBob3N0O1xuICAgIHRoaXMuX3ByZUJ1aWx0T2JqZWN0cyA9IHByZUJ1aWx0T2JqZWN0cztcblxuICAgIHRoaXMuX3JlYXR0YWNoSW5qZWN0b3JzKGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3Rvcik7XG4gICAgdGhpcy5fcXVlcnlTdHJhdGVneS5oeWRyYXRlKCk7XG4gICAgdGhpcy5fc3RyYXRlZ3kuaHlkcmF0ZSgpO1xuXG4gICAgdGhpcy5oeWRyYXRlZCA9IHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9kZWJ1Z0NvbnRleHQoKTogYW55IHtcbiAgICB2YXIgcCA9IHRoaXMuX3ByZUJ1aWx0T2JqZWN0cztcbiAgICB2YXIgaW5kZXggPSBwLmVsZW1lbnRSZWYuYm91bmRFbGVtZW50SW5kZXggLSBwLnZpZXcuZWxlbWVudE9mZnNldDtcbiAgICB2YXIgYyA9IHRoaXMuX3ByZUJ1aWx0T2JqZWN0cy52aWV3LmdldERlYnVnQ29udGV4dChpbmRleCwgbnVsbCk7XG4gICAgcmV0dXJuIGlzUHJlc2VudChjKSA/IG5ldyBfQ29udGV4dChjLmVsZW1lbnQsIGMuY29tcG9uZW50RWxlbWVudCwgYy5pbmplY3RvcikgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVhdHRhY2hJbmplY3RvcnMoaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yOiBJbmplY3Rvcik6IHZvaWQge1xuICAgIC8vIER5bmFtaWNhbGx5LWxvYWRlZCBjb21wb25lbnQgaW4gdGhlIHRlbXBsYXRlLiBOb3QgYSByb290IEVsZW1lbnRJbmplY3Rvci5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhcmVudCkpIHtcbiAgICAgIGlmIChpc1ByZXNlbnQoaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yKSkge1xuICAgICAgICAvLyBUaGUgaW1wZXJhdGl2ZSBpbmplY3RvciBpcyBzaW1pbGFyIHRvIGhhdmluZyBhbiBlbGVtZW50IGJldHdlZW5cbiAgICAgICAgLy8gdGhlIGR5bmFtaWMtbG9hZGVkIGNvbXBvbmVudCBhbmQgaXRzIHBhcmVudCA9PiBubyBib3VuZGFyaWVzLlxuICAgICAgICB0aGlzLl9yZWF0dGFjaEluamVjdG9yKHRoaXMuX2luamVjdG9yLCBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IsIGZhbHNlKTtcbiAgICAgICAgdGhpcy5fcmVhdHRhY2hJbmplY3RvcihpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IsIHRoaXMuX3BhcmVudC5faW5qZWN0b3IsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JlYXR0YWNoSW5qZWN0b3IodGhpcy5faW5qZWN0b3IsIHRoaXMuX3BhcmVudC5faW5qZWN0b3IsIGZhbHNlKTtcbiAgICAgIH1cblxuICAgICAgLy8gRHluYW1pY2FsbHktbG9hZGVkIGNvbXBvbmVudCBpbiB0aGUgdGVtcGxhdGUuIEEgcm9vdCBFbGVtZW50SW5qZWN0b3IuXG4gICAgfSBlbHNlIGlmIChpc1ByZXNlbnQodGhpcy5faG9zdCkpIHtcbiAgICAgIC8vIFRoZSBpbXBlcmF0aXZlIGluamVjdG9yIGlzIHNpbWlsYXIgdG8gaGF2aW5nIGFuIGVsZW1lbnQgYmV0d2VlblxuICAgICAgLy8gdGhlIGR5bmFtaWMtbG9hZGVkIGNvbXBvbmVudCBhbmQgaXRzIHBhcmVudCA9PiBubyBib3VuZGFyeSBiZXR3ZWVuXG4gICAgICAvLyB0aGUgY29tcG9uZW50IGFuZCBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IuXG4gICAgICAvLyBCdXQgc2luY2UgaXQgaXMgYSByb290IEVsZW1lbnRJbmplY3Rvciwgd2UgbmVlZCB0byBjcmVhdGUgYSBib3VuZGFyeVxuICAgICAgLy8gYmV0d2VlbiBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IgYW5kIF9ob3N0LlxuICAgICAgaWYgKGlzUHJlc2VudChpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IpKSB7XG4gICAgICAgIHRoaXMuX3JlYXR0YWNoSW5qZWN0b3IodGhpcy5faW5qZWN0b3IsIGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3RvciwgZmFsc2UpO1xuICAgICAgICB0aGlzLl9yZWF0dGFjaEluamVjdG9yKGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3RvciwgdGhpcy5faG9zdC5faW5qZWN0b3IsIHRydWUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5fcmVhdHRhY2hJbmplY3Rvcih0aGlzLl9pbmplY3RvciwgdGhpcy5faG9zdC5faW5qZWN0b3IsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBCb290c3RyYXBcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGlzUHJlc2VudChpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IpKSB7XG4gICAgICAgIHRoaXMuX3JlYXR0YWNoSW5qZWN0b3IodGhpcy5faW5qZWN0b3IsIGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3RvciwgdHJ1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVhdHRhY2hJbmplY3RvcihpbmplY3RvcjogSW5qZWN0b3IsIHBhcmVudEluamVjdG9yOiBJbmplY3RvciwgaXNCb3VuZGFyeTogYm9vbGVhbikge1xuICAgIGluamVjdG9yLmludGVybmFsU3RyYXRlZ3kuYXR0YWNoKHBhcmVudEluamVjdG9yLCBpc0JvdW5kYXJ5KTtcbiAgfVxuXG4gIGhhc1ZhcmlhYmxlQmluZGluZyhuYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICB2YXIgdmIgPSB0aGlzLl9wcm90by5kaXJlY3RpdmVWYXJpYWJsZUJpbmRpbmdzO1xuICAgIHJldHVybiBpc1ByZXNlbnQodmIpICYmIHZiLmhhcyhuYW1lKTtcbiAgfVxuXG4gIGdldFZhcmlhYmxlQmluZGluZyhuYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgIHZhciBpbmRleCA9IHRoaXMuX3Byb3RvLmRpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3MuZ2V0KG5hbWUpO1xuICAgIHJldHVybiBpc1ByZXNlbnQoaW5kZXgpID8gdGhpcy5nZXREaXJlY3RpdmVBdEluZGV4KDxudW1iZXI+aW5kZXgpIDogdGhpcy5nZXRFbGVtZW50UmVmKCk7XG4gIH1cblxuICBnZXQodG9rZW46IGFueSk6IGFueSB7IHJldHVybiB0aGlzLl9pbmplY3Rvci5nZXQodG9rZW4pOyB9XG5cbiAgaGFzRGlyZWN0aXZlKHR5cGU6IFR5cGUpOiBib29sZWFuIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9pbmplY3Rvci5nZXRPcHRpb25hbCh0eXBlKSk7IH1cblxuICBnZXRFdmVudEVtaXR0ZXJBY2Nlc3NvcnMoKTogRXZlbnRFbWl0dGVyQWNjZXNzb3JbXVtdIHsgcmV0dXJuIHRoaXMuX3Byb3RvLmV2ZW50RW1pdHRlckFjY2Vzc29yczsgfVxuXG4gIGdldERpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3MoKTogTWFwPHN0cmluZywgbnVtYmVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb3RvLmRpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3M7XG4gIH1cblxuICBnZXRDb21wb25lbnQoKTogYW55IHsgcmV0dXJuIHRoaXMuX3N0cmF0ZWd5LmdldENvbXBvbmVudCgpOyB9XG5cbiAgZ2V0SW5qZWN0b3IoKTogSW5qZWN0b3IgeyByZXR1cm4gdGhpcy5faW5qZWN0b3I7IH1cblxuICBnZXRFbGVtZW50UmVmKCk6IEVsZW1lbnRSZWYgeyByZXR1cm4gdGhpcy5fcHJlQnVpbHRPYmplY3RzLmVsZW1lbnRSZWY7IH1cblxuICBnZXRWaWV3Q29udGFpbmVyUmVmKCk6IFZpZXdDb250YWluZXJSZWYge1xuICAgIHJldHVybiBuZXcgVmlld0NvbnRhaW5lclJlZl8odGhpcy5fcHJlQnVpbHRPYmplY3RzLnZpZXdNYW5hZ2VyLCB0aGlzLmdldEVsZW1lbnRSZWYoKSk7XG4gIH1cblxuICBnZXROZXN0ZWRWaWV3KCk6IEFwcFZpZXcgeyByZXR1cm4gdGhpcy5fcHJlQnVpbHRPYmplY3RzLm5lc3RlZFZpZXc7IH1cblxuICBnZXRWaWV3KCk6IEFwcFZpZXcgeyByZXR1cm4gdGhpcy5fcHJlQnVpbHRPYmplY3RzLnZpZXc7IH1cblxuICBkaXJlY3RQYXJlbnQoKTogRWxlbWVudEluamVjdG9yIHsgcmV0dXJuIHRoaXMuX3Byb3RvLmRpc3RhbmNlVG9QYXJlbnQgPCAyID8gdGhpcy5wYXJlbnQgOiBudWxsOyB9XG5cbiAgaXNDb21wb25lbnRLZXkoa2V5OiBLZXkpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3N0cmF0ZWd5LmlzQ29tcG9uZW50S2V5KGtleSk7IH1cblxuICBnZXREZXBlbmRlbmN5KGluamVjdG9yOiBJbmplY3RvciwgcHJvdmlkZXI6IFJlc29sdmVkUHJvdmlkZXIsIGRlcDogRGVwZW5kZW5jeSk6IGFueSB7XG4gICAgdmFyIGtleTogS2V5ID0gZGVwLmtleTtcblxuICAgIGlmIChwcm92aWRlciBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyKSB7XG4gICAgICB2YXIgZGlyRGVwID0gPERpcmVjdGl2ZURlcGVuZGVuY3k+ZGVwO1xuICAgICAgdmFyIGRpclByb3ZpZGVyID0gcHJvdmlkZXI7XG4gICAgICB2YXIgc3RhdGljS2V5cyA9IFN0YXRpY0tleXMuaW5zdGFuY2UoKTtcblxuXG4gICAgICBpZiAoa2V5LmlkID09PSBzdGF0aWNLZXlzLnZpZXdNYW5hZ2VySWQpIHJldHVybiB0aGlzLl9wcmVCdWlsdE9iamVjdHMudmlld01hbmFnZXI7XG5cbiAgICAgIGlmIChpc1ByZXNlbnQoZGlyRGVwLmF0dHJpYnV0ZU5hbWUpKSByZXR1cm4gdGhpcy5fYnVpbGRBdHRyaWJ1dGUoZGlyRGVwKTtcblxuICAgICAgaWYgKGlzUHJlc2VudChkaXJEZXAucXVlcnlEZWNvcmF0b3IpKVxuICAgICAgICByZXR1cm4gdGhpcy5fcXVlcnlTdHJhdGVneS5maW5kUXVlcnkoZGlyRGVwLnF1ZXJ5RGVjb3JhdG9yKS5saXN0O1xuXG4gICAgICBpZiAoZGlyRGVwLmtleS5pZCA9PT0gU3RhdGljS2V5cy5pbnN0YW5jZSgpLmNoYW5nZURldGVjdG9yUmVmSWQpIHtcbiAgICAgICAgLy8gV2UgcHJvdmlkZSB0aGUgY29tcG9uZW50J3MgdmlldyBjaGFuZ2UgZGV0ZWN0b3IgdG8gY29tcG9uZW50cyBhbmRcbiAgICAgICAgLy8gdGhlIHN1cnJvdW5kaW5nIGNvbXBvbmVudCdzIGNoYW5nZSBkZXRlY3RvciB0byBkaXJlY3RpdmVzLlxuICAgICAgICBpZiAoZGlyUHJvdmlkZXIubWV0YWRhdGEgaW5zdGFuY2VvZiBDb21wb25lbnRNZXRhZGF0YSkge1xuICAgICAgICAgIHZhciBjb21wb25lbnRWaWV3ID0gdGhpcy5fcHJlQnVpbHRPYmplY3RzLnZpZXcuZ2V0TmVzdGVkVmlldyhcbiAgICAgICAgICAgICAgdGhpcy5fcHJlQnVpbHRPYmplY3RzLmVsZW1lbnRSZWYuYm91bmRFbGVtZW50SW5kZXgpO1xuICAgICAgICAgIHJldHVybiBjb21wb25lbnRWaWV3LmNoYW5nZURldGVjdG9yLnJlZjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5fcHJlQnVpbHRPYmplY3RzLnZpZXcuY2hhbmdlRGV0ZWN0b3IucmVmO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkaXJEZXAua2V5LmlkID09PSBTdGF0aWNLZXlzLmluc3RhbmNlKCkuZWxlbWVudFJlZklkKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEVsZW1lbnRSZWYoKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGRpckRlcC5rZXkuaWQgPT09IFN0YXRpY0tleXMuaW5zdGFuY2UoKS52aWV3Q29udGFpbmVySWQpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Vmlld0NvbnRhaW5lclJlZigpO1xuICAgICAgfVxuXG4gICAgICBpZiAoZGlyRGVwLmtleS5pZCA9PT0gU3RhdGljS2V5cy5pbnN0YW5jZSgpLnRlbXBsYXRlUmVmSWQpIHtcbiAgICAgICAgaWYgKGlzQmxhbmsodGhpcy5fcHJlQnVpbHRPYmplY3RzLnRlbXBsYXRlUmVmKSkge1xuICAgICAgICAgIGlmIChkaXJEZXAub3B0aW9uYWwpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRocm93IG5ldyBOb1Byb3ZpZGVyRXJyb3IobnVsbCwgZGlyRGVwLmtleSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZUJ1aWx0T2JqZWN0cy50ZW1wbGF0ZVJlZjtcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAocHJvdmlkZXIgaW5zdGFuY2VvZiBQaXBlUHJvdmlkZXIpIHtcbiAgICAgIGlmIChkZXAua2V5LmlkID09PSBTdGF0aWNLZXlzLmluc3RhbmNlKCkuY2hhbmdlRGV0ZWN0b3JSZWZJZCkge1xuICAgICAgICB2YXIgY29tcG9uZW50VmlldyA9IHRoaXMuX3ByZUJ1aWx0T2JqZWN0cy52aWV3LmdldE5lc3RlZFZpZXcoXG4gICAgICAgICAgICB0aGlzLl9wcmVCdWlsdE9iamVjdHMuZWxlbWVudFJlZi5ib3VuZEVsZW1lbnRJbmRleCk7XG4gICAgICAgIHJldHVybiBjb21wb25lbnRWaWV3LmNoYW5nZURldGVjdG9yLnJlZjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gVU5ERUZJTkVEO1xuICB9XG5cbiAgcHJpdmF0ZSBfYnVpbGRBdHRyaWJ1dGUoZGVwOiBEaXJlY3RpdmVEZXBlbmRlbmN5KTogc3RyaW5nIHtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHRoaXMuX3Byb3RvLmF0dHJpYnV0ZXM7XG4gICAgaWYgKGlzUHJlc2VudChhdHRyaWJ1dGVzKSAmJiBhdHRyaWJ1dGVzLmhhcyhkZXAuYXR0cmlidXRlTmFtZSkpIHtcbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldChkZXAuYXR0cmlidXRlTmFtZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGFkZERpcmVjdGl2ZXNNYXRjaGluZ1F1ZXJ5KHF1ZXJ5OiBRdWVyeU1ldGFkYXRhLCBsaXN0OiBhbnlbXSk6IHZvaWQge1xuICAgIHZhciB0ZW1wbGF0ZVJlZiA9IGlzQmxhbmsodGhpcy5fcHJlQnVpbHRPYmplY3RzKSA/IG51bGwgOiB0aGlzLl9wcmVCdWlsdE9iamVjdHMudGVtcGxhdGVSZWY7XG4gICAgaWYgKHF1ZXJ5LnNlbGVjdG9yID09PSBUZW1wbGF0ZVJlZiAmJiBpc1ByZXNlbnQodGVtcGxhdGVSZWYpKSB7XG4gICAgICBsaXN0LnB1c2godGVtcGxhdGVSZWYpO1xuICAgIH1cbiAgICB0aGlzLl9zdHJhdGVneS5hZGREaXJlY3RpdmVzTWF0Y2hpbmdRdWVyeShxdWVyeSwgbGlzdCk7XG4gIH1cblxuICBwcml2YXRlIF9idWlsZFF1ZXJ5U3RyYXRlZ3koKTogX1F1ZXJ5U3RyYXRlZ3kge1xuICAgIGlmICh0aGlzLl9wcm90by5wcm90b1F1ZXJ5UmVmcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBfZW1wdHlRdWVyeVN0cmF0ZWd5O1xuICAgIH0gZWxzZSBpZiAodGhpcy5fcHJvdG8ucHJvdG9RdWVyeVJlZnMubGVuZ3RoIDw9XG4gICAgICAgICAgICAgICBJbmxpbmVRdWVyeVN0cmF0ZWd5Lk5VTUJFUl9PRl9TVVBQT1JURURfUVVFUklFUykge1xuICAgICAgcmV0dXJuIG5ldyBJbmxpbmVRdWVyeVN0cmF0ZWd5KHRoaXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IER5bmFtaWNRdWVyeVN0cmF0ZWd5KHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIGxpbmsocGFyZW50OiBFbGVtZW50SW5qZWN0b3IpOiB2b2lkIHsgcGFyZW50LmFkZENoaWxkKHRoaXMpOyB9XG5cbiAgdW5saW5rKCk6IHZvaWQgeyB0aGlzLnJlbW92ZSgpOyB9XG5cbiAgZ2V0RGlyZWN0aXZlQXRJbmRleChpbmRleDogbnVtYmVyKTogYW55IHsgcmV0dXJuIHRoaXMuX2luamVjdG9yLmdldEF0KGluZGV4KTsgfVxuXG4gIGhhc0luc3RhbmNlcygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Byb3RvLmhhc0JpbmRpbmdzICYmIHRoaXMuaHlkcmF0ZWQ7IH1cblxuICBnZXRIb3N0KCk6IEVsZW1lbnRJbmplY3RvciB7IHJldHVybiB0aGlzLl9ob3N0OyB9XG5cbiAgZ2V0Qm91bmRFbGVtZW50SW5kZXgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX3Byb3RvLmluZGV4OyB9XG5cbiAgZ2V0Um9vdFZpZXdJbmplY3RvcnMoKTogRWxlbWVudEluamVjdG9yW10ge1xuICAgIGlmICghdGhpcy5oeWRyYXRlZCkgcmV0dXJuIFtdO1xuICAgIHZhciB2aWV3ID0gdGhpcy5fcHJlQnVpbHRPYmplY3RzLnZpZXc7XG4gICAgdmFyIG5lc3RlZFZpZXcgPSB2aWV3LmdldE5lc3RlZFZpZXcodmlldy5lbGVtZW50T2Zmc2V0ICsgdGhpcy5nZXRCb3VuZEVsZW1lbnRJbmRleCgpKTtcbiAgICByZXR1cm4gaXNQcmVzZW50KG5lc3RlZFZpZXcpID8gbmVzdGVkVmlldy5yb290RWxlbWVudEluamVjdG9ycyA6IFtdO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQgeyB0aGlzLl9xdWVyeVN0cmF0ZWd5LnVwZGF0ZVZpZXdRdWVyaWVzKCk7IH1cblxuICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTogdm9pZCB7IHRoaXMuX3F1ZXJ5U3RyYXRlZ3kudXBkYXRlQ29udGVudFF1ZXJpZXMoKTsgfVxuXG4gIHRyYXZlcnNlQW5kU2V0UXVlcmllc0FzRGlydHkoKTogdm9pZCB7XG4gICAgdmFyIGluajogRWxlbWVudEluamVjdG9yID0gdGhpcztcbiAgICB3aGlsZSAoaXNQcmVzZW50KGluaikpIHtcbiAgICAgIGluai5fc2V0UXVlcmllc0FzRGlydHkoKTtcbiAgICAgIGluaiA9IGluai5wYXJlbnQ7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfc2V0UXVlcmllc0FzRGlydHkoKTogdm9pZCB7XG4gICAgdGhpcy5fcXVlcnlTdHJhdGVneS5zZXRDb250ZW50UXVlcmllc0FzRGlydHkoKTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX2hvc3QpKSB0aGlzLl9ob3N0Ll9xdWVyeVN0cmF0ZWd5LnNldFZpZXdRdWVyaWVzQXNEaXJ0eSgpO1xuICB9XG59XG5cbmludGVyZmFjZSBfUXVlcnlTdHJhdGVneSB7XG4gIHNldENvbnRlbnRRdWVyaWVzQXNEaXJ0eSgpOiB2b2lkO1xuICBzZXRWaWV3UXVlcmllc0FzRGlydHkoKTogdm9pZDtcbiAgaHlkcmF0ZSgpOiB2b2lkO1xuICBkZWh5ZHJhdGUoKTogdm9pZDtcbiAgdXBkYXRlQ29udGVudFF1ZXJpZXMoKTogdm9pZDtcbiAgdXBkYXRlVmlld1F1ZXJpZXMoKTogdm9pZDtcbiAgZmluZFF1ZXJ5KHF1ZXJ5OiBRdWVyeU1ldGFkYXRhKTogUXVlcnlSZWY7XG59XG5cbmNsYXNzIF9FbXB0eVF1ZXJ5U3RyYXRlZ3kgaW1wbGVtZW50cyBfUXVlcnlTdHJhdGVneSB7XG4gIHNldENvbnRlbnRRdWVyaWVzQXNEaXJ0eSgpOiB2b2lkIHt9XG4gIHNldFZpZXdRdWVyaWVzQXNEaXJ0eSgpOiB2b2lkIHt9XG4gIGh5ZHJhdGUoKTogdm9pZCB7fVxuICBkZWh5ZHJhdGUoKTogdm9pZCB7fVxuICB1cGRhdGVDb250ZW50UXVlcmllcygpOiB2b2lkIHt9XG4gIHVwZGF0ZVZpZXdRdWVyaWVzKCk6IHZvaWQge31cbiAgZmluZFF1ZXJ5KHF1ZXJ5OiBRdWVyeU1ldGFkYXRhKTogUXVlcnlSZWYge1xuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBDYW5ub3QgZmluZCBxdWVyeSBmb3IgZGlyZWN0aXZlICR7cXVlcnl9LmApO1xuICB9XG59XG5cbnZhciBfZW1wdHlRdWVyeVN0cmF0ZWd5ID0gbmV3IF9FbXB0eVF1ZXJ5U3RyYXRlZ3koKTtcblxuY2xhc3MgSW5saW5lUXVlcnlTdHJhdGVneSBpbXBsZW1lbnRzIF9RdWVyeVN0cmF0ZWd5IHtcbiAgc3RhdGljIE5VTUJFUl9PRl9TVVBQT1JURURfUVVFUklFUyA9IDM7XG5cbiAgcXVlcnkwOiBRdWVyeVJlZjtcbiAgcXVlcnkxOiBRdWVyeVJlZjtcbiAgcXVlcnkyOiBRdWVyeVJlZjtcblxuICBjb25zdHJ1Y3RvcihlaTogRWxlbWVudEluamVjdG9yKSB7XG4gICAgdmFyIHByb3RvUmVmcyA9IGVpLl9wcm90by5wcm90b1F1ZXJ5UmVmcztcbiAgICBpZiAocHJvdG9SZWZzLmxlbmd0aCA+IDApIHRoaXMucXVlcnkwID0gbmV3IFF1ZXJ5UmVmKHByb3RvUmVmc1swXSwgZWkpO1xuICAgIGlmIChwcm90b1JlZnMubGVuZ3RoID4gMSkgdGhpcy5xdWVyeTEgPSBuZXcgUXVlcnlSZWYocHJvdG9SZWZzWzFdLCBlaSk7XG4gICAgaWYgKHByb3RvUmVmcy5sZW5ndGggPiAyKSB0aGlzLnF1ZXJ5MiA9IG5ldyBRdWVyeVJlZihwcm90b1JlZnNbMl0sIGVpKTtcbiAgfVxuXG4gIHNldENvbnRlbnRRdWVyaWVzQXNEaXJ0eSgpOiB2b2lkIHtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkwKSAmJiAhdGhpcy5xdWVyeTAuaXNWaWV3UXVlcnkpIHRoaXMucXVlcnkwLmRpcnR5ID0gdHJ1ZTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkxKSAmJiAhdGhpcy5xdWVyeTEuaXNWaWV3UXVlcnkpIHRoaXMucXVlcnkxLmRpcnR5ID0gdHJ1ZTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkyKSAmJiAhdGhpcy5xdWVyeTIuaXNWaWV3UXVlcnkpIHRoaXMucXVlcnkyLmRpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIHNldFZpZXdRdWVyaWVzQXNEaXJ0eSgpOiB2b2lkIHtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkwKSAmJiB0aGlzLnF1ZXJ5MC5pc1ZpZXdRdWVyeSkgdGhpcy5xdWVyeTAuZGlydHkgPSB0cnVlO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTEpICYmIHRoaXMucXVlcnkxLmlzVmlld1F1ZXJ5KSB0aGlzLnF1ZXJ5MS5kaXJ0eSA9IHRydWU7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnF1ZXJ5MikgJiYgdGhpcy5xdWVyeTIuaXNWaWV3UXVlcnkpIHRoaXMucXVlcnkyLmRpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIGh5ZHJhdGUoKTogdm9pZCB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnF1ZXJ5MCkpIHRoaXMucXVlcnkwLmh5ZHJhdGUoKTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkxKSkgdGhpcy5xdWVyeTEuaHlkcmF0ZSgpO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTIpKSB0aGlzLnF1ZXJ5Mi5oeWRyYXRlKCk7XG4gIH1cblxuICBkZWh5ZHJhdGUoKTogdm9pZCB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnF1ZXJ5MCkpIHRoaXMucXVlcnkwLmRlaHlkcmF0ZSgpO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTEpKSB0aGlzLnF1ZXJ5MS5kZWh5ZHJhdGUoKTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkyKSkgdGhpcy5xdWVyeTIuZGVoeWRyYXRlKCk7XG4gIH1cblxuICB1cGRhdGVDb250ZW50UXVlcmllcygpIHtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkwKSAmJiAhdGhpcy5xdWVyeTAuaXNWaWV3UXVlcnkpIHtcbiAgICAgIHRoaXMucXVlcnkwLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkxKSAmJiAhdGhpcy5xdWVyeTEuaXNWaWV3UXVlcnkpIHtcbiAgICAgIHRoaXMucXVlcnkxLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkyKSAmJiAhdGhpcy5xdWVyeTIuaXNWaWV3UXVlcnkpIHtcbiAgICAgIHRoaXMucXVlcnkyLnVwZGF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIHVwZGF0ZVZpZXdRdWVyaWVzKCkge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTApICYmIHRoaXMucXVlcnkwLmlzVmlld1F1ZXJ5KSB7XG4gICAgICB0aGlzLnF1ZXJ5MC51cGRhdGUoKTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnF1ZXJ5MSkgJiYgdGhpcy5xdWVyeTEuaXNWaWV3UXVlcnkpIHtcbiAgICAgIHRoaXMucXVlcnkxLnVwZGF0ZSgpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMucXVlcnkyKSAmJiB0aGlzLnF1ZXJ5Mi5pc1ZpZXdRdWVyeSkge1xuICAgICAgdGhpcy5xdWVyeTIudXBkYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZmluZFF1ZXJ5KHF1ZXJ5OiBRdWVyeU1ldGFkYXRhKTogUXVlcnlSZWYge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTApICYmIHRoaXMucXVlcnkwLnByb3RvUXVlcnlSZWYucXVlcnkgPT09IHF1ZXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVyeTA7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTEpICYmIHRoaXMucXVlcnkxLnByb3RvUXVlcnlSZWYucXVlcnkgPT09IHF1ZXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVyeTE7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5xdWVyeTIpICYmIHRoaXMucXVlcnkyLnByb3RvUXVlcnlSZWYucXVlcnkgPT09IHF1ZXJ5KSB7XG4gICAgICByZXR1cm4gdGhpcy5xdWVyeTI7XG4gICAgfVxuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBDYW5ub3QgZmluZCBxdWVyeSBmb3IgZGlyZWN0aXZlICR7cXVlcnl9LmApO1xuICB9XG59XG5cbmNsYXNzIER5bmFtaWNRdWVyeVN0cmF0ZWd5IGltcGxlbWVudHMgX1F1ZXJ5U3RyYXRlZ3kge1xuICBxdWVyaWVzOiBRdWVyeVJlZltdO1xuXG4gIGNvbnN0cnVjdG9yKGVpOiBFbGVtZW50SW5qZWN0b3IpIHtcbiAgICB0aGlzLnF1ZXJpZXMgPSBlaS5fcHJvdG8ucHJvdG9RdWVyeVJlZnMubWFwKHAgPT4gbmV3IFF1ZXJ5UmVmKHAsIGVpKSk7XG4gIH1cblxuICBzZXRDb250ZW50UXVlcmllc0FzRGlydHkoKTogdm9pZCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgaWYgKCFxLmlzVmlld1F1ZXJ5KSBxLmRpcnR5ID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBzZXRWaWV3UXVlcmllc0FzRGlydHkoKTogdm9pZCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgaWYgKHEuaXNWaWV3UXVlcnkpIHEuZGlydHkgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIGh5ZHJhdGUoKTogdm9pZCB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgcS5oeWRyYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgZGVoeWRyYXRlKCk6IHZvaWQge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5xdWVyaWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgcSA9IHRoaXMucXVlcmllc1tpXTtcbiAgICAgIHEuZGVoeWRyYXRlKCk7XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlQ29udGVudFF1ZXJpZXMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgaWYgKCFxLmlzVmlld1F1ZXJ5KSB7XG4gICAgICAgIHEudXBkYXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdXBkYXRlVmlld1F1ZXJpZXMoKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgaWYgKHEuaXNWaWV3UXVlcnkpIHtcbiAgICAgICAgcS51cGRhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmaW5kUXVlcnkocXVlcnk6IFF1ZXJ5TWV0YWRhdGEpOiBRdWVyeVJlZiB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBxID0gdGhpcy5xdWVyaWVzW2ldO1xuICAgICAgaWYgKHEucHJvdG9RdWVyeVJlZi5xdWVyeSA9PT0gcXVlcnkpIHtcbiAgICAgICAgcmV0dXJuIHE7XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBDYW5ub3QgZmluZCBxdWVyeSBmb3IgZGlyZWN0aXZlICR7cXVlcnl9LmApO1xuICB9XG59XG5cbmludGVyZmFjZSBfRWxlbWVudEluamVjdG9yU3RyYXRlZ3kge1xuICBjYWxsT25EZXN0cm95KCk6IHZvaWQ7XG4gIGdldENvbXBvbmVudCgpOiBhbnk7XG4gIGlzQ29tcG9uZW50S2V5KGtleTogS2V5KTogYm9vbGVhbjtcbiAgYWRkRGlyZWN0aXZlc01hdGNoaW5nUXVlcnkocTogUXVlcnlNZXRhZGF0YSwgcmVzOiBhbnlbXSk6IHZvaWQ7XG4gIGh5ZHJhdGUoKTogdm9pZDtcbiAgZGVoeWRyYXRlKCk6IHZvaWQ7XG59XG5cbi8qKlxuICogU3RyYXRlZ3kgdXNlZCBieSB0aGUgYEVsZW1lbnRJbmplY3RvcmAgd2hlbiB0aGUgbnVtYmVyIG9mIHByb3ZpZGVycyBpcyAxMCBvciBsZXNzLlxuICogSW4gc3VjaCBhIGNhc2UsIGlubGluaW5nIGZpZWxkcyBpcyBiZW5lZmljaWFsIGZvciBwZXJmb3JtYW5jZXMuXG4gKi9cbmNsYXNzIEVsZW1lbnRJbmplY3RvcklubGluZVN0cmF0ZWd5IGltcGxlbWVudHMgX0VsZW1lbnRJbmplY3RvclN0cmF0ZWd5IHtcbiAgY29uc3RydWN0b3IocHVibGljIGluamVjdG9yU3RyYXRlZ3k6IEluamVjdG9ySW5saW5lU3RyYXRlZ3ksIHB1YmxpYyBfZWk6IEVsZW1lbnRJbmplY3Rvcikge31cblxuICBoeWRyYXRlKCk6IHZvaWQge1xuICAgIHZhciBpID0gdGhpcy5pbmplY3RvclN0cmF0ZWd5O1xuICAgIHZhciBwID0gaS5wcm90b1N0cmF0ZWd5O1xuICAgIGkucmVzZXRDb25zdHJ1Y3Rpb25Db3VudGVyKCk7XG5cbiAgICBpZiAocC5wcm92aWRlcjAgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDApICYmIGkub2JqMCA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmowID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIwLCBwLnZpc2liaWxpdHkwKTtcbiAgICBpZiAocC5wcm92aWRlcjEgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDEpICYmIGkub2JqMSA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmoxID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIxLCBwLnZpc2liaWxpdHkxKTtcbiAgICBpZiAocC5wcm92aWRlcjIgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDIpICYmIGkub2JqMiA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmoyID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIyLCBwLnZpc2liaWxpdHkyKTtcbiAgICBpZiAocC5wcm92aWRlcjMgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDMpICYmIGkub2JqMyA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmozID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIzLCBwLnZpc2liaWxpdHkzKTtcbiAgICBpZiAocC5wcm92aWRlcjQgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDQpICYmIGkub2JqNCA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo0ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI0LCBwLnZpc2liaWxpdHk0KTtcbiAgICBpZiAocC5wcm92aWRlcjUgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDUpICYmIGkub2JqNSA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo1ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI1LCBwLnZpc2liaWxpdHk1KTtcbiAgICBpZiAocC5wcm92aWRlcjYgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDYpICYmIGkub2JqNiA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo2ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI2LCBwLnZpc2liaWxpdHk2KTtcbiAgICBpZiAocC5wcm92aWRlcjcgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDcpICYmIGkub2JqNyA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo3ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI3LCBwLnZpc2liaWxpdHk3KTtcbiAgICBpZiAocC5wcm92aWRlcjggaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDgpICYmIGkub2JqOCA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo4ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI4LCBwLnZpc2liaWxpdHk4KTtcbiAgICBpZiAocC5wcm92aWRlcjkgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZDkpICYmIGkub2JqOSA9PT0gVU5ERUZJTkVEKVxuICAgICAgaS5vYmo5ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI5LCBwLnZpc2liaWxpdHk5KTtcbiAgfVxuXG4gIGRlaHlkcmF0ZSgpIHtcbiAgICB2YXIgaSA9IHRoaXMuaW5qZWN0b3JTdHJhdGVneTtcblxuICAgIGkub2JqMCA9IFVOREVGSU5FRDtcbiAgICBpLm9iajEgPSBVTkRFRklORUQ7XG4gICAgaS5vYmoyID0gVU5ERUZJTkVEO1xuICAgIGkub2JqMyA9IFVOREVGSU5FRDtcbiAgICBpLm9iajQgPSBVTkRFRklORUQ7XG4gICAgaS5vYmo1ID0gVU5ERUZJTkVEO1xuICAgIGkub2JqNiA9IFVOREVGSU5FRDtcbiAgICBpLm9iajcgPSBVTkRFRklORUQ7XG4gICAgaS5vYmo4ID0gVU5ERUZJTkVEO1xuICAgIGkub2JqOSA9IFVOREVGSU5FRDtcbiAgfVxuXG4gIGNhbGxPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdmFyIGkgPSB0aGlzLmluamVjdG9yU3RyYXRlZ3k7XG4gICAgdmFyIHAgPSBpLnByb3RvU3RyYXRlZ3k7XG5cbiAgICBpZiAocC5wcm92aWRlcjAgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJlxuICAgICAgICAoPERpcmVjdGl2ZVByb3ZpZGVyPnAucHJvdmlkZXIwKS5jYWxsT25EZXN0cm95KSB7XG4gICAgICBpLm9iajAubmdPbkRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKHAucHJvdmlkZXIxIGluc3RhbmNlb2YgRGlyZWN0aXZlUHJvdmlkZXIgJiZcbiAgICAgICAgKDxEaXJlY3RpdmVQcm92aWRlcj5wLnByb3ZpZGVyMSkuY2FsbE9uRGVzdHJveSkge1xuICAgICAgaS5vYmoxLm5nT25EZXN0cm95KCk7XG4gICAgfVxuICAgIGlmIChwLnByb3ZpZGVyMiBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyICYmXG4gICAgICAgICg8RGlyZWN0aXZlUHJvdmlkZXI+cC5wcm92aWRlcjIpLmNhbGxPbkRlc3Ryb3kpIHtcbiAgICAgIGkub2JqMi5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAocC5wcm92aWRlcjMgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJlxuICAgICAgICAoPERpcmVjdGl2ZVByb3ZpZGVyPnAucHJvdmlkZXIzKS5jYWxsT25EZXN0cm95KSB7XG4gICAgICBpLm9iajMubmdPbkRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKHAucHJvdmlkZXI0IGluc3RhbmNlb2YgRGlyZWN0aXZlUHJvdmlkZXIgJiZcbiAgICAgICAgKDxEaXJlY3RpdmVQcm92aWRlcj5wLnByb3ZpZGVyNCkuY2FsbE9uRGVzdHJveSkge1xuICAgICAgaS5vYmo0Lm5nT25EZXN0cm95KCk7XG4gICAgfVxuICAgIGlmIChwLnByb3ZpZGVyNSBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyICYmXG4gICAgICAgICg8RGlyZWN0aXZlUHJvdmlkZXI+cC5wcm92aWRlcjUpLmNhbGxPbkRlc3Ryb3kpIHtcbiAgICAgIGkub2JqNS5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAocC5wcm92aWRlcjYgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJlxuICAgICAgICAoPERpcmVjdGl2ZVByb3ZpZGVyPnAucHJvdmlkZXI2KS5jYWxsT25EZXN0cm95KSB7XG4gICAgICBpLm9iajYubmdPbkRlc3Ryb3koKTtcbiAgICB9XG4gICAgaWYgKHAucHJvdmlkZXI3IGluc3RhbmNlb2YgRGlyZWN0aXZlUHJvdmlkZXIgJiZcbiAgICAgICAgKDxEaXJlY3RpdmVQcm92aWRlcj5wLnByb3ZpZGVyNykuY2FsbE9uRGVzdHJveSkge1xuICAgICAgaS5vYmo3Lm5nT25EZXN0cm95KCk7XG4gICAgfVxuICAgIGlmIChwLnByb3ZpZGVyOCBpbnN0YW5jZW9mIERpcmVjdGl2ZVByb3ZpZGVyICYmXG4gICAgICAgICg8RGlyZWN0aXZlUHJvdmlkZXI+cC5wcm92aWRlcjgpLmNhbGxPbkRlc3Ryb3kpIHtcbiAgICAgIGkub2JqOC5uZ09uRGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAocC5wcm92aWRlcjkgaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJlxuICAgICAgICAoPERpcmVjdGl2ZVByb3ZpZGVyPnAucHJvdmlkZXI5KS5jYWxsT25EZXN0cm95KSB7XG4gICAgICBpLm9iajkubmdPbkRlc3Ryb3koKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21wb25lbnQoKTogYW55IHsgcmV0dXJuIHRoaXMuaW5qZWN0b3JTdHJhdGVneS5vYmowOyB9XG5cbiAgaXNDb21wb25lbnRLZXkoa2V5OiBLZXkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZWkuX3Byb3RvLl9maXJzdFByb3ZpZGVySXNDb21wb25lbnQgJiYgaXNQcmVzZW50KGtleSkgJiZcbiAgICAgICAgICAga2V5LmlkID09PSB0aGlzLmluamVjdG9yU3RyYXRlZ3kucHJvdG9TdHJhdGVneS5rZXlJZDA7XG4gIH1cblxuICBhZGREaXJlY3RpdmVzTWF0Y2hpbmdRdWVyeShxdWVyeTogUXVlcnlNZXRhZGF0YSwgbGlzdDogYW55W10pOiB2b2lkIHtcbiAgICB2YXIgaSA9IHRoaXMuaW5qZWN0b3JTdHJhdGVneTtcbiAgICB2YXIgcCA9IGkucHJvdG9TdHJhdGVneTtcblxuICAgIGlmIChpc1ByZXNlbnQocC5wcm92aWRlcjApICYmIHAucHJvdmlkZXIwLmtleS50b2tlbiA9PT0gcXVlcnkuc2VsZWN0b3IpIHtcbiAgICAgIGlmIChpLm9iajAgPT09IFVOREVGSU5FRCkgaS5vYmowID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIwLCBwLnZpc2liaWxpdHkwKTtcbiAgICAgIGxpc3QucHVzaChpLm9iajApO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHAucHJvdmlkZXIxKSAmJiBwLnByb3ZpZGVyMS5rZXkudG9rZW4gPT09IHF1ZXJ5LnNlbGVjdG9yKSB7XG4gICAgICBpZiAoaS5vYmoxID09PSBVTkRFRklORUQpIGkub2JqMSA9IGkuaW5zdGFudGlhdGVQcm92aWRlcihwLnByb3ZpZGVyMSwgcC52aXNpYmlsaXR5MSk7XG4gICAgICBsaXN0LnB1c2goaS5vYmoxKTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudChwLnByb3ZpZGVyMikgJiYgcC5wcm92aWRlcjIua2V5LnRva2VuID09PSBxdWVyeS5zZWxlY3Rvcikge1xuICAgICAgaWYgKGkub2JqMiA9PT0gVU5ERUZJTkVEKSBpLm9iajIgPSBpLmluc3RhbnRpYXRlUHJvdmlkZXIocC5wcm92aWRlcjIsIHAudmlzaWJpbGl0eTIpO1xuICAgICAgbGlzdC5wdXNoKGkub2JqMik7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQocC5wcm92aWRlcjMpICYmIHAucHJvdmlkZXIzLmtleS50b2tlbiA9PT0gcXVlcnkuc2VsZWN0b3IpIHtcbiAgICAgIGlmIChpLm9iajMgPT09IFVOREVGSU5FRCkgaS5vYmozID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXIzLCBwLnZpc2liaWxpdHkzKTtcbiAgICAgIGxpc3QucHVzaChpLm9iajMpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHAucHJvdmlkZXI0KSAmJiBwLnByb3ZpZGVyNC5rZXkudG9rZW4gPT09IHF1ZXJ5LnNlbGVjdG9yKSB7XG4gICAgICBpZiAoaS5vYmo0ID09PSBVTkRFRklORUQpIGkub2JqNCA9IGkuaW5zdGFudGlhdGVQcm92aWRlcihwLnByb3ZpZGVyNCwgcC52aXNpYmlsaXR5NCk7XG4gICAgICBsaXN0LnB1c2goaS5vYmo0KTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudChwLnByb3ZpZGVyNSkgJiYgcC5wcm92aWRlcjUua2V5LnRva2VuID09PSBxdWVyeS5zZWxlY3Rvcikge1xuICAgICAgaWYgKGkub2JqNSA9PT0gVU5ERUZJTkVEKSBpLm9iajUgPSBpLmluc3RhbnRpYXRlUHJvdmlkZXIocC5wcm92aWRlcjUsIHAudmlzaWJpbGl0eTUpO1xuICAgICAgbGlzdC5wdXNoKGkub2JqNSk7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQocC5wcm92aWRlcjYpICYmIHAucHJvdmlkZXI2LmtleS50b2tlbiA9PT0gcXVlcnkuc2VsZWN0b3IpIHtcbiAgICAgIGlmIChpLm9iajYgPT09IFVOREVGSU5FRCkgaS5vYmo2ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI2LCBwLnZpc2liaWxpdHk2KTtcbiAgICAgIGxpc3QucHVzaChpLm9iajYpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHAucHJvdmlkZXI3KSAmJiBwLnByb3ZpZGVyNy5rZXkudG9rZW4gPT09IHF1ZXJ5LnNlbGVjdG9yKSB7XG4gICAgICBpZiAoaS5vYmo3ID09PSBVTkRFRklORUQpIGkub2JqNyA9IGkuaW5zdGFudGlhdGVQcm92aWRlcihwLnByb3ZpZGVyNywgcC52aXNpYmlsaXR5Nyk7XG4gICAgICBsaXN0LnB1c2goaS5vYmo3KTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudChwLnByb3ZpZGVyOCkgJiYgcC5wcm92aWRlcjgua2V5LnRva2VuID09PSBxdWVyeS5zZWxlY3Rvcikge1xuICAgICAgaWYgKGkub2JqOCA9PT0gVU5ERUZJTkVEKSBpLm9iajggPSBpLmluc3RhbnRpYXRlUHJvdmlkZXIocC5wcm92aWRlcjgsIHAudmlzaWJpbGl0eTgpO1xuICAgICAgbGlzdC5wdXNoKGkub2JqOCk7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQocC5wcm92aWRlcjkpICYmIHAucHJvdmlkZXI5LmtleS50b2tlbiA9PT0gcXVlcnkuc2VsZWN0b3IpIHtcbiAgICAgIGlmIChpLm9iajkgPT09IFVOREVGSU5FRCkgaS5vYmo5ID0gaS5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXI5LCBwLnZpc2liaWxpdHk5KTtcbiAgICAgIGxpc3QucHVzaChpLm9iajkpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFN0cmF0ZWd5IHVzZWQgYnkgdGhlIGBFbGVtZW50SW5qZWN0b3JgIHdoZW4gdGhlIG51bWJlciBvZiBiaW5kaW5ncyBpcyAxMSBvciBtb3JlLlxuICogSW4gc3VjaCBhIGNhc2UsIHRoZXJlIGFyZSB0b28gbWFueSBmaWVsZHMgdG8gaW5saW5lIChzZWUgRWxlbWVudEluamVjdG9ySW5saW5lU3RyYXRlZ3kpLlxuICovXG5jbGFzcyBFbGVtZW50SW5qZWN0b3JEeW5hbWljU3RyYXRlZ3kgaW1wbGVtZW50cyBfRWxlbWVudEluamVjdG9yU3RyYXRlZ3kge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaW5qZWN0b3JTdHJhdGVneTogSW5qZWN0b3JEeW5hbWljU3RyYXRlZ3ksIHB1YmxpYyBfZWk6IEVsZW1lbnRJbmplY3Rvcikge31cblxuICBoeWRyYXRlKCk6IHZvaWQge1xuICAgIHZhciBpbmogPSB0aGlzLmluamVjdG9yU3RyYXRlZ3k7XG4gICAgdmFyIHAgPSBpbmoucHJvdG9TdHJhdGVneTtcbiAgICBpbmoucmVzZXRDb25zdHJ1Y3Rpb25Db3VudGVyKCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHAua2V5SWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocC5wcm92aWRlcnNbaV0gaW5zdGFuY2VvZiBEaXJlY3RpdmVQcm92aWRlciAmJiBpc1ByZXNlbnQocC5rZXlJZHNbaV0pICYmXG4gICAgICAgICAgaW5qLm9ianNbaV0gPT09IFVOREVGSU5FRCkge1xuICAgICAgICBpbmoub2Jqc1tpXSA9IGluai5pbnN0YW50aWF0ZVByb3ZpZGVyKHAucHJvdmlkZXJzW2ldLCBwLnZpc2liaWxpdGllc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZGVoeWRyYXRlKCk6IHZvaWQge1xuICAgIHZhciBpbmogPSB0aGlzLmluamVjdG9yU3RyYXRlZ3k7XG4gICAgTGlzdFdyYXBwZXIuZmlsbChpbmoub2JqcywgVU5ERUZJTkVEKTtcbiAgfVxuXG4gIGNhbGxPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdmFyIGlzdCA9IHRoaXMuaW5qZWN0b3JTdHJhdGVneTtcbiAgICB2YXIgcCA9IGlzdC5wcm90b1N0cmF0ZWd5O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwLnByb3ZpZGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHAucHJvdmlkZXJzW2ldIGluc3RhbmNlb2YgRGlyZWN0aXZlUHJvdmlkZXIgJiZcbiAgICAgICAgICAoPERpcmVjdGl2ZVByb3ZpZGVyPnAucHJvdmlkZXJzW2ldKS5jYWxsT25EZXN0cm95KSB7XG4gICAgICAgIGlzdC5vYmpzW2ldLm5nT25EZXN0cm95KCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29tcG9uZW50KCk6IGFueSB7IHJldHVybiB0aGlzLmluamVjdG9yU3RyYXRlZ3kub2Jqc1swXTsgfVxuXG4gIGlzQ29tcG9uZW50S2V5KGtleTogS2V5KTogYm9vbGVhbiB7XG4gICAgdmFyIHAgPSB0aGlzLmluamVjdG9yU3RyYXRlZ3kucHJvdG9TdHJhdGVneTtcbiAgICByZXR1cm4gdGhpcy5fZWkuX3Byb3RvLl9maXJzdFByb3ZpZGVySXNDb21wb25lbnQgJiYgaXNQcmVzZW50KGtleSkgJiYga2V5LmlkID09PSBwLmtleUlkc1swXTtcbiAgfVxuXG4gIGFkZERpcmVjdGl2ZXNNYXRjaGluZ1F1ZXJ5KHF1ZXJ5OiBRdWVyeU1ldGFkYXRhLCBsaXN0OiBhbnlbXSk6IHZvaWQge1xuICAgIHZhciBpc3QgPSB0aGlzLmluamVjdG9yU3RyYXRlZ3k7XG4gICAgdmFyIHAgPSBpc3QucHJvdG9TdHJhdGVneTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcC5wcm92aWRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwLnByb3ZpZGVyc1tpXS5rZXkudG9rZW4gPT09IHF1ZXJ5LnNlbGVjdG9yKSB7XG4gICAgICAgIGlmIChpc3Qub2Jqc1tpXSA9PT0gVU5ERUZJTkVEKSB7XG4gICAgICAgICAgaXN0Lm9ianNbaV0gPSBpc3QuaW5zdGFudGlhdGVQcm92aWRlcihwLnByb3ZpZGVyc1tpXSwgcC52aXNpYmlsaXRpZXNbaV0pO1xuICAgICAgICB9XG4gICAgICAgIGxpc3QucHVzaChpc3Qub2Jqc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm90b1F1ZXJ5UmVmIHtcbiAgY29uc3RydWN0b3IocHVibGljIGRpckluZGV4OiBudW1iZXIsIHB1YmxpYyBzZXR0ZXI6IFNldHRlckZuLCBwdWJsaWMgcXVlcnk6IFF1ZXJ5TWV0YWRhdGEpIHt9XG5cbiAgZ2V0IHVzZXNQcm9wZXJ0eVN5bnRheCgpOiBib29sZWFuIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLnNldHRlcik7IH1cbn1cblxuZXhwb3J0IGNsYXNzIFF1ZXJ5UmVmIHtcbiAgcHVibGljIGxpc3Q6IFF1ZXJ5TGlzdDxhbnk+O1xuICBwdWJsaWMgZGlydHk6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IocHVibGljIHByb3RvUXVlcnlSZWY6IFByb3RvUXVlcnlSZWYsIHByaXZhdGUgb3JpZ2luYXRvcjogRWxlbWVudEluamVjdG9yKSB7fVxuXG4gIGdldCBpc1ZpZXdRdWVyeSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucHJvdG9RdWVyeVJlZi5xdWVyeS5pc1ZpZXdRdWVyeTsgfVxuXG4gIHVwZGF0ZSgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZGlydHkpIHJldHVybjtcbiAgICB0aGlzLl91cGRhdGUoKTtcbiAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG5cbiAgICAvLyBUT0RPIGRlbGV0ZSB0aGUgY2hlY2sgb25jZSBvbmx5IGZpZWxkIHF1ZXJpZXMgYXJlIHN1cHBvcnRlZFxuICAgIGlmICh0aGlzLnByb3RvUXVlcnlSZWYudXNlc1Byb3BlcnR5U3ludGF4KSB7XG4gICAgICB2YXIgZGlyID0gdGhpcy5vcmlnaW5hdG9yLmdldERpcmVjdGl2ZUF0SW5kZXgodGhpcy5wcm90b1F1ZXJ5UmVmLmRpckluZGV4KTtcbiAgICAgIGlmICh0aGlzLnByb3RvUXVlcnlSZWYucXVlcnkuZmlyc3QpIHtcbiAgICAgICAgdGhpcy5wcm90b1F1ZXJ5UmVmLnNldHRlcihkaXIsIHRoaXMubGlzdC5sZW5ndGggPiAwID8gdGhpcy5saXN0LmZpcnN0IDogbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnByb3RvUXVlcnlSZWYuc2V0dGVyKGRpciwgdGhpcy5saXN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmxpc3Qubm90aWZ5T25DaGFuZ2VzKCk7XG4gIH1cblxuICBwcml2YXRlIF91cGRhdGUoKTogdm9pZCB7XG4gICAgdmFyIGFnZ3JlZ2F0b3IgPSBbXTtcbiAgICBpZiAodGhpcy5wcm90b1F1ZXJ5UmVmLnF1ZXJ5LmlzVmlld1F1ZXJ5KSB7XG4gICAgICB2YXIgdmlldyA9IHRoaXMub3JpZ2luYXRvci5nZXRWaWV3KCk7XG4gICAgICAvLyBpbnRlbnRpb25hbGx5IHNraXBwaW5nIG9yaWdpbmF0b3IgZm9yIHZpZXcgcXVlcmllcy5cbiAgICAgIHZhciBuZXN0ZWRWaWV3ID1cbiAgICAgICAgICB2aWV3LmdldE5lc3RlZFZpZXcodmlldy5lbGVtZW50T2Zmc2V0ICsgdGhpcy5vcmlnaW5hdG9yLmdldEJvdW5kRWxlbWVudEluZGV4KCkpO1xuICAgICAgaWYgKGlzUHJlc2VudChuZXN0ZWRWaWV3KSkgdGhpcy5fdmlzaXRWaWV3KG5lc3RlZFZpZXcsIGFnZ3JlZ2F0b3IpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl92aXNpdCh0aGlzLm9yaWdpbmF0b3IsIGFnZ3JlZ2F0b3IpO1xuICAgIH1cbiAgICB0aGlzLmxpc3QucmVzZXQoYWdncmVnYXRvcik7XG4gIH07XG5cbiAgcHJpdmF0ZSBfdmlzaXQoaW5qOiBFbGVtZW50SW5qZWN0b3IsIGFnZ3JlZ2F0b3I6IGFueVtdKTogdm9pZCB7XG4gICAgdmFyIHZpZXcgPSBpbmouZ2V0VmlldygpO1xuICAgIHZhciBzdGFydElkeCA9IHZpZXcuZWxlbWVudE9mZnNldCArIGluai5fcHJvdG8uaW5kZXg7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0SWR4OyBpIDwgdmlldy5lbGVtZW50T2Zmc2V0ICsgdmlldy5vd25CaW5kZXJzQ291bnQ7IGkrKykge1xuICAgICAgdmFyIGN1ckluaiA9IHZpZXcuZWxlbWVudEluamVjdG9yc1tpXTtcbiAgICAgIGlmIChpc0JsYW5rKGN1ckluaikpIGNvbnRpbnVlO1xuICAgICAgLy8gVGhlIGZpcnN0IGluamVjdG9yIGFmdGVyIGluaiwgdGhhdCBpcyBvdXRzaWRlIHRoZSBzdWJ0cmVlIHJvb3RlZCBhdFxuICAgICAgLy8gaW5qIGhhcyB0byBoYXZlIGEgbnVsbCBwYXJlbnQgb3IgYSBwYXJlbnQgdGhhdCBpcyBhbiBhbmNlc3RvciBvZiBpbmouXG4gICAgICBpZiAoaSA+IHN0YXJ0SWR4ICYmIChpc0JsYW5rKGN1ckluaikgfHwgaXNCbGFuayhjdXJJbmoucGFyZW50KSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5lbGVtZW50T2Zmc2V0ICsgY3VySW5qLnBhcmVudC5fcHJvdG8uaW5kZXggPCBzdGFydElkeCkpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICghdGhpcy5wcm90b1F1ZXJ5UmVmLnF1ZXJ5LmRlc2NlbmRhbnRzICYmXG4gICAgICAgICAgIShjdXJJbmoucGFyZW50ID09IHRoaXMub3JpZ2luYXRvciB8fCBjdXJJbmogPT0gdGhpcy5vcmlnaW5hdG9yKSlcbiAgICAgICAgY29udGludWU7XG5cbiAgICAgIC8vIFdlIHZpc2l0IHRoZSB2aWV3IGNvbnRhaW5lcihWQykgdmlld3MgcmlnaHQgYWZ0ZXIgdGhlIGluamVjdG9yIHRoYXQgY29udGFpbnNcbiAgICAgIC8vIHRoZSBWQy4gVGhlb3JldGljYWxseSwgdGhhdCBtaWdodCBub3QgYmUgdGhlIHJpZ2h0IG9yZGVyIGlmIHRoZXJlIGFyZVxuICAgICAgLy8gY2hpbGQgaW5qZWN0b3JzIG9mIHNhaWQgaW5qZWN0b3IuIE5vdCBjbGVhciB3aGV0aGVyIGlmIHN1Y2ggY2FzZSBjYW5cbiAgICAgIC8vIGV2ZW4gYmUgY29uc3RydWN0ZWQgd2l0aCB0aGUgY3VycmVudCBhcGlzLlxuICAgICAgdGhpcy5fdmlzaXRJbmplY3RvcihjdXJJbmosIGFnZ3JlZ2F0b3IpO1xuICAgICAgdmFyIHZjID0gdmlldy52aWV3Q29udGFpbmVyc1tpXTtcbiAgICAgIGlmIChpc1ByZXNlbnQodmMpKSB0aGlzLl92aXNpdFZpZXdDb250YWluZXIodmMsIGFnZ3JlZ2F0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Zpc2l0SW5qZWN0b3IoaW5qOiBFbGVtZW50SW5qZWN0b3IsIGFnZ3JlZ2F0b3I6IGFueVtdKSB7XG4gICAgaWYgKHRoaXMucHJvdG9RdWVyeVJlZi5xdWVyeS5pc1ZhckJpbmRpbmdRdWVyeSkge1xuICAgICAgdGhpcy5fYWdncmVnYXRlVmFyaWFibGVCaW5kaW5nKGluaiwgYWdncmVnYXRvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FnZ3JlZ2F0ZURpcmVjdGl2ZShpbmosIGFnZ3JlZ2F0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Zpc2l0Vmlld0NvbnRhaW5lcih2YzogQXBwVmlld0NvbnRhaW5lciwgYWdncmVnYXRvcjogYW55W10pIHtcbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZjLnZpZXdzLmxlbmd0aDsgaisrKSB7XG4gICAgICB0aGlzLl92aXNpdFZpZXcodmMudmlld3Nbal0sIGFnZ3JlZ2F0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX3Zpc2l0Vmlldyh2aWV3OiBBcHBWaWV3LCBhZ2dyZWdhdG9yOiBhbnlbXSkge1xuICAgIGZvciAodmFyIGkgPSB2aWV3LmVsZW1lbnRPZmZzZXQ7IGkgPCB2aWV3LmVsZW1lbnRPZmZzZXQgKyB2aWV3Lm93bkJpbmRlcnNDb3VudDsgaSsrKSB7XG4gICAgICB2YXIgaW5qID0gdmlldy5lbGVtZW50SW5qZWN0b3JzW2ldO1xuICAgICAgaWYgKGlzQmxhbmsoaW5qKSkgY29udGludWU7XG5cbiAgICAgIHRoaXMuX3Zpc2l0SW5qZWN0b3IoaW5qLCBhZ2dyZWdhdG9yKTtcblxuICAgICAgdmFyIHZjID0gdmlldy52aWV3Q29udGFpbmVyc1tpXTtcbiAgICAgIGlmIChpc1ByZXNlbnQodmMpKSB0aGlzLl92aXNpdFZpZXdDb250YWluZXIodmMsIGFnZ3JlZ2F0b3IpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2FnZ3JlZ2F0ZVZhcmlhYmxlQmluZGluZyhpbmo6IEVsZW1lbnRJbmplY3RvciwgYWdncmVnYXRvcjogYW55W10pOiB2b2lkIHtcbiAgICB2YXIgdmIgPSB0aGlzLnByb3RvUXVlcnlSZWYucXVlcnkudmFyQmluZGluZ3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2Yi5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKGluai5oYXNWYXJpYWJsZUJpbmRpbmcodmJbaV0pKSB7XG4gICAgICAgIGFnZ3JlZ2F0b3IucHVzaChpbmouZ2V0VmFyaWFibGVCaW5kaW5nKHZiW2ldKSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYWdncmVnYXRlRGlyZWN0aXZlKGluajogRWxlbWVudEluamVjdG9yLCBhZ2dyZWdhdG9yOiBhbnlbXSk6IHZvaWQge1xuICAgIGluai5hZGREaXJlY3RpdmVzTWF0Y2hpbmdRdWVyeSh0aGlzLnByb3RvUXVlcnlSZWYucXVlcnksIGFnZ3JlZ2F0b3IpO1xuICB9XG5cbiAgZGVoeWRyYXRlKCk6IHZvaWQgeyB0aGlzLmxpc3QgPSBudWxsOyB9XG5cbiAgaHlkcmF0ZSgpOiB2b2lkIHtcbiAgICB0aGlzLmxpc3QgPSBuZXcgUXVlcnlMaXN0PGFueT4oKTtcbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2VsZW1lbnRfaW5qZWN0b3IudHNcbiAqKi8iLCJpbXBvcnQge1xuICBJbmplY3RvcixcbiAgSW5qZWN0LFxuICBQcm92aWRlcixcbiAgSW5qZWN0YWJsZSxcbiAgUmVzb2x2ZWRQcm92aWRlcixcbiAgZm9yd2FyZFJlZlxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge2lzUHJlc2VudCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCAqIGFzIHZpZXdNb2R1bGUgZnJvbSAnLi92aWV3JztcbmltcG9ydCB7RWxlbWVudFJlZiwgRWxlbWVudFJlZl99IGZyb20gJy4vZWxlbWVudF9yZWYnO1xuaW1wb3J0IHtQcm90b1ZpZXdSZWYsIFZpZXdSZWYsIEhvc3RWaWV3UmVmLCBpbnRlcm5hbFZpZXcsIGludGVybmFsUHJvdG9WaWV3fSBmcm9tICcuL3ZpZXdfcmVmJztcbmltcG9ydCB7Vmlld0NvbnRhaW5lclJlZn0gZnJvbSAnLi92aWV3X2NvbnRhaW5lcl9yZWYnO1xuaW1wb3J0IHtUZW1wbGF0ZVJlZiwgVGVtcGxhdGVSZWZffSBmcm9tICcuL3RlbXBsYXRlX3JlZic7XG5pbXBvcnQge1xuICBSZW5kZXJlcixcbiAgUmVuZGVyVmlld1JlZixcbiAgUmVuZGVyRnJhZ21lbnRSZWYsXG4gIFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci9hcGknO1xuaW1wb3J0IHtBcHBWaWV3TWFuYWdlclV0aWxzfSBmcm9tICcuL3ZpZXdfbWFuYWdlcl91dGlscyc7XG5pbXBvcnQge0FwcFZpZXdQb29sfSBmcm9tICcuL3ZpZXdfcG9vbCc7XG5pbXBvcnQge0FwcFZpZXdMaXN0ZW5lcn0gZnJvbSAnLi92aWV3X2xpc3RlbmVyJztcbmltcG9ydCB7d3RmQ3JlYXRlU2NvcGUsIHd0ZkxlYXZlLCBXdGZTY29wZUZufSBmcm9tICcuLi9wcm9maWxlL3Byb2ZpbGUnO1xuaW1wb3J0IHtQcm90b1ZpZXdGYWN0b3J5fSBmcm9tICcuL3Byb3RvX3ZpZXdfZmFjdG9yeSc7XG5cbi8qKlxuICogU2VydmljZSBleHBvc2luZyBsb3cgbGV2ZWwgQVBJIGZvciBjcmVhdGluZywgbW92aW5nIGFuZCBkZXN0cm95aW5nIFZpZXdzLlxuICpcbiAqIE1vc3QgYXBwbGljYXRpb25zIHNob3VsZCB1c2UgaGlnaGVyLWxldmVsIGFic3RyYWN0aW9ucyBsaWtlIHtAbGluayBEeW5hbWljQ29tcG9uZW50TG9hZGVyfSBhbmRcbiAqIHtAbGluayBWaWV3Q29udGFpbmVyUmVmfSBpbnN0ZWFkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXBwVmlld01hbmFnZXIge1xuICAvKipcbiAgICogUmV0dXJucyBhIHtAbGluayBWaWV3Q29udGFpbmVyUmVmfSBvZiB0aGUgVmlldyBDb250YWluZXIgYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi5cbiAgICovXG4gIGFic3RyYWN0IGdldFZpZXdDb250YWluZXIobG9jYXRpb246IEVsZW1lbnRSZWYpOiBWaWV3Q29udGFpbmVyUmVmO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgRWxlbWVudFJlZn0gdGhhdCBtYWtlcyB1cCB0aGUgc3BlY2lmaWVkIEhvc3QgVmlldy5cbiAgICovXG4gIGdldEhvc3RFbGVtZW50KGhvc3RWaWV3UmVmOiBIb3N0Vmlld1JlZik6IEVsZW1lbnRSZWYge1xuICAgIHZhciBob3N0VmlldyA9IGludGVybmFsVmlldyg8Vmlld1JlZj5ob3N0Vmlld1JlZik7XG4gICAgaWYgKGhvc3RWaWV3LnByb3RvLnR5cGUgIT09IHZpZXdNb2R1bGUuVmlld1R5cGUuSE9TVCkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1RoaXMgb3BlcmF0aW9uIGlzIG9ubHkgYWxsb3dlZCBvbiBob3N0IHZpZXdzJyk7XG4gICAgfVxuICAgIHJldHVybiBob3N0Vmlldy5lbGVtZW50UmVmc1tob3N0Vmlldy5lbGVtZW50T2Zmc2V0XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZWFyY2hlcyB0aGUgQ29tcG9uZW50IFZpZXcgb2YgdGhlIENvbXBvbmVudCBzcGVjaWZpZWQgdmlhIGBob3N0TG9jYXRpb25gIGFuZCByZXR1cm5zIHRoZVxuICAgKiB7QGxpbmsgRWxlbWVudFJlZn0gZm9yIHRoZSBFbGVtZW50IGlkZW50aWZpZWQgdmlhIGEgVmFyaWFibGUgTmFtZSBgdmFyaWFibGVOYW1lYC5cbiAgICpcbiAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgc3BlY2lmaWVkIGBob3N0TG9jYXRpb25gIGlzIG5vdCBhIEhvc3QgRWxlbWVudCBvZiBhIENvbXBvbmVudCwgb3IgaWZcbiAgICogdmFyaWFibGUgYHZhcmlhYmxlTmFtZWAgY291bGRuJ3QgYmUgZm91bmQgaW4gdGhlIENvbXBvbmVudCBWaWV3IG9mIHRoaXMgQ29tcG9uZW50LlxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0TmFtZWRFbGVtZW50SW5Db21wb25lbnRWaWV3KGhvc3RMb2NhdGlvbjogRWxlbWVudFJlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogRWxlbWVudFJlZjtcblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IGluc3RhbmNlIGZvciB0aGUgcHJvdmlkZWQgSG9zdCBFbGVtZW50LlxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0Q29tcG9uZW50KGhvc3RMb2NhdGlvbjogRWxlbWVudFJlZik6IGFueTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhIENvbXBvbmVudCBhbmQgYXR0YWNoZXMgaXQgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGdsb2JhbCBWaWV3XG4gICAqICh1c3VhbGx5IERPTSBEb2N1bWVudCkgdGhhdCBtYXRjaGVzIHRoZSBjb21wb25lbnQncyBzZWxlY3RvciBvciBgb3ZlcnJpZGVTZWxlY3RvcmAuXG4gICAqXG4gICAqIFRoaXMgYXMgYSBsb3ctbGV2ZWwgd2F5IHRvIGJvb3RzdHJhcCBhbiBhcHBsaWNhdGlvbiBhbmQgdXBncmFkZSBhbiBleGlzdGluZyBFbGVtZW50IHRvIGFcbiAgICogSG9zdCBFbGVtZW50LiBNb3N0IGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHtAbGluayBEeW5hbWljQ29tcG9uZW50TG9hZGVyI2xvYWRBc1Jvb3R9IGluc3RlYWQuXG4gICAqXG4gICAqIFRoZSBDb21wb25lbnQgYW5kIGl0cyBWaWV3IGFyZSBjcmVhdGVkIGJhc2VkIG9uIHRoZSBgaG9zdFByb3RvVmlld1JlZmAgd2hpY2ggY2FuIGJlIG9idGFpbmVkXG4gICAqIGJ5IGNvbXBpbGluZyB0aGUgY29tcG9uZW50IHdpdGgge0BsaW5rIENvbXBpbGVyI2NvbXBpbGVJbkhvc3R9LlxuICAgKlxuICAgKiBVc2Uge0BsaW5rIEFwcFZpZXdNYW5hZ2VyI2Rlc3Ryb3lSb290SG9zdFZpZXd9IHRvIGRlc3Ryb3kgdGhlIGNyZWF0ZWQgQ29tcG9uZW50IGFuZCBpdCdzIEhvc3RcbiAgICogVmlldy5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgXG4gICAqIEBuZy5Db21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnY2hpbGQtY29tcG9uZW50J1xuICAgKiB9KVxuICAgKiBAbmcuVmlldyh7XG4gICAqICAgdGVtcGxhdGU6ICdDaGlsZCdcbiAgICogfSlcbiAgICogY2xhc3MgQ2hpbGRDb21wb25lbnQge1xuICAgKlxuICAgKiB9XG4gICAqXG4gICAqIEBuZy5Db21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnbXktYXBwJ1xuICAgKiB9KVxuICAgKiBAbmcuVmlldyh7XG4gICAqICAgdGVtcGxhdGU6IGBcbiAgICogICAgIFBhcmVudCAoPHNvbWUtY29tcG9uZW50Pjwvc29tZS1jb21wb25lbnQ+KVxuICAgKiAgIGBcbiAgICogfSlcbiAgICogY2xhc3MgTXlBcHAgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICAgKiAgIHZpZXdSZWY6IG5nLlZpZXdSZWY7XG4gICAqXG4gICAqICAgY29uc3RydWN0b3IocHVibGljIGFwcFZpZXdNYW5hZ2VyOiBuZy5BcHBWaWV3TWFuYWdlciwgY29tcGlsZXI6IG5nLkNvbXBpbGVyKSB7XG4gICAqICAgICBjb21waWxlci5jb21waWxlSW5Ib3N0KENoaWxkQ29tcG9uZW50KS50aGVuKChwcm90b1ZpZXc6IG5nLlByb3RvVmlld1JlZikgPT4ge1xuICAgKiAgICAgICB0aGlzLnZpZXdSZWYgPSBhcHBWaWV3TWFuYWdlci5jcmVhdGVSb290SG9zdFZpZXcocHJvdG9WaWV3LCAnc29tZS1jb21wb25lbnQnLCBudWxsKTtcbiAgICogICAgIH0pXG4gICAqICAgfVxuICAgKlxuICAgKiAgIG5nT25EZXN0cm95KCkge1xuICAgKiAgICAgdGhpcy5hcHBWaWV3TWFuYWdlci5kZXN0cm95Um9vdEhvc3RWaWV3KHRoaXMudmlld1JlZik7XG4gICAqICAgICB0aGlzLnZpZXdSZWYgPSBudWxsO1xuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiBuZy5ib290c3RyYXAoTXlBcHApO1xuICAgKiBgYGBcbiAgICovXG4gIGFic3RyYWN0IGNyZWF0ZVJvb3RIb3N0Vmlldyhob3N0UHJvdG9WaWV3UmVmOiBQcm90b1ZpZXdSZWYsIG92ZXJyaWRlU2VsZWN0b3I6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdG9yOiBJbmplY3Rvcik6IEhvc3RWaWV3UmVmO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95cyB0aGUgSG9zdCBWaWV3IGNyZWF0ZWQgdmlhIHtAbGluayBBcHBWaWV3TWFuYWdlciNjcmVhdGVSb290SG9zdFZpZXd9LlxuICAgKlxuICAgKiBBbG9uZyB3aXRoIHRoZSBIb3N0IFZpZXcsIHRoZSBDb21wb25lbnQgSW5zdGFuY2UgYXMgd2VsbCBhcyBhbGwgbmVzdGVkIFZpZXcgYW5kIENvbXBvbmVudHMgYXJlXG4gICAqIGRlc3Ryb3llZCBhcyB3ZWxsLlxuICAgKi9cbiAgYWJzdHJhY3QgZGVzdHJveVJvb3RIb3N0Vmlldyhob3N0Vmlld1JlZjogSG9zdFZpZXdSZWYpO1xuXG4gIC8qKlxuICAgKiBJbnN0YW50aWF0ZXMgYW4gRW1iZWRkZWQgVmlldyBiYXNlZCBvbiB0aGUge0BsaW5rIFRlbXBsYXRlUmVmIGB0ZW1wbGF0ZVJlZmB9IGFuZCBpbnNlcnRzIGl0XG4gICAqIGludG8gdGhlIFZpZXcgQ29udGFpbmVyIHNwZWNpZmllZCB2aWEgYHZpZXdDb250YWluZXJMb2NhdGlvbmAgYXQgdGhlIHNwZWNpZmllZCBgaW5kZXhgLlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVmlld1JlZn0gZm9yIHRoZSBuZXdseSBjcmVhdGVkIFZpZXcuXG4gICAqXG4gICAqIFRoaXMgYXMgYSBsb3ctbGV2ZWwgd2F5IHRvIGNyZWF0ZSBhbmQgYXR0YWNoIGFuIEVtYmVkZGVkIHZpYSB0byBhIFZpZXcgQ29udGFpbmVyLiBNb3N0XG4gICAqIGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlZCB7QGxpbmsgVmlld0NvbnRhaW5lclJlZiNjcmVhdGVFbWJlZGRlZFZpZXd9IGluc3RlYWQuXG4gICAqXG4gICAqIFVzZSB7QGxpbmsgQXBwVmlld01hbmFnZXIjZGVzdHJveVZpZXdJbkNvbnRhaW5lcn0gdG8gZGVzdHJveSB0aGUgY3JlYXRlZCBFbWJlZGRlZCBWaWV3LlxuICAgKi9cbiAgLy8gVE9ETyhpKTogdGhpcyBsb3ctbGV2ZWwgdmVyc2lvbiBvZiBWaWV3Q29udGFpbmVyUmVmI2NyZWF0ZUVtYmVkZGVkVmlldyBkb2Vzbid0IGFkZCBhbnl0aGluZyBuZXdcbiAgLy8gICAgd2Ugc2hvdWxkIG1ha2UgaXQgcHJpdmF0ZSwgb3RoZXJ3aXNlIHdlIGhhdmUgdHdvIGFwaXMgdG8gZG8gdGhlIHNhbWUgdGhpbmcuXG4gIGFic3RyYWN0IGNyZWF0ZUVtYmVkZGVkVmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmKTogVmlld1JlZjtcblxuICAvKipcbiAgICogSW5zdGFudGlhdGVzIGEgc2luZ2xlIHtAbGluayBDb21wb25lbnR9IGFuZCBpbnNlcnRzIGl0cyBIb3N0IFZpZXcgaW50byB0aGUgVmlldyBDb250YWluZXJcbiAgICogZm91bmQgYXQgYHZpZXdDb250YWluZXJMb2NhdGlvbmAuIFdpdGhpbiB0aGUgY29udGFpbmVyLCB0aGUgdmlldyB3aWxsIGJlIGluc2VydGVkIGF0IHBvc2l0aW9uXG4gICAqIHNwZWNpZmllZCB2aWEgYGluZGV4YC5cbiAgICpcbiAgICogVGhlIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgdXNpbmcgaXRzIHtAbGluayBQcm90b1ZpZXdSZWYgYHByb3RvVmlld1JlZmB9IHdoaWNoIGNhbiBiZVxuICAgKiBvYnRhaW5lZCB2aWEge0BsaW5rIENvbXBpbGVyI2NvbXBpbGVJbkhvc3R9LlxuICAgKlxuICAgKiBZb3UgY2FuIG9wdGlvbmFsbHkgc3BlY2lmeSBgaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yYCwgd2hpY2ggY29uZmlndXJlIHRoZSB7QGxpbmsgSW5qZWN0b3J9XG4gICAqIHRoYXQgd2lsbCBiZSBjcmVhdGVkIGZvciB0aGUgSG9zdCBWaWV3LlxuICAgKlxuICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgSG9zdFZpZXdSZWZ9IG9mIHRoZSBIb3N0IFZpZXcgY3JlYXRlZCBmb3IgdGhlIG5ld2x5IGluc3RhbnRpYXRlZCBDb21wb25lbnQuXG4gICAqXG4gICAqIFVzZSB7QGxpbmsgQXBwVmlld01hbmFnZXIjZGVzdHJveVZpZXdJbkNvbnRhaW5lcn0gdG8gZGVzdHJveSB0aGUgY3JlYXRlZCBIb3N0IFZpZXcuXG4gICAqL1xuICBhYnN0cmFjdCBjcmVhdGVIb3N0Vmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b1ZpZXdSZWY6IFByb3RvVmlld1JlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3I6IFJlc29sdmVkUHJvdmlkZXJbXSk6IEhvc3RWaWV3UmVmO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhbiBFbWJlZGRlZCBvciBIb3N0IFZpZXcgYXR0YWNoZWQgdG8gYSBWaWV3IENvbnRhaW5lciBhdCB0aGUgc3BlY2lmaWVkIGBpbmRleGAuXG4gICAqXG4gICAqIFRoZSBWaWV3IENvbnRhaW5lciBpcyBsb2NhdGVkIHZpYSBgdmlld0NvbnRhaW5lckxvY2F0aW9uYC5cbiAgICovXG4gIGFic3RyYWN0IGRlc3Ryb3lWaWV3SW5Db250YWluZXIodmlld0NvbnRhaW5lckxvY2F0aW9uOiBFbGVtZW50UmVmLCBpbmRleDogbnVtYmVyKTtcblxuICAvKipcbiAgICpcbiAgICogU2VlIHtAbGluayBBcHBWaWV3TWFuYWdlciNkZXRhY2hWaWV3SW5Db250YWluZXJ9LlxuICAgKi9cbiAgLy8gVE9ETyhpKTogcmVmYWN0b3IgZGV0YWNoVmlld0luQ29udGFpbmVyK2F0dGFjaFZpZXdJbkNvbnRhaW5lciB0byBtb3ZlVmlld0luQ29udGFpbmVyXG4gIGFic3RyYWN0IGF0dGFjaFZpZXdJbkNvbnRhaW5lcih2aWV3Q29udGFpbmVyTG9jYXRpb246IEVsZW1lbnRSZWYsIGluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3UmVmOiBWaWV3UmVmKTogVmlld1JlZjtcblxuICAvKipcbiAgICogU2VlIHtAbGluayBBcHBWaWV3TWFuYWdlciNhdHRhY2hWaWV3SW5Db250YWluZXJ9LlxuICAgKi9cbiAgYWJzdHJhY3QgZGV0YWNoVmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcik6IFZpZXdSZWY7XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBBcHBWaWV3TWFuYWdlcl8gZXh0ZW5kcyBBcHBWaWV3TWFuYWdlciB7XG4gIHByaXZhdGUgX3Byb3RvVmlld0ZhY3Rvcnk6IFByb3RvVmlld0ZhY3Rvcnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdmlld1Bvb2w6IEFwcFZpZXdQb29sLCBwcml2YXRlIF92aWV3TGlzdGVuZXI6IEFwcFZpZXdMaXN0ZW5lcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdXRpbHM6IEFwcFZpZXdNYW5hZ2VyVXRpbHMsIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcixcbiAgICAgICAgICAgICAgQEluamVjdChmb3J3YXJkUmVmKCgpID0+IFByb3RvVmlld0ZhY3RvcnkpKSBfcHJvdG9WaWV3RmFjdG9yeSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fcHJvdG9WaWV3RmFjdG9yeSA9IF9wcm90b1ZpZXdGYWN0b3J5O1xuICB9XG5cbiAgZ2V0Vmlld0NvbnRhaW5lcihsb2NhdGlvbjogRWxlbWVudFJlZik6IFZpZXdDb250YWluZXJSZWYge1xuICAgIHZhciBob3N0VmlldyA9IGludGVybmFsVmlldygoPEVsZW1lbnRSZWZfPmxvY2F0aW9uKS5wYXJlbnRWaWV3KTtcbiAgICByZXR1cm4gaG9zdFZpZXcuZWxlbWVudEluamVjdG9yc1soPEVsZW1lbnRSZWZfPmxvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleF1cbiAgICAgICAgLmdldFZpZXdDb250YWluZXJSZWYoKTtcbiAgfVxuXG4gIGdldE5hbWVkRWxlbWVudEluQ29tcG9uZW50Vmlldyhob3N0TG9jYXRpb246IEVsZW1lbnRSZWYsIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogRWxlbWVudFJlZiB7XG4gICAgdmFyIGhvc3RWaWV3ID0gaW50ZXJuYWxWaWV3KCg8RWxlbWVudFJlZl8+aG9zdExvY2F0aW9uKS5wYXJlbnRWaWV3KTtcbiAgICB2YXIgYm91bmRFbGVtZW50SW5kZXggPSAoPEVsZW1lbnRSZWZfPmhvc3RMb2NhdGlvbikuYm91bmRFbGVtZW50SW5kZXg7XG4gICAgdmFyIGNvbXBvbmVudFZpZXcgPSBob3N0Vmlldy5nZXROZXN0ZWRWaWV3KGJvdW5kRWxlbWVudEluZGV4KTtcbiAgICBpZiAoaXNCbGFuayhjb21wb25lbnRWaWV3KSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFRoZXJlIGlzIG5vIGNvbXBvbmVudCBkaXJlY3RpdmUgYXQgZWxlbWVudCAke2JvdW5kRWxlbWVudEluZGV4fWApO1xuICAgIH1cbiAgICB2YXIgYmluZGVySWR4ID0gY29tcG9uZW50Vmlldy5wcm90by52YXJpYWJsZUxvY2F0aW9ucy5nZXQodmFyaWFibGVOYW1lKTtcbiAgICBpZiAoaXNCbGFuayhiaW5kZXJJZHgpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ291bGQgbm90IGZpbmQgdmFyaWFibGUgJHt2YXJpYWJsZU5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBjb21wb25lbnRWaWV3LmVsZW1lbnRSZWZzW2NvbXBvbmVudFZpZXcuZWxlbWVudE9mZnNldCArIGJpbmRlcklkeF07XG4gIH1cblxuICBnZXRDb21wb25lbnQoaG9zdExvY2F0aW9uOiBFbGVtZW50UmVmKTogYW55IHtcbiAgICB2YXIgaG9zdFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz5ob3N0TG9jYXRpb24pLnBhcmVudFZpZXcpO1xuICAgIHZhciBib3VuZEVsZW1lbnRJbmRleCA9ICg8RWxlbWVudFJlZl8+aG9zdExvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICByZXR1cm4gdGhpcy5fdXRpbHMuZ2V0Q29tcG9uZW50SW5zdGFuY2UoaG9zdFZpZXcsIGJvdW5kRWxlbWVudEluZGV4KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NyZWF0ZVJvb3RIb3N0Vmlld1Njb3BlOiBXdGZTY29wZUZuID0gd3RmQ3JlYXRlU2NvcGUoJ0FwcFZpZXdNYW5hZ2VyI2NyZWF0ZVJvb3RIb3N0VmlldygpJyk7XG5cbiAgY3JlYXRlUm9vdEhvc3RWaWV3KGhvc3RQcm90b1ZpZXdSZWY6IFByb3RvVmlld1JlZiwgb3ZlcnJpZGVTZWxlY3Rvcjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgaW5qZWN0b3I6IEluamVjdG9yKTogSG9zdFZpZXdSZWYge1xuICAgIHZhciBzID0gdGhpcy5fY3JlYXRlUm9vdEhvc3RWaWV3U2NvcGUoKTtcbiAgICB2YXIgaG9zdFByb3RvVmlldzogdmlld01vZHVsZS5BcHBQcm90b1ZpZXcgPSBpbnRlcm5hbFByb3RvVmlldyhob3N0UHJvdG9WaWV3UmVmKTtcbiAgICB0aGlzLl9wcm90b1ZpZXdGYWN0b3J5LmluaXRpYWxpemVQcm90b1ZpZXdJZk5lZWRlZChob3N0UHJvdG9WaWV3KTtcbiAgICB2YXIgaG9zdEVsZW1lbnRTZWxlY3RvciA9IG92ZXJyaWRlU2VsZWN0b3I7XG4gICAgaWYgKGlzQmxhbmsoaG9zdEVsZW1lbnRTZWxlY3RvcikpIHtcbiAgICAgIGhvc3RFbGVtZW50U2VsZWN0b3IgPSBob3N0UHJvdG9WaWV3LmVsZW1lbnRCaW5kZXJzWzBdLmNvbXBvbmVudERpcmVjdGl2ZS5tZXRhZGF0YS5zZWxlY3RvcjtcbiAgICB9XG4gICAgdmFyIHJlbmRlclZpZXdXaXRoRnJhZ21lbnRzID0gdGhpcy5fcmVuZGVyZXIuY3JlYXRlUm9vdEhvc3RWaWV3KFxuICAgICAgICBob3N0UHJvdG9WaWV3LnJlbmRlciwgaG9zdFByb3RvVmlldy5tZXJnZUluZm8uZW1iZWRkZWRWaWV3Q291bnQgKyAxLCBob3N0RWxlbWVudFNlbGVjdG9yKTtcbiAgICB2YXIgaG9zdFZpZXcgPSB0aGlzLl9jcmVhdGVNYWluVmlldyhob3N0UHJvdG9WaWV3LCByZW5kZXJWaWV3V2l0aEZyYWdtZW50cyk7XG5cbiAgICB0aGlzLl9yZW5kZXJlci5oeWRyYXRlVmlldyhob3N0Vmlldy5yZW5kZXIpO1xuICAgIHRoaXMuX3V0aWxzLmh5ZHJhdGVSb290SG9zdFZpZXcoaG9zdFZpZXcsIGluamVjdG9yKTtcbiAgICByZXR1cm4gd3RmTGVhdmUocywgaG9zdFZpZXcucmVmKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2Rlc3Ryb3lSb290SG9zdFZpZXdTY29wZTogV3RmU2NvcGVGbiA9IHd0ZkNyZWF0ZVNjb3BlKCdBcHBWaWV3TWFuYWdlciNkZXN0cm95Um9vdEhvc3RWaWV3KCknKTtcblxuICBkZXN0cm95Um9vdEhvc3RWaWV3KGhvc3RWaWV3UmVmOiBIb3N0Vmlld1JlZikge1xuICAgIC8vIE5vdGU6IERvbid0IHB1dCB0aGUgaG9zdFZpZXcgaW50byB0aGUgdmlldyBwb29sXG4gICAgLy8gYXMgaXQgaXMgZGVwZW5kaW5nIG9uIHRoZSBlbGVtZW50IGZvciB3aGljaCBpdCB3YXMgY3JlYXRlZC5cbiAgICB2YXIgcyA9IHRoaXMuX2Rlc3Ryb3lSb290SG9zdFZpZXdTY29wZSgpO1xuICAgIHZhciBob3N0VmlldyA9IGludGVybmFsVmlldyg8Vmlld1JlZj5ob3N0Vmlld1JlZik7XG4gICAgdGhpcy5fcmVuZGVyZXIuZGV0YWNoRnJhZ21lbnQoaG9zdFZpZXcucmVuZGVyRnJhZ21lbnQpO1xuICAgIHRoaXMuX3JlbmRlcmVyLmRlaHlkcmF0ZVZpZXcoaG9zdFZpZXcucmVuZGVyKTtcbiAgICB0aGlzLl92aWV3RGVoeWRyYXRlUmVjdXJzZShob3N0Vmlldyk7XG4gICAgdGhpcy5fdmlld0xpc3RlbmVyLm9uVmlld0Rlc3Ryb3llZChob3N0Vmlldyk7XG4gICAgdGhpcy5fcmVuZGVyZXIuZGVzdHJveVZpZXcoaG9zdFZpZXcucmVuZGVyKTtcbiAgICB3dGZMZWF2ZShzKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NyZWF0ZUVtYmVkZGVkVmlld0luQ29udGFpbmVyU2NvcGU6IFd0ZlNjb3BlRm4gPVxuICAgICAgd3RmQ3JlYXRlU2NvcGUoJ0FwcFZpZXdNYW5hZ2VyI2NyZWF0ZUVtYmVkZGVkVmlld0luQ29udGFpbmVyKCknKTtcblxuICBjcmVhdGVFbWJlZGRlZFZpZXdJbkNvbnRhaW5lcih2aWV3Q29udGFpbmVyTG9jYXRpb246IEVsZW1lbnRSZWYsIGluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZik6IFZpZXdSZWYge1xuICAgIHZhciBzID0gdGhpcy5fY3JlYXRlRW1iZWRkZWRWaWV3SW5Db250YWluZXJTY29wZSgpO1xuICAgIHZhciBwcm90b1ZpZXcgPSBpbnRlcm5hbFByb3RvVmlldygoPFRlbXBsYXRlUmVmXz50ZW1wbGF0ZVJlZikucHJvdG9WaWV3UmVmKTtcbiAgICBpZiAocHJvdG9WaWV3LnR5cGUgIT09IHZpZXdNb2R1bGUuVmlld1R5cGUuRU1CRURERUQpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKCdUaGlzIG1ldGhvZCBjYW4gb25seSBiZSBjYWxsZWQgd2l0aCBlbWJlZGRlZCBQcm90b1ZpZXdzIScpO1xuICAgIH1cbiAgICB0aGlzLl9wcm90b1ZpZXdGYWN0b3J5LmluaXRpYWxpemVQcm90b1ZpZXdJZk5lZWRlZChwcm90b1ZpZXcpO1xuICAgIHJldHVybiB3dGZMZWF2ZShzLCB0aGlzLl9jcmVhdGVWaWV3SW5Db250YWluZXIodmlld0NvbnRhaW5lckxvY2F0aW9uLCBpbmRleCwgcHJvdG9WaWV3LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVSZWYuZWxlbWVudFJlZiwgbnVsbCkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY3JlYXRlSG9zdFZpZXdJbkNvbnRhaW5lclNjb3BlOiBXdGZTY29wZUZuID1cbiAgICAgIHd0ZkNyZWF0ZVNjb3BlKCdBcHBWaWV3TWFuYWdlciNjcmVhdGVIb3N0Vmlld0luQ29udGFpbmVyKCknKTtcblxuICBjcmVhdGVIb3N0Vmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b1ZpZXdSZWY6IFByb3RvVmlld1JlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3I6IFJlc29sdmVkUHJvdmlkZXJbXSk6IEhvc3RWaWV3UmVmIHtcbiAgICB2YXIgcyA9IHRoaXMuX2NyZWF0ZUhvc3RWaWV3SW5Db250YWluZXJTY29wZSgpO1xuICAgIHZhciBwcm90b1ZpZXcgPSBpbnRlcm5hbFByb3RvVmlldyhwcm90b1ZpZXdSZWYpO1xuICAgIGlmIChwcm90b1ZpZXcudHlwZSAhPT0gdmlld01vZHVsZS5WaWV3VHlwZS5IT1NUKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignVGhpcyBtZXRob2QgY2FuIG9ubHkgYmUgY2FsbGVkIHdpdGggaG9zdCBQcm90b1ZpZXdzIScpO1xuICAgIH1cbiAgICB0aGlzLl9wcm90b1ZpZXdGYWN0b3J5LmluaXRpYWxpemVQcm90b1ZpZXdJZk5lZWRlZChwcm90b1ZpZXcpO1xuICAgIHJldHVybiB3dGZMZWF2ZShcbiAgICAgICAgcywgdGhpcy5fY3JlYXRlVmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbiwgaW5kZXgsIHByb3RvVmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdDb250YWluZXJMb2NhdGlvbiwgaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yKSk7XG4gIH1cblxuICAvKipcbiAgICpcbiAgICogU2VlIHtAbGluayBBcHBWaWV3TWFuYWdlciNkZXN0cm95Vmlld0luQ29udGFpbmVyfS5cbiAgICogQGludGVybmFsXG4gICAqL1xuICBfY3JlYXRlVmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b1ZpZXc6IHZpZXdNb2R1bGUuQXBwUHJvdG9WaWV3LCBjb250ZXh0OiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGltcGVyYXRpdmVseUNyZWF0ZWRJbmplY3RvcjogUmVzb2x2ZWRQcm92aWRlcltdKTogVmlld1JlZiB7XG4gICAgdmFyIHBhcmVudFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz52aWV3Q29udGFpbmVyTG9jYXRpb24pLnBhcmVudFZpZXcpO1xuICAgIHZhciBib3VuZEVsZW1lbnRJbmRleCA9ICg8RWxlbWVudFJlZl8+dmlld0NvbnRhaW5lckxvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICB2YXIgY29udGV4dFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz5jb250ZXh0KS5wYXJlbnRWaWV3KTtcbiAgICB2YXIgY29udGV4dEJvdW5kRWxlbWVudEluZGV4ID0gKDxFbGVtZW50UmVmXz5jb250ZXh0KS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICB2YXIgZW1iZWRkZWRGcmFnbWVudFZpZXcgPSBjb250ZXh0Vmlldy5nZXROZXN0ZWRWaWV3KGNvbnRleHRCb3VuZEVsZW1lbnRJbmRleCk7XG4gICAgdmFyIHZpZXc7XG4gICAgaWYgKHByb3RvVmlldy50eXBlID09PSB2aWV3TW9kdWxlLlZpZXdUeXBlLkVNQkVEREVEICYmIGlzUHJlc2VudChlbWJlZGRlZEZyYWdtZW50VmlldykgJiZcbiAgICAgICAgIWVtYmVkZGVkRnJhZ21lbnRWaWV3Lmh5ZHJhdGVkKCkpIHtcbiAgICAgIC8vIENhc2UgMTogaW5zdGFudGlhdGUgdGhlIGZpcnN0IHZpZXcgb2YgYSB0ZW1wbGF0ZSB0aGF0IGhhcyBiZWVuIG1lcmdlZCBpbnRvIGEgcGFyZW50XG4gICAgICB2aWV3ID0gZW1iZWRkZWRGcmFnbWVudFZpZXc7XG4gICAgICB0aGlzLl9hdHRhY2hSZW5kZXJWaWV3KHBhcmVudFZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBpbmRleCwgdmlldyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIENhc2UgMjogaW5zdGFudGlhdGUgYW5vdGhlciBjb3B5IG9mIHRoZSB0ZW1wbGF0ZSBvciBhIGhvc3QgUHJvdG9WaWV3LlxuICAgICAgLy8gVGhpcyBpcyBhIHNlcGFyYXRlIGNhc2VcbiAgICAgIC8vIGFzIHdlIG9ubHkgaW5saW5lIG9uZSBjb3B5IG9mIHRoZSB0ZW1wbGF0ZSBpbnRvIHRoZSBwYXJlbnQgdmlldy5cbiAgICAgIHZpZXcgPSB0aGlzLl9jcmVhdGVQb29sZWRWaWV3KHByb3RvVmlldyk7XG4gICAgICB0aGlzLl9hdHRhY2hSZW5kZXJWaWV3KHBhcmVudFZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBpbmRleCwgdmlldyk7XG4gICAgICB0aGlzLl9yZW5kZXJlci5oeWRyYXRlVmlldyh2aWV3LnJlbmRlcik7XG4gICAgfVxuICAgIHRoaXMuX3V0aWxzLmF0dGFjaFZpZXdJbkNvbnRhaW5lcihwYXJlbnRWaWV3LCBib3VuZEVsZW1lbnRJbmRleCwgY29udGV4dFZpZXcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRCb3VuZEVsZW1lbnRJbmRleCwgaW5kZXgsIHZpZXcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuX3V0aWxzLmh5ZHJhdGVWaWV3SW5Db250YWluZXIocGFyZW50VmlldywgYm91bmRFbGVtZW50SW5kZXgsIGNvbnRleHRWaWV3LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Qm91bmRFbGVtZW50SW5kZXgsIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX3V0aWxzLmRldGFjaFZpZXdJbkNvbnRhaW5lcihwYXJlbnRWaWV3LCBib3VuZEVsZW1lbnRJbmRleCwgaW5kZXgpO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIHZpZXcucmVmO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfYXR0YWNoUmVuZGVyVmlldyhwYXJlbnRWaWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcsIGJvdW5kRWxlbWVudEluZGV4OiBudW1iZXIsIGluZGV4OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgIHZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldykge1xuICAgIHZhciBlbGVtZW50UmVmID0gcGFyZW50Vmlldy5lbGVtZW50UmVmc1tib3VuZEVsZW1lbnRJbmRleF07XG4gICAgaWYgKGluZGV4ID09PSAwKSB7XG4gICAgICB0aGlzLl9yZW5kZXJlci5hdHRhY2hGcmFnbWVudEFmdGVyRWxlbWVudChlbGVtZW50UmVmLCB2aWV3LnJlbmRlckZyYWdtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHByZXZWaWV3ID0gcGFyZW50Vmlldy52aWV3Q29udGFpbmVyc1tib3VuZEVsZW1lbnRJbmRleF0udmlld3NbaW5kZXggLSAxXTtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmF0dGFjaEZyYWdtZW50QWZ0ZXJGcmFnbWVudChwcmV2Vmlldy5yZW5kZXJGcmFnbWVudCwgdmlldy5yZW5kZXJGcmFnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGVzdHJveVZpZXdJbkNvbnRhaW5lclNjb3BlID0gd3RmQ3JlYXRlU2NvcGUoJ0FwcFZpZXdNYW5hbmdlciNkZXN0cm95Vmlld0luQ29udGFpbmVyKCknKTtcblxuICBkZXN0cm95Vmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcikge1xuICAgIHZhciBzID0gdGhpcy5fZGVzdHJveVZpZXdJbkNvbnRhaW5lclNjb3BlKCk7XG4gICAgdmFyIHBhcmVudFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz52aWV3Q29udGFpbmVyTG9jYXRpb24pLnBhcmVudFZpZXcpO1xuICAgIHZhciBib3VuZEVsZW1lbnRJbmRleCA9ICg8RWxlbWVudFJlZl8+dmlld0NvbnRhaW5lckxvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICB0aGlzLl9kZXN0cm95Vmlld0luQ29udGFpbmVyKHBhcmVudFZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBpbmRleCk7XG4gICAgd3RmTGVhdmUocyk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9hdHRhY2hWaWV3SW5Db250YWluZXJTY29wZSA9IHd0ZkNyZWF0ZVNjb3BlKCdBcHBWaWV3TWFuYW5nZXIjYXR0YWNoVmlld0luQ29udGFpbmVyKCknKTtcblxuICAvLyBUT0RPKGkpOiByZWZhY3RvciBkZXRhY2hWaWV3SW5Db250YWluZXIrYXR0YWNoVmlld0luQ29udGFpbmVyIHRvIG1vdmVWaWV3SW5Db250YWluZXJcbiAgYXR0YWNoVmlld0luQ29udGFpbmVyKHZpZXdDb250YWluZXJMb2NhdGlvbjogRWxlbWVudFJlZiwgaW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdSZWY6IFZpZXdSZWYpOiBWaWV3UmVmIHtcbiAgICB2YXIgcyA9IHRoaXMuX2F0dGFjaFZpZXdJbkNvbnRhaW5lclNjb3BlKCk7XG4gICAgdmFyIHZpZXcgPSBpbnRlcm5hbFZpZXcodmlld1JlZik7XG4gICAgdmFyIHBhcmVudFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz52aWV3Q29udGFpbmVyTG9jYXRpb24pLnBhcmVudFZpZXcpO1xuICAgIHZhciBib3VuZEVsZW1lbnRJbmRleCA9ICg8RWxlbWVudFJlZl8+dmlld0NvbnRhaW5lckxvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICAvLyBUT0RPKHRib3NjaCk6IHRoZSBwdWJsaWMgbWV0aG9kcyBhdHRhY2hWaWV3SW5Db250YWluZXIvZGV0YWNoVmlld0luQ29udGFpbmVyXG4gICAgLy8gYXJlIHVzZWQgZm9yIG1vdmluZyBlbGVtZW50cyB3aXRob3V0IHRoZSBzYW1lIGNvbnRhaW5lci5cbiAgICAvLyBXZSB3aWxsIGNoYW5nZSB0aGlzIGludG8gYW4gYXRvbWljIGBtb3ZlYCBvcGVyYXRpb24sIHdoaWNoIHNob3VsZCBwcmVzZXJ2ZSB0aGVcbiAgICAvLyBwcmV2aW91cyBwYXJlbnQgaW5qZWN0b3IgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzc3KS5cbiAgICAvLyBSaWdodCBub3cgd2UgYXJlIGRlc3Ryb3lpbmcgYW55IHNwZWNpYWxcbiAgICAvLyBjb250ZXh0IHZpZXcgdGhhdCBtaWdodCBoYXZlIGJlZW4gdXNlZC5cbiAgICB0aGlzLl91dGlscy5hdHRhY2hWaWV3SW5Db250YWluZXIocGFyZW50VmlldywgYm91bmRFbGVtZW50SW5kZXgsIG51bGwsIG51bGwsIGluZGV4LCB2aWV3KTtcbiAgICB0aGlzLl9hdHRhY2hSZW5kZXJWaWV3KHBhcmVudFZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBpbmRleCwgdmlldyk7XG4gICAgcmV0dXJuIHd0ZkxlYXZlKHMsIHZpZXdSZWYpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGV0YWNoVmlld0luQ29udGFpbmVyU2NvcGUgPSB3dGZDcmVhdGVTY29wZSgnQXBwVmlld01hbmFuZ2VyI2RldGFjaFZpZXdJbkNvbnRhaW5lcigpJyk7XG5cbiAgLy8gVE9ETyhpKTogcmVmYWN0b3IgZGV0YWNoVmlld0luQ29udGFpbmVyK2F0dGFjaFZpZXdJbkNvbnRhaW5lciB0byBtb3ZlVmlld0luQ29udGFpbmVyXG4gIGRldGFjaFZpZXdJbkNvbnRhaW5lcih2aWV3Q29udGFpbmVyTG9jYXRpb246IEVsZW1lbnRSZWYsIGluZGV4OiBudW1iZXIpOiBWaWV3UmVmIHtcbiAgICB2YXIgcyA9IHRoaXMuX2RldGFjaFZpZXdJbkNvbnRhaW5lclNjb3BlKCk7XG4gICAgdmFyIHBhcmVudFZpZXcgPSBpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz52aWV3Q29udGFpbmVyTG9jYXRpb24pLnBhcmVudFZpZXcpO1xuICAgIHZhciBib3VuZEVsZW1lbnRJbmRleCA9ICg8RWxlbWVudFJlZl8+dmlld0NvbnRhaW5lckxvY2F0aW9uKS5ib3VuZEVsZW1lbnRJbmRleDtcbiAgICB2YXIgdmlld0NvbnRhaW5lciA9IHBhcmVudFZpZXcudmlld0NvbnRhaW5lcnNbYm91bmRFbGVtZW50SW5kZXhdO1xuICAgIHZhciB2aWV3ID0gdmlld0NvbnRhaW5lci52aWV3c1tpbmRleF07XG4gICAgdGhpcy5fdXRpbHMuZGV0YWNoVmlld0luQ29udGFpbmVyKHBhcmVudFZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBpbmRleCk7XG4gICAgdGhpcy5fcmVuZGVyZXIuZGV0YWNoRnJhZ21lbnQodmlldy5yZW5kZXJGcmFnbWVudCk7XG4gICAgcmV0dXJuIHd0ZkxlYXZlKHMsIHZpZXcucmVmKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NyZWF0ZU1haW5WaWV3KHByb3RvVmlldzogdmlld01vZHVsZS5BcHBQcm90b1ZpZXcsXG4gICAgICAgICAgICAgICAgICByZW5kZXJWaWV3V2l0aEZyYWdtZW50czogUmVuZGVyVmlld1dpdGhGcmFnbWVudHMpOiB2aWV3TW9kdWxlLkFwcFZpZXcge1xuICAgIHZhciBtZXJnZWRQYXJlbnRWaWV3ID1cbiAgICAgICAgdGhpcy5fdXRpbHMuY3JlYXRlVmlldyhwcm90b1ZpZXcsIHJlbmRlclZpZXdXaXRoRnJhZ21lbnRzLCB0aGlzLCB0aGlzLl9yZW5kZXJlcik7XG4gICAgdGhpcy5fcmVuZGVyZXIuc2V0RXZlbnREaXNwYXRjaGVyKG1lcmdlZFBhcmVudFZpZXcucmVuZGVyLCBtZXJnZWRQYXJlbnRWaWV3KTtcbiAgICB0aGlzLl92aWV3TGlzdGVuZXIub25WaWV3Q3JlYXRlZChtZXJnZWRQYXJlbnRWaWV3KTtcbiAgICByZXR1cm4gbWVyZ2VkUGFyZW50VmlldztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NyZWF0ZVBvb2xlZFZpZXcocHJvdG9WaWV3OiB2aWV3TW9kdWxlLkFwcFByb3RvVmlldyk6IHZpZXdNb2R1bGUuQXBwVmlldyB7XG4gICAgdmFyIHZpZXcgPSB0aGlzLl92aWV3UG9vbC5nZXRWaWV3KHByb3RvVmlldyk7XG4gICAgaWYgKGlzQmxhbmsodmlldykpIHtcbiAgICAgIHZpZXcgPSB0aGlzLl9jcmVhdGVNYWluVmlldyhcbiAgICAgICAgICBwcm90b1ZpZXcsXG4gICAgICAgICAgdGhpcy5fcmVuZGVyZXIuY3JlYXRlVmlldyhwcm90b1ZpZXcucmVuZGVyLCBwcm90b1ZpZXcubWVyZ2VJbmZvLmVtYmVkZGVkVmlld0NvdW50ICsgMSkpO1xuICAgIH1cbiAgICByZXR1cm4gdmlldztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2Rlc3Ryb3lQb29sZWRWaWV3KHZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldykge1xuICAgIHZhciB3YXNSZXR1cm5lZCA9IHRoaXMuX3ZpZXdQb29sLnJldHVyblZpZXcodmlldyk7XG4gICAgaWYgKCF3YXNSZXR1cm5lZCkge1xuICAgICAgdGhpcy5fdmlld0xpc3RlbmVyLm9uVmlld0Rlc3Ryb3llZCh2aWV3KTtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmRlc3Ryb3lWaWV3KHZpZXcucmVuZGVyKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9kZXN0cm95Vmlld0luQ29udGFpbmVyKHBhcmVudFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgYm91bmRFbGVtZW50SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG51bWJlcikge1xuICAgIHZhciB2aWV3Q29udGFpbmVyID0gcGFyZW50Vmlldy52aWV3Q29udGFpbmVyc1tib3VuZEVsZW1lbnRJbmRleF07XG4gICAgdmFyIHZpZXcgPSB2aWV3Q29udGFpbmVyLnZpZXdzW2luZGV4XTtcblxuICAgIHRoaXMuX3ZpZXdEZWh5ZHJhdGVSZWN1cnNlKHZpZXcpO1xuICAgIHRoaXMuX3V0aWxzLmRldGFjaFZpZXdJbkNvbnRhaW5lcihwYXJlbnRWaWV3LCBib3VuZEVsZW1lbnRJbmRleCwgaW5kZXgpO1xuICAgIGlmICh2aWV3LnZpZXdPZmZzZXQgPiAwKSB7XG4gICAgICAvLyBDYXNlIDE6IGEgdmlldyB0aGF0IGlzIHBhcnQgb2YgYW5vdGhlciB2aWV3LlxuICAgICAgLy8gSnVzdCBkZXRhY2ggdGhlIGZyYWdtZW50XG4gICAgICB0aGlzLl9yZW5kZXJlci5kZXRhY2hGcmFnbWVudCh2aWV3LnJlbmRlckZyYWdtZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FzZSAyOiBhIHZpZXcgdGhhdCBpcyBub3QgcGFydCBvZiBhbm90aGVyIHZpZXcuXG4gICAgICAvLyBkZWh5ZHJhdGUgYW5kIGRlc3Ryb3kgaXQuXG4gICAgICB0aGlzLl9yZW5kZXJlci5kZWh5ZHJhdGVWaWV3KHZpZXcucmVuZGVyKTtcbiAgICAgIHRoaXMuX3JlbmRlcmVyLmRldGFjaEZyYWdtZW50KHZpZXcucmVuZGVyRnJhZ21lbnQpO1xuICAgICAgdGhpcy5fZGVzdHJveVBvb2xlZFZpZXcodmlldyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdmlld0RlaHlkcmF0ZVJlY3Vyc2Uodmlldzogdmlld01vZHVsZS5BcHBWaWV3KSB7XG4gICAgaWYgKHZpZXcuaHlkcmF0ZWQoKSkge1xuICAgICAgdGhpcy5fdXRpbHMuZGVoeWRyYXRlVmlldyh2aWV3KTtcbiAgICB9XG4gICAgdmFyIHZpZXdDb250YWluZXJzID0gdmlldy52aWV3Q29udGFpbmVycztcbiAgICB2YXIgc3RhcnRWaWV3T2Zmc2V0ID0gdmlldy52aWV3T2Zmc2V0O1xuICAgIHZhciBlbmRWaWV3T2Zmc2V0ID0gdmlldy52aWV3T2Zmc2V0ICsgdmlldy5wcm90by5tZXJnZUluZm8udmlld0NvdW50IC0gMTtcbiAgICB2YXIgZWxlbWVudE9mZnNldCA9IHZpZXcuZWxlbWVudE9mZnNldDtcbiAgICBmb3IgKHZhciB2aWV3SWR4ID0gc3RhcnRWaWV3T2Zmc2V0OyB2aWV3SWR4IDw9IGVuZFZpZXdPZmZzZXQ7IHZpZXdJZHgrKykge1xuICAgICAgdmFyIGN1cnJWaWV3ID0gdmlldy52aWV3c1t2aWV3SWR4XTtcbiAgICAgIGZvciAodmFyIGJpbmRlcklkeCA9IDA7IGJpbmRlcklkeCA8IGN1cnJWaWV3LnByb3RvLmVsZW1lbnRCaW5kZXJzLmxlbmd0aDtcbiAgICAgICAgICAgYmluZGVySWR4KyssIGVsZW1lbnRPZmZzZXQrKykge1xuICAgICAgICB2YXIgdmMgPSB2aWV3Q29udGFpbmVyc1tlbGVtZW50T2Zmc2V0XTtcbiAgICAgICAgaWYgKGlzUHJlc2VudCh2YykpIHtcbiAgICAgICAgICBmb3IgKHZhciBqID0gdmMudmlld3MubGVuZ3RoIC0gMTsgaiA+PSAwOyBqLS0pIHtcbiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lWaWV3SW5Db250YWluZXIoY3VyclZpZXcsIGVsZW1lbnRPZmZzZXQsIGopO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfbWFuYWdlci50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0b3IsIFByb3ZpZGVyLCBJbmplY3RhYmxlLCBSZXNvbHZlZFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0xpc3RXcmFwcGVyLCBNYXBXcmFwcGVyLCBNYXAsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQgKiBhcyBlbGkgZnJvbSAnLi9lbGVtZW50X2luamVjdG9yJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0ICogYXMgdmlld01vZHVsZSBmcm9tICcuL3ZpZXcnO1xuaW1wb3J0ICogYXMgYXZtTW9kdWxlIGZyb20gJy4vdmlld19tYW5hZ2VyJztcbmltcG9ydCB7RWxlbWVudFJlZiwgRWxlbWVudFJlZl99IGZyb20gJy4vZWxlbWVudF9yZWYnO1xuaW1wb3J0IHtUZW1wbGF0ZVJlZiwgVGVtcGxhdGVSZWZffSBmcm9tICcuL3RlbXBsYXRlX3JlZic7XG5pbXBvcnQge1JlbmRlcmVyLCBSZW5kZXJWaWV3V2l0aEZyYWdtZW50c30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL2FwaSc7XG5pbXBvcnQge0xvY2Fsc30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7UGlwZXN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3BpcGVzL3BpcGVzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFwcFZpZXdNYW5hZ2VyVXRpbHMge1xuICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgZ2V0Q29tcG9uZW50SW5zdGFuY2UocGFyZW50Vmlldzogdmlld01vZHVsZS5BcHBWaWV3LCBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICB2YXIgZWxpID0gcGFyZW50Vmlldy5lbGVtZW50SW5qZWN0b3JzW2JvdW5kRWxlbWVudEluZGV4XTtcbiAgICByZXR1cm4gZWxpLmdldENvbXBvbmVudCgpO1xuICB9XG5cbiAgY3JlYXRlVmlldyhtZXJnZWRQYXJlbnRWaWV3UHJvdG86IHZpZXdNb2R1bGUuQXBwUHJvdG9WaWV3LFxuICAgICAgICAgICAgIHJlbmRlclZpZXdXaXRoRnJhZ21lbnRzOiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyxcbiAgICAgICAgICAgICB2aWV3TWFuYWdlcjogYXZtTW9kdWxlLkFwcFZpZXdNYW5hZ2VyLCByZW5kZXJlcjogUmVuZGVyZXIpOiB2aWV3TW9kdWxlLkFwcFZpZXcge1xuICAgIHZhciByZW5kZXJGcmFnbWVudHMgPSByZW5kZXJWaWV3V2l0aEZyYWdtZW50cy5mcmFnbWVudFJlZnM7XG4gICAgdmFyIHJlbmRlclZpZXcgPSByZW5kZXJWaWV3V2l0aEZyYWdtZW50cy52aWV3UmVmO1xuXG4gICAgdmFyIGVsZW1lbnRDb3VudCA9IG1lcmdlZFBhcmVudFZpZXdQcm90by5tZXJnZUluZm8uZWxlbWVudENvdW50O1xuICAgIHZhciB2aWV3Q291bnQgPSBtZXJnZWRQYXJlbnRWaWV3UHJvdG8ubWVyZ2VJbmZvLnZpZXdDb3VudDtcbiAgICB2YXIgZWxlbWVudFJlZnM6IEVsZW1lbnRSZWZbXSA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShlbGVtZW50Q291bnQpO1xuICAgIHZhciB2aWV3Q29udGFpbmVycyA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShlbGVtZW50Q291bnQpO1xuICAgIHZhciBwcmVCdWlsdE9iamVjdHM6IGVsaS5QcmVCdWlsdE9iamVjdHNbXSA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShlbGVtZW50Q291bnQpO1xuICAgIHZhciBlbGVtZW50SW5qZWN0b3JzOiBlbGkuRWxlbWVudEluamVjdG9yW10gPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUoZWxlbWVudENvdW50KTtcbiAgICB2YXIgdmlld3MgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUodmlld0NvdW50KTtcblxuICAgIHZhciBlbGVtZW50T2Zmc2V0ID0gMDtcbiAgICB2YXIgdGV4dE9mZnNldCA9IDA7XG4gICAgdmFyIGZyYWdtZW50SWR4ID0gMDtcbiAgICB2YXIgY29udGFpbmVyRWxlbWVudEluZGljZXNCeVZpZXdJbmRleDogbnVtYmVyW10gPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUodmlld0NvdW50KTtcbiAgICBmb3IgKHZhciB2aWV3T2Zmc2V0ID0gMDsgdmlld09mZnNldCA8IHZpZXdDb3VudDsgdmlld09mZnNldCsrKSB7XG4gICAgICB2YXIgY29udGFpbmVyRWxlbWVudEluZGV4ID0gY29udGFpbmVyRWxlbWVudEluZGljZXNCeVZpZXdJbmRleFt2aWV3T2Zmc2V0XTtcbiAgICAgIHZhciBjb250YWluZXJFbGVtZW50SW5qZWN0b3IgPVxuICAgICAgICAgIGlzUHJlc2VudChjb250YWluZXJFbGVtZW50SW5kZXgpID8gZWxlbWVudEluamVjdG9yc1tjb250YWluZXJFbGVtZW50SW5kZXhdIDogbnVsbDtcbiAgICAgIHZhciBwYXJlbnRWaWV3ID1cbiAgICAgICAgICBpc1ByZXNlbnQoY29udGFpbmVyRWxlbWVudEluamVjdG9yKSA/IHByZUJ1aWx0T2JqZWN0c1tjb250YWluZXJFbGVtZW50SW5kZXhdLnZpZXcgOiBudWxsO1xuICAgICAgdmFyIHByb3RvVmlldyA9XG4gICAgICAgICAgaXNQcmVzZW50KGNvbnRhaW5lckVsZW1lbnRJbmRleCkgP1xuICAgICAgICAgICAgICBwYXJlbnRWaWV3LnByb3RvLmVsZW1lbnRCaW5kZXJzW2NvbnRhaW5lckVsZW1lbnRJbmRleCAtIHBhcmVudFZpZXcuZWxlbWVudE9mZnNldF1cbiAgICAgICAgICAgICAgICAgIC5uZXN0ZWRQcm90b1ZpZXcgOlxuICAgICAgICAgICAgICBtZXJnZWRQYXJlbnRWaWV3UHJvdG87XG4gICAgICB2YXIgcmVuZGVyRnJhZ21lbnQgPSBudWxsO1xuICAgICAgaWYgKHZpZXdPZmZzZXQgPT09IDAgfHwgcHJvdG9WaWV3LnR5cGUgPT09IHZpZXdNb2R1bGUuVmlld1R5cGUuRU1CRURERUQpIHtcbiAgICAgICAgcmVuZGVyRnJhZ21lbnQgPSByZW5kZXJGcmFnbWVudHNbZnJhZ21lbnRJZHgrK107XG4gICAgICB9XG4gICAgICB2YXIgY3VycmVudFZpZXcgPSBuZXcgdmlld01vZHVsZS5BcHBWaWV3KHJlbmRlcmVyLCBwcm90b1ZpZXcsIHZpZXdPZmZzZXQsIGVsZW1lbnRPZmZzZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRPZmZzZXQsIHByb3RvVmlldy5wcm90b0xvY2FscywgcmVuZGVyVmlldyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyRnJhZ21lbnQsIGNvbnRhaW5lckVsZW1lbnRJbmplY3Rvcik7XG4gICAgICB2aWV3c1t2aWV3T2Zmc2V0XSA9IGN1cnJlbnRWaWV3O1xuICAgICAgaWYgKGlzUHJlc2VudChjb250YWluZXJFbGVtZW50SW5kZXgpKSB7XG4gICAgICAgIHByZUJ1aWx0T2JqZWN0c1tjb250YWluZXJFbGVtZW50SW5kZXhdLm5lc3RlZFZpZXcgPSBjdXJyZW50VmlldztcbiAgICAgIH1cbiAgICAgIHZhciByb290RWxlbWVudEluamVjdG9ycyA9IFtdO1xuICAgICAgdmFyIG5lc3RlZFZpZXdPZmZzZXQgPSB2aWV3T2Zmc2V0ICsgMTtcbiAgICAgIGZvciAodmFyIGJpbmRlcklkeCA9IDA7IGJpbmRlcklkeCA8IHByb3RvVmlldy5lbGVtZW50QmluZGVycy5sZW5ndGg7IGJpbmRlcklkeCsrKSB7XG4gICAgICAgIHZhciBiaW5kZXIgPSBwcm90b1ZpZXcuZWxlbWVudEJpbmRlcnNbYmluZGVySWR4XTtcbiAgICAgICAgdmFyIGJvdW5kRWxlbWVudEluZGV4ID0gZWxlbWVudE9mZnNldCArIGJpbmRlcklkeDtcbiAgICAgICAgdmFyIGVsZW1lbnRJbmplY3RvciA9IG51bGw7XG5cbiAgICAgICAgaWYgKGlzUHJlc2VudChiaW5kZXIubmVzdGVkUHJvdG9WaWV3KSAmJiBiaW5kZXIubmVzdGVkUHJvdG9WaWV3LmlzTWVyZ2FibGUpIHtcbiAgICAgICAgICBjb250YWluZXJFbGVtZW50SW5kaWNlc0J5Vmlld0luZGV4W25lc3RlZFZpZXdPZmZzZXRdID0gYm91bmRFbGVtZW50SW5kZXg7XG4gICAgICAgICAgbmVzdGVkVmlld09mZnNldCArPSBiaW5kZXIubmVzdGVkUHJvdG9WaWV3Lm1lcmdlSW5mby52aWV3Q291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBlbGVtZW50SW5qZWN0b3JzIGFuZCByb290RWxlbWVudEluamVjdG9yc1xuICAgICAgICB2YXIgcHJvdG9FbGVtZW50SW5qZWN0b3IgPSBiaW5kZXIucHJvdG9FbGVtZW50SW5qZWN0b3I7XG4gICAgICAgIGlmIChpc1ByZXNlbnQocHJvdG9FbGVtZW50SW5qZWN0b3IpKSB7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChwcm90b0VsZW1lbnRJbmplY3Rvci5wYXJlbnQpKSB7XG4gICAgICAgICAgICB2YXIgcGFyZW50RWxlbWVudEluamVjdG9yID1cbiAgICAgICAgICAgICAgICBlbGVtZW50SW5qZWN0b3JzW2VsZW1lbnRPZmZzZXQgKyBwcm90b0VsZW1lbnRJbmplY3Rvci5wYXJlbnQuaW5kZXhdO1xuICAgICAgICAgICAgZWxlbWVudEluamVjdG9yID0gcHJvdG9FbGVtZW50SW5qZWN0b3IuaW5zdGFudGlhdGUocGFyZW50RWxlbWVudEluamVjdG9yKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZWxlbWVudEluamVjdG9yID0gcHJvdG9FbGVtZW50SW5qZWN0b3IuaW5zdGFudGlhdGUobnVsbCk7XG4gICAgICAgICAgICByb290RWxlbWVudEluamVjdG9ycy5wdXNoKGVsZW1lbnRJbmplY3Rvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsZW1lbnRJbmplY3RvcnNbYm91bmRFbGVtZW50SW5kZXhdID0gZWxlbWVudEluamVjdG9yO1xuXG4gICAgICAgIC8vIGVsZW1lbnRSZWZzXG4gICAgICAgIHZhciBlbCA9IG5ldyBFbGVtZW50UmVmXyhjdXJyZW50Vmlldy5yZWYsIGJvdW5kRWxlbWVudEluZGV4LCByZW5kZXJlcik7XG4gICAgICAgIGVsZW1lbnRSZWZzW2VsLmJvdW5kRWxlbWVudEluZGV4XSA9IGVsO1xuXG4gICAgICAgIC8vIHByZUJ1aWx0T2JqZWN0c1xuICAgICAgICBpZiAoaXNQcmVzZW50KGVsZW1lbnRJbmplY3RvcikpIHtcbiAgICAgICAgICB2YXIgdGVtcGxhdGVSZWYgPSBpc1ByZXNlbnQoYmluZGVyLm5lc3RlZFByb3RvVmlldykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpbmRlci5uZXN0ZWRQcm90b1ZpZXcudHlwZSA9PT0gdmlld01vZHVsZS5WaWV3VHlwZS5FTUJFRERFRCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBUZW1wbGF0ZVJlZl8oZWwpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDtcbiAgICAgICAgICBwcmVCdWlsdE9iamVjdHNbYm91bmRFbGVtZW50SW5kZXhdID1cbiAgICAgICAgICAgICAgbmV3IGVsaS5QcmVCdWlsdE9iamVjdHModmlld01hbmFnZXIsIGN1cnJlbnRWaWV3LCBlbCwgdGVtcGxhdGVSZWYpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdXJyZW50Vmlldy5pbml0KHByb3RvVmlldy5jaGFuZ2VEZXRlY3RvckZhY3RvcnkoY3VycmVudFZpZXcpLCBlbGVtZW50SW5qZWN0b3JzLFxuICAgICAgICAgICAgICAgICAgICAgICByb290RWxlbWVudEluamVjdG9ycywgcHJlQnVpbHRPYmplY3RzLCB2aWV3cywgZWxlbWVudFJlZnMsIHZpZXdDb250YWluZXJzKTtcbiAgICAgIGlmIChpc1ByZXNlbnQocGFyZW50VmlldykgJiYgcHJvdG9WaWV3LnR5cGUgPT09IHZpZXdNb2R1bGUuVmlld1R5cGUuQ09NUE9ORU5UKSB7XG4gICAgICAgIHBhcmVudFZpZXcuY2hhbmdlRGV0ZWN0b3IuYWRkVmlld0NoaWxkKGN1cnJlbnRWaWV3LmNoYW5nZURldGVjdG9yKTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnRPZmZzZXQgKz0gcHJvdG9WaWV3LmVsZW1lbnRCaW5kZXJzLmxlbmd0aDtcbiAgICAgIHRleHRPZmZzZXQgKz0gcHJvdG9WaWV3LnRleHRCaW5kaW5nQ291bnQ7XG4gICAgfVxuICAgIHJldHVybiB2aWV3c1swXTtcbiAgfVxuXG4gIGh5ZHJhdGVSb290SG9zdFZpZXcoaG9zdFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgdGhpcy5faHlkcmF0ZVZpZXcoaG9zdFZpZXcsIGluamVjdG9yLCBudWxsLCBuZXcgT2JqZWN0KCksIG51bGwpO1xuICB9XG5cbiAgLy8gTWlzbm9tZXI6IHRoaXMgbWV0aG9kIGlzIGF0dGFjaGluZyBuZXh0IHRvIHRoZSB2aWV3IGNvbnRhaW5lci5cbiAgYXR0YWNoVmlld0luQ29udGFpbmVyKHBhcmVudFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgYm91bmRFbGVtZW50SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRWaWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcsIGNvbnRleHRCb3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG51bWJlciwgdmlldzogdmlld01vZHVsZS5BcHBWaWV3KSB7XG4gICAgaWYgKGlzQmxhbmsoY29udGV4dFZpZXcpKSB7XG4gICAgICBjb250ZXh0VmlldyA9IHBhcmVudFZpZXc7XG4gICAgICBjb250ZXh0Qm91bmRFbGVtZW50SW5kZXggPSBib3VuZEVsZW1lbnRJbmRleDtcbiAgICB9XG4gICAgcGFyZW50Vmlldy5jaGFuZ2VEZXRlY3Rvci5hZGRDb250ZW50Q2hpbGQodmlldy5jaGFuZ2VEZXRlY3Rvcik7XG4gICAgdmFyIHZpZXdDb250YWluZXIgPSBwYXJlbnRWaWV3LnZpZXdDb250YWluZXJzW2JvdW5kRWxlbWVudEluZGV4XTtcbiAgICBpZiAoaXNCbGFuayh2aWV3Q29udGFpbmVyKSkge1xuICAgICAgdmlld0NvbnRhaW5lciA9IG5ldyB2aWV3TW9kdWxlLkFwcFZpZXdDb250YWluZXIoKTtcbiAgICAgIHBhcmVudFZpZXcudmlld0NvbnRhaW5lcnNbYm91bmRFbGVtZW50SW5kZXhdID0gdmlld0NvbnRhaW5lcjtcbiAgICB9XG4gICAgTGlzdFdyYXBwZXIuaW5zZXJ0KHZpZXdDb250YWluZXIudmlld3MsIGluZGV4LCB2aWV3KTtcbiAgICB2YXIgZWxlbWVudEluamVjdG9yID0gY29udGV4dFZpZXcuZWxlbWVudEluamVjdG9yc1tjb250ZXh0Qm91bmRFbGVtZW50SW5kZXhdO1xuXG4gICAgZm9yICh2YXIgaSA9IHZpZXcucm9vdEVsZW1lbnRJbmplY3RvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIGlmIChpc1ByZXNlbnQoZWxlbWVudEluamVjdG9yLnBhcmVudCkpIHtcbiAgICAgICAgdmlldy5yb290RWxlbWVudEluamVjdG9yc1tpXS5saW5rKGVsZW1lbnRJbmplY3Rvci5wYXJlbnQpO1xuICAgICAgfVxuICAgIH1cbiAgICBlbGVtZW50SW5qZWN0b3IudHJhdmVyc2VBbmRTZXRRdWVyaWVzQXNEaXJ0eSgpO1xuICB9XG5cbiAgZGV0YWNoVmlld0luQ29udGFpbmVyKHBhcmVudFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgaW5kZXg6IG51bWJlcikge1xuICAgIHZhciB2aWV3Q29udGFpbmVyID0gcGFyZW50Vmlldy52aWV3Q29udGFpbmVyc1tib3VuZEVsZW1lbnRJbmRleF07XG4gICAgdmFyIHZpZXcgPSB2aWV3Q29udGFpbmVyLnZpZXdzW2luZGV4XTtcblxuICAgIHBhcmVudFZpZXcuZWxlbWVudEluamVjdG9yc1tib3VuZEVsZW1lbnRJbmRleF0udHJhdmVyc2VBbmRTZXRRdWVyaWVzQXNEaXJ0eSgpO1xuXG4gICAgdmlldy5jaGFuZ2VEZXRlY3Rvci5yZW1vdmUoKTtcbiAgICBMaXN0V3JhcHBlci5yZW1vdmVBdCh2aWV3Q29udGFpbmVyLnZpZXdzLCBpbmRleCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3LnJvb3RFbGVtZW50SW5qZWN0b3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgaW5qID0gdmlldy5yb290RWxlbWVudEluamVjdG9yc1tpXTtcbiAgICAgIGluai51bmxpbmsoKTtcbiAgICB9XG4gIH1cblxuXG4gIGh5ZHJhdGVWaWV3SW5Db250YWluZXIocGFyZW50Vmlldzogdmlld01vZHVsZS5BcHBWaWV3LCBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRWaWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcsIGNvbnRleHRCb3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4OiBudW1iZXIsIGltcGVyYXRpdmVseUNyZWF0ZWRQcm92aWRlcnM6IFJlc29sdmVkUHJvdmlkZXJbXSkge1xuICAgIGlmIChpc0JsYW5rKGNvbnRleHRWaWV3KSkge1xuICAgICAgY29udGV4dFZpZXcgPSBwYXJlbnRWaWV3O1xuICAgICAgY29udGV4dEJvdW5kRWxlbWVudEluZGV4ID0gYm91bmRFbGVtZW50SW5kZXg7XG4gICAgfVxuICAgIHZhciB2aWV3Q29udGFpbmVyID0gcGFyZW50Vmlldy52aWV3Q29udGFpbmVyc1tib3VuZEVsZW1lbnRJbmRleF07XG4gICAgdmFyIHZpZXcgPSB2aWV3Q29udGFpbmVyLnZpZXdzW2luZGV4XTtcbiAgICB2YXIgZWxlbWVudEluamVjdG9yID0gY29udGV4dFZpZXcuZWxlbWVudEluamVjdG9yc1tjb250ZXh0Qm91bmRFbGVtZW50SW5kZXhdO1xuXG4gICAgdmFyIGluamVjdG9yID0gaXNQcmVzZW50KGltcGVyYXRpdmVseUNyZWF0ZWRQcm92aWRlcnMpID9cbiAgICAgICAgICAgICAgICAgICAgICAgSW5qZWN0b3IuZnJvbVJlc29sdmVkUHJvdmlkZXJzKGltcGVyYXRpdmVseUNyZWF0ZWRQcm92aWRlcnMpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgbnVsbDtcbiAgICB0aGlzLl9oeWRyYXRlVmlldyh2aWV3LCBpbmplY3RvciwgZWxlbWVudEluamVjdG9yLmdldEhvc3QoKSwgY29udGV4dFZpZXcuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Vmlldy5sb2NhbHMpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaHlkcmF0ZVZpZXcoaW5pdFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgIGhvc3RFbGVtZW50SW5qZWN0b3I6IGVsaS5FbGVtZW50SW5qZWN0b3IsIGNvbnRleHQ6IE9iamVjdCwgcGFyZW50TG9jYWxzOiBMb2NhbHMpIHtcbiAgICB2YXIgdmlld0lkeCA9IGluaXRWaWV3LnZpZXdPZmZzZXQ7XG4gICAgdmFyIGVuZFZpZXdPZmZzZXQgPSB2aWV3SWR4ICsgaW5pdFZpZXcucHJvdG8ubWVyZ2VJbmZvLnZpZXdDb3VudCAtIDE7XG4gICAgd2hpbGUgKHZpZXdJZHggPD0gZW5kVmlld09mZnNldCkge1xuICAgICAgdmFyIGN1cnJWaWV3ID0gaW5pdFZpZXcudmlld3Nbdmlld0lkeF07XG4gICAgICB2YXIgY3VyclByb3RvVmlldyA9IGN1cnJWaWV3LnByb3RvO1xuICAgICAgaWYgKGN1cnJWaWV3ICE9PSBpbml0VmlldyAmJiBjdXJyVmlldy5wcm90by50eXBlID09PSB2aWV3TW9kdWxlLlZpZXdUeXBlLkVNQkVEREVEKSB7XG4gICAgICAgIC8vIERvbid0IGh5ZHJhdGUgY29tcG9uZW50cyBvZiBlbWJlZGRlZCBmcmFnbWVudCB2aWV3cy5cbiAgICAgICAgdmlld0lkeCArPSBjdXJyVmlldy5wcm90by5tZXJnZUluZm8udmlld0NvdW50O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGN1cnJWaWV3ICE9PSBpbml0Vmlldykge1xuICAgICAgICAgIC8vIGh5ZHJhdGUgYSBuZXN0ZWQgY29tcG9uZW50IHZpZXdcbiAgICAgICAgICBpbXBlcmF0aXZlbHlDcmVhdGVkSW5qZWN0b3IgPSBudWxsO1xuICAgICAgICAgIHBhcmVudExvY2FscyA9IG51bGw7XG4gICAgICAgICAgaG9zdEVsZW1lbnRJbmplY3RvciA9IGN1cnJWaWV3LmNvbnRhaW5lckVsZW1lbnRJbmplY3RvcjtcbiAgICAgICAgICBjb250ZXh0ID0gaG9zdEVsZW1lbnRJbmplY3Rvci5nZXRDb21wb25lbnQoKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyVmlldy5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgY3VyclZpZXcubG9jYWxzLnBhcmVudCA9IHBhcmVudExvY2FscztcbiAgICAgICAgdmFyIGJpbmRlcnMgPSBjdXJyUHJvdG9WaWV3LmVsZW1lbnRCaW5kZXJzO1xuICAgICAgICBmb3IgKHZhciBiaW5kZXJJZHggPSAwOyBiaW5kZXJJZHggPCBiaW5kZXJzLmxlbmd0aDsgYmluZGVySWR4KyspIHtcbiAgICAgICAgICB2YXIgYm91bmRFbGVtZW50SW5kZXggPSBiaW5kZXJJZHggKyBjdXJyVmlldy5lbGVtZW50T2Zmc2V0O1xuICAgICAgICAgIHZhciBlbGVtZW50SW5qZWN0b3IgPSBpbml0Vmlldy5lbGVtZW50SW5qZWN0b3JzW2JvdW5kRWxlbWVudEluZGV4XTtcblxuICAgICAgICAgIGlmIChpc1ByZXNlbnQoZWxlbWVudEluamVjdG9yKSkge1xuICAgICAgICAgICAgZWxlbWVudEluamVjdG9yLmh5ZHJhdGUoaW1wZXJhdGl2ZWx5Q3JlYXRlZEluamVjdG9yLCBob3N0RWxlbWVudEluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyclZpZXcucHJlQnVpbHRPYmplY3RzW2JvdW5kRWxlbWVudEluZGV4XSk7XG4gICAgICAgICAgICB0aGlzLl9wb3B1bGF0ZVZpZXdMb2NhbHMoY3VyclZpZXcsIGVsZW1lbnRJbmplY3RvciwgYm91bmRFbGVtZW50SW5kZXgpO1xuICAgICAgICAgICAgdGhpcy5fc2V0VXBFdmVudEVtaXR0ZXJzKGN1cnJWaWV3LCBlbGVtZW50SW5qZWN0b3IsIGJvdW5kRWxlbWVudEluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBpcGVzID0gaXNQcmVzZW50KGhvc3RFbGVtZW50SW5qZWN0b3IpID9cbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQaXBlcyhjdXJyVmlldy5wcm90by5waXBlcywgaG9zdEVsZW1lbnRJbmplY3Rvci5nZXRJbmplY3RvcigpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsO1xuICAgICAgICBjdXJyVmlldy5jaGFuZ2VEZXRlY3Rvci5oeWRyYXRlKGN1cnJWaWV3LmNvbnRleHQsIGN1cnJWaWV3LmxvY2FscywgY3VyclZpZXcsIHBpcGVzKTtcbiAgICAgICAgdmlld0lkeCsrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3BvcHVsYXRlVmlld0xvY2Fscyh2aWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcsIGVsZW1lbnRJbmplY3RvcjogZWxpLkVsZW1lbnRJbmplY3RvcixcbiAgICAgICAgICAgICAgICAgICAgICBib3VuZEVsZW1lbnRJZHg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChpc1ByZXNlbnQoZWxlbWVudEluamVjdG9yLmdldERpcmVjdGl2ZVZhcmlhYmxlQmluZGluZ3MoKSkpIHtcbiAgICAgIGVsZW1lbnRJbmplY3Rvci5nZXREaXJlY3RpdmVWYXJpYWJsZUJpbmRpbmdzKCkuZm9yRWFjaCgoZGlyZWN0aXZlSW5kZXgsIG5hbWUpID0+IHtcbiAgICAgICAgaWYgKGlzQmxhbmsoZGlyZWN0aXZlSW5kZXgpKSB7XG4gICAgICAgICAgdmlldy5sb2NhbHMuc2V0KG5hbWUsIHZpZXcuZWxlbWVudFJlZnNbYm91bmRFbGVtZW50SWR4XS5uYXRpdmVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2aWV3LmxvY2Fscy5zZXQobmFtZSwgZWxlbWVudEluamVjdG9yLmdldERpcmVjdGl2ZUF0SW5kZXgoZGlyZWN0aXZlSW5kZXgpKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc2V0VXBFdmVudEVtaXR0ZXJzKHZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldywgZWxlbWVudEluamVjdG9yOiBlbGkuRWxlbWVudEluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgIGJvdW5kRWxlbWVudEluZGV4OiBudW1iZXIpIHtcbiAgICB2YXIgZW1pdHRlcnMgPSBlbGVtZW50SW5qZWN0b3IuZ2V0RXZlbnRFbWl0dGVyQWNjZXNzb3JzKCk7XG4gICAgZm9yICh2YXIgZGlyZWN0aXZlSW5kZXggPSAwOyBkaXJlY3RpdmVJbmRleCA8IGVtaXR0ZXJzLmxlbmd0aDsgKytkaXJlY3RpdmVJbmRleCkge1xuICAgICAgdmFyIGRpcmVjdGl2ZUVtaXR0ZXJzID0gZW1pdHRlcnNbZGlyZWN0aXZlSW5kZXhdO1xuICAgICAgdmFyIGRpcmVjdGl2ZSA9IGVsZW1lbnRJbmplY3Rvci5nZXREaXJlY3RpdmVBdEluZGV4KGRpcmVjdGl2ZUluZGV4KTtcblxuICAgICAgZm9yICh2YXIgZXZlbnRJbmRleCA9IDA7IGV2ZW50SW5kZXggPCBkaXJlY3RpdmVFbWl0dGVycy5sZW5ndGg7ICsrZXZlbnRJbmRleCkge1xuICAgICAgICB2YXIgZXZlbnRFbWl0dGVyQWNjZXNzb3IgPSBkaXJlY3RpdmVFbWl0dGVyc1tldmVudEluZGV4XTtcbiAgICAgICAgZXZlbnRFbWl0dGVyQWNjZXNzb3Iuc3Vic2NyaWJlKHZpZXcsIGJvdW5kRWxlbWVudEluZGV4LCBkaXJlY3RpdmUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGRlaHlkcmF0ZVZpZXcoaW5pdFZpZXc6IHZpZXdNb2R1bGUuQXBwVmlldykge1xuICAgIHZhciBlbmRWaWV3T2Zmc2V0ID0gaW5pdFZpZXcudmlld09mZnNldCArIGluaXRWaWV3LnByb3RvLm1lcmdlSW5mby52aWV3Q291bnQgLSAxO1xuICAgIGZvciAodmFyIHZpZXdJZHggPSBpbml0Vmlldy52aWV3T2Zmc2V0OyB2aWV3SWR4IDw9IGVuZFZpZXdPZmZzZXQ7IHZpZXdJZHgrKykge1xuICAgICAgdmFyIGN1cnJWaWV3ID0gaW5pdFZpZXcudmlld3Nbdmlld0lkeF07XG4gICAgICBpZiAoY3VyclZpZXcuaHlkcmF0ZWQoKSkge1xuICAgICAgICBpZiAoaXNQcmVzZW50KGN1cnJWaWV3LmxvY2FscykpIHtcbiAgICAgICAgICBjdXJyVmlldy5sb2NhbHMuY2xlYXJWYWx1ZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBjdXJyVmlldy5jb250ZXh0ID0gbnVsbDtcbiAgICAgICAgY3VyclZpZXcuY2hhbmdlRGV0ZWN0b3IuZGVoeWRyYXRlKCk7XG4gICAgICAgIHZhciBiaW5kZXJzID0gY3VyclZpZXcucHJvdG8uZWxlbWVudEJpbmRlcnM7XG4gICAgICAgIGZvciAodmFyIGJpbmRlcklkeCA9IDA7IGJpbmRlcklkeCA8IGJpbmRlcnMubGVuZ3RoOyBiaW5kZXJJZHgrKykge1xuICAgICAgICAgIHZhciBlbGkgPSBpbml0Vmlldy5lbGVtZW50SW5qZWN0b3JzW2N1cnJWaWV3LmVsZW1lbnRPZmZzZXQgKyBiaW5kZXJJZHhdO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoZWxpKSkge1xuICAgICAgICAgICAgZWxpLmRlaHlkcmF0ZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfbWFuYWdlcl91dGlscy50c1xuICoqLyIsImltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgdW5pbXBsZW1lbnRlZH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7Vmlld1JlZiwgVmlld1JlZl99IGZyb20gJy4vdmlld19yZWYnO1xuaW1wb3J0IHtSZW5kZXJWaWV3UmVmLCBSZW5kZXJFbGVtZW50UmVmLCBSZW5kZXJlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL2FwaSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGxvY2F0aW9uIGluIGEgVmlldyB0aGF0IGhhcyBhbiBpbmplY3Rpb24sIGNoYW5nZS1kZXRlY3Rpb24gYW5kIHJlbmRlciBjb250ZXh0XG4gKiBhc3NvY2lhdGVkIHdpdGggaXQuXG4gKlxuICogQW4gYEVsZW1lbnRSZWZgIGlzIGNyZWF0ZWQgZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgVGVtcGxhdGUgdGhhdCBjb250YWlucyBhIERpcmVjdGl2ZSwgQ29tcG9uZW50XG4gKiBvciBkYXRhLWJpbmRpbmcuXG4gKlxuICogQW4gYEVsZW1lbnRSZWZgIGlzIGJhY2tlZCBieSBhIHJlbmRlci1zcGVjaWZpYyBlbGVtZW50LiBJbiB0aGUgYnJvd3NlciwgdGhpcyBpcyB1c3VhbGx5IGEgRE9NXG4gKiBlbGVtZW50LlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRWxlbWVudFJlZiBpbXBsZW1lbnRzIFJlbmRlckVsZW1lbnRSZWYge1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUge0BsaW5rIFZpZXdSZWZ9IHRoYXQgdGhpcyBgRWxlbWVudFJlZmAgaXMgcGFydCBvZi5cbiAgICovXG4gIHBhcmVudFZpZXc6IFZpZXdSZWY7XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKlxuICAgKiBJbmRleCBvZiB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIHtAbGluayBWaWV3UmVmfS5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VkIGludGVybmFsbHkgYnkgdGhlIEFuZ3VsYXIgZnJhbWV3b3JrIHRvIGxvY2F0ZSBlbGVtZW50cy5cbiAgICovXG4gIGJvdW5kRWxlbWVudEluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBlbGVtZW50IG9yIGBudWxsYCBpZiBkaXJlY3QgYWNjZXNzIHRvIG5hdGl2ZSBlbGVtZW50cyBpcyBub3Qgc3VwcG9ydGVkXG4gICAqIChlLmcuIHdoZW4gdGhlIGFwcGxpY2F0aW9uIHJ1bnMgaW4gYSB3ZWIgd29ya2VyKS5cbiAgICpcbiAgICogPGRpdiBjbGFzcz1cImNhbGxvdXQgaXMtY3JpdGljYWxcIj5cbiAgICogICA8aGVhZGVyPlVzZSB3aXRoIGNhdXRpb248L2hlYWRlcj5cbiAgICogICA8cD5cbiAgICogICAgVXNlIHRoaXMgQVBJIGFzIHRoZSBsYXN0IHJlc29ydCB3aGVuIGRpcmVjdCBhY2Nlc3MgdG8gRE9NIGlzIG5lZWRlZC4gVXNlIHRlbXBsYXRpbmcgYW5kXG4gICAqICAgIGRhdGEtYmluZGluZyBwcm92aWRlZCBieSBBbmd1bGFyIGluc3RlYWQuIEFsdGVybmF0aXZlbHkgeW91IHRha2UgYSBsb29rIGF0IHtAbGluayBSZW5kZXJlcn1cbiAgICogICAgd2hpY2ggcHJvdmlkZXMgQVBJIHRoYXQgY2FuIHNhZmVseSBiZSB1c2VkIGV2ZW4gd2hlbiBkaXJlY3QgYWNjZXNzIHRvIG5hdGl2ZSBlbGVtZW50cyBpcyBub3RcbiAgICogICAgc3VwcG9ydGVkLlxuICAgKiAgIDwvcD5cbiAgICogICA8cD5cbiAgICogICAgUmVseWluZyBvbiBkaXJlY3QgRE9NIGFjY2VzcyBjcmVhdGVzIHRpZ2h0IGNvdXBsaW5nIGJldHdlZW4geW91ciBhcHBsaWNhdGlvbiBhbmQgcmVuZGVyaW5nXG4gICAqICAgIGxheWVycyB3aGljaCB3aWxsIG1ha2UgaXQgaW1wb3NzaWJsZSB0byBzZXBhcmF0ZSB0aGUgdHdvIGFuZCBkZXBsb3kgeW91ciBhcHBsaWNhdGlvbiBpbnRvIGFcbiAgICogICAgd2ViIHdvcmtlci5cbiAgICogICA8L3A+XG4gICAqIDwvZGl2PlxuICAgKi9cbiAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogYW55IHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICBnZXQgcmVuZGVyVmlldygpOiBSZW5kZXJWaWV3UmVmIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgRWxlbWVudFJlZl8gZXh0ZW5kcyBFbGVtZW50UmVmIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhcmVudFZpZXc6IFZpZXdSZWYsXG5cbiAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAqIEluZGV4IG9mIHRoZSBlbGVtZW50IGluc2lkZSB0aGUge0BsaW5rIFZpZXdSZWZ9LlxuICAgICAgICAgICAgICAgKlxuICAgICAgICAgICAgICAgKiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgQW5ndWxhciBmcmFtZXdvcmsgdG8gbG9jYXRlIGVsZW1lbnRzLlxuICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgcHVibGljIGJvdW5kRWxlbWVudEluZGV4OiBudW1iZXIsIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBnZXQgcmVuZGVyVmlldygpOiBSZW5kZXJWaWV3UmVmIHsgcmV0dXJuICg8Vmlld1JlZl8+dGhpcy5wYXJlbnRWaWV3KS5yZW5kZXI7IH1cbiAgc2V0IHJlbmRlclZpZXcodmFsdWUpIHsgdW5pbXBsZW1lbnRlZCgpOyB9XG4gIGdldCBuYXRpdmVFbGVtZW50KCk6IGFueSB7IHJldHVybiB0aGlzLl9yZW5kZXJlci5nZXROYXRpdmVFbGVtZW50U3luYyh0aGlzKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2VsZW1lbnRfcmVmLnRzXG4gKiovIiwiaW1wb3J0IHtpbnRlcm5hbFZpZXcsIFByb3RvVmlld1JlZn0gZnJvbSAnLi92aWV3X3JlZic7XG5pbXBvcnQge0VsZW1lbnRSZWYsIEVsZW1lbnRSZWZffSBmcm9tICcuL2VsZW1lbnRfcmVmJztcbmltcG9ydCAqIGFzIHZpZXdNb2R1bGUgZnJvbSAnLi92aWV3JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGFuIEVtYmVkZGVkIFRlbXBsYXRlIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW5zdGFudGlhdGUgRW1iZWRkZWQgVmlld3MuXG4gKlxuICogWW91IGNhbiBhY2Nlc3MgYSBgVGVtcGxhdGVSZWZgLCBpbiB0d28gd2F5cy4gVmlhIGEgZGlyZWN0aXZlIHBsYWNlZCBvbiBhIGA8dGVtcGxhdGU+YCBlbGVtZW50IChvclxuICogZGlyZWN0aXZlIHByZWZpeGVkIHdpdGggYCpgKSBhbmQgaGF2ZSB0aGUgYFRlbXBsYXRlUmVmYCBmb3IgdGhpcyBFbWJlZGRlZCBWaWV3IGluamVjdGVkIGludG8gdGhlXG4gKiBjb25zdHJ1Y3RvciBvZiB0aGUgZGlyZWN0aXZlIHVzaW5nIHRoZSBgVGVtcGxhdGVSZWZgIFRva2VuLiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcXVlcnkgZm9yIHRoZVxuICogYFRlbXBsYXRlUmVmYCBmcm9tIGEgQ29tcG9uZW50IG9yIGEgRGlyZWN0aXZlIHZpYSB7QGxpbmsgUXVlcnl9LlxuICpcbiAqIFRvIGluc3RhbnRpYXRlIEVtYmVkZGVkIFZpZXdzIGJhc2VkIG9uIGEgVGVtcGxhdGUsIHVzZVxuICoge0BsaW5rIFZpZXdDb250YWluZXJSZWYjY3JlYXRlRW1iZWRkZWRWaWV3fSwgd2hpY2ggd2lsbCBjcmVhdGUgdGhlIFZpZXcgYW5kIGF0dGFjaCBpdCB0byB0aGVcbiAqIFZpZXcgQ29udGFpbmVyLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVGVtcGxhdGVSZWYge1xuICAvKipcbiAgICogVGhlIGxvY2F0aW9uIGluIHRoZSBWaWV3IHdoZXJlIHRoZSBFbWJlZGRlZCBWaWV3IGxvZ2ljYWxseSBiZWxvbmdzIHRvLlxuICAgKlxuICAgKiBUaGUgZGF0YS1iaW5kaW5nIGFuZCBpbmplY3Rpb24gY29udGV4dHMgb2YgRW1iZWRkZWQgVmlld3MgY3JlYXRlZCBmcm9tIHRoaXMgYFRlbXBsYXRlUmVmYFxuICAgKiBpbmhlcml0IGZyb20gdGhlIGNvbnRleHRzIG9mIHRoaXMgbG9jYXRpb24uXG4gICAqXG4gICAqIFR5cGljYWxseSBuZXcgRW1iZWRkZWQgVmlld3MgYXJlIGF0dGFjaGVkIHRvIHRoZSBWaWV3IENvbnRhaW5lciBvZiB0aGlzIGxvY2F0aW9uLCBidXQgaW5cbiAgICogYWR2YW5jZWQgdXNlLWNhc2VzLCB0aGUgVmlldyBjYW4gYmUgYXR0YWNoZWQgdG8gYSBkaWZmZXJlbnQgY29udGFpbmVyIHdoaWxlIGtlZXBpbmcgdGhlXG4gICAqIGRhdGEtYmluZGluZyBhbmQgaW5qZWN0aW9uIGNvbnRleHQgZnJvbSB0aGUgb3JpZ2luYWwgbG9jYXRpb24uXG4gICAqXG4gICAqL1xuICAvLyBUT0RPKGkpOiByZW5hbWUgdG8gYW5jaG9yIG9yIGxvY2F0aW9uXG4gIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWY7XG5cbiAgLyoqXG4gICAqIEFsbG93cyB5b3UgdG8gY2hlY2sgaWYgdGhpcyBFbWJlZGRlZCBUZW1wbGF0ZSBkZWZpbmVzIExvY2FsIFZhcmlhYmxlIHdpdGggbmFtZSBtYXRjaGluZyBgbmFtZWAuXG4gICAqL1xuICBhYnN0cmFjdCBoYXNMb2NhbChuYW1lOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVSZWZfIGV4dGVuZHMgVGVtcGxhdGVSZWYge1xuICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UHJvdG9WaWV3KCk6IHZpZXdNb2R1bGUuQXBwUHJvdG9WaWV3IHtcbiAgICBsZXQgZWxlbWVudFJlZiA9IDxFbGVtZW50UmVmXz50aGlzLmVsZW1lbnRSZWY7XG4gICAgdmFyIHBhcmVudFZpZXcgPSBpbnRlcm5hbFZpZXcoZWxlbWVudFJlZi5wYXJlbnRWaWV3KTtcbiAgICByZXR1cm4gcGFyZW50Vmlldy5wcm90by5lbGVtZW50QmluZGVyc1tlbGVtZW50UmVmLmJvdW5kRWxlbWVudEluZGV4IC0gcGFyZW50Vmlldy5lbGVtZW50T2Zmc2V0XVxuICAgICAgICAubmVzdGVkUHJvdG9WaWV3O1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZmVyZW5jZSB0byB0aGUgUHJvdG9WaWV3IHVzZWQgZm9yIGNyZWF0aW5nIEVtYmVkZGVkIFZpZXdzIHRoYXQgYXJlIGJhc2VkIG9uIHRoZSBjb21waWxlZFxuICAgKiBFbWJlZGRlZCBUZW1wbGF0ZS5cbiAgICovXG4gIGdldCBwcm90b1ZpZXdSZWYoKTogUHJvdG9WaWV3UmVmIHsgcmV0dXJuIHRoaXMuX2dldFByb3RvVmlldygpLnJlZjsgfVxuXG4gIGhhc0xvY2FsKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9nZXRQcm90b1ZpZXcoKS50ZW1wbGF0ZVZhcmlhYmxlQmluZGluZ3MuaGFzKG5hbWUpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdGVtcGxhdGVfcmVmLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9wYXF1ZVRva2VufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5cbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtNYXBXcmFwcGVyLCBNYXB9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCAqIGFzIHZpZXdNb2R1bGUgZnJvbSAnLi92aWV3JztcblxuZXhwb3J0IGNvbnN0IEFQUF9WSUVXX1BPT0xfQ0FQQUNJVFkgPSBDT05TVF9FWFBSKG5ldyBPcGFxdWVUb2tlbignQXBwVmlld1Bvb2wudmlld1Bvb2xDYXBhY2l0eScpKTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFwcFZpZXdQb29sIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcG9vbENhcGFjaXR5UGVyUHJvdG9WaWV3OiBudW1iZXI7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3Bvb2xlZFZpZXdzUGVyUHJvdG9WaWV3ID0gbmV3IE1hcDx2aWV3TW9kdWxlLkFwcFByb3RvVmlldywgQXJyYXk8dmlld01vZHVsZS5BcHBWaWV3Pj4oKTtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KEFQUF9WSUVXX1BPT0xfQ0FQQUNJVFkpIHBvb2xDYXBhY2l0eVBlclByb3RvVmlldykge1xuICAgIHRoaXMuX3Bvb2xDYXBhY2l0eVBlclByb3RvVmlldyA9IHBvb2xDYXBhY2l0eVBlclByb3RvVmlldztcbiAgfVxuXG4gIGdldFZpZXcocHJvdG9WaWV3OiB2aWV3TW9kdWxlLkFwcFByb3RvVmlldyk6IHZpZXdNb2R1bGUuQXBwVmlldyB7XG4gICAgdmFyIHBvb2xlZFZpZXdzID0gdGhpcy5fcG9vbGVkVmlld3NQZXJQcm90b1ZpZXcuZ2V0KHByb3RvVmlldyk7XG4gICAgaWYgKGlzUHJlc2VudChwb29sZWRWaWV3cykgJiYgcG9vbGVkVmlld3MubGVuZ3RoID4gMCkge1xuICAgICAgcmV0dXJuIHBvb2xlZFZpZXdzLnBvcCgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVyblZpZXcodmlldzogdmlld01vZHVsZS5BcHBWaWV3KTogYm9vbGVhbiB7XG4gICAgdmFyIHByb3RvVmlldyA9IHZpZXcucHJvdG87XG4gICAgdmFyIHBvb2xlZFZpZXdzID0gdGhpcy5fcG9vbGVkVmlld3NQZXJQcm90b1ZpZXcuZ2V0KHByb3RvVmlldyk7XG4gICAgaWYgKGlzQmxhbmsocG9vbGVkVmlld3MpKSB7XG4gICAgICBwb29sZWRWaWV3cyA9IFtdO1xuICAgICAgdGhpcy5fcG9vbGVkVmlld3NQZXJQcm90b1ZpZXcuc2V0KHByb3RvVmlldywgcG9vbGVkVmlld3MpO1xuICAgIH1cbiAgICB2YXIgaGF2ZVJlbWFpbmluZ0NhcGFjaXR5ID0gcG9vbGVkVmlld3MubGVuZ3RoIDwgdGhpcy5fcG9vbENhcGFjaXR5UGVyUHJvdG9WaWV3O1xuICAgIGlmIChoYXZlUmVtYWluaW5nQ2FwYWNpdHkpIHtcbiAgICAgIHBvb2xlZFZpZXdzLnB1c2godmlldyk7XG4gICAgfVxuICAgIHJldHVybiBoYXZlUmVtYWluaW5nQ2FwYWNpdHk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X3Bvb2wudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCAqIGFzIHZpZXdNb2R1bGUgZnJvbSAnLi92aWV3JztcblxuLyoqXG4gKiBMaXN0ZW5lciBmb3IgdmlldyBjcmVhdGlvbiAvIGRlc3RydWN0aW9uLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXBwVmlld0xpc3RlbmVyIHtcbiAgb25WaWV3Q3JlYXRlZCh2aWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcpIHt9XG4gIG9uVmlld0Rlc3Ryb3llZCh2aWV3OiB2aWV3TW9kdWxlLkFwcFZpZXcpIHt9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19saXN0ZW5lci50c1xuICoqLyIsImltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge3VuaW1wbGVtZW50ZWR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1Jlc29sdmVkUHJvdmlkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQgKiBhcyBhdm1Nb2R1bGUgZnJvbSAnLi92aWV3X21hbmFnZXInO1xuaW1wb3J0ICogYXMgdmlld01vZHVsZSBmcm9tICcuL3ZpZXcnO1xuXG5pbXBvcnQge0VsZW1lbnRSZWYsIEVsZW1lbnRSZWZffSBmcm9tICcuL2VsZW1lbnRfcmVmJztcbmltcG9ydCB7VGVtcGxhdGVSZWZ9IGZyb20gJy4vdGVtcGxhdGVfcmVmJztcbmltcG9ydCB7Vmlld1JlZiwgSG9zdFZpZXdSZWYsIFByb3RvVmlld1JlZiwgaW50ZXJuYWxWaWV3fSBmcm9tICcuL3ZpZXdfcmVmJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29udGFpbmVyIHdoZXJlIG9uZSBvciBtb3JlIFZpZXdzIGNhbiBiZSBhdHRhY2hlZC5cbiAqXG4gKiBUaGUgY29udGFpbmVyIGNhbiBjb250YWluIHR3byBraW5kcyBvZiBWaWV3cy4gSG9zdCBWaWV3cywgY3JlYXRlZCBieSBpbnN0YW50aWF0aW5nIGFcbiAqIHtAbGluayBDb21wb25lbnR9IHZpYSB7QGxpbmsgI2NyZWF0ZUhvc3RWaWV3fSwgYW5kIEVtYmVkZGVkIFZpZXdzLCBjcmVhdGVkIGJ5IGluc3RhbnRpYXRpbmcgYW5cbiAqIHtAbGluayBUZW1wbGF0ZVJlZiBFbWJlZGRlZCBUZW1wbGF0ZX0gdmlhIHtAbGluayAjY3JlYXRlRW1iZWRkZWRWaWV3fS5cbiAqXG4gKiBUaGUgbG9jYXRpb24gb2YgdGhlIFZpZXcgQ29udGFpbmVyIHdpdGhpbiB0aGUgY29udGFpbmluZyBWaWV3IGlzIHNwZWNpZmllZCBieSB0aGUgQW5jaG9yXG4gKiBgZWxlbWVudGAuIEVhY2ggVmlldyBDb250YWluZXIgY2FuIGhhdmUgb25seSBvbmUgQW5jaG9yIEVsZW1lbnQgYW5kIGVhY2ggQW5jaG9yIEVsZW1lbnQgY2FuIG9ubHlcbiAqIGhhdmUgYSBzaW5nbGUgVmlldyBDb250YWluZXIuXG4gKlxuICogUm9vdCBlbGVtZW50cyBvZiBWaWV3cyBhdHRhY2hlZCB0byB0aGlzIGNvbnRhaW5lciBiZWNvbWUgc2libGluZ3Mgb2YgdGhlIEFuY2hvciBFbGVtZW50IGluXG4gKiB0aGUgUmVuZGVyZWQgVmlldy5cbiAqXG4gKiBUbyBhY2Nlc3MgYSBgVmlld0NvbnRhaW5lclJlZmAgb2YgYW4gRWxlbWVudCwgeW91IGNhbiBlaXRoZXIgcGxhY2UgYSB7QGxpbmsgRGlyZWN0aXZlfSBpbmplY3RlZFxuICogd2l0aCBgVmlld0NvbnRhaW5lclJlZmAgb24gdGhlIEVsZW1lbnQsIG9yIHlvdSBvYnRhaW4gaXQgdmlhXG4gKiB7QGxpbmsgQXBwVmlld01hbmFnZXIjZ2V0Vmlld0NvbnRhaW5lcn0uXG4gKlxuICogPCEtLSBUT0RPKGkpOiB3ZSBhcmUgYWxzbyBjb25zaWRlcmluZyBFbGVtZW50UmVmI3ZpZXdDb250YWluZXIgYXBpIC0tPlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgVmlld0NvbnRhaW5lclJlZiB7XG4gIC8qKlxuICAgKiBBbmNob3IgZWxlbWVudCB0aGF0IHNwZWNpZmllcyB0aGUgbG9jYXRpb24gb2YgdGhpcyBjb250YWluZXIgaW4gdGhlIGNvbnRhaW5pbmcgVmlldy5cbiAgICogPCEtLSBUT0RPOiByZW5hbWUgdG8gYW5jaG9yRWxlbWVudCAtLT5cbiAgICovXG4gIHB1YmxpYyBlbGVtZW50OiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhbGwgVmlld3MgaW4gdGhpcyBjb250YWluZXIuXG4gICAqL1xuICBjbGVhcigpOiB2b2lkIHtcbiAgICBmb3IgKHZhciBpID0gdGhpcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgdGhpcy5yZW1vdmUoaSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHtAbGluayBWaWV3UmVmfSBmb3IgdGhlIFZpZXcgbG9jYXRlZCBpbiB0aGlzIGNvbnRhaW5lciBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LlxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0KGluZGV4OiBudW1iZXIpOiBWaWV3UmVmO1xuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgVmlld3MgY3VycmVudGx5IGF0dGFjaGVkIHRvIHRoaXMgY29udGFpbmVyLlxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xuXG4gIC8qKlxuICAgKiBJbnN0YW50aWF0ZXMgYW4gRW1iZWRkZWQgVmlldyBiYXNlZCBvbiB0aGUge0BsaW5rIFRlbXBsYXRlUmVmIGB0ZW1wbGF0ZVJlZmB9IGFuZCBpbnNlcnRzIGl0XG4gICAqIGludG8gdGhpcyBjb250YWluZXIgYXQgdGhlIHNwZWNpZmllZCBgaW5kZXhgLlxuICAgKlxuICAgKiBJZiBgaW5kZXhgIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuZXcgVmlldyB3aWxsIGJlIGluc2VydGVkIGFzIHRoZSBsYXN0IFZpZXcgaW4gdGhlIGNvbnRhaW5lci5cbiAgICpcbiAgICogUmV0dXJucyB0aGUge0BsaW5rIFZpZXdSZWZ9IGZvciB0aGUgbmV3bHkgY3JlYXRlZCBWaWV3LlxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlRW1iZWRkZWRWaWV3KHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZiwgaW5kZXg/OiBudW1iZXIpOiBWaWV3UmVmO1xuXG4gIC8qKlxuICAgKiBJbnN0YW50aWF0ZXMgYSBzaW5nbGUge0BsaW5rIENvbXBvbmVudH0gYW5kIGluc2VydHMgaXRzIEhvc3QgVmlldyBpbnRvIHRoaXMgY29udGFpbmVyIGF0IHRoZVxuICAgKiBzcGVjaWZpZWQgYGluZGV4YC5cbiAgICpcbiAgICogVGhlIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgdXNpbmcgaXRzIHtAbGluayBQcm90b1ZpZXdSZWYgYHByb3RvVmlld2B9IHdoaWNoIGNhbiBiZVxuICAgKiBvYnRhaW5lZCB2aWEge0BsaW5rIENvbXBpbGVyI2NvbXBpbGVJbkhvc3R9LlxuICAgKlxuICAgKiBJZiBgaW5kZXhgIGlzIG5vdCBzcGVjaWZpZWQsIHRoZSBuZXcgVmlldyB3aWxsIGJlIGluc2VydGVkIGFzIHRoZSBsYXN0IFZpZXcgaW4gdGhlIGNvbnRhaW5lci5cbiAgICpcbiAgICogWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYGR5bmFtaWNhbGx5Q3JlYXRlZFByb3ZpZGVyc2AsIHdoaWNoIGNvbmZpZ3VyZSB0aGUge0BsaW5rIEluamVjdG9yfVxuICAgKiB0aGF0IHdpbGwgYmUgY3JlYXRlZCBmb3IgdGhlIEhvc3QgVmlldy5cbiAgICpcbiAgICogUmV0dXJucyB0aGUge0BsaW5rIEhvc3RWaWV3UmVmfSBvZiB0aGUgSG9zdCBWaWV3IGNyZWF0ZWQgZm9yIHRoZSBuZXdseSBpbnN0YW50aWF0ZWQgQ29tcG9uZW50LlxuICAgKi9cbiAgYWJzdHJhY3QgY3JlYXRlSG9zdFZpZXcocHJvdG9WaWV3UmVmPzogUHJvdG9WaWV3UmVmLCBpbmRleD86IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY2FsbHlDcmVhdGVkUHJvdmlkZXJzPzogUmVzb2x2ZWRQcm92aWRlcltdKTogSG9zdFZpZXdSZWY7XG5cbiAgLyoqXG4gICAqIEluc2VydHMgYSBWaWV3IGlkZW50aWZpZWQgYnkgYSB7QGxpbmsgVmlld1JlZn0gaW50byB0aGUgY29udGFpbmVyIGF0IHRoZSBzcGVjaWZpZWQgYGluZGV4YC5cbiAgICpcbiAgICogSWYgYGluZGV4YCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbmV3IFZpZXcgd2lsbCBiZSBpbnNlcnRlZCBhcyB0aGUgbGFzdCBWaWV3IGluIHRoZSBjb250YWluZXIuXG4gICAqXG4gICAqIFJldHVybnMgdGhlIGluc2VydGVkIHtAbGluayBWaWV3UmVmfS5cbiAgICovXG4gIGFic3RyYWN0IGluc2VydCh2aWV3UmVmOiBWaWV3UmVmLCBpbmRleD86IG51bWJlcik6IFZpZXdSZWY7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBWaWV3LCBzcGVjaWZpZWQgdmlhIHtAbGluayBWaWV3UmVmfSwgd2l0aGluIHRoZSBjdXJyZW50IGNvbnRhaW5lciBvclxuICAgKiBgLTFgIGlmIHRoaXMgY29udGFpbmVyIGRvZXNuJ3QgY29udGFpbiB0aGUgVmlldy5cbiAgICovXG4gIGFic3RyYWN0IGluZGV4T2Yodmlld1JlZjogVmlld1JlZik6IG51bWJlcjtcblxuICAvKipcbiAgICogRGVzdHJveXMgYSBWaWV3IGF0dGFjaGVkIHRvIHRoaXMgY29udGFpbmVyIGF0IHRoZSBzcGVjaWZpZWQgYGluZGV4YC5cbiAgICpcbiAgICogSWYgYGluZGV4YCBpcyBub3Qgc3BlY2lmaWVkLCB0aGUgbGFzdCBWaWV3IGluIHRoZSBjb250YWluZXIgd2lsbCBiZSByZW1vdmVkLlxuICAgKi9cbiAgYWJzdHJhY3QgcmVtb3ZlKGluZGV4PzogbnVtYmVyKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIGFsb25nIHdpdGgge0BsaW5rICNpbnNlcnR9IHRvIG1vdmUgYSBWaWV3IHdpdGhpbiB0aGUgY3VycmVudCBjb250YWluZXIuXG4gICAqXG4gICAqIElmIHRoZSBgaW5kZXhgIHBhcmFtIGlzIG9taXR0ZWQsIHRoZSBsYXN0IHtAbGluayBWaWV3UmVmfSBpcyBkZXRhY2hlZC5cbiAgICovXG4gIGFic3RyYWN0IGRldGFjaChpbmRleD86IG51bWJlcik6IFZpZXdSZWY7XG59XG5cbmV4cG9ydCBjbGFzcyBWaWV3Q29udGFpbmVyUmVmXyBleHRlbmRzIFZpZXdDb250YWluZXJSZWYge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmlld01hbmFnZXI6IGF2bU1vZHVsZS5BcHBWaWV3TWFuYWdlciwgZWxlbWVudDogRWxlbWVudFJlZikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgX2dldFZpZXdzKCk6IEFycmF5PHZpZXdNb2R1bGUuQXBwVmlldz4ge1xuICAgIGxldCBlbGVtZW50ID0gPEVsZW1lbnRSZWZfPnRoaXMuZWxlbWVudDtcbiAgICB2YXIgdmMgPSBpbnRlcm5hbFZpZXcoZWxlbWVudC5wYXJlbnRWaWV3KS52aWV3Q29udGFpbmVyc1tlbGVtZW50LmJvdW5kRWxlbWVudEluZGV4XTtcbiAgICByZXR1cm4gaXNQcmVzZW50KHZjKSA/IHZjLnZpZXdzIDogW107XG4gIH1cblxuICBnZXQoaW5kZXg6IG51bWJlcik6IFZpZXdSZWYgeyByZXR1cm4gdGhpcy5fZ2V0Vmlld3MoKVtpbmRleF0ucmVmOyB9XG4gIGdldCBsZW5ndGgoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMuX2dldFZpZXdzKCkubGVuZ3RoOyB9XG5cbiAgLy8gVE9ETyhyYWRvKTogcHJvZmlsZSBhbmQgZGVjaWRlIHdoZXRoZXIgYm91bmRzIGNoZWNrcyBzaG91bGQgYmUgYWRkZWRcbiAgLy8gdG8gdGhlIG1ldGhvZHMgYmVsb3cuXG4gIGNyZWF0ZUVtYmVkZGVkVmlldyh0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWYsIGluZGV4OiBudW1iZXIgPSAtMSk6IFZpZXdSZWYge1xuICAgIGlmIChpbmRleCA9PSAtMSkgaW5kZXggPSB0aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy52aWV3TWFuYWdlci5jcmVhdGVFbWJlZGRlZFZpZXdJbkNvbnRhaW5lcih0aGlzLmVsZW1lbnQsIGluZGV4LCB0ZW1wbGF0ZVJlZik7XG4gIH1cblxuICBjcmVhdGVIb3N0Vmlldyhwcm90b1ZpZXdSZWY6IFByb3RvVmlld1JlZiA9IG51bGwsIGluZGV4OiBudW1iZXIgPSAtMSxcbiAgICAgICAgICAgICAgICAgZHluYW1pY2FsbHlDcmVhdGVkUHJvdmlkZXJzOiBSZXNvbHZlZFByb3ZpZGVyW10gPSBudWxsKTogSG9zdFZpZXdSZWYge1xuICAgIGlmIChpbmRleCA9PSAtMSkgaW5kZXggPSB0aGlzLmxlbmd0aDtcbiAgICByZXR1cm4gdGhpcy52aWV3TWFuYWdlci5jcmVhdGVIb3N0Vmlld0luQ29udGFpbmVyKHRoaXMuZWxlbWVudCwgaW5kZXgsIHByb3RvVmlld1JlZixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNhbGx5Q3JlYXRlZFByb3ZpZGVycyk7XG4gIH1cblxuICAvLyBUT0RPKGkpOiByZWZhY3RvciBpbnNlcnQrcmVtb3ZlIGludG8gbW92ZVxuICBpbnNlcnQodmlld1JlZjogVmlld1JlZiwgaW5kZXg6IG51bWJlciA9IC0xKTogVmlld1JlZiB7XG4gICAgaWYgKGluZGV4ID09IC0xKSBpbmRleCA9IHRoaXMubGVuZ3RoO1xuICAgIHJldHVybiB0aGlzLnZpZXdNYW5hZ2VyLmF0dGFjaFZpZXdJbkNvbnRhaW5lcih0aGlzLmVsZW1lbnQsIGluZGV4LCB2aWV3UmVmKTtcbiAgfVxuXG4gIGluZGV4T2Yodmlld1JlZjogVmlld1JlZik6IG51bWJlciB7XG4gICAgcmV0dXJuIExpc3RXcmFwcGVyLmluZGV4T2YodGhpcy5fZ2V0Vmlld3MoKSwgaW50ZXJuYWxWaWV3KHZpZXdSZWYpKTtcbiAgfVxuXG4gIC8vIFRPRE8oaSk6IHJlbmFtZSB0byBkZXN0cm95XG4gIHJlbW92ZShpbmRleDogbnVtYmVyID0gLTEpOiB2b2lkIHtcbiAgICBpZiAoaW5kZXggPT0gLTEpIGluZGV4ID0gdGhpcy5sZW5ndGggLSAxO1xuICAgIHRoaXMudmlld01hbmFnZXIuZGVzdHJveVZpZXdJbkNvbnRhaW5lcih0aGlzLmVsZW1lbnQsIGluZGV4KTtcbiAgICAvLyB2aWV3IGlzIGludGVudGlvbmFsbHkgbm90IHJldHVybmVkIHRvIHRoZSBjbGllbnQuXG4gIH1cblxuICAvLyBUT0RPKGkpOiByZWZhY3RvciBpbnNlcnQrcmVtb3ZlIGludG8gbW92ZVxuICBkZXRhY2goaW5kZXg6IG51bWJlciA9IC0xKTogVmlld1JlZiB7XG4gICAgaWYgKGluZGV4ID09IC0xKSBpbmRleCA9IHRoaXMubGVuZ3RoIC0gMTtcbiAgICByZXR1cm4gdGhpcy52aWV3TWFuYWdlci5kZXRhY2hWaWV3SW5Db250YWluZXIodGhpcy5lbGVtZW50LCBpbmRleCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X2NvbnRhaW5lcl9yZWYudHNcbiAqKi8iLCJpbXBvcnQge1R5cGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0xpZmVjeWNsZUhvb2tzfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzTGlmZWN5Y2xlSG9vayhsY0ludGVyZmFjZTogTGlmZWN5Y2xlSG9va3MsIHRva2VuKTogYm9vbGVhbiB7XG4gIGlmICghKHRva2VuIGluc3RhbmNlb2YgVHlwZSkpIHJldHVybiBmYWxzZTtcblxuICB2YXIgcHJvdG8gPSAoPGFueT50b2tlbikucHJvdG90eXBlO1xuXG4gIHN3aXRjaCAobGNJbnRlcmZhY2UpIHtcbiAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudEluaXQ6XG4gICAgICByZXR1cm4gISFwcm90by5uZ0FmdGVyQ29udGVudEluaXQ7XG4gICAgY2FzZSBMaWZlY3ljbGVIb29rcy5BZnRlckNvbnRlbnRDaGVja2VkOlxuICAgICAgcmV0dXJuICEhcHJvdG8ubmdBZnRlckNvbnRlbnRDaGVja2VkO1xuICAgIGNhc2UgTGlmZWN5Y2xlSG9va3MuQWZ0ZXJWaWV3SW5pdDpcbiAgICAgIHJldHVybiAhIXByb3RvLm5nQWZ0ZXJWaWV3SW5pdDtcbiAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0NoZWNrZWQ6XG4gICAgICByZXR1cm4gISFwcm90by5uZ0FmdGVyVmlld0NoZWNrZWQ7XG4gICAgY2FzZSBMaWZlY3ljbGVIb29rcy5PbkNoYW5nZXM6XG4gICAgICByZXR1cm4gISFwcm90by5uZ09uQ2hhbmdlcztcbiAgICBjYXNlIExpZmVjeWNsZUhvb2tzLkRvQ2hlY2s6XG4gICAgICByZXR1cm4gISFwcm90by5uZ0RvQ2hlY2s7XG4gICAgY2FzZSBMaWZlY3ljbGVIb29rcy5PbkRlc3Ryb3k6XG4gICAgICByZXR1cm4gISFwcm90by5uZ09uRGVzdHJveTtcbiAgICBjYXNlIExpZmVjeWNsZUhvb2tzLk9uSW5pdDpcbiAgICAgIHJldHVybiAhIXByb3RvLm5nT25Jbml0O1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9kaXJlY3RpdmVfbGlmZWN5Y2xlX3JlZmxlY3Rvci50c1xuICoqLyIsImltcG9ydCB7TWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7U2ltcGxlQ2hhbmdlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb25fdXRpbCc7XG5cbmV4cG9ydCBlbnVtIExpZmVjeWNsZUhvb2tzIHtcbiAgT25Jbml0LFxuICBPbkRlc3Ryb3ksXG4gIERvQ2hlY2ssXG4gIE9uQ2hhbmdlcyxcbiAgQWZ0ZXJDb250ZW50SW5pdCxcbiAgQWZ0ZXJDb250ZW50Q2hlY2tlZCxcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQWZ0ZXJWaWV3Q2hlY2tlZFxufVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICovXG5leHBvcnQgdmFyIExJRkVDWUNMRV9IT09LU19WQUxVRVMgPSBbXG4gIExpZmVjeWNsZUhvb2tzLk9uSW5pdCxcbiAgTGlmZWN5Y2xlSG9va3MuT25EZXN0cm95LFxuICBMaWZlY3ljbGVIb29rcy5Eb0NoZWNrLFxuICBMaWZlY3ljbGVIb29rcy5PbkNoYW5nZXMsXG4gIExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudEluaXQsXG4gIExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudENoZWNrZWQsXG4gIExpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0luaXQsXG4gIExpZmVjeWNsZUhvb2tzLkFmdGVyVmlld0NoZWNrZWRcbl07XG5cbi8qKlxuICogTGlmZWN5Y2xlIGhvb2tzIGFyZSBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOlxuICogLSBgT25DaGFuZ2VzYCAoaWYgYW55IGJpbmRpbmdzIGhhdmUgY2hhbmdlZCksXG4gKiAtIGBPbkluaXRgIChhZnRlciB0aGUgZmlyc3QgY2hlY2sgb25seSksXG4gKiAtIGBEb0NoZWNrYCxcbiAqIC0gYEFmdGVyQ29udGVudEluaXRgLFxuICogLSBgQWZ0ZXJDb250ZW50Q2hlY2tlZGAsXG4gKiAtIGBBZnRlclZpZXdJbml0YCxcbiAqIC0gYEFmdGVyVmlld0NoZWNrZWRgLFxuICogLSBgT25EZXN0cm95YCAoYXQgdGhlIHZlcnkgZW5kIGJlZm9yZSBkZXN0cnVjdGlvbilcbiAqL1xuXG4vKipcbiAqIEltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBnZXQgbm90aWZpZWQgd2hlbiBhbnkgZGF0YS1ib3VuZCBwcm9wZXJ0eSBvZiB5b3VyIGRpcmVjdGl2ZSBjaGFuZ2VzLlxuICpcbiAqIGBuZ09uQ2hhbmdlc2AgaXMgY2FsbGVkIHJpZ2h0IGFmdGVyIHRoZSBkYXRhLWJvdW5kIHByb3BlcnRpZXMgaGF2ZSBiZWVuIGNoZWNrZWQgYW5kIGJlZm9yZSB2aWV3XG4gKiBhbmQgY29udGVudCBjaGlsZHJlbiBhcmUgY2hlY2tlZCBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlbSBoYXMgY2hhbmdlZC5cbiAqXG4gKiBUaGUgYGNoYW5nZXNgIHBhcmFtZXRlciBjb250YWlucyBhbiBlbnRyeSBmb3IgZWFjaCBvZiB0aGUgY2hhbmdlZCBkYXRhLWJvdW5kIHByb3BlcnR5LiBUaGUga2V5IGlzXG4gKiB0aGUgcHJvcGVydHkgbmFtZSBhbmQgdGhlIHZhbHVlIGlzIGFuIGluc3RhbmNlIG9mIHtAbGluayBTaW1wbGVDaGFuZ2V9LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBleGFtcGxlXShodHRwOi8vcGxua3IuY28vZWRpdC9BSHJCNm9wTHFIREJQa3Q0S3BkVD9wPXByZXZpZXcpKTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdteS1jbXAnLFxuICogICB0ZW1wbGF0ZTogYDxwPm15UHJvcCA9IHt7bXlQcm9wfX08L3A+YFxuICogfSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAqICAgQElucHV0KCkgbXlQcm9wOiBhbnk7XG4gKlxuICogICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7W3Byb3BOYW1lOiBzdHJpbmddOiBTaW1wbGVDaGFuZ2V9KSB7XG4gKiAgICAgY29uc29sZS5sb2coJ25nT25DaGFuZ2VzIC0gbXlQcm9wID0gJyArIGNoYW5nZXNbJ215UHJvcCddLmN1cnJlbnRWYWx1ZSk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxidXR0b24gKGNsaWNrKT1cInZhbHVlID0gdmFsdWUgKyAxXCI+Q2hhbmdlIE15Q29tcG9uZW50PC9idXR0b24+XG4gKiAgICAgPG15LWNtcCBbbXktcHJvcF09XCJ2YWx1ZVwiPjwvbXktY21wPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtNeUNvbXBvbmVudF1cbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwIHtcbiAqICAgdmFsdWUgPSAwO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHApLmNhdGNoKGVyciA9PiBjb25zb2xlLmVycm9yKGVycikpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgT25DaGFuZ2VzIHsgbmdPbkNoYW5nZXMoY2hhbmdlczoge1trZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZX0pOyB9XG5cbi8qKlxuICogSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIGV4ZWN1dGUgY3VzdG9tIGluaXRpYWxpemF0aW9uIGxvZ2ljIGFmdGVyIHlvdXIgZGlyZWN0aXZlJ3NcbiAqIGRhdGEtYm91bmQgcHJvcGVydGllcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuXG4gKlxuICogYG5nT25Jbml0YCBpcyBjYWxsZWQgcmlnaHQgYWZ0ZXIgdGhlIGRpcmVjdGl2ZSdzIGRhdGEtYm91bmQgcHJvcGVydGllcyBoYXZlIGJlZW4gY2hlY2tlZCBmb3IgdGhlXG4gKiBmaXJzdCB0aW1lLCBhbmQgYmVmb3JlIGFueSBvZiBpdHMgY2hpbGRyZW4gaGF2ZSBiZWVuIGNoZWNrZWQuIEl0IGlzIGludm9rZWQgb25seSBvbmNlIHdoZW4gdGhlXG4gKiBkaXJlY3RpdmUgaXMgaW5zdGFudGlhdGVkLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBleGFtcGxlXShodHRwOi8vcGxua3IuY28vZWRpdC8xTUJ5cFJyeVhkNjR2NHBWMDNZbj9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWNtcCcsXG4gKiAgIHRlbXBsYXRlOiBgPHA+bXktY29tcG9uZW50PC9wPmBcbiAqIH0pXG4gKiBjbGFzcyBNeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ25nT25Jbml0Jyk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nT25EZXN0cm95KCkge1xuICogICAgIGNvbnNvbGUubG9nKCduZ09uRGVzdHJveScpO1xuICogICB9XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8YnV0dG9uIChjbGljayk9XCJoYXNDaGlsZCA9ICFoYXNDaGlsZFwiPlxuICogICAgICAge3toYXNDaGlsZCA/ICdEZXN0cm95JyA6ICdDcmVhdGUnfX0gTXlDb21wb25lbnRcbiAqICAgICA8L2J1dHRvbj5cbiAqICAgICA8bXktY21wICpuZ0lmPVwiaGFzQ2hpbGRcIj48L215LWNtcD5gLFxuICogICBkaXJlY3RpdmVzOiBbTXlDb21wb25lbnQsIE5nSWZdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIGhhc0NoaWxkID0gdHJ1ZTtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAqICBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPbkluaXQgeyBuZ09uSW5pdCgpOyB9XG5cbi8qKlxuICogSW1wbGVtZW50IHRoaXMgaW50ZXJmYWNlIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGNoYW5nZSBkZXRlY3Rpb24gYWxnb3JpdGhtIGZvciB5b3VyIGRpcmVjdGl2ZS5cbiAqXG4gKiBgbmdEb0NoZWNrYCBnZXRzIGNhbGxlZCB0byBjaGVjayB0aGUgY2hhbmdlcyBpbiB0aGUgZGlyZWN0aXZlcyBpbnN0ZWFkIG9mIHRoZSBkZWZhdWx0IGFsZ29yaXRobS5cbiAqXG4gKiBUaGUgZGVmYXVsdCBjaGFuZ2UgZGV0ZWN0aW9uIGFsZ29yaXRobSBsb29rcyBmb3IgZGlmZmVyZW5jZXMgYnkgY29tcGFyaW5nIGJvdW5kLXByb3BlcnR5IHZhbHVlc1xuICogYnkgcmVmZXJlbmNlIGFjcm9zcyBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bnMuIFdoZW4gYERvQ2hlY2tgIGlzIGltcGxlbWVudGVkLCB0aGUgZGVmYXVsdCBhbGdvcml0aG1cbiAqIGlzIGRpc2FibGVkIGFuZCBgbmdEb0NoZWNrYCBpcyByZXNwb25zaWJsZSBmb3IgY2hlY2tpbmcgZm9yIGNoYW5nZXMuXG4gKlxuICogSW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlIGFsbG93cyBpbXByb3ZpbmcgcGVyZm9ybWFuY2UgYnkgdXNpbmcgaW5zaWdodHMgYWJvdXQgdGhlIGNvbXBvbmVudCxcbiAqIGl0cyBpbXBsZW1lbnRhdGlvbiBhbmQgZGF0YSB0eXBlcyBvZiBpdHMgcHJvcGVydGllcy5cbiAqXG4gKiBOb3RlIHRoYXQgYSBkaXJlY3RpdmUgc2hvdWxkIG5vdCBpbXBsZW1lbnQgYm90aCBgRG9DaGVja2AgYW5kIHtAbGluayBPbkNoYW5nZXN9IGF0IHRoZSBzYW1lIHRpbWUuXG4gKiBgbmdPbkNoYW5nZXNgIHdvdWxkIG5vdCBiZSBjYWxsZWQgd2hlbiBhIGRpcmVjdGl2ZSBpbXBsZW1lbnRzIGBEb0NoZWNrYC4gUmVhY3Rpb24gdG8gdGhlIGNoYW5nZXNcbiAqIGhhdmUgdG8gYmUgaGFuZGxlZCBmcm9tIHdpdGhpbiB0aGUgYG5nRG9DaGVja2AgY2FsbGJhY2suXG4gKlxuICogVXNlIHtAbGluayBLZXlWYWx1ZURpZmZlcnN9IGFuZCB7QGxpbmsgSXRlcmFibGVEaWZmZXJzfSB0byBhZGQgeW91ciBjdXN0b20gY2hlY2sgbWVjaGFuaXNtcy5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvUXBuSWxGMENSMmk1YmNZYkhFVUo/cD1wcmV2aWV3KSlcbiAqXG4gKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUgYG5nRG9DaGVja2AgdXNlcyBhbiB7QGxpbmsgSXRlcmFibGVEaWZmZXJzfSB0byBkZXRlY3QgdGhlIHVwZGF0ZXMgdG8gdGhlXG4gKiBhcnJheSBgbGlzdGA6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnY3VzdG9tLWNoZWNrJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8cD5DaGFuZ2VzOjwvcD5cbiAqICAgICA8dWw+XG4gKiAgICAgICA8bGkgKm5nRm9yPVwiI2xpbmUgb2YgbG9nc1wiPnt7bGluZX19PC9saT5cbiAqICAgICA8L3VsPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtOZ0Zvcl1cbiAqIH0pXG4gKiBjbGFzcyBDdXN0b21DaGVja0NvbXBvbmVudCBpbXBsZW1lbnRzIERvQ2hlY2sge1xuICogICBASW5wdXQoKSBsaXN0OiBhbnlbXTtcbiAqICAgZGlmZmVyOiBhbnk7XG4gKiAgIGxvZ3MgPSBbXTtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKGRpZmZlcnM6IEl0ZXJhYmxlRGlmZmVycykge1xuICogICAgIHRoaXMuZGlmZmVyID0gZGlmZmVycy5maW5kKFtdKS5jcmVhdGUobnVsbCk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nRG9DaGVjaygpIHtcbiAqICAgICB2YXIgY2hhbmdlcyA9IHRoaXMuZGlmZmVyLmRpZmYodGhpcy5saXN0KTtcbiAqXG4gKiAgICAgaWYgKGNoYW5nZXMpIHtcbiAqICAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbShyID0+IHRoaXMubG9ncy5wdXNoKCdhZGRlZCAnICsgci5pdGVtKSk7XG4gKiAgICAgICBjaGFuZ2VzLmZvckVhY2hSZW1vdmVkSXRlbShyID0+IHRoaXMubG9ncy5wdXNoKCdyZW1vdmVkICcgKyByLml0ZW0pKVxuICogICAgIH1cbiAqICAgfVxuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgPGJ1dHRvbiAoY2xpY2spPVwibGlzdC5wdXNoKGxpc3QubGVuZ3RoKVwiPlB1c2g8L2J1dHRvbj5cbiAqICAgICA8YnV0dG9uIChjbGljayk9XCJsaXN0LnBvcCgpXCI+UG9wPC9idXR0b24+XG4gKiAgICAgPGN1c3RvbS1jaGVjayBbbGlzdF09XCJsaXN0XCI+PC9jdXN0b20tY2hlY2s+YCxcbiAqICAgZGlyZWN0aXZlczogW0N1c3RvbUNoZWNrQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHAge1xuICogICBsaXN0ID0gW107XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEb0NoZWNrIHsgbmdEb0NoZWNrKCk7IH1cblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gZ2V0IG5vdGlmaWVkIHdoZW4geW91ciBkaXJlY3RpdmUgaXMgZGVzdHJveWVkLlxuICpcbiAqIGBuZ09uRGVzdHJveWAgY2FsbGJhY2sgaXMgdHlwaWNhbGx5IHVzZWQgZm9yIGFueSBjdXN0b20gY2xlYW51cCB0aGF0IG5lZWRzIHRvIG9jY3VyIHdoZW4gdGhlXG4gKiBpbnN0YW5jZSBpcyBkZXN0cm95ZWRcbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZXhhbXBsZV0oaHR0cDovL3BsbmtyLmNvL2VkaXQvMU1CeXBScnlYZDY0djRwVjAzWW4/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWNtcCcsXG4gKiAgIHRlbXBsYXRlOiBgPHA+bXktY29tcG9uZW50PC9wPmBcbiAqIH0pXG4gKiBjbGFzcyBNeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAqICAgbmdPbkluaXQoKSB7XG4gKiAgICAgY29uc29sZS5sb2coJ25nT25Jbml0Jyk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nT25EZXN0cm95KCkge1xuICogICAgIGNvbnNvbGUubG9nKCduZ09uRGVzdHJveScpO1xuICogICB9XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8YnV0dG9uIChjbGljayk9XCJoYXNDaGlsZCA9ICFoYXNDaGlsZFwiPlxuICogICAgICAge3toYXNDaGlsZCA/ICdEZXN0cm95JyA6ICdDcmVhdGUnfX0gTXlDb21wb25lbnRcbiAqICAgICA8L2J1dHRvbj5cbiAqICAgICA8bXktY21wICpuZ0lmPVwiaGFzQ2hpbGRcIj48L215LWNtcD5gLFxuICogICBkaXJlY3RpdmVzOiBbTXlDb21wb25lbnQsIE5nSWZdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIGhhc0NoaWxkID0gdHJ1ZTtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAqIGBgYFxuICpcbiAqXG4gKiBUbyBjcmVhdGUgYSBzdGF0ZWZ1bCBQaXBlLCB5b3Ugc2hvdWxkIGltcGxlbWVudCB0aGlzIGludGVyZmFjZSBhbmQgc2V0IHRoZSBgcHVyZWBcbiAqIHBhcmFtZXRlciB0byBgZmFsc2VgIGluIHRoZSB7QGxpbmsgUGlwZU1ldGFkYXRhfS5cbiAqXG4gKiBBIHN0YXRlZnVsIHBpcGUgbWF5IHByb2R1Y2UgZGlmZmVyZW50IG91dHB1dCwgZ2l2ZW4gdGhlIHNhbWUgaW5wdXQuIEl0IGlzXG4gKiBsaWtlbHkgdGhhdCBhIHN0YXRlZnVsIHBpcGUgbWF5IGNvbnRhaW4gc3RhdGUgdGhhdCBzaG91bGQgYmUgY2xlYW5lZCB1cCB3aGVuXG4gKiBhIGJpbmRpbmcgaXMgZGVzdHJveWVkLiBGb3IgZXhhbXBsZSwgYSBzdWJzY3JpcHRpb24gdG8gYSBzdHJlYW0gb2YgZGF0YSBtYXkgbmVlZCB0b1xuICogYmUgZGlzcG9zZWQsIG9yIGFuIGludGVydmFsIG1heSBuZWVkIHRvIGJlIGNsZWFyZWQuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2k4cG01YnJPNHNQYUx4Qng1Nk1SP3A9cHJldmlldykpXG4gKlxuICogSW4gdGhpcyBleGFtcGxlLCBhIHBpcGUgaXMgY3JlYXRlZCB0byBjb3VudGRvd24gaXRzIGlucHV0IHZhbHVlLCB1cGRhdGluZyBpdCBldmVyeVxuICogNTBtcy4gQmVjYXVzZSBpdCBtYWludGFpbnMgYW4gaW50ZXJuYWwgaW50ZXJ2YWwsIGl0IGF1dG9tYXRpY2FsbHkgY2xlYXJzXG4gKiB0aGUgaW50ZXJ2YWwgd2hlbiB0aGUgYmluZGluZyBpcyBkZXN0cm95ZWQgb3IgdGhlIGNvdW50ZG93biBjb21wbGV0ZXMuXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge09uRGVzdHJveSwgUGlwZSwgUGlwZVRyYW5zZm9ybX0gZnJvbSAnYW5ndWxhcjIvY29yZSdcbiAqIEBQaXBlKHtuYW1lOiAnY291bnRkb3duJywgcHVyZTogZmFsc2V9KVxuICogY2xhc3MgQ291bnREb3duIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSwgT25EZXN0cm95IHtcbiAqICAgcmVtYWluaW5nVGltZTpOdW1iZXI7XG4gKiAgIGludGVydmFsOlNldEludGVydmFsO1xuICogICBuZ09uRGVzdHJveSgpIHtcbiAqICAgICBpZiAodGhpcy5pbnRlcnZhbCkge1xuICogICAgICAgY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKTtcbiAqICAgICB9XG4gKiAgIH1cbiAqICAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGFyZ3M6IGFueVtdID0gW10pIHtcbiAqICAgICBpZiAoIXBhcnNlSW50KHZhbHVlLCAxMCkpIHJldHVybiBudWxsO1xuICogICAgIGlmICh0eXBlb2YgdGhpcy5yZW1haW5pbmdUaW1lICE9PSAnbnVtYmVyJykge1xuICogICAgICAgdGhpcy5yZW1haW5pbmdUaW1lID0gcGFyc2VJbnQodmFsdWUsIDEwKTtcbiAqICAgICB9XG4gKiAgICAgaWYgKCF0aGlzLmludGVydmFsKSB7XG4gKiAgICAgICB0aGlzLmludGVydmFsID0gc2V0SW50ZXJ2YWwoKCkgPT4ge1xuICogICAgICAgICB0aGlzLnJlbWFpbmluZ1RpbWUtPTUwO1xuICogICAgICAgICBpZiAodGhpcy5yZW1haW5pbmdUaW1lIDw9IDApIHtcbiAqICAgICAgICAgICB0aGlzLnJlbWFpbmluZ1RpbWUgPSAwO1xuICogICAgICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCk7XG4gKiAgICAgICAgICAgZGVsZXRlIHRoaXMuaW50ZXJ2YWw7XG4gKiAgICAgICAgIH1cbiAqICAgICAgIH0sIDUwKTtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIHRoaXMucmVtYWluaW5nVGltZTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICogSW52b2tpbmcgYHt7IDEwMDAwIHwgY291bnRkb3duIH19YCB3b3VsZCBjYXVzZSB0aGUgdmFsdWUgdG8gYmUgZGVjcmVtZW50ZWQgYnkgNTAsXG4gKiBldmVyeSA1MG1zLCB1bnRpbCBpdCByZWFjaGVzIDAuXG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9uRGVzdHJveSB7IG5nT25EZXN0cm95KCk7IH1cblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gZ2V0IG5vdGlmaWVkIHdoZW4geW91ciBkaXJlY3RpdmUncyBjb250ZW50IGhhcyBiZWVuIGZ1bGx5XG4gKiBpbml0aWFsaXplZC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvcGxhbVhVcHNMUWJJWHBWaVpoVU8/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdjaGlsZC1jbXAnLFxuICogICB0ZW1wbGF0ZTogYHt7d2hlcmV9fSBjaGlsZGBcbiAqIH0pXG4gKiBjbGFzcyBDaGlsZENvbXBvbmVudCB7XG4gKiAgIEBJbnB1dCgpIHdoZXJlOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAncGFyZW50LWNtcCcsXG4gKiAgIHRlbXBsYXRlOiBgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PmBcbiAqIH0pXG4gKiBjbGFzcyBQYXJlbnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRJbml0IHtcbiAqICAgQENvbnRlbnRDaGlsZChDaGlsZENvbXBvbmVudCkgY29udGVudENoaWxkOiBDaGlsZENvbXBvbmVudDtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIC8vIGNvbnRlbnRDaGlsZCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0XG4gKiAgICAgY29uc29sZS5sb2codGhpcy5nZXRNZXNzYWdlKHRoaXMuY29udGVudENoaWxkKSk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAqICAgICAvLyBjb250ZW50Q2hpbGQgaXMgdXBkYXRlZCBhZnRlciB0aGUgY29udGVudCBoYXMgYmVlbiBjaGVja2VkXG4gKiAgICAgY29uc29sZS5sb2coJ0FmdGVyQ29udGVudEluaXQ6ICcgKyB0aGlzLmdldE1lc3NhZ2UodGhpcy5jb250ZW50Q2hpbGQpKTtcbiAqICAgfVxuICpcbiAqICAgcHJpdmF0ZSBnZXRNZXNzYWdlKGNtcDogQ2hpbGRDb21wb25lbnQpOiBzdHJpbmcge1xuICogICAgIHJldHVybiBjbXAgPyBjbXAud2hlcmUgKyAnIGNoaWxkJyA6ICdubyBjaGlsZCc7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxwYXJlbnQtY21wPlxuICogICAgICAgPGNoaWxkLWNtcCB3aGVyZT1cImNvbnRlbnRcIj48L2NoaWxkLWNtcD5cbiAqICAgICA8L3BhcmVudC1jbXA+YCxcbiAqICAgZGlyZWN0aXZlczogW1BhcmVudENvbXBvbmVudCwgQ2hpbGRDb21wb25lbnRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcCkuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZnRlckNvbnRlbnRJbml0IHsgbmdBZnRlckNvbnRlbnRJbml0KCk7IH1cblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gZ2V0IG5vdGlmaWVkIGFmdGVyIGV2ZXJ5IGNoZWNrIG9mIHlvdXIgZGlyZWN0aXZlJ3MgY29udGVudC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvdEdkcnl0TkVLUW5lY0lQa0Q3TlU/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtzZWxlY3RvcjogJ2NoaWxkLWNtcCcsIHRlbXBsYXRlOiBge3t3aGVyZX19IGNoaWxkYH0pXG4gKiBjbGFzcyBDaGlsZENvbXBvbmVudCB7XG4gKiAgIEBJbnB1dCgpIHdoZXJlOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7c2VsZWN0b3I6ICdwYXJlbnQtY21wJywgdGVtcGxhdGU6IGA8bmctY29udGVudD48L25nLWNvbnRlbnQ+YH0pXG4gKiBjbGFzcyBQYXJlbnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlckNvbnRlbnRDaGVja2VkIHtcbiAqICAgQENvbnRlbnRDaGlsZChDaGlsZENvbXBvbmVudCkgY29udGVudENoaWxkOiBDaGlsZENvbXBvbmVudDtcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKCkge1xuICogICAgIC8vIGNvbnRlbnRDaGlsZCBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0XG4gKiAgICAgY29uc29sZS5sb2codGhpcy5nZXRNZXNzYWdlKHRoaXMuY29udGVudENoaWxkKSk7XG4gKiAgIH1cbiAqXG4gKiAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHtcbiAqICAgICAvLyBjb250ZW50Q2hpbGQgaXMgdXBkYXRlZCBhZnRlciB0aGUgY29udGVudCBoYXMgYmVlbiBjaGVja2VkXG4gKiAgICAgY29uc29sZS5sb2coJ0FmdGVyQ29udGVudENoZWNrZWQ6ICcgKyB0aGlzLmdldE1lc3NhZ2UodGhpcy5jb250ZW50Q2hpbGQpKTtcbiAqICAgfVxuICpcbiAqICAgcHJpdmF0ZSBnZXRNZXNzYWdlKGNtcDogQ2hpbGRDb21wb25lbnQpOiBzdHJpbmcge1xuICogICAgIHJldHVybiBjbXAgPyBjbXAud2hlcmUgKyAnIGNoaWxkJyA6ICdubyBjaGlsZCc7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdhcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxwYXJlbnQtY21wPlxuICogICAgICAgPGJ1dHRvbiAoY2xpY2spPVwiaGFzQ29udGVudCA9ICFoYXNDb250ZW50XCI+VG9nZ2xlIGNvbnRlbnQgY2hpbGQ8L2J1dHRvbj5cbiAqICAgICAgIDxjaGlsZC1jbXAgKm5nSWY9XCJoYXNDb250ZW50XCIgd2hlcmU9XCJjb250ZW50XCI+PC9jaGlsZC1jbXA+XG4gKiAgICAgPC9wYXJlbnQtY21wPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtOZ0lmLCBQYXJlbnRDb21wb25lbnQsIENoaWxkQ29tcG9uZW50XVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHAge1xuICogICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAqIGBgYFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFmdGVyQ29udGVudENoZWNrZWQgeyBuZ0FmdGVyQ29udGVudENoZWNrZWQoKTsgfVxuXG4vKipcbiAqIEltcGxlbWVudCB0aGlzIGludGVyZmFjZSB0byBnZXQgbm90aWZpZWQgd2hlbiB5b3VyIGNvbXBvbmVudCdzIHZpZXcgaGFzIGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0xoVEtWTUVNMGZrSmd5cDRDSTFXP3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7c2VsZWN0b3I6ICdjaGlsZC1jbXAnLCB0ZW1wbGF0ZTogYHt7d2hlcmV9fSBjaGlsZGB9KVxuICogY2xhc3MgQ2hpbGRDb21wb25lbnQge1xuICogICBASW5wdXQoKSB3aGVyZTogc3RyaW5nO1xuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ3BhcmVudC1jbXAnLFxuICogICB0ZW1wbGF0ZTogYDxjaGlsZC1jbXAgd2hlcmU9XCJ2aWV3XCI+PC9jaGlsZC1jbXA+YCxcbiAqICAgZGlyZWN0aXZlczogW0NoaWxkQ29tcG9uZW50XVxuICogfSlcbiAqIGNsYXNzIFBhcmVudENvbXBvbmVudCBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQge1xuICogICBAVmlld0NoaWxkKENoaWxkQ29tcG9uZW50KSB2aWV3Q2hpbGQ6IENoaWxkQ29tcG9uZW50O1xuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgLy8gdmlld0NoaWxkIGlzIG5vdCBpbml0aWFsaXplZCB5ZXRcbiAqICAgICBjb25zb2xlLmxvZyh0aGlzLmdldE1lc3NhZ2UodGhpcy52aWV3Q2hpbGQpKTtcbiAqICAgfVxuICpcbiAqICAgbmdBZnRlclZpZXdJbml0KCkge1xuICogICAgIC8vIHZpZXdDaGlsZCBpcyB1cGRhdGVkIGFmdGVyIHRoZSB2aWV3IGhhcyBiZWVuIGluaXRpYWxpemVkXG4gKiAgICAgY29uc29sZS5sb2coJ25nQWZ0ZXJWaWV3SW5pdDogJyArIHRoaXMuZ2V0TWVzc2FnZSh0aGlzLnZpZXdDaGlsZCkpO1xuICogICB9XG4gKlxuICogICBwcml2YXRlIGdldE1lc3NhZ2UoY21wOiBDaGlsZENvbXBvbmVudCk6IHN0cmluZyB7XG4gKiAgICAgcmV0dXJuIGNtcCA/IGNtcC53aGVyZSArICcgY2hpbGQnIDogJ25vIGNoaWxkJztcbiAqICAgfVxuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHRlbXBsYXRlOiBgPHBhcmVudC1jbXA+PC9wYXJlbnQtY21wPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtQYXJlbnRDb21wb25lbnRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcCkuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZnRlclZpZXdJbml0IHsgbmdBZnRlclZpZXdJbml0KCk7IH1cblxuLyoqXG4gKiBJbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UgdG8gZ2V0IG5vdGlmaWVkIGFmdGVyIGV2ZXJ5IGNoZWNrIG9mIHlvdXIgY29tcG9uZW50J3Mgdmlldy5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvMHFER0hjUFFrYzI1Q1hoVE56S1U/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtzZWxlY3RvcjogJ2NoaWxkLWNtcCcsIHRlbXBsYXRlOiBge3t3aGVyZX19IGNoaWxkYH0pXG4gKiBjbGFzcyBDaGlsZENvbXBvbmVudCB7XG4gKiAgIEBJbnB1dCgpIHdoZXJlOiBzdHJpbmc7XG4gKiB9XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAncGFyZW50LWNtcCcsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgPGJ1dHRvbiAoY2xpY2spPVwic2hvd1ZpZXcgPSAhc2hvd1ZpZXdcIj5Ub2dnbGUgdmlldyBjaGlsZDwvYnV0dG9uPlxuICogICAgIDxjaGlsZC1jbXAgKm5nSWY9XCJzaG93Vmlld1wiIHdoZXJlPVwidmlld1wiPjwvY2hpbGQtY21wPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtOZ0lmLCBDaGlsZENvbXBvbmVudF1cbiAqIH0pXG4gKiBjbGFzcyBQYXJlbnRDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkIHtcbiAqICAgQFZpZXdDaGlsZChDaGlsZENvbXBvbmVudCkgdmlld0NoaWxkOiBDaGlsZENvbXBvbmVudDtcbiAqICAgc2hvd1ZpZXcgPSB0cnVlO1xuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgLy8gdmlld0NoaWxkIGlzIG5vdCBpbml0aWFsaXplZCB5ZXRcbiAqICAgICBjb25zb2xlLmxvZyh0aGlzLmdldE1lc3NhZ2UodGhpcy52aWV3Q2hpbGQpKTtcbiAqICAgfVxuICpcbiAqICAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xuICogICAgIC8vIHZpZXdDaGlsZCBpcyB1cGRhdGVkIGFmdGVyIHRoZSB2aWV3IGhhcyBiZWVuIGNoZWNrZWRcbiAqICAgICBjb25zb2xlLmxvZygnQWZ0ZXJWaWV3Q2hlY2tlZDogJyArIHRoaXMuZ2V0TWVzc2FnZSh0aGlzLnZpZXdDaGlsZCkpO1xuICogICB9XG4gKlxuICogICBwcml2YXRlIGdldE1lc3NhZ2UoY21wOiBDaGlsZENvbXBvbmVudCk6IHN0cmluZyB7XG4gKiAgICAgcmV0dXJuIGNtcCA/IGNtcC53aGVyZSArICcgY2hpbGQnIDogJ25vIGNoaWxkJztcbiAqICAgfVxuICogfVxuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHRlbXBsYXRlOiBgPHBhcmVudC1jbXA+PC9wYXJlbnQtY21wPmAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtQYXJlbnRDb21wb25lbnRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcCkuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBZnRlclZpZXdDaGVja2VkIHsgbmdBZnRlclZpZXdDaGVja2VkKCk7IH1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9pbnRlcmZhY2VzLnRzXG4gKiovIiwiaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7Z2V0U3ltYm9sSXRlcmF0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge09ic2VydmFibGUsIEV2ZW50RW1pdHRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cblxuLyoqXG4gKiBBbiB1bm1vZGlmaWFibGUgbGlzdCBvZiBpdGVtcyB0aGF0IEFuZ3VsYXIga2VlcHMgdXAgdG8gZGF0ZSB3aGVuIHRoZSBzdGF0ZVxuICogb2YgdGhlIGFwcGxpY2F0aW9uIGNoYW5nZXMuXG4gKlxuICogVGhlIHR5cGUgb2Ygb2JqZWN0IHRoYXQge0BsaW5rIFF1ZXJ5TWV0YWRhdGF9IGFuZCB7QGxpbmsgVmlld1F1ZXJ5TWV0YWRhdGF9IHByb3ZpZGUuXG4gKlxuICogSW1wbGVtZW50cyBhbiBpdGVyYWJsZSBpbnRlcmZhY2UsIHRoZXJlZm9yZSBpdCBjYW4gYmUgdXNlZCBpbiBib3RoIEVTNlxuICogamF2YXNjcmlwdCBgZm9yICh2YXIgaSBvZiBpdGVtcylgIGxvb3BzIGFzIHdlbGwgYXMgaW4gQW5ndWxhciB0ZW1wbGF0ZXMgd2l0aFxuICogYCpuZ0Zvcj1cIiNpIG9mIG15TGlzdFwiYC5cbiAqXG4gKiBDaGFuZ2VzIGNhbiBiZSBvYnNlcnZlZCBieSBzdWJzY3JpYmluZyB0byB0aGUgY2hhbmdlcyBgT2JzZXJ2YWJsZWAuXG4gKlxuICogTk9URTogSW4gdGhlIGZ1dHVyZSB0aGlzIGNsYXNzIHdpbGwgaW1wbGVtZW50IGFuIGBPYnNlcnZhYmxlYCBpbnRlcmZhY2UuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L1JYOHNKblFZbDlGV3VTQ1dtZTV6P3A9cHJldmlldykpXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogY2xhc3MgQ29udGFpbmVyIHtcbiAqICAgY29uc3RydWN0b3IoQFF1ZXJ5KEl0ZW0pIGl0ZW1zOiBRdWVyeUxpc3Q8SXRlbT4pIHtcbiAqICAgICBpdGVtcy5jaGFuZ2VzLnN1YnNjcmliZShfID0+IGNvbnNvbGUubG9nKGl0ZW1zLmxlbmd0aCkpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFF1ZXJ5TGlzdDxUPiB7XG4gIHByaXZhdGUgX3Jlc3VsdHM6IEFycmF5PFQ+ID0gW107XG4gIHByaXZhdGUgX2VtaXR0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgZ2V0IGNoYW5nZXMoKTogT2JzZXJ2YWJsZTxhbnk+IHsgcmV0dXJuIHRoaXMuX2VtaXR0ZXI7IH1cbiAgZ2V0IGxlbmd0aCgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5fcmVzdWx0cy5sZW5ndGg7IH1cbiAgZ2V0IGZpcnN0KCk6IFQgeyByZXR1cm4gTGlzdFdyYXBwZXIuZmlyc3QodGhpcy5fcmVzdWx0cyk7IH1cbiAgZ2V0IGxhc3QoKTogVCB7IHJldHVybiBMaXN0V3JhcHBlci5sYXN0KHRoaXMuX3Jlc3VsdHMpOyB9XG5cbiAgLyoqXG4gICAqIHJldHVybnMgYSBuZXcgYXJyYXkgd2l0aCB0aGUgcGFzc2VkIGluIGZ1bmN0aW9uIGFwcGxpZWQgdG8gZWFjaCBlbGVtZW50LlxuICAgKi9cbiAgbWFwPFU+KGZuOiAoaXRlbTogVCkgPT4gVSk6IFVbXSB7IHJldHVybiB0aGlzLl9yZXN1bHRzLm1hcChmbik7IH1cblxuICAvKipcbiAgICogcmV0dXJucyBhIGZpbHRlcmVkIGFycmF5LlxuICAgKi9cbiAgZmlsdGVyKGZuOiAoaXRlbTogVCkgPT4gYm9vbGVhbik6IFRbXSB7IHJldHVybiB0aGlzLl9yZXN1bHRzLmZpbHRlcihmbik7IH1cblxuICAvKipcbiAgICogcmV0dXJucyBhIHJlZHVjZWQgdmFsdWUuXG4gICAqL1xuICByZWR1Y2U8VT4oZm46IChhY2M6IFUsIGl0ZW06IFQpID0+IFUsIGluaXQ6IFUpOiBVIHsgcmV0dXJuIHRoaXMuX3Jlc3VsdHMucmVkdWNlKGZuLCBpbml0KTsgfVxuXG4gIC8qKlxuICAgKiBjb252ZXJ0cyBRdWVyeUxpc3QgaW50byBhbiBhcnJheVxuICAgKi9cbiAgdG9BcnJheSgpOiBUW10geyByZXR1cm4gTGlzdFdyYXBwZXIuY2xvbmUodGhpcy5fcmVzdWx0cyk7IH1cblxuICBbZ2V0U3ltYm9sSXRlcmF0b3IoKV0oKTogYW55IHsgcmV0dXJuIHRoaXMuX3Jlc3VsdHNbZ2V0U3ltYm9sSXRlcmF0b3IoKV0oKTsgfVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9yZXN1bHRzLnRvU3RyaW5nKCk7IH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICByZXNldChyZXM6IFRbXSk6IHZvaWQgeyB0aGlzLl9yZXN1bHRzID0gcmVzOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBub3RpZnlPbkNoYW5nZXMoKTogdm9pZCB7IHRoaXMuX2VtaXR0ZXIuZW1pdCh0aGlzKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3F1ZXJ5X2xpc3QudHNcbiAqKi8iLCJleHBvcnQgY29uc3QgRVZFTlRfVEFSR0VUX1NFUEFSQVRPUiA9ICc6JztcblxuZXhwb3J0IGNsYXNzIEV2ZW50Q29uZmlnIHtcbiAgY29uc3RydWN0b3IocHVibGljIGZpZWxkTmFtZTogc3RyaW5nLCBwdWJsaWMgZXZlbnROYW1lOiBzdHJpbmcsIHB1YmxpYyBpc0xvbmdGb3JtOiBib29sZWFuKSB7fVxuXG4gIHN0YXRpYyBwYXJzZShldmVudENvbmZpZzogc3RyaW5nKTogRXZlbnRDb25maWcge1xuICAgIHZhciBmaWVsZE5hbWUgPSBldmVudENvbmZpZywgZXZlbnROYW1lID0gZXZlbnRDb25maWcsIGlzTG9uZ0Zvcm0gPSBmYWxzZTtcbiAgICB2YXIgc2VwYXJhdG9ySWR4ID0gZXZlbnRDb25maWcuaW5kZXhPZihFVkVOVF9UQVJHRVRfU0VQQVJBVE9SKTtcbiAgICBpZiAoc2VwYXJhdG9ySWR4ID4gLTEpIHtcbiAgICAgIC8vIGxvbmcgZm9ybWF0OiAnZmllbGROYW1lOiBldmVudE5hbWUnXG4gICAgICBmaWVsZE5hbWUgPSBldmVudENvbmZpZy5zdWJzdHJpbmcoMCwgc2VwYXJhdG9ySWR4KS50cmltKCk7XG4gICAgICBldmVudE5hbWUgPSBldmVudENvbmZpZy5zdWJzdHJpbmcoc2VwYXJhdG9ySWR4ICsgMSkudHJpbSgpO1xuICAgICAgaXNMb25nRm9ybSA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgRXZlbnRDb25maWcoZmllbGROYW1lLCBldmVudE5hbWUsIGlzTG9uZ0Zvcm0pO1xuICB9XG5cbiAgZ2V0RnVsbE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5pc0xvbmdGb3JtID8gYCR7dGhpcy5maWVsZE5hbWV9JHtFVkVOVF9UQVJHRVRfU0VQQVJBVE9SfSR7dGhpcy5ldmVudE5hbWV9YCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXZlbnROYW1lO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZXZlbnRfY29uZmlnLnRzXG4gKiovIiwiaW1wb3J0IHtyZXNvbHZlRm9yd2FyZFJlZiwgSW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIGlzQmxhbmssIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1xuICBEaXJlY3RpdmVNZXRhZGF0YSxcbiAgQ29tcG9uZW50TWV0YWRhdGEsXG4gIElucHV0TWV0YWRhdGEsXG4gIE91dHB1dE1ldGFkYXRhLFxuICBIb3N0QmluZGluZ01ldGFkYXRhLFxuICBIb3N0TGlzdGVuZXJNZXRhZGF0YSxcbiAgQ29udGVudENoaWxkcmVuTWV0YWRhdGEsXG4gIFZpZXdDaGlsZHJlbk1ldGFkYXRhLFxuICBDb250ZW50Q2hpbGRNZXRhZGF0YSxcbiAgVmlld0NoaWxkTWV0YWRhdGFcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEnO1xuaW1wb3J0IHtyZWZsZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5cbmZ1bmN0aW9uIF9pc0RpcmVjdGl2ZU1ldGFkYXRhKHR5cGU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIERpcmVjdGl2ZU1ldGFkYXRhO1xufVxuXG4vKlxuICogUmVzb2x2ZSBhIGBUeXBlYCBmb3Ige0BsaW5rIERpcmVjdGl2ZU1ldGFkYXRhfS5cbiAqXG4gKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGNyZWF0ZSBjdXN0b20gYmVoYXZpb3IuXG4gKlxuICogU2VlIHtAbGluayBDb21waWxlcn1cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERpcmVjdGl2ZVJlc29sdmVyIHtcbiAgLyoqXG4gICAqIFJldHVybiB7QGxpbmsgRGlyZWN0aXZlTWV0YWRhdGF9IGZvciBhIGdpdmVuIGBUeXBlYC5cbiAgICovXG4gIHJlc29sdmUodHlwZTogVHlwZSk6IERpcmVjdGl2ZU1ldGFkYXRhIHtcbiAgICB2YXIgdHlwZU1ldGFkYXRhID0gcmVmbGVjdG9yLmFubm90YXRpb25zKHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpKTtcbiAgICBpZiAoaXNQcmVzZW50KHR5cGVNZXRhZGF0YSkpIHtcbiAgICAgIHZhciBtZXRhZGF0YSA9IHR5cGVNZXRhZGF0YS5maW5kKF9pc0RpcmVjdGl2ZU1ldGFkYXRhKTtcbiAgICAgIGlmIChpc1ByZXNlbnQobWV0YWRhdGEpKSB7XG4gICAgICAgIHZhciBwcm9wZXJ0eU1ldGFkYXRhID0gcmVmbGVjdG9yLnByb3BNZXRhZGF0YSh0eXBlKTtcbiAgICAgICAgcmV0dXJuIHRoaXMuX21lcmdlV2l0aFByb3BlcnR5TWV0YWRhdGEobWV0YWRhdGEsIHByb3BlcnR5TWV0YWRhdGEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBObyBEaXJlY3RpdmUgYW5ub3RhdGlvbiBmb3VuZCBvbiAke3N0cmluZ2lmeSh0eXBlKX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgX21lcmdlV2l0aFByb3BlcnR5TWV0YWRhdGEoZG06IERpcmVjdGl2ZU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5TWV0YWRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnlbXX0pOiBEaXJlY3RpdmVNZXRhZGF0YSB7XG4gICAgdmFyIGlucHV0cyA9IFtdO1xuICAgIHZhciBvdXRwdXRzID0gW107XG4gICAgdmFyIGhvc3Q6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgdmFyIHF1ZXJpZXM6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0ge307XG5cbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2gocHJvcGVydHlNZXRhZGF0YSwgKG1ldGFkYXRhOiBhbnlbXSwgcHJvcE5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgbWV0YWRhdGEuZm9yRWFjaChhID0+IHtcbiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBJbnB1dE1ldGFkYXRhKSB7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChhLmJpbmRpbmdQcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dHMucHVzaChgJHtwcm9wTmFtZX06ICR7YS5iaW5kaW5nUHJvcGVydHlOYW1lfWApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpbnB1dHMucHVzaChwcm9wTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBPdXRwdXRNZXRhZGF0YSkge1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoYS5iaW5kaW5nUHJvcGVydHlOYW1lKSkge1xuICAgICAgICAgICAgb3V0cHV0cy5wdXNoKGAke3Byb3BOYW1lfTogJHthLmJpbmRpbmdQcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dHMucHVzaChwcm9wTmFtZSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBIb3N0QmluZGluZ01ldGFkYXRhKSB7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudChhLmhvc3RQcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgICAgICBob3N0W2BbJHthLmhvc3RQcm9wZXJ0eU5hbWV9XWBdID0gcHJvcE5hbWU7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGhvc3RbYFske3Byb3BOYW1lfV1gXSA9IHByb3BOYW1lO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgSG9zdExpc3RlbmVyTWV0YWRhdGEpIHtcbiAgICAgICAgICB2YXIgYXJncyA9IGlzUHJlc2VudChhLmFyZ3MpID8gKDxhbnlbXT5hLmFyZ3MpLmpvaW4oJywgJykgOiAnJztcbiAgICAgICAgICBob3N0W2AoJHthLmV2ZW50TmFtZX0pYF0gPSBgJHtwcm9wTmFtZX0oJHthcmdzfSlgO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBDb250ZW50Q2hpbGRyZW5NZXRhZGF0YSkge1xuICAgICAgICAgIHF1ZXJpZXNbcHJvcE5hbWVdID0gYTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChhIGluc3RhbmNlb2YgVmlld0NoaWxkcmVuTWV0YWRhdGEpIHtcbiAgICAgICAgICBxdWVyaWVzW3Byb3BOYW1lXSA9IGE7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYSBpbnN0YW5jZW9mIENvbnRlbnRDaGlsZE1ldGFkYXRhKSB7XG4gICAgICAgICAgcXVlcmllc1twcm9wTmFtZV0gPSBhO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBWaWV3Q2hpbGRNZXRhZGF0YSkge1xuICAgICAgICAgIHF1ZXJpZXNbcHJvcE5hbWVdID0gYTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHRoaXMuX21lcmdlKGRtLCBpbnB1dHMsIG91dHB1dHMsIGhvc3QsIHF1ZXJpZXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWVyZ2UoZG06IERpcmVjdGl2ZU1ldGFkYXRhLCBpbnB1dHM6IHN0cmluZ1tdLCBvdXRwdXRzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgaG9zdDoge1trZXk6IHN0cmluZ106IHN0cmluZ30sIHF1ZXJpZXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogRGlyZWN0aXZlTWV0YWRhdGEge1xuICAgIHZhciBtZXJnZWRJbnB1dHMgPSBpc1ByZXNlbnQoZG0uaW5wdXRzKSA/IExpc3RXcmFwcGVyLmNvbmNhdChkbS5pbnB1dHMsIGlucHV0cykgOiBpbnB1dHM7XG4gICAgdmFyIG1lcmdlZE91dHB1dHMgPSBpc1ByZXNlbnQoZG0ub3V0cHV0cykgPyBMaXN0V3JhcHBlci5jb25jYXQoZG0ub3V0cHV0cywgb3V0cHV0cykgOiBvdXRwdXRzO1xuICAgIHZhciBtZXJnZWRIb3N0ID0gaXNQcmVzZW50KGRtLmhvc3QpID8gU3RyaW5nTWFwV3JhcHBlci5tZXJnZShkbS5ob3N0LCBob3N0KSA6IGhvc3Q7XG4gICAgdmFyIG1lcmdlZFF1ZXJpZXMgPVxuICAgICAgICBpc1ByZXNlbnQoZG0ucXVlcmllcykgPyBTdHJpbmdNYXBXcmFwcGVyLm1lcmdlKGRtLnF1ZXJpZXMsIHF1ZXJpZXMpIDogcXVlcmllcztcblxuICAgIGlmIChkbSBpbnN0YW5jZW9mIENvbXBvbmVudE1ldGFkYXRhKSB7XG4gICAgICByZXR1cm4gbmV3IENvbXBvbmVudE1ldGFkYXRhKHtcbiAgICAgICAgc2VsZWN0b3I6IGRtLnNlbGVjdG9yLFxuICAgICAgICBpbnB1dHM6IG1lcmdlZElucHV0cyxcbiAgICAgICAgb3V0cHV0czogbWVyZ2VkT3V0cHV0cyxcbiAgICAgICAgaG9zdDogbWVyZ2VkSG9zdCxcbiAgICAgICAgZXhwb3J0QXM6IGRtLmV4cG9ydEFzLFxuICAgICAgICBtb2R1bGVJZDogZG0ubW9kdWxlSWQsXG4gICAgICAgIHF1ZXJpZXM6IG1lcmdlZFF1ZXJpZXMsXG4gICAgICAgIGNoYW5nZURldGVjdGlvbjogZG0uY2hhbmdlRGV0ZWN0aW9uLFxuICAgICAgICBwcm92aWRlcnM6IGRtLnByb3ZpZGVycyxcbiAgICAgICAgdmlld1Byb3ZpZGVyczogZG0udmlld1Byb3ZpZGVyc1xuICAgICAgfSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBEaXJlY3RpdmVNZXRhZGF0YSh7XG4gICAgICAgIHNlbGVjdG9yOiBkbS5zZWxlY3RvcixcbiAgICAgICAgaW5wdXRzOiBtZXJnZWRJbnB1dHMsXG4gICAgICAgIG91dHB1dHM6IG1lcmdlZE91dHB1dHMsXG4gICAgICAgIGhvc3Q6IG1lcmdlZEhvc3QsXG4gICAgICAgIGV4cG9ydEFzOiBkbS5leHBvcnRBcyxcbiAgICAgICAgcXVlcmllczogbWVyZ2VkUXVlcmllcyxcbiAgICAgICAgcHJvdmlkZXJzOiBkbS5wcm92aWRlcnNcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2RpcmVjdGl2ZV9yZXNvbHZlci50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtWaWV3TWV0YWRhdGF9IGZyb20gJy4uL21ldGFkYXRhL3ZpZXcnO1xuaW1wb3J0IHtDb21wb25lbnRNZXRhZGF0YX0gZnJvbSAnLi4vbWV0YWRhdGEvZGlyZWN0aXZlcyc7XG5cbmltcG9ydCB7VHlwZSwgc3RyaW5naWZ5LCBpc0JsYW5rLCBpc1ByZXNlbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge01hcH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcblxuaW1wb3J0IHtyZWZsZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5cblxuLyoqXG4gKiBSZXNvbHZlcyB0eXBlcyB0byB7QGxpbmsgVmlld01ldGFkYXRhfS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFZpZXdSZXNvbHZlciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NhY2hlID0gbmV3IE1hcDxUeXBlLCBWaWV3TWV0YWRhdGE+KCk7XG5cbiAgcmVzb2x2ZShjb21wb25lbnQ6IFR5cGUpOiBWaWV3TWV0YWRhdGEge1xuICAgIHZhciB2aWV3ID0gdGhpcy5fY2FjaGUuZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoaXNCbGFuayh2aWV3KSkge1xuICAgICAgdmlldyA9IHRoaXMuX3Jlc29sdmUoY29tcG9uZW50KTtcbiAgICAgIHRoaXMuX2NhY2hlLnNldChjb21wb25lbnQsIHZpZXcpO1xuICAgIH1cblxuICAgIHJldHVybiB2aWV3O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcmVzb2x2ZShjb21wb25lbnQ6IFR5cGUpOiBWaWV3TWV0YWRhdGEge1xuICAgIHZhciBjb21wTWV0YTogQ29tcG9uZW50TWV0YWRhdGE7XG4gICAgdmFyIHZpZXdNZXRhOiBWaWV3TWV0YWRhdGE7XG5cbiAgICByZWZsZWN0b3IuYW5ub3RhdGlvbnMoY29tcG9uZW50KS5mb3JFYWNoKG0gPT4ge1xuICAgICAgaWYgKG0gaW5zdGFuY2VvZiBWaWV3TWV0YWRhdGEpIHtcbiAgICAgICAgdmlld01ldGEgPSBtO1xuICAgICAgfVxuICAgICAgaWYgKG0gaW5zdGFuY2VvZiBDb21wb25lbnRNZXRhZGF0YSkge1xuICAgICAgICBjb21wTWV0YSA9IG07XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoaXNQcmVzZW50KGNvbXBNZXRhKSkge1xuICAgICAgaWYgKGlzQmxhbmsoY29tcE1ldGEudGVtcGxhdGUpICYmIGlzQmxhbmsoY29tcE1ldGEudGVtcGxhdGVVcmwpICYmIGlzQmxhbmsodmlld01ldGEpKSB7XG4gICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgICAgYENvbXBvbmVudCAnJHtzdHJpbmdpZnkoY29tcG9uZW50KX0nIG11c3QgaGF2ZSBlaXRoZXIgJ3RlbXBsYXRlJywgJ3RlbXBsYXRlVXJsJywgb3IgJ0BWaWV3JyBzZXQuYCk7XG5cbiAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KGNvbXBNZXRhLnRlbXBsYXRlKSAmJiBpc1ByZXNlbnQodmlld01ldGEpKSB7XG4gICAgICAgIHRoaXMuX3Rocm93TWl4aW5nVmlld0FuZENvbXBvbmVudChcInRlbXBsYXRlXCIsIGNvbXBvbmVudCk7XG5cbiAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KGNvbXBNZXRhLnRlbXBsYXRlVXJsKSAmJiBpc1ByZXNlbnQodmlld01ldGEpKSB7XG4gICAgICAgIHRoaXMuX3Rocm93TWl4aW5nVmlld0FuZENvbXBvbmVudChcInRlbXBsYXRlVXJsXCIsIGNvbXBvbmVudCk7XG5cbiAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KGNvbXBNZXRhLmRpcmVjdGl2ZXMpICYmIGlzUHJlc2VudCh2aWV3TWV0YSkpIHtcbiAgICAgICAgdGhpcy5fdGhyb3dNaXhpbmdWaWV3QW5kQ29tcG9uZW50KFwiZGlyZWN0aXZlc1wiLCBjb21wb25lbnQpO1xuXG4gICAgICB9IGVsc2UgaWYgKGlzUHJlc2VudChjb21wTWV0YS5waXBlcykgJiYgaXNQcmVzZW50KHZpZXdNZXRhKSkge1xuICAgICAgICB0aGlzLl90aHJvd01peGluZ1ZpZXdBbmRDb21wb25lbnQoXCJwaXBlc1wiLCBjb21wb25lbnQpO1xuXG4gICAgICB9IGVsc2UgaWYgKGlzUHJlc2VudChjb21wTWV0YS5lbmNhcHN1bGF0aW9uKSAmJiBpc1ByZXNlbnQodmlld01ldGEpKSB7XG4gICAgICAgIHRoaXMuX3Rocm93TWl4aW5nVmlld0FuZENvbXBvbmVudChcImVuY2Fwc3VsYXRpb25cIiwgY29tcG9uZW50KTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoY29tcE1ldGEuc3R5bGVzKSAmJiBpc1ByZXNlbnQodmlld01ldGEpKSB7XG4gICAgICAgIHRoaXMuX3Rocm93TWl4aW5nVmlld0FuZENvbXBvbmVudChcInN0eWxlc1wiLCBjb21wb25lbnQpO1xuXG4gICAgICB9IGVsc2UgaWYgKGlzUHJlc2VudChjb21wTWV0YS5zdHlsZVVybHMpICYmIGlzUHJlc2VudCh2aWV3TWV0YSkpIHtcbiAgICAgICAgdGhpcy5fdGhyb3dNaXhpbmdWaWV3QW5kQ29tcG9uZW50KFwic3R5bGVVcmxzXCIsIGNvbXBvbmVudCk7XG5cbiAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KHZpZXdNZXRhKSkge1xuICAgICAgICByZXR1cm4gdmlld01ldGE7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgVmlld01ldGFkYXRhKHtcbiAgICAgICAgICB0ZW1wbGF0ZVVybDogY29tcE1ldGEudGVtcGxhdGVVcmwsXG4gICAgICAgICAgdGVtcGxhdGU6IGNvbXBNZXRhLnRlbXBsYXRlLFxuICAgICAgICAgIGRpcmVjdGl2ZXM6IGNvbXBNZXRhLmRpcmVjdGl2ZXMsXG4gICAgICAgICAgcGlwZXM6IGNvbXBNZXRhLnBpcGVzLFxuICAgICAgICAgIGVuY2Fwc3VsYXRpb246IGNvbXBNZXRhLmVuY2Fwc3VsYXRpb24sXG4gICAgICAgICAgc3R5bGVzOiBjb21wTWV0YS5zdHlsZXMsXG4gICAgICAgICAgc3R5bGVVcmxzOiBjb21wTWV0YS5zdHlsZVVybHNcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc0JsYW5rKHZpZXdNZXRhKSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgTm8gVmlldyBkZWNvcmF0b3IgZm91bmQgb24gY29tcG9uZW50ICcke3N0cmluZ2lmeShjb21wb25lbnQpfSdgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2aWV3TWV0YTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF90aHJvd01peGluZ1ZpZXdBbmRDb21wb25lbnQocHJvcGVydHlOYW1lOiBzdHJpbmcsIGNvbXBvbmVudDogVHlwZSk6IHZvaWQge1xuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICBgQ29tcG9uZW50ICcke3N0cmluZ2lmeShjb21wb25lbnQpfScgY2Fubm90IGhhdmUgYm90aCAnJHtwcm9wZXJ0eU5hbWV9JyBhbmQgJ0BWaWV3JyBzZXQgYXQgdGhlIHNhbWUgdGltZVwiYCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X3Jlc29sdmVyLnRzXG4gKiovIiwiaW1wb3J0IHtyZXNvbHZlRm9yd2FyZFJlZiwgSW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7UGlwZU1ldGFkYXRhfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YSc7XG5pbXBvcnQge3JlZmxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcblxuZnVuY3Rpb24gX2lzUGlwZU1ldGFkYXRhKHR5cGU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFBpcGVNZXRhZGF0YTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlIGEgYFR5cGVgIGZvciB7QGxpbmsgUGlwZU1ldGFkYXRhfS5cbiAqXG4gKiBUaGlzIGludGVyZmFjZSBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGNyZWF0ZSBjdXN0b20gYmVoYXZpb3IuXG4gKlxuICogU2VlIHtAbGluayBDb21waWxlcn1cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBpcGVSZXNvbHZlciB7XG4gIC8qKlxuICAgKiBSZXR1cm4ge0BsaW5rIFBpcGVNZXRhZGF0YX0gZm9yIGEgZ2l2ZW4gYFR5cGVgLlxuICAgKi9cbiAgcmVzb2x2ZSh0eXBlOiBUeXBlKTogUGlwZU1ldGFkYXRhIHtcbiAgICB2YXIgbWV0YXMgPSByZWZsZWN0b3IuYW5ub3RhdGlvbnMocmVzb2x2ZUZvcndhcmRSZWYodHlwZSkpO1xuICAgIGlmIChpc1ByZXNlbnQobWV0YXMpKSB7XG4gICAgICB2YXIgYW5ub3RhdGlvbiA9IG1ldGFzLmZpbmQoX2lzUGlwZU1ldGFkYXRhKTtcbiAgICAgIGlmIChpc1ByZXNlbnQoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgcmV0dXJuIGFubm90YXRpb247XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBObyBQaXBlIGRlY29yYXRvciBmb3VuZCBvbiAke3N0cmluZ2lmeSh0eXBlKX1gKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3BpcGVfcmVzb2x2ZXIudHNcbiAqKi8iLCJpbXBvcnQge09wYXF1ZVRva2VufSBmcm9tIFwiYW5ndWxhcjIvc3JjL2NvcmUvZGlcIjtcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSBcImFuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZ1wiO1xuXG4vKipcbiAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgd2hlbiBib290c3RyYXBpbmcgYW4gYXBwbGljYXRpb24gdG8gbWFrZSBhbiBhcnJheSBvZiBkaXJlY3RpdmVzXG4gKiBhdmFpbGFibGUgaW4gZXZlcnkgY29tcG9uZW50IG9mIHRoZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7UExBVEZPUk1fRElSRUNUSVZFU30gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge090aGVyRGlyZWN0aXZlfSBmcm9tICcuL215RGlyZWN0aXZlcyc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8IS0tIGNhbiB1c2Ugb3RoZXIgZGlyZWN0aXZlIGV2ZW4gdGhvdWdoIHRoZSBjb21wb25lbnQgZG9lcyBub3QgbGlzdCBpdCBpbiBgZGlyZWN0aXZlc2AgLS0+XG4gKiAgICAgPG90aGVyLWRpcmVjdGl2ZT48L290aGVyLWRpcmVjdGl2ZT5cbiAqICAgYFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIC4uLlxuICogfVxuICpcbiAqIGJvb3RzdHJhcChNeUNvbXBvbmVudCwgW3Byb3ZpZGUoUExBVEZPUk1fRElSRUNUSVZFUywge3VzZVZhbHVlOiBbT3RoZXJEaXJlY3RpdmVdLCBtdWx0aTp0cnVlfSldKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgUExBVEZPUk1fRElSRUNUSVZFUzogT3BhcXVlVG9rZW4gPSBDT05TVF9FWFBSKG5ldyBPcGFxdWVUb2tlbihcIlBsYXRmb3JtIERpcmVjdGl2ZXNcIikpO1xuXG4vKipcbiAqIEEgdG9rZW4gdGhhdCBjYW4gYmUgcHJvdmlkZWQgd2hlbiBib290c3RyYXBpbmcgYW4gYXBwbGljYXRpb24gdG8gbWFrZSBhbiBhcnJheSBvZiBwaXBlc1xuICogYXZhaWxhYmxlIGluIGV2ZXJ5IGNvbXBvbmVudCBvZiB0aGUgYXBwbGljYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge1BMQVRGT1JNX1BJUEVTfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7T3RoZXJQaXBlfSBmcm9tICcuL215UGlwZSc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICB7ezEyMyB8IG90aGVyLXBpcGV9fVxuICogICBgXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgLi4uXG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKE15Q29tcG9uZW50LCBbcHJvdmlkZShQTEFURk9STV9QSVBFUywge3VzZVZhbHVlOiBbT3RoZXJQaXBlXSwgbXVsdGk6dHJ1ZX0pXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IFBMQVRGT1JNX1BJUEVTOiBPcGFxdWVUb2tlbiA9IENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKFwiUGxhdGZvcm0gUGlwZXNcIikpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcGxhdGZvcm1fZGlyZWN0aXZlc19hbmRfcGlwZXMudHNcbiAqKi8iLCJpbXBvcnQge1R5cGUsIENPTlNUX0VYUFIsIENPTlNULCBpc1ByZXNlbnQsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3VuaW1wbGVtZW50ZWR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1xuICBSZW5kZXJUZW1wbGF0ZUNtZCxcbiAgUmVuZGVyQ29tbWFuZFZpc2l0b3IsXG4gIFJlbmRlckJlZ2luRWxlbWVudENtZCxcbiAgUmVuZGVyVGV4dENtZCxcbiAgUmVuZGVyTmdDb250ZW50Q21kLFxuICBSZW5kZXJCZWdpbkNvbXBvbmVudENtZCxcbiAgUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZFxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpJztcbmltcG9ydCB7Vmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhJztcbi8vIEV4cG9ydCBWaWV3RW5jYXBzdWxhdGlvbiBzbyB0aGF0IGNvbXBpbGVkIHRlbXBsYXRlcyBvbmx5IG5lZWQgdG8gZGVwZW5kXG4vLyBvbiB0ZW1wbGF0ZV9jb21tYW5kcy5cbmV4cG9ydCB7Vmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhJztcblxuLyoqXG4gKiBBIGNvbXBpbGVkIGhvc3QgdGVtcGxhdGUuXG4gKlxuICogVGhpcyBpcyBjb25zdCBhcyB3ZSBhcmUgc3RvcmluZyBpdCBhcyBhbm5vdGF0aW9uXG4gKiBmb3IgdGhlIGNvbXBpbGVkIGNvbXBvbmVudCB0eXBlLlxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIENvbXBpbGVkSG9zdFRlbXBsYXRlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHRlbXBsYXRlOiBDb21waWxlZENvbXBvbmVudFRlbXBsYXRlKSB7fVxufVxuXG4vKipcbiAqIEEgY29tcGlsZWQgdGVtcGxhdGUuXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgQ29tcGlsZWRDb21wb25lbnRUZW1wbGF0ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpZDogc3RyaW5nLCBwdWJsaWMgY2hhbmdlRGV0ZWN0b3JGYWN0b3J5OiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgcHVibGljIGNvbW1hbmRzOiBUZW1wbGF0ZUNtZFtdLCBwdWJsaWMgc3R5bGVzOiBzdHJpbmdbXSkge31cbn1cblxuY29uc3QgRU1QVFlfQVJSID0gQ09OU1RfRVhQUihbXSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVtcGxhdGVDbWQgZXh0ZW5kcyBSZW5kZXJUZW1wbGF0ZUNtZCB7XG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnk7XG59XG5cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgVGV4dENtZCBpbXBsZW1lbnRzIFRlbXBsYXRlQ21kLCBSZW5kZXJUZXh0Q21kIHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBzdHJpbmcsIHB1YmxpYyBpc0JvdW5kOiBib29sZWFuLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlcikge31cbiAgdmlzaXQodmlzaXRvcjogUmVuZGVyQ29tbWFuZFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRUZXh0KHRoaXMsIGNvbnRleHQpO1xuICB9XG59XG5cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgTmdDb250ZW50Q21kIGltcGxlbWVudHMgVGVtcGxhdGVDbWQsIFJlbmRlck5nQ29udGVudENtZCB7XG4gIGlzQm91bmQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IocHVibGljIGluZGV4OiBudW1iZXIsIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdE5nQ29udGVudCh0aGlzLCBjb250ZXh0KTtcbiAgfVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSUJlZ2luRWxlbWVudENtZCBleHRlbmRzIFJlbmRlckJlZ2luRWxlbWVudENtZCBpbXBsZW1lbnRzIFRlbXBsYXRlQ21kIHtcbiAgZ2V0IHZhcmlhYmxlTmFtZUFuZFZhbHVlcygpOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+IHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxuICBnZXQgZXZlbnRUYXJnZXRBbmROYW1lcygpOiBzdHJpbmdbXSB7IHJldHVybiB1bmltcGxlbWVudGVkKCk7IH1cbiAgZ2V0IGRpcmVjdGl2ZXMoKTogVHlwZVtdIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxuICBhYnN0cmFjdCB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55O1xufVxuXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEJlZ2luRWxlbWVudENtZCBpbXBsZW1lbnRzIFRlbXBsYXRlQ21kLCBJQmVnaW5FbGVtZW50Q21kLCBSZW5kZXJCZWdpbkVsZW1lbnRDbWQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICBwdWJsaWMgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgIHB1YmxpYyB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IEFycmF5PHN0cmluZyB8IG51bWJlcj4sIHB1YmxpYyBkaXJlY3RpdmVzOiBUeXBlW10sXG4gICAgICAgICAgICAgIHB1YmxpYyBpc0JvdW5kOiBib29sZWFuLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlcikge31cbiAgdmlzaXQodmlzaXRvcjogUmVuZGVyQ29tbWFuZFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRCZWdpbkVsZW1lbnQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEVuZEVsZW1lbnRDbWQgaW1wbGVtZW50cyBUZW1wbGF0ZUNtZCB7XG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RW5kRWxlbWVudChjb250ZXh0KTtcbiAgfVxufVxuXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEJlZ2luQ29tcG9uZW50Q21kIGltcGxlbWVudHMgVGVtcGxhdGVDbWQsIElCZWdpbkVsZW1lbnRDbWQsIFJlbmRlckJlZ2luQ29tcG9uZW50Q21kIHtcbiAgaXNCb3VuZDogYm9vbGVhbiA9IHRydWU7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10sXG4gICAgICAgICAgICAgIHB1YmxpYyBldmVudFRhcmdldEFuZE5hbWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgcHVibGljIHZhcmlhYmxlTmFtZUFuZFZhbHVlczogQXJyYXk8c3RyaW5nIHwgbnVtYmVyPiwgcHVibGljIGRpcmVjdGl2ZXM6IFR5cGVbXSxcbiAgICAgICAgICAgICAgcHVibGljIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgLy8gTm90ZTogdGhlIHRlbXBsYXRlIG5lZWRzIHRvIGJlIHN0b3JlZCBhcyBhIGZ1bmN0aW9uXG4gICAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgY2FuIHJlc29sdmUgY3ljbGVzXG4gICAgICAgICAgICAgIHB1YmxpYyB0ZW1wbGF0ZUdldHRlcjogRnVuY3Rpb24gLyooKSA9PiBDb21waWxlZENvbXBvbmVudFRlbXBsYXRlKi8pIHt9XG5cbiAgZ2V0IHRlbXBsYXRlSWQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMudGVtcGxhdGVHZXR0ZXIoKS5pZDsgfVxuXG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QmVnaW5Db21wb25lbnQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBFbmRDb21wb25lbnRDbWQgaW1wbGVtZW50cyBUZW1wbGF0ZUNtZCB7XG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RW5kQ29tcG9uZW50KGNvbnRleHQpO1xuICB9XG59XG5cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgRW1iZWRkZWRUZW1wbGF0ZUNtZCBpbXBsZW1lbnRzIFRlbXBsYXRlQ21kLCBJQmVnaW5FbGVtZW50Q21kLFxuICAgIFJlbmRlckVtYmVkZGVkVGVtcGxhdGVDbWQge1xuICBpc0JvdW5kOiBib29sZWFuID0gdHJ1ZTtcbiAgbmFtZTogc3RyaW5nID0gbnVsbDtcbiAgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10gPSBFTVBUWV9BUlI7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10sIHB1YmxpYyB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICBwdWJsaWMgZGlyZWN0aXZlczogVHlwZVtdLCBwdWJsaWMgaXNNZXJnZWQ6IGJvb2xlYW4sIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgY2hhbmdlRGV0ZWN0b3JGYWN0b3J5OiBGdW5jdGlvbiwgcHVibGljIGNoaWxkcmVuOiBUZW1wbGF0ZUNtZFtdKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdEVtYmVkZGVkVGVtcGxhdGUodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRWaXNpdG9yIGV4dGVuZHMgUmVuZGVyQ29tbWFuZFZpc2l0b3Ige1xuICB2aXNpdFRleHQoY21kOiBUZXh0Q21kLCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0TmdDb250ZW50KGNtZDogTmdDb250ZW50Q21kLCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0QmVnaW5FbGVtZW50KGNtZDogQmVnaW5FbGVtZW50Q21kLCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RW5kRWxlbWVudChjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0QmVnaW5Db21wb25lbnQoY21kOiBCZWdpbkNvbXBvbmVudENtZCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEVuZENvbXBvbmVudChjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RW1iZWRkZWRUZW1wbGF0ZShjbWQ6IEVtYmVkZGVkVGVtcGxhdGVDbWQsIGNvbnRleHQ6IGFueSk6IGFueTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZpc2l0QWxsQ29tbWFuZHModmlzaXRvcjogQ29tbWFuZFZpc2l0b3IsIGNtZHM6IFRlbXBsYXRlQ21kW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiBhbnkgPSBudWxsKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykge1xuICAgIGNtZHNbaV0udmlzaXQodmlzaXRvciwgY29udGV4dCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci90ZW1wbGF0ZV9jb21tYW5kcy50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtwcmludH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvbnNvbGUge1xuICBsb2cobWVzc2FnZTogc3RyaW5nKTogdm9pZCB7IHByaW50KG1lc3NhZ2UpOyB9XG59XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvY29uc29sZS50c1xuICoqLyIsIi8vIFB1YmxpYyBBUEkgZm9yIFpvbmVcbmV4cG9ydCB7Tmdab25lLCBaZXJvQXJnRnVuY3Rpb24sIEVycm9ySGFuZGxpbmdGbiwgTmdab25lRXJyb3J9IGZyb20gJy4vem9uZS9uZ196b25lJztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL3pvbmUudHNcbiAqKi8iLCIvLyBQdWJsaWMgQVBJIGZvciByZW5kZXJcbmV4cG9ydCB7XG4gIFJlbmRlckV2ZW50RGlzcGF0Y2hlcixcbiAgUmVuZGVyZXIsXG4gIFJlbmRlckVsZW1lbnRSZWYsXG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlclByb3RvVmlld1JlZixcbiAgUmVuZGVyRnJhZ21lbnRSZWYsXG4gIFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzLFxuICBSZW5kZXJUZW1wbGF0ZUNtZCxcbiAgUmVuZGVyQ29tbWFuZFZpc2l0b3IsXG4gIFJlbmRlclRleHRDbWQsXG4gIFJlbmRlck5nQ29udGVudENtZCxcbiAgUmVuZGVyQmVnaW5FbGVtZW50Q21kLFxuICBSZW5kZXJCZWdpbkNvbXBvbmVudENtZCxcbiAgUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZCxcbiAgUmVuZGVyQmVnaW5DbWQsXG4gIFJlbmRlckNvbXBvbmVudFRlbXBsYXRlXG59IGZyb20gJy4vcmVuZGVyL2FwaSc7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyLnRzXG4gKiovIiwiLy8gUHVibGljIEFQSSBmb3IgY29tcGlsZXJcbmV4cG9ydCB7XG4gIEFmdGVyQ29udGVudEluaXQsXG4gIEFmdGVyQ29udGVudENoZWNrZWQsXG4gIEFmdGVyVmlld0luaXQsXG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIE9uQ2hhbmdlcyxcbiAgT25EZXN0cm95LFxuICBPbkluaXQsXG4gIERvQ2hlY2tcbn0gZnJvbSAnLi9saW5rZXIvaW50ZXJmYWNlcyc7XG5leHBvcnQge0RpcmVjdGl2ZVJlc29sdmVyfSBmcm9tICcuL2xpbmtlci9kaXJlY3RpdmVfcmVzb2x2ZXInO1xuZXhwb3J0IHtWaWV3UmVzb2x2ZXJ9IGZyb20gJy4vbGlua2VyL3ZpZXdfcmVzb2x2ZXInO1xuZXhwb3J0IHtDb21waWxlcn0gZnJvbSAnLi9saW5rZXIvY29tcGlsZXInO1xuZXhwb3J0IHtBcHBWaWV3TWFuYWdlcn0gZnJvbSAnLi9saW5rZXIvdmlld19tYW5hZ2VyJztcbmV4cG9ydCB7UXVlcnlMaXN0fSBmcm9tICcuL2xpbmtlci9xdWVyeV9saXN0JztcbmV4cG9ydCB7RHluYW1pY0NvbXBvbmVudExvYWRlcn0gZnJvbSAnLi9saW5rZXIvZHluYW1pY19jb21wb25lbnRfbG9hZGVyJztcbmV4cG9ydCB7RWxlbWVudFJlZn0gZnJvbSAnLi9saW5rZXIvZWxlbWVudF9yZWYnO1xuZXhwb3J0IHtUZW1wbGF0ZVJlZn0gZnJvbSAnLi9saW5rZXIvdGVtcGxhdGVfcmVmJztcbmV4cG9ydCB7Vmlld1JlZiwgSG9zdFZpZXdSZWYsIFByb3RvVmlld1JlZn0gZnJvbSAnLi9saW5rZXIvdmlld19yZWYnO1xuZXhwb3J0IHtWaWV3Q29udGFpbmVyUmVmfSBmcm9tICcuL2xpbmtlci92aWV3X2NvbnRhaW5lcl9yZWYnO1xuZXhwb3J0IHtDb21wb25lbnRSZWZ9IGZyb20gJy4vbGlua2VyL2R5bmFtaWNfY29tcG9uZW50X2xvYWRlcic7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyLnRzXG4gKiovIiwiaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0xpc3RXcmFwcGVyLCBNYXBXcmFwcGVyLCBQcmVkaWNhdGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge3VuaW1wbGVtZW50ZWR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge0VsZW1lbnRJbmplY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2VsZW1lbnRfaW5qZWN0b3InO1xuaW1wb3J0IHtBcHBWaWV3LCBWaWV3VHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXcnO1xuaW1wb3J0IHtpbnRlcm5hbFZpZXd9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X3JlZic7XG5pbXBvcnQge0VsZW1lbnRSZWYsIEVsZW1lbnRSZWZffSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZWxlbWVudF9yZWYnO1xuXG4vKipcbiAqIEEgRGVidWdFbGVtZW50IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZyb20gdGhlIEFuZ3VsYXIgY29tcGlsZXIgYWJvdXQgYW5cbiAqIGVsZW1lbnQgYW5kIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29ycmVzcG9uZGluZyBFbGVtZW50SW5qZWN0b3IgYW5kXG4gKiB1bmRlcmx5aW5nIERPTSBFbGVtZW50LCBhcyB3ZWxsIGFzIGEgd2F5IHRvIHF1ZXJ5IGZvciBjaGlsZHJlbi5cbiAqXG4gKiBBIERlYnVnRWxlbWVudCBjYW4gYmUgb2J0YWluZWQgZnJvbSBhIHtAbGluayBDb21wb25lbnRGaXh0dXJlfSBvciBmcm9tIGFuXG4gKiB7QGxpbmsgRWxlbWVudFJlZn0gdmlhIHtAbGluayBpbnNwZWN0RWxlbWVudH0uXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEZWJ1Z0VsZW1lbnQge1xuICAvKipcbiAgICogUmV0dXJuIHRoZSBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQsIGlmIGFueS5cbiAgICovXG4gIGdldCBjb21wb25lbnRJbnN0YW5jZSgpOiBhbnkgeyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9O1xuXG4gIC8qKlxuICAgKiBSZXR1cm4gdGhlIG5hdGl2ZSBIVE1MIGVsZW1lbnQgZm9yIHRoaXMgRGVidWdFbGVtZW50LlxuICAgKi9cbiAgZ2V0IG5hdGl2ZUVsZW1lbnQoKTogYW55IHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogUmV0dXJuIGFuIEFuZ3VsYXIge0BsaW5rIEVsZW1lbnRSZWZ9IGZvciB0aGlzIGVsZW1lbnQuXG4gICAqL1xuICBnZXQgZWxlbWVudFJlZigpOiBFbGVtZW50UmVmIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSBkaXJlY3RpdmUgYWN0aXZlIGZvciB0aGlzIGVsZW1lbnQgd2l0aCB0aGUgZ2l2ZW4gaW5kZXgsIGlmIGFueS5cbiAgICovXG4gIGFic3RyYWN0IGdldERpcmVjdGl2ZUluc3RhbmNlKGRpcmVjdGl2ZUluZGV4OiBudW1iZXIpOiBhbnk7XG5cbiAgLyoqXG4gICAqIEdldCBjaGlsZCBEZWJ1Z0VsZW1lbnRzIGZyb20gd2l0aGluIHRoZSBMaWdodCBET00uXG4gICAqXG4gICAqIEByZXR1cm4ge0RlYnVnRWxlbWVudFtdfVxuICAgKi9cbiAgZ2V0IGNoaWxkcmVuKCk6IERlYnVnRWxlbWVudFtdIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogR2V0IHRoZSByb290IERlYnVnRWxlbWVudCBjaGlsZHJlbiBvZiBhIGNvbXBvbmVudC4gUmV0dXJucyBhbiBlbXB0eVxuICAgKiBsaXN0IGlmIHRoZSBjdXJyZW50IERlYnVnRWxlbWVudCBpcyBub3QgYSBjb21wb25lbnQgcm9vdC5cbiAgICpcbiAgICogQHJldHVybiB7RGVidWdFbGVtZW50W119XG4gICAqL1xuICBnZXQgY29tcG9uZW50Vmlld0NoaWxkcmVuKCk6IERlYnVnRWxlbWVudFtdIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfTtcblxuICAvKipcbiAgICogU2ltdWxhdGUgYW4gZXZlbnQgZnJvbSB0aGlzIGVsZW1lbnQgYXMgaWYgdGhlIHVzZXIgaGFkIGNhdXNlZFxuICAgKiB0aGlzIGV2ZW50IHRvIGZpcmUgZnJvbSB0aGUgcGFnZS5cbiAgICovXG4gIGFic3RyYWN0IHRyaWdnZXJFdmVudEhhbmRsZXIoZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50T2JqOiBFdmVudCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENoZWNrIHdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIGEgZGlyZWN0aXZlIHdpdGggdGhlIGdpdmVuIHR5cGUuXG4gICAqL1xuICBhYnN0cmFjdCBoYXNEaXJlY3RpdmUodHlwZTogVHlwZSk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluamVjdCB0aGUgZ2l2ZW4gdHlwZSBmcm9tIHRoZSBlbGVtZW50IGluamVjdG9yLlxuICAgKi9cbiAgYWJzdHJhY3QgaW5qZWN0KHR5cGU6IFR5cGUpOiBhbnk7XG5cblxuICAvKipcbiAgICogUmVhZCBhIGxvY2FsIHZhcmlhYmxlIGZyb20gdGhlIGVsZW1lbnQgKGUuZy4gb25lIGRlZmluZWQgd2l0aCBgI3ZhcmlhYmxlYCkuXG4gICAqL1xuICBhYnN0cmFjdCBnZXRMb2NhbChuYW1lOiBzdHJpbmcpOiBhbnk7XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgZmlyc3QgZGVzY2VuZGFudCBUZXN0RWxlbWVudCBtYXRjaGluZyB0aGUgZ2l2ZW4gcHJlZGljYXRlXG4gICAqIGFuZCBzY29wZS5cbiAgICpcbiAgICogQHBhcmFtIHtGdW5jdGlvbjogYm9vbGVhbn0gcHJlZGljYXRlXG4gICAqIEBwYXJhbSB7U2NvcGV9IHNjb3BlXG4gICAqXG4gICAqIEByZXR1cm4ge0RlYnVnRWxlbWVudH1cbiAgICovXG4gIHF1ZXJ5KHByZWRpY2F0ZTogUHJlZGljYXRlPERlYnVnRWxlbWVudD4sIHNjb3BlOiBGdW5jdGlvbiA9IFNjb3BlLmFsbCk6IERlYnVnRWxlbWVudCB7XG4gICAgdmFyIHJlc3VsdHMgPSB0aGlzLnF1ZXJ5QWxsKHByZWRpY2F0ZSwgc2NvcGUpO1xuICAgIHJldHVybiByZXN1bHRzLmxlbmd0aCA+IDAgPyByZXN1bHRzWzBdIDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gZGVzY2VuZGFudCBUZXN0RWxlbWVtdHMgbWF0Y2hpbmcgdGhlIGdpdmVuIHByZWRpY2F0ZVxuICAgKiBhbmQgc2NvcGUuXG4gICAqXG4gICAqIEBwYXJhbSB7RnVuY3Rpb246IGJvb2xlYW59IHByZWRpY2F0ZVxuICAgKiBAcGFyYW0ge1Njb3BlfSBzY29wZVxuICAgKlxuICAgKiBAcmV0dXJuIHtEZWJ1Z0VsZW1lbnRbXX1cbiAgICovXG4gIHF1ZXJ5QWxsKHByZWRpY2F0ZTogUHJlZGljYXRlPERlYnVnRWxlbWVudD4sIHNjb3BlOiBGdW5jdGlvbiA9IFNjb3BlLmFsbCk6IERlYnVnRWxlbWVudFtdIHtcbiAgICB2YXIgZWxlbWVudHNJblNjb3BlOiBhbnlbXSA9IHNjb3BlKHRoaXMpO1xuXG4gICAgcmV0dXJuIGVsZW1lbnRzSW5TY29wZS5maWx0ZXIocHJlZGljYXRlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVidWdFbGVtZW50XyBleHRlbmRzIERlYnVnRWxlbWVudCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2VsZW1lbnRJbmplY3RvcjogRWxlbWVudEluamVjdG9yO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3BhcmVudFZpZXc6IEFwcFZpZXcsIHByaXZhdGUgX2JvdW5kRWxlbWVudEluZGV4OiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX2VsZW1lbnRJbmplY3RvciA9IHRoaXMuX3BhcmVudFZpZXcuZWxlbWVudEluamVjdG9yc1t0aGlzLl9ib3VuZEVsZW1lbnRJbmRleF07XG4gIH1cblxuICBnZXQgY29tcG9uZW50SW5zdGFuY2UoKTogYW55IHtcbiAgICBpZiAoIWlzUHJlc2VudCh0aGlzLl9lbGVtZW50SW5qZWN0b3IpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRJbmplY3Rvci5nZXRDb21wb25lbnQoKTtcbiAgfVxuXG4gIGdldCBuYXRpdmVFbGVtZW50KCk6IGFueSB7IHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsgfVxuXG4gIGdldCBlbGVtZW50UmVmKCk6IEVsZW1lbnRSZWYgeyByZXR1cm4gdGhpcy5fcGFyZW50Vmlldy5lbGVtZW50UmVmc1t0aGlzLl9ib3VuZEVsZW1lbnRJbmRleF07IH1cblxuICBnZXREaXJlY3RpdmVJbnN0YW5jZShkaXJlY3RpdmVJbmRleDogbnVtYmVyKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudEluamVjdG9yLmdldERpcmVjdGl2ZUF0SW5kZXgoZGlyZWN0aXZlSW5kZXgpO1xuICB9XG5cbiAgZ2V0IGNoaWxkcmVuKCk6IERlYnVnRWxlbWVudFtdIHtcbiAgICByZXR1cm4gdGhpcy5fZ2V0Q2hpbGRFbGVtZW50cyh0aGlzLl9wYXJlbnRWaWV3LCB0aGlzLl9ib3VuZEVsZW1lbnRJbmRleCk7XG4gIH1cblxuICBnZXQgY29tcG9uZW50Vmlld0NoaWxkcmVuKCk6IERlYnVnRWxlbWVudFtdIHtcbiAgICB2YXIgc2hhZG93VmlldyA9IHRoaXMuX3BhcmVudFZpZXcuZ2V0TmVzdGVkVmlldyh0aGlzLl9ib3VuZEVsZW1lbnRJbmRleCk7XG5cbiAgICBpZiAoIWlzUHJlc2VudChzaGFkb3dWaWV3KSB8fCBzaGFkb3dWaWV3LnByb3RvLnR5cGUgIT09IFZpZXdUeXBlLkNPTVBPTkVOVCkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgZWxlbWVudCBpcyBub3QgYSBjb21wb25lbnQuXG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2dldENoaWxkRWxlbWVudHMoc2hhZG93VmlldywgbnVsbCk7XG4gIH1cblxuICB0cmlnZ2VyRXZlbnRIYW5kbGVyKGV2ZW50TmFtZTogc3RyaW5nLCBldmVudE9iajogRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJlbnRWaWV3LnRyaWdnZXJFdmVudEhhbmRsZXJzKGV2ZW50TmFtZSwgZXZlbnRPYmosIHRoaXMuX2JvdW5kRWxlbWVudEluZGV4KTtcbiAgfVxuXG4gIGhhc0RpcmVjdGl2ZSh0eXBlOiBUeXBlKTogYm9vbGVhbiB7XG4gICAgaWYgKCFpc1ByZXNlbnQodGhpcy5fZWxlbWVudEluamVjdG9yKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZWxlbWVudEluamVjdG9yLmhhc0RpcmVjdGl2ZSh0eXBlKTtcbiAgfVxuXG4gIGluamVjdCh0eXBlOiBUeXBlKTogYW55IHtcbiAgICBpZiAoIWlzUHJlc2VudCh0aGlzLl9lbGVtZW50SW5qZWN0b3IpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRJbmplY3Rvci5nZXQodHlwZSk7XG4gIH1cblxuICBnZXRMb2NhbChuYW1lOiBzdHJpbmcpOiBhbnkgeyByZXR1cm4gdGhpcy5fcGFyZW50Vmlldy5sb2NhbHMuZ2V0KG5hbWUpOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZ2V0Q2hpbGRFbGVtZW50cyh2aWV3OiBBcHBWaWV3LCBwYXJlbnRCb3VuZEVsZW1lbnRJbmRleDogbnVtYmVyKTogRGVidWdFbGVtZW50W10ge1xuICAgIHZhciBlbHMgPSBbXTtcbiAgICB2YXIgcGFyZW50RWxlbWVudEJpbmRlciA9IG51bGw7XG4gICAgaWYgKGlzUHJlc2VudChwYXJlbnRCb3VuZEVsZW1lbnRJbmRleCkpIHtcbiAgICAgIHBhcmVudEVsZW1lbnRCaW5kZXIgPSB2aWV3LnByb3RvLmVsZW1lbnRCaW5kZXJzW3BhcmVudEJvdW5kRWxlbWVudEluZGV4IC0gdmlldy5lbGVtZW50T2Zmc2V0XTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3LnByb3RvLmVsZW1lbnRCaW5kZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgYmluZGVyID0gdmlldy5wcm90by5lbGVtZW50QmluZGVyc1tpXTtcbiAgICAgIGlmIChiaW5kZXIucGFyZW50ID09IHBhcmVudEVsZW1lbnRCaW5kZXIpIHtcbiAgICAgICAgZWxzLnB1c2gobmV3IERlYnVnRWxlbWVudF8odmlldywgdmlldy5lbGVtZW50T2Zmc2V0ICsgaSkpO1xuXG4gICAgICAgIHZhciB2aWV3cyA9IHZpZXcudmlld0NvbnRhaW5lcnNbdmlldy5lbGVtZW50T2Zmc2V0ICsgaV07XG4gICAgICAgIGlmIChpc1ByZXNlbnQodmlld3MpKSB7XG4gICAgICAgICAgdmlld3Mudmlld3MuZm9yRWFjaChcbiAgICAgICAgICAgICAgKG5leHRWaWV3KSA9PiB7IGVscyA9IGVscy5jb25jYXQodGhpcy5fZ2V0Q2hpbGRFbGVtZW50cyhuZXh0VmlldywgbnVsbCkpOyB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxzO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIHtAbGluayBEZWJ1Z0VsZW1lbnR9IGZvciBhbiB7QGxpbmsgRWxlbWVudFJlZn0uXG4gKlxuICogQHBhcmFtIHtFbGVtZW50UmVmfTogZWxlbWVudFJlZlxuICogQHJldHVybiB7RGVidWdFbGVtZW50fVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5zcGVjdEVsZW1lbnQoZWxlbWVudFJlZjogRWxlbWVudFJlZik6IERlYnVnRWxlbWVudCB7XG4gIHJldHVybiBuZXcgRGVidWdFbGVtZW50XyhpbnRlcm5hbFZpZXcoKDxFbGVtZW50UmVmXz5lbGVtZW50UmVmKS5wYXJlbnRWaWV3KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICg8RWxlbWVudFJlZl8+ZWxlbWVudFJlZikuYm91bmRFbGVtZW50SW5kZXgpO1xufVxuXG4vKipcbiAqIE1hcHMgYW4gYXJyYXkgb2Yge0BsaW5rIERlYnVnRWxlbWVudH1zIHRvIGFuIGFycmF5IG9mIG5hdGl2ZSBET00gZWxlbWVudHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc05hdGl2ZUVsZW1lbnRzKGFycjogRGVidWdFbGVtZW50W10pOiBhbnlbXSB7XG4gIHJldHVybiBhcnIubWFwKChkZWJ1Z0VsKSA9PiBkZWJ1Z0VsLm5hdGl2ZUVsZW1lbnQpO1xufVxuXG4vKipcbiAqIFNldCBvZiBzY29wZSBmdW5jdGlvbnMgdXNlZCB3aXRoIHtAbGluayBEZWJ1Z0VsZW1lbnR9J3MgcXVlcnkgZnVuY3Rpb25hbGl0eS5cbiAqL1xuZXhwb3J0IGNsYXNzIFNjb3BlIHtcbiAgLyoqXG4gICAqIFNjb3BlIHF1ZXJpZXMgdG8gYm90aCB0aGUgbGlnaHQgZG9tIGFuZCB2aWV3IG9mIGFuIGVsZW1lbnQgYW5kIGl0c1xuICAgKiBjaGlsZHJlbi5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgY29yZS9kZWJ1Zy90cy9kZWJ1Z19lbGVtZW50L2RlYnVnX2VsZW1lbnQudHMgcmVnaW9uPSdzY29wZV9hbGwnfVxuICAgKi9cbiAgc3RhdGljIGFsbChkZWJ1Z0VsZW1lbnQ6IERlYnVnRWxlbWVudCk6IERlYnVnRWxlbWVudFtdIHtcbiAgICB2YXIgc2NvcGUgPSBbXTtcbiAgICBzY29wZS5wdXNoKGRlYnVnRWxlbWVudCk7XG5cbiAgICBkZWJ1Z0VsZW1lbnQuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiBzY29wZSA9IHNjb3BlLmNvbmNhdChTY29wZS5hbGwoY2hpbGQpKSk7XG5cbiAgICBkZWJ1Z0VsZW1lbnQuY29tcG9uZW50Vmlld0NoaWxkcmVuLmZvckVhY2goY2hpbGQgPT4gc2NvcGUgPSBzY29wZS5jb25jYXQoU2NvcGUuYWxsKGNoaWxkKSkpO1xuXG4gICAgcmV0dXJuIHNjb3BlO1xuICB9XG5cbiAgLyoqXG4gICAqIFNjb3BlIHF1ZXJpZXMgdG8gdGhlIGxpZ2h0IGRvbSBvZiBhbiBlbGVtZW50IGFuZCBpdHMgY2hpbGRyZW4uXG4gICAqXG4gICAqICMjIEV4YW1wbGVcbiAgICpcbiAgICoge0BleGFtcGxlIGNvcmUvZGVidWcvdHMvZGVidWdfZWxlbWVudC9kZWJ1Z19lbGVtZW50LnRzIHJlZ2lvbj0nc2NvcGVfbGlnaHQnfVxuICAgKi9cbiAgc3RhdGljIGxpZ2h0KGRlYnVnRWxlbWVudDogRGVidWdFbGVtZW50KTogRGVidWdFbGVtZW50W10ge1xuICAgIHZhciBzY29wZSA9IFtdO1xuICAgIGRlYnVnRWxlbWVudC5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIHNjb3BlLnB1c2goY2hpbGQpO1xuICAgICAgc2NvcGUgPSBzY29wZS5jb25jYXQoU2NvcGUubGlnaHQoY2hpbGQpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2NvcGU7XG4gIH1cblxuICAvKipcbiAgICogU2NvcGUgcXVlcmllcyB0byB0aGUgdmlldyBvZiBhbiBlbGVtZW50IG9mIGl0cyBjaGlsZHJlbi5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgY29yZS9kZWJ1Zy90cy9kZWJ1Z19lbGVtZW50L2RlYnVnX2VsZW1lbnQudHMgcmVnaW9uPSdzY29wZV92aWV3J31cbiAgICovXG4gIHN0YXRpYyB2aWV3KGRlYnVnRWxlbWVudDogRGVidWdFbGVtZW50KTogRGVidWdFbGVtZW50W10ge1xuICAgIHZhciBzY29wZSA9IFtdO1xuXG4gICAgZGVidWdFbGVtZW50LmNvbXBvbmVudFZpZXdDaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIHNjb3BlLnB1c2goY2hpbGQpO1xuICAgICAgc2NvcGUgPSBzY29wZS5jb25jYXQoU2NvcGUubGlnaHQoY2hpbGQpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gc2NvcGU7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb3JlL2RlYnVnL2RlYnVnX2VsZW1lbnQudHNcbiAqKi8iLCJpbXBvcnQge1R5cGUsIGlzQmxhbmssIGlzUHJlc2VudCwgYXNzZXJ0aW9uc0VuYWJsZWQsIENPTlNUX0VYUFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3Byb3ZpZGUsIFByb3ZpZGVyLCBJbmplY3RvciwgT3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7Q29uc29sZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY29uc29sZSc7XG5pbXBvcnQge1JlZmxlY3RvciwgcmVmbGVjdG9yfSBmcm9tICcuL3JlZmxlY3Rpb24vcmVmbGVjdGlvbic7XG5pbXBvcnQge1Rlc3RhYmlsaXR5UmVnaXN0cnl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3Rlc3RhYmlsaXR5L3Rlc3RhYmlsaXR5JztcblxuZnVuY3Rpb24gX3JlZmxlY3RvcigpOiBSZWZsZWN0b3Ige1xuICByZXR1cm4gcmVmbGVjdG9yO1xufVxuXG4vKipcbiAqIEEgZGVmYXVsdCBzZXQgb2YgcHJvdmlkZXJzIHdoaWNoIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBhbnkgQW5ndWxhciBwbGF0Zm9ybS5cbiAqL1xuZXhwb3J0IGNvbnN0IFBMQVRGT1JNX0NPTU1PTl9QUk9WSURFUlM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPiA9IENPTlNUX0VYUFIoXG4gICAgW25ldyBQcm92aWRlcihSZWZsZWN0b3IsIHt1c2VGYWN0b3J5OiBfcmVmbGVjdG9yLCBkZXBzOiBbXX0pLCBUZXN0YWJpbGl0eVJlZ2lzdHJ5LCBDb25zb2xlXSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9wbGF0Zm9ybV9jb21tb25fcHJvdmlkZXJzLnRzXG4gKiovIiwiaW1wb3J0IHtUeXBlLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtwcm92aWRlLCBQcm92aWRlciwgSW5qZWN0b3IsIE9wYXF1ZVRva2VufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1xuICBBUFBfQ09NUE9ORU5UX1JFRl9QUk9NSVNFLFxuICBBUFBfQ09NUE9ORU5ULFxuICBBUFBfSURfUkFORE9NX1BST1ZJREVSXG59IGZyb20gJy4vYXBwbGljYXRpb25fdG9rZW5zJztcbmltcG9ydCB7XG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgZGVmYXVsdEl0ZXJhYmxlRGlmZmVycyxcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBkZWZhdWx0S2V5VmFsdWVEaWZmZXJzXG59IGZyb20gJy4vY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7QXBwVmlld1Bvb2wsIEFQUF9WSUVXX1BPT0xfQ0FQQUNJVFl9IGZyb20gJy4vbGlua2VyL3ZpZXdfcG9vbCc7XG5pbXBvcnQge0FwcFZpZXdNYW5hZ2VyfSBmcm9tICcuL2xpbmtlci92aWV3X21hbmFnZXInO1xuaW1wb3J0IHtBcHBWaWV3TWFuYWdlcl99IGZyb20gXCIuL2xpbmtlci92aWV3X21hbmFnZXJcIjtcbmltcG9ydCB7QXBwVmlld01hbmFnZXJVdGlsc30gZnJvbSAnLi9saW5rZXIvdmlld19tYW5hZ2VyX3V0aWxzJztcbmltcG9ydCB7Vmlld1Jlc29sdmVyfSBmcm9tICcuL2xpbmtlci92aWV3X3Jlc29sdmVyJztcbmltcG9ydCB7QXBwVmlld0xpc3RlbmVyfSBmcm9tICcuL2xpbmtlci92aWV3X2xpc3RlbmVyJztcbmltcG9ydCB7UHJvdG9WaWV3RmFjdG9yeX0gZnJvbSAnLi9saW5rZXIvcHJvdG9fdmlld19mYWN0b3J5JztcbmltcG9ydCB7RGlyZWN0aXZlUmVzb2x2ZXJ9IGZyb20gJy4vbGlua2VyL2RpcmVjdGl2ZV9yZXNvbHZlcic7XG5pbXBvcnQge1BpcGVSZXNvbHZlcn0gZnJvbSAnLi9saW5rZXIvcGlwZV9yZXNvbHZlcic7XG5pbXBvcnQge0NvbXBpbGVyfSBmcm9tICcuL2xpbmtlci9jb21waWxlcic7XG5pbXBvcnQge0NvbXBpbGVyX30gZnJvbSBcIi4vbGlua2VyL2NvbXBpbGVyXCI7XG5pbXBvcnQge0R5bmFtaWNDb21wb25lbnRMb2FkZXJ9IGZyb20gJy4vbGlua2VyL2R5bmFtaWNfY29tcG9uZW50X2xvYWRlcic7XG5pbXBvcnQge0R5bmFtaWNDb21wb25lbnRMb2FkZXJffSBmcm9tIFwiLi9saW5rZXIvZHluYW1pY19jb21wb25lbnRfbG9hZGVyXCI7XG5cbi8qKlxuICogQSBkZWZhdWx0IHNldCBvZiBwcm92aWRlcnMgd2hpY2ggc2hvdWxkIGJlIGluY2x1ZGVkIGluIGFueSBBbmd1bGFyXG4gKiBhcHBsaWNhdGlvbiwgcmVnYXJkbGVzcyBvZiB0aGUgcGxhdGZvcm0gaXQgcnVucyBvbnRvLlxuICovXG5leHBvcnQgY29uc3QgQVBQTElDQVRJT05fQ09NTU9OX1BST1ZJREVSUzogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+ID0gQ09OU1RfRVhQUihbXG4gIG5ldyBQcm92aWRlcihDb21waWxlciwge3VzZUNsYXNzOiBDb21waWxlcl99KSxcbiAgQVBQX0lEX1JBTkRPTV9QUk9WSURFUixcbiAgQXBwVmlld1Bvb2wsXG4gIG5ldyBQcm92aWRlcihBUFBfVklFV19QT09MX0NBUEFDSVRZLCB7dXNlVmFsdWU6IDEwMDAwfSksXG4gIG5ldyBQcm92aWRlcihBcHBWaWV3TWFuYWdlciwge3VzZUNsYXNzOiBBcHBWaWV3TWFuYWdlcl99KSxcbiAgQXBwVmlld01hbmFnZXJVdGlscyxcbiAgQXBwVmlld0xpc3RlbmVyLFxuICBQcm90b1ZpZXdGYWN0b3J5LFxuICBWaWV3UmVzb2x2ZXIsXG4gIG5ldyBQcm92aWRlcihJdGVyYWJsZURpZmZlcnMsIHt1c2VWYWx1ZTogZGVmYXVsdEl0ZXJhYmxlRGlmZmVyc30pLFxuICBuZXcgUHJvdmlkZXIoS2V5VmFsdWVEaWZmZXJzLCB7dXNlVmFsdWU6IGRlZmF1bHRLZXlWYWx1ZURpZmZlcnN9KSxcbiAgRGlyZWN0aXZlUmVzb2x2ZXIsXG4gIFBpcGVSZXNvbHZlcixcbiAgbmV3IFByb3ZpZGVyKER5bmFtaWNDb21wb25lbnRMb2FkZXIsIHt1c2VDbGFzczogRHluYW1pY0NvbXBvbmVudExvYWRlcl99KVxuXSk7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fY29tbW9uX3Byb3ZpZGVycy50c1xuICoqLyIsImV4cG9ydCAqIGZyb20gJy4vc3JjL2NvbW1vbi9waXBlcyc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb21tb24vZGlyZWN0aXZlcyc7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb21tb24vZm9ybXMnO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29tbW9uL2NvbW1vbl9kaXJlY3RpdmVzJztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9jb21tb24udHNcbiAqKi8iLCIvKipcbiAqIEBtb2R1bGVcbiAqIEBkZXNjcmlwdGlvblxuICogVGhpcyBtb2R1bGUgcHJvdmlkZXMgYSBzZXQgb2YgY29tbW9uIFBpcGVzLlxuICovXG5pbXBvcnQge0FzeW5jUGlwZX0gZnJvbSAnLi9waXBlcy9hc3luY19waXBlJztcbmltcG9ydCB7VXBwZXJDYXNlUGlwZX0gZnJvbSAnLi9waXBlcy91cHBlcmNhc2VfcGlwZSc7XG5pbXBvcnQge0xvd2VyQ2FzZVBpcGV9IGZyb20gJy4vcGlwZXMvbG93ZXJjYXNlX3BpcGUnO1xuaW1wb3J0IHtKc29uUGlwZX0gZnJvbSAnLi9waXBlcy9qc29uX3BpcGUnO1xuaW1wb3J0IHtTbGljZVBpcGV9IGZyb20gJy4vcGlwZXMvc2xpY2VfcGlwZSc7XG5pbXBvcnQge0RhdGVQaXBlfSBmcm9tICcuL3BpcGVzL2RhdGVfcGlwZSc7XG5pbXBvcnQge0RlY2ltYWxQaXBlLCBQZXJjZW50UGlwZSwgQ3VycmVuY3lQaXBlfSBmcm9tICcuL3BpcGVzL251bWJlcl9waXBlJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuZXhwb3J0IHtBc3luY1BpcGV9IGZyb20gJy4vcGlwZXMvYXN5bmNfcGlwZSc7XG5leHBvcnQge0RhdGVQaXBlfSBmcm9tICcuL3BpcGVzL2RhdGVfcGlwZSc7XG5leHBvcnQge0pzb25QaXBlfSBmcm9tICcuL3BpcGVzL2pzb25fcGlwZSc7XG5leHBvcnQge1NsaWNlUGlwZX0gZnJvbSAnLi9waXBlcy9zbGljZV9waXBlJztcbmV4cG9ydCB7TG93ZXJDYXNlUGlwZX0gZnJvbSAnLi9waXBlcy9sb3dlcmNhc2VfcGlwZSc7XG5leHBvcnQge051bWJlclBpcGUsIERlY2ltYWxQaXBlLCBQZXJjZW50UGlwZSwgQ3VycmVuY3lQaXBlfSBmcm9tICcuL3BpcGVzL251bWJlcl9waXBlJztcbmV4cG9ydCB7VXBwZXJDYXNlUGlwZX0gZnJvbSAnLi9waXBlcy91cHBlcmNhc2VfcGlwZSc7XG5cbi8qKlxuICogQSBjb2xsZWN0aW9uIG9mIEFuZ3VsYXIgY29yZSBwaXBlcyB0aGF0IGFyZSBsaWtlbHkgdG8gYmUgdXNlZCBpbiBlYWNoIGFuZCBldmVyeVxuICogYXBwbGljYXRpb24uXG4gKlxuICogVGhpcyBjb2xsZWN0aW9uIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZW51bWVyYXRlIGFsbCB0aGUgYnVpbHQtaW4gcGlwZXMgaW4gdGhlIGBwaXBlc2BcbiAqIHByb3BlcnR5IG9mIHRoZSBgQENvbXBvbmVudGAgb3IgYEBWaWV3YCBkZWNvcmF0b3JzLlxuICovXG5leHBvcnQgY29uc3QgQ09NTU9OX1BJUEVTID0gQ09OU1RfRVhQUihbXG4gIEFzeW5jUGlwZSxcbiAgVXBwZXJDYXNlUGlwZSxcbiAgTG93ZXJDYXNlUGlwZSxcbiAgSnNvblBpcGUsXG4gIFNsaWNlUGlwZSxcbiAgRGVjaW1hbFBpcGUsXG4gIFBlcmNlbnRQaXBlLFxuICBDdXJyZW5jeVBpcGUsXG4gIERhdGVQaXBlXG5dKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMudHNcbiAqKi8iLCJpbXBvcnQge2lzQmxhbmssIGlzUHJlc2VudCwgaXNQcm9taXNlLCBDT05TVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7UHJvbWlzZSwgT2JzZXJ2YWJsZVdyYXBwZXIsIE9ic2VydmFibGUsIEV2ZW50RW1pdHRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge1xuICBQaXBlLFxuICBJbmplY3RhYmxlLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgT25EZXN0cm95LFxuICBQaXBlVHJhbnNmb3JtLFxuICBXcmFwcGVkVmFsdWVcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmltcG9ydCB7SW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbn0gZnJvbSAnLi9pbnZhbGlkX3BpcGVfYXJndW1lbnRfZXhjZXB0aW9uJztcblxuY2xhc3MgT2JzZXJ2YWJsZVN0cmF0ZWd5IHtcbiAgY3JlYXRlU3Vic2NyaXB0aW9uKGFzeW5jOiBhbnksIHVwZGF0ZUxhdGVzdFZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBPYnNlcnZhYmxlV3JhcHBlci5zdWJzY3JpYmUoYXN5bmMsIHVwZGF0ZUxhdGVzdFZhbHVlLCBlID0+IHsgdGhyb3cgZTsgfSk7XG4gIH1cblxuICBkaXNwb3NlKHN1YnNjcmlwdGlvbjogYW55KTogdm9pZCB7IE9ic2VydmFibGVXcmFwcGVyLmRpc3Bvc2Uoc3Vic2NyaXB0aW9uKTsgfVxuXG4gIG9uRGVzdHJveShzdWJzY3JpcHRpb246IGFueSk6IHZvaWQgeyBPYnNlcnZhYmxlV3JhcHBlci5kaXNwb3NlKHN1YnNjcmlwdGlvbik7IH1cbn1cblxuY2xhc3MgUHJvbWlzZVN0cmF0ZWd5IHtcbiAgY3JlYXRlU3Vic2NyaXB0aW9uKGFzeW5jOiBhbnksIHVwZGF0ZUxhdGVzdFZhbHVlOiBhbnkpOiBhbnkge1xuICAgIHJldHVybiBhc3luYy50aGVuKHVwZGF0ZUxhdGVzdFZhbHVlKTtcbiAgfVxuXG4gIGRpc3Bvc2Uoc3Vic2NyaXB0aW9uOiBhbnkpOiB2b2lkIHt9XG5cbiAgb25EZXN0cm95KHN1YnNjcmlwdGlvbjogYW55KTogdm9pZCB7fVxufVxuXG52YXIgX3Byb21pc2VTdHJhdGVneSA9IG5ldyBQcm9taXNlU3RyYXRlZ3koKTtcbnZhciBfb2JzZXJ2YWJsZVN0cmF0ZWd5ID0gbmV3IE9ic2VydmFibGVTdHJhdGVneSgpO1xuXG5cbi8qKlxuICogVGhlIGBhc3luY2AgcGlwZSBzdWJzY3JpYmVzIHRvIGFuIE9ic2VydmFibGUgb3IgUHJvbWlzZSBhbmQgcmV0dXJucyB0aGUgbGF0ZXN0IHZhbHVlIGl0IGhhc1xuICogZW1pdHRlZC5cbiAqIFdoZW4gYSBuZXcgdmFsdWUgaXMgZW1pdHRlZCwgdGhlIGBhc3luY2AgcGlwZSBtYXJrcyB0aGUgY29tcG9uZW50IHRvIGJlIGNoZWNrZWQgZm9yIGNoYW5nZXMuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBUaGlzIGV4YW1wbGUgYmluZHMgYSBgUHJvbWlzZWAgdG8gdGhlIHZpZXcuIENsaWNraW5nIHRoZSBgUmVzb2x2ZWAgYnV0dG9uIHJlc29sdmVzIHRoZVxuICogcHJvbWlzZS5cbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9waXBlcy90cy9hc3luY19waXBlL2FzeW5jX3BpcGVfZXhhbXBsZS50cyByZWdpb249J0FzeW5jUGlwZSd9XG4gKlxuICogSXQncyBhbHNvIHBvc3NpYmxlIHRvIHVzZSBgYXN5bmNgIHdpdGggT2JzZXJ2YWJsZXMuIFRoZSBleGFtcGxlIGJlbG93IGJpbmRzIHRoZSBgdGltZWAgT2JzZXJ2YWJsZVxuICogdG8gdGhlIHZpZXcuIEV2ZXJ5IDUwMG1zLCB0aGUgYHRpbWVgIE9ic2VydmFibGUgdXBkYXRlcyB0aGUgdmlldyB3aXRoIHRoZSBjdXJyZW50IHRpbWUuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogYGBgXG4gKi9cbkBQaXBlKHtuYW1lOiAnYXN5bmMnLCBwdXJlOiBmYWxzZX0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXN5bmNQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSwgT25EZXN0cm95IHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbGF0ZXN0VmFsdWU6IE9iamVjdCA9IG51bGw7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2xhdGVzdFJldHVybmVkVmFsdWU6IE9iamVjdCA9IG51bGw7XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc3Vic2NyaXB0aW9uOiBPYmplY3QgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIF9vYmo6IE9ic2VydmFibGU8YW55PnwgUHJvbWlzZTxhbnk+fCBFdmVudEVtaXR0ZXI8YW55PiA9IG51bGw7XG4gIHByaXZhdGUgX3N0cmF0ZWd5OiBhbnkgPSBudWxsO1xuICAvKiogQGludGVybmFsICovXG4gIHB1YmxpYyBfcmVmOiBDaGFuZ2VEZXRlY3RvclJlZjtcbiAgY29uc3RydWN0b3IoX3JlZjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsgdGhpcy5fcmVmID0gX3JlZjsgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fc3Vic2NyaXB0aW9uKSkge1xuICAgICAgdGhpcy5fZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zZm9ybShvYmo6IE9ic2VydmFibGU8YW55PnwgUHJvbWlzZTxhbnk+fCBFdmVudEVtaXR0ZXI8YW55PiwgYXJncz86IGFueVtdKTogYW55IHtcbiAgICBpZiAoaXNCbGFuayh0aGlzLl9vYmopKSB7XG4gICAgICBpZiAoaXNQcmVzZW50KG9iaikpIHtcbiAgICAgICAgdGhpcy5fc3Vic2NyaWJlKG9iaik7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5fbGF0ZXN0VmFsdWU7XG4gICAgfVxuXG4gICAgaWYgKG9iaiAhPT0gdGhpcy5fb2JqKSB7XG4gICAgICB0aGlzLl9kaXNwb3NlKCk7XG4gICAgICByZXR1cm4gdGhpcy50cmFuc2Zvcm0ob2JqKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fbGF0ZXN0VmFsdWUgPT09IHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlID0gdGhpcy5fbGF0ZXN0VmFsdWU7XG4gICAgICByZXR1cm4gV3JhcHBlZFZhbHVlLndyYXAodGhpcy5fbGF0ZXN0VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N1YnNjcmliZShvYmo6IE9ic2VydmFibGU8YW55PnwgUHJvbWlzZTxhbnk+fCBFdmVudEVtaXR0ZXI8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuX29iaiA9IG9iajtcbiAgICB0aGlzLl9zdHJhdGVneSA9IHRoaXMuX3NlbGVjdFN0cmF0ZWd5KG9iaik7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID1cbiAgICAgICAgdGhpcy5fc3RyYXRlZ3kuY3JlYXRlU3Vic2NyaXB0aW9uKG9iaiwgdmFsdWUgPT4gdGhpcy5fdXBkYXRlTGF0ZXN0VmFsdWUob2JqLCB2YWx1ZSkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc2VsZWN0U3RyYXRlZ3kob2JqOiBPYnNlcnZhYmxlPGFueT58IFByb21pc2U8YW55PnwgRXZlbnRFbWl0dGVyPGFueT4pOiBhbnkge1xuICAgIGlmIChpc1Byb21pc2Uob2JqKSkge1xuICAgICAgcmV0dXJuIF9wcm9taXNlU3RyYXRlZ3k7XG4gICAgfSBlbHNlIGlmIChPYnNlcnZhYmxlV3JhcHBlci5pc09ic2VydmFibGUob2JqKSkge1xuICAgICAgcmV0dXJuIF9vYnNlcnZhYmxlU3RyYXRlZ3k7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9uKEFzeW5jUGlwZSwgb2JqKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9kaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuX3N0cmF0ZWd5LmRpc3Bvc2UodGhpcy5fc3Vic2NyaXB0aW9uKTtcbiAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IG51bGw7XG4gICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDtcbiAgICB0aGlzLl9vYmogPSBudWxsO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdXBkYXRlTGF0ZXN0VmFsdWUoYXN5bmM6IGFueSwgdmFsdWU6IE9iamVjdCkge1xuICAgIGlmIChhc3luYyA9PT0gdGhpcy5fb2JqKSB7XG4gICAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5fcmVmLm1hcmtGb3JDaGVjaygpO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9hc3luY19waXBlLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVCwgVHlwZSwgc3RyaW5naWZ5fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG5leHBvcnQgY2xhc3MgSW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbiBleHRlbmRzIEJhc2VFeGNlcHRpb24ge1xuICBjb25zdHJ1Y3Rvcih0eXBlOiBUeXBlLCB2YWx1ZTogT2JqZWN0KSB7XG4gICAgc3VwZXIoYEludmFsaWQgYXJndW1lbnQgJyR7dmFsdWV9JyBmb3IgcGlwZSAnJHtzdHJpbmdpZnkodHlwZSl9J2ApO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL2ludmFsaWRfcGlwZV9hcmd1bWVudF9leGNlcHRpb24udHNcbiAqKi8iLCJpbXBvcnQge2lzU3RyaW5nLCBDT05TVCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7UGlwZVRyYW5zZm9ybSwgV3JhcHBlZFZhbHVlLCBJbmplY3RhYmxlLCBQaXBlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7SW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbn0gZnJvbSAnLi9pbnZhbGlkX3BpcGVfYXJndW1lbnRfZXhjZXB0aW9uJztcblxuLyoqXG4gKiBJbXBsZW1lbnRzIHVwcGVyY2FzZSB0cmFuc2Zvcm1zIHRvIHRleHQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9waXBlcy90cy9sb3dlcnVwcGVyX3BpcGUvbG93ZXJ1cHBlcl9waXBlX2V4YW1wbGUudHMgcmVnaW9uPSdMb3dlclVwcGVyUGlwZSd9XG4gKi9cbkBDT05TVCgpXG5AUGlwZSh7bmFtZTogJ3VwcGVyY2FzZSd9KVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFVwcGVyQ2FzZVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKHZhbHVlOiBzdHJpbmcsIGFyZ3M6IGFueVtdID0gbnVsbCk6IHN0cmluZyB7XG4gICAgaWYgKGlzQmxhbmsodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgaWYgKCFpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9uKFVwcGVyQ2FzZVBpcGUsIHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlLnRvVXBwZXJDYXNlKCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMvdXBwZXJjYXNlX3BpcGUudHNcbiAqKi8iLCJpbXBvcnQge2lzU3RyaW5nLCBDT05TVCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7SW5qZWN0YWJsZSwgUGlwZVRyYW5zZm9ybSwgV3JhcHBlZFZhbHVlLCBQaXBlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7SW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbn0gZnJvbSAnLi9pbnZhbGlkX3BpcGVfYXJndW1lbnRfZXhjZXB0aW9uJztcblxuLyoqXG4gKiBUcmFuc2Zvcm1zIHRleHQgdG8gbG93ZXJjYXNlLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICoge0BleGFtcGxlIGNvcmUvcGlwZXMvdHMvbG93ZXJ1cHBlcl9waXBlL2xvd2VydXBwZXJfcGlwZV9leGFtcGxlLnRzIHJlZ2lvbj0nTG93ZXJVcHBlclBpcGUnfVxuICovXG5AQ09OU1QoKVxuQFBpcGUoe25hbWU6ICdsb3dlcmNhc2UnfSlcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb3dlckNhc2VQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSh2YWx1ZTogc3RyaW5nLCBhcmdzOiBhbnlbXSA9IG51bGwpOiBzdHJpbmcge1xuICAgIGlmIChpc0JsYW5rKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIGlmICghaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICB0aHJvdyBuZXcgSW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbihMb3dlckNhc2VQaXBlLCB2YWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL3BpcGVzL2xvd2VyY2FzZV9waXBlLnRzXG4gKiovIiwiaW1wb3J0IHtpc0JsYW5rLCBpc1ByZXNlbnQsIEpzb24sIENPTlNUfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtJbmplY3RhYmxlLCBQaXBlVHJhbnNmb3JtLCBXcmFwcGVkVmFsdWUsIFBpcGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG4vKipcbiAqIFRyYW5zZm9ybXMgYW55IGlucHV0IHZhbHVlIHVzaW5nIGBKU09OLnN0cmluZ2lmeWAuIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKiB7QGV4YW1wbGUgY29yZS9waXBlcy90cy9qc29uX3BpcGUvanNvbl9waXBlX2V4YW1wbGUudHMgcmVnaW9uPSdKc29uUGlwZSd9XG4gKi9cbkBDT05TVCgpXG5AUGlwZSh7bmFtZTogJ2pzb24nLCBwdXJlOiBmYWxzZX0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSnNvblBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGFyZ3M6IGFueVtdID0gbnVsbCk6IHN0cmluZyB7IHJldHVybiBKc29uLnN0cmluZ2lmeSh2YWx1ZSk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMvanNvbl9waXBlLnRzXG4gKiovIiwiaW1wb3J0IHtpc0JsYW5rLCBpc1N0cmluZywgaXNBcnJheSwgU3RyaW5nV3JhcHBlciwgQ09OU1R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtJbmplY3RhYmxlLCBQaXBlVHJhbnNmb3JtLCBXcmFwcGVkVmFsdWUsIFBpcGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9ufSBmcm9tICcuL2ludmFsaWRfcGlwZV9hcmd1bWVudF9leGNlcHRpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgTGlzdCBvciBTdHJpbmcgY29udGFpbmluZyBvbmx5IGEgc3Vic2V0IChzbGljZSkgb2YgdGhlXG4gKiBlbGVtZW50cy5cbiAqXG4gKiBUaGUgc3RhcnRpbmcgaW5kZXggb2YgdGhlIHN1YnNldCB0byByZXR1cm4gaXMgc3BlY2lmaWVkIGJ5IHRoZSBgc3RhcnRgIHBhcmFtZXRlci5cbiAqXG4gKiBUaGUgZW5kaW5nIGluZGV4IG9mIHRoZSBzdWJzZXQgdG8gcmV0dXJuIGlzIHNwZWNpZmllZCBieSB0aGUgb3B0aW9uYWwgYGVuZGAgcGFyYW1ldGVyLlxuICpcbiAqICMjIyBVc2FnZVxuICpcbiAqICAgICBleHByZXNzaW9uIHwgc2xpY2U6c3RhcnRbOmVuZF1cbiAqXG4gKiBBbGwgYmVoYXZpb3IgaXMgYmFzZWQgb24gdGhlIGV4cGVjdGVkIGJlaGF2aW9yIG9mIHRoZSBKYXZhU2NyaXB0IEFQSVxuICogQXJyYXkucHJvdG90eXBlLnNsaWNlKCkgYW5kIFN0cmluZy5wcm90b3R5cGUuc2xpY2UoKVxuICpcbiAqIFdoZXJlIHRoZSBpbnB1dCBleHByZXNzaW9uIGlzIGEgW0xpc3RdIG9yIFtTdHJpbmddLCBhbmQgYHN0YXJ0YCBpczpcbiAqXG4gKiAtICoqYSBwb3NpdGl2ZSBpbnRlZ2VyKio6IHJldHVybiB0aGUgaXRlbSBhdCBfc3RhcnRfIGluZGV4IGFuZCBhbGwgaXRlbXMgYWZ0ZXJcbiAqIGluIHRoZSBsaXN0IG9yIHN0cmluZyBleHByZXNzaW9uLlxuICogLSAqKmEgbmVnYXRpdmUgaW50ZWdlcioqOiByZXR1cm4gdGhlIGl0ZW0gYXQgX3N0YXJ0XyBpbmRleCBmcm9tIHRoZSBlbmQgYW5kIGFsbCBpdGVtcyBhZnRlclxuICogaW4gdGhlIGxpc3Qgb3Igc3RyaW5nIGV4cHJlc3Npb24uXG4gKiAtICoqYHxzdGFydHxgIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgZXhwcmVzc2lvbioqOiByZXR1cm4gYW4gZW1wdHkgbGlzdCBvciBzdHJpbmcuXG4gKiAtICoqYHxzdGFydHxgIG5lZ2F0aXZlIGdyZWF0ZXIgdGhhbiB0aGUgc2l6ZSBvZiB0aGUgZXhwcmVzc2lvbioqOiByZXR1cm4gZW50aXJlIGxpc3Qgb3JcbiAqIHN0cmluZyBleHByZXNzaW9uLlxuICpcbiAqIGFuZCB3aGVyZSBgZW5kYCBpczpcbiAqXG4gKiAtICoqb21pdHRlZCoqOiByZXR1cm4gYWxsIGl0ZW1zIHVudGlsIHRoZSBlbmQgb2YgdGhlIGlucHV0XG4gKiAtICoqYSBwb3NpdGl2ZSBpbnRlZ2VyKio6IHJldHVybiBhbGwgaXRlbXMgYmVmb3JlIF9lbmRfIGluZGV4IG9mIHRoZSBsaXN0IG9yIHN0cmluZ1xuICogZXhwcmVzc2lvbi5cbiAqIC0gKiphIG5lZ2F0aXZlIGludGVnZXIqKjogcmV0dXJuIGFsbCBpdGVtcyBiZWZvcmUgX2VuZF8gaW5kZXggZnJvbSB0aGUgZW5kIG9mIHRoZSBsaXN0XG4gKiBvciBzdHJpbmcgZXhwcmVzc2lvbi5cbiAqXG4gKiBXaGVuIG9wZXJhdGluZyBvbiBhIFtMaXN0XSwgdGhlIHJldHVybmVkIGxpc3QgaXMgYWx3YXlzIGEgY29weSBldmVuIHdoZW4gYWxsXG4gKiB0aGUgZWxlbWVudHMgYXJlIGJlaW5nIHJldHVybmVkLlxuICpcbiAqICMjIExpc3QgRXhhbXBsZVxuICpcbiAqIFRoaXMgYG5nRm9yYCBleGFtcGxlOlxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3BpcGVzL3RzL3NsaWNlX3BpcGUvc2xpY2VfcGlwZV9leGFtcGxlLnRzIHJlZ2lvbj0nU2xpY2VQaXBlX2xpc3QnfVxuICpcbiAqIHByb2R1Y2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICAgIDxsaT5iPC9saT5cbiAqICAgICA8bGk+YzwvbGk+XG4gKlxuICogIyMgU3RyaW5nIEV4YW1wbGVzXG4gKlxuICoge0BleGFtcGxlIGNvcmUvcGlwZXMvdHMvc2xpY2VfcGlwZS9zbGljZV9waXBlX2V4YW1wbGUudHMgcmVnaW9uPSdTbGljZVBpcGVfc3RyaW5nJ31cbiAqL1xuXG5AUGlwZSh7bmFtZTogJ3NsaWNlJywgcHVyZTogZmFsc2V9KVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNsaWNlUGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0ge1xuICB0cmFuc2Zvcm0odmFsdWU6IGFueSwgYXJnczogYW55W10gPSBudWxsKTogYW55IHtcbiAgICBpZiAoaXNCbGFuayhhcmdzKSB8fCBhcmdzLmxlbmd0aCA9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignU2xpY2UgcGlwZSByZXF1aXJlcyBvbmUgYXJndW1lbnQnKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnN1cHBvcnRzKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQaXBlQXJndW1lbnRFeGNlcHRpb24oU2xpY2VQaXBlLCB2YWx1ZSk7XG4gICAgfVxuICAgIGlmIChpc0JsYW5rKHZhbHVlKSkgcmV0dXJuIHZhbHVlO1xuICAgIHZhciBzdGFydDogbnVtYmVyID0gYXJnc1swXTtcbiAgICB2YXIgZW5kOiBudW1iZXIgPSBhcmdzLmxlbmd0aCA+IDEgPyBhcmdzWzFdIDogbnVsbDtcbiAgICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nV3JhcHBlci5zbGljZSh2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gICAgfVxuICAgIHJldHVybiBMaXN0V3JhcHBlci5zbGljZSh2YWx1ZSwgc3RhcnQsIGVuZCk7XG4gIH1cblxuICBwcml2YXRlIHN1cHBvcnRzKG9iajogYW55KTogYm9vbGVhbiB7IHJldHVybiBpc1N0cmluZyhvYmopIHx8IGlzQXJyYXkob2JqKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9zbGljZV9waXBlLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgaXNEYXRlLFxuICBpc051bWJlcixcbiAgaXNQcmVzZW50LFxuICBEYXRlLFxuICBEYXRlV3JhcHBlcixcbiAgQ09OU1QsXG4gIGlzQmxhbmssXG4gIEZ1bmN0aW9uV3JhcHBlclxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtEYXRlRm9ybWF0dGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2ludGwnO1xuaW1wb3J0IHtQaXBlVHJhbnNmb3JtLCBXcmFwcGVkVmFsdWUsIFBpcGUsIEluamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcblxuaW1wb3J0IHtJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9ufSBmcm9tICcuL2ludmFsaWRfcGlwZV9hcmd1bWVudF9leGNlcHRpb24nO1xuXG5cbi8vIFRPRE86IG1vdmUgdG8gYSBnbG9iYWwgY29uZmlndXJhYmxlIGxvY2F0aW9uIGFsb25nIHdpdGggb3RoZXIgaTE4biBjb21wb25lbnRzLlxudmFyIGRlZmF1bHRMb2NhbGU6IHN0cmluZyA9ICdlbi1VUyc7XG5cbi8qKlxuICogRm9ybWF0cyBhIGRhdGUgdmFsdWUgdG8gYSBzdHJpbmcgYmFzZWQgb24gdGhlIHJlcXVlc3RlZCBmb3JtYXQuXG4gKlxuICogV0FSTklOR1M6XG4gKiAtIHRoaXMgcGlwZSBpcyBtYXJrZWQgYXMgcHVyZSBoZW5jZSBpdCB3aWxsIG5vdCBiZSByZS1ldmFsdWF0ZWQgd2hlbiB0aGUgaW5wdXQgaXMgbXV0YXRlZC5cbiAqICAgSW5zdGVhZCB1c2VycyBzaG91bGQgdHJlYXQgdGhlIGRhdGUgYXMgYW4gaW1tdXRhYmxlIG9iamVjdCBhbmQgY2hhbmdlIHRoZSByZWZlcmVuY2Ugd2hlbiB0aGVcbiAqICAgcGlwZSBuZWVkcyB0byByZS1ydW4gKHRoaXMgaXMgdG8gYXZvaWQgcmVmb3JtYXR0aW5nIHRoZSBkYXRlIG9uIGV2ZXJ5IGNoYW5nZSBkZXRlY3Rpb24gcnVuXG4gKiAgIHdoaWNoIHdvdWxkIGJlIGFuIGV4cGVuc2l2ZSBvcGVyYXRpb24pLlxuICogLSB0aGlzIHBpcGUgdXNlcyB0aGUgSW50ZXJuYXRpb25hbGl6YXRpb24gQVBJLiBUaGVyZWZvcmUgaXQgaXMgb25seSByZWxpYWJsZSBpbiBDaHJvbWUgYW5kIE9wZXJhXG4gKiAgIGJyb3dzZXJzLlxuICpcbiAqICMjIFVzYWdlXG4gKlxuICogICAgIGV4cHJlc3Npb24gfCBkYXRlWzpmb3JtYXRdXG4gKlxuICogd2hlcmUgYGV4cHJlc3Npb25gIGlzIGEgZGF0ZSBvYmplY3Qgb3IgYSBudW1iZXIgKG1pbGxpc2Vjb25kcyBzaW5jZSBVVEMgZXBvY2gpIGFuZFxuICogYGZvcm1hdGAgaW5kaWNhdGVzIHdoaWNoIGRhdGUvdGltZSBjb21wb25lbnRzIHRvIGluY2x1ZGU6XG4gKlxuICogIHwgQ29tcG9uZW50IHwgU3ltYm9sIHwgU2hvcnQgRm9ybSAgIHwgTG9uZyBGb3JtICAgICAgICAgfCBOdW1lcmljICAgfCAyLWRpZ2l0ICAgfFxuICogIHwtLS0tLS0tLS0tLXw6LS0tLS0tOnwtLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tfFxuICogIHwgZXJhICAgICAgIHwgICBHICAgIHwgRyAoQUQpICAgICAgIHwgR0dHRyAoQW5ubyBEb21pbmkpfCAtICAgICAgICAgfCAtICAgICAgICAgfFxuICogIHwgeWVhciAgICAgIHwgICB5ICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCB5ICgyMDE1KSAgfCB5eSAoMTUpICAgfFxuICogIHwgbW9udGggICAgIHwgICBNICAgIHwgTU1NIChTZXApICAgIHwgTU1NTSAoU2VwdGVtYmVyKSAgfCBNICg5KSAgICAgfCBNTSAoMDkpICAgfFxuICogIHwgZGF5ICAgICAgIHwgICBkICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBkICgzKSAgICAgfCBkZCAoMDMpICAgfFxuICogIHwgd2Vla2RheSAgIHwgICBFICAgIHwgRUVFIChTdW4pICAgIHwgRUVFRSAoU3VuZGF5KSAgICAgfCAtICAgICAgICAgfCAtICAgICAgICAgfFxuICogIHwgaG91ciAgICAgIHwgICBqICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBqICgxMykgICAgfCBqaiAoMTMpICAgfFxuICogIHwgaG91cjEyICAgIHwgICBoICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBoICgxIFBNKSAgfCBoaCAoMDEgUE0pfFxuICogIHwgaG91cjI0ICAgIHwgICBIICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBIICgxMykgICAgfCBISCAoMTMpICAgfFxuICogIHwgbWludXRlICAgIHwgICBtICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBtICg1KSAgICAgfCBtbSAoMDUpICAgfFxuICogIHwgc2Vjb25kICAgIHwgICBzICAgIHwgLSAgICAgICAgICAgIHwgLSAgICAgICAgICAgICAgICAgfCBzICg5KSAgICAgfCBzcyAoMDkpICAgfFxuICogIHwgdGltZXpvbmUgIHwgICB6ICAgIHwgLSAgICAgICAgICAgIHwgeiAoUGFjaWZpYyBTdGFuZGFyZCBUaW1lKXwgLSAgfCAtICAgICAgICAgfFxuICogIHwgdGltZXpvbmUgIHwgICBaICAgIHwgWiAoR01ULTg6MDApIHwgLSAgICAgICAgICAgICAgICAgfCAtICAgICAgICAgfCAtICAgICAgICAgfFxuICpcbiAqIEluIGphdmFzY3JpcHQsIG9ubHkgdGhlIGNvbXBvbmVudHMgc3BlY2lmaWVkIHdpbGwgYmUgcmVzcGVjdGVkIChub3QgdGhlIG9yZGVyaW5nLFxuICogcHVuY3R1YXRpb25zLCAuLi4pIGFuZCBkZXRhaWxzIG9mIHRoZSBmb3JtYXR0aW5nIHdpbGwgYmUgZGVwZW5kZW50IG9uIHRoZSBsb2NhbGUuXG4gKiBPbiB0aGUgb3RoZXIgaGFuZCBpbiBEYXJ0IHZlcnNpb24sIHlvdSBjYW4gYWxzbyBpbmNsdWRlIHF1b3RlZCB0ZXh0IGFzIHdlbGwgYXMgc29tZSBleHRyYVxuICogZGF0ZS90aW1lIGNvbXBvbmVudHMgc3VjaCBhcyBxdWFydGVyLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWU6XG4gKiBodHRwczovL2FwaS5kYXJ0bGFuZy5vcmcvYXBpZG9jcy9jaGFubmVscy9zdGFibGUvZGFydGRvYy12aWV3ZXIvaW50bC9pbnRsLkRhdGVGb3JtYXQuXG4gKlxuICogYGZvcm1hdGAgY2FuIGFsc28gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgcHJlZGVmaW5lZCBmb3JtYXRzOlxuICpcbiAqICAtIGAnbWVkaXVtJ2A6IGVxdWl2YWxlbnQgdG8gYCd5TU1NZGptcydgIChlLmcuIFNlcCAzLCAyMDEwLCAxMjowNTowOCBQTSBmb3IgZW4tVVMpXG4gKiAgLSBgJ3Nob3J0J2A6IGVxdWl2YWxlbnQgdG8gYCd5TWRqbSdgIChlLmcuIDkvMy8yMDEwLCAxMjowNSBQTSBmb3IgZW4tVVMpXG4gKiAgLSBgJ2Z1bGxEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCd5TU1NTUVFRUVkJ2AgKGUuZy4gRnJpZGF5LCBTZXB0ZW1iZXIgMywgMjAxMCBmb3IgZW4tVVMpXG4gKiAgLSBgJ2xvbmdEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCd5TU1NTWQnYCAoZS5nLiBTZXB0ZW1iZXIgMywgMjAxMClcbiAqICAtIGAnbWVkaXVtRGF0ZSdgOiBlcXVpdmFsZW50IHRvIGAneU1NTWQnYCAoZS5nLiBTZXAgMywgMjAxMCBmb3IgZW4tVVMpXG4gKiAgLSBgJ3Nob3J0RGF0ZSdgOiBlcXVpdmFsZW50IHRvIGAneU1kJ2AgKGUuZy4gOS8zLzIwMTAgZm9yIGVuLVVTKVxuICogIC0gYCdtZWRpdW1UaW1lJ2A6IGVxdWl2YWxlbnQgdG8gYCdqbXMnYCAoZS5nLiAxMjowNTowOCBQTSBmb3IgZW4tVVMpXG4gKiAgLSBgJ3Nob3J0VGltZSdgOiBlcXVpdmFsZW50IHRvIGAnam0nYCAoZS5nLiAxMjowNSBQTSBmb3IgZW4tVVMpXG4gKlxuICogVGltZXpvbmUgb2YgdGhlIGZvcm1hdHRlZCB0ZXh0IHdpbGwgYmUgdGhlIGxvY2FsIHN5c3RlbSB0aW1lem9uZSBvZiB0aGUgZW5kLXVzZXJzIG1hY2hpbmUuXG4gKlxuICogIyMjIEV4YW1wbGVzXG4gKlxuICogQXNzdW1pbmcgYGRhdGVPYmpgIGlzICh5ZWFyOiAyMDE1LCBtb250aDogNiwgZGF5OiAxNSwgaG91cjogMjEsIG1pbnV0ZTogNDMsIHNlY29uZDogMTEpXG4gKiBpbiB0aGUgX2xvY2FsXyB0aW1lIGFuZCBsb2NhbGUgaXMgJ2VuLVVTJzpcbiAqXG4gKiBgYGBcbiAqICAgICB7eyBkYXRlT2JqIHwgZGF0ZSB9fSAgICAgICAgICAgICAgIC8vIG91dHB1dCBpcyAnSnVuIDE1LCAyMDE1J1xuICogICAgIHt7IGRhdGVPYmogfCBkYXRlOidtZWRpdW0nIH19ICAgICAgLy8gb3V0cHV0IGlzICdKdW4gMTUsIDIwMTUsIDk6NDM6MTEgUE0nXG4gKiAgICAge3sgZGF0ZU9iaiB8IGRhdGU6J3Nob3J0VGltZScgfX0gICAvLyBvdXRwdXQgaXMgJzk6NDMgUE0nXG4gKiAgICAge3sgZGF0ZU9iaiB8IGRhdGU6J21tc3MnIH19ICAgICAgICAvLyBvdXRwdXQgaXMgJzQzOjExJ1xuICogYGBgXG4gKlxuICoge0BleGFtcGxlIGNvcmUvcGlwZXMvdHMvZGF0ZV9waXBlL2RhdGVfcGlwZV9leGFtcGxlLnRzIHJlZ2lvbj0nRGF0ZVBpcGUnfVxuICovXG5AQ09OU1QoKVxuQFBpcGUoe25hbWU6ICdkYXRlJywgcHVyZTogdHJ1ZX0pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGF0ZVBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBzdGF0aWMgX0FMSUFTRVM6IHtba2V5OiBzdHJpbmddOiBTdHJpbmd9ID0ge1xuICAgICdtZWRpdW0nOiAneU1NTWRqbXMnLFxuICAgICdzaG9ydCc6ICd5TWRqbScsXG4gICAgJ2Z1bGxEYXRlJzogJ3lNTU1NRUVFRWQnLFxuICAgICdsb25nRGF0ZSc6ICd5TU1NTWQnLFxuICAgICdtZWRpdW1EYXRlJzogJ3lNTU1kJyxcbiAgICAnc2hvcnREYXRlJzogJ3lNZCcsXG4gICAgJ21lZGl1bVRpbWUnOiAnam1zJyxcbiAgICAnc2hvcnRUaW1lJzogJ2ptJ1xuICB9O1xuXG5cbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGFyZ3M6IGFueVtdKTogc3RyaW5nIHtcbiAgICBpZiAoaXNCbGFuayh2YWx1ZSkpIHJldHVybiBudWxsO1xuXG4gICAgaWYgKCF0aGlzLnN1cHBvcnRzKHZhbHVlKSkge1xuICAgICAgdGhyb3cgbmV3IEludmFsaWRQaXBlQXJndW1lbnRFeGNlcHRpb24oRGF0ZVBpcGUsIHZhbHVlKTtcbiAgICB9XG5cbiAgICB2YXIgcGF0dGVybjogc3RyaW5nID0gaXNQcmVzZW50KGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMCA/IGFyZ3NbMF0gOiAnbWVkaXVtRGF0ZSc7XG4gICAgaWYgKGlzTnVtYmVyKHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSBEYXRlV3JhcHBlci5mcm9tTWlsbGlzKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKFN0cmluZ01hcFdyYXBwZXIuY29udGFpbnMoRGF0ZVBpcGUuX0FMSUFTRVMsIHBhdHRlcm4pKSB7XG4gICAgICBwYXR0ZXJuID0gPHN0cmluZz5TdHJpbmdNYXBXcmFwcGVyLmdldChEYXRlUGlwZS5fQUxJQVNFUywgcGF0dGVybik7XG4gICAgfVxuICAgIHJldHVybiBEYXRlRm9ybWF0dGVyLmZvcm1hdCh2YWx1ZSwgZGVmYXVsdExvY2FsZSwgcGF0dGVybik7XG4gIH1cblxuICBzdXBwb3J0cyhvYmo6IGFueSk6IGJvb2xlYW4geyByZXR1cm4gaXNEYXRlKG9iaikgfHwgaXNOdW1iZXIob2JqKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9waXBlcy9kYXRlX3BpcGUudHNcbiAqKi8iLCJcbi8vIE1vZGlmaWVkIHZlcnNpb24gb2YgaW50ZXJuYWwgVHlwZXNjcmlwdCBpbnRsLmQudHMuXG4vLyBUT0RPKHBpbG9vcGluKTogcmVtb3ZlIHdoZW4gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zNTIxIGlzIHNoaXBwZWQuXG5kZWNsYXJlIG1vZHVsZSBJbnRsIHtcbiAgaW50ZXJmYWNlIE51bWJlckZvcm1hdE9wdGlvbnMge1xuICAgIGxvY2FsZU1hdGNoZXI/OiBzdHJpbmc7XG4gICAgc3R5bGU/OiBzdHJpbmc7XG4gICAgY3VycmVuY3k/OiBzdHJpbmc7XG4gICAgY3VycmVuY3lEaXNwbGF5Pzogc3RyaW5nO1xuICAgIHVzZUdyb3VwaW5nPzogYm9vbGVhbjtcbiAgICBtaW5pbXVtSW50ZWdlckRpZ2l0cz86IG51bWJlcjtcbiAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM/OiBudW1iZXI7XG4gICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzPzogbnVtYmVyO1xuICB9XG5cbiAgaW50ZXJmYWNlIE51bWJlckZvcm1hdCB7XG4gICAgZm9ybWF0KHZhbHVlOiBudW1iZXIpOiBzdHJpbmc7XG4gIH1cblxuICB2YXIgTnVtYmVyRm9ybWF0OiB7bmV3IChsb2NhbGU/OiBzdHJpbmcsIG9wdGlvbnM/OiBOdW1iZXJGb3JtYXRPcHRpb25zKTogTnVtYmVyRm9ybWF0fTtcblxuICBpbnRlcmZhY2UgRGF0ZVRpbWVGb3JtYXRPcHRpb25zIHtcbiAgICBsb2NhbGVNYXRjaGVyPzogc3RyaW5nO1xuICAgIHdlZWtkYXk/OiBzdHJpbmc7XG4gICAgZXJhPzogc3RyaW5nO1xuICAgIHllYXI/OiBzdHJpbmc7XG4gICAgbW9udGg/OiBzdHJpbmc7XG4gICAgZGF5Pzogc3RyaW5nO1xuICAgIGhvdXI/OiBzdHJpbmc7XG4gICAgbWludXRlPzogc3RyaW5nO1xuICAgIHNlY29uZD86IHN0cmluZztcbiAgICB0aW1lWm9uZU5hbWU/OiBzdHJpbmc7XG4gICAgZm9ybWF0TWF0Y2hlcj86IHN0cmluZztcbiAgICBob3VyMTI/OiBib29sZWFuO1xuICB9XG5cbiAgaW50ZXJmYWNlIERhdGVUaW1lRm9ybWF0IHtcbiAgICBmb3JtYXQoZGF0ZT86IERhdGUgfCBudW1iZXIpOiBzdHJpbmc7XG4gIH1cblxuICB2YXIgRGF0ZVRpbWVGb3JtYXQ6IHtuZXcgKGxvY2FsZT86IHN0cmluZywgb3B0aW9ucz86IERhdGVUaW1lRm9ybWF0T3B0aW9ucyk6IERhdGVUaW1lRm9ybWF0fTtcbn1cblxuZXhwb3J0IGVudW0gTnVtYmVyRm9ybWF0U3R5bGUge1xuICBEZWNpbWFsLFxuICBQZXJjZW50LFxuICBDdXJyZW5jeVxufVxuXG5leHBvcnQgY2xhc3MgTnVtYmVyRm9ybWF0dGVyIHtcbiAgc3RhdGljIGZvcm1hdChudW06IG51bWJlciwgbG9jYWxlOiBzdHJpbmcsIHN0eWxlOiBOdW1iZXJGb3JtYXRTdHlsZSxcbiAgICAgICAgICAgICAgICB7bWluaW11bUludGVnZXJEaWdpdHMgPSAxLCBtaW5pbXVtRnJhY3Rpb25EaWdpdHMgPSAwLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHMgPSAzLFxuICAgICAgICAgICAgICAgICBjdXJyZW5jeSwgY3VycmVuY3lBc1N5bWJvbCA9IGZhbHNlfToge1xuICAgICAgICAgICAgICAgICAgbWluaW11bUludGVnZXJEaWdpdHM/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICBtYXhpbXVtRnJhY3Rpb25EaWdpdHM/OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICBjdXJyZW5jeT86IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgIGN1cnJlbmN5QXNTeW1ib2w/OiBib29sZWFuXG4gICAgICAgICAgICAgICAgfSA9IHt9KTogc3RyaW5nIHtcbiAgICB2YXIgaW50bE9wdGlvbnM6IEludGwuTnVtYmVyRm9ybWF0T3B0aW9ucyA9IHtcbiAgICAgIG1pbmltdW1JbnRlZ2VyRGlnaXRzOiBtaW5pbXVtSW50ZWdlckRpZ2l0cyxcbiAgICAgIG1pbmltdW1GcmFjdGlvbkRpZ2l0czogbWluaW11bUZyYWN0aW9uRGlnaXRzLFxuICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBtYXhpbXVtRnJhY3Rpb25EaWdpdHNcbiAgICB9O1xuICAgIGludGxPcHRpb25zLnN0eWxlID0gTnVtYmVyRm9ybWF0U3R5bGVbc3R5bGVdLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHN0eWxlID09IE51bWJlckZvcm1hdFN0eWxlLkN1cnJlbmN5KSB7XG4gICAgICBpbnRsT3B0aW9ucy5jdXJyZW5jeSA9IGN1cnJlbmN5O1xuICAgICAgaW50bE9wdGlvbnMuY3VycmVuY3lEaXNwbGF5ID0gY3VycmVuY3lBc1N5bWJvbCA/ICdzeW1ib2wnIDogJ2NvZGUnO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEludGwuTnVtYmVyRm9ybWF0KGxvY2FsZSwgaW50bE9wdGlvbnMpLmZvcm1hdChudW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGRpZ2l0Q29uZGl0aW9uKGxlbjogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIGxlbiA9PSAyID8gJzItZGlnaXQnIDogJ251bWVyaWMnO1xufVxuZnVuY3Rpb24gbmFtZUNvbmRpdGlvbihsZW46IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBsZW4gPCA0ID8gJ3Nob3J0JyA6ICdsb25nJztcbn1cbmZ1bmN0aW9uIGV4dHJhY3RDb21wb25lbnRzKHBhdHRlcm46IHN0cmluZyk6IEludGwuRGF0ZVRpbWVGb3JtYXRPcHRpb25zIHtcbiAgdmFyIHJldDogSW50bC5EYXRlVGltZUZvcm1hdE9wdGlvbnMgPSB7fTtcbiAgdmFyIGkgPSAwLCBqO1xuICB3aGlsZSAoaSA8IHBhdHRlcm4ubGVuZ3RoKSB7XG4gICAgaiA9IGk7XG4gICAgd2hpbGUgKGogPCBwYXR0ZXJuLmxlbmd0aCAmJiBwYXR0ZXJuW2pdID09IHBhdHRlcm5baV0pIGorKztcbiAgICBsZXQgbGVuID0gaiAtIGk7XG4gICAgc3dpdGNoIChwYXR0ZXJuW2ldKSB7XG4gICAgICBjYXNlICdHJzpcbiAgICAgICAgcmV0LmVyYSA9IG5hbWVDb25kaXRpb24obGVuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICd5JzpcbiAgICAgICAgcmV0LnllYXIgPSBkaWdpdENvbmRpdGlvbihsZW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ00nOlxuICAgICAgICBpZiAobGVuID49IDMpXG4gICAgICAgICAgcmV0Lm1vbnRoID0gbmFtZUNvbmRpdGlvbihsZW4pO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgcmV0Lm1vbnRoID0gZGlnaXRDb25kaXRpb24obGVuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdkJzpcbiAgICAgICAgcmV0LmRheSA9IGRpZ2l0Q29uZGl0aW9uKGxlbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRSc6XG4gICAgICAgIHJldC53ZWVrZGF5ID0gbmFtZUNvbmRpdGlvbihsZW4pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2onOlxuICAgICAgICByZXQuaG91ciA9IGRpZ2l0Q29uZGl0aW9uKGxlbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnaCc6XG4gICAgICAgIHJldC5ob3VyID0gZGlnaXRDb25kaXRpb24obGVuKTtcbiAgICAgICAgcmV0LmhvdXIxMiA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnSCc6XG4gICAgICAgIHJldC5ob3VyID0gZGlnaXRDb25kaXRpb24obGVuKTtcbiAgICAgICAgcmV0LmhvdXIxMiA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ20nOlxuICAgICAgICByZXQubWludXRlID0gZGlnaXRDb25kaXRpb24obGVuKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzJzpcbiAgICAgICAgcmV0LnNlY29uZCA9IGRpZ2l0Q29uZGl0aW9uKGxlbik7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAneic6XG4gICAgICAgIHJldC50aW1lWm9uZU5hbWUgPSAnbG9uZyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnWic6XG4gICAgICAgIHJldC50aW1lWm9uZU5hbWUgPSAnc2hvcnQnO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgaSA9IGo7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxudmFyIGRhdGVGb3JtYXR0ZXJDYWNoZTogTWFwPHN0cmluZywgSW50bC5EYXRlVGltZUZvcm1hdD4gPSBuZXcgTWFwPHN0cmluZywgSW50bC5EYXRlVGltZUZvcm1hdD4oKTtcblxuZXhwb3J0IGNsYXNzIERhdGVGb3JtYXR0ZXIge1xuICBzdGF0aWMgZm9ybWF0KGRhdGU6IERhdGUsIGxvY2FsZTogc3RyaW5nLCBwYXR0ZXJuOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBrZXkgPSBsb2NhbGUgKyBwYXR0ZXJuO1xuICAgIGlmIChkYXRlRm9ybWF0dGVyQ2FjaGUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBkYXRlRm9ybWF0dGVyQ2FjaGUuZ2V0KGtleSkuZm9ybWF0KGRhdGUpO1xuICAgIH1cbiAgICB2YXIgZm9ybWF0dGVyID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBleHRyYWN0Q29tcG9uZW50cyhwYXR0ZXJuKSk7XG4gICAgZGF0ZUZvcm1hdHRlckNhY2hlLnNldChrZXksIGZvcm1hdHRlcik7XG4gICAgcmV0dXJuIGZvcm1hdHRlci5mb3JtYXQoZGF0ZSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvaW50bC50c1xuICoqLyIsImltcG9ydCB7XG4gIGlzTnVtYmVyLFxuICBpc1ByZXNlbnQsXG4gIGlzQmxhbmssXG4gIFN0cmluZ1dyYXBwZXIsXG4gIE51bWJlcldyYXBwZXIsXG4gIFJlZ0V4cFdyYXBwZXIsXG4gIENPTlNULFxuICBGdW5jdGlvbldyYXBwZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TnVtYmVyRm9ybWF0dGVyLCBOdW1iZXJGb3JtYXRTdHlsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9pbnRsJztcbmltcG9ydCB7SW5qZWN0YWJsZSwgUGlwZVRyYW5zZm9ybSwgV3JhcHBlZFZhbHVlLCBQaXBlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCB7SW52YWxpZFBpcGVBcmd1bWVudEV4Y2VwdGlvbn0gZnJvbSAnLi9pbnZhbGlkX3BpcGVfYXJndW1lbnRfZXhjZXB0aW9uJztcblxudmFyIGRlZmF1bHRMb2NhbGU6IHN0cmluZyA9ICdlbi1VUyc7XG52YXIgX3JlID0gUmVnRXhwV3JhcHBlci5jcmVhdGUoJ14oXFxcXGQrKT9cXFxcLigoXFxcXGQrKShcXFxcLShcXFxcZCspKT8pPyQnKTtcblxuLyoqXG4gKiBJbnRlcm5hbCBiYXNlIGNsYXNzIGZvciBudW1lcmljIHBpcGVzLlxuICovXG5AQ09OU1QoKVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE51bWJlclBpcGUge1xuICAvKiogQGludGVybmFsICovXG4gIHN0YXRpYyBfZm9ybWF0KHZhbHVlOiBudW1iZXIsIHN0eWxlOiBOdW1iZXJGb3JtYXRTdHlsZSwgZGlnaXRzOiBzdHJpbmcsIGN1cnJlbmN5OiBzdHJpbmcgPSBudWxsLFxuICAgICAgICAgICAgICAgICBjdXJyZW5jeUFzU3ltYm9sOiBib29sZWFuID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGlmIChpc0JsYW5rKHZhbHVlKSkgcmV0dXJuIG51bGw7XG4gICAgaWYgKCFpc051bWJlcih2YWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBJbnZhbGlkUGlwZUFyZ3VtZW50RXhjZXB0aW9uKE51bWJlclBpcGUsIHZhbHVlKTtcbiAgICB9XG4gICAgdmFyIG1pbkludCA9IDEsIG1pbkZyYWN0aW9uID0gMCwgbWF4RnJhY3Rpb24gPSAzO1xuICAgIGlmIChpc1ByZXNlbnQoZGlnaXRzKSkge1xuICAgICAgdmFyIHBhcnRzID0gUmVnRXhwV3JhcHBlci5maXJzdE1hdGNoKF9yZSwgZGlnaXRzKTtcbiAgICAgIGlmIChpc0JsYW5rKHBhcnRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgJHtkaWdpdHN9IGlzIG5vdCBhIHZhbGlkIGRpZ2l0IGluZm8gZm9yIG51bWJlciBwaXBlc2ApO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJlc2VudChwYXJ0c1sxXSkpIHsgIC8vIG1pbiBpbnRlZ2VyIGRpZ2l0c1xuICAgICAgICBtaW5JbnQgPSBOdW1iZXJXcmFwcGVyLnBhcnNlSW50QXV0b1JhZGl4KHBhcnRzWzFdKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQocGFydHNbM10pKSB7ICAvLyBtaW4gZnJhY3Rpb24gZGlnaXRzXG4gICAgICAgIG1pbkZyYWN0aW9uID0gTnVtYmVyV3JhcHBlci5wYXJzZUludEF1dG9SYWRpeChwYXJ0c1szXSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KHBhcnRzWzVdKSkgeyAgLy8gbWF4IGZyYWN0aW9uIGRpZ2l0c1xuICAgICAgICBtYXhGcmFjdGlvbiA9IE51bWJlcldyYXBwZXIucGFyc2VJbnRBdXRvUmFkaXgocGFydHNbNV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTnVtYmVyRm9ybWF0dGVyLmZvcm1hdCh2YWx1ZSwgZGVmYXVsdExvY2FsZSwgc3R5bGUsIHtcbiAgICAgIG1pbmltdW1JbnRlZ2VyRGlnaXRzOiBtaW5JbnQsXG4gICAgICBtaW5pbXVtRnJhY3Rpb25EaWdpdHM6IG1pbkZyYWN0aW9uLFxuICAgICAgbWF4aW11bUZyYWN0aW9uRGlnaXRzOiBtYXhGcmFjdGlvbixcbiAgICAgIGN1cnJlbmN5OiBjdXJyZW5jeSxcbiAgICAgIGN1cnJlbmN5QXNTeW1ib2w6IGN1cnJlbmN5QXNTeW1ib2xcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFdBUk5JTkc6IHRoaXMgcGlwZSB1c2VzIHRoZSBJbnRlcm5hdGlvbmFsaXphdGlvbiBBUEkuXG4gKiBUaGVyZWZvcmUgaXQgaXMgb25seSByZWxpYWJsZSBpbiBDaHJvbWUgYW5kIE9wZXJhIGJyb3dzZXJzLlxuICpcbiAqIEZvcm1hdHMgYSBudW1iZXIgYXMgbG9jYWwgdGV4dC4gaS5lLiBncm91cCBzaXppbmcgYW5kIHNlcGFyYXRvciBhbmQgb3RoZXIgbG9jYWxlLXNwZWNpZmljXG4gKiBjb25maWd1cmF0aW9ucyBhcmUgYmFzZWQgb24gdGhlIGFjdGl2ZSBsb2NhbGUuXG4gKlxuICogIyMjIFVzYWdlXG4gKlxuICogICAgIGV4cHJlc3Npb24gfCBudW1iZXJbOmRpZ2l0SW5mb11cbiAqXG4gKiB3aGVyZSBgZXhwcmVzc2lvbmAgaXMgYSBudW1iZXIgYW5kIGBkaWdpdEluZm9gIGhhcyB0aGUgZm9sbG93aW5nIGZvcm1hdDpcbiAqXG4gKiAgICAge21pbkludGVnZXJEaWdpdHN9LnttaW5GcmFjdGlvbkRpZ2l0c30te21heEZyYWN0aW9uRGlnaXRzfVxuICpcbiAqIC0gbWluSW50ZWdlckRpZ2l0cyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMgdG8gdXNlLiBEZWZhdWx0cyB0byAxLlxuICogLSBtaW5GcmFjdGlvbkRpZ2l0cyBpcyB0aGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIGZyYWN0aW9uLiBEZWZhdWx0cyB0byAwLlxuICogLSBtYXhGcmFjdGlvbkRpZ2l0cyBpcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIGZyYWN0aW9uLiBEZWZhdWx0cyB0byAzLlxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBhY2NlcHRhYmxlIHJhbmdlIGZvciBlYWNoIG9mIHRoZXNlIG51bWJlcnMgYW5kIG90aGVyXG4gKiBkZXRhaWxzIHNlZSB5b3VyIG5hdGl2ZSBpbnRlcm5hdGlvbmFsaXphdGlvbiBsaWJyYXJ5LlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICoge0BleGFtcGxlIGNvcmUvcGlwZXMvdHMvbnVtYmVyX3BpcGUvbnVtYmVyX3BpcGVfZXhhbXBsZS50cyByZWdpb249J051bWJlclBpcGUnfVxuICovXG5AQ09OU1QoKVxuQFBpcGUoe25hbWU6ICdudW1iZXInfSlcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZWNpbWFsUGlwZSBleHRlbmRzIE51bWJlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGFyZ3M6IGFueVtdKTogc3RyaW5nIHtcbiAgICB2YXIgZGlnaXRzOiBzdHJpbmcgPSBMaXN0V3JhcHBlci5maXJzdChhcmdzKTtcbiAgICByZXR1cm4gTnVtYmVyUGlwZS5fZm9ybWF0KHZhbHVlLCBOdW1iZXJGb3JtYXRTdHlsZS5EZWNpbWFsLCBkaWdpdHMpO1xuICB9XG59XG5cbi8qKlxuICogV0FSTklORzogdGhpcyBwaXBlIHVzZXMgdGhlIEludGVybmF0aW9uYWxpemF0aW9uIEFQSS5cbiAqIFRoZXJlZm9yZSBpdCBpcyBvbmx5IHJlbGlhYmxlIGluIENocm9tZSBhbmQgT3BlcmEgYnJvd3NlcnMuXG4gKlxuICogRm9ybWF0cyBhIG51bWJlciBhcyBsb2NhbCBwZXJjZW50LlxuICpcbiAqICMjIyBVc2FnZVxuICpcbiAqICAgICBleHByZXNzaW9uIHwgcGVyY2VudFs6ZGlnaXRJbmZvXVxuICpcbiAqIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGBkaWdpdEluZm9gIHNlZSB7QGxpbmsgRGVjaW1hbFBpcGV9XG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9waXBlcy90cy9udW1iZXJfcGlwZS9udW1iZXJfcGlwZV9leGFtcGxlLnRzIHJlZ2lvbj0nUGVyY2VudFBpcGUnfVxuICovXG5AQ09OU1QoKVxuQFBpcGUoe25hbWU6ICdwZXJjZW50J30pXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGVyY2VudFBpcGUgZXh0ZW5kcyBOdW1iZXJQaXBlIGltcGxlbWVudHMgUGlwZVRyYW5zZm9ybSB7XG4gIHRyYW5zZm9ybSh2YWx1ZTogYW55LCBhcmdzOiBhbnlbXSk6IHN0cmluZyB7XG4gICAgdmFyIGRpZ2l0czogc3RyaW5nID0gTGlzdFdyYXBwZXIuZmlyc3QoYXJncyk7XG4gICAgcmV0dXJuIE51bWJlclBpcGUuX2Zvcm1hdCh2YWx1ZSwgTnVtYmVyRm9ybWF0U3R5bGUuUGVyY2VudCwgZGlnaXRzKTtcbiAgfVxufVxuXG4vKipcbiAqIFdBUk5JTkc6IHRoaXMgcGlwZSB1c2VzIHRoZSBJbnRlcm5hdGlvbmFsaXphdGlvbiBBUEkuXG4gKiBUaGVyZWZvcmUgaXQgaXMgb25seSByZWxpYWJsZSBpbiBDaHJvbWUgYW5kIE9wZXJhIGJyb3dzZXJzLlxuICpcbiAqIEZvcm1hdHMgYSBudW1iZXIgYXMgbG9jYWwgY3VycmVuY3kuXG4gKlxuICogIyMjIFVzYWdlXG4gKlxuICogICAgIGV4cHJlc3Npb24gfCBjdXJyZW5jeVs6Y3VycmVuY3lDb2RlWzpzeW1ib2xEaXNwbGF5WzpkaWdpdEluZm9dXV1cbiAqXG4gKiB3aGVyZSBgY3VycmVuY3lDb2RlYCBpcyB0aGUgSVNPIDQyMTcgY3VycmVuY3kgY29kZSwgc3VjaCBhcyBcIlVTRFwiIGZvciB0aGUgVVMgZG9sbGFyIGFuZFxuICogXCJFVVJcIiBmb3IgdGhlIGV1cm8uIGBzeW1ib2xEaXNwbGF5YCBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRvIHVzZSB0aGUgY3VycmVuY3lcbiAqIHN5bWJvbCAoZS5nLiAkKSBvciB0aGUgY3VycmVuY3kgY29kZSAoZS5nLiBVU0QpIGluIHRoZSBvdXRwdXQuIFRoZSBkZWZhdWx0IGZvciB0aGlzIHZhbHVlXG4gKiBpcyBgZmFsc2VgLlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgYGRpZ2l0SW5mb2Agc2VlIHtAbGluayBEZWNpbWFsUGlwZX1cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSBjb3JlL3BpcGVzL3RzL251bWJlcl9waXBlL251bWJlcl9waXBlX2V4YW1wbGUudHMgcmVnaW9uPSdDdXJyZW5jeVBpcGUnfVxuICovXG5AQ09OU1QoKVxuQFBpcGUoe25hbWU6ICdjdXJyZW5jeSd9KVxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEN1cnJlbmN5UGlwZSBleHRlbmRzIE51bWJlclBpcGUgaW1wbGVtZW50cyBQaXBlVHJhbnNmb3JtIHtcbiAgdHJhbnNmb3JtKHZhbHVlOiBhbnksIGFyZ3M6IGFueVtdKTogc3RyaW5nIHtcbiAgICB2YXIgY3VycmVuY3lDb2RlOiBzdHJpbmcgPSBpc1ByZXNlbnQoYXJncykgJiYgYXJncy5sZW5ndGggPiAwID8gYXJnc1swXSA6ICdVU0QnO1xuICAgIHZhciBzeW1ib2xEaXNwbGF5OiBib29sZWFuID0gaXNQcmVzZW50KGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMSA/IGFyZ3NbMV0gOiBmYWxzZTtcbiAgICB2YXIgZGlnaXRzOiBzdHJpbmcgPSBpc1ByZXNlbnQoYXJncykgJiYgYXJncy5sZW5ndGggPiAyID8gYXJnc1syXSA6IG51bGw7XG4gICAgcmV0dXJuIE51bWJlclBpcGUuX2Zvcm1hdCh2YWx1ZSwgTnVtYmVyRm9ybWF0U3R5bGUuQ3VycmVuY3ksIGRpZ2l0cywgY3VycmVuY3lDb2RlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sRGlzcGxheSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vcGlwZXMvbnVtYmVyX3BpcGUudHNcbiAqKi8iLCIvKipcbiAqIEBtb2R1bGVcbiAqIEBkZXNjcmlwdGlvblxuICogQ29tbW9uIGRpcmVjdGl2ZXMgc2hpcHBlZCB3aXRoIEFuZ3VsYXIuXG4gKi9cbmV4cG9ydCB7TmdDbGFzc30gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2NsYXNzJztcbmV4cG9ydCB7TmdGb3J9IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19mb3InO1xuZXhwb3J0IHtOZ0lmfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfaWYnO1xuZXhwb3J0IHtOZ1N0eWxlfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfc3R5bGUnO1xuZXhwb3J0IHtOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHR9IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19zd2l0Y2gnO1xuZXhwb3J0ICogZnJvbSAnLi9kaXJlY3RpdmVzL29ic2VydmFibGVfbGlzdF9kaWZmJztcbmV4cG9ydCB7Q09SRV9ESVJFQ1RJVkVTfSBmcm9tICcuL2RpcmVjdGl2ZXMvY29yZV9kaXJlY3RpdmVzJztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudCwgaXNTdHJpbmcsIFN0cmluZ1dyYXBwZXIsIGlzQmxhbmssIGlzQXJyYXl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge1xuICBEb0NoZWNrLFxuICBPbkRlc3Ryb3ksXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgS2V5VmFsdWVEaWZmZXIsXG4gIEtleVZhbHVlRGlmZmVycyxcbiAgUmVuZGVyZXJcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXIsIGlzTGlzdExpa2VJdGVyYWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcblxuLyoqXG4gKiBUaGUgYE5nQ2xhc3NgIGRpcmVjdGl2ZSBjb25kaXRpb25hbGx5IGFkZHMgYW5kIHJlbW92ZXMgQ1NTIGNsYXNzZXMgb24gYW4gSFRNTCBlbGVtZW50IGJhc2VkIG9uXG4gKiBhbiBleHByZXNzaW9uJ3MgZXZhbHVhdGlvbiByZXN1bHQuXG4gKlxuICogVGhlIHJlc3VsdCBvZiBhbiBleHByZXNzaW9uIGV2YWx1YXRpb24gaXMgaW50ZXJwcmV0ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHR5cGUgb2ZcbiAqIHRoZSBleHByZXNzaW9uIGV2YWx1YXRpb24gcmVzdWx0OlxuICogLSBgc3RyaW5nYCAtIGFsbCB0aGUgQ1NTIGNsYXNzZXMgbGlzdGVkIGluIGEgc3RyaW5nIChzcGFjZSBkZWxpbWl0ZWQpIGFyZSBhZGRlZFxuICogLSBgQXJyYXlgIC0gYWxsIHRoZSBDU1MgY2xhc3NlcyAoQXJyYXkgZWxlbWVudHMpIGFyZSBhZGRlZFxuICogLSBgT2JqZWN0YCAtIGVhY2gga2V5IGNvcnJlc3BvbmRzIHRvIGEgQ1NTIGNsYXNzIG5hbWUgd2hpbGUgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBleHByZXNzaW9uc1xuICogZXZhbHVhdGluZyB0byBgQm9vbGVhbmAuIElmIGEgZ2l2ZW4gZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gYHRydWVgIGEgY29ycmVzcG9uZGluZyBDU1MgY2xhc3NcbiAqIGlzIGFkZGVkIC0gb3RoZXJ3aXNlIGl0IGlzIHJlbW92ZWQuXG4gKlxuICogV2hpbGUgdGhlIGBOZ0NsYXNzYCBkaXJlY3RpdmUgY2FuIGludGVycHJldCBleHByZXNzaW9ucyBldmFsdWF0aW5nIHRvIGBzdHJpbmdgLCBgQXJyYXlgXG4gKiBvciBgT2JqZWN0YCwgdGhlIGBPYmplY3RgLWJhc2VkIHZlcnNpb24gaXMgdGhlIG1vc3Qgb2Z0ZW4gdXNlZCBhbmQgaGFzIGFuIGFkdmFudGFnZSBvZiBrZWVwaW5nXG4gKiBhbGwgdGhlIENTUyBjbGFzcyBuYW1lcyBpbiBhIHRlbXBsYXRlLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9hNFlkdG1XeXdoSjMzdXFmcFBQbj9wPXByZXZpZXcpKTpcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7Q29tcG9uZW50fSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7TmdDbGFzc30gZnJvbSAnYW5ndWxhcjIvY29tbW9uJztcbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICd0b2dnbGUtYnV0dG9uJyxcbiAqICAgaW5wdXRzOiBbJ2lzRGlzYWJsZWQnXSxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvblwiIFtuZ0NsYXNzXT1cInthY3RpdmU6IGlzT24sIGRpc2FibGVkOiBpc0Rpc2FibGVkfVwiXG4gKiAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlKCFpc09uKVwiPlxuICogICAgICAgICAgQ2xpY2sgbWUhXG4gKiAgICAgIDwvZGl2PmAsXG4gKiAgIHN0eWxlczogW2BcbiAqICAgICAuYnV0dG9uIHtcbiAqICAgICAgIHdpZHRoOiAxMjBweDtcbiAqICAgICAgIGJvcmRlcjogbWVkaXVtIHNvbGlkIGJsYWNrO1xuICogICAgIH1cbiAqXG4gKiAgICAgLmFjdGl2ZSB7XG4gKiAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiByZWQ7XG4gKiAgICB9XG4gKlxuICogICAgIC5kaXNhYmxlZCB7XG4gKiAgICAgICBjb2xvcjogZ3JheTtcbiAqICAgICAgIGJvcmRlcjogbWVkaXVtIHNvbGlkIGdyYXk7XG4gKiAgICAgfVxuICogICBgXVxuICogICBkaXJlY3RpdmVzOiBbTmdDbGFzc11cbiAqIH0pXG4gKiBjbGFzcyBUb2dnbGVCdXR0b24ge1xuICogICBpc09uID0gZmFsc2U7XG4gKiAgIGlzRGlzYWJsZWQgPSBmYWxzZTtcbiAqXG4gKiAgIHRvZ2dsZShuZXdTdGF0ZSkge1xuICogICAgIGlmICghdGhpcy5pc0Rpc2FibGVkKSB7XG4gKiAgICAgICB0aGlzLmlzT24gPSBuZXdTdGF0ZTtcbiAqICAgICB9XG4gKiAgIH1cbiAqIH1cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ1tuZ0NsYXNzXScsIGlucHV0czogWydyYXdDbGFzczogbmdDbGFzcycsICdpbml0aWFsQ2xhc3NlczogY2xhc3MnXX0pXG5leHBvcnQgY2xhc3MgTmdDbGFzcyBpbXBsZW1lbnRzIERvQ2hlY2ssIE9uRGVzdHJveSB7XG4gIHByaXZhdGUgX2RpZmZlcjogYW55O1xuICBwcml2YXRlIF9tb2RlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2luaXRpYWxDbGFzc2VzID0gW107XG4gIHByaXZhdGUgX3Jhd0NsYXNzO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2l0ZXJhYmxlRGlmZmVyczogSXRlcmFibGVEaWZmZXJzLCBwcml2YXRlIF9rZXlWYWx1ZURpZmZlcnM6IEtleVZhbHVlRGlmZmVycyxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbmdFbDogRWxlbWVudFJlZiwgcHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyKSB7fVxuXG4gIHNldCBpbml0aWFsQ2xhc3Nlcyh2KSB7XG4gICAgdGhpcy5fYXBwbHlJbml0aWFsQ2xhc3Nlcyh0cnVlKTtcbiAgICB0aGlzLl9pbml0aWFsQ2xhc3NlcyA9IGlzUHJlc2VudCh2KSAmJiBpc1N0cmluZyh2KSA/IHYuc3BsaXQoJyAnKSA6IFtdO1xuICAgIHRoaXMuX2FwcGx5SW5pdGlhbENsYXNzZXMoZmFsc2UpO1xuICAgIHRoaXMuX2FwcGx5Q2xhc3Nlcyh0aGlzLl9yYXdDbGFzcywgZmFsc2UpO1xuICB9XG5cbiAgc2V0IHJhd0NsYXNzKHYpIHtcbiAgICB0aGlzLl9jbGVhbnVwQ2xhc3Nlcyh0aGlzLl9yYXdDbGFzcyk7XG5cbiAgICBpZiAoaXNTdHJpbmcodikpIHtcbiAgICAgIHYgPSB2LnNwbGl0KCcgJyk7XG4gICAgfVxuXG4gICAgdGhpcy5fcmF3Q2xhc3MgPSB2O1xuICAgIGlmIChpc1ByZXNlbnQodikpIHtcbiAgICAgIGlmIChpc0xpc3RMaWtlSXRlcmFibGUodikpIHtcbiAgICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5faXRlcmFibGVEaWZmZXJzLmZpbmQodikuY3JlYXRlKG51bGwpO1xuICAgICAgICB0aGlzLl9tb2RlID0gJ2l0ZXJhYmxlJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2tleVZhbHVlRGlmZmVycy5maW5kKHYpLmNyZWF0ZShudWxsKTtcbiAgICAgICAgdGhpcy5fbW9kZSA9ICdrZXlWYWx1ZSc7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2RpZmZlciA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fZGlmZmVyKSkge1xuICAgICAgdmFyIGNoYW5nZXMgPSB0aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9yYXdDbGFzcyk7XG4gICAgICBpZiAoaXNQcmVzZW50KGNoYW5nZXMpKSB7XG4gICAgICAgIGlmICh0aGlzLl9tb2RlID09ICdpdGVyYWJsZScpIHtcbiAgICAgICAgICB0aGlzLl9hcHBseUl0ZXJhYmxlQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLl9hcHBseUtleVZhbHVlQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQgeyB0aGlzLl9jbGVhbnVwQ2xhc3Nlcyh0aGlzLl9yYXdDbGFzcyk7IH1cblxuICBwcml2YXRlIF9jbGVhbnVwQ2xhc3NlcyhyYXdDbGFzc1ZhbCk6IHZvaWQge1xuICAgIHRoaXMuX2FwcGx5Q2xhc3NlcyhyYXdDbGFzc1ZhbCwgdHJ1ZSk7XG4gICAgdGhpcy5fYXBwbHlJbml0aWFsQ2xhc3NlcyhmYWxzZSk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseUtleVZhbHVlQ2hhbmdlcyhjaGFuZ2VzOiBhbnkpOiB2b2lkIHtcbiAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oKHJlY29yZCkgPT4geyB0aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQua2V5LCByZWNvcmQuY3VycmVudFZhbHVlKTsgfSk7XG4gICAgY2hhbmdlcy5mb3JFYWNoQ2hhbmdlZEl0ZW0oKHJlY29yZCkgPT4geyB0aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQua2V5LCByZWNvcmQuY3VycmVudFZhbHVlKTsgfSk7XG4gICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHJlY29yZCkgPT4ge1xuICAgICAgaWYgKHJlY29yZC5wcmV2aW91c1ZhbHVlKSB7XG4gICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5rZXksIGZhbHNlKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5SXRlcmFibGVDaGFuZ2VzKGNoYW5nZXM6IGFueSk6IHZvaWQge1xuICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgocmVjb3JkKSA9PiB7IHRoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5pdGVtLCB0cnVlKTsgfSk7XG4gICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKHJlY29yZCkgPT4geyB0aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQuaXRlbSwgZmFsc2UpOyB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5SW5pdGlhbENsYXNzZXMoaXNDbGVhbnVwOiBib29sZWFuKSB7XG4gICAgdGhpcy5faW5pdGlhbENsYXNzZXMuZm9yRWFjaChjbGFzc05hbWUgPT4gdGhpcy5fdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lLCAhaXNDbGVhbnVwKSk7XG4gIH1cblxuICBwcml2YXRlIF9hcHBseUNsYXNzZXMocmF3Q2xhc3NWYWw6IHN0cmluZ1tdIHwgU2V0PHN0cmluZz58IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNDbGVhbnVwOiBib29sZWFuKSB7XG4gICAgaWYgKGlzUHJlc2VudChyYXdDbGFzc1ZhbCkpIHtcbiAgICAgIGlmIChpc0FycmF5KHJhd0NsYXNzVmFsKSkge1xuICAgICAgICAoPHN0cmluZ1tdPnJhd0NsYXNzVmFsKS5mb3JFYWNoKGNsYXNzTmFtZSA9PiB0aGlzLl90b2dnbGVDbGFzcyhjbGFzc05hbWUsICFpc0NsZWFudXApKTtcbiAgICAgIH0gZWxzZSBpZiAocmF3Q2xhc3NWYWwgaW5zdGFuY2VvZiBTZXQpIHtcbiAgICAgICAgKDxTZXQ8c3RyaW5nPj5yYXdDbGFzc1ZhbCkuZm9yRWFjaChjbGFzc05hbWUgPT4gdGhpcy5fdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lLCAhaXNDbGVhbnVwKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goPHtbazogc3RyaW5nXTogc3RyaW5nfT5yYXdDbGFzc1ZhbCwgKGV4cFZhbCwgY2xhc3NOYW1lKSA9PiB7XG4gICAgICAgICAgaWYgKGV4cFZhbCkgdGhpcy5fdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lLCAhaXNDbGVhbnVwKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfdG9nZ2xlQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcsIGVuYWJsZWQpOiB2b2lkIHtcbiAgICBjbGFzc05hbWUgPSBjbGFzc05hbWUudHJpbSgpO1xuICAgIGlmIChjbGFzc05hbWUubGVuZ3RoID4gMCkge1xuICAgICAgaWYgKGNsYXNzTmFtZS5pbmRleE9mKCcgJykgPiAtMSkge1xuICAgICAgICB2YXIgY2xhc3NlcyA9IGNsYXNzTmFtZS5zcGxpdCgvXFxzKy9nKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRFbGVtZW50Q2xhc3ModGhpcy5fbmdFbCwgY2xhc3Nlc1tpXSwgZW5hYmxlZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldEVsZW1lbnRDbGFzcyh0aGlzLl9uZ0VsLCBjbGFzc05hbWUsIGVuYWJsZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzL25nX2NsYXNzLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgRG9DaGVjayxcbiAgRGlyZWN0aXZlLFxuICBDaGFuZ2VEZXRlY3RvclJlZixcbiAgSXRlcmFibGVEaWZmZXIsXG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdSZWZcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge2lzUHJlc2VudCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBUaGUgYE5nRm9yYCBkaXJlY3RpdmUgaW5zdGFudGlhdGVzIGEgdGVtcGxhdGUgb25jZSBwZXIgaXRlbSBmcm9tIGFuIGl0ZXJhYmxlLiBUaGUgY29udGV4dCBmb3JcbiAqIGVhY2ggaW5zdGFudGlhdGVkIHRlbXBsYXRlIGluaGVyaXRzIGZyb20gdGhlIG91dGVyIGNvbnRleHQgd2l0aCB0aGUgZ2l2ZW4gbG9vcCB2YXJpYWJsZSBzZXRcbiAqIHRvIHRoZSBjdXJyZW50IGl0ZW0gZnJvbSB0aGUgaXRlcmFibGUuXG4gKlxuICogIyBMb2NhbCBWYXJpYWJsZXNcbiAqXG4gKiBgTmdGb3JgIHByb3ZpZGVzIHNldmVyYWwgZXhwb3J0ZWQgdmFsdWVzIHRoYXQgY2FuIGJlIGFsaWFzZWQgdG8gbG9jYWwgdmFyaWFibGVzOlxuICpcbiAqICogYGluZGV4YCB3aWxsIGJlIHNldCB0byB0aGUgY3VycmVudCBsb29wIGl0ZXJhdGlvbiBmb3IgZWFjaCB0ZW1wbGF0ZSBjb250ZXh0LlxuICogKiBgbGFzdGAgd2lsbCBiZSBzZXQgdG8gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgaXRlbSBpcyB0aGUgbGFzdCBvbmUgaW4gdGhlXG4gKiAgIGl0ZXJhdGlvbi5cbiAqICogYGV2ZW5gIHdpbGwgYmUgc2V0IHRvIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBpdGVtIGhhcyBhbiBldmVuIGluZGV4LlxuICogKiBgb2RkYCB3aWxsIGJlIHNldCB0byBhIGJvb2xlYW4gdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaXRlbSBoYXMgYW4gb2RkIGluZGV4LlxuICpcbiAqICMgQ2hhbmdlIFByb3BhZ2F0aW9uXG4gKlxuICogV2hlbiB0aGUgY29udGVudHMgb2YgdGhlIGl0ZXJhdG9yIGNoYW5nZXMsIGBOZ0ZvcmAgbWFrZXMgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbmdlcyB0byB0aGUgRE9NOlxuICpcbiAqICogV2hlbiBhbiBpdGVtIGlzIGFkZGVkLCBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgdGVtcGxhdGUgaXMgYWRkZWQgdG8gdGhlIERPTS5cbiAqICogV2hlbiBhbiBpdGVtIGlzIHJlbW92ZWQsIGl0cyB0ZW1wbGF0ZSBpbnN0YW5jZSBpcyByZW1vdmVkIGZyb20gdGhlIERPTS5cbiAqICogV2hlbiBpdGVtcyBhcmUgcmVvcmRlcmVkLCB0aGVpciByZXNwZWN0aXZlIHRlbXBsYXRlcyBhcmUgcmVvcmRlcmVkIGluIHRoZSBET00uXG4gKiAqIE90aGVyd2lzZSwgdGhlIERPTSBlbGVtZW50IGZvciB0aGF0IGl0ZW0gd2lsbCByZW1haW4gdGhlIHNhbWUuXG4gKlxuICogQW5ndWxhciB1c2VzIG9iamVjdCBpZGVudGl0eSB0byB0cmFjayBpbnNlcnRpb25zIGFuZCBkZWxldGlvbnMgd2l0aGluIHRoZSBpdGVyYXRvciBhbmQgcmVwcm9kdWNlXG4gKiB0aG9zZSBjaGFuZ2VzIGluIHRoZSBET00uIFRoaXMgaGFzIGltcG9ydGFudCBpbXBsaWNhdGlvbnMgZm9yIGFuaW1hdGlvbnMgYW5kIGFueSBzdGF0ZWZ1bFxuICogY29udHJvbHNcbiAqIChzdWNoIGFzIGA8aW5wdXQ+YCBlbGVtZW50cyB3aGljaCBhY2NlcHQgdXNlciBpbnB1dCkgdGhhdCBhcmUgcHJlc2VudC4gSW5zZXJ0ZWQgcm93cyBjYW4gYmVcbiAqIGFuaW1hdGVkIGluLCBkZWxldGVkIHJvd3MgY2FuIGJlIGFuaW1hdGVkIG91dCwgYW5kIHVuY2hhbmdlZCByb3dzIHJldGFpbiBhbnkgdW5zYXZlZCBzdGF0ZSBzdWNoXG4gKiBhcyB1c2VyIGlucHV0LlxuICpcbiAqIEl0IGlzIHBvc3NpYmxlIGZvciB0aGUgaWRlbnRpdGllcyBvZiBlbGVtZW50cyBpbiB0aGUgaXRlcmF0b3IgdG8gY2hhbmdlIHdoaWxlIHRoZSBkYXRhIGRvZXMgbm90LlxuICogVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGl0ZXJhdG9yIHByb2R1Y2VkIGZyb20gYW4gUlBDIHRvIHRoZSBzZXJ2ZXIsIGFuZCB0aGF0XG4gKiBSUEMgaXMgcmUtcnVuLiBFdmVuIGlmIHRoZSBkYXRhIGhhc24ndCBjaGFuZ2VkLCB0aGUgc2Vjb25kIHJlc3BvbnNlIHdpbGwgcHJvZHVjZSBvYmplY3RzIHdpdGhcbiAqIGRpZmZlcmVudCBpZGVudGl0aWVzLCBhbmQgQW5ndWxhciB3aWxsIHRlYXIgZG93biB0aGUgZW50aXJlIERPTSBhbmQgcmVidWlsZCBpdCAoYXMgaWYgYWxsIG9sZFxuICogZWxlbWVudHMgd2VyZSBkZWxldGVkIGFuZCBhbGwgbmV3IGVsZW1lbnRzIGluc2VydGVkKS4gVGhpcyBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uIGFuZCBzaG91bGRcbiAqIGJlIGF2b2lkZWQgaWYgcG9zc2libGUuXG4gKlxuICogIyBTeW50YXhcbiAqXG4gKiAtIGA8bGkgKm5nRm9yPVwiI2l0ZW0gb2YgaXRlbXM7ICNpID0gaW5kZXhcIj4uLi48L2xpPmBcbiAqIC0gYDxsaSB0ZW1wbGF0ZT1cIm5nRm9yICNpdGVtIG9mIGl0ZW1zOyAjaSA9IGluZGV4XCI+Li4uPC9saT5gXG4gKiAtIGA8dGVtcGxhdGUgbmdGb3IgI2l0ZW0gW25nRm9yT2ZdPVwiaXRlbXNcIiAjaT1cImluZGV4XCI+PGxpPi4uLjwvbGk+PC90ZW1wbGF0ZT5gXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBTZWUgYSBbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9LVnVYeERwMHFpbkdEeW8zMDdRVz9wPXByZXZpZXcpIGZvciBhIG1vcmUgZGV0YWlsZWRcbiAqIGV4YW1wbGUuXG4gKi9cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW25nRm9yXVtuZ0Zvck9mXScsIGlucHV0czogWyduZ0Zvck9mJywgJ25nRm9yVGVtcGxhdGUnXX0pXG5leHBvcnQgY2xhc3MgTmdGb3IgaW1wbGVtZW50cyBEb0NoZWNrIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbmdGb3JPZjogYW55O1xuICBwcml2YXRlIF9kaWZmZXI6IEl0ZXJhYmxlRGlmZmVyO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3ZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsIHByaXZhdGUgX3RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfaXRlcmFibGVEaWZmZXJzOiBJdGVyYWJsZURpZmZlcnMsIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYpIHt9XG5cbiAgc2V0IG5nRm9yT2YodmFsdWU6IGFueSkge1xuICAgIHRoaXMuX25nRm9yT2YgPSB2YWx1ZTtcbiAgICBpZiAoaXNCbGFuayh0aGlzLl9kaWZmZXIpICYmIGlzUHJlc2VudCh2YWx1ZSkpIHtcbiAgICAgIHRoaXMuX2RpZmZlciA9IHRoaXMuX2l0ZXJhYmxlRGlmZmVycy5maW5kKHZhbHVlKS5jcmVhdGUodGhpcy5fY2RyKTtcbiAgICB9XG4gIH1cblxuICBzZXQgbmdGb3JUZW1wbGF0ZSh2YWx1ZTogVGVtcGxhdGVSZWYpIHtcbiAgICBpZiAoaXNQcmVzZW50KHZhbHVlKSkge1xuICAgICAgdGhpcy5fdGVtcGxhdGVSZWYgPSB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICBuZ0RvQ2hlY2soKSB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9kaWZmZXIpKSB7XG4gICAgICB2YXIgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMuX25nRm9yT2YpO1xuICAgICAgaWYgKGlzUHJlc2VudChjaGFuZ2VzKSkgdGhpcy5fYXBwbHlDaGFuZ2VzKGNoYW5nZXMpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2FwcGx5Q2hhbmdlcyhjaGFuZ2VzKSB7XG4gICAgLy8gVE9ETyhyYWRvKTogY2hlY2sgaWYgY2hhbmdlIGRldGVjdGlvbiBjYW4gcHJvZHVjZSBhIGNoYW5nZSByZWNvcmQgdGhhdCBpc1xuICAgIC8vIGVhc2llciB0byBjb25zdW1lIHRoYW4gY3VycmVudC5cbiAgICB2YXIgcmVjb3JkVmlld1R1cGxlcyA9IFtdO1xuICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChyZW1vdmVkUmVjb3JkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRWaWV3VHVwbGVzLnB1c2gobmV3IFJlY29yZFZpZXdUdXBsZShyZW1vdmVkUmVjb3JkLCBudWxsKSkpO1xuXG4gICAgY2hhbmdlcy5mb3JFYWNoTW92ZWRJdGVtKChtb3ZlZFJlY29yZCkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZFZpZXdUdXBsZXMucHVzaChuZXcgUmVjb3JkVmlld1R1cGxlKG1vdmVkUmVjb3JkLCBudWxsKSkpO1xuXG4gICAgdmFyIGluc2VydFR1cGxlcyA9IHRoaXMuX2J1bGtSZW1vdmUocmVjb3JkVmlld1R1cGxlcyk7XG5cbiAgICBjaGFuZ2VzLmZvckVhY2hBZGRlZEl0ZW0oKGFkZGVkUmVjb3JkKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VHVwbGVzLnB1c2gobmV3IFJlY29yZFZpZXdUdXBsZShhZGRlZFJlY29yZCwgbnVsbCkpKTtcblxuICAgIHRoaXMuX2J1bGtJbnNlcnQoaW5zZXJ0VHVwbGVzKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5zZXJ0VHVwbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9wZXJWaWV3Q2hhbmdlKGluc2VydFR1cGxlc1tpXS52aWV3LCBpbnNlcnRUdXBsZXNbaV0ucmVjb3JkKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMCwgaWxlbiA9IHRoaXMuX3ZpZXdDb250YWluZXIubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7XG4gICAgICB0aGlzLl92aWV3Q29udGFpbmVyLmdldChpKS5zZXRMb2NhbCgnbGFzdCcsIGkgPT09IGlsZW4gLSAxKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wZXJWaWV3Q2hhbmdlKHZpZXcsIHJlY29yZCkge1xuICAgIHZpZXcuc2V0TG9jYWwoJ1xcJGltcGxpY2l0JywgcmVjb3JkLml0ZW0pO1xuICAgIHZpZXcuc2V0TG9jYWwoJ2luZGV4JywgcmVjb3JkLmN1cnJlbnRJbmRleCk7XG4gICAgdmlldy5zZXRMb2NhbCgnZXZlbicsIChyZWNvcmQuY3VycmVudEluZGV4ICUgMiA9PSAwKSk7XG4gICAgdmlldy5zZXRMb2NhbCgnb2RkJywgKHJlY29yZC5jdXJyZW50SW5kZXggJSAyID09IDEpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1bGtSZW1vdmUodHVwbGVzOiBSZWNvcmRWaWV3VHVwbGVbXSk6IFJlY29yZFZpZXdUdXBsZVtdIHtcbiAgICB0dXBsZXMuc29ydCgoYSwgYikgPT4gYS5yZWNvcmQucHJldmlvdXNJbmRleCAtIGIucmVjb3JkLnByZXZpb3VzSW5kZXgpO1xuICAgIHZhciBtb3ZlZFR1cGxlcyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSB0dXBsZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgIHZhciB0dXBsZSA9IHR1cGxlc1tpXTtcbiAgICAgIC8vIHNlcGFyYXRlIG1vdmVkIHZpZXdzIGZyb20gcmVtb3ZlZCB2aWV3cy5cbiAgICAgIGlmIChpc1ByZXNlbnQodHVwbGUucmVjb3JkLmN1cnJlbnRJbmRleCkpIHtcbiAgICAgICAgdHVwbGUudmlldyA9IHRoaXMuX3ZpZXdDb250YWluZXIuZGV0YWNoKHR1cGxlLnJlY29yZC5wcmV2aW91c0luZGV4KTtcbiAgICAgICAgbW92ZWRUdXBsZXMucHVzaCh0dXBsZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyLnJlbW92ZSh0dXBsZS5yZWNvcmQucHJldmlvdXNJbmRleCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtb3ZlZFR1cGxlcztcbiAgfVxuXG4gIHByaXZhdGUgX2J1bGtJbnNlcnQodHVwbGVzOiBSZWNvcmRWaWV3VHVwbGVbXSk6IFJlY29yZFZpZXdUdXBsZVtdIHtcbiAgICB0dXBsZXMuc29ydCgoYSwgYikgPT4gYS5yZWNvcmQuY3VycmVudEluZGV4IC0gYi5yZWNvcmQuY3VycmVudEluZGV4KTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR1cGxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHR1cGxlID0gdHVwbGVzW2ldO1xuICAgICAgaWYgKGlzUHJlc2VudCh0dXBsZS52aWV3KSkge1xuICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyLmluc2VydCh0dXBsZS52aWV3LCB0dXBsZS5yZWNvcmQuY3VycmVudEluZGV4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR1cGxlLnZpZXcgPVxuICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGVtcGxhdGVSZWYsIHR1cGxlLnJlY29yZC5jdXJyZW50SW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHVwbGVzO1xuICB9XG59XG5cbmNsYXNzIFJlY29yZFZpZXdUdXBsZSB7XG4gIHZpZXc6IFZpZXdSZWY7XG4gIHJlY29yZDogYW55O1xuICBjb25zdHJ1Y3RvcihyZWNvcmQsIHZpZXcpIHtcbiAgICB0aGlzLnJlY29yZCA9IHJlY29yZDtcbiAgICB0aGlzLnZpZXcgPSB2aWV3O1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvbmdfZm9yLnRzXG4gKiovIiwiaW1wb3J0IHtEaXJlY3RpdmUsIFZpZXdDb250YWluZXJSZWYsIFRlbXBsYXRlUmVmfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7aXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBSZW1vdmVzIG9yIHJlY3JlYXRlcyBhIHBvcnRpb24gb2YgdGhlIERPTSB0cmVlIGJhc2VkIG9uIGFuIHtleHByZXNzaW9ufS5cbiAqXG4gKiBJZiB0aGUgZXhwcmVzc2lvbiBhc3NpZ25lZCB0byBgbmdJZmAgZXZhbHVhdGVzIHRvIGEgZmFsc2UgdmFsdWUgdGhlbiB0aGUgZWxlbWVudFxuICogaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00sIG90aGVyd2lzZSBhIGNsb25lIG9mIHRoZSBlbGVtZW50IGlzIHJlaW5zZXJ0ZWQgaW50byB0aGUgRE9NLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9mZTBrZ2VtRkJ0bVFPWTMxYjR0dz9wPXByZXZpZXcpKTpcbiAqXG4gKiBgYGBcbiAqIDxkaXYgKm5nSWY9XCJlcnJvckNvdW50ID4gMFwiIGNsYXNzPVwiZXJyb3JcIj5cbiAqICAgPCEtLSBFcnJvciBtZXNzYWdlIGRpc3BsYXllZCB3aGVuIHRoZSBlcnJvckNvdW50IHByb3BlcnR5IG9uIHRoZSBjdXJyZW50IGNvbnRleHQgaXMgZ3JlYXRlclxuICogdGhhbiAwLiAtLT5cbiAqICAge3tlcnJvckNvdW50fX0gZXJyb3JzIGRldGVjdGVkXG4gKiA8L2Rpdj5cbiAqIGBgYFxuICpcbiAqICMjIyBTeW50YXhcbiAqXG4gKiAtIGA8ZGl2ICpuZ0lmPVwiY29uZGl0aW9uXCI+Li4uPC9kaXY+YFxuICogLSBgPGRpdiB0ZW1wbGF0ZT1cIm5nSWYgY29uZGl0aW9uXCI+Li4uPC9kaXY+YFxuICogLSBgPHRlbXBsYXRlIFtuZ0lmXT1cImNvbmRpdGlvblwiPjxkaXY+Li4uPC9kaXY+PC90ZW1wbGF0ZT5gXG4gKi9cbkBEaXJlY3RpdmUoe3NlbGVjdG9yOiAnW25nSWZdJywgaW5wdXRzOiBbJ25nSWYnXX0pXG5leHBvcnQgY2xhc3MgTmdJZiB7XG4gIHByaXZhdGUgX3ByZXZDb25kaXRpb246IGJvb2xlYW4gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3ZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsIHByaXZhdGUgX3RlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZikge31cblxuICBzZXQgbmdJZihuZXdDb25kaXRpb24gLyogYm9vbGVhbiAqLykge1xuICAgIGlmIChuZXdDb25kaXRpb24gJiYgKGlzQmxhbmsodGhpcy5fcHJldkNvbmRpdGlvbikgfHwgIXRoaXMuX3ByZXZDb25kaXRpb24pKSB7XG4gICAgICB0aGlzLl9wcmV2Q29uZGl0aW9uID0gdHJ1ZTtcbiAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RlbXBsYXRlUmVmKTtcbiAgICB9IGVsc2UgaWYgKCFuZXdDb25kaXRpb24gJiYgKGlzQmxhbmsodGhpcy5fcHJldkNvbmRpdGlvbikgfHwgdGhpcy5fcHJldkNvbmRpdGlvbikpIHtcbiAgICAgIHRoaXMuX3ByZXZDb25kaXRpb24gPSBmYWxzZTtcbiAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuY2xlYXIoKTtcbiAgICB9XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZGlyZWN0aXZlcy9uZ19pZi50c1xuICoqLyIsImltcG9ydCB7XG4gIERvQ2hlY2ssXG4gIEtleVZhbHVlRGlmZmVyLFxuICBLZXlWYWx1ZURpZmZlcnMsXG4gIEVsZW1lbnRSZWYsXG4gIERpcmVjdGl2ZSxcbiAgUmVuZGVyZXJcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge2lzUHJlc2VudCwgaXNCbGFuaywgcHJpbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogVGhlIGBOZ1N0eWxlYCBkaXJlY3RpdmUgY2hhbmdlcyBzdHlsZXMgYmFzZWQgb24gYSByZXN1bHQgb2YgZXhwcmVzc2lvbiBldmFsdWF0aW9uLlxuICpcbiAqIEFuIGV4cHJlc3Npb24gYXNzaWduZWQgdG8gdGhlIGBuZ1N0eWxlYCBwcm9wZXJ0eSBtdXN0IGV2YWx1YXRlIHRvIGFuIG9iamVjdCBhbmQgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGVsZW1lbnQgc3R5bGVzIGFyZSB1cGRhdGVkIGJhc2VkIG9uIGNoYW5nZXMgdG8gdGhpcyBvYmplY3QuIFN0eWxlIG5hbWVzIHRvIHVwZGF0ZVxuICogYXJlIHRha2VuIGZyb20gdGhlIG9iamVjdCdzIGtleXMsIGFuZCB2YWx1ZXMgLSBmcm9tIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdCdzIHZhbHVlcy5cbiAqXG4gKiAjIyMgU3ludGF4XG4gKlxuICogLSBgPGRpdiBbbmdTdHlsZV09XCJ7J2ZvbnQtc3R5bGUnOiBzdHlsZX1cIj48L2Rpdj5gXG4gKiAtIGA8ZGl2IFtuZ1N0eWxlXT1cInN0eWxlRXhwXCI+PC9kaXY+YCAtIGhlcmUgdGhlIGBzdHlsZUV4cGAgbXVzdCBldmFsdWF0ZSB0byBhbiBvYmplY3RcbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvWWFtR1M2R2tVaDlHcVdOUWhDeU0/cD1wcmV2aWV3KSk6XG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge05nU3R5bGV9IGZyb20gJ2FuZ3VsYXIyL2NvbW1vbic7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgc2VsZWN0b3I6ICduZ1N0eWxlLWV4YW1wbGUnLFxuICogIHRlbXBsYXRlOiBgXG4gKiAgICA8aDEgW25nU3R5bGVdPVwieydmb250LXN0eWxlJzogc3R5bGUsICdmb250LXNpemUnOiBzaXplLCAnZm9udC13ZWlnaHQnOiB3ZWlnaHR9XCI+XG4gKiAgICAgIENoYW5nZSBzdHlsZSBvZiB0aGlzIHRleHQhXG4gKiAgICA8L2gxPlxuICpcbiAqICAgIDxocj5cbiAqXG4gKiAgICA8bGFiZWw+SXRhbGljOiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJjaGFuZ2VTdHlsZSgkZXZlbnQpXCI+PC9sYWJlbD5cbiAqICAgIDxsYWJlbD5Cb2xkOiA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgKGNoYW5nZSk9XCJjaGFuZ2VXZWlnaHQoJGV2ZW50KVwiPjwvbGFiZWw+XG4gKiAgICA8bGFiZWw+U2l6ZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgW3ZhbHVlXT1cInNpemVcIiAoY2hhbmdlKT1cInNpemUgPSAkZXZlbnQudGFyZ2V0LnZhbHVlXCI+PC9sYWJlbD5cbiAqICBgLFxuICogIGRpcmVjdGl2ZXM6IFtOZ1N0eWxlXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBOZ1N0eWxlRXhhbXBsZSB7XG4gKiAgICBzdHlsZSA9ICdub3JtYWwnO1xuICogICAgd2VpZ2h0ID0gJ25vcm1hbCc7XG4gKiAgICBzaXplID0gJzIwcHgnO1xuICpcbiAqICAgIGNoYW5nZVN0eWxlKCRldmVudDogYW55KSB7XG4gKiAgICAgIHRoaXMuc3R5bGUgPSAkZXZlbnQudGFyZ2V0LmNoZWNrZWQgPyAnaXRhbGljJyA6ICdub3JtYWwnO1xuICogICAgfVxuICpcbiAqICAgIGNoYW5nZVdlaWdodCgkZXZlbnQ6IGFueSkge1xuICogICAgICB0aGlzLndlaWdodCA9ICRldmVudC50YXJnZXQuY2hlY2tlZCA/ICdib2xkJyA6ICdub3JtYWwnO1xuICogICAgfVxuICogfVxuICogYGBgXG4gKlxuICogSW4gdGhpcyBleGFtcGxlIHRoZSBgZm9udC1zdHlsZWAsIGBmb250LXNpemVgIGFuZCBgZm9udC13ZWlnaHRgIHN0eWxlcyB3aWxsIGJlIHVwZGF0ZWRcbiAqIGJhc2VkIG9uIHRoZSBgc3R5bGVgIHByb3BlcnR5J3MgdmFsdWUgY2hhbmdlcy5cbiAqL1xuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdbbmdTdHlsZV0nLCBpbnB1dHM6IFsncmF3U3R5bGU6IG5nU3R5bGUnXX0pXG5leHBvcnQgY2xhc3MgTmdTdHlsZSBpbXBsZW1lbnRzIERvQ2hlY2sge1xuICAvKiogQGludGVybmFsICovXG4gIF9yYXdTdHlsZTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGlmZmVyOiBLZXlWYWx1ZURpZmZlcjtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kaWZmZXJzOiBLZXlWYWx1ZURpZmZlcnMsIHByaXZhdGUgX25nRWw6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlcikge31cblxuICBzZXQgcmF3U3R5bGUodikge1xuICAgIHRoaXMuX3Jhd1N0eWxlID0gdjtcbiAgICBpZiAoaXNCbGFuayh0aGlzLl9kaWZmZXIpICYmIGlzUHJlc2VudCh2KSkge1xuICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5fZGlmZmVycy5maW5kKHRoaXMuX3Jhd1N0eWxlKS5jcmVhdGUobnVsbCk7XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCkge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fZGlmZmVyKSkge1xuICAgICAgdmFyIGNoYW5nZXMgPSB0aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9yYXdTdHlsZSk7XG4gICAgICBpZiAoaXNQcmVzZW50KGNoYW5nZXMpKSB7XG4gICAgICAgIHRoaXMuX2FwcGx5Q2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hcHBseUNoYW5nZXMoY2hhbmdlczogYW55KTogdm9pZCB7XG4gICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKChyZWNvcmQpID0+IHsgdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSk7IH0pO1xuICAgIGNoYW5nZXMuZm9yRWFjaENoYW5nZWRJdGVtKChyZWNvcmQpID0+IHsgdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgcmVjb3JkLmN1cnJlbnRWYWx1ZSk7IH0pO1xuICAgIGNoYW5nZXMuZm9yRWFjaFJlbW92ZWRJdGVtKChyZWNvcmQpID0+IHsgdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgbnVsbCk7IH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0U3R5bGUobmFtZTogc3RyaW5nLCB2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldEVsZW1lbnRTdHlsZSh0aGlzLl9uZ0VsLCBuYW1lLCB2YWwpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvbmdfc3R5bGUudHNcbiAqKi8iLCJpbXBvcnQge0RpcmVjdGl2ZSwgSG9zdCwgVmlld0NvbnRhaW5lclJlZiwgVGVtcGxhdGVSZWZ9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIG5vcm1hbGl6ZUJsYW5rLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5jb25zdCBfV0hFTl9ERUZBVUxUID0gQ09OU1RfRVhQUihuZXcgT2JqZWN0KCkpO1xuXG5jbGFzcyBTd2l0Y2hWaWV3IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgcHJpdmF0ZSBfdGVtcGxhdGVSZWY6IFRlbXBsYXRlUmVmKSB7fVxuXG4gIGNyZWF0ZSgpOiB2b2lkIHsgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGVtcGxhdGVSZWYpOyB9XG5cbiAgZGVzdHJveSgpOiB2b2lkIHsgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jbGVhcigpOyB9XG59XG5cbi8qKlxuICogQWRkcyBvciByZW1vdmVzIERPTSBzdWItdHJlZXMgd2hlbiB0aGVpciBtYXRjaCBleHByZXNzaW9ucyBtYXRjaCB0aGUgc3dpdGNoIGV4cHJlc3Npb24uXG4gKlxuICogRWxlbWVudHMgd2l0aGluIGBOZ1N3aXRjaGAgYnV0IHdpdGhvdXQgYE5nU3dpdGNoV2hlbmAgb3IgYE5nU3dpdGNoRGVmYXVsdGAgZGlyZWN0aXZlcyB3aWxsIGJlXG4gKiBwcmVzZXJ2ZWQgYXQgdGhlIGxvY2F0aW9uIGFzIHNwZWNpZmllZCBpbiB0aGUgdGVtcGxhdGUuXG4gKlxuICogYE5nU3dpdGNoYCBzaW1wbHkgaW5zZXJ0cyBuZXN0ZWQgZWxlbWVudHMgYmFzZWQgb24gd2hpY2ggbWF0Y2ggZXhwcmVzc2lvbiBtYXRjaGVzIHRoZSB2YWx1ZVxuICogb2J0YWluZWQgZnJvbSB0aGUgZXZhbHVhdGVkIHN3aXRjaCBleHByZXNzaW9uLiBJbiBvdGhlciB3b3JkcywgeW91IGRlZmluZSBhIGNvbnRhaW5lciBlbGVtZW50XG4gKiAod2hlcmUgeW91IHBsYWNlIHRoZSBkaXJlY3RpdmUgd2l0aCBhIHN3aXRjaCBleHByZXNzaW9uIG9uIHRoZVxuICogKipgW25nU3dpdGNoXT1cIi4uLlwiYCBhdHRyaWJ1dGUqKiksIGRlZmluZSBhbnkgaW5uZXIgZWxlbWVudHMgaW5zaWRlIG9mIHRoZSBkaXJlY3RpdmUgYW5kXG4gKiBwbGFjZSBhIGBbbmdTd2l0Y2hXaGVuXWAgYXR0cmlidXRlIHBlciBlbGVtZW50LlxuICpcbiAqIFRoZSBgbmdTd2l0Y2hXaGVuYCBwcm9wZXJ0eSBpcyB1c2VkIHRvIGluZm9ybSBgTmdTd2l0Y2hgIHdoaWNoIGVsZW1lbnQgdG8gZGlzcGxheSB3aGVuIHRoZVxuICogZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQuIElmIGEgbWF0Y2hpbmcgZXhwcmVzc2lvbiBpcyBub3QgZm91bmQgdmlhIGEgYG5nU3dpdGNoV2hlbmAgcHJvcGVydHlcbiAqIHRoZW4gYW4gZWxlbWVudCB3aXRoIHRoZSBgbmdTd2l0Y2hEZWZhdWx0YCBhdHRyaWJ1dGUgaXMgZGlzcGxheWVkLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9EUU1USUk5NUNidXFXcmwzbFlBcz9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe3NlbGVjdG9yOiAnYXBwJ30pXG4gKiBAVmlldyh7XG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgPHA+VmFsdWUgPSB7e3ZhbHVlfX08L3A+XG4gKiAgICAgPGJ1dHRvbiAoY2xpY2spPVwiaW5jKClcIj5JbmNyZW1lbnQ8L2J1dHRvbj5cbiAqXG4gKiAgICAgPGRpdiBbbmdTd2l0Y2hdPVwidmFsdWVcIj5cbiAqICAgICAgIDxwICpuZ1N3aXRjaFdoZW49XCInaW5pdCdcIj5pbmNyZW1lbnQgdG8gc3RhcnQ8L3A+XG4gKiAgICAgICA8cCAqbmdTd2l0Y2hXaGVuPVwiMFwiPjAsIGluY3JlbWVudCBhZ2FpbjwvcD5cbiAqICAgICAgIDxwICpuZ1N3aXRjaFdoZW49XCIxXCI+MSwgaW5jcmVtZW50IGFnYWluPC9wPlxuICogICAgICAgPHAgKm5nU3dpdGNoV2hlbj1cIjJcIj4yLCBzdG9wIGluY3JlbWVudGluZzwvcD5cbiAqICAgICAgIDxwICpuZ1N3aXRjaERlZmF1bHQ+Jmd0OyAyLCBTVE9QITwvcD5cbiAqICAgICA8L2Rpdj5cbiAqXG4gKiAgICAgPCEtLSBhbHRlcm5hdGUgc3ludGF4IC0tPlxuICpcbiAqICAgICA8cCBbbmdTd2l0Y2hdPVwidmFsdWVcIj5cbiAqICAgICAgIDx0ZW1wbGF0ZSBuZ1N3aXRjaFdoZW49XCJpbml0XCI+aW5jcmVtZW50IHRvIHN0YXJ0PC90ZW1wbGF0ZT5cbiAqICAgICAgIDx0ZW1wbGF0ZSBbbmdTd2l0Y2hXaGVuXT1cIjBcIj4wLCBpbmNyZW1lbnQgYWdhaW48L3RlbXBsYXRlPlxuICogICAgICAgPHRlbXBsYXRlIFtuZ1N3aXRjaFdoZW5dPVwiMVwiPjEsIGluY3JlbWVudCBhZ2FpbjwvdGVtcGxhdGU+XG4gKiAgICAgICA8dGVtcGxhdGUgW25nU3dpdGNoV2hlbl09XCIyXCI+Miwgc3RvcCBpbmNyZW1lbnRpbmc8L3RlbXBsYXRlPlxuICogICAgICAgPHRlbXBsYXRlIG5nU3dpdGNoRGVmYXVsdD4mZ3Q7IDIsIFNUT1AhPC90ZW1wbGF0ZT5cbiAqICAgICA8L3A+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHRdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIHZhbHVlID0gJ2luaXQnO1xuICpcbiAqICAgaW5jKCkge1xuICogICAgIHRoaXMudmFsdWUgPSB0aGlzLnZhbHVlID09PSAnaW5pdCcgPyAwIDogdGhpcy52YWx1ZSArIDE7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwKS5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ1tuZ1N3aXRjaF0nLCBpbnB1dHM6IFsnbmdTd2l0Y2gnXX0pXG5leHBvcnQgY2xhc3MgTmdTd2l0Y2gge1xuICBwcml2YXRlIF9zd2l0Y2hWYWx1ZTogYW55O1xuICBwcml2YXRlIF91c2VEZWZhdWx0OiBib29sZWFuID0gZmFsc2U7XG4gIHByaXZhdGUgX3ZhbHVlVmlld3MgPSBuZXcgTWFwPGFueSwgU3dpdGNoVmlld1tdPigpO1xuICBwcml2YXRlIF9hY3RpdmVWaWV3czogU3dpdGNoVmlld1tdID0gW107XG5cbiAgc2V0IG5nU3dpdGNoKHZhbHVlKSB7XG4gICAgLy8gRW1wdHkgdGhlIGN1cnJlbnRseSBhY3RpdmUgVmlld0NvbnRhaW5lcnNcbiAgICB0aGlzLl9lbXB0eUFsbEFjdGl2ZVZpZXdzKCk7XG5cbiAgICAvLyBBZGQgdGhlIFZpZXdDb250YWluZXJzIG1hdGNoaW5nIHRoZSB2YWx1ZSAod2l0aCBhIGZhbGxiYWNrIHRvIGRlZmF1bHQpXG4gICAgdGhpcy5fdXNlRGVmYXVsdCA9IGZhbHNlO1xuICAgIHZhciB2aWV3cyA9IHRoaXMuX3ZhbHVlVmlld3MuZ2V0KHZhbHVlKTtcbiAgICBpZiAoaXNCbGFuayh2aWV3cykpIHtcbiAgICAgIHRoaXMuX3VzZURlZmF1bHQgPSB0cnVlO1xuICAgICAgdmlld3MgPSBub3JtYWxpemVCbGFuayh0aGlzLl92YWx1ZVZpZXdzLmdldChfV0hFTl9ERUZBVUxUKSk7XG4gICAgfVxuICAgIHRoaXMuX2FjdGl2YXRlVmlld3Modmlld3MpO1xuXG4gICAgdGhpcy5fc3dpdGNoVmFsdWUgPSB2YWx1ZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uV2hlblZhbHVlQ2hhbmdlZChvbGRXaGVuLCBuZXdXaGVuLCB2aWV3OiBTd2l0Y2hWaWV3KTogdm9pZCB7XG4gICAgdGhpcy5fZGVyZWdpc3RlclZpZXcob2xkV2hlbiwgdmlldyk7XG4gICAgdGhpcy5fcmVnaXN0ZXJWaWV3KG5ld1doZW4sIHZpZXcpO1xuXG4gICAgaWYgKG9sZFdoZW4gPT09IHRoaXMuX3N3aXRjaFZhbHVlKSB7XG4gICAgICB2aWV3LmRlc3Ryb3koKTtcbiAgICAgIExpc3RXcmFwcGVyLnJlbW92ZSh0aGlzLl9hY3RpdmVWaWV3cywgdmlldyk7XG4gICAgfSBlbHNlIGlmIChuZXdXaGVuID09PSB0aGlzLl9zd2l0Y2hWYWx1ZSkge1xuICAgICAgaWYgKHRoaXMuX3VzZURlZmF1bHQpIHtcbiAgICAgICAgdGhpcy5fdXNlRGVmYXVsdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9lbXB0eUFsbEFjdGl2ZVZpZXdzKCk7XG4gICAgICB9XG4gICAgICB2aWV3LmNyZWF0ZSgpO1xuICAgICAgdGhpcy5fYWN0aXZlVmlld3MucHVzaCh2aWV3KTtcbiAgICB9XG5cbiAgICAvLyBTd2l0Y2ggdG8gZGVmYXVsdCB3aGVuIHRoZXJlIGlzIG5vIG1vcmUgYWN0aXZlIFZpZXdDb250YWluZXJzXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVZpZXdzLmxlbmd0aCA9PT0gMCAmJiAhdGhpcy5fdXNlRGVmYXVsdCkge1xuICAgICAgdGhpcy5fdXNlRGVmYXVsdCA9IHRydWU7XG4gICAgICB0aGlzLl9hY3RpdmF0ZVZpZXdzKHRoaXMuX3ZhbHVlVmlld3MuZ2V0KF9XSEVOX0RFRkFVTFQpKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9lbXB0eUFsbEFjdGl2ZVZpZXdzKCk6IHZvaWQge1xuICAgIHZhciBhY3RpdmVDb250YWluZXJzID0gdGhpcy5fYWN0aXZlVmlld3M7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmVDb250YWluZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhY3RpdmVDb250YWluZXJzW2ldLmRlc3Ryb3koKTtcbiAgICB9XG4gICAgdGhpcy5fYWN0aXZlVmlld3MgPSBbXTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FjdGl2YXRlVmlld3Modmlld3M6IFN3aXRjaFZpZXdbXSk6IHZvaWQge1xuICAgIC8vIFRPRE8odmljYik6IGFzc2VydCh0aGlzLl9hY3RpdmVWaWV3cy5sZW5ndGggPT09IDApO1xuICAgIGlmIChpc1ByZXNlbnQodmlld3MpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZpZXdzW2ldLmNyZWF0ZSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5fYWN0aXZlVmlld3MgPSB2aWV3cztcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9yZWdpc3RlclZpZXcodmFsdWUsIHZpZXc6IFN3aXRjaFZpZXcpOiB2b2lkIHtcbiAgICB2YXIgdmlld3MgPSB0aGlzLl92YWx1ZVZpZXdzLmdldCh2YWx1ZSk7XG4gICAgaWYgKGlzQmxhbmsodmlld3MpKSB7XG4gICAgICB2aWV3cyA9IFtdO1xuICAgICAgdGhpcy5fdmFsdWVWaWV3cy5zZXQodmFsdWUsIHZpZXdzKTtcbiAgICB9XG4gICAgdmlld3MucHVzaCh2aWV3KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2RlcmVnaXN0ZXJWaWV3KHZhbHVlLCB2aWV3OiBTd2l0Y2hWaWV3KTogdm9pZCB7XG4gICAgLy8gYF9XSEVOX0RFRkFVTFRgIGlzIHVzZWQgYSBtYXJrZXIgZm9yIG5vbi1yZWdpc3RlcmVkIHdoZW5zXG4gICAgaWYgKHZhbHVlID09PSBfV0hFTl9ERUZBVUxUKSByZXR1cm47XG4gICAgdmFyIHZpZXdzID0gdGhpcy5fdmFsdWVWaWV3cy5nZXQodmFsdWUpO1xuICAgIGlmICh2aWV3cy5sZW5ndGggPT0gMSkge1xuICAgICAgdGhpcy5fdmFsdWVWaWV3cy5kZWxldGUodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBMaXN0V3JhcHBlci5yZW1vdmUodmlld3MsIHZpZXcpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIEluc2VydCB0aGUgc3ViLXRyZWUgd2hlbiB0aGUgYG5nU3dpdGNoV2hlbmAgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gdGhlIHNhbWUgdmFsdWUgYXMgdGhlXG4gKiBlbmNsb3Npbmcgc3dpdGNoIGV4cHJlc3Npb24uXG4gKlxuICogSWYgbXVsdGlwbGUgbWF0Y2ggZXhwcmVzc2lvbiBtYXRjaCB0aGUgc3dpdGNoIGV4cHJlc3Npb24gdmFsdWUsIGFsbCBvZiB0aGVtIGFyZSBkaXNwbGF5ZWQuXG4gKlxuICogU2VlIHtAbGluayBOZ1N3aXRjaH0gZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZS5cbiAqL1xuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdbbmdTd2l0Y2hXaGVuXScsIGlucHV0czogWyduZ1N3aXRjaFdoZW4nXX0pXG5leHBvcnQgY2xhc3MgTmdTd2l0Y2hXaGVuIHtcbiAgLy8gYF9XSEVOX0RFRkFVTFRgIGlzIHVzZWQgYXMgYSBtYXJrZXIgZm9yIGEgbm90IHlldCBpbml0aWFsaXplZCB2YWx1ZVxuICAvKiogQGludGVybmFsICovXG4gIF92YWx1ZTogYW55ID0gX1dIRU5fREVGQVVMVDtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdmlldzogU3dpdGNoVmlldztcbiAgcHJpdmF0ZSBfc3dpdGNoOiBOZ1N3aXRjaDtcblxuICBjb25zdHJ1Y3Rvcih2aWV3Q29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLCB0ZW1wbGF0ZVJlZjogVGVtcGxhdGVSZWYsXG4gICAgICAgICAgICAgIEBIb3N0KCkgbmdTd2l0Y2g6IE5nU3dpdGNoKSB7XG4gICAgdGhpcy5fc3dpdGNoID0gbmdTd2l0Y2g7XG4gICAgdGhpcy5fdmlldyA9IG5ldyBTd2l0Y2hWaWV3KHZpZXdDb250YWluZXIsIHRlbXBsYXRlUmVmKTtcbiAgfVxuXG4gIHNldCBuZ1N3aXRjaFdoZW4odmFsdWUpIHtcbiAgICB0aGlzLl9zd2l0Y2guX29uV2hlblZhbHVlQ2hhbmdlZCh0aGlzLl92YWx1ZSwgdmFsdWUsIHRoaXMuX3ZpZXcpO1xuICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZhdWx0IGNhc2Ugc3RhdGVtZW50cyBhcmUgZGlzcGxheWVkIHdoZW4gbm8gbWF0Y2ggZXhwcmVzc2lvbiBtYXRjaGVzIHRoZSBzd2l0Y2ggZXhwcmVzc2lvblxuICogdmFsdWUuXG4gKlxuICogU2VlIHtAbGluayBOZ1N3aXRjaH0gZm9yIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZS5cbiAqL1xuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdbbmdTd2l0Y2hEZWZhdWx0XSd9KVxuZXhwb3J0IGNsYXNzIE5nU3dpdGNoRGVmYXVsdCB7XG4gIGNvbnN0cnVjdG9yKHZpZXdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsIHRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZixcbiAgICAgICAgICAgICAgQEhvc3QoKSBzc3dpdGNoOiBOZ1N3aXRjaCkge1xuICAgIHNzd2l0Y2guX3JlZ2lzdGVyVmlldyhfV0hFTl9ERUZBVUxULCBuZXcgU3dpdGNoVmlldyh2aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZVJlZikpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvbmdfc3dpdGNoLnRzXG4gKiovIiwiLy8gVFMgZG9lcyBub3QgaGF2ZSBPYnNlcnZhYmxlc1xuXG4vLyBJIG5lZWQgdG8gYmUgaGVyZSB0byBtYWtlIFR5cGVTY3JpcHQgdGhpbmsgdGhpcyBpcyBhIG1vZHVsZS5cbmltcG9ydCB7fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqIFRoaXMgbW9kdWxlIGV4aXN0cyBpbiBEYXJ0LCBidXQgbm90IGluIFR5cGVzY3JpcHQuIFRoaXMgZXhwb3J0ZWQgc3ltYm9sXG4gKiBpcyBvbmx5IGhlcmUgdG8gaGVscCBUeXBlc2NyaXB0IHRoaW5rIHRoaXMgaXMgYSBtb2R1bGUuXG4gKi9cbmV4cG9ydCB2YXIgd29ya2Fyb3VuZF9lbXB0eV9vYnNlcnZhYmxlX2xpc3RfZGlmZjogYW55O1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9kaXJlY3RpdmVzL29ic2VydmFibGVfbGlzdF9kaWZmLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSLCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtOZ0NsYXNzfSBmcm9tICcuL25nX2NsYXNzJztcbmltcG9ydCB7TmdGb3J9IGZyb20gJy4vbmdfZm9yJztcbmltcG9ydCB7TmdJZn0gZnJvbSAnLi9uZ19pZic7XG5pbXBvcnQge05nU3R5bGV9IGZyb20gJy4vbmdfc3R5bGUnO1xuaW1wb3J0IHtOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHR9IGZyb20gJy4vbmdfc3dpdGNoJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgQW5ndWxhciBjb3JlIGRpcmVjdGl2ZXMgdGhhdCBhcmUgbGlrZWx5IHRvIGJlIHVzZWQgaW4gZWFjaCBhbmQgZXZlcnkgQW5ndWxhclxuICogYXBwbGljYXRpb24uXG4gKlxuICogVGhpcyBjb2xsZWN0aW9uIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZW51bWVyYXRlIGFsbCB0aGUgYnVpbHQtaW4gZGlyZWN0aXZlcyBpbiB0aGUgYGRpcmVjdGl2ZXNgXG4gKiBwcm9wZXJ0eSBvZiB0aGUgYEBWaWV3YCBhbm5vdGF0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC95YWtHd3BDZFVrZzBxZnpYNW04Zz9wPXByZXZpZXcpKVxuICpcbiAqIEluc3RlYWQgb2Ygd3JpdGluZzpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge05nQ2xhc3MsIE5nSWYsIE5nRm9yLCBOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHR9IGZyb20gJ2FuZ3VsYXIyL2NvbW1vbic7XG4gKiBpbXBvcnQge090aGVyRGlyZWN0aXZlfSBmcm9tICcuL215RGlyZWN0aXZlcyc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGVVcmw6ICdteUNvbXBvbmVudC5odG1sJyxcbiAqICAgZGlyZWN0aXZlczogW05nQ2xhc3MsIE5nSWYsIE5nRm9yLCBOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHQsIE90aGVyRGlyZWN0aXZlXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIC4uLlxuICogfVxuICogYGBgXG4gKiBvbmUgY291bGQgaW1wb3J0IGFsbCB0aGUgY29yZSBkaXJlY3RpdmVzIGF0IG9uY2U6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHtDT1JFX0RJUkVDVElWRVN9IGZyb20gJ2FuZ3VsYXIyL2NvbW1vbic7XG4gKiBpbXBvcnQge090aGVyRGlyZWN0aXZlfSBmcm9tICcuL215RGlyZWN0aXZlcyc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGVVcmw6ICdteUNvbXBvbmVudC5odG1sJyxcbiAqICAgZGlyZWN0aXZlczogW0NPUkVfRElSRUNUSVZFUywgT3RoZXJEaXJlY3RpdmVdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgLi4uXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IENPUkVfRElSRUNUSVZFUzogVHlwZVtdID1cbiAgICBDT05TVF9FWFBSKFtOZ0NsYXNzLCBOZ0ZvciwgTmdJZiwgTmdTdHlsZSwgTmdTd2l0Y2gsIE5nU3dpdGNoV2hlbiwgTmdTd2l0Y2hEZWZhdWx0XSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2RpcmVjdGl2ZXMvY29yZV9kaXJlY3RpdmVzLnRzXG4gKiovIiwiLyoqXG4gKiBAbW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqIFRoaXMgbW9kdWxlIGlzIHVzZWQgZm9yIGhhbmRsaW5nIHVzZXIgaW5wdXQsIGJ5IGRlZmluaW5nIGFuZCBidWlsZGluZyBhIHtAbGluayBDb250cm9sR3JvdXB9IHRoYXRcbiAqIGNvbnNpc3RzIG9mXG4gKiB7QGxpbmsgQ29udHJvbH0gb2JqZWN0cywgYW5kIG1hcHBpbmcgdGhlbSBvbnRvIHRoZSBET00uIHtAbGluayBDb250cm9sfSBvYmplY3RzIGNhbiB0aGVuIGJlIHVzZWRcbiAqIHRvIHJlYWQgaW5mb3JtYXRpb25cbiAqIGZyb20gdGhlIGZvcm0gRE9NIGVsZW1lbnRzLlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYGFuZ3VsYXIyYCBtb2R1bGU7IHlvdSBtdXN0IGltcG9ydCB0aGUgZm9ybXMgbW9kdWxlXG4gKiBleHBsaWNpdGx5LlxuICpcbiAqL1xuZXhwb3J0IHtBYnN0cmFjdENvbnRyb2wsIENvbnRyb2wsIENvbnRyb2xHcm91cCwgQ29udHJvbEFycmF5fSBmcm9tICcuL2Zvcm1zL21vZGVsJztcblxuZXhwb3J0IHtBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmV9IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9hYnN0cmFjdF9jb250cm9sX2RpcmVjdGl2ZSc7XG5leHBvcnQge0Zvcm19IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9mb3JtX2ludGVyZmFjZSc7XG5leHBvcnQge0NvbnRyb2xDb250YWluZXJ9IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9jb250cm9sX2NvbnRhaW5lcic7XG5leHBvcnQge05nQ29udHJvbE5hbWV9IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX25hbWUnO1xuZXhwb3J0IHtOZ0Zvcm1Db250cm9sfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfZm9ybV9jb250cm9sJztcbmV4cG9ydCB7TmdNb2RlbH0gZnJvbSAnLi9mb3Jtcy9kaXJlY3RpdmVzL25nX21vZGVsJztcbmV4cG9ydCB7TmdDb250cm9sfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbCc7XG5leHBvcnQge05nQ29udHJvbEdyb3VwfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9ncm91cCc7XG5leHBvcnQge05nRm9ybU1vZGVsfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfZm9ybV9tb2RlbCc7XG5leHBvcnQge05nRm9ybX0gZnJvbSAnLi9mb3Jtcy9kaXJlY3RpdmVzL25nX2Zvcm0nO1xuZXhwb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmV4cG9ydCB7RGVmYXVsdFZhbHVlQWNjZXNzb3J9IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9kZWZhdWx0X3ZhbHVlX2FjY2Vzc29yJztcbmV4cG9ydCB7TmdDb250cm9sU3RhdHVzfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9zdGF0dXMnO1xuZXhwb3J0IHtDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2Zvcm1zL2RpcmVjdGl2ZXMvY2hlY2tib3hfdmFsdWVfYWNjZXNzb3InO1xuZXhwb3J0IHtcbiAgTmdTZWxlY3RPcHRpb24sXG4gIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yXG59IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy9zZWxlY3RfY29udHJvbF92YWx1ZV9hY2Nlc3Nvcic7XG5leHBvcnQge0ZPUk1fRElSRUNUSVZFU30gZnJvbSAnLi9mb3Jtcy9kaXJlY3RpdmVzJztcbmV4cG9ydCB7TkdfVkFMSURBVE9SUywgTkdfQVNZTkNfVkFMSURBVE9SUywgVmFsaWRhdG9yc30gZnJvbSAnLi9mb3Jtcy92YWxpZGF0b3JzJztcbmV4cG9ydCB7XG4gIFJlcXVpcmVkVmFsaWRhdG9yLFxuICBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gIE1heExlbmd0aFZhbGlkYXRvcixcbiAgVmFsaWRhdG9yXG59IGZyb20gJy4vZm9ybXMvZGlyZWN0aXZlcy92YWxpZGF0b3JzJztcbmV4cG9ydCB7Rm9ybUJ1aWxkZXIsIEZPUk1fUFJPVklERVJTLCBGT1JNX0JJTkRJTkdTfSBmcm9tICcuL2Zvcm1zL2Zvcm1fYnVpbGRlcic7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy50c1xuICoqLyIsImltcG9ydCB7U3RyaW5nV3JhcHBlciwgaXNQcmVzZW50LCBpc0JsYW5rLCBub3JtYWxpemVCb29sfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCBFdmVudEVtaXR0ZXIsIE9ic2VydmFibGVXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7UHJvbWlzZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvcHJvbWlzZSc7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXIsIExpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG4vKipcbiAqIEluZGljYXRlcyB0aGF0IGEgQ29udHJvbCBpcyB2YWxpZCwgaS5lLiB0aGF0IG5vIGVycm9ycyBleGlzdCBpbiB0aGUgaW5wdXQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBWQUxJRCA9IFwiVkFMSURcIjtcblxuLyoqXG4gKiBJbmRpY2F0ZXMgdGhhdCBhIENvbnRyb2wgaXMgaW52YWxpZCwgaS5lLiB0aGF0IGFuIGVycm9yIGV4aXN0cyBpbiB0aGUgaW5wdXQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCBJTlZBTElEID0gXCJJTlZBTElEXCI7XG5cbi8qKlxuICogSW5kaWNhdGVzIHRoYXQgYSBDb250cm9sIGlzIHBlbmRpbmcsIGkuZS4gdGhhdCBhc3luYyB2YWxpZGF0aW9uIGlzIG9jY3VyaW5nIGFuZFxuICogZXJyb3JzIGFyZSBub3QgeWV0IGF2YWlsYWJsZSBmb3IgdGhlIGlucHV0IHZhbHVlLlxuICovXG5leHBvcnQgY29uc3QgUEVORElORyA9IFwiUEVORElOR1wiO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDb250cm9sKGNvbnRyb2w6IE9iamVjdCk6IGJvb2xlYW4ge1xuICByZXR1cm4gY29udHJvbCBpbnN0YW5jZW9mIEFic3RyYWN0Q29udHJvbDtcbn1cblxuZnVuY3Rpb24gX2ZpbmQoY29udHJvbDogQWJzdHJhY3RDb250cm9sLCBwYXRoOiBBcnJheTxzdHJpbmcgfCBudW1iZXI+fCBzdHJpbmcpIHtcbiAgaWYgKGlzQmxhbmsocGF0aCkpIHJldHVybiBudWxsO1xuXG4gIGlmICghKHBhdGggaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICBwYXRoID0gKDxzdHJpbmc+cGF0aCkuc3BsaXQoXCIvXCIpO1xuICB9XG4gIGlmIChwYXRoIGluc3RhbmNlb2YgQXJyYXkgJiYgTGlzdFdyYXBwZXIuaXNFbXB0eShwYXRoKSkgcmV0dXJuIG51bGw7XG5cbiAgcmV0dXJuICg8QXJyYXk8c3RyaW5nIHwgbnVtYmVyPj5wYXRoKVxuICAgICAgLnJlZHVjZSgodiwgbmFtZSkgPT4ge1xuICAgICAgICBpZiAodiBpbnN0YW5jZW9mIENvbnRyb2xHcm91cCkge1xuICAgICAgICAgIHJldHVybiBpc1ByZXNlbnQodi5jb250cm9sc1tuYW1lXSkgPyB2LmNvbnRyb2xzW25hbWVdIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgQ29udHJvbEFycmF5KSB7XG4gICAgICAgICAgdmFyIGluZGV4ID0gPG51bWJlcj5uYW1lO1xuICAgICAgICAgIHJldHVybiBpc1ByZXNlbnQodi5hdChpbmRleCkpID8gdi5hdChpbmRleCkgOiBudWxsO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9LCBjb250cm9sKTtcbn1cblxuZnVuY3Rpb24gdG9PYnNlcnZhYmxlKHI6IGFueSk6IE9ic2VydmFibGU8YW55PiB7XG4gIHJldHVybiBQcm9taXNlV3JhcHBlci5pc1Byb21pc2UocikgPyBPYnNlcnZhYmxlV3JhcHBlci5mcm9tUHJvbWlzZShyKSA6IHI7XG59XG5cbi8qKlxuICpcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29udHJvbCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZhbHVlOiBhbnk7XG5cbiAgcHJpdmF0ZSBfdmFsdWVDaGFuZ2VzOiBFdmVudEVtaXR0ZXI8YW55PjtcbiAgcHJpdmF0ZSBfc3RhdHVzQ2hhbmdlczogRXZlbnRFbWl0dGVyPGFueT47XG4gIHByaXZhdGUgX3N0YXR1czogc3RyaW5nO1xuICBwcml2YXRlIF9lcnJvcnM6IHtba2V5OiBzdHJpbmddOiBhbnl9O1xuICBwcml2YXRlIF9wcmlzdGluZTogYm9vbGVhbiA9IHRydWU7XG4gIHByaXZhdGUgX3RvdWNoZWQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgcHJpdmF0ZSBfcGFyZW50OiBDb250cm9sR3JvdXAgfCBDb250cm9sQXJyYXk7XG4gIHByaXZhdGUgX2FzeW5jVmFsaWRhdGlvblN1YnNjcmlwdGlvbjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsaWRhdG9yOiBGdW5jdGlvbiwgcHVibGljIGFzeW5jVmFsaWRhdG9yOiBGdW5jdGlvbikge31cblxuICBnZXQgdmFsdWUoKTogYW55IHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9XG5cbiAgZ2V0IHN0YXR1cygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fc3RhdHVzOyB9XG5cbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fc3RhdHVzID09PSBWQUxJRDsgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBlcnJvcnMgb2YgdGhpcyBjb250cm9sLlxuICAgKi9cbiAgZ2V0IGVycm9ycygpOiB7W2tleTogc3RyaW5nXTogYW55fSB7IHJldHVybiB0aGlzLl9lcnJvcnM7IH1cblxuICBnZXQgcHJpc3RpbmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9wcmlzdGluZTsgfVxuXG4gIGdldCBkaXJ0eSgpOiBib29sZWFuIHsgcmV0dXJuICF0aGlzLnByaXN0aW5lOyB9XG5cbiAgZ2V0IHRvdWNoZWQoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl90b3VjaGVkOyB9XG5cbiAgZ2V0IHVudG91Y2hlZCgpOiBib29sZWFuIHsgcmV0dXJuICF0aGlzLl90b3VjaGVkOyB9XG5cbiAgZ2V0IHZhbHVlQ2hhbmdlcygpOiBPYnNlcnZhYmxlPGFueT4geyByZXR1cm4gdGhpcy5fdmFsdWVDaGFuZ2VzOyB9XG5cbiAgZ2V0IHN0YXR1c0NoYW5nZXMoKTogT2JzZXJ2YWJsZTxhbnk+IHsgcmV0dXJuIHRoaXMuX3N0YXR1c0NoYW5nZXM7IH1cblxuICBnZXQgcGVuZGluZygpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3N0YXR1cyA9PSBQRU5ESU5HOyB9XG5cbiAgbWFya0FzVG91Y2hlZCgpOiB2b2lkIHsgdGhpcy5fdG91Y2hlZCA9IHRydWU7IH1cblxuICBtYXJrQXNEaXJ0eSh7b25seVNlbGZ9OiB7b25seVNlbGY/OiBib29sZWFufSA9IHt9KTogdm9pZCB7XG4gICAgb25seVNlbGYgPSBub3JtYWxpemVCb29sKG9ubHlTZWxmKTtcbiAgICB0aGlzLl9wcmlzdGluZSA9IGZhbHNlO1xuXG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9wYXJlbnQpICYmICFvbmx5U2VsZikge1xuICAgICAgdGhpcy5fcGFyZW50Lm1hcmtBc0RpcnR5KHtvbmx5U2VsZjogb25seVNlbGZ9KTtcbiAgICB9XG4gIH1cblxuICBtYXJrQXNQZW5kaW5nKHtvbmx5U2VsZn06IHtvbmx5U2VsZj86IGJvb2xlYW59ID0ge30pOiB2b2lkIHtcbiAgICBvbmx5U2VsZiA9IG5vcm1hbGl6ZUJvb2wob25seVNlbGYpO1xuICAgIHRoaXMuX3N0YXR1cyA9IFBFTkRJTkc7XG5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhcmVudCkgJiYgIW9ubHlTZWxmKSB7XG4gICAgICB0aGlzLl9wYXJlbnQubWFya0FzUGVuZGluZyh7b25seVNlbGY6IG9ubHlTZWxmfSk7XG4gICAgfVxuICB9XG5cbiAgc2V0UGFyZW50KHBhcmVudDogQ29udHJvbEdyb3VwIHwgQ29udHJvbEFycmF5KTogdm9pZCB7IHRoaXMuX3BhcmVudCA9IHBhcmVudDsgfVxuXG4gIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoXG4gICAgICB7b25seVNlbGYsIGVtaXRFdmVudH06IHtvbmx5U2VsZj86IGJvb2xlYW4sIGVtaXRFdmVudD86IGJvb2xlYW59ID0ge30pOiB2b2lkIHtcbiAgICBvbmx5U2VsZiA9IG5vcm1hbGl6ZUJvb2wob25seVNlbGYpO1xuICAgIGVtaXRFdmVudCA9IGlzUHJlc2VudChlbWl0RXZlbnQpID8gZW1pdEV2ZW50IDogdHJ1ZTtcblxuICAgIHRoaXMuX3VwZGF0ZVZhbHVlKCk7XG5cbiAgICB0aGlzLl9lcnJvcnMgPSB0aGlzLl9ydW5WYWxpZGF0b3IoKTtcbiAgICB0aGlzLl9zdGF0dXMgPSB0aGlzLl9jYWxjdWxhdGVTdGF0dXMoKTtcblxuICAgIGlmICh0aGlzLl9zdGF0dXMgPT0gVkFMSUQgfHwgdGhpcy5fc3RhdHVzID09IFBFTkRJTkcpIHtcbiAgICAgIHRoaXMuX3J1bkFzeW5jVmFsaWRhdG9yKGVtaXRFdmVudCk7XG4gICAgfVxuXG4gICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fdmFsdWVDaGFuZ2VzLCB0aGlzLl92YWx1ZSk7XG4gICAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLl9zdGF0dXNDaGFuZ2VzLCB0aGlzLl9zdGF0dXMpO1xuICAgIH1cblxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fcGFyZW50KSAmJiAhb25seVNlbGYpIHtcbiAgICAgIHRoaXMuX3BhcmVudC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtvbmx5U2VsZjogb25seVNlbGYsIGVtaXRFdmVudDogZW1pdEV2ZW50fSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcnVuVmFsaWRhdG9yKCkgeyByZXR1cm4gaXNQcmVzZW50KHRoaXMudmFsaWRhdG9yKSA/IHRoaXMudmFsaWRhdG9yKHRoaXMpIDogbnVsbDsgfVxuXG4gIHByaXZhdGUgX3J1bkFzeW5jVmFsaWRhdG9yKGVtaXRFdmVudDogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5hc3luY1ZhbGlkYXRvcikpIHtcbiAgICAgIHRoaXMuX3N0YXR1cyA9IFBFTkRJTkc7XG4gICAgICB0aGlzLl9jYW5jZWxFeGlzdGluZ1N1YnNjcmlwdGlvbigpO1xuICAgICAgdmFyIG9icyA9IHRvT2JzZXJ2YWJsZSh0aGlzLmFzeW5jVmFsaWRhdG9yKHRoaXMpKTtcbiAgICAgIHRoaXMuX2FzeW5jVmFsaWRhdGlvblN1YnNjcmlwdGlvbiA9XG4gICAgICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlKG9icywgcmVzID0+IHRoaXMuc2V0RXJyb3JzKHJlcywge2VtaXRFdmVudDogZW1pdEV2ZW50fSkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NhbmNlbEV4aXN0aW5nU3Vic2NyaXB0aW9uKCk6IHZvaWQge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fYXN5bmNWYWxpZGF0aW9uU3Vic2NyaXB0aW9uKSkge1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuZGlzcG9zZSh0aGlzLl9hc3luY1ZhbGlkYXRpb25TdWJzY3JpcHRpb24pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGVycm9ycyBvbiBhIGNvbnRyb2wuXG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZCB3aGVuIHZhbGlkYXRpb25zIGFyZSBydW4gbm90IGF1dG9tYXRpY2FsbHksIGJ1dCBtYW51YWxseSBieSB0aGUgdXNlci5cbiAgICpcbiAgICogQ2FsbGluZyBgc2V0RXJyb3JzYCB3aWxsIGFsc28gdXBkYXRlIHRoZSB2YWxpZGl0eSBvZiB0aGUgcGFyZW50IGNvbnRyb2wuXG4gICAqXG4gICAqICMjIFVzYWdlXG4gICAqXG4gICAqIGBgYFxuICAgKiB2YXIgbG9naW4gPSBuZXcgQ29udHJvbChcInNvbWVMb2dpblwiKTtcbiAgICogbG9naW4uc2V0RXJyb3JzKHtcbiAgICogICBcIm5vdFVuaXF1ZVwiOiB0cnVlXG4gICAqIH0pO1xuICAgKlxuICAgKiBleHBlY3QobG9naW4udmFsaWQpLnRvRXF1YWwoZmFsc2UpO1xuICAgKiBleHBlY3QobG9naW4uZXJyb3JzKS50b0VxdWFsKHtcIm5vdFVuaXF1ZVwiOiB0cnVlfSk7XG4gICAqXG4gICAqIGxvZ2luLnVwZGF0ZVZhbHVlKFwic29tZU90aGVyTG9naW5cIik7XG4gICAqXG4gICAqIGV4cGVjdChsb2dpbi52YWxpZCkudG9FcXVhbCh0cnVlKTtcbiAgICogYGBgXG4gICAqL1xuICBzZXRFcnJvcnMoZXJyb3JzOiB7W2tleTogc3RyaW5nXTogYW55fSwge2VtaXRFdmVudH06IHtlbWl0RXZlbnQ/OiBib29sZWFufSA9IHt9KTogdm9pZCB7XG4gICAgZW1pdEV2ZW50ID0gaXNQcmVzZW50KGVtaXRFdmVudCkgPyBlbWl0RXZlbnQgOiB0cnVlO1xuXG4gICAgdGhpcy5fZXJyb3JzID0gZXJyb3JzO1xuICAgIHRoaXMuX3N0YXR1cyA9IHRoaXMuX2NhbGN1bGF0ZVN0YXR1cygpO1xuXG4gICAgaWYgKGVtaXRFdmVudCkge1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fc3RhdHVzQ2hhbmdlcywgdGhpcy5fc3RhdHVzKTtcbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhcmVudCkpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlQ29udHJvbHNFcnJvcnMoKTtcbiAgICB9XG4gIH1cblxuICBmaW5kKHBhdGg6IEFycmF5PHN0cmluZyB8IG51bWJlcj58IHN0cmluZyk6IEFic3RyYWN0Q29udHJvbCB7IHJldHVybiBfZmluZCh0aGlzLCBwYXRoKTsgfVxuXG4gIGdldEVycm9yKGVycm9yQ29kZTogc3RyaW5nLCBwYXRoOiBzdHJpbmdbXSA9IG51bGwpOiBhbnkge1xuICAgIHZhciBjb250cm9sID0gaXNQcmVzZW50KHBhdGgpICYmICFMaXN0V3JhcHBlci5pc0VtcHR5KHBhdGgpID8gdGhpcy5maW5kKHBhdGgpIDogdGhpcztcbiAgICBpZiAoaXNQcmVzZW50KGNvbnRyb2wpICYmIGlzUHJlc2VudChjb250cm9sLl9lcnJvcnMpKSB7XG4gICAgICByZXR1cm4gU3RyaW5nTWFwV3JhcHBlci5nZXQoY29udHJvbC5fZXJyb3JzLCBlcnJvckNvZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBoYXNFcnJvcihlcnJvckNvZGU6IHN0cmluZywgcGF0aDogc3RyaW5nW10gPSBudWxsKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmdldEVycm9yKGVycm9yQ29kZSwgcGF0aCkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdXBkYXRlQ29udHJvbHNFcnJvcnMoKTogdm9pZCB7XG4gICAgdGhpcy5fc3RhdHVzID0gdGhpcy5fY2FsY3VsYXRlU3RhdHVzKCk7XG5cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhcmVudCkpIHtcbiAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlQ29udHJvbHNFcnJvcnMoKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9pbml0T2JzZXJ2YWJsZXMoKSB7XG4gICAgdGhpcy5fdmFsdWVDaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAgIHRoaXMuX3N0YXR1c0NoYW5nZXMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIH1cblxuXG4gIHByaXZhdGUgX2NhbGN1bGF0ZVN0YXR1cygpOiBzdHJpbmcge1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fZXJyb3JzKSkgcmV0dXJuIElOVkFMSUQ7XG4gICAgaWYgKHRoaXMuX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhQRU5ESU5HKSkgcmV0dXJuIFBFTkRJTkc7XG4gICAgaWYgKHRoaXMuX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhJTlZBTElEKSkgcmV0dXJuIElOVkFMSUQ7XG4gICAgcmV0dXJuIFZBTElEO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBhYnN0cmFjdCBfdXBkYXRlVmFsdWUoKTogdm9pZDtcblxuICAvKiogQGludGVybmFsICovXG4gIGFic3RyYWN0IF9hbnlDb250cm9sc0hhdmVTdGF0dXMoc3RhdHVzOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIERlZmluZXMgYSBwYXJ0IG9mIGEgZm9ybSB0aGF0IGNhbm5vdCBiZSBkaXZpZGVkIGludG8gb3RoZXIgY29udHJvbHMuIGBDb250cm9sYHMgaGF2ZSB2YWx1ZXMgYW5kXG4gKiB2YWxpZGF0aW9uIHN0YXRlLCB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5IGFuIG9wdGlvbmFsIHZhbGlkYXRpb24gZnVuY3Rpb24uXG4gKlxuICogYENvbnRyb2xgIGlzIG9uZSBvZiB0aGUgdGhyZWUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIHVzZWQgdG8gZGVmaW5lIGZvcm1zIGluIEFuZ3VsYXIsIGFsb25nXG4gKiB3aXRoIHtAbGluayBDb250cm9sR3JvdXB9IGFuZCB7QGxpbmsgQ29udHJvbEFycmF5fS5cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIEJ5IGRlZmF1bHQsIGEgYENvbnRyb2xgIGlzIGNyZWF0ZWQgZm9yIGV2ZXJ5IGA8aW5wdXQ+YCBvciBvdGhlciBmb3JtIGNvbXBvbmVudC5cbiAqIFdpdGgge0BsaW5rIE5nRm9ybUNvbnRyb2x9IG9yIHtAbGluayBOZ0Zvcm1Nb2RlbH0gYW4gZXhpc3Rpbmcge0BsaW5rIENvbnRyb2x9IGNhbiBiZVxuICogYm91bmQgdG8gYSBET00gZWxlbWVudCBpbnN0ZWFkLiBUaGlzIGBDb250cm9sYCBjYW4gYmUgY29uZmlndXJlZCB3aXRoIGEgY3VzdG9tXG4gKiB2YWxpZGF0aW9uIGZ1bmN0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC8yM0RFU09wYk5uQnBCSFp0MUJSND9wPXByZXZpZXcpKVxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbCBleHRlbmRzIEFic3RyYWN0Q29udHJvbCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX29uQ2hhbmdlOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3Rvcih2YWx1ZTogYW55ID0gbnVsbCwgdmFsaWRhdG9yOiBGdW5jdGlvbiA9IG51bGwsIGFzeW5jVmFsaWRhdG9yOiBGdW5jdGlvbiA9IG51bGwpIHtcbiAgICBzdXBlcih2YWxpZGF0b3IsIGFzeW5jVmFsaWRhdG9yKTtcbiAgICB0aGlzLl92YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgICB0aGlzLl9pbml0T2JzZXJ2YWJsZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIHRvIGB2YWx1ZWAuXG4gICAqXG4gICAqIElmIGBvbmx5U2VsZmAgaXMgYHRydWVgLCB0aGlzIGNoYW5nZSB3aWxsIG9ubHkgYWZmZWN0IHRoZSB2YWxpZGF0aW9uIG9mIHRoaXMgYENvbnRyb2xgXG4gICAqIGFuZCBub3QgaXRzIHBhcmVudCBjb21wb25lbnQuIElmIGBlbWl0RXZlbnRgIGlzIGB0cnVlYCwgdGhpcyBjaGFuZ2Ugd2lsbCBjYXVzZSBhXG4gICAqIGB2YWx1ZUNoYW5nZXNgIGV2ZW50IG9uIHRoZSBgQ29udHJvbGAgdG8gYmUgZW1pdHRlZC4gQm90aCBvZiB0aGVzZSBvcHRpb25zIGRlZmF1bHQgdG9cbiAgICogYGZhbHNlYC5cbiAgICpcbiAgICogSWYgYGVtaXRNb2RlbFRvVmlld0NoYW5nZWAgaXMgYHRydWVgLCB0aGUgdmlldyB3aWxsIGJlIG5vdGlmaWVkIGFib3V0IHRoZSBuZXcgdmFsdWVcbiAgICogdmlhIGFuIGBvbkNoYW5nZWAgZXZlbnQuIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaWYgYGVtaXRNb2RlbFRvVmlld0NoYW5nZWAgaXMgbm90XG4gICAqIHNwZWNpZmllZC5cbiAgICovXG4gIHVwZGF0ZVZhbHVlKHZhbHVlOiBhbnksIHtvbmx5U2VsZiwgZW1pdEV2ZW50LCBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2V9OiB7XG4gICAgb25seVNlbGY/OiBib29sZWFuLFxuICAgIGVtaXRFdmVudD86IGJvb2xlYW4sXG4gICAgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlPzogYm9vbGVhblxuICB9ID0ge30pOiB2b2lkIHtcbiAgICBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2UgPSBpc1ByZXNlbnQoZW1pdE1vZGVsVG9WaWV3Q2hhbmdlKSA/IGVtaXRNb2RlbFRvVmlld0NoYW5nZSA6IHRydWU7XG4gICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX29uQ2hhbmdlKSAmJiBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2UpIHRoaXMuX29uQ2hhbmdlKHRoaXMuX3ZhbHVlKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiBvbmx5U2VsZiwgZW1pdEV2ZW50OiBlbWl0RXZlbnR9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIF91cGRhdGVWYWx1ZSgpIHt9XG5cbiAgLyoqXG4gICAqIEBpbnRlcm5hbFxuICAgKi9cbiAgX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhzdGF0dXM6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gZmFsc2U7IH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciBmb3IgY2hhbmdlIGV2ZW50cy5cbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IEZ1bmN0aW9uKTogdm9pZCB7IHRoaXMuX29uQ2hhbmdlID0gZm47IH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGEgcGFydCBvZiBhIGZvcm0sIG9mIGZpeGVkIGxlbmd0aCwgdGhhdCBjYW4gY29udGFpbiBvdGhlciBjb250cm9scy5cbiAqXG4gKiBBIGBDb250cm9sR3JvdXBgIGFnZ3JlZ2F0ZXMgdGhlIHZhbHVlcyBhbmQgZXJyb3JzIG9mIGVhY2gge0BsaW5rIENvbnRyb2x9IGluIHRoZSBncm91cC4gVGh1cywgaWZcbiAqIG9uZSBvZiB0aGUgY29udHJvbHMgaW4gYSBncm91cCBpcyBpbnZhbGlkLCB0aGUgZW50aXJlIGdyb3VwIGlzIGludmFsaWQuIFNpbWlsYXJseSwgaWYgYSBjb250cm9sXG4gKiBjaGFuZ2VzIGl0cyB2YWx1ZSwgdGhlIGVudGlyZSBncm91cCBjaGFuZ2VzIGFzIHdlbGwuXG4gKlxuICogYENvbnRyb2xHcm91cGAgaXMgb25lIG9mIHRoZSB0aHJlZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgdXNlZCB0byBkZWZpbmUgZm9ybXMgaW4gQW5ndWxhcixcbiAqIGFsb25nIHdpdGgge0BsaW5rIENvbnRyb2x9IGFuZCB7QGxpbmsgQ29udHJvbEFycmF5fS4ge0BsaW5rIENvbnRyb2xBcnJheX0gY2FuIGFsc28gY29udGFpbiBvdGhlclxuICogY29udHJvbHMsIGJ1dCBpcyBvZiB2YXJpYWJsZSBsZW5ndGguXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0LzIzREVTT3BiTm5CcEJIWnQxQlI0P3A9cHJldmlldykpXG4gKi9cbmV4cG9ydCBjbGFzcyBDb250cm9sR3JvdXAgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2wge1xuICBwcml2YXRlIF9vcHRpb25hbHM6IHtba2V5OiBzdHJpbmddOiBib29sZWFufTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29udHJvbHM6IHtba2V5OiBzdHJpbmddOiBBYnN0cmFjdENvbnRyb2x9LFxuICAgICAgICAgICAgICBvcHRpb25hbHM6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSA9IG51bGwsIHZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsLFxuICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsKSB7XG4gICAgc3VwZXIodmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcik7XG4gICAgdGhpcy5fb3B0aW9uYWxzID0gaXNQcmVzZW50KG9wdGlvbmFscykgPyBvcHRpb25hbHMgOiB7fTtcbiAgICB0aGlzLl9pbml0T2JzZXJ2YWJsZXMoKTtcbiAgICB0aGlzLl9zZXRQYXJlbnRGb3JDb250cm9scygpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7b25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2V9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBjb250cm9sIHRvIHRoaXMgZ3JvdXAuXG4gICAqL1xuICBhZGRDb250cm9sKG5hbWU6IHN0cmluZywgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9sc1tuYW1lXSA9IGNvbnRyb2w7XG4gICAgY29udHJvbC5zZXRQYXJlbnQodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIGEgY29udHJvbCBmcm9tIHRoaXMgZ3JvdXAuXG4gICAqL1xuICByZW1vdmVDb250cm9sKG5hbWU6IHN0cmluZyk6IHZvaWQgeyBTdHJpbmdNYXBXcmFwcGVyLmRlbGV0ZSh0aGlzLmNvbnRyb2xzLCBuYW1lKTsgfVxuXG4gIC8qKlxuICAgKiBNYXJrIHRoZSBuYW1lZCBjb250cm9sIGFzIG5vbi1vcHRpb25hbC5cbiAgICovXG4gIGluY2x1ZGUoY29udHJvbE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIFN0cmluZ01hcFdyYXBwZXIuc2V0KHRoaXMuX29wdGlvbmFscywgY29udHJvbE5hbWUsIHRydWUpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgdGhlIG5hbWVkIGNvbnRyb2wgYXMgb3B0aW9uYWwuXG4gICAqL1xuICBleGNsdWRlKGNvbnRyb2xOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLnNldCh0aGlzLl9vcHRpb25hbHMsIGNvbnRyb2xOYW1lLCBmYWxzZSk7XG4gICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgd2hldGhlciB0aGVyZSBpcyBhIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpbiB0aGUgZ3JvdXAuXG4gICAqL1xuICBjb250YWlucyhjb250cm9sTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgdmFyIGMgPSBTdHJpbmdNYXBXcmFwcGVyLmNvbnRhaW5zKHRoaXMuY29udHJvbHMsIGNvbnRyb2xOYW1lKTtcbiAgICByZXR1cm4gYyAmJiB0aGlzLl9pbmNsdWRlZChjb250cm9sTmFtZSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9zZXRQYXJlbnRGb3JDb250cm9scygpIHtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2godGhpcy5jb250cm9scywgKGNvbnRyb2wsIG5hbWUpID0+IHsgY29udHJvbC5zZXRQYXJlbnQodGhpcyk7IH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdXBkYXRlVmFsdWUoKSB7IHRoaXMuX3ZhbHVlID0gdGhpcy5fcmVkdWNlVmFsdWUoKTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhzdGF0dXM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciByZXMgPSBmYWxzZTtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2godGhpcy5jb250cm9scywgKGNvbnRyb2wsIG5hbWUpID0+IHtcbiAgICAgIHJlcyA9IHJlcyB8fCAodGhpcy5jb250YWlucyhuYW1lKSAmJiBjb250cm9sLnN0YXR1cyA9PSBzdGF0dXMpO1xuICAgIH0pO1xuICAgIHJldHVybiByZXM7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9yZWR1Y2VWYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fcmVkdWNlQ2hpbGRyZW4oe30sIChhY2MsIGNvbnRyb2wsIG5hbWUpID0+IHtcbiAgICAgIGFjY1tuYW1lXSA9IGNvbnRyb2wudmFsdWU7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcmVkdWNlQ2hpbGRyZW4oaW5pdFZhbHVlOiBhbnksIGZuOiBGdW5jdGlvbikge1xuICAgIHZhciByZXMgPSBpbml0VmFsdWU7XG4gICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKHRoaXMuY29udHJvbHMsIChjb250cm9sLCBuYW1lKSA9PiB7XG4gICAgICBpZiAodGhpcy5faW5jbHVkZWQobmFtZSkpIHtcbiAgICAgICAgcmVzID0gZm4ocmVzLCBjb250cm9sLCBuYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gcmVzO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaW5jbHVkZWQoY29udHJvbE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciBpc09wdGlvbmFsID0gU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyh0aGlzLl9vcHRpb25hbHMsIGNvbnRyb2xOYW1lKTtcbiAgICByZXR1cm4gIWlzT3B0aW9uYWwgfHwgU3RyaW5nTWFwV3JhcHBlci5nZXQodGhpcy5fb3B0aW9uYWxzLCBjb250cm9sTmFtZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEZWZpbmVzIGEgcGFydCBvZiBhIGZvcm0sIG9mIHZhcmlhYmxlIGxlbmd0aCwgdGhhdCBjYW4gY29udGFpbiBvdGhlciBjb250cm9scy5cbiAqXG4gKiBBIGBDb250cm9sQXJyYXlgIGFnZ3JlZ2F0ZXMgdGhlIHZhbHVlcyBhbmQgZXJyb3JzIG9mIGVhY2gge0BsaW5rIENvbnRyb2x9IGluIHRoZSBncm91cC4gVGh1cywgaWZcbiAqIG9uZSBvZiB0aGUgY29udHJvbHMgaW4gYSBncm91cCBpcyBpbnZhbGlkLCB0aGUgZW50aXJlIGdyb3VwIGlzIGludmFsaWQuIFNpbWlsYXJseSwgaWYgYSBjb250cm9sXG4gKiBjaGFuZ2VzIGl0cyB2YWx1ZSwgdGhlIGVudGlyZSBncm91cCBjaGFuZ2VzIGFzIHdlbGwuXG4gKlxuICogYENvbnRyb2xBcnJheWAgaXMgb25lIG9mIHRoZSB0aHJlZSBmdW5kYW1lbnRhbCBidWlsZGluZyBibG9ja3MgdXNlZCB0byBkZWZpbmUgZm9ybXMgaW4gQW5ndWxhcixcbiAqIGFsb25nIHdpdGgge0BsaW5rIENvbnRyb2x9IGFuZCB7QGxpbmsgQ29udHJvbEdyb3VwfS4ge0BsaW5rIENvbnRyb2xHcm91cH0gY2FuIGFsc28gY29udGFpblxuICogb3RoZXIgY29udHJvbHMsIGJ1dCBpcyBvZiBmaXhlZCBsZW5ndGguXG4gKlxuICogIyMgQWRkaW5nIG9yIHJlbW92aW5nIGNvbnRyb2xzXG4gKlxuICogVG8gY2hhbmdlIHRoZSBjb250cm9scyBpbiB0aGUgYXJyYXksIHVzZSB0aGUgYHB1c2hgLCBgaW5zZXJ0YCwgb3IgYHJlbW92ZUF0YCBtZXRob2RzXG4gKiBpbiBgQ29udHJvbEFycmF5YCBpdHNlbGYuIFRoZXNlIG1ldGhvZHMgZW5zdXJlIHRoZSBjb250cm9scyBhcmUgcHJvcGVybHkgdHJhY2tlZCBpbiB0aGVcbiAqIGZvcm0ncyBoaWVyYXJjaHkuIERvIG5vdCBtb2RpZnkgdGhlIGFycmF5IG9mIGBBYnN0cmFjdENvbnRyb2xgcyB1c2VkIHRvIGluc3RhbnRpYXRlXG4gKiB0aGUgYENvbnRyb2xBcnJheWAgZGlyZWN0bHksIGFzIHRoYXQgd2lsbCByZXN1bHQgaW4gc3RyYW5nZSBhbmQgdW5leHBlY3RlZCBiZWhhdmlvciBzdWNoXG4gKiBhcyBicm9rZW4gY2hhbmdlIGRldGVjdGlvbi5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvMjNERVNPcGJObkJwQkhadDFCUjQ/cD1wcmV2aWV3KSlcbiAqL1xuZXhwb3J0IGNsYXNzIENvbnRyb2xBcnJheSBleHRlbmRzIEFic3RyYWN0Q29udHJvbCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb250cm9sczogQWJzdHJhY3RDb250cm9sW10sIHZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsLFxuICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsKSB7XG4gICAgc3VwZXIodmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcik7XG4gICAgdGhpcy5faW5pdE9ic2VydmFibGVzKCk7XG4gICAgdGhpcy5fc2V0UGFyZW50Rm9yQ29udHJvbHMoKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB7QGxpbmsgQWJzdHJhY3RDb250cm9sfSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBhdChpbmRleDogbnVtYmVyKTogQWJzdHJhY3RDb250cm9sIHsgcmV0dXJuIHRoaXMuY29udHJvbHNbaW5kZXhdOyB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIG5ldyB7QGxpbmsgQWJzdHJhY3RDb250cm9sfSBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheS5cbiAgICovXG4gIHB1c2goY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgdGhpcy5jb250cm9scy5wdXNoKGNvbnRyb2wpO1xuICAgIGNvbnRyb2wuc2V0UGFyZW50KHRoaXMpO1xuICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc2VydCBhIG5ldyB7QGxpbmsgQWJzdHJhY3RDb250cm9sfSBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBpbiB0aGUgYXJyYXkuXG4gICAqL1xuICBpbnNlcnQoaW5kZXg6IG51bWJlciwgY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogdm9pZCB7XG4gICAgTGlzdFdyYXBwZXIuaW5zZXJ0KHRoaXMuY29udHJvbHMsIGluZGV4LCBjb250cm9sKTtcbiAgICBjb250cm9sLnNldFBhcmVudCh0aGlzKTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmUgdGhlIGNvbnRyb2wgYXQgdGhlIGdpdmVuIGBpbmRleGAgaW4gdGhlIGFycmF5LlxuICAgKi9cbiAgcmVtb3ZlQXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIExpc3RXcmFwcGVyLnJlbW92ZUF0KHRoaXMuY29udHJvbHMsIGluZGV4KTtcbiAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMZW5ndGggb2YgdGhlIGNvbnRyb2wgYXJyYXkuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCk6IG51bWJlciB7IHJldHVybiB0aGlzLmNvbnRyb2xzLmxlbmd0aDsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3VwZGF0ZVZhbHVlKCk6IHZvaWQgeyB0aGlzLl92YWx1ZSA9IHRoaXMuY29udHJvbHMubWFwKChjb250cm9sKSA9PiBjb250cm9sLnZhbHVlKTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FueUNvbnRyb2xzSGF2ZVN0YXR1cyhzdGF0dXM6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLnNvbWUoYyA9PiBjLnN0YXR1cyA9PSBzdGF0dXMpO1xuICB9XG5cblxuICAvKiogQGludGVybmFsICovXG4gIF9zZXRQYXJlbnRGb3JDb250cm9scygpOiB2b2lkIHtcbiAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKGNvbnRyb2wpID0+IHsgY29udHJvbC5zZXRQYXJlbnQodGhpcyk7IH0pO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL21vZGVsLnRzXG4gKiovIiwiaW1wb3J0IHtBYnN0cmFjdENvbnRyb2x9IGZyb20gJy4uL21vZGVsJztcbmltcG9ydCB7aXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHt1bmltcGxlbWVudGVkfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNvbnRyb2wgZGlyZWN0aXZlcy5cbiAqXG4gKiBPbmx5IHVzZWQgaW50ZXJuYWxseSBpbiB0aGUgZm9ybXMgbW9kdWxlLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlIHtcbiAgZ2V0IGNvbnRyb2woKTogQWJzdHJhY3RDb250cm9sIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxuXG4gIGdldCB2YWx1ZSgpOiBhbnkgeyByZXR1cm4gaXNQcmVzZW50KHRoaXMuY29udHJvbCkgPyB0aGlzLmNvbnRyb2wudmFsdWUgOiBudWxsOyB9XG5cbiAgZ2V0IHZhbGlkKCk6IGJvb2xlYW4geyByZXR1cm4gaXNQcmVzZW50KHRoaXMuY29udHJvbCkgPyB0aGlzLmNvbnRyb2wudmFsaWQgOiBudWxsOyB9XG5cbiAgZ2V0IGVycm9ycygpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmNvbnRyb2wpID8gdGhpcy5jb250cm9sLmVycm9ycyA6IG51bGw7XG4gIH1cblxuICBnZXQgcHJpc3RpbmUoKTogYm9vbGVhbiB7IHJldHVybiBpc1ByZXNlbnQodGhpcy5jb250cm9sKSA/IHRoaXMuY29udHJvbC5wcmlzdGluZSA6IG51bGw7IH1cblxuICBnZXQgZGlydHkoKTogYm9vbGVhbiB7IHJldHVybiBpc1ByZXNlbnQodGhpcy5jb250cm9sKSA/IHRoaXMuY29udHJvbC5kaXJ0eSA6IG51bGw7IH1cblxuICBnZXQgdG91Y2hlZCgpOiBib29sZWFuIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmNvbnRyb2wpID8gdGhpcy5jb250cm9sLnRvdWNoZWQgOiBudWxsOyB9XG5cbiAgZ2V0IHVudG91Y2hlZCgpOiBib29sZWFuIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmNvbnRyb2wpID8gdGhpcy5jb250cm9sLnVudG91Y2hlZCA6IG51bGw7IH1cblxuICBnZXQgcGF0aCgpOiBzdHJpbmdbXSB7IHJldHVybiBudWxsOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvYWJzdHJhY3RfY29udHJvbF9kaXJlY3RpdmUudHNcbiAqKi8iLCJpbXBvcnQge0Zvcm19IGZyb20gJy4vZm9ybV9pbnRlcmZhY2UnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmV9IGZyb20gJy4vYWJzdHJhY3RfY29udHJvbF9kaXJlY3RpdmUnO1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHRoYXQgY29udGFpbnMgbXVsdGlwbGUge0BsaW5rIE5nQ29udHJvbH1zLlxuICpcbiAqIE9ubHkgdXNlZCBieSB0aGUgZm9ybXMgbW9kdWxlLlxuICovXG5leHBvcnQgY2xhc3MgQ29udHJvbENvbnRhaW5lciBleHRlbmRzIEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSB7XG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogR2V0IHRoZSBmb3JtIHRvIHdoaWNoIHRoaXMgY29udGFpbmVyIGJlbG9uZ3MuXG4gICAqL1xuICBnZXQgZm9ybURpcmVjdGl2ZSgpOiBGb3JtIHsgcmV0dXJuIG51bGw7IH1cblxuICAvKipcbiAgICogR2V0IHRoZSBwYXRoIHRvIHRoaXMgY29udGFpbmVyLlxuICAgKi9cbiAgZ2V0IHBhdGgoKTogc3RyaW5nW10geyByZXR1cm4gbnVsbDsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL2NvbnRyb2xfY29udGFpbmVyLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXIsIE9ic2VydmFibGVXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcblxuaW1wb3J0IHtcbiAgT25DaGFuZ2VzLFxuICBPbkRlc3Ryb3ksXG4gIFNpbXBsZUNoYW5nZSxcbiAgUXVlcnksXG4gIERpcmVjdGl2ZSxcbiAgZm9yd2FyZFJlZixcbiAgSG9zdCxcbiAgU2tpcFNlbGYsXG4gIFByb3ZpZGVyLFxuICBJbmplY3QsXG4gIE9wdGlvbmFsLFxuICBTZWxmXG59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQge0NvbnRyb2xDb250YWluZXJ9IGZyb20gJy4vY29udHJvbF9jb250YWluZXInO1xuaW1wb3J0IHtOZ0NvbnRyb2x9IGZyb20gJy4vbmdfY29udHJvbCc7XG5pbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUn0gZnJvbSAnLi9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7XG4gIGNvbnRyb2xQYXRoLFxuICBjb21wb3NlVmFsaWRhdG9ycyxcbiAgY29tcG9zZUFzeW5jVmFsaWRhdG9ycyxcbiAgaXNQcm9wZXJ0eVVwZGF0ZWQsXG4gIHNlbGVjdFZhbHVlQWNjZXNzb3Jcbn0gZnJvbSAnLi9zaGFyZWQnO1xuaW1wb3J0IHtDb250cm9sfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1ZhbGlkYXRvcnMsIE5HX1ZBTElEQVRPUlMsIE5HX0FTWU5DX1ZBTElEQVRPUlN9IGZyb20gJy4uL3ZhbGlkYXRvcnMnO1xuXG5cbmNvbnN0IGNvbnRyb2xOYW1lQmluZGluZyA9XG4gICAgQ09OU1RfRVhQUihuZXcgUHJvdmlkZXIoTmdDb250cm9sLCB7dXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdDb250cm9sTmFtZSl9KSk7XG5cbi8qKlxuICogQ3JlYXRlcyBhbmQgYmluZHMgYSBjb250cm9sIHdpdGggYSBzcGVjaWZpZWQgbmFtZSB0byBhIERPTSBlbGVtZW50LlxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHVzZWQgYXMgYSBjaGlsZCBvZiB7QGxpbmsgTmdGb3JtfSBvciB7QGxpbmsgTmdGb3JtTW9kZWx9LlxuXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIEluIHRoaXMgZXhhbXBsZSwgd2UgY3JlYXRlIHRoZSBsb2dpbiBhbmQgcGFzc3dvcmQgY29udHJvbHMuXG4gKiBXZSBjYW4gd29yayB3aXRoIGVhY2ggY29udHJvbCBzZXBhcmF0ZWx5OiBjaGVjayBpdHMgdmFsaWRpdHksIGdldCBpdHMgdmFsdWUsIGxpc3RlbiB0byBpdHNcbiAqIGNoYW5nZXMuXG4gKlxuICogIGBgYFxuICogQENvbXBvbmVudCh7XG4gKiAgICAgIHNlbGVjdG9yOiBcImxvZ2luLWNvbXBcIixcbiAqICAgICAgZGlyZWN0aXZlczogW0ZPUk1fRElSRUNUSVZFU10sXG4gKiAgICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICAgPGZvcm0gI2Y9XCJuZ0Zvcm1cIiAoc3VibWl0KT0nb25Mb2dJbihmLnZhbHVlKSc+XG4gKiAgICAgICAgICBMb2dpbiA8aW5wdXQgdHlwZT0ndGV4dCcgbmdDb250cm9sPSdsb2dpbicgI2w9XCJmb3JtXCI+XG4gKiAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWwudmFsaWRcIj5Mb2dpbiBpcyBpbnZhbGlkPC9kaXY+XG4gKlxuICogICAgICAgICAgUGFzc3dvcmQgPGlucHV0IHR5cGU9J3Bhc3N3b3JkJyBuZ0NvbnRyb2w9J3Bhc3N3b3JkJz5cbiAqICAgICAgICAgIDxidXR0b24gdHlwZT0nc3VibWl0Jz5Mb2cgaW4hPC9idXR0b24+XG4gKiAgICAgICAgPC9mb3JtPlxuICogICAgICBgfSlcbiAqIGNsYXNzIExvZ2luQ29tcCB7XG4gKiAgb25Mb2dJbih2YWx1ZSk6IHZvaWQge1xuICogICAgLy8gdmFsdWUgPT09IHtsb2dpbjogJ3NvbWUgbG9naW4nLCBwYXNzd29yZDogJ3NvbWUgcGFzc3dvcmQnfVxuICogIH1cbiAqIH1cbiAqICBgYGBcbiAqXG4gKiBXZSBjYW4gYWxzbyB1c2UgbmdNb2RlbCB0byBiaW5kIGEgZG9tYWluIG1vZGVsIHRvIHRoZSBmb3JtLlxuICpcbiAqICBgYGBcbiAqIEBDb21wb25lbnQoe1xuICogICAgICBzZWxlY3RvcjogXCJsb2dpbi1jb21wXCIsXG4gKiAgICAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVNdLFxuICogICAgICB0ZW1wbGF0ZTogYFxuICogICAgICAgIDxmb3JtIChzdWJtaXQpPSdvbkxvZ0luKCknPlxuICogICAgICAgICAgTG9naW4gPGlucHV0IHR5cGU9J3RleHQnIG5nQ29udHJvbD0nbG9naW4nIFsobmdNb2RlbCldPVwiY3JlZGVudGlhbHMubG9naW5cIj5cbiAqICAgICAgICAgIFBhc3N3b3JkIDxpbnB1dCB0eXBlPSdwYXNzd29yZCcgbmdDb250cm9sPSdwYXNzd29yZCdcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImNyZWRlbnRpYWxzLnBhc3N3b3JkXCI+XG4gKiAgICAgICAgICA8YnV0dG9uIHR5cGU9J3N1Ym1pdCc+TG9nIGluITwvYnV0dG9uPlxuICogICAgICAgIDwvZm9ybT5cbiAqICAgICAgYH0pXG4gKiBjbGFzcyBMb2dpbkNvbXAge1xuICogIGNyZWRlbnRpYWxzOiB7bG9naW46c3RyaW5nLCBwYXNzd29yZDpzdHJpbmd9O1xuICpcbiAqICBvbkxvZ0luKCk6IHZvaWQge1xuICogICAgLy8gdGhpcy5jcmVkZW50aWFscy5sb2dpbiA9PT0gXCJzb21lIGxvZ2luXCJcbiAqICAgIC8vIHRoaXMuY3JlZGVudGlhbHMucGFzc3dvcmQgPT09IFwic29tZSBwYXNzd29yZFwiXG4gKiAgfVxuICogfVxuICogIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmdDb250cm9sXScsXG4gIGJpbmRpbmdzOiBbY29udHJvbE5hbWVCaW5kaW5nXSxcbiAgaW5wdXRzOiBbJ25hbWU6IG5nQ29udHJvbCcsICdtb2RlbDogbmdNb2RlbCddLFxuICBvdXRwdXRzOiBbJ3VwZGF0ZTogbmdNb2RlbENoYW5nZSddLFxuICBleHBvcnRBczogJ25nRm9ybSdcbn0pXG5leHBvcnQgY2xhc3MgTmdDb250cm9sTmFtZSBleHRlbmRzIE5nQ29udHJvbCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3kge1xuICAvKiogQGludGVybmFsICovXG4gIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgbW9kZWw6IGFueTtcbiAgdmlld01vZGVsOiBhbnk7XG4gIHByaXZhdGUgX2FkZGVkID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoQEhvc3QoKSBAU2tpcFNlbGYoKSBwcml2YXRlIF9wYXJlbnQ6IENvbnRyb2xDb250YWluZXIsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxJREFUT1JTKSBwcml2YXRlIF92YWxpZGF0b3JzOlxuICAgICAgICAgICAgICAgICAgLyogQXJyYXk8VmFsaWRhdG9yfEZ1bmN0aW9uPiAqLyBhbnlbXSxcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpIHByaXZhdGUgX2FzeW5jVmFsaWRhdG9yczpcbiAgICAgICAgICAgICAgICAgIC8qIEFycmF5PFZhbGlkYXRvcnxGdW5jdGlvbj4gKi8gYW55W10sXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxVRV9BQ0NFU1NPUilcbiAgICAgICAgICAgICAgdmFsdWVBY2Nlc3NvcnM6IENvbnRyb2xWYWx1ZUFjY2Vzc29yW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudmFsdWVBY2Nlc3NvciA9IHNlbGVjdFZhbHVlQWNjZXNzb3IodGhpcywgdmFsdWVBY2Nlc3NvcnMpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczoge1trZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZX0pIHtcbiAgICBpZiAoIXRoaXMuX2FkZGVkKSB7XG4gICAgICB0aGlzLmZvcm1EaXJlY3RpdmUuYWRkQ29udHJvbCh0aGlzKTtcbiAgICAgIHRoaXMuX2FkZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGlzUHJvcGVydHlVcGRhdGVkKGNoYW5nZXMsIHRoaXMudmlld01vZGVsKSkge1xuICAgICAgdGhpcy52aWV3TW9kZWwgPSB0aGlzLm1vZGVsO1xuICAgICAgdGhpcy5mb3JtRGlyZWN0aXZlLnVwZGF0ZU1vZGVsKHRoaXMsIHRoaXMubW9kZWwpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQgeyB0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlQ29udHJvbCh0aGlzKTsgfVxuXG4gIHZpZXdUb01vZGVsVXBkYXRlKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlbCA9IG5ld1ZhbHVlO1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMudXBkYXRlLCBuZXdWYWx1ZSk7XG4gIH1cblxuICBnZXQgcGF0aCgpOiBzdHJpbmdbXSB7IHJldHVybiBjb250cm9sUGF0aCh0aGlzLm5hbWUsIHRoaXMuX3BhcmVudCk7IH1cblxuICBnZXQgZm9ybURpcmVjdGl2ZSgpOiBhbnkgeyByZXR1cm4gdGhpcy5fcGFyZW50LmZvcm1EaXJlY3RpdmU7IH1cblxuICBnZXQgdmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpOyB9XG5cbiAgZ2V0IGFzeW5jVmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTsgfVxuXG4gIGdldCBjb250cm9sKCk6IENvbnRyb2wgeyByZXR1cm4gdGhpcy5mb3JtRGlyZWN0aXZlLmdldENvbnRyb2wodGhpcyk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX25hbWUudHNcbiAqKi8iLCJpbXBvcnQge0NvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2NvbnRyb2xfdmFsdWVfYWNjZXNzb3InO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmV9IGZyb20gJy4vYWJzdHJhY3RfY29udHJvbF9kaXJlY3RpdmUnO1xuaW1wb3J0IHt1bmltcGxlbWVudGVkfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG4vKipcbiAqIEEgYmFzZSBjbGFzcyB0aGF0IGFsbCBjb250cm9sIGRpcmVjdGl2ZSBleHRlbmQuXG4gKiBJdCBiaW5kcyBhIHtAbGluayBDb250cm9sfSBvYmplY3QgdG8gYSBET00gZWxlbWVudC5cbiAqXG4gKiBVc2VkIGludGVybmFsbHkgYnkgQW5ndWxhciBmb3Jtcy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE5nQ29udHJvbCBleHRlbmRzIEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSB7XG4gIG5hbWU6IHN0cmluZyA9IG51bGw7XG4gIHZhbHVlQWNjZXNzb3I6IENvbnRyb2xWYWx1ZUFjY2Vzc29yID0gbnVsbDtcblxuICBnZXQgdmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIHVuaW1wbGVtZW50ZWQoKTsgfVxuICBnZXQgYXN5bmNWYWxpZGF0b3IoKTogRnVuY3Rpb24geyByZXR1cm4gdW5pbXBsZW1lbnRlZCgpOyB9XG5cbiAgYWJzdHJhY3Qgdmlld1RvTW9kZWxVcGRhdGUobmV3VmFsdWU6IGFueSk6IHZvaWQ7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbC50c1xuICoqLyIsImltcG9ydCB7T3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqIEEgYnJpZGdlIGJldHdlZW4gYSBjb250cm9sIGFuZCBhIG5hdGl2ZSBlbGVtZW50LlxuICpcbiAqIEEgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBhYnN0cmFjdHMgdGhlIG9wZXJhdGlvbnMgb2Ygd3JpdGluZyBhIG5ldyB2YWx1ZSB0byBhXG4gKiBET00gZWxlbWVudCByZXByZXNlbnRpbmcgYW4gaW5wdXQgY29udHJvbC5cbiAqXG4gKiBQbGVhc2Ugc2VlIHtAbGluayBEZWZhdWx0VmFsdWVBY2Nlc3Nvcn0gZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICAvKipcbiAgICogV3JpdGUgYSBuZXcgdmFsdWUgdG8gdGhlIGVsZW1lbnQuXG4gICAqL1xuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZDtcblxuICAvKipcbiAgICogU2V0IHRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCByZWNlaXZlcyBhIGNoYW5nZSBldmVudC5cbiAgICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgcmVjZWl2ZXMgYSB0b3VjaCBldmVudC5cbiAgICovXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkO1xufVxuXG4vKipcbiAqIFVzZWQgdG8gcHJvdmlkZSBhIHtAbGluayBDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZm9yIGZvcm0gY29udHJvbHMuXG4gKlxuICogU2VlIHtAbGluayBEZWZhdWx0VmFsdWVBY2Nlc3Nvcn0gZm9yIGhvdyB0byBpbXBsZW1lbnQgb25lLlxuICovXG5leHBvcnQgY29uc3QgTkdfVkFMVUVfQUNDRVNTT1I6IE9wYXF1ZVRva2VuID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oXCJOZ1ZhbHVlQWNjZXNzb3JcIikpO1xuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9jb250cm9sX3ZhbHVlX2FjY2Vzc29yLnRzXG4gKiovIiwiaW1wb3J0IHtMaXN0V3JhcHBlciwgU3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBsb29zZUlkZW50aWNhbH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcblxuaW1wb3J0IHtDb250cm9sQ29udGFpbmVyfSBmcm9tICcuL2NvbnRyb2xfY29udGFpbmVyJztcbmltcG9ydCB7TmdDb250cm9sfSBmcm9tICcuL25nX2NvbnRyb2wnO1xuaW1wb3J0IHtBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmV9IGZyb20gJy4vYWJzdHJhY3RfY29udHJvbF9kaXJlY3RpdmUnO1xuaW1wb3J0IHtOZ0NvbnRyb2xHcm91cH0gZnJvbSAnLi9uZ19jb250cm9sX2dyb3VwJztcbmltcG9ydCB7Q29udHJvbCwgQ29udHJvbEdyb3VwfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge1ZhbGlkYXRvcnN9IGZyb20gJy4uL3ZhbGlkYXRvcnMnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7RGVmYXVsdFZhbHVlQWNjZXNzb3J9IGZyb20gJy4vZGVmYXVsdF92YWx1ZV9hY2Nlc3Nvcic7XG5pbXBvcnQge051bWJlclZhbHVlQWNjZXNzb3J9IGZyb20gJy4vbnVtYmVyX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7Q2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9jaGVja2JveF92YWx1ZV9hY2Nlc3Nvcic7XG5pbXBvcnQge1NlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL3NlbGVjdF9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7bm9ybWFsaXplVmFsaWRhdG9yfSBmcm9tICcuL25vcm1hbGl6ZV92YWxpZGF0b3InO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sUGF0aChuYW1lOiBzdHJpbmcsIHBhcmVudDogQ29udHJvbENvbnRhaW5lcik6IHN0cmluZ1tdIHtcbiAgdmFyIHAgPSBMaXN0V3JhcHBlci5jbG9uZShwYXJlbnQucGF0aCk7XG4gIHAucHVzaChuYW1lKTtcbiAgcmV0dXJuIHA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRVcENvbnRyb2woY29udHJvbDogQ29udHJvbCwgZGlyOiBOZ0NvbnRyb2wpOiB2b2lkIHtcbiAgaWYgKGlzQmxhbmsoY29udHJvbCkpIF90aHJvd0Vycm9yKGRpciwgXCJDYW5ub3QgZmluZCBjb250cm9sXCIpO1xuICBpZiAoaXNCbGFuayhkaXIudmFsdWVBY2Nlc3NvcikpIF90aHJvd0Vycm9yKGRpciwgXCJObyB2YWx1ZSBhY2Nlc3NvciBmb3JcIik7XG5cbiAgY29udHJvbC52YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW2NvbnRyb2wudmFsaWRhdG9yLCBkaXIudmFsaWRhdG9yXSk7XG4gIGNvbnRyb2wuYXN5bmNWYWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2VBc3luYyhbY29udHJvbC5hc3luY1ZhbGlkYXRvciwgZGlyLmFzeW5jVmFsaWRhdG9yXSk7XG4gIGRpci52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUoY29udHJvbC52YWx1ZSk7XG5cbiAgLy8gdmlldyAtPiBtb2RlbFxuICBkaXIudmFsdWVBY2Nlc3Nvci5yZWdpc3Rlck9uQ2hhbmdlKG5ld1ZhbHVlID0+IHtcbiAgICBkaXIudmlld1RvTW9kZWxVcGRhdGUobmV3VmFsdWUpO1xuICAgIGNvbnRyb2wudXBkYXRlVmFsdWUobmV3VmFsdWUsIHtlbWl0TW9kZWxUb1ZpZXdDaGFuZ2U6IGZhbHNlfSk7XG4gICAgY29udHJvbC5tYXJrQXNEaXJ0eSgpO1xuICB9KTtcblxuICAvLyBtb2RlbCAtPiB2aWV3XG4gIGNvbnRyb2wucmVnaXN0ZXJPbkNoYW5nZShuZXdWYWx1ZSA9PiBkaXIudmFsdWVBY2Nlc3Nvci53cml0ZVZhbHVlKG5ld1ZhbHVlKSk7XG5cbiAgLy8gdG91Y2hlZFxuICBkaXIudmFsdWVBY2Nlc3Nvci5yZWdpc3Rlck9uVG91Y2hlZCgoKSA9PiBjb250cm9sLm1hcmtBc1RvdWNoZWQoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRVcENvbnRyb2xHcm91cChjb250cm9sOiBDb250cm9sR3JvdXAsIGRpcjogTmdDb250cm9sR3JvdXApIHtcbiAgaWYgKGlzQmxhbmsoY29udHJvbCkpIF90aHJvd0Vycm9yKGRpciwgXCJDYW5ub3QgZmluZCBjb250cm9sXCIpO1xuICBjb250cm9sLnZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZShbY29udHJvbC52YWxpZGF0b3IsIGRpci52YWxpZGF0b3JdKTtcbiAgY29udHJvbC5hc3luY1ZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZUFzeW5jKFtjb250cm9sLmFzeW5jVmFsaWRhdG9yLCBkaXIuYXN5bmNWYWxpZGF0b3JdKTtcbn1cblxuZnVuY3Rpb24gX3Rocm93RXJyb3IoZGlyOiBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUsIG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQge1xuICB2YXIgcGF0aCA9IGRpci5wYXRoLmpvaW4oXCIgLT4gXCIpO1xuICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgJHttZXNzYWdlfSAnJHtwYXRofSdgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXBvc2VWYWxpZGF0b3JzKHZhbGlkYXRvcnM6IC8qIEFycmF5PFZhbGlkYXRvcnxGdW5jdGlvbj4gKi8gYW55W10pOiBGdW5jdGlvbiB7XG4gIHJldHVybiBpc1ByZXNlbnQodmFsaWRhdG9ycykgPyBWYWxpZGF0b3JzLmNvbXBvc2UodmFsaWRhdG9ycy5tYXAobm9ybWFsaXplVmFsaWRhdG9yKSkgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyhcbiAgICB2YWxpZGF0b3JzOiAvKiBBcnJheTxWYWxpZGF0b3J8RnVuY3Rpb24+ICovIGFueVtdKTogRnVuY3Rpb24ge1xuICByZXR1cm4gaXNQcmVzZW50KHZhbGlkYXRvcnMpID8gVmFsaWRhdG9ycy5jb21wb3NlQXN5bmModmFsaWRhdG9ycy5tYXAobm9ybWFsaXplVmFsaWRhdG9yKSkgOiBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNQcm9wZXJ0eVVwZGF0ZWQoY2hhbmdlczoge1trZXk6IHN0cmluZ106IGFueX0sIHZpZXdNb2RlbDogYW55KTogYm9vbGVhbiB7XG4gIGlmICghU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyhjaGFuZ2VzLCBcIm1vZGVsXCIpKSByZXR1cm4gZmFsc2U7XG4gIHZhciBjaGFuZ2UgPSBjaGFuZ2VzW1wibW9kZWxcIl07XG5cbiAgaWYgKGNoYW5nZS5pc0ZpcnN0Q2hhbmdlKCkpIHJldHVybiB0cnVlO1xuICByZXR1cm4gIWxvb3NlSWRlbnRpY2FsKHZpZXdNb2RlbCwgY2hhbmdlLmN1cnJlbnRWYWx1ZSk7XG59XG5cbi8vIFRPRE86IHZzYXZraW4gcmVtb3ZlIGl0IG9uY2UgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMzAxMSBpcyBpbXBsZW1lbnRlZFxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdFZhbHVlQWNjZXNzb3IoZGlyOiBOZ0NvbnRyb2wsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZUFjY2Vzc29yczogQ29udHJvbFZhbHVlQWNjZXNzb3JbXSk6IENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgaWYgKGlzQmxhbmsodmFsdWVBY2Nlc3NvcnMpKSByZXR1cm4gbnVsbDtcblxuICB2YXIgZGVmYXVsdEFjY2Vzc29yO1xuICB2YXIgYnVpbHRpbkFjY2Vzc29yO1xuICB2YXIgY3VzdG9tQWNjZXNzb3I7XG5cbiAgdmFsdWVBY2Nlc3NvcnMuZm9yRWFjaCh2ID0+IHtcbiAgICBpZiAodiBpbnN0YW5jZW9mIERlZmF1bHRWYWx1ZUFjY2Vzc29yKSB7XG4gICAgICBkZWZhdWx0QWNjZXNzb3IgPSB2O1xuXG4gICAgfSBlbHNlIGlmICh2IGluc3RhbmNlb2YgQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3NvciB8fCB2IGluc3RhbmNlb2YgTnVtYmVyVmFsdWVBY2Nlc3NvciB8fFxuICAgICAgICAgICAgICAgdiBpbnN0YW5jZW9mIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yKSB7XG4gICAgICBpZiAoaXNQcmVzZW50KGJ1aWx0aW5BY2Nlc3NvcikpXG4gICAgICAgIF90aHJvd0Vycm9yKGRpciwgXCJNb3JlIHRoYW4gb25lIGJ1aWx0LWluIHZhbHVlIGFjY2Vzc29yIG1hdGNoZXNcIik7XG4gICAgICBidWlsdGluQWNjZXNzb3IgPSB2O1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChpc1ByZXNlbnQoY3VzdG9tQWNjZXNzb3IpKVxuICAgICAgICBfdGhyb3dFcnJvcihkaXIsIFwiTW9yZSB0aGFuIG9uZSBjdXN0b20gdmFsdWUgYWNjZXNzb3IgbWF0Y2hlc1wiKTtcbiAgICAgIGN1c3RvbUFjY2Vzc29yID0gdjtcbiAgICB9XG4gIH0pO1xuXG4gIGlmIChpc1ByZXNlbnQoY3VzdG9tQWNjZXNzb3IpKSByZXR1cm4gY3VzdG9tQWNjZXNzb3I7XG4gIGlmIChpc1ByZXNlbnQoYnVpbHRpbkFjY2Vzc29yKSkgcmV0dXJuIGJ1aWx0aW5BY2Nlc3NvcjtcbiAgaWYgKGlzUHJlc2VudChkZWZhdWx0QWNjZXNzb3IpKSByZXR1cm4gZGVmYXVsdEFjY2Vzc29yO1xuXG4gIF90aHJvd0Vycm9yKGRpciwgXCJObyB2YWxpZCB2YWx1ZSBhY2Nlc3NvciBmb3JcIik7XG4gIHJldHVybiBudWxsO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL3NoYXJlZC50c1xuICoqLyIsImltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9wcm9taXNlJztcbmltcG9ydCB7T2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgU3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7T3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQgKiBhcyBtb2RlbE1vZHVsZSBmcm9tICcuL21vZGVsJztcblxuLyoqXG4gKiBQcm92aWRlcnMgZm9yIHZhbGlkYXRvcnMgdG8gYmUgdXNlZCBmb3Ige0BsaW5rIENvbnRyb2x9cyBpbiBhIGZvcm0uXG4gKlxuICogUHJvdmlkZSB0aGlzIHVzaW5nIGBtdWx0aTogdHJ1ZWAgdG8gYWRkIHZhbGlkYXRvcnMuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS9mb3Jtcy90cy9uZ192YWxpZGF0b3JzL25nX3ZhbGlkYXRvcnMudHMgcmVnaW9uPSduZ192YWxpZGF0b3JzJ31cbiAqL1xuZXhwb3J0IGNvbnN0IE5HX1ZBTElEQVRPUlM6IE9wYXF1ZVRva2VuID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oXCJOZ1ZhbGlkYXRvcnNcIikpO1xuXG4vKipcbiAqIFByb3ZpZGVycyBmb3IgYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMgdG8gYmUgdXNlZCBmb3Ige0BsaW5rIENvbnRyb2x9c1xuICogaW4gYSBmb3JtLlxuICpcbiAqIFByb3ZpZGUgdGhpcyB1c2luZyBgbXVsdGk6IHRydWVgIHRvIGFkZCB2YWxpZGF0b3JzLlxuICpcbiAqIFNlZSB7QGxpbmsgTkdfVkFMSURBVE9SU30gZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuZXhwb3J0IGNvbnN0IE5HX0FTWU5DX1ZBTElEQVRPUlM6IE9wYXF1ZVRva2VuID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oXCJOZ0FzeW5jVmFsaWRhdG9yc1wiKSk7XG5cbi8qKlxuICogUHJvdmlkZXMgYSBzZXQgb2YgdmFsaWRhdG9ycyB1c2VkIGJ5IGZvcm0gY29udHJvbHMuXG4gKlxuICogQSB2YWxpZGF0b3IgaXMgYSBmdW5jdGlvbiB0aGF0IHByb2Nlc3NlcyBhIHtAbGluayBDb250cm9sfSBvciBjb2xsZWN0aW9uIG9mXG4gKiBjb250cm9scyBhbmQgcmV0dXJucyBhIG1hcCBvZiBlcnJvcnMuIEEgbnVsbCBtYXAgbWVhbnMgdGhhdCB2YWxpZGF0aW9uIGhhcyBwYXNzZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiB2YXIgbG9naW5Db250cm9sID0gbmV3IENvbnRyb2woXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZClcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgVmFsaWRhdG9ycyB7XG4gIC8qKlxuICAgKiBWYWxpZGF0b3IgdGhhdCByZXF1aXJlcyBjb250cm9scyB0byBoYXZlIGEgbm9uLWVtcHR5IHZhbHVlLlxuICAgKi9cbiAgc3RhdGljIHJlcXVpcmVkKGNvbnRyb2w6IG1vZGVsTW9kdWxlLkNvbnRyb2wpOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0ge1xuICAgIHJldHVybiBpc0JsYW5rKGNvbnRyb2wudmFsdWUpIHx8IGNvbnRyb2wudmFsdWUgPT0gXCJcIiA/IHtcInJlcXVpcmVkXCI6IHRydWV9IDogbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZGF0b3IgdGhhdCByZXF1aXJlcyBjb250cm9scyB0byBoYXZlIGEgdmFsdWUgb2YgYSBtaW5pbXVtIGxlbmd0aC5cbiAgICovXG4gIHN0YXRpYyBtaW5MZW5ndGgobWluTGVuZ3RoOiBudW1iZXIpOiBGdW5jdGlvbiB7XG4gICAgcmV0dXJuIChjb250cm9sOiBtb2RlbE1vZHVsZS5Db250cm9sKToge1trZXk6IHN0cmluZ106IGFueX0gPT4ge1xuICAgICAgaWYgKGlzUHJlc2VudChWYWxpZGF0b3JzLnJlcXVpcmVkKGNvbnRyb2wpKSkgcmV0dXJuIG51bGw7XG4gICAgICB2YXIgdjogc3RyaW5nID0gY29udHJvbC52YWx1ZTtcbiAgICAgIHJldHVybiB2Lmxlbmd0aCA8IG1pbkxlbmd0aCA/XG4gICAgICAgICAgICAgICAgIHtcIm1pbmxlbmd0aFwiOiB7XCJyZXF1aXJlZExlbmd0aFwiOiBtaW5MZW5ndGgsIFwiYWN0dWFsTGVuZ3RoXCI6IHYubGVuZ3RofX0gOlxuICAgICAgICAgICAgICAgICBudWxsO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgY29udHJvbHMgdG8gaGF2ZSBhIHZhbHVlIG9mIGEgbWF4aW11bSBsZW5ndGguXG4gICAqL1xuICBzdGF0aWMgbWF4TGVuZ3RoKG1heExlbmd0aDogbnVtYmVyKTogRnVuY3Rpb24ge1xuICAgIHJldHVybiAoY29udHJvbDogbW9kZWxNb2R1bGUuQ29udHJvbCk6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0+IHtcbiAgICAgIGlmIChpc1ByZXNlbnQoVmFsaWRhdG9ycy5yZXF1aXJlZChjb250cm9sKSkpIHJldHVybiBudWxsO1xuICAgICAgdmFyIHY6IHN0cmluZyA9IGNvbnRyb2wudmFsdWU7XG4gICAgICByZXR1cm4gdi5sZW5ndGggPiBtYXhMZW5ndGggP1xuICAgICAgICAgICAgICAgICB7XCJtYXhsZW5ndGhcIjoge1wicmVxdWlyZWRMZW5ndGhcIjogbWF4TGVuZ3RoLCBcImFjdHVhbExlbmd0aFwiOiB2Lmxlbmd0aH19IDpcbiAgICAgICAgICAgICAgICAgbnVsbDtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIE5vLW9wIHZhbGlkYXRvci5cbiAgICovXG4gIHN0YXRpYyBudWxsVmFsaWRhdG9yKGM6IGFueSk6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSB7IHJldHVybiBudWxsOyB9XG5cbiAgLyoqXG4gICAqIENvbXBvc2UgbXVsdGlwbGUgdmFsaWRhdG9ycyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdW5pb25cbiAgICogb2YgdGhlIGluZGl2aWR1YWwgZXJyb3IgbWFwcy5cbiAgICovXG4gIHN0YXRpYyBjb21wb3NlKHZhbGlkYXRvcnM6IEZ1bmN0aW9uW10pOiBGdW5jdGlvbiB7XG4gICAgaWYgKGlzQmxhbmsodmFsaWRhdG9ycykpIHJldHVybiBudWxsO1xuICAgIHZhciBwcmVzZW50VmFsaWRhdG9ycyA9IHZhbGlkYXRvcnMuZmlsdGVyKGlzUHJlc2VudCk7XG4gICAgaWYgKHByZXNlbnRWYWxpZGF0b3JzLmxlbmd0aCA9PSAwKSByZXR1cm4gbnVsbDtcblxuICAgIHJldHVybiBmdW5jdGlvbihjb250cm9sOiBtb2RlbE1vZHVsZS5BYnN0cmFjdENvbnRyb2wpIHtcbiAgICAgIHJldHVybiBfbWVyZ2VFcnJvcnMoX2V4ZWN1dGVWYWxpZGF0b3JzKGNvbnRyb2wsIHByZXNlbnRWYWxpZGF0b3JzKSk7XG4gICAgfTtcbiAgfVxuXG4gIHN0YXRpYyBjb21wb3NlQXN5bmModmFsaWRhdG9yczogRnVuY3Rpb25bXSk6IEZ1bmN0aW9uIHtcbiAgICBpZiAoaXNCbGFuayh2YWxpZGF0b3JzKSkgcmV0dXJuIG51bGw7XG4gICAgdmFyIHByZXNlbnRWYWxpZGF0b3JzID0gdmFsaWRhdG9ycy5maWx0ZXIoaXNQcmVzZW50KTtcbiAgICBpZiAocHJlc2VudFZhbGlkYXRvcnMubGVuZ3RoID09IDApIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIGZ1bmN0aW9uKGNvbnRyb2w6IG1vZGVsTW9kdWxlLkFic3RyYWN0Q29udHJvbCkge1xuICAgICAgbGV0IHByb21pc2VzID0gX2V4ZWN1dGVWYWxpZGF0b3JzKGNvbnRyb2wsIHByZXNlbnRWYWxpZGF0b3JzKS5tYXAoX2NvbnZlcnRUb1Byb21pc2UpO1xuICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLmFsbChwcm9taXNlcykudGhlbihfbWVyZ2VFcnJvcnMpO1xuICAgIH07XG4gIH1cbn1cblxuZnVuY3Rpb24gX2NvbnZlcnRUb1Byb21pc2Uob2JqOiBhbnkpOiBhbnkge1xuICByZXR1cm4gUHJvbWlzZVdyYXBwZXIuaXNQcm9taXNlKG9iaikgPyBvYmogOiBPYnNlcnZhYmxlV3JhcHBlci50b1Byb21pc2Uob2JqKTtcbn1cblxuZnVuY3Rpb24gX2V4ZWN1dGVWYWxpZGF0b3JzKGNvbnRyb2w6IG1vZGVsTW9kdWxlLkFic3RyYWN0Q29udHJvbCwgdmFsaWRhdG9yczogRnVuY3Rpb25bXSk6IGFueVtdIHtcbiAgcmV0dXJuIHZhbGlkYXRvcnMubWFwKHYgPT4gdihjb250cm9sKSk7XG59XG5cbmZ1bmN0aW9uIF9tZXJnZUVycm9ycyhhcnJheU9mRXJyb3JzOiBhbnlbXSk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgdmFyIHJlcyA9IGFycmF5T2ZFcnJvcnMucmVkdWNlKChyZXMsIGVycm9ycykgPT4ge1xuICAgIHJldHVybiBpc1ByZXNlbnQoZXJyb3JzKSA/IFN0cmluZ01hcFdyYXBwZXIubWVyZ2UoPGFueT5yZXMsIDxhbnk+ZXJyb3JzKSA6IHJlcztcbiAgfSwge30pO1xuICByZXR1cm4gU3RyaW5nTWFwV3JhcHBlci5pc0VtcHR5KHJlcykgPyBudWxsIDogcmVzO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy92YWxpZGF0b3JzLnRzXG4gKiovIiwiaW1wb3J0IHtEaXJlY3RpdmUsIEVsZW1lbnRSZWYsIFJlbmRlcmVyLCBTZWxmLCBmb3J3YXJkUmVmLCBQcm92aWRlcn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge05HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7aXNCbGFuaywgQ09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuY29uc3QgREVGQVVMVF9WQUxVRV9BQ0NFU1NPUiA9IENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKFxuICAgIE5HX1ZBTFVFX0FDQ0VTU09SLCB7dXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGVmYXVsdFZhbHVlQWNjZXNzb3IpLCBtdWx0aTogdHJ1ZX0pKTtcblxuLyoqXG4gKiBUaGUgZGVmYXVsdCBhY2Nlc3NvciBmb3Igd3JpdGluZyBhIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gY2hhbmdlcyB0aGF0IGlzIHVzZWQgYnkgdGhlXG4gKiB7QGxpbmsgTmdNb2RlbH0sIHtAbGluayBOZ0Zvcm1Db250cm9sfSwgYW5kIHtAbGluayBOZ0NvbnRyb2xOYW1lfSBkaXJlY3RpdmVzLlxuICpcbiAqICAjIyMgRXhhbXBsZVxuICogIGBgYFxuICogIDxpbnB1dCB0eXBlPVwidGV4dFwiIG5nQ29udHJvbD1cInNlYXJjaFF1ZXJ5XCI+XG4gKiAgYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAgICdpbnB1dDpub3QoW3R5cGU9Y2hlY2tib3hdKVtuZ0NvbnRyb2xdLHRleHRhcmVhW25nQ29udHJvbF0saW5wdXQ6bm90KFt0eXBlPWNoZWNrYm94XSlbbmdGb3JtQ29udHJvbF0sdGV4dGFyZWFbbmdGb3JtQ29udHJvbF0saW5wdXQ6bm90KFt0eXBlPWNoZWNrYm94XSlbbmdNb2RlbF0sdGV4dGFyZWFbbmdNb2RlbF0sW25nRGVmYXVsdENvbnRyb2xdJyxcbiAgLy8gVE9ETzogdnNhdmtpbiByZXBsYWNlIHRoZSBhYm92ZSBzZWxlY3RvciB3aXRoIHRoZSBvbmUgYmVsb3cgaXQgb25jZVxuICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8zMDExIGlzIGltcGxlbWVudGVkXG4gIC8vIHNlbGVjdG9yOiAnW25nQ29udHJvbF0sW25nTW9kZWxdLFtuZ0Zvcm1Db250cm9sXScsXG4gIGhvc3Q6IHsnKGlucHV0KSc6ICdvbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKScsICcoYmx1ciknOiAnb25Ub3VjaGVkKCknfSxcbiAgYmluZGluZ3M6IFtERUZBVUxUX1ZBTFVFX0FDQ0VTU09SXVxufSlcbmV4cG9ydCBjbGFzcyBEZWZhdWx0VmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgb25DaGFuZ2UgPSAoXykgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlciwgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB2YXIgbm9ybWFsaXplZFZhbHVlID0gaXNCbGFuayh2YWx1ZSkgPyAnJyA6IHZhbHVlO1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldEVsZW1lbnRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLCAndmFsdWUnLCBub3JtYWxpemVkVmFsdWUpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IGFueSkgPT4gdm9pZCk6IHZvaWQgeyB0aGlzLm9uQ2hhbmdlID0gZm47IH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL2RlZmF1bHRfdmFsdWVfYWNjZXNzb3IudHNcbiAqKi8iLCJpbXBvcnQge0RpcmVjdGl2ZSwgRWxlbWVudFJlZiwgUmVuZGVyZXIsIFNlbGYsIGZvcndhcmRSZWYsIFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7TkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2NvbnRyb2xfdmFsdWVfYWNjZXNzb3InO1xuaW1wb3J0IHtpc0JsYW5rLCBDT05TVF9FWFBSLCBOdW1iZXJXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5jb25zdCBOVU1CRVJfVkFMVUVfQUNDRVNTT1IgPSBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihcbiAgICBOR19WQUxVRV9BQ0NFU1NPUiwge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE51bWJlclZhbHVlQWNjZXNzb3IpLCBtdWx0aTogdHJ1ZX0pKTtcblxuLyoqXG4gKiBUaGUgYWNjZXNzb3IgZm9yIHdyaXRpbmcgYSBudW1iZXIgdmFsdWUgYW5kIGxpc3RlbmluZyB0byBjaGFuZ2VzIHRoYXQgaXMgdXNlZCBieSB0aGVcbiAqIHtAbGluayBOZ01vZGVsfSwge0BsaW5rIE5nRm9ybUNvbnRyb2x9LCBhbmQge0BsaW5rIE5nQ29udHJvbE5hbWV9IGRpcmVjdGl2ZXMuXG4gKlxuICogICMjIyBFeGFtcGxlXG4gKiAgYGBgXG4gKiAgPGlucHV0IHR5cGU9XCJudW1iZXJcIiBbKG5nTW9kZWwpXT1cImFnZVwiPlxuICogIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6XG4gICAgICAnaW5wdXRbdHlwZT1udW1iZXJdW25nQ29udHJvbF0saW5wdXRbdHlwZT1udW1iZXJdW25nRm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9bnVtYmVyXVtuZ01vZGVsXScsXG4gIGhvc3Q6IHtcbiAgICAnKGNoYW5nZSknOiAnb25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSknLFxuICAgICcoaW5wdXQpJzogJ29uQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICAnKGJsdXIpJzogJ29uVG91Y2hlZCgpJ1xuICB9LFxuICBiaW5kaW5nczogW05VTUJFUl9WQUxVRV9BQ0NFU1NPUl1cbn0pXG5leHBvcnQgY2xhc3MgTnVtYmVyVmFsdWVBY2Nlc3NvciBpbXBsZW1lbnRzIENvbnRyb2xWYWx1ZUFjY2Vzc29yIHtcbiAgb25DaGFuZ2UgPSAoXykgPT4ge307XG4gIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JlbmRlcmVyOiBSZW5kZXJlciwgcHJpdmF0ZSBfZWxlbWVudFJlZjogRWxlbWVudFJlZikge31cblxuICB3cml0ZVZhbHVlKHZhbHVlOiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW5kZXJlci5zZXRFbGVtZW50UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZiwgJ3ZhbHVlJywgdmFsdWUpO1xuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogKF86IG51bWJlcikgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25DaGFuZ2UgPSAodmFsdWUpID0+IHsgZm4oTnVtYmVyV3JhcHBlci5wYXJzZUZsb2F0KHZhbHVlKSk7IH07XG4gIH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHZvaWQpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbW1vbi9mb3Jtcy9kaXJlY3RpdmVzL251bWJlcl92YWx1ZV9hY2Nlc3Nvci50c1xuICoqLyIsImltcG9ydCB7RGlyZWN0aXZlLCBSZW5kZXJlciwgRWxlbWVudFJlZiwgU2VsZiwgZm9yd2FyZFJlZiwgUHJvdmlkZXJ9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQge05HX1ZBTFVFX0FDQ0VTU09SLCBDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuY29uc3QgQ0hFQ0tCT1hfVkFMVUVfQUNDRVNTT1IgPSBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihcbiAgICBOR19WQUxVRV9BQ0NFU1NPUiwge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IpLCBtdWx0aTogdHJ1ZX0pKTtcblxuLyoqXG4gKiBUaGUgYWNjZXNzb3IgZm9yIHdyaXRpbmcgYSB2YWx1ZSBhbmQgbGlzdGVuaW5nIHRvIGNoYW5nZXMgb24gYSBjaGVja2JveCBpbnB1dCBlbGVtZW50LlxuICpcbiAqICAjIyMgRXhhbXBsZVxuICogIGBgYFxuICogIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBuZ0NvbnRyb2w9XCJyZW1lbWJlckxvZ2luXCI+XG4gKiAgYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjpcbiAgICAgICdpbnB1dFt0eXBlPWNoZWNrYm94XVtuZ0NvbnRyb2xdLGlucHV0W3R5cGU9Y2hlY2tib3hdW25nRm9ybUNvbnRyb2xdLGlucHV0W3R5cGU9Y2hlY2tib3hdW25nTW9kZWxdJyxcbiAgaG9zdDogeycoY2hhbmdlKSc6ICdvbkNoYW5nZSgkZXZlbnQudGFyZ2V0LmNoZWNrZWQpJywgJyhibHVyKSc6ICdvblRvdWNoZWQoKSd9LFxuICBiaW5kaW5nczogW0NIRUNLQk9YX1ZBTFVFX0FDQ0VTU09SXVxufSlcbmV4cG9ydCBjbGFzcyBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICBvbkNoYW5nZSA9IChfKSA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyLCBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmKSB7fVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldEVsZW1lbnRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLCAnY2hlY2tlZCcsIHZhbHVlKTtcbiAgfVxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoXzogYW55KSA9PiB7fSk6IHZvaWQgeyB0aGlzLm9uQ2hhbmdlID0gZm47IH1cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46ICgpID0+IHt9KTogdm9pZCB7IHRoaXMub25Ub3VjaGVkID0gZm47IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9jaGVja2JveF92YWx1ZV9hY2Nlc3Nvci50c1xuICoqLyIsImltcG9ydCB7XG4gIFF1ZXJ5LFxuICBEaXJlY3RpdmUsXG4gIFJlbmRlcmVyLFxuICBTZWxmLFxuICBmb3J3YXJkUmVmLFxuICBQcm92aWRlcixcbiAgRWxlbWVudFJlZixcbiAgUXVlcnlMaXN0XG59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQge09ic2VydmFibGVXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7TkdfVkFMVUVfQUNDRVNTT1IsIENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2NvbnRyb2xfdmFsdWVfYWNjZXNzb3InO1xuaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5jb25zdCBTRUxFQ1RfVkFMVUVfQUNDRVNTT1IgPSBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihcbiAgICBOR19WQUxVRV9BQ0NFU1NPUiwge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yKSwgbXVsdGk6IHRydWV9KSk7XG5cbi8qKlxuICogTWFya3MgYDxvcHRpb24+YCBhcyBkeW5hbWljLCBzbyBBbmd1bGFyIGNhbiBiZSBub3RpZmllZCB3aGVuIG9wdGlvbnMgY2hhbmdlLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiA8c2VsZWN0IG5nQ29udHJvbD1cImNpdHlcIj5cbiAqICAgPG9wdGlvbiAqbmdGb3I9XCIjYyBvZiBjaXRpZXNcIiBbdmFsdWVdPVwiY1wiPjwvb3B0aW9uPlxuICogPC9zZWxlY3Q+XG4gKiBgYGBcbiAqL1xuQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdvcHRpb24nfSlcbmV4cG9ydCBjbGFzcyBOZ1NlbGVjdE9wdGlvbiB7XG59XG5cbi8qKlxuICogVGhlIGFjY2Vzc29yIGZvciB3cml0aW5nIGEgdmFsdWUgYW5kIGxpc3RlbmluZyB0byBjaGFuZ2VzIG9uIGEgc2VsZWN0IGVsZW1lbnQuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ3NlbGVjdFtuZ0NvbnRyb2xdLHNlbGVjdFtuZ0Zvcm1Db250cm9sXSxzZWxlY3RbbmdNb2RlbF0nLFxuICBob3N0OiB7XG4gICAgJyhjaGFuZ2UpJzogJ29uQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpJyxcbiAgICAnKGlucHV0KSc6ICdvbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKScsXG4gICAgJyhibHVyKSc6ICdvblRvdWNoZWQoKSdcbiAgfSxcbiAgYmluZGluZ3M6IFtTRUxFQ1RfVkFMVUVfQUNDRVNTT1JdXG59KVxuZXhwb3J0IGNsYXNzIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yIGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xuICB2YWx1ZTogc3RyaW5nO1xuICBvbkNoYW5nZSA9IChfKSA9PiB7fTtcbiAgb25Ub3VjaGVkID0gKCkgPT4ge307XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyLCBwcml2YXRlIF9lbGVtZW50UmVmOiBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICBAUXVlcnkoTmdTZWxlY3RPcHRpb24sIHtkZXNjZW5kYW50czogdHJ1ZX0pIHF1ZXJ5OiBRdWVyeUxpc3Q8TmdTZWxlY3RPcHRpb24+KSB7XG4gICAgdGhpcy5fdXBkYXRlVmFsdWVXaGVuTGlzdE9mT3B0aW9uc0NoYW5nZXMocXVlcnkpO1xuICB9XG5cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMuX3JlbmRlcmVyLnNldEVsZW1lbnRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLCAndmFsdWUnLCB2YWx1ZSk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAoKSA9PiBhbnkpOiB2b2lkIHsgdGhpcy5vbkNoYW5nZSA9IGZuOyB9XG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiBhbnkpOiB2b2lkIHsgdGhpcy5vblRvdWNoZWQgPSBmbjsgfVxuXG4gIHByaXZhdGUgX3VwZGF0ZVZhbHVlV2hlbkxpc3RPZk9wdGlvbnNDaGFuZ2VzKHF1ZXJ5OiBRdWVyeUxpc3Q8TmdTZWxlY3RPcHRpb24+KSB7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlKHF1ZXJ5LmNoYW5nZXMsIChfKSA9PiB0aGlzLndyaXRlVmFsdWUodGhpcy52YWx1ZSkpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvc2VsZWN0X2NvbnRyb2xfdmFsdWVfYWNjZXNzb3IudHNcbiAqKi8iLCJpbXBvcnQge1ZhbGlkYXRvcn0gZnJvbSAnLi92YWxpZGF0b3JzJztcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVZhbGlkYXRvcih2YWxpZGF0b3I6IEZ1bmN0aW9uIHwgVmFsaWRhdG9yKTogRnVuY3Rpb24ge1xuICBpZiAoKDxWYWxpZGF0b3I+dmFsaWRhdG9yKS52YWxpZGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIChjKSA9PiAoPFZhbGlkYXRvcj52YWxpZGF0b3IpLnZhbGlkYXRlKGMpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiA8RnVuY3Rpb24+dmFsaWRhdG9yO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbm9ybWFsaXplX3ZhbGlkYXRvci50c1xuICoqLyIsImltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7U3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyLCBPYnNlcnZhYmxlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge1xuICBPbkNoYW5nZXMsXG4gIFNpbXBsZUNoYW5nZSxcbiAgUXVlcnksXG4gIERpcmVjdGl2ZSxcbiAgZm9yd2FyZFJlZixcbiAgUHJvdmlkZXIsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNlbGZcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnLi9uZ19jb250cm9sJztcbmltcG9ydCB7Q29udHJvbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtWYWxpZGF0b3JzLCBOR19WQUxJREFUT1JTLCBOR19BU1lOQ19WQUxJREFUT1JTfSBmcm9tICcuLi92YWxpZGF0b3JzJztcbmltcG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICcuL2NvbnRyb2xfdmFsdWVfYWNjZXNzb3InO1xuaW1wb3J0IHtcbiAgc2V0VXBDb250cm9sLFxuICBjb21wb3NlVmFsaWRhdG9ycyxcbiAgY29tcG9zZUFzeW5jVmFsaWRhdG9ycyxcbiAgaXNQcm9wZXJ0eVVwZGF0ZWQsXG4gIHNlbGVjdFZhbHVlQWNjZXNzb3Jcbn0gZnJvbSAnLi9zaGFyZWQnO1xuXG5jb25zdCBmb3JtQ29udHJvbEJpbmRpbmcgPVxuICAgIENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKE5nQ29udHJvbCwge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE5nRm9ybUNvbnRyb2wpfSkpO1xuXG4vKipcbiAqIEJpbmRzIGFuIGV4aXN0aW5nIHtAbGluayBDb250cm9sfSB0byBhIERPTSBlbGVtZW50LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9qY1FsWjJ0VGgyMkJaWjJ1Y05BVD9wPXByZXZpZXcpKVxuICpcbiAqIEluIHRoaXMgZXhhbXBsZSwgd2UgYmluZCB0aGUgY29udHJvbCB0byBhbiBpbnB1dCBlbGVtZW50LiBXaGVuIHRoZSB2YWx1ZSBvZiB0aGUgaW5wdXQgZWxlbWVudFxuICogY2hhbmdlcywgdGhlIHZhbHVlIG9mIHRoZSBjb250cm9sIHdpbGwgcmVmbGVjdCB0aGF0IGNoYW5nZS4gTGlrZXdpc2UsIGlmIHRoZSB2YWx1ZSBvZiB0aGVcbiAqIGNvbnRyb2wgY2hhbmdlcywgdGhlIGlucHV0IGVsZW1lbnQgcmVmbGVjdHMgdGhhdCBjaGFuZ2UuXG4gKlxuICogIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiAgIHRlbXBsYXRlOiBgXG4gKiAgICAgPGRpdj5cbiAqICAgICAgIDxoMj5OZ0Zvcm1Db250cm9sIEV4YW1wbGU8L2gyPlxuICogICAgICAgPGZvcm0+XG4gKiAgICAgICAgIDxwPkVsZW1lbnQgd2l0aCBleGlzdGluZyBjb250cm9sOiA8aW5wdXQgdHlwZT1cInRleHRcIlxuICogW25nRm9ybUNvbnRyb2xdPVwibG9naW5Db250cm9sXCI+PC9wPlxuICogICAgICAgICA8cD5WYWx1ZSBvZiBleGlzdGluZyBjb250cm9sOiB7e2xvZ2luQ29udHJvbC52YWx1ZX19PC9wPlxuICogICAgICAgPC9mb3JtPlxuICogICAgIDwvZGl2PlxuICogICBgLFxuICogICBkaXJlY3RpdmVzOiBbQ09SRV9ESVJFQ1RJVkVTLCBGT1JNX0RJUkVDVElWRVNdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIGxvZ2luQ29udHJvbDogQ29udHJvbCA9IG5ldyBDb250cm9sKCcnKTtcbiAqIH1cbiAqICBgYGBcbiAqXG4gKiAjIyNuZ01vZGVsXG4gKlxuICogV2UgY2FuIGFsc28gdXNlIGBuZ01vZGVsYCB0byBiaW5kIGEgZG9tYWluIG1vZGVsIHRvIHRoZSBmb3JtLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC95SE1MdUhPN0ROZ1Q4WHZ0alRESD9wPXByZXZpZXcpKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgICAgc2VsZWN0b3I6IFwibG9naW4tY29tcFwiLFxuICogICAgICBkaXJlY3RpdmVzOiBbRk9STV9ESVJFQ1RJVkVTXSxcbiAqICAgICAgdGVtcGxhdGU6IFwiPGlucHV0IHR5cGU9J3RleHQnIFtuZ0Zvcm1Db250cm9sXT0nbG9naW5Db250cm9sJyBbKG5nTW9kZWwpXT0nbG9naW4nPlwiXG4gKiAgICAgIH0pXG4gKiBjbGFzcyBMb2dpbkNvbXAge1xuICogIGxvZ2luQ29udHJvbDogQ29udHJvbCA9IG5ldyBDb250cm9sKCcnKTtcbiAqICBsb2dpbjpzdHJpbmc7XG4gKiB9XG4gKiAgYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tuZ0Zvcm1Db250cm9sXScsXG4gIGJpbmRpbmdzOiBbZm9ybUNvbnRyb2xCaW5kaW5nXSxcbiAgaW5wdXRzOiBbJ2Zvcm06IG5nRm9ybUNvbnRyb2wnLCAnbW9kZWw6IG5nTW9kZWwnXSxcbiAgb3V0cHV0czogWyd1cGRhdGU6IG5nTW9kZWxDaGFuZ2UnXSxcbiAgZXhwb3J0QXM6ICduZ0Zvcm0nXG59KVxuZXhwb3J0IGNsYXNzIE5nRm9ybUNvbnRyb2wgZXh0ZW5kcyBOZ0NvbnRyb2wgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICBmb3JtOiBDb250cm9sO1xuICB1cGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIG1vZGVsOiBhbnk7XG4gIHZpZXdNb2RlbDogYW55O1xuXG4gIGNvbnN0cnVjdG9yKEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxJREFUT1JTKSBwcml2YXRlIF92YWxpZGF0b3JzOlxuICAgICAgICAgICAgICAgICAgLyogQXJyYXk8VmFsaWRhdG9yfEZ1bmN0aW9uPiAqLyBhbnlbXSxcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpIHByaXZhdGUgX2FzeW5jVmFsaWRhdG9yczpcbiAgICAgICAgICAgICAgICAgIC8qIEFycmF5PFZhbGlkYXRvcnxGdW5jdGlvbj4gKi8gYW55W10sXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxVRV9BQ0NFU1NPUilcbiAgICAgICAgICAgICAgdmFsdWVBY2Nlc3NvcnM6IENvbnRyb2xWYWx1ZUFjY2Vzc29yW10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMudmFsdWVBY2Nlc3NvciA9IHNlbGVjdFZhbHVlQWNjZXNzb3IodGhpcywgdmFsdWVBY2Nlc3NvcnMpO1xuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczoge1trZXk6IHN0cmluZ106IFNpbXBsZUNoYW5nZX0pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5faXNDb250cm9sQ2hhbmdlZChjaGFuZ2VzKSkge1xuICAgICAgc2V0VXBDb250cm9sKHRoaXMuZm9ybSwgdGhpcyk7XG4gICAgICB0aGlzLmZvcm0udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH1cbiAgICBpZiAoaXNQcm9wZXJ0eVVwZGF0ZWQoY2hhbmdlcywgdGhpcy52aWV3TW9kZWwpKSB7XG4gICAgICB0aGlzLmZvcm0udXBkYXRlVmFsdWUodGhpcy5tb2RlbCk7XG4gICAgICB0aGlzLnZpZXdNb2RlbCA9IHRoaXMubW9kZWw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IHBhdGgoKTogc3RyaW5nW10geyByZXR1cm4gW107IH1cblxuICBnZXQgdmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpOyB9XG5cbiAgZ2V0IGFzeW5jVmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTsgfVxuXG4gIGdldCBjb250cm9sKCk6IENvbnRyb2wgeyByZXR1cm4gdGhpcy5mb3JtOyB9XG5cbiAgdmlld1RvTW9kZWxVcGRhdGUobmV3VmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHRoaXMudmlld01vZGVsID0gbmV3VmFsdWU7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy51cGRhdGUsIG5ld1ZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2lzQ29udHJvbENoYW5nZWQoY2hhbmdlczoge1trZXk6IHN0cmluZ106IGFueX0pOiBib29sZWFuIHtcbiAgICByZXR1cm4gU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyhjaGFuZ2VzLCBcImZvcm1cIik7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19mb3JtX2NvbnRyb2wudHNcbiAqKi8iLCJpbXBvcnQge0NPTlNUX0VYUFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0V2ZW50RW1pdHRlciwgT2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtcbiAgT25DaGFuZ2VzLFxuICBTaW1wbGVDaGFuZ2UsXG4gIFF1ZXJ5LFxuICBEaXJlY3RpdmUsXG4gIGZvcndhcmRSZWYsXG4gIFByb3ZpZGVyLFxuICBJbmplY3QsXG4gIE9wdGlvbmFsLFxuICBTZWxmXG59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1J9IGZyb20gJy4vY29udHJvbF92YWx1ZV9hY2Nlc3Nvcic7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnLi9uZ19jb250cm9sJztcbmltcG9ydCB7Q29udHJvbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtWYWxpZGF0b3JzLCBOR19WQUxJREFUT1JTLCBOR19BU1lOQ19WQUxJREFUT1JTfSBmcm9tICcuLi92YWxpZGF0b3JzJztcbmltcG9ydCB7XG4gIHNldFVwQ29udHJvbCxcbiAgaXNQcm9wZXJ0eVVwZGF0ZWQsXG4gIHNlbGVjdFZhbHVlQWNjZXNzb3IsXG4gIGNvbXBvc2VWYWxpZGF0b3JzLFxuICBjb21wb3NlQXN5bmNWYWxpZGF0b3JzXG59IGZyb20gJy4vc2hhcmVkJztcblxuY29uc3QgZm9ybUNvbnRyb2xCaW5kaW5nID1cbiAgICBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihOZ0NvbnRyb2wsIHt1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ01vZGVsKX0pKTtcblxuLyoqXG4gKiBCaW5kcyBhIGRvbWFpbiBtb2RlbCB0byBhIGZvcm0gY29udHJvbC5cbiAqXG4gKiAjIyMgVXNhZ2VcbiAqXG4gKiBgbmdNb2RlbGAgYmluZHMgYW4gZXhpc3RpbmcgZG9tYWluIG1vZGVsIHRvIGEgZm9ybSBjb250cm9sLiBGb3IgYVxuICogdHdvLXdheSBiaW5kaW5nLCB1c2UgYFsobmdNb2RlbCldYCB0byBlbnN1cmUgdGhlIG1vZGVsIHVwZGF0ZXMgaW5cbiAqIGJvdGggZGlyZWN0aW9ucy5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvUjNVWDVxRGFVcUZPMlZZUjBVekg/cD1wcmV2aWV3KSlcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgICAgc2VsZWN0b3I6IFwic2VhcmNoLWNvbXBcIixcbiAqICAgICAgZGlyZWN0aXZlczogW0ZPUk1fRElSRUNUSVZFU10sXG4gKiAgICAgIHRlbXBsYXRlOiBgPGlucHV0IHR5cGU9J3RleHQnIFsobmdNb2RlbCldPVwic2VhcmNoUXVlcnlcIj5gXG4gKiAgICAgIH0pXG4gKiBjbGFzcyBTZWFyY2hDb21wIHtcbiAqICBzZWFyY2hRdWVyeTogc3RyaW5nO1xuICogfVxuICogIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmdNb2RlbF06bm90KFtuZ0NvbnRyb2xdKTpub3QoW25nRm9ybUNvbnRyb2xdKScsXG4gIGJpbmRpbmdzOiBbZm9ybUNvbnRyb2xCaW5kaW5nXSxcbiAgaW5wdXRzOiBbJ21vZGVsOiBuZ01vZGVsJ10sXG4gIG91dHB1dHM6IFsndXBkYXRlOiBuZ01vZGVsQ2hhbmdlJ10sXG4gIGV4cG9ydEFzOiAnbmdGb3JtJ1xufSlcbmV4cG9ydCBjbGFzcyBOZ01vZGVsIGV4dGVuZHMgTmdDb250cm9sIGltcGxlbWVudHMgT25DaGFuZ2VzIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY29udHJvbCA9IG5ldyBDb250cm9sKCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2FkZGVkID0gZmFsc2U7XG4gIHVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgbW9kZWw6IGFueTtcbiAgdmlld01vZGVsOiBhbnk7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHByaXZhdGUgX3ZhbGlkYXRvcnM6IGFueVtdLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIEBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykgcHJpdmF0ZSBfYXN5bmNWYWxpZGF0b3JzOiBhbnlbXSxcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX1ZBTFVFX0FDQ0VTU09SKVxuICAgICAgICAgICAgICB2YWx1ZUFjY2Vzc29yczogQ29udHJvbFZhbHVlQWNjZXNzb3JbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy52YWx1ZUFjY2Vzc29yID0gc2VsZWN0VmFsdWVBY2Nlc3Nvcih0aGlzLCB2YWx1ZUFjY2Vzc29ycyk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7W2tleTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlfSkge1xuICAgIGlmICghdGhpcy5fYWRkZWQpIHtcbiAgICAgIHNldFVwQ29udHJvbCh0aGlzLl9jb250cm9sLCB0aGlzKTtcbiAgICAgIHRoaXMuX2NvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgdGhpcy5fYWRkZWQgPSB0cnVlO1xuICAgIH1cblxuICAgIGlmIChpc1Byb3BlcnR5VXBkYXRlZChjaGFuZ2VzLCB0aGlzLnZpZXdNb2RlbCkpIHtcbiAgICAgIHRoaXMuX2NvbnRyb2wudXBkYXRlVmFsdWUodGhpcy5tb2RlbCk7XG4gICAgICB0aGlzLnZpZXdNb2RlbCA9IHRoaXMubW9kZWw7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGNvbnRyb2woKTogQ29udHJvbCB7IHJldHVybiB0aGlzLl9jb250cm9sOyB9XG5cbiAgZ2V0IHBhdGgoKTogc3RyaW5nW10geyByZXR1cm4gW107IH1cblxuICBnZXQgdmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VWYWxpZGF0b3JzKHRoaXMuX3ZhbGlkYXRvcnMpOyB9XG5cbiAgZ2V0IGFzeW5jVmFsaWRhdG9yKCk6IEZ1bmN0aW9uIHsgcmV0dXJuIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTsgfVxuXG4gIHZpZXdUb01vZGVsVXBkYXRlKG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdNb2RlbCA9IG5ld1ZhbHVlO1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMudXBkYXRlLCBuZXdWYWx1ZSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19tb2RlbC50c1xuICoqLyIsImltcG9ydCB7XG4gIE9uSW5pdCxcbiAgT25EZXN0cm95LFxuICBEaXJlY3RpdmUsXG4gIE9wdGlvbmFsLFxuICBJbmplY3QsXG4gIEhvc3QsXG4gIFNraXBTZWxmLFxuICBmb3J3YXJkUmVmLFxuICBQcm92aWRlcixcbiAgU2VsZlxufSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuaW1wb3J0IHtDb250cm9sQ29udGFpbmVyfSBmcm9tICcuL2NvbnRyb2xfY29udGFpbmVyJztcbmltcG9ydCB7Y29udHJvbFBhdGgsIGNvbXBvc2VWYWxpZGF0b3JzLCBjb21wb3NlQXN5bmNWYWxpZGF0b3JzfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQge0NvbnRyb2xHcm91cH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtGb3JtfSBmcm9tICcuL2Zvcm1faW50ZXJmYWNlJztcbmltcG9ydCB7VmFsaWRhdG9ycywgTkdfVkFMSURBVE9SUywgTkdfQVNZTkNfVkFMSURBVE9SU30gZnJvbSAnLi4vdmFsaWRhdG9ycyc7XG5cbmNvbnN0IGNvbnRyb2xHcm91cFByb3ZpZGVyID1cbiAgICBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihDb250cm9sQ29udGFpbmVyLCB7dXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gTmdDb250cm9sR3JvdXApfSkpO1xuXG4vKipcbiAqIENyZWF0ZXMgYW5kIGJpbmRzIGEgY29udHJvbCBncm91cCB0byBhIERPTSBlbGVtZW50LlxuICpcbiAqIFRoaXMgZGlyZWN0aXZlIGNhbiBvbmx5IGJlIHVzZWQgYXMgYSBjaGlsZCBvZiB7QGxpbmsgTmdGb3JtfSBvciB7QGxpbmsgTmdGb3JtTW9kZWx9LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC83RUoxMXVHZWFnZ1ZpWU02VDVucT9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWFwcCcsXG4gKiAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVNdLFxuICogfSlcbiAqIEBWaWV3KHtcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8ZGl2PlxuICogICAgICAgPGgyPkFuZ3VsYXIyIENvbnRyb2wgJmFtcDsgQ29udHJvbEdyb3VwIEV4YW1wbGU8L2gyPlxuICogICAgICAgPGZvcm0gI2Y9XCJuZ0Zvcm1cIj5cbiAqICAgICAgICAgPGRpdiBuZ0NvbnRyb2xHcm91cD1cIm5hbWVcIiAjY2ctbmFtZT1cImZvcm1cIj5cbiAqICAgICAgICAgICA8aDM+RW50ZXIgeW91ciBuYW1lOjwvaDM+XG4gKiAgICAgICAgICAgPHA+Rmlyc3Q6IDxpbnB1dCBuZ0NvbnRyb2w9XCJmaXJzdFwiIHJlcXVpcmVkPjwvcD5cbiAqICAgICAgICAgICA8cD5NaWRkbGU6IDxpbnB1dCBuZ0NvbnRyb2w9XCJtaWRkbGVcIj48L3A+XG4gKiAgICAgICAgICAgPHA+TGFzdDogPGlucHV0IG5nQ29udHJvbD1cImxhc3RcIiByZXF1aXJlZD48L3A+XG4gKiAgICAgICAgIDwvZGl2PlxuICogICAgICAgICA8aDM+TmFtZSB2YWx1ZTo8L2gzPlxuICogICAgICAgICA8cHJlPnt7dmFsdWVPZihjZ05hbWUpfX08L3ByZT5cbiAqICAgICAgICAgPHA+TmFtZSBpcyB7e2NnTmFtZT8uY29udHJvbD8udmFsaWQgPyBcInZhbGlkXCIgOiBcImludmFsaWRcIn19PC9wPlxuICogICAgICAgICA8aDM+V2hhdCdzIHlvdXIgZmF2b3JpdGUgZm9vZD88L2gzPlxuICogICAgICAgICA8cD48aW5wdXQgbmdDb250cm9sPVwiZm9vZFwiPjwvcD5cbiAqICAgICAgICAgPGgzPkZvcm0gdmFsdWU8L2gzPlxuICogICAgICAgICA8cHJlPnt7dmFsdWVPZihmKX19PC9wcmU+XG4gKiAgICAgICA8L2Zvcm0+XG4gKiAgICAgPC9kaXY+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVNdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIHZhbHVlT2YoY2c6IE5nQ29udHJvbEdyb3VwKTogc3RyaW5nIHtcbiAqICAgICBpZiAoY2cuY29udHJvbCA9PSBudWxsKSB7XG4gKiAgICAgICByZXR1cm4gbnVsbDtcbiAqICAgICB9XG4gKiAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGNnLmNvbnRyb2wudmFsdWUsIG51bGwsIDIpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGlzIGV4YW1wbGUgZGVjbGFyZXMgYSBjb250cm9sIGdyb3VwIGZvciBhIHVzZXIncyBuYW1lLiBUaGUgdmFsdWUgYW5kIHZhbGlkYXRpb24gc3RhdGUgb2ZcbiAqIHRoaXMgZ3JvdXAgY2FuIGJlIGFjY2Vzc2VkIHNlcGFyYXRlbHkgZnJvbSB0aGUgb3ZlcmFsbCBmb3JtLlxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmdDb250cm9sR3JvdXBdJyxcbiAgcHJvdmlkZXJzOiBbY29udHJvbEdyb3VwUHJvdmlkZXJdLFxuICBpbnB1dHM6IFsnbmFtZTogbmdDb250cm9sR3JvdXAnXSxcbiAgZXhwb3J0QXM6ICduZ0Zvcm0nXG59KVxuZXhwb3J0IGNsYXNzIE5nQ29udHJvbEdyb3VwIGV4dGVuZHMgQ29udHJvbENvbnRhaW5lciBpbXBsZW1lbnRzIE9uSW5pdCxcbiAgICBPbkRlc3Ryb3kge1xuICAvKiogQGludGVybmFsICovXG4gIF9wYXJlbnQ6IENvbnRyb2xDb250YWluZXI7XG5cbiAgY29uc3RydWN0b3IoQEhvc3QoKSBAU2tpcFNlbGYoKSBwYXJlbnQ6IENvbnRyb2xDb250YWluZXIsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBTZWxmKCkgQEluamVjdChOR19WQUxJREFUT1JTKSBwcml2YXRlIF92YWxpZGF0b3JzOiBhbnlbXSxcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMpIHByaXZhdGUgX2FzeW5jVmFsaWRhdG9yczogYW55W10pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDtcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQgeyB0aGlzLmZvcm1EaXJlY3RpdmUuYWRkQ29udHJvbEdyb3VwKHRoaXMpOyB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7IHRoaXMuZm9ybURpcmVjdGl2ZS5yZW1vdmVDb250cm9sR3JvdXAodGhpcyk7IH1cblxuICAvKipcbiAgICogR2V0IHRoZSB7QGxpbmsgQ29udHJvbEdyb3VwfSBiYWNraW5nIHRoaXMgYmluZGluZy5cbiAgICovXG4gIGdldCBjb250cm9sKCk6IENvbnRyb2xHcm91cCB7IHJldHVybiB0aGlzLmZvcm1EaXJlY3RpdmUuZ2V0Q29udHJvbEdyb3VwKHRoaXMpOyB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgcGF0aCB0byB0aGlzIGNvbnRyb2wgZ3JvdXAuXG4gICAqL1xuICBnZXQgcGF0aCgpOiBzdHJpbmdbXSB7IHJldHVybiBjb250cm9sUGF0aCh0aGlzLm5hbWUsIHRoaXMuX3BhcmVudCk7IH1cblxuICAvKipcbiAgICogR2V0IHRoZSB7QGxpbmsgRm9ybX0gdG8gd2hpY2ggdGhpcyBncm91cCBiZWxvbmdzLlxuICAgKi9cbiAgZ2V0IGZvcm1EaXJlY3RpdmUoKTogRm9ybSB7IHJldHVybiB0aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZTsgfVxuXG4gIGdldCB2YWxpZGF0b3IoKTogRnVuY3Rpb24geyByZXR1cm4gY29tcG9zZVZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7IH1cblxuICBnZXQgYXN5bmNWYWxpZGF0b3IoKTogRnVuY3Rpb24geyByZXR1cm4gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyh0aGlzLl9hc3luY1ZhbGlkYXRvcnMpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9ncm91cC50c1xuICoqLyIsImltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge09ic2VydmFibGVXcmFwcGVyLCBFdmVudEVtaXR0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtcbiAgU2ltcGxlQ2hhbmdlLFxuICBPbkNoYW5nZXMsXG4gIERpcmVjdGl2ZSxcbiAgZm9yd2FyZFJlZixcbiAgUHJvdmlkZXIsXG4gIEluamVjdCxcbiAgT3B0aW9uYWwsXG4gIFNlbGZcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge05nQ29udHJvbH0gZnJvbSAnLi9uZ19jb250cm9sJztcbmltcG9ydCB7TmdDb250cm9sR3JvdXB9IGZyb20gJy4vbmdfY29udHJvbF9ncm91cCc7XG5pbXBvcnQge0NvbnRyb2xDb250YWluZXJ9IGZyb20gJy4vY29udHJvbF9jb250YWluZXInO1xuaW1wb3J0IHtGb3JtfSBmcm9tICcuL2Zvcm1faW50ZXJmYWNlJztcbmltcG9ydCB7Q29udHJvbCwgQ29udHJvbEdyb3VwfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge3NldFVwQ29udHJvbCwgc2V0VXBDb250cm9sR3JvdXAsIGNvbXBvc2VWYWxpZGF0b3JzLCBjb21wb3NlQXN5bmNWYWxpZGF0b3JzfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQge1ZhbGlkYXRvcnMsIE5HX1ZBTElEQVRPUlMsIE5HX0FTWU5DX1ZBTElEQVRPUlN9IGZyb20gJy4uL3ZhbGlkYXRvcnMnO1xuXG5jb25zdCBmb3JtRGlyZWN0aXZlUHJvdmlkZXIgPVxuICAgIENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKENvbnRyb2xDb250YWluZXIsIHt1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ0Zvcm1Nb2RlbCl9KSk7XG5cbi8qKlxuICogQmluZHMgYW4gZXhpc3RpbmcgY29udHJvbCBncm91cCB0byBhIERPTSBlbGVtZW50LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9qcXJWaXJ1ZFk4YW5KeFRNVWpUUD9wPXByZXZpZXcpKVxuICpcbiAqIEluIHRoaXMgZXhhbXBsZSwgd2UgYmluZCB0aGUgY29udHJvbCBncm91cCB0byB0aGUgZm9ybSBlbGVtZW50LCBhbmQgd2UgYmluZCB0aGUgbG9naW4gYW5kXG4gKiBwYXNzd29yZCBjb250cm9scyB0byB0aGUgbG9naW4gYW5kIHBhc3N3b3JkIGVsZW1lbnRzLlxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxkaXY+XG4gKiAgICAgICA8aDI+TmdGb3JtTW9kZWwgRXhhbXBsZTwvaDI+XG4gKiAgICAgICA8Zm9ybSBbbmdGb3JtTW9kZWxdPVwibG9naW5Gb3JtXCI+XG4gKiAgICAgICAgIDxwPkxvZ2luOiA8aW5wdXQgdHlwZT1cInRleHRcIiBuZ0NvbnRyb2w9XCJsb2dpblwiPjwvcD5cbiAqICAgICAgICAgPHA+UGFzc3dvcmQ6IDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBuZ0NvbnRyb2w9XCJwYXNzd29yZFwiPjwvcD5cbiAqICAgICAgIDwvZm9ybT5cbiAqICAgICAgIDxwPlZhbHVlOjwvcD5cbiAqICAgICAgIDxwcmU+e3t2YWx1ZX19PC9wcmU+XG4gKiAgICAgPC9kaXY+XG4gKiAgIGAsXG4gKiAgIGRpcmVjdGl2ZXM6IFtGT1JNX0RJUkVDVElWRVNdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIGxvZ2luRm9ybTogQ29udHJvbEdyb3VwO1xuICpcbiAqICAgY29uc3RydWN0b3IoKSB7XG4gKiAgICAgdGhpcy5sb2dpbkZvcm0gPSBuZXcgQ29udHJvbEdyb3VwKHtcbiAqICAgICAgIGxvZ2luOiBuZXcgQ29udHJvbChcIlwiKSxcbiAqICAgICAgIHBhc3N3b3JkOiBuZXcgQ29udHJvbChcIlwiKVxuICogICAgIH0pO1xuICogICB9XG4gKlxuICogICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAqICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5sb2dpbkZvcm0udmFsdWUsIG51bGwsIDIpO1xuICogICB9XG4gKiB9XG4gKiAgYGBgXG4gKlxuICogV2UgY2FuIGFsc28gdXNlIG5nTW9kZWwgdG8gYmluZCBhIGRvbWFpbiBtb2RlbCB0byB0aGUgZm9ybS5cbiAqXG4gKiAgYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgICAgIHNlbGVjdG9yOiBcImxvZ2luLWNvbXBcIixcbiAqICAgICAgZGlyZWN0aXZlczogW0ZPUk1fRElSRUNUSVZFU10sXG4gKiAgICAgIHRlbXBsYXRlOiBgXG4gKiAgICAgICAgPGZvcm0gW25nRm9ybU1vZGVsXT0nbG9naW5Gb3JtJz5cbiAqICAgICAgICAgIExvZ2luIDxpbnB1dCB0eXBlPSd0ZXh0JyBuZ0NvbnRyb2w9J2xvZ2luJyBbKG5nTW9kZWwpXT0nY3JlZGVudGlhbHMubG9naW4nPlxuICogICAgICAgICAgUGFzc3dvcmQgPGlucHV0IHR5cGU9J3Bhc3N3b3JkJyBuZ0NvbnRyb2w9J3Bhc3N3b3JkJ1xuICogICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPSdjcmVkZW50aWFscy5wYXNzd29yZCc+XG4gKiAgICAgICAgICA8YnV0dG9uIChjbGljayk9XCJvbkxvZ2luKClcIj5Mb2dpbjwvYnV0dG9uPlxuICogICAgICAgIDwvZm9ybT5gXG4gKiAgICAgIH0pXG4gKiBjbGFzcyBMb2dpbkNvbXAge1xuICogIGNyZWRlbnRpYWxzOiB7bG9naW46IHN0cmluZywgcGFzc3dvcmQ6IHN0cmluZ307XG4gKiAgbG9naW5Gb3JtOiBDb250cm9sR3JvdXA7XG4gKlxuICogIGNvbnN0cnVjdG9yKCkge1xuICogICAgdGhpcy5sb2dpbkZvcm0gPSBuZXcgQ29udHJvbEdyb3VwKHtcbiAqICAgICAgbG9naW46IG5ldyBDb250cm9sKFwiXCIpLFxuICogICAgICBwYXNzd29yZDogbmV3IENvbnRyb2woXCJcIilcbiAqICAgIH0pO1xuICogIH1cbiAqXG4gKiAgb25Mb2dpbigpOiB2b2lkIHtcbiAqICAgIC8vIHRoaXMuY3JlZGVudGlhbHMubG9naW4gPT09ICdzb21lIGxvZ2luJ1xuICogICAgLy8gdGhpcy5jcmVkZW50aWFscy5wYXNzd29yZCA9PT0gJ3NvbWUgcGFzc3dvcmQnXG4gKiAgfVxuICogfVxuICogIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbbmdGb3JtTW9kZWxdJyxcbiAgYmluZGluZ3M6IFtmb3JtRGlyZWN0aXZlUHJvdmlkZXJdLFxuICBpbnB1dHM6IFsnZm9ybTogbmdGb3JtTW9kZWwnXSxcbiAgaG9zdDogeycoc3VibWl0KSc6ICdvblN1Ym1pdCgpJ30sXG4gIG91dHB1dHM6IFsnbmdTdWJtaXQnXSxcbiAgZXhwb3J0QXM6ICduZ0Zvcm0nXG59KVxuZXhwb3J0IGNsYXNzIE5nRm9ybU1vZGVsIGV4dGVuZHMgQ29udHJvbENvbnRhaW5lciBpbXBsZW1lbnRzIEZvcm0sXG4gICAgT25DaGFuZ2VzIHtcbiAgZm9ybTogQ29udHJvbEdyb3VwID0gbnVsbDtcbiAgZGlyZWN0aXZlczogTmdDb250cm9sW10gPSBbXTtcbiAgbmdTdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHByaXZhdGUgX3ZhbGlkYXRvcnM6IGFueVtdLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIEBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykgcHJpdmF0ZSBfYXN5bmNWYWxpZGF0b3JzOiBhbnlbXSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiB7W2tleTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlfSk6IHZvaWQge1xuICAgIGlmIChTdHJpbmdNYXBXcmFwcGVyLmNvbnRhaW5zKGNoYW5nZXMsIFwiZm9ybVwiKSkge1xuICAgICAgdmFyIHN5bmMgPSBjb21wb3NlVmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTtcbiAgICAgIHRoaXMuZm9ybS52YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW3RoaXMuZm9ybS52YWxpZGF0b3IsIHN5bmNdKTtcblxuICAgICAgdmFyIGFzeW5jID0gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyh0aGlzLl9hc3luY1ZhbGlkYXRvcnMpO1xuICAgICAgdGhpcy5mb3JtLmFzeW5jVmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlQXN5bmMoW3RoaXMuZm9ybS5hc3luY1ZhbGlkYXRvciwgYXN5bmNdKTtcblxuICAgICAgdGhpcy5mb3JtLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe29ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgfVxuXG4gICAgdGhpcy5fdXBkYXRlRG9tVmFsdWUoKTtcbiAgfVxuXG4gIGdldCBmb3JtRGlyZWN0aXZlKCk6IEZvcm0geyByZXR1cm4gdGhpczsgfVxuXG4gIGdldCBjb250cm9sKCk6IENvbnRyb2xHcm91cCB7IHJldHVybiB0aGlzLmZvcm07IH1cblxuICBnZXQgcGF0aCgpOiBzdHJpbmdbXSB7IHJldHVybiBbXTsgfVxuXG4gIGFkZENvbnRyb2woZGlyOiBOZ0NvbnRyb2wpOiB2b2lkIHtcbiAgICB2YXIgY3RybDogYW55ID0gdGhpcy5mb3JtLmZpbmQoZGlyLnBhdGgpO1xuICAgIHNldFVwQ29udHJvbChjdHJsLCBkaXIpO1xuICAgIGN0cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIHRoaXMuZGlyZWN0aXZlcy5wdXNoKGRpcik7XG4gIH1cblxuICBnZXRDb250cm9sKGRpcjogTmdDb250cm9sKTogQ29udHJvbCB7IHJldHVybiA8Q29udHJvbD50aGlzLmZvcm0uZmluZChkaXIucGF0aCk7IH1cblxuICByZW1vdmVDb250cm9sKGRpcjogTmdDb250cm9sKTogdm9pZCB7IExpc3RXcmFwcGVyLnJlbW92ZSh0aGlzLmRpcmVjdGl2ZXMsIGRpcik7IH1cblxuICBhZGRDb250cm9sR3JvdXAoZGlyOiBOZ0NvbnRyb2xHcm91cCkge1xuICAgIHZhciBjdHJsOiBhbnkgPSB0aGlzLmZvcm0uZmluZChkaXIucGF0aCk7XG4gICAgc2V0VXBDb250cm9sR3JvdXAoY3RybCwgZGlyKTtcbiAgICBjdHJsLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoe2VtaXRFdmVudDogZmFsc2V9KTtcbiAgfVxuXG4gIHJlbW92ZUNvbnRyb2xHcm91cChkaXI6IE5nQ29udHJvbEdyb3VwKSB7fVxuXG4gIGdldENvbnRyb2xHcm91cChkaXI6IE5nQ29udHJvbEdyb3VwKTogQ29udHJvbEdyb3VwIHtcbiAgICByZXR1cm4gPENvbnRyb2xHcm91cD50aGlzLmZvcm0uZmluZChkaXIucGF0aCk7XG4gIH1cblxuICB1cGRhdGVNb2RlbChkaXI6IE5nQ29udHJvbCwgdmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHZhciBjdHJswqAgPSA8Q29udHJvbD50aGlzLmZvcm0uZmluZChkaXIucGF0aCk7XG4gICAgY3RybC51cGRhdGVWYWx1ZSh2YWx1ZSk7XG4gIH1cblxuICBvblN1Ym1pdCgpOiBib29sZWFuIHtcbiAgICBPYnNlcnZhYmxlV3JhcHBlci5jYWxsRW1pdCh0aGlzLm5nU3VibWl0LCBudWxsKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF91cGRhdGVEb21WYWx1ZSgpIHtcbiAgICB0aGlzLmRpcmVjdGl2ZXMuZm9yRWFjaChkaXIgPT4ge1xuICAgICAgdmFyIGN0cmw6IGFueSA9IHRoaXMuZm9ybS5maW5kKGRpci5wYXRoKTtcbiAgICAgIGRpci52YWx1ZUFjY2Vzc29yLndyaXRlVmFsdWUoY3RybC52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19mb3JtX21vZGVsLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgUHJvbWlzZVdyYXBwZXIsXG4gIE9ic2VydmFibGVXcmFwcGVyLFxuICBFdmVudEVtaXR0ZXIsXG4gIFByb21pc2VDb21wbGV0ZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXIsIExpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIENPTlNUX0VYUFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0RpcmVjdGl2ZSwgZm9yd2FyZFJlZiwgUHJvdmlkZXIsIE9wdGlvbmFsLCBJbmplY3QsIFNlbGZ9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtOZ0NvbnRyb2x9IGZyb20gJy4vbmdfY29udHJvbCc7XG5pbXBvcnQge0Zvcm19IGZyb20gJy4vZm9ybV9pbnRlcmZhY2UnO1xuaW1wb3J0IHtOZ0NvbnRyb2xHcm91cH0gZnJvbSAnLi9uZ19jb250cm9sX2dyb3VwJztcbmltcG9ydCB7Q29udHJvbENvbnRhaW5lcn0gZnJvbSAnLi9jb250cm9sX2NvbnRhaW5lcic7XG5pbXBvcnQge0Fic3RyYWN0Q29udHJvbCwgQ29udHJvbEdyb3VwLCBDb250cm9sfSBmcm9tICcuLi9tb2RlbCc7XG5pbXBvcnQge3NldFVwQ29udHJvbCwgc2V0VXBDb250cm9sR3JvdXAsIGNvbXBvc2VWYWxpZGF0b3JzLCBjb21wb3NlQXN5bmNWYWxpZGF0b3JzfSBmcm9tICcuL3NoYXJlZCc7XG5pbXBvcnQge1ZhbGlkYXRvcnMsIE5HX1ZBTElEQVRPUlMsIE5HX0FTWU5DX1ZBTElEQVRPUlN9IGZyb20gJy4uL3ZhbGlkYXRvcnMnO1xuXG5jb25zdCBmb3JtRGlyZWN0aXZlUHJvdmlkZXIgPVxuICAgIENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKENvbnRyb2xDb250YWluZXIsIHt1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOZ0Zvcm0pfSkpO1xuXG4vKipcbiAqIElmIGBOZ0Zvcm1gIGlzIGJvdW5kIGluIGEgY29tcG9uZW50LCBgPGZvcm0+YCBlbGVtZW50cyBpbiB0aGF0IGNvbXBvbmVudCB3aWxsIGJlXG4gKiB1cGdyYWRlZCB0byB1c2UgdGhlIEFuZ3VsYXIgZm9ybSBzeXN0ZW0uXG4gKlxuICogIyMjIFR5cGljYWwgVXNlXG4gKlxuICogSW5jbHVkZSBgRk9STV9ESVJFQ1RJVkVTYCBpbiB0aGUgYGRpcmVjdGl2ZXNgIHNlY3Rpb24gb2YgYSB7QGxpbmsgVmlld30gYW5ub3RhdGlvblxuICogdG8gdXNlIGBOZ0Zvcm1gIGFuZCBpdHMgYXNzb2NpYXRlZCBjb250cm9scy5cbiAqXG4gKiAjIyMgU3RydWN0dXJlXG4gKlxuICogQW4gQW5ndWxhciBmb3JtIGlzIGEgY29sbGVjdGlvbiBvZiBgQ29udHJvbGBzIGluIHNvbWUgaGllcmFyY2h5LlxuICogYENvbnRyb2xgcyBjYW4gYmUgYXQgdGhlIHRvcCBsZXZlbCBvciBjYW4gYmUgb3JnYW5pemVkIGluIGBDb250cm9sR3JvdXBgc1xuICogb3IgYENvbnRyb2xBcnJheWBzLiBUaGlzIGhpZXJhcmNoeSBpcyByZWZsZWN0ZWQgaW4gdGhlIGZvcm0ncyBgdmFsdWVgLCBhXG4gKiBKU09OIG9iamVjdCB0aGF0IG1pcnJvcnMgdGhlIGZvcm0gc3RydWN0dXJlLlxuICpcbiAqICMjIyBTdWJtaXNzaW9uXG4gKlxuICogVGhlIGBuZ1N1Ym1pdGAgZXZlbnQgc2lnbmFscyB3aGVuIHRoZSB1c2VyIHRyaWdnZXJzIGEgZm9ybSBzdWJtaXNzaW9uLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9sdGRnWWo0UDBpWTY0QVI3MUVwTD9wPXByZXZpZXcpKVxuICpcbiAqICBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICB0ZW1wbGF0ZTogYFxuICogICAgIDxkaXY+XG4gKiAgICAgICA8cD5TdWJtaXQgdGhlIGZvcm0gdG8gc2VlIHRoZSBkYXRhIG9iamVjdCBBbmd1bGFyIGJ1aWxkczwvcD5cbiAqICAgICAgIDxoMj5OZ0Zvcm0gZGVtbzwvaDI+XG4gKiAgICAgICA8Zm9ybSAjZj1cIm5nRm9ybVwiIChuZ1N1Ym1pdCk9XCJvblN1Ym1pdChmLnZhbHVlKVwiPlxuICogICAgICAgICA8aDM+Q29udHJvbCBncm91cDogY3JlZGVudGlhbHM8L2gzPlxuICogICAgICAgICA8ZGl2IG5nQ29udHJvbEdyb3VwPVwiY3JlZGVudGlhbHNcIj5cbiAqICAgICAgICAgICA8cD5Mb2dpbjogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmdDb250cm9sPVwibG9naW5cIj48L3A+XG4gKiAgICAgICAgICAgPHA+UGFzc3dvcmQ6IDxpbnB1dCB0eXBlPVwicGFzc3dvcmRcIiBuZ0NvbnRyb2w9XCJwYXNzd29yZFwiPjwvcD5cbiAqICAgICAgICAgPC9kaXY+XG4gKiAgICAgICAgIDxoMz5Db250cm9sIGdyb3VwOiBwZXJzb248L2gzPlxuICogICAgICAgICA8ZGl2IG5nQ29udHJvbEdyb3VwPVwicGVyc29uXCI+XG4gKiAgICAgICAgICAgPHA+Rmlyc3QgbmFtZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmdDb250cm9sPVwiZmlyc3ROYW1lXCI+PC9wPlxuICogICAgICAgICAgIDxwPkxhc3QgbmFtZTogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgbmdDb250cm9sPVwibGFzdE5hbWVcIj48L3A+XG4gKiAgICAgICAgIDwvZGl2PlxuICogICAgICAgICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIj5TdWJtaXQgRm9ybTwvYnV0dG9uPlxuICogICAgICAgPHA+Rm9ybSBkYXRhIHN1Ym1pdHRlZDo8L3A+XG4gKiAgICAgICA8L2Zvcm0+XG4gKiAgICAgICA8cHJlPnt7ZGF0YX19PC9wcmU+XG4gKiAgICAgPC9kaXY+XG4gKiBgLFxuICogICBkaXJlY3RpdmVzOiBbQ09SRV9ESVJFQ1RJVkVTLCBGT1JNX0RJUkVDVElWRVNdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIEFwcCB7XG4gKiAgIGNvbnN0cnVjdG9yKCkge31cbiAqXG4gKiAgIGRhdGE6IHN0cmluZztcbiAqXG4gKiAgIG9uU3VibWl0KGRhdGEpIHtcbiAqICAgICB0aGlzLmRhdGEgPSBKU09OLnN0cmluZ2lmeShkYXRhLCBudWxsLCAyKTtcbiAqICAgfVxuICogfVxuICogIGBgYFxuICovXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdmb3JtOm5vdChbbmdOb0Zvcm1dKTpub3QoW25nRm9ybU1vZGVsXSksbmdGb3JtLFtuZ0Zvcm1dJyxcbiAgYmluZGluZ3M6IFtmb3JtRGlyZWN0aXZlUHJvdmlkZXJdLFxuICBob3N0OiB7XG4gICAgJyhzdWJtaXQpJzogJ29uU3VibWl0KCknLFxuICB9LFxuICBvdXRwdXRzOiBbJ25nU3VibWl0J10sXG4gIGV4cG9ydEFzOiAnbmdGb3JtJ1xufSlcbmV4cG9ydCBjbGFzcyBOZ0Zvcm0gZXh0ZW5kcyBDb250cm9sQ29udGFpbmVyIGltcGxlbWVudHMgRm9ybSB7XG4gIGZvcm06IENvbnRyb2xHcm91cDtcbiAgbmdTdWJtaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQFNlbGYoKSBASW5qZWN0KE5HX1ZBTElEQVRPUlMpIHZhbGlkYXRvcnM6IGFueVtdLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBAU2VsZigpIEBJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUykgYXN5bmNWYWxpZGF0b3JzOiBhbnlbXSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5mb3JtID0gbmV3IENvbnRyb2xHcm91cCh7fSwgbnVsbCwgY29tcG9zZVZhbGlkYXRvcnModmFsaWRhdG9ycyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKGFzeW5jVmFsaWRhdG9ycykpO1xuICB9XG5cbiAgZ2V0IGZvcm1EaXJlY3RpdmUoKTogRm9ybSB7IHJldHVybiB0aGlzOyB9XG5cbiAgZ2V0IGNvbnRyb2woKTogQ29udHJvbEdyb3VwIHsgcmV0dXJuIHRoaXMuZm9ybTsgfVxuXG4gIGdldCBwYXRoKCk6IHN0cmluZ1tdIHsgcmV0dXJuIFtdOyB9XG5cbiAgZ2V0IGNvbnRyb2xzKCk6IHtba2V5OiBzdHJpbmddOiBBYnN0cmFjdENvbnRyb2x9IHsgcmV0dXJuIHRoaXMuZm9ybS5jb250cm9sczsgfVxuXG4gIGFkZENvbnRyb2woZGlyOiBOZ0NvbnRyb2wpOiB2b2lkIHtcbiAgICBQcm9taXNlV3JhcHBlci5zY2hlZHVsZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZmluZENvbnRhaW5lcihkaXIucGF0aCk7XG4gICAgICB2YXIgY3RybCA9IG5ldyBDb250cm9sKCk7XG4gICAgICBzZXRVcENvbnRyb2woY3RybCwgZGlyKTtcbiAgICAgIGNvbnRhaW5lci5hZGRDb250cm9sKGRpci5uYW1lLCBjdHJsKTtcbiAgICAgIGN0cmwudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29udHJvbChkaXI6IE5nQ29udHJvbCk6IENvbnRyb2wgeyByZXR1cm4gPENvbnRyb2w+dGhpcy5mb3JtLmZpbmQoZGlyLnBhdGgpOyB9XG5cbiAgcmVtb3ZlQ29udHJvbChkaXI6IE5nQ29udHJvbCk6IHZvaWQge1xuICAgIFByb21pc2VXcmFwcGVyLnNjaGVkdWxlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9maW5kQ29udGFpbmVyKGRpci5wYXRoKTtcbiAgICAgIGlmIChpc1ByZXNlbnQoY29udGFpbmVyKSkge1xuICAgICAgICBjb250YWluZXIucmVtb3ZlQ29udHJvbChkaXIubmFtZSk7XG4gICAgICAgIGNvbnRhaW5lci51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHtlbWl0RXZlbnQ6IGZhbHNlfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBhZGRDb250cm9sR3JvdXAoZGlyOiBOZ0NvbnRyb2xHcm91cCk6IHZvaWQge1xuICAgIFByb21pc2VXcmFwcGVyLnNjaGVkdWxlTWljcm90YXNrKCgpID0+IHtcbiAgICAgIHZhciBjb250YWluZXIgPSB0aGlzLl9maW5kQ29udGFpbmVyKGRpci5wYXRoKTtcbiAgICAgIHZhciBncm91cCA9IG5ldyBDb250cm9sR3JvdXAoe30pO1xuICAgICAgc2V0VXBDb250cm9sR3JvdXAoZ3JvdXAsIGRpcik7XG4gICAgICBjb250YWluZXIuYWRkQ29udHJvbChkaXIubmFtZSwgZ3JvdXApO1xuICAgICAgZ3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmVtb3ZlQ29udHJvbEdyb3VwKGRpcjogTmdDb250cm9sR3JvdXApOiB2b2lkIHtcbiAgICBQcm9taXNlV3JhcHBlci5zY2hlZHVsZU1pY3JvdGFzaygoKSA9PiB7XG4gICAgICB2YXIgY29udGFpbmVyID0gdGhpcy5fZmluZENvbnRhaW5lcihkaXIucGF0aCk7XG4gICAgICBpZiAoaXNQcmVzZW50KGNvbnRhaW5lcikpIHtcbiAgICAgICAgY29udGFpbmVyLnJlbW92ZUNvbnRyb2woZGlyLm5hbWUpO1xuICAgICAgICBjb250YWluZXIudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7ZW1pdEV2ZW50OiBmYWxzZX0pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29udHJvbEdyb3VwKGRpcjogTmdDb250cm9sR3JvdXApOiBDb250cm9sR3JvdXAge1xuICAgIHJldHVybiA8Q29udHJvbEdyb3VwPnRoaXMuZm9ybS5maW5kKGRpci5wYXRoKTtcbiAgfVxuXG4gIHVwZGF0ZU1vZGVsKGRpcjogTmdDb250cm9sLCB2YWx1ZTogYW55KTogdm9pZCB7XG4gICAgUHJvbWlzZVdyYXBwZXIuc2NoZWR1bGVNaWNyb3Rhc2soKCkgPT4ge1xuICAgICAgdmFyIGN0cmwgPSA8Q29udHJvbD50aGlzLmZvcm0uZmluZChkaXIucGF0aCk7XG4gICAgICBjdHJsLnVwZGF0ZVZhbHVlKHZhbHVlKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uU3VibWl0KCk6IGJvb2xlYW4ge1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMubmdTdWJtaXQsIG51bGwpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2ZpbmRDb250YWluZXIocGF0aDogc3RyaW5nW10pOiBDb250cm9sR3JvdXAge1xuICAgIHBhdGgucG9wKCk7XG4gICAgcmV0dXJuIExpc3RXcmFwcGVyLmlzRW1wdHkocGF0aCkgPyB0aGlzLmZvcm0gOiA8Q29udHJvbEdyb3VwPnRoaXMuZm9ybS5maW5kKHBhdGgpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMvbmdfZm9ybS50c1xuICoqLyIsImltcG9ydCB7RGlyZWN0aXZlLCBTZWxmfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7TmdDb250cm9sfSBmcm9tICcuL25nX2NvbnRyb2wnO1xuaW1wb3J0IHtpc0JsYW5rLCBpc1ByZXNlbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8qKlxuICogRGlyZWN0aXZlIGF1dG9tYXRpY2FsbHkgYXBwbGllZCB0byBBbmd1bGFyIGZvcm1zIHRoYXQgc2V0cyBDU1MgY2xhc3Nlc1xuICogYmFzZWQgb24gY29udHJvbCBzdGF0dXMgKHZhbGlkL2ludmFsaWQvZGlydHkvZXRjKS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW25nQ29udHJvbF0sW25nTW9kZWxdLFtuZ0Zvcm1Db250cm9sXScsXG4gIGhvc3Q6IHtcbiAgICAnW2NsYXNzLm5nLXVudG91Y2hlZF0nOiAnbmdDbGFzc1VudG91Y2hlZCcsXG4gICAgJ1tjbGFzcy5uZy10b3VjaGVkXSc6ICduZ0NsYXNzVG91Y2hlZCcsXG4gICAgJ1tjbGFzcy5uZy1wcmlzdGluZV0nOiAnbmdDbGFzc1ByaXN0aW5lJyxcbiAgICAnW2NsYXNzLm5nLWRpcnR5XSc6ICduZ0NsYXNzRGlydHknLFxuICAgICdbY2xhc3MubmctdmFsaWRdJzogJ25nQ2xhc3NWYWxpZCcsXG4gICAgJ1tjbGFzcy5uZy1pbnZhbGlkXSc6ICduZ0NsYXNzSW52YWxpZCdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBOZ0NvbnRyb2xTdGF0dXMge1xuICBwcml2YXRlIF9jZDogTmdDb250cm9sO1xuXG4gIGNvbnN0cnVjdG9yKEBTZWxmKCkgY2Q6IE5nQ29udHJvbCkgeyB0aGlzLl9jZCA9IGNkOyB9XG5cbiAgZ2V0IG5nQ2xhc3NVbnRvdWNoZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9jZC5jb250cm9sKSA/IHRoaXMuX2NkLmNvbnRyb2wudW50b3VjaGVkIDogZmFsc2U7XG4gIH1cbiAgZ2V0IG5nQ2xhc3NUb3VjaGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ByZXNlbnQodGhpcy5fY2QuY29udHJvbCkgPyB0aGlzLl9jZC5jb250cm9sLnRvdWNoZWQgOiBmYWxzZTtcbiAgfVxuICBnZXQgbmdDbGFzc1ByaXN0aW5lKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ByZXNlbnQodGhpcy5fY2QuY29udHJvbCkgPyB0aGlzLl9jZC5jb250cm9sLnByaXN0aW5lIDogZmFsc2U7XG4gIH1cbiAgZ2V0IG5nQ2xhc3NEaXJ0eSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuX2NkLmNvbnRyb2wpID8gdGhpcy5fY2QuY29udHJvbC5kaXJ0eSA6IGZhbHNlO1xuICB9XG4gIGdldCBuZ0NsYXNzVmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9jZC5jb250cm9sKSA/IHRoaXMuX2NkLmNvbnRyb2wudmFsaWQgOiBmYWxzZTtcbiAgfVxuICBnZXQgbmdDbGFzc0ludmFsaWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9jZC5jb250cm9sKSA/ICF0aGlzLl9jZC5jb250cm9sLnZhbGlkIDogZmFsc2U7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy9uZ19jb250cm9sX3N0YXR1cy50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgQ09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7TmdDb250cm9sTmFtZX0gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2NvbnRyb2xfbmFtZSc7XG5pbXBvcnQge05nRm9ybUNvbnRyb2x9IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19mb3JtX2NvbnRyb2wnO1xuaW1wb3J0IHtOZ01vZGVsfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfbW9kZWwnO1xuaW1wb3J0IHtOZ0NvbnRyb2xHcm91cH0gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2NvbnRyb2xfZ3JvdXAnO1xuaW1wb3J0IHtOZ0Zvcm1Nb2RlbH0gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2Zvcm1fbW9kZWwnO1xuaW1wb3J0IHtOZ0Zvcm19IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19mb3JtJztcbmltcG9ydCB7RGVmYXVsdFZhbHVlQWNjZXNzb3J9IGZyb20gJy4vZGlyZWN0aXZlcy9kZWZhdWx0X3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7Q2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9kaXJlY3RpdmVzL2NoZWNrYm94X3ZhbHVlX2FjY2Vzc29yJztcbmltcG9ydCB7TnVtYmVyVmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9kaXJlY3RpdmVzL251bWJlcl92YWx1ZV9hY2Nlc3Nvcic7XG5pbXBvcnQge05nQ29udHJvbFN0YXR1c30gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2NvbnRyb2xfc3RhdHVzJztcbmltcG9ydCB7XG4gIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBOZ1NlbGVjdE9wdGlvblxufSBmcm9tICcuL2RpcmVjdGl2ZXMvc2VsZWN0X2NvbnRyb2xfdmFsdWVfYWNjZXNzb3InO1xuaW1wb3J0IHtSZXF1aXJlZFZhbGlkYXRvciwgTWluTGVuZ3RoVmFsaWRhdG9yLCBNYXhMZW5ndGhWYWxpZGF0b3J9IGZyb20gJy4vZGlyZWN0aXZlcy92YWxpZGF0b3JzJztcblxuZXhwb3J0IHtOZ0NvbnRyb2xOYW1lfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9uYW1lJztcbmV4cG9ydCB7TmdGb3JtQ29udHJvbH0gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2Zvcm1fY29udHJvbCc7XG5leHBvcnQge05nTW9kZWx9IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19tb2RlbCc7XG5leHBvcnQge05nQ29udHJvbEdyb3VwfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9ncm91cCc7XG5leHBvcnQge05nRm9ybU1vZGVsfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfZm9ybV9tb2RlbCc7XG5leHBvcnQge05nRm9ybX0gZnJvbSAnLi9kaXJlY3RpdmVzL25nX2Zvcm0nO1xuZXhwb3J0IHtEZWZhdWx0VmFsdWVBY2Nlc3Nvcn0gZnJvbSAnLi9kaXJlY3RpdmVzL2RlZmF1bHRfdmFsdWVfYWNjZXNzb3InO1xuZXhwb3J0IHtDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2RpcmVjdGl2ZXMvY2hlY2tib3hfdmFsdWVfYWNjZXNzb3InO1xuZXhwb3J0IHtOdW1iZXJWYWx1ZUFjY2Vzc29yfSBmcm9tICcuL2RpcmVjdGl2ZXMvbnVtYmVyX3ZhbHVlX2FjY2Vzc29yJztcbmV4cG9ydCB7TmdDb250cm9sU3RhdHVzfSBmcm9tICcuL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9zdGF0dXMnO1xuZXhwb3J0IHtcbiAgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IsXG4gIE5nU2VsZWN0T3B0aW9uXG59IGZyb20gJy4vZGlyZWN0aXZlcy9zZWxlY3RfY29udHJvbF92YWx1ZV9hY2Nlc3Nvcic7XG5leHBvcnQge1JlcXVpcmVkVmFsaWRhdG9yLCBNaW5MZW5ndGhWYWxpZGF0b3IsIE1heExlbmd0aFZhbGlkYXRvcn0gZnJvbSAnLi9kaXJlY3RpdmVzL3ZhbGlkYXRvcnMnO1xuZXhwb3J0IHtOZ0NvbnRyb2x9IGZyb20gJy4vZGlyZWN0aXZlcy9uZ19jb250cm9sJztcbmV4cG9ydCB7Q29udHJvbFZhbHVlQWNjZXNzb3J9IGZyb20gJy4vZGlyZWN0aXZlcy9jb250cm9sX3ZhbHVlX2FjY2Vzc29yJztcblxuLyoqXG4gKlxuICogQSBsaXN0IG9mIGFsbCB0aGUgZm9ybSBkaXJlY3RpdmVzIHVzZWQgYXMgcGFydCBvZiBhIGBAVmlld2AgYW5ub3RhdGlvbi5cbiAqXG4gKiAgVGhpcyBpcyBhIHNob3J0aGFuZCBmb3IgaW1wb3J0aW5nIHRoZW0gZWFjaCBpbmRpdmlkdWFsbHkuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdteS1hcHAnLFxuICogICBkaXJlY3RpdmVzOiBbRk9STV9ESVJFQ1RJVkVTXVxuICogfSlcbiAqIGNsYXNzIE15QXBwIHt9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fRElSRUNUSVZFUzogVHlwZVtdID0gQ09OU1RfRVhQUihbXG4gIE5nQ29udHJvbE5hbWUsXG4gIE5nQ29udHJvbEdyb3VwLFxuXG4gIE5nRm9ybUNvbnRyb2wsXG4gIE5nTW9kZWwsXG4gIE5nRm9ybU1vZGVsLFxuICBOZ0Zvcm0sXG5cbiAgTmdTZWxlY3RPcHRpb24sXG4gIERlZmF1bHRWYWx1ZUFjY2Vzc29yLFxuICBOdW1iZXJWYWx1ZUFjY2Vzc29yLFxuICBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcixcbiAgTmdDb250cm9sU3RhdHVzLFxuXG4gIFJlcXVpcmVkVmFsaWRhdG9yLFxuICBNaW5MZW5ndGhWYWxpZGF0b3IsXG4gIE1heExlbmd0aFZhbGlkYXRvclxuXSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2Zvcm1zL2RpcmVjdGl2ZXMudHNcbiAqKi8iLCJpbXBvcnQge2ZvcndhcmRSZWYsIFByb3ZpZGVyLCBPcGFxdWVUb2tlbiwgQXR0cmlidXRlLCBEaXJlY3RpdmV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtWYWxpZGF0b3JzLCBOR19WQUxJREFUT1JTfSBmcm9tICcuLi92YWxpZGF0b3JzJztcbmltcG9ydCB7Q29udHJvbH0gZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0ICogYXMgbW9kZWxNb2R1bGUgZnJvbSAnLi4vbW9kZWwnO1xuaW1wb3J0IHtOdW1iZXJXcmFwcGVyfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nXCI7XG5cblxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgY2xhc3NlcyB0aGF0IGNhbiBhY3QgYXMgdmFsaWRhdG9ycy5cbiAqXG4gKiAjIyBVc2FnZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIEBEaXJlY3RpdmUoe1xuICogICBzZWxlY3RvcjogJ1tjdXN0b20tdmFsaWRhdG9yXScsXG4gKiAgIHByb3ZpZGVyczogW3Byb3ZpZGUoTkdfVkFMSURBVE9SUywge3VzZUV4aXN0aW5nOiBDdXN0b21WYWxpZGF0b3JEaXJlY3RpdmUsIG11bHRpOiB0cnVlfSldXG4gKiB9KVxuICogY2xhc3MgQ3VzdG9tVmFsaWRhdG9yRGlyZWN0aXZlIGltcGxlbWVudHMgVmFsaWRhdG9yIHtcbiAqICAgdmFsaWRhdGUoYzogQ29udHJvbCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAqICAgICByZXR1cm4ge1wiY3VzdG9tXCI6IHRydWV9O1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0b3IgeyB2YWxpZGF0ZShjOiBtb2RlbE1vZHVsZS5Db250cm9sKToge1trZXk6IHN0cmluZ106IGFueX07IH1cblxuY29uc3QgUkVRVUlSRURfVkFMSURBVE9SID1cbiAgICBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihOR19WQUxJREFUT1JTLCB7dXNlVmFsdWU6IFZhbGlkYXRvcnMucmVxdWlyZWQsIG11bHRpOiB0cnVlfSkpO1xuXG4vKipcbiAqIEEgRGlyZWN0aXZlIHRoYXQgYWRkcyB0aGUgYHJlcXVpcmVkYCB2YWxpZGF0b3IgdG8gYW55IGNvbnRyb2xzIG1hcmtlZCB3aXRoIHRoZVxuICogYHJlcXVpcmVkYCBhdHRyaWJ1dGUsIHZpYSB0aGUge0BsaW5rIE5HX1ZBTElEQVRPUlN9IGJpbmRpbmcuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIDxpbnB1dCBuZ0NvbnRyb2w9XCJmdWxsTmFtZVwiIHJlcXVpcmVkPlxuICogYGBgXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tyZXF1aXJlZF1bbmdDb250cm9sXSxbcmVxdWlyZWRdW25nRm9ybUNvbnRyb2xdLFtyZXF1aXJlZF1bbmdNb2RlbF0nLFxuICBwcm92aWRlcnM6IFtSRVFVSVJFRF9WQUxJREFUT1JdXG59KVxuZXhwb3J0IGNsYXNzIFJlcXVpcmVkVmFsaWRhdG9yIHtcbn1cblxuLyoqXG4gKiBQcm92aXZkZXIgd2hpY2ggYWRkcyB7QGxpbmsgTWluTGVuZ3RoVmFsaWRhdG9yfSB0byB7QGxpbmsgTkdfVkFMSURBVE9SU30uXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqXG4gKiB7QGV4YW1wbGUgY29tbW9uL2Zvcm1zL3RzL3ZhbGlkYXRvcnMvdmFsaWRhdG9ycy50cyByZWdpb249J21pbid9XG4gKi9cbmNvbnN0IE1JTl9MRU5HVEhfVkFMSURBVE9SID0gQ09OU1RfRVhQUihcbiAgICBuZXcgUHJvdmlkZXIoTkdfVkFMSURBVE9SUywge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1pbkxlbmd0aFZhbGlkYXRvciksIG11bHRpOiB0cnVlfSkpO1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHdoaWNoIGluc3RhbGxzIHRoZSB7QGxpbmsgTWluTGVuZ3RoVmFsaWRhdG9yfSBmb3IgYW55IGBuZ0NvbnRyb2xgLFxuICogYG5nRm9ybUNvbnRyb2xgLCBvciBjb250cm9sIHdpdGggYG5nTW9kZWxgIHRoYXQgYWxzbyBoYXMgYSBgbWlubGVuZ3RoYCBhdHRyaWJ1dGUuXG4gKi9cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1ttaW5sZW5ndGhdW25nQ29udHJvbF0sW21pbmxlbmd0aF1bbmdGb3JtQ29udHJvbF0sW21pbmxlbmd0aF1bbmdNb2RlbF0nLFxuICBwcm92aWRlcnM6IFtNSU5fTEVOR1RIX1ZBTElEQVRPUl1cbn0pXG5leHBvcnQgY2xhc3MgTWluTGVuZ3RoVmFsaWRhdG9yIGltcGxlbWVudHMgVmFsaWRhdG9yIHtcbiAgcHJpdmF0ZSBfdmFsaWRhdG9yOiBGdW5jdGlvbjtcblxuICBjb25zdHJ1Y3RvcihAQXR0cmlidXRlKFwibWlubGVuZ3RoXCIpIG1pbkxlbmd0aDogc3RyaW5nKSB7XG4gICAgdGhpcy5fdmFsaWRhdG9yID0gVmFsaWRhdG9ycy5taW5MZW5ndGgoTnVtYmVyV3JhcHBlci5wYXJzZUludChtaW5MZW5ndGgsIDEwKSk7XG4gIH1cblxuICB2YWxpZGF0ZShjOiBDb250cm9sKToge1trZXk6IHN0cmluZ106IGFueX0geyByZXR1cm4gdGhpcy5fdmFsaWRhdG9yKGMpOyB9XG59XG5cbi8qKlxuICogUHJvdmlkZXIgd2hpY2ggYWRkcyB7QGxpbmsgTWF4TGVuZ3RoVmFsaWRhdG9yfSB0byB7QGxpbmsgTkdfVkFMSURBVE9SU30uXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqXG4gKiB7QGV4YW1wbGUgY29tbW9uL2Zvcm1zL3RzL3ZhbGlkYXRvcnMvdmFsaWRhdG9ycy50cyByZWdpb249J21heCd9XG4gKi9cbmNvbnN0IE1BWF9MRU5HVEhfVkFMSURBVE9SID0gQ09OU1RfRVhQUihcbiAgICBuZXcgUHJvdmlkZXIoTkdfVkFMSURBVE9SUywge3VzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE1heExlbmd0aFZhbGlkYXRvciksIG11bHRpOiB0cnVlfSkpO1xuXG4vKipcbiAqIEEgZGlyZWN0aXZlIHdoaWNoIGluc3RhbGxzIHRoZSB7QGxpbmsgTWF4TGVuZ3RoVmFsaWRhdG9yfSBmb3IgYW55IGBuZ0NvbnRyb2wsIGBuZ0Zvcm1Db250cm9sYCxcbiAqIG9yIGNvbnRyb2wgd2l0aCBgbmdNb2RlbGAgdGhhdCBhbHNvIGhhcyBhIGBtYXhsZW5ndGhgIGF0dHJpYnV0ZS5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW21heGxlbmd0aF1bbmdDb250cm9sXSxbbWF4bGVuZ3RoXVtuZ0Zvcm1Db250cm9sXSxbbWF4bGVuZ3RoXVtuZ01vZGVsXScsXG4gIHByb3ZpZGVyczogW01BWF9MRU5HVEhfVkFMSURBVE9SXVxufSlcbmV4cG9ydCBjbGFzcyBNYXhMZW5ndGhWYWxpZGF0b3IgaW1wbGVtZW50cyBWYWxpZGF0b3Ige1xuICBwcml2YXRlIF92YWxpZGF0b3I6IEZ1bmN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKEBBdHRyaWJ1dGUoXCJtYXhsZW5ndGhcIikgbWF4TGVuZ3RoOiBzdHJpbmcpIHtcbiAgICB0aGlzLl92YWxpZGF0b3IgPSBWYWxpZGF0b3JzLm1heExlbmd0aChOdW1iZXJXcmFwcGVyLnBhcnNlSW50KG1heExlbmd0aCwgMTApKTtcbiAgfVxuXG4gIHZhbGlkYXRlKGM6IENvbnRyb2wpOiB7W2tleTogc3RyaW5nXTogYW55fSB7IHJldHVybiB0aGlzLl92YWxpZGF0b3IoYyk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZGlyZWN0aXZlcy92YWxpZGF0b3JzLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7U3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0FycmF5LCBDT05TVF9FWFBSLCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0ICogYXMgbW9kZWxNb2R1bGUgZnJvbSAnLi9tb2RlbCc7XG5cblxuLyoqXG4gKiBDcmVhdGVzIGEgZm9ybSBvYmplY3QgZnJvbSBhIHVzZXItc3BlY2lmaWVkIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0VOZ1pvOEV1SUVDWk5lbnNaQ1ZyP3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktYXBwJyxcbiAqICAgdmlld0JpbmRpbmdzOiBbRk9STV9CSU5ESU5HU11cbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8Zm9ybSBbbmdGb3JtTW9kZWxdPVwibG9naW5Gb3JtXCI+XG4gKiAgICAgICA8cD5Mb2dpbiA8aW5wdXQgbmdDb250cm9sPVwibG9naW5cIj48L3A+XG4gKiAgICAgICA8ZGl2IG5nQ29udHJvbEdyb3VwPVwicGFzc3dvcmRSZXRyeVwiPlxuICogICAgICAgICA8cD5QYXNzd29yZCA8aW5wdXQgdHlwZT1cInBhc3N3b3JkXCIgbmdDb250cm9sPVwicGFzc3dvcmRcIj48L3A+XG4gKiAgICAgICAgIDxwPkNvbmZpcm0gcGFzc3dvcmQgPGlucHV0IHR5cGU9XCJwYXNzd29yZFwiIG5nQ29udHJvbD1cInBhc3N3b3JkQ29uZmlybWF0aW9uXCI+PC9wPlxuICogICAgICAgPC9kaXY+XG4gKiAgICAgPC9mb3JtPlxuICogICAgIDxoMz5Gb3JtIHZhbHVlOjwvaDM+XG4gKiAgICAgPHByZT57e3ZhbHVlfX08L3ByZT5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW0ZPUk1fRElSRUNUSVZFU11cbiAqIH0pXG4gKiBleHBvcnQgY2xhc3MgQXBwIHtcbiAqICAgbG9naW5Gb3JtOiBDb250cm9sR3JvdXA7XG4gKlxuICogICBjb25zdHJ1Y3RvcihidWlsZGVyOiBGb3JtQnVpbGRlcikge1xuICogICAgIHRoaXMubG9naW5Gb3JtID0gYnVpbGRlci5ncm91cCh7XG4gKiAgICAgICBsb2dpbjogW1wiXCIsIFZhbGlkYXRvcnMucmVxdWlyZWRdLFxuICogICAgICAgcGFzc3dvcmRSZXRyeTogYnVpbGRlci5ncm91cCh7XG4gKiAgICAgICAgIHBhc3N3b3JkOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gKiAgICAgICAgIHBhc3N3b3JkQ29uZmlybWF0aW9uOiBbXCJcIiwgVmFsaWRhdG9ycy5yZXF1aXJlZCwgYXN5bmNWYWxpZGF0b3JdXG4gKiAgICAgICB9KVxuICogICAgIH0pO1xuICogICB9XG4gKlxuICogICBnZXQgdmFsdWUoKTogc3RyaW5nIHtcbiAqICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5sb2dpbkZvcm0udmFsdWUsIG51bGwsIDIpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEZvcm1CdWlsZGVyIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIG5ldyB7QGxpbmsgQ29udHJvbEdyb3VwfSB3aXRoIHRoZSBnaXZlbiBtYXAgb2YgY29uZmlndXJhdGlvbi5cbiAgICogVmFsaWQga2V5cyBmb3IgdGhlIGBleHRyYWAgcGFyYW1ldGVyIG1hcCBhcmUgYG9wdGlvbmFsc2AgYW5kIGB2YWxpZGF0b3JgLlxuICAgKlxuICAgKiBTZWUgdGhlIHtAbGluayBDb250cm9sR3JvdXB9IGNvbnN0cnVjdG9yIGZvciBtb3JlIGRldGFpbHMuXG4gICAqL1xuICBncm91cChjb250cm9sc0NvbmZpZzoge1trZXk6IHN0cmluZ106IGFueX0sXG4gICAgICAgIGV4dHJhOiB7W2tleTogc3RyaW5nXTogYW55fSA9IG51bGwpOiBtb2RlbE1vZHVsZS5Db250cm9sR3JvdXAge1xuICAgIHZhciBjb250cm9scyA9IHRoaXMuX3JlZHVjZUNvbnRyb2xzKGNvbnRyb2xzQ29uZmlnKTtcbiAgICB2YXIgb3B0aW9uYWxzID0gaXNQcmVzZW50KGV4dHJhKSA/IFN0cmluZ01hcFdyYXBwZXIuZ2V0KGV4dHJhLCBcIm9wdGlvbmFsc1wiKSA6IG51bGw7XG4gICAgdmFyIHZhbGlkYXRvciA9IGlzUHJlc2VudChleHRyYSkgPyBTdHJpbmdNYXBXcmFwcGVyLmdldChleHRyYSwgXCJ2YWxpZGF0b3JcIikgOiBudWxsO1xuICAgIHZhciBhc3luY1ZhbGlkYXRvciA9IGlzUHJlc2VudChleHRyYSkgPyBTdHJpbmdNYXBXcmFwcGVyLmdldChleHRyYSwgXCJhc3luY1ZhbGlkYXRvclwiKSA6IG51bGw7XG4gICAgcmV0dXJuIG5ldyBtb2RlbE1vZHVsZS5Db250cm9sR3JvdXAoY29udHJvbHMsIG9wdGlvbmFscywgdmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcik7XG4gIH1cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhIG5ldyB7QGxpbmsgQ29udHJvbH0gd2l0aCB0aGUgZ2l2ZW4gYHZhbHVlYCxgdmFsaWRhdG9yYCwgYW5kIGBhc3luY1ZhbGlkYXRvcmAuXG4gICAqL1xuICBjb250cm9sKHZhbHVlOiBPYmplY3QsIHZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsLFxuICAgICAgICAgIGFzeW5jVmFsaWRhdG9yOiBGdW5jdGlvbiA9IG51bGwpOiBtb2RlbE1vZHVsZS5Db250cm9sIHtcbiAgICByZXR1cm4gbmV3IG1vZGVsTW9kdWxlLkNvbnRyb2wodmFsdWUsIHZhbGlkYXRvciwgYXN5bmNWYWxpZGF0b3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdCBhbiBhcnJheSBvZiB7QGxpbmsgQ29udHJvbH1zIGZyb20gdGhlIGdpdmVuIGBjb250cm9sc0NvbmZpZ2AgYXJyYXkgb2ZcbiAgICogY29uZmlndXJhdGlvbiwgd2l0aCB0aGUgZ2l2ZW4gb3B0aW9uYWwgYHZhbGlkYXRvcmAgYW5kIGBhc3luY1ZhbGlkYXRvcmAuXG4gICAqL1xuICBhcnJheShjb250cm9sc0NvbmZpZzogYW55W10sIHZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsLFxuICAgICAgICBhc3luY1ZhbGlkYXRvcjogRnVuY3Rpb24gPSBudWxsKTogbW9kZWxNb2R1bGUuQ29udHJvbEFycmF5IHtcbiAgICB2YXIgY29udHJvbHMgPSBjb250cm9sc0NvbmZpZy5tYXAoYyA9PiB0aGlzLl9jcmVhdGVDb250cm9sKGMpKTtcbiAgICByZXR1cm4gbmV3IG1vZGVsTW9kdWxlLkNvbnRyb2xBcnJheShjb250cm9scywgdmFsaWRhdG9yLCBhc3luY1ZhbGlkYXRvcik7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9yZWR1Y2VDb250cm9scyhjb250cm9sc0NvbmZpZzogYW55KToge1trZXk6IHN0cmluZ106IG1vZGVsTW9kdWxlLkFic3RyYWN0Q29udHJvbH0ge1xuICAgIHZhciBjb250cm9sczoge1trZXk6IHN0cmluZ106IG1vZGVsTW9kdWxlLkFic3RyYWN0Q29udHJvbH0gPSB7fTtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goY29udHJvbHNDb25maWcsIChjb250cm9sQ29uZmlnLCBjb250cm9sTmFtZSkgPT4ge1xuICAgICAgY29udHJvbHNbY29udHJvbE5hbWVdID0gdGhpcy5fY3JlYXRlQ29udHJvbChjb250cm9sQ29uZmlnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY29udHJvbHM7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9jcmVhdGVDb250cm9sKGNvbnRyb2xDb25maWc6IGFueSk6IG1vZGVsTW9kdWxlLkFic3RyYWN0Q29udHJvbCB7XG4gICAgaWYgKGNvbnRyb2xDb25maWcgaW5zdGFuY2VvZiBtb2RlbE1vZHVsZS5Db250cm9sIHx8XG4gICAgICAgIGNvbnRyb2xDb25maWcgaW5zdGFuY2VvZiBtb2RlbE1vZHVsZS5Db250cm9sR3JvdXAgfHxcbiAgICAgICAgY29udHJvbENvbmZpZyBpbnN0YW5jZW9mIG1vZGVsTW9kdWxlLkNvbnRyb2xBcnJheSkge1xuICAgICAgcmV0dXJuIGNvbnRyb2xDb25maWc7XG5cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkoY29udHJvbENvbmZpZykpIHtcbiAgICAgIHZhciB2YWx1ZSA9IGNvbnRyb2xDb25maWdbMF07XG4gICAgICB2YXIgdmFsaWRhdG9yID0gY29udHJvbENvbmZpZy5sZW5ndGggPiAxID8gY29udHJvbENvbmZpZ1sxXSA6IG51bGw7XG4gICAgICB2YXIgYXN5bmNWYWxpZGF0b3IgPSBjb250cm9sQ29uZmlnLmxlbmd0aCA+IDIgPyBjb250cm9sQ29uZmlnWzJdIDogbnVsbDtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wodmFsdWUsIHZhbGlkYXRvciwgYXN5bmNWYWxpZGF0b3IpO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnRyb2woY29udHJvbENvbmZpZyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU2hvcnRoYW5kIHNldCBvZiBwcm92aWRlcnMgdXNlZCBmb3IgYnVpbGRpbmcgQW5ndWxhciBmb3Jtcy5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGJvb3RzdHJhcChNeUFwcCwgW0ZPUk1fUFJPVklERVJTXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fUFJPVklERVJTOiBUeXBlW10gPSBDT05TVF9FWFBSKFtGb3JtQnVpbGRlcl0pO1xuXG4vKipcbiAqIFNlZSB7QGxpbmsgRk9STV9QUk9WSURFUlN9IGluc3RlYWQuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEZPUk1fQklORElOR1MgPSBGT1JNX1BST1ZJREVSUztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21tb24vZm9ybXMvZm9ybV9idWlsZGVyLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSLCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge0ZPUk1fRElSRUNUSVZFU30gZnJvbSAnLi9mb3Jtcyc7XG5pbXBvcnQge0NPUkVfRElSRUNUSVZFU30gZnJvbSAnLi9kaXJlY3RpdmVzJztcblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgQW5ndWxhciBjb3JlIGRpcmVjdGl2ZXMgdGhhdCBhcmUgbGlrZWx5IHRvIGJlIHVzZWQgaW4gZWFjaCBhbmQgZXZlcnkgQW5ndWxhclxuICogYXBwbGljYXRpb24uIFRoaXMgaW5jbHVkZXMgY29yZSBkaXJlY3RpdmVzIChlLmcuLCBOZ0lmIGFuZCBOZ0ZvciksIGFuZCBmb3JtcyBkaXJlY3RpdmVzIChlLmcuLFxuICogTmdNb2RlbCkuXG4gKlxuICogVGhpcyBjb2xsZWN0aW9uIGNhbiBiZSB1c2VkIHRvIHF1aWNrbHkgZW51bWVyYXRlIGFsbCB0aGUgYnVpbHQtaW4gZGlyZWN0aXZlcyBpbiB0aGUgYGRpcmVjdGl2ZXNgXG4gKiBwcm9wZXJ0eSBvZiB0aGUgYEBDb21wb25lbnRgIG9yIGBAVmlld2AgZGVjb3JhdG9ycy5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIEluc3RlYWQgb2Ygd3JpdGluZzpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge05nQ2xhc3MsIE5nSWYsIE5nRm9yLCBOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHQsIE5nTW9kZWwsIE5nRm9ybX0gZnJvbVxuICogJ2FuZ3VsYXIyL2NvbW1vbic7XG4gKiBpbXBvcnQge090aGVyRGlyZWN0aXZlfSBmcm9tICcuL215RGlyZWN0aXZlcyc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnbXktY29tcG9uZW50JyxcbiAqICAgdGVtcGxhdGVVcmw6ICdteUNvbXBvbmVudC5odG1sJyxcbiAqICAgZGlyZWN0aXZlczogW05nQ2xhc3MsIE5nSWYsIE5nRm9yLCBOZ1N3aXRjaCwgTmdTd2l0Y2hXaGVuLCBOZ1N3aXRjaERlZmF1bHQsIE5nTW9kZWwsIE5nRm9ybSxcbiAqIE90aGVyRGlyZWN0aXZlXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBNeUNvbXBvbmVudCB7XG4gKiAgIC4uLlxuICogfVxuICogYGBgXG4gKiBvbmUgY291bGQgaW1wb3J0IGFsbCB0aGUgY29tbW9uIGRpcmVjdGl2ZXMgYXQgb25jZTpcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge0NPTU1PTl9ESVJFQ1RJVkVTfSBmcm9tICdhbmd1bGFyMi9jb21tb24nO1xuICogaW1wb3J0IHtPdGhlckRpcmVjdGl2ZX0gZnJvbSAnLi9teURpcmVjdGl2ZXMnO1xuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ215LWNvbXBvbmVudCcsXG4gKiAgIHRlbXBsYXRlVXJsOiAnbXlDb21wb25lbnQuaHRtbCcsXG4gKiAgIGRpcmVjdGl2ZXM6IFtDT01NT05fRElSRUNUSVZFUywgT3RoZXJEaXJlY3RpdmVdXG4gKiB9KVxuICogZXhwb3J0IGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgLi4uXG4gKiB9XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IENPTU1PTl9ESVJFQ1RJVkVTOiBUeXBlW11bXSA9IENPTlNUX0VYUFIoW0NPUkVfRElSRUNUSVZFUywgRk9STV9ESVJFQ1RJVkVTXSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tbW9uL2NvbW1vbl9kaXJlY3RpdmVzLnRzXG4gKiovIiwiLyoqXG4gKiBAbW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqIFN0YXJ0aW5nIHBvaW50IHRvIGltcG9ydCBhbGwgY29tcGlsZXIgQVBJcy5cbiAqL1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvY29tcGlsZXIvdXJsX3Jlc29sdmVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL2NvbXBpbGVyL3hocic7XG5leHBvcnQgKiBmcm9tICcuL3NyYy9jb21waWxlci9jb21waWxlcic7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvY29tcGlsZXIudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGUsIEluamVjdH0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtcbiAgU3RyaW5nV3JhcHBlcixcbiAgaXNQcmVzZW50LFxuICBpc0JsYW5rLFxuICBSZWdFeHBXcmFwcGVyLFxuICBub3JtYWxpemVCbGFua1xufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7UEFDS0FHRV9ST09UX1VSTH0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvYXBwbGljYXRpb25fdG9rZW5zJztcbmltcG9ydCB7UHJvdmlkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcblxuLyoqXG4gKiBDcmVhdGUgYSB7QGxpbmsgVXJsUmVzb2x2ZXJ9IHdpdGggbm8gcGFja2FnZSBwcmVmaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXaXRob3V0UGFja2FnZVByZWZpeCgpOiBVcmxSZXNvbHZlciB7XG4gIHJldHVybiBuZXcgVXJsUmVzb2x2ZXIoKTtcbn1cblxuLyoqXG4gKiBBIGRlZmF1bHQgcHJvdmlkZXIgZm9yIHtAbGluayBQQUNLQUdFX1JPT1RfVVJMfSB0aGF0IG1hcHMgdG8gJy8nLlxuICovXG5leHBvcnQgdmFyIERFRkFVTFRfUEFDS0FHRV9VUkxfUFJPVklERVIgPSBuZXcgUHJvdmlkZXIoUEFDS0FHRV9ST09UX1VSTCwge3VzZVZhbHVlOiBcIi9cIn0pO1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHtAbGluayBDb21waWxlcn0gd2hlbiByZXNvbHZpbmcgSFRNTCBhbmQgQ1NTIHRlbXBsYXRlIFVSTHMuXG4gKlxuICogVGhpcyBjbGFzcyBjYW4gYmUgb3ZlcnJpZGRlbiBieSB0aGUgYXBwbGljYXRpb24gZGV2ZWxvcGVyIHRvIGNyZWF0ZSBjdXN0b20gYmVoYXZpb3IuXG4gKlxuICogU2VlIHtAbGluayBDb21waWxlcn1cbiAqXG4gKiAjIyBFeGFtcGxlXG4gKlxuICoge0BleGFtcGxlIGNvbXBpbGVyL3RzL3VybF9yZXNvbHZlci91cmxfcmVzb2x2ZXIudHMgcmVnaW9uPSd1cmxfcmVzb2x2ZXInfVxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVXJsUmVzb2x2ZXIge1xuICBwcml2YXRlIF9wYWNrYWdlUHJlZml4OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoQEluamVjdChQQUNLQUdFX1JPT1RfVVJMKSBwYWNrYWdlUHJlZml4OiBzdHJpbmcgPSBudWxsKSB7XG4gICAgaWYgKGlzUHJlc2VudChwYWNrYWdlUHJlZml4KSkge1xuICAgICAgdGhpcy5fcGFja2FnZVByZWZpeCA9IFN0cmluZ1dyYXBwZXIuc3RyaXBSaWdodChwYWNrYWdlUHJlZml4LCBcIi9cIikgKyBcIi9cIjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIGB1cmxgIGdpdmVuIHRoZSBgYmFzZVVybGA6XG4gICAqIC0gd2hlbiB0aGUgYHVybGAgaXMgbnVsbCwgdGhlIGBiYXNlVXJsYCBpcyByZXR1cm5lZCxcbiAgICogLSBpZiBgdXJsYCBpcyByZWxhdGl2ZSAoJ3BhdGgvdG8vaGVyZScsICcuL3BhdGgvdG8vaGVyZScpLCB0aGUgcmVzb2x2ZWQgdXJsIGlzIGEgY29tYmluYXRpb24gb2ZcbiAgICogYGJhc2VVcmxgIGFuZCBgdXJsYCxcbiAgICogLSBpZiBgdXJsYCBpcyBhYnNvbHV0ZSAoaXQgaGFzIGEgc2NoZW1lOiAnaHR0cDovLycsICdodHRwczovLycgb3Igc3RhcnQgd2l0aCAnLycpLCB0aGUgYHVybGAgaXNcbiAgICogcmV0dXJuZWQgYXMgaXMgKGlnbm9yaW5nIHRoZSBgYmFzZVVybGApXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVXJsXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB1cmxcbiAgICogQHJldHVybnMge3N0cmluZ30gdGhlIHJlc29sdmVkIFVSTFxuICAgKi9cbiAgcmVzb2x2ZShiYXNlVXJsOiBzdHJpbmcsIHVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzb2x2ZWRVcmwgPSB1cmw7XG4gICAgaWYgKGlzUHJlc2VudChiYXNlVXJsKSAmJiBiYXNlVXJsLmxlbmd0aCA+IDApIHtcbiAgICAgIHJlc29sdmVkVXJsID0gX3Jlc29sdmVVcmwoYmFzZVVybCwgcmVzb2x2ZWRVcmwpO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhY2thZ2VQcmVmaXgpICYmIGdldFVybFNjaGVtZShyZXNvbHZlZFVybCkgPT0gXCJwYWNrYWdlXCIpIHtcbiAgICAgIHJlc29sdmVkVXJsID0gcmVzb2x2ZWRVcmwucmVwbGFjZShcInBhY2thZ2U6XCIsIHRoaXMuX3BhY2thZ2VQcmVmaXgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzb2x2ZWRVcmw7XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBzY2hlbWUgb2YgYSBVUkwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVcmxTY2hlbWUodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICB2YXIgbWF0Y2ggPSBfc3BsaXQodXJsKTtcbiAgcmV0dXJuIChtYXRjaCAmJiBtYXRjaFtfQ29tcG9uZW50SW5kZXguU2NoZW1lXSkgfHwgXCJcIjtcbn1cblxuLy8gVGhlIGNvZGUgYmVsb3cgaXMgYWRhcHRlZCBmcm9tIFRyYWNldXI6XG4vLyBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3RyYWNldXItY29tcGlsZXIvYmxvYi85NTExYzFkYWZhOTcyYmYwZGUxMjAyYThhODYzYmFkMDJmMGY5NWE4L3NyYy9ydW50aW1lL3VybC5qc1xuXG4vKipcbiAqIEJ1aWxkcyBhIFVSSSBzdHJpbmcgZnJvbSBhbHJlYWR5LWVuY29kZWQgcGFydHMuXG4gKlxuICogTm8gZW5jb2RpbmcgaXMgcGVyZm9ybWVkLiAgQW55IGNvbXBvbmVudCBtYXkgYmUgb21pdHRlZCBhcyBlaXRoZXIgbnVsbCBvclxuICogdW5kZWZpbmVkLlxuICpcbiAqIEBwYXJhbSB7P3N0cmluZz19IG9wdF9zY2hlbWUgVGhlIHNjaGVtZSBzdWNoIGFzICdodHRwJy5cbiAqIEBwYXJhbSB7P3N0cmluZz19IG9wdF91c2VySW5mbyBUaGUgdXNlciBuYW1lIGJlZm9yZSB0aGUgJ0AnLlxuICogQHBhcmFtIHs/c3RyaW5nPX0gb3B0X2RvbWFpbiBUaGUgZG9tYWluIHN1Y2ggYXMgJ3d3dy5nb29nbGUuY29tJywgYWxyZWFkeVxuICogICAgIFVSSS1lbmNvZGVkLlxuICogQHBhcmFtIHsoc3RyaW5nfG51bGwpPX0gb3B0X3BvcnQgVGhlIHBvcnQgbnVtYmVyLlxuICogQHBhcmFtIHs/c3RyaW5nPX0gb3B0X3BhdGggVGhlIHBhdGgsIGFscmVhZHkgVVJJLWVuY29kZWQuICBJZiBpdCBpcyBub3RcbiAqICAgICBlbXB0eSwgaXQgbXVzdCBiZWdpbiB3aXRoIGEgc2xhc2guXG4gKiBAcGFyYW0gez9zdHJpbmc9fSBvcHRfcXVlcnlEYXRhIFRoZSBVUkktZW5jb2RlZCBxdWVyeSBkYXRhLlxuICogQHBhcmFtIHs/c3RyaW5nPX0gb3B0X2ZyYWdtZW50IFRoZSBVUkktZW5jb2RlZCBmcmFnbWVudCBpZGVudGlmaWVyLlxuICogQHJldHVybiB7c3RyaW5nfSBUaGUgZnVsbHkgY29tYmluZWQgVVJJLlxuICovXG5mdW5jdGlvbiBfYnVpbGRGcm9tRW5jb2RlZFBhcnRzKG9wdF9zY2hlbWU/OiBzdHJpbmcsIG9wdF91c2VySW5mbz86IHN0cmluZywgb3B0X2RvbWFpbj86IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0X3BvcnQ/OiBzdHJpbmcsIG9wdF9wYXRoPzogc3RyaW5nLCBvcHRfcXVlcnlEYXRhPzogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRfZnJhZ21lbnQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICB2YXIgb3V0ID0gW107XG5cbiAgaWYgKGlzUHJlc2VudChvcHRfc2NoZW1lKSkge1xuICAgIG91dC5wdXNoKG9wdF9zY2hlbWUgKyAnOicpO1xuICB9XG5cbiAgaWYgKGlzUHJlc2VudChvcHRfZG9tYWluKSkge1xuICAgIG91dC5wdXNoKCcvLycpO1xuXG4gICAgaWYgKGlzUHJlc2VudChvcHRfdXNlckluZm8pKSB7XG4gICAgICBvdXQucHVzaChvcHRfdXNlckluZm8gKyAnQCcpO1xuICAgIH1cblxuICAgIG91dC5wdXNoKG9wdF9kb21haW4pO1xuXG4gICAgaWYgKGlzUHJlc2VudChvcHRfcG9ydCkpIHtcbiAgICAgIG91dC5wdXNoKCc6JyArIG9wdF9wb3J0KTtcbiAgICB9XG4gIH1cblxuICBpZiAoaXNQcmVzZW50KG9wdF9wYXRoKSkge1xuICAgIG91dC5wdXNoKG9wdF9wYXRoKTtcbiAgfVxuXG4gIGlmIChpc1ByZXNlbnQob3B0X3F1ZXJ5RGF0YSkpIHtcbiAgICBvdXQucHVzaCgnPycgKyBvcHRfcXVlcnlEYXRhKTtcbiAgfVxuXG4gIGlmIChpc1ByZXNlbnQob3B0X2ZyYWdtZW50KSkge1xuICAgIG91dC5wdXNoKCcjJyArIG9wdF9mcmFnbWVudCk7XG4gIH1cblxuICByZXR1cm4gb3V0LmpvaW4oJycpO1xufVxuXG4vKipcbiAqIEEgcmVndWxhciBleHByZXNzaW9uIGZvciBicmVha2luZyBhIFVSSSBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuXG4gKlxuICoge0BsaW5rIGh0dHA6Ly93d3cuZ2Jpdi5jb20vcHJvdG9jb2xzL3VyaS9yZmMvcmZjMzk4Ni5odG1sI1JGQzIyMzR9IHNheXNcbiAqIEFzIHRoZSBcImZpcnN0LW1hdGNoLXdpbnNcIiBhbGdvcml0aG0gaXMgaWRlbnRpY2FsIHRvIHRoZSBcImdyZWVkeVwiXG4gKiBkaXNhbWJpZ3VhdGlvbiBtZXRob2QgdXNlZCBieSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb25zLCBpdCBpcyBuYXR1cmFsIGFuZFxuICogY29tbW9ucGxhY2UgdG8gdXNlIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBwYXJzaW5nIHRoZSBwb3RlbnRpYWwgZml2ZVxuICogY29tcG9uZW50cyBvZiBhIFVSSSByZWZlcmVuY2UuXG4gKlxuICogVGhlIGZvbGxvd2luZyBsaW5lIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZm9yIGJyZWFraW5nLWRvd24gYVxuICogd2VsbC1mb3JtZWQgVVJJIHJlZmVyZW5jZSBpbnRvIGl0cyBjb21wb25lbnRzLlxuICpcbiAqIDxwcmU+XG4gKiBeKChbXjovPyNdKyk6KT8oLy8oW14vPyNdKikpPyhbXj8jXSopKFxcPyhbXiNdKikpPygjKC4qKSk/XG4gKiAgMTIgICAgICAgICAgICAzICA0ICAgICAgICAgIDUgICAgICAgNiAgNyAgICAgICAgOCA5XG4gKiA8L3ByZT5cbiAqXG4gKiBUaGUgbnVtYmVycyBpbiB0aGUgc2Vjb25kIGxpbmUgYWJvdmUgYXJlIG9ubHkgdG8gYXNzaXN0IHJlYWRhYmlsaXR5OyB0aGV5XG4gKiBpbmRpY2F0ZSB0aGUgcmVmZXJlbmNlIHBvaW50cyBmb3IgZWFjaCBzdWJleHByZXNzaW9uIChpLmUuLCBlYWNoIHBhaXJlZFxuICogcGFyZW50aGVzaXMpLiBXZSByZWZlciB0byB0aGUgdmFsdWUgbWF0Y2hlZCBmb3Igc3ViZXhwcmVzc2lvbiA8bj4gYXMgJDxuPi5cbiAqIEZvciBleGFtcGxlLCBtYXRjaGluZyB0aGUgYWJvdmUgZXhwcmVzc2lvbiB0b1xuICogPHByZT5cbiAqICAgICBodHRwOi8vd3d3Lmljcy51Y2kuZWR1L3B1Yi9pZXRmL3VyaS8jUmVsYXRlZFxuICogPC9wcmU+XG4gKiByZXN1bHRzIGluIHRoZSBmb2xsb3dpbmcgc3ViZXhwcmVzc2lvbiBtYXRjaGVzOlxuICogPHByZT5cbiAqICAgICQxID0gaHR0cDpcbiAqICAgICQyID0gaHR0cFxuICogICAgJDMgPSAvL3d3dy5pY3MudWNpLmVkdVxuICogICAgJDQgPSB3d3cuaWNzLnVjaS5lZHVcbiAqICAgICQ1ID0gL3B1Yi9pZXRmL3VyaS9cbiAqICAgICQ2ID0gPHVuZGVmaW5lZD5cbiAqICAgICQ3ID0gPHVuZGVmaW5lZD5cbiAqICAgICQ4ID0gI1JlbGF0ZWRcbiAqICAgICQ5ID0gUmVsYXRlZFxuICogPC9wcmU+XG4gKiB3aGVyZSA8dW5kZWZpbmVkPiBpbmRpY2F0ZXMgdGhhdCB0aGUgY29tcG9uZW50IGlzIG5vdCBwcmVzZW50LCBhcyBpcyB0aGVcbiAqIGNhc2UgZm9yIHRoZSBxdWVyeSBjb21wb25lbnQgaW4gdGhlIGFib3ZlIGV4YW1wbGUuIFRoZXJlZm9yZSwgd2UgY2FuXG4gKiBkZXRlcm1pbmUgdGhlIHZhbHVlIG9mIHRoZSBmaXZlIGNvbXBvbmVudHMgYXNcbiAqIDxwcmU+XG4gKiAgICBzY2hlbWUgICAgPSAkMlxuICogICAgYXV0aG9yaXR5ID0gJDRcbiAqICAgIHBhdGggICAgICA9ICQ1XG4gKiAgICBxdWVyeSAgICAgPSAkN1xuICogICAgZnJhZ21lbnQgID0gJDlcbiAqIDwvcHJlPlxuICpcbiAqIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gaGFzIGJlZW4gbW9kaWZpZWQgc2xpZ2h0bHkgdG8gZXhwb3NlIHRoZVxuICogdXNlckluZm8sIGRvbWFpbiwgYW5kIHBvcnQgc2VwYXJhdGVseSBmcm9tIHRoZSBhdXRob3JpdHkuXG4gKiBUaGUgbW9kaWZpZWQgdmVyc2lvbiB5aWVsZHNcbiAqIDxwcmU+XG4gKiAgICAkMSA9IGh0dHAgICAgICAgICAgICAgIHNjaGVtZVxuICogICAgJDIgPSA8dW5kZWZpbmVkPiAgICAgICB1c2VySW5mbyAtXFxcbiAqICAgICQzID0gd3d3Lmljcy51Y2kuZWR1ICAgZG9tYWluICAgICB8IGF1dGhvcml0eVxuICogICAgJDQgPSA8dW5kZWZpbmVkPiAgICAgICBwb3J0ICAgICAtL1xuICogICAgJDUgPSAvcHViL2lldGYvdXJpLyAgICBwYXRoXG4gKiAgICAkNiA9IDx1bmRlZmluZWQ+ICAgICAgIHF1ZXJ5IHdpdGhvdXQgP1xuICogICAgJDcgPSBSZWxhdGVkICAgICAgICAgICBmcmFnbWVudCB3aXRob3V0ICNcbiAqIDwvcHJlPlxuICogQHR5cGUgeyFSZWdFeHB9XG4gKiBAaW50ZXJuYWxcbiAqL1xudmFyIF9zcGxpdFJlID1cbiAgICBSZWdFeHBXcmFwcGVyLmNyZWF0ZSgnXicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICcoPzonICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnKFteOi8/Iy5dKyknICsgIC8vIHNjaGVtZSAtIGlnbm9yZSBzcGVjaWFsIGNoYXJhY3RlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgYnkgb3RoZXIgVVJMIHBhcnRzIHN1Y2ggYXMgOixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID8sIC8sICMsIGFuZCAuXG4gICAgICAgICAgICAgICAgICAgICAgICAgJzopPycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICcoPzovLycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICcoPzooW14vPyNdKilAKT8nICsgICAgICAgICAgICAgICAgICAvLyB1c2VySW5mb1xuICAgICAgICAgICAgICAgICAgICAgICAgICcoW1xcXFx3XFxcXGRcXFxcLVxcXFx1MDEwMC1cXFxcdWZmZmYuJV0qKScgKyAgLy8gZG9tYWluIC0gcmVzdHJpY3QgdG8gbGV0dGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlnaXRzLCBkYXNoZXMsIGRvdHMsIHBlcmNlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXNjYXBlcywgYW5kIHVuaWNvZGUgY2hhcmFjdGVycy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAnKD86OihbMC05XSspKT8nICsgICAgICAgICAgICAgICAgICAgLy8gcG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgICcpPycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICcoW14/I10rKT8nICsgICAgICAgIC8vIHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAnKD86XFxcXD8oW14jXSopKT8nICsgIC8vIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgJyg/OiMoLiopKT8nICsgICAgICAgLy8gZnJhZ21lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAnJCcpO1xuXG4vKipcbiAqIFRoZSBpbmRleCBvZiBlYWNoIFVSSSBjb21wb25lbnQgaW4gdGhlIHJldHVybiB2YWx1ZSBvZiBnb29nLnVyaS51dGlscy5zcGxpdC5cbiAqIEBlbnVtIHtudW1iZXJ9XG4gKi9cbmVudW0gX0NvbXBvbmVudEluZGV4IHtcbiAgU2NoZW1lID0gMSxcbiAgVXNlckluZm8sXG4gIERvbWFpbixcbiAgUG9ydCxcbiAgUGF0aCxcbiAgUXVlcnlEYXRhLFxuICBGcmFnbWVudFxufVxuXG4vKipcbiAqIFNwbGl0cyBhIFVSSSBpbnRvIGl0cyBjb21wb25lbnQgcGFydHMuXG4gKlxuICogRWFjaCBjb21wb25lbnQgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgY29tcG9uZW50IGluZGljZXM7IGZvciBleGFtcGxlOlxuICogPHByZT5cbiAqIGdvb2cudXJpLnV0aWxzLnNwbGl0KHNvbWVTdHIpW2dvb2cudXJpLnV0aWxzLkNvbXBvbnRlbnRJbmRleC5RVUVSWV9EQVRBXTtcbiAqIDwvcHJlPlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmkgVGhlIFVSSSBzdHJpbmcgdG8gZXhhbWluZS5cbiAqIEByZXR1cm4geyFBcnJheS48c3RyaW5nfHVuZGVmaW5lZD59IEVhY2ggY29tcG9uZW50IHN0aWxsIFVSSS1lbmNvZGVkLlxuICogICAgIEVhY2ggY29tcG9uZW50IHRoYXQgaXMgcHJlc2VudCB3aWxsIGNvbnRhaW4gdGhlIGVuY29kZWQgdmFsdWUsIHdoZXJlYXNcbiAqICAgICBjb21wb25lbnRzIHRoYXQgYXJlIG5vdCBwcmVzZW50IHdpbGwgYmUgdW5kZWZpbmVkIG9yIGVtcHR5LCBkZXBlbmRpbmdcbiAqICAgICBvbiB0aGUgYnJvd3NlcidzIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbXBsZW1lbnRhdGlvbi4gIE5ldmVyIG51bGwsIHNpbmNlXG4gKiAgICAgYXJiaXRyYXJ5IHN0cmluZ3MgbWF5IHN0aWxsIGxvb2sgbGlrZSBwYXRoIG5hbWVzLlxuICovXG5mdW5jdGlvbiBfc3BsaXQodXJpOiBzdHJpbmcpOiBBcnJheTxzdHJpbmcgfCBhbnk+IHtcbiAgcmV0dXJuIFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChfc3BsaXRSZSwgdXJpKTtcbn1cblxuLyoqXG4gICogUmVtb3ZlcyBkb3Qgc2VnbWVudHMgaW4gZ2l2ZW4gcGF0aCBjb21wb25lbnQsIGFzIGRlc2NyaWJlZCBpblxuICAqIFJGQyAzOTg2LCBzZWN0aW9uIDUuMi40LlxuICAqXG4gICogQHBhcmFtIHtzdHJpbmd9IHBhdGggQSBub24tZW1wdHkgcGF0aCBjb21wb25lbnQuXG4gICogQHJldHVybiB7c3RyaW5nfSBQYXRoIGNvbXBvbmVudCB3aXRoIHJlbW92ZWQgZG90IHNlZ21lbnRzLlxuICAqL1xuZnVuY3Rpb24gX3JlbW92ZURvdFNlZ21lbnRzKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChwYXRoID09ICcvJykgcmV0dXJuICcvJztcblxuICB2YXIgbGVhZGluZ1NsYXNoID0gcGF0aFswXSA9PSAnLycgPyAnLycgOiAnJztcbiAgdmFyIHRyYWlsaW5nU2xhc2ggPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV0gPT09ICcvJyA/ICcvJyA6ICcnO1xuICB2YXIgc2VnbWVudHMgPSBwYXRoLnNwbGl0KCcvJyk7XG5cbiAgdmFyIG91dDogc3RyaW5nW10gPSBbXTtcbiAgdmFyIHVwID0gMDtcbiAgZm9yICh2YXIgcG9zID0gMDsgcG9zIDwgc2VnbWVudHMubGVuZ3RoOyBwb3MrKykge1xuICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbcG9zXTtcbiAgICBzd2l0Y2ggKHNlZ21lbnQpIHtcbiAgICAgIGNhc2UgJyc6XG4gICAgICBjYXNlICcuJzpcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICcuLic6XG4gICAgICAgIGlmIChvdXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgIG91dC5wb3AoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB1cCsrO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgb3V0LnB1c2goc2VnbWVudCk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGxlYWRpbmdTbGFzaCA9PSAnJykge1xuICAgIHdoaWxlICh1cC0tID4gMCkge1xuICAgICAgb3V0LnVuc2hpZnQoJy4uJyk7XG4gICAgfVxuXG4gICAgaWYgKG91dC5sZW5ndGggPT09IDApIG91dC5wdXNoKCcuJyk7XG4gIH1cblxuICByZXR1cm4gbGVhZGluZ1NsYXNoICsgb3V0LmpvaW4oJy8nKSArIHRyYWlsaW5nU2xhc2g7XG59XG5cbi8qKlxuICogVGFrZXMgYW4gYXJyYXkgb2YgdGhlIHBhcnRzIGZyb20gc3BsaXQgYW5kIGNhbm9uaWNhbGl6ZXMgdGhlIHBhdGggcGFydFxuICogYW5kIHRoZW4gam9pbnMgYWxsIHRoZSBwYXJ0cy5cbiAqIEBwYXJhbSB7QXJyYXkuPHN0cmluZz8+fSBwYXJ0c1xuICogQHJldHVybiB7c3RyaW5nfVxuICovXG5mdW5jdGlvbiBfam9pbkFuZENhbm9uaWNhbGl6ZVBhdGgocGFydHM6IGFueVtdKTogc3RyaW5nIHtcbiAgdmFyIHBhdGggPSBwYXJ0c1tfQ29tcG9uZW50SW5kZXguUGF0aF07XG4gIHBhdGggPSBpc0JsYW5rKHBhdGgpID8gJycgOiBfcmVtb3ZlRG90U2VnbWVudHMocGF0aCk7XG4gIHBhcnRzW19Db21wb25lbnRJbmRleC5QYXRoXSA9IHBhdGg7XG5cbiAgcmV0dXJuIF9idWlsZEZyb21FbmNvZGVkUGFydHMocGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV0sIHBhcnRzW19Db21wb25lbnRJbmRleC5Vc2VySW5mb10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzW19Db21wb25lbnRJbmRleC5Eb21haW5dLCBwYXJ0c1tfQ29tcG9uZW50SW5kZXguUG9ydF0sIHBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnRzW19Db21wb25lbnRJbmRleC5RdWVyeURhdGFdLCBwYXJ0c1tfQ29tcG9uZW50SW5kZXguRnJhZ21lbnRdKTtcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyBhIFVSTC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIFRoZSBVUkwgYWN0aW5nIGFzIHRoZSBiYXNlIFVSTC5cbiAqIEBwYXJhbSB7c3RyaW5nfSB0byBUaGUgVVJMIHRvIHJlc29sdmUuXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKi9cbmZ1bmN0aW9uIF9yZXNvbHZlVXJsKGJhc2U6IHN0cmluZywgdXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICB2YXIgcGFydHMgPSBfc3BsaXQoZW5jb2RlVVJJKHVybCkpO1xuICB2YXIgYmFzZVBhcnRzID0gX3NwbGl0KGJhc2UpO1xuXG4gIGlmIChpc1ByZXNlbnQocGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV0pKSB7XG4gICAgcmV0dXJuIF9qb2luQW5kQ2Fub25pY2FsaXplUGF0aChwYXJ0cyk7XG4gIH0gZWxzZSB7XG4gICAgcGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV0gPSBiYXNlUGFydHNbX0NvbXBvbmVudEluZGV4LlNjaGVtZV07XG4gIH1cblxuICBmb3IgKHZhciBpID0gX0NvbXBvbmVudEluZGV4LlNjaGVtZTsgaSA8PSBfQ29tcG9uZW50SW5kZXguUG9ydDsgaSsrKSB7XG4gICAgaWYgKGlzQmxhbmsocGFydHNbaV0pKSB7XG4gICAgICBwYXJ0c1tpXSA9IGJhc2VQYXJ0c1tpXTtcbiAgICB9XG4gIH1cblxuICBpZiAocGFydHNbX0NvbXBvbmVudEluZGV4LlBhdGhdWzBdID09ICcvJykge1xuICAgIHJldHVybiBfam9pbkFuZENhbm9uaWNhbGl6ZVBhdGgocGFydHMpO1xuICB9XG5cbiAgdmFyIHBhdGggPSBiYXNlUGFydHNbX0NvbXBvbmVudEluZGV4LlBhdGhdO1xuICBpZiAoaXNCbGFuayhwYXRoKSkgcGF0aCA9ICcvJztcbiAgdmFyIGluZGV4ID0gcGF0aC5sYXN0SW5kZXhPZignLycpO1xuICBwYXRoID0gcGF0aC5zdWJzdHJpbmcoMCwgaW5kZXggKyAxKSArIHBhcnRzW19Db21wb25lbnRJbmRleC5QYXRoXTtcbiAgcGFydHNbX0NvbXBvbmVudEluZGV4LlBhdGhdID0gcGF0aDtcbiAgcmV0dXJuIF9qb2luQW5kQ2Fub25pY2FsaXplUGF0aChwYXJ0cyk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIvdXJsX3Jlc29sdmVyLnRzXG4gKiovIiwiaW1wb3J0IHtQcm9taXNlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcblxuLy8gVE9ETzogdnNhdmtpbiByZW5hbWUgaXQgaW50byBUZW1wbGF0ZUxvYWRlclxuLyoqXG4gKiBBbiBpbnRlcmZhY2UgZm9yIHJldHJpZXZpbmcgZG9jdW1lbnRzIGJ5IFVSTCB0aGF0IHRoZSBjb21waWxlciB1c2VzXG4gKiB0byBsb2FkIHRlbXBsYXRlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFhIUiB7XG4gIGdldCh1cmw6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7IHJldHVybiBudWxsOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyLnRzXG4gKiovIiwiaW1wb3J0IHtSdW50aW1lQ29tcGlsZXJffSBmcm9tIFwiLi9ydW50aW1lX2NvbXBpbGVyXCI7XG5leHBvcnQge1RlbXBsYXRlQ29tcGlsZXJ9IGZyb20gJy4vdGVtcGxhdGVfY29tcGlsZXInO1xuZXhwb3J0IHtcbiAgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLFxuICBDb21waWxlVHlwZU1ldGFkYXRhLFxuICBDb21waWxlVGVtcGxhdGVNZXRhZGF0YVxufSBmcm9tICcuL2RpcmVjdGl2ZV9tZXRhZGF0YSc7XG5leHBvcnQge1NvdXJjZU1vZHVsZSwgU291cmNlV2l0aEltcG9ydHN9IGZyb20gJy4vc291cmNlX21vZHVsZSc7XG5leHBvcnQge1BMQVRGT1JNX0RJUkVDVElWRVMsIFBMQVRGT1JNX1BJUEVTfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9wbGF0Zm9ybV9kaXJlY3RpdmVzX2FuZF9waXBlcyc7XG5leHBvcnQgKiBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfYXN0JztcbmV4cG9ydCB7VEVNUExBVEVfVFJBTlNGT1JNU30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX3BhcnNlcic7XG5pbXBvcnQge2Fzc2VydGlvbnNFbmFibGVkLCBUeXBlLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtwcm92aWRlLCBQcm92aWRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtUZW1wbGF0ZVBhcnNlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX3BhcnNlcic7XG5pbXBvcnQge0h0bWxQYXJzZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci9odG1sX3BhcnNlcic7XG5pbXBvcnQge1RlbXBsYXRlTm9ybWFsaXplcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX25vcm1hbGl6ZXInO1xuaW1wb3J0IHtSdW50aW1lTWV0YWRhdGFSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3J1bnRpbWVfbWV0YWRhdGEnO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3Rpb25Db21waWxlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NoYW5nZV9kZXRlY3Rvcl9jb21waWxlcic7XG5pbXBvcnQge1N0eWxlQ29tcGlsZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci9zdHlsZV9jb21waWxlcic7XG5pbXBvcnQge0NvbW1hbmRDb21waWxlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NvbW1hbmRfY29tcGlsZXInO1xuaW1wb3J0IHtUZW1wbGF0ZUNvbXBpbGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIvdGVtcGxhdGVfY29tcGlsZXInO1xuaW1wb3J0IHtDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZ30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7Q29tcGlsZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9jb21waWxlcic7XG5pbXBvcnQge1J1bnRpbWVDb21waWxlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3J1bnRpbWVfY29tcGlsZXInO1xuaW1wb3J0IHtFbGVtZW50U2NoZW1hUmVnaXN0cnl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci9zY2hlbWEvZWxlbWVudF9zY2hlbWFfcmVnaXN0cnknO1xuaW1wb3J0IHtEb21FbGVtZW50U2NoZW1hUmVnaXN0cnl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci9zY2hlbWEvZG9tX2VsZW1lbnRfc2NoZW1hX3JlZ2lzdHJ5JztcbmltcG9ydCB7VXJsUmVzb2x2ZXIsIERFRkFVTFRfUEFDS0FHRV9VUkxfUFJPVklERVJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci91cmxfcmVzb2x2ZXInO1xuaW1wb3J0IHtQYXJzZXIsIExleGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb24nO1xuXG5mdW5jdGlvbiBfY3JlYXRlQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcoKSB7XG4gIHJldHVybiBuZXcgQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcoYXNzZXJ0aW9uc0VuYWJsZWQoKSwgZmFsc2UsIHRydWUpO1xufVxuXG4vKipcbiAqIEEgc2V0IG9mIHByb3ZpZGVycyB0aGF0IHByb3ZpZGUgYFJ1bnRpbWVDb21waWxlcmAgYW5kIGl0cyBkZXBlbmRlbmNpZXMgdG8gdXNlIGZvclxuICogdGVtcGxhdGUgY29tcGlsYXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBDT01QSUxFUl9QUk9WSURFUlM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPiA9IENPTlNUX0VYUFIoW1xuICBMZXhlcixcbiAgUGFyc2VyLFxuICBIdG1sUGFyc2VyLFxuICBUZW1wbGF0ZVBhcnNlcixcbiAgVGVtcGxhdGVOb3JtYWxpemVyLFxuICBSdW50aW1lTWV0YWRhdGFSZXNvbHZlcixcbiAgREVGQVVMVF9QQUNLQUdFX1VSTF9QUk9WSURFUixcbiAgU3R5bGVDb21waWxlcixcbiAgQ29tbWFuZENvbXBpbGVyLFxuICBDaGFuZ2VEZXRlY3Rpb25Db21waWxlcixcbiAgbmV3IFByb3ZpZGVyKENoYW5nZURldGVjdG9yR2VuQ29uZmlnLCB7dXNlRmFjdG9yeTogX2NyZWF0ZUNoYW5nZURldGVjdG9yR2VuQ29uZmlnLCBkZXBzOiBbXX0pLFxuICBUZW1wbGF0ZUNvbXBpbGVyLFxuICBuZXcgUHJvdmlkZXIoUnVudGltZUNvbXBpbGVyLCB7dXNlQ2xhc3M6IFJ1bnRpbWVDb21waWxlcl99KSxcbiAgbmV3IFByb3ZpZGVyKENvbXBpbGVyLCB7dXNlRXhpc3Rpbmc6IFJ1bnRpbWVDb21waWxlcn0pLFxuICBEb21FbGVtZW50U2NoZW1hUmVnaXN0cnksXG4gIG5ldyBQcm92aWRlcihFbGVtZW50U2NoZW1hUmVnaXN0cnksIHt1c2VFeGlzdGluZzogRG9tRWxlbWVudFNjaGVtYVJlZ2lzdHJ5fSksXG4gIFVybFJlc29sdmVyXG5dKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9jb21waWxlci50c1xuICoqLyIsImltcG9ydCB7Q29tcGlsZXIsIENvbXBpbGVyXywgaW50ZXJuYWxDcmVhdGVQcm90b1ZpZXd9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9jb21waWxlcic7XG5pbXBvcnQge1Byb3RvVmlld1JlZn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcmVmJztcbmltcG9ydCB7UHJvdG9WaWV3RmFjdG9yeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3Byb3RvX3ZpZXdfZmFjdG9yeSc7XG5pbXBvcnQge1RlbXBsYXRlQ29tcGlsZXJ9IGZyb20gJy4vdGVtcGxhdGVfY29tcGlsZXInO1xuXG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7UHJvbWlzZSwgUHJvbWlzZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUnVudGltZUNvbXBpbGVyIGV4dGVuZHMgQ29tcGlsZXIge31cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVDb21waWxlcl8gZXh0ZW5kcyBDb21waWxlcl8gaW1wbGVtZW50cyBSdW50aW1lQ29tcGlsZXIge1xuICBjb25zdHJ1Y3RvcihfcHJvdG9WaWV3RmFjdG9yeTogUHJvdG9WaWV3RmFjdG9yeSwgcHJpdmF0ZSBfdGVtcGxhdGVDb21waWxlcjogVGVtcGxhdGVDb21waWxlcikge1xuICAgIHN1cGVyKF9wcm90b1ZpZXdGYWN0b3J5KTtcbiAgfVxuXG4gIGNvbXBpbGVJbkhvc3QoY29tcG9uZW50VHlwZTogVHlwZSk6IFByb21pc2U8UHJvdG9WaWV3UmVmPiB7XG4gICAgcmV0dXJuIHRoaXMuX3RlbXBsYXRlQ29tcGlsZXIuY29tcGlsZUhvc3RDb21wb25lbnRSdW50aW1lKGNvbXBvbmVudFR5cGUpXG4gICAgICAgIC50aGVuKGNvbXBpbGVkSG9zdFRlbXBsYXRlID0+IGludGVybmFsQ3JlYXRlUHJvdG9WaWV3KHRoaXMsIGNvbXBpbGVkSG9zdFRlbXBsYXRlKSk7XG4gIH1cblxuICBjbGVhckNhY2hlKCkge1xuICAgIHN1cGVyLmNsZWFyQ2FjaGUoKTtcbiAgICB0aGlzLl90ZW1wbGF0ZUNvbXBpbGVyLmNsZWFyQ2FjaGUoKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3J1bnRpbWVfY29tcGlsZXIudHNcbiAqKi8iLCJpbXBvcnQge0lTX0RBUlQsIFR5cGUsIEpzb24sIGlzQmxhbmssIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7TGlzdFdyYXBwZXIsIFNldFdyYXBwZXIsIE1hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1Byb21pc2VXcmFwcGVyLCBQcm9taXNlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7XG4gIENvbXBpbGVkQ29tcG9uZW50VGVtcGxhdGUsXG4gIFRlbXBsYXRlQ21kLFxuICBDb21waWxlZEhvc3RUZW1wbGF0ZSxcbiAgQmVnaW5Db21wb25lbnRDbWRcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3RlbXBsYXRlX2NvbW1hbmRzJztcbmltcG9ydCB7XG4gIGNyZWF0ZUhvc3RDb21wb25lbnRNZXRhLFxuICBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gIENvbXBpbGVUeXBlTWV0YWRhdGEsXG4gIENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhXG59IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7VGVtcGxhdGVBc3R9IGZyb20gJy4vdGVtcGxhdGVfYXN0JztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtTb3VyY2VNb2R1bGUsIG1vZHVsZVJlZn0gZnJvbSAnLi9zb3VyY2VfbW9kdWxlJztcbmltcG9ydCB7Q2hhbmdlRGV0ZWN0aW9uQ29tcGlsZXJ9IGZyb20gJy4vY2hhbmdlX2RldGVjdG9yX2NvbXBpbGVyJztcbmltcG9ydCB7U3R5bGVDb21waWxlcn0gZnJvbSAnLi9zdHlsZV9jb21waWxlcic7XG5pbXBvcnQge0NvbW1hbmRDb21waWxlcn0gZnJvbSAnLi9jb21tYW5kX2NvbXBpbGVyJztcbmltcG9ydCB7VGVtcGxhdGVQYXJzZXJ9IGZyb20gJy4vdGVtcGxhdGVfcGFyc2VyJztcbmltcG9ydCB7VGVtcGxhdGVOb3JtYWxpemVyfSBmcm9tICcuL3RlbXBsYXRlX25vcm1hbGl6ZXInO1xuaW1wb3J0IHtSdW50aW1lTWV0YWRhdGFSZXNvbHZlcn0gZnJvbSAnLi9ydW50aW1lX21ldGFkYXRhJztcblxuaW1wb3J0IHtURU1QTEFURV9DT01NQU5EU19NT0RVTEVfUkVGfSBmcm9tICcuL2NvbW1hbmRfY29tcGlsZXInO1xuaW1wb3J0IHtcbiAgY29kZUdlbkV4cG9ydFZhcmlhYmxlLFxuICBlc2NhcGVTaW5nbGVRdW90ZVN0cmluZyxcbiAgY29kZUdlblZhbHVlRm4sXG4gIE1PRFVMRV9TVUZGSVhcbn0gZnJvbSAnLi91dGlsJztcblxuLyoqXG4gKiBBbiBpbnRlcm5hbCBtb2R1bGUgb2YgdGhlIEFuZ3VsYXIgY29tcGlsZXIgdGhhdCBiZWdpbnMgd2l0aCBjb21wb25lbnQgdHlwZXMsXG4gKiBleHRyYWN0cyB0ZW1wbGF0ZXMsIGFuZCBldmVudHVhbGx5IHByb2R1Y2VzIGEgY29tcGlsZWQgdmVyc2lvbiBvZiB0aGUgY29tcG9uZW50XG4gKiByZWFkeSBmb3IgbGlua2luZyBpbnRvIGFuIGFwcGxpY2F0aW9uLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVDb21waWxlciB7XG4gIHByaXZhdGUgX2hvc3RDYWNoZUtleXMgPSBuZXcgTWFwPFR5cGUsIGFueT4oKTtcbiAgcHJpdmF0ZSBfY29tcGlsZWRUZW1wbGF0ZUNhY2hlID0gbmV3IE1hcDxhbnksIENvbXBpbGVkQ29tcG9uZW50VGVtcGxhdGU+KCk7XG4gIHByaXZhdGUgX2NvbXBpbGVkVGVtcGxhdGVEb25lID0gbmV3IE1hcDxhbnksIFByb21pc2U8Q29tcGlsZWRDb21wb25lbnRUZW1wbGF0ZT4+KCk7XG4gIHByaXZhdGUgX25leHRUZW1wbGF0ZUlkOiBudW1iZXIgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3J1bnRpbWVNZXRhZGF0YVJlc29sdmVyOiBSdW50aW1lTWV0YWRhdGFSZXNvbHZlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdGVtcGxhdGVOb3JtYWxpemVyOiBUZW1wbGF0ZU5vcm1hbGl6ZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RlbXBsYXRlUGFyc2VyOiBUZW1wbGF0ZVBhcnNlciwgcHJpdmF0ZSBfc3R5bGVDb21waWxlcjogU3R5bGVDb21waWxlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfY29tbWFuZENvbXBpbGVyOiBDb21tYW5kQ29tcGlsZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2NkQ29tcGlsZXI6IENoYW5nZURldGVjdGlvbkNvbXBpbGVyKSB7fVxuXG4gIG5vcm1hbGl6ZURpcmVjdGl2ZU1ldGFkYXRhKGRpcmVjdGl2ZTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhKTpcbiAgICAgIFByb21pc2U8Q29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhPiB7XG4gICAgaWYgKCFkaXJlY3RpdmUuaXNDb21wb25lbnQpIHtcbiAgICAgIC8vIEZvciBub24gY29tcG9uZW50cyB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIG5vcm1hbGl6ZWQgeWV0LlxuICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLnJlc29sdmUoZGlyZWN0aXZlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fdGVtcGxhdGVOb3JtYWxpemVyLm5vcm1hbGl6ZVRlbXBsYXRlKGRpcmVjdGl2ZS50eXBlLCBkaXJlY3RpdmUudGVtcGxhdGUpXG4gICAgICAgIC50aGVuKChub3JtYWxpemVkVGVtcGxhdGU6IENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhKSA9PiBuZXcgQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhKHtcbiAgICAgICAgICAgICAgICB0eXBlOiBkaXJlY3RpdmUudHlwZSxcbiAgICAgICAgICAgICAgICBpc0NvbXBvbmVudDogZGlyZWN0aXZlLmlzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgIGR5bmFtaWNMb2FkYWJsZTogZGlyZWN0aXZlLmR5bmFtaWNMb2FkYWJsZSxcbiAgICAgICAgICAgICAgICBzZWxlY3RvcjogZGlyZWN0aXZlLnNlbGVjdG9yLFxuICAgICAgICAgICAgICAgIGV4cG9ydEFzOiBkaXJlY3RpdmUuZXhwb3J0QXMsXG4gICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBkaXJlY3RpdmUuY2hhbmdlRGV0ZWN0aW9uLFxuICAgICAgICAgICAgICAgIGlucHV0czogZGlyZWN0aXZlLmlucHV0cyxcbiAgICAgICAgICAgICAgICBvdXRwdXRzOiBkaXJlY3RpdmUub3V0cHV0cyxcbiAgICAgICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBkaXJlY3RpdmUuaG9zdExpc3RlbmVycyxcbiAgICAgICAgICAgICAgICBob3N0UHJvcGVydGllczogZGlyZWN0aXZlLmhvc3RQcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgIGhvc3RBdHRyaWJ1dGVzOiBkaXJlY3RpdmUuaG9zdEF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgbGlmZWN5Y2xlSG9va3M6IGRpcmVjdGl2ZS5saWZlY3ljbGVIb29rcyxcbiAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogbm9ybWFsaXplZFRlbXBsYXRlXG4gICAgICAgICAgICAgIH0pKTtcbiAgfVxuXG4gIGNvbXBpbGVIb3N0Q29tcG9uZW50UnVudGltZSh0eXBlOiBUeXBlKTogUHJvbWlzZTxDb21waWxlZEhvc3RUZW1wbGF0ZT4ge1xuICAgIHZhciBob3N0Q2FjaGVLZXkgPSB0aGlzLl9ob3N0Q2FjaGVLZXlzLmdldCh0eXBlKTtcbiAgICBpZiAoaXNCbGFuayhob3N0Q2FjaGVLZXkpKSB7XG4gICAgICBob3N0Q2FjaGVLZXkgPSBuZXcgT2JqZWN0KCk7XG4gICAgICB0aGlzLl9ob3N0Q2FjaGVLZXlzLnNldCh0eXBlLCBob3N0Q2FjaGVLZXkpO1xuICAgICAgdmFyIGNvbXBNZXRhOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEgPSB0aGlzLl9ydW50aW1lTWV0YWRhdGFSZXNvbHZlci5nZXRNZXRhZGF0YSh0eXBlKTtcbiAgICAgIGFzc2VydENvbXBvbmVudChjb21wTWV0YSk7XG4gICAgICB2YXIgaG9zdE1ldGE6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSA9XG4gICAgICAgICAgY3JlYXRlSG9zdENvbXBvbmVudE1ldGEoY29tcE1ldGEudHlwZSwgY29tcE1ldGEuc2VsZWN0b3IpO1xuXG4gICAgICB0aGlzLl9jb21waWxlQ29tcG9uZW50UnVudGltZShob3N0Q2FjaGVLZXksIGhvc3RNZXRhLCBbY29tcE1ldGFdLCBuZXcgU2V0KCkpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY29tcGlsZWRUZW1wbGF0ZURvbmUuZ2V0KGhvc3RDYWNoZUtleSlcbiAgICAgICAgLnRoZW4oY29tcGlsZWRUZW1wbGF0ZSA9PiBuZXcgQ29tcGlsZWRIb3N0VGVtcGxhdGUoY29tcGlsZWRUZW1wbGF0ZSkpO1xuICB9XG5cbiAgY2xlYXJDYWNoZSgpIHtcbiAgICB0aGlzLl9ob3N0Q2FjaGVLZXlzLmNsZWFyKCk7XG4gICAgdGhpcy5fc3R5bGVDb21waWxlci5jbGVhckNhY2hlKCk7XG4gICAgdGhpcy5fY29tcGlsZWRUZW1wbGF0ZUNhY2hlLmNsZWFyKCk7XG4gICAgdGhpcy5fY29tcGlsZWRUZW1wbGF0ZURvbmUuY2xlYXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBpbGVDb21wb25lbnRSdW50aW1lKFxuICAgICAgY2FjaGVLZXk6IGFueSwgY29tcE1ldGE6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSwgdmlld0RpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdLFxuICAgICAgY29tcGlsaW5nQ29tcG9uZW50Q2FjaGVLZXlzOiBTZXQ8YW55Pik6IENvbXBpbGVkQ29tcG9uZW50VGVtcGxhdGUge1xuICAgIGxldCB1bmlxVmlld0RpcmVjdGl2ZXMgPSByZW1vdmVEdXBsaWNhdGVzKHZpZXdEaXJlY3RpdmVzKTtcbiAgICB2YXIgY29tcGlsZWRUZW1wbGF0ZSA9IHRoaXMuX2NvbXBpbGVkVGVtcGxhdGVDYWNoZS5nZXQoY2FjaGVLZXkpO1xuICAgIHZhciBkb25lID0gdGhpcy5fY29tcGlsZWRUZW1wbGF0ZURvbmUuZ2V0KGNhY2hlS2V5KTtcbiAgICBpZiAoaXNCbGFuayhjb21waWxlZFRlbXBsYXRlKSkge1xuICAgICAgdmFyIHN0eWxlcyA9IFtdO1xuICAgICAgdmFyIGNoYW5nZURldGVjdG9yRmFjdG9yeTtcbiAgICAgIHZhciBjb21tYW5kcyA9IFtdO1xuICAgICAgdmFyIHRlbXBsYXRlSWQgPSBgJHtzdHJpbmdpZnkoY29tcE1ldGEudHlwZS5ydW50aW1lKX1UZW1wbGF0ZSR7dGhpcy5fbmV4dFRlbXBsYXRlSWQrK31gO1xuICAgICAgY29tcGlsZWRUZW1wbGF0ZSA9IG5ldyBDb21waWxlZENvbXBvbmVudFRlbXBsYXRlKFxuICAgICAgICAgIHRlbXBsYXRlSWQsIChkaXNwYXRjaGVyKSA9PiBjaGFuZ2VEZXRlY3RvckZhY3RvcnkoZGlzcGF0Y2hlciksIGNvbW1hbmRzLCBzdHlsZXMpO1xuICAgICAgdGhpcy5fY29tcGlsZWRUZW1wbGF0ZUNhY2hlLnNldChjYWNoZUtleSwgY29tcGlsZWRUZW1wbGF0ZSk7XG4gICAgICBjb21waWxpbmdDb21wb25lbnRDYWNoZUtleXMuYWRkKGNhY2hlS2V5KTtcbiAgICAgIGRvbmUgPSBQcm9taXNlV3JhcHBlclxuICAgICAgICAgICAgICAgICAuYWxsKFs8YW55PnRoaXMuX3N0eWxlQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudFJ1bnRpbWUoY29tcE1ldGEudGVtcGxhdGUpXS5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgICB1bmlxVmlld0RpcmVjdGl2ZXMubWFwKGRpck1ldGEgPT4gdGhpcy5ub3JtYWxpemVEaXJlY3RpdmVNZXRhZGF0YShkaXJNZXRhKSkpKVxuICAgICAgICAgICAgICAgICAudGhlbigoc3R5bGVzQW5kTm9ybWFsaXplZFZpZXdEaXJNZXRhczogYW55W10pID0+IHtcbiAgICAgICAgICAgICAgICAgICB2YXIgY2hpbGRQcm9taXNlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgIHZhciBub3JtYWxpemVkVmlld0Rpck1ldGFzID0gc3R5bGVzQW5kTm9ybWFsaXplZFZpZXdEaXJNZXRhcy5zbGljZSgxKTtcbiAgICAgICAgICAgICAgICAgICB2YXIgcGFyc2VkVGVtcGxhdGUgPSB0aGlzLl90ZW1wbGF0ZVBhcnNlci5wYXJzZShcbiAgICAgICAgICAgICAgICAgICAgICAgY29tcE1ldGEudGVtcGxhdGUudGVtcGxhdGUsIG5vcm1hbGl6ZWRWaWV3RGlyTWV0YXMsIGNvbXBNZXRhLnR5cGUubmFtZSk7XG5cbiAgICAgICAgICAgICAgICAgICB2YXIgY2hhbmdlRGV0ZWN0b3JGYWN0b3JpZXMgPSB0aGlzLl9jZENvbXBpbGVyLmNvbXBpbGVDb21wb25lbnRSdW50aW1lKFxuICAgICAgICAgICAgICAgICAgICAgICBjb21wTWV0YS50eXBlLCBjb21wTWV0YS5jaGFuZ2VEZXRlY3Rpb24sIHBhcnNlZFRlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RvckZhY3RvcnkgPSBjaGFuZ2VEZXRlY3RvckZhY3Rvcmllc1swXTtcbiAgICAgICAgICAgICAgICAgICB2YXIgdG1wU3R5bGVzOiBzdHJpbmdbXSA9IHN0eWxlc0FuZE5vcm1hbGl6ZWRWaWV3RGlyTWV0YXNbMF07XG4gICAgICAgICAgICAgICAgICAgdG1wU3R5bGVzLmZvckVhY2goc3R5bGUgPT4gc3R5bGVzLnB1c2goc3R5bGUpKTtcbiAgICAgICAgICAgICAgICAgICB2YXIgdG1wQ29tbWFuZHM6IFRlbXBsYXRlQ21kW10gPSB0aGlzLl9jb21waWxlQ29tbWFuZHNSdW50aW1lKFxuICAgICAgICAgICAgICAgICAgICAgICBjb21wTWV0YSwgcGFyc2VkVGVtcGxhdGUsIGNoYW5nZURldGVjdG9yRmFjdG9yaWVzLFxuICAgICAgICAgICAgICAgICAgICAgICBjb21waWxpbmdDb21wb25lbnRDYWNoZUtleXMsIGNoaWxkUHJvbWlzZXMpO1xuICAgICAgICAgICAgICAgICAgIHRtcENvbW1hbmRzLmZvckVhY2goY21kID0+IGNvbW1hbmRzLnB1c2goY21kKSk7XG4gICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLmFsbChjaGlsZFByb21pc2VzKTtcbiAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgLnRoZW4oKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgICBTZXRXcmFwcGVyLmRlbGV0ZShjb21waWxpbmdDb21wb25lbnRDYWNoZUtleXMsIGNhY2hlS2V5KTtcbiAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcGlsZWRUZW1wbGF0ZTtcbiAgICAgICAgICAgICAgICAgfSk7XG4gICAgICB0aGlzLl9jb21waWxlZFRlbXBsYXRlRG9uZS5zZXQoY2FjaGVLZXksIGRvbmUpO1xuICAgIH1cbiAgICByZXR1cm4gY29tcGlsZWRUZW1wbGF0ZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbXBpbGVDb21tYW5kc1J1bnRpbWUoY29tcE1ldGE6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSwgcGFyc2VkVGVtcGxhdGU6IFRlbXBsYXRlQXN0W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0b3JGYWN0b3JpZXM6IEZ1bmN0aW9uW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsaW5nQ29tcG9uZW50Q2FjaGVLZXlzOiBTZXQ8VHlwZT4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRQcm9taXNlczogUHJvbWlzZTxhbnk+W10pOiBUZW1wbGF0ZUNtZFtdIHtcbiAgICB2YXIgY21kczogVGVtcGxhdGVDbWRbXSA9IHRoaXMuX2NvbW1hbmRDb21waWxlci5jb21waWxlQ29tcG9uZW50UnVudGltZShcbiAgICAgICAgY29tcE1ldGEsIHBhcnNlZFRlbXBsYXRlLCBjaGFuZ2VEZXRlY3RvckZhY3RvcmllcyxcbiAgICAgICAgKGNoaWxkQ29tcG9uZW50RGlyOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEpID0+IHtcbiAgICAgICAgICB2YXIgY2hpbGRDYWNoZUtleSA9IGNoaWxkQ29tcG9uZW50RGlyLnR5cGUucnVudGltZTtcbiAgICAgICAgICB2YXIgY2hpbGRWaWV3RGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10gPVxuICAgICAgICAgICAgICB0aGlzLl9ydW50aW1lTWV0YWRhdGFSZXNvbHZlci5nZXRWaWV3RGlyZWN0aXZlc01ldGFkYXRhKFxuICAgICAgICAgICAgICAgICAgY2hpbGRDb21wb25lbnREaXIudHlwZS5ydW50aW1lKTtcbiAgICAgICAgICB2YXIgY2hpbGRJc1JlY3Vyc2l2ZSA9IFNldFdyYXBwZXIuaGFzKGNvbXBpbGluZ0NvbXBvbmVudENhY2hlS2V5cywgY2hpbGRDYWNoZUtleSk7XG4gICAgICAgICAgdmFyIGNoaWxkVGVtcGxhdGUgPSB0aGlzLl9jb21waWxlQ29tcG9uZW50UnVudGltZShcbiAgICAgICAgICAgICAgY2hpbGRDYWNoZUtleSwgY2hpbGRDb21wb25lbnREaXIsIGNoaWxkVmlld0RpcmVjdGl2ZXMsIGNvbXBpbGluZ0NvbXBvbmVudENhY2hlS2V5cyk7XG4gICAgICAgICAgaWYgKCFjaGlsZElzUmVjdXJzaXZlKSB7XG4gICAgICAgICAgICAvLyBPbmx5IHdhaXQgZm9yIGEgY2hpbGQgaWYgaXQgaXMgbm90IGEgY3ljbGVcbiAgICAgICAgICAgIGNoaWxkUHJvbWlzZXMucHVzaCh0aGlzLl9jb21waWxlZFRlbXBsYXRlRG9uZS5nZXQoY2hpbGRDYWNoZUtleSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gKCkgPT4gY2hpbGRUZW1wbGF0ZTtcbiAgICAgICAgfSk7XG4gICAgY21kcy5mb3JFYWNoKGNtZCA9PiB7XG4gICAgICBpZiAoY21kIGluc3RhbmNlb2YgQmVnaW5Db21wb25lbnRDbWQpIHtcbiAgICAgICAgY21kLnRlbXBsYXRlR2V0dGVyKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNtZHM7XG4gIH1cblxuICBjb21waWxlVGVtcGxhdGVzQ29kZUdlbihjb21wb25lbnRzOiBOb3JtYWxpemVkQ29tcG9uZW50V2l0aFZpZXdEaXJlY3RpdmVzW10pOiBTb3VyY2VNb2R1bGUge1xuICAgIGlmIChjb21wb25lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIGNvbXBvbmVudHMgZ2l2ZW4nKTtcbiAgICB9XG4gICAgdmFyIGRlY2xhcmF0aW9ucyA9IFtdO1xuICAgIHZhciB0ZW1wbGF0ZUFyZ3VtZW50cyA9IFtdO1xuICAgIHZhciBjb21wb25lbnRNZXRhczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10gPSBbXTtcbiAgICBjb21wb25lbnRzLmZvckVhY2goY29tcG9uZW50V2l0aERpcnMgPT4ge1xuICAgICAgdmFyIGNvbXBNZXRhID0gPENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YT5jb21wb25lbnRXaXRoRGlycy5jb21wb25lbnQ7XG4gICAgICBhc3NlcnRDb21wb25lbnQoY29tcE1ldGEpO1xuICAgICAgY29tcG9uZW50TWV0YXMucHVzaChjb21wTWV0YSk7XG5cbiAgICAgIHRoaXMuX3Byb2Nlc3NUZW1wbGF0ZUNvZGVHZW4oY29tcE1ldGEsIGNvbXBvbmVudFdpdGhEaXJzLmRpcmVjdGl2ZXMsIGRlY2xhcmF0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVBcmd1bWVudHMpO1xuICAgICAgaWYgKGNvbXBNZXRhLmR5bmFtaWNMb2FkYWJsZSkge1xuICAgICAgICB2YXIgaG9zdE1ldGEgPSBjcmVhdGVIb3N0Q29tcG9uZW50TWV0YShjb21wTWV0YS50eXBlLCBjb21wTWV0YS5zZWxlY3Rvcik7XG4gICAgICAgIGNvbXBvbmVudE1ldGFzLnB1c2goaG9zdE1ldGEpO1xuICAgICAgICB0aGlzLl9wcm9jZXNzVGVtcGxhdGVDb2RlR2VuKGhvc3RNZXRhLCBbY29tcE1ldGFdLCBkZWNsYXJhdGlvbnMsIHRlbXBsYXRlQXJndW1lbnRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBMaXN0V3JhcHBlci5mb3JFYWNoV2l0aEluZGV4KGNvbXBvbmVudE1ldGFzLCAoY29tcE1ldGE6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgdmFyIHRlbXBsYXRlSWQgPSBgJHtjb21wTWV0YS50eXBlLm1vZHVsZVVybH18JHtjb21wTWV0YS50eXBlLm5hbWV9YDtcbiAgICAgIHZhciBjb25zdHJ1Y3Rpb25LZXl3b3JkID0gSVNfREFSVCA/ICdjb25zdCcgOiAnbmV3JztcbiAgICAgIHZhciBjb21waWxlZFRlbXBsYXRlRXhwciA9XG4gICAgICAgICAgYCR7Y29uc3RydWN0aW9uS2V5d29yZH0gJHtURU1QTEFURV9DT01NQU5EU19NT0RVTEVfUkVGfUNvbXBpbGVkQ29tcG9uZW50VGVtcGxhdGUoJyR7dGVtcGxhdGVJZH0nLCR7KDxhbnlbXT50ZW1wbGF0ZUFyZ3VtZW50c1tpbmRleF0pLmpvaW4oJywnKX0pYDtcbiAgICAgIHZhciB2YXJpYWJsZVZhbHVlRXhwcjtcbiAgICAgIGlmIChjb21wTWV0YS50eXBlLmlzSG9zdCkge1xuICAgICAgICB2YXJpYWJsZVZhbHVlRXhwciA9XG4gICAgICAgICAgICBgJHtjb25zdHJ1Y3Rpb25LZXl3b3JkfSAke1RFTVBMQVRFX0NPTU1BTkRTX01PRFVMRV9SRUZ9Q29tcGlsZWRIb3N0VGVtcGxhdGUoJHtjb21waWxlZFRlbXBsYXRlRXhwcn0pYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhcmlhYmxlVmFsdWVFeHByID0gY29tcGlsZWRUZW1wbGF0ZUV4cHI7XG4gICAgICB9XG4gICAgICB2YXIgdmFyTmFtZSA9IHRlbXBsYXRlVmFyaWFibGVOYW1lKGNvbXBNZXRhLnR5cGUpO1xuICAgICAgZGVjbGFyYXRpb25zLnB1c2goYCR7Y29kZUdlbkV4cG9ydFZhcmlhYmxlKHZhck5hbWUpfSR7dmFyaWFibGVWYWx1ZUV4cHJ9O2ApO1xuICAgICAgZGVjbGFyYXRpb25zLnB1c2goYCR7Y29kZUdlblZhbHVlRm4oW10sIHZhck5hbWUsIHRlbXBsYXRlR2V0dGVyTmFtZShjb21wTWV0YS50eXBlKSl9O2ApO1xuICAgIH0pO1xuICAgIHZhciBtb2R1bGVVcmwgPSBjb21wb25lbnRzWzBdLmNvbXBvbmVudC50eXBlLm1vZHVsZVVybDtcbiAgICByZXR1cm4gbmV3IFNvdXJjZU1vZHVsZShgJHt0ZW1wbGF0ZU1vZHVsZVVybChtb2R1bGVVcmwpfWAsIGRlY2xhcmF0aW9ucy5qb2luKCdcXG4nKSk7XG4gIH1cblxuICBjb21waWxlU3R5bGVzaGVldENvZGVHZW4oc3R5bGVzaGVldFVybDogc3RyaW5nLCBjc3NUZXh0OiBzdHJpbmcpOiBTb3VyY2VNb2R1bGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0eWxlQ29tcGlsZXIuY29tcGlsZVN0eWxlc2hlZXRDb2RlR2VuKHN0eWxlc2hlZXRVcmwsIGNzc1RleHQpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcHJvY2Vzc1RlbXBsYXRlQ29kZUdlbihjb21wTWV0YTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldERlY2xhcmF0aW9uczogc3RyaW5nW10sIHRhcmdldFRlbXBsYXRlQXJndW1lbnRzOiBhbnlbXVtdKSB7XG4gICAgbGV0IHVuaXF1ZURpcmVjdGl2ZXMgPSByZW1vdmVEdXBsaWNhdGVzKGRpcmVjdGl2ZXMpO1xuICAgIHZhciBzdHlsZUV4cHIgPSB0aGlzLl9zdHlsZUNvbXBpbGVyLmNvbXBpbGVDb21wb25lbnRDb2RlR2VuKGNvbXBNZXRhLnRlbXBsYXRlKTtcbiAgICB2YXIgcGFyc2VkVGVtcGxhdGUgPSB0aGlzLl90ZW1wbGF0ZVBhcnNlci5wYXJzZShjb21wTWV0YS50ZW1wbGF0ZS50ZW1wbGF0ZSwgdW5pcXVlRGlyZWN0aXZlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wTWV0YS50eXBlLm5hbWUpO1xuICAgIHZhciBjaGFuZ2VEZXRlY3RvcnNFeHBycyA9IHRoaXMuX2NkQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudENvZGVHZW4oXG4gICAgICAgIGNvbXBNZXRhLnR5cGUsIGNvbXBNZXRhLmNoYW5nZURldGVjdGlvbiwgcGFyc2VkVGVtcGxhdGUpO1xuICAgIHZhciBjb21tYW5kc0V4cHIgPSB0aGlzLl9jb21tYW5kQ29tcGlsZXIuY29tcGlsZUNvbXBvbmVudENvZGVHZW4oXG4gICAgICAgIGNvbXBNZXRhLCBwYXJzZWRUZW1wbGF0ZSwgY2hhbmdlRGV0ZWN0b3JzRXhwcnMuZXhwcmVzc2lvbnMsXG4gICAgICAgIGNvZGVHZW5Db21wb25lbnRUZW1wbGF0ZUZhY3RvcnkpO1xuXG4gICAgYWRkQWxsKHN0eWxlRXhwci5kZWNsYXJhdGlvbnMsIHRhcmdldERlY2xhcmF0aW9ucyk7XG4gICAgYWRkQWxsKGNoYW5nZURldGVjdG9yc0V4cHJzLmRlY2xhcmF0aW9ucywgdGFyZ2V0RGVjbGFyYXRpb25zKTtcbiAgICBhZGRBbGwoY29tbWFuZHNFeHByLmRlY2xhcmF0aW9ucywgdGFyZ2V0RGVjbGFyYXRpb25zKTtcblxuICAgIHRhcmdldFRlbXBsYXRlQXJndW1lbnRzLnB1c2goXG4gICAgICAgIFtjaGFuZ2VEZXRlY3RvcnNFeHBycy5leHByZXNzaW9uc1swXSwgY29tbWFuZHNFeHByLmV4cHJlc3Npb24sIHN0eWxlRXhwci5leHByZXNzaW9uXSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vcm1hbGl6ZWRDb21wb25lbnRXaXRoVmlld0RpcmVjdGl2ZXMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50OiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gICAgICAgICAgICAgIHB1YmxpYyBkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSkge31cbn1cblxuZnVuY3Rpb24gYXNzZXJ0Q29tcG9uZW50KG1ldGE6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSkge1xuICBpZiAoIW1ldGEuaXNDb21wb25lbnQpIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ291bGQgbm90IGNvbXBpbGUgJyR7bWV0YS50eXBlLm5hbWV9JyBiZWNhdXNlIGl0IGlzIG5vdCBhIGNvbXBvbmVudC5gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiB0ZW1wbGF0ZVZhcmlhYmxlTmFtZSh0eXBlOiBDb21waWxlVHlwZU1ldGFkYXRhKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3R5cGUubmFtZX1UZW1wbGF0ZWA7XG59XG5cbmZ1bmN0aW9uIHRlbXBsYXRlR2V0dGVyTmFtZSh0eXBlOiBDb21waWxlVHlwZU1ldGFkYXRhKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke3RlbXBsYXRlVmFyaWFibGVOYW1lKHR5cGUpfUdldHRlcmA7XG59XG5cbmZ1bmN0aW9uIHRlbXBsYXRlTW9kdWxlVXJsKG1vZHVsZVVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgdmFyIHVybFdpdGhvdXRTdWZmaXggPSBtb2R1bGVVcmwuc3Vic3RyaW5nKDAsIG1vZHVsZVVybC5sZW5ndGggLSBNT0RVTEVfU1VGRklYLmxlbmd0aCk7XG4gIHJldHVybiBgJHt1cmxXaXRob3V0U3VmZml4fS50ZW1wbGF0ZSR7TU9EVUxFX1NVRkZJWH1gO1xufVxuXG5mdW5jdGlvbiBhZGRBbGwoc291cmNlOiBhbnlbXSwgdGFyZ2V0OiBhbnlbXSkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNvdXJjZS5sZW5ndGg7IGkrKykge1xuICAgIHRhcmdldC5wdXNoKHNvdXJjZVtpXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29kZUdlbkNvbXBvbmVudFRlbXBsYXRlRmFjdG9yeShuZXN0ZWRDb21wVHlwZTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhKTogc3RyaW5nIHtcbiAgcmV0dXJuIGAke21vZHVsZVJlZih0ZW1wbGF0ZU1vZHVsZVVybChuZXN0ZWRDb21wVHlwZS50eXBlLm1vZHVsZVVybCkpfSR7dGVtcGxhdGVHZXR0ZXJOYW1lKG5lc3RlZENvbXBUeXBlLnR5cGUpfWA7XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUR1cGxpY2F0ZXMoaXRlbXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdKTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10ge1xuICBsZXQgcmVzID0gW107XG4gIGl0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgbGV0IGhhc01hdGNoID1cbiAgICAgICAgcmVzLmZpbHRlcihyID0+IHIudHlwZS5uYW1lID09IGl0ZW0udHlwZS5uYW1lICYmIHIudHlwZS5tb2R1bGVVcmwgPT0gaXRlbS50eXBlLm1vZHVsZVVybCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgci50eXBlLnJ1bnRpbWUgPT0gaXRlbS50eXBlLnJ1bnRpbWUpXG4gICAgICAgICAgICAubGVuZ3RoID4gMDtcbiAgICBpZiAoIWhhc01hdGNoKSB7XG4gICAgICByZXMucHVzaChpdGVtKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3RlbXBsYXRlX2NvbXBpbGVyLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgaXNQcmVzZW50LFxuICBpc0JsYW5rLFxuICBub3JtYWxpemVCb29sLFxuICBzZXJpYWxpemVFbnVtLFxuICBUeXBlLFxuICBSZWdFeHBXcmFwcGVyLFxuICBTdHJpbmdXcmFwcGVyXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ0hBTkdFX0RFVEVDVElPTl9TVFJBVEVHWV9WQUxVRVNcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7Vmlld0VuY2Fwc3VsYXRpb24sIFZJRVdfRU5DQVBTVUxBVElPTl9WQUxVRVN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL3ZpZXcnO1xuaW1wb3J0IHtDc3NTZWxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NlbGVjdG9yJztcbmltcG9ydCB7c3BsaXRBdENvbG9ufSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtMaWZlY3ljbGVIb29rcywgTElGRUNZQ0xFX0hPT0tTX1ZBTFVFU30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2ludGVyZmFjZXMnO1xuXG4vLyBncm91cCAxOiBcInByb3BlcnR5XCIgZnJvbSBcIltwcm9wZXJ0eV1cIlxuLy8gZ3JvdXAgMjogXCJldmVudFwiIGZyb20gXCIoZXZlbnQpXCJcbnZhciBIT1NUX1JFR19FWFAgPSAvXig/Oig/OlxcWyhbXlxcXV0rKVxcXSl8KD86XFwoKFteXFwpXSspXFwpKSkkL2c7XG5cbi8qKlxuICogTWV0YWRhdGEgcmVnYXJkaW5nIGNvbXBpbGF0aW9uIG9mIGEgdHlwZS5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbXBpbGVUeXBlTWV0YWRhdGEge1xuICBydW50aW1lOiBUeXBlO1xuICBuYW1lOiBzdHJpbmc7XG4gIG1vZHVsZVVybDogc3RyaW5nO1xuICBpc0hvc3Q6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKHtydW50aW1lLCBuYW1lLCBtb2R1bGVVcmwsIGlzSG9zdH06XG4gICAgICAgICAgICAgICAgICB7cnVudGltZT86IFR5cGUsIG5hbWU/OiBzdHJpbmcsIG1vZHVsZVVybD86IHN0cmluZywgaXNIb3N0PzogYm9vbGVhbn0gPSB7fSkge1xuICAgIHRoaXMucnVudGltZSA9IHJ1bnRpbWU7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLm1vZHVsZVVybCA9IG1vZHVsZVVybDtcbiAgICB0aGlzLmlzSG9zdCA9IG5vcm1hbGl6ZUJvb2woaXNIb3N0KTtcbiAgfVxuXG4gIHN0YXRpYyBmcm9tSnNvbihkYXRhOiB7W2tleTogc3RyaW5nXTogYW55fSk6IENvbXBpbGVUeXBlTWV0YWRhdGEge1xuICAgIHJldHVybiBuZXcgQ29tcGlsZVR5cGVNZXRhZGF0YShcbiAgICAgICAge25hbWU6IGRhdGFbJ25hbWUnXSwgbW9kdWxlVXJsOiBkYXRhWydtb2R1bGVVcmwnXSwgaXNIb3N0OiBkYXRhWydpc0hvc3QnXX0pO1xuICB9XG5cbiAgdG9Kc29uKCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gTm90ZTogUnVudGltZSB0eXBlIGNhbid0IGJlIHNlcmlhbGl6ZWQuLi5cbiAgICAgICduYW1lJzogdGhpcy5uYW1lLFxuICAgICAgJ21vZHVsZVVybCc6IHRoaXMubW9kdWxlVXJsLFxuICAgICAgJ2lzSG9zdCc6IHRoaXMuaXNIb3N0XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIE1ldGFkYXRhIHJlZ2FyZGluZyBjb21waWxhdGlvbiBvZiBhIHRlbXBsYXRlLlxuICovXG5leHBvcnQgY2xhc3MgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEge1xuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbjtcbiAgdGVtcGxhdGU6IHN0cmluZztcbiAgdGVtcGxhdGVVcmw6IHN0cmluZztcbiAgc3R5bGVzOiBzdHJpbmdbXTtcbiAgc3R5bGVVcmxzOiBzdHJpbmdbXTtcbiAgbmdDb250ZW50U2VsZWN0b3JzOiBzdHJpbmdbXTtcbiAgY29uc3RydWN0b3Ioe2VuY2Fwc3VsYXRpb24sIHRlbXBsYXRlLCB0ZW1wbGF0ZVVybCwgc3R5bGVzLCBzdHlsZVVybHMsIG5nQ29udGVudFNlbGVjdG9yc306IHtcbiAgICBlbmNhcHN1bGF0aW9uPzogVmlld0VuY2Fwc3VsYXRpb24sXG4gICAgdGVtcGxhdGU/OiBzdHJpbmcsXG4gICAgdGVtcGxhdGVVcmw/OiBzdHJpbmcsXG4gICAgc3R5bGVzPzogc3RyaW5nW10sXG4gICAgc3R5bGVVcmxzPzogc3RyaW5nW10sXG4gICAgbmdDb250ZW50U2VsZWN0b3JzPzogc3RyaW5nW11cbiAgfSA9IHt9KSB7XG4gICAgdGhpcy5lbmNhcHN1bGF0aW9uID0gaXNQcmVzZW50KGVuY2Fwc3VsYXRpb24pID8gZW5jYXBzdWxhdGlvbiA6IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkO1xuICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcbiAgICB0aGlzLnRlbXBsYXRlVXJsID0gdGVtcGxhdGVVcmw7XG4gICAgdGhpcy5zdHlsZXMgPSBpc1ByZXNlbnQoc3R5bGVzKSA/IHN0eWxlcyA6IFtdO1xuICAgIHRoaXMuc3R5bGVVcmxzID0gaXNQcmVzZW50KHN0eWxlVXJscykgPyBzdHlsZVVybHMgOiBbXTtcbiAgICB0aGlzLm5nQ29udGVudFNlbGVjdG9ycyA9IGlzUHJlc2VudChuZ0NvbnRlbnRTZWxlY3RvcnMpID8gbmdDb250ZW50U2VsZWN0b3JzIDogW107XG4gIH1cblxuICBzdGF0aWMgZnJvbUpzb24oZGF0YToge1trZXk6IHN0cmluZ106IGFueX0pOiBDb21waWxlVGVtcGxhdGVNZXRhZGF0YSB7XG4gICAgcmV0dXJuIG5ldyBDb21waWxlVGVtcGxhdGVNZXRhZGF0YSh7XG4gICAgICBlbmNhcHN1bGF0aW9uOiBpc1ByZXNlbnQoZGF0YVsnZW5jYXBzdWxhdGlvbiddKSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgVklFV19FTkNBUFNVTEFUSU9OX1ZBTFVFU1tkYXRhWydlbmNhcHN1bGF0aW9uJ11dIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWydlbmNhcHN1bGF0aW9uJ10sXG4gICAgICB0ZW1wbGF0ZTogZGF0YVsndGVtcGxhdGUnXSxcbiAgICAgIHRlbXBsYXRlVXJsOiBkYXRhWyd0ZW1wbGF0ZVVybCddLFxuICAgICAgc3R5bGVzOiBkYXRhWydzdHlsZXMnXSxcbiAgICAgIHN0eWxlVXJsczogZGF0YVsnc3R5bGVVcmxzJ10sXG4gICAgICBuZ0NvbnRlbnRTZWxlY3RvcnM6IGRhdGFbJ25nQ29udGVudFNlbGVjdG9ycyddXG4gICAgfSk7XG4gIH1cblxuICB0b0pzb24oKToge1trZXk6IHN0cmluZ106IGFueX0ge1xuICAgIHJldHVybiB7XG4gICAgICAnZW5jYXBzdWxhdGlvbic6XG4gICAgICAgICAgaXNQcmVzZW50KHRoaXMuZW5jYXBzdWxhdGlvbikgPyBzZXJpYWxpemVFbnVtKHRoaXMuZW5jYXBzdWxhdGlvbikgOiB0aGlzLmVuY2Fwc3VsYXRpb24sXG4gICAgICAndGVtcGxhdGUnOiB0aGlzLnRlbXBsYXRlLFxuICAgICAgJ3RlbXBsYXRlVXJsJzogdGhpcy50ZW1wbGF0ZVVybCxcbiAgICAgICdzdHlsZXMnOiB0aGlzLnN0eWxlcyxcbiAgICAgICdzdHlsZVVybHMnOiB0aGlzLnN0eWxlVXJscyxcbiAgICAgICduZ0NvbnRlbnRTZWxlY3RvcnMnOiB0aGlzLm5nQ29udGVudFNlbGVjdG9yc1xuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBNZXRhZGF0YSByZWdhcmRpbmcgY29tcGlsYXRpb24gb2YgYSBkaXJlY3RpdmUuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEge1xuICBzdGF0aWMgY3JlYXRlKHt0eXBlLCBpc0NvbXBvbmVudCwgZHluYW1pY0xvYWRhYmxlLCBzZWxlY3RvciwgZXhwb3J0QXMsIGNoYW5nZURldGVjdGlvbiwgaW5wdXRzLFxuICAgICAgICAgICAgICAgICBvdXRwdXRzLCBob3N0LCBsaWZlY3ljbGVIb29rcywgdGVtcGxhdGV9OiB7XG4gICAgdHlwZT86IENvbXBpbGVUeXBlTWV0YWRhdGEsXG4gICAgaXNDb21wb25lbnQ/OiBib29sZWFuLFxuICAgIGR5bmFtaWNMb2FkYWJsZT86IGJvb2xlYW4sXG4gICAgc2VsZWN0b3I/OiBzdHJpbmcsXG4gICAgZXhwb3J0QXM/OiBzdHJpbmcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uPzogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgaW5wdXRzPzogc3RyaW5nW10sXG4gICAgb3V0cHV0cz86IHN0cmluZ1tdLFxuICAgIGhvc3Q/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSxcbiAgICBsaWZlY3ljbGVIb29rcz86IExpZmVjeWNsZUhvb2tzW10sXG4gICAgdGVtcGxhdGU/OiBDb21waWxlVGVtcGxhdGVNZXRhZGF0YVxuICB9ID0ge30pOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEge1xuICAgIHZhciBob3N0TGlzdGVuZXJzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICAgIHZhciBob3N0UHJvcGVydGllczoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcbiAgICB2YXIgaG9zdEF0dHJpYnV0ZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgaWYgKGlzUHJlc2VudChob3N0KSkge1xuICAgICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKGhvc3QsICh2YWx1ZTogc3RyaW5nLCBrZXk6IHN0cmluZykgPT4ge1xuICAgICAgICB2YXIgbWF0Y2hlcyA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChIT1NUX1JFR19FWFAsIGtleSk7XG4gICAgICAgIGlmIChpc0JsYW5rKG1hdGNoZXMpKSB7XG4gICAgICAgICAgaG9zdEF0dHJpYnV0ZXNba2V5XSA9IHZhbHVlO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUHJlc2VudChtYXRjaGVzWzFdKSkge1xuICAgICAgICAgIGhvc3RQcm9wZXJ0aWVzW21hdGNoZXNbMV1dID0gdmFsdWU7XG4gICAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KG1hdGNoZXNbMl0pKSB7XG4gICAgICAgICAgaG9zdExpc3RlbmVyc1ttYXRjaGVzWzJdXSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgdmFyIGlucHV0c01hcDoge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcbiAgICBpZiAoaXNQcmVzZW50KGlucHV0cykpIHtcbiAgICAgIGlucHV0cy5mb3JFYWNoKChiaW5kQ29uZmlnOiBzdHJpbmcpID0+IHtcbiAgICAgICAgLy8gY2Fub25pY2FsIHN5bnRheDogYGRpclByb3A6IGVsUHJvcGBcbiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gYDpgLCB1c2UgZGlyUHJvcCA9IGVsUHJvcFxuICAgICAgICB2YXIgcGFydHMgPSBzcGxpdEF0Q29sb24oYmluZENvbmZpZywgW2JpbmRDb25maWcsIGJpbmRDb25maWddKTtcbiAgICAgICAgaW5wdXRzTWFwW3BhcnRzWzBdXSA9IHBhcnRzWzFdO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBvdXRwdXRzTWFwOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICAgIGlmIChpc1ByZXNlbnQob3V0cHV0cykpIHtcbiAgICAgIG91dHB1dHMuZm9yRWFjaCgoYmluZENvbmZpZzogc3RyaW5nKSA9PiB7XG4gICAgICAgIC8vIGNhbm9uaWNhbCBzeW50YXg6IGBkaXJQcm9wOiBlbFByb3BgXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGA6YCwgdXNlIGRpclByb3AgPSBlbFByb3BcbiAgICAgICAgdmFyIHBhcnRzID0gc3BsaXRBdENvbG9uKGJpbmRDb25maWcsIFtiaW5kQ29uZmlnLCBiaW5kQ29uZmlnXSk7XG4gICAgICAgIG91dHB1dHNNYXBbcGFydHNbMF1dID0gcGFydHNbMV07XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSh7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgaXNDb21wb25lbnQ6IG5vcm1hbGl6ZUJvb2woaXNDb21wb25lbnQpLFxuICAgICAgZHluYW1pY0xvYWRhYmxlOiBub3JtYWxpemVCb29sKGR5bmFtaWNMb2FkYWJsZSksXG4gICAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgICBleHBvcnRBczogZXhwb3J0QXMsXG4gICAgICBjaGFuZ2VEZXRlY3Rpb246IGNoYW5nZURldGVjdGlvbixcbiAgICAgIGlucHV0czogaW5wdXRzTWFwLFxuICAgICAgb3V0cHV0czogb3V0cHV0c01hcCxcbiAgICAgIGhvc3RMaXN0ZW5lcnM6IGhvc3RMaXN0ZW5lcnMsXG4gICAgICBob3N0UHJvcGVydGllczogaG9zdFByb3BlcnRpZXMsXG4gICAgICBob3N0QXR0cmlidXRlczogaG9zdEF0dHJpYnV0ZXMsXG4gICAgICBsaWZlY3ljbGVIb29rczogaXNQcmVzZW50KGxpZmVjeWNsZUhvb2tzKSA/IGxpZmVjeWNsZUhvb2tzIDogW10sXG4gICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVcbiAgICB9KTtcbiAgfVxuXG4gIHR5cGU6IENvbXBpbGVUeXBlTWV0YWRhdGE7XG4gIGlzQ29tcG9uZW50OiBib29sZWFuO1xuICBkeW5hbWljTG9hZGFibGU6IGJvb2xlYW47XG4gIHNlbGVjdG9yOiBzdHJpbmc7XG4gIGV4cG9ydEFzOiBzdHJpbmc7XG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3k7XG4gIGlucHV0czoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIG91dHB1dHM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBob3N0TGlzdGVuZXJzOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcbiAgaG9zdFByb3BlcnRpZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuICBob3N0QXR0cmlidXRlczoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG4gIGxpZmVjeWNsZUhvb2tzOiBMaWZlY3ljbGVIb29rc1tdO1xuICB0ZW1wbGF0ZTogQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGE7XG4gIGNvbnN0cnVjdG9yKHt0eXBlLCBpc0NvbXBvbmVudCwgZHluYW1pY0xvYWRhYmxlLCBzZWxlY3RvciwgZXhwb3J0QXMsIGNoYW5nZURldGVjdGlvbiwgaW5wdXRzLFxuICAgICAgICAgICAgICAgb3V0cHV0cywgaG9zdExpc3RlbmVycywgaG9zdFByb3BlcnRpZXMsIGhvc3RBdHRyaWJ1dGVzLCBsaWZlY3ljbGVIb29rcywgdGVtcGxhdGV9OiB7XG4gICAgdHlwZT86IENvbXBpbGVUeXBlTWV0YWRhdGEsXG4gICAgaXNDb21wb25lbnQ/OiBib29sZWFuLFxuICAgIGR5bmFtaWNMb2FkYWJsZT86IGJvb2xlYW4sXG4gICAgc2VsZWN0b3I/OiBzdHJpbmcsXG4gICAgZXhwb3J0QXM/OiBzdHJpbmcsXG4gICAgY2hhbmdlRGV0ZWN0aW9uPzogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgaW5wdXRzPzoge1trZXk6IHN0cmluZ106IHN0cmluZ30sXG4gICAgb3V0cHV0cz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIGhvc3RMaXN0ZW5lcnM/OiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSxcbiAgICBob3N0UHJvcGVydGllcz86IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgIGhvc3RBdHRyaWJ1dGVzPzoge1trZXk6IHN0cmluZ106IHN0cmluZ30sXG4gICAgbGlmZWN5Y2xlSG9va3M/OiBMaWZlY3ljbGVIb29rc1tdLFxuICAgIHRlbXBsYXRlPzogQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGFcbiAgfSA9IHt9KSB7XG4gICAgdGhpcy50eXBlID0gdHlwZTtcbiAgICB0aGlzLmlzQ29tcG9uZW50ID0gaXNDb21wb25lbnQ7XG4gICAgdGhpcy5keW5hbWljTG9hZGFibGUgPSBkeW5hbWljTG9hZGFibGU7XG4gICAgdGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yO1xuICAgIHRoaXMuZXhwb3J0QXMgPSBleHBvcnRBcztcbiAgICB0aGlzLmNoYW5nZURldGVjdGlvbiA9IGNoYW5nZURldGVjdGlvbjtcbiAgICB0aGlzLmlucHV0cyA9IGlucHV0cztcbiAgICB0aGlzLm91dHB1dHMgPSBvdXRwdXRzO1xuICAgIHRoaXMuaG9zdExpc3RlbmVycyA9IGhvc3RMaXN0ZW5lcnM7XG4gICAgdGhpcy5ob3N0UHJvcGVydGllcyA9IGhvc3RQcm9wZXJ0aWVzO1xuICAgIHRoaXMuaG9zdEF0dHJpYnV0ZXMgPSBob3N0QXR0cmlidXRlcztcbiAgICB0aGlzLmxpZmVjeWNsZUhvb2tzID0gbGlmZWN5Y2xlSG9va3M7XG4gICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlO1xuICB9XG5cbiAgc3RhdGljIGZyb21Kc29uKGRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhIHtcbiAgICByZXR1cm4gbmV3IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSh7XG4gICAgICBpc0NvbXBvbmVudDogZGF0YVsnaXNDb21wb25lbnQnXSxcbiAgICAgIGR5bmFtaWNMb2FkYWJsZTogZGF0YVsnZHluYW1pY0xvYWRhYmxlJ10sXG4gICAgICBzZWxlY3RvcjogZGF0YVsnc2VsZWN0b3InXSxcbiAgICAgIGV4cG9ydEFzOiBkYXRhWydleHBvcnRBcyddLFxuICAgICAgdHlwZTogaXNQcmVzZW50KGRhdGFbJ3R5cGUnXSkgPyBDb21waWxlVHlwZU1ldGFkYXRhLmZyb21Kc29uKGRhdGFbJ3R5cGUnXSkgOiBkYXRhWyd0eXBlJ10sXG4gICAgICBjaGFuZ2VEZXRlY3Rpb246IGlzUHJlc2VudChkYXRhWydjaGFuZ2VEZXRlY3Rpb24nXSkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX0RFVEVDVElPTl9TVFJBVEVHWV9WQUxVRVNbZGF0YVsnY2hhbmdlRGV0ZWN0aW9uJ11dIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbJ2NoYW5nZURldGVjdGlvbiddLFxuICAgICAgaW5wdXRzOiBkYXRhWydpbnB1dHMnXSxcbiAgICAgIG91dHB1dHM6IGRhdGFbJ291dHB1dHMnXSxcbiAgICAgIGhvc3RMaXN0ZW5lcnM6IGRhdGFbJ2hvc3RMaXN0ZW5lcnMnXSxcbiAgICAgIGhvc3RQcm9wZXJ0aWVzOiBkYXRhWydob3N0UHJvcGVydGllcyddLFxuICAgICAgaG9zdEF0dHJpYnV0ZXM6IGRhdGFbJ2hvc3RBdHRyaWJ1dGVzJ10sXG4gICAgICBsaWZlY3ljbGVIb29rczpcbiAgICAgICAgICAoPGFueVtdPmRhdGFbJ2xpZmVjeWNsZUhvb2tzJ10pLm1hcChob29rVmFsdWUgPT4gTElGRUNZQ0xFX0hPT0tTX1ZBTFVFU1tob29rVmFsdWVdKSxcbiAgICAgIHRlbXBsYXRlOiBpc1ByZXNlbnQoZGF0YVsndGVtcGxhdGUnXSkgPyBDb21waWxlVGVtcGxhdGVNZXRhZGF0YS5mcm9tSnNvbihkYXRhWyd0ZW1wbGF0ZSddKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVsndGVtcGxhdGUnXVxuICAgIH0pO1xuICB9XG5cbiAgdG9Kc29uKCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2lzQ29tcG9uZW50JzogdGhpcy5pc0NvbXBvbmVudCxcbiAgICAgICdkeW5hbWljTG9hZGFibGUnOiB0aGlzLmR5bmFtaWNMb2FkYWJsZSxcbiAgICAgICdzZWxlY3Rvcic6IHRoaXMuc2VsZWN0b3IsXG4gICAgICAnZXhwb3J0QXMnOiB0aGlzLmV4cG9ydEFzLFxuICAgICAgJ3R5cGUnOiBpc1ByZXNlbnQodGhpcy50eXBlKSA/IHRoaXMudHlwZS50b0pzb24oKSA6IHRoaXMudHlwZSxcbiAgICAgICdjaGFuZ2VEZXRlY3Rpb24nOiBpc1ByZXNlbnQodGhpcy5jaGFuZ2VEZXRlY3Rpb24pID8gc2VyaWFsaXplRW51bSh0aGlzLmNoYW5nZURldGVjdGlvbikgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdGlvbixcbiAgICAgICdpbnB1dHMnOiB0aGlzLmlucHV0cyxcbiAgICAgICdvdXRwdXRzJzogdGhpcy5vdXRwdXRzLFxuICAgICAgJ2hvc3RMaXN0ZW5lcnMnOiB0aGlzLmhvc3RMaXN0ZW5lcnMsXG4gICAgICAnaG9zdFByb3BlcnRpZXMnOiB0aGlzLmhvc3RQcm9wZXJ0aWVzLFxuICAgICAgJ2hvc3RBdHRyaWJ1dGVzJzogdGhpcy5ob3N0QXR0cmlidXRlcyxcbiAgICAgICdsaWZlY3ljbGVIb29rcyc6IHRoaXMubGlmZWN5Y2xlSG9va3MubWFwKGhvb2sgPT4gc2VyaWFsaXplRW51bShob29rKSksXG4gICAgICAndGVtcGxhdGUnOiBpc1ByZXNlbnQodGhpcy50ZW1wbGF0ZSkgPyB0aGlzLnRlbXBsYXRlLnRvSnNvbigpIDogdGhpcy50ZW1wbGF0ZVxuICAgIH07XG4gIH1cbn1cblxuLyoqXG4gKiBDb25zdHJ1Y3Qge0BsaW5rIENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YX0gZnJvbSB7QGxpbmsgQ29tcG9uZW50VHlwZU1ldGFkYXRhfSBhbmQgYSBzZWxlY3Rvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUhvc3RDb21wb25lbnRNZXRhKGNvbXBvbmVudFR5cGU6IENvbXBpbGVUeXBlTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50U2VsZWN0b3I6IHN0cmluZyk6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSB7XG4gIHZhciB0ZW1wbGF0ZSA9IENzc1NlbGVjdG9yLnBhcnNlKGNvbXBvbmVudFNlbGVjdG9yKVswXS5nZXRNYXRjaGluZ0VsZW1lbnRUZW1wbGF0ZSgpO1xuICByZXR1cm4gQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLmNyZWF0ZSh7XG4gICAgdHlwZTogbmV3IENvbXBpbGVUeXBlTWV0YWRhdGEoe1xuICAgICAgcnVudGltZTogT2JqZWN0LFxuICAgICAgbmFtZTogYEhvc3Qke2NvbXBvbmVudFR5cGUubmFtZX1gLFxuICAgICAgbW9kdWxlVXJsOiBjb21wb25lbnRUeXBlLm1vZHVsZVVybCxcbiAgICAgIGlzSG9zdDogdHJ1ZVxuICAgIH0pLFxuICAgIHRlbXBsYXRlOiBuZXcgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEoXG4gICAgICAgIHt0ZW1wbGF0ZTogdGVtcGxhdGUsIHRlbXBsYXRlVXJsOiAnJywgc3R5bGVzOiBbXSwgc3R5bGVVcmxzOiBbXSwgbmdDb250ZW50U2VsZWN0b3JzOiBbXX0pLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuRGVmYXVsdCxcbiAgICBpbnB1dHM6IFtdLFxuICAgIG91dHB1dHM6IFtdLFxuICAgIGhvc3Q6IHt9LFxuICAgIGxpZmVjeWNsZUhvb2tzOiBbXSxcbiAgICBpc0NvbXBvbmVudDogdHJ1ZSxcbiAgICBkeW5hbWljTG9hZGFibGU6IGZhbHNlLFxuICAgIHNlbGVjdG9yOiAnKidcbiAgfSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIvZGlyZWN0aXZlX21ldGFkYXRhLnRzXG4gKiovIiwiaW1wb3J0IHtNYXAsIExpc3RXcmFwcGVyLCBNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtcbiAgaXNQcmVzZW50LFxuICBpc0JsYW5rLFxuICBSZWdFeHBXcmFwcGVyLFxuICBSZWdFeHBNYXRjaGVyV3JhcHBlcixcbiAgU3RyaW5nV3JhcHBlclxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG5jb25zdCBfRU1QVFlfQVRUUl9WQUxVRSA9ICcnO1xuXG4vLyBUT0RPOiBDYW4ndCB1c2UgYGNvbnN0YCBoZXJlIGFzXG4vLyBpbiBEYXJ0IHRoaXMgaXMgbm90IHRyYW5zcGlsZWQgaW50byBgZmluYWxgIHlldC4uLlxudmFyIF9TRUxFQ1RPUl9SRUdFWFAgPSBSZWdFeHBXcmFwcGVyLmNyZWF0ZShcbiAgICAnKFxcXFw6bm90XFxcXCgpfCcgKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy9cIjpub3QoXCJcbiAgICAnKFstXFxcXHddKyl8JyArICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFwidGFnXCJcbiAgICAnKD86XFxcXC4oWy1cXFxcd10rKSl8JyArICAgICAgICAgICAgICAgICAgICAgLy8gXCIuY2xhc3NcIlxuICAgICcoPzpcXFxcWyhbLVxcXFx3Kl0rKSg/Oj0oW15cXFxcXV0qKSk/XFxcXF0pfCcgKyAgLy8gXCJbbmFtZV1cIiwgXCJbbmFtZT12YWx1ZV1cIiBvciBcIltuYW1lKj12YWx1ZV1cIlxuICAgICcoXFxcXCkpfCcgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCIpXCJcbiAgICAnKFxcXFxzKixcXFxccyopJyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gXCIsXCJcblxuLyoqXG4gKiBBIGNzcyBzZWxlY3RvciBjb250YWlucyBhbiBlbGVtZW50IG5hbWUsXG4gKiBjc3MgY2xhc3NlcyBhbmQgYXR0cmlidXRlL3ZhbHVlIHBhaXJzIHdpdGggdGhlIHB1cnBvc2VcbiAqIG9mIHNlbGVjdGluZyBzdWJzZXRzIG91dCBvZiB0aGVtLlxuICovXG5leHBvcnQgY2xhc3MgQ3NzU2VsZWN0b3Ige1xuICBlbGVtZW50OiBzdHJpbmcgPSBudWxsO1xuICBjbGFzc05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICBhdHRyczogc3RyaW5nW10gPSBbXTtcbiAgbm90U2VsZWN0b3JzOiBDc3NTZWxlY3RvcltdID0gW107XG5cbiAgc3RhdGljIHBhcnNlKHNlbGVjdG9yOiBzdHJpbmcpOiBDc3NTZWxlY3RvcltdIHtcbiAgICB2YXIgcmVzdWx0czogQ3NzU2VsZWN0b3JbXSA9IFtdO1xuICAgIHZhciBfYWRkUmVzdWx0ID0gKHJlczogQ3NzU2VsZWN0b3JbXSwgY3NzU2VsKSA9PiB7XG4gICAgICBpZiAoY3NzU2VsLm5vdFNlbGVjdG9ycy5sZW5ndGggPiAwICYmIGlzQmxhbmsoY3NzU2VsLmVsZW1lbnQpICYmXG4gICAgICAgICAgTGlzdFdyYXBwZXIuaXNFbXB0eShjc3NTZWwuY2xhc3NOYW1lcykgJiYgTGlzdFdyYXBwZXIuaXNFbXB0eShjc3NTZWwuYXR0cnMpKSB7XG4gICAgICAgIGNzc1NlbC5lbGVtZW50ID0gXCIqXCI7XG4gICAgICB9XG4gICAgICByZXMucHVzaChjc3NTZWwpO1xuICAgIH07XG4gICAgdmFyIGNzc1NlbGVjdG9yID0gbmV3IENzc1NlbGVjdG9yKCk7XG4gICAgdmFyIG1hdGNoZXIgPSBSZWdFeHBXcmFwcGVyLm1hdGNoZXIoX1NFTEVDVE9SX1JFR0VYUCwgc2VsZWN0b3IpO1xuICAgIHZhciBtYXRjaDtcbiAgICB2YXIgY3VycmVudCA9IGNzc1NlbGVjdG9yO1xuICAgIHZhciBpbk5vdCA9IGZhbHNlO1xuICAgIHdoaWxlIChpc1ByZXNlbnQobWF0Y2ggPSBSZWdFeHBNYXRjaGVyV3JhcHBlci5uZXh0KG1hdGNoZXIpKSkge1xuICAgICAgaWYgKGlzUHJlc2VudChtYXRjaFsxXSkpIHtcbiAgICAgICAgaWYgKGluTm90KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05lc3RpbmcgOm5vdCBpcyBub3QgYWxsb3dlZCBpbiBhIHNlbGVjdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgaW5Ob3QgPSB0cnVlO1xuICAgICAgICBjdXJyZW50ID0gbmV3IENzc1NlbGVjdG9yKCk7XG4gICAgICAgIGNzc1NlbGVjdG9yLm5vdFNlbGVjdG9ycy5wdXNoKGN1cnJlbnQpO1xuICAgICAgfVxuICAgICAgaWYgKGlzUHJlc2VudChtYXRjaFsyXSkpIHtcbiAgICAgICAgY3VycmVudC5zZXRFbGVtZW50KG1hdGNoWzJdKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQobWF0Y2hbM10pKSB7XG4gICAgICAgIGN1cnJlbnQuYWRkQ2xhc3NOYW1lKG1hdGNoWzNdKTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQobWF0Y2hbNF0pKSB7XG4gICAgICAgIGN1cnJlbnQuYWRkQXR0cmlidXRlKG1hdGNoWzRdLCBtYXRjaFs1XSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KG1hdGNoWzZdKSkge1xuICAgICAgICBpbk5vdCA9IGZhbHNlO1xuICAgICAgICBjdXJyZW50ID0gY3NzU2VsZWN0b3I7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KG1hdGNoWzddKSkge1xuICAgICAgICBpZiAoaW5Ob3QpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignTXVsdGlwbGUgc2VsZWN0b3JzIGluIDpub3QgYXJlIG5vdCBzdXBwb3J0ZWQnKTtcbiAgICAgICAgfVxuICAgICAgICBfYWRkUmVzdWx0KHJlc3VsdHMsIGNzc1NlbGVjdG9yKTtcbiAgICAgICAgY3NzU2VsZWN0b3IgPSBjdXJyZW50ID0gbmV3IENzc1NlbGVjdG9yKCk7XG4gICAgICB9XG4gICAgfVxuICAgIF9hZGRSZXN1bHQocmVzdWx0cywgY3NzU2VsZWN0b3IpO1xuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgaXNFbGVtZW50U2VsZWN0b3IoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLmVsZW1lbnQpICYmIExpc3RXcmFwcGVyLmlzRW1wdHkodGhpcy5jbGFzc05hbWVzKSAmJlxuICAgICAgICAgICBMaXN0V3JhcHBlci5pc0VtcHR5KHRoaXMuYXR0cnMpICYmIHRoaXMubm90U2VsZWN0b3JzLmxlbmd0aCA9PT0gMDtcbiAgfVxuXG4gIHNldEVsZW1lbnQoZWxlbWVudDogc3RyaW5nID0gbnVsbCkgeyB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OyB9XG5cbiAgLyoqIEdldHMgYSB0ZW1wbGF0ZSBzdHJpbmcgZm9yIGFuIGVsZW1lbnQgdGhhdCBtYXRjaGVzIHRoZSBzZWxlY3Rvci4gKi9cbiAgZ2V0TWF0Y2hpbmdFbGVtZW50VGVtcGxhdGUoKTogc3RyaW5nIHtcbiAgICBsZXQgdGFnTmFtZSA9IGlzUHJlc2VudCh0aGlzLmVsZW1lbnQpID8gdGhpcy5lbGVtZW50IDogJ2Rpdic7XG4gICAgbGV0IGNsYXNzQXR0ciA9IHRoaXMuY2xhc3NOYW1lcy5sZW5ndGggPiAwID8gYCBjbGFzcz1cIiR7dGhpcy5jbGFzc05hbWVzLmpvaW4oJyAnKX1cImAgOiAnJztcblxuICAgIGxldCBhdHRycyA9ICcnO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hdHRycy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgbGV0IGF0dHJOYW1lID0gdGhpcy5hdHRyc1tpXTtcbiAgICAgIGxldCBhdHRyVmFsdWUgPSB0aGlzLmF0dHJzW2kgKyAxXSAhPT0gJycgPyBgPVwiJHt0aGlzLmF0dHJzW2kgKyAxXX1cImAgOiAnJztcbiAgICAgIGF0dHJzICs9IGAgJHthdHRyTmFtZX0ke2F0dHJWYWx1ZX1gO1xuICAgIH1cblxuICAgIHJldHVybiBgPCR7dGFnTmFtZX0ke2NsYXNzQXR0cn0ke2F0dHJzfT48LyR7dGFnTmFtZX0+YDtcbiAgfVxuXG4gIGFkZEF0dHJpYnV0ZShuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgPSBfRU1QVFlfQVRUUl9WQUxVRSkge1xuICAgIHRoaXMuYXR0cnMucHVzaChuYW1lKTtcbiAgICBpZiAoaXNQcmVzZW50KHZhbHVlKSkge1xuICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSA9IF9FTVBUWV9BVFRSX1ZBTFVFO1xuICAgIH1cbiAgICB0aGlzLmF0dHJzLnB1c2godmFsdWUpO1xuICB9XG5cbiAgYWRkQ2xhc3NOYW1lKG5hbWU6IHN0cmluZykgeyB0aGlzLmNsYXNzTmFtZXMucHVzaChuYW1lLnRvTG93ZXJDYXNlKCkpOyB9XG5cbiAgdG9TdHJpbmcoKTogc3RyaW5nIHtcbiAgICB2YXIgcmVzID0gJyc7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmVsZW1lbnQpKSB7XG4gICAgICByZXMgKz0gdGhpcy5lbGVtZW50O1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuY2xhc3NOYW1lcykpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jbGFzc05hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlcyArPSAnLicgKyB0aGlzLmNsYXNzTmFtZXNbaV07XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5hdHRycykpIHtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hdHRycy5sZW5ndGg7KSB7XG4gICAgICAgIHZhciBhdHRyTmFtZSA9IHRoaXMuYXR0cnNbaSsrXTtcbiAgICAgICAgdmFyIGF0dHJWYWx1ZSA9IHRoaXMuYXR0cnNbaSsrXTtcbiAgICAgICAgcmVzICs9ICdbJyArIGF0dHJOYW1lO1xuICAgICAgICBpZiAoYXR0clZhbHVlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICByZXMgKz0gJz0nICsgYXR0clZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJlcyArPSAnXSc7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMubm90U2VsZWN0b3JzLmZvckVhY2gobm90U2VsZWN0b3IgPT4gcmVzICs9IGA6bm90KCR7bm90U2VsZWN0b3J9KWApO1xuICAgIHJldHVybiByZXM7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWFkcyBhIGxpc3Qgb2YgQ3NzU2VsZWN0b3JzIGFuZCBhbGxvd3MgdG8gY2FsY3VsYXRlIHdoaWNoIG9uZXNcbiAqIGFyZSBjb250YWluZWQgaW4gYSBnaXZlbiBDc3NTZWxlY3Rvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFNlbGVjdG9yTWF0Y2hlciB7XG4gIHN0YXRpYyBjcmVhdGVOb3RNYXRjaGVyKG5vdFNlbGVjdG9yczogQ3NzU2VsZWN0b3JbXSk6IFNlbGVjdG9yTWF0Y2hlciB7XG4gICAgdmFyIG5vdE1hdGNoZXIgPSBuZXcgU2VsZWN0b3JNYXRjaGVyKCk7XG4gICAgbm90TWF0Y2hlci5hZGRTZWxlY3RhYmxlcyhub3RTZWxlY3RvcnMsIG51bGwpO1xuICAgIHJldHVybiBub3RNYXRjaGVyO1xuICB9XG5cbiAgcHJpdmF0ZSBfZWxlbWVudE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBTZWxlY3RvckNvbnRleHRbXT4oKTtcbiAgcHJpdmF0ZSBfZWxlbWVudFBhcnRpYWxNYXAgPSBuZXcgTWFwPHN0cmluZywgU2VsZWN0b3JNYXRjaGVyPigpO1xuICBwcml2YXRlIF9jbGFzc01hcCA9IG5ldyBNYXA8c3RyaW5nLCBTZWxlY3RvckNvbnRleHRbXT4oKTtcbiAgcHJpdmF0ZSBfY2xhc3NQYXJ0aWFsTWFwID0gbmV3IE1hcDxzdHJpbmcsIFNlbGVjdG9yTWF0Y2hlcj4oKTtcbiAgcHJpdmF0ZSBfYXR0clZhbHVlTWFwID0gbmV3IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIFNlbGVjdG9yQ29udGV4dFtdPj4oKTtcbiAgcHJpdmF0ZSBfYXR0clZhbHVlUGFydGlhbE1hcCA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBTZWxlY3Rvck1hdGNoZXI+PigpO1xuICBwcml2YXRlIF9saXN0Q29udGV4dHM6IFNlbGVjdG9yTGlzdENvbnRleHRbXSA9IFtdO1xuXG4gIGFkZFNlbGVjdGFibGVzKGNzc1NlbGVjdG9yczogQ3NzU2VsZWN0b3JbXSwgY2FsbGJhY2tDdHh0PzogYW55KSB7XG4gICAgdmFyIGxpc3RDb250ZXh0ID0gbnVsbDtcbiAgICBpZiAoY3NzU2VsZWN0b3JzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGxpc3RDb250ZXh0ID0gbmV3IFNlbGVjdG9yTGlzdENvbnRleHQoY3NzU2VsZWN0b3JzKTtcbiAgICAgIHRoaXMuX2xpc3RDb250ZXh0cy5wdXNoKGxpc3RDb250ZXh0KTtcbiAgICB9XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjc3NTZWxlY3RvcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuX2FkZFNlbGVjdGFibGUoY3NzU2VsZWN0b3JzW2ldLCBjYWxsYmFja0N0eHQsIGxpc3RDb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGFuIG9iamVjdCB0aGF0IGNhbiBiZSBmb3VuZCBsYXRlciBvbiBieSBjYWxsaW5nIGBtYXRjaGAuXG4gICAqIEBwYXJhbSBjc3NTZWxlY3RvciBBIGNzcyBzZWxlY3RvclxuICAgKiBAcGFyYW0gY2FsbGJhY2tDdHh0IEFuIG9wYXF1ZSBvYmplY3QgdGhhdCB3aWxsIGJlIGdpdmVuIHRvIHRoZSBjYWxsYmFjayBvZiB0aGUgYG1hdGNoYCBmdW5jdGlvblxuICAgKi9cbiAgcHJpdmF0ZSBfYWRkU2VsZWN0YWJsZShjc3NTZWxlY3RvcjogQ3NzU2VsZWN0b3IsIGNhbGxiYWNrQ3R4dDogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RDb250ZXh0OiBTZWxlY3Rvckxpc3RDb250ZXh0KSB7XG4gICAgdmFyIG1hdGNoZXI6IFNlbGVjdG9yTWF0Y2hlciA9IHRoaXM7XG4gICAgdmFyIGVsZW1lbnQgPSBjc3NTZWxlY3Rvci5lbGVtZW50O1xuICAgIHZhciBjbGFzc05hbWVzID0gY3NzU2VsZWN0b3IuY2xhc3NOYW1lcztcbiAgICB2YXIgYXR0cnMgPSBjc3NTZWxlY3Rvci5hdHRycztcbiAgICB2YXIgc2VsZWN0YWJsZSA9IG5ldyBTZWxlY3RvckNvbnRleHQoY3NzU2VsZWN0b3IsIGNhbGxiYWNrQ3R4dCwgbGlzdENvbnRleHQpO1xuXG4gICAgaWYgKGlzUHJlc2VudChlbGVtZW50KSkge1xuICAgICAgdmFyIGlzVGVybWluYWwgPSBhdHRycy5sZW5ndGggPT09IDAgJiYgY2xhc3NOYW1lcy5sZW5ndGggPT09IDA7XG4gICAgICBpZiAoaXNUZXJtaW5hbCkge1xuICAgICAgICB0aGlzLl9hZGRUZXJtaW5hbChtYXRjaGVyLl9lbGVtZW50TWFwLCBlbGVtZW50LCBzZWxlY3RhYmxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1hdGNoZXIgPSB0aGlzLl9hZGRQYXJ0aWFsKG1hdGNoZXIuX2VsZW1lbnRQYXJ0aWFsTWFwLCBlbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNQcmVzZW50KGNsYXNzTmFtZXMpKSB7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgY2xhc3NOYW1lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdmFyIGlzVGVybWluYWwgPSBhdHRycy5sZW5ndGggPT09IDAgJiYgaW5kZXggPT09IGNsYXNzTmFtZXMubGVuZ3RoIC0gMTtcbiAgICAgICAgdmFyIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbaW5kZXhdO1xuICAgICAgICBpZiAoaXNUZXJtaW5hbCkge1xuICAgICAgICAgIHRoaXMuX2FkZFRlcm1pbmFsKG1hdGNoZXIuX2NsYXNzTWFwLCBjbGFzc05hbWUsIHNlbGVjdGFibGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG1hdGNoZXIgPSB0aGlzLl9hZGRQYXJ0aWFsKG1hdGNoZXIuX2NsYXNzUGFydGlhbE1hcCwgY2xhc3NOYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1ByZXNlbnQoYXR0cnMpKSB7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgYXR0cnMubGVuZ3RoOykge1xuICAgICAgICB2YXIgaXNUZXJtaW5hbCA9IGluZGV4ID09PSBhdHRycy5sZW5ndGggLSAyO1xuICAgICAgICB2YXIgYXR0ck5hbWUgPSBhdHRyc1tpbmRleCsrXTtcbiAgICAgICAgdmFyIGF0dHJWYWx1ZSA9IGF0dHJzW2luZGV4KytdO1xuICAgICAgICBpZiAoaXNUZXJtaW5hbCkge1xuICAgICAgICAgIHZhciB0ZXJtaW5hbE1hcCA9IG1hdGNoZXIuX2F0dHJWYWx1ZU1hcDtcbiAgICAgICAgICB2YXIgdGVybWluYWxWYWx1ZXNNYXAgPSB0ZXJtaW5hbE1hcC5nZXQoYXR0ck5hbWUpO1xuICAgICAgICAgIGlmIChpc0JsYW5rKHRlcm1pbmFsVmFsdWVzTWFwKSkge1xuICAgICAgICAgICAgdGVybWluYWxWYWx1ZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgU2VsZWN0b3JDb250ZXh0W10+KCk7XG4gICAgICAgICAgICB0ZXJtaW5hbE1hcC5zZXQoYXR0ck5hbWUsIHRlcm1pbmFsVmFsdWVzTWFwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5fYWRkVGVybWluYWwodGVybWluYWxWYWx1ZXNNYXAsIGF0dHJWYWx1ZSwgc2VsZWN0YWJsZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFyIHBhcnR0aWFsTWFwID0gbWF0Y2hlci5fYXR0clZhbHVlUGFydGlhbE1hcDtcbiAgICAgICAgICB2YXIgcGFydGlhbFZhbHVlc01hcCA9IHBhcnR0aWFsTWFwLmdldChhdHRyTmFtZSk7XG4gICAgICAgICAgaWYgKGlzQmxhbmsocGFydGlhbFZhbHVlc01hcCkpIHtcbiAgICAgICAgICAgIHBhcnRpYWxWYWx1ZXNNYXAgPSBuZXcgTWFwPHN0cmluZywgU2VsZWN0b3JNYXRjaGVyPigpO1xuICAgICAgICAgICAgcGFydHRpYWxNYXAuc2V0KGF0dHJOYW1lLCBwYXJ0aWFsVmFsdWVzTWFwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbWF0Y2hlciA9IHRoaXMuX2FkZFBhcnRpYWwocGFydGlhbFZhbHVlc01hcCwgYXR0clZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2FkZFRlcm1pbmFsKG1hcDogTWFwPHN0cmluZywgU2VsZWN0b3JDb250ZXh0W10+LCBuYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGFibGU6IFNlbGVjdG9yQ29udGV4dCkge1xuICAgIHZhciB0ZXJtaW5hbExpc3QgPSBtYXAuZ2V0KG5hbWUpO1xuICAgIGlmIChpc0JsYW5rKHRlcm1pbmFsTGlzdCkpIHtcbiAgICAgIHRlcm1pbmFsTGlzdCA9IFtdO1xuICAgICAgbWFwLnNldChuYW1lLCB0ZXJtaW5hbExpc3QpO1xuICAgIH1cbiAgICB0ZXJtaW5hbExpc3QucHVzaChzZWxlY3RhYmxlKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkZFBhcnRpYWwobWFwOiBNYXA8c3RyaW5nLCBTZWxlY3Rvck1hdGNoZXI+LCBuYW1lOiBzdHJpbmcpOiBTZWxlY3Rvck1hdGNoZXIge1xuICAgIHZhciBtYXRjaGVyID0gbWFwLmdldChuYW1lKTtcbiAgICBpZiAoaXNCbGFuayhtYXRjaGVyKSkge1xuICAgICAgbWF0Y2hlciA9IG5ldyBTZWxlY3Rvck1hdGNoZXIoKTtcbiAgICAgIG1hcC5zZXQobmFtZSwgbWF0Y2hlcik7XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmQgdGhlIG9iamVjdHMgdGhhdCBoYXZlIGJlZW4gYWRkZWQgdmlhIGBhZGRTZWxlY3RhYmxlYFxuICAgKiB3aG9zZSBjc3Mgc2VsZWN0b3IgaXMgY29udGFpbmVkIGluIHRoZSBnaXZlbiBjc3Mgc2VsZWN0b3IuXG4gICAqIEBwYXJhbSBjc3NTZWxlY3RvciBBIGNzcyBzZWxlY3RvclxuICAgKiBAcGFyYW0gbWF0Y2hlZENhbGxiYWNrIFRoaXMgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgb2JqZWN0IGhhbmRlZCBpbnRvIGBhZGRTZWxlY3RhYmxlYFxuICAgKiBAcmV0dXJuIGJvb2xlYW4gdHJ1ZSBpZiBhIG1hdGNoIHdhcyBmb3VuZFxuICAqL1xuICBtYXRjaChjc3NTZWxlY3RvcjogQ3NzU2VsZWN0b3IsIG1hdGNoZWRDYWxsYmFjazogKGM6IENzc1NlbGVjdG9yLCBhOiBhbnkpID0+IHZvaWQpOiBib29sZWFuIHtcbiAgICB2YXIgcmVzdWx0ID0gZmFsc2U7XG4gICAgdmFyIGVsZW1lbnQgPSBjc3NTZWxlY3Rvci5lbGVtZW50O1xuICAgIHZhciBjbGFzc05hbWVzID0gY3NzU2VsZWN0b3IuY2xhc3NOYW1lcztcbiAgICB2YXIgYXR0cnMgPSBjc3NTZWxlY3Rvci5hdHRycztcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbGlzdENvbnRleHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9saXN0Q29udGV4dHNbaV0uYWxyZWFkeU1hdGNoZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICByZXN1bHQgPSB0aGlzLl9tYXRjaFRlcm1pbmFsKHRoaXMuX2VsZW1lbnRNYXAsIGVsZW1lbnQsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8IHJlc3VsdDtcbiAgICByZXN1bHQgPSB0aGlzLl9tYXRjaFBhcnRpYWwodGhpcy5fZWxlbWVudFBhcnRpYWxNYXAsIGVsZW1lbnQsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8XG4gICAgICAgICAgICAgcmVzdWx0O1xuXG4gICAgaWYgKGlzUHJlc2VudChjbGFzc05hbWVzKSkge1xuICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGNsYXNzTmFtZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSBjbGFzc05hbWVzW2luZGV4XTtcbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgIHRoaXMuX21hdGNoVGVybWluYWwodGhpcy5fY2xhc3NNYXAsIGNsYXNzTmFtZSwgY3NzU2VsZWN0b3IsIG1hdGNoZWRDYWxsYmFjaykgfHwgcmVzdWx0O1xuICAgICAgICByZXN1bHQgPVxuICAgICAgICAgICAgdGhpcy5fbWF0Y2hQYXJ0aWFsKHRoaXMuX2NsYXNzUGFydGlhbE1hcCwgY2xhc3NOYW1lLCBjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB8fFxuICAgICAgICAgICAgcmVzdWx0O1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChpc1ByZXNlbnQoYXR0cnMpKSB7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgYXR0cnMubGVuZ3RoOykge1xuICAgICAgICB2YXIgYXR0ck5hbWUgPSBhdHRyc1tpbmRleCsrXTtcbiAgICAgICAgdmFyIGF0dHJWYWx1ZSA9IGF0dHJzW2luZGV4KytdO1xuXG4gICAgICAgIHZhciB0ZXJtaW5hbFZhbHVlc01hcCA9IHRoaXMuX2F0dHJWYWx1ZU1hcC5nZXQoYXR0ck5hbWUpO1xuICAgICAgICBpZiAoIVN0cmluZ1dyYXBwZXIuZXF1YWxzKGF0dHJWYWx1ZSwgX0VNUFRZX0FUVFJfVkFMVUUpKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdGhpcy5fbWF0Y2hUZXJtaW5hbCh0ZXJtaW5hbFZhbHVlc01hcCwgX0VNUFRZX0FUVFJfVkFMVUUsIGNzc1NlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZENhbGxiYWNrKSB8fFxuICAgICAgICAgICAgICAgICAgIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICByZXN1bHQgPSB0aGlzLl9tYXRjaFRlcm1pbmFsKHRlcm1pbmFsVmFsdWVzTWFwLCBhdHRyVmFsdWUsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8XG4gICAgICAgICAgICAgICAgIHJlc3VsdDtcblxuICAgICAgICB2YXIgcGFydGlhbFZhbHVlc01hcCA9IHRoaXMuX2F0dHJWYWx1ZVBhcnRpYWxNYXAuZ2V0KGF0dHJOYW1lKTtcbiAgICAgICAgaWYgKCFTdHJpbmdXcmFwcGVyLmVxdWFscyhhdHRyVmFsdWUsIF9FTVBUWV9BVFRSX1ZBTFVFKSkge1xuICAgICAgICAgIHJlc3VsdCA9IHRoaXMuX21hdGNoUGFydGlhbChwYXJ0aWFsVmFsdWVzTWFwLCBfRU1QVFlfQVRUUl9WQUxVRSwgY3NzU2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRDYWxsYmFjaykgfHxcbiAgICAgICAgICAgICAgICAgICByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0ID1cbiAgICAgICAgICAgIHRoaXMuX21hdGNoUGFydGlhbChwYXJ0aWFsVmFsdWVzTWFwLCBhdHRyVmFsdWUsIGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spIHx8IHJlc3VsdDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21hdGNoVGVybWluYWwobWFwOiBNYXA8c3RyaW5nLCBTZWxlY3RvckNvbnRleHRbXT4sIG5hbWUsIGNzc1NlbGVjdG9yOiBDc3NTZWxlY3RvcixcbiAgICAgICAgICAgICAgICAgbWF0Y2hlZENhbGxiYWNrOiAoYzogQ3NzU2VsZWN0b3IsIGE6IGFueSkgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0JsYW5rKG1hcCkgfHwgaXNCbGFuayhuYW1lKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBzZWxlY3RhYmxlcyA9IG1hcC5nZXQobmFtZSk7XG4gICAgdmFyIHN0YXJTZWxlY3RhYmxlcyA9IG1hcC5nZXQoXCIqXCIpO1xuICAgIGlmIChpc1ByZXNlbnQoc3RhclNlbGVjdGFibGVzKSkge1xuICAgICAgc2VsZWN0YWJsZXMgPSBzZWxlY3RhYmxlcy5jb25jYXQoc3RhclNlbGVjdGFibGVzKTtcbiAgICB9XG4gICAgaWYgKGlzQmxhbmsoc2VsZWN0YWJsZXMpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBzZWxlY3RhYmxlO1xuICAgIHZhciByZXN1bHQgPSBmYWxzZTtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgc2VsZWN0YWJsZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBzZWxlY3RhYmxlID0gc2VsZWN0YWJsZXNbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gc2VsZWN0YWJsZS5maW5hbGl6ZShjc3NTZWxlY3RvciwgbWF0Y2hlZENhbGxiYWNrKSB8fCByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9tYXRjaFBhcnRpYWwobWFwOiBNYXA8c3RyaW5nLCBTZWxlY3Rvck1hdGNoZXI+LCBuYW1lLCBjc3NTZWxlY3RvcjogQ3NzU2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgbWF0Y2hlZENhbGxiYWNrIC8qOiAoYzogQ3NzU2VsZWN0b3IsIGE6IGFueSkgPT4gdm9pZCovKTogYm9vbGVhbiB7XG4gICAgaWYgKGlzQmxhbmsobWFwKSB8fCBpc0JsYW5rKG5hbWUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHZhciBuZXN0ZWRTZWxlY3RvciA9IG1hcC5nZXQobmFtZSk7XG4gICAgaWYgKGlzQmxhbmsobmVzdGVkU2VsZWN0b3IpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIC8vIFRPRE8ocGVyZik6IGdldCByaWQgb2YgcmVjdXJzaW9uIGFuZCBtZWFzdXJlIGFnYWluXG4gICAgLy8gVE9ETyhwZXJmKTogZG9uJ3QgcGFzcyB0aGUgd2hvbGUgc2VsZWN0b3IgaW50byB0aGUgcmVjdXJzaW9uLFxuICAgIC8vIGJ1dCBvbmx5IHRoZSBub3QgcHJvY2Vzc2VkIHBhcnRzXG4gICAgcmV0dXJuIG5lc3RlZFNlbGVjdG9yLm1hdGNoKGNzc1NlbGVjdG9yLCBtYXRjaGVkQ2FsbGJhY2spO1xuICB9XG59XG5cblxuZXhwb3J0IGNsYXNzIFNlbGVjdG9yTGlzdENvbnRleHQge1xuICBhbHJlYWR5TWF0Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzZWxlY3RvcnM6IENzc1NlbGVjdG9yW10pIHt9XG59XG5cbi8vIFN0b3JlIGNvbnRleHQgdG8gcGFzcyBiYWNrIHNlbGVjdG9yIGFuZCBjb250ZXh0IHdoZW4gYSBzZWxlY3RvciBpcyBtYXRjaGVkXG5leHBvcnQgY2xhc3MgU2VsZWN0b3JDb250ZXh0IHtcbiAgbm90U2VsZWN0b3JzOiBDc3NTZWxlY3RvcltdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzZWxlY3RvcjogQ3NzU2VsZWN0b3IsIHB1YmxpYyBjYkNvbnRleHQ6IGFueSxcbiAgICAgICAgICAgICAgcHVibGljIGxpc3RDb250ZXh0OiBTZWxlY3Rvckxpc3RDb250ZXh0KSB7XG4gICAgdGhpcy5ub3RTZWxlY3RvcnMgPSBzZWxlY3Rvci5ub3RTZWxlY3RvcnM7XG4gIH1cblxuICBmaW5hbGl6ZShjc3NTZWxlY3RvcjogQ3NzU2VsZWN0b3IsIGNhbGxiYWNrOiAoYzogQ3NzU2VsZWN0b3IsIGE6IGFueSkgPT4gdm9pZCk6IGJvb2xlYW4ge1xuICAgIHZhciByZXN1bHQgPSB0cnVlO1xuICAgIGlmICh0aGlzLm5vdFNlbGVjdG9ycy5sZW5ndGggPiAwICYmXG4gICAgICAgIChpc0JsYW5rKHRoaXMubGlzdENvbnRleHQpIHx8ICF0aGlzLmxpc3RDb250ZXh0LmFscmVhZHlNYXRjaGVkKSkge1xuICAgICAgdmFyIG5vdE1hdGNoZXIgPSBTZWxlY3Rvck1hdGNoZXIuY3JlYXRlTm90TWF0Y2hlcih0aGlzLm5vdFNlbGVjdG9ycyk7XG4gICAgICByZXN1bHQgPSAhbm90TWF0Y2hlci5tYXRjaChjc3NTZWxlY3RvciwgbnVsbCk7XG4gICAgfVxuICAgIGlmIChyZXN1bHQgJiYgaXNQcmVzZW50KGNhbGxiYWNrKSAmJlxuICAgICAgICAoaXNCbGFuayh0aGlzLmxpc3RDb250ZXh0KSB8fCAhdGhpcy5saXN0Q29udGV4dC5hbHJlYWR5TWF0Y2hlZCkpIHtcbiAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5saXN0Q29udGV4dCkpIHtcbiAgICAgICAgdGhpcy5saXN0Q29udGV4dC5hbHJlYWR5TWF0Y2hlZCA9IHRydWU7XG4gICAgICB9XG4gICAgICBjYWxsYmFjayh0aGlzLnNlbGVjdG9yLCB0aGlzLmNiQ29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9zZWxlY3Rvci50c1xuICoqLyIsImltcG9ydCB7SVNfREFSVCwgU3RyaW5nV3JhcHBlciwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxudmFyIENBTUVMX0NBU0VfUkVHRVhQID0gLyhbQS1aXSkvZztcbnZhciBEQVNIX0NBU0VfUkVHRVhQID0gLy0oW2Etel0pL2c7XG52YXIgU0lOR0xFX1FVT1RFX0VTQ0FQRV9TVFJJTkdfUkUgPSAvJ3xcXFxcfFxcbnxcXHJ8XFwkL2c7XG52YXIgRE9VQkxFX1FVT1RFX0VTQ0FQRV9TVFJJTkdfUkUgPSAvXCJ8XFxcXHxcXG58XFxyfFxcJC9nO1xuXG5leHBvcnQgdmFyIE1PRFVMRV9TVUZGSVggPSBJU19EQVJUID8gJy5kYXJ0JyA6ICcuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FtZWxDYXNlVG9EYXNoQ2FzZShpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChpbnB1dCwgQ0FNRUxfQ0FTRV9SRUdFWFAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0pID0+IHsgcmV0dXJuICctJyArIG1bMV0udG9Mb3dlckNhc2UoKTsgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYXNoQ2FzZVRvQ2FtZWxDYXNlKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsTWFwcGVkKGlucHV0LCBEQVNIX0NBU0VfUkVHRVhQLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtKSA9PiB7IHJldHVybiBtWzFdLnRvVXBwZXJDYXNlKCk7IH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXNjYXBlU2luZ2xlUXVvdGVTdHJpbmcoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpc0JsYW5rKGlucHV0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHJldHVybiBgJyR7ZXNjYXBlU3RyaW5nKGlucHV0LCBTSU5HTEVfUVVPVEVfRVNDQVBFX1NUUklOR19SRSl9J2A7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBlc2NhcGVEb3VibGVRdW90ZVN0cmluZyhpbnB1dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKGlzQmxhbmsoaW5wdXQpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgcmV0dXJuIGBcIiR7ZXNjYXBlU3RyaW5nKGlucHV0LCBET1VCTEVfUVVPVEVfRVNDQVBFX1NUUklOR19SRSl9XCJgO1xufVxuXG5mdW5jdGlvbiBlc2NhcGVTdHJpbmcoaW5wdXQ6IHN0cmluZywgcmU6IFJlZ0V4cCk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQoaW5wdXQsIHJlLCAobWF0Y2gpID0+IHtcbiAgICBpZiAobWF0Y2hbMF0gPT0gJyQnKSB7XG4gICAgICByZXR1cm4gSVNfREFSVCA/ICdcXFxcJCcgOiAnJCc7XG4gICAgfSBlbHNlIGlmIChtYXRjaFswXSA9PSAnXFxuJykge1xuICAgICAgcmV0dXJuICdcXFxcbic7XG4gICAgfSBlbHNlIGlmIChtYXRjaFswXSA9PSAnXFxyJykge1xuICAgICAgcmV0dXJuICdcXFxccic7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgXFxcXCR7bWF0Y2hbMF19YDtcbiAgICB9XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29kZUdlbkV4cG9ydFZhcmlhYmxlKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChJU19EQVJUKSB7XG4gICAgcmV0dXJuIGBjb25zdCAke25hbWV9ID0gYDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYHZhciAke25hbWV9ID0gZXhwb3J0c1snJHtuYW1lfSddID0gYDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29kZUdlbkNvbnN0Q29uc3RydWN0b3JDYWxsKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChJU19EQVJUKSB7XG4gICAgcmV0dXJuIGBjb25zdCAke25hbWV9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYG5ldyAke25hbWV9YDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29kZUdlblZhbHVlRm4ocGFyYW1zOiBzdHJpbmdbXSwgdmFsdWU6IHN0cmluZywgZm5OYW1lOiBzdHJpbmcgPSAnJyk6IHN0cmluZyB7XG4gIGlmIChJU19EQVJUKSB7XG4gICAgcmV0dXJuIGAke2ZuTmFtZX0oJHtwYXJhbXMuam9pbignLCcpfSkgPT4gJHt2YWx1ZX1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgZnVuY3Rpb24gJHtmbk5hbWV9KCR7cGFyYW1zLmpvaW4oJywnKX0pIHsgcmV0dXJuICR7dmFsdWV9OyB9YDtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29kZUdlblRvU3RyaW5nKGV4cHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChJU19EQVJUKSB7XG4gICAgcmV0dXJuIGAnXFwkeyR7ZXhwcn19J2A7XG4gIH0gZWxzZSB7XG4gICAgLy8gSlMgYXV0b21hdGljYWxseSBjb252ZXRzIHRvIHN0cmluZy4uLlxuICAgIHJldHVybiBleHByO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdEF0Q29sb24oaW5wdXQ6IHN0cmluZywgZGVmYXVsdFZhbHVlczogc3RyaW5nW10pOiBzdHJpbmdbXSB7XG4gIHZhciBwYXJ0cyA9IFN0cmluZ1dyYXBwZXIuc3BsaXQoaW5wdXQudHJpbSgpLCAvXFxzKjpcXHMqL2cpO1xuICBpZiAocGFydHMubGVuZ3RoID4gMSkge1xuICAgIHJldHVybiBwYXJ0cztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlcztcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3V0aWwudHNcbiAqKi8iLCJpbXBvcnQge1N0cmluZ1dyYXBwZXIsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbnZhciBNT0RVTEVfUkVHRVhQID0gLyNNT0RVTEVcXFsoW15cXF1dKilcXF0vZztcblxuZXhwb3J0IGZ1bmN0aW9uIG1vZHVsZVJlZihtb2R1bGVVcmwpOiBzdHJpbmcge1xuICByZXR1cm4gYCNNT0RVTEVbJHttb2R1bGVVcmx9XWA7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBnZW5lcmF0ZWQgc291cmNlIGNvZGUgd2l0aCBtb2R1bGUgcmVmZXJlbmNlcy4gSW50ZXJuYWwgdG8gdGhlIEFuZ3VsYXIgY29tcGlsZXIuXG4gKi9cbmV4cG9ydCBjbGFzcyBTb3VyY2VNb2R1bGUge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbW9kdWxlVXJsOiBzdHJpbmcsIHB1YmxpYyBzb3VyY2VXaXRoTW9kdWxlUmVmczogc3RyaW5nKSB7fVxuXG4gIGdldFNvdXJjZVdpdGhJbXBvcnRzKCk6IFNvdXJjZVdpdGhJbXBvcnRzIHtcbiAgICB2YXIgbW9kdWxlQWxpYXNlcyA9IHt9O1xuICAgIHZhciBpbXBvcnRzOiBzdHJpbmdbXVtdID0gW107XG4gICAgdmFyIG5ld1NvdXJjZSA9XG4gICAgICAgIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZCh0aGlzLnNvdXJjZVdpdGhNb2R1bGVSZWZzLCBNT0RVTEVfUkVHRVhQLCAobWF0Y2gpID0+IHtcbiAgICAgICAgICB2YXIgbW9kdWxlVXJsID0gbWF0Y2hbMV07XG4gICAgICAgICAgdmFyIGFsaWFzID0gbW9kdWxlQWxpYXNlc1ttb2R1bGVVcmxdO1xuICAgICAgICAgIGlmIChpc0JsYW5rKGFsaWFzKSkge1xuICAgICAgICAgICAgaWYgKG1vZHVsZVVybCA9PSB0aGlzLm1vZHVsZVVybCkge1xuICAgICAgICAgICAgICBhbGlhcyA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgYWxpYXMgPSBgaW1wb3J0JHtpbXBvcnRzLmxlbmd0aH1gO1xuICAgICAgICAgICAgICBpbXBvcnRzLnB1c2goW21vZHVsZVVybCwgYWxpYXNdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vZHVsZUFsaWFzZXNbbW9kdWxlVXJsXSA9IGFsaWFzO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gYWxpYXMubGVuZ3RoID4gMCA/IGAke2FsaWFzfS5gIDogJyc7XG4gICAgICAgIH0pO1xuICAgIHJldHVybiBuZXcgU291cmNlV2l0aEltcG9ydHMobmV3U291cmNlLCBpbXBvcnRzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU291cmNlRXhwcmVzc2lvbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBkZWNsYXJhdGlvbnM6IHN0cmluZ1tdLCBwdWJsaWMgZXhwcmVzc2lvbjogc3RyaW5nKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgU291cmNlRXhwcmVzc2lvbnMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGVjbGFyYXRpb25zOiBzdHJpbmdbXSwgcHVibGljIGV4cHJlc3Npb25zOiBzdHJpbmdbXSkge31cbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGdlbmVyYXRlZCBzb3VyY2UgY29kZSB3aXRoIGltcG9ydHMuIEludGVybmFsIHRvIHRoZSBBbmd1bGFyIGNvbXBpbGVyLlxuICovXG5leHBvcnQgY2xhc3MgU291cmNlV2l0aEltcG9ydHMge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgc291cmNlOiBzdHJpbmcsIHB1YmxpYyBpbXBvcnRzOiBzdHJpbmdbXVtdKSB7fVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NvdXJjZV9tb2R1bGUudHNcbiAqKi8iLCJpbXBvcnQge0NvbXBpbGVUeXBlTWV0YWRhdGF9IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7U291cmNlRXhwcmVzc2lvbnMsIG1vZHVsZVJlZn0gZnJvbSAnLi9zb3VyY2VfbW9kdWxlJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbl9qaXRfZ2VuZXJhdG9yJztcblxuaW1wb3J0IHtjcmVhdGVDaGFuZ2VEZXRlY3RvckRlZmluaXRpb25zfSBmcm9tICcuL2NoYW5nZV9kZWZpbml0aW9uX2ZhY3RvcnknO1xuaW1wb3J0IHtJU19EQVJULCBpc0pzT2JqZWN0LCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZyxcbiAgQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uLFxuICBEeW5hbWljUHJvdG9DaGFuZ2VEZXRlY3RvcixcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3lcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcblxuaW1wb3J0IHtUZW1wbGF0ZUFzdH0gZnJvbSAnLi90ZW1wbGF0ZV9hc3QnO1xuaW1wb3J0IHtDb2RlZ2VufSBmcm9tICdhbmd1bGFyMi9zcmMvdHJhbnNmb3JtL3RlbXBsYXRlX2NvbXBpbGVyL2NoYW5nZV9kZXRlY3Rvcl9jb2RlZ2VuJztcbmltcG9ydCB7TU9EVUxFX1NVRkZJWH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuXG5jb25zdCBBQlNUUkFDVF9DSEFOR0VfREVURUNUT1IgPSBcIkFic3RyYWN0Q2hhbmdlRGV0ZWN0b3JcIjtcbmNvbnN0IFVUSUwgPSBcIkNoYW5nZURldGVjdGlvblV0aWxcIjtcbmNvbnN0IENIQU5HRV9ERVRFQ1RPUl9TVEFURSA9IFwiQ2hhbmdlRGV0ZWN0b3JTdGF0ZVwiO1xuXG52YXIgQUJTVFJBQ1RfQ0hBTkdFX0RFVEVDVE9SX01PRFVMRSA9IG1vZHVsZVJlZihcbiAgICBgcGFja2FnZTphbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2Fic3RyYWN0X2NoYW5nZV9kZXRlY3RvciR7TU9EVUxFX1NVRkZJWH1gKTtcbnZhciBVVElMX01PRFVMRSA9XG4gICAgbW9kdWxlUmVmKGBwYWNrYWdlOmFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbl91dGlsJHtNT0RVTEVfU1VGRklYfWApO1xudmFyIFBSRUdFTl9QUk9UT19DSEFOR0VfREVURUNUT1JfTU9EVUxFID0gbW9kdWxlUmVmKFxuICAgIGBwYWNrYWdlOmFuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vcHJlZ2VuX3Byb3RvX2NoYW5nZV9kZXRlY3RvciR7TU9EVUxFX1NVRkZJWH1gKTtcbnZhciBDT05TVEFOVFNfTU9EVUxFID1cbiAgICBtb2R1bGVSZWYoYHBhY2thZ2U6YW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jb25zdGFudHMke01PRFVMRV9TVUZGSVh9YCk7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDaGFuZ2VEZXRlY3Rpb25Db21waWxlciB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2dlbkNvbmZpZzogQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcpIHt9XG5cbiAgY29tcGlsZUNvbXBvbmVudFJ1bnRpbWUoY29tcG9uZW50VHlwZTogQ29tcGlsZVR5cGVNZXRhZGF0YSwgc3RyYXRlZ3k6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRUZW1wbGF0ZTogVGVtcGxhdGVBc3RbXSk6IEZ1bmN0aW9uW10ge1xuICAgIHZhciBjaGFuZ2VEZXRlY3RvckRlZmluaXRpb25zID1cbiAgICAgICAgY3JlYXRlQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9ucyhjb21wb25lbnRUeXBlLCBzdHJhdGVneSwgdGhpcy5fZ2VuQ29uZmlnLCBwYXJzZWRUZW1wbGF0ZSk7XG4gICAgcmV0dXJuIGNoYW5nZURldGVjdG9yRGVmaW5pdGlvbnMubWFwKGRlZmluaXRpb24gPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUNoYW5nZURldGVjdG9yRmFjdG9yeShkZWZpbml0aW9uKSk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVDaGFuZ2VEZXRlY3RvckZhY3RvcnkoZGVmaW5pdGlvbjogQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uKTogRnVuY3Rpb24ge1xuICAgIGlmIChJU19EQVJUIHx8ICF0aGlzLl9nZW5Db25maWcudXNlSml0KSB7XG4gICAgICB2YXIgcHJvdG8gPSBuZXcgRHluYW1pY1Byb3RvQ2hhbmdlRGV0ZWN0b3IoZGVmaW5pdGlvbik7XG4gICAgICByZXR1cm4gKGRpc3BhdGNoZXIpID0+IHByb3RvLmluc3RhbnRpYXRlKGRpc3BhdGNoZXIpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IENoYW5nZURldGVjdG9ySklUR2VuZXJhdG9yKGRlZmluaXRpb24sIFVUSUwsIEFCU1RSQUNUX0NIQU5HRV9ERVRFQ1RPUixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hBTkdFX0RFVEVDVE9SX1NUQVRFKVxuICAgICAgICAgIC5nZW5lcmF0ZSgpO1xuICAgIH1cbiAgfVxuXG4gIGNvbXBpbGVDb21wb25lbnRDb2RlR2VuKGNvbXBvbmVudFR5cGU6IENvbXBpbGVUeXBlTWV0YWRhdGEsIHN0cmF0ZWd5OiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkVGVtcGxhdGU6IFRlbXBsYXRlQXN0W10pOiBTb3VyY2VFeHByZXNzaW9ucyB7XG4gICAgdmFyIGNoYW5nZURldGVjdG9yRGVmaW5pdGlvbnMgPVxuICAgICAgICBjcmVhdGVDaGFuZ2VEZXRlY3RvckRlZmluaXRpb25zKGNvbXBvbmVudFR5cGUsIHN0cmF0ZWd5LCB0aGlzLl9nZW5Db25maWcsIHBhcnNlZFRlbXBsYXRlKTtcbiAgICB2YXIgZmFjdG9yaWVzID0gW107XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgc291cmNlUGFydHMgPSBjaGFuZ2VEZXRlY3RvckRlZmluaXRpb25zLm1hcChkZWZpbml0aW9uID0+IHtcbiAgICAgIHZhciBjb2RlZ2VuOiBhbnk7XG4gICAgICB2YXIgc291cmNlUGFydDogc3RyaW5nO1xuICAgICAgLy8gVE9ETyh0Ym9zY2gpOiBtb3ZlIHRoZSAyIGNvZGUgZ2VuZXJhdG9ycyB0byB0aGUgc2FtZSBwbGFjZSwgb25lIHdpdGggLmRhcnQgYW5kIG9uZSB3aXRoIC50c1xuICAgICAgLy8gc3VmZml4XG4gICAgICAvLyBhbmQgaGF2ZSB0aGUgc2FtZSBBUEkgZm9yIGNhbGxpbmcgdGhlbSFcbiAgICAgIGlmIChJU19EQVJUKSB7XG4gICAgICAgIGNvZGVnZW4gPSBuZXcgQ29kZWdlbihQUkVHRU5fUFJPVE9fQ0hBTkdFX0RFVEVDVE9SX01PRFVMRSk7XG4gICAgICAgIHZhciBjbGFzc05hbWUgPSBgXyR7ZGVmaW5pdGlvbi5pZH1gO1xuICAgICAgICB2YXIgdHlwZVJlZiA9IChpbmRleCA9PT0gMCAmJiBjb21wb25lbnRUeXBlLmlzSG9zdCkgP1xuICAgICAgICAgICAgICAgICAgICAgICAgICAnZHluYW1pYycgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICBgJHttb2R1bGVSZWYoY29tcG9uZW50VHlwZS5tb2R1bGVVcmwpfSR7Y29tcG9uZW50VHlwZS5uYW1lfWA7XG4gICAgICAgIGNvZGVnZW4uZ2VuZXJhdGUodHlwZVJlZiwgY2xhc3NOYW1lLCBkZWZpbml0aW9uKTtcbiAgICAgICAgZmFjdG9yaWVzLnB1c2goYCR7Y2xhc3NOYW1lfS5uZXdDaGFuZ2VEZXRlY3RvcmApO1xuICAgICAgICBzb3VyY2VQYXJ0ID0gY29kZWdlbi50b1N0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29kZWdlbiA9IG5ldyBDaGFuZ2VEZXRlY3RvckpJVEdlbmVyYXRvcihcbiAgICAgICAgICAgIGRlZmluaXRpb24sIGAke1VUSUxfTU9EVUxFfSR7VVRJTH1gLFxuICAgICAgICAgICAgYCR7QUJTVFJBQ1RfQ0hBTkdFX0RFVEVDVE9SX01PRFVMRX0ke0FCU1RSQUNUX0NIQU5HRV9ERVRFQ1RPUn1gLFxuICAgICAgICAgICAgYCR7Q09OU1RBTlRTX01PRFVMRX0ke0NIQU5HRV9ERVRFQ1RPUl9TVEFURX1gKTtcbiAgICAgICAgZmFjdG9yaWVzLnB1c2goYGZ1bmN0aW9uKGRpc3BhdGNoZXIpIHsgcmV0dXJuIG5ldyAke2NvZGVnZW4udHlwZU5hbWV9KGRpc3BhdGNoZXIpOyB9YCk7XG4gICAgICAgIHNvdXJjZVBhcnQgPSBjb2RlZ2VuLmdlbmVyYXRlU291cmNlKCk7XG4gICAgICB9XG4gICAgICBpbmRleCsrO1xuICAgICAgcmV0dXJuIHNvdXJjZVBhcnQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VFeHByZXNzaW9ucyhzb3VyY2VQYXJ0cywgZmFjdG9yaWVzKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NoYW5nZV9kZXRlY3Rvcl9jb21waWxlci50c1xuICoqLyIsImltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge2lzUHJlc2VudCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7cmVmbGVjdG9yfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZWZsZWN0aW9uL3JlZmxlY3Rpb24nO1xuXG5pbXBvcnQge1xuICBEaXJlY3RpdmVJbmRleCxcbiAgQmluZGluZ1JlY29yZCxcbiAgRGlyZWN0aXZlUmVjb3JkLFxuICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uLFxuICBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZyxcbiAgQVNUV2l0aFNvdXJjZVxufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb24nO1xuXG5pbXBvcnQge0NvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSwgQ29tcGlsZVR5cGVNZXRhZGF0YX0gZnJvbSAnLi9kaXJlY3RpdmVfbWV0YWRhdGEnO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVBc3QsXG4gIEVsZW1lbnRBc3QsXG4gIEJvdW5kVGV4dEFzdCxcbiAgUHJvcGVydHlCaW5kaW5nVHlwZSxcbiAgRGlyZWN0aXZlQXN0LFxuICBUZW1wbGF0ZUFzdFZpc2l0b3IsXG4gIHRlbXBsYXRlVmlzaXRBbGwsXG4gIE5nQ29udGVudEFzdCxcbiAgRW1iZWRkZWRUZW1wbGF0ZUFzdCxcbiAgVmFyaWFibGVBc3QsXG4gIEJvdW5kRWxlbWVudFByb3BlcnR5QXN0LFxuICBCb3VuZEV2ZW50QXN0LFxuICBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LFxuICBBdHRyQXN0LFxuICBUZXh0QXN0XG59IGZyb20gJy4vdGVtcGxhdGVfYXN0JztcbmltcG9ydCB7TGlmZWN5Y2xlSG9va3N9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNoYW5nZURldGVjdG9yRGVmaW5pdGlvbnMoXG4gICAgY29tcG9uZW50VHlwZTogQ29tcGlsZVR5cGVNZXRhZGF0YSwgY29tcG9uZW50U3RyYXRlZ3k6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIGdlbkNvbmZpZzogQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcsIHBhcnNlZFRlbXBsYXRlOiBUZW1wbGF0ZUFzdFtdKTogQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uW10ge1xuICB2YXIgcHZWaXNpdG9ycyA9IFtdO1xuICB2YXIgdmlzaXRvciA9IG5ldyBQcm90b1ZpZXdWaXNpdG9yKG51bGwsIHB2VmlzaXRvcnMsIGNvbXBvbmVudFN0cmF0ZWd5KTtcbiAgdGVtcGxhdGVWaXNpdEFsbCh2aXNpdG9yLCBwYXJzZWRUZW1wbGF0ZSk7XG4gIHJldHVybiBjcmVhdGVDaGFuZ2VEZWZpbml0aW9ucyhwdlZpc2l0b3JzLCBjb21wb25lbnRUeXBlLCBnZW5Db25maWcpO1xufVxuXG5jbGFzcyBQcm90b1ZpZXdWaXNpdG9yIGltcGxlbWVudHMgVGVtcGxhdGVBc3RWaXNpdG9yIHtcbiAgdmlld0luZGV4OiBudW1iZXI7XG4gIGJvdW5kVGV4dENvdW50OiBudW1iZXIgPSAwO1xuICBib3VuZEVsZW1lbnRDb3VudDogbnVtYmVyID0gMDtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW10gPSBbXTtcbiAgYmluZGluZ1JlY29yZHM6IEJpbmRpbmdSZWNvcmRbXSA9IFtdO1xuICBldmVudFJlY29yZHM6IEJpbmRpbmdSZWNvcmRbXSA9IFtdO1xuICBkaXJlY3RpdmVSZWNvcmRzOiBEaXJlY3RpdmVSZWNvcmRbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXJlbnQ6IFByb3RvVmlld1Zpc2l0b3IsIHB1YmxpYyBhbGxWaXNpdG9yczogUHJvdG9WaWV3VmlzaXRvcltdLFxuICAgICAgICAgICAgICBwdWJsaWMgc3RyYXRlZ3k6IENoYW5nZURldGVjdGlvblN0cmF0ZWd5KSB7XG4gICAgdGhpcy52aWV3SW5kZXggPSBhbGxWaXNpdG9ycy5sZW5ndGg7XG4gICAgYWxsVmlzaXRvcnMucHVzaCh0aGlzKTtcbiAgfVxuXG4gIHZpc2l0RW1iZWRkZWRUZW1wbGF0ZShhc3Q6IEVtYmVkZGVkVGVtcGxhdGVBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdGhpcy5ib3VuZEVsZW1lbnRDb3VudCsrO1xuICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0Lm91dHB1dHMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXN0LmRpcmVjdGl2ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGFzdC5kaXJlY3RpdmVzW2ldLnZpc2l0KHRoaXMsIGkpO1xuICAgIH1cblxuICAgIHZhciBjaGlsZFZpc2l0b3IgPVxuICAgICAgICBuZXcgUHJvdG9WaWV3VmlzaXRvcih0aGlzLCB0aGlzLmFsbFZpc2l0b3JzLCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0KTtcbiAgICAvLyBBdHRlbnRpb246IHZhcmlhYmxlcyBwcmVzZW50IG9uIGFuIGVtYmVkZGVkIHRlbXBsYXRlIGNvdW50IHRvd2FyZHNcbiAgICAvLyB0aGUgZW1iZWRkZWQgdGVtcGxhdGUgYW5kIG5vdCB0aGUgdGVtcGxhdGUgYW5jaG9yIVxuICAgIHRlbXBsYXRlVmlzaXRBbGwoY2hpbGRWaXNpdG9yLCBhc3QudmFycyk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbChjaGlsZFZpc2l0b3IsIGFzdC5jaGlsZHJlbik7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2aXNpdEVsZW1lbnQoYXN0OiBFbGVtZW50QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIGlmIChhc3QuaXNCb3VuZCgpKSB7XG4gICAgICB0aGlzLmJvdW5kRWxlbWVudENvdW50Kys7XG4gICAgfVxuICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0LmlucHV0cywgbnVsbCk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3Qub3V0cHV0cyk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3QuZXhwb3J0QXNWYXJzKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFzdC5kaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhc3QuZGlyZWN0aXZlc1tpXS52aXNpdCh0aGlzLCBpKTtcbiAgICB9XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3QuY2hpbGRyZW4pO1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmlzaXROZ0NvbnRlbnQoYXN0OiBOZ0NvbnRlbnRBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiBudWxsOyB9XG5cbiAgdmlzaXRWYXJpYWJsZShhc3Q6IFZhcmlhYmxlQXN0LCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKGFzdC5uYW1lKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZpc2l0RXZlbnQoYXN0OiBCb3VuZEV2ZW50QXN0LCBkaXJlY3RpdmVSZWNvcmQ6IERpcmVjdGl2ZVJlY29yZCk6IGFueSB7XG4gICAgdmFyIGJpbmRpbmdSZWNvcmQgPVxuICAgICAgICBpc1ByZXNlbnQoZGlyZWN0aXZlUmVjb3JkKSA/XG4gICAgICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckhvc3RFdmVudChhc3QuaGFuZGxlciwgYXN0LmZ1bGxOYW1lLCBkaXJlY3RpdmVSZWNvcmQpIDpcbiAgICAgICAgICAgIEJpbmRpbmdSZWNvcmQuY3JlYXRlRm9yRXZlbnQoYXN0LmhhbmRsZXIsIGFzdC5mdWxsTmFtZSwgdGhpcy5ib3VuZEVsZW1lbnRDb3VudCAtIDEpO1xuICAgIHRoaXMuZXZlbnRSZWNvcmRzLnB1c2goYmluZGluZ1JlY29yZCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICB2aXNpdEVsZW1lbnRQcm9wZXJ0eShhc3Q6IEJvdW5kRWxlbWVudFByb3BlcnR5QXN0LCBkaXJlY3RpdmVSZWNvcmQ6IERpcmVjdGl2ZVJlY29yZCk6IGFueSB7XG4gICAgdmFyIGJvdW5kRWxlbWVudEluZGV4ID0gdGhpcy5ib3VuZEVsZW1lbnRDb3VudCAtIDE7XG4gICAgdmFyIGRpckluZGV4ID0gaXNQcmVzZW50KGRpcmVjdGl2ZVJlY29yZCkgPyBkaXJlY3RpdmVSZWNvcmQuZGlyZWN0aXZlSW5kZXggOiBudWxsO1xuICAgIHZhciBiaW5kaW5nUmVjb3JkO1xuICAgIGlmIChhc3QudHlwZSA9PT0gUHJvcGVydHlCaW5kaW5nVHlwZS5Qcm9wZXJ0eSkge1xuICAgICAgYmluZGluZ1JlY29yZCA9XG4gICAgICAgICAgaXNQcmVzZW50KGRpckluZGV4KSA/XG4gICAgICAgICAgICAgIEJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdFByb3BlcnR5KGRpckluZGV4LCBhc3QudmFsdWUsIGFzdC5uYW1lKSA6XG4gICAgICAgICAgICAgIEJpbmRpbmdSZWNvcmQuY3JlYXRlRm9yRWxlbWVudFByb3BlcnR5KGFzdC52YWx1ZSwgYm91bmRFbGVtZW50SW5kZXgsIGFzdC5uYW1lKTtcbiAgICB9IGVsc2UgaWYgKGFzdC50eXBlID09PSBQcm9wZXJ0eUJpbmRpbmdUeXBlLkF0dHJpYnV0ZSkge1xuICAgICAgYmluZGluZ1JlY29yZCA9XG4gICAgICAgICAgaXNQcmVzZW50KGRpckluZGV4KSA/XG4gICAgICAgICAgICAgIEJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdEF0dHJpYnV0ZShkaXJJbmRleCwgYXN0LnZhbHVlLCBhc3QubmFtZSkgOlxuICAgICAgICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckVsZW1lbnRBdHRyaWJ1dGUoYXN0LnZhbHVlLCBib3VuZEVsZW1lbnRJbmRleCwgYXN0Lm5hbWUpO1xuICAgIH0gZWxzZSBpZiAoYXN0LnR5cGUgPT09IFByb3BlcnR5QmluZGluZ1R5cGUuQ2xhc3MpIHtcbiAgICAgIGJpbmRpbmdSZWNvcmQgPVxuICAgICAgICAgIGlzUHJlc2VudChkaXJJbmRleCkgP1xuICAgICAgICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckhvc3RDbGFzcyhkaXJJbmRleCwgYXN0LnZhbHVlLCBhc3QubmFtZSkgOlxuICAgICAgICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckVsZW1lbnRDbGFzcyhhc3QudmFsdWUsIGJvdW5kRWxlbWVudEluZGV4LCBhc3QubmFtZSk7XG4gICAgfSBlbHNlIGlmIChhc3QudHlwZSA9PT0gUHJvcGVydHlCaW5kaW5nVHlwZS5TdHlsZSkge1xuICAgICAgYmluZGluZ1JlY29yZCA9XG4gICAgICAgICAgaXNQcmVzZW50KGRpckluZGV4KSA/XG4gICAgICAgICAgICAgIEJpbmRpbmdSZWNvcmQuY3JlYXRlRm9ySG9zdFN0eWxlKGRpckluZGV4LCBhc3QudmFsdWUsIGFzdC5uYW1lLCBhc3QudW5pdCkgOlxuICAgICAgICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckVsZW1lbnRTdHlsZShhc3QudmFsdWUsIGJvdW5kRWxlbWVudEluZGV4LCBhc3QubmFtZSwgYXN0LnVuaXQpO1xuICAgIH1cbiAgICB0aGlzLmJpbmRpbmdSZWNvcmRzLnB1c2goYmluZGluZ1JlY29yZCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRBdHRyKGFzdDogQXR0ckFzdCwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIG51bGw7IH1cbiAgdmlzaXRCb3VuZFRleHQoYXN0OiBCb3VuZFRleHRBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdmFyIGJvdW5kVGV4dEluZGV4ID0gdGhpcy5ib3VuZFRleHRDb3VudCsrO1xuICAgIHRoaXMuYmluZGluZ1JlY29yZHMucHVzaChCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvclRleHROb2RlKGFzdC52YWx1ZSwgYm91bmRUZXh0SW5kZXgpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdFRleHQoYXN0OiBUZXh0QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxuICB2aXNpdERpcmVjdGl2ZShhc3Q6IERpcmVjdGl2ZUFzdCwgZGlyZWN0aXZlSW5kZXhBc051bWJlcjogbnVtYmVyKTogYW55IHtcbiAgICB2YXIgZGlyZWN0aXZlSW5kZXggPSBuZXcgRGlyZWN0aXZlSW5kZXgodGhpcy5ib3VuZEVsZW1lbnRDb3VudCAtIDEsIGRpcmVjdGl2ZUluZGV4QXNOdW1iZXIpO1xuICAgIHZhciBkaXJlY3RpdmVNZXRhZGF0YSA9IGFzdC5kaXJlY3RpdmU7XG4gICAgdmFyIGRpcmVjdGl2ZVJlY29yZCA9IG5ldyBEaXJlY3RpdmVSZWNvcmQoe1xuICAgICAgZGlyZWN0aXZlSW5kZXg6IGRpcmVjdGl2ZUluZGV4LFxuICAgICAgY2FsbEFmdGVyQ29udGVudEluaXQ6XG4gICAgICAgICAgZGlyZWN0aXZlTWV0YWRhdGEubGlmZWN5Y2xlSG9va3MuaW5kZXhPZihMaWZlY3ljbGVIb29rcy5BZnRlckNvbnRlbnRJbml0KSAhPT0gLTEsXG4gICAgICBjYWxsQWZ0ZXJDb250ZW50Q2hlY2tlZDpcbiAgICAgICAgICBkaXJlY3RpdmVNZXRhZGF0YS5saWZlY3ljbGVIb29rcy5pbmRleE9mKExpZmVjeWNsZUhvb2tzLkFmdGVyQ29udGVudENoZWNrZWQpICE9PSAtMSxcbiAgICAgIGNhbGxBZnRlclZpZXdJbml0OlxuICAgICAgICAgIGRpcmVjdGl2ZU1ldGFkYXRhLmxpZmVjeWNsZUhvb2tzLmluZGV4T2YoTGlmZWN5Y2xlSG9va3MuQWZ0ZXJWaWV3SW5pdCkgIT09IC0xLFxuICAgICAgY2FsbEFmdGVyVmlld0NoZWNrZWQ6XG4gICAgICAgICAgZGlyZWN0aXZlTWV0YWRhdGEubGlmZWN5Y2xlSG9va3MuaW5kZXhPZihMaWZlY3ljbGVIb29rcy5BZnRlclZpZXdDaGVja2VkKSAhPT0gLTEsXG4gICAgICBjYWxsT25DaGFuZ2VzOiBkaXJlY3RpdmVNZXRhZGF0YS5saWZlY3ljbGVIb29rcy5pbmRleE9mKExpZmVjeWNsZUhvb2tzLk9uQ2hhbmdlcykgIT09IC0xLFxuICAgICAgY2FsbERvQ2hlY2s6IGRpcmVjdGl2ZU1ldGFkYXRhLmxpZmVjeWNsZUhvb2tzLmluZGV4T2YoTGlmZWN5Y2xlSG9va3MuRG9DaGVjaykgIT09IC0xLFxuICAgICAgY2FsbE9uSW5pdDogZGlyZWN0aXZlTWV0YWRhdGEubGlmZWN5Y2xlSG9va3MuaW5kZXhPZihMaWZlY3ljbGVIb29rcy5PbkluaXQpICE9PSAtMSxcbiAgICAgIGNoYW5nZURldGVjdGlvbjogZGlyZWN0aXZlTWV0YWRhdGEuY2hhbmdlRGV0ZWN0aW9uXG4gICAgfSk7XG4gICAgdGhpcy5kaXJlY3RpdmVSZWNvcmRzLnB1c2goZGlyZWN0aXZlUmVjb3JkKTtcblxuICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0LmlucHV0cywgZGlyZWN0aXZlUmVjb3JkKTtcbiAgICB2YXIgYmluZGluZ1JlY29yZHMgPSB0aGlzLmJpbmRpbmdSZWNvcmRzO1xuICAgIGlmIChkaXJlY3RpdmVSZWNvcmQuY2FsbE9uQ2hhbmdlcykge1xuICAgICAgYmluZGluZ1JlY29yZHMucHVzaChCaW5kaW5nUmVjb3JkLmNyZWF0ZURpcmVjdGl2ZU9uQ2hhbmdlcyhkaXJlY3RpdmVSZWNvcmQpKTtcbiAgICB9XG4gICAgaWYgKGRpcmVjdGl2ZVJlY29yZC5jYWxsT25Jbml0KSB7XG4gICAgICBiaW5kaW5nUmVjb3Jkcy5wdXNoKEJpbmRpbmdSZWNvcmQuY3JlYXRlRGlyZWN0aXZlT25Jbml0KGRpcmVjdGl2ZVJlY29yZCkpO1xuICAgIH1cbiAgICBpZiAoZGlyZWN0aXZlUmVjb3JkLmNhbGxEb0NoZWNrKSB7XG4gICAgICBiaW5kaW5nUmVjb3Jkcy5wdXNoKEJpbmRpbmdSZWNvcmQuY3JlYXRlRGlyZWN0aXZlRG9DaGVjayhkaXJlY3RpdmVSZWNvcmQpKTtcbiAgICB9XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3QuaG9zdFByb3BlcnRpZXMsIGRpcmVjdGl2ZVJlY29yZCk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3QuaG9zdEV2ZW50cywgZGlyZWN0aXZlUmVjb3JkKTtcbiAgICB0ZW1wbGF0ZVZpc2l0QWxsKHRoaXMsIGFzdC5leHBvcnRBc1ZhcnMpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RGlyZWN0aXZlUHJvcGVydHkoYXN0OiBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LCBkaXJlY3RpdmVSZWNvcmQ6IERpcmVjdGl2ZVJlY29yZCk6IGFueSB7XG4gICAgLy8gVE9ETzogdGhlc2Ugc2V0dGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBjcmVhdGVkIGJ5IGNoYW5nZSBkZXRlY3Rpb24sIHRvIG1ha2VcbiAgICAvLyBpdCBtb25vbW9ycGhpYyFcbiAgICB2YXIgc2V0dGVyID0gcmVmbGVjdG9yLnNldHRlcihhc3QuZGlyZWN0aXZlTmFtZSk7XG4gICAgdGhpcy5iaW5kaW5nUmVjb3Jkcy5wdXNoKFxuICAgICAgICBCaW5kaW5nUmVjb3JkLmNyZWF0ZUZvckRpcmVjdGl2ZShhc3QudmFsdWUsIGFzdC5kaXJlY3RpdmVOYW1lLCBzZXR0ZXIsIGRpcmVjdGl2ZVJlY29yZCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cblxuZnVuY3Rpb24gY3JlYXRlQ2hhbmdlRGVmaW5pdGlvbnMocHZWaXNpdG9yczogUHJvdG9WaWV3VmlzaXRvcltdLCBjb21wb25lbnRUeXBlOiBDb21waWxlVHlwZU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuQ29uZmlnOiBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZyk6IENoYW5nZURldGVjdG9yRGVmaW5pdGlvbltdIHtcbiAgdmFyIHB2VmFyaWFibGVOYW1lcyA9IF9jb2xsZWN0TmVzdGVkUHJvdG9WaWV3c1ZhcmlhYmxlTmFtZXMocHZWaXNpdG9ycyk7XG4gIHJldHVybiBwdlZpc2l0b3JzLm1hcChwdlZpc2l0b3IgPT4ge1xuICAgIHZhciBpZCA9IGAke2NvbXBvbmVudFR5cGUubmFtZX1fJHtwdlZpc2l0b3Iudmlld0luZGV4fWA7XG4gICAgcmV0dXJuIG5ldyBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24oXG4gICAgICAgIGlkLCBwdlZpc2l0b3Iuc3RyYXRlZ3ksIHB2VmFyaWFibGVOYW1lc1twdlZpc2l0b3Iudmlld0luZGV4XSwgcHZWaXNpdG9yLmJpbmRpbmdSZWNvcmRzLFxuICAgICAgICBwdlZpc2l0b3IuZXZlbnRSZWNvcmRzLCBwdlZpc2l0b3IuZGlyZWN0aXZlUmVjb3JkcywgZ2VuQ29uZmlnKTtcblxuICB9KTtcbn1cblxuZnVuY3Rpb24gX2NvbGxlY3ROZXN0ZWRQcm90b1ZpZXdzVmFyaWFibGVOYW1lcyhwdlZpc2l0b3JzOiBQcm90b1ZpZXdWaXNpdG9yW10pOiBzdHJpbmdbXVtdIHtcbiAgdmFyIG5lc3RlZFB2VmFyaWFibGVOYW1lczogc3RyaW5nW11bXSA9IExpc3RXcmFwcGVyLmNyZWF0ZUZpeGVkU2l6ZShwdlZpc2l0b3JzLmxlbmd0aCk7XG4gIHB2VmlzaXRvcnMuZm9yRWFjaCgocHYpID0+IHtcbiAgICB2YXIgcGFyZW50VmFyaWFibGVOYW1lczogc3RyaW5nW10gPVxuICAgICAgICBpc1ByZXNlbnQocHYucGFyZW50KSA/IG5lc3RlZFB2VmFyaWFibGVOYW1lc1twdi5wYXJlbnQudmlld0luZGV4XSA6IFtdO1xuICAgIG5lc3RlZFB2VmFyaWFibGVOYW1lc1twdi52aWV3SW5kZXhdID0gcGFyZW50VmFyaWFibGVOYW1lcy5jb25jYXQocHYudmFyaWFibGVOYW1lcyk7XG4gIH0pO1xuICByZXR1cm4gbmVzdGVkUHZWYXJpYWJsZU5hbWVzO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NoYW5nZV9kZWZpbml0aW9uX2ZhY3RvcnkudHNcbiAqKi8iLCJpbXBvcnQge0FTVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7aXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtDb21waWxlRGlyZWN0aXZlTWV0YWRhdGF9IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7UGFyc2VTb3VyY2VTcGFufSBmcm9tICcuL3BhcnNlX3V0aWwnO1xuXG4vKipcbiAqIEFuIEFic3RyYWN0IFN5bnRheCBUcmVlIG5vZGUgcmVwcmVzZW50aW5nIHBhcnQgb2YgYSBwYXJzZWQgQW5ndWxhciB0ZW1wbGF0ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZUFzdCB7XG4gIC8qKlxuICAgKiBUaGUgc291cmNlIHNwYW4gZnJvbSB3aGljaCB0aGlzIG5vZGUgd2FzIHBhcnNlZC5cbiAgICovXG4gIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbjtcblxuICAvKipcbiAgICogVmlzaXQgdGhpcyBub2RlIGFuZCBwb3NzaWJseSB0cmFuc2Zvcm0gaXQuXG4gICAqL1xuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueTtcbn1cblxuLyoqXG4gKiBBIHNlZ21lbnQgb2YgdGV4dCB3aXRoaW4gdGhlIHRlbXBsYXRlLlxuICovXG5leHBvcnQgY2xhc3MgVGV4dEFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBzdHJpbmcsIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiB2aXNpdG9yLnZpc2l0VGV4dCh0aGlzLCBjb250ZXh0KTsgfVxufVxuXG4vKipcbiAqIEEgYm91bmQgZXhwcmVzc2lvbiB3aXRoaW4gdGhlIHRleHQgb2YgYSB0ZW1wbGF0ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIEJvdW5kVGV4dEFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBBU1QsIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRCb3VuZFRleHQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHBsYWluIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50LlxuICovXG5leHBvcnQgY2xhc3MgQXR0ckFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHZhbHVlOiBzdHJpbmcsIHB1YmxpYyBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pIHt9XG4gIHZpc2l0KHZpc2l0b3I6IFRlbXBsYXRlQXN0VmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRBdHRyKHRoaXMsIGNvbnRleHQpOyB9XG59XG5cbi8qKlxuICogQSBiaW5kaW5nIGZvciBhbiBlbGVtZW50IHByb3BlcnR5IChlLmcuIGBbcHJvcGVydHldPVwiZXhwcmVzc2lvblwiYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHR5cGU6IFByb3BlcnR5QmluZGluZ1R5cGUsIHB1YmxpYyB2YWx1ZTogQVNULFxuICAgICAgICAgICAgICBwdWJsaWMgdW5pdDogc3RyaW5nLCBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbGVtZW50UHJvcGVydHkodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGJpbmRpbmcgZm9yIGFuIGVsZW1lbnQgZXZlbnQgKGUuZy4gYChldmVudCk9XCJoYW5kbGVyKClcImApLlxuICovXG5leHBvcnQgY2xhc3MgQm91bmRFdmVudEFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIHRhcmdldDogc3RyaW5nLCBwdWJsaWMgaGFuZGxlcjogQVNULFxuICAgICAgICAgICAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFdmVudCh0aGlzLCBjb250ZXh0KTtcbiAgfVxuICBnZXQgZnVsbE5hbWUoKSB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnRhcmdldCkpIHtcbiAgICAgIHJldHVybiBgJHt0aGlzLnRhcmdldH06JHt0aGlzLm5hbWV9YDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMubmFtZTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBBIHZhcmlhYmxlIGRlY2xhcmF0aW9uIG9uIGFuIGVsZW1lbnQgKGUuZy4gYCN2YXI9XCJleHByZXNzaW9uXCJgKS5cbiAqL1xuZXhwb3J0IGNsYXNzIFZhcmlhYmxlQXN0IGltcGxlbWVudHMgVGVtcGxhdGVBc3Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IHN0cmluZywgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge31cbiAgdmlzaXQodmlzaXRvcjogVGVtcGxhdGVBc3RWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VmFyaWFibGUodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBlbGVtZW50IGRlY2xhcmF0aW9uIGluIGEgdGVtcGxhdGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBFbGVtZW50QXN0IGltcGxlbWVudHMgVGVtcGxhdGVBc3Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgYXR0cnM6IEF0dHJBc3RbXSxcbiAgICAgICAgICAgICAgcHVibGljIGlucHV0czogQm91bmRFbGVtZW50UHJvcGVydHlBc3RbXSwgcHVibGljIG91dHB1dHM6IEJvdW5kRXZlbnRBc3RbXSxcbiAgICAgICAgICAgICAgcHVibGljIGV4cG9ydEFzVmFyczogVmFyaWFibGVBc3RbXSwgcHVibGljIGRpcmVjdGl2ZXM6IERpcmVjdGl2ZUFzdFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgY2hpbGRyZW46IFRlbXBsYXRlQXN0W10sIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbGVtZW50KHRoaXMsIGNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaGFzIGFueSBhY3RpdmUgYmluZGluZ3MgKGlucHV0cywgb3V0cHV0cywgdmFycywgb3IgZGlyZWN0aXZlcykuXG4gICAqL1xuICBpc0JvdW5kKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAodGhpcy5pbnB1dHMubGVuZ3RoID4gMCB8fCB0aGlzLm91dHB1dHMubGVuZ3RoID4gMCB8fCB0aGlzLmV4cG9ydEFzVmFycy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMubGVuZ3RoID4gMCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjb21wb25lbnQgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWxlbWVudCwgaWYgYW55LlxuICAgKi9cbiAgZ2V0Q29tcG9uZW50KCk6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSB7XG4gICAgcmV0dXJuIHRoaXMuZGlyZWN0aXZlcy5sZW5ndGggPiAwICYmIHRoaXMuZGlyZWN0aXZlc1swXS5kaXJlY3RpdmUuaXNDb21wb25lbnQgP1xuICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzWzBdLmRpcmVjdGl2ZSA6XG4gICAgICAgICAgICAgICBudWxsO1xuICB9XG59XG5cbi8qKlxuICogQSBgPHRlbXBsYXRlPmAgZWxlbWVudCBpbmNsdWRlZCBpbiBhbiBBbmd1bGFyIHRlbXBsYXRlLlxuICovXG5leHBvcnQgY2xhc3MgRW1iZWRkZWRUZW1wbGF0ZUFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIGF0dHJzOiBBdHRyQXN0W10sIHB1YmxpYyBvdXRwdXRzOiBCb3VuZEV2ZW50QXN0W10sIHB1YmxpYyB2YXJzOiBWYXJpYWJsZUFzdFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgZGlyZWN0aXZlczogRGlyZWN0aXZlQXN0W10sIHB1YmxpYyBjaGlsZHJlbjogVGVtcGxhdGVBc3RbXSxcbiAgICAgICAgICAgICAgcHVibGljIG5nQ29udGVudEluZGV4OiBudW1iZXIsIHB1YmxpYyBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pIHt9XG4gIHZpc2l0KHZpc2l0b3I6IFRlbXBsYXRlQXN0VmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdEVtYmVkZGVkVGVtcGxhdGUodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSBwcm9wZXJ0eSB3aXRoIGEgYm91bmQgdmFsdWUgKGUuZy4gYCpuZ0lmPVwiY29uZGl0aW9uXCIpLlxuICovXG5leHBvcnQgY2xhc3MgQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdCBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIGRpcmVjdGl2ZU5hbWU6IHN0cmluZywgcHVibGljIHRlbXBsYXRlTmFtZTogc3RyaW5nLCBwdWJsaWMgdmFsdWU6IEFTVCxcbiAgICAgICAgICAgICAgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge31cbiAgdmlzaXQodmlzaXRvcjogVGVtcGxhdGVBc3RWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0RGlyZWN0aXZlUHJvcGVydHkodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGRpcmVjdGl2ZSBkZWNsYXJlZCBvbiBhbiBlbGVtZW50LlxuICovXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlQXN0IGltcGxlbWVudHMgVGVtcGxhdGVBc3Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGlyZWN0aXZlOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gICAgICAgICAgICAgIHB1YmxpYyBpbnB1dHM6IEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3RbXSxcbiAgICAgICAgICAgICAgcHVibGljIGhvc3RQcm9wZXJ0aWVzOiBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdFtdLCBwdWJsaWMgaG9zdEV2ZW50czogQm91bmRFdmVudEFzdFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgZXhwb3J0QXNWYXJzOiBWYXJpYWJsZUFzdFtdLCBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXREaXJlY3RpdmUodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuLyoqXG4gKiBQb3NpdGlvbiB3aGVyZSBjb250ZW50IGlzIHRvIGJlIHByb2plY3RlZCAoaW5zdGFuY2Ugb2YgYDxuZy1jb250ZW50PmAgaW4gYSB0ZW1wbGF0ZSkuXG4gKi9cbmV4cG9ydCBjbGFzcyBOZ0NvbnRlbnRBc3QgaW1wbGVtZW50cyBUZW1wbGF0ZUFzdCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbmRleDogbnVtYmVyLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge31cbiAgdmlzaXQodmlzaXRvcjogVGVtcGxhdGVBc3RWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0TmdDb250ZW50KHRoaXMsIGNvbnRleHQpO1xuICB9XG59XG5cbi8qKlxuICogRW51bWVyYXRpb24gb2YgdHlwZXMgb2YgcHJvcGVydHkgYmluZGluZ3MuXG4gKi9cbmV4cG9ydCBlbnVtIFByb3BlcnR5QmluZGluZ1R5cGUge1xuXG4gIC8qKlxuICAgKiBBIG5vcm1hbCBiaW5kaW5nIHRvIGEgcHJvcGVydHkgKGUuZy4gYFtwcm9wZXJ0eV09XCJleHByZXNzaW9uXCJgKS5cbiAgICovXG4gIFByb3BlcnR5LFxuXG4gIC8qKlxuICAgKiBBIGJpbmRpbmcgdG8gYW4gZWxlbWVudCBhdHRyaWJ1dGUgKGUuZy4gYFthdHRyLm5hbWVdPVwiZXhwcmVzc2lvblwiYCkuXG4gICAqL1xuICBBdHRyaWJ1dGUsXG5cbiAgLyoqXG4gICAqIEEgYmluZGluZyB0byBhIENTUyBjbGFzcyAoZS5nLiBgW2NsYXNzLm5hbWVdPVwiY29uZGl0aW9uXCJgKS5cbiAgICovXG4gIENsYXNzLFxuXG4gIC8qKlxuICAgKiBBIGJpbmRpbmcgdG8gYSBzdHlsZSBydWxlIChlLmcuIGBbc3R5bGUucnVsZV09XCJleHByZXNzaW9uXCJgKS5cbiAgICovXG4gIFN0eWxlXG59XG5cbi8qKlxuICogQSB2aXNpdG9yIGZvciB7QGxpbmsgVGVtcGxhdGVBc3R9IHRyZWVzIHRoYXQgd2lsbCBwcm9jZXNzIGVhY2ggbm9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUZW1wbGF0ZUFzdFZpc2l0b3Ige1xuICB2aXNpdE5nQ29udGVudChhc3Q6IE5nQ29udGVudEFzdCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEVtYmVkZGVkVGVtcGxhdGUoYXN0OiBFbWJlZGRlZFRlbXBsYXRlQXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RWxlbWVudChhc3Q6IEVsZW1lbnRBc3QsIGNvbnRleHQ6IGFueSk6IGFueTtcbiAgdmlzaXRWYXJpYWJsZShhc3Q6IFZhcmlhYmxlQXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RXZlbnQoYXN0OiBCb3VuZEV2ZW50QXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RWxlbWVudFByb3BlcnR5KGFzdDogQm91bmRFbGVtZW50UHJvcGVydHlBc3QsIGNvbnRleHQ6IGFueSk6IGFueTtcbiAgdmlzaXRBdHRyKGFzdDogQXR0ckFzdCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEJvdW5kVGV4dChhc3Q6IEJvdW5kVGV4dEFzdCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdFRleHQoYXN0OiBUZXh0QXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RGlyZWN0aXZlKGFzdDogRGlyZWN0aXZlQXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG4gIHZpc2l0RGlyZWN0aXZlUHJvcGVydHkoYXN0OiBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LCBjb250ZXh0OiBhbnkpOiBhbnk7XG59XG5cbi8qKlxuICogVmlzaXQgZXZlcnkgbm9kZSBpbiBhIGxpc3Qgb2Yge0BsaW5rIFRlbXBsYXRlQXN0fXMgd2l0aCB0aGUgZ2l2ZW4ge0BsaW5rIFRlbXBsYXRlQXN0VmlzaXRvcn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW1wbGF0ZVZpc2l0QWxsKHZpc2l0b3I6IFRlbXBsYXRlQXN0VmlzaXRvciwgYXN0czogVGVtcGxhdGVBc3RbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IGFueSA9IG51bGwpOiBhbnlbXSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgYXN0cy5mb3JFYWNoKGFzdCA9PiB7XG4gICAgdmFyIGFzdFJlc3VsdCA9IGFzdC52aXNpdCh2aXNpdG9yLCBjb250ZXh0KTtcbiAgICBpZiAoaXNQcmVzZW50KGFzdFJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGFzdFJlc3VsdCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci90ZW1wbGF0ZV9hc3QudHNcbiAqKi8iLCJpbXBvcnQge1xuICBDaGFuZ2VEZXRlY3RvckRlZmluaXRpb24sXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2NoYW5nZV9kZXRlY3Rpb24vY2hhbmdlX2RldGVjdGlvbic7XG5cbi8vIE5vdGU6IFRoaXMgY2xhc3MgaXMgb25seSBoZXJlIHNvIHRoYXQgd2UgY2FuIHJlZmVyZW5jZSBpdCBmcm9tIFR5cGVTY3JpcHQgY29kZS5cbi8vIFRoZSBhY3R1YWwgaW1wbGVtZW50YXRpb24gbGl2ZXMgdW5kZXIgbW9kdWxlc19kYXJ0LlxuLy8gVE9ETyh0Ym9zY2gpOiBNb3ZlIHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaW50byBhbmd1bGFyMi9zcmMvY29tcGlsZXIgb25jZVxuLy8gdGhlIG5ldyBjb21waWxlciBpcyBkb25lLlxuZXhwb3J0IGNsYXNzIENvZGVnZW4ge1xuICBjb25zdHJ1Y3Rvcihtb2R1bGVBbGlhczogc3RyaW5nKSB7fVxuICBnZW5lcmF0ZSh0eXBlTmFtZTogc3RyaW5nLCBjaGFuZ2VEZXRlY3RvclR5cGVOYW1lOiBzdHJpbmcsIGRlZjogQ2hhbmdlRGV0ZWN0b3JEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgdGhyb3cgXCJOb3QgaW1wbGVtZW50ZWQgaW4gSlNcIjtcbiAgfVxuICB0b1N0cmluZygpOiBzdHJpbmcgeyB0aHJvdyBcIk5vdCBpbXBsZW1lbnRlZCBpbiBKU1wiOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdHJhbnNmb3JtL3RlbXBsYXRlX2NvbXBpbGVyL2NoYW5nZV9kZXRlY3Rvcl9jb2RlZ2VuLnRzXG4gKiovIiwiaW1wb3J0IHtDb21waWxlVHlwZU1ldGFkYXRhLCBDb21waWxlVGVtcGxhdGVNZXRhZGF0YX0gZnJvbSAnLi9kaXJlY3RpdmVfbWV0YWRhdGEnO1xuaW1wb3J0IHtTb3VyY2VNb2R1bGUsIFNvdXJjZUV4cHJlc3Npb24sIG1vZHVsZVJlZn0gZnJvbSAnLi9zb3VyY2VfbW9kdWxlJztcbmltcG9ydCB7Vmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL3ZpZXcnO1xuaW1wb3J0IHtYSFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci94aHInO1xuaW1wb3J0IHtJU19EQVJULCBTdHJpbmdXcmFwcGVyLCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQcm9taXNlV3JhcHBlciwgUHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge1NoYWRvd0Nzc30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NoYWRvd19jc3MnO1xuaW1wb3J0IHtVcmxSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3VybF9yZXNvbHZlcic7XG5pbXBvcnQge2V4dHJhY3RTdHlsZVVybHN9IGZyb20gJy4vc3R5bGVfdXJsX3Jlc29sdmVyJztcbmltcG9ydCB7XG4gIGVzY2FwZVNpbmdsZVF1b3RlU3RyaW5nLFxuICBjb2RlR2VuRXhwb3J0VmFyaWFibGUsXG4gIGNvZGVHZW5Ub1N0cmluZyxcbiAgTU9EVUxFX1NVRkZJWFxufSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0NPTVBPTkVOVF9WQVJJQUJMRSwgSE9TVF9BVFRSLCBDT05URU5UX0FUVFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci92aWV3X2ZhY3RvcnknO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU3R5bGVDb21waWxlciB7XG4gIHByaXZhdGUgX3N0eWxlQ2FjaGU6IE1hcDxzdHJpbmcsIFByb21pc2U8c3RyaW5nW10+PiA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHN0cmluZ1tdPj4oKTtcbiAgcHJpdmF0ZSBfc2hhZG93Q3NzOiBTaGFkb3dDc3MgPSBuZXcgU2hhZG93Q3NzKCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfeGhyOiBYSFIsIHByaXZhdGUgX3VybFJlc29sdmVyOiBVcmxSZXNvbHZlcikge31cblxuICBjb21waWxlQ29tcG9uZW50UnVudGltZSh0ZW1wbGF0ZTogQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEpOiBQcm9taXNlPEFycmF5PHN0cmluZyB8IGFueVtdPj4ge1xuICAgIHZhciBzdHlsZXMgPSB0ZW1wbGF0ZS5zdHlsZXM7XG4gICAgdmFyIHN0eWxlQWJzVXJscyA9IHRlbXBsYXRlLnN0eWxlVXJscztcbiAgICByZXR1cm4gdGhpcy5fbG9hZFN0eWxlcyhzdHlsZXMsIHN0eWxlQWJzVXJscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS5lbmNhcHN1bGF0aW9uID09PSBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCk7XG4gIH1cblxuICBjb21waWxlQ29tcG9uZW50Q29kZUdlbih0ZW1wbGF0ZTogQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEpOiBTb3VyY2VFeHByZXNzaW9uIHtcbiAgICB2YXIgc2hpbSA9IHRlbXBsYXRlLmVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkO1xuICAgIHJldHVybiB0aGlzLl9zdHlsZUNvZGVHZW4odGVtcGxhdGUuc3R5bGVzLCB0ZW1wbGF0ZS5zdHlsZVVybHMsIHNoaW0pO1xuICB9XG5cbiAgY29tcGlsZVN0eWxlc2hlZXRDb2RlR2VuKHN0eWxlc2hlZXRVcmw6IHN0cmluZywgY3NzVGV4dDogc3RyaW5nKTogU291cmNlTW9kdWxlW10ge1xuICAgIHZhciBzdHlsZVdpdGhJbXBvcnRzID0gZXh0cmFjdFN0eWxlVXJscyh0aGlzLl91cmxSZXNvbHZlciwgc3R5bGVzaGVldFVybCwgY3NzVGV4dCk7XG4gICAgcmV0dXJuIFtcbiAgICAgIHRoaXMuX3N0eWxlTW9kdWxlKFxuICAgICAgICAgIHN0eWxlc2hlZXRVcmwsIGZhbHNlLFxuICAgICAgICAgIHRoaXMuX3N0eWxlQ29kZUdlbihbc3R5bGVXaXRoSW1wb3J0cy5zdHlsZV0sIHN0eWxlV2l0aEltcG9ydHMuc3R5bGVVcmxzLCBmYWxzZSkpLFxuICAgICAgdGhpcy5fc3R5bGVNb2R1bGUoc3R5bGVzaGVldFVybCwgdHJ1ZSwgdGhpcy5fc3R5bGVDb2RlR2VuKFtzdHlsZVdpdGhJbXBvcnRzLnN0eWxlXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZVdpdGhJbXBvcnRzLnN0eWxlVXJscywgdHJ1ZSkpXG4gICAgXTtcbiAgfVxuXG4gIGNsZWFyQ2FjaGUoKSB7IHRoaXMuX3N0eWxlQ2FjaGUuY2xlYXIoKTsgfVxuXG4gIHByaXZhdGUgX2xvYWRTdHlsZXMocGxhaW5TdHlsZXM6IHN0cmluZ1tdLCBhYnNVcmxzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmNhcHN1bGF0ZTogYm9vbGVhbik6IFByb21pc2U8QXJyYXk8c3RyaW5nIHwgYW55W10+PiB7XG4gICAgdmFyIHByb21pc2VzID0gYWJzVXJscy5tYXAoKGFic1VybCkgPT4ge1xuICAgICAgdmFyIGNhY2hlS2V5ID0gYCR7YWJzVXJsfSR7ZW5jYXBzdWxhdGUgPyAnLnNoaW0nIDogJyd9YDtcbiAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9zdHlsZUNhY2hlLmdldChjYWNoZUtleSk7XG4gICAgICBpZiAoaXNCbGFuayhyZXN1bHQpKSB7XG4gICAgICAgIHJlc3VsdCA9IHRoaXMuX3hoci5nZXQoYWJzVXJsKS50aGVuKChzdHlsZSkgPT4ge1xuICAgICAgICAgIHZhciBzdHlsZVdpdGhJbXBvcnRzID0gZXh0cmFjdFN0eWxlVXJscyh0aGlzLl91cmxSZXNvbHZlciwgYWJzVXJsLCBzdHlsZSk7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRTdHlsZXMoW3N0eWxlV2l0aEltcG9ydHMuc3R5bGVdLCBzdHlsZVdpdGhJbXBvcnRzLnN0eWxlVXJscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNhcHN1bGF0ZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLl9zdHlsZUNhY2hlLnNldChjYWNoZUtleSwgcmVzdWx0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLmFsbChwcm9taXNlcykudGhlbigobmVzdGVkU3R5bGVzOiBzdHJpbmdbXVtdKSA9PiB7XG4gICAgICB2YXIgcmVzdWx0OiBBcnJheTxzdHJpbmcgfCBhbnlbXT4gPVxuICAgICAgICAgIHBsYWluU3R5bGVzLm1hcChwbGFpblN0eWxlID0+IHRoaXMuX3NoaW1JZk5lZWRlZChwbGFpblN0eWxlLCBlbmNhcHN1bGF0ZSkpO1xuICAgICAgbmVzdGVkU3R5bGVzLmZvckVhY2goc3R5bGVzID0+IHJlc3VsdC5wdXNoKHN0eWxlcykpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0eWxlQ29kZUdlbihwbGFpblN0eWxlczogc3RyaW5nW10sIGFic1VybHM6IHN0cmluZ1tdLCBzaGltOiBib29sZWFuKTogU291cmNlRXhwcmVzc2lvbiB7XG4gICAgdmFyIGFycmF5UHJlZml4ID0gSVNfREFSVCA/IGBjb25zdGAgOiAnJztcbiAgICB2YXIgc3R5bGVFeHByZXNzaW9ucyA9IHBsYWluU3R5bGVzLm1hcChcbiAgICAgICAgcGxhaW5TdHlsZSA9PiBlc2NhcGVTaW5nbGVRdW90ZVN0cmluZyh0aGlzLl9zaGltSWZOZWVkZWQocGxhaW5TdHlsZSwgc2hpbSkpKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWJzVXJscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIG1vZHVsZVVybCA9IHRoaXMuX2NyZWF0ZU1vZHVsZVVybChhYnNVcmxzW2ldLCBzaGltKTtcbiAgICAgIHN0eWxlRXhwcmVzc2lvbnMucHVzaChgJHttb2R1bGVSZWYobW9kdWxlVXJsKX1TVFlMRVNgKTtcbiAgICB9XG4gICAgdmFyIGV4cHJlc3Npb25Tb3VyY2UgPSBgJHthcnJheVByZWZpeH0gWyR7c3R5bGVFeHByZXNzaW9ucy5qb2luKCcsJyl9XWA7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VFeHByZXNzaW9uKFtdLCBleHByZXNzaW9uU291cmNlKTtcbiAgfVxuXG4gIHByaXZhdGUgX3N0eWxlTW9kdWxlKHN0eWxlc2hlZXRVcmw6IHN0cmluZywgc2hpbTogYm9vbGVhbixcbiAgICAgICAgICAgICAgICAgICAgICAgZXhwcmVzc2lvbjogU291cmNlRXhwcmVzc2lvbik6IFNvdXJjZU1vZHVsZSB7XG4gICAgdmFyIG1vZHVsZVNvdXJjZSA9IGBcbiAgICAgICR7ZXhwcmVzc2lvbi5kZWNsYXJhdGlvbnMuam9pbignXFxuJyl9XG4gICAgICAke2NvZGVHZW5FeHBvcnRWYXJpYWJsZSgnU1RZTEVTJyl9JHtleHByZXNzaW9uLmV4cHJlc3Npb259O1xuICAgIGA7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VNb2R1bGUodGhpcy5fY3JlYXRlTW9kdWxlVXJsKHN0eWxlc2hlZXRVcmwsIHNoaW0pLCBtb2R1bGVTb3VyY2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2hpbUlmTmVlZGVkKHN0eWxlOiBzdHJpbmcsIHNoaW06IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBzaGltID8gdGhpcy5fc2hhZG93Q3NzLnNoaW1Dc3NUZXh0KHN0eWxlLCBDT05URU5UX0FUVFIsIEhPU1RfQVRUUikgOiBzdHlsZTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZU1vZHVsZVVybChzdHlsZXNoZWV0VXJsOiBzdHJpbmcsIHNoaW06IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBzaGltID8gYCR7c3R5bGVzaGVldFVybH0uc2hpbSR7TU9EVUxFX1NVRkZJWH1gIDogYCR7c3R5bGVzaGVldFVybH0ke01PRFVMRV9TVUZGSVh9YDtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3N0eWxlX2NvbXBpbGVyLnRzXG4gKiovIiwiaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7XG4gIFN0cmluZ1dyYXBwZXIsXG4gIFJlZ0V4cCxcbiAgUmVnRXhwV3JhcHBlcixcbiAgUmVnRXhwTWF0Y2hlcldyYXBwZXIsXG4gIGlzUHJlc2VudCxcbiAgaXNCbGFua1xufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG4vKipcbiAqIFRoaXMgZmlsZSBpcyBhIHBvcnQgb2Ygc2hhZG93Q1NTIGZyb20gd2ViY29tcG9uZW50cy5qcyB0byBUeXBlU2NyaXB0LlxuICpcbiAqIFBsZWFzZSBtYWtlIHN1cmUgdG8ga2VlcCB0byBlZGl0cyBpbiBzeW5jIHdpdGggdGhlIHNvdXJjZSBmaWxlLlxuICpcbiAqIFNvdXJjZTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJjb21wb25lbnRzL3dlYmNvbXBvbmVudHNqcy9ibG9iLzRlZmVjZDdlMGUvc3JjL1NoYWRvd0NTUy9TaGFkb3dDU1MuanNcbiAqXG4gKiBUaGUgb3JpZ2luYWwgZmlsZSBsZXZlbCBjb21tZW50IGlzIHJlcHJvZHVjZWQgYmVsb3dcbiAqL1xuXG4vKlxuICBUaGlzIGlzIGEgbGltaXRlZCBzaGltIGZvciBTaGFkb3dET00gY3NzIHN0eWxpbmcuXG4gIGh0dHBzOi8vZHZjcy53My5vcmcvaGcvd2ViY29tcG9uZW50cy9yYXctZmlsZS90aXAvc3BlYy9zaGFkb3cvaW5kZXguaHRtbCNzdHlsZXNcblxuICBUaGUgaW50ZW50aW9uIGhlcmUgaXMgdG8gc3VwcG9ydCBvbmx5IHRoZSBzdHlsaW5nIGZlYXR1cmVzIHdoaWNoIGNhbiBiZVxuICByZWxhdGl2ZWx5IHNpbXBseSBpbXBsZW1lbnRlZC4gVGhlIGdvYWwgaXMgdG8gYWxsb3cgdXNlcnMgdG8gYXZvaWQgdGhlXG4gIG1vc3Qgb2J2aW91cyBwaXRmYWxscyBhbmQgZG8gc28gd2l0aG91dCBjb21wcm9taXNpbmcgcGVyZm9ybWFuY2Ugc2lnbmlmaWNhbnRseS5cbiAgRm9yIFNoYWRvd0RPTSBzdHlsaW5nIHRoYXQncyBub3QgY292ZXJlZCBoZXJlLCBhIHNldCBvZiBiZXN0IHByYWN0aWNlc1xuICBjYW4gYmUgcHJvdmlkZWQgdGhhdCBzaG91bGQgYWxsb3cgdXNlcnMgdG8gYWNjb21wbGlzaCBtb3JlIGNvbXBsZXggc3R5bGluZy5cblxuICBUaGUgZm9sbG93aW5nIGlzIGEgbGlzdCBvZiBzcGVjaWZpYyBTaGFkb3dET00gc3R5bGluZyBmZWF0dXJlcyBhbmQgYSBicmllZlxuICBkaXNjdXNzaW9uIG9mIHRoZSBhcHByb2FjaCB1c2VkIHRvIHNoaW0uXG5cbiAgU2hpbW1lZCBmZWF0dXJlczpcblxuICAqIDpob3N0LCA6aG9zdC1jb250ZXh0OiBTaGFkb3dET00gYWxsb3dzIHN0eWxpbmcgb2YgdGhlIHNoYWRvd1Jvb3QncyBob3N0XG4gIGVsZW1lbnQgdXNpbmcgdGhlIDpob3N0IHJ1bGUuIFRvIHNoaW0gdGhpcyBmZWF0dXJlLCB0aGUgOmhvc3Qgc3R5bGVzIGFyZVxuICByZWZvcm1hdHRlZCBhbmQgcHJlZml4ZWQgd2l0aCBhIGdpdmVuIHNjb3BlIG5hbWUgYW5kIHByb21vdGVkIHRvIGFcbiAgZG9jdW1lbnQgbGV2ZWwgc3R5bGVzaGVldC5cbiAgRm9yIGV4YW1wbGUsIGdpdmVuIGEgc2NvcGUgbmFtZSBvZiAuZm9vLCBhIHJ1bGUgbGlrZSB0aGlzOlxuXG4gICAgOmhvc3Qge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gIGJlY29tZXM6XG5cbiAgICAuZm9vIHtcbiAgICAgIGJhY2tncm91bmQ6IHJlZDtcbiAgICB9XG5cbiAgKiBlbmNhcHN1bHRpb246IFN0eWxlcyBkZWZpbmVkIHdpdGhpbiBTaGFkb3dET00sIGFwcGx5IG9ubHkgdG9cbiAgZG9tIGluc2lkZSB0aGUgU2hhZG93RE9NLiBQb2x5bWVyIHVzZXMgb25lIG9mIHR3byB0ZWNobmlxdWVzIHRvIGltbGVtZW50XG4gIHRoaXMgZmVhdHVyZS5cblxuICBCeSBkZWZhdWx0LCBydWxlcyBhcmUgcHJlZml4ZWQgd2l0aCB0aGUgaG9zdCBlbGVtZW50IHRhZyBuYW1lXG4gIGFzIGEgZGVzY2VuZGFudCBzZWxlY3Rvci4gVGhpcyBlbnN1cmVzIHN0eWxpbmcgZG9lcyBub3QgbGVhayBvdXQgb2YgdGhlICd0b3AnXG4gIG9mIHRoZSBlbGVtZW50J3MgU2hhZG93RE9NLiBGb3IgZXhhbXBsZSxcblxuICBkaXYge1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgfVxuXG4gIGJlY29tZXM6XG5cbiAgeC1mb28gZGl2IHtcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xuICAgIH1cblxuICBiZWNvbWVzOlxuXG5cbiAgQWx0ZXJuYXRpdmVseSwgaWYgV2ViQ29tcG9uZW50cy5TaGFkb3dDU1Muc3RyaWN0U3R5bGluZyBpcyBzZXQgdG8gdHJ1ZSB0aGVuXG4gIHNlbGVjdG9ycyBhcmUgc2NvcGVkIGJ5IGFkZGluZyBhbiBhdHRyaWJ1dGUgc2VsZWN0b3Igc3VmZml4IHRvIGVhY2hcbiAgc2ltcGxlIHNlbGVjdG9yIHRoYXQgY29udGFpbnMgdGhlIGhvc3QgZWxlbWVudCB0YWcgbmFtZS4gRWFjaCBlbGVtZW50XG4gIGluIHRoZSBlbGVtZW50J3MgU2hhZG93RE9NIHRlbXBsYXRlIGlzIGFsc28gZ2l2ZW4gdGhlIHNjb3BlIGF0dHJpYnV0ZS5cbiAgVGh1cywgdGhlc2UgcnVsZXMgbWF0Y2ggb25seSBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHNjb3BlIGF0dHJpYnV0ZS5cbiAgRm9yIGV4YW1wbGUsIGdpdmVuIGEgc2NvcGUgbmFtZSBvZiB4LWZvbywgYSBydWxlIGxpa2UgdGhpczpcblxuICAgIGRpdiB7XG4gICAgICBmb250LXdlaWdodDogYm9sZDtcbiAgICB9XG5cbiAgYmVjb21lczpcblxuICAgIGRpdlt4LWZvb10ge1xuICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gICAgfVxuXG4gIE5vdGUgdGhhdCBlbGVtZW50cyB0aGF0IGFyZSBkeW5hbWljYWxseSBhZGRlZCB0byBhIHNjb3BlIG11c3QgaGF2ZSB0aGUgc2NvcGVcbiAgc2VsZWN0b3IgYWRkZWQgdG8gdGhlbSBtYW51YWxseS5cblxuICAqIHVwcGVyL2xvd2VyIGJvdW5kIGVuY2Fwc3VsYXRpb246IFN0eWxlcyB3aGljaCBhcmUgZGVmaW5lZCBvdXRzaWRlIGFcbiAgc2hhZG93Um9vdCBzaG91bGQgbm90IGNyb3NzIHRoZSBTaGFkb3dET00gYm91bmRhcnkgYW5kIHNob3VsZCBub3QgYXBwbHlcbiAgaW5zaWRlIGEgc2hhZG93Um9vdC5cblxuICBUaGlzIHN0eWxpbmcgYmVoYXZpb3IgaXMgbm90IGVtdWxhdGVkLiBTb21lIHBvc3NpYmxlIHdheXMgdG8gZG8gdGhpcyB0aGF0XG4gIHdlcmUgcmVqZWN0ZWQgZHVlIHRvIGNvbXBsZXhpdHkgYW5kL29yIHBlcmZvcm1hbmNlIGNvbmNlcm5zIGluY2x1ZGU6ICgxKSByZXNldFxuICBldmVyeSBwb3NzaWJsZSBwcm9wZXJ0eSBmb3IgZXZlcnkgcG9zc2libGUgc2VsZWN0b3IgZm9yIGEgZ2l2ZW4gc2NvcGUgbmFtZTtcbiAgKDIpIHJlLWltcGxlbWVudCBjc3MgaW4gamF2YXNjcmlwdC5cblxuICBBcyBhbiBhbHRlcm5hdGl2ZSwgdXNlcnMgc2hvdWxkIG1ha2Ugc3VyZSB0byB1c2Ugc2VsZWN0b3JzXG4gIHNwZWNpZmljIHRvIHRoZSBzY29wZSBpbiB3aGljaCB0aGV5IGFyZSB3b3JraW5nLlxuXG4gICogOjpkaXN0cmlidXRlZDogVGhpcyBiZWhhdmlvciBpcyBub3QgZW11bGF0ZWQuIEl0J3Mgb2Z0ZW4gbm90IG5lY2Vzc2FyeVxuICB0byBzdHlsZSB0aGUgY29udGVudHMgb2YgYSBzcGVjaWZpYyBpbnNlcnRpb24gcG9pbnQgYW5kIGluc3RlYWQsIGRlc2NlbmRhbnRzXG4gIG9mIHRoZSBob3N0IGVsZW1lbnQgY2FuIGJlIHN0eWxlZCBzZWxlY3RpdmVseS4gVXNlcnMgY2FuIGFsc28gY3JlYXRlIGFuXG4gIGV4dHJhIG5vZGUgYXJvdW5kIGFuIGluc2VydGlvbiBwb2ludCBhbmQgc3R5bGUgdGhhdCBub2RlJ3MgY29udGVudHNcbiAgdmlhIGRlc2NlbmRlbnQgc2VsZWN0b3JzLiBGb3IgZXhhbXBsZSwgd2l0aCBhIHNoYWRvd1Jvb3QgbGlrZSB0aGlzOlxuXG4gICAgPHN0eWxlPlxuICAgICAgOjpjb250ZW50KGRpdikge1xuICAgICAgICBiYWNrZ3JvdW5kOiByZWQ7XG4gICAgICB9XG4gICAgPC9zdHlsZT5cbiAgICA8Y29udGVudD48L2NvbnRlbnQ+XG5cbiAgY291bGQgYmVjb21lOlxuXG4gICAgPHN0eWxlPlxuICAgICAgLyAqQHBvbHlmaWxsIC5jb250ZW50LWNvbnRhaW5lciBkaXYgKiAvXG4gICAgICA6OmNvbnRlbnQoZGl2KSB7XG4gICAgICAgIGJhY2tncm91bmQ6IHJlZDtcbiAgICAgIH1cbiAgICA8L3N0eWxlPlxuICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWNvbnRhaW5lclwiPlxuICAgICAgPGNvbnRlbnQ+PC9jb250ZW50PlxuICAgIDwvZGl2PlxuXG4gIE5vdGUgdGhlIHVzZSBvZiBAcG9seWZpbGwgaW4gdGhlIGNvbW1lbnQgYWJvdmUgYSBTaGFkb3dET00gc3BlY2lmaWMgc3R5bGVcbiAgZGVjbGFyYXRpb24uIFRoaXMgaXMgYSBkaXJlY3RpdmUgdG8gdGhlIHN0eWxpbmcgc2hpbSB0byB1c2UgdGhlIHNlbGVjdG9yXG4gIGluIGNvbW1lbnRzIGluIGxpZXUgb2YgdGhlIG5leHQgc2VsZWN0b3Igd2hlbiBydW5uaW5nIHVuZGVyIHBvbHlmaWxsLlxuKi9cblxuZXhwb3J0IGNsYXNzIFNoYWRvd0NzcyB7XG4gIHN0cmljdFN0eWxpbmc6IGJvb2xlYW4gPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKCkge31cblxuICAvKlxuICAqIFNoaW0gc29tZSBjc3NUZXh0IHdpdGggdGhlIGdpdmVuIHNlbGVjdG9yLiBSZXR1cm5zIGNzc1RleHQgdGhhdCBjYW5cbiAgKiBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnQgdmlhIFdlYkNvbXBvbmVudHMuU2hhZG93Q1NTLmFkZENzc1RvRG9jdW1lbnQoY3NzKS5cbiAgKlxuICAqIFdoZW4gc3RyaWN0U3R5bGluZyBpcyB0cnVlOlxuICAqIC0gc2VsZWN0b3IgaXMgdGhlIGF0dHJpYnV0ZSBhZGRlZCB0byBhbGwgZWxlbWVudHMgaW5zaWRlIHRoZSBob3N0LFxuICAqIC0gaG9zdFNlbGVjdG9yIGlzIHRoZSBhdHRyaWJ1dGUgYWRkZWQgdG8gdGhlIGhvc3QgaXRzZWxmLlxuICAqL1xuICBzaGltQ3NzVGV4dChjc3NUZXh0OiBzdHJpbmcsIHNlbGVjdG9yOiBzdHJpbmcsIGhvc3RTZWxlY3Rvcjogc3RyaW5nID0gJycpOiBzdHJpbmcge1xuICAgIGNzc1RleHQgPSBzdHJpcENvbW1lbnRzKGNzc1RleHQpO1xuICAgIGNzc1RleHQgPSB0aGlzLl9pbnNlcnREaXJlY3RpdmVzKGNzc1RleHQpO1xuICAgIHJldHVybiB0aGlzLl9zY29wZUNzc1RleHQoY3NzVGV4dCwgc2VsZWN0b3IsIGhvc3RTZWxlY3Rvcik7XG4gIH1cblxuICBwcml2YXRlIF9pbnNlcnREaXJlY3RpdmVzKGNzc1RleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY3NzVGV4dCA9IHRoaXMuX2luc2VydFBvbHlmaWxsRGlyZWN0aXZlc0luQ3NzVGV4dChjc3NUZXh0KTtcbiAgICByZXR1cm4gdGhpcy5faW5zZXJ0UG9seWZpbGxSdWxlc0luQ3NzVGV4dChjc3NUZXh0KTtcbiAgfVxuXG4gIC8qXG4gICAqIFByb2Nlc3Mgc3R5bGVzIHRvIGNvbnZlcnQgbmF0aXZlIFNoYWRvd0RPTSBydWxlcyB0aGF0IHdpbGwgdHJpcFxuICAgKiB1cCB0aGUgY3NzIHBhcnNlcjsgd2UgcmVseSBvbiBkZWNvcmF0aW5nIHRoZSBzdHlsZXNoZWV0IHdpdGggaW5lcnQgcnVsZXMuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCB3ZSBjb252ZXJ0IHRoaXMgcnVsZTpcbiAgICpcbiAgICogcG9seWZpbGwtbmV4dC1zZWxlY3RvciB7IGNvbnRlbnQ6ICc6aG9zdCBtZW51LWl0ZW0nOyB9XG4gICAqIDo6Y29udGVudCBtZW51LWl0ZW0ge1xuICAgKlxuICAgKiB0byB0aGlzOlxuICAgKlxuICAgKiBzY29wZU5hbWUgbWVudS1pdGVtIHtcbiAgICpcbiAgKiovXG4gIHByaXZhdGUgX2luc2VydFBvbHlmaWxsRGlyZWN0aXZlc0luQ3NzVGV4dChjc3NUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIERpZmZlcmVuY2Ugd2l0aCB3ZWJjb21wb25lbnRzLmpzOiBkb2VzIG5vdCBoYW5kbGUgY29tbWVudHNcbiAgICByZXR1cm4gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsTWFwcGVkKGNzc1RleHQsIF9jc3NDb250ZW50TmV4dFNlbGVjdG9yUmUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihtKSB7IHJldHVybiBtWzFdICsgJ3snOyB9KTtcbiAgfVxuXG4gIC8qXG4gICAqIFByb2Nlc3Mgc3R5bGVzIHRvIGFkZCBydWxlcyB3aGljaCB3aWxsIG9ubHkgYXBwbHkgdW5kZXIgdGhlIHBvbHlmaWxsXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCB3ZSBjb252ZXJ0IHRoaXMgcnVsZTpcbiAgICpcbiAgICogcG9seWZpbGwtcnVsZSB7XG4gICAqICAgY29udGVudDogJzpob3N0IG1lbnUtaXRlbSc7XG4gICAqIC4uLlxuICAgKiB9XG4gICAqXG4gICAqIHRvIHRoaXM6XG4gICAqXG4gICAqIHNjb3BlTmFtZSBtZW51LWl0ZW0gey4uLn1cbiAgICpcbiAgKiovXG4gIHByaXZhdGUgX2luc2VydFBvbHlmaWxsUnVsZXNJbkNzc1RleHQoY3NzVGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBEaWZmZXJlbmNlIHdpdGggd2ViY29tcG9uZW50cy5qczogZG9lcyBub3QgaGFuZGxlIGNvbW1lbnRzXG4gICAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChjc3NUZXh0LCBfY3NzQ29udGVudFJ1bGVSZSwgZnVuY3Rpb24obSkge1xuICAgICAgdmFyIHJ1bGUgPSBtWzBdO1xuICAgICAgcnVsZSA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZShydWxlLCBtWzFdLCAnJyk7XG4gICAgICBydWxlID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlKHJ1bGUsIG1bMl0sICcnKTtcbiAgICAgIHJldHVybiBtWzNdICsgcnVsZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qIEVuc3VyZSBzdHlsZXMgYXJlIHNjb3BlZC4gUHNldWRvLXNjb3BpbmcgdGFrZXMgYSBydWxlIGxpa2U6XG4gICAqXG4gICAqICAuZm9vIHsuLi4gfVxuICAgKlxuICAgKiAgYW5kIGNvbnZlcnRzIHRoaXMgdG9cbiAgICpcbiAgICogIHNjb3BlTmFtZSAuZm9vIHsgLi4uIH1cbiAgKi9cbiAgcHJpdmF0ZSBfc2NvcGVDc3NUZXh0KGNzc1RleHQ6IHN0cmluZywgc2NvcGVTZWxlY3Rvcjogc3RyaW5nLCBob3N0U2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHVuc2NvcGVkID0gdGhpcy5fZXh0cmFjdFVuc2NvcGVkUnVsZXNGcm9tQ3NzVGV4dChjc3NUZXh0KTtcbiAgICBjc3NUZXh0ID0gdGhpcy5faW5zZXJ0UG9seWZpbGxIb3N0SW5Dc3NUZXh0KGNzc1RleHQpO1xuICAgIGNzc1RleHQgPSB0aGlzLl9jb252ZXJ0Q29sb25Ib3N0KGNzc1RleHQpO1xuICAgIGNzc1RleHQgPSB0aGlzLl9jb252ZXJ0Q29sb25Ib3N0Q29udGV4dChjc3NUZXh0KTtcbiAgICBjc3NUZXh0ID0gdGhpcy5fY29udmVydFNoYWRvd0RPTVNlbGVjdG9ycyhjc3NUZXh0KTtcbiAgICBpZiAoaXNQcmVzZW50KHNjb3BlU2VsZWN0b3IpKSB7XG4gICAgICBjc3NUZXh0ID0gdGhpcy5fc2NvcGVTZWxlY3RvcnMoY3NzVGV4dCwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKTtcbiAgICB9XG4gICAgY3NzVGV4dCA9IGNzc1RleHQgKyAnXFxuJyArIHVuc2NvcGVkO1xuICAgIHJldHVybiBjc3NUZXh0LnRyaW0oKTtcbiAgfVxuXG4gIC8qXG4gICAqIFByb2Nlc3Mgc3R5bGVzIHRvIGFkZCBydWxlcyB3aGljaCB3aWxsIG9ubHkgYXBwbHkgdW5kZXIgdGhlIHBvbHlmaWxsXG4gICAqIGFuZCBkbyBub3QgcHJvY2VzcyB2aWEgQ1NTT00uIChDU1NPTSBpcyBkZXN0cnVjdGl2ZSB0byBydWxlcyBvbiByYXJlXG4gICAqIG9jY2FzaW9ucywgZS5nLiAtd2Via2l0LWNhbGMgb24gU2FmYXJpLilcbiAgICogRm9yIGV4YW1wbGUsIHdlIGNvbnZlcnQgdGhpcyBydWxlOlxuICAgKlxuICAgKiBAcG9seWZpbGwtdW5zY29wZWQtcnVsZSB7XG4gICAqICAgY29udGVudDogJ21lbnUtaXRlbSc7XG4gICAqIC4uLiB9XG4gICAqXG4gICAqIHRvIHRoaXM6XG4gICAqXG4gICAqIG1lbnUtaXRlbSB7Li4ufVxuICAgKlxuICAqKi9cbiAgcHJpdmF0ZSBfZXh0cmFjdFVuc2NvcGVkUnVsZXNGcm9tQ3NzVGV4dChjc3NUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIC8vIERpZmZlcmVuY2Ugd2l0aCB3ZWJjb21wb25lbnRzLmpzOiBkb2VzIG5vdCBoYW5kbGUgY29tbWVudHNcbiAgICB2YXIgciA9ICcnLCBtO1xuICAgIHZhciBtYXRjaGVyID0gUmVnRXhwV3JhcHBlci5tYXRjaGVyKF9jc3NDb250ZW50VW5zY29wZWRSdWxlUmUsIGNzc1RleHQpO1xuICAgIHdoaWxlIChpc1ByZXNlbnQobSA9IFJlZ0V4cE1hdGNoZXJXcmFwcGVyLm5leHQobWF0Y2hlcikpKSB7XG4gICAgICB2YXIgcnVsZSA9IG1bMF07XG4gICAgICBydWxlID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlKHJ1bGUsIG1bMl0sICcnKTtcbiAgICAgIHJ1bGUgPSBTdHJpbmdXcmFwcGVyLnJlcGxhY2UocnVsZSwgbVsxXSwgbVszXSk7XG4gICAgICByICs9IHJ1bGUgKyAnXFxuXFxuJztcbiAgICB9XG4gICAgcmV0dXJuIHI7XG4gIH1cblxuICAvKlxuICAgKiBjb252ZXJ0IGEgcnVsZSBsaWtlIDpob3N0KC5mb28pID4gLmJhciB7IH1cbiAgICpcbiAgICogdG9cbiAgICpcbiAgICogc2NvcGVOYW1lLmZvbyA+IC5iYXJcbiAgKi9cbiAgcHJpdmF0ZSBfY29udmVydENvbG9uSG9zdChjc3NUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb252ZXJ0Q29sb25SdWxlKGNzc1RleHQsIF9jc3NDb2xvbkhvc3RSZSwgdGhpcy5fY29sb25Ib3N0UGFydFJlcGxhY2VyKTtcbiAgfVxuXG4gIC8qXG4gICAqIGNvbnZlcnQgYSBydWxlIGxpa2UgOmhvc3QtY29udGV4dCguZm9vKSA+IC5iYXIgeyB9XG4gICAqXG4gICAqIHRvXG4gICAqXG4gICAqIHNjb3BlTmFtZS5mb28gPiAuYmFyLCAuZm9vIHNjb3BlTmFtZSA+IC5iYXIgeyB9XG4gICAqXG4gICAqIGFuZFxuICAgKlxuICAgKiA6aG9zdC1jb250ZXh0KC5mb286aG9zdCkgLmJhciB7IC4uLiB9XG4gICAqXG4gICAqIHRvXG4gICAqXG4gICAqIHNjb3BlTmFtZS5mb28gLmJhciB7IC4uLiB9XG4gICovXG4gIHByaXZhdGUgX2NvbnZlcnRDb2xvbkhvc3RDb250ZXh0KGNzc1RleHQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbnZlcnRDb2xvblJ1bGUoY3NzVGV4dCwgX2Nzc0NvbG9uSG9zdENvbnRleHRSZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb2xvbkhvc3RDb250ZXh0UGFydFJlcGxhY2VyKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnZlcnRDb2xvblJ1bGUoY3NzVGV4dDogc3RyaW5nLCByZWdFeHA6IFJlZ0V4cCwgcGFydFJlcGxhY2VyOiBGdW5jdGlvbik6IHN0cmluZyB7XG4gICAgLy8gcDEgPSA6aG9zdCwgcDIgPSBjb250ZW50cyBvZiAoKSwgcDMgcmVzdCBvZiBydWxlXG4gICAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChjc3NUZXh0LCByZWdFeHAsIGZ1bmN0aW9uKG0pIHtcbiAgICAgIGlmIChpc1ByZXNlbnQobVsyXSkpIHtcbiAgICAgICAgdmFyIHBhcnRzID0gbVsyXS5zcGxpdCgnLCcpLCByID0gW107XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICB2YXIgcCA9IHBhcnRzW2ldO1xuICAgICAgICAgIGlmIChpc0JsYW5rKHApKSBicmVhaztcbiAgICAgICAgICBwID0gcC50cmltKCk7XG4gICAgICAgICAgci5wdXNoKHBhcnRSZXBsYWNlcihfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yLCBwLCBtWzNdKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHIuam9pbignLCcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIF9wb2x5ZmlsbEhvc3ROb0NvbWJpbmF0b3IgKyBtWzNdO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29sb25Ib3N0Q29udGV4dFBhcnRSZXBsYWNlcihob3N0OiBzdHJpbmcsIHBhcnQ6IHN0cmluZywgc3VmZml4OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChTdHJpbmdXcmFwcGVyLmNvbnRhaW5zKHBhcnQsIF9wb2x5ZmlsbEhvc3QpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29sb25Ib3N0UGFydFJlcGxhY2VyKGhvc3QsIHBhcnQsIHN1ZmZpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBob3N0ICsgcGFydCArIHN1ZmZpeCArICcsICcgKyBwYXJ0ICsgJyAnICsgaG9zdCArIHN1ZmZpeDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jb2xvbkhvc3RQYXJ0UmVwbGFjZXIoaG9zdDogc3RyaW5nLCBwYXJ0OiBzdHJpbmcsIHN1ZmZpeDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gaG9zdCArIFN0cmluZ1dyYXBwZXIucmVwbGFjZShwYXJ0LCBfcG9seWZpbGxIb3N0LCAnJykgKyBzdWZmaXg7XG4gIH1cblxuICAvKlxuICAgKiBDb252ZXJ0IGNvbWJpbmF0b3JzIGxpa2UgOjpzaGFkb3cgYW5kIHBzZXVkby1lbGVtZW50cyBsaWtlIDo6Y29udGVudFxuICAgKiBieSByZXBsYWNpbmcgd2l0aCBzcGFjZS5cbiAgKi9cbiAgcHJpdmF0ZSBfY29udmVydFNoYWRvd0RPTVNlbGVjdG9ycyhjc3NUZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgX3NoYWRvd0RPTVNlbGVjdG9yc1JlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjc3NUZXh0ID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKGNzc1RleHQsIF9zaGFkb3dET01TZWxlY3RvcnNSZVtpXSwgJyAnKTtcbiAgICB9XG4gICAgcmV0dXJuIGNzc1RleHQ7XG4gIH1cblxuICAvLyBjaGFuZ2UgYSBzZWxlY3RvciBsaWtlICdkaXYnIHRvICduYW1lIGRpdidcbiAgcHJpdmF0ZSBfc2NvcGVTZWxlY3RvcnMoY3NzVGV4dDogc3RyaW5nLCBzY29wZVNlbGVjdG9yOiBzdHJpbmcsIGhvc3RTZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gcHJvY2Vzc1J1bGVzKGNzc1RleHQsIChydWxlOiBDc3NSdWxlKSA9PiB7XG4gICAgICB2YXIgc2VsZWN0b3IgPSBydWxlLnNlbGVjdG9yO1xuICAgICAgdmFyIGNvbnRlbnQgPSBydWxlLmNvbnRlbnQ7XG4gICAgICBpZiAocnVsZS5zZWxlY3RvclswXSAhPSAnQCcgfHwgcnVsZS5zZWxlY3Rvci5zdGFydHNXaXRoKCdAcGFnZScpKSB7XG4gICAgICAgIHNlbGVjdG9yID1cbiAgICAgICAgICAgIHRoaXMuX3Njb3BlU2VsZWN0b3IocnVsZS5zZWxlY3Rvciwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yLCB0aGlzLnN0cmljdFN0eWxpbmcpO1xuICAgICAgfSBlbHNlIGlmIChydWxlLnNlbGVjdG9yLnN0YXJ0c1dpdGgoJ0BtZWRpYScpKSB7XG4gICAgICAgIGNvbnRlbnQgPSB0aGlzLl9zY29wZVNlbGVjdG9ycyhydWxlLmNvbnRlbnQsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3Rvcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3IENzc1J1bGUoc2VsZWN0b3IsIGNvbnRlbnQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2NvcGVTZWxlY3RvcihzZWxlY3Rvcjogc3RyaW5nLCBzY29wZVNlbGVjdG9yOiBzdHJpbmcsIGhvc3RTZWxlY3Rvcjogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdDogYm9vbGVhbik6IHN0cmluZyB7XG4gICAgdmFyIHIgPSBbXSwgcGFydHMgPSBzZWxlY3Rvci5zcGxpdCgnLCcpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwID0gcGFydHNbaV07XG4gICAgICBwID0gcC50cmltKCk7XG4gICAgICBpZiAodGhpcy5fc2VsZWN0b3JOZWVkc1Njb3BpbmcocCwgc2NvcGVTZWxlY3RvcikpIHtcbiAgICAgICAgcCA9IHN0cmljdCAmJiAhU3RyaW5nV3JhcHBlci5jb250YWlucyhwLCBfcG9seWZpbGxIb3N0Tm9Db21iaW5hdG9yKSA/XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlTdHJpY3RTZWxlY3RvclNjb3BlKHAsIHNjb3BlU2VsZWN0b3IpIDpcbiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseVNlbGVjdG9yU2NvcGUocCwgc2NvcGVTZWxlY3RvciwgaG9zdFNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICAgIHIucHVzaChwKTtcbiAgICB9XG4gICAgcmV0dXJuIHIuam9pbignLCAnKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NlbGVjdG9yTmVlZHNTY29waW5nKHNlbGVjdG9yOiBzdHJpbmcsIHNjb3BlU2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciByZSA9IHRoaXMuX21ha2VTY29wZU1hdGNoZXIoc2NvcGVTZWxlY3Rvcik7XG4gICAgcmV0dXJuICFpc1ByZXNlbnQoUmVnRXhwV3JhcHBlci5maXJzdE1hdGNoKHJlLCBzZWxlY3RvcikpO1xuICB9XG5cbiAgcHJpdmF0ZSBfbWFrZVNjb3BlTWF0Y2hlcihzY29wZVNlbGVjdG9yOiBzdHJpbmcpOiBSZWdFeHAge1xuICAgIHZhciBscmUgPSAvXFxbL2c7XG4gICAgdmFyIHJyZSA9IC9cXF0vZztcbiAgICBzY29wZVNlbGVjdG9yID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKHNjb3BlU2VsZWN0b3IsIGxyZSwgJ1xcXFxbJyk7XG4gICAgc2NvcGVTZWxlY3RvciA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChzY29wZVNlbGVjdG9yLCBycmUsICdcXFxcXScpO1xuICAgIHJldHVybiBSZWdFeHBXcmFwcGVyLmNyZWF0ZSgnXignICsgc2NvcGVTZWxlY3RvciArICcpJyArIF9zZWxlY3RvclJlU3VmZml4LCAnbScpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXBwbHlTZWxlY3RvclNjb3BlKHNlbGVjdG9yOiBzdHJpbmcsIHNjb3BlU2VsZWN0b3I6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RTZWxlY3Rvcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBEaWZmZXJlbmNlIGZyb20gd2ViY29tcG9uZW50c2pzOiBzY29wZVNlbGVjdG9yIGNvdWxkIG5vdCBiZSBhbiBhcnJheVxuICAgIHJldHVybiB0aGlzLl9hcHBseVNpbXBsZVNlbGVjdG9yU2NvcGUoc2VsZWN0b3IsIHNjb3BlU2VsZWN0b3IsIGhvc3RTZWxlY3Rvcik7XG4gIH1cblxuICAvLyBzY29wZSB2aWEgbmFtZSBhbmQgW2lzPW5hbWVdXG4gIHByaXZhdGUgX2FwcGx5U2ltcGxlU2VsZWN0b3JTY29wZShzZWxlY3Rvcjogc3RyaW5nLCBzY29wZVNlbGVjdG9yOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3N0U2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJlc2VudChSZWdFeHBXcmFwcGVyLmZpcnN0TWF0Y2goX3BvbHlmaWxsSG9zdFJlLCBzZWxlY3RvcikpKSB7XG4gICAgICB2YXIgcmVwbGFjZUJ5ID0gdGhpcy5zdHJpY3RTdHlsaW5nID8gYFske2hvc3RTZWxlY3Rvcn1dYCA6IHNjb3BlU2VsZWN0b3I7XG4gICAgICBzZWxlY3RvciA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZShzZWxlY3RvciwgX3BvbHlmaWxsSG9zdE5vQ29tYmluYXRvciwgcmVwbGFjZUJ5KTtcbiAgICAgIHJldHVybiBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGwoc2VsZWN0b3IsIF9wb2x5ZmlsbEhvc3RSZSwgcmVwbGFjZUJ5ICsgJyAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHNjb3BlU2VsZWN0b3IgKyAnICcgKyBzZWxlY3RvcjtcbiAgICB9XG4gIH1cblxuICAvLyByZXR1cm4gYSBzZWxlY3RvciB3aXRoIFtuYW1lXSBzdWZmaXggb24gZWFjaCBzaW1wbGUgc2VsZWN0b3JcbiAgLy8gZS5nLiAuZm9vLmJhciA+IC56b3QgYmVjb21lcyAuZm9vW25hbWVdLmJhcltuYW1lXSA+IC56b3RbbmFtZV0gIC8qKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBfYXBwbHlTdHJpY3RTZWxlY3RvclNjb3BlKHNlbGVjdG9yOiBzdHJpbmcsIHNjb3BlU2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIGlzUmUgPSAvXFxbaXM9KFteXFxdXSopXFxdL2c7XG4gICAgc2NvcGVTZWxlY3RvciA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChzY29wZVNlbGVjdG9yLCBpc1JlLCAobSkgPT4gbVsxXSk7XG4gICAgdmFyIHNwbGl0cyA9IFsnICcsICc+JywgJysnLCAnfiddLCBzY29wZWQgPSBzZWxlY3RvciwgYXR0ck5hbWUgPSAnWycgKyBzY29wZVNlbGVjdG9yICsgJ10nO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BsaXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc2VwID0gc3BsaXRzW2ldO1xuICAgICAgdmFyIHBhcnRzID0gc2NvcGVkLnNwbGl0KHNlcCk7XG4gICAgICBzY29wZWQgPSBwYXJ0cy5tYXAocCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIDpob3N0IHNpbmNlIGl0IHNob3VsZCBiZSB1bm5lY2Vzc2FyeVxuICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKHAudHJpbSgpLCBfcG9seWZpbGxIb3N0UmUsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAodC5sZW5ndGggPiAwICYmICFMaXN0V3JhcHBlci5jb250YWlucyhzcGxpdHMsIHQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFTdHJpbmdXcmFwcGVyLmNvbnRhaW5zKHQsIGF0dHJOYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlID0gLyhbXjpdKikoOiopKC4qKS9nO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG0gPSBSZWdFeHBXcmFwcGVyLmZpcnN0TWF0Y2gocmUsIHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwID0gbVsxXSArIGF0dHJOYW1lICsgbVsyXSArIG1bM107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgIC5qb2luKHNlcCk7XG4gICAgfVxuICAgIHJldHVybiBzY29wZWQ7XG4gIH1cblxuICBwcml2YXRlIF9pbnNlcnRQb2x5ZmlsbEhvc3RJbkNzc1RleHQoc2VsZWN0b3I6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgc2VsZWN0b3IgPSBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGwoc2VsZWN0b3IsIF9jb2xvbkhvc3RDb250ZXh0UmUsIF9wb2x5ZmlsbEhvc3RDb250ZXh0KTtcbiAgICBzZWxlY3RvciA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChzZWxlY3RvciwgX2NvbG9uSG9zdFJlLCBfcG9seWZpbGxIb3N0KTtcbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH1cbn1cbnZhciBfY3NzQ29udGVudE5leHRTZWxlY3RvclJlID1cbiAgICAvcG9seWZpbGwtbmV4dC1zZWxlY3RvcltefV0qY29udGVudDpbXFxzXSo/WydcIl0oLio/KVsnXCJdWztcXHNdKn0oW157XSo/KXsvZ2ltO1xudmFyIF9jc3NDb250ZW50UnVsZVJlID0gLyhwb2x5ZmlsbC1ydWxlKVtefV0qKGNvbnRlbnQ6W1xcc10qWydcIl0oLio/KVsnXCJdKVs7XFxzXSpbXn1dKn0vZ2ltO1xudmFyIF9jc3NDb250ZW50VW5zY29wZWRSdWxlUmUgPVxuICAgIC8ocG9seWZpbGwtdW5zY29wZWQtcnVsZSlbXn1dKihjb250ZW50OltcXHNdKlsnXCJdKC4qPylbJ1wiXSlbO1xcc10qW159XSp9L2dpbTtcbnZhciBfcG9seWZpbGxIb3N0ID0gJy1zaGFkb3djc3Nob3N0Jztcbi8vIG5vdGU6IDpob3N0LWNvbnRleHQgcHJlLXByb2Nlc3NlZCB0byAtc2hhZG93Y3NzaG9zdGNvbnRleHQuXG52YXIgX3BvbHlmaWxsSG9zdENvbnRleHQgPSAnLXNoYWRvd2Nzc2NvbnRleHQnO1xudmFyIF9wYXJlblN1ZmZpeCA9ICcpKD86XFxcXCgoJyArXG4gICAgICAgICAgICAgICAgICAgJyg/OlxcXFwoW14pKF0qXFxcXCl8W14pKF0qKSs/JyArXG4gICAgICAgICAgICAgICAgICAgJylcXFxcKSk/KFteLHtdKiknO1xudmFyIF9jc3NDb2xvbkhvc3RSZSA9IFJlZ0V4cFdyYXBwZXIuY3JlYXRlKCcoJyArIF9wb2x5ZmlsbEhvc3QgKyBfcGFyZW5TdWZmaXgsICdpbScpO1xudmFyIF9jc3NDb2xvbkhvc3RDb250ZXh0UmUgPSBSZWdFeHBXcmFwcGVyLmNyZWF0ZSgnKCcgKyBfcG9seWZpbGxIb3N0Q29udGV4dCArIF9wYXJlblN1ZmZpeCwgJ2ltJyk7XG52YXIgX3BvbHlmaWxsSG9zdE5vQ29tYmluYXRvciA9IF9wb2x5ZmlsbEhvc3QgKyAnLW5vLWNvbWJpbmF0b3InO1xudmFyIF9zaGFkb3dET01TZWxlY3RvcnNSZSA9IFtcbiAgLz4+Pi9nLFxuICAvOjpzaGFkb3cvZyxcbiAgLzo6Y29udGVudC9nLFxuICAvLyBEZXByZWNhdGVkIHNlbGVjdG9yc1xuICAvLyBUT0RPKHZpY2IpOiBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY2xhbmctZm9ybWF0L2lzc3Vlcy8xNlxuICAvLyBjbGFuZy1mb3JtYXQgb2ZmXG4gIC9cXC9kZWVwXFwvL2csICAgICAgICAgLy8gZm9ybWVyID4+PlxuICAvXFwvc2hhZG93LWRlZXBcXC8vZywgIC8vIGZvcm1lciAvZGVlcC9cbiAgL1xcL3NoYWRvd1xcLy9nLCAgICAgICAvLyBmb3JtZXIgOjpzaGFkb3dcbiAgLy8gY2xhbmYtZm9ybWF0IG9uXG5dO1xudmFyIF9zZWxlY3RvclJlU3VmZml4ID0gJyhbPlxcXFxzfitcXFsuLHs6XVtcXFxcc1xcXFxTXSopPyQnO1xudmFyIF9wb2x5ZmlsbEhvc3RSZSA9IFJlZ0V4cFdyYXBwZXIuY3JlYXRlKF9wb2x5ZmlsbEhvc3QsICdpbScpO1xudmFyIF9jb2xvbkhvc3RSZSA9IC86aG9zdC9naW07XG52YXIgX2NvbG9uSG9zdENvbnRleHRSZSA9IC86aG9zdC1jb250ZXh0L2dpbTtcblxudmFyIF9jb21tZW50UmUgPSAvXFwvXFwqW1xcc1xcU10qP1xcKlxcLy9nO1xuXG5mdW5jdGlvbiBzdHJpcENvbW1lbnRzKGlucHV0OnN0cmluZyk6c3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChpbnB1dCwgX2NvbW1lbnRSZSwgKF8pID0+ICcnKTtcbn1cblxudmFyIF9ydWxlUmUgPSAvKFxccyopKFteO1xce1xcfV0rPykoXFxzKikoKD86eyVCTE9DSyV9P1xccyo7Pyl8KD86XFxzKjspKS9nO1xudmFyIF9jdXJseVJlID0gLyhbe31dKS9nO1xuY29uc3QgT1BFTl9DVVJMWSA9ICd7JztcbmNvbnN0IENMT1NFX0NVUkxZID0gJ30nO1xuY29uc3QgQkxPQ0tfUExBQ0VIT0xERVIgPSAnJUJMT0NLJSc7XG5cbmV4cG9ydCBjbGFzcyBDc3NSdWxlIHtcbiAgY29uc3RydWN0b3IocHVibGljIHNlbGVjdG9yOnN0cmluZywgcHVibGljIGNvbnRlbnQ6c3RyaW5nKSB7fVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvY2Vzc1J1bGVzKGlucHV0OnN0cmluZywgcnVsZUNhbGxiYWNrOkZ1bmN0aW9uKTpzdHJpbmcge1xuICB2YXIgaW5wdXRXaXRoRXNjYXBlZEJsb2NrcyA9IGVzY2FwZUJsb2NrcyhpbnB1dCk7XG4gIHZhciBuZXh0QmxvY2tJbmRleCA9IDA7XG4gIHJldHVybiBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQoaW5wdXRXaXRoRXNjYXBlZEJsb2Nrcy5lc2NhcGVkU3RyaW5nLCBfcnVsZVJlLCBmdW5jdGlvbihtKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gbVsyXTtcbiAgICB2YXIgY29udGVudCA9ICcnO1xuICAgIHZhciBzdWZmaXggPSBtWzRdO1xuICAgIHZhciBjb250ZW50UHJlZml4ID0gJyc7XG4gICAgaWYgKGlzUHJlc2VudChtWzRdKSAmJiBtWzRdLnN0YXJ0c1dpdGgoJ3snK0JMT0NLX1BMQUNFSE9MREVSKSkge1xuICAgICAgY29udGVudCA9IGlucHV0V2l0aEVzY2FwZWRCbG9ja3MuYmxvY2tzW25leHRCbG9ja0luZGV4KytdO1xuICAgICAgc3VmZml4ID0gbVs0XS5zdWJzdHJpbmcoQkxPQ0tfUExBQ0VIT0xERVIubGVuZ3RoKzEpO1xuICAgICAgY29udGVudFByZWZpeCA9ICd7JztcbiAgICB9XG4gICAgdmFyIHJ1bGUgPSBydWxlQ2FsbGJhY2sobmV3IENzc1J1bGUoc2VsZWN0b3IsIGNvbnRlbnQpKTtcbiAgICByZXR1cm4gYCR7bVsxXX0ke3J1bGUuc2VsZWN0b3J9JHttWzNdfSR7Y29udGVudFByZWZpeH0ke3J1bGUuY29udGVudH0ke3N1ZmZpeH1gO1xuICB9KTtcbn1cblxuY2xhc3MgU3RyaW5nV2l0aEVzY2FwZWRCbG9ja3Mge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXNjYXBlZFN0cmluZzpzdHJpbmcsIHB1YmxpYyBibG9ja3M6c3RyaW5nW10pIHt9XG59XG5cbmZ1bmN0aW9uIGVzY2FwZUJsb2NrcyhpbnB1dDpzdHJpbmcpOlN0cmluZ1dpdGhFc2NhcGVkQmxvY2tzIHtcbiAgdmFyIGlucHV0UGFydHMgPSBTdHJpbmdXcmFwcGVyLnNwbGl0KGlucHV0LCBfY3VybHlSZSk7XG4gIHZhciByZXN1bHRQYXJ0cyA9IFtdO1xuICB2YXIgZXNjYXBlZEJsb2NrcyA9IFtdO1xuICB2YXIgYnJhY2tldENvdW50ID0gMDtcbiAgdmFyIGN1cnJlbnRCbG9ja1BhcnRzID0gW107XG4gIGZvciAodmFyIHBhcnRJbmRleCA9IDA7IHBhcnRJbmRleDxpbnB1dFBhcnRzLmxlbmd0aDsgcGFydEluZGV4KyspIHtcbiAgICB2YXIgcGFydCA9IGlucHV0UGFydHNbcGFydEluZGV4XTtcbiAgICBpZiAocGFydCA9PSBDTE9TRV9DVVJMWSkge1xuICAgICAgYnJhY2tldENvdW50LS07XG4gICAgfVxuICAgIGlmIChicmFja2V0Q291bnQgPiAwKSB7XG4gICAgICBjdXJyZW50QmxvY2tQYXJ0cy5wdXNoKHBhcnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY3VycmVudEJsb2NrUGFydHMubGVuZ3RoID4gMCkge1xuICAgICAgICBlc2NhcGVkQmxvY2tzLnB1c2goY3VycmVudEJsb2NrUGFydHMuam9pbignJykpO1xuICAgICAgICByZXN1bHRQYXJ0cy5wdXNoKEJMT0NLX1BMQUNFSE9MREVSKTtcbiAgICAgICAgY3VycmVudEJsb2NrUGFydHMgPSBbXTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdFBhcnRzLnB1c2gocGFydCk7XG4gICAgfVxuICAgIGlmIChwYXJ0ID09IE9QRU5fQ1VSTFkpIHtcbiAgICAgIGJyYWNrZXRDb3VudCsrO1xuICAgIH1cbiAgfVxuICBpZiAoY3VycmVudEJsb2NrUGFydHMubGVuZ3RoID4gMCkge1xuICAgIGVzY2FwZWRCbG9ja3MucHVzaChjdXJyZW50QmxvY2tQYXJ0cy5qb2luKCcnKSk7XG4gICAgcmVzdWx0UGFydHMucHVzaChCTE9DS19QTEFDRUhPTERFUik7XG4gIH1cbiAgcmV0dXJuIG5ldyBTdHJpbmdXaXRoRXNjYXBlZEJsb2NrcyhyZXN1bHRQYXJ0cy5qb2luKCcnKSwgZXNjYXBlZEJsb2Nrcyk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIvc2hhZG93X2Nzcy50c1xuICoqLyIsIi8vIFNvbWUgb2YgdGhlIGNvZGUgY29tZXMgZnJvbSBXZWJDb21wb25lbnRzLkpTXG4vLyBodHRwczovL2dpdGh1Yi5jb20vd2ViY29tcG9uZW50cy93ZWJjb21wb25lbnRzanMvYmxvYi9tYXN0ZXIvc3JjL0hUTUxJbXBvcnRzL3BhdGguanNcblxuaW1wb3J0IHtSZWdFeHAsIFJlZ0V4cFdyYXBwZXIsIFN0cmluZ1dyYXBwZXIsIGlzUHJlc2VudCwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7VXJsUmVzb2x2ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci91cmxfcmVzb2x2ZXInO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVXaXRoSW1wb3J0cyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzdHlsZTogc3RyaW5nLCBwdWJsaWMgc3R5bGVVcmxzOiBzdHJpbmdbXSkge31cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzU3R5bGVVcmxSZXNvbHZhYmxlKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChpc0JsYW5rKHVybCkgfHwgdXJsLmxlbmd0aCA9PT0gMCB8fCB1cmxbMF0gPT0gJy8nKSByZXR1cm4gZmFsc2U7XG4gIHZhciBzY2hlbWVNYXRjaCA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChfdXJsV2l0aFNjaGVtYVJlLCB1cmwpO1xuICByZXR1cm4gaXNCbGFuayhzY2hlbWVNYXRjaCkgfHwgc2NoZW1lTWF0Y2hbMV0gPT0gJ3BhY2thZ2UnIHx8IHNjaGVtZU1hdGNoWzFdID09ICdhc3NldCc7XG59XG5cbi8qKlxuICogUmV3cml0ZXMgc3R5bGVzaGVldHMgYnkgcmVzb2x2aW5nIGFuZCByZW1vdmluZyB0aGUgQGltcG9ydCB1cmxzIHRoYXRcbiAqIGFyZSBlaXRoZXIgcmVsYXRpdmUgb3IgZG9uJ3QgaGF2ZSBhIGBwYWNrYWdlOmAgc2NoZW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHRyYWN0U3R5bGVVcmxzKHJlc29sdmVyOiBVcmxSZXNvbHZlciwgYmFzZVVybDogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzVGV4dDogc3RyaW5nKTogU3R5bGVXaXRoSW1wb3J0cyB7XG4gIHZhciBmb3VuZFVybHMgPSBbXTtcbiAgdmFyIG1vZGlmaWVkQ3NzVGV4dCA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChjc3NUZXh0LCBfY3NzSW1wb3J0UmUsIChtKSA9PiB7XG4gICAgdmFyIHVybCA9IGlzUHJlc2VudChtWzFdKSA/IG1bMV0gOiBtWzJdO1xuICAgIGlmICghaXNTdHlsZVVybFJlc29sdmFibGUodXJsKSkge1xuICAgICAgLy8gRG8gbm90IGF0dGVtcHQgdG8gcmVzb2x2ZSBub24tcGFja2FnZSBhYnNvbHV0ZSBVUkxzIHdpdGggVVJJIHNjaGVtZVxuICAgICAgcmV0dXJuIG1bMF07XG4gICAgfVxuICAgIGZvdW5kVXJscy5wdXNoKHJlc29sdmVyLnJlc29sdmUoYmFzZVVybCwgdXJsKSk7XG4gICAgcmV0dXJuICcnO1xuICB9KTtcbiAgcmV0dXJuIG5ldyBTdHlsZVdpdGhJbXBvcnRzKG1vZGlmaWVkQ3NzVGV4dCwgZm91bmRVcmxzKTtcbn1cblxudmFyIF9jc3NJbXBvcnRSZSA9IC9AaW1wb3J0XFxzKyg/OnVybFxcKCk/XFxzKig/Oig/OlsnXCJdKFteJ1wiXSopKXwoW147XFwpXFxzXSopKVteO10qOz8vZztcbi8vIFRPRE86IGNhbid0IHVzZSAvXlteOi8/Iy5dKzovZyBkdWUgdG8gY2xhbmctZm9ybWF0IGJ1Zzpcbi8vICAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzQ1OTZcbnZhciBfdXJsV2l0aFNjaGVtYVJlID0gL14oW2EtekEtWlxcLVxcK1xcLl0rKTovZztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9zdHlsZV91cmxfcmVzb2x2ZXIudHNcbiAqKi8iLCJpbXBvcnQge2lzQmxhbmssIGlzUHJlc2VudCwgU3RyaW5nV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7XG4gIFJlbmRlckV2ZW50RGlzcGF0Y2hlcixcbiAgUmVuZGVyVGVtcGxhdGVDbWQsXG4gIFJlbmRlckNvbW1hbmRWaXNpdG9yLFxuICBSZW5kZXJCZWdpbkVsZW1lbnRDbWQsXG4gIFJlbmRlckJlZ2luQ29tcG9uZW50Q21kLFxuICBSZW5kZXJOZ0NvbnRlbnRDbWQsXG4gIFJlbmRlclRleHRDbWQsXG4gIFJlbmRlckVtYmVkZGVkVGVtcGxhdGVDbWQsXG4gIFJlbmRlckNvbXBvbmVudFRlbXBsYXRlXG59IGZyb20gJy4vYXBpJztcbmltcG9ydCB7RGVmYXVsdFJlbmRlclZpZXcsIERlZmF1bHRSZW5kZXJGcmFnbWVudFJlZn0gZnJvbSAnLi92aWV3JztcbmltcG9ydCB7Vmlld0VuY2Fwc3VsYXRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY2Fwc3VsYXRlU3R5bGVzKGNvbXBvbmVudFRlbXBsYXRlOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSk6IHN0cmluZ1tdIHtcbiAgdmFyIHByb2Nlc3NlZFN0eWxlcyA9IGNvbXBvbmVudFRlbXBsYXRlLnN0eWxlcztcbiAgaWYgKGNvbXBvbmVudFRlbXBsYXRlLmVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uLkVtdWxhdGVkKSB7XG4gICAgcHJvY2Vzc2VkU3R5bGVzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKGNvbXBvbmVudFRlbXBsYXRlLnN0eWxlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcG9uZW50VGVtcGxhdGUuc3R5bGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwcm9jZXNzZWRTdHlsZXNbaV0gPSBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGwoY29tcG9uZW50VGVtcGxhdGUuc3R5bGVzW2ldLCBDT01QT05FTlRfUkVHRVgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VGVtcGxhdGUuc2hvcnRJZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBwcm9jZXNzZWRTdHlsZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVSZW5kZXJWaWV3KGNvbXBvbmVudFRlbXBsYXRlOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtZHM6IFJlbmRlclRlbXBsYXRlQ21kW10sIGlucGxhY2VFbGVtZW50OiBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlRmFjdG9yeTogTm9kZUZhY3Rvcnk8YW55Pik6IERlZmF1bHRSZW5kZXJWaWV3PGFueT4ge1xuICB2YXIgdmlldzogRGVmYXVsdFJlbmRlclZpZXc8YW55PjtcbiAgdmFyIGV2ZW50RGlzcGF0Y2hlciA9IChib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyLCBldmVudE5hbWU6IHN0cmluZywgZXZlbnQ6IGFueSkgPT5cbiAgICAgIHZpZXcuZGlzcGF0Y2hSZW5kZXJFdmVudChib3VuZEVsZW1lbnRJbmRleCwgZXZlbnROYW1lLCBldmVudCk7XG4gIHZhciBjb250ZXh0ID0gbmV3IEJ1aWxkQ29udGV4dChldmVudERpc3BhdGNoZXIsIG5vZGVGYWN0b3J5LCBpbnBsYWNlRWxlbWVudCk7XG4gIGNvbnRleHQuYnVpbGQoY29tcG9uZW50VGVtcGxhdGUsIGNtZHMpO1xuICB2YXIgZnJhZ21lbnRzOiBEZWZhdWx0UmVuZGVyRnJhZ21lbnRSZWY8YW55PltdID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGV4dC5mcmFnbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICBmcmFnbWVudHMucHVzaChuZXcgRGVmYXVsdFJlbmRlckZyYWdtZW50UmVmKGNvbnRleHQuZnJhZ21lbnRzW2ldKSk7XG4gIH1cbiAgdmlldyA9IG5ldyBEZWZhdWx0UmVuZGVyVmlldzxhbnk+KGZyYWdtZW50cywgY29udGV4dC5ib3VuZFRleHROb2RlcywgY29udGV4dC5ib3VuZEVsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5uYXRpdmVTaGFkb3dSb290cywgY29udGV4dC5nbG9iYWxFdmVudEFkZGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQucm9vdENvbnRlbnRJbnNlcnRpb25Qb2ludHMpO1xuICByZXR1cm4gdmlldztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBOb2RlRmFjdG9yeTxOPiB7XG4gIHJlc29sdmVDb21wb25lbnRUZW1wbGF0ZSh0ZW1wbGF0ZUlkOiBzdHJpbmcpOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZTtcbiAgY3JlYXRlVGVtcGxhdGVBbmNob3IoYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdKTogTjtcbiAgY3JlYXRlRWxlbWVudChuYW1lOiBzdHJpbmcsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSk6IE47XG4gIGNyZWF0ZVJvb3RDb250ZW50SW5zZXJ0aW9uUG9pbnQoKTogTjtcbiAgbWVyZ2VFbGVtZW50KGV4aXN0aW5nOiBOLCBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10pO1xuICBjcmVhdGVTaGFkb3dSb290KGhvc3Q6IE4sIHRlbXBsYXRlSWQ6IHN0cmluZyk6IE47XG4gIGNyZWF0ZVRleHQodmFsdWU6IHN0cmluZyk6IE47XG4gIGFwcGVuZENoaWxkKHBhcmVudDogTiwgY2hpbGQ6IE4pO1xuICBvbihlbGVtZW50OiBOLCBldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKTtcbiAgZ2xvYmFsT24odGFyZ2V0OiBzdHJpbmcsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pOiBGdW5jdGlvbjtcbn1cblxuY2xhc3MgQnVpbGRDb250ZXh0PE4+IHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZXZlbnREaXNwYXRjaGVyOiBGdW5jdGlvbiwgcHVibGljIGZhY3Rvcnk6IE5vZGVGYWN0b3J5PE4+LFxuICAgICAgICAgICAgICBwcml2YXRlIF9pbnBsYWNlRWxlbWVudDogTikge1xuICAgIHRoaXMuaXNIb3N0ID0gaXNQcmVzZW50KChfaW5wbGFjZUVsZW1lbnQpKTtcbiAgfVxuICBwcml2YXRlIF9idWlsZGVyczogUmVuZGVyVmlld0J1aWxkZXI8Tj5bXSA9IFtdO1xuXG4gIGdsb2JhbEV2ZW50QWRkZXJzOiBGdW5jdGlvbltdID0gW107XG4gIGJvdW5kRWxlbWVudHM6IE5bXSA9IFtdO1xuICBib3VuZFRleHROb2RlczogTltdID0gW107XG4gIG5hdGl2ZVNoYWRvd1Jvb3RzOiBOW10gPSBbXTtcbiAgZnJhZ21lbnRzOiBOW11bXSA9IFtdO1xuICByb290Q29udGVudEluc2VydGlvblBvaW50czogTltdID0gW107XG4gIGNvbXBvbmVudENvdW50OiBudW1iZXIgPSAwO1xuICBpc0hvc3Q6IGJvb2xlYW47XG5cbiAgYnVpbGQodGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlLCBjbWRzOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKSB7XG4gICAgdGhpcy5lbnF1ZXVlUm9vdEJ1aWxkZXIodGVtcGxhdGUsIGNtZHMpO1xuICAgIHRoaXMuX2J1aWxkKHRoaXMuX2J1aWxkZXJzWzBdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2J1aWxkKGJ1aWxkZXI6IFJlbmRlclZpZXdCdWlsZGVyPE4+KSB7XG4gICAgdGhpcy5fYnVpbGRlcnMgPSBbXTtcbiAgICBidWlsZGVyLmJ1aWxkKHRoaXMpO1xuICAgIHZhciBlbnF1ZXVlZEJ1aWxkZXJzID0gdGhpcy5fYnVpbGRlcnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnF1ZXVlZEJ1aWxkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9idWlsZChlbnF1ZXVlZEJ1aWxkZXJzW2ldKTtcbiAgICB9XG4gIH1cblxuICBlbnF1ZXVlQ29tcG9uZW50QnVpbGRlcihjb21wb25lbnQ6IENvbXBvbmVudDxOPikge1xuICAgIHRoaXMuY29tcG9uZW50Q291bnQrKztcbiAgICB0aGlzLl9idWlsZGVycy5wdXNoKFxuICAgICAgICBuZXcgUmVuZGVyVmlld0J1aWxkZXI8Tj4oY29tcG9uZW50LCBudWxsLCBjb21wb25lbnQudGVtcGxhdGUsIGNvbXBvbmVudC50ZW1wbGF0ZS5jb21tYW5kcykpO1xuICB9XG5cbiAgZW5xdWV1ZUZyYWdtZW50QnVpbGRlcihwYXJlbnRDb21wb25lbnQ6IENvbXBvbmVudDxOPiwgcGFyZW50VGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmRzOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKSB7XG4gICAgdmFyIHJvb3ROb2RlcyA9IFtdO1xuICAgIHRoaXMuZnJhZ21lbnRzLnB1c2gocm9vdE5vZGVzKTtcbiAgICB0aGlzLl9idWlsZGVycy5wdXNoKFxuICAgICAgICBuZXcgUmVuZGVyVmlld0J1aWxkZXI8Tj4ocGFyZW50Q29tcG9uZW50LCByb290Tm9kZXMsIHBhcmVudFRlbXBsYXRlLCBjb21tYW5kcykpO1xuICB9XG5cbiAgZW5xdWV1ZVJvb3RCdWlsZGVyKHRlbXBsYXRlOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSwgY21kczogUmVuZGVyVGVtcGxhdGVDbWRbXSkge1xuICAgIHZhciByb290Tm9kZXMgPSBbXTtcbiAgICB0aGlzLmZyYWdtZW50cy5wdXNoKHJvb3ROb2Rlcyk7XG4gICAgdGhpcy5fYnVpbGRlcnMucHVzaChuZXcgUmVuZGVyVmlld0J1aWxkZXI8Tj4obnVsbCwgcm9vdE5vZGVzLCB0ZW1wbGF0ZSwgY21kcykpO1xuICB9XG5cbiAgY29uc3VtZUlucGxhY2VFbGVtZW50KCk6IE4ge1xuICAgIHZhciByZXN1bHQgPSB0aGlzLl9pbnBsYWNlRWxlbWVudDtcbiAgICB0aGlzLl9pbnBsYWNlRWxlbWVudCA9IG51bGw7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgdGFyZ2V0OiBzdHJpbmcsIGV2ZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGlzUHJlc2VudCh0YXJnZXQpKSB7XG4gICAgICB2YXIgaGFuZGxlciA9XG4gICAgICAgICAgY3JlYXRlRXZlbnRIYW5kbGVyKGJvdW5kRWxlbWVudEluZGV4LCBgJHt0YXJnZXR9OiR7ZXZlbnROYW1lfWAsIHRoaXMuX2V2ZW50RGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmdsb2JhbEV2ZW50QWRkZXJzLnB1c2goY3JlYXRlR2xvYmFsRXZlbnRBZGRlcih0YXJnZXQsIGV2ZW50TmFtZSwgaGFuZGxlciwgdGhpcy5mYWN0b3J5KSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBoYW5kbGVyID0gY3JlYXRlRXZlbnRIYW5kbGVyKGJvdW5kRWxlbWVudEluZGV4LCBldmVudE5hbWUsIHRoaXMuX2V2ZW50RGlzcGF0Y2hlcik7XG4gICAgICB0aGlzLmZhY3Rvcnkub24odGhpcy5ib3VuZEVsZW1lbnRzW2JvdW5kRWxlbWVudEluZGV4XSwgZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgICB9XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBjcmVhdGVFdmVudEhhbmRsZXIoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgZXZlbnROYW1lOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREaXNwYXRjaGVyOiBGdW5jdGlvbik6IEZ1bmN0aW9uIHtcbiAgcmV0dXJuICgkZXZlbnQpID0+IGV2ZW50RGlzcGF0Y2hlcihib3VuZEVsZW1lbnRJbmRleCwgZXZlbnROYW1lLCAkZXZlbnQpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVHbG9iYWxFdmVudEFkZGVyKHRhcmdldDogc3RyaW5nLCBldmVudE5hbWU6IHN0cmluZywgZXZlbnRIYW5kbGVyOiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUZhY3Rvcnk6IE5vZGVGYWN0b3J5PGFueT4pOiBGdW5jdGlvbiB7XG4gIHJldHVybiAoKSA9PiBub2RlRmFjdG9yeS5nbG9iYWxPbih0YXJnZXQsIGV2ZW50TmFtZSwgZXZlbnRIYW5kbGVyKTtcbn1cblxuY2xhc3MgUmVuZGVyVmlld0J1aWxkZXI8Tj4gaW1wbGVtZW50cyBSZW5kZXJDb21tYW5kVmlzaXRvciB7XG4gIHBhcmVudFN0YWNrOiBBcnJheTxOIHwgQ29tcG9uZW50PE4+PjtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGFyZW50Q29tcG9uZW50OiBDb21wb25lbnQ8Tj4sIHB1YmxpYyBmcmFnbWVudFJvb3ROb2RlczogTltdLFxuICAgICAgICAgICAgICBwdWJsaWMgdGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlLCBwdWJsaWMgY21kczogUmVuZGVyVGVtcGxhdGVDbWRbXSkge1xuICAgIHZhciByb290Tm9kZXNQYXJlbnQgPSBpc1ByZXNlbnQoZnJhZ21lbnRSb290Tm9kZXMpID8gbnVsbCA6IHBhcmVudENvbXBvbmVudC5zaGFkb3dSb290O1xuICAgIHRoaXMucGFyZW50U3RhY2sgPSBbcm9vdE5vZGVzUGFyZW50XTtcbiAgfVxuXG4gIGJ1aWxkKGNvbnRleHQ6IEJ1aWxkQ29udGV4dDxOPikge1xuICAgIHZhciBjbWRzID0gdGhpcy5jbWRzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY21kcy5sZW5ndGg7IGkrKykge1xuICAgICAgY21kc1tpXS52aXNpdCh0aGlzLCBjb250ZXh0KTtcbiAgICB9XG4gIH1cblxuICBnZXQgcGFyZW50KCk6IE4gfCBDb21wb25lbnQ8Tj4geyByZXR1cm4gdGhpcy5wYXJlbnRTdGFja1t0aGlzLnBhcmVudFN0YWNrLmxlbmd0aCAtIDFdOyB9XG5cbiAgdmlzaXRUZXh0KGNtZDogUmVuZGVyVGV4dENtZCwgY29udGV4dDogQnVpbGRDb250ZXh0PE4+KTogYW55IHtcbiAgICB2YXIgdGV4dCA9IGNvbnRleHQuZmFjdG9yeS5jcmVhdGVUZXh0KGNtZC52YWx1ZSk7XG4gICAgdGhpcy5fYWRkQ2hpbGQodGV4dCwgY21kLm5nQ29udGVudEluZGV4LCBjb250ZXh0KTtcbiAgICBpZiAoY21kLmlzQm91bmQpIHtcbiAgICAgIGNvbnRleHQuYm91bmRUZXh0Tm9kZXMucHVzaCh0ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXROZ0NvbnRlbnQoY21kOiBSZW5kZXJOZ0NvbnRlbnRDbWQsIGNvbnRleHQ6IEJ1aWxkQ29udGV4dDxOPik6IGFueSB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnBhcmVudENvbXBvbmVudCkpIHtcbiAgICAgIGlmICh0aGlzLnBhcmVudENvbXBvbmVudC5pc1Jvb3QpIHtcbiAgICAgICAgdmFyIGluc2VydGlvblBvaW50ID0gY29udGV4dC5mYWN0b3J5LmNyZWF0ZVJvb3RDb250ZW50SW5zZXJ0aW9uUG9pbnQoKTtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50IGluc3RhbmNlb2YgQ29tcG9uZW50KSB7XG4gICAgICAgICAgY29udGV4dC5mYWN0b3J5LmFwcGVuZENoaWxkKCg8Q29tcG9uZW50PE4+PnRoaXMucGFyZW50KS5zaGFkb3dSb290LCBpbnNlcnRpb25Qb2ludCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29udGV4dC5mYWN0b3J5LmFwcGVuZENoaWxkKDxOPnRoaXMucGFyZW50LCBpbnNlcnRpb25Qb2ludCk7XG4gICAgICAgIH1cbiAgICAgICAgY29udGV4dC5yb290Q29udGVudEluc2VydGlvblBvaW50cy5wdXNoKGluc2VydGlvblBvaW50KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhciBwcm9qZWN0ZWROb2RlcyA9IHRoaXMucGFyZW50Q29tcG9uZW50LnByb2plY3QoY21kLmluZGV4KTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcm9qZWN0ZWROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIHZhciBub2RlID0gcHJvamVjdGVkTm9kZXNbaV07XG4gICAgICAgICAgdGhpcy5fYWRkQ2hpbGQobm9kZSwgY21kLm5nQ29udGVudEluZGV4LCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdEJlZ2luRWxlbWVudChjbWQ6IFJlbmRlckJlZ2luRWxlbWVudENtZCwgY29udGV4dDogQnVpbGRDb250ZXh0PE4+KTogYW55IHtcbiAgICB0aGlzLnBhcmVudFN0YWNrLnB1c2godGhpcy5fYmVnaW5FbGVtZW50KGNtZCwgY29udGV4dCwgbnVsbCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RW5kRWxlbWVudChjb250ZXh0OiBCdWlsZENvbnRleHQ8Tj4pOiBhbnkge1xuICAgIHRoaXMuX2VuZEVsZW1lbnQoKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdEJlZ2luQ29tcG9uZW50KGNtZDogUmVuZGVyQmVnaW5Db21wb25lbnRDbWQsIGNvbnRleHQ6IEJ1aWxkQ29udGV4dDxOPik6IGFueSB7XG4gICAgdmFyIHRlbXBsYXRlSWQgPSBjbWQudGVtcGxhdGVJZDtcbiAgICB2YXIgdHBsID0gY29udGV4dC5mYWN0b3J5LnJlc29sdmVDb21wb25lbnRUZW1wbGF0ZSh0ZW1wbGF0ZUlkKTtcbiAgICB2YXIgZWwgPSB0aGlzLl9iZWdpbkVsZW1lbnQoY21kLCBjb250ZXh0LCB0cGwpO1xuICAgIHZhciByb290ID0gZWw7XG5cbiAgICBpZiAodHBsLmVuY2Fwc3VsYXRpb24gPT09IFZpZXdFbmNhcHN1bGF0aW9uLk5hdGl2ZSkge1xuICAgICAgcm9vdCA9IGNvbnRleHQuZmFjdG9yeS5jcmVhdGVTaGFkb3dSb290KGVsLCB0ZW1wbGF0ZUlkKTtcbiAgICAgIGNvbnRleHQubmF0aXZlU2hhZG93Um9vdHMucHVzaChyb290KTtcbiAgICB9XG4gICAgdmFyIGlzUm9vdCA9IGNvbnRleHQuY29tcG9uZW50Q291bnQgPT09IDAgJiYgY29udGV4dC5pc0hvc3Q7XG4gICAgdmFyIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoZWwsIHJvb3QsIGlzUm9vdCwgdHBsKTtcbiAgICBjb250ZXh0LmVucXVldWVDb21wb25lbnRCdWlsZGVyKGNvbXBvbmVudCk7XG4gICAgdGhpcy5wYXJlbnRTdGFjay5wdXNoKGNvbXBvbmVudCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRFbmRDb21wb25lbnQoY29udGV4dDogQnVpbGRDb250ZXh0PE4+KTogYW55IHtcbiAgICB0aGlzLl9lbmRFbGVtZW50KCk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRFbWJlZGRlZFRlbXBsYXRlKGNtZDogUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZCwgY29udGV4dDogQnVpbGRDb250ZXh0PE4+KTogYW55IHtcbiAgICB2YXIgZWwgPSBjb250ZXh0LmZhY3RvcnkuY3JlYXRlVGVtcGxhdGVBbmNob3IoY21kLmF0dHJOYW1lQW5kVmFsdWVzKTtcbiAgICB0aGlzLl9hZGRDaGlsZChlbCwgY21kLm5nQ29udGVudEluZGV4LCBjb250ZXh0KTtcbiAgICBjb250ZXh0LmJvdW5kRWxlbWVudHMucHVzaChlbCk7XG4gICAgaWYgKGNtZC5pc01lcmdlZCkge1xuICAgICAgY29udGV4dC5lbnF1ZXVlRnJhZ21lbnRCdWlsZGVyKHRoaXMucGFyZW50Q29tcG9uZW50LCB0aGlzLnRlbXBsYXRlLCBjbWQuY2hpbGRyZW4pO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgX2JlZ2luRWxlbWVudChjbWQ6IFJlbmRlckJlZ2luRWxlbWVudENtZCwgY29udGV4dDogQnVpbGRDb250ZXh0PE4+LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlKTogTiB7XG4gICAgdmFyIGVsOiBOID0gY29udGV4dC5jb25zdW1lSW5wbGFjZUVsZW1lbnQoKTtcbiAgICB2YXIgYXR0ck5hbWVBbmRWYWx1ZXMgPSBjbWQuYXR0ck5hbWVBbmRWYWx1ZXM7XG4gICAgdmFyIHRlbXBsYXRlRW11bGF0ZWRFbmNhcHN1bGF0aW9uID0gdGhpcy50ZW1wbGF0ZS5lbmNhcHN1bGF0aW9uID09PSBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZDtcbiAgICB2YXIgY29tcG9uZW50RW11bGF0ZWRFbmNhcHN1bGF0aW9uID1cbiAgICAgICAgaXNQcmVzZW50KGNvbXBvbmVudFRlbXBsYXRlKSAmJlxuICAgICAgICBjb21wb25lbnRUZW1wbGF0ZS5lbmNhcHN1bGF0aW9uID09PSBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZDtcbiAgICB2YXIgbmV3QXR0ckxlbmd0aCA9IGF0dHJOYW1lQW5kVmFsdWVzLmxlbmd0aCArICh0ZW1wbGF0ZUVtdWxhdGVkRW5jYXBzdWxhdGlvbiA/IDIgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50RW11bGF0ZWRFbmNhcHN1bGF0aW9uID8gMiA6IDApO1xuICAgIGlmIChuZXdBdHRyTGVuZ3RoID4gYXR0ck5hbWVBbmRWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAvLyBOb3RlOiBOZWVkIHRvIGNsb25lIGF0dHJOYW1lQW5kVmFsdWVzIHRvIG1ha2UgaXQgd3JpdGFibGUhXG4gICAgICB2YXIgbmV3QXR0ck5hbWVBbmRWYWx1ZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUobmV3QXR0ckxlbmd0aCk7XG4gICAgICB2YXIgYXR0ckluZGV4O1xuICAgICAgZm9yIChhdHRySW5kZXggPSAwOyBhdHRySW5kZXggPCBhdHRyTmFtZUFuZFZhbHVlcy5sZW5ndGg7IGF0dHJJbmRleCsrKSB7XG4gICAgICAgIG5ld0F0dHJOYW1lQW5kVmFsdWVzW2F0dHJJbmRleF0gPSBhdHRyTmFtZUFuZFZhbHVlc1thdHRySW5kZXhdO1xuICAgICAgfVxuICAgICAgaWYgKHRlbXBsYXRlRW11bGF0ZWRFbmNhcHN1bGF0aW9uKSB7XG4gICAgICAgIG5ld0F0dHJOYW1lQW5kVmFsdWVzW2F0dHJJbmRleCsrXSA9IF9zaGltQ29udGVudEF0dHJpYnV0ZSh0aGlzLnRlbXBsYXRlLnNob3J0SWQpO1xuICAgICAgICBuZXdBdHRyTmFtZUFuZFZhbHVlc1thdHRySW5kZXgrK10gPSAnJztcbiAgICAgIH1cbiAgICAgIGlmIChjb21wb25lbnRFbXVsYXRlZEVuY2Fwc3VsYXRpb24pIHtcbiAgICAgICAgbmV3QXR0ck5hbWVBbmRWYWx1ZXNbYXR0ckluZGV4KytdID0gX3NoaW1Ib3N0QXR0cmlidXRlKGNvbXBvbmVudFRlbXBsYXRlLnNob3J0SWQpO1xuICAgICAgICBuZXdBdHRyTmFtZUFuZFZhbHVlc1thdHRySW5kZXgrK10gPSAnJztcbiAgICAgIH1cbiAgICAgIGF0dHJOYW1lQW5kVmFsdWVzID0gbmV3QXR0ck5hbWVBbmRWYWx1ZXM7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQoZWwpKSB7XG4gICAgICBjb250ZXh0LmZhY3RvcnkubWVyZ2VFbGVtZW50KGVsLCBhdHRyTmFtZUFuZFZhbHVlcyk7XG4gICAgICB0aGlzLmZyYWdtZW50Um9vdE5vZGVzLnB1c2goZWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbCA9IGNvbnRleHQuZmFjdG9yeS5jcmVhdGVFbGVtZW50KGNtZC5uYW1lLCBhdHRyTmFtZUFuZFZhbHVlcyk7XG4gICAgICB0aGlzLl9hZGRDaGlsZChlbCwgY21kLm5nQ29udGVudEluZGV4LCBjb250ZXh0KTtcbiAgICB9XG4gICAgaWYgKGNtZC5pc0JvdW5kKSB7XG4gICAgICB2YXIgYm91bmRFbGVtZW50SW5kZXggPSBjb250ZXh0LmJvdW5kRWxlbWVudHMubGVuZ3RoO1xuICAgICAgY29udGV4dC5ib3VuZEVsZW1lbnRzLnB1c2goZWwpO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbWQuZXZlbnRUYXJnZXRBbmROYW1lcy5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgICB2YXIgdGFyZ2V0ID0gY21kLmV2ZW50VGFyZ2V0QW5kTmFtZXNbaV07XG4gICAgICAgIHZhciBldmVudE5hbWUgPSBjbWQuZXZlbnRUYXJnZXRBbmROYW1lc1tpICsgMV07XG4gICAgICAgIGNvbnRleHQuYWRkRXZlbnRMaXN0ZW5lcihib3VuZEVsZW1lbnRJbmRleCwgdGFyZ2V0LCBldmVudE5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWw7XG4gIH1cblxuICBwcml2YXRlIF9lbmRFbGVtZW50KCkgeyB0aGlzLnBhcmVudFN0YWNrLnBvcCgpOyB9XG5cbiAgcHJpdmF0ZSBfYWRkQ2hpbGQobm9kZTogTiwgbmdDb250ZW50SW5kZXg6IG51bWJlciwgY29udGV4dDogQnVpbGRDb250ZXh0PE4+KSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50O1xuICAgIGlmIChpc1ByZXNlbnQocGFyZW50KSkge1xuICAgICAgaWYgKHBhcmVudCBpbnN0YW5jZW9mIENvbXBvbmVudCkge1xuICAgICAgICBwYXJlbnQuYWRkQ29udGVudE5vZGUobmdDb250ZW50SW5kZXgsIG5vZGUsIGNvbnRleHQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29udGV4dC5mYWN0b3J5LmFwcGVuZENoaWxkKDxOPnBhcmVudCwgbm9kZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuZnJhZ21lbnRSb290Tm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgQ29tcG9uZW50PE4+IHtcbiAgcHJpdmF0ZSBjb250ZW50Tm9kZXNCeU5nQ29udGVudEluZGV4OiBOW11bXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBob3N0RWxlbWVudDogTiwgcHVibGljIHNoYWRvd1Jvb3Q6IE4sIHB1YmxpYyBpc1Jvb3Q6IGJvb2xlYW4sXG4gICAgICAgICAgICAgIHB1YmxpYyB0ZW1wbGF0ZTogUmVuZGVyQ29tcG9uZW50VGVtcGxhdGUpIHt9XG4gIGFkZENvbnRlbnROb2RlKG5nQ29udGVudEluZGV4OiBudW1iZXIsIG5vZGU6IE4sIGNvbnRleHQ6IEJ1aWxkQ29udGV4dDxOPikge1xuICAgIGlmIChpc0JsYW5rKG5nQ29udGVudEluZGV4KSkge1xuICAgICAgaWYgKHRoaXMudGVtcGxhdGUuZW5jYXBzdWxhdGlvbiA9PT0gVmlld0VuY2Fwc3VsYXRpb24uTmF0aXZlKSB7XG4gICAgICAgIGNvbnRleHQuZmFjdG9yeS5hcHBlbmRDaGlsZCh0aGlzLmhvc3RFbGVtZW50LCBub2RlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgd2hpbGUgKHRoaXMuY29udGVudE5vZGVzQnlOZ0NvbnRlbnRJbmRleC5sZW5ndGggPD0gbmdDb250ZW50SW5kZXgpIHtcbiAgICAgICAgdGhpcy5jb250ZW50Tm9kZXNCeU5nQ29udGVudEluZGV4LnB1c2goW10pO1xuICAgICAgfVxuICAgICAgdGhpcy5jb250ZW50Tm9kZXNCeU5nQ29udGVudEluZGV4W25nQ29udGVudEluZGV4XS5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxuICBwcm9qZWN0KG5nQ29udGVudEluZGV4OiBudW1iZXIpOiBOW10ge1xuICAgIHJldHVybiBuZ0NvbnRlbnRJbmRleCA8IHRoaXMuY29udGVudE5vZGVzQnlOZ0NvbnRlbnRJbmRleC5sZW5ndGggP1xuICAgICAgICAgICAgICAgdGhpcy5jb250ZW50Tm9kZXNCeU5nQ29udGVudEluZGV4W25nQ29udGVudEluZGV4XSA6XG4gICAgICAgICAgICAgICBbXTtcbiAgfVxufVxuXG52YXIgQ09NUE9ORU5UX1JFR0VYID0gLyVDT01QJS9nO1xuZXhwb3J0IGNvbnN0IENPTVBPTkVOVF9WQVJJQUJMRSA9ICclQ09NUCUnO1xuZXhwb3J0IGNvbnN0IEhPU1RfQVRUUiA9IGBfbmdob3N0LSR7Q09NUE9ORU5UX1ZBUklBQkxFfWA7XG5leHBvcnQgY29uc3QgQ09OVEVOVF9BVFRSID0gYF9uZ2NvbnRlbnQtJHtDT01QT05FTlRfVkFSSUFCTEV9YDtcblxuZnVuY3Rpb24gX3NoaW1Db250ZW50QXR0cmlidXRlKGNvbXBvbmVudFNob3J0SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGwoQ09OVEVOVF9BVFRSLCBDT01QT05FTlRfUkVHRVgsIGNvbXBvbmVudFNob3J0SWQpO1xufVxuXG5mdW5jdGlvbiBfc2hpbUhvc3RBdHRyaWJ1dGUoY29tcG9uZW50U2hvcnRJZDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChIT1NUX0FUVFIsIENPTVBPTkVOVF9SRUdFWCwgY29tcG9uZW50U2hvcnRJZCk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvdmlld19mYWN0b3J5LnRzXG4gKiovIiwiaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlciwgTWFwLCBTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIHN0cmluZ2lmeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuaW1wb3J0IHtcbiAgUmVuZGVyQ29tcG9uZW50VGVtcGxhdGUsXG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlckV2ZW50RGlzcGF0Y2hlcixcbiAgUmVuZGVyVGVtcGxhdGVDbWQsXG4gIFJlbmRlclByb3RvVmlld1JlZixcbiAgUmVuZGVyRnJhZ21lbnRSZWZcbn0gZnJvbSAnLi9hcGknO1xuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFByb3RvVmlld1JlZiBleHRlbmRzIFJlbmRlclByb3RvVmlld1JlZiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyB0ZW1wbGF0ZTogUmVuZGVyQ29tcG9uZW50VGVtcGxhdGUsIHB1YmxpYyBjbWRzOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgRGVmYXVsdFJlbmRlckZyYWdtZW50UmVmPE4+IGV4dGVuZHMgUmVuZGVyRnJhZ21lbnRSZWYge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbm9kZXM6IE5bXSkgeyBzdXBlcigpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBEZWZhdWx0UmVuZGVyVmlldzxOPiBleHRlbmRzIFJlbmRlclZpZXdSZWYge1xuICBoeWRyYXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBldmVudERpc3BhdGNoZXI6IFJlbmRlckV2ZW50RGlzcGF0Y2hlciA9IG51bGw7XG4gIGdsb2JhbEV2ZW50UmVtb3ZlcnM6IEZ1bmN0aW9uW10gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBmcmFnbWVudHM6IERlZmF1bHRSZW5kZXJGcmFnbWVudFJlZjxOPltdLCBwdWJsaWMgYm91bmRUZXh0Tm9kZXM6IE5bXSxcbiAgICAgICAgICAgICAgcHVibGljIGJvdW5kRWxlbWVudHM6IE5bXSwgcHVibGljIG5hdGl2ZVNoYWRvd1Jvb3RzOiBOW10sXG4gICAgICAgICAgICAgIHB1YmxpYyBnbG9iYWxFdmVudEFkZGVyczogRnVuY3Rpb25bXSwgcHVibGljIHJvb3RDb250ZW50SW5zZXJ0aW9uUG9pbnRzOiBOW10pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgaHlkcmF0ZSgpIHtcbiAgICBpZiAodGhpcy5oeWRyYXRlZCkgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ1RoZSB2aWV3IGlzIGFscmVhZHkgaHlkcmF0ZWQuJyk7XG4gICAgdGhpcy5oeWRyYXRlZCA9IHRydWU7XG4gICAgdGhpcy5nbG9iYWxFdmVudFJlbW92ZXJzID0gTGlzdFdyYXBwZXIuY3JlYXRlRml4ZWRTaXplKHRoaXMuZ2xvYmFsRXZlbnRBZGRlcnMubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuZ2xvYmFsRXZlbnRBZGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHRoaXMuZ2xvYmFsRXZlbnRSZW1vdmVyc1tpXSA9IHRoaXMuZ2xvYmFsRXZlbnRBZGRlcnNbaV0oKTtcbiAgICB9XG4gIH1cblxuICBkZWh5ZHJhdGUoKSB7XG4gICAgaWYgKCF0aGlzLmh5ZHJhdGVkKSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignVGhlIHZpZXcgaXMgYWxyZWFkeSBkZWh5ZHJhdGVkLicpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5nbG9iYWxFdmVudFJlbW92ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmdsb2JhbEV2ZW50UmVtb3ZlcnNbaV0oKTtcbiAgICB9XG4gICAgdGhpcy5nbG9iYWxFdmVudFJlbW92ZXJzID0gbnVsbDtcbiAgICB0aGlzLmh5ZHJhdGVkID0gZmFsc2U7XG4gIH1cblxuICBzZXRFdmVudERpc3BhdGNoZXIoZGlzcGF0Y2hlcjogUmVuZGVyRXZlbnREaXNwYXRjaGVyKSB7IHRoaXMuZXZlbnREaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjsgfVxuXG4gIGRpc3BhdGNoUmVuZGVyRXZlbnQoYm91bmRFbGVtZW50SW5kZXg6IG51bWJlciwgZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50OiBhbnkpOiBib29sZWFuIHtcbiAgICB2YXIgYWxsb3dEZWZhdWx0QmVoYXZpb3IgPSB0cnVlO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5ldmVudERpc3BhdGNoZXIpKSB7XG4gICAgICB2YXIgbG9jYWxzID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbiAgICAgIGxvY2Fscy5zZXQoJyRldmVudCcsIGV2ZW50KTtcbiAgICAgIGFsbG93RGVmYXVsdEJlaGF2aW9yID1cbiAgICAgICAgICB0aGlzLmV2ZW50RGlzcGF0Y2hlci5kaXNwYXRjaFJlbmRlckV2ZW50KGJvdW5kRWxlbWVudEluZGV4LCBldmVudE5hbWUsIGxvY2Fscyk7XG4gICAgfVxuICAgIHJldHVybiBhbGxvd0RlZmF1bHRCZWhhdmlvcjtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3ZpZXcudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudCwgaXNCbGFuaywgVHlwZSwgaXNTdHJpbmcsIFN0cmluZ1dyYXBwZXIsIElTX0RBUlR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge1NldFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXIsIExpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtcbiAgVGVtcGxhdGVDbWQsXG4gIFRleHRDbWQsXG4gIE5nQ29udGVudENtZCxcbiAgQmVnaW5FbGVtZW50Q21kLFxuICBFbmRFbGVtZW50Q21kLFxuICBCZWdpbkNvbXBvbmVudENtZCxcbiAgRW5kQ29tcG9uZW50Q21kLFxuICBFbWJlZGRlZFRlbXBsYXRlQ21kLFxuICBDb21waWxlZENvbXBvbmVudFRlbXBsYXRlXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci90ZW1wbGF0ZV9jb21tYW5kcyc7XG5pbXBvcnQge1xuICBUZW1wbGF0ZUFzdCxcbiAgVGVtcGxhdGVBc3RWaXNpdG9yLFxuICBOZ0NvbnRlbnRBc3QsXG4gIEVtYmVkZGVkVGVtcGxhdGVBc3QsXG4gIEVsZW1lbnRBc3QsXG4gIFZhcmlhYmxlQXN0LFxuICBCb3VuZEV2ZW50QXN0LFxuICBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdCxcbiAgQXR0ckFzdCxcbiAgQm91bmRUZXh0QXN0LFxuICBUZXh0QXN0LFxuICBEaXJlY3RpdmVBc3QsXG4gIEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QsXG4gIHRlbXBsYXRlVmlzaXRBbGxcbn0gZnJvbSAnLi90ZW1wbGF0ZV9hc3QnO1xuaW1wb3J0IHtDb21waWxlVHlwZU1ldGFkYXRhLCBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGF9IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7U291cmNlRXhwcmVzc2lvbnMsIFNvdXJjZUV4cHJlc3Npb24sIG1vZHVsZVJlZn0gZnJvbSAnLi9zb3VyY2VfbW9kdWxlJztcblxuaW1wb3J0IHtWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEvdmlldyc7XG5pbXBvcnQge1xuICBlc2NhcGVTaW5nbGVRdW90ZVN0cmluZyxcbiAgY29kZUdlbkNvbnN0Q29uc3RydWN0b3JDYWxsLFxuICBjb2RlR2VuVmFsdWVGbixcbiAgTU9EVUxFX1NVRkZJWFxufSBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5cbmV4cG9ydCB2YXIgVEVNUExBVEVfQ09NTUFORFNfTU9EVUxFX1JFRiA9XG4gICAgbW9kdWxlUmVmKGBwYWNrYWdlOmFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci90ZW1wbGF0ZV9jb21tYW5kcyR7TU9EVUxFX1NVRkZJWH1gKTtcblxuY29uc3QgSU1QTElDSVRfVEVNUExBVEVfVkFSID0gJ1xcJGltcGxpY2l0JztcbmNvbnN0IENMQVNTX0FUVFIgPSAnY2xhc3MnO1xuY29uc3QgU1RZTEVfQVRUUiA9ICdzdHlsZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBDb21tYW5kQ29tcGlsZXIge1xuICBjb21waWxlQ29tcG9uZW50UnVudGltZShjb21wb25lbnQ6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSwgdGVtcGxhdGU6IFRlbXBsYXRlQXN0W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdG9yRmFjdG9yaWVzOiBGdW5jdGlvbltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUZW1wbGF0ZUZhY3Rvcnk6IEZ1bmN0aW9uKTogVGVtcGxhdGVDbWRbXSB7XG4gICAgdmFyIHZpc2l0b3IgPSBuZXcgQ29tbWFuZEJ1aWxkZXJWaXNpdG9yKFxuICAgICAgICBuZXcgUnVudGltZUNvbW1hbmRGYWN0b3J5KGNvbXBvbmVudCwgY29tcG9uZW50VGVtcGxhdGVGYWN0b3J5LCBjaGFuZ2VEZXRlY3RvckZhY3RvcmllcyksIDApO1xuICAgIHRlbXBsYXRlVmlzaXRBbGwodmlzaXRvciwgdGVtcGxhdGUpO1xuICAgIHJldHVybiB2aXNpdG9yLnJlc3VsdDtcbiAgfVxuXG4gIGNvbXBpbGVDb21wb25lbnRDb2RlR2VuKGNvbXBvbmVudDogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLCB0ZW1wbGF0ZTogVGVtcGxhdGVBc3RbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0b3JGYWN0b3J5RXhwcmVzc2lvbnM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUZW1wbGF0ZUZhY3Rvcnk6IEZ1bmN0aW9uKTogU291cmNlRXhwcmVzc2lvbiB7XG4gICAgdmFyIHZpc2l0b3IgPVxuICAgICAgICBuZXcgQ29tbWFuZEJ1aWxkZXJWaXNpdG9yKG5ldyBDb2RlZ2VuQ29tbWFuZEZhY3RvcnkoY29tcG9uZW50LCBjb21wb25lbnRUZW1wbGF0ZUZhY3RvcnksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RvckZhY3RvcnlFeHByZXNzaW9ucyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbCh2aXNpdG9yLCB0ZW1wbGF0ZSk7XG4gICAgcmV0dXJuIG5ldyBTb3VyY2VFeHByZXNzaW9uKFtdLCBjb2RlR2VuQXJyYXkodmlzaXRvci5yZXN1bHQpKTtcbiAgfVxufVxuXG5pbnRlcmZhY2UgQ29tbWFuZEZhY3Rvcnk8Uj4ge1xuICBjcmVhdGVUZXh0KHZhbHVlOiBzdHJpbmcsIGlzQm91bmQ6IGJvb2xlYW4sIG5nQ29udGVudEluZGV4OiBudW1iZXIpOiBSO1xuICBjcmVhdGVOZ0NvbnRlbnQoaW5kZXg6IG51bWJlciwgbmdDb250ZW50SW5kZXg6IG51bWJlcik6IFI7XG4gIGNyZWF0ZUJlZ2luRWxlbWVudChuYW1lOiBzdHJpbmcsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSxcbiAgICAgICAgICAgICAgICAgICAgIGlzQm91bmQ6IGJvb2xlYW4sIG5nQ29udGVudEluZGV4OiBudW1iZXIpOiBSO1xuICBjcmVhdGVFbmRFbGVtZW50KCk6IFI7XG4gIGNyZWF0ZUJlZ2luQ29tcG9uZW50KG5hbWU6IHN0cmluZywgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBldmVudFRhcmdldEFuZE5hbWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10sXG4gICAgICAgICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKTogUjtcbiAgY3JlYXRlRW5kQ29tcG9uZW50KCk6IFI7XG4gIGNyZWF0ZUVtYmVkZGVkVGVtcGxhdGUoZW1iZWRkZWRUZW1wbGF0ZUluZGV4OiBudW1iZXIsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpc01lcmdlZDogYm9vbGVhbiwgbmdDb250ZW50SW5kZXg6IG51bWJlciwgY2hpbGRyZW46IFJbXSk6IFI7XG59XG5cbmNsYXNzIFJ1bnRpbWVDb21tYW5kRmFjdG9yeSBpbXBsZW1lbnRzIENvbW1hbmRGYWN0b3J5PFRlbXBsYXRlQ21kPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29tcG9uZW50OiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50VGVtcGxhdGVGYWN0b3J5OiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvckZhY3RvcmllczogRnVuY3Rpb25bXSkge31cbiAgcHJpdmF0ZSBfbWFwRGlyZWN0aXZlcyhkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSk6IFR5cGVbXSB7XG4gICAgcmV0dXJuIGRpcmVjdGl2ZXMubWFwKGRpcmVjdGl2ZSA9PiBkaXJlY3RpdmUudHlwZS5ydW50aW1lKTtcbiAgfVxuXG4gIGNyZWF0ZVRleHQodmFsdWU6IHN0cmluZywgaXNCb3VuZDogYm9vbGVhbiwgbmdDb250ZW50SW5kZXg6IG51bWJlcik6IFRlbXBsYXRlQ21kIHtcbiAgICByZXR1cm4gbmV3IFRleHRDbWQodmFsdWUsIGlzQm91bmQsIG5nQ29udGVudEluZGV4KTtcbiAgfVxuICBjcmVhdGVOZ0NvbnRlbnQoaW5kZXg6IG51bWJlciwgbmdDb250ZW50SW5kZXg6IG51bWJlcik6IFRlbXBsYXRlQ21kIHtcbiAgICByZXR1cm4gbmV3IE5nQ29udGVudENtZChpbmRleCwgbmdDb250ZW50SW5kZXgpO1xuICB9XG4gIGNyZWF0ZUJlZ2luRWxlbWVudChuYW1lOiBzdHJpbmcsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSxcbiAgICAgICAgICAgICAgICAgICAgIGlzQm91bmQ6IGJvb2xlYW4sIG5nQ29udGVudEluZGV4OiBudW1iZXIpOiBUZW1wbGF0ZUNtZCB7XG4gICAgcmV0dXJuIG5ldyBCZWdpbkVsZW1lbnRDbWQobmFtZSwgYXR0ck5hbWVBbmRWYWx1ZXMsIGV2ZW50VGFyZ2V0QW5kTmFtZXMsIHZhcmlhYmxlTmFtZUFuZFZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXBEaXJlY3RpdmVzKGRpcmVjdGl2ZXMpLCBpc0JvdW5kLCBuZ0NvbnRlbnRJbmRleCk7XG4gIH1cbiAgY3JlYXRlRW5kRWxlbWVudCgpOiBUZW1wbGF0ZUNtZCB7IHJldHVybiBuZXcgRW5kRWxlbWVudENtZCgpOyB9XG4gIGNyZWF0ZUJlZ2luQ29tcG9uZW50KG5hbWU6IHN0cmluZywgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBldmVudFRhcmdldEFuZE5hbWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10sXG4gICAgICAgICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKTogVGVtcGxhdGVDbWQge1xuICAgIHZhciBuZXN0ZWRUZW1wbGF0ZUFjY2Vzc29yID0gdGhpcy5jb21wb25lbnRUZW1wbGF0ZUZhY3RvcnkoZGlyZWN0aXZlc1swXSk7XG4gICAgcmV0dXJuIG5ldyBCZWdpbkNvbXBvbmVudENtZChuYW1lLCBhdHRyTmFtZUFuZFZhbHVlcywgZXZlbnRUYXJnZXRBbmROYW1lcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZUFuZFZhbHVlcywgdGhpcy5fbWFwRGlyZWN0aXZlcyhkaXJlY3RpdmVzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb24sIG5nQ29udGVudEluZGV4LCBuZXN0ZWRUZW1wbGF0ZUFjY2Vzc29yKTtcbiAgfVxuICBjcmVhdGVFbmRDb21wb25lbnQoKTogVGVtcGxhdGVDbWQgeyByZXR1cm4gbmV3IEVuZENvbXBvbmVudENtZCgpOyB9XG4gIGNyZWF0ZUVtYmVkZGVkVGVtcGxhdGUoZW1iZWRkZWRUZW1wbGF0ZUluZGV4OiBudW1iZXIsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICBpc01lcmdlZDogYm9vbGVhbiwgbmdDb250ZW50SW5kZXg6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogVGVtcGxhdGVDbWRbXSk6IFRlbXBsYXRlQ21kIHtcbiAgICByZXR1cm4gbmV3IEVtYmVkZGVkVGVtcGxhdGVDbWQoYXR0ck5hbWVBbmRWYWx1ZXMsIHZhcmlhYmxlTmFtZUFuZFZhbHVlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwRGlyZWN0aXZlcyhkaXJlY3RpdmVzKSwgaXNNZXJnZWQsIG5nQ29udGVudEluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZURldGVjdG9yRmFjdG9yaWVzW2VtYmVkZGVkVGVtcGxhdGVJbmRleF0sIGNoaWxkcmVuKTtcbiAgfVxufVxuXG5jbGFzcyBDb2RlZ2VuQ29tbWFuZEZhY3RvcnkgaW1wbGVtZW50cyBDb21tYW5kRmFjdG9yeTxFeHByZXNzaW9uPiB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY29tcG9uZW50OiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gICAgICAgICAgICAgIHByaXZhdGUgY29tcG9uZW50VGVtcGxhdGVGYWN0b3J5OiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBjaGFuZ2VEZXRlY3RvckZhY3RvcnlFeHByZXNzaW9uczogc3RyaW5nW10pIHt9XG5cbiAgY3JlYXRlVGV4dCh2YWx1ZTogc3RyaW5nLCBpc0JvdW5kOiBib29sZWFuLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKTogRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uKFxuICAgICAgICBgJHtjb2RlR2VuQ29uc3RDb25zdHJ1Y3RvckNhbGwoVEVNUExBVEVfQ09NTUFORFNfTU9EVUxFX1JFRisnVGV4dENtZCcpfSgke2VzY2FwZVNpbmdsZVF1b3RlU3RyaW5nKHZhbHVlKX0sICR7aXNCb3VuZH0sICR7bmdDb250ZW50SW5kZXh9KWApO1xuICB9XG4gIGNyZWF0ZU5nQ29udGVudChpbmRleDogbnVtYmVyLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKTogRXhwcmVzc2lvbiB7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uKFxuICAgICAgICBgJHtjb2RlR2VuQ29uc3RDb25zdHJ1Y3RvckNhbGwoVEVNUExBVEVfQ09NTUFORFNfTU9EVUxFX1JFRisnTmdDb250ZW50Q21kJyl9KCR7aW5kZXh9LCAke25nQ29udGVudEluZGV4fSlgKTtcbiAgfVxuICBjcmVhdGVCZWdpbkVsZW1lbnQobmFtZTogc3RyaW5nLCBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10sIGV2ZW50VGFyZ2V0QW5kTmFtZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10sXG4gICAgICAgICAgICAgICAgICAgICBpc0JvdW5kOiBib29sZWFuLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyKTogRXhwcmVzc2lvbiB7XG4gICAgdmFyIGF0dHJzRXhwcmVzc2lvbiA9IGNvZGVHZW5BcnJheShhdHRyTmFtZUFuZFZhbHVlcyk7XG4gICAgcmV0dXJuIG5ldyBFeHByZXNzaW9uKFxuICAgICAgICBgJHtjb2RlR2VuQ29uc3RDb25zdHJ1Y3RvckNhbGwoVEVNUExBVEVfQ09NTUFORFNfTU9EVUxFX1JFRisnQmVnaW5FbGVtZW50Q21kJyl9KCR7ZXNjYXBlU2luZ2xlUXVvdGVTdHJpbmcobmFtZSl9LCAke2F0dHJzRXhwcmVzc2lvbn0sIGAgK1xuICAgICAgICBgJHtjb2RlR2VuQXJyYXkoZXZlbnRUYXJnZXRBbmROYW1lcyl9LCAke2NvZGVHZW5BcnJheSh2YXJpYWJsZU5hbWVBbmRWYWx1ZXMpfSwgJHtjb2RlR2VuRGlyZWN0aXZlc0FycmF5KGRpcmVjdGl2ZXMpfSwgJHtpc0JvdW5kfSwgJHtuZ0NvbnRlbnRJbmRleH0pYCk7XG4gIH1cbiAgY3JlYXRlRW5kRWxlbWVudCgpOiBFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb24oXG4gICAgICAgIGAke2NvZGVHZW5Db25zdENvbnN0cnVjdG9yQ2FsbChURU1QTEFURV9DT01NQU5EU19NT0RVTEVfUkVGKydFbmRFbGVtZW50Q21kJyl9KClgKTtcbiAgfVxuICBjcmVhdGVCZWdpbkNvbXBvbmVudChuYW1lOiBzdHJpbmcsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZUFuZFZhbHVlczogc3RyaW5nW10sIGRpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdLFxuICAgICAgICAgICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbiwgbmdDb250ZW50SW5kZXg6IG51bWJlcik6IEV4cHJlc3Npb24ge1xuICAgIHZhciBhdHRyc0V4cHJlc3Npb24gPSBjb2RlR2VuQXJyYXkoYXR0ck5hbWVBbmRWYWx1ZXMpO1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbihcbiAgICAgICAgYCR7Y29kZUdlbkNvbnN0Q29uc3RydWN0b3JDYWxsKFRFTVBMQVRFX0NPTU1BTkRTX01PRFVMRV9SRUYrJ0JlZ2luQ29tcG9uZW50Q21kJyl9KCR7ZXNjYXBlU2luZ2xlUXVvdGVTdHJpbmcobmFtZSl9LCAke2F0dHJzRXhwcmVzc2lvbn0sIGAgK1xuICAgICAgICBgJHtjb2RlR2VuQXJyYXkoZXZlbnRUYXJnZXRBbmROYW1lcyl9LCAke2NvZGVHZW5BcnJheSh2YXJpYWJsZU5hbWVBbmRWYWx1ZXMpfSwgJHtjb2RlR2VuRGlyZWN0aXZlc0FycmF5KGRpcmVjdGl2ZXMpfSwgJHtjb2RlR2VuVmlld0VuY2Fwc3VsYXRpb24oZW5jYXBzdWxhdGlvbil9LCAke25nQ29udGVudEluZGV4fSwgJHt0aGlzLmNvbXBvbmVudFRlbXBsYXRlRmFjdG9yeShkaXJlY3RpdmVzWzBdKX0pYCk7XG4gIH1cbiAgY3JlYXRlRW5kQ29tcG9uZW50KCk6IEV4cHJlc3Npb24ge1xuICAgIHJldHVybiBuZXcgRXhwcmVzc2lvbihcbiAgICAgICAgYCR7Y29kZUdlbkNvbnN0Q29uc3RydWN0b3JDYWxsKFRFTVBMQVRFX0NPTU1BTkRTX01PRFVMRV9SRUYrJ0VuZENvbXBvbmVudENtZCcpfSgpYCk7XG4gIH1cbiAgY3JlYXRlRW1iZWRkZWRUZW1wbGF0ZShlbWJlZGRlZFRlbXBsYXRlSW5kZXg6IG51bWJlciwgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTmFtZUFuZFZhbHVlczogc3RyaW5nW10sIGRpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGlzTWVyZ2VkOiBib29sZWFuLCBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBFeHByZXNzaW9uW10pOiBFeHByZXNzaW9uIHtcbiAgICByZXR1cm4gbmV3IEV4cHJlc3Npb24oXG4gICAgICAgIGAke2NvZGVHZW5Db25zdENvbnN0cnVjdG9yQ2FsbChURU1QTEFURV9DT01NQU5EU19NT0RVTEVfUkVGKydFbWJlZGRlZFRlbXBsYXRlQ21kJyl9KCR7Y29kZUdlbkFycmF5KGF0dHJOYW1lQW5kVmFsdWVzKX0sICR7Y29kZUdlbkFycmF5KHZhcmlhYmxlTmFtZUFuZFZhbHVlcyl9LCBgICtcbiAgICAgICAgYCR7Y29kZUdlbkRpcmVjdGl2ZXNBcnJheShkaXJlY3RpdmVzKX0sICR7aXNNZXJnZWR9LCAke25nQ29udGVudEluZGV4fSwgJHt0aGlzLmNoYW5nZURldGVjdG9yRmFjdG9yeUV4cHJlc3Npb25zW2VtYmVkZGVkVGVtcGxhdGVJbmRleF19LCAke2NvZGVHZW5BcnJheShjaGlsZHJlbil9KWApO1xuICB9XG59XG5cbmZ1bmN0aW9uIHZpc2l0QW5kUmV0dXJuQ29udGV4dCh2aXNpdG9yOiBUZW1wbGF0ZUFzdFZpc2l0b3IsIGFzdHM6IFRlbXBsYXRlQXN0W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogYW55KTogYW55IHtcbiAgdGVtcGxhdGVWaXNpdEFsbCh2aXNpdG9yLCBhc3RzLCBjb250ZXh0KTtcbiAgcmV0dXJuIGNvbnRleHQ7XG59XG5cbmNsYXNzIENvbW1hbmRCdWlsZGVyVmlzaXRvcjxSPiBpbXBsZW1lbnRzIFRlbXBsYXRlQXN0VmlzaXRvciB7XG4gIHJlc3VsdDogUltdID0gW107XG4gIHRyYW5zaXRpdmVOZ0NvbnRlbnRDb3VudDogbnVtYmVyID0gMDtcbiAgY29uc3RydWN0b3IocHVibGljIGNvbW1hbmRGYWN0b3J5OiBDb21tYW5kRmFjdG9yeTxSPiwgcHVibGljIGVtYmVkZGVkVGVtcGxhdGVJbmRleDogbnVtYmVyKSB7fVxuXG4gIHByaXZhdGUgX3JlYWRBdHRyTmFtZUFuZFZhbHVlcyhkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJBc3RzOiBUZW1wbGF0ZUFzdFtdKTogc3RyaW5nW10ge1xuICAgIHZhciBhdHRycyA9IGtleVZhbHVlQXJyYXlUb01hcCh2aXNpdEFuZFJldHVybkNvbnRleHQodGhpcywgYXR0ckFzdHMsIFtdKSk7XG4gICAgZGlyZWN0aXZlcy5mb3JFYWNoKGRpcmVjdGl2ZU1ldGEgPT4ge1xuICAgICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKGRpcmVjdGl2ZU1ldGEuaG9zdEF0dHJpYnV0ZXMsICh2YWx1ZSwgbmFtZSkgPT4ge1xuICAgICAgICB2YXIgcHJldlZhbHVlID0gYXR0cnNbbmFtZV07XG4gICAgICAgIGF0dHJzW25hbWVdID0gaXNQcmVzZW50KHByZXZWYWx1ZSkgPyBtZXJnZUF0dHJpYnV0ZVZhbHVlKG5hbWUsIHByZXZWYWx1ZSwgdmFsdWUpIDogdmFsdWU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbWFwVG9LZXlWYWx1ZUFycmF5KGF0dHJzKTtcbiAgfVxuXG4gIHZpc2l0TmdDb250ZW50KGFzdDogTmdDb250ZW50QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHRoaXMudHJhbnNpdGl2ZU5nQ29udGVudENvdW50Kys7XG4gICAgdGhpcy5yZXN1bHQucHVzaCh0aGlzLmNvbW1hbmRGYWN0b3J5LmNyZWF0ZU5nQ29udGVudChhc3QuaW5kZXgsIGFzdC5uZ0NvbnRlbnRJbmRleCkpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RW1iZWRkZWRUZW1wbGF0ZShhc3Q6IEVtYmVkZGVkVGVtcGxhdGVBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdGhpcy5lbWJlZGRlZFRlbXBsYXRlSW5kZXgrKztcbiAgICB2YXIgY2hpbGRWaXNpdG9yID0gbmV3IENvbW1hbmRCdWlsZGVyVmlzaXRvcih0aGlzLmNvbW1hbmRGYWN0b3J5LCB0aGlzLmVtYmVkZGVkVGVtcGxhdGVJbmRleCk7XG4gICAgdGVtcGxhdGVWaXNpdEFsbChjaGlsZFZpc2l0b3IsIGFzdC5jaGlsZHJlbik7XG4gICAgdmFyIGlzTWVyZ2VkID0gY2hpbGRWaXNpdG9yLnRyYW5zaXRpdmVOZ0NvbnRlbnRDb3VudCA+IDA7XG4gICAgdmFyIHZhcmlhYmxlTmFtZUFuZFZhbHVlcyA9IFtdO1xuICAgIGFzdC52YXJzLmZvckVhY2goKHZhckFzdCkgPT4ge1xuICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzLnB1c2godmFyQXN0Lm5hbWUpO1xuICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzLnB1c2godmFyQXN0LnZhbHVlLmxlbmd0aCA+IDAgPyB2YXJBc3QudmFsdWUgOiBJTVBMSUNJVF9URU1QTEFURV9WQVIpO1xuICAgIH0pO1xuICAgIHZhciBkaXJlY3RpdmVzID0gW107XG4gICAgTGlzdFdyYXBwZXIuZm9yRWFjaFdpdGhJbmRleChhc3QuZGlyZWN0aXZlcywgKGRpcmVjdGl2ZUFzdDogRGlyZWN0aXZlQXN0LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBkaXJlY3RpdmVBc3QudmlzaXQodGhpcywgbmV3IERpcmVjdGl2ZUNvbnRleHQoaW5kZXgsIFtdLCBbXSwgZGlyZWN0aXZlcykpO1xuICAgIH0pO1xuICAgIHRoaXMucmVzdWx0LnB1c2godGhpcy5jb21tYW5kRmFjdG9yeS5jcmVhdGVFbWJlZGRlZFRlbXBsYXRlKFxuICAgICAgICB0aGlzLmVtYmVkZGVkVGVtcGxhdGVJbmRleCwgdGhpcy5fcmVhZEF0dHJOYW1lQW5kVmFsdWVzKGRpcmVjdGl2ZXMsIGFzdC5hdHRycyksXG4gICAgICAgIHZhcmlhYmxlTmFtZUFuZFZhbHVlcywgZGlyZWN0aXZlcywgaXNNZXJnZWQsIGFzdC5uZ0NvbnRlbnRJbmRleCwgY2hpbGRWaXNpdG9yLnJlc3VsdCkpO1xuICAgIHRoaXMudHJhbnNpdGl2ZU5nQ29udGVudENvdW50ICs9IGNoaWxkVmlzaXRvci50cmFuc2l0aXZlTmdDb250ZW50Q291bnQ7XG4gICAgdGhpcy5lbWJlZGRlZFRlbXBsYXRlSW5kZXggPSBjaGlsZFZpc2l0b3IuZW1iZWRkZWRUZW1wbGF0ZUluZGV4O1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RWxlbWVudChhc3Q6IEVsZW1lbnRBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdmFyIGNvbXBvbmVudCA9IGFzdC5nZXRDb21wb25lbnQoKTtcbiAgICB2YXIgZXZlbnRUYXJnZXRBbmROYW1lcyA9IHZpc2l0QW5kUmV0dXJuQ29udGV4dCh0aGlzLCBhc3Qub3V0cHV0cywgW10pO1xuICAgIHZhciB2YXJpYWJsZU5hbWVBbmRWYWx1ZXMgPSBbXTtcbiAgICBpZiAoaXNCbGFuayhjb21wb25lbnQpKSB7XG4gICAgICBhc3QuZXhwb3J0QXNWYXJzLmZvckVhY2goKHZhckFzdCkgPT4ge1xuICAgICAgICB2YXJpYWJsZU5hbWVBbmRWYWx1ZXMucHVzaCh2YXJBc3QubmFtZSk7XG4gICAgICAgIHZhcmlhYmxlTmFtZUFuZFZhbHVlcy5wdXNoKG51bGwpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHZhciBkaXJlY3RpdmVzID0gW107XG4gICAgTGlzdFdyYXBwZXIuZm9yRWFjaFdpdGhJbmRleChhc3QuZGlyZWN0aXZlcywgKGRpcmVjdGl2ZUFzdDogRGlyZWN0aXZlQXN0LCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICBkaXJlY3RpdmVBc3QudmlzaXQodGhpcywgbmV3IERpcmVjdGl2ZUNvbnRleHQoaW5kZXgsIGV2ZW50VGFyZ2V0QW5kTmFtZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOYW1lQW5kVmFsdWVzLCBkaXJlY3RpdmVzKSk7XG4gICAgfSk7XG4gICAgZXZlbnRUYXJnZXRBbmROYW1lcyA9IHJlbW92ZUtleVZhbHVlQXJyYXlEdXBsaWNhdGVzKGV2ZW50VGFyZ2V0QW5kTmFtZXMpO1xuXG4gICAgdmFyIGF0dHJOYW1lQW5kVmFsdWVzID0gdGhpcy5fcmVhZEF0dHJOYW1lQW5kVmFsdWVzKGRpcmVjdGl2ZXMsIGFzdC5hdHRycyk7XG4gICAgaWYgKGlzUHJlc2VudChjb21wb25lbnQpKSB7XG4gICAgICB0aGlzLnJlc3VsdC5wdXNoKHRoaXMuY29tbWFuZEZhY3RvcnkuY3JlYXRlQmVnaW5Db21wb25lbnQoXG4gICAgICAgICAgYXN0Lm5hbWUsIGF0dHJOYW1lQW5kVmFsdWVzLCBldmVudFRhcmdldEFuZE5hbWVzLCB2YXJpYWJsZU5hbWVBbmRWYWx1ZXMsIGRpcmVjdGl2ZXMsXG4gICAgICAgICAgY29tcG9uZW50LnRlbXBsYXRlLmVuY2Fwc3VsYXRpb24sIGFzdC5uZ0NvbnRlbnRJbmRleCkpO1xuICAgICAgdGVtcGxhdGVWaXNpdEFsbCh0aGlzLCBhc3QuY2hpbGRyZW4pO1xuICAgICAgdGhpcy5yZXN1bHQucHVzaCh0aGlzLmNvbW1hbmRGYWN0b3J5LmNyZWF0ZUVuZENvbXBvbmVudCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQucHVzaCh0aGlzLmNvbW1hbmRGYWN0b3J5LmNyZWF0ZUJlZ2luRWxlbWVudChcbiAgICAgICAgICBhc3QubmFtZSwgYXR0ck5hbWVBbmRWYWx1ZXMsIGV2ZW50VGFyZ2V0QW5kTmFtZXMsIHZhcmlhYmxlTmFtZUFuZFZhbHVlcywgZGlyZWN0aXZlcyxcbiAgICAgICAgICBhc3QuaXNCb3VuZCgpLCBhc3QubmdDb250ZW50SW5kZXgpKTtcbiAgICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0LmNoaWxkcmVuKTtcbiAgICAgIHRoaXMucmVzdWx0LnB1c2godGhpcy5jb21tYW5kRmFjdG9yeS5jcmVhdGVFbmRFbGVtZW50KCkpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdFZhcmlhYmxlKGFzdDogVmFyaWFibGVBc3QsIGN0eDogYW55KTogYW55IHsgcmV0dXJuIG51bGw7IH1cbiAgdmlzaXRBdHRyKGFzdDogQXR0ckFzdCwgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdKTogYW55IHtcbiAgICBhdHRyTmFtZUFuZFZhbHVlcy5wdXNoKGFzdC5uYW1lKTtcbiAgICBhdHRyTmFtZUFuZFZhbHVlcy5wdXNoKGFzdC52YWx1ZSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRCb3VuZFRleHQoYXN0OiBCb3VuZFRleHRBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdGhpcy5yZXN1bHQucHVzaCh0aGlzLmNvbW1hbmRGYWN0b3J5LmNyZWF0ZVRleHQobnVsbCwgdHJ1ZSwgYXN0Lm5nQ29udGVudEluZGV4KSk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgdmlzaXRUZXh0KGFzdDogVGV4dEFzdCwgY29udGV4dDogYW55KTogYW55IHtcbiAgICB0aGlzLnJlc3VsdC5wdXNoKHRoaXMuY29tbWFuZEZhY3RvcnkuY3JlYXRlVGV4dChhc3QudmFsdWUsIGZhbHNlLCBhc3QubmdDb250ZW50SW5kZXgpKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdERpcmVjdGl2ZShhc3Q6IERpcmVjdGl2ZUFzdCwgY3R4OiBEaXJlY3RpdmVDb250ZXh0KTogYW55IHtcbiAgICBjdHgudGFyZ2V0RGlyZWN0aXZlcy5wdXNoKGFzdC5kaXJlY3RpdmUpO1xuICAgIHRlbXBsYXRlVmlzaXRBbGwodGhpcywgYXN0Lmhvc3RFdmVudHMsIGN0eC5ldmVudFRhcmdldEFuZE5hbWVzKTtcbiAgICBhc3QuZXhwb3J0QXNWYXJzLmZvckVhY2godmFyQXN0ID0+IHtcbiAgICAgIGN0eC50YXJnZXRWYXJpYWJsZU5hbWVBbmRWYWx1ZXMucHVzaCh2YXJBc3QubmFtZSk7XG4gICAgICBjdHgudGFyZ2V0VmFyaWFibGVOYW1lQW5kVmFsdWVzLnB1c2goY3R4LmluZGV4KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICB2aXNpdEV2ZW50KGFzdDogQm91bmRFdmVudEFzdCwgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10pOiBhbnkge1xuICAgIGV2ZW50VGFyZ2V0QW5kTmFtZXMucHVzaChhc3QudGFyZ2V0KTtcbiAgICBldmVudFRhcmdldEFuZE5hbWVzLnB1c2goYXN0Lm5hbWUpO1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0RGlyZWN0aXZlUHJvcGVydHkoYXN0OiBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxuICB2aXNpdEVsZW1lbnRQcm9wZXJ0eShhc3Q6IEJvdW5kRWxlbWVudFByb3BlcnR5QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5mdW5jdGlvbiByZW1vdmVLZXlWYWx1ZUFycmF5RHVwbGljYXRlcyhrZXlWYWx1ZUFycmF5OiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgdmFyIGtub3duUGFpcnMgPSBuZXcgU2V0KCk7XG4gIHZhciByZXN1bHRLZXlWYWx1ZUFycmF5ID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5VmFsdWVBcnJheS5sZW5ndGg7IGkgKz0gMikge1xuICAgIHZhciBrZXkgPSBrZXlWYWx1ZUFycmF5W2ldO1xuICAgIHZhciB2YWx1ZSA9IGtleVZhbHVlQXJyYXlbaSArIDFdO1xuICAgIHZhciBwYWlySWQgPSBgJHtrZXl9OiR7dmFsdWV9YDtcbiAgICBpZiAoIVNldFdyYXBwZXIuaGFzKGtub3duUGFpcnMsIHBhaXJJZCkpIHtcbiAgICAgIHJlc3VsdEtleVZhbHVlQXJyYXkucHVzaChrZXkpO1xuICAgICAgcmVzdWx0S2V5VmFsdWVBcnJheS5wdXNoKHZhbHVlKTtcbiAgICAgIGtub3duUGFpcnMuYWRkKHBhaXJJZCk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHRLZXlWYWx1ZUFycmF5O1xufVxuXG5mdW5jdGlvbiBrZXlWYWx1ZUFycmF5VG9NYXAoa2V5VmFsdWVBcnI6IHN0cmluZ1tdKToge1trZXk6IHN0cmluZ106IHN0cmluZ30ge1xuICB2YXIgZGF0YToge1trZXk6IHN0cmluZ106IHN0cmluZ30gPSB7fTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlWYWx1ZUFyci5sZW5ndGg7IGkgKz0gMikge1xuICAgIGRhdGFba2V5VmFsdWVBcnJbaV1dID0ga2V5VmFsdWVBcnJbaSArIDFdO1xuICB9XG4gIHJldHVybiBkYXRhO1xufVxuXG5mdW5jdGlvbiBtYXBUb0tleVZhbHVlQXJyYXkoZGF0YToge1trZXk6IHN0cmluZ106IHN0cmluZ30pOiBzdHJpbmdbXSB7XG4gIHZhciBlbnRyeUFycmF5ID0gW107XG4gIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChkYXRhLCAodmFsdWUsIG5hbWUpID0+IHsgZW50cnlBcnJheS5wdXNoKFtuYW1lLCB2YWx1ZV0pOyB9KTtcbiAgLy8gV2UgbmVlZCB0byBzb3J0IHRvIGdldCBhIGRlZmluZWQgb3V0cHV0IG9yZGVyXG4gIC8vIGZvciB0ZXN0cyBhbmQgZm9yIGNhY2hpbmcgZ2VuZXJhdGVkIGFydGlmYWN0cy4uLlxuICBMaXN0V3JhcHBlci5zb3J0KGVudHJ5QXJyYXksIChlbnRyeTEsIGVudHJ5MikgPT4gU3RyaW5nV3JhcHBlci5jb21wYXJlKGVudHJ5MVswXSwgZW50cnkyWzBdKSk7XG4gIHZhciBrZXlWYWx1ZUFycmF5ID0gW107XG4gIGVudHJ5QXJyYXkuZm9yRWFjaCgoZW50cnkpID0+IHtcbiAgICBrZXlWYWx1ZUFycmF5LnB1c2goZW50cnlbMF0pO1xuICAgIGtleVZhbHVlQXJyYXkucHVzaChlbnRyeVsxXSk7XG4gIH0pO1xuICByZXR1cm4ga2V5VmFsdWVBcnJheTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VBdHRyaWJ1dGVWYWx1ZShhdHRyTmFtZTogc3RyaW5nLCBhdHRyVmFsdWUxOiBzdHJpbmcsIGF0dHJWYWx1ZTI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChhdHRyTmFtZSA9PSBDTEFTU19BVFRSIHx8IGF0dHJOYW1lID09IFNUWUxFX0FUVFIpIHtcbiAgICByZXR1cm4gYCR7YXR0clZhbHVlMX0gJHthdHRyVmFsdWUyfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGF0dHJWYWx1ZTI7XG4gIH1cbn1cblxuY2xhc3MgRGlyZWN0aXZlQ29udGV4dCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbmRleDogbnVtYmVyLCBwdWJsaWMgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgIHB1YmxpYyB0YXJnZXRWYXJpYWJsZU5hbWVBbmRWYWx1ZXM6IGFueVtdLFxuICAgICAgICAgICAgICBwdWJsaWMgdGFyZ2V0RGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10pIHt9XG59XG5cbmNsYXNzIEV4cHJlc3Npb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdmFsdWU6IHN0cmluZykge31cbn1cblxuZnVuY3Rpb24gZXNjYXBlVmFsdWUodmFsdWU6IGFueSk6IHN0cmluZyB7XG4gIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEV4cHJlc3Npb24pIHtcbiAgICByZXR1cm4gdmFsdWUudmFsdWU7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgcmV0dXJuIGVzY2FwZVNpbmdsZVF1b3RlU3RyaW5nKHZhbHVlKTtcbiAgfSBlbHNlIGlmIChpc0JsYW5rKHZhbHVlKSkge1xuICAgIHJldHVybiAnbnVsbCc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGAke3ZhbHVlfWA7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29kZUdlbkFycmF5KGRhdGE6IGFueVtdKTogc3RyaW5nIHtcbiAgdmFyIGJhc2UgPSBgWyR7ZGF0YS5tYXAoZXNjYXBlVmFsdWUpLmpvaW4oJywnKX1dYDtcbiAgcmV0dXJuIElTX0RBUlQgPyBgY29uc3QgJHtiYXNlfWAgOiBiYXNlO1xufVxuXG5mdW5jdGlvbiBjb2RlR2VuRGlyZWN0aXZlc0FycmF5KGRpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdKTogc3RyaW5nIHtcbiAgdmFyIGV4cHJlc3Npb25zID0gZGlyZWN0aXZlcy5tYXAoXG4gICAgICBkaXJlY3RpdmVUeXBlID0+IGAke21vZHVsZVJlZihkaXJlY3RpdmVUeXBlLnR5cGUubW9kdWxlVXJsKX0ke2RpcmVjdGl2ZVR5cGUudHlwZS5uYW1lfWApO1xuICB2YXIgYmFzZSA9IGBbJHtleHByZXNzaW9ucy5qb2luKCcsJyl9XWA7XG4gIHJldHVybiBJU19EQVJUID8gYGNvbnN0ICR7YmFzZX1gIDogYmFzZTtcbn1cblxuZnVuY3Rpb24gY29kZUdlblZpZXdFbmNhcHN1bGF0aW9uKHZhbHVlOiBWaWV3RW5jYXBzdWxhdGlvbik6IHN0cmluZyB7XG4gIGlmIChJU19EQVJUKSB7XG4gICAgcmV0dXJuIGAke1RFTVBMQVRFX0NPTU1BTkRTX01PRFVMRV9SRUZ9JHt2YWx1ZX1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIvY29tbWFuZF9jb21waWxlci50c1xuICoqLyIsImltcG9ydCB7TGlzdFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXIsIFNldFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1JlZ0V4cFdyYXBwZXIsIGlzUHJlc2VudCwgU3RyaW5nV3JhcHBlciwgaXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0LCBPcGFxdWVUb2tlbiwgT3B0aW9uYWx9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQYXJzZXIsIEFTVCwgQVNUV2l0aFNvdXJjZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uJztcbmltcG9ydCB7VGVtcGxhdGVCaW5kaW5nfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL3BhcnNlci9hc3QnO1xuaW1wb3J0IHtDb21waWxlRGlyZWN0aXZlTWV0YWRhdGF9IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7SHRtbFBhcnNlcn0gZnJvbSAnLi9odG1sX3BhcnNlcic7XG5pbXBvcnQge3NwbGl0TnNOYW1lfSBmcm9tICcuL2h0bWxfdGFncyc7XG5pbXBvcnQge1BhcnNlU291cmNlU3BhbiwgUGFyc2VFcnJvciwgUGFyc2VMb2NhdGlvbn0gZnJvbSAnLi9wYXJzZV91dGlsJztcblxuXG5pbXBvcnQge1xuICBFbGVtZW50QXN0LFxuICBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdCxcbiAgQm91bmRFdmVudEFzdCxcbiAgVmFyaWFibGVBc3QsXG4gIFRlbXBsYXRlQXN0LFxuICBUZW1wbGF0ZUFzdFZpc2l0b3IsXG4gIHRlbXBsYXRlVmlzaXRBbGwsXG4gIFRleHRBc3QsXG4gIEJvdW5kVGV4dEFzdCxcbiAgRW1iZWRkZWRUZW1wbGF0ZUFzdCxcbiAgQXR0ckFzdCxcbiAgTmdDb250ZW50QXN0LFxuICBQcm9wZXJ0eUJpbmRpbmdUeXBlLFxuICBEaXJlY3RpdmVBc3QsXG4gIEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3Rcbn0gZnJvbSAnLi90ZW1wbGF0ZV9hc3QnO1xuaW1wb3J0IHtDc3NTZWxlY3RvciwgU2VsZWN0b3JNYXRjaGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIvc2VsZWN0b3InO1xuXG5pbXBvcnQge0VsZW1lbnRTY2hlbWFSZWdpc3RyeX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NjaGVtYS9lbGVtZW50X3NjaGVtYV9yZWdpc3RyeSc7XG5pbXBvcnQge3ByZXBhcnNlRWxlbWVudCwgUHJlcGFyc2VkRWxlbWVudCwgUHJlcGFyc2VkRWxlbWVudFR5cGV9IGZyb20gJy4vdGVtcGxhdGVfcHJlcGFyc2VyJztcblxuaW1wb3J0IHtpc1N0eWxlVXJsUmVzb2x2YWJsZX0gZnJvbSAnLi9zdHlsZV91cmxfcmVzb2x2ZXInO1xuXG5pbXBvcnQge1xuICBIdG1sQXN0VmlzaXRvcixcbiAgSHRtbEFzdCxcbiAgSHRtbEVsZW1lbnRBc3QsXG4gIEh0bWxBdHRyQXN0LFxuICBIdG1sVGV4dEFzdCxcbiAgaHRtbFZpc2l0QWxsXG59IGZyb20gJy4vaHRtbF9hc3QnO1xuXG5pbXBvcnQge3NwbGl0QXRDb2xvbn0gZnJvbSAnLi91dGlsJztcblxuLy8gR3JvdXAgMSA9IFwiYmluZC1cIlxuLy8gR3JvdXAgMiA9IFwidmFyLVwiIG9yIFwiI1wiXG4vLyBHcm91cCAzID0gXCJvbi1cIlxuLy8gR3JvdXAgNCA9IFwiYmluZG9uLVwiXG4vLyBHcm91cCA1ID0gdGhlIGlkZW50aWZpZXIgYWZ0ZXIgXCJiaW5kLVwiLCBcInZhci0vI1wiLCBvciBcIm9uLVwiXG4vLyBHcm91cCA2ID0gaWRlbml0aWZlciBpbnNpZGUgWygpXVxuLy8gR3JvdXAgNyA9IGlkZW5pdGlmZXIgaW5zaWRlIFtdXG4vLyBHcm91cCA4ID0gaWRlbnRpZmllciBpbnNpZGUgKClcbnZhciBCSU5EX05BTUVfUkVHRVhQID1cbiAgICAvXig/Oig/Oig/OihiaW5kLSl8KHZhci18Iyl8KG9uLSl8KGJpbmRvbi0pKSguKykpfFxcW1xcKChbXlxcKV0rKVxcKVxcXXxcXFsoW15cXF1dKylcXF18XFwoKFteXFwpXSspXFwpKSQvZztcblxuY29uc3QgVEVNUExBVEVfRUxFTUVOVCA9ICd0ZW1wbGF0ZSc7XG5jb25zdCBURU1QTEFURV9BVFRSID0gJ3RlbXBsYXRlJztcbmNvbnN0IFRFTVBMQVRFX0FUVFJfUFJFRklYID0gJyonO1xuY29uc3QgQ0xBU1NfQVRUUiA9ICdjbGFzcyc7XG5cbnZhciBQUk9QRVJUWV9QQVJUU19TRVBBUkFUT1IgPSAnLic7XG5jb25zdCBBVFRSSUJVVEVfUFJFRklYID0gJ2F0dHInO1xuY29uc3QgQ0xBU1NfUFJFRklYID0gJ2NsYXNzJztcbmNvbnN0IFNUWUxFX1BSRUZJWCA9ICdzdHlsZSc7XG5cbnZhciBURVhUX0NTU19TRUxFQ1RPUiA9IENzc1NlbGVjdG9yLnBhcnNlKCcqJylbMF07XG5cbi8qKlxuICogUHJvdmlkZXMgYW4gYXJyYXkgb2Yge0BsaW5rIFRlbXBsYXRlQXN0VmlzaXRvcn1zIHdoaWNoIHdpbGwgYmUgdXNlZCB0byB0cmFuc2Zvcm1cbiAqIHBhcnNlZCB0ZW1wbGF0ZXMgYmVmb3JlIGNvbXBpbGF0aW9uIGlzIGludm9rZWQsIGFsbG93aW5nIGN1c3RvbSBleHByZXNzaW9uIHN5bnRheFxuICogYW5kIG90aGVyIGFkdmFuY2VkIHRyYW5zZm9ybWF0aW9ucy5cbiAqXG4gKiBUaGlzIGlzIGN1cnJlbnRseSBhbiBpbnRlcm5hbC1vbmx5IGZlYXR1cmUgYW5kIG5vdCBtZWFudCBmb3IgZ2VuZXJhbCB1c2UuXG4gKi9cbmV4cG9ydCBjb25zdCBURU1QTEFURV9UUkFOU0ZPUk1TID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oJ1RlbXBsYXRlVHJhbnNmb3JtcycpKTtcblxuZXhwb3J0IGNsYXNzIFRlbXBsYXRlUGFyc2VFcnJvciBleHRlbmRzIFBhcnNlRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIGxvY2F0aW9uOiBQYXJzZUxvY2F0aW9uKSB7IHN1cGVyKGxvY2F0aW9uLCBtZXNzYWdlKTsgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGVtcGxhdGVQYXJzZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9leHByUGFyc2VyOiBQYXJzZXIsIHByaXZhdGUgX3NjaGVtYVJlZ2lzdHJ5OiBFbGVtZW50U2NoZW1hUmVnaXN0cnksXG4gICAgICAgICAgICAgIHByaXZhdGUgX2h0bWxQYXJzZXI6IEh0bWxQYXJzZXIsXG4gICAgICAgICAgICAgIEBPcHRpb25hbCgpIEBJbmplY3QoVEVNUExBVEVfVFJBTlNGT1JNUykgcHVibGljIHRyYW5zZm9ybXM6IFRlbXBsYXRlQXN0VmlzaXRvcltdKSB7fVxuXG4gIHBhcnNlKHRlbXBsYXRlOiBzdHJpbmcsIGRpcmVjdGl2ZXM6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdLFxuICAgICAgICB0ZW1wbGF0ZVVybDogc3RyaW5nKTogVGVtcGxhdGVBc3RbXSB7XG4gICAgdmFyIHBhcnNlVmlzaXRvciA9IG5ldyBUZW1wbGF0ZVBhcnNlVmlzaXRvcihkaXJlY3RpdmVzLCB0aGlzLl9leHByUGFyc2VyLCB0aGlzLl9zY2hlbWFSZWdpc3RyeSk7XG4gICAgdmFyIGh0bWxBc3RXaXRoRXJyb3JzID0gdGhpcy5faHRtbFBhcnNlci5wYXJzZSh0ZW1wbGF0ZSwgdGVtcGxhdGVVcmwpO1xuICAgIHZhciByZXN1bHQgPSBodG1sVmlzaXRBbGwocGFyc2VWaXNpdG9yLCBodG1sQXN0V2l0aEVycm9ycy5yb290Tm9kZXMsIEVNUFRZX0NPTVBPTkVOVCk7XG4gICAgdmFyIGVycm9yczogUGFyc2VFcnJvcltdID0gaHRtbEFzdFdpdGhFcnJvcnMuZXJyb3JzLmNvbmNhdChwYXJzZVZpc2l0b3IuZXJyb3JzKTtcbiAgICBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBlcnJvclN0cmluZyA9IGVycm9ycy5qb2luKCdcXG4nKTtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBUZW1wbGF0ZSBwYXJzZSBlcnJvcnM6XFxuJHtlcnJvclN0cmluZ31gKTtcbiAgICB9XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLnRyYW5zZm9ybXMpKSB7XG4gICAgICB0aGlzLnRyYW5zZm9ybXMuZm9yRWFjaChcbiAgICAgICAgICAodHJhbnNmb3JtOiBUZW1wbGF0ZUFzdFZpc2l0b3IpID0+IHsgcmVzdWx0ID0gdGVtcGxhdGVWaXNpdEFsbCh0cmFuc2Zvcm0sIHJlc3VsdCk7IH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG5cbmNsYXNzIFRlbXBsYXRlUGFyc2VWaXNpdG9yIGltcGxlbWVudHMgSHRtbEFzdFZpc2l0b3Ige1xuICBzZWxlY3Rvck1hdGNoZXI6IFNlbGVjdG9yTWF0Y2hlcjtcbiAgZXJyb3JzOiBUZW1wbGF0ZVBhcnNlRXJyb3JbXSA9IFtdO1xuICBkaXJlY3RpdmVzSW5kZXggPSBuZXcgTWFwPENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSwgbnVtYmVyPigpO1xuICBuZ0NvbnRlbnRDb3VudDogbnVtYmVyID0gMDtcblxuICBjb25zdHJ1Y3RvcihkaXJlY3RpdmVzOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSwgcHJpdmF0ZSBfZXhwclBhcnNlcjogUGFyc2VyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9zY2hlbWFSZWdpc3RyeTogRWxlbWVudFNjaGVtYVJlZ2lzdHJ5KSB7XG4gICAgdGhpcy5zZWxlY3Rvck1hdGNoZXIgPSBuZXcgU2VsZWN0b3JNYXRjaGVyKCk7XG4gICAgTGlzdFdyYXBwZXIuZm9yRWFjaFdpdGhJbmRleChkaXJlY3RpdmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzZWxlY3RvciA9IENzc1NlbGVjdG9yLnBhcnNlKGRpcmVjdGl2ZS5zZWxlY3Rvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0b3JNYXRjaGVyLmFkZFNlbGVjdGFibGVzKHNlbGVjdG9yLCBkaXJlY3RpdmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXNJbmRleC5zZXQoZGlyZWN0aXZlLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlcG9ydEVycm9yKG1lc3NhZ2U6IHN0cmluZywgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7XG4gICAgdGhpcy5lcnJvcnMucHVzaChuZXcgVGVtcGxhdGVQYXJzZUVycm9yKG1lc3NhZ2UsIHNvdXJjZVNwYW4uc3RhcnQpKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlSW50ZXJwb2xhdGlvbih2YWx1ZTogc3RyaW5nLCBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pOiBBU1RXaXRoU291cmNlIHtcbiAgICB2YXIgc291cmNlSW5mbyA9IHNvdXJjZVNwYW4uc3RhcnQudG9TdHJpbmcoKTtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRoaXMuX2V4cHJQYXJzZXIucGFyc2VJbnRlcnBvbGF0aW9uKHZhbHVlLCBzb3VyY2VJbmZvKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLl9yZXBvcnRFcnJvcihgJHtlfWAsIHNvdXJjZVNwYW4pO1xuICAgICAgcmV0dXJuIHRoaXMuX2V4cHJQYXJzZXIud3JhcExpdGVyYWxQcmltaXRpdmUoJ0VSUk9SJywgc291cmNlSW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VBY3Rpb24odmFsdWU6IHN0cmluZywgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKTogQVNUV2l0aFNvdXJjZSB7XG4gICAgdmFyIHNvdXJjZUluZm8gPSBzb3VyY2VTcGFuLnN0YXJ0LnRvU3RyaW5nKCk7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLl9leHByUGFyc2VyLnBhcnNlQWN0aW9uKHZhbHVlLCBzb3VyY2VJbmZvKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aGlzLl9yZXBvcnRFcnJvcihgJHtlfWAsIHNvdXJjZVNwYW4pO1xuICAgICAgcmV0dXJuIHRoaXMuX2V4cHJQYXJzZXIud3JhcExpdGVyYWxQcmltaXRpdmUoJ0VSUk9SJywgc291cmNlSW5mbyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VCaW5kaW5nKHZhbHVlOiBzdHJpbmcsIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbik6IEFTVFdpdGhTb3VyY2Uge1xuICAgIHZhciBzb3VyY2VJbmZvID0gc291cmNlU3Bhbi5zdGFydC50b1N0cmluZygpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXhwclBhcnNlci5wYXJzZUJpbmRpbmcodmFsdWUsIHNvdXJjZUluZm8pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGAke2V9YCwgc291cmNlU3Bhbik7XG4gICAgICByZXR1cm4gdGhpcy5fZXhwclBhcnNlci53cmFwTGl0ZXJhbFByaW1pdGl2ZSgnRVJST1InLCBzb3VyY2VJbmZvKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZVRlbXBsYXRlQmluZGluZ3ModmFsdWU6IHN0cmluZywgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKTogVGVtcGxhdGVCaW5kaW5nW10ge1xuICAgIHZhciBzb3VyY2VJbmZvID0gc291cmNlU3Bhbi5zdGFydC50b1N0cmluZygpO1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gdGhpcy5fZXhwclBhcnNlci5wYXJzZVRlbXBsYXRlQmluZGluZ3ModmFsdWUsIHNvdXJjZUluZm8pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGAke2V9YCwgc291cmNlU3Bhbik7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICB9XG5cbiAgdmlzaXRUZXh0KGFzdDogSHRtbFRleHRBc3QsIGNvbXBvbmVudDogQ29tcG9uZW50KTogYW55IHtcbiAgICB2YXIgbmdDb250ZW50SW5kZXggPSBjb21wb25lbnQuZmluZE5nQ29udGVudEluZGV4KFRFWFRfQ1NTX1NFTEVDVE9SKTtcbiAgICB2YXIgZXhwciA9IHRoaXMuX3BhcnNlSW50ZXJwb2xhdGlvbihhc3QudmFsdWUsIGFzdC5zb3VyY2VTcGFuKTtcbiAgICBpZiAoaXNQcmVzZW50KGV4cHIpKSB7XG4gICAgICByZXR1cm4gbmV3IEJvdW5kVGV4dEFzdChleHByLCBuZ0NvbnRlbnRJbmRleCwgYXN0LnNvdXJjZVNwYW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmV3IFRleHRBc3QoYXN0LnZhbHVlLCBuZ0NvbnRlbnRJbmRleCwgYXN0LnNvdXJjZVNwYW4pO1xuICAgIH1cbiAgfVxuXG4gIHZpc2l0QXR0cihhc3Q6IEh0bWxBdHRyQXN0LCBjb250ZXg6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIG5ldyBBdHRyQXN0KGFzdC5uYW1lLCBhc3QudmFsdWUsIGFzdC5zb3VyY2VTcGFuKTtcbiAgfVxuXG4gIHZpc2l0RWxlbWVudChlbGVtZW50OiBIdG1sRWxlbWVudEFzdCwgY29tcG9uZW50OiBDb21wb25lbnQpOiBhbnkge1xuICAgIHZhciBub2RlTmFtZSA9IGVsZW1lbnQubmFtZTtcbiAgICB2YXIgcHJlcGFyc2VkRWxlbWVudCA9IHByZXBhcnNlRWxlbWVudChlbGVtZW50KTtcbiAgICBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TQ1JJUFQgfHxcbiAgICAgICAgcHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRSkge1xuICAgICAgLy8gU2tpcHBpbmcgPHNjcmlwdD4gZm9yIHNlY3VyaXR5IHJlYXNvbnNcbiAgICAgIC8vIFNraXBwaW5nIDxzdHlsZT4gYXMgd2UgYWxyZWFkeSBwcm9jZXNzZWQgdGhlbVxuICAgICAgLy8gaW4gdGhlIFN0eWxlQ29tcGlsZXJcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRVNIRUVUICYmXG4gICAgICAgIGlzU3R5bGVVcmxSZXNvbHZhYmxlKHByZXBhcnNlZEVsZW1lbnQuaHJlZkF0dHIpKSB7XG4gICAgICAvLyBTa2lwcGluZyBzdHlsZXNoZWV0cyB3aXRoIGVpdGhlciByZWxhdGl2ZSB1cmxzIG9yIHBhY2thZ2Ugc2NoZW1lIGFzIHdlIGFscmVhZHkgcHJvY2Vzc2VkXG4gICAgICAvLyB0aGVtIGluIHRoZSBTdHlsZUNvbXBpbGVyXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgbWF0Y2hhYmxlQXR0cnM6IHN0cmluZ1tdW10gPSBbXTtcbiAgICB2YXIgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHM6IEJvdW5kRWxlbWVudE9yRGlyZWN0aXZlUHJvcGVydHlbXSA9IFtdO1xuICAgIHZhciB2YXJzOiBWYXJpYWJsZUFzdFtdID0gW107XG4gICAgdmFyIGV2ZW50czogQm91bmRFdmVudEFzdFtdID0gW107XG5cbiAgICB2YXIgdGVtcGxhdGVFbGVtZW50T3JEaXJlY3RpdmVQcm9wczogQm91bmRFbGVtZW50T3JEaXJlY3RpdmVQcm9wZXJ0eVtdID0gW107XG4gICAgdmFyIHRlbXBsYXRlVmFyczogVmFyaWFibGVBc3RbXSA9IFtdO1xuICAgIHZhciB0ZW1wbGF0ZU1hdGNoYWJsZUF0dHJzOiBzdHJpbmdbXVtdID0gW107XG4gICAgdmFyIGhhc0lubGluZVRlbXBsYXRlcyA9IGZhbHNlO1xuICAgIHZhciBhdHRycyA9IFtdO1xuXG4gICAgZWxlbWVudC5hdHRycy5mb3JFYWNoKGF0dHIgPT4ge1xuICAgICAgbWF0Y2hhYmxlQXR0cnMucHVzaChbYXR0ci5uYW1lLCBhdHRyLnZhbHVlXSk7XG4gICAgICB2YXIgaGFzQmluZGluZyA9IHRoaXMuX3BhcnNlQXR0cihhdHRyLCBtYXRjaGFibGVBdHRycywgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIGV2ZW50cywgdmFycyk7XG4gICAgICB2YXIgaGFzVGVtcGxhdGVCaW5kaW5nID0gdGhpcy5fcGFyc2VJbmxpbmVUZW1wbGF0ZUJpbmRpbmcoXG4gICAgICAgICAgYXR0ciwgdGVtcGxhdGVNYXRjaGFibGVBdHRycywgdGVtcGxhdGVFbGVtZW50T3JEaXJlY3RpdmVQcm9wcywgdGVtcGxhdGVWYXJzKTtcbiAgICAgIGlmICghaGFzQmluZGluZyAmJiAhaGFzVGVtcGxhdGVCaW5kaW5nKSB7XG4gICAgICAgIC8vIGRvbid0IGluY2x1ZGUgdGhlIGJpbmRpbmdzIGFzIGF0dHJpYnV0ZXMgYXMgd2VsbCBpbiB0aGUgQVNUXG4gICAgICAgIGF0dHJzLnB1c2godGhpcy52aXNpdEF0dHIoYXR0ciwgbnVsbCkpO1xuICAgICAgfVxuICAgICAgaWYgKGhhc1RlbXBsYXRlQmluZGluZykge1xuICAgICAgICBoYXNJbmxpbmVUZW1wbGF0ZXMgPSB0cnVlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdmFyIGxjRWxOYW1lID0gc3BsaXROc05hbWUobm9kZU5hbWUudG9Mb3dlckNhc2UoKSlbMV07XG4gICAgdmFyIGlzVGVtcGxhdGVFbGVtZW50ID0gbGNFbE5hbWUgPT0gVEVNUExBVEVfRUxFTUVOVDtcbiAgICB2YXIgZWxlbWVudENzc1NlbGVjdG9yID0gY3JlYXRlRWxlbWVudENzc1NlbGVjdG9yKG5vZGVOYW1lLCBtYXRjaGFibGVBdHRycyk7XG4gICAgdmFyIGRpcmVjdGl2ZXMgPSB0aGlzLl9jcmVhdGVEaXJlY3RpdmVBc3RzKFxuICAgICAgICBlbGVtZW50Lm5hbWUsIHRoaXMuX3BhcnNlRGlyZWN0aXZlcyh0aGlzLnNlbGVjdG9yTWF0Y2hlciwgZWxlbWVudENzc1NlbGVjdG9yKSxcbiAgICAgICAgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIGlzVGVtcGxhdGVFbGVtZW50ID8gW10gOiB2YXJzLCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgIHZhciBlbGVtZW50UHJvcHM6IEJvdW5kRWxlbWVudFByb3BlcnR5QXN0W10gPVxuICAgICAgICB0aGlzLl9jcmVhdGVFbGVtZW50UHJvcGVydHlBc3RzKGVsZW1lbnQubmFtZSwgZWxlbWVudE9yRGlyZWN0aXZlUHJvcHMsIGRpcmVjdGl2ZXMpO1xuICAgIHZhciBjaGlsZHJlbiA9IGh0bWxWaXNpdEFsbChwcmVwYXJzZWRFbGVtZW50Lm5vbkJpbmRhYmxlID8gTk9OX0JJTkRBQkxFX1ZJU0lUT1IgOiB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNoaWxkcmVuLCBDb21wb25lbnQuY3JlYXRlKGRpcmVjdGl2ZXMpKTtcbiAgICB2YXIgZWxlbWVudE5nQ29udGVudEluZGV4ID1cbiAgICAgICAgaGFzSW5saW5lVGVtcGxhdGVzID8gbnVsbCA6IGNvbXBvbmVudC5maW5kTmdDb250ZW50SW5kZXgoZWxlbWVudENzc1NlbGVjdG9yKTtcbiAgICB2YXIgcGFyc2VkRWxlbWVudDtcbiAgICBpZiAocHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5OR19DT05URU5UKSB7XG4gICAgICBpZiAoaXNQcmVzZW50KGVsZW1lbnQuY2hpbGRyZW4pICYmIGVsZW1lbnQuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihcbiAgICAgICAgICAgIGA8bmctY29udGVudD4gZWxlbWVudCBjYW5ub3QgaGF2ZSBjb250ZW50LiA8bmctY29udGVudD4gbXVzdCBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSA8L25nLWNvbnRlbnQ+YCxcbiAgICAgICAgICAgIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICB9XG4gICAgICBwYXJzZWRFbGVtZW50ID1cbiAgICAgICAgICBuZXcgTmdDb250ZW50QXN0KHRoaXMubmdDb250ZW50Q291bnQrKywgZWxlbWVudE5nQ29udGVudEluZGV4LCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgIH0gZWxzZSBpZiAoaXNUZW1wbGF0ZUVsZW1lbnQpIHtcbiAgICAgIHRoaXMuX2Fzc2VydEFsbEV2ZW50c1B1Ymxpc2hlZEJ5RGlyZWN0aXZlcyhkaXJlY3RpdmVzLCBldmVudHMpO1xuICAgICAgdGhpcy5fYXNzZXJ0Tm9Db21wb25lbnRzTm9yRWxlbWVudEJpbmRpbmdzT25UZW1wbGF0ZShkaXJlY3RpdmVzLCBlbGVtZW50UHJvcHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICBwYXJzZWRFbGVtZW50ID0gbmV3IEVtYmVkZGVkVGVtcGxhdGVBc3QoYXR0cnMsIGV2ZW50cywgdmFycywgZGlyZWN0aXZlcywgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudE5nQ29udGVudEluZGV4LCBlbGVtZW50LnNvdXJjZVNwYW4pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9hc3NlcnRPbmx5T25lQ29tcG9uZW50KGRpcmVjdGl2ZXMsIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICB2YXIgZWxlbWVudEV4cG9ydEFzVmFycyA9IHZhcnMuZmlsdGVyKHZhckFzdCA9PiB2YXJBc3QudmFsdWUubGVuZ3RoID09PSAwKTtcbiAgICAgIHBhcnNlZEVsZW1lbnQgPVxuICAgICAgICAgIG5ldyBFbGVtZW50QXN0KG5vZGVOYW1lLCBhdHRycywgZWxlbWVudFByb3BzLCBldmVudHMsIGVsZW1lbnRFeHBvcnRBc1ZhcnMsIGRpcmVjdGl2ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW4sIGVsZW1lbnROZ0NvbnRlbnRJbmRleCwgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICB9XG4gICAgaWYgKGhhc0lubGluZVRlbXBsYXRlcykge1xuICAgICAgdmFyIHRlbXBsYXRlQ3NzU2VsZWN0b3IgPSBjcmVhdGVFbGVtZW50Q3NzU2VsZWN0b3IoVEVNUExBVEVfRUxFTUVOVCwgdGVtcGxhdGVNYXRjaGFibGVBdHRycyk7XG4gICAgICB2YXIgdGVtcGxhdGVEaXJlY3RpdmVzID0gdGhpcy5fY3JlYXRlRGlyZWN0aXZlQXN0cyhcbiAgICAgICAgICBlbGVtZW50Lm5hbWUsIHRoaXMuX3BhcnNlRGlyZWN0aXZlcyh0aGlzLnNlbGVjdG9yTWF0Y2hlciwgdGVtcGxhdGVDc3NTZWxlY3RvciksXG4gICAgICAgICAgdGVtcGxhdGVFbGVtZW50T3JEaXJlY3RpdmVQcm9wcywgW10sIGVsZW1lbnQuc291cmNlU3Bhbik7XG4gICAgICB2YXIgdGVtcGxhdGVFbGVtZW50UHJvcHM6IEJvdW5kRWxlbWVudFByb3BlcnR5QXN0W10gPSB0aGlzLl9jcmVhdGVFbGVtZW50UHJvcGVydHlBc3RzKFxuICAgICAgICAgIGVsZW1lbnQubmFtZSwgdGVtcGxhdGVFbGVtZW50T3JEaXJlY3RpdmVQcm9wcywgdGVtcGxhdGVEaXJlY3RpdmVzKTtcbiAgICAgIHRoaXMuX2Fzc2VydE5vQ29tcG9uZW50c05vckVsZW1lbnRCaW5kaW5nc09uVGVtcGxhdGUodGVtcGxhdGVEaXJlY3RpdmVzLCB0ZW1wbGF0ZUVsZW1lbnRQcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICAgIHBhcnNlZEVsZW1lbnQgPSBuZXcgRW1iZWRkZWRUZW1wbGF0ZUFzdChcbiAgICAgICAgICBbXSwgW10sIHRlbXBsYXRlVmFycywgdGVtcGxhdGVEaXJlY3RpdmVzLCBbcGFyc2VkRWxlbWVudF0sXG4gICAgICAgICAgY29tcG9uZW50LmZpbmROZ0NvbnRlbnRJbmRleCh0ZW1wbGF0ZUNzc1NlbGVjdG9yKSwgZWxlbWVudC5zb3VyY2VTcGFuKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcnNlZEVsZW1lbnQ7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZUlubGluZVRlbXBsYXRlQmluZGluZyhhdHRyOiBIdG1sQXR0ckFzdCwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnM6IHN0cmluZ1tdW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFZhcnM6IFZhcmlhYmxlQXN0W10pOiBib29sZWFuIHtcbiAgICB2YXIgdGVtcGxhdGVCaW5kaW5nc1NvdXJjZSA9IG51bGw7XG4gICAgaWYgKGF0dHIubmFtZSA9PSBURU1QTEFURV9BVFRSKSB7XG4gICAgICB0ZW1wbGF0ZUJpbmRpbmdzU291cmNlID0gYXR0ci52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGF0dHIubmFtZS5zdGFydHNXaXRoKFRFTVBMQVRFX0FUVFJfUFJFRklYKSkge1xuICAgICAgdmFyIGtleSA9IGF0dHIubmFtZS5zdWJzdHJpbmcoVEVNUExBVEVfQVRUUl9QUkVGSVgubGVuZ3RoKTsgIC8vIHJlbW92ZSB0aGUgc3RhclxuICAgICAgdGVtcGxhdGVCaW5kaW5nc1NvdXJjZSA9IChhdHRyLnZhbHVlLmxlbmd0aCA9PSAwKSA/IGtleSA6IGtleSArICcgJyArIGF0dHIudmFsdWU7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGVtcGxhdGVCaW5kaW5nc1NvdXJjZSkpIHtcbiAgICAgIHZhciBiaW5kaW5ncyA9IHRoaXMuX3BhcnNlVGVtcGxhdGVCaW5kaW5ncyh0ZW1wbGF0ZUJpbmRpbmdzU291cmNlLCBhdHRyLnNvdXJjZVNwYW4pO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBiaW5kaW5ncy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYmluZGluZyA9IGJpbmRpbmdzW2ldO1xuICAgICAgICBpZiAoYmluZGluZy5rZXlJc1Zhcikge1xuICAgICAgICAgIHRhcmdldFZhcnMucHVzaChuZXcgVmFyaWFibGVBc3QoYmluZGluZy5rZXksIGJpbmRpbmcubmFtZSwgYXR0ci5zb3VyY2VTcGFuKSk7XG4gICAgICAgICAgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMucHVzaChbYmluZGluZy5rZXksIGJpbmRpbmcubmFtZV0pO1xuICAgICAgICB9IGVsc2UgaWYgKGlzUHJlc2VudChiaW5kaW5nLmV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgdGhpcy5fcGFyc2VQcm9wZXJ0eUFzdChiaW5kaW5nLmtleSwgYmluZGluZy5leHByZXNzaW9uLCBhdHRyLnNvdXJjZVNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRhcmdldE1hdGNoYWJsZUF0dHJzLnB1c2goW2JpbmRpbmcua2V5LCAnJ10pO1xuICAgICAgICAgIHRoaXMuX3BhcnNlTGl0ZXJhbEF0dHIoYmluZGluZy5rZXksIG51bGwsIGF0dHIuc291cmNlU3BhbiwgdGFyZ2V0UHJvcHMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VBdHRyKGF0dHI6IEh0bWxBdHRyQXN0LCB0YXJnZXRNYXRjaGFibGVBdHRyczogc3RyaW5nW11bXSxcbiAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10sIHRhcmdldEV2ZW50czogQm91bmRFdmVudEFzdFtdLFxuICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFyczogVmFyaWFibGVBc3RbXSk6IGJvb2xlYW4ge1xuICAgIHZhciBhdHRyTmFtZSA9IHRoaXMuX25vcm1hbGl6ZUF0dHJpYnV0ZU5hbWUoYXR0ci5uYW1lKTtcbiAgICB2YXIgYXR0clZhbHVlID0gYXR0ci52YWx1ZTtcbiAgICB2YXIgYmluZFBhcnRzID0gUmVnRXhwV3JhcHBlci5maXJzdE1hdGNoKEJJTkRfTkFNRV9SRUdFWFAsIGF0dHJOYW1lKTtcbiAgICB2YXIgaGFzQmluZGluZyA9IGZhbHNlO1xuICAgIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzKSkge1xuICAgICAgaGFzQmluZGluZyA9IHRydWU7XG4gICAgICBpZiAoaXNQcmVzZW50KGJpbmRQYXJ0c1sxXSkpIHsgIC8vIG1hdGNoOiBiaW5kLXByb3BcbiAgICAgICAgdGhpcy5fcGFyc2VQcm9wZXJ0eShiaW5kUGFydHNbNV0sIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm9wcyk7XG5cbiAgICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KFxuICAgICAgICAgICAgICAgICAgICAgYmluZFBhcnRzWzJdKSkgeyAgLy8gbWF0Y2g6IHZhci1uYW1lIC8gdmFyLW5hbWU9XCJpZGVuXCIgLyAjbmFtZSAvICNuYW1lPVwiaWRlblwiXG4gICAgICAgIHZhciBpZGVudGlmaWVyID0gYmluZFBhcnRzWzVdO1xuICAgICAgICB0aGlzLl9wYXJzZVZhcmlhYmxlKGlkZW50aWZpZXIsIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLCB0YXJnZXRWYXJzKTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzWzNdKSkgeyAgLy8gbWF0Y2g6IG9uLWV2ZW50XG4gICAgICAgIHRoaXMuX3BhcnNlRXZlbnQoYmluZFBhcnRzWzVdLCBhdHRyVmFsdWUsIGF0dHIuc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RXZlbnRzKTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzWzRdKSkgeyAgLy8gbWF0Y2g6IGJpbmRvbi1wcm9wXG4gICAgICAgIHRoaXMuX3BhcnNlUHJvcGVydHkoYmluZFBhcnRzWzVdLCBhdHRyVmFsdWUsIGF0dHIuc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvcHMpO1xuICAgICAgICB0aGlzLl9wYXJzZUFzc2lnbm1lbnRFdmVudChiaW5kUGFydHNbNV0sIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RXZlbnRzKTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzWzZdKSkgeyAgLy8gbWF0Y2g6IFsoZXhwcildXG4gICAgICAgIHRoaXMuX3BhcnNlUHJvcGVydHkoYmluZFBhcnRzWzZdLCBhdHRyVmFsdWUsIGF0dHIuc291cmNlU3BhbiwgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0UHJvcHMpO1xuICAgICAgICB0aGlzLl9wYXJzZUFzc2lnbm1lbnRFdmVudChiaW5kUGFydHNbNl0sIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RXZlbnRzKTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzWzddKSkgeyAgLy8gbWF0Y2g6IFtleHByXVxuICAgICAgICB0aGlzLl9wYXJzZVByb3BlcnR5KGJpbmRQYXJ0c1s3XSwgYXR0clZhbHVlLCBhdHRyLnNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzKTtcblxuICAgICAgfSBlbHNlIGlmIChpc1ByZXNlbnQoYmluZFBhcnRzWzhdKSkgeyAgLy8gbWF0Y2g6IChldmVudClcbiAgICAgICAgdGhpcy5fcGFyc2VFdmVudChiaW5kUGFydHNbOF0sIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFdmVudHMpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBoYXNCaW5kaW5nID0gdGhpcy5fcGFyc2VQcm9wZXJ0eUludGVycG9sYXRpb24oYXR0ck5hbWUsIGF0dHJWYWx1ZSwgYXR0ci5zb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gICAgfVxuICAgIGlmICghaGFzQmluZGluZykge1xuICAgICAgdGhpcy5fcGFyc2VMaXRlcmFsQXR0cihhdHRyTmFtZSwgYXR0clZhbHVlLCBhdHRyLnNvdXJjZVNwYW4sIHRhcmdldFByb3BzKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0JpbmRpbmc7XG4gIH1cblxuICBwcml2YXRlIF9ub3JtYWxpemVBdHRyaWJ1dGVOYW1lKGF0dHJOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgoJ2RhdGEtJykgPyBhdHRyTmFtZS5zdWJzdHJpbmcoNSkgOiBhdHRyTmFtZTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlVmFyaWFibGUoaWRlbnRpZmllcjogc3RyaW5nLCB2YWx1ZTogc3RyaW5nLCBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0VmFyczogVmFyaWFibGVBc3RbXSkge1xuICAgIGlmIChpZGVudGlmaWVyLmluZGV4T2YoJy0nKSA+IC0xKSB7XG4gICAgICB0aGlzLl9yZXBvcnRFcnJvcihgXCItXCIgaXMgbm90IGFsbG93ZWQgaW4gdmFyaWFibGUgbmFtZXNgLCBzb3VyY2VTcGFuKTtcbiAgICB9XG4gICAgdGFyZ2V0VmFycy5wdXNoKG5ldyBWYXJpYWJsZUFzdChpZGVudGlmaWVyLCB2YWx1ZSwgc291cmNlU3BhbikpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VQcm9wZXJ0eShuYW1lOiBzdHJpbmcsIGV4cHJlc3Npb246IHN0cmluZywgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1hdGNoYWJsZUF0dHJzOiBzdHJpbmdbXVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10pIHtcbiAgICB0aGlzLl9wYXJzZVByb3BlcnR5QXN0KG5hbWUsIHRoaXMuX3BhcnNlQmluZGluZyhleHByZXNzaW9uLCBzb3VyY2VTcGFuKSwgc291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldE1hdGNoYWJsZUF0dHJzLCB0YXJnZXRQcm9wcyk7XG4gIH1cblxuICBwcml2YXRlIF9wYXJzZVByb3BlcnR5SW50ZXJwb2xhdGlvbihuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWF0Y2hhYmxlQXR0cnM6IHN0cmluZ1tdW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10pOiBib29sZWFuIHtcbiAgICB2YXIgZXhwciA9IHRoaXMuX3BhcnNlSW50ZXJwb2xhdGlvbih2YWx1ZSwgc291cmNlU3Bhbik7XG4gICAgaWYgKGlzUHJlc2VudChleHByKSkge1xuICAgICAgdGhpcy5fcGFyc2VQcm9wZXJ0eUFzdChuYW1lLCBleHByLCBzb3VyY2VTcGFuLCB0YXJnZXRNYXRjaGFibGVBdHRycywgdGFyZ2V0UHJvcHMpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlUHJvcGVydHlBc3QobmFtZTogc3RyaW5nLCBhc3Q6IEFTVFdpdGhTb3VyY2UsIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNYXRjaGFibGVBdHRyczogc3RyaW5nW11bXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm9wczogQm91bmRFbGVtZW50T3JEaXJlY3RpdmVQcm9wZXJ0eVtdKSB7XG4gICAgdGFyZ2V0TWF0Y2hhYmxlQXR0cnMucHVzaChbbmFtZSwgYXN0LnNvdXJjZV0pO1xuICAgIHRhcmdldFByb3BzLnB1c2gobmV3IEJvdW5kRWxlbWVudE9yRGlyZWN0aXZlUHJvcGVydHkobmFtZSwgYXN0LCBmYWxzZSwgc291cmNlU3BhbikpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VBc3NpZ25tZW50RXZlbnQobmFtZTogc3RyaW5nLCBleHByZXNzaW9uOiBzdHJpbmcsIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0TWF0Y2hhYmxlQXR0cnM6IHN0cmluZ1tdW10sIHRhcmdldEV2ZW50czogQm91bmRFdmVudEFzdFtdKSB7XG4gICAgdGhpcy5fcGFyc2VFdmVudChgJHtuYW1lfUNoYW5nZWAsIGAke2V4cHJlc3Npb259PSRldmVudGAsIHNvdXJjZVNwYW4sIHRhcmdldE1hdGNoYWJsZUF0dHJzLFxuICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0RXZlbnRzKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRXZlbnQobmFtZTogc3RyaW5nLCBleHByZXNzaW9uOiBzdHJpbmcsIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRNYXRjaGFibGVBdHRyczogc3RyaW5nW11bXSwgdGFyZ2V0RXZlbnRzOiBCb3VuZEV2ZW50QXN0W10pIHtcbiAgICAvLyBsb25nIGZvcm1hdDogJ3RhcmdldDogZXZlbnROYW1lJ1xuICAgIHZhciBwYXJ0cyA9IHNwbGl0QXRDb2xvbihuYW1lLCBbbnVsbCwgbmFtZV0pO1xuICAgIHZhciB0YXJnZXQgPSBwYXJ0c1swXTtcbiAgICB2YXIgZXZlbnROYW1lID0gcGFydHNbMV07XG4gICAgdGFyZ2V0RXZlbnRzLnB1c2gobmV3IEJvdW5kRXZlbnRBc3QoZXZlbnROYW1lLCB0YXJnZXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyc2VBY3Rpb24oZXhwcmVzc2lvbiwgc291cmNlU3BhbiksIHNvdXJjZVNwYW4pKTtcbiAgICAvLyBEb24ndCBkZXRlY3QgZGlyZWN0aXZlcyBmb3IgZXZlbnQgbmFtZXMgZm9yIG5vdyxcbiAgICAvLyBzbyBkb24ndCBhZGQgdGhlIGV2ZW50IG5hbWUgdG8gdGhlIG1hdGNoYWJsZUF0dHJzXG4gIH1cblxuICBwcml2YXRlIF9wYXJzZUxpdGVyYWxBdHRyKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10pIHtcbiAgICB0YXJnZXRQcm9wcy5wdXNoKG5ldyBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5KFxuICAgICAgICBuYW1lLCB0aGlzLl9leHByUGFyc2VyLndyYXBMaXRlcmFsUHJpbWl0aXZlKHZhbHVlLCAnJyksIHRydWUsIHNvdXJjZVNwYW4pKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRGlyZWN0aXZlcyhzZWxlY3Rvck1hdGNoZXI6IFNlbGVjdG9yTWF0Y2hlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRDc3NTZWxlY3RvcjogQ3NzU2VsZWN0b3IpOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGFbXSB7XG4gICAgdmFyIGRpcmVjdGl2ZXMgPSBbXTtcbiAgICBzZWxlY3Rvck1hdGNoZXIubWF0Y2goZWxlbWVudENzc1NlbGVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VsZWN0b3IsIGRpcmVjdGl2ZSkgPT4geyBkaXJlY3RpdmVzLnB1c2goZGlyZWN0aXZlKTsgfSk7XG4gICAgLy8gTmVlZCB0byBzb3J0IHRoZSBkaXJlY3RpdmVzIHNvIHRoYXQgd2UgZ2V0IGNvbnNpc3RlbnQgcmVzdWx0cyB0aHJvdWdob3V0LFxuICAgIC8vIGFzIHNlbGVjdG9yTWF0Y2hlciB1c2VzIE1hcHMgaW5zaWRlLlxuICAgIC8vIEFsc28gbmVlZCB0byBtYWtlIGNvbXBvbmVudHMgdGhlIGZpcnN0IGRpcmVjdGl2ZSBpbiB0aGUgYXJyYXlcbiAgICBMaXN0V3JhcHBlci5zb3J0KGRpcmVjdGl2ZXMsXG4gICAgICAgICAgICAgICAgICAgICAoZGlyMTogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhLCBkaXIyOiBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpcjFDb21wID0gZGlyMS5pc0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRpcjJDb21wID0gZGlyMi5pc0NvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpcjFDb21wICYmICFkaXIyQ29tcCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghZGlyMUNvbXAgJiYgZGlyMkNvbXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kaXJlY3RpdmVzSW5kZXguZ2V0KGRpcjEpIC0gdGhpcy5kaXJlY3RpdmVzSW5kZXguZ2V0KGRpcjIpO1xuICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICByZXR1cm4gZGlyZWN0aXZlcztcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZURpcmVjdGl2ZUFzdHMoZWxlbWVudE5hbWU6IHN0cmluZywgZGlyZWN0aXZlczogQ29tcGlsZURpcmVjdGl2ZU1ldGFkYXRhW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHM6IEJvdW5kRWxlbWVudE9yRGlyZWN0aXZlUHJvcGVydHlbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUV4cG9ydEFzVmFyczogVmFyaWFibGVBc3RbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pOiBEaXJlY3RpdmVBc3RbXSB7XG4gICAgdmFyIG1hdGNoZWRWYXJpYWJsZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICB2YXIgZGlyZWN0aXZlQXN0cyA9IGRpcmVjdGl2ZXMubWFwKChkaXJlY3RpdmU6IENvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSkgPT4ge1xuICAgICAgdmFyIGhvc3RQcm9wZXJ0aWVzOiBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdFtdID0gW107XG4gICAgICB2YXIgaG9zdEV2ZW50czogQm91bmRFdmVudEFzdFtdID0gW107XG4gICAgICB2YXIgZGlyZWN0aXZlUHJvcGVydGllczogQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdFtdID0gW107XG4gICAgICB0aGlzLl9jcmVhdGVEaXJlY3RpdmVIb3N0UHJvcGVydHlBc3RzKGVsZW1lbnROYW1lLCBkaXJlY3RpdmUuaG9zdFByb3BlcnRpZXMsIHNvdXJjZVNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RQcm9wZXJ0aWVzKTtcbiAgICAgIHRoaXMuX2NyZWF0ZURpcmVjdGl2ZUhvc3RFdmVudEFzdHMoZGlyZWN0aXZlLmhvc3RMaXN0ZW5lcnMsIHNvdXJjZVNwYW4sIGhvc3RFdmVudHMpO1xuICAgICAgdGhpcy5fY3JlYXRlRGlyZWN0aXZlUHJvcGVydHlBc3RzKGRpcmVjdGl2ZS5pbnB1dHMsIHByb3BzLCBkaXJlY3RpdmVQcm9wZXJ0aWVzKTtcbiAgICAgIHZhciBleHBvcnRBc1ZhcnMgPSBbXTtcbiAgICAgIHBvc3NpYmxlRXhwb3J0QXNWYXJzLmZvckVhY2goKHZhckFzdCkgPT4ge1xuICAgICAgICBpZiAoKHZhckFzdC52YWx1ZS5sZW5ndGggPT09IDAgJiYgZGlyZWN0aXZlLmlzQ29tcG9uZW50KSB8fFxuICAgICAgICAgICAgKGRpcmVjdGl2ZS5leHBvcnRBcyA9PSB2YXJBc3QudmFsdWUpKSB7XG4gICAgICAgICAgZXhwb3J0QXNWYXJzLnB1c2godmFyQXN0KTtcbiAgICAgICAgICBtYXRjaGVkVmFyaWFibGVzLmFkZCh2YXJBc3QubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIG5ldyBEaXJlY3RpdmVBc3QoZGlyZWN0aXZlLCBkaXJlY3RpdmVQcm9wZXJ0aWVzLCBob3N0UHJvcGVydGllcywgaG9zdEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydEFzVmFycywgc291cmNlU3Bhbik7XG4gICAgfSk7XG4gICAgcG9zc2libGVFeHBvcnRBc1ZhcnMuZm9yRWFjaCgodmFyQXN0KSA9PiB7XG4gICAgICBpZiAodmFyQXN0LnZhbHVlLmxlbmd0aCA+IDAgJiYgIVNldFdyYXBwZXIuaGFzKG1hdGNoZWRWYXJpYWJsZXMsIHZhckFzdC5uYW1lKSkge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihgVGhlcmUgaXMgbm8gZGlyZWN0aXZlIHdpdGggXCJleHBvcnRBc1wiIHNldCB0byBcIiR7dmFyQXN0LnZhbHVlfVwiYCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyQXN0LnNvdXJjZVNwYW4pO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkaXJlY3RpdmVBc3RzO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRGlyZWN0aXZlSG9zdFByb3BlcnR5QXN0cyhlbGVtZW50TmFtZTogc3RyaW5nLCBob3N0UHJvcHM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRQcm9wZXJ0eUFzdHM6IEJvdW5kRWxlbWVudFByb3BlcnR5QXN0W10pIHtcbiAgICBpZiAoaXNQcmVzZW50KGhvc3RQcm9wcykpIHtcbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChob3N0UHJvcHMsIChleHByZXNzaW9uLCBwcm9wTmFtZSkgPT4ge1xuICAgICAgICB2YXIgZXhwckFzdCA9IHRoaXMuX3BhcnNlQmluZGluZyhleHByZXNzaW9uLCBzb3VyY2VTcGFuKTtcbiAgICAgICAgdGFyZ2V0UHJvcGVydHlBc3RzLnB1c2goXG4gICAgICAgICAgICB0aGlzLl9jcmVhdGVFbGVtZW50UHJvcGVydHlBc3QoZWxlbWVudE5hbWUsIHByb3BOYW1lLCBleHByQXN0LCBzb3VyY2VTcGFuKSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEaXJlY3RpdmVIb3N0RXZlbnRBc3RzKGhvc3RMaXN0ZW5lcnM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3BhbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRFdmVudEFzdHM6IEJvdW5kRXZlbnRBc3RbXSkge1xuICAgIGlmIChpc1ByZXNlbnQoaG9zdExpc3RlbmVycykpIHtcbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChob3N0TGlzdGVuZXJzLCAoZXhwcmVzc2lvbiwgcHJvcE5hbWUpID0+IHtcbiAgICAgICAgdGhpcy5fcGFyc2VFdmVudChwcm9wTmFtZSwgZXhwcmVzc2lvbiwgc291cmNlU3BhbiwgW10sIHRhcmdldEV2ZW50QXN0cyk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEaXJlY3RpdmVQcm9wZXJ0eUFzdHMoZGlyZWN0aXZlUHJvcGVydGllczoge1trZXk6IHN0cmluZ106IHN0cmluZ30sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZFByb3BzOiBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5W10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BzOiBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0W10pIHtcbiAgICBpZiAoaXNQcmVzZW50KGRpcmVjdGl2ZVByb3BlcnRpZXMpKSB7XG4gICAgICB2YXIgYm91bmRQcm9wc0J5TmFtZSA9IG5ldyBNYXA8c3RyaW5nLCBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5PigpO1xuICAgICAgYm91bmRQcm9wcy5mb3JFYWNoKGJvdW5kUHJvcCA9PiB7XG4gICAgICAgIHZhciBwcmV2VmFsdWUgPSBib3VuZFByb3BzQnlOYW1lLmdldChib3VuZFByb3AubmFtZSk7XG4gICAgICAgIGlmIChpc0JsYW5rKHByZXZWYWx1ZSkgfHwgcHJldlZhbHVlLmlzTGl0ZXJhbCkge1xuICAgICAgICAgIC8vIGdpdmUgW2FdPVwiYlwiIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBhPVwiYlwiIG9uIHRoZSBzYW1lIGVsZW1lbnRcbiAgICAgICAgICBib3VuZFByb3BzQnlOYW1lLnNldChib3VuZFByb3AubmFtZSwgYm91bmRQcm9wKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChkaXJlY3RpdmVQcm9wZXJ0aWVzLCAoZWxQcm9wOiBzdHJpbmcsIGRpclByb3A6IHN0cmluZykgPT4ge1xuICAgICAgICB2YXIgYm91bmRQcm9wID0gYm91bmRQcm9wc0J5TmFtZS5nZXQoZWxQcm9wKTtcblxuICAgICAgICAvLyBCaW5kaW5ncyBhcmUgb3B0aW9uYWwsIHNvIHRoaXMgYmluZGluZyBvbmx5IG5lZWRzIHRvIGJlIHNldCB1cCBpZiBhbiBleHByZXNzaW9uIGlzIGdpdmVuLlxuICAgICAgICBpZiAoaXNQcmVzZW50KGJvdW5kUHJvcCkpIHtcbiAgICAgICAgICB0YXJnZXRCb3VuZERpcmVjdGl2ZVByb3BzLnB1c2gobmV3IEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QoXG4gICAgICAgICAgICAgIGRpclByb3AsIGJvdW5kUHJvcC5uYW1lLCBib3VuZFByb3AuZXhwcmVzc2lvbiwgYm91bmRQcm9wLnNvdXJjZVNwYW4pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0cyhlbGVtZW50TmFtZTogc3RyaW5nLCBwcm9wczogQm91bmRFbGVtZW50T3JEaXJlY3RpdmVQcm9wZXJ0eVtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IERpcmVjdGl2ZUFzdFtdKTogQm91bmRFbGVtZW50UHJvcGVydHlBc3RbXSB7XG4gICAgdmFyIGJvdW5kRWxlbWVudFByb3BzOiBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdFtdID0gW107XG4gICAgdmFyIGJvdW5kRGlyZWN0aXZlUHJvcHNJbmRleCA9IG5ldyBNYXA8c3RyaW5nLCBCb3VuZERpcmVjdGl2ZVByb3BlcnR5QXN0PigpO1xuICAgIGRpcmVjdGl2ZXMuZm9yRWFjaCgoZGlyZWN0aXZlOiBEaXJlY3RpdmVBc3QpID0+IHtcbiAgICAgIGRpcmVjdGl2ZS5pbnB1dHMuZm9yRWFjaCgocHJvcDogQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdCkgPT4ge1xuICAgICAgICBib3VuZERpcmVjdGl2ZVByb3BzSW5kZXguc2V0KHByb3AudGVtcGxhdGVOYW1lLCBwcm9wKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHByb3BzLmZvckVhY2goKHByb3A6IEJvdW5kRWxlbWVudE9yRGlyZWN0aXZlUHJvcGVydHkpID0+IHtcbiAgICAgIGlmICghcHJvcC5pc0xpdGVyYWwgJiYgaXNCbGFuayhib3VuZERpcmVjdGl2ZVByb3BzSW5kZXguZ2V0KHByb3AubmFtZSkpKSB7XG4gICAgICAgIGJvdW5kRWxlbWVudFByb3BzLnB1c2godGhpcy5fY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0KGVsZW1lbnROYW1lLCBwcm9wLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AuZXhwcmVzc2lvbiwgcHJvcC5zb3VyY2VTcGFuKSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGJvdW5kRWxlbWVudFByb3BzO1xuICB9XG5cbiAgcHJpdmF0ZSBfY3JlYXRlRWxlbWVudFByb3BlcnR5QXN0KGVsZW1lbnROYW1lOiBzdHJpbmcsIG5hbWU6IHN0cmluZywgYXN0OiBBU1QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pOiBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdCB7XG4gICAgdmFyIHVuaXQgPSBudWxsO1xuICAgIHZhciBiaW5kaW5nVHlwZTtcbiAgICB2YXIgYm91bmRQcm9wZXJ0eU5hbWU7XG4gICAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdChQUk9QRVJUWV9QQVJUU19TRVBBUkFUT1IpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICAgIGJvdW5kUHJvcGVydHlOYW1lID0gdGhpcy5fc2NoZW1hUmVnaXN0cnkuZ2V0TWFwcGVkUHJvcE5hbWUocGFydHNbMF0pO1xuICAgICAgYmluZGluZ1R5cGUgPSBQcm9wZXJ0eUJpbmRpbmdUeXBlLlByb3BlcnR5O1xuICAgICAgaWYgKCF0aGlzLl9zY2hlbWFSZWdpc3RyeS5oYXNQcm9wZXJ0eShlbGVtZW50TmFtZSwgYm91bmRQcm9wZXJ0eU5hbWUpKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFxuICAgICAgICAgICAgYENhbid0IGJpbmQgdG8gJyR7Ym91bmRQcm9wZXJ0eU5hbWV9JyBzaW5jZSBpdCBpc24ndCBhIGtub3duIG5hdGl2ZSBwcm9wZXJ0eWAsXG4gICAgICAgICAgICBzb3VyY2VTcGFuKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHBhcnRzWzBdID09IEFUVFJJQlVURV9QUkVGSVgpIHtcbiAgICAgICAgYm91bmRQcm9wZXJ0eU5hbWUgPSBwYXJ0c1sxXTtcbiAgICAgICAgYmluZGluZ1R5cGUgPSBQcm9wZXJ0eUJpbmRpbmdUeXBlLkF0dHJpYnV0ZTtcbiAgICAgIH0gZWxzZSBpZiAocGFydHNbMF0gPT0gQ0xBU1NfUFJFRklYKSB7XG4gICAgICAgIGJvdW5kUHJvcGVydHlOYW1lID0gcGFydHNbMV07XG4gICAgICAgIGJpbmRpbmdUeXBlID0gUHJvcGVydHlCaW5kaW5nVHlwZS5DbGFzcztcbiAgICAgIH0gZWxzZSBpZiAocGFydHNbMF0gPT0gU1RZTEVfUFJFRklYKSB7XG4gICAgICAgIHVuaXQgPSBwYXJ0cy5sZW5ndGggPiAyID8gcGFydHNbMl0gOiBudWxsO1xuICAgICAgICBib3VuZFByb3BlcnR5TmFtZSA9IHBhcnRzWzFdO1xuICAgICAgICBiaW5kaW5nVHlwZSA9IFByb3BlcnR5QmluZGluZ1R5cGUuU3R5bGU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLl9yZXBvcnRFcnJvcihgSW52YWxpZCBwcm9wZXJ0eSBuYW1lICcke25hbWV9J2AsIHNvdXJjZVNwYW4pO1xuICAgICAgICBiaW5kaW5nVHlwZSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdChib3VuZFByb3BlcnR5TmFtZSwgYmluZGluZ1R5cGUsIGFzdCwgdW5pdCwgc291cmNlU3Bhbik7XG4gIH1cblxuXG4gIHByaXZhdGUgX2ZpbmRDb21wb25lbnREaXJlY3RpdmVOYW1lcyhkaXJlY3RpdmVzOiBEaXJlY3RpdmVBc3RbXSk6IHN0cmluZ1tdIHtcbiAgICB2YXIgY29tcG9uZW50VHlwZU5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChkaXJlY3RpdmUgPT4ge1xuICAgICAgdmFyIHR5cGVOYW1lID0gZGlyZWN0aXZlLmRpcmVjdGl2ZS50eXBlLm5hbWU7XG4gICAgICBpZiAoZGlyZWN0aXZlLmRpcmVjdGl2ZS5pc0NvbXBvbmVudCkge1xuICAgICAgICBjb21wb25lbnRUeXBlTmFtZXMucHVzaCh0eXBlTmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbXBvbmVudFR5cGVOYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgX2Fzc2VydE9ubHlPbmVDb21wb25lbnQoZGlyZWN0aXZlczogRGlyZWN0aXZlQXN0W10sIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge1xuICAgIHZhciBjb21wb25lbnRUeXBlTmFtZXMgPSB0aGlzLl9maW5kQ29tcG9uZW50RGlyZWN0aXZlTmFtZXMoZGlyZWN0aXZlcyk7XG4gICAgaWYgKGNvbXBvbmVudFR5cGVOYW1lcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLl9yZXBvcnRFcnJvcihgTW9yZSB0aGFuIG9uZSBjb21wb25lbnQ6ICR7Y29tcG9uZW50VHlwZU5hbWVzLmpvaW4oJywnKX1gLCBzb3VyY2VTcGFuKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9hc3NlcnROb0NvbXBvbmVudHNOb3JFbGVtZW50QmluZGluZ3NPblRlbXBsYXRlKGRpcmVjdGl2ZXM6IERpcmVjdGl2ZUFzdFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQcm9wczogQm91bmRFbGVtZW50UHJvcGVydHlBc3RbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pIHtcbiAgICB2YXIgY29tcG9uZW50VHlwZU5hbWVzOiBzdHJpbmdbXSA9IHRoaXMuX2ZpbmRDb21wb25lbnREaXJlY3RpdmVOYW1lcyhkaXJlY3RpdmVzKTtcbiAgICBpZiAoY29tcG9uZW50VHlwZU5hbWVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKGBDb21wb25lbnRzIG9uIGFuIGVtYmVkZGVkIHRlbXBsYXRlOiAke2NvbXBvbmVudFR5cGVOYW1lcy5qb2luKCcsJyl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVNwYW4pO1xuICAgIH1cbiAgICBlbGVtZW50UHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFxuICAgICAgICAgIGBQcm9wZXJ0eSBiaW5kaW5nICR7cHJvcC5uYW1lfSBub3QgdXNlZCBieSBhbnkgZGlyZWN0aXZlIG9uIGFuIGVtYmVkZGVkIHRlbXBsYXRlYCxcbiAgICAgICAgICBzb3VyY2VTcGFuKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2Fzc2VydEFsbEV2ZW50c1B1Ymxpc2hlZEJ5RGlyZWN0aXZlcyhkaXJlY3RpdmVzOiBEaXJlY3RpdmVBc3RbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50czogQm91bmRFdmVudEFzdFtdKSB7XG4gICAgdmFyIGFsbERpcmVjdGl2ZUV2ZW50cyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGRpcmVjdGl2ZXMuZm9yRWFjaChkaXJlY3RpdmUgPT4ge1xuICAgICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKGRpcmVjdGl2ZS5kaXJlY3RpdmUub3V0cHV0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnROYW1lLCBfKSA9PiB7IGFsbERpcmVjdGl2ZUV2ZW50cy5hZGQoZXZlbnROYW1lKTsgfSk7XG4gICAgfSk7XG4gICAgZXZlbnRzLmZvckVhY2goZXZlbnQgPT4ge1xuICAgICAgaWYgKGlzUHJlc2VudChldmVudC50YXJnZXQpIHx8ICFTZXRXcmFwcGVyLmhhcyhhbGxEaXJlY3RpdmVFdmVudHMsIGV2ZW50Lm5hbWUpKSB7XG4gICAgICAgIHRoaXMuX3JlcG9ydEVycm9yKFxuICAgICAgICAgICAgYEV2ZW50IGJpbmRpbmcgJHtldmVudC5mdWxsTmFtZX0gbm90IGVtaXR0ZWQgYnkgYW55IGRpcmVjdGl2ZSBvbiBhbiBlbWJlZGRlZCB0ZW1wbGF0ZWAsXG4gICAgICAgICAgICBldmVudC5zb3VyY2VTcGFuKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBOb25CaW5kYWJsZVZpc2l0b3IgaW1wbGVtZW50cyBIdG1sQXN0VmlzaXRvciB7XG4gIHZpc2l0RWxlbWVudChhc3Q6IEh0bWxFbGVtZW50QXN0LCBjb21wb25lbnQ6IENvbXBvbmVudCk6IEVsZW1lbnRBc3Qge1xuICAgIHZhciBwcmVwYXJzZWRFbGVtZW50ID0gcHJlcGFyc2VFbGVtZW50KGFzdCk7XG4gICAgaWYgKHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU0NSSVBUIHx8XG4gICAgICAgIHByZXBhcnNlZEVsZW1lbnQudHlwZSA9PT0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEUgfHxcbiAgICAgICAgcHJlcGFyc2VkRWxlbWVudC50eXBlID09PSBQcmVwYXJzZWRFbGVtZW50VHlwZS5TVFlMRVNIRUVUKSB7XG4gICAgICAvLyBTa2lwcGluZyA8c2NyaXB0PiBmb3Igc2VjdXJpdHkgcmVhc29uc1xuICAgICAgLy8gU2tpcHBpbmcgPHN0eWxlPiBhbmQgc3R5bGVzaGVldHMgYXMgd2UgYWxyZWFkeSBwcm9jZXNzZWQgdGhlbVxuICAgICAgLy8gaW4gdGhlIFN0eWxlQ29tcGlsZXJcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBhdHRyTmFtZUFuZFZhbHVlcyA9IGFzdC5hdHRycy5tYXAoYXR0ckFzdCA9PiBbYXR0ckFzdC5uYW1lLCBhdHRyQXN0LnZhbHVlXSk7XG4gICAgdmFyIHNlbGVjdG9yID0gY3JlYXRlRWxlbWVudENzc1NlbGVjdG9yKGFzdC5uYW1lLCBhdHRyTmFtZUFuZFZhbHVlcyk7XG4gICAgdmFyIG5nQ29udGVudEluZGV4ID0gY29tcG9uZW50LmZpbmROZ0NvbnRlbnRJbmRleChzZWxlY3Rvcik7XG4gICAgdmFyIGNoaWxkcmVuID0gaHRtbFZpc2l0QWxsKHRoaXMsIGFzdC5jaGlsZHJlbiwgRU1QVFlfQ09NUE9ORU5UKTtcbiAgICByZXR1cm4gbmV3IEVsZW1lbnRBc3QoYXN0Lm5hbWUsIGh0bWxWaXNpdEFsbCh0aGlzLCBhc3QuYXR0cnMpLCBbXSwgW10sIFtdLCBbXSwgY2hpbGRyZW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIG5nQ29udGVudEluZGV4LCBhc3Quc291cmNlU3Bhbik7XG4gIH1cbiAgdmlzaXRBdHRyKGFzdDogSHRtbEF0dHJBc3QsIGNvbnRleHQ6IGFueSk6IEF0dHJBc3Qge1xuICAgIHJldHVybiBuZXcgQXR0ckFzdChhc3QubmFtZSwgYXN0LnZhbHVlLCBhc3Quc291cmNlU3Bhbik7XG4gIH1cbiAgdmlzaXRUZXh0KGFzdDogSHRtbFRleHRBc3QsIGNvbXBvbmVudDogQ29tcG9uZW50KTogVGV4dEFzdCB7XG4gICAgdmFyIG5nQ29udGVudEluZGV4ID0gY29tcG9uZW50LmZpbmROZ0NvbnRlbnRJbmRleChURVhUX0NTU19TRUxFQ1RPUik7XG4gICAgcmV0dXJuIG5ldyBUZXh0QXN0KGFzdC52YWx1ZSwgbmdDb250ZW50SW5kZXgsIGFzdC5zb3VyY2VTcGFuKTtcbiAgfVxufVxuXG5jbGFzcyBCb3VuZEVsZW1lbnRPckRpcmVjdGl2ZVByb3BlcnR5IHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZywgcHVibGljIGV4cHJlc3Npb246IEFTVCwgcHVibGljIGlzTGl0ZXJhbDogYm9vbGVhbixcbiAgICAgICAgICAgICAgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge31cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0Q2xhc3NlcyhjbGFzc0F0dHJWYWx1ZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gU3RyaW5nV3JhcHBlci5zcGxpdChjbGFzc0F0dHJWYWx1ZS50cmltKCksIC9cXHMrL2cpO1xufVxuXG5jbGFzcyBDb21wb25lbnQge1xuICBzdGF0aWMgY3JlYXRlKGRpcmVjdGl2ZXM6IERpcmVjdGl2ZUFzdFtdKTogQ29tcG9uZW50IHtcbiAgICBpZiAoZGlyZWN0aXZlcy5sZW5ndGggPT09IDAgfHwgIWRpcmVjdGl2ZXNbMF0uZGlyZWN0aXZlLmlzQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm4gRU1QVFlfQ09NUE9ORU5UO1xuICAgIH1cbiAgICB2YXIgbWF0Y2hlciA9IG5ldyBTZWxlY3Rvck1hdGNoZXIoKTtcbiAgICB2YXIgbmdDb250ZW50U2VsZWN0b3JzID0gZGlyZWN0aXZlc1swXS5kaXJlY3RpdmUudGVtcGxhdGUubmdDb250ZW50U2VsZWN0b3JzO1xuICAgIHZhciB3aWxkY2FyZE5nQ29udGVudEluZGV4ID0gbnVsbDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5nQ29udGVudFNlbGVjdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHNlbGVjdG9yID0gbmdDb250ZW50U2VsZWN0b3JzW2ldO1xuICAgICAgaWYgKFN0cmluZ1dyYXBwZXIuZXF1YWxzKHNlbGVjdG9yLCAnKicpKSB7XG4gICAgICAgIHdpbGRjYXJkTmdDb250ZW50SW5kZXggPSBpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWF0Y2hlci5hZGRTZWxlY3RhYmxlcyhDc3NTZWxlY3Rvci5wYXJzZShuZ0NvbnRlbnRTZWxlY3RvcnNbaV0pLCBpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5ldyBDb21wb25lbnQobWF0Y2hlciwgd2lsZGNhcmROZ0NvbnRlbnRJbmRleCk7XG4gIH1cbiAgY29uc3RydWN0b3IocHVibGljIG5nQ29udGVudEluZGV4TWF0Y2hlcjogU2VsZWN0b3JNYXRjaGVyLFxuICAgICAgICAgICAgICBwdWJsaWMgd2lsZGNhcmROZ0NvbnRlbnRJbmRleDogbnVtYmVyKSB7fVxuXG4gIGZpbmROZ0NvbnRlbnRJbmRleChzZWxlY3RvcjogQ3NzU2VsZWN0b3IpOiBudW1iZXIge1xuICAgIHZhciBuZ0NvbnRlbnRJbmRpY2VzID0gW107XG4gICAgdGhpcy5uZ0NvbnRlbnRJbmRleE1hdGNoZXIubWF0Y2goXG4gICAgICAgIHNlbGVjdG9yLCAoc2VsZWN0b3IsIG5nQ29udGVudEluZGV4KSA9PiB7IG5nQ29udGVudEluZGljZXMucHVzaChuZ0NvbnRlbnRJbmRleCk7IH0pO1xuICAgIExpc3RXcmFwcGVyLnNvcnQobmdDb250ZW50SW5kaWNlcyk7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLndpbGRjYXJkTmdDb250ZW50SW5kZXgpKSB7XG4gICAgICBuZ0NvbnRlbnRJbmRpY2VzLnB1c2godGhpcy53aWxkY2FyZE5nQ29udGVudEluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIG5nQ29udGVudEluZGljZXMubGVuZ3RoID4gMCA/IG5nQ29udGVudEluZGljZXNbMF0gOiBudWxsO1xuICB9XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUVsZW1lbnRDc3NTZWxlY3RvcihlbGVtZW50TmFtZTogc3RyaW5nLCBtYXRjaGFibGVBdHRyczogc3RyaW5nW11bXSk6IENzc1NlbGVjdG9yIHtcbiAgdmFyIGNzc1NlbGVjdG9yID0gbmV3IENzc1NlbGVjdG9yKCk7XG4gIGxldCBlbE5hbWVOb05zID0gc3BsaXROc05hbWUoZWxlbWVudE5hbWUpWzFdO1xuXG4gIGNzc1NlbGVjdG9yLnNldEVsZW1lbnQoZWxOYW1lTm9Ocyk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXRjaGFibGVBdHRycy5sZW5ndGg7IGkrKykge1xuICAgIGxldCBhdHRyTmFtZSA9IG1hdGNoYWJsZUF0dHJzW2ldWzBdO1xuICAgIGxldCBhdHRyTmFtZU5vTnMgPSBzcGxpdE5zTmFtZShhdHRyTmFtZSlbMV07XG4gICAgbGV0IGF0dHJWYWx1ZSA9IG1hdGNoYWJsZUF0dHJzW2ldWzFdO1xuXG4gICAgY3NzU2VsZWN0b3IuYWRkQXR0cmlidXRlKGF0dHJOYW1lTm9OcywgYXR0clZhbHVlKTtcbiAgICBpZiAoYXR0ck5hbWUudG9Mb3dlckNhc2UoKSA9PSBDTEFTU19BVFRSKSB7XG4gICAgICB2YXIgY2xhc3NlcyA9IHNwbGl0Q2xhc3NlcyhhdHRyVmFsdWUpO1xuICAgICAgY2xhc3Nlcy5mb3JFYWNoKGNsYXNzTmFtZSA9PiBjc3NTZWxlY3Rvci5hZGRDbGFzc05hbWUoY2xhc3NOYW1lKSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjc3NTZWxlY3Rvcjtcbn1cblxudmFyIEVNUFRZX0NPTVBPTkVOVCA9IG5ldyBDb21wb25lbnQobmV3IFNlbGVjdG9yTWF0Y2hlcigpLCBudWxsKTtcbnZhciBOT05fQklOREFCTEVfVklTSVRPUiA9IG5ldyBOb25CaW5kYWJsZVZpc2l0b3IoKTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci90ZW1wbGF0ZV9wYXJzZXIudHNcbiAqKi8iLCJpbXBvcnQge1xuICBpc1ByZXNlbnQsXG4gIGlzQmxhbmssXG4gIFN0cmluZ1dyYXBwZXIsXG4gIHN0cmluZ2lmeSxcbiAgYXNzZXJ0aW9uc0VuYWJsZWQsXG4gIFN0cmluZ0pvaW5lcixcbiAgc2VyaWFsaXplRW51bSxcbiAgQ09OU1RfRVhQUlxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5pbXBvcnQge0h0bWxBc3QsIEh0bWxBdHRyQXN0LCBIdG1sVGV4dEFzdCwgSHRtbEVsZW1lbnRBc3R9IGZyb20gJy4vaHRtbF9hc3QnO1xuXG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7SHRtbFRva2VuLCBIdG1sVG9rZW5UeXBlLCB0b2tlbml6ZUh0bWx9IGZyb20gJy4vaHRtbF9sZXhlcic7XG5pbXBvcnQge1BhcnNlRXJyb3IsIFBhcnNlTG9jYXRpb24sIFBhcnNlU291cmNlU3Bhbn0gZnJvbSAnLi9wYXJzZV91dGlsJztcbmltcG9ydCB7SHRtbFRhZ0RlZmluaXRpb24sIGdldEh0bWxUYWdEZWZpbml0aW9uLCBnZXROc1ByZWZpeH0gZnJvbSAnLi9odG1sX3RhZ3MnO1xuXG5leHBvcnQgY2xhc3MgSHRtbFRyZWVFcnJvciBleHRlbmRzIFBhcnNlRXJyb3Ige1xuICBzdGF0aWMgY3JlYXRlKGVsZW1lbnROYW1lOiBzdHJpbmcsIGxvY2F0aW9uOiBQYXJzZUxvY2F0aW9uLCBtc2c6IHN0cmluZyk6IEh0bWxUcmVlRXJyb3Ige1xuICAgIHJldHVybiBuZXcgSHRtbFRyZWVFcnJvcihlbGVtZW50TmFtZSwgbG9jYXRpb24sIG1zZyk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWxlbWVudE5hbWU6IHN0cmluZywgbG9jYXRpb246IFBhcnNlTG9jYXRpb24sIG1zZzogc3RyaW5nKSB7XG4gICAgc3VwZXIobG9jYXRpb24sIG1zZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEh0bWxQYXJzZVRyZWVSZXN1bHQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcm9vdE5vZGVzOiBIdG1sQXN0W10sIHB1YmxpYyBlcnJvcnM6IFBhcnNlRXJyb3JbXSkge31cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEh0bWxQYXJzZXIge1xuICBwYXJzZShzb3VyY2VDb250ZW50OiBzdHJpbmcsIHNvdXJjZVVybDogc3RyaW5nKTogSHRtbFBhcnNlVHJlZVJlc3VsdCB7XG4gICAgdmFyIHRva2Vuc0FuZEVycm9ycyA9IHRva2VuaXplSHRtbChzb3VyY2VDb250ZW50LCBzb3VyY2VVcmwpO1xuICAgIHZhciB0cmVlQW5kRXJyb3JzID0gbmV3IFRyZWVCdWlsZGVyKHRva2Vuc0FuZEVycm9ycy50b2tlbnMpLmJ1aWxkKCk7XG4gICAgcmV0dXJuIG5ldyBIdG1sUGFyc2VUcmVlUmVzdWx0KHRyZWVBbmRFcnJvcnMucm9vdE5vZGVzLCAoPFBhcnNlRXJyb3JbXT50b2tlbnNBbmRFcnJvcnMuZXJyb3JzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jb25jYXQodHJlZUFuZEVycm9ycy5lcnJvcnMpKTtcbiAgfVxufVxuXG5jbGFzcyBUcmVlQnVpbGRlciB7XG4gIHByaXZhdGUgaW5kZXg6IG51bWJlciA9IC0xO1xuICBwcml2YXRlIHBlZWs6IEh0bWxUb2tlbjtcblxuICBwcml2YXRlIHJvb3ROb2RlczogSHRtbEFzdFtdID0gW107XG4gIHByaXZhdGUgZXJyb3JzOiBIdG1sVHJlZUVycm9yW10gPSBbXTtcblxuICBwcml2YXRlIGVsZW1lbnRTdGFjazogSHRtbEVsZW1lbnRBc3RbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdG9rZW5zOiBIdG1sVG9rZW5bXSkgeyB0aGlzLl9hZHZhbmNlKCk7IH1cblxuICBidWlsZCgpOiBIdG1sUGFyc2VUcmVlUmVzdWx0IHtcbiAgICB3aGlsZSAodGhpcy5wZWVrLnR5cGUgIT09IEh0bWxUb2tlblR5cGUuRU9GKSB7XG4gICAgICBpZiAodGhpcy5wZWVrLnR5cGUgPT09IEh0bWxUb2tlblR5cGUuVEFHX09QRU5fU1RBUlQpIHtcbiAgICAgICAgdGhpcy5fY29uc3VtZVN0YXJ0VGFnKHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLlRBR19DTE9TRSkge1xuICAgICAgICB0aGlzLl9jb25zdW1lRW5kVGFnKHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLkNEQVRBX1NUQVJUKSB7XG4gICAgICAgIHRoaXMuX2Nsb3NlVm9pZEVsZW1lbnQoKTtcbiAgICAgICAgdGhpcy5fY29uc3VtZUNkYXRhKHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLkNPTU1FTlRfU1RBUlQpIHtcbiAgICAgICAgdGhpcy5fY2xvc2VWb2lkRWxlbWVudCgpO1xuICAgICAgICB0aGlzLl9jb25zdW1lQ29tbWVudCh0aGlzLl9hZHZhbmNlKCkpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnBlZWsudHlwZSA9PT0gSHRtbFRva2VuVHlwZS5URVhUIHx8XG4gICAgICAgICAgICAgICAgIHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLlJBV19URVhUIHx8XG4gICAgICAgICAgICAgICAgIHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLkVTQ0FQQUJMRV9SQVdfVEVYVCkge1xuICAgICAgICB0aGlzLl9jbG9zZVZvaWRFbGVtZW50KCk7XG4gICAgICAgIHRoaXMuX2NvbnN1bWVUZXh0KHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBTa2lwIGFsbCBvdGhlciB0b2tlbnMuLi5cbiAgICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IEh0bWxQYXJzZVRyZWVSZXN1bHQodGhpcy5yb290Tm9kZXMsIHRoaXMuZXJyb3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgX2FkdmFuY2UoKTogSHRtbFRva2VuIHtcbiAgICB2YXIgcHJldiA9IHRoaXMucGVlaztcbiAgICBpZiAodGhpcy5pbmRleCA8IHRoaXMudG9rZW5zLmxlbmd0aCAtIDEpIHtcbiAgICAgIC8vIE5vdGU6IHRoZXJlIGlzIGFsd2F5cyBhbiBFT0YgdG9rZW4gYXQgdGhlIGVuZFxuICAgICAgdGhpcy5pbmRleCsrO1xuICAgIH1cbiAgICB0aGlzLnBlZWsgPSB0aGlzLnRva2Vuc1t0aGlzLmluZGV4XTtcbiAgICByZXR1cm4gcHJldjtcbiAgfVxuXG4gIHByaXZhdGUgX2FkdmFuY2VJZih0eXBlOiBIdG1sVG9rZW5UeXBlKTogSHRtbFRva2VuIHtcbiAgICBpZiAodGhpcy5wZWVrLnR5cGUgPT09IHR5cGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9hZHZhbmNlKCk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uc3VtZUNkYXRhKHN0YXJ0VG9rZW46IEh0bWxUb2tlbikge1xuICAgIHRoaXMuX2NvbnN1bWVUZXh0KHRoaXMuX2FkdmFuY2UoKSk7XG4gICAgdGhpcy5fYWR2YW5jZUlmKEh0bWxUb2tlblR5cGUuQ0RBVEFfRU5EKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVDb21tZW50KHN0YXJ0VG9rZW46IEh0bWxUb2tlbikge1xuICAgIHRoaXMuX2FkdmFuY2VJZihIdG1sVG9rZW5UeXBlLlJBV19URVhUKTtcbiAgICB0aGlzLl9hZHZhbmNlSWYoSHRtbFRva2VuVHlwZS5DT01NRU5UX0VORCk7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lVGV4dCh0b2tlbjogSHRtbFRva2VuKSB7XG4gICAgbGV0IHRleHQgPSB0b2tlbi5wYXJ0c1swXTtcbiAgICBpZiAodGV4dC5sZW5ndGggPiAwICYmIHRleHRbMF0gPT0gJ1xcbicpIHtcbiAgICAgIGxldCBwYXJlbnQgPSB0aGlzLl9nZXRQYXJlbnRFbGVtZW50KCk7XG4gICAgICBpZiAoaXNQcmVzZW50KHBhcmVudCkgJiYgcGFyZW50LmNoaWxkcmVuLmxlbmd0aCA9PSAwICYmXG4gICAgICAgICAgZ2V0SHRtbFRhZ0RlZmluaXRpb24ocGFyZW50Lm5hbWUpLmlnbm9yZUZpcnN0TGYpIHtcbiAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDEpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuX2FkZFRvUGFyZW50KG5ldyBIdG1sVGV4dEFzdCh0ZXh0LCB0b2tlbi5zb3VyY2VTcGFuKSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY2xvc2VWb2lkRWxlbWVudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5lbGVtZW50U3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgbGV0IGVsID0gTGlzdFdyYXBwZXIubGFzdCh0aGlzLmVsZW1lbnRTdGFjayk7XG5cbiAgICAgIGlmIChnZXRIdG1sVGFnRGVmaW5pdGlvbihlbC5uYW1lKS5pc1ZvaWQpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50U3RhY2sucG9wKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfY29uc3VtZVN0YXJ0VGFnKHN0YXJ0VGFnVG9rZW46IEh0bWxUb2tlbikge1xuICAgIHZhciBwcmVmaXggPSBzdGFydFRhZ1Rva2VuLnBhcnRzWzBdO1xuICAgIHZhciBuYW1lID0gc3RhcnRUYWdUb2tlbi5wYXJ0c1sxXTtcbiAgICB2YXIgYXR0cnMgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5wZWVrLnR5cGUgPT09IEh0bWxUb2tlblR5cGUuQVRUUl9OQU1FKSB7XG4gICAgICBhdHRycy5wdXNoKHRoaXMuX2NvbnN1bWVBdHRyKHRoaXMuX2FkdmFuY2UoKSkpO1xuICAgIH1cbiAgICB2YXIgZnVsbE5hbWUgPSBnZXRFbGVtZW50RnVsbE5hbWUocHJlZml4LCBuYW1lLCB0aGlzLl9nZXRQYXJlbnRFbGVtZW50KCkpO1xuICAgIHZhciBzZWxmQ2xvc2luZyA9IGZhbHNlO1xuICAgIC8vIE5vdGU6IFRoZXJlIGNvdWxkIGhhdmUgYmVlbiBhIHRva2VuaXplciBlcnJvclxuICAgIC8vIHNvIHRoYXQgd2UgZG9uJ3QgZ2V0IGEgdG9rZW4gZm9yIHRoZSBlbmQgdGFnLi4uXG4gICAgaWYgKHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLlRBR19PUEVOX0VORF9WT0lEKSB7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICBzZWxmQ2xvc2luZyA9IHRydWU7XG4gICAgICBpZiAoZ2V0TnNQcmVmaXgoZnVsbE5hbWUpID09IG51bGwgJiYgIWdldEh0bWxUYWdEZWZpbml0aW9uKGZ1bGxOYW1lKS5pc1ZvaWQpIHtcbiAgICAgICAgdGhpcy5lcnJvcnMucHVzaChIdG1sVHJlZUVycm9yLmNyZWF0ZShcbiAgICAgICAgICAgIGZ1bGxOYW1lLCBzdGFydFRhZ1Rva2VuLnNvdXJjZVNwYW4uc3RhcnQsXG4gICAgICAgICAgICBgT25seSB2b2lkIGFuZCBmb3JlaWduIGVsZW1lbnRzIGNhbiBiZSBzZWxmIGNsb3NlZCBcIiR7c3RhcnRUYWdUb2tlbi5wYXJ0c1sxXX1cImApKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMucGVlay50eXBlID09PSBIdG1sVG9rZW5UeXBlLlRBR19PUEVOX0VORCkge1xuICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgc2VsZkNsb3NpbmcgPSBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGVuZCA9IHRoaXMucGVlay5zb3VyY2VTcGFuLnN0YXJ0O1xuICAgIHZhciBlbCA9IG5ldyBIdG1sRWxlbWVudEFzdChmdWxsTmFtZSwgYXR0cnMsIFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUGFyc2VTb3VyY2VTcGFuKHN0YXJ0VGFnVG9rZW4uc291cmNlU3Bhbi5zdGFydCwgZW5kKSk7XG4gICAgdGhpcy5fcHVzaEVsZW1lbnQoZWwpO1xuICAgIGlmIChzZWxmQ2xvc2luZykge1xuICAgICAgdGhpcy5fcG9wRWxlbWVudChmdWxsTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcHVzaEVsZW1lbnQoZWw6IEh0bWxFbGVtZW50QXN0KSB7XG4gICAgaWYgKHRoaXMuZWxlbWVudFN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBwYXJlbnRFbCA9IExpc3RXcmFwcGVyLmxhc3QodGhpcy5lbGVtZW50U3RhY2spO1xuICAgICAgaWYgKGdldEh0bWxUYWdEZWZpbml0aW9uKHBhcmVudEVsLm5hbWUpLmlzQ2xvc2VkQnlDaGlsZChlbC5uYW1lKSkge1xuICAgICAgICB0aGlzLmVsZW1lbnRTdGFjay5wb3AoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdGFnRGVmID0gZ2V0SHRtbFRhZ0RlZmluaXRpb24oZWwubmFtZSk7XG4gICAgdmFyIHBhcmVudEVsID0gdGhpcy5fZ2V0UGFyZW50RWxlbWVudCgpO1xuICAgIGlmICh0YWdEZWYucmVxdWlyZUV4dHJhUGFyZW50KGlzUHJlc2VudChwYXJlbnRFbCkgPyBwYXJlbnRFbC5uYW1lIDogbnVsbCkpIHtcbiAgICAgIHZhciBuZXdQYXJlbnQgPSBuZXcgSHRtbEVsZW1lbnRBc3QodGFnRGVmLnBhcmVudFRvQWRkLCBbXSwgW2VsXSwgZWwuc291cmNlU3Bhbik7XG4gICAgICB0aGlzLl9hZGRUb1BhcmVudChuZXdQYXJlbnQpO1xuICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaChuZXdQYXJlbnQpO1xuICAgICAgdGhpcy5lbGVtZW50U3RhY2sucHVzaChlbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2FkZFRvUGFyZW50KGVsKTtcbiAgICAgIHRoaXMuZWxlbWVudFN0YWNrLnB1c2goZWwpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVFbmRUYWcoZW5kVGFnVG9rZW46IEh0bWxUb2tlbikge1xuICAgIHZhciBmdWxsTmFtZSA9XG4gICAgICAgIGdldEVsZW1lbnRGdWxsTmFtZShlbmRUYWdUb2tlbi5wYXJ0c1swXSwgZW5kVGFnVG9rZW4ucGFydHNbMV0sIHRoaXMuX2dldFBhcmVudEVsZW1lbnQoKSk7XG5cbiAgICBpZiAoZ2V0SHRtbFRhZ0RlZmluaXRpb24oZnVsbE5hbWUpLmlzVm9pZCkge1xuICAgICAgdGhpcy5lcnJvcnMucHVzaChcbiAgICAgICAgICBIdG1sVHJlZUVycm9yLmNyZWF0ZShmdWxsTmFtZSwgZW5kVGFnVG9rZW4uc291cmNlU3Bhbi5zdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgVm9pZCBlbGVtZW50cyBkbyBub3QgaGF2ZSBlbmQgdGFncyBcIiR7ZW5kVGFnVG9rZW4ucGFydHNbMV19XCJgKSk7XG4gICAgfSBlbHNlIGlmICghdGhpcy5fcG9wRWxlbWVudChmdWxsTmFtZSkpIHtcbiAgICAgIHRoaXMuZXJyb3JzLnB1c2goSHRtbFRyZWVFcnJvci5jcmVhdGUoZnVsbE5hbWUsIGVuZFRhZ1Rva2VuLnNvdXJjZVNwYW4uc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBVbmV4cGVjdGVkIGNsb3NpbmcgdGFnIFwiJHtlbmRUYWdUb2tlbi5wYXJ0c1sxXX1cImApKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9wb3BFbGVtZW50KGZ1bGxOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGxldCBzdGFja0luZGV4ID0gdGhpcy5lbGVtZW50U3RhY2subGVuZ3RoIC0gMTsgc3RhY2tJbmRleCA+PSAwOyBzdGFja0luZGV4LS0pIHtcbiAgICAgIGxldCBlbCA9IHRoaXMuZWxlbWVudFN0YWNrW3N0YWNrSW5kZXhdO1xuICAgICAgaWYgKGVsLm5hbWUgPT0gZnVsbE5hbWUpIHtcbiAgICAgICAgTGlzdFdyYXBwZXIuc3BsaWNlKHRoaXMuZWxlbWVudFN0YWNrLCBzdGFja0luZGV4LCB0aGlzLmVsZW1lbnRTdGFjay5sZW5ndGggLSBzdGFja0luZGV4KTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghZ2V0SHRtbFRhZ0RlZmluaXRpb24oZWwubmFtZSkuY2xvc2VkQnlQYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lQXR0cihhdHRyTmFtZTogSHRtbFRva2VuKTogSHRtbEF0dHJBc3Qge1xuICAgIHZhciBmdWxsTmFtZSA9IG1lcmdlTnNBbmROYW1lKGF0dHJOYW1lLnBhcnRzWzBdLCBhdHRyTmFtZS5wYXJ0c1sxXSk7XG4gICAgdmFyIGVuZCA9IGF0dHJOYW1lLnNvdXJjZVNwYW4uZW5kO1xuICAgIHZhciB2YWx1ZSA9ICcnO1xuICAgIGlmICh0aGlzLnBlZWsudHlwZSA9PT0gSHRtbFRva2VuVHlwZS5BVFRSX1ZBTFVFKSB7XG4gICAgICB2YXIgdmFsdWVUb2tlbiA9IHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgIHZhbHVlID0gdmFsdWVUb2tlbi5wYXJ0c1swXTtcbiAgICAgIGVuZCA9IHZhbHVlVG9rZW4uc291cmNlU3Bhbi5lbmQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSHRtbEF0dHJBc3QoZnVsbE5hbWUsIHZhbHVlLCBuZXcgUGFyc2VTb3VyY2VTcGFuKGF0dHJOYW1lLnNvdXJjZVNwYW4uc3RhcnQsIGVuZCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0UGFyZW50RWxlbWVudCgpOiBIdG1sRWxlbWVudEFzdCB7XG4gICAgcmV0dXJuIHRoaXMuZWxlbWVudFN0YWNrLmxlbmd0aCA+IDAgPyBMaXN0V3JhcHBlci5sYXN0KHRoaXMuZWxlbWVudFN0YWNrKSA6IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF9hZGRUb1BhcmVudChub2RlOiBIdG1sQXN0KSB7XG4gICAgdmFyIHBhcmVudCA9IHRoaXMuX2dldFBhcmVudEVsZW1lbnQoKTtcbiAgICBpZiAoaXNQcmVzZW50KHBhcmVudCkpIHtcbiAgICAgIHBhcmVudC5jaGlsZHJlbi5wdXNoKG5vZGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnJvb3ROb2Rlcy5wdXNoKG5vZGUpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBtZXJnZU5zQW5kTmFtZShwcmVmaXg6IHN0cmluZywgbG9jYWxOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gaXNQcmVzZW50KHByZWZpeCkgPyBgQCR7cHJlZml4fToke2xvY2FsTmFtZX1gIDogbG9jYWxOYW1lO1xufVxuXG5mdW5jdGlvbiBnZXRFbGVtZW50RnVsbE5hbWUocHJlZml4OiBzdHJpbmcsIGxvY2FsTmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQ6IEh0bWxFbGVtZW50QXN0KTogc3RyaW5nIHtcbiAgaWYgKGlzQmxhbmsocHJlZml4KSkge1xuICAgIHByZWZpeCA9IGdldEh0bWxUYWdEZWZpbml0aW9uKGxvY2FsTmFtZSkuaW1wbGljaXROYW1lc3BhY2VQcmVmaXg7XG4gICAgaWYgKGlzQmxhbmsocHJlZml4KSAmJiBpc1ByZXNlbnQocGFyZW50RWxlbWVudCkpIHtcbiAgICAgIHByZWZpeCA9IGdldE5zUHJlZml4KHBhcmVudEVsZW1lbnQubmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG1lcmdlTnNBbmROYW1lKHByZWZpeCwgbG9jYWxOYW1lKTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9odG1sX3BhcnNlci50c1xuICoqLyIsImltcG9ydCB7aXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge1BhcnNlU291cmNlU3Bhbn0gZnJvbSAnLi9wYXJzZV91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBIdG1sQXN0IHtcbiAgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuO1xuICB2aXNpdCh2aXNpdG9yOiBIdG1sQXN0VmlzaXRvciwgY29udGV4dDogYW55KTogYW55O1xufVxuXG5leHBvcnQgY2xhc3MgSHRtbFRleHRBc3QgaW1wbGVtZW50cyBIdG1sQXN0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBzdHJpbmcsIHB1YmxpYyBzb3VyY2VTcGFuOiBQYXJzZVNvdXJjZVNwYW4pIHt9XG4gIHZpc2l0KHZpc2l0b3I6IEh0bWxBc3RWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gdmlzaXRvci52aXNpdFRleHQodGhpcywgY29udGV4dCk7IH1cbn1cblxuZXhwb3J0IGNsYXNzIEh0bWxBdHRyQXN0IGltcGxlbWVudHMgSHRtbEFzdCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcsIHB1YmxpYyB2YWx1ZTogc3RyaW5nLCBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBIdG1sQXN0VmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRBdHRyKHRoaXMsIGNvbnRleHQpOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBIdG1sRWxlbWVudEFzdCBpbXBsZW1lbnRzIEh0bWxBc3Qge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nLCBwdWJsaWMgYXR0cnM6IEh0bWxBdHRyQXN0W10sIHB1YmxpYyBjaGlsZHJlbjogSHRtbEFzdFtdLFxuICAgICAgICAgICAgICBwdWJsaWMgc291cmNlU3BhbjogUGFyc2VTb3VyY2VTcGFuKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBIdG1sQXN0VmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIHZpc2l0b3IudmlzaXRFbGVtZW50KHRoaXMsIGNvbnRleHQpOyB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSHRtbEFzdFZpc2l0b3Ige1xuICB2aXNpdEVsZW1lbnQoYXN0OiBIdG1sRWxlbWVudEFzdCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdEF0dHIoYXN0OiBIdG1sQXR0ckFzdCwgY29udGV4dDogYW55KTogYW55O1xuICB2aXNpdFRleHQoYXN0OiBIdG1sVGV4dEFzdCwgY29udGV4dDogYW55KTogYW55O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaHRtbFZpc2l0QWxsKHZpc2l0b3I6IEh0bWxBc3RWaXNpdG9yLCBhc3RzOiBIdG1sQXN0W10sIGNvbnRleHQ6IGFueSA9IG51bGwpOiBhbnlbXSB7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgYXN0cy5mb3JFYWNoKGFzdCA9PiB7XG4gICAgdmFyIGFzdFJlc3VsdCA9IGFzdC52aXNpdCh2aXNpdG9yLCBjb250ZXh0KTtcbiAgICBpZiAoaXNQcmVzZW50KGFzdFJlc3VsdCkpIHtcbiAgICAgIHJlc3VsdC5wdXNoKGFzdFJlc3VsdCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9odG1sX2FzdC50c1xuICoqLyIsImltcG9ydCB7XG4gIFN0cmluZ1dyYXBwZXIsXG4gIE51bWJlcldyYXBwZXIsXG4gIGlzUHJlc2VudCxcbiAgaXNCbGFuayxcbiAgQ09OU1RfRVhQUixcbiAgc2VyaWFsaXplRW51bVxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7UGFyc2VMb2NhdGlvbiwgUGFyc2VFcnJvciwgUGFyc2VTb3VyY2VGaWxlLCBQYXJzZVNvdXJjZVNwYW59IGZyb20gJy4vcGFyc2VfdXRpbCc7XG5pbXBvcnQge2dldEh0bWxUYWdEZWZpbml0aW9uLCBIdG1sVGFnQ29udGVudFR5cGUsIE5BTUVEX0VOVElUSUVTfSBmcm9tICcuL2h0bWxfdGFncyc7XG5cbmV4cG9ydCBlbnVtIEh0bWxUb2tlblR5cGUge1xuICBUQUdfT1BFTl9TVEFSVCxcbiAgVEFHX09QRU5fRU5ELFxuICBUQUdfT1BFTl9FTkRfVk9JRCxcbiAgVEFHX0NMT1NFLFxuICBURVhULFxuICBFU0NBUEFCTEVfUkFXX1RFWFQsXG4gIFJBV19URVhULFxuICBDT01NRU5UX1NUQVJULFxuICBDT01NRU5UX0VORCxcbiAgQ0RBVEFfU1RBUlQsXG4gIENEQVRBX0VORCxcbiAgQVRUUl9OQU1FLFxuICBBVFRSX1ZBTFVFLFxuICBET0NfVFlQRSxcbiAgRU9GXG59XG5cbmV4cG9ydCBjbGFzcyBIdG1sVG9rZW4ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHlwZTogSHRtbFRva2VuVHlwZSwgcHVibGljIHBhcnRzOiBzdHJpbmdbXSxcbiAgICAgICAgICAgICAgcHVibGljIHNvdXJjZVNwYW46IFBhcnNlU291cmNlU3Bhbikge31cbn1cblxuZXhwb3J0IGNsYXNzIEh0bWxUb2tlbkVycm9yIGV4dGVuZHMgUGFyc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKGVycm9yTXNnOiBzdHJpbmcsIHB1YmxpYyB0b2tlblR5cGU6IEh0bWxUb2tlblR5cGUsIGxvY2F0aW9uOiBQYXJzZUxvY2F0aW9uKSB7XG4gICAgc3VwZXIobG9jYXRpb24sIGVycm9yTXNnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSHRtbFRva2VuaXplUmVzdWx0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHRva2VuczogSHRtbFRva2VuW10sIHB1YmxpYyBlcnJvcnM6IEh0bWxUb2tlbkVycm9yW10pIHt9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b2tlbml6ZUh0bWwoc291cmNlQ29udGVudDogc3RyaW5nLCBzb3VyY2VVcmw6IHN0cmluZyk6IEh0bWxUb2tlbml6ZVJlc3VsdCB7XG4gIHJldHVybiBuZXcgX0h0bWxUb2tlbml6ZXIobmV3IFBhcnNlU291cmNlRmlsZShzb3VyY2VDb250ZW50LCBzb3VyY2VVcmwpKS50b2tlbml6ZSgpO1xufVxuXG5jb25zdCAkRU9GID0gMDtcbmNvbnN0ICRUQUIgPSA5O1xuY29uc3QgJExGID0gMTA7XG5jb25zdCAkRkYgPSAxMjtcbmNvbnN0ICRDUiA9IDEzO1xuXG5jb25zdCAkU1BBQ0UgPSAzMjtcblxuY29uc3QgJEJBTkcgPSAzMztcbmNvbnN0ICREUSA9IDM0O1xuY29uc3QgJEhBU0ggPSAzNTtcbmNvbnN0ICQkID0gMzY7XG5jb25zdCAkQU1QRVJTQU5EID0gMzg7XG5jb25zdCAkU1EgPSAzOTtcbmNvbnN0ICRNSU5VUyA9IDQ1O1xuY29uc3QgJFNMQVNIID0gNDc7XG5jb25zdCAkMCA9IDQ4O1xuXG5jb25zdCAkU0VNSUNPTE9OID0gNTk7XG5cbmNvbnN0ICQ5ID0gNTc7XG5jb25zdCAkQ09MT04gPSA1ODtcbmNvbnN0ICRMVCA9IDYwO1xuY29uc3QgJEVRID0gNjE7XG5jb25zdCAkR1QgPSA2MjtcbmNvbnN0ICRRVUVTVElPTiA9IDYzO1xuY29uc3QgJEEgPSA2NTtcbmNvbnN0ICRaID0gOTA7XG5jb25zdCAkTEJSQUNLRVQgPSA5MTtcbmNvbnN0ICRSQlJBQ0tFVCA9IDkzO1xuY29uc3QgJGEgPSA5NztcbmNvbnN0ICRmID0gMTAyO1xuY29uc3QgJHogPSAxMjI7XG5jb25zdCAkeCA9IDEyMDtcblxuY29uc3QgJE5CU1AgPSAxNjA7XG5cbnZhciBDUl9PUl9DUkxGX1JFR0VYUCA9IC9cXHJcXG4/L2c7XG5cbmZ1bmN0aW9uIHVuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyhjaGFyQ29kZTogbnVtYmVyKTogc3RyaW5nIHtcbiAgdmFyIGNoYXIgPSBjaGFyQ29kZSA9PT0gJEVPRiA/ICdFT0YnIDogU3RyaW5nV3JhcHBlci5mcm9tQ2hhckNvZGUoY2hhckNvZGUpO1xuICByZXR1cm4gYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIFwiJHtjaGFyfVwiYDtcbn1cblxuZnVuY3Rpb24gdW5rbm93bkVudGl0eUVycm9yTXNnKGVudGl0eVNyYzogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBVbmtub3duIGVudGl0eSBcIiR7ZW50aXR5U3JjfVwiIC0gdXNlIHRoZSBcIiYjPGRlY2ltYWw+O1wiIG9yICBcIiYjeDxoZXg+O1wiIHN5bnRheGA7XG59XG5cbmNsYXNzIENvbnRyb2xGbG93RXJyb3Ige1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZXJyb3I6IEh0bWxUb2tlbkVycm9yKSB7fVxufVxuXG4vLyBTZWUgaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUxL3N5bnRheC5odG1sI3dyaXRpbmdcbmNsYXNzIF9IdG1sVG9rZW5pemVyIHtcbiAgcHJpdmF0ZSBpbnB1dDogc3RyaW5nO1xuICBwcml2YXRlIGlucHV0TG93ZXJjYXNlOiBzdHJpbmc7XG4gIHByaXZhdGUgbGVuZ3RoOiBudW1iZXI7XG4gIC8vIE5vdGU6IHRoaXMgaXMgYWx3YXlzIGxvd2VyY2FzZSFcbiAgcHJpdmF0ZSBwZWVrOiBudW1iZXIgPSAtMTtcbiAgcHJpdmF0ZSBpbmRleDogbnVtYmVyID0gLTE7XG4gIHByaXZhdGUgbGluZTogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBjb2x1bW46IG51bWJlciA9IC0xO1xuICBwcml2YXRlIGN1cnJlbnRUb2tlblN0YXJ0OiBQYXJzZUxvY2F0aW9uO1xuICBwcml2YXRlIGN1cnJlbnRUb2tlblR5cGU6IEh0bWxUb2tlblR5cGU7XG5cbiAgdG9rZW5zOiBIdG1sVG9rZW5bXSA9IFtdO1xuICBlcnJvcnM6IEh0bWxUb2tlbkVycm9yW10gPSBbXTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZpbGU6IFBhcnNlU291cmNlRmlsZSkge1xuICAgIHRoaXMuaW5wdXQgPSBmaWxlLmNvbnRlbnQ7XG4gICAgdGhpcy5pbnB1dExvd2VyY2FzZSA9IGZpbGUuY29udGVudC50b0xvd2VyQ2FzZSgpO1xuICAgIHRoaXMubGVuZ3RoID0gZmlsZS5jb250ZW50Lmxlbmd0aDtcbiAgICB0aGlzLl9hZHZhbmNlKCk7XG4gIH1cblxuICBwcml2YXRlIF9wcm9jZXNzQ2FycmlhZ2VSZXR1cm5zKGNvbnRlbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgLy8gaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvc3ludGF4Lmh0bWwjcHJlcHJvY2Vzc2luZy10aGUtaW5wdXQtc3RyZWFtXG4gICAgLy8gSW4gb3JkZXIgdG8ga2VlcCB0aGUgb3JpZ2luYWwgcG9zaXRpb24gaW4gdGhlIHNvdXJjZSwgd2UgY2FuIG5vdCBwcmUtcHJvY2VzcyBpdC5cbiAgICAvLyBJbnN0ZWFkIENScyBhcmUgcHJvY2Vzc2VkIHJpZ2h0IGJlZm9yZSBpbnN0YW50aWF0aW5nIHRoZSB0b2tlbnMuXG4gICAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChjb250ZW50LCBDUl9PUl9DUkxGX1JFR0VYUCwgJ1xcbicpO1xuICB9XG5cbiAgdG9rZW5pemUoKTogSHRtbFRva2VuaXplUmVzdWx0IHtcbiAgICB3aGlsZSAodGhpcy5wZWVrICE9PSAkRU9GKSB7XG4gICAgICB2YXIgc3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYgKHRoaXMuX2F0dGVtcHRDaGFyKCRMVCkpIHtcbiAgICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXIoJEJBTkcpKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXIoJExCUkFDS0VUKSkge1xuICAgICAgICAgICAgICB0aGlzLl9jb25zdW1lQ2RhdGEoc3RhcnQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9hdHRlbXB0Q2hhcigkTUlOVVMpKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVDb21tZW50KHN0YXJ0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVEb2NUeXBlKHN0YXJ0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2F0dGVtcHRDaGFyKCRTTEFTSCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVUYWdDbG9zZShzdGFydCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2NvbnN1bWVUYWdPcGVuKHN0YXJ0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5fY29uc3VtZVRleHQoKTtcbiAgICAgICAgfVxuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIENvbnRyb2xGbG93RXJyb3IpIHtcbiAgICAgICAgICB0aGlzLmVycm9ycy5wdXNoKGUuZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLkVPRik7XG4gICAgdGhpcy5fZW5kVG9rZW4oW10pO1xuICAgIHJldHVybiBuZXcgSHRtbFRva2VuaXplUmVzdWx0KG1lcmdlVGV4dFRva2Vucyh0aGlzLnRva2VucyksIHRoaXMuZXJyb3JzKTtcbiAgfVxuXG4gIHByaXZhdGUgX2dldExvY2F0aW9uKCk6IFBhcnNlTG9jYXRpb24ge1xuICAgIHJldHVybiBuZXcgUGFyc2VMb2NhdGlvbih0aGlzLmZpbGUsIHRoaXMuaW5kZXgsIHRoaXMubGluZSwgdGhpcy5jb2x1bW4pO1xuICB9XG5cbiAgcHJpdmF0ZSBfYmVnaW5Ub2tlbih0eXBlOiBIdG1sVG9rZW5UeXBlLCBzdGFydDogUGFyc2VMb2NhdGlvbiA9IG51bGwpIHtcbiAgICBpZiAoaXNCbGFuayhzdGFydCkpIHtcbiAgICAgIHN0YXJ0ID0gdGhpcy5fZ2V0TG9jYXRpb24oKTtcbiAgICB9XG4gICAgdGhpcy5jdXJyZW50VG9rZW5TdGFydCA9IHN0YXJ0O1xuICAgIHRoaXMuY3VycmVudFRva2VuVHlwZSA9IHR5cGU7XG4gIH1cblxuICBwcml2YXRlIF9lbmRUb2tlbihwYXJ0czogc3RyaW5nW10sIGVuZDogUGFyc2VMb2NhdGlvbiA9IG51bGwpOiBIdG1sVG9rZW4ge1xuICAgIGlmIChpc0JsYW5rKGVuZCkpIHtcbiAgICAgIGVuZCA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgfVxuICAgIHZhciB0b2tlbiA9IG5ldyBIdG1sVG9rZW4odGhpcy5jdXJyZW50VG9rZW5UeXBlLCBwYXJ0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBQYXJzZVNvdXJjZVNwYW4odGhpcy5jdXJyZW50VG9rZW5TdGFydCwgZW5kKSk7XG4gICAgdGhpcy50b2tlbnMucHVzaCh0b2tlbik7XG4gICAgdGhpcy5jdXJyZW50VG9rZW5TdGFydCA9IG51bGw7XG4gICAgdGhpcy5jdXJyZW50VG9rZW5UeXBlID0gbnVsbDtcbiAgICByZXR1cm4gdG9rZW47XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVFcnJvcihtc2c6IHN0cmluZywgcG9zaXRpb246IFBhcnNlTG9jYXRpb24pOiBDb250cm9sRmxvd0Vycm9yIHtcbiAgICB2YXIgZXJyb3IgPSBuZXcgSHRtbFRva2VuRXJyb3IobXNnLCB0aGlzLmN1cnJlbnRUb2tlblR5cGUsIHBvc2l0aW9uKTtcbiAgICB0aGlzLmN1cnJlbnRUb2tlblN0YXJ0ID0gbnVsbDtcbiAgICB0aGlzLmN1cnJlbnRUb2tlblR5cGUgPSBudWxsO1xuICAgIHJldHVybiBuZXcgQ29udHJvbEZsb3dFcnJvcihlcnJvcik7XG4gIH1cblxuICBwcml2YXRlIF9hZHZhbmNlKCkge1xuICAgIGlmICh0aGlzLmluZGV4ID49IHRoaXMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVFcnJvcih1bmV4cGVjdGVkQ2hhcmFjdGVyRXJyb3JNc2coJEVPRiksIHRoaXMuX2dldExvY2F0aW9uKCkpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZWVrID09PSAkTEYpIHtcbiAgICAgIHRoaXMubGluZSsrO1xuICAgICAgdGhpcy5jb2x1bW4gPSAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5wZWVrICE9PSAkTEYgJiYgdGhpcy5wZWVrICE9PSAkQ1IpIHtcbiAgICAgIHRoaXMuY29sdW1uKys7XG4gICAgfVxuICAgIHRoaXMuaW5kZXgrKztcbiAgICB0aGlzLnBlZWsgPSB0aGlzLmluZGV4ID49IHRoaXMubGVuZ3RoID8gJEVPRiA6IFN0cmluZ1dyYXBwZXIuY2hhckNvZGVBdCh0aGlzLmlucHV0TG93ZXJjYXNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXgpO1xuICB9XG5cbiAgcHJpdmF0ZSBfYXR0ZW1wdENoYXIoY2hhckNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLnBlZWsgPT09IGNoYXJDb2RlKSB7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWlyZUNoYXIoY2hhckNvZGU6IG51bWJlcikge1xuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLl9hdHRlbXB0Q2hhcihjaGFyQ29kZSkpIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKHVuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyh0aGlzLnBlZWspLCBsb2NhdGlvbik7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXR0ZW1wdENoYXJzKGNoYXJzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoIXRoaXMuX2F0dGVtcHRDaGFyKFN0cmluZ1dyYXBwZXIuY2hhckNvZGVBdChjaGFycywgaSkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIF9yZXF1aXJlQ2hhcnMoY2hhcnM6IHN0cmluZykge1xuICAgIHZhciBsb2NhdGlvbiA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgaWYgKCF0aGlzLl9hdHRlbXB0Q2hhcnMoY2hhcnMpKSB7XG4gICAgICB0aHJvdyB0aGlzLl9jcmVhdGVFcnJvcih1bmV4cGVjdGVkQ2hhcmFjdGVyRXJyb3JNc2codGhpcy5wZWVrKSwgbG9jYXRpb24pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2F0dGVtcHRVbnRpbEZuKHByZWRpY2F0ZTogRnVuY3Rpb24pIHtcbiAgICB3aGlsZSAoIXByZWRpY2F0ZSh0aGlzLnBlZWspKSB7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVxdWlyZVVudGlsRm4ocHJlZGljYXRlOiBGdW5jdGlvbiwgbGVuOiBudW1iZXIpIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpO1xuICAgIHRoaXMuX2F0dGVtcHRVbnRpbEZuKHByZWRpY2F0ZSk7XG4gICAgaWYgKHRoaXMuaW5kZXggLSBzdGFydC5vZmZzZXQgPCBsZW4pIHtcbiAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKHVuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyh0aGlzLnBlZWspLCBzdGFydCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfYXR0ZW1wdFVudGlsQ2hhcihjaGFyOiBudW1iZXIpIHtcbiAgICB3aGlsZSAodGhpcy5wZWVrICE9PSBjaGFyKSB7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcmVhZENoYXIoZGVjb2RlRW50aXRpZXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIGlmIChkZWNvZGVFbnRpdGllcyAmJiB0aGlzLnBlZWsgPT09ICRBTVBFUlNBTkQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWNvZGVFbnRpdHkoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGluZGV4ID0gdGhpcy5pbmRleDtcbiAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgIHJldHVybiB0aGlzLmlucHV0W2luZGV4XTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9kZWNvZGVFbnRpdHkoKTogc3RyaW5nIHtcbiAgICB2YXIgc3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpO1xuICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXIoJEhBU0gpKSB7XG4gICAgICBsZXQgaXNIZXggPSB0aGlzLl9hdHRlbXB0Q2hhcigkeCk7XG4gICAgICBsZXQgbnVtYmVyU3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpLm9mZnNldDtcbiAgICAgIHRoaXMuX2F0dGVtcHRVbnRpbEZuKGlzRGlnaXRFbnRpdHlFbmQpO1xuICAgICAgaWYgKHRoaXMucGVlayAhPSAkU0VNSUNPTE9OKSB7XG4gICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKHVuZXhwZWN0ZWRDaGFyYWN0ZXJFcnJvck1zZyh0aGlzLnBlZWspLCB0aGlzLl9nZXRMb2NhdGlvbigpKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2FkdmFuY2UoKTtcbiAgICAgIGxldCBzdHJOdW0gPSB0aGlzLmlucHV0LnN1YnN0cmluZyhudW1iZXJTdGFydCwgdGhpcy5pbmRleCAtIDEpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgbGV0IGNoYXJDb2RlID0gTnVtYmVyV3JhcHBlci5wYXJzZUludChzdHJOdW0sIGlzSGV4ID8gMTYgOiAxMCk7XG4gICAgICAgIHJldHVybiBTdHJpbmdXcmFwcGVyLmZyb21DaGFyQ29kZShjaGFyQ29kZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxldCBlbnRpdHkgPSB0aGlzLmlucHV0LnN1YnN0cmluZyhzdGFydC5vZmZzZXQgKyAxLCB0aGlzLmluZGV4IC0gMSk7XG4gICAgICAgIHRocm93IHRoaXMuX2NyZWF0ZUVycm9yKHVua25vd25FbnRpdHlFcnJvck1zZyhlbnRpdHkpLCBzdGFydCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBzdGFydFBvc2l0aW9uID0gdGhpcy5fc2F2ZVBvc2l0aW9uKCk7XG4gICAgICB0aGlzLl9hdHRlbXB0VW50aWxGbihpc05hbWVkRW50aXR5RW5kKTtcbiAgICAgIGlmICh0aGlzLnBlZWsgIT0gJFNFTUlDT0xPTikge1xuICAgICAgICB0aGlzLl9yZXN0b3JlUG9zaXRpb24oc3RhcnRQb3NpdGlvbik7XG4gICAgICAgIHJldHVybiAnJic7XG4gICAgICB9XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICBsZXQgbmFtZSA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHN0YXJ0Lm9mZnNldCArIDEsIHRoaXMuaW5kZXggLSAxKTtcbiAgICAgIGxldCBjaGFyID0gTkFNRURfRU5USVRJRVNbbmFtZV07XG4gICAgICBpZiAoaXNCbGFuayhjaGFyKSkge1xuICAgICAgICB0aHJvdyB0aGlzLl9jcmVhdGVFcnJvcih1bmtub3duRW50aXR5RXJyb3JNc2cobmFtZSksIHN0YXJ0KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGFyO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVSYXdUZXh0KGRlY29kZUVudGl0aWVzOiBib29sZWFuLCBmaXJzdENoYXJPZkVuZDogbnVtYmVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRlbXB0RW5kUmVzdDogRnVuY3Rpb24pOiBIdG1sVG9rZW4ge1xuICAgIHZhciB0YWdDbG9zZVN0YXJ0O1xuICAgIHZhciB0ZXh0U3RhcnQgPSB0aGlzLl9nZXRMb2NhdGlvbigpO1xuICAgIHRoaXMuX2JlZ2luVG9rZW4oZGVjb2RlRW50aXRpZXMgPyBIdG1sVG9rZW5UeXBlLkVTQ0FQQUJMRV9SQVdfVEVYVCA6IEh0bWxUb2tlblR5cGUuUkFXX1RFWFQsXG4gICAgICAgICAgICAgICAgICAgICB0ZXh0U3RhcnQpO1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICB0YWdDbG9zZVN0YXJ0ID0gdGhpcy5fZ2V0TG9jYXRpb24oKTtcbiAgICAgIGlmICh0aGlzLl9hdHRlbXB0Q2hhcihmaXJzdENoYXJPZkVuZCkgJiYgYXR0ZW1wdEVuZFJlc3QoKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmluZGV4ID4gdGFnQ2xvc2VTdGFydC5vZmZzZXQpIHtcbiAgICAgICAgcGFydHMucHVzaCh0aGlzLmlucHV0LnN1YnN0cmluZyh0YWdDbG9zZVN0YXJ0Lm9mZnNldCwgdGhpcy5pbmRleCkpO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHRoaXMucGVlayAhPT0gZmlyc3RDaGFyT2ZFbmQpIHtcbiAgICAgICAgcGFydHMucHVzaCh0aGlzLl9yZWFkQ2hhcihkZWNvZGVFbnRpdGllcykpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fZW5kVG9rZW4oW3RoaXMuX3Byb2Nlc3NDYXJyaWFnZVJldHVybnMocGFydHMuam9pbignJykpXSwgdGFnQ2xvc2VTdGFydCk7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lQ29tbWVudChzdGFydDogUGFyc2VMb2NhdGlvbikge1xuICAgIHRoaXMuX2JlZ2luVG9rZW4oSHRtbFRva2VuVHlwZS5DT01NRU5UX1NUQVJULCBzdGFydCk7XG4gICAgdGhpcy5fcmVxdWlyZUNoYXIoJE1JTlVTKTtcbiAgICB0aGlzLl9lbmRUb2tlbihbXSk7XG4gICAgdmFyIHRleHRUb2tlbiA9IHRoaXMuX2NvbnN1bWVSYXdUZXh0KGZhbHNlLCAkTUlOVVMsICgpID0+IHRoaXMuX2F0dGVtcHRDaGFycygnLT4nKSk7XG4gICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLkNPTU1FTlRfRU5ELCB0ZXh0VG9rZW4uc291cmNlU3Bhbi5lbmQpO1xuICAgIHRoaXMuX2VuZFRva2VuKFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVDZGF0YShzdGFydDogUGFyc2VMb2NhdGlvbikge1xuICAgIHRoaXMuX2JlZ2luVG9rZW4oSHRtbFRva2VuVHlwZS5DREFUQV9TVEFSVCwgc3RhcnQpO1xuICAgIHRoaXMuX3JlcXVpcmVDaGFycygnY2RhdGFbJyk7XG4gICAgdGhpcy5fZW5kVG9rZW4oW10pO1xuICAgIHZhciB0ZXh0VG9rZW4gPSB0aGlzLl9jb25zdW1lUmF3VGV4dChmYWxzZSwgJFJCUkFDS0VULCAoKSA9PiB0aGlzLl9hdHRlbXB0Q2hhcnMoJ10+JykpO1xuICAgIHRoaXMuX2JlZ2luVG9rZW4oSHRtbFRva2VuVHlwZS5DREFUQV9FTkQsIHRleHRUb2tlbi5zb3VyY2VTcGFuLmVuZCk7XG4gICAgdGhpcy5fZW5kVG9rZW4oW10pO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uc3VtZURvY1R5cGUoc3RhcnQ6IFBhcnNlTG9jYXRpb24pIHtcbiAgICB0aGlzLl9iZWdpblRva2VuKEh0bWxUb2tlblR5cGUuRE9DX1RZUEUsIHN0YXJ0KTtcbiAgICB0aGlzLl9hdHRlbXB0VW50aWxDaGFyKCRHVCk7XG4gICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgIHRoaXMuX2VuZFRva2VuKFt0aGlzLmlucHV0LnN1YnN0cmluZyhzdGFydC5vZmZzZXQgKyAyLCB0aGlzLmluZGV4IC0gMSldKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVQcmVmaXhBbmROYW1lKCk6IHN0cmluZ1tdIHtcbiAgICB2YXIgbmFtZU9yUHJlZml4U3RhcnQgPSB0aGlzLmluZGV4O1xuICAgIHZhciBwcmVmaXggPSBudWxsO1xuICAgIHdoaWxlICh0aGlzLnBlZWsgIT09ICRDT0xPTiAmJiAhaXNQcmVmaXhFbmQodGhpcy5wZWVrKSkge1xuICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgIH1cbiAgICB2YXIgbmFtZVN0YXJ0O1xuICAgIGlmICh0aGlzLnBlZWsgPT09ICRDT0xPTikge1xuICAgICAgdGhpcy5fYWR2YW5jZSgpO1xuICAgICAgcHJlZml4ID0gdGhpcy5pbnB1dC5zdWJzdHJpbmcobmFtZU9yUHJlZml4U3RhcnQsIHRoaXMuaW5kZXggLSAxKTtcbiAgICAgIG5hbWVTdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWVTdGFydCA9IG5hbWVPclByZWZpeFN0YXJ0O1xuICAgIH1cbiAgICB0aGlzLl9yZXF1aXJlVW50aWxGbihpc05hbWVFbmQsIHRoaXMuaW5kZXggPT09IG5hbWVTdGFydCA/IDEgOiAwKTtcbiAgICB2YXIgbmFtZSA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKG5hbWVTdGFydCwgdGhpcy5pbmRleCk7XG4gICAgcmV0dXJuIFtwcmVmaXgsIG5hbWVdO1xuICB9XG5cbiAgcHJpdmF0ZSBfY29uc3VtZVRhZ09wZW4oc3RhcnQ6IFBhcnNlTG9jYXRpb24pIHtcbiAgICBsZXQgc2F2ZWRQb3MgPSB0aGlzLl9zYXZlUG9zaXRpb24oKTtcbiAgICBsZXQgbG93ZXJjYXNlVGFnTmFtZTtcbiAgICB0cnkge1xuICAgICAgaWYgKCFpc0FzY2lpTGV0dGVyKHRoaXMucGVlaykpIHtcbiAgICAgICAgdGhyb3cgdGhpcy5fY3JlYXRlRXJyb3IodW5leHBlY3RlZENoYXJhY3RlckVycm9yTXNnKHRoaXMucGVlayksIHRoaXMuX2dldExvY2F0aW9uKCkpO1xuICAgICAgfVxuICAgICAgdmFyIG5hbWVTdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgICB0aGlzLl9jb25zdW1lVGFnT3BlblN0YXJ0KHN0YXJ0KTtcbiAgICAgIGxvd2VyY2FzZVRhZ05hbWUgPSB0aGlzLmlucHV0TG93ZXJjYXNlLnN1YnN0cmluZyhuYW1lU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgICAgdGhpcy5fYXR0ZW1wdFVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgIHdoaWxlICh0aGlzLnBlZWsgIT09ICRTTEFTSCAmJiB0aGlzLnBlZWsgIT09ICRHVCkge1xuICAgICAgICB0aGlzLl9jb25zdW1lQXR0cmlidXRlTmFtZSgpO1xuICAgICAgICB0aGlzLl9hdHRlbXB0VW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgICBpZiAodGhpcy5fYXR0ZW1wdENoYXIoJEVRKSkge1xuICAgICAgICAgIHRoaXMuX2F0dGVtcHRVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgICAgICAgdGhpcy5fY29uc3VtZUF0dHJpYnV0ZVZhbHVlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYXR0ZW1wdFVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2NvbnN1bWVUYWdPcGVuRW5kKCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgaWYgKGUgaW5zdGFuY2VvZiBDb250cm9sRmxvd0Vycm9yKSB7XG4gICAgICAgIC8vIFdoZW4gdGhlIHN0YXJ0IHRhZyBpcyBpbnZhbGlkLCBhc3N1bWUgd2Ugd2FudCBhIFwiPFwiXG4gICAgICAgIHRoaXMuX3Jlc3RvcmVQb3NpdGlvbihzYXZlZFBvcyk7XG4gICAgICAgIC8vIEJhY2sgdG8gYmFjayB0ZXh0IHRva2VucyBhcmUgbWVyZ2VkIGF0IHRoZSBlbmRcbiAgICAgICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLlRFWFQsIHN0YXJ0KTtcbiAgICAgICAgdGhpcy5fZW5kVG9rZW4oWyc8J10pO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRocm93IGU7XG4gICAgfVxuXG4gICAgdmFyIGNvbnRlbnRUb2tlblR5cGUgPSBnZXRIdG1sVGFnRGVmaW5pdGlvbihsb3dlcmNhc2VUYWdOYW1lKS5jb250ZW50VHlwZTtcbiAgICBpZiAoY29udGVudFRva2VuVHlwZSA9PT0gSHRtbFRhZ0NvbnRlbnRUeXBlLlJBV19URVhUKSB7XG4gICAgICB0aGlzLl9jb25zdW1lUmF3VGV4dFdpdGhUYWdDbG9zZShsb3dlcmNhc2VUYWdOYW1lLCBmYWxzZSk7XG4gICAgfSBlbHNlIGlmIChjb250ZW50VG9rZW5UeXBlID09PSBIdG1sVGFnQ29udGVudFR5cGUuRVNDQVBBQkxFX1JBV19URVhUKSB7XG4gICAgICB0aGlzLl9jb25zdW1lUmF3VGV4dFdpdGhUYWdDbG9zZShsb3dlcmNhc2VUYWdOYW1lLCB0cnVlKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lUmF3VGV4dFdpdGhUYWdDbG9zZShsb3dlcmNhc2VUYWdOYW1lOiBzdHJpbmcsIGRlY29kZUVudGl0aWVzOiBib29sZWFuKSB7XG4gICAgdmFyIHRleHRUb2tlbiA9IHRoaXMuX2NvbnN1bWVSYXdUZXh0KGRlY29kZUVudGl0aWVzLCAkTFQsICgpID0+IHtcbiAgICAgIGlmICghdGhpcy5fYXR0ZW1wdENoYXIoJFNMQVNIKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgdGhpcy5fYXR0ZW1wdFVudGlsRm4oaXNOb3RXaGl0ZXNwYWNlKTtcbiAgICAgIGlmICghdGhpcy5fYXR0ZW1wdENoYXJzKGxvd2VyY2FzZVRhZ05hbWUpKSByZXR1cm4gZmFsc2U7XG4gICAgICB0aGlzLl9hdHRlbXB0VW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgICAgaWYgKCF0aGlzLl9hdHRlbXB0Q2hhcigkR1QpKSByZXR1cm4gZmFsc2U7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KTtcbiAgICB0aGlzLl9iZWdpblRva2VuKEh0bWxUb2tlblR5cGUuVEFHX0NMT1NFLCB0ZXh0VG9rZW4uc291cmNlU3Bhbi5lbmQpO1xuICAgIHRoaXMuX2VuZFRva2VuKFtudWxsLCBsb3dlcmNhc2VUYWdOYW1lXSk7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lVGFnT3BlblN0YXJ0KHN0YXJ0OiBQYXJzZUxvY2F0aW9uKSB7XG4gICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLlRBR19PUEVOX1NUQVJULCBzdGFydCk7XG4gICAgdmFyIHBhcnRzID0gdGhpcy5fY29uc3VtZVByZWZpeEFuZE5hbWUoKTtcbiAgICB0aGlzLl9lbmRUb2tlbihwYXJ0cyk7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lQXR0cmlidXRlTmFtZSgpIHtcbiAgICB0aGlzLl9iZWdpblRva2VuKEh0bWxUb2tlblR5cGUuQVRUUl9OQU1FKTtcbiAgICB2YXIgcHJlZml4QW5kTmFtZSA9IHRoaXMuX2NvbnN1bWVQcmVmaXhBbmROYW1lKCk7XG4gICAgdGhpcy5fZW5kVG9rZW4ocHJlZml4QW5kTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIF9jb25zdW1lQXR0cmlidXRlVmFsdWUoKSB7XG4gICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLkFUVFJfVkFMVUUpO1xuICAgIHZhciB2YWx1ZTtcbiAgICBpZiAodGhpcy5wZWVrID09PSAkU1EgfHwgdGhpcy5wZWVrID09PSAkRFEpIHtcbiAgICAgIHZhciBxdW90ZUNoYXIgPSB0aGlzLnBlZWs7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgICB2YXIgcGFydHMgPSBbXTtcbiAgICAgIHdoaWxlICh0aGlzLnBlZWsgIT09IHF1b3RlQ2hhcikge1xuICAgICAgICBwYXJ0cy5wdXNoKHRoaXMuX3JlYWRDaGFyKHRydWUpKTtcbiAgICAgIH1cbiAgICAgIHZhbHVlID0gcGFydHMuam9pbignJyk7XG4gICAgICB0aGlzLl9hZHZhbmNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciB2YWx1ZVN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICAgIHRoaXMuX3JlcXVpcmVVbnRpbEZuKGlzTmFtZUVuZCwgMSk7XG4gICAgICB2YWx1ZSA9IHRoaXMuaW5wdXQuc3Vic3RyaW5nKHZhbHVlU3RhcnQsIHRoaXMuaW5kZXgpO1xuICAgIH1cbiAgICB0aGlzLl9lbmRUb2tlbihbdGhpcy5fcHJvY2Vzc0NhcnJpYWdlUmV0dXJucyh2YWx1ZSldKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVUYWdPcGVuRW5kKCkge1xuICAgIHZhciB0b2tlblR5cGUgPVxuICAgICAgICB0aGlzLl9hdHRlbXB0Q2hhcigkU0xBU0gpID8gSHRtbFRva2VuVHlwZS5UQUdfT1BFTl9FTkRfVk9JRCA6IEh0bWxUb2tlblR5cGUuVEFHX09QRU5fRU5EO1xuICAgIHRoaXMuX2JlZ2luVG9rZW4odG9rZW5UeXBlKTtcbiAgICB0aGlzLl9yZXF1aXJlQ2hhcigkR1QpO1xuICAgIHRoaXMuX2VuZFRva2VuKFtdKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVUYWdDbG9zZShzdGFydDogUGFyc2VMb2NhdGlvbikge1xuICAgIHRoaXMuX2JlZ2luVG9rZW4oSHRtbFRva2VuVHlwZS5UQUdfQ0xPU0UsIHN0YXJ0KTtcbiAgICB0aGlzLl9hdHRlbXB0VW50aWxGbihpc05vdFdoaXRlc3BhY2UpO1xuICAgIHZhciBwcmVmaXhBbmROYW1lO1xuICAgIHByZWZpeEFuZE5hbWUgPSB0aGlzLl9jb25zdW1lUHJlZml4QW5kTmFtZSgpO1xuICAgIHRoaXMuX2F0dGVtcHRVbnRpbEZuKGlzTm90V2hpdGVzcGFjZSk7XG4gICAgdGhpcy5fcmVxdWlyZUNoYXIoJEdUKTtcbiAgICB0aGlzLl9lbmRUb2tlbihwcmVmaXhBbmROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NvbnN1bWVUZXh0KCkge1xuICAgIHZhciBzdGFydCA9IHRoaXMuX2dldExvY2F0aW9uKCk7XG4gICAgdGhpcy5fYmVnaW5Ub2tlbihIdG1sVG9rZW5UeXBlLlRFWFQsIHN0YXJ0KTtcbiAgICB2YXIgcGFydHMgPSBbdGhpcy5fcmVhZENoYXIodHJ1ZSldO1xuICAgIHdoaWxlICghaXNUZXh0RW5kKHRoaXMucGVlaykpIHtcbiAgICAgIHBhcnRzLnB1c2godGhpcy5fcmVhZENoYXIodHJ1ZSkpO1xuICAgIH1cbiAgICB0aGlzLl9lbmRUb2tlbihbdGhpcy5fcHJvY2Vzc0NhcnJpYWdlUmV0dXJucyhwYXJ0cy5qb2luKCcnKSldKTtcbiAgfVxuXG4gIHByaXZhdGUgX3NhdmVQb3NpdGlvbigpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIFt0aGlzLnBlZWssIHRoaXMuaW5kZXgsIHRoaXMuY29sdW1uLCB0aGlzLmxpbmUsIHRoaXMudG9rZW5zLmxlbmd0aF07XG4gIH1cblxuICBwcml2YXRlIF9yZXN0b3JlUG9zaXRpb24ocG9zaXRpb246IG51bWJlcltdKTogdm9pZCB7XG4gICAgdGhpcy5wZWVrID0gcG9zaXRpb25bMF07XG4gICAgdGhpcy5pbmRleCA9IHBvc2l0aW9uWzFdO1xuICAgIHRoaXMuY29sdW1uID0gcG9zaXRpb25bMl07XG4gICAgdGhpcy5saW5lID0gcG9zaXRpb25bM107XG4gICAgbGV0IG5iVG9rZW5zID0gcG9zaXRpb25bNF07XG4gICAgaWYgKG5iVG9rZW5zIDwgdGhpcy50b2tlbnMubGVuZ3RoKSB7XG4gICAgICAvLyByZW1vdmUgYW55IGV4dHJhIHRva2Vuc1xuICAgICAgdGhpcy50b2tlbnMgPSBMaXN0V3JhcHBlci5zbGljZSh0aGlzLnRva2VucywgMCwgbmJUb2tlbnMpO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBpc05vdFdoaXRlc3BhY2UoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAhaXNXaGl0ZXNwYWNlKGNvZGUpIHx8IGNvZGUgPT09ICRFT0Y7XG59XG5cbmZ1bmN0aW9uIGlzV2hpdGVzcGFjZShjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIChjb2RlID49ICRUQUIgJiYgY29kZSA8PSAkU1BBQ0UpIHx8IChjb2RlID09PSAkTkJTUCk7XG59XG5cbmZ1bmN0aW9uIGlzTmFtZUVuZChjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzV2hpdGVzcGFjZShjb2RlKSB8fCBjb2RlID09PSAkR1QgfHwgY29kZSA9PT0gJFNMQVNIIHx8IGNvZGUgPT09ICRTUSB8fCBjb2RlID09PSAkRFEgfHxcbiAgICAgICAgIGNvZGUgPT09ICRFUTtcbn1cblxuZnVuY3Rpb24gaXNQcmVmaXhFbmQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoY29kZSA8ICRhIHx8ICR6IDwgY29kZSkgJiYgKGNvZGUgPCAkQSB8fCAkWiA8IGNvZGUpICYmIChjb2RlIDwgJDAgfHwgY29kZSA+ICQ5KTtcbn1cblxuZnVuY3Rpb24gaXNEaWdpdEVudGl0eUVuZChjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvZGUgPT0gJFNFTUlDT0xPTiB8fCBjb2RlID09ICRFT0YgfHwgIWlzQXNjaWlIZXhEaWdpdChjb2RlKTtcbn1cblxuZnVuY3Rpb24gaXNOYW1lZEVudGl0eUVuZChjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvZGUgPT0gJFNFTUlDT0xPTiB8fCBjb2RlID09ICRFT0YgfHwgIWlzQXNjaWlMZXR0ZXIoY29kZSk7XG59XG5cbmZ1bmN0aW9uIGlzVGV4dEVuZChjb2RlOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGNvZGUgPT09ICRMVCB8fCBjb2RlID09PSAkRU9GO1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpTGV0dGVyKGNvZGU6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gY29kZSA+PSAkYSAmJiBjb2RlIDw9ICR6O1xufVxuXG5mdW5jdGlvbiBpc0FzY2lpSGV4RGlnaXQoY29kZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiBjb2RlID49ICRhICYmIGNvZGUgPD0gJGYgfHwgY29kZSA+PSAkMCAmJiBjb2RlIDw9ICQ5O1xufVxuXG5mdW5jdGlvbiBtZXJnZVRleHRUb2tlbnMoc3JjVG9rZW5zOiBIdG1sVG9rZW5bXSk6IEh0bWxUb2tlbltdIHtcbiAgbGV0IGRzdFRva2VucyA9IFtdO1xuICBsZXQgbGFzdERzdFRva2VuOiBIdG1sVG9rZW47XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjVG9rZW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgbGV0IHRva2VuID0gc3JjVG9rZW5zW2ldO1xuICAgIGlmIChpc1ByZXNlbnQobGFzdERzdFRva2VuKSAmJiBsYXN0RHN0VG9rZW4udHlwZSA9PSBIdG1sVG9rZW5UeXBlLlRFWFQgJiZcbiAgICAgICAgdG9rZW4udHlwZSA9PSBIdG1sVG9rZW5UeXBlLlRFWFQpIHtcbiAgICAgIGxhc3REc3RUb2tlbi5wYXJ0c1swXSArPSB0b2tlbi5wYXJ0c1swXTtcbiAgICAgIGxhc3REc3RUb2tlbi5zb3VyY2VTcGFuLmVuZCA9IHRva2VuLnNvdXJjZVNwYW4uZW5kO1xuICAgIH0gZWxzZSB7XG4gICAgICBsYXN0RHN0VG9rZW4gPSB0b2tlbjtcbiAgICAgIGRzdFRva2Vucy5wdXNoKGxhc3REc3RUb2tlbik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGRzdFRva2Vucztcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9odG1sX2xleGVyLnRzXG4gKiovIiwiZXhwb3J0IGNsYXNzIFBhcnNlTG9jYXRpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZmlsZTogUGFyc2VTb3VyY2VGaWxlLCBwdWJsaWMgb2Zmc2V0OiBudW1iZXIsIHB1YmxpYyBsaW5lOiBudW1iZXIsXG4gICAgICAgICAgICAgIHB1YmxpYyBjb2w6IG51bWJlcikge31cblxuICB0b1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gYCR7dGhpcy5maWxlLnVybH1AJHt0aGlzLmxpbmV9OiR7dGhpcy5jb2x9YDsgfVxufVxuXG5leHBvcnQgY2xhc3MgUGFyc2VTb3VyY2VGaWxlIHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvbnRlbnQ6IHN0cmluZywgcHVibGljIHVybDogc3RyaW5nKSB7fVxufVxuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUGFyc2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBsb2NhdGlvbjogUGFyc2VMb2NhdGlvbiwgcHVibGljIG1zZzogc3RyaW5nKSB7fVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgdmFyIHNvdXJjZSA9IHRoaXMubG9jYXRpb24uZmlsZS5jb250ZW50O1xuICAgIHZhciBjdHhTdGFydCA9IHRoaXMubG9jYXRpb24ub2Zmc2V0O1xuICAgIGlmIChjdHhTdGFydCA+IHNvdXJjZS5sZW5ndGggLSAxKSB7XG4gICAgICBjdHhTdGFydCA9IHNvdXJjZS5sZW5ndGggLSAxO1xuICAgIH1cbiAgICB2YXIgY3R4RW5kID0gY3R4U3RhcnQ7XG4gICAgdmFyIGN0eExlbiA9IDA7XG4gICAgdmFyIGN0eExpbmVzID0gMDtcblxuICAgIHdoaWxlIChjdHhMZW4gPCAxMDAgJiYgY3R4U3RhcnQgPiAwKSB7XG4gICAgICBjdHhTdGFydC0tO1xuICAgICAgY3R4TGVuKys7XG4gICAgICBpZiAoc291cmNlW2N0eFN0YXJ0XSA9PSBcIlxcblwiKSB7XG4gICAgICAgIGlmICgrK2N0eExpbmVzID09IDMpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGN0eExlbiA9IDA7XG4gICAgY3R4TGluZXMgPSAwO1xuICAgIHdoaWxlIChjdHhMZW4gPCAxMDAgJiYgY3R4RW5kIDwgc291cmNlLmxlbmd0aCAtIDEpIHtcbiAgICAgIGN0eEVuZCsrO1xuICAgICAgY3R4TGVuKys7XG4gICAgICBpZiAoc291cmNlW2N0eEVuZF0gPT0gXCJcXG5cIikge1xuICAgICAgICBpZiAoKytjdHhMaW5lcyA9PSAzKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgY29udGV4dCA9IHNvdXJjZS5zdWJzdHJpbmcoY3R4U3RhcnQsIHRoaXMubG9jYXRpb24ub2Zmc2V0KSArICdbRVJST1IgLT5dJyArXG4gICAgICAgICAgICAgICAgICBzb3VyY2Uuc3Vic3RyaW5nKHRoaXMubG9jYXRpb24ub2Zmc2V0LCBjdHhFbmQgKyAxKTtcblxuICAgIHJldHVybiBgJHt0aGlzLm1zZ30gKFwiJHtjb250ZXh0fVwiKTogJHt0aGlzLmxvY2F0aW9ufWA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhcnNlU291cmNlU3BhbiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBzdGFydDogUGFyc2VMb2NhdGlvbiwgcHVibGljIGVuZDogUGFyc2VMb2NhdGlvbikge31cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnN0YXJ0LmZpbGUuY29udGVudC5zdWJzdHJpbmcodGhpcy5zdGFydC5vZmZzZXQsIHRoaXMuZW5kLm9mZnNldCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci9wYXJzZV91dGlsLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgaXNQcmVzZW50LFxuICBpc0JsYW5rLFxuICBub3JtYWxpemVCb29sLFxuICBSZWdFeHBXcmFwcGVyLFxuICBDT05TVF9FWFBSXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbi8vIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc3ludGF4Lmh0bWwjbmFtZWQtY2hhcmFjdGVyLXJlZmVyZW5jZXNcbi8vIHNlZSBodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9lbnRpdGllcy5qc29uXG4vLyBUaGlzIGxpc3QgaXMgbm90IGV4aGF1c3RpdmUgdG8ga2VlcCB0aGUgY29tcGlsZXIgZm9vdHByaW50IGxvdy5cbi8vIFRoZSBgJiMxMjM7YCAvIGAmI3gxYWI7YCBzeW50YXggc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgbmFtZWQgY2hhcmFjdGVyIHJlZmVyZW5jZSBkb2VzIG5vdCBleGlzdC5cbmV4cG9ydCBjb25zdCBOQU1FRF9FTlRJVElFUyA9IENPTlNUX0VYUFIoe1xuICAnQWFjdXRlJzogJ1xcdTAwQzEnLFxuICAnYWFjdXRlJzogJ1xcdTAwRTEnLFxuICAnQWNpcmMnOiAnXFx1MDBDMicsXG4gICdhY2lyYyc6ICdcXHUwMEUyJyxcbiAgJ2FjdXRlJzogJ1xcdTAwQjQnLFxuICAnQUVsaWcnOiAnXFx1MDBDNicsXG4gICdhZWxpZyc6ICdcXHUwMEU2JyxcbiAgJ0FncmF2ZSc6ICdcXHUwMEMwJyxcbiAgJ2FncmF2ZSc6ICdcXHUwMEUwJyxcbiAgJ2FsZWZzeW0nOiAnXFx1MjEzNScsXG4gICdBbHBoYSc6ICdcXHUwMzkxJyxcbiAgJ2FscGhhJzogJ1xcdTAzQjEnLFxuICAnYW1wJzogJyYnLFxuICAnYW5kJzogJ1xcdTIyMjcnLFxuICAnYW5nJzogJ1xcdTIyMjAnLFxuICAnYXBvcyc6ICdcXHUwMDI3JyxcbiAgJ0FyaW5nJzogJ1xcdTAwQzUnLFxuICAnYXJpbmcnOiAnXFx1MDBFNScsXG4gICdhc3ltcCc6ICdcXHUyMjQ4JyxcbiAgJ0F0aWxkZSc6ICdcXHUwMEMzJyxcbiAgJ2F0aWxkZSc6ICdcXHUwMEUzJyxcbiAgJ0F1bWwnOiAnXFx1MDBDNCcsXG4gICdhdW1sJzogJ1xcdTAwRTQnLFxuICAnYmRxdW8nOiAnXFx1MjAxRScsXG4gICdCZXRhJzogJ1xcdTAzOTInLFxuICAnYmV0YSc6ICdcXHUwM0IyJyxcbiAgJ2JydmJhcic6ICdcXHUwMEE2JyxcbiAgJ2J1bGwnOiAnXFx1MjAyMicsXG4gICdjYXAnOiAnXFx1MjIyOScsXG4gICdDY2VkaWwnOiAnXFx1MDBDNycsXG4gICdjY2VkaWwnOiAnXFx1MDBFNycsXG4gICdjZWRpbCc6ICdcXHUwMEI4JyxcbiAgJ2NlbnQnOiAnXFx1MDBBMicsXG4gICdDaGknOiAnXFx1MDNBNycsXG4gICdjaGknOiAnXFx1MDNDNycsXG4gICdjaXJjJzogJ1xcdTAyQzYnLFxuICAnY2x1YnMnOiAnXFx1MjY2MycsXG4gICdjb25nJzogJ1xcdTIyNDUnLFxuICAnY29weSc6ICdcXHUwMEE5JyxcbiAgJ2NyYXJyJzogJ1xcdTIxQjUnLFxuICAnY3VwJzogJ1xcdTIyMkEnLFxuICAnY3VycmVuJzogJ1xcdTAwQTQnLFxuICAnZGFnZ2VyJzogJ1xcdTIwMjAnLFxuICAnRGFnZ2VyJzogJ1xcdTIwMjEnLFxuICAnZGFycic6ICdcXHUyMTkzJyxcbiAgJ2RBcnInOiAnXFx1MjFEMycsXG4gICdkZWcnOiAnXFx1MDBCMCcsXG4gICdEZWx0YSc6ICdcXHUwMzk0JyxcbiAgJ2RlbHRhJzogJ1xcdTAzQjQnLFxuICAnZGlhbXMnOiAnXFx1MjY2NicsXG4gICdkaXZpZGUnOiAnXFx1MDBGNycsXG4gICdFYWN1dGUnOiAnXFx1MDBDOScsXG4gICdlYWN1dGUnOiAnXFx1MDBFOScsXG4gICdFY2lyYyc6ICdcXHUwMENBJyxcbiAgJ2VjaXJjJzogJ1xcdTAwRUEnLFxuICAnRWdyYXZlJzogJ1xcdTAwQzgnLFxuICAnZWdyYXZlJzogJ1xcdTAwRTgnLFxuICAnZW1wdHknOiAnXFx1MjIwNScsXG4gICdlbXNwJzogJ1xcdTIwMDMnLFxuICAnZW5zcCc6ICdcXHUyMDAyJyxcbiAgJ0Vwc2lsb24nOiAnXFx1MDM5NScsXG4gICdlcHNpbG9uJzogJ1xcdTAzQjUnLFxuICAnZXF1aXYnOiAnXFx1MjI2MScsXG4gICdFdGEnOiAnXFx1MDM5NycsXG4gICdldGEnOiAnXFx1MDNCNycsXG4gICdFVEgnOiAnXFx1MDBEMCcsXG4gICdldGgnOiAnXFx1MDBGMCcsXG4gICdFdW1sJzogJ1xcdTAwQ0InLFxuICAnZXVtbCc6ICdcXHUwMEVCJyxcbiAgJ2V1cm8nOiAnXFx1MjBBQycsXG4gICdleGlzdCc6ICdcXHUyMjAzJyxcbiAgJ2Zub2YnOiAnXFx1MDE5MicsXG4gICdmb3JhbGwnOiAnXFx1MjIwMCcsXG4gICdmcmFjMTInOiAnXFx1MDBCRCcsXG4gICdmcmFjMTQnOiAnXFx1MDBCQycsXG4gICdmcmFjMzQnOiAnXFx1MDBCRScsXG4gICdmcmFzbCc6ICdcXHUyMDQ0JyxcbiAgJ0dhbW1hJzogJ1xcdTAzOTMnLFxuICAnZ2FtbWEnOiAnXFx1MDNCMycsXG4gICdnZSc6ICdcXHUyMjY1JyxcbiAgJ2d0JzogJz4nLFxuICAnaGFycic6ICdcXHUyMTk0JyxcbiAgJ2hBcnInOiAnXFx1MjFENCcsXG4gICdoZWFydHMnOiAnXFx1MjY2NScsXG4gICdoZWxsaXAnOiAnXFx1MjAyNicsXG4gICdJYWN1dGUnOiAnXFx1MDBDRCcsXG4gICdpYWN1dGUnOiAnXFx1MDBFRCcsXG4gICdJY2lyYyc6ICdcXHUwMENFJyxcbiAgJ2ljaXJjJzogJ1xcdTAwRUUnLFxuICAnaWV4Y2wnOiAnXFx1MDBBMScsXG4gICdJZ3JhdmUnOiAnXFx1MDBDQycsXG4gICdpZ3JhdmUnOiAnXFx1MDBFQycsXG4gICdpbWFnZSc6ICdcXHUyMTExJyxcbiAgJ2luZmluJzogJ1xcdTIyMUUnLFxuICAnaW50JzogJ1xcdTIyMkInLFxuICAnSW90YSc6ICdcXHUwMzk5JyxcbiAgJ2lvdGEnOiAnXFx1MDNCOScsXG4gICdpcXVlc3QnOiAnXFx1MDBCRicsXG4gICdpc2luJzogJ1xcdTIyMDgnLFxuICAnSXVtbCc6ICdcXHUwMENGJyxcbiAgJ2l1bWwnOiAnXFx1MDBFRicsXG4gICdLYXBwYSc6ICdcXHUwMzlBJyxcbiAgJ2thcHBhJzogJ1xcdTAzQkEnLFxuICAnTGFtYmRhJzogJ1xcdTAzOUInLFxuICAnbGFtYmRhJzogJ1xcdTAzQkInLFxuICAnbGFuZyc6ICdcXHUyN0U4JyxcbiAgJ2xhcXVvJzogJ1xcdTAwQUInLFxuICAnbGFycic6ICdcXHUyMTkwJyxcbiAgJ2xBcnInOiAnXFx1MjFEMCcsXG4gICdsY2VpbCc6ICdcXHUyMzA4JyxcbiAgJ2xkcXVvJzogJ1xcdTIwMUMnLFxuICAnbGUnOiAnXFx1MjI2NCcsXG4gICdsZmxvb3InOiAnXFx1MjMwQScsXG4gICdsb3dhc3QnOiAnXFx1MjIxNycsXG4gICdsb3onOiAnXFx1MjVDQScsXG4gICdscm0nOiAnXFx1MjAwRScsXG4gICdsc2FxdW8nOiAnXFx1MjAzOScsXG4gICdsc3F1byc6ICdcXHUyMDE4JyxcbiAgJ2x0JzogJzwnLFxuICAnbWFjcic6ICdcXHUwMEFGJyxcbiAgJ21kYXNoJzogJ1xcdTIwMTQnLFxuICAnbWljcm8nOiAnXFx1MDBCNScsXG4gICdtaWRkb3QnOiAnXFx1MDBCNycsXG4gICdtaW51cyc6ICdcXHUyMjEyJyxcbiAgJ011JzogJ1xcdTAzOUMnLFxuICAnbXUnOiAnXFx1MDNCQycsXG4gICduYWJsYSc6ICdcXHUyMjA3JyxcbiAgJ25ic3AnOiAnXFx1MDBBMCcsXG4gICduZGFzaCc6ICdcXHUyMDEzJyxcbiAgJ25lJzogJ1xcdTIyNjAnLFxuICAnbmknOiAnXFx1MjIwQicsXG4gICdub3QnOiAnXFx1MDBBQycsXG4gICdub3Rpbic6ICdcXHUyMjA5JyxcbiAgJ25zdWInOiAnXFx1MjI4NCcsXG4gICdOdGlsZGUnOiAnXFx1MDBEMScsXG4gICdudGlsZGUnOiAnXFx1MDBGMScsXG4gICdOdSc6ICdcXHUwMzlEJyxcbiAgJ251JzogJ1xcdTAzQkQnLFxuICAnT2FjdXRlJzogJ1xcdTAwRDMnLFxuICAnb2FjdXRlJzogJ1xcdTAwRjMnLFxuICAnT2NpcmMnOiAnXFx1MDBENCcsXG4gICdvY2lyYyc6ICdcXHUwMEY0JyxcbiAgJ09FbGlnJzogJ1xcdTAxNTInLFxuICAnb2VsaWcnOiAnXFx1MDE1MycsXG4gICdPZ3JhdmUnOiAnXFx1MDBEMicsXG4gICdvZ3JhdmUnOiAnXFx1MDBGMicsXG4gICdvbGluZSc6ICdcXHUyMDNFJyxcbiAgJ09tZWdhJzogJ1xcdTAzQTknLFxuICAnb21lZ2EnOiAnXFx1MDNDOScsXG4gICdPbWljcm9uJzogJ1xcdTAzOUYnLFxuICAnb21pY3Jvbic6ICdcXHUwM0JGJyxcbiAgJ29wbHVzJzogJ1xcdTIyOTUnLFxuICAnb3InOiAnXFx1MjIyOCcsXG4gICdvcmRmJzogJ1xcdTAwQUEnLFxuICAnb3JkbSc6ICdcXHUwMEJBJyxcbiAgJ09zbGFzaCc6ICdcXHUwMEQ4JyxcbiAgJ29zbGFzaCc6ICdcXHUwMEY4JyxcbiAgJ090aWxkZSc6ICdcXHUwMEQ1JyxcbiAgJ290aWxkZSc6ICdcXHUwMEY1JyxcbiAgJ290aW1lcyc6ICdcXHUyMjk3JyxcbiAgJ091bWwnOiAnXFx1MDBENicsXG4gICdvdW1sJzogJ1xcdTAwRjYnLFxuICAncGFyYSc6ICdcXHUwMEI2JyxcbiAgJ3Blcm1pbCc6ICdcXHUyMDMwJyxcbiAgJ3BlcnAnOiAnXFx1MjJBNScsXG4gICdQaGknOiAnXFx1MDNBNicsXG4gICdwaGknOiAnXFx1MDNDNicsXG4gICdQaSc6ICdcXHUwM0EwJyxcbiAgJ3BpJzogJ1xcdTAzQzAnLFxuICAncGl2JzogJ1xcdTAzRDYnLFxuICAncGx1c21uJzogJ1xcdTAwQjEnLFxuICAncG91bmQnOiAnXFx1MDBBMycsXG4gICdwcmltZSc6ICdcXHUyMDMyJyxcbiAgJ1ByaW1lJzogJ1xcdTIwMzMnLFxuICAncHJvZCc6ICdcXHUyMjBGJyxcbiAgJ3Byb3AnOiAnXFx1MjIxRCcsXG4gICdQc2knOiAnXFx1MDNBOCcsXG4gICdwc2knOiAnXFx1MDNDOCcsXG4gICdxdW90JzogJ1xcdTAwMjInLFxuICAncmFkaWMnOiAnXFx1MjIxQScsXG4gICdyYW5nJzogJ1xcdTI3RTknLFxuICAncmFxdW8nOiAnXFx1MDBCQicsXG4gICdyYXJyJzogJ1xcdTIxOTInLFxuICAnckFycic6ICdcXHUyMUQyJyxcbiAgJ3JjZWlsJzogJ1xcdTIzMDknLFxuICAncmRxdW8nOiAnXFx1MjAxRCcsXG4gICdyZWFsJzogJ1xcdTIxMUMnLFxuICAncmVnJzogJ1xcdTAwQUUnLFxuICAncmZsb29yJzogJ1xcdTIzMEInLFxuICAnUmhvJzogJ1xcdTAzQTEnLFxuICAncmhvJzogJ1xcdTAzQzEnLFxuICAncmxtJzogJ1xcdTIwMEYnLFxuICAncnNhcXVvJzogJ1xcdTIwM0EnLFxuICAncnNxdW8nOiAnXFx1MjAxOScsXG4gICdzYnF1byc6ICdcXHUyMDFBJyxcbiAgJ1NjYXJvbic6ICdcXHUwMTYwJyxcbiAgJ3NjYXJvbic6ICdcXHUwMTYxJyxcbiAgJ3Nkb3QnOiAnXFx1MjJDNScsXG4gICdzZWN0JzogJ1xcdTAwQTcnLFxuICAnc2h5JzogJ1xcdTAwQUQnLFxuICAnU2lnbWEnOiAnXFx1MDNBMycsXG4gICdzaWdtYSc6ICdcXHUwM0MzJyxcbiAgJ3NpZ21hZic6ICdcXHUwM0MyJyxcbiAgJ3NpbSc6ICdcXHUyMjNDJyxcbiAgJ3NwYWRlcyc6ICdcXHUyNjYwJyxcbiAgJ3N1Yic6ICdcXHUyMjgyJyxcbiAgJ3N1YmUnOiAnXFx1MjI4NicsXG4gICdzdW0nOiAnXFx1MjIxMScsXG4gICdzdXAnOiAnXFx1MjI4MycsXG4gICdzdXAxJzogJ1xcdTAwQjknLFxuICAnc3VwMic6ICdcXHUwMEIyJyxcbiAgJ3N1cDMnOiAnXFx1MDBCMycsXG4gICdzdXBlJzogJ1xcdTIyODcnLFxuICAnc3psaWcnOiAnXFx1MDBERicsXG4gICdUYXUnOiAnXFx1MDNBNCcsXG4gICd0YXUnOiAnXFx1MDNDNCcsXG4gICd0aGVyZTQnOiAnXFx1MjIzNCcsXG4gICdUaGV0YSc6ICdcXHUwMzk4JyxcbiAgJ3RoZXRhJzogJ1xcdTAzQjgnLFxuICAndGhldGFzeW0nOiAnXFx1MDNEMScsXG4gICd0aGluc3AnOiAnXFx1MjAwOScsXG4gICdUSE9STic6ICdcXHUwMERFJyxcbiAgJ3Rob3JuJzogJ1xcdTAwRkUnLFxuICAndGlsZGUnOiAnXFx1MDJEQycsXG4gICd0aW1lcyc6ICdcXHUwMEQ3JyxcbiAgJ3RyYWRlJzogJ1xcdTIxMjInLFxuICAnVWFjdXRlJzogJ1xcdTAwREEnLFxuICAndWFjdXRlJzogJ1xcdTAwRkEnLFxuICAndWFycic6ICdcXHUyMTkxJyxcbiAgJ3VBcnInOiAnXFx1MjFEMScsXG4gICdVY2lyYyc6ICdcXHUwMERCJyxcbiAgJ3VjaXJjJzogJ1xcdTAwRkInLFxuICAnVWdyYXZlJzogJ1xcdTAwRDknLFxuICAndWdyYXZlJzogJ1xcdTAwRjknLFxuICAndW1sJzogJ1xcdTAwQTgnLFxuICAndXBzaWgnOiAnXFx1MDNEMicsXG4gICdVcHNpbG9uJzogJ1xcdTAzQTUnLFxuICAndXBzaWxvbic6ICdcXHUwM0M1JyxcbiAgJ1V1bWwnOiAnXFx1MDBEQycsXG4gICd1dW1sJzogJ1xcdTAwRkMnLFxuICAnd2VpZXJwJzogJ1xcdTIxMTgnLFxuICAnWGknOiAnXFx1MDM5RScsXG4gICd4aSc6ICdcXHUwM0JFJyxcbiAgJ1lhY3V0ZSc6ICdcXHUwMEREJyxcbiAgJ3lhY3V0ZSc6ICdcXHUwMEZEJyxcbiAgJ3llbic6ICdcXHUwMEE1JyxcbiAgJ3l1bWwnOiAnXFx1MDBGRicsXG4gICdZdW1sJzogJ1xcdTAxNzgnLFxuICAnWmV0YSc6ICdcXHUwMzk2JyxcbiAgJ3pldGEnOiAnXFx1MDNCNicsXG4gICd6d2onOiAnXFx1MjAwRCcsXG4gICd6d25qJzogJ1xcdTIwMEMnLFxufSk7XG5cbmV4cG9ydCBlbnVtIEh0bWxUYWdDb250ZW50VHlwZSB7XG4gIFJBV19URVhULFxuICBFU0NBUEFCTEVfUkFXX1RFWFQsXG4gIFBBUlNBQkxFX0RBVEFcbn1cblxuZXhwb3J0IGNsYXNzIEh0bWxUYWdEZWZpbml0aW9uIHtcbiAgcHJpdmF0ZSBjbG9zZWRCeUNoaWxkcmVuOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcbiAgcHVibGljIGNsb3NlZEJ5UGFyZW50OiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyByZXF1aXJlZFBhcmVudHM6IHtba2V5OiBzdHJpbmddOiBib29sZWFufTtcbiAgcHVibGljIHBhcmVudFRvQWRkOiBzdHJpbmc7XG4gIHB1YmxpYyBpbXBsaWNpdE5hbWVzcGFjZVByZWZpeDogc3RyaW5nO1xuICBwdWJsaWMgY29udGVudFR5cGU6IEh0bWxUYWdDb250ZW50VHlwZTtcbiAgcHVibGljIGlzVm9pZDogYm9vbGVhbjtcbiAgcHVibGljIGlnbm9yZUZpcnN0TGY6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3Ioe2Nsb3NlZEJ5Q2hpbGRyZW4sIHJlcXVpcmVkUGFyZW50cywgaW1wbGljaXROYW1lc3BhY2VQcmVmaXgsIGNvbnRlbnRUeXBlLFxuICAgICAgICAgICAgICAgY2xvc2VkQnlQYXJlbnQsIGlzVm9pZCwgaWdub3JlRmlyc3RMZn06IHtcbiAgICBjbG9zZWRCeUNoaWxkcmVuPzogc3RyaW5nW10sXG4gICAgY2xvc2VkQnlQYXJlbnQ/OiBib29sZWFuLFxuICAgIHJlcXVpcmVkUGFyZW50cz86IHN0cmluZ1tdLFxuICAgIGltcGxpY2l0TmFtZXNwYWNlUHJlZml4Pzogc3RyaW5nLFxuICAgIGNvbnRlbnRUeXBlPzogSHRtbFRhZ0NvbnRlbnRUeXBlLFxuICAgIGlzVm9pZD86IGJvb2xlYW4sXG4gICAgaWdub3JlRmlyc3RMZj86IGJvb2xlYW5cbiAgfSA9IHt9KSB7XG4gICAgaWYgKGlzUHJlc2VudChjbG9zZWRCeUNoaWxkcmVuKSAmJiBjbG9zZWRCeUNoaWxkcmVuLmxlbmd0aCA+IDApIHtcbiAgICAgIGNsb3NlZEJ5Q2hpbGRyZW4uZm9yRWFjaCh0YWdOYW1lID0+IHRoaXMuY2xvc2VkQnlDaGlsZHJlblt0YWdOYW1lXSA9IHRydWUpO1xuICAgIH1cbiAgICB0aGlzLmlzVm9pZCA9IG5vcm1hbGl6ZUJvb2woaXNWb2lkKTtcbiAgICB0aGlzLmNsb3NlZEJ5UGFyZW50ID0gbm9ybWFsaXplQm9vbChjbG9zZWRCeVBhcmVudCkgfHwgdGhpcy5pc1ZvaWQ7XG4gICAgaWYgKGlzUHJlc2VudChyZXF1aXJlZFBhcmVudHMpICYmIHJlcXVpcmVkUGFyZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLnJlcXVpcmVkUGFyZW50cyA9IHt9O1xuICAgICAgdGhpcy5wYXJlbnRUb0FkZCA9IHJlcXVpcmVkUGFyZW50c1swXTtcbiAgICAgIHJlcXVpcmVkUGFyZW50cy5mb3JFYWNoKHRhZ05hbWUgPT4gdGhpcy5yZXF1aXJlZFBhcmVudHNbdGFnTmFtZV0gPSB0cnVlKTtcbiAgICB9XG4gICAgdGhpcy5pbXBsaWNpdE5hbWVzcGFjZVByZWZpeCA9IGltcGxpY2l0TmFtZXNwYWNlUHJlZml4O1xuICAgIHRoaXMuY29udGVudFR5cGUgPSBpc1ByZXNlbnQoY29udGVudFR5cGUpID8gY29udGVudFR5cGUgOiBIdG1sVGFnQ29udGVudFR5cGUuUEFSU0FCTEVfREFUQTtcbiAgICB0aGlzLmlnbm9yZUZpcnN0TGYgPSBub3JtYWxpemVCb29sKGlnbm9yZUZpcnN0TGYpO1xuICB9XG5cbiAgcmVxdWlyZUV4dHJhUGFyZW50KGN1cnJlbnRQYXJlbnQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmIChpc0JsYW5rKHRoaXMucmVxdWlyZWRQYXJlbnRzKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChpc0JsYW5rKGN1cnJlbnRQYXJlbnQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBsZXQgbGNQYXJlbnQgPSBjdXJyZW50UGFyZW50LnRvTG93ZXJDYXNlKCk7XG4gICAgcmV0dXJuIHRoaXMucmVxdWlyZWRQYXJlbnRzW2xjUGFyZW50XSAhPSB0cnVlICYmIGxjUGFyZW50ICE9ICd0ZW1wbGF0ZSc7XG4gIH1cblxuICBpc0Nsb3NlZEJ5Q2hpbGQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNWb2lkIHx8IG5vcm1hbGl6ZUJvb2wodGhpcy5jbG9zZWRCeUNoaWxkcmVuW25hbWUudG9Mb3dlckNhc2UoKV0pO1xuICB9XG59XG5cbi8vIHNlZSBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc3ludGF4Lmh0bWwjb3B0aW9uYWwtdGFnc1xuLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBmdWxseSBjb25mb3JtIHRvIHRoZSBIVE1MNSBzcGVjLlxudmFyIFRBR19ERUZJTklUSU9OUzoge1trZXk6IHN0cmluZ106IEh0bWxUYWdEZWZpbml0aW9ufSA9IHtcbiAgJ2FyZWEnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnZW1iZWQnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnbGluayc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7aXNWb2lkOiB0cnVlfSksXG4gICdpbWcnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnaW5wdXQnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAncGFyYW0nOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnaHInOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnYnInOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2lzVm9pZDogdHJ1ZX0pLFxuICAnc291cmNlJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtpc1ZvaWQ6IHRydWV9KSxcbiAgJ3RyYWNrJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtpc1ZvaWQ6IHRydWV9KSxcbiAgJ3dicic6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7aXNWb2lkOiB0cnVlfSksXG4gICdwJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtcbiAgICBjbG9zZWRCeUNoaWxkcmVuOiBbXG4gICAgICAnYWRkcmVzcycsXG4gICAgICAnYXJ0aWNsZScsXG4gICAgICAnYXNpZGUnLFxuICAgICAgJ2Jsb2NrcXVvdGUnLFxuICAgICAgJ2RpdicsXG4gICAgICAnZGwnLFxuICAgICAgJ2ZpZWxkc2V0JyxcbiAgICAgICdmb290ZXInLFxuICAgICAgJ2Zvcm0nLFxuICAgICAgJ2gxJyxcbiAgICAgICdoMicsXG4gICAgICAnaDMnLFxuICAgICAgJ2g0JyxcbiAgICAgICdoNScsXG4gICAgICAnaDYnLFxuICAgICAgJ2hlYWRlcicsXG4gICAgICAnaGdyb3VwJyxcbiAgICAgICdocicsXG4gICAgICAnbWFpbicsXG4gICAgICAnbmF2JyxcbiAgICAgICdvbCcsXG4gICAgICAncCcsXG4gICAgICAncHJlJyxcbiAgICAgICdzZWN0aW9uJyxcbiAgICAgICd0YWJsZScsXG4gICAgICAndWwnXG4gICAgXSxcbiAgICBjbG9zZWRCeVBhcmVudDogdHJ1ZVxuICB9KSxcbiAgJ3RoZWFkJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ3Rib2R5JywgJ3Rmb290J119KSxcbiAgJ3Rib2R5JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ3Rib2R5JywgJ3Rmb290J10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlfSksXG4gICd0Zm9vdCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y2xvc2VkQnlDaGlsZHJlbjogWyd0Ym9keSddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAndHInOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe1xuICAgIGNsb3NlZEJ5Q2hpbGRyZW46IFsndHInXSxcbiAgICByZXF1aXJlZFBhcmVudHM6IFsndGJvZHknLCAndGZvb3QnLCAndGhlYWQnXSxcbiAgICBjbG9zZWRCeVBhcmVudDogdHJ1ZVxuICB9KSxcbiAgJ3RkJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ3RkJywgJ3RoJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlfSksXG4gICd0aCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y2xvc2VkQnlDaGlsZHJlbjogWyd0ZCcsICd0aCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAnY29sJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtyZXF1aXJlZFBhcmVudHM6IFsnY29sZ3JvdXAnXSwgaXNWb2lkOiB0cnVlfSksXG4gICdzdmcnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2ltcGxpY2l0TmFtZXNwYWNlUHJlZml4OiAnc3ZnJ30pLFxuICAnbWF0aCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7aW1wbGljaXROYW1lc3BhY2VQcmVmaXg6ICdtYXRoJ30pLFxuICAnbGknOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2Nsb3NlZEJ5Q2hpbGRyZW46IFsnbGknXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWV9KSxcbiAgJ2R0JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ2R0JywgJ2RkJ119KSxcbiAgJ2RkJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ2R0JywgJ2RkJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlfSksXG4gICdyYic6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y2xvc2VkQnlDaGlsZHJlbjogWydyYicsICdydCcsICdydGMnLCAncnAnXSwgY2xvc2VkQnlQYXJlbnQ6IHRydWV9KSxcbiAgJ3J0JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ3JiJywgJ3J0JywgJ3J0YycsICdycCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAncnRjJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ3JiJywgJ3J0YycsICdycCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAncnAnOiBuZXcgSHRtbFRhZ0RlZmluaXRpb24oe2Nsb3NlZEJ5Q2hpbGRyZW46IFsncmInLCAncnQnLCAncnRjJywgJ3JwJ10sIGNsb3NlZEJ5UGFyZW50OiB0cnVlfSksXG4gICdvcHRncm91cCc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y2xvc2VkQnlDaGlsZHJlbjogWydvcHRncm91cCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAnb3B0aW9uJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjbG9zZWRCeUNoaWxkcmVuOiBbJ29wdGlvbicsICdvcHRncm91cCddLCBjbG9zZWRCeVBhcmVudDogdHJ1ZX0pLFxuICAncHJlJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtpZ25vcmVGaXJzdExmOiB0cnVlfSksXG4gICdsaXN0aW5nJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtpZ25vcmVGaXJzdExmOiB0cnVlfSksXG4gICdzdHlsZSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y29udGVudFR5cGU6IEh0bWxUYWdDb250ZW50VHlwZS5SQVdfVEVYVH0pLFxuICAnc2NyaXB0JzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKHtjb250ZW50VHlwZTogSHRtbFRhZ0NvbnRlbnRUeXBlLlJBV19URVhUfSksXG4gICd0aXRsZSc6IG5ldyBIdG1sVGFnRGVmaW5pdGlvbih7Y29udGVudFR5cGU6IEh0bWxUYWdDb250ZW50VHlwZS5FU0NBUEFCTEVfUkFXX1RFWFR9KSxcbiAgJ3RleHRhcmVhJzogbmV3IEh0bWxUYWdEZWZpbml0aW9uKFxuICAgICAge2NvbnRlbnRUeXBlOiBIdG1sVGFnQ29udGVudFR5cGUuRVNDQVBBQkxFX1JBV19URVhULCBpZ25vcmVGaXJzdExmOiB0cnVlfSksXG59O1xuXG52YXIgREVGQVVMVF9UQUdfREVGSU5JVElPTiA9IG5ldyBIdG1sVGFnRGVmaW5pdGlvbigpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SHRtbFRhZ0RlZmluaXRpb24odGFnTmFtZTogc3RyaW5nKTogSHRtbFRhZ0RlZmluaXRpb24ge1xuICB2YXIgcmVzdWx0ID0gVEFHX0RFRklOSVRJT05TW3RhZ05hbWUudG9Mb3dlckNhc2UoKV07XG4gIHJldHVybiBpc1ByZXNlbnQocmVzdWx0KSA/IHJlc3VsdCA6IERFRkFVTFRfVEFHX0RFRklOSVRJT047XG59XG5cbnZhciBOU19QUkVGSVhfUkUgPSAvXkAoW146XSspOiguKykvZztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0TnNOYW1lKGVsZW1lbnROYW1lOiBzdHJpbmcpOiBzdHJpbmdbXSB7XG4gIGlmIChlbGVtZW50TmFtZVswXSAhPSAnQCcpIHtcbiAgICByZXR1cm4gW251bGwsIGVsZW1lbnROYW1lXTtcbiAgfVxuICBsZXQgbWF0Y2ggPSBSZWdFeHBXcmFwcGVyLmZpcnN0TWF0Y2goTlNfUFJFRklYX1JFLCBlbGVtZW50TmFtZSk7XG4gIHJldHVybiBbbWF0Y2hbMV0sIG1hdGNoWzJdXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5zUHJlZml4KGVsZW1lbnROYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gc3BsaXROc05hbWUoZWxlbWVudE5hbWUpWzBdO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2h0bWxfdGFncy50c1xuICoqLyIsImV4cG9ydCBjbGFzcyBFbGVtZW50U2NoZW1hUmVnaXN0cnkge1xuICBoYXNQcm9wZXJ0eSh0YWdOYW1lOiBzdHJpbmcsIHByb3BOYW1lOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cbiAgZ2V0TWFwcGVkUHJvcE5hbWUocHJvcE5hbWU6IHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBwcm9wTmFtZTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3NjaGVtYS9lbGVtZW50X3NjaGVtYV9yZWdpc3RyeS50c1xuICoqLyIsImltcG9ydCB7SHRtbEVsZW1lbnRBc3R9IGZyb20gJy4vaHRtbF9hc3QnO1xuaW1wb3J0IHtpc0JsYW5rLCBpc1ByZXNlbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3NwbGl0TnNOYW1lfSBmcm9tICcuL2h0bWxfdGFncyc7XG5cbmNvbnN0IE5HX0NPTlRFTlRfU0VMRUNUX0FUVFIgPSAnc2VsZWN0JztcbmNvbnN0IE5HX0NPTlRFTlRfRUxFTUVOVCA9ICduZy1jb250ZW50JztcbmNvbnN0IExJTktfRUxFTUVOVCA9ICdsaW5rJztcbmNvbnN0IExJTktfU1RZTEVfUkVMX0FUVFIgPSAncmVsJztcbmNvbnN0IExJTktfU1RZTEVfSFJFRl9BVFRSID0gJ2hyZWYnO1xuY29uc3QgTElOS19TVFlMRV9SRUxfVkFMVUUgPSAnc3R5bGVzaGVldCc7XG5jb25zdCBTVFlMRV9FTEVNRU5UID0gJ3N0eWxlJztcbmNvbnN0IFNDUklQVF9FTEVNRU5UID0gJ3NjcmlwdCc7XG5jb25zdCBOR19OT05fQklOREFCTEVfQVRUUiA9ICduZ05vbkJpbmRhYmxlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcnNlRWxlbWVudChhc3Q6IEh0bWxFbGVtZW50QXN0KTogUHJlcGFyc2VkRWxlbWVudCB7XG4gIHZhciBzZWxlY3RBdHRyID0gbnVsbDtcbiAgdmFyIGhyZWZBdHRyID0gbnVsbDtcbiAgdmFyIHJlbEF0dHIgPSBudWxsO1xuICB2YXIgbm9uQmluZGFibGUgPSBmYWxzZTtcbiAgYXN0LmF0dHJzLmZvckVhY2goYXR0ciA9PiB7XG4gICAgbGV0IGxjQXR0ck5hbWUgPSBhdHRyLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAobGNBdHRyTmFtZSA9PSBOR19DT05URU5UX1NFTEVDVF9BVFRSKSB7XG4gICAgICBzZWxlY3RBdHRyID0gYXR0ci52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGxjQXR0ck5hbWUgPT0gTElOS19TVFlMRV9IUkVGX0FUVFIpIHtcbiAgICAgIGhyZWZBdHRyID0gYXR0ci52YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGxjQXR0ck5hbWUgPT0gTElOS19TVFlMRV9SRUxfQVRUUikge1xuICAgICAgcmVsQXR0ciA9IGF0dHIudmFsdWU7XG4gICAgfSBlbHNlIGlmIChhdHRyLm5hbWUgPT0gTkdfTk9OX0JJTkRBQkxFX0FUVFIpIHtcbiAgICAgIG5vbkJpbmRhYmxlID0gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuICBzZWxlY3RBdHRyID0gbm9ybWFsaXplTmdDb250ZW50U2VsZWN0KHNlbGVjdEF0dHIpO1xuICB2YXIgbm9kZU5hbWUgPSBhc3QubmFtZS50b0xvd2VyQ2FzZSgpO1xuICB2YXIgdHlwZSA9IFByZXBhcnNlZEVsZW1lbnRUeXBlLk9USEVSO1xuICBpZiAoc3BsaXROc05hbWUobm9kZU5hbWUpWzFdID09IE5HX0NPTlRFTlRfRUxFTUVOVCkge1xuICAgIHR5cGUgPSBQcmVwYXJzZWRFbGVtZW50VHlwZS5OR19DT05URU5UO1xuICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IFNUWUxFX0VMRU1FTlQpIHtcbiAgICB0eXBlID0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEU7XG4gIH0gZWxzZSBpZiAobm9kZU5hbWUgPT0gU0NSSVBUX0VMRU1FTlQpIHtcbiAgICB0eXBlID0gUHJlcGFyc2VkRWxlbWVudFR5cGUuU0NSSVBUO1xuICB9IGVsc2UgaWYgKG5vZGVOYW1lID09IExJTktfRUxFTUVOVCAmJiByZWxBdHRyID09IExJTktfU1RZTEVfUkVMX1ZBTFVFKSB7XG4gICAgdHlwZSA9IFByZXBhcnNlZEVsZW1lbnRUeXBlLlNUWUxFU0hFRVQ7XG4gIH1cbiAgcmV0dXJuIG5ldyBQcmVwYXJzZWRFbGVtZW50KHR5cGUsIHNlbGVjdEF0dHIsIGhyZWZBdHRyLCBub25CaW5kYWJsZSk7XG59XG5cbmV4cG9ydCBlbnVtIFByZXBhcnNlZEVsZW1lbnRUeXBlIHtcbiAgTkdfQ09OVEVOVCxcbiAgU1RZTEUsXG4gIFNUWUxFU0hFRVQsXG4gIFNDUklQVCxcbiAgT1RIRVJcbn1cblxuZXhwb3J0IGNsYXNzIFByZXBhcnNlZEVsZW1lbnQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgdHlwZTogUHJlcGFyc2VkRWxlbWVudFR5cGUsIHB1YmxpYyBzZWxlY3RBdHRyOiBzdHJpbmcsIHB1YmxpYyBocmVmQXR0cjogc3RyaW5nLFxuICAgICAgICAgICAgICBwdWJsaWMgbm9uQmluZGFibGU6IGJvb2xlYW4pIHt9XG59XG5cblxuZnVuY3Rpb24gbm9ybWFsaXplTmdDb250ZW50U2VsZWN0KHNlbGVjdEF0dHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpc0JsYW5rKHNlbGVjdEF0dHIpIHx8IHNlbGVjdEF0dHIubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuICcqJztcbiAgfVxuICByZXR1cm4gc2VsZWN0QXR0cjtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci90ZW1wbGF0ZV9wcmVwYXJzZXIudHNcbiAqKi8iLCJpbXBvcnQge1xuICBDb21waWxlVHlwZU1ldGFkYXRhLFxuICBDb21waWxlRGlyZWN0aXZlTWV0YWRhdGEsXG4gIENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhXG59IGZyb20gJy4vZGlyZWN0aXZlX21ldGFkYXRhJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQcm9taXNlLCBQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cbmltcG9ydCB7WEhSfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyJztcbmltcG9ydCB7VXJsUmVzb2x2ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci91cmxfcmVzb2x2ZXInO1xuaW1wb3J0IHtleHRyYWN0U3R5bGVVcmxzLCBpc1N0eWxlVXJsUmVzb2x2YWJsZX0gZnJvbSAnLi9zdHlsZV91cmxfcmVzb2x2ZXInO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1ZpZXdFbmNhcHN1bGF0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YS92aWV3JztcblxuXG5pbXBvcnQge1xuICBIdG1sQXN0VmlzaXRvcixcbiAgSHRtbEVsZW1lbnRBc3QsXG4gIEh0bWxUZXh0QXN0LFxuICBIdG1sQXR0ckFzdCxcbiAgSHRtbEFzdCxcbiAgaHRtbFZpc2l0QWxsXG59IGZyb20gJy4vaHRtbF9hc3QnO1xuaW1wb3J0IHtIdG1sUGFyc2VyfSBmcm9tICcuL2h0bWxfcGFyc2VyJztcblxuaW1wb3J0IHtwcmVwYXJzZUVsZW1lbnQsIFByZXBhcnNlZEVsZW1lbnQsIFByZXBhcnNlZEVsZW1lbnRUeXBlfSBmcm9tICcuL3RlbXBsYXRlX3ByZXBhcnNlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUZW1wbGF0ZU5vcm1hbGl6ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF94aHI6IFhIUiwgcHJpdmF0ZSBfdXJsUmVzb2x2ZXI6IFVybFJlc29sdmVyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9odG1sUGFyc2VyOiBIdG1sUGFyc2VyKSB7fVxuXG4gIG5vcm1hbGl6ZVRlbXBsYXRlKGRpcmVjdGl2ZVR5cGU6IENvbXBpbGVUeXBlTWV0YWRhdGEsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBDb21waWxlVGVtcGxhdGVNZXRhZGF0YSk6IFByb21pc2U8Q29tcGlsZVRlbXBsYXRlTWV0YWRhdGE+IHtcbiAgICBpZiAoaXNQcmVzZW50KHRlbXBsYXRlLnRlbXBsYXRlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLnJlc29sdmUodGhpcy5ub3JtYWxpemVMb2FkZWRUZW1wbGF0ZShcbiAgICAgICAgICBkaXJlY3RpdmVUeXBlLCB0ZW1wbGF0ZSwgdGVtcGxhdGUudGVtcGxhdGUsIGRpcmVjdGl2ZVR5cGUubW9kdWxlVXJsKSk7XG4gICAgfSBlbHNlIGlmIChpc1ByZXNlbnQodGVtcGxhdGUudGVtcGxhdGVVcmwpKSB7XG4gICAgICB2YXIgc291cmNlQWJzVXJsID0gdGhpcy5fdXJsUmVzb2x2ZXIucmVzb2x2ZShkaXJlY3RpdmVUeXBlLm1vZHVsZVVybCwgdGVtcGxhdGUudGVtcGxhdGVVcmwpO1xuICAgICAgcmV0dXJuIHRoaXMuX3hoci5nZXQoc291cmNlQWJzVXJsKVxuICAgICAgICAgIC50aGVuKHRlbXBsYXRlQ29udGVudCA9PiB0aGlzLm5vcm1hbGl6ZUxvYWRlZFRlbXBsYXRlKGRpcmVjdGl2ZVR5cGUsIHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlQ29udGVudCwgc291cmNlQWJzVXJsKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBObyB0ZW1wbGF0ZSBzcGVjaWZpZWQgZm9yIGNvbXBvbmVudCAke2RpcmVjdGl2ZVR5cGUubmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICBub3JtYWxpemVMb2FkZWRUZW1wbGF0ZShkaXJlY3RpdmVUeXBlOiBDb21waWxlVHlwZU1ldGFkYXRhLCB0ZW1wbGF0ZU1ldGE6IENvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogc3RyaW5nLCB0ZW1wbGF0ZUFic1VybDogc3RyaW5nKTogQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEge1xuICAgIHZhciByb290Tm9kZXNBbmRFcnJvcnMgPSB0aGlzLl9odG1sUGFyc2VyLnBhcnNlKHRlbXBsYXRlLCBkaXJlY3RpdmVUeXBlLm5hbWUpO1xuICAgIGlmIChyb290Tm9kZXNBbmRFcnJvcnMuZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgIHZhciBlcnJvclN0cmluZyA9IHJvb3ROb2Rlc0FuZEVycm9ycy5lcnJvcnMuam9pbignXFxuJyk7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgVGVtcGxhdGUgcGFyc2UgZXJyb3JzOlxcbiR7ZXJyb3JTdHJpbmd9YCk7XG4gICAgfVxuXG4gICAgdmFyIHZpc2l0b3IgPSBuZXcgVGVtcGxhdGVQcmVwYXJzZVZpc2l0b3IoKTtcbiAgICBodG1sVmlzaXRBbGwodmlzaXRvciwgcm9vdE5vZGVzQW5kRXJyb3JzLnJvb3ROb2Rlcyk7XG4gICAgdmFyIGFsbFN0eWxlcyA9IHRlbXBsYXRlTWV0YS5zdHlsZXMuY29uY2F0KHZpc2l0b3Iuc3R5bGVzKTtcblxuICAgIHZhciBhbGxTdHlsZUFic1VybHMgPVxuICAgICAgICB2aXNpdG9yLnN0eWxlVXJscy5maWx0ZXIoaXNTdHlsZVVybFJlc29sdmFibGUpXG4gICAgICAgICAgICAubWFwKHVybCA9PiB0aGlzLl91cmxSZXNvbHZlci5yZXNvbHZlKHRlbXBsYXRlQWJzVXJsLCB1cmwpKVxuICAgICAgICAgICAgLmNvbmNhdCh0ZW1wbGF0ZU1ldGEuc3R5bGVVcmxzLmZpbHRlcihpc1N0eWxlVXJsUmVzb2x2YWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAodXJsID0+IHRoaXMuX3VybFJlc29sdmVyLnJlc29sdmUoZGlyZWN0aXZlVHlwZS5tb2R1bGVVcmwsIHVybCkpKTtcblxuICAgIHZhciBhbGxSZXNvbHZlZFN0eWxlcyA9IGFsbFN0eWxlcy5tYXAoc3R5bGUgPT4ge1xuICAgICAgdmFyIHN0eWxlV2l0aEltcG9ydHMgPSBleHRyYWN0U3R5bGVVcmxzKHRoaXMuX3VybFJlc29sdmVyLCB0ZW1wbGF0ZUFic1VybCwgc3R5bGUpO1xuICAgICAgc3R5bGVXaXRoSW1wb3J0cy5zdHlsZVVybHMuZm9yRWFjaChzdHlsZVVybCA9PiBhbGxTdHlsZUFic1VybHMucHVzaChzdHlsZVVybCkpO1xuICAgICAgcmV0dXJuIHN0eWxlV2l0aEltcG9ydHMuc3R5bGU7XG4gICAgfSk7XG5cbiAgICB2YXIgZW5jYXBzdWxhdGlvbiA9IHRlbXBsYXRlTWV0YS5lbmNhcHN1bGF0aW9uO1xuICAgIGlmIChlbmNhcHN1bGF0aW9uID09PSBWaWV3RW5jYXBzdWxhdGlvbi5FbXVsYXRlZCAmJiBhbGxSZXNvbHZlZFN0eWxlcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgYWxsU3R5bGVBYnNVcmxzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgZW5jYXBzdWxhdGlvbiA9IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmU7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQ29tcGlsZVRlbXBsYXRlTWV0YWRhdGEoe1xuICAgICAgZW5jYXBzdWxhdGlvbjogZW5jYXBzdWxhdGlvbixcbiAgICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbiAgICAgIHRlbXBsYXRlVXJsOiB0ZW1wbGF0ZUFic1VybCxcbiAgICAgIHN0eWxlczogYWxsUmVzb2x2ZWRTdHlsZXMsXG4gICAgICBzdHlsZVVybHM6IGFsbFN0eWxlQWJzVXJscyxcbiAgICAgIG5nQ29udGVudFNlbGVjdG9yczogdmlzaXRvci5uZ0NvbnRlbnRTZWxlY3RvcnNcbiAgICB9KTtcbiAgfVxufVxuXG5jbGFzcyBUZW1wbGF0ZVByZXBhcnNlVmlzaXRvciBpbXBsZW1lbnRzIEh0bWxBc3RWaXNpdG9yIHtcbiAgbmdDb250ZW50U2VsZWN0b3JzOiBzdHJpbmdbXSA9IFtdO1xuICBzdHlsZXM6IHN0cmluZ1tdID0gW107XG4gIHN0eWxlVXJsczogc3RyaW5nW10gPSBbXTtcbiAgbmdOb25CaW5kYWJsZVN0YWNrQ291bnQ6IG51bWJlciA9IDA7XG5cbiAgdmlzaXRFbGVtZW50KGFzdDogSHRtbEVsZW1lbnRBc3QsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdmFyIHByZXBhcnNlZEVsZW1lbnQgPSBwcmVwYXJzZUVsZW1lbnQoYXN0KTtcbiAgICBzd2l0Y2ggKHByZXBhcnNlZEVsZW1lbnQudHlwZSkge1xuICAgICAgY2FzZSBQcmVwYXJzZWRFbGVtZW50VHlwZS5OR19DT05URU5UOlxuICAgICAgICBpZiAodGhpcy5uZ05vbkJpbmRhYmxlU3RhY2tDb3VudCA9PT0gMCkge1xuICAgICAgICAgIHRoaXMubmdDb250ZW50U2VsZWN0b3JzLnB1c2gocHJlcGFyc2VkRWxlbWVudC5zZWxlY3RBdHRyKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEU6XG4gICAgICAgIHZhciB0ZXh0Q29udGVudCA9ICcnO1xuICAgICAgICBhc3QuY2hpbGRyZW4uZm9yRWFjaChjaGlsZCA9PiB7XG4gICAgICAgICAgaWYgKGNoaWxkIGluc3RhbmNlb2YgSHRtbFRleHRBc3QpIHtcbiAgICAgICAgICAgIHRleHRDb250ZW50ICs9ICg8SHRtbFRleHRBc3Q+Y2hpbGQpLnZhbHVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuc3R5bGVzLnB1c2godGV4dENvbnRlbnQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJlcGFyc2VkRWxlbWVudFR5cGUuU1RZTEVTSEVFVDpcbiAgICAgICAgdGhpcy5zdHlsZVVybHMucHVzaChwcmVwYXJzZWRFbGVtZW50LmhyZWZBdHRyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGlmIChwcmVwYXJzZWRFbGVtZW50Lm5vbkJpbmRhYmxlKSB7XG4gICAgICB0aGlzLm5nTm9uQmluZGFibGVTdGFja0NvdW50Kys7XG4gICAgfVxuICAgIGh0bWxWaXNpdEFsbCh0aGlzLCBhc3QuY2hpbGRyZW4pO1xuICAgIGlmIChwcmVwYXJzZWRFbGVtZW50Lm5vbkJpbmRhYmxlKSB7XG4gICAgICB0aGlzLm5nTm9uQmluZGFibGVTdGFja0NvdW50LS07XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9XG4gIHZpc2l0QXR0cihhc3Q6IEh0bWxBdHRyQXN0LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxuICB2aXNpdFRleHQoYXN0OiBIdG1sVGV4dEFzdCwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIG51bGw7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci90ZW1wbGF0ZV9ub3JtYWxpemVyLnRzXG4gKiovIiwiaW1wb3J0IHtyZXNvbHZlRm9yd2FyZFJlZn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtcbiAgVHlwZSxcbiAgaXNCbGFuayxcbiAgaXNQcmVzZW50LFxuICBpc0FycmF5LFxuICBzdHJpbmdpZnksXG4gIFJlZ0V4cFdyYXBwZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCAqIGFzIGNwbCBmcm9tICcuL2RpcmVjdGl2ZV9tZXRhZGF0YSc7XG5pbXBvcnQgKiBhcyBtZCBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YS9kaXJlY3RpdmVzJztcbmltcG9ydCB7RGlyZWN0aXZlUmVzb2x2ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9kaXJlY3RpdmVfcmVzb2x2ZXInO1xuaW1wb3J0IHtWaWV3UmVzb2x2ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X3Jlc29sdmVyJztcbmltcG9ydCB7Vmlld01ldGFkYXRhfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9tZXRhZGF0YS92aWV3JztcbmltcG9ydCB7aGFzTGlmZWN5Y2xlSG9va30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2RpcmVjdGl2ZV9saWZlY3ljbGVfcmVmbGVjdG9yJztcbmltcG9ydCB7TGlmZWN5Y2xlSG9va3MsIExJRkVDWUNMRV9IT09LU19WQUxVRVN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9pbnRlcmZhY2VzJztcbmltcG9ydCB7cmVmbGVjdG9yfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZWZsZWN0aW9uL3JlZmxlY3Rpb24nO1xuaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3QsIE9wdGlvbmFsfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1BMQVRGT1JNX0RJUkVDVElWRVN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3BsYXRmb3JtX2RpcmVjdGl2ZXNfYW5kX3BpcGVzJztcbmltcG9ydCB7TU9EVUxFX1NVRkZJWH0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7Z2V0VXJsU2NoZW1lfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIvdXJsX3Jlc29sdmVyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJ1bnRpbWVNZXRhZGF0YVJlc29sdmVyIHtcbiAgcHJpdmF0ZSBfY2FjaGUgPSBuZXcgTWFwPFR5cGUsIGNwbC5Db21waWxlRGlyZWN0aXZlTWV0YWRhdGE+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlyZWN0aXZlUmVzb2x2ZXI6IERpcmVjdGl2ZVJlc29sdmVyLCBwcml2YXRlIF92aWV3UmVzb2x2ZXI6IFZpZXdSZXNvbHZlcixcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChQTEFURk9STV9ESVJFQ1RJVkVTKSBwcml2YXRlIF9wbGF0Zm9ybURpcmVjdGl2ZXM6IFR5cGVbXSkge31cblxuICBnZXRNZXRhZGF0YShkaXJlY3RpdmVUeXBlOiBUeXBlKTogY3BsLkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YSB7XG4gICAgdmFyIG1ldGEgPSB0aGlzLl9jYWNoZS5nZXQoZGlyZWN0aXZlVHlwZSk7XG4gICAgaWYgKGlzQmxhbmsobWV0YSkpIHtcbiAgICAgIHZhciBkaXJNZXRhID0gdGhpcy5fZGlyZWN0aXZlUmVzb2x2ZXIucmVzb2x2ZShkaXJlY3RpdmVUeXBlKTtcbiAgICAgIHZhciBtb2R1bGVVcmwgPSBudWxsO1xuICAgICAgdmFyIHRlbXBsYXRlTWV0YSA9IG51bGw7XG4gICAgICB2YXIgY2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kgPSBudWxsO1xuXG4gICAgICBpZiAoZGlyTWV0YSBpbnN0YW5jZW9mIG1kLkNvbXBvbmVudE1ldGFkYXRhKSB7XG4gICAgICAgIHZhciBjbXBNZXRhID0gPG1kLkNvbXBvbmVudE1ldGFkYXRhPmRpck1ldGE7XG4gICAgICAgIG1vZHVsZVVybCA9IGNhbGNNb2R1bGVVcmwoZGlyZWN0aXZlVHlwZSwgY21wTWV0YSk7XG4gICAgICAgIHZhciB2aWV3TWV0YSA9IHRoaXMuX3ZpZXdSZXNvbHZlci5yZXNvbHZlKGRpcmVjdGl2ZVR5cGUpO1xuICAgICAgICB0ZW1wbGF0ZU1ldGEgPSBuZXcgY3BsLkNvbXBpbGVUZW1wbGF0ZU1ldGFkYXRhKHtcbiAgICAgICAgICBlbmNhcHN1bGF0aW9uOiB2aWV3TWV0YS5lbmNhcHN1bGF0aW9uLFxuICAgICAgICAgIHRlbXBsYXRlOiB2aWV3TWV0YS50ZW1wbGF0ZSxcbiAgICAgICAgICB0ZW1wbGF0ZVVybDogdmlld01ldGEudGVtcGxhdGVVcmwsXG4gICAgICAgICAgc3R5bGVzOiB2aWV3TWV0YS5zdHlsZXMsXG4gICAgICAgICAgc3R5bGVVcmxzOiB2aWV3TWV0YS5zdHlsZVVybHNcbiAgICAgICAgfSk7XG4gICAgICAgIGNoYW5nZURldGVjdGlvblN0cmF0ZWd5ID0gY21wTWV0YS5jaGFuZ2VEZXRlY3Rpb247XG4gICAgICB9XG4gICAgICBtZXRhID0gY3BsLkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YS5jcmVhdGUoe1xuICAgICAgICBzZWxlY3RvcjogZGlyTWV0YS5zZWxlY3RvcixcbiAgICAgICAgZXhwb3J0QXM6IGRpck1ldGEuZXhwb3J0QXMsXG4gICAgICAgIGlzQ29tcG9uZW50OiBpc1ByZXNlbnQodGVtcGxhdGVNZXRhKSxcbiAgICAgICAgZHluYW1pY0xvYWRhYmxlOiB0cnVlLFxuICAgICAgICB0eXBlOiBuZXcgY3BsLkNvbXBpbGVUeXBlTWV0YWRhdGEoXG4gICAgICAgICAgICB7bmFtZTogc3RyaW5naWZ5KGRpcmVjdGl2ZVR5cGUpLCBtb2R1bGVVcmw6IG1vZHVsZVVybCwgcnVudGltZTogZGlyZWN0aXZlVHlwZX0pLFxuICAgICAgICB0ZW1wbGF0ZTogdGVtcGxhdGVNZXRhLFxuICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IGNoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgICAgICBpbnB1dHM6IGRpck1ldGEuaW5wdXRzLFxuICAgICAgICBvdXRwdXRzOiBkaXJNZXRhLm91dHB1dHMsXG4gICAgICAgIGhvc3Q6IGRpck1ldGEuaG9zdCxcbiAgICAgICAgbGlmZWN5Y2xlSG9va3M6IExJRkVDWUNMRV9IT09LU19WQUxVRVMuZmlsdGVyKGhvb2sgPT4gaGFzTGlmZWN5Y2xlSG9vayhob29rLCBkaXJlY3RpdmVUeXBlKSlcbiAgICAgIH0pO1xuICAgICAgdGhpcy5fY2FjaGUuc2V0KGRpcmVjdGl2ZVR5cGUsIG1ldGEpO1xuICAgIH1cbiAgICByZXR1cm4gbWV0YTtcbiAgfVxuXG4gIGdldFZpZXdEaXJlY3RpdmVzTWV0YWRhdGEoY29tcG9uZW50OiBUeXBlKTogY3BsLkNvbXBpbGVEaXJlY3RpdmVNZXRhZGF0YVtdIHtcbiAgICB2YXIgdmlldyA9IHRoaXMuX3ZpZXdSZXNvbHZlci5yZXNvbHZlKGNvbXBvbmVudCk7XG4gICAgdmFyIGRpcmVjdGl2ZXMgPSBmbGF0dGVuRGlyZWN0aXZlcyh2aWV3LCB0aGlzLl9wbGF0Zm9ybURpcmVjdGl2ZXMpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlyZWN0aXZlcy5sZW5ndGg7IGkrKykge1xuICAgICAgaWYgKCFpc1ZhbGlkRGlyZWN0aXZlKGRpcmVjdGl2ZXNbaV0pKSB7XG4gICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgICAgYFVuZXhwZWN0ZWQgZGlyZWN0aXZlIHZhbHVlICcke3N0cmluZ2lmeShkaXJlY3RpdmVzW2ldKX0nIG9uIHRoZSBWaWV3IG9mIGNvbXBvbmVudCAnJHtzdHJpbmdpZnkoY29tcG9uZW50KX0nYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpcmVjdGl2ZXMubWFwKHR5cGUgPT4gdGhpcy5nZXRNZXRhZGF0YSh0eXBlKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmxhdHRlbkRpcmVjdGl2ZXModmlldzogVmlld01ldGFkYXRhLCBwbGF0Zm9ybURpcmVjdGl2ZXM6IGFueVtdKTogVHlwZVtdIHtcbiAgbGV0IGRpcmVjdGl2ZXMgPSBbXTtcbiAgaWYgKGlzUHJlc2VudChwbGF0Zm9ybURpcmVjdGl2ZXMpKSB7XG4gICAgZmxhdHRlbkFycmF5KHBsYXRmb3JtRGlyZWN0aXZlcywgZGlyZWN0aXZlcyk7XG4gIH1cbiAgaWYgKGlzUHJlc2VudCh2aWV3LmRpcmVjdGl2ZXMpKSB7XG4gICAgZmxhdHRlbkFycmF5KHZpZXcuZGlyZWN0aXZlcywgZGlyZWN0aXZlcyk7XG4gIH1cbiAgcmV0dXJuIGRpcmVjdGl2ZXM7XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5BcnJheSh0cmVlOiBhbnlbXSwgb3V0OiBBcnJheTxUeXBlIHwgYW55W10+KTogdm9pZCB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdHJlZS5sZW5ndGg7IGkrKykge1xuICAgIHZhciBpdGVtID0gcmVzb2x2ZUZvcndhcmRSZWYodHJlZVtpXSk7XG4gICAgaWYgKGlzQXJyYXkoaXRlbSkpIHtcbiAgICAgIGZsYXR0ZW5BcnJheShpdGVtLCBvdXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQucHVzaChpdGVtKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNWYWxpZERpcmVjdGl2ZSh2YWx1ZTogVHlwZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNQcmVzZW50KHZhbHVlKSAmJiAodmFsdWUgaW5zdGFuY2VvZiBUeXBlKTtcbn1cblxuZnVuY3Rpb24gY2FsY01vZHVsZVVybCh0eXBlOiBUeXBlLCBjbXBNZXRhZGF0YTogbWQuQ29tcG9uZW50TWV0YWRhdGEpOiBzdHJpbmcge1xuICB2YXIgbW9kdWxlSWQgPSBjbXBNZXRhZGF0YS5tb2R1bGVJZDtcbiAgaWYgKGlzUHJlc2VudChtb2R1bGVJZCkpIHtcbiAgICB2YXIgc2NoZW1lID0gZ2V0VXJsU2NoZW1lKG1vZHVsZUlkKTtcbiAgICByZXR1cm4gaXNQcmVzZW50KHNjaGVtZSkgJiYgc2NoZW1lLmxlbmd0aCA+IDAgPyBtb2R1bGVJZCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHBhY2thZ2U6JHttb2R1bGVJZH0ke01PRFVMRV9TVUZGSVh9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVmbGVjdG9yLmltcG9ydFVyaSh0eXBlKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3J1bnRpbWVfbWV0YWRhdGEudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtzcGxpdE5zTmFtZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2h0bWxfdGFncyc7XG5cbmltcG9ydCB7RWxlbWVudFNjaGVtYVJlZ2lzdHJ5fSBmcm9tICcuL2VsZW1lbnRfc2NoZW1hX3JlZ2lzdHJ5JztcblxuY29uc3QgTkFNRVNQQUNFX1VSSVMgPVxuICAgIENPTlNUX0VYUFIoeyd4bGluayc6ICdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rJywgJ3N2Zyc6ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyd9KTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvbUVsZW1lbnRTY2hlbWFSZWdpc3RyeSBleHRlbmRzIEVsZW1lbnRTY2hlbWFSZWdpc3RyeSB7XG4gIHByaXZhdGUgX3Byb3RvRWxlbWVudHMgPSBuZXcgTWFwPHN0cmluZywgRWxlbWVudD4oKTtcblxuICBwcml2YXRlIF9nZXRQcm90b0VsZW1lbnQodGFnTmFtZTogc3RyaW5nKTogRWxlbWVudCB7XG4gICAgdmFyIGVsZW1lbnQgPSB0aGlzLl9wcm90b0VsZW1lbnRzLmdldCh0YWdOYW1lKTtcbiAgICBpZiAoaXNCbGFuayhlbGVtZW50KSkge1xuICAgICAgdmFyIG5zQW5kTmFtZSA9IHNwbGl0TnNOYW1lKHRhZ05hbWUpO1xuICAgICAgZWxlbWVudCA9IGlzUHJlc2VudChuc0FuZE5hbWVbMF0pID9cbiAgICAgICAgICAgICAgICAgICAgRE9NLmNyZWF0ZUVsZW1lbnROUyhOQU1FU1BBQ0VfVVJJU1tuc0FuZE5hbWVbMF1dLCBuc0FuZE5hbWVbMV0pIDpcbiAgICAgICAgICAgICAgICAgICAgRE9NLmNyZWF0ZUVsZW1lbnQobnNBbmROYW1lWzFdKTtcbiAgICAgIHRoaXMuX3Byb3RvRWxlbWVudHMuc2V0KHRhZ05hbWUsIGVsZW1lbnQpO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudDtcbiAgfVxuXG4gIGhhc1Byb3BlcnR5KHRhZ05hbWU6IHN0cmluZywgcHJvcE5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIGlmICh0YWdOYW1lLmluZGV4T2YoJy0nKSAhPT0gLTEpIHtcbiAgICAgIC8vIGNhbid0IHRlbGwgbm93IGFzIHdlIGRvbid0IGtub3cgd2hpY2ggcHJvcGVydGllcyBhIGN1c3RvbSBlbGVtZW50IHdpbGwgZ2V0XG4gICAgICAvLyBvbmNlIGl0IGlzIGluc3RhbnRpYXRlZFxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBlbG0gPSB0aGlzLl9nZXRQcm90b0VsZW1lbnQodGFnTmFtZSk7XG4gICAgICByZXR1cm4gRE9NLmhhc1Byb3BlcnR5KGVsbSwgcHJvcE5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGdldE1hcHBlZFByb3BOYW1lKHByb3BOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHZhciBtYXBwZWRQcm9wTmFtZSA9IFN0cmluZ01hcFdyYXBwZXIuZ2V0KERPTS5hdHRyVG9Qcm9wTWFwLCBwcm9wTmFtZSk7XG4gICAgcmV0dXJuIGlzUHJlc2VudChtYXBwZWRQcm9wTmFtZSkgPyBtYXBwZWRQcm9wTmFtZSA6IHByb3BOYW1lO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29tcGlsZXIvc2NoZW1hL2RvbV9lbGVtZW50X3NjaGVtYV9yZWdpc3RyeS50c1xuICoqLyIsImltcG9ydCB7aXNCbGFuaywgVHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuZXhwb3J0IHZhciBET006IERvbUFkYXB0ZXIgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0Um9vdERvbUFkYXB0ZXIoYWRhcHRlcjogRG9tQWRhcHRlcikge1xuICBpZiAoaXNCbGFuayhET00pKSB7XG4gICAgRE9NID0gYWRhcHRlcjtcbiAgfVxufVxuXG4vKiB0c2xpbnQ6ZGlzYWJsZTpyZXF1aXJlUGFyYW1ldGVyVHlwZSAqL1xuLyoqXG4gKiBQcm92aWRlcyBET00gb3BlcmF0aW9ucyBpbiBhbiBlbnZpcm9ubWVudC1hZ25vc3RpYyB3YXkuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEb21BZGFwdGVyIHtcbiAgYWJzdHJhY3QgaGFzUHJvcGVydHkoZWxlbWVudCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbjtcbiAgYWJzdHJhY3Qgc2V0UHJvcGVydHkoZWw6IEVsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk7XG4gIGFic3RyYWN0IGdldFByb3BlcnR5KGVsOiBFbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBhbnk7XG4gIGFic3RyYWN0IGludm9rZShlbDogRWxlbWVudCwgbWV0aG9kTmFtZTogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IGFueTtcblxuICBhYnN0cmFjdCBsb2dFcnJvcihlcnJvcik7XG4gIGFic3RyYWN0IGxvZyhlcnJvcik7XG4gIGFic3RyYWN0IGxvZ0dyb3VwKGVycm9yKTtcbiAgYWJzdHJhY3QgbG9nR3JvdXBFbmQoKTtcblxuICBhYnN0cmFjdCBnZXRYSFIoKTogVHlwZTtcblxuICAvKipcbiAgICogTWFwcyBhdHRyaWJ1dGUgbmFtZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBuYW1lcyBmb3IgY2FzZXNcbiAgICogd2hlcmUgYXR0cmlidXRlIG5hbWUgZG9lc24ndCBtYXRjaCBwcm9wZXJ0eSBuYW1lLlxuICAgKi9cbiAgYXR0clRvUHJvcE1hcDoge1trZXk6IHN0cmluZ106IHN0cmluZ307XG5cbiAgYWJzdHJhY3QgcGFyc2UodGVtcGxhdGVIdG1sOiBzdHJpbmcpO1xuICBhYnN0cmFjdCBxdWVyeShzZWxlY3Rvcjogc3RyaW5nKTogYW55O1xuICBhYnN0cmFjdCBxdWVyeVNlbGVjdG9yKGVsLCBzZWxlY3Rvcjogc3RyaW5nKTogSFRNTEVsZW1lbnQ7XG4gIGFic3RyYWN0IHF1ZXJ5U2VsZWN0b3JBbGwoZWwsIHNlbGVjdG9yOiBzdHJpbmcpOiBhbnlbXTtcbiAgYWJzdHJhY3Qgb24oZWwsIGV2dCwgbGlzdGVuZXIpO1xuICBhYnN0cmFjdCBvbkFuZENhbmNlbChlbCwgZXZ0LCBsaXN0ZW5lcik6IEZ1bmN0aW9uO1xuICBhYnN0cmFjdCBkaXNwYXRjaEV2ZW50KGVsLCBldnQpO1xuICBhYnN0cmFjdCBjcmVhdGVNb3VzZUV2ZW50KGV2ZW50VHlwZSk6IGFueTtcbiAgYWJzdHJhY3QgY3JlYXRlRXZlbnQoZXZlbnRUeXBlOiBzdHJpbmcpOiBhbnk7XG4gIGFic3RyYWN0IHByZXZlbnREZWZhdWx0KGV2dCk7XG4gIGFic3RyYWN0IGlzUHJldmVudGVkKGV2dCk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGdldElubmVySFRNTChlbCk6IHN0cmluZztcbiAgYWJzdHJhY3QgZ2V0T3V0ZXJIVE1MKGVsKTogc3RyaW5nO1xuICBhYnN0cmFjdCBub2RlTmFtZShub2RlKTogc3RyaW5nO1xuICBhYnN0cmFjdCBub2RlVmFsdWUobm9kZSk6IHN0cmluZztcbiAgYWJzdHJhY3QgdHlwZShub2RlKTogc3RyaW5nO1xuICBhYnN0cmFjdCBjb250ZW50KG5vZGUpOiBhbnk7XG4gIGFic3RyYWN0IGZpcnN0Q2hpbGQoZWwpOiBOb2RlO1xuICBhYnN0cmFjdCBuZXh0U2libGluZyhlbCk6IE5vZGU7XG4gIGFic3RyYWN0IHBhcmVudEVsZW1lbnQoZWwpOiBOb2RlO1xuICBhYnN0cmFjdCBjaGlsZE5vZGVzKGVsKTogTm9kZVtdO1xuICBhYnN0cmFjdCBjaGlsZE5vZGVzQXNMaXN0KGVsKTogTm9kZVtdO1xuICBhYnN0cmFjdCBjbGVhck5vZGVzKGVsKTtcbiAgYWJzdHJhY3QgYXBwZW5kQ2hpbGQoZWwsIG5vZGUpO1xuICBhYnN0cmFjdCByZW1vdmVDaGlsZChlbCwgbm9kZSk7XG4gIGFic3RyYWN0IHJlcGxhY2VDaGlsZChlbCwgbmV3Tm9kZSwgb2xkTm9kZSk7XG4gIGFic3RyYWN0IHJlbW92ZShlbCk6IE5vZGU7XG4gIGFic3RyYWN0IGluc2VydEJlZm9yZShlbCwgbm9kZSk7XG4gIGFic3RyYWN0IGluc2VydEFsbEJlZm9yZShlbCwgbm9kZXMpO1xuICBhYnN0cmFjdCBpbnNlcnRBZnRlcihlbCwgbm9kZSk7XG4gIGFic3RyYWN0IHNldElubmVySFRNTChlbCwgdmFsdWUpO1xuICBhYnN0cmFjdCBnZXRUZXh0KGVsKTogc3RyaW5nO1xuICBhYnN0cmFjdCBzZXRUZXh0KGVsLCB2YWx1ZTogc3RyaW5nKTtcbiAgYWJzdHJhY3QgZ2V0VmFsdWUoZWwpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHNldFZhbHVlKGVsLCB2YWx1ZTogc3RyaW5nKTtcbiAgYWJzdHJhY3QgZ2V0Q2hlY2tlZChlbCk6IGJvb2xlYW47XG4gIGFic3RyYWN0IHNldENoZWNrZWQoZWwsIHZhbHVlOiBib29sZWFuKTtcbiAgYWJzdHJhY3QgY3JlYXRlQ29tbWVudCh0ZXh0OiBzdHJpbmcpOiBhbnk7XG4gIGFic3RyYWN0IGNyZWF0ZVRlbXBsYXRlKGh0bWwpOiBIVE1MRWxlbWVudDtcbiAgYWJzdHJhY3QgY3JlYXRlRWxlbWVudCh0YWdOYW1lLCBkb2M/KTogSFRNTEVsZW1lbnQ7XG4gIGFic3RyYWN0IGNyZWF0ZUVsZW1lbnROUyhuczogc3RyaW5nLCB0YWdOYW1lOiBzdHJpbmcsIGRvYz8pOiBFbGVtZW50O1xuICBhYnN0cmFjdCBjcmVhdGVUZXh0Tm9kZSh0ZXh0OiBzdHJpbmcsIGRvYz8pOiBUZXh0O1xuICBhYnN0cmFjdCBjcmVhdGVTY3JpcHRUYWcoYXR0ck5hbWU6IHN0cmluZywgYXR0clZhbHVlOiBzdHJpbmcsIGRvYz8pOiBIVE1MRWxlbWVudDtcbiAgYWJzdHJhY3QgY3JlYXRlU3R5bGVFbGVtZW50KGNzczogc3RyaW5nLCBkb2M/KTogSFRNTFN0eWxlRWxlbWVudDtcbiAgYWJzdHJhY3QgY3JlYXRlU2hhZG93Um9vdChlbCk6IGFueTtcbiAgYWJzdHJhY3QgZ2V0U2hhZG93Um9vdChlbCk6IGFueTtcbiAgYWJzdHJhY3QgZ2V0SG9zdChlbCk6IGFueTtcbiAgYWJzdHJhY3QgZ2V0RGlzdHJpYnV0ZWROb2RlcyhlbCk6IE5vZGVbXTtcbiAgYWJzdHJhY3QgY2xvbmUgLyo8VCBleHRlbmRzIE5vZGU+Ki8gKG5vZGU6IE5vZGUgLypUKi8pOiBOb2RlIC8qVCovO1xuICBhYnN0cmFjdCBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50W107XG4gIGFic3RyYWN0IGdldEVsZW1lbnRzQnlUYWdOYW1lKGVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50W107XG4gIGFic3RyYWN0IGNsYXNzTGlzdChlbGVtZW50KTogYW55W107XG4gIGFic3RyYWN0IGFkZENsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZTogc3RyaW5nKTtcbiAgYWJzdHJhY3QgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lOiBzdHJpbmcpO1xuICBhYnN0cmFjdCBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW47XG4gIGFic3RyYWN0IHNldFN0eWxlKGVsZW1lbnQsIHN0eWxlTmFtZTogc3RyaW5nLCBzdHlsZVZhbHVlOiBzdHJpbmcpO1xuICBhYnN0cmFjdCByZW1vdmVTdHlsZShlbGVtZW50LCBzdHlsZU5hbWU6IHN0cmluZyk7XG4gIGFic3RyYWN0IGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlTmFtZTogc3RyaW5nKTogc3RyaW5nO1xuICBhYnN0cmFjdCBoYXNTdHlsZShlbGVtZW50LCBzdHlsZU5hbWU6IHN0cmluZywgc3R5bGVWYWx1ZT86IHN0cmluZyk6IGJvb2xlYW47XG4gIGFic3RyYWN0IHRhZ05hbWUoZWxlbWVudCk6IHN0cmluZztcbiAgYWJzdHJhY3QgYXR0cmlidXRlTWFwKGVsZW1lbnQpOiBNYXA8c3RyaW5nLCBzdHJpbmc+O1xuICBhYnN0cmFjdCBoYXNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlOiBzdHJpbmcpOiBib29sZWFuO1xuICBhYnN0cmFjdCBnZXRBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHNldEF0dHJpYnV0ZShlbGVtZW50LCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpO1xuICBhYnN0cmFjdCBzZXRBdHRyaWJ1dGVOUyhlbGVtZW50LCBuczogc3RyaW5nLCBuYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpO1xuICBhYnN0cmFjdCByZW1vdmVBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlOiBzdHJpbmcpO1xuICBhYnN0cmFjdCB0ZW1wbGF0ZUF3YXJlUm9vdChlbCk7XG4gIGFic3RyYWN0IGNyZWF0ZUh0bWxEb2N1bWVudCgpOiBIVE1MRG9jdW1lbnQ7XG4gIGFic3RyYWN0IGRlZmF1bHREb2MoKTogSFRNTERvY3VtZW50O1xuICBhYnN0cmFjdCBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWwpO1xuICBhYnN0cmFjdCBnZXRUaXRsZSgpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHNldFRpdGxlKG5ld1RpdGxlOiBzdHJpbmcpO1xuICBhYnN0cmFjdCBlbGVtZW50TWF0Y2hlcyhuLCBzZWxlY3Rvcjogc3RyaW5nKTogYm9vbGVhbjtcbiAgYWJzdHJhY3QgaXNUZW1wbGF0ZUVsZW1lbnQoZWw6IGFueSk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGlzVGV4dE5vZGUobm9kZSk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGlzQ29tbWVudE5vZGUobm9kZSk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGlzRWxlbWVudE5vZGUobm9kZSk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGhhc1NoYWRvd1Jvb3Qobm9kZSk6IGJvb2xlYW47XG4gIGFic3RyYWN0IGlzU2hhZG93Um9vdChub2RlKTogYm9vbGVhbjtcbiAgYWJzdHJhY3QgaW1wb3J0SW50b0RvYyAvKjxUIGV4dGVuZHMgTm9kZT4qLyAobm9kZTogTm9kZSAvKlQqLyk6IE5vZGUgLypUKi87XG4gIGFic3RyYWN0IGFkb3B0Tm9kZSAvKjxUIGV4dGVuZHMgTm9kZT4qLyAobm9kZTogTm9kZSAvKlQqLyk6IE5vZGUgLypUKi87XG4gIGFic3RyYWN0IGdldEhyZWYoZWxlbWVudCk6IHN0cmluZztcbiAgYWJzdHJhY3QgZ2V0RXZlbnRLZXkoZXZlbnQpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHJlc29sdmVBbmRTZXRIcmVmKGVsZW1lbnQsIGJhc2VVcmw6IHN0cmluZywgaHJlZjogc3RyaW5nKTtcbiAgYWJzdHJhY3Qgc3VwcG9ydHNET01FdmVudHMoKTogYm9vbGVhbjtcbiAgYWJzdHJhY3Qgc3VwcG9ydHNOYXRpdmVTaGFkb3dET00oKTogYm9vbGVhbjtcbiAgYWJzdHJhY3QgZ2V0R2xvYmFsRXZlbnRUYXJnZXQodGFyZ2V0OiBzdHJpbmcpOiBhbnk7XG4gIGFic3RyYWN0IGdldEhpc3RvcnkoKTogSGlzdG9yeTtcbiAgYWJzdHJhY3QgZ2V0TG9jYXRpb24oKTogTG9jYXRpb247XG4gIGFic3RyYWN0IGdldEJhc2VIcmVmKCk6IHN0cmluZztcbiAgYWJzdHJhY3QgcmVzZXRCYXNlRWxlbWVudCgpOiB2b2lkO1xuICBhYnN0cmFjdCBnZXRVc2VyQWdlbnQoKTogc3RyaW5nO1xuICBhYnN0cmFjdCBzZXREYXRhKGVsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk7XG4gIGFic3RyYWN0IGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk6IGFueTtcbiAgYWJzdHJhY3QgZ2V0RGF0YShlbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHNldEdsb2JhbFZhcihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpO1xuICBhYnN0cmFjdCByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spOiBudW1iZXI7XG4gIGFic3RyYWN0IGNhbmNlbEFuaW1hdGlvbkZyYW1lKGlkKTtcbiAgYWJzdHJhY3QgcGVyZm9ybWFuY2VOb3coKTogbnVtYmVyO1xuICBhYnN0cmFjdCBnZXRBbmltYXRpb25QcmVmaXgoKTogc3RyaW5nO1xuICBhYnN0cmFjdCBnZXRUcmFuc2l0aW9uRW5kKCk6IHN0cmluZztcbiAgYWJzdHJhY3Qgc3VwcG9ydHNBbmltYXRpb24oKTogYm9vbGVhbjtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXIudHNcbiAqKi8iLCJleHBvcnQge0FuZ3VsYXJFbnRyeXBvaW50fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9hbmd1bGFyX2VudHJ5cG9pbnQnO1xuZXhwb3J0IHtcbiAgQlJPV1NFUl9QUk9WSURFUlMsXG4gIEVMRU1FTlRfUFJPQkVfQklORElOR1MsXG4gIEVMRU1FTlRfUFJPQkVfUFJPVklERVJTLFxuICBpbnNwZWN0TmF0aXZlRWxlbWVudCxcbiAgQnJvd3NlckRvbUFkYXB0ZXIsXG4gIEJ5LFxuICBUaXRsZSxcbiAgRE9DVU1FTlQsXG4gIGVuYWJsZURlYnVnVG9vbHMsXG4gIGRpc2FibGVEZWJ1Z1Rvb2xzXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyX2NvbW1vbic7XG5cbmltcG9ydCB7VHlwZSwgaXNQcmVzZW50LCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQcm9taXNlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL3Byb21pc2UnO1xuaW1wb3J0IHtcbiAgQlJPV1NFUl9QUk9WSURFUlMsXG4gIEJST1dTRVJfQVBQX0NPTU1PTl9QUk9WSURFUlNcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXJfY29tbW9uJztcbmltcG9ydCB7Q09NUElMRVJfUFJPVklERVJTfSBmcm9tICdhbmd1bGFyMi9jb21waWxlcic7XG5pbXBvcnQge0NvbXBvbmVudFJlZiwgcGxhdGZvcm0sIHJlZmxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge1JlZmxlY3Rpb25DYXBhYmlsaXRpZXN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3JlZmxlY3Rpb24vcmVmbGVjdGlvbl9jYXBhYmlsaXRpZXMnO1xuaW1wb3J0IHtYSFJJbXBsfSBmcm9tIFwiYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIveGhyX2ltcGxcIjtcbmltcG9ydCB7WEhSfSBmcm9tICdhbmd1bGFyMi9jb21waWxlcic7XG5pbXBvcnQge1Byb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5cbi8qKlxuICogQW4gYXJyYXkgb2YgcHJvdmlkZXJzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBpbnRvIGBhcHBsaWNhdGlvbigpYCB3aGVuIGJvb3RzdHJhcHBpbmcgYSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBjb25zdCBCUk9XU0VSX0FQUF9QUk9WSURFUlM6IEFycmF5PGFueSAvKlR5cGUgfCBQcm92aWRlciB8IGFueVtdKi8+ID0gQ09OU1RfRVhQUihbXG4gIEJST1dTRVJfQVBQX0NPTU1PTl9QUk9WSURFUlMsXG4gIENPTVBJTEVSX1BST1ZJREVSUyxcbiAgbmV3IFByb3ZpZGVyKFhIUiwge3VzZUNsYXNzOiBYSFJJbXBsfSksXG5dKTtcblxuLyoqXG4gKiBCb290c3RyYXBwaW5nIGZvciBBbmd1bGFyIGFwcGxpY2F0aW9ucy5cbiAqXG4gKiBZb3UgaW5zdGFudGlhdGUgYW4gQW5ndWxhciBhcHBsaWNhdGlvbiBieSBleHBsaWNpdGx5IHNwZWNpZnlpbmcgYSBjb21wb25lbnQgdG8gdXNlXG4gKiBhcyB0aGUgcm9vdCBjb21wb25lbnQgZm9yIHlvdXIgYXBwbGljYXRpb24gdmlhIHRoZSBgYm9vdHN0cmFwKClgIG1ldGhvZC5cbiAqXG4gKiAjIyBTaW1wbGUgRXhhbXBsZVxuICpcbiAqIEFzc3VtaW5nIHRoaXMgYGluZGV4Lmh0bWxgOlxuICpcbiAqIGBgYGh0bWxcbiAqIDxodG1sPlxuICogICA8IS0tIGxvYWQgQW5ndWxhciBzY3JpcHQgdGFncyBoZXJlLiAtLT5cbiAqICAgPGJvZHk+XG4gKiAgICAgPG15LWFwcD5sb2FkaW5nLi4uPC9teS1hcHA+XG4gKiAgIDwvYm9keT5cbiAqIDwvaHRtbD5cbiAqIGBgYFxuICpcbiAqIEFuIGFwcGxpY2F0aW9uIGlzIGJvb3RzdHJhcHBlZCBpbnNpZGUgYW4gZXhpc3RpbmcgYnJvd3NlciBET00sIHR5cGljYWxseSBgaW5kZXguaHRtbGAuXG4gKiBVbmxpa2UgQW5ndWxhciAxLCBBbmd1bGFyIDIgZG9lcyBub3QgY29tcGlsZS9wcm9jZXNzIHByb3ZpZGVycyBpbiBgaW5kZXguaHRtbGAuIFRoaXMgaXNcbiAqIG1haW5seSBmb3Igc2VjdXJpdHkgcmVhc29ucywgYXMgd2VsbCBhcyBhcmNoaXRlY3R1cmFsIGNoYW5nZXMgaW4gQW5ndWxhciAyLiBUaGlzIG1lYW5zXG4gKiB0aGF0IGBpbmRleC5odG1sYCBjYW4gc2FmZWx5IGJlIHByb2Nlc3NlZCB1c2luZyBzZXJ2ZXItc2lkZSB0ZWNobm9sb2dpZXMgc3VjaCBhc1xuICogcHJvdmlkZXJzLiBCaW5kaW5ncyBjYW4gdGh1cyB1c2UgZG91YmxlLWN1cmx5IGB7eyBzeW50YXggfX1gIHdpdGhvdXQgY29sbGlzaW9uIGZyb21cbiAqIEFuZ3VsYXIgMiBjb21wb25lbnQgZG91YmxlLWN1cmx5IGB7eyBzeW50YXggfX1gLlxuICpcbiAqIFdlIGNhbiB1c2UgdGhpcyBzY3JpcHQgY29kZTpcbiAqXG4gKiB7QGV4YW1wbGUgY29yZS90cy9ib290c3RyYXAvYm9vdHN0cmFwLnRzIHJlZ2lvbj0nYm9vdHN0cmFwJ31cbiAqXG4gKiBXaGVuIHRoZSBhcHAgZGV2ZWxvcGVyIGludm9rZXMgYGJvb3RzdHJhcCgpYCB3aXRoIHRoZSByb290IGNvbXBvbmVudCBgTXlBcHBgIGFzIGl0c1xuICogYXJndW1lbnQsIEFuZ3VsYXIgcGVyZm9ybXMgdGhlIGZvbGxvd2luZyB0YXNrczpcbiAqXG4gKiAgMS4gSXQgdXNlcyB0aGUgY29tcG9uZW50J3MgYHNlbGVjdG9yYCBwcm9wZXJ0eSB0byBsb2NhdGUgdGhlIERPTSBlbGVtZW50IHdoaWNoIG5lZWRzXG4gKiAgICAgdG8gYmUgdXBncmFkZWQgaW50byB0aGUgYW5ndWxhciBjb21wb25lbnQuXG4gKiAgMi4gSXQgY3JlYXRlcyBhIG5ldyBjaGlsZCBpbmplY3RvciAoZnJvbSB0aGUgcGxhdGZvcm0gaW5qZWN0b3IpLiBPcHRpb25hbGx5LCB5b3UgY2FuXG4gKiAgICAgYWxzbyBvdmVycmlkZSB0aGUgaW5qZWN0b3IgY29uZmlndXJhdGlvbiBmb3IgYW4gYXBwIGJ5IGludm9raW5nIGBib290c3RyYXBgIHdpdGggdGhlXG4gKiAgICAgYGNvbXBvbmVudEluamVjdGFibGVCaW5kaW5nc2AgYXJndW1lbnQuXG4gKiAgMy4gSXQgY3JlYXRlcyBhIG5ldyBgWm9uZWAgYW5kIGNvbm5lY3RzIGl0IHRvIHRoZSBhbmd1bGFyIGFwcGxpY2F0aW9uJ3MgY2hhbmdlIGRldGVjdGlvblxuICogICAgIGRvbWFpbiBpbnN0YW5jZS5cbiAqICA0LiBJdCBjcmVhdGVzIGFuIGVtdWxhdGVkIG9yIHNoYWRvdyBET00gb24gdGhlIHNlbGVjdGVkIGNvbXBvbmVudCdzIGhvc3QgZWxlbWVudCBhbmQgbG9hZHMgdGhlXG4gKiAgICAgdGVtcGxhdGUgaW50byBpdC5cbiAqICA1LiBJdCBpbnN0YW50aWF0ZXMgdGhlIHNwZWNpZmllZCBjb21wb25lbnQuXG4gKiAgNi4gRmluYWxseSwgQW5ndWxhciBwZXJmb3JtcyBjaGFuZ2UgZGV0ZWN0aW9uIHRvIGFwcGx5IHRoZSBpbml0aWFsIGRhdGEgcHJvdmlkZXJzIGZvciB0aGVcbiAqICAgICBhcHBsaWNhdGlvbi5cbiAqXG4gKlxuICogIyMgQm9vdHN0cmFwcGluZyBNdWx0aXBsZSBBcHBsaWNhdGlvbnNcbiAqXG4gKiBXaGVuIHdvcmtpbmcgd2l0aGluIGEgYnJvd3NlciB3aW5kb3csIHRoZXJlIGFyZSBtYW55IHNpbmdsZXRvbiByZXNvdXJjZXM6IGNvb2tpZXMsIHRpdGxlLFxuICogbG9jYXRpb24sIGFuZCBvdGhlcnMuIEFuZ3VsYXIgc2VydmljZXMgdGhhdCByZXByZXNlbnQgdGhlc2UgcmVzb3VyY2VzIG11c3QgbGlrZXdpc2UgYmVcbiAqIHNoYXJlZCBhY3Jvc3MgYWxsIEFuZ3VsYXIgYXBwbGljYXRpb25zIHRoYXQgb2NjdXB5IHRoZSBzYW1lIGJyb3dzZXIgd2luZG93LiBGb3IgdGhpc1xuICogcmVhc29uLCBBbmd1bGFyIGNyZWF0ZXMgZXhhY3RseSBvbmUgZ2xvYmFsIHBsYXRmb3JtIG9iamVjdCB3aGljaCBzdG9yZXMgYWxsIHNoYXJlZFxuICogc2VydmljZXMsIGFuZCBlYWNoIGFuZ3VsYXIgYXBwbGljYXRpb24gaW5qZWN0b3IgaGFzIHRoZSBwbGF0Zm9ybSBpbmplY3RvciBhcyBpdHMgcGFyZW50LlxuICpcbiAqIEVhY2ggYXBwbGljYXRpb24gaGFzIGl0cyBvd24gcHJpdmF0ZSBpbmplY3RvciBhcyB3ZWxsLiBXaGVuIHRoZXJlIGFyZSBtdWx0aXBsZVxuICogYXBwbGljYXRpb25zIG9uIGEgcGFnZSwgQW5ndWxhciB0cmVhdHMgZWFjaCBhcHBsaWNhdGlvbiBpbmplY3RvcidzIHNlcnZpY2VzIGFzIHByaXZhdGVcbiAqIHRvIHRoYXQgYXBwbGljYXRpb24uXG4gKlxuICogIyMgQVBJXG4gKlxuICogLSBgYXBwQ29tcG9uZW50VHlwZWA6IFRoZSByb290IGNvbXBvbmVudCB3aGljaCBzaG91bGQgYWN0IGFzIHRoZSBhcHBsaWNhdGlvbi4gVGhpcyBpc1xuICogICBhIHJlZmVyZW5jZSB0byBhIGBUeXBlYCB3aGljaCBpcyBhbm5vdGF0ZWQgd2l0aCBgQENvbXBvbmVudCguLi4pYC5cbiAqIC0gYGN1c3RvbVByb3ZpZGVyc2A6IEFuIGFkZGl0aW9uYWwgc2V0IG9mIHByb3ZpZGVycyB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGVcbiAqICAgYXBwIGluamVjdG9yIHRvIG92ZXJyaWRlIGRlZmF1bHQgaW5qZWN0aW9uIGJlaGF2aW9yLlxuICpcbiAqIFJldHVybnMgYSBgUHJvbWlzZWAgb2Yge0BsaW5rIENvbXBvbmVudFJlZn0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBib290c3RyYXAoXG4gICAgYXBwQ29tcG9uZW50VHlwZTogVHlwZSxcbiAgICBjdXN0b21Qcm92aWRlcnM/OiBBcnJheTxhbnkgLypUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXSovPik6IFByb21pc2U8Q29tcG9uZW50UmVmPiB7XG4gIHJlZmxlY3Rvci5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzID0gbmV3IFJlZmxlY3Rpb25DYXBhYmlsaXRpZXMoKTtcbiAgbGV0IGFwcFByb3ZpZGVycyA9XG4gICAgICBpc1ByZXNlbnQoY3VzdG9tUHJvdmlkZXJzKSA/IFtCUk9XU0VSX0FQUF9QUk9WSURFUlMsIGN1c3RvbVByb3ZpZGVyc10gOiBCUk9XU0VSX0FQUF9QUk9WSURFUlM7XG4gIHJldHVybiBwbGF0Zm9ybShCUk9XU0VSX1BST1ZJREVSUykuYXBwbGljYXRpb24oYXBwUHJvdmlkZXJzKS5ib290c3RyYXAoYXBwQ29tcG9uZW50VHlwZSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBNYXJrcyBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBhcyBhbiBBbmd1bGFyIDIgZW50cnlwb2ludC4gT25seSBuZWNlc3NhcnkgaW4gRGFydCBjb2RlLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgbmFtZWAgcGFyYW1ldGVyIHdpbGwgYmUgcmVmbGVjdGVkIGluIGxvZ3Mgd2hlbiB0aGUgZW50cnkgcG9pbnQgaXMgcHJvY2Vzc2VkLlxuICpcbiAqIFNlZSBbdGhlIHdpa2ldW10gZm9yIGRldGFpbGVkIGRvY3VtZW50YXRpb24uXG4gKiBbdGhlIHdpa2ldOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL3dpa2kvQW5ndWxhci0yLURhcnQtVHJhbnNmb3JtZXIjZW50cnlfcG9pbnRzXG4gKlxuICogIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogQEFuZ3VsYXJFbnRyeXBvaW50KFwibmFtZS1mb3ItZGVidWdcIilcbiAqIHZvaWQgbWFpbigpIHtcbiAqICAgYm9vdHN0cmFwKE15Q29tcG9uZW50KTtcbiAqIH1cbiAqIGBgYFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEFuZ3VsYXJFbnRyeXBvaW50IHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU/OiBTdHJpbmcpIHt9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9hbmd1bGFyX2VudHJ5cG9pbnQudHNcbiAqKi8iLCJpbXBvcnQge0NPTlNUX0VYUFIsIElTX0RBUlR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3Byb3ZpZGUsIFByb3ZpZGVyLCBJbmplY3RvciwgT3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcblxuaW1wb3J0IHtcbiAgUExBVEZPUk1fSU5JVElBTElaRVIsXG4gIFBMQVRGT1JNX0RJUkVDVElWRVMsXG4gIFBMQVRGT1JNX1BJUEVTLFxuICBDb21wb25lbnRSZWYsXG4gIHBsYXRmb3JtLFxuICBFeGNlcHRpb25IYW5kbGVyLFxuICBSZWZsZWN0b3IsXG4gIFJlbmRlcmVyLFxuICByZWZsZWN0b3IsXG4gIEFQUExJQ0FUSU9OX0NPTU1PTl9QUk9WSURFUlMsXG4gIFBMQVRGT1JNX0NPTU1PTl9QUk9WSURFUlNcbn0gZnJvbSBcImFuZ3VsYXIyL2NvcmVcIjtcbmltcG9ydCB7Q09NTU9OX0RJUkVDVElWRVMsIENPTU1PTl9QSVBFUywgRk9STV9QUk9WSURFUlN9IGZyb20gXCJhbmd1bGFyMi9jb21tb25cIjtcbmltcG9ydCB7VGVzdGFiaWxpdHl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3Rlc3RhYmlsaXR5L3Rlc3RhYmlsaXR5JztcbmltcG9ydCB7RE9NfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcbmltcG9ydCB7RG9tRXZlbnRzUGx1Z2lufSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9kb21fZXZlbnRzJztcbmltcG9ydCB7S2V5RXZlbnRzUGx1Z2lufSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9rZXlfZXZlbnRzJztcbmltcG9ydCB7SGFtbWVyR2VzdHVyZXNQbHVnaW59IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZXZlbnRzL2hhbW1lcl9nZXN0dXJlcyc7XG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV90b2tlbnMnO1xuaW1wb3J0IHtEb21SZW5kZXJlciwgRG9tUmVuZGVyZXJffSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9yZW5kZXJlcic7XG5pbXBvcnQge0RvbVNoYXJlZFN0eWxlc0hvc3R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vc2hhcmVkX3N0eWxlc19ob3N0JztcbmltcG9ydCB7U2hhcmVkU3R5bGVzSG9zdH0gZnJvbSBcImFuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vc2hhcmVkX3N0eWxlc19ob3N0XCI7XG5pbXBvcnQge0Jyb3dzZXJEZXRhaWxzfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2FuaW1hdGUvYnJvd3Nlcl9kZXRhaWxzXCI7XG5pbXBvcnQge0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gXCJhbmd1bGFyMi9zcmMvYW5pbWF0ZS9hbmltYXRpb25fYnVpbGRlclwiO1xuaW1wb3J0IHtCcm93c2VyRG9tQWRhcHRlcn0gZnJvbSAnLi9icm93c2VyL2Jyb3dzZXJfYWRhcHRlcic7XG5pbXBvcnQge0Jyb3dzZXJHZXRUZXN0YWJpbGl0eX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdGVzdGFiaWxpdHknO1xuaW1wb3J0IHt3dGZJbml0fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9wcm9maWxlL3d0Zl9pbml0JztcbmltcG9ydCB7RXZlbnRNYW5hZ2VyLCBFVkVOVF9NQU5BR0VSX1BMVUdJTlN9IGZyb20gXCJhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9ldmVudF9tYW5hZ2VyXCI7XG5leHBvcnQge0RPQ1VNRU5UfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV90b2tlbnMnO1xuZXhwb3J0IHtUaXRsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdGl0bGUnO1xuZXhwb3J0IHtcbiAgRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyLFxuICBFTEVNRU5UX1BST0JFX1BST1ZJREVSUyxcbiAgRUxFTUVOVF9QUk9CRV9CSU5ESU5HUyxcbiAgaW5zcGVjdE5hdGl2ZUVsZW1lbnQsXG4gIEJ5XG59IGZyb20gJ2FuZ3VsYXIyL3BsYXRmb3JtL2NvbW1vbl9kb20nO1xuZXhwb3J0IHtCcm93c2VyRG9tQWRhcHRlcn0gZnJvbSAnLi9icm93c2VyL2Jyb3dzZXJfYWRhcHRlcic7XG5leHBvcnQge2VuYWJsZURlYnVnVG9vbHMsIGRpc2FibGVEZWJ1Z1Rvb2xzfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci90b29scy90b29scyc7XG5cbi8qKlxuICogQSBzZXQgb2YgcHJvdmlkZXJzIHRvIGluaXRpYWxpemUgdGhlIEFuZ3VsYXIgcGxhdGZvcm0gaW4gYSB3ZWIgYnJvd3Nlci5cbiAqXG4gKiBVc2VkIGF1dG9tYXRpY2FsbHkgYnkgYGJvb3RzdHJhcGAsIG9yIGNhbiBiZSBwYXNzZWQgdG8ge0BsaW5rIHBsYXRmb3JtfS5cbiAqL1xuZXhwb3J0IGNvbnN0IEJST1dTRVJfUFJPVklERVJTOiBBcnJheTxhbnkgLypUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXSovPiA9IENPTlNUX0VYUFIoW1xuICBQTEFURk9STV9DT01NT05fUFJPVklERVJTLFxuICBuZXcgUHJvdmlkZXIoUExBVEZPUk1fSU5JVElBTElaRVIsIHt1c2VWYWx1ZTogaW5pdERvbUFkYXB0ZXIsIG11bHRpOiB0cnVlfSksXG5dKTtcblxuZnVuY3Rpb24gX2V4Y2VwdGlvbkhhbmRsZXIoKTogRXhjZXB0aW9uSGFuZGxlciB7XG4gIC8vICFJU19EQVJUIGlzIHJlcXVpcmVkIGJlY2F1c2Ugd2UgbXVzdCByZXRocm93IGV4Y2VwdGlvbnMgaW4gSlMsXG4gIC8vIGJ1dCBtdXN0IG5vdCByZXRocm93IGV4Y2VwdGlvbnMgaW4gRGFydFxuICByZXR1cm4gbmV3IEV4Y2VwdGlvbkhhbmRsZXIoRE9NLCAhSVNfREFSVCk7XG59XG5cbmZ1bmN0aW9uIF9kb2N1bWVudCgpOiBhbnkge1xuICByZXR1cm4gRE9NLmRlZmF1bHREb2MoKTtcbn1cblxuLyoqXG4gKiBBIHNldCBvZiBwcm92aWRlcnMgdG8gaW5pdGlhbGl6ZSBhbiBBbmd1bGFyIGFwcGxpY2F0aW9uIGluIGEgd2ViIGJyb3dzZXIuXG4gKlxuICogVXNlZCBhdXRvbWF0aWNhbGx5IGJ5IGBib290c3RyYXBgLCBvciBjYW4gYmUgcGFzc2VkIHRvIHtAbGluayBQbGF0Zm9ybVJlZi5hcHBsaWNhdGlvbn0uXG4gKi9cbmV4cG9ydCBjb25zdCBCUk9XU0VSX0FQUF9DT01NT05fUFJPVklERVJTOiBBcnJheTxhbnkgLypUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXSovPiA9IENPTlNUX0VYUFIoW1xuICBBUFBMSUNBVElPTl9DT01NT05fUFJPVklERVJTLFxuICBGT1JNX1BST1ZJREVSUyxcbiAgbmV3IFByb3ZpZGVyKFBMQVRGT1JNX1BJUEVTLCB7dXNlVmFsdWU6IENPTU1PTl9QSVBFUywgbXVsdGk6IHRydWV9KSxcbiAgbmV3IFByb3ZpZGVyKFBMQVRGT1JNX0RJUkVDVElWRVMsIHt1c2VWYWx1ZTogQ09NTU9OX0RJUkVDVElWRVMsIG11bHRpOiB0cnVlfSksXG4gIG5ldyBQcm92aWRlcihFeGNlcHRpb25IYW5kbGVyLCB7dXNlRmFjdG9yeTogX2V4Y2VwdGlvbkhhbmRsZXIsIGRlcHM6IFtdfSksXG4gIG5ldyBQcm92aWRlcihET0NVTUVOVCwge3VzZUZhY3Rvcnk6IF9kb2N1bWVudCwgZGVwczogW119KSxcbiAgbmV3IFByb3ZpZGVyKEVWRU5UX01BTkFHRVJfUExVR0lOUywge3VzZUNsYXNzOiBEb21FdmVudHNQbHVnaW4sIG11bHRpOiB0cnVlfSksXG4gIG5ldyBQcm92aWRlcihFVkVOVF9NQU5BR0VSX1BMVUdJTlMsIHt1c2VDbGFzczogS2V5RXZlbnRzUGx1Z2luLCBtdWx0aTogdHJ1ZX0pLFxuICBuZXcgUHJvdmlkZXIoRVZFTlRfTUFOQUdFUl9QTFVHSU5TLCB7dXNlQ2xhc3M6IEhhbW1lckdlc3R1cmVzUGx1Z2luLCBtdWx0aTogdHJ1ZX0pLFxuICBuZXcgUHJvdmlkZXIoRG9tUmVuZGVyZXIsIHt1c2VDbGFzczogRG9tUmVuZGVyZXJffSksXG4gIG5ldyBQcm92aWRlcihSZW5kZXJlciwge3VzZUV4aXN0aW5nOiBEb21SZW5kZXJlcn0pLFxuICBuZXcgUHJvdmlkZXIoU2hhcmVkU3R5bGVzSG9zdCwge3VzZUV4aXN0aW5nOiBEb21TaGFyZWRTdHlsZXNIb3N0fSksXG4gIERvbVNoYXJlZFN0eWxlc0hvc3QsXG4gIFRlc3RhYmlsaXR5LFxuICBCcm93c2VyRGV0YWlscyxcbiAgQW5pbWF0aW9uQnVpbGRlcixcbiAgRXZlbnRNYW5hZ2VyXG5dKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGluaXREb21BZGFwdGVyKCkge1xuICBCcm93c2VyRG9tQWRhcHRlci5tYWtlQ3VycmVudCgpO1xuICB3dGZJbml0KCk7XG4gIEJyb3dzZXJHZXRUZXN0YWJpbGl0eS5pbml0KCk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlcl9jb21tb24udHNcbiAqKi8iLCJpbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtFdmVudE1hbmFnZXJQbHVnaW4sIEV2ZW50TWFuYWdlcn0gZnJvbSAnLi9ldmVudF9tYW5hZ2VyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvbUV2ZW50c1BsdWdpbiBleHRlbmRzIEV2ZW50TWFuYWdlclBsdWdpbiB7XG4gIG1hbmFnZXI6IEV2ZW50TWFuYWdlcjtcblxuICAvLyBUaGlzIHBsdWdpbiBzaG91bGQgY29tZSBsYXN0IGluIHRoZSBsaXN0IG9mIHBsdWdpbnMsIGJlY2F1c2UgaXQgYWNjZXB0cyBhbGxcbiAgLy8gZXZlbnRzLlxuICBzdXBwb3J0cyhldmVudE5hbWU6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdHJ1ZTsgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbikge1xuICAgIHZhciB6b25lID0gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKTtcbiAgICB2YXIgb3V0c2lkZUhhbmRsZXIgPSAoZXZlbnQpID0+IHpvbmUucnVuKCgpID0+IGhhbmRsZXIoZXZlbnQpKTtcbiAgICB0aGlzLm1hbmFnZXIuZ2V0Wm9uZSgpLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHsgRE9NLm9uKGVsZW1lbnQsIGV2ZW50TmFtZSwgb3V0c2lkZUhhbmRsZXIpOyB9KTtcbiAgfVxuXG4gIGFkZEdsb2JhbEV2ZW50TGlzdGVuZXIodGFyZ2V0OiBzdHJpbmcsIGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiBGdW5jdGlvbik6IEZ1bmN0aW9uIHtcbiAgICB2YXIgZWxlbWVudCA9IERPTS5nZXRHbG9iYWxFdmVudFRhcmdldCh0YXJnZXQpO1xuICAgIHZhciB6b25lID0gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKTtcbiAgICB2YXIgb3V0c2lkZUhhbmRsZXIgPSAoZXZlbnQpID0+IHpvbmUucnVuKCgpID0+IGhhbmRsZXIoZXZlbnQpKTtcbiAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKS5ydW5PdXRzaWRlQW5ndWxhcihcbiAgICAgICAgKCkgPT4geyByZXR1cm4gRE9NLm9uQW5kQ2FuY2VsKGVsZW1lbnQsIGV2ZW50TmFtZSwgb3V0c2lkZUhhbmRsZXIpOyB9KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvZG9tX2V2ZW50cy50c1xuICoqLyIsImltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0LCBPcGFxdWVUb2tlbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtOZ1pvbmV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3pvbmUvbmdfem9uZSc7XG5pbXBvcnQge0xpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5leHBvcnQgY29uc3QgRVZFTlRfTUFOQUdFUl9QTFVHSU5TOiBPcGFxdWVUb2tlbiA9XG4gICAgQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oXCJFdmVudE1hbmFnZXJQbHVnaW5zXCIpKTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEV2ZW50TWFuYWdlciB7XG4gIHByaXZhdGUgX3BsdWdpbnM6IEV2ZW50TWFuYWdlclBsdWdpbltdO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoRVZFTlRfTUFOQUdFUl9QTFVHSU5TKSBwbHVnaW5zOiBFdmVudE1hbmFnZXJQbHVnaW5bXSwgcHJpdmF0ZSBfem9uZTogTmdab25lKSB7XG4gICAgcGx1Z2lucy5mb3JFYWNoKHAgPT4gcC5tYW5hZ2VyID0gdGhpcyk7XG4gICAgdGhpcy5fcGx1Z2lucyA9IExpc3RXcmFwcGVyLnJldmVyc2VkKHBsdWdpbnMpO1xuICB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSB7XG4gICAgdmFyIHBsdWdpbiA9IHRoaXMuX2ZpbmRQbHVnaW5Gb3IoZXZlbnROYW1lKTtcbiAgICBwbHVnaW4uYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpO1xuICB9XG5cbiAgYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0YXJnZXQ6IHN0cmluZywgZXZlbnROYW1lOiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKTogRnVuY3Rpb24ge1xuICAgIHZhciBwbHVnaW4gPSB0aGlzLl9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZSk7XG4gICAgcmV0dXJuIHBsdWdpbi5hZGRHbG9iYWxFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnROYW1lLCBoYW5kbGVyKTtcbiAgfVxuXG4gIGdldFpvbmUoKTogTmdab25lIHsgcmV0dXJuIHRoaXMuX3pvbmU7IH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZTogc3RyaW5nKTogRXZlbnRNYW5hZ2VyUGx1Z2luIHtcbiAgICB2YXIgcGx1Z2lucyA9IHRoaXMuX3BsdWdpbnM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwbHVnaW5zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgcGx1Z2luID0gcGx1Z2luc1tpXTtcbiAgICAgIGlmIChwbHVnaW4uc3VwcG9ydHMoZXZlbnROYW1lKSkge1xuICAgICAgICByZXR1cm4gcGx1Z2luO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgTm8gZXZlbnQgbWFuYWdlciBwbHVnaW4gZm91bmQgZm9yIGV2ZW50ICR7ZXZlbnROYW1lfWApO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFdmVudE1hbmFnZXJQbHVnaW4ge1xuICBtYW5hZ2VyOiBFdmVudE1hbmFnZXI7XG5cbiAgLy8gVGhhdCBpcyBlcXVpdmFsZW50IHRvIGhhdmluZyBzdXBwb3J0aW5nICRldmVudC50YXJnZXRcbiAgc3VwcG9ydHMoZXZlbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIGZhbHNlOyB9XG5cbiAgYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50OiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGhhbmRsZXI6IEZ1bmN0aW9uKSB7XG4gICAgdGhyb3cgXCJub3QgaW1wbGVtZW50ZWRcIjtcbiAgfVxuXG4gIGFkZEdsb2JhbEV2ZW50TGlzdGVuZXIoZWxlbWVudDogc3RyaW5nLCBldmVudE5hbWU6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pOiBGdW5jdGlvbiB7XG4gICAgdGhyb3cgXCJub3QgaW1wbGVtZW50ZWRcIjtcbiAgfVxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZXZlbnRzL2V2ZW50X21hbmFnZXIudHNcbiAqKi8iLCJpbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5pbXBvcnQge1xuICBpc1ByZXNlbnQsXG4gIGlzQmxhbmssXG4gIFN0cmluZ1dyYXBwZXIsXG4gIFJlZ0V4cFdyYXBwZXIsXG4gIE51bWJlcldyYXBwZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7U3RyaW5nTWFwV3JhcHBlciwgTGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0V2ZW50TWFuYWdlclBsdWdpbn0gZnJvbSAnLi9ldmVudF9tYW5hZ2VyJztcbmltcG9ydCB7Tmdab25lfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS96b25lL25nX3pvbmUnO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5cbnZhciBtb2RpZmllcktleXMgPSBbJ2FsdCcsICdjb250cm9sJywgJ21ldGEnLCAnc2hpZnQnXTtcbnZhciBtb2RpZmllcktleUdldHRlcnM6IHtba2V5OiBzdHJpbmddOiAoZXZlbnQ6IEtleWJvYXJkRXZlbnQpID0+IGJvb2xlYW59ID0ge1xuICAnYWx0JzogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBldmVudC5hbHRLZXksXG4gICdjb250cm9sJzogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBldmVudC5jdHJsS2V5LFxuICAnbWV0YSc6IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gZXZlbnQubWV0YUtleSxcbiAgJ3NoaWZ0JzogKGV2ZW50OiBLZXlib2FyZEV2ZW50KSA9PiBldmVudC5zaGlmdEtleVxufTtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEtleUV2ZW50c1BsdWdpbiBleHRlbmRzIEV2ZW50TWFuYWdlclBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XG5cbiAgc3VwcG9ydHMoZXZlbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KEtleUV2ZW50c1BsdWdpbi5wYXJzZUV2ZW50TmFtZShldmVudE5hbWUpKTtcbiAgfVxuXG4gIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudDogSFRNTEVsZW1lbnQsIGV2ZW50TmFtZTogc3RyaW5nLCBoYW5kbGVyOiAoRXZlbnQ6IGFueSkgPT4gYW55KSB7XG4gICAgdmFyIHBhcnNlZEV2ZW50ID0gS2V5RXZlbnRzUGx1Z2luLnBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSk7XG5cbiAgICB2YXIgb3V0c2lkZUhhbmRsZXIgPSBLZXlFdmVudHNQbHVnaW4uZXZlbnRDYWxsYmFjayhcbiAgICAgICAgZWxlbWVudCwgU3RyaW5nTWFwV3JhcHBlci5nZXQocGFyc2VkRXZlbnQsICdmdWxsS2V5JyksIGhhbmRsZXIsIHRoaXMubWFuYWdlci5nZXRab25lKCkpO1xuXG4gICAgdGhpcy5tYW5hZ2VyLmdldFpvbmUoKS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICBET00ub24oZWxlbWVudCwgU3RyaW5nTWFwV3JhcHBlci5nZXQocGFyc2VkRXZlbnQsICdkb21FdmVudE5hbWUnKSwgb3V0c2lkZUhhbmRsZXIpO1xuICAgIH0pO1xuICB9XG5cbiAgc3RhdGljIHBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZTogc3RyaW5nKToge1trZXk6IHN0cmluZ106IHN0cmluZ30ge1xuICAgIHZhciBwYXJ0czogc3RyaW5nW10gPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKS5zcGxpdCgnLicpO1xuXG4gICAgdmFyIGRvbUV2ZW50TmFtZSA9IHBhcnRzLnNoaWZ0KCk7XG4gICAgaWYgKChwYXJ0cy5sZW5ndGggPT09IDApIHx8XG4gICAgICAgICEoU3RyaW5nV3JhcHBlci5lcXVhbHMoZG9tRXZlbnROYW1lLCAna2V5ZG93bicpIHx8XG4gICAgICAgICAgU3RyaW5nV3JhcHBlci5lcXVhbHMoZG9tRXZlbnROYW1lLCAna2V5dXAnKSkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHZhciBrZXkgPSBLZXlFdmVudHNQbHVnaW4uX25vcm1hbGl6ZUtleShwYXJ0cy5wb3AoKSk7XG5cbiAgICB2YXIgZnVsbEtleSA9ICcnO1xuICAgIG1vZGlmaWVyS2V5cy5mb3JFYWNoKG1vZGlmaWVyTmFtZSA9PiB7XG4gICAgICBpZiAoTGlzdFdyYXBwZXIuY29udGFpbnMocGFydHMsIG1vZGlmaWVyTmFtZSkpIHtcbiAgICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlKHBhcnRzLCBtb2RpZmllck5hbWUpO1xuICAgICAgICBmdWxsS2V5ICs9IG1vZGlmaWVyTmFtZSArICcuJztcbiAgICAgIH1cbiAgICB9KTtcbiAgICBmdWxsS2V5ICs9IGtleTtcblxuICAgIGlmIChwYXJ0cy5sZW5ndGggIT0gMCB8fCBrZXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAvLyByZXR1cm5pbmcgbnVsbCBpbnN0ZWFkIG9mIHRocm93aW5nIHRvIGxldCBhbm90aGVyIHBsdWdpbiBwcm9jZXNzIHRoZSBldmVudFxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHZhciByZXN1bHQgPSBTdHJpbmdNYXBXcmFwcGVyLmNyZWF0ZSgpO1xuICAgIFN0cmluZ01hcFdyYXBwZXIuc2V0KHJlc3VsdCwgJ2RvbUV2ZW50TmFtZScsIGRvbUV2ZW50TmFtZSk7XG4gICAgU3RyaW5nTWFwV3JhcHBlci5zZXQocmVzdWx0LCAnZnVsbEtleScsIGZ1bGxLZXkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdGF0aWMgZ2V0RXZlbnRGdWxsS2V5KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogc3RyaW5nIHtcbiAgICB2YXIgZnVsbEtleSA9ICcnO1xuICAgIHZhciBrZXkgPSBET00uZ2V0RXZlbnRLZXkoZXZlbnQpO1xuICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChTdHJpbmdXcmFwcGVyLmVxdWFscyhrZXksICcgJykpIHtcbiAgICAgIGtleSA9ICdzcGFjZSc7ICAvLyBmb3IgcmVhZGFiaWxpdHlcbiAgICB9IGVsc2UgaWYgKFN0cmluZ1dyYXBwZXIuZXF1YWxzKGtleSwgJy4nKSkge1xuICAgICAga2V5ID0gJ2RvdCc7ICAvLyBiZWNhdXNlICcuJyBpcyB1c2VkIGFzIGEgc2VwYXJhdG9yIGluIGV2ZW50IG5hbWVzXG4gICAgfVxuICAgIG1vZGlmaWVyS2V5cy5mb3JFYWNoKG1vZGlmaWVyTmFtZSA9PiB7XG4gICAgICBpZiAobW9kaWZpZXJOYW1lICE9IGtleSkge1xuICAgICAgICB2YXIgbW9kaWZpZXJHZXR0ZXIgPSBTdHJpbmdNYXBXcmFwcGVyLmdldChtb2RpZmllcktleUdldHRlcnMsIG1vZGlmaWVyTmFtZSk7XG4gICAgICAgIGlmIChtb2RpZmllckdldHRlcihldmVudCkpIHtcbiAgICAgICAgICBmdWxsS2V5ICs9IG1vZGlmaWVyTmFtZSArICcuJztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bGxLZXkgKz0ga2V5O1xuICAgIHJldHVybiBmdWxsS2V5O1xuICB9XG5cbiAgc3RhdGljIGV2ZW50Q2FsbGJhY2soZWxlbWVudDogSFRNTEVsZW1lbnQsIGZ1bGxLZXk6IGFueSwgaGFuZGxlcjogKGU6IEV2ZW50KSA9PiBhbnksXG4gICAgICAgICAgICAgICAgICAgICAgIHpvbmU6IE5nWm9uZSk6IChldmVudDogS2V5Ym9hcmRFdmVudCkgPT4gdm9pZCB7XG4gICAgcmV0dXJuIChldmVudCkgPT4ge1xuICAgICAgaWYgKFN0cmluZ1dyYXBwZXIuZXF1YWxzKEtleUV2ZW50c1BsdWdpbi5nZXRFdmVudEZ1bGxLZXkoZXZlbnQpLCBmdWxsS2V5KSkge1xuICAgICAgICB6b25lLnJ1bigoKSA9PiBoYW5kbGVyKGV2ZW50KSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgc3RhdGljIF9ub3JtYWxpemVLZXkoa2V5TmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAvLyBUT0RPOiBzd2l0Y2ggdG8gYSBTdHJpbmdNYXAgaWYgdGhlIG1hcHBpbmcgZ3Jvd3MgdG9vIG11Y2hcbiAgICBzd2l0Y2ggKGtleU5hbWUpIHtcbiAgICAgIGNhc2UgJ2VzYyc6XG4gICAgICAgIHJldHVybiAnZXNjYXBlJztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBrZXlOYW1lO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMva2V5X2V2ZW50cy50c1xuICoqLyIsImltcG9ydCB7SGFtbWVyR2VzdHVyZXNQbHVnaW5Db21tb259IGZyb20gJy4vaGFtbWVyX2NvbW1vbic7XG5pbXBvcnQge2lzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSGFtbWVyR2VzdHVyZXNQbHVnaW4gZXh0ZW5kcyBIYW1tZXJHZXN0dXJlc1BsdWdpbkNvbW1vbiB7XG4gIHN1cHBvcnRzKGV2ZW50TmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgaWYgKCFzdXBlci5zdXBwb3J0cyhldmVudE5hbWUpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZiAoIWlzUHJlc2VudCh3aW5kb3dbJ0hhbW1lciddKSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYEhhbW1lci5qcyBpcyBub3QgbG9hZGVkLCBjYW4gbm90IGJpbmQgJHtldmVudE5hbWV9IGV2ZW50YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgaGFuZGxlcjogRnVuY3Rpb24pIHtcbiAgICB2YXIgem9uZSA9IHRoaXMubWFuYWdlci5nZXRab25lKCk7XG4gICAgZXZlbnROYW1lID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgICB6b25lLnJ1bk91dHNpZGVBbmd1bGFyKGZ1bmN0aW9uKCkge1xuICAgICAgLy8gQ3JlYXRpbmcgdGhlIG1hbmFnZXIgYmluZCBldmVudHMsIG11c3QgYmUgZG9uZSBvdXRzaWRlIG9mIGFuZ3VsYXJcbiAgICAgIHZhciBtYyA9IG5ldyBIYW1tZXIoZWxlbWVudCk7XG4gICAgICBtYy5nZXQoJ3BpbmNoJykuc2V0KHtlbmFibGU6IHRydWV9KTtcbiAgICAgIG1jLmdldCgncm90YXRlJykuc2V0KHtlbmFibGU6IHRydWV9KTtcblxuICAgICAgbWMub24oZXZlbnROYW1lLCBmdW5jdGlvbihldmVudE9iaikgeyB6b25lLnJ1bihmdW5jdGlvbigpIHsgaGFuZGxlcihldmVudE9iaik7IH0pOyB9KTtcbiAgICB9KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvaGFtbWVyX2dlc3R1cmVzLnRzXG4gKiovIiwiaW1wb3J0IHtFdmVudE1hbmFnZXJQbHVnaW59IGZyb20gJy4vZXZlbnRfbWFuYWdlcic7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbnZhciBfZXZlbnROYW1lcyA9IHtcbiAgLy8gcGFuXG4gICdwYW4nOiB0cnVlLFxuICAncGFuc3RhcnQnOiB0cnVlLFxuICAncGFubW92ZSc6IHRydWUsXG4gICdwYW5lbmQnOiB0cnVlLFxuICAncGFuY2FuY2VsJzogdHJ1ZSxcbiAgJ3BhbmxlZnQnOiB0cnVlLFxuICAncGFucmlnaHQnOiB0cnVlLFxuICAncGFudXAnOiB0cnVlLFxuICAncGFuZG93bic6IHRydWUsXG4gIC8vIHBpbmNoXG4gICdwaW5jaCc6IHRydWUsXG4gICdwaW5jaHN0YXJ0JzogdHJ1ZSxcbiAgJ3BpbmNobW92ZSc6IHRydWUsXG4gICdwaW5jaGVuZCc6IHRydWUsXG4gICdwaW5jaGNhbmNlbCc6IHRydWUsXG4gICdwaW5jaGluJzogdHJ1ZSxcbiAgJ3BpbmNob3V0JzogdHJ1ZSxcbiAgLy8gcHJlc3NcbiAgJ3ByZXNzJzogdHJ1ZSxcbiAgJ3ByZXNzdXAnOiB0cnVlLFxuICAvLyByb3RhdGVcbiAgJ3JvdGF0ZSc6IHRydWUsXG4gICdyb3RhdGVzdGFydCc6IHRydWUsXG4gICdyb3RhdGVtb3ZlJzogdHJ1ZSxcbiAgJ3JvdGF0ZWVuZCc6IHRydWUsXG4gICdyb3RhdGVjYW5jZWwnOiB0cnVlLFxuICAvLyBzd2lwZVxuICAnc3dpcGUnOiB0cnVlLFxuICAnc3dpcGVsZWZ0JzogdHJ1ZSxcbiAgJ3N3aXBlcmlnaHQnOiB0cnVlLFxuICAnc3dpcGV1cCc6IHRydWUsXG4gICdzd2lwZWRvd24nOiB0cnVlLFxuICAvLyB0YXBcbiAgJ3RhcCc6IHRydWUsXG59O1xuXG5cbmV4cG9ydCBjbGFzcyBIYW1tZXJHZXN0dXJlc1BsdWdpbkNvbW1vbiBleHRlbmRzIEV2ZW50TWFuYWdlclBsdWdpbiB7XG4gIGNvbnN0cnVjdG9yKCkgeyBzdXBlcigpOyB9XG5cbiAgc3VwcG9ydHMoZXZlbnROYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBldmVudE5hbWUgPSBldmVudE5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyhfZXZlbnROYW1lcywgZXZlbnROYW1lKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvaGFtbWVyX2NvbW1vbi50c1xuICoqLyIsImltcG9ydCB7T3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLyoqXG4gKiBBIERJIFRva2VuIHJlcHJlc2VudGluZyB0aGUgbWFpbiByZW5kZXJpbmcgY29udGV4dC4gSW4gYSBicm93c2VyIHRoaXMgaXMgdGhlIERPTSBEb2N1bWVudC5cbiAqXG4gKiBOb3RlOiBEb2N1bWVudCBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBBcHBsaWNhdGlvbiBDb250ZXh0IHdoZW4gQXBwbGljYXRpb24gYW5kIFJlbmRlcmluZ1xuICogQ29udGV4dHMgYXJlIG5vdCB0aGUgc2FtZSAoZS5nLiB3aGVuIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uIGludG8gYSBXZWIgV29ya2VyKS5cbiAqL1xuZXhwb3J0IGNvbnN0IERPQ1VNRU5UOiBPcGFxdWVUb2tlbiA9IENPTlNUX0VYUFIobmV3IE9wYXF1ZVRva2VuKCdEb2N1bWVudFRva2VuJykpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fdG9rZW5zLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3QsIEluamVjdGFibGUsIE9wYXF1ZVRva2VufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9hbmltYXRlL2FuaW1hdGlvbl9idWlsZGVyJztcbmltcG9ydCB7XG4gIGlzUHJlc2VudCxcbiAgaXNCbGFuayxcbiAgSnNvbixcbiAgUmVnRXhwV3JhcHBlcixcbiAgQ09OU1RfRVhQUixcbiAgc3RyaW5naWZ5LFxuICBTdHJpbmdXcmFwcGVyXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7RG9tU2hhcmVkU3R5bGVzSG9zdH0gZnJvbSAnLi9zaGFyZWRfc3R5bGVzX2hvc3QnO1xuaW1wb3J0IHtXdGZTY29wZUZuLCB3dGZMZWF2ZSwgd3RmQ3JlYXRlU2NvcGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3Byb2ZpbGUvcHJvZmlsZSc7XG5cbmltcG9ydCB7XG4gIFJlbmRlcmVyLFxuICBSZW5kZXJQcm90b1ZpZXdSZWYsXG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlckVsZW1lbnRSZWYsXG4gIFJlbmRlckZyYWdtZW50UmVmLFxuICBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyxcbiAgUmVuZGVyVGVtcGxhdGVDbWQsXG4gIFJlbmRlckV2ZW50RGlzcGF0Y2hlcixcbiAgUmVuZGVyQ29tcG9uZW50VGVtcGxhdGVcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmltcG9ydCB7RXZlbnRNYW5hZ2VyfSBmcm9tICcuL2V2ZW50cy9ldmVudF9tYW5hZ2VyJztcblxuaW1wb3J0IHtET0NVTUVOVH0gZnJvbSAnLi9kb21fdG9rZW5zJztcbmltcG9ydCB7XG4gIGNyZWF0ZVJlbmRlclZpZXcsXG4gIE5vZGVGYWN0b3J5LFxuICBlbmNhcHN1bGF0ZVN0eWxlc1xufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvdmlld19mYWN0b3J5JztcbmltcG9ydCB7XG4gIERlZmF1bHRSZW5kZXJWaWV3LFxuICBEZWZhdWx0UmVuZGVyRnJhZ21lbnRSZWYsXG4gIERlZmF1bHRQcm90b1ZpZXdSZWZcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL3ZpZXcnO1xuaW1wb3J0IHtWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbWV0YWRhdGEnO1xuaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtjYW1lbENhc2VUb0Rhc2hDYXNlfSBmcm9tICcuL3V0aWwnO1xuXG5jb25zdCBOQU1FU1BBQ0VfVVJJUyA9XG4gICAgQ09OU1RfRVhQUih7J3hsaW5rJzogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLCAnc3ZnJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJ30pO1xuY29uc3QgVEVNUExBVEVfQ09NTUVOVF9URVhUID0gJ3RlbXBsYXRlIGJpbmRpbmdzPXt9JztcbnZhciBURU1QTEFURV9CSU5ESU5HU19FWFAgPSAvXnRlbXBsYXRlIGJpbmRpbmdzPSguKikkL2c7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBEb21SZW5kZXJlciBleHRlbmRzIFJlbmRlcmVyIGltcGxlbWVudHMgTm9kZUZhY3Rvcnk8Tm9kZT4ge1xuICBhYnN0cmFjdCByZWdpc3RlckNvbXBvbmVudFRlbXBsYXRlKHRlbXBsYXRlOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSk7XG5cbiAgYWJzdHJhY3QgcmVzb2x2ZUNvbXBvbmVudFRlbXBsYXRlKHRlbXBsYXRlSWQ6IHN0cmluZyk6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlO1xuXG4gIGFic3RyYWN0IGNyZWF0ZVByb3RvVmlldyhjb21wb25lbnRUZW1wbGF0ZUlkOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICBjbWRzOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKTogUmVuZGVyUHJvdG9WaWV3UmVmO1xuXG4gIGFic3RyYWN0IGNyZWF0ZVJvb3RIb3N0Vmlldyhob3N0UHJvdG9WaWV3UmVmOiBSZW5kZXJQcm90b1ZpZXdSZWYsIGZyYWdtZW50Q291bnQ6IG51bWJlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RFbGVtZW50U2VsZWN0b3I6IHN0cmluZyk6IFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzO1xuXG4gIGFic3RyYWN0IGNyZWF0ZVZpZXcocHJvdG9WaWV3UmVmOiBSZW5kZXJQcm90b1ZpZXdSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRDb3VudDogbnVtYmVyKTogUmVuZGVyVmlld1dpdGhGcmFnbWVudHM7XG5cbiAgYWJzdHJhY3QgZGVzdHJveVZpZXcodmlld1JlZjogUmVuZGVyVmlld1JlZik7XG5cbiAgYWJzdHJhY3QgY3JlYXRlUm9vdENvbnRlbnRJbnNlcnRpb25Qb2ludCgpO1xuXG4gIGdldE5hdGl2ZUVsZW1lbnRTeW5jKGxvY2F0aW9uOiBSZW5kZXJFbGVtZW50UmVmKTogYW55IHtcbiAgICByZXR1cm4gcmVzb2x2ZUludGVybmFsRG9tVmlldyhsb2NhdGlvbi5yZW5kZXJWaWV3KS5ib3VuZEVsZW1lbnRzW2xvY2F0aW9uLmJvdW5kRWxlbWVudEluZGV4XTtcbiAgfVxuXG4gIGdldFJvb3ROb2RlcyhmcmFnbWVudDogUmVuZGVyRnJhZ21lbnRSZWYpOiBOb2RlW10geyByZXR1cm4gcmVzb2x2ZUludGVybmFsRG9tRnJhZ21lbnQoZnJhZ21lbnQpOyB9XG5cbiAgYXR0YWNoRnJhZ21lbnRBZnRlckZyYWdtZW50KHByZXZpb3VzRnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmKSB7XG4gICAgdmFyIHByZXZpb3VzRnJhZ21lbnROb2RlcyA9IHJlc29sdmVJbnRlcm5hbERvbUZyYWdtZW50KHByZXZpb3VzRnJhZ21lbnRSZWYpO1xuICAgIGlmIChwcmV2aW91c0ZyYWdtZW50Tm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIHNpYmxpbmcgPSBwcmV2aW91c0ZyYWdtZW50Tm9kZXNbcHJldmlvdXNGcmFnbWVudE5vZGVzLmxlbmd0aCAtIDFdO1xuICAgICAgbGV0IG5vZGVzID0gcmVzb2x2ZUludGVybmFsRG9tRnJhZ21lbnQoZnJhZ21lbnRSZWYpO1xuICAgICAgbW92ZU5vZGVzQWZ0ZXJTaWJsaW5nKHNpYmxpbmcsIG5vZGVzKTtcbiAgICAgIHRoaXMuYW5pbWF0ZU5vZGVzRW50ZXIobm9kZXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBJdGVyYXRlcyB0aHJvdWdoIGFsbCBub2RlcyBiZWluZyBhZGRlZCB0byB0aGUgRE9NIGFuZCBhbmltYXRlcyB0aGVtIGlmIG5lY2Vzc2FyeVxuICAgKiBAcGFyYW0gbm9kZXNcbiAgICovXG4gIGFuaW1hdGVOb2Rlc0VudGVyKG5vZGVzOiBOb2RlW10pIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB0aGlzLmFuaW1hdGVOb2RlRW50ZXIobm9kZXNbaV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFuaW1hdGlvbnMgaWYgbmVjZXNzYXJ5XG4gICAqIEBwYXJhbSBub2RlXG4gICAqL1xuICBhYnN0cmFjdCBhbmltYXRlTm9kZUVudGVyKG5vZGU6IE5vZGUpO1xuXG4gIC8qKlxuICAgKiBJZiBhbmltYXRpb25zIGFyZSBuZWNlc3NhcnksIHBlcmZvcm1zIGFuaW1hdGlvbnMgdGhlbiByZW1vdmVzIHRoZSBlbGVtZW50OyBvdGhlcndpc2UsIGl0IGp1c3RcbiAgICogcmVtb3ZlcyB0aGUgZWxlbWVudC5cbiAgICogQHBhcmFtIG5vZGVcbiAgICovXG4gIGFic3RyYWN0IGFuaW1hdGVOb2RlTGVhdmUobm9kZTogTm9kZSk7XG5cbiAgYXR0YWNoRnJhZ21lbnRBZnRlckVsZW1lbnQoZWxlbWVudFJlZjogUmVuZGVyRWxlbWVudFJlZiwgZnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmKSB7XG4gICAgdmFyIHBhcmVudFZpZXcgPSByZXNvbHZlSW50ZXJuYWxEb21WaWV3KGVsZW1lbnRSZWYucmVuZGVyVmlldyk7XG4gICAgdmFyIGVsZW1lbnQgPSBwYXJlbnRWaWV3LmJvdW5kRWxlbWVudHNbZWxlbWVudFJlZi5ib3VuZEVsZW1lbnRJbmRleF07XG4gICAgdmFyIG5vZGVzID0gcmVzb2x2ZUludGVybmFsRG9tRnJhZ21lbnQoZnJhZ21lbnRSZWYpO1xuICAgIG1vdmVOb2Rlc0FmdGVyU2libGluZyhlbGVtZW50LCBub2Rlcyk7XG4gICAgdGhpcy5hbmltYXRlTm9kZXNFbnRlcihub2Rlcyk7XG4gIH1cblxuICBhYnN0cmFjdCBkZXRhY2hGcmFnbWVudChmcmFnbWVudFJlZjogUmVuZGVyRnJhZ21lbnRSZWYpO1xuXG4gIGh5ZHJhdGVWaWV3KHZpZXdSZWY6IFJlbmRlclZpZXdSZWYpIHsgcmVzb2x2ZUludGVybmFsRG9tVmlldyh2aWV3UmVmKS5oeWRyYXRlKCk7IH1cblxuICBkZWh5ZHJhdGVWaWV3KHZpZXdSZWY6IFJlbmRlclZpZXdSZWYpIHsgcmVzb2x2ZUludGVybmFsRG9tVmlldyh2aWV3UmVmKS5kZWh5ZHJhdGUoKTsgfVxuXG4gIGNyZWF0ZVRlbXBsYXRlQW5jaG9yKGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSk6IE5vZGUge1xuICAgIHJldHVybiBET00uY3JlYXRlQ29tbWVudChURU1QTEFURV9DT01NRU5UX1RFWFQpO1xuICB9XG4gIGFic3RyYWN0IGNyZWF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10pOiBOb2RlO1xuICBhYnN0cmFjdCBtZXJnZUVsZW1lbnQoZXhpc3Rpbmc6IE5vZGUsIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSk7XG4gIGFic3RyYWN0IGNyZWF0ZVNoYWRvd1Jvb3QoaG9zdDogTm9kZSwgdGVtcGxhdGVJZDogc3RyaW5nKTogTm9kZTtcbiAgY3JlYXRlVGV4dCh2YWx1ZTogc3RyaW5nKTogTm9kZSB7IHJldHVybiBET00uY3JlYXRlVGV4dE5vZGUoaXNQcmVzZW50KHZhbHVlKSA/IHZhbHVlIDogJycpOyB9XG4gIGFwcGVuZENoaWxkKHBhcmVudDogTm9kZSwgY2hpbGQ6IE5vZGUpIHsgRE9NLmFwcGVuZENoaWxkKHBhcmVudCwgY2hpbGQpOyB9XG4gIGFic3RyYWN0IG9uKGVsZW1lbnQ6IE5vZGUsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pO1xuICBhYnN0cmFjdCBnbG9iYWxPbih0YXJnZXQ6IHN0cmluZywgZXZlbnROYW1lOiBzdHJpbmcsIGNhbGxiYWNrOiBGdW5jdGlvbik6IEZ1bmN0aW9uO1xuXG4gIHNldEVsZW1lbnRQcm9wZXJ0eShsb2NhdGlvbjogUmVuZGVyRWxlbWVudFJlZiwgcHJvcGVydHlOYW1lOiBzdHJpbmcsIHByb3BlcnR5VmFsdWU6IGFueSk6IHZvaWQge1xuICAgIHZhciB2aWV3ID0gcmVzb2x2ZUludGVybmFsRG9tVmlldyhsb2NhdGlvbi5yZW5kZXJWaWV3KTtcbiAgICBET00uc2V0UHJvcGVydHkoPEVsZW1lbnQ+dmlldy5ib3VuZEVsZW1lbnRzW2xvY2F0aW9uLmJvdW5kRWxlbWVudEluZGV4XSwgcHJvcGVydHlOYW1lLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eVZhbHVlKTtcbiAgfVxuXG4gIHNldEVsZW1lbnRBdHRyaWJ1dGUobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIGF0dHJpYnV0ZU5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVWYWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgdmFyIHZpZXcgPSByZXNvbHZlSW50ZXJuYWxEb21WaWV3KGxvY2F0aW9uLnJlbmRlclZpZXcpO1xuICAgIHZhciBlbGVtZW50ID0gdmlldy5ib3VuZEVsZW1lbnRzW2xvY2F0aW9uLmJvdW5kRWxlbWVudEluZGV4XTtcbiAgICBpZiAoaXNQcmVzZW50KGF0dHJpYnV0ZVZhbHVlKSkge1xuICAgICAgRE9NLnNldEF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVOYW1lLCBzdHJpbmdpZnkoYXR0cmlidXRlVmFsdWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgRE9NLnJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGVOYW1lKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlZCBvbmx5IGluIGRlYnVnIG1vZGUgdG8gc2VyaWFsaXplIHByb3BlcnR5IGNoYW5nZXMgdG8gY29tbWVudCBub2RlcyxcbiAgICogc3VjaCBhcyA8dGVtcGxhdGU+IHBsYWNlaG9sZGVycy5cbiAgICovXG4gIHNldEJpbmRpbmdEZWJ1Z0luZm8obG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIHByb3BlcnR5TmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5VmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHZhciB2aWV3OiBEZWZhdWx0UmVuZGVyVmlldzxOb2RlPiA9IHJlc29sdmVJbnRlcm5hbERvbVZpZXcobG9jYXRpb24ucmVuZGVyVmlldyk7XG4gICAgdmFyIGVsZW1lbnQgPSB2aWV3LmJvdW5kRWxlbWVudHNbbG9jYXRpb24uYm91bmRFbGVtZW50SW5kZXhdO1xuICAgIHZhciBkYXNoQ2FzZWRQcm9wZXJ0eU5hbWUgPSBjYW1lbENhc2VUb0Rhc2hDYXNlKHByb3BlcnR5TmFtZSk7XG4gICAgaWYgKERPTS5pc0NvbW1lbnROb2RlKGVsZW1lbnQpKSB7XG4gICAgICB2YXIgZXhpc3RpbmdCaW5kaW5ncyA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChcbiAgICAgICAgICBURU1QTEFURV9CSU5ESU5HU19FWFAsIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChET00uZ2V0VGV4dChlbGVtZW50KSwgL1xcbi9nLCAnJykpO1xuICAgICAgdmFyIHBhcnNlZEJpbmRpbmdzID0gSnNvbi5wYXJzZShleGlzdGluZ0JpbmRpbmdzWzFdKTtcbiAgICAgIHBhcnNlZEJpbmRpbmdzW2Rhc2hDYXNlZFByb3BlcnR5TmFtZV0gPSBwcm9wZXJ0eVZhbHVlO1xuICAgICAgRE9NLnNldFRleHQoZWxlbWVudCwgU3RyaW5nV3JhcHBlci5yZXBsYWNlKFRFTVBMQVRFX0NPTU1FTlRfVEVYVCwgJ3t9JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKc29uLnN0cmluZ2lmeShwYXJzZWRCaW5kaW5ncykpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zZXRFbGVtZW50QXR0cmlidXRlKGxvY2F0aW9uLCBwcm9wZXJ0eU5hbWUsIHByb3BlcnR5VmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHNldEVsZW1lbnRDbGFzcyhsb2NhdGlvbjogUmVuZGVyRWxlbWVudFJlZiwgY2xhc3NOYW1lOiBzdHJpbmcsIGlzQWRkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdmFyIHZpZXcgPSByZXNvbHZlSW50ZXJuYWxEb21WaWV3KGxvY2F0aW9uLnJlbmRlclZpZXcpO1xuICAgIHZhciBlbGVtZW50ID0gdmlldy5ib3VuZEVsZW1lbnRzW2xvY2F0aW9uLmJvdW5kRWxlbWVudEluZGV4XTtcbiAgICBpZiAoaXNBZGQpIHtcbiAgICAgIERPTS5hZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBET00ucmVtb3ZlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lKTtcbiAgICB9XG4gIH1cblxuICBzZXRFbGVtZW50U3R5bGUobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIHN0eWxlTmFtZTogc3RyaW5nLCBzdHlsZVZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB2YXIgdmlldyA9IHJlc29sdmVJbnRlcm5hbERvbVZpZXcobG9jYXRpb24ucmVuZGVyVmlldyk7XG4gICAgdmFyIGVsZW1lbnQgPSB2aWV3LmJvdW5kRWxlbWVudHNbbG9jYXRpb24uYm91bmRFbGVtZW50SW5kZXhdO1xuICAgIGlmIChpc1ByZXNlbnQoc3R5bGVWYWx1ZSkpIHtcbiAgICAgIERPTS5zZXRTdHlsZShlbGVtZW50LCBzdHlsZU5hbWUsIHN0cmluZ2lmeShzdHlsZVZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIERPTS5yZW1vdmVTdHlsZShlbGVtZW50LCBzdHlsZU5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGludm9rZUVsZW1lbnRNZXRob2QobG9jYXRpb246IFJlbmRlckVsZW1lbnRSZWYsIG1ldGhvZE5hbWU6IHN0cmluZywgYXJnczogYW55W10pOiB2b2lkIHtcbiAgICB2YXIgdmlldyA9IHJlc29sdmVJbnRlcm5hbERvbVZpZXcobG9jYXRpb24ucmVuZGVyVmlldyk7XG4gICAgdmFyIGVsZW1lbnQgPSA8RWxlbWVudD52aWV3LmJvdW5kRWxlbWVudHNbbG9jYXRpb24uYm91bmRFbGVtZW50SW5kZXhdO1xuICAgIERPTS5pbnZva2UoZWxlbWVudCwgbWV0aG9kTmFtZSwgYXJncyk7XG4gIH1cblxuICBzZXRUZXh0KHZpZXdSZWY6IFJlbmRlclZpZXdSZWYsIHRleHROb2RlSW5kZXg6IG51bWJlciwgdGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdmFyIHZpZXcgPSByZXNvbHZlSW50ZXJuYWxEb21WaWV3KHZpZXdSZWYpO1xuICAgIERPTS5zZXRUZXh0KHZpZXcuYm91bmRUZXh0Tm9kZXNbdGV4dE5vZGVJbmRleF0sIHRleHQpO1xuICB9XG5cbiAgc2V0RXZlbnREaXNwYXRjaGVyKHZpZXdSZWY6IFJlbmRlclZpZXdSZWYsIGRpc3BhdGNoZXI6IFJlbmRlckV2ZW50RGlzcGF0Y2hlcik6IHZvaWQge1xuICAgIHJlc29sdmVJbnRlcm5hbERvbVZpZXcodmlld1JlZikuc2V0RXZlbnREaXNwYXRjaGVyKGRpc3BhdGNoZXIpO1xuICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEb21SZW5kZXJlcl8gZXh0ZW5kcyBEb21SZW5kZXJlciB7XG4gIHByaXZhdGUgX2NvbXBvbmVudFRwbHM6IE1hcDxzdHJpbmcsIFJlbmRlckNvbXBvbmVudFRlbXBsYXRlPiA9XG4gICAgICBuZXcgTWFwPHN0cmluZywgUmVuZGVyQ29tcG9uZW50VGVtcGxhdGU+KCk7XG4gIHByaXZhdGUgX2RvY3VtZW50O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2V2ZW50TWFuYWdlcjogRXZlbnRNYW5hZ2VyLFxuICAgICAgICAgICAgICBwcml2YXRlIF9kb21TaGFyZWRTdHlsZXNIb3N0OiBEb21TaGFyZWRTdHlsZXNIb3N0LCBwcml2YXRlIF9hbmltYXRlOiBBbmltYXRpb25CdWlsZGVyLFxuICAgICAgICAgICAgICBASW5qZWN0KERPQ1VNRU5UKSBkb2N1bWVudCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDtcbiAgfVxuXG4gIHJlZ2lzdGVyQ29tcG9uZW50VGVtcGxhdGUodGVtcGxhdGU6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlKSB7XG4gICAgdGhpcy5fY29tcG9uZW50VHBscy5zZXQodGVtcGxhdGUuaWQsIHRlbXBsYXRlKTtcbiAgICBpZiAodGVtcGxhdGUuZW5jYXBzdWxhdGlvbiAhPT0gVmlld0VuY2Fwc3VsYXRpb24uTmF0aXZlKSB7XG4gICAgICB2YXIgZW5jYXBzdWxhdGVkU3R5bGVzID0gZW5jYXBzdWxhdGVTdHlsZXModGVtcGxhdGUpO1xuICAgICAgdGhpcy5fZG9tU2hhcmVkU3R5bGVzSG9zdC5hZGRTdHlsZXMoZW5jYXBzdWxhdGVkU3R5bGVzKTtcbiAgICB9XG4gIH1cblxuICBjcmVhdGVQcm90b1ZpZXcoY29tcG9uZW50VGVtcGxhdGVJZDogc3RyaW5nLCBjbWRzOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKTogUmVuZGVyUHJvdG9WaWV3UmVmIHtcbiAgICByZXR1cm4gbmV3IERlZmF1bHRQcm90b1ZpZXdSZWYodGhpcy5fY29tcG9uZW50VHBscy5nZXQoY29tcG9uZW50VGVtcGxhdGVJZCksIGNtZHMpO1xuICB9XG5cbiAgcmVzb2x2ZUNvbXBvbmVudFRlbXBsYXRlKHRlbXBsYXRlSWQ6IHN0cmluZyk6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlIHtcbiAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50VHBscy5nZXQodGVtcGxhdGVJZCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9jcmVhdGVSb290SG9zdFZpZXdTY29wZTogV3RmU2NvcGVGbiA9IHd0ZkNyZWF0ZVNjb3BlKCdEb21SZW5kZXJlciNjcmVhdGVSb290SG9zdFZpZXcoKScpO1xuICBjcmVhdGVSb290SG9zdFZpZXcoaG9zdFByb3RvVmlld1JlZjogUmVuZGVyUHJvdG9WaWV3UmVmLCBmcmFnbWVudENvdW50OiBudW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICBob3N0RWxlbWVudFNlbGVjdG9yOiBzdHJpbmcpOiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyB7XG4gICAgdmFyIHMgPSB0aGlzLl9jcmVhdGVSb290SG9zdFZpZXdTY29wZSgpO1xuICAgIHZhciBlbGVtZW50ID0gRE9NLnF1ZXJ5U2VsZWN0b3IodGhpcy5fZG9jdW1lbnQsIGhvc3RFbGVtZW50U2VsZWN0b3IpO1xuICAgIGlmIChpc0JsYW5rKGVsZW1lbnQpKSB7XG4gICAgICB3dGZMZWF2ZShzKTtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBUaGUgc2VsZWN0b3IgXCIke2hvc3RFbGVtZW50U2VsZWN0b3J9XCIgZGlkIG5vdCBtYXRjaCBhbnkgZWxlbWVudHNgKTtcbiAgICB9XG4gICAgcmV0dXJuIHd0ZkxlYXZlKHMsIHRoaXMuX2NyZWF0ZVZpZXcoaG9zdFByb3RvVmlld1JlZiwgZWxlbWVudCkpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfY3JlYXRlVmlld1Njb3BlID0gd3RmQ3JlYXRlU2NvcGUoJ0RvbVJlbmRlcmVyI2NyZWF0ZVZpZXcoKScpO1xuICBjcmVhdGVWaWV3KHByb3RvVmlld1JlZjogUmVuZGVyUHJvdG9WaWV3UmVmLCBmcmFnbWVudENvdW50OiBudW1iZXIpOiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyB7XG4gICAgdmFyIHMgPSB0aGlzLl9jcmVhdGVWaWV3U2NvcGUoKTtcbiAgICByZXR1cm4gd3RmTGVhdmUocywgdGhpcy5fY3JlYXRlVmlldyhwcm90b1ZpZXdSZWYsIG51bGwpKTtcbiAgfVxuXG4gIHByaXZhdGUgX2NyZWF0ZVZpZXcocHJvdG9WaWV3UmVmOiBSZW5kZXJQcm90b1ZpZXdSZWYsXG4gICAgICAgICAgICAgICAgICAgICAgaW5wbGFjZUVsZW1lbnQ6IEhUTUxFbGVtZW50KTogUmVuZGVyVmlld1dpdGhGcmFnbWVudHMge1xuICAgIHZhciBkcHZyID0gPERlZmF1bHRQcm90b1ZpZXdSZWY+cHJvdG9WaWV3UmVmO1xuICAgIHZhciB2aWV3ID0gY3JlYXRlUmVuZGVyVmlldyhkcHZyLnRlbXBsYXRlLCBkcHZyLmNtZHMsIGlucGxhY2VFbGVtZW50LCB0aGlzKTtcbiAgICB2YXIgc2RSb290cyA9IHZpZXcubmF0aXZlU2hhZG93Um9vdHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZFJvb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLl9kb21TaGFyZWRTdHlsZXNIb3N0LmFkZEhvc3Qoc2RSb290c1tpXSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgUmVuZGVyVmlld1dpdGhGcmFnbWVudHModmlldywgdmlldy5mcmFnbWVudHMpO1xuICB9XG5cbiAgZGVzdHJveVZpZXcodmlld1JlZjogUmVuZGVyVmlld1JlZikge1xuICAgIHZhciB2aWV3ID0gPERlZmF1bHRSZW5kZXJWaWV3PE5vZGU+PnZpZXdSZWY7XG4gICAgdmFyIHNkUm9vdHMgPSB2aWV3Lm5hdGl2ZVNoYWRvd1Jvb3RzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2RSb290cy5sZW5ndGg7IGkrKykge1xuICAgICAgdGhpcy5fZG9tU2hhcmVkU3R5bGVzSG9zdC5yZW1vdmVIb3N0KHNkUm9vdHNbaV0pO1xuICAgIH1cbiAgfVxuXG4gIGFuaW1hdGVOb2RlRW50ZXIobm9kZTogTm9kZSkge1xuICAgIGlmIChET00uaXNFbGVtZW50Tm9kZShub2RlKSAmJiBET00uaGFzQ2xhc3Mobm9kZSwgJ25nLWFuaW1hdGUnKSkge1xuICAgICAgRE9NLmFkZENsYXNzKG5vZGUsICduZy1lbnRlcicpO1xuICAgICAgdGhpcy5fYW5pbWF0ZS5jc3MoKVxuICAgICAgICAgIC5hZGRBbmltYXRpb25DbGFzcygnbmctZW50ZXItYWN0aXZlJylcbiAgICAgICAgICAuc3RhcnQoPEhUTUxFbGVtZW50Pm5vZGUpXG4gICAgICAgICAgLm9uQ29tcGxldGUoKCkgPT4geyBET00ucmVtb3ZlQ2xhc3Mobm9kZSwgJ25nLWVudGVyJyk7IH0pO1xuICAgIH1cbiAgfVxuXG4gIGFuaW1hdGVOb2RlTGVhdmUobm9kZTogTm9kZSkge1xuICAgIGlmIChET00uaXNFbGVtZW50Tm9kZShub2RlKSAmJiBET00uaGFzQ2xhc3Mobm9kZSwgJ25nLWFuaW1hdGUnKSkge1xuICAgICAgRE9NLmFkZENsYXNzKG5vZGUsICduZy1sZWF2ZScpO1xuICAgICAgdGhpcy5fYW5pbWF0ZS5jc3MoKVxuICAgICAgICAgIC5hZGRBbmltYXRpb25DbGFzcygnbmctbGVhdmUtYWN0aXZlJylcbiAgICAgICAgICAuc3RhcnQoPEhUTUxFbGVtZW50Pm5vZGUpXG4gICAgICAgICAgLm9uQ29tcGxldGUoKCkgPT4ge1xuICAgICAgICAgICAgRE9NLnJlbW92ZUNsYXNzKG5vZGUsICduZy1sZWF2ZScpO1xuICAgICAgICAgICAgRE9NLnJlbW92ZShub2RlKTtcbiAgICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgRE9NLnJlbW92ZShub2RlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9kZXRhY2hGcmFnbWVudFNjb3BlID0gd3RmQ3JlYXRlU2NvcGUoJ0RvbVJlbmRlcmVyI2RldGFjaEZyYWdtZW50KCknKTtcbiAgZGV0YWNoRnJhZ21lbnQoZnJhZ21lbnRSZWY6IFJlbmRlckZyYWdtZW50UmVmKSB7XG4gICAgdmFyIHMgPSB0aGlzLl9kZXRhY2hGcmFnbWVudFNjb3BlKCk7XG4gICAgdmFyIGZyYWdtZW50Tm9kZXMgPSByZXNvbHZlSW50ZXJuYWxEb21GcmFnbWVudChmcmFnbWVudFJlZik7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmcmFnbWVudE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzLmFuaW1hdGVOb2RlTGVhdmUoZnJhZ21lbnROb2Rlc1tpXSk7XG4gICAgfVxuICAgIHd0ZkxlYXZlKHMpO1xuICB9XG4gIGNyZWF0ZUVsZW1lbnQobmFtZTogc3RyaW5nLCBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10pOiBOb2RlIHtcbiAgICB2YXIgbnNBbmROYW1lID0gc3BsaXROYW1lc3BhY2UobmFtZSk7XG4gICAgdmFyIGVsID0gaXNQcmVzZW50KG5zQW5kTmFtZVswXSkgP1xuICAgICAgICAgICAgICAgICBET00uY3JlYXRlRWxlbWVudE5TKE5BTUVTUEFDRV9VUklTW25zQW5kTmFtZVswXV0sIG5zQW5kTmFtZVsxXSkgOlxuICAgICAgICAgICAgICAgICBET00uY3JlYXRlRWxlbWVudChuc0FuZE5hbWVbMV0pO1xuICAgIHRoaXMuX3NldEF0dHJpYnV0ZXMoZWwsIGF0dHJOYW1lQW5kVmFsdWVzKTtcbiAgICByZXR1cm4gZWw7XG4gIH1cbiAgbWVyZ2VFbGVtZW50KGV4aXN0aW5nOiBOb2RlLCBhdHRyTmFtZUFuZFZhbHVlczogc3RyaW5nW10pIHtcbiAgICBET00uY2xlYXJOb2RlcyhleGlzdGluZyk7XG4gICAgdGhpcy5fc2V0QXR0cmlidXRlcyhleGlzdGluZywgYXR0ck5hbWVBbmRWYWx1ZXMpO1xuICB9XG4gIHByaXZhdGUgX3NldEF0dHJpYnV0ZXMobm9kZTogTm9kZSwgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdKSB7XG4gICAgZm9yICh2YXIgYXR0cklkeCA9IDA7IGF0dHJJZHggPCBhdHRyTmFtZUFuZFZhbHVlcy5sZW5ndGg7IGF0dHJJZHggKz0gMikge1xuICAgICAgdmFyIGF0dHJOcztcbiAgICAgIHZhciBhdHRyTmFtZSA9IGF0dHJOYW1lQW5kVmFsdWVzW2F0dHJJZHhdO1xuICAgICAgdmFyIG5zQW5kTmFtZSA9IHNwbGl0TmFtZXNwYWNlKGF0dHJOYW1lKTtcbiAgICAgIGlmIChpc1ByZXNlbnQobnNBbmROYW1lWzBdKSkge1xuICAgICAgICBhdHRyTmFtZSA9IG5zQW5kTmFtZVswXSArICc6JyArIG5zQW5kTmFtZVsxXTtcbiAgICAgICAgYXR0ck5zID0gTkFNRVNQQUNFX1VSSVNbbnNBbmROYW1lWzBdXTtcbiAgICAgIH1cbiAgICAgIHZhciBhdHRyVmFsdWUgPSBhdHRyTmFtZUFuZFZhbHVlc1thdHRySWR4ICsgMV07XG4gICAgICBpZiAoaXNQcmVzZW50KGF0dHJOcykpIHtcbiAgICAgICAgRE9NLnNldEF0dHJpYnV0ZU5TKG5vZGUsIGF0dHJOcywgYXR0ck5hbWUsIGF0dHJWYWx1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBET00uc2V0QXR0cmlidXRlKG5vZGUsIG5zQW5kTmFtZVsxXSwgYXR0clZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgY3JlYXRlUm9vdENvbnRlbnRJbnNlcnRpb25Qb2ludCgpOiBOb2RlIHtcbiAgICByZXR1cm4gRE9NLmNyZWF0ZUNvbW1lbnQoJ3Jvb3QtY29udGVudC1pbnNlcnRpb24tcG9pbnQnKTtcbiAgfVxuICBjcmVhdGVTaGFkb3dSb290KGhvc3Q6IE5vZGUsIHRlbXBsYXRlSWQ6IHN0cmluZyk6IE5vZGUge1xuICAgIHZhciBzciA9IERPTS5jcmVhdGVTaGFkb3dSb290KGhvc3QpO1xuICAgIHZhciB0cGwgPSB0aGlzLl9jb21wb25lbnRUcGxzLmdldCh0ZW1wbGF0ZUlkKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRwbC5zdHlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIERPTS5hcHBlbmRDaGlsZChzciwgRE9NLmNyZWF0ZVN0eWxlRWxlbWVudCh0cGwuc3R5bGVzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBzcjtcbiAgfVxuICBvbihlbGVtZW50OiBOb2RlLCBldmVudE5hbWU6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgdGhpcy5fZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIoPEhUTUxFbGVtZW50PmVsZW1lbnQsIGV2ZW50TmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvcmF0ZVByZXZlbnREZWZhdWx0KGNhbGxiYWNrKSk7XG4gIH1cbiAgZ2xvYmFsT24odGFyZ2V0OiBzdHJpbmcsIGV2ZW50TmFtZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24pOiBGdW5jdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TWFuYWdlci5hZGRHbG9iYWxFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvcmF0ZVByZXZlbnREZWZhdWx0KGNhbGxiYWNrKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzb2x2ZUludGVybmFsRG9tVmlldyh2aWV3UmVmOiBSZW5kZXJWaWV3UmVmKTogRGVmYXVsdFJlbmRlclZpZXc8Tm9kZT4ge1xuICByZXR1cm4gPERlZmF1bHRSZW5kZXJWaWV3PE5vZGU+PnZpZXdSZWY7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVJbnRlcm5hbERvbUZyYWdtZW50KGZyYWdtZW50UmVmOiBSZW5kZXJGcmFnbWVudFJlZik6IE5vZGVbXSB7XG4gIHJldHVybiAoPERlZmF1bHRSZW5kZXJGcmFnbWVudFJlZjxOb2RlPj5mcmFnbWVudFJlZikubm9kZXM7XG59XG5cbmZ1bmN0aW9uIG1vdmVOb2Rlc0FmdGVyU2libGluZyhzaWJsaW5nLCBub2Rlcykge1xuICB2YXIgcGFyZW50ID0gRE9NLnBhcmVudEVsZW1lbnQoc2libGluZyk7XG4gIGlmIChub2Rlcy5sZW5ndGggPiAwICYmIGlzUHJlc2VudChwYXJlbnQpKSB7XG4gICAgdmFyIG5leHRTaWJsaW5nID0gRE9NLm5leHRTaWJsaW5nKHNpYmxpbmcpO1xuICAgIGlmIChpc1ByZXNlbnQobmV4dFNpYmxpbmcpKSB7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIERPTS5pbnNlcnRCZWZvcmUobmV4dFNpYmxpbmcsIG5vZGVzW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBET00uYXBwZW5kQ2hpbGQocGFyZW50LCBub2Rlc1tpXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGRlY29yYXRlUHJldmVudERlZmF1bHQoZXZlbnRIYW5kbGVyOiBGdW5jdGlvbik6IEZ1bmN0aW9uIHtcbiAgcmV0dXJuIChldmVudCkgPT4ge1xuICAgIHZhciBhbGxvd0RlZmF1bHRCZWhhdmlvciA9IGV2ZW50SGFuZGxlcihldmVudCk7XG4gICAgaWYgKCFhbGxvd0RlZmF1bHRCZWhhdmlvcikge1xuICAgICAgLy8gVE9ETyh0Ym9zY2gpOiBtb3ZlIHByZXZlbnREZWZhdWx0IGludG8gZXZlbnQgcGx1Z2lucy4uLlxuICAgICAgRE9NLnByZXZlbnREZWZhdWx0KGV2ZW50KTtcbiAgICB9XG4gIH07XG59XG5cbnZhciBOU19QUkVGSVhfUkUgPSAvXkAoW146XSspOiguKykvZztcblxuZnVuY3Rpb24gc3BsaXROYW1lc3BhY2UobmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBpZiAobmFtZVswXSAhPSAnQCcpIHtcbiAgICByZXR1cm4gW251bGwsIG5hbWVdO1xuICB9XG4gIGxldCBtYXRjaCA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChOU19QUkVGSVhfUkUsIG5hbWUpO1xuICByZXR1cm4gW21hdGNoWzFdLCBtYXRjaFsyXV07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9yZW5kZXJlci50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuXG5pbXBvcnQge0Nzc0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gJy4vY3NzX2FuaW1hdGlvbl9idWlsZGVyJztcbmltcG9ydCB7QnJvd3NlckRldGFpbHN9IGZyb20gJy4vYnJvd3Nlcl9kZXRhaWxzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvbkJ1aWxkZXIge1xuICAvKipcbiAgICogVXNlZCBmb3IgRElcbiAgICogQHBhcmFtIGJyb3dzZXJEZXRhaWxzXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgYnJvd3NlckRldGFpbHM6IEJyb3dzZXJEZXRhaWxzKSB7fVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IENTUyBBbmltYXRpb25cbiAgICogQHJldHVybnMge0Nzc0FuaW1hdGlvbkJ1aWxkZXJ9XG4gICAqL1xuICBjc3MoKTogQ3NzQW5pbWF0aW9uQnVpbGRlciB7IHJldHVybiBuZXcgQ3NzQW5pbWF0aW9uQnVpbGRlcih0aGlzLmJyb3dzZXJEZXRhaWxzKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2FuaW1hdGUvYW5pbWF0aW9uX2J1aWxkZXIudHNcbiAqKi8iLCJpbXBvcnQge0Nzc0FuaW1hdGlvbk9wdGlvbnN9IGZyb20gJy4vY3NzX2FuaW1hdGlvbl9vcHRpb25zJztcbmltcG9ydCB7QW5pbWF0aW9ufSBmcm9tICcuL2FuaW1hdGlvbic7XG5pbXBvcnQge0Jyb3dzZXJEZXRhaWxzfSBmcm9tICcuL2Jyb3dzZXJfZGV0YWlscyc7XG5cbmV4cG9ydCBjbGFzcyBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgLyoqIEB0eXBlIHtDc3NBbmltYXRpb25PcHRpb25zfSAqL1xuICBkYXRhOiBDc3NBbmltYXRpb25PcHRpb25zID0gbmV3IENzc0FuaW1hdGlvbk9wdGlvbnMoKTtcblxuICAvKipcbiAgICogQWNjZXB0cyBwdWJsaWMgcHJvcGVydGllcyBmb3IgQ3NzQW5pbWF0aW9uQnVpbGRlclxuICAgKi9cbiAgY29uc3RydWN0b3IocHVibGljIGJyb3dzZXJEZXRhaWxzOiBCcm93c2VyRGV0YWlscykge31cblxuICAvKipcbiAgICogQWRkcyBhIHRlbXBvcmFyeSBjbGFzcyB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBhdCB0aGUgZW5kIG9mIHRoZSBhbmltYXRpb25cbiAgICogQHBhcmFtIGNsYXNzTmFtZVxuICAgKi9cbiAgYWRkQW5pbWF0aW9uQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLmRhdGEuYW5pbWF0aW9uQ2xhc3Nlcy5wdXNoKGNsYXNzTmFtZSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNsYXNzIHRoYXQgd2lsbCByZW1haW4gb24gdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGFuaW1hdGlvbiBoYXMgZmluaXNoZWRcbiAgICogQHBhcmFtIGNsYXNzTmFtZVxuICAgKi9cbiAgYWRkQ2xhc3MoY2xhc3NOYW1lOiBzdHJpbmcpOiBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLmRhdGEuY2xhc3Nlc1RvQWRkLnB1c2goY2xhc3NOYW1lKTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gY2xhc3NOYW1lXG4gICAqL1xuICByZW1vdmVDbGFzcyhjbGFzc05hbWU6IHN0cmluZyk6IENzc0FuaW1hdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMuZGF0YS5jbGFzc2VzVG9SZW1vdmUucHVzaChjbGFzc05hbWUpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIGFuaW1hdGlvbiBkdXJhdGlvbiAoYW5kIG92ZXJyaWRlcyBhbnkgZGVmaW5lZCB0aHJvdWdoIENTUylcbiAgICogQHBhcmFtIGR1cmF0aW9uXG4gICAqL1xuICBzZXREdXJhdGlvbihkdXJhdGlvbjogbnVtYmVyKTogQ3NzQW5pbWF0aW9uQnVpbGRlciB7XG4gICAgdGhpcy5kYXRhLmR1cmF0aW9uID0gZHVyYXRpb247XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgYW5pbWF0aW9uIGRlbGF5IChhbmQgb3ZlcnJpZGVzIGFueSBkZWZpbmVkIHRocm91Z2ggQ1NTKVxuICAgKiBAcGFyYW0gZGVsYXlcbiAgICovXG4gIHNldERlbGF5KGRlbGF5OiBudW1iZXIpOiBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLmRhdGEuZGVsYXkgPSBkZWxheTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHN0eWxlcyBmb3IgYm90aCB0aGUgaW5pdGlhbCBzdGF0ZSBhbmQgdGhlIGRlc3RpbmF0aW9uIHN0YXRlXG4gICAqIEBwYXJhbSBmcm9tXG4gICAqIEBwYXJhbSB0b1xuICAgKi9cbiAgc2V0U3R5bGVzKGZyb206IHtba2V5OiBzdHJpbmddOiBhbnl9LCB0bzoge1trZXk6IHN0cmluZ106IGFueX0pOiBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgICByZXR1cm4gdGhpcy5zZXRGcm9tU3R5bGVzKGZyb20pLnNldFRvU3R5bGVzKHRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBpbml0aWFsIHN0eWxlcyBmb3IgdGhlIGFuaW1hdGlvblxuICAgKiBAcGFyYW0gZnJvbVxuICAgKi9cbiAgc2V0RnJvbVN0eWxlcyhmcm9tOiB7W2tleTogc3RyaW5nXTogYW55fSk6IENzc0FuaW1hdGlvbkJ1aWxkZXIge1xuICAgIHRoaXMuZGF0YS5mcm9tU3R5bGVzID0gZnJvbTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIHRoZSBkZXN0aW5hdGlvbiBzdHlsZXMgZm9yIHRoZSBhbmltYXRpb25cbiAgICogQHBhcmFtIHRvXG4gICAqL1xuICBzZXRUb1N0eWxlcyh0bzoge1trZXk6IHN0cmluZ106IGFueX0pOiBDc3NBbmltYXRpb25CdWlsZGVyIHtcbiAgICB0aGlzLmRhdGEudG9TdHlsZXMgPSB0bztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgdGhlIGFuaW1hdGlvbiBhbmQgcmV0dXJucyBhIHByb21pc2VcbiAgICogQHBhcmFtIGVsZW1lbnRcbiAgICovXG4gIHN0YXJ0KGVsZW1lbnQ6IEhUTUxFbGVtZW50KTogQW5pbWF0aW9uIHtcbiAgICByZXR1cm4gbmV3IEFuaW1hdGlvbihlbGVtZW50LCB0aGlzLmRhdGEsIHRoaXMuYnJvd3NlckRldGFpbHMpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvYW5pbWF0ZS9jc3NfYW5pbWF0aW9uX2J1aWxkZXIudHNcbiAqKi8iLCJleHBvcnQgY2xhc3MgQ3NzQW5pbWF0aW9uT3B0aW9ucyB7XG4gIC8qKiBpbml0aWFsIHN0eWxlcyBmb3IgdGhlIGVsZW1lbnQgKi9cbiAgZnJvbVN0eWxlczoge1trZXk6IHN0cmluZ106IGFueX07XG5cbiAgLyoqIGRlc3RpbmF0aW9uIHN0eWxlcyBmb3IgdGhlIGVsZW1lbnQgKi9cbiAgdG9TdHlsZXM6IHtba2V5OiBzdHJpbmddOiBhbnl9O1xuXG4gIC8qKiBjbGFzc2VzIHRvIGJlIGFkZGVkIHRvIHRoZSBlbGVtZW50ICovXG4gIGNsYXNzZXNUb0FkZDogc3RyaW5nW10gPSBbXTtcblxuICAvKiogY2xhc3NlcyB0byBiZSByZW1vdmVkIGZyb20gdGhlIGVsZW1lbnQgKi9cbiAgY2xhc3Nlc1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKiBjbGFzc2VzIHRvIGJlIGFkZGVkIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiAqL1xuICBhbmltYXRpb25DbGFzc2VzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIC8qKiBvdmVycmlkZSB0aGUgZHVyYXRpb24gb2YgdGhlIGFuaW1hdGlvbiAoaW4gbWlsbGlzZWNvbmRzKSAqL1xuICBkdXJhdGlvbjogbnVtYmVyO1xuXG4gIC8qKiBvdmVycmlkZSB0aGUgdHJhbnNpdGlvbiBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKSAqL1xuICBkZWxheTogbnVtYmVyO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2FuaW1hdGUvY3NzX2FuaW1hdGlvbl9vcHRpb25zLnRzXG4gKiovIiwiaW1wb3J0IHtcbiAgRGF0ZVdyYXBwZXIsXG4gIFN0cmluZ1dyYXBwZXIsXG4gIFJlZ0V4cFdyYXBwZXIsXG4gIE51bWJlcldyYXBwZXIsXG4gIGlzUHJlc2VudFxufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtNYXRofSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL21hdGgnO1xuaW1wb3J0IHtjYW1lbENhc2VUb0Rhc2hDYXNlfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL3V0aWwnO1xuaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuXG5pbXBvcnQge0Jyb3dzZXJEZXRhaWxzfSBmcm9tICcuL2Jyb3dzZXJfZGV0YWlscyc7XG5pbXBvcnQge0Nzc0FuaW1hdGlvbk9wdGlvbnN9IGZyb20gJy4vY3NzX2FuaW1hdGlvbl9vcHRpb25zJztcblxuZXhwb3J0IGNsYXNzIEFuaW1hdGlvbiB7XG4gIC8qKiBmdW5jdGlvbnMgdG8gYmUgY2FsbGVkIHVwb24gY29tcGxldGlvbiAqL1xuICBjYWxsYmFja3M6IEZ1bmN0aW9uW10gPSBbXTtcblxuICAvKiogdGhlIGR1cmF0aW9uIChtcykgb2YgdGhlIGFuaW1hdGlvbiAod2hldGhlciBmcm9tIENTUyBvciBtYW51YWxseSBzZXQpICovXG4gIGNvbXB1dGVkRHVyYXRpb246IG51bWJlcjtcblxuICAvKiogdGhlIGFuaW1hdGlvbiBkZWxheSAobXMpICh3aGV0aGVyIGZyb20gQ1NTIG9yIG1hbnVhbGx5IHNldCkgKi9cbiAgY29tcHV0ZWREZWxheTogbnVtYmVyO1xuXG4gIC8qKiB0aW1lc3RhbXAgb2Ygd2hlbiB0aGUgYW5pbWF0aW9uIHN0YXJ0ZWQgKi9cbiAgc3RhcnRUaW1lOiBudW1iZXI7XG5cbiAgLyoqIGZ1bmN0aW9ucyBmb3IgcmVtb3ZpbmcgZXZlbnQgbGlzdGVuZXJzICovXG4gIGV2ZW50Q2xlYXJGdW5jdGlvbnM6IEZ1bmN0aW9uW10gPSBbXTtcblxuICAvKiogZmxhZyB1c2VkIHRvIHRyYWNrIHdoZXRoZXIgb3Igbm90IHRoZSBhbmltYXRpb24gaGFzIGZpbmlzaGVkICovXG4gIGNvbXBsZXRlZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIHByaXZhdGUgX3N0cmluZ1ByZWZpeDogc3RyaW5nID0gJyc7XG5cbiAgLyoqIHRvdGFsIGFtb3VudCBvZiB0aW1lIHRoYXQgdGhlIGFuaW1hdGlvbiBzaG91bGQgdGFrZSBpbmNsdWRpbmcgZGVsYXkgKi9cbiAgZ2V0IHRvdGFsVGltZSgpOiBudW1iZXIge1xuICAgIGxldCBkZWxheSA9IHRoaXMuY29tcHV0ZWREZWxheSAhPSBudWxsID8gdGhpcy5jb21wdXRlZERlbGF5IDogMDtcbiAgICBsZXQgZHVyYXRpb24gPSB0aGlzLmNvbXB1dGVkRHVyYXRpb24gIT0gbnVsbCA/IHRoaXMuY29tcHV0ZWREdXJhdGlvbiA6IDA7XG4gICAgcmV0dXJuIGRlbGF5ICsgZHVyYXRpb247XG4gIH1cblxuICAvKipcbiAgICogU3RvcmVzIHRoZSBzdGFydCB0aW1lIGFuZCBzdGFydHMgdGhlIGFuaW1hdGlvblxuICAgKiBAcGFyYW0gZWxlbWVudFxuICAgKiBAcGFyYW0gZGF0YVxuICAgKiBAcGFyYW0gYnJvd3NlckRldGFpbHNcbiAgICovXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBlbGVtZW50OiBIVE1MRWxlbWVudCwgcHVibGljIGRhdGE6IENzc0FuaW1hdGlvbk9wdGlvbnMsXG4gICAgICAgICAgICAgIHB1YmxpYyBicm93c2VyRGV0YWlsczogQnJvd3NlckRldGFpbHMpIHtcbiAgICB0aGlzLnN0YXJ0VGltZSA9IERhdGVXcmFwcGVyLnRvTWlsbGlzKERhdGVXcmFwcGVyLm5vdygpKTtcbiAgICB0aGlzLl9zdHJpbmdQcmVmaXggPSBET00uZ2V0QW5pbWF0aW9uUHJlZml4KCk7XG4gICAgdGhpcy5zZXR1cCgpO1xuICAgIHRoaXMud2FpdCh0aW1lc3RhbXAgPT4gdGhpcy5zdGFydCgpKTtcbiAgfVxuXG4gIHdhaXQoY2FsbGJhY2s6IEZ1bmN0aW9uKSB7XG4gICAgLy8gRmlyZWZveCByZXF1aXJlcyAyIGZyYW1lcyBmb3Igc29tZSByZWFzb25cbiAgICB0aGlzLmJyb3dzZXJEZXRhaWxzLnJhZihjYWxsYmFjaywgMik7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB1cCB0aGUgaW5pdGlhbCBzdHlsZXMgYmVmb3JlIHRoZSBhbmltYXRpb24gaXMgc3RhcnRlZFxuICAgKi9cbiAgc2V0dXAoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0YS5mcm9tU3R5bGVzICE9IG51bGwpIHRoaXMuYXBwbHlTdHlsZXModGhpcy5kYXRhLmZyb21TdHlsZXMpO1xuICAgIGlmICh0aGlzLmRhdGEuZHVyYXRpb24gIT0gbnVsbClcbiAgICAgIHRoaXMuYXBwbHlTdHlsZXMoeyd0cmFuc2l0aW9uRHVyYXRpb24nOiB0aGlzLmRhdGEuZHVyYXRpb24udG9TdHJpbmcoKSArICdtcyd9KTtcbiAgICBpZiAodGhpcy5kYXRhLmRlbGF5ICE9IG51bGwpXG4gICAgICB0aGlzLmFwcGx5U3R5bGVzKHsndHJhbnNpdGlvbkRlbGF5JzogdGhpcy5kYXRhLmRlbGF5LnRvU3RyaW5nKCkgKyAnbXMnfSk7XG4gIH1cblxuICAvKipcbiAgICogQWZ0ZXIgdGhlIGluaXRpYWwgc2V0dXAgaGFzIG9jY3VycmVkLCB0aGlzIG1ldGhvZCBhZGRzIHRoZSBhbmltYXRpb24gc3R5bGVzXG4gICAqL1xuICBzdGFydCgpOiB2b2lkIHtcbiAgICB0aGlzLmFkZENsYXNzZXModGhpcy5kYXRhLmNsYXNzZXNUb0FkZCk7XG4gICAgdGhpcy5hZGRDbGFzc2VzKHRoaXMuZGF0YS5hbmltYXRpb25DbGFzc2VzKTtcbiAgICB0aGlzLnJlbW92ZUNsYXNzZXModGhpcy5kYXRhLmNsYXNzZXNUb1JlbW92ZSk7XG4gICAgaWYgKHRoaXMuZGF0YS50b1N0eWxlcyAhPSBudWxsKSB0aGlzLmFwcGx5U3R5bGVzKHRoaXMuZGF0YS50b1N0eWxlcyk7XG4gICAgdmFyIGNvbXB1dGVkU3R5bGVzID0gRE9NLmdldENvbXB1dGVkU3R5bGUodGhpcy5lbGVtZW50KTtcbiAgICB0aGlzLmNvbXB1dGVkRGVsYXkgPVxuICAgICAgICBNYXRoLm1heCh0aGlzLnBhcnNlRHVyYXRpb25TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICBjb21wdXRlZFN0eWxlcy5nZXRQcm9wZXJ0eVZhbHVlKHRoaXMuX3N0cmluZ1ByZWZpeCArICd0cmFuc2l0aW9uLWRlbGF5JykpLFxuICAgICAgICAgICAgICAgICB0aGlzLnBhcnNlRHVyYXRpb25TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSh0aGlzLl9zdHJpbmdQcmVmaXggKyAndHJhbnNpdGlvbi1kZWxheScpKSk7XG4gICAgdGhpcy5jb21wdXRlZER1cmF0aW9uID0gTWF0aC5tYXgodGhpcy5wYXJzZUR1cmF0aW9uU3RyaW5nKGNvbXB1dGVkU3R5bGVzLmdldFByb3BlcnR5VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0cmluZ1ByZWZpeCArICd0cmFuc2l0aW9uLWR1cmF0aW9uJykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFyc2VEdXJhdGlvblN0cmluZyh0aGlzLmVsZW1lbnQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RyaW5nUHJlZml4ICsgJ3RyYW5zaXRpb24tZHVyYXRpb24nKSkpO1xuICAgIHRoaXMuYWRkRXZlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyB0aGUgcHJvdmlkZWQgc3R5bGVzIHRvIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBzdHlsZXNcbiAgICovXG4gIGFwcGx5U3R5bGVzKHN0eWxlczoge1trZXk6IHN0cmluZ106IGFueX0pOiB2b2lkIHtcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goc3R5bGVzLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgdmFyIGRhc2hDYXNlS2V5ID0gY2FtZWxDYXNlVG9EYXNoQ2FzZShrZXkpO1xuICAgICAgaWYgKGlzUHJlc2VudChET00uZ2V0U3R5bGUodGhpcy5lbGVtZW50LCBkYXNoQ2FzZUtleSkpKSB7XG4gICAgICAgIERPTS5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsIGRhc2hDYXNlS2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIERPTS5zZXRTdHlsZSh0aGlzLmVsZW1lbnQsIHRoaXMuX3N0cmluZ1ByZWZpeCArIGRhc2hDYXNlS2V5LCB2YWx1ZS50b1N0cmluZygpKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBwcm92aWRlZCBjbGFzc2VzIHRvIHRoZSBlbGVtZW50XG4gICAqIEBwYXJhbSBjbGFzc2VzXG4gICAqL1xuICBhZGRDbGFzc2VzKGNsYXNzZXM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNsYXNzZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIERPTS5hZGRDbGFzcyh0aGlzLmVsZW1lbnQsIGNsYXNzZXNbaV0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIHByb3ZpZGVkIGNsYXNzZXMgZnJvbSB0aGUgZWxlbWVudFxuICAgKiBAcGFyYW0gY2xhc3Nlc1xuICAgKi9cbiAgcmVtb3ZlQ2xhc3NlcyhjbGFzc2VzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBjbGFzc2VzLmxlbmd0aDsgaSA8IGxlbjsgaSsrKSBET00ucmVtb3ZlQ2xhc3ModGhpcy5lbGVtZW50LCBjbGFzc2VzW2ldKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGV2ZW50cyB0byB0cmFjayB3aGVuIGFuaW1hdGlvbnMgaGF2ZSBmaW5pc2hlZFxuICAgKi9cbiAgYWRkRXZlbnRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnRvdGFsVGltZSA+IDApIHtcbiAgICAgIHRoaXMuZXZlbnRDbGVhckZ1bmN0aW9ucy5wdXNoKERPTS5vbkFuZENhbmNlbChcbiAgICAgICAgICB0aGlzLmVsZW1lbnQsIERPTS5nZXRUcmFuc2l0aW9uRW5kKCksIChldmVudDogYW55KSA9PiB0aGlzLmhhbmRsZUFuaW1hdGlvbkV2ZW50KGV2ZW50KSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhhbmRsZUFuaW1hdGlvbkNvbXBsZXRlZCgpO1xuICAgIH1cbiAgfVxuXG4gIGhhbmRsZUFuaW1hdGlvbkV2ZW50KGV2ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBsZXQgZWxhcHNlZFRpbWUgPSBNYXRoLnJvdW5kKGV2ZW50LmVsYXBzZWRUaW1lICogMTAwMCk7XG4gICAgaWYgKCF0aGlzLmJyb3dzZXJEZXRhaWxzLmVsYXBzZWRUaW1lSW5jbHVkZXNEZWxheSkgZWxhcHNlZFRpbWUgKz0gdGhpcy5jb21wdXRlZERlbGF5O1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGlmIChlbGFwc2VkVGltZSA+PSB0aGlzLnRvdGFsVGltZSkgdGhpcy5oYW5kbGVBbmltYXRpb25Db21wbGV0ZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIGFsbCBhbmltYXRpb24gY2FsbGJhY2tzIGFuZCByZW1vdmVzIHRlbXBvcmFyeSBjbGFzc2VzXG4gICAqL1xuICBoYW5kbGVBbmltYXRpb25Db21wbGV0ZWQoKTogdm9pZCB7XG4gICAgdGhpcy5yZW1vdmVDbGFzc2VzKHRoaXMuZGF0YS5hbmltYXRpb25DbGFzc2VzKTtcbiAgICB0aGlzLmNhbGxiYWNrcy5mb3JFYWNoKGNhbGxiYWNrID0+IGNhbGxiYWNrKCkpO1xuICAgIHRoaXMuY2FsbGJhY2tzID0gW107XG4gICAgdGhpcy5ldmVudENsZWFyRnVuY3Rpb25zLmZvckVhY2goZm4gPT4gZm4oKSk7XG4gICAgdGhpcy5ldmVudENsZWFyRnVuY3Rpb25zID0gW107XG4gICAgdGhpcy5jb21wbGV0ZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW5pbWF0aW9uIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQgdXBvbiBjb21wbGV0aW9uXG4gICAqIEBwYXJhbSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7QW5pbWF0aW9ufVxuICAgKi9cbiAgb25Db21wbGV0ZShjYWxsYmFjazogRnVuY3Rpb24pOiBBbmltYXRpb24ge1xuICAgIGlmICh0aGlzLmNvbXBsZXRlZCkge1xuICAgICAgY2FsbGJhY2soKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIHRoZSBkdXJhdGlvbiBzdHJpbmcgdG8gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAgICogQHBhcmFtIGR1cmF0aW9uXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBwYXJzZUR1cmF0aW9uU3RyaW5nKGR1cmF0aW9uOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIHZhciBtYXhWYWx1ZSA9IDA7XG4gICAgLy8gZHVyYXRpb24gbXVzdCBoYXZlIGF0IGxlYXN0IDIgY2hhcmFjdGVycyB0byBiZSB2YWxpZC4gKG51bWJlciArIHR5cGUpXG4gICAgaWYgKGR1cmF0aW9uID09IG51bGwgfHwgZHVyYXRpb24ubGVuZ3RoIDwgMikge1xuICAgICAgcmV0dXJuIG1heFZhbHVlO1xuICAgIH0gZWxzZSBpZiAoZHVyYXRpb24uc3Vic3RyaW5nKGR1cmF0aW9uLmxlbmd0aCAtIDIpID09ICdtcycpIHtcbiAgICAgIGxldCB2YWx1ZSA9IE51bWJlcldyYXBwZXIucGFyc2VJbnQodGhpcy5zdHJpcExldHRlcnMoZHVyYXRpb24pLCAxMCk7XG4gICAgICBpZiAodmFsdWUgPiBtYXhWYWx1ZSkgbWF4VmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2UgaWYgKGR1cmF0aW9uLnN1YnN0cmluZyhkdXJhdGlvbi5sZW5ndGggLSAxKSA9PSAncycpIHtcbiAgICAgIGxldCBtcyA9IE51bWJlcldyYXBwZXIucGFyc2VGbG9hdCh0aGlzLnN0cmlwTGV0dGVycyhkdXJhdGlvbikpICogMTAwMDtcbiAgICAgIGxldCB2YWx1ZSA9IE1hdGguZmxvb3IobXMpO1xuICAgICAgaWYgKHZhbHVlID4gbWF4VmFsdWUpIG1heFZhbHVlID0gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBtYXhWYWx1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdHJpcHMgdGhlIGxldHRlcnMgZnJvbSB0aGUgZHVyYXRpb24gc3RyaW5nXG4gICAqIEBwYXJhbSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHN0cmlwTGV0dGVycyhzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChzdHIsIFJlZ0V4cFdyYXBwZXIuY3JlYXRlKCdbXjAtOV0rJCcsICcnKSwgJycpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvYW5pbWF0ZS9hbmltYXRpb24udHNcbiAqKi8iLCJpbXBvcnQge2dsb2JhbH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuZXhwb3J0IHZhciBNYXRoID0gZ2xvYmFsLk1hdGg7XG5leHBvcnQgdmFyIE5hTiA9IHR5cGVvZiBOYU47XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvZmFjYWRlL21hdGgudHNcbiAqKi8iLCJpbXBvcnQge1N0cmluZ1dyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbnZhciBDQU1FTF9DQVNFX1JFR0VYUCA9IC8oW0EtWl0pL2c7XG52YXIgREFTSF9DQVNFX1JFR0VYUCA9IC8tKFthLXpdKS9nO1xuXG5cbmV4cG9ydCBmdW5jdGlvbiBjYW1lbENhc2VUb0Rhc2hDYXNlKGlucHV0OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsTWFwcGVkKGlucHV0LCBDQU1FTF9DQVNFX1JFR0VYUCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobSkgPT4geyByZXR1cm4gJy0nICsgbVsxXS50b0xvd2VyQ2FzZSgpOyB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRhc2hDYXNlVG9DYW1lbENhc2UoaW5wdXQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQoaW5wdXQsIERBU0hfQ0FTRV9SRUdFWFAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG0pID0+IHsgcmV0dXJuIG1bMV0udG9VcHBlckNhc2UoKTsgfSk7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL3V0aWwudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7TWF0aH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9tYXRoJztcbmltcG9ydCB7RE9NfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJyb3dzZXJEZXRhaWxzIHtcbiAgZWxhcHNlZFRpbWVJbmNsdWRlc0RlbGF5ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoKSB7IHRoaXMuZG9lc0VsYXBzZWRUaW1lSW5jbHVkZXNEZWxheSgpOyB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgYGV2ZW50LmVsYXBzZWRUaW1lYCBpbmNsdWRlcyB0cmFuc2l0aW9uIGRlbGF5IGluIHRoZSBjdXJyZW50IGJyb3dzZXIuICBBdCB0aGlzXG4gICAqIHRpbWUsIENocm9tZSBhbmQgT3BlcmEgc2VlbSB0byBiZSB0aGUgb25seSBicm93c2VycyB0aGF0IGluY2x1ZGUgdGhpcy5cbiAgICovXG4gIGRvZXNFbGFwc2VkVGltZUluY2x1ZGVzRGVsYXkoKTogdm9pZCB7XG4gICAgdmFyIGRpdiA9IERPTS5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICBET00uc2V0QXR0cmlidXRlKGRpdiwgJ3N0eWxlJywgYHBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAtOTk5OXB4OyBsZWZ0OiAtOTk5OXB4OyB3aWR0aDogMXB4O1xuICAgICAgaGVpZ2h0OiAxcHg7IHRyYW5zaXRpb246IGFsbCAxbXMgbGluZWFyIDFtcztgKTtcbiAgICAvLyBGaXJlZm94IHJlcXVpcmVzIHRoYXQgd2Ugd2FpdCBmb3IgMiBmcmFtZXMgZm9yIHNvbWUgcmVhc29uXG4gICAgdGhpcy5yYWYodGltZXN0YW1wID0+IHtcbiAgICAgIERPTS5vbihkaXYsICd0cmFuc2l0aW9uZW5kJywgKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgdmFyIGVsYXBzZWQgPSBNYXRoLnJvdW5kKGV2ZW50LmVsYXBzZWRUaW1lICogMTAwMCk7XG4gICAgICAgIHRoaXMuZWxhcHNlZFRpbWVJbmNsdWRlc0RlbGF5ID0gZWxhcHNlZCA9PSAyO1xuICAgICAgICBET00ucmVtb3ZlKGRpdik7XG4gICAgICB9KTtcbiAgICAgIERPTS5zZXRTdHlsZShkaXYsICd3aWR0aCcsICcycHgnKTtcbiAgICB9LCAyKTtcbiAgfVxuXG4gIHJhZihjYWxsYmFjazogRnVuY3Rpb24sIGZyYW1lczogbnVtYmVyID0gMSk6IEZ1bmN0aW9uIHtcbiAgICB2YXIgcXVldWU6IFJhZlF1ZXVlID0gbmV3IFJhZlF1ZXVlKGNhbGxiYWNrLCBmcmFtZXMpO1xuICAgIHJldHVybiAoKSA9PiBxdWV1ZS5jYW5jZWwoKTtcbiAgfVxufVxuXG5jbGFzcyBSYWZRdWV1ZSB7XG4gIGN1cnJlbnRGcmFtZUlkOiBudW1iZXI7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjYWxsYmFjazogRnVuY3Rpb24sIHB1YmxpYyBmcmFtZXM6IG51bWJlcikgeyB0aGlzLl9yYWYoKTsgfVxuICBwcml2YXRlIF9yYWYoKSB7XG4gICAgdGhpcy5jdXJyZW50RnJhbWVJZCA9IERPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGltZXN0YW1wID0+IHRoaXMuX25leHRGcmFtZSh0aW1lc3RhbXApKTtcbiAgfVxuICBwcml2YXRlIF9uZXh0RnJhbWUodGltZXN0YW1wOiBudW1iZXIpIHtcbiAgICB0aGlzLmZyYW1lcy0tO1xuICAgIGlmICh0aGlzLmZyYW1lcyA+IDApIHtcbiAgICAgIHRoaXMuX3JhZigpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNhbGxiYWNrKHRpbWVzdGFtcCk7XG4gICAgfVxuICB9XG4gIGNhbmNlbCgpIHtcbiAgICBET00uY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5jdXJyZW50RnJhbWVJZCk7XG4gICAgdGhpcy5jdXJyZW50RnJhbWVJZCA9IG51bGw7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9hbmltYXRlL2Jyb3dzZXJfZGV0YWlscy50c1xuICoqLyIsImltcG9ydCB7RE9NfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcbmltcG9ydCB7SW5qZWN0LCBJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge1NldFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICcuL2RvbV90b2tlbnMnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU2hhcmVkU3R5bGVzSG9zdCB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N0eWxlczogc3RyaW5nW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc3R5bGVzU2V0ID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIGFkZFN0eWxlcyhzdHlsZXM6IHN0cmluZ1tdKSB7XG4gICAgdmFyIGFkZGl0aW9ucyA9IFtdO1xuICAgIHN0eWxlcy5mb3JFYWNoKHN0eWxlID0+IHtcbiAgICAgIGlmICghU2V0V3JhcHBlci5oYXModGhpcy5fc3R5bGVzU2V0LCBzdHlsZSkpIHtcbiAgICAgICAgdGhpcy5fc3R5bGVzU2V0LmFkZChzdHlsZSk7XG4gICAgICAgIHRoaXMuX3N0eWxlcy5wdXNoKHN0eWxlKTtcbiAgICAgICAgYWRkaXRpb25zLnB1c2goc3R5bGUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMub25TdHlsZXNBZGRlZChhZGRpdGlvbnMpO1xuICB9XG5cbiAgb25TdHlsZXNBZGRlZChhZGRpdGlvbnM6IHN0cmluZ1tdKSB7fVxuXG4gIGdldEFsbFN0eWxlcygpOiBzdHJpbmdbXSB7IHJldHVybiB0aGlzLl9zdHlsZXM7IH1cbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvbVNoYXJlZFN0eWxlc0hvc3QgZXh0ZW5kcyBTaGFyZWRTdHlsZXNIb3N0IHtcbiAgcHJpdmF0ZSBfaG9zdE5vZGVzID0gbmV3IFNldDxOb2RlPigpO1xuICBjb25zdHJ1Y3RvcihASW5qZWN0KERPQ1VNRU5UKSBkb2M6IGFueSkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5faG9zdE5vZGVzLmFkZChkb2MuaGVhZCk7XG4gIH1cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfYWRkU3R5bGVzVG9Ib3N0KHN0eWxlczogc3RyaW5nW10sIGhvc3Q6IE5vZGUpIHtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN0eWxlID0gc3R5bGVzW2ldO1xuICAgICAgRE9NLmFwcGVuZENoaWxkKGhvc3QsIERPTS5jcmVhdGVTdHlsZUVsZW1lbnQoc3R5bGUpKTtcbiAgICB9XG4gIH1cbiAgYWRkSG9zdChob3N0Tm9kZTogTm9kZSkge1xuICAgIHRoaXMuX2FkZFN0eWxlc1RvSG9zdCh0aGlzLl9zdHlsZXMsIGhvc3ROb2RlKTtcbiAgICB0aGlzLl9ob3N0Tm9kZXMuYWRkKGhvc3ROb2RlKTtcbiAgfVxuICByZW1vdmVIb3N0KGhvc3ROb2RlOiBOb2RlKSB7IFNldFdyYXBwZXIuZGVsZXRlKHRoaXMuX2hvc3ROb2RlcywgaG9zdE5vZGUpOyB9XG5cbiAgb25TdHlsZXNBZGRlZChhZGRpdGlvbnM6IHN0cmluZ1tdKSB7XG4gICAgdGhpcy5faG9zdE5vZGVzLmZvckVhY2goKGhvc3ROb2RlKSA9PiB7IHRoaXMuX2FkZFN0eWxlc1RvSG9zdChhZGRpdGlvbnMsIGhvc3ROb2RlKTsgfSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vc2hhcmVkX3N0eWxlc19ob3N0LnRzXG4gKiovIiwiaW1wb3J0IHtNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50LCBnbG9iYWwsIHNldFZhbHVlT25QYXRoLCBEYXRlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7c2V0Um9vdERvbUFkYXB0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXJ9IGZyb20gJy4vZ2VuZXJpY19icm93c2VyX2FkYXB0ZXInO1xuXG52YXIgX2F0dHJUb1Byb3BNYXAgPSB7XG4gICdjbGFzcyc6ICdjbGFzc05hbWUnLFxuICAnaW5uZXJIdG1sJzogJ2lubmVySFRNTCcsXG4gICdyZWFkb25seSc6ICdyZWFkT25seScsXG4gICd0YWJpbmRleCc6ICd0YWJJbmRleCdcbn07XG5cbmNvbnN0IERPTV9LRVlfTE9DQVRJT05fTlVNUEFEID0gMztcblxuLy8gTWFwIHRvIGNvbnZlcnQgc29tZSBrZXkgb3Iga2V5SWRlbnRpZmllciB2YWx1ZXMgdG8gd2hhdCB3aWxsIGJlIHJldHVybmVkIGJ5IGdldEV2ZW50S2V5XG52YXIgX2tleU1hcCA9IHtcbiAgLy8gVGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIGhlcmUgZm9yIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJpbGl0eSBhbmQgdG8gbWF0Y2ggdGhlIFczQyBzdGFuZGFyZFxuICAvLyBjZiBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMta2V5L1xuICAnXFxiJzogJ0JhY2tzcGFjZScsXG4gICdcXHQnOiAnVGFiJyxcbiAgJ1xceDdGJzogJ0RlbGV0ZScsXG4gICdcXHgxQic6ICdFc2NhcGUnLFxuICAnRGVsJzogJ0RlbGV0ZScsXG4gICdFc2MnOiAnRXNjYXBlJyxcbiAgJ0xlZnQnOiAnQXJyb3dMZWZ0JyxcbiAgJ1JpZ2h0JzogJ0Fycm93UmlnaHQnLFxuICAnVXAnOiAnQXJyb3dVcCcsXG4gICdEb3duJzogJ0Fycm93RG93bicsXG4gICdNZW51JzogJ0NvbnRleHRNZW51JyxcbiAgJ1Njcm9sbCc6ICdTY3JvbGxMb2NrJyxcbiAgJ1dpbic6ICdPUydcbn07XG5cbi8vIFRoZXJlIGlzIGEgYnVnIGluIENocm9tZSBmb3IgbnVtZXJpYyBrZXlwYWQga2V5czpcbi8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xNTU2NTRcbi8vIDEsIDIsIDMgLi4uIGFyZSByZXBvcnRlZCBhcyBBLCBCLCBDIC4uLlxudmFyIF9jaHJvbWVOdW1LZXlQYWRNYXAgPSB7XG4gICdBJzogJzEnLFxuICAnQic6ICcyJyxcbiAgJ0MnOiAnMycsXG4gICdEJzogJzQnLFxuICAnRSc6ICc1JyxcbiAgJ0YnOiAnNicsXG4gICdHJzogJzcnLFxuICAnSCc6ICc4JyxcbiAgJ0knOiAnOScsXG4gICdKJzogJyonLFxuICAnSyc6ICcrJyxcbiAgJ00nOiAnLScsXG4gICdOJzogJy4nLFxuICAnTyc6ICcvJyxcbiAgJ1xceDYwJzogJzAnLFxuICAnXFx4OTAnOiAnTnVtTG9jaydcbn07XG5cbi8qKlxuICogQSBgRG9tQWRhcHRlcmAgcG93ZXJlZCBieSBmdWxsIGJyb3dzZXIgRE9NIEFQSXMuXG4gKi9cbi8qIHRzbGludDpkaXNhYmxlOnJlcXVpcmVQYXJhbWV0ZXJUeXBlICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckRvbUFkYXB0ZXIgZXh0ZW5kcyBHZW5lcmljQnJvd3NlckRvbUFkYXB0ZXIge1xuICBwYXJzZSh0ZW1wbGF0ZUh0bWw6IHN0cmluZykgeyB0aHJvdyBuZXcgRXJyb3IoXCJwYXJzZSBub3QgaW1wbGVtZW50ZWRcIik7IH1cbiAgc3RhdGljIG1ha2VDdXJyZW50KCkgeyBzZXRSb290RG9tQWRhcHRlcihuZXcgQnJvd3NlckRvbUFkYXB0ZXIoKSk7IH1cbiAgaGFzUHJvcGVydHkoZWxlbWVudCwgbmFtZTogc3RyaW5nKTogYm9vbGVhbiB7IHJldHVybiBuYW1lIGluIGVsZW1lbnQ7IH1cbiAgc2V0UHJvcGVydHkoZWw6IC8qZWxlbWVudCovIGFueSwgbmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSB7IGVsW25hbWVdID0gdmFsdWU7IH1cbiAgZ2V0UHJvcGVydHkoZWw6IC8qZWxlbWVudCovIGFueSwgbmFtZTogc3RyaW5nKTogYW55IHsgcmV0dXJuIGVsW25hbWVdOyB9XG4gIGludm9rZShlbDogLyplbGVtZW50Ki8gYW55LCBtZXRob2ROYW1lOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogYW55IHtcbiAgICBlbFttZXRob2ROYW1lXS5hcHBseShlbCwgYXJncyk7XG4gIH1cblxuICAvLyBUT0RPKHRib3NjaCk6IG1vdmUgdGhpcyBpbnRvIGEgc2VwYXJhdGUgZW52aXJvbm1lbnQgY2xhc3Mgb25jZSB3ZSBoYXZlIGl0XG4gIGxvZ0Vycm9yKGVycm9yKSB7XG4gICAgaWYgKHdpbmRvdy5jb25zb2xlLmVycm9yKSB7XG4gICAgICB3aW5kb3cuY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgbG9nKGVycm9yKSB7IHdpbmRvdy5jb25zb2xlLmxvZyhlcnJvcik7IH1cblxuICBsb2dHcm91cChlcnJvcikge1xuICAgIGlmICh3aW5kb3cuY29uc29sZS5ncm91cCkge1xuICAgICAgd2luZG93LmNvbnNvbGUuZ3JvdXAoZXJyb3IpO1xuICAgICAgdGhpcy5sb2dFcnJvcihlcnJvcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhlcnJvcik7XG4gICAgfVxuICB9XG5cbiAgbG9nR3JvdXBFbmQoKSB7XG4gICAgaWYgKHdpbmRvdy5jb25zb2xlLmdyb3VwRW5kKSB7XG4gICAgICB3aW5kb3cuY29uc29sZS5ncm91cEVuZCgpO1xuICAgIH1cbiAgfVxuXG4gIGdldCBhdHRyVG9Qcm9wTWFwKCk6IGFueSB7IHJldHVybiBfYXR0clRvUHJvcE1hcDsgfVxuXG4gIHF1ZXJ5KHNlbGVjdG9yOiBzdHJpbmcpOiBhbnkgeyByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH1cbiAgcXVlcnlTZWxlY3RvcihlbCwgc2VsZWN0b3I6IHN0cmluZyk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIGVsLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9XG4gIHF1ZXJ5U2VsZWN0b3JBbGwoZWwsIHNlbGVjdG9yOiBzdHJpbmcpOiBhbnlbXSB7IHJldHVybiBlbC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfVxuICBvbihlbCwgZXZ0LCBsaXN0ZW5lcikgeyBlbC5hZGRFdmVudExpc3RlbmVyKGV2dCwgbGlzdGVuZXIsIGZhbHNlKTsgfVxuICBvbkFuZENhbmNlbChlbCwgZXZ0LCBsaXN0ZW5lcik6IEZ1bmN0aW9uIHtcbiAgICBlbC5hZGRFdmVudExpc3RlbmVyKGV2dCwgbGlzdGVuZXIsIGZhbHNlKTtcbiAgICAvLyBOZWVkZWQgdG8gZm9sbG93IERhcnQncyBzdWJzY3JpcHRpb24gc2VtYW50aWMsIHVudGlsIGZpeCBvZlxuICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGFydC9pc3N1ZXMvZGV0YWlsP2lkPTE3NDA2XG4gICAgcmV0dXJuICgpID0+IHsgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnQsIGxpc3RlbmVyLCBmYWxzZSk7IH07XG4gIH1cbiAgZGlzcGF0Y2hFdmVudChlbCwgZXZ0KSB7IGVsLmRpc3BhdGNoRXZlbnQoZXZ0KTsgfVxuICBjcmVhdGVNb3VzZUV2ZW50KGV2ZW50VHlwZTogc3RyaW5nKTogTW91c2VFdmVudCB7XG4gICAgdmFyIGV2dDogTW91c2VFdmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50Jyk7XG4gICAgZXZ0LmluaXRFdmVudChldmVudFR5cGUsIHRydWUsIHRydWUpO1xuICAgIHJldHVybiBldnQ7XG4gIH1cbiAgY3JlYXRlRXZlbnQoZXZlbnRUeXBlKTogRXZlbnQge1xuICAgIHZhciBldnQ6IEV2ZW50ID0gZG9jdW1lbnQuY3JlYXRlRXZlbnQoJ0V2ZW50Jyk7XG4gICAgZXZ0LmluaXRFdmVudChldmVudFR5cGUsIHRydWUsIHRydWUpO1xuICAgIHJldHVybiBldnQ7XG4gIH1cbiAgcHJldmVudERlZmF1bHQoZXZ0OiBFdmVudCkge1xuICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGV2dC5yZXR1cm5WYWx1ZSA9IGZhbHNlO1xuICB9XG4gIGlzUHJldmVudGVkKGV2dDogRXZlbnQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZXZ0LmRlZmF1bHRQcmV2ZW50ZWQgfHwgaXNQcmVzZW50KGV2dC5yZXR1cm5WYWx1ZSkgJiYgIWV2dC5yZXR1cm5WYWx1ZTtcbiAgfVxuICBnZXRJbm5lckhUTUwoZWwpOiBzdHJpbmcgeyByZXR1cm4gZWwuaW5uZXJIVE1MOyB9XG4gIGdldE91dGVySFRNTChlbCk6IHN0cmluZyB7IHJldHVybiBlbC5vdXRlckhUTUw7IH1cbiAgbm9kZU5hbWUobm9kZTogTm9kZSk6IHN0cmluZyB7IHJldHVybiBub2RlLm5vZGVOYW1lOyB9XG4gIG5vZGVWYWx1ZShub2RlOiBOb2RlKTogc3RyaW5nIHsgcmV0dXJuIG5vZGUubm9kZVZhbHVlOyB9XG4gIHR5cGUobm9kZTogSFRNTElucHV0RWxlbWVudCk6IHN0cmluZyB7IHJldHVybiBub2RlLnR5cGU7IH1cbiAgY29udGVudChub2RlOiBOb2RlKTogTm9kZSB7XG4gICAgaWYgKHRoaXMuaGFzUHJvcGVydHkobm9kZSwgXCJjb250ZW50XCIpKSB7XG4gICAgICByZXR1cm4gKDxhbnk+bm9kZSkuY29udGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5vZGU7XG4gICAgfVxuICB9XG4gIGZpcnN0Q2hpbGQoZWwpOiBOb2RlIHsgcmV0dXJuIGVsLmZpcnN0Q2hpbGQ7IH1cbiAgbmV4dFNpYmxpbmcoZWwpOiBOb2RlIHsgcmV0dXJuIGVsLm5leHRTaWJsaW5nOyB9XG4gIHBhcmVudEVsZW1lbnQoZWwpOiBOb2RlIHsgcmV0dXJuIGVsLnBhcmVudE5vZGU7IH1cbiAgY2hpbGROb2RlcyhlbCk6IE5vZGVbXSB7IHJldHVybiBlbC5jaGlsZE5vZGVzOyB9XG4gIGNoaWxkTm9kZXNBc0xpc3QoZWwpOiBhbnlbXSB7XG4gICAgdmFyIGNoaWxkTm9kZXMgPSBlbC5jaGlsZE5vZGVzO1xuICAgIHZhciByZXMgPSBMaXN0V3JhcHBlci5jcmVhdGVGaXhlZFNpemUoY2hpbGROb2Rlcy5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykge1xuICAgICAgcmVzW2ldID0gY2hpbGROb2Rlc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBjbGVhck5vZGVzKGVsKSB7XG4gICAgd2hpbGUgKGVsLmZpcnN0Q2hpbGQpIHtcbiAgICAgIGVsLnJlbW92ZUNoaWxkKGVsLmZpcnN0Q2hpbGQpO1xuICAgIH1cbiAgfVxuICBhcHBlbmRDaGlsZChlbCwgbm9kZSkgeyBlbC5hcHBlbmRDaGlsZChub2RlKTsgfVxuICByZW1vdmVDaGlsZChlbCwgbm9kZSkgeyBlbC5yZW1vdmVDaGlsZChub2RlKTsgfVxuICByZXBsYWNlQ2hpbGQoZWw6IE5vZGUsIG5ld0NoaWxkLCBvbGRDaGlsZCkgeyBlbC5yZXBsYWNlQ2hpbGQobmV3Q2hpbGQsIG9sZENoaWxkKTsgfVxuICByZW1vdmUobm9kZSk6IE5vZGUge1xuICAgIGlmIChub2RlLnBhcmVudE5vZGUpIHtcbiAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cbiAgaW5zZXJ0QmVmb3JlKGVsLCBub2RlKSB7IGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsKTsgfVxuICBpbnNlcnRBbGxCZWZvcmUoZWwsIG5vZGVzKSB7IG5vZGVzLmZvckVhY2gobiA9PiBlbC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShuLCBlbCkpOyB9XG4gIGluc2VydEFmdGVyKGVsLCBub2RlKSB7IGVsLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIGVsLm5leHRTaWJsaW5nKTsgfVxuICBzZXRJbm5lckhUTUwoZWwsIHZhbHVlKSB7IGVsLmlubmVySFRNTCA9IHZhbHVlOyB9XG4gIGdldFRleHQoZWwpOiBzdHJpbmcgeyByZXR1cm4gZWwudGV4dENvbnRlbnQ7IH1cbiAgLy8gVE9ETyh2aWNiKTogcmVtb3ZlZCBFbGVtZW50IHR5cGUgYmVjYXVzZSBpdCBkb2VzIG5vdCBzdXBwb3J0IFN0eWxlRWxlbWVudFxuICBzZXRUZXh0KGVsLCB2YWx1ZTogc3RyaW5nKSB7IGVsLnRleHRDb250ZW50ID0gdmFsdWU7IH1cbiAgZ2V0VmFsdWUoZWwpOiBzdHJpbmcgeyByZXR1cm4gZWwudmFsdWU7IH1cbiAgc2V0VmFsdWUoZWwsIHZhbHVlOiBzdHJpbmcpIHsgZWwudmFsdWUgPSB2YWx1ZTsgfVxuICBnZXRDaGVja2VkKGVsKTogYm9vbGVhbiB7IHJldHVybiBlbC5jaGVja2VkOyB9XG4gIHNldENoZWNrZWQoZWwsIHZhbHVlOiBib29sZWFuKSB7IGVsLmNoZWNrZWQgPSB2YWx1ZTsgfVxuICBjcmVhdGVDb21tZW50KHRleHQ6IHN0cmluZyk6IENvbW1lbnQgeyByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh0ZXh0KTsgfVxuICBjcmVhdGVUZW1wbGF0ZShodG1sKTogSFRNTEVsZW1lbnQge1xuICAgIHZhciB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTtcbiAgICB0LmlubmVySFRNTCA9IGh0bWw7XG4gICAgcmV0dXJuIHQ7XG4gIH1cbiAgY3JlYXRlRWxlbWVudCh0YWdOYW1lLCBkb2MgPSBkb2N1bWVudCk6IEhUTUxFbGVtZW50IHsgcmV0dXJuIGRvYy5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOyB9XG4gIGNyZWF0ZUVsZW1lbnROUyhucywgdGFnTmFtZSwgZG9jID0gZG9jdW1lbnQpOiBFbGVtZW50IHsgcmV0dXJuIGRvYy5jcmVhdGVFbGVtZW50TlMobnMsIHRhZ05hbWUpOyB9XG4gIGNyZWF0ZVRleHROb2RlKHRleHQ6IHN0cmluZywgZG9jID0gZG9jdW1lbnQpOiBUZXh0IHsgcmV0dXJuIGRvYy5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTsgfVxuICBjcmVhdGVTY3JpcHRUYWcoYXR0ck5hbWU6IHN0cmluZywgYXR0clZhbHVlOiBzdHJpbmcsIGRvYyA9IGRvY3VtZW50KTogSFRNTFNjcmlwdEVsZW1lbnQge1xuICAgIHZhciBlbCA9IDxIVE1MU2NyaXB0RWxlbWVudD5kb2MuY3JlYXRlRWxlbWVudCgnU0NSSVBUJyk7XG4gICAgZWwuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBhdHRyVmFsdWUpO1xuICAgIHJldHVybiBlbDtcbiAgfVxuICBjcmVhdGVTdHlsZUVsZW1lbnQoY3NzOiBzdHJpbmcsIGRvYyA9IGRvY3VtZW50KTogSFRNTFN0eWxlRWxlbWVudCB7XG4gICAgdmFyIHN0eWxlID0gPEhUTUxTdHlsZUVsZW1lbnQ+ZG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7XG4gICAgdGhpcy5hcHBlbmRDaGlsZChzdHlsZSwgdGhpcy5jcmVhdGVUZXh0Tm9kZShjc3MpKTtcbiAgICByZXR1cm4gc3R5bGU7XG4gIH1cbiAgY3JlYXRlU2hhZG93Um9vdChlbDogSFRNTEVsZW1lbnQpOiBEb2N1bWVudEZyYWdtZW50IHsgcmV0dXJuICg8YW55PmVsKS5jcmVhdGVTaGFkb3dSb290KCk7IH1cbiAgZ2V0U2hhZG93Um9vdChlbDogSFRNTEVsZW1lbnQpOiBEb2N1bWVudEZyYWdtZW50IHsgcmV0dXJuICg8YW55PmVsKS5zaGFkb3dSb290OyB9XG4gIGdldEhvc3QoZWw6IEhUTUxFbGVtZW50KTogSFRNTEVsZW1lbnQgeyByZXR1cm4gKDxhbnk+ZWwpLmhvc3Q7IH1cbiAgY2xvbmUobm9kZTogTm9kZSk6IE5vZGUgeyByZXR1cm4gbm9kZS5jbG9uZU5vZGUodHJ1ZSk7IH1cbiAgZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBIVE1MRWxlbWVudFtdIHtcbiAgICByZXR1cm4gZWxlbWVudC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG5hbWUpO1xuICB9XG4gIGdldEVsZW1lbnRzQnlUYWdOYW1lKGVsZW1lbnQsIG5hbWU6IHN0cmluZyk6IEhUTUxFbGVtZW50W10ge1xuICAgIHJldHVybiBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKG5hbWUpO1xuICB9XG4gIGNsYXNzTGlzdChlbGVtZW50KTogYW55W10geyByZXR1cm4gPGFueVtdPkFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGVsZW1lbnQuY2xhc3NMaXN0LCAwKTsgfVxuICBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZykgeyBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTsgfVxuICByZW1vdmVDbGFzcyhlbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZykgeyBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTsgfVxuICBoYXNDbGFzcyhlbGVtZW50LCBjbGFzc05hbWU6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKTsgfVxuICBzZXRTdHlsZShlbGVtZW50LCBzdHlsZU5hbWU6IHN0cmluZywgc3R5bGVWYWx1ZTogc3RyaW5nKSB7XG4gICAgZWxlbWVudC5zdHlsZVtzdHlsZU5hbWVdID0gc3R5bGVWYWx1ZTtcbiAgfVxuICByZW1vdmVTdHlsZShlbGVtZW50LCBzdHlsZW5hbWU6IHN0cmluZykgeyBlbGVtZW50LnN0eWxlW3N0eWxlbmFtZV0gPSBudWxsOyB9XG4gIGdldFN0eWxlKGVsZW1lbnQsIHN0eWxlbmFtZTogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIGVsZW1lbnQuc3R5bGVbc3R5bGVuYW1lXTsgfVxuICBoYXNTdHlsZShlbGVtZW50LCBzdHlsZU5hbWU6IHN0cmluZywgc3R5bGVWYWx1ZTogc3RyaW5nID0gbnVsbCk6IGJvb2xlYW4ge1xuICAgIHZhciB2YWx1ZSA9IHRoaXMuZ2V0U3R5bGUoZWxlbWVudCwgc3R5bGVOYW1lKSB8fCAnJztcbiAgICByZXR1cm4gc3R5bGVWYWx1ZSA/IHZhbHVlID09IHN0eWxlVmFsdWUgOiB2YWx1ZS5sZW5ndGggPiAwO1xuICB9XG4gIHRhZ05hbWUoZWxlbWVudCk6IHN0cmluZyB7IHJldHVybiBlbGVtZW50LnRhZ05hbWU7IH1cbiAgYXR0cmlidXRlTWFwKGVsZW1lbnQpOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICB2YXIgcmVzID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICB2YXIgZWxBdHRycyA9IGVsZW1lbnQuYXR0cmlidXRlcztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVsQXR0cnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBhdHRyaWIgPSBlbEF0dHJzW2ldO1xuICAgICAgcmVzLnNldChhdHRyaWIubmFtZSwgYXR0cmliLnZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlcztcbiAgfVxuICBoYXNBdHRyaWJ1dGUoZWxlbWVudCwgYXR0cmlidXRlOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKGF0dHJpYnV0ZSk7IH1cbiAgZ2V0QXR0cmlidXRlKGVsZW1lbnQsIGF0dHJpYnV0ZTogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIGVsZW1lbnQuZ2V0QXR0cmlidXRlKGF0dHJpYnV0ZSk7IH1cbiAgc2V0QXR0cmlidXRlKGVsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykgeyBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7IH1cbiAgc2V0QXR0cmlidXRlTlMoZWxlbWVudCwgbnM6IHN0cmluZywgbmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSB7XG4gICAgZWxlbWVudC5zZXRBdHRyaWJ1dGVOUyhucywgbmFtZSwgdmFsdWUpO1xuICB9XG4gIHJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCBhdHRyaWJ1dGU6IHN0cmluZykgeyBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOyB9XG4gIHRlbXBsYXRlQXdhcmVSb290KGVsKTogYW55IHsgcmV0dXJuIHRoaXMuaXNUZW1wbGF0ZUVsZW1lbnQoZWwpID8gdGhpcy5jb250ZW50KGVsKSA6IGVsOyB9XG4gIGNyZWF0ZUh0bWxEb2N1bWVudCgpOiBIVE1MRG9jdW1lbnQge1xuICAgIHJldHVybiBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ2Zha2VUaXRsZScpO1xuICB9XG4gIGRlZmF1bHREb2MoKTogSFRNTERvY3VtZW50IHsgcmV0dXJuIGRvY3VtZW50OyB9XG4gIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbCk6IGFueSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4ge3RvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgd2lkdGg6IDAsIGhlaWdodDogMH07XG4gICAgfVxuICB9XG4gIGdldFRpdGxlKCk6IHN0cmluZyB7IHJldHVybiBkb2N1bWVudC50aXRsZTsgfVxuICBzZXRUaXRsZShuZXdUaXRsZTogc3RyaW5nKSB7IGRvY3VtZW50LnRpdGxlID0gbmV3VGl0bGUgfHwgJyc7IH1cbiAgZWxlbWVudE1hdGNoZXMobiwgc2VsZWN0b3I6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHZhciBtYXRjaGVzID0gZmFsc2U7XG4gICAgaWYgKG4gaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkge1xuICAgICAgaWYgKG4ubWF0Y2hlcykge1xuICAgICAgICBtYXRjaGVzID0gbi5tYXRjaGVzKHNlbGVjdG9yKTtcbiAgICAgIH0gZWxzZSBpZiAobi5tc01hdGNoZXNTZWxlY3Rvcikge1xuICAgICAgICBtYXRjaGVzID0gbi5tc01hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9IGVsc2UgaWYgKG4ud2Via2l0TWF0Y2hlc1NlbGVjdG9yKSB7XG4gICAgICAgIG1hdGNoZXMgPSBuLndlYmtpdE1hdGNoZXNTZWxlY3RvcihzZWxlY3Rvcik7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBtYXRjaGVzO1xuICB9XG4gIGlzVGVtcGxhdGVFbGVtZW50KGVsOiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZWwgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCAmJiBlbC5ub2RlTmFtZSA9PSBcIlRFTVBMQVRFXCI7XG4gIH1cbiAgaXNUZXh0Tm9kZShub2RlOiBOb2RlKTogYm9vbGVhbiB7IHJldHVybiBub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERTsgfVxuICBpc0NvbW1lbnROb2RlKG5vZGU6IE5vZGUpOiBib29sZWFuIHsgcmV0dXJuIG5vZGUubm9kZVR5cGUgPT09IE5vZGUuQ09NTUVOVF9OT0RFOyB9XG4gIGlzRWxlbWVudE5vZGUobm9kZTogTm9kZSk6IGJvb2xlYW4geyByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREU7IH1cbiAgaGFzU2hhZG93Um9vdChub2RlKTogYm9vbGVhbiB7IHJldHVybiBub2RlIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgJiYgaXNQcmVzZW50KG5vZGUuc2hhZG93Um9vdCk7IH1cbiAgaXNTaGFkb3dSb290KG5vZGUpOiBib29sZWFuIHsgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50OyB9XG4gIGltcG9ydEludG9Eb2Mobm9kZTogTm9kZSk6IGFueSB7XG4gICAgdmFyIHRvSW1wb3J0ID0gbm9kZTtcbiAgICBpZiAodGhpcy5pc1RlbXBsYXRlRWxlbWVudChub2RlKSkge1xuICAgICAgdG9JbXBvcnQgPSB0aGlzLmNvbnRlbnQobm9kZSk7XG4gICAgfVxuICAgIHJldHVybiBkb2N1bWVudC5pbXBvcnROb2RlKHRvSW1wb3J0LCB0cnVlKTtcbiAgfVxuICBhZG9wdE5vZGUobm9kZTogTm9kZSk6IGFueSB7IHJldHVybiBkb2N1bWVudC5hZG9wdE5vZGUobm9kZSk7IH1cbiAgZ2V0SHJlZihlbDogRWxlbWVudCk6IHN0cmluZyB7IHJldHVybiAoPGFueT5lbCkuaHJlZjsgfVxuICBnZXRFdmVudEtleShldmVudCk6IHN0cmluZyB7XG4gICAgdmFyIGtleSA9IGV2ZW50LmtleTtcbiAgICBpZiAoaXNCbGFuayhrZXkpKSB7XG4gICAgICBrZXkgPSBldmVudC5rZXlJZGVudGlmaWVyO1xuICAgICAgLy8ga2V5SWRlbnRpZmllciBpcyBkZWZpbmVkIGluIHRoZSBvbGQgZHJhZnQgb2YgRE9NIExldmVsIDMgRXZlbnRzIGltcGxlbWVudGVkIGJ5IENocm9tZSBhbmRcbiAgICAgIC8vIFNhZmFyaVxuICAgICAgLy8gY2ZcbiAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDcvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDcxMjIxL2V2ZW50cy5odG1sI0V2ZW50cy1LZXlib2FyZEV2ZW50cy1JbnRlcmZhY2VzXG4gICAgICBpZiAoaXNCbGFuayhrZXkpKSB7XG4gICAgICAgIHJldHVybiAnVW5pZGVudGlmaWVkJztcbiAgICAgIH1cbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnVSsnKSkge1xuICAgICAgICBrZXkgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KGtleS5zdWJzdHJpbmcoMiksIDE2KSk7XG4gICAgICAgIGlmIChldmVudC5sb2NhdGlvbiA9PT0gRE9NX0tFWV9MT0NBVElPTl9OVU1QQUQgJiYgX2Nocm9tZU51bUtleVBhZE1hcC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICAgICAgLy8gVGhlcmUgaXMgYSBidWcgaW4gQ2hyb21lIGZvciBudW1lcmljIGtleXBhZCBrZXlzOlxuICAgICAgICAgIC8vIGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD0xNTU2NTRcbiAgICAgICAgICAvLyAxLCAyLCAzIC4uLiBhcmUgcmVwb3J0ZWQgYXMgQSwgQiwgQyAuLi5cbiAgICAgICAgICBrZXkgPSBfY2hyb21lTnVtS2V5UGFkTWFwW2tleV07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKF9rZXlNYXAuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAga2V5ID0gX2tleU1hcFtrZXldO1xuICAgIH1cbiAgICByZXR1cm4ga2V5O1xuICB9XG4gIGdldEdsb2JhbEV2ZW50VGFyZ2V0KHRhcmdldDogc3RyaW5nKTogRXZlbnRUYXJnZXQge1xuICAgIGlmICh0YXJnZXQgPT0gXCJ3aW5kb3dcIikge1xuICAgICAgcmV0dXJuIHdpbmRvdztcbiAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBcImRvY3VtZW50XCIpIHtcbiAgICAgIHJldHVybiBkb2N1bWVudDtcbiAgICB9IGVsc2UgaWYgKHRhcmdldCA9PSBcImJvZHlcIikge1xuICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7XG4gICAgfVxuICB9XG4gIGdldEhpc3RvcnkoKTogSGlzdG9yeSB7IHJldHVybiB3aW5kb3cuaGlzdG9yeTsgfVxuICBnZXRMb2NhdGlvbigpOiBMb2NhdGlvbiB7IHJldHVybiB3aW5kb3cubG9jYXRpb247IH1cbiAgZ2V0QmFzZUhyZWYoKTogc3RyaW5nIHtcbiAgICB2YXIgaHJlZiA9IGdldEJhc2VFbGVtZW50SHJlZigpO1xuICAgIGlmIChpc0JsYW5rKGhyZWYpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHJlbGF0aXZlUGF0aChocmVmKTtcbiAgfVxuICByZXNldEJhc2VFbGVtZW50KCk6IHZvaWQgeyBiYXNlRWxlbWVudCA9IG51bGw7IH1cbiAgZ2V0VXNlckFnZW50KCk6IHN0cmluZyB7IHJldHVybiB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDsgfVxuICBzZXREYXRhKGVsZW1lbnQsIG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZykge1xuICAgIHRoaXMuc2V0QXR0cmlidXRlKGVsZW1lbnQsICdkYXRhLScgKyBuYW1lLCB2YWx1ZSk7XG4gIH1cbiAgZ2V0RGF0YShlbGVtZW50LCBuYW1lOiBzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5nZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ2RhdGEtJyArIG5hbWUpOyB9XG4gIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk6IGFueSB7IHJldHVybiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpOyB9XG4gIC8vIFRPRE8odGJvc2NoKTogbW92ZSB0aGlzIGludG8gYSBzZXBhcmF0ZSBlbnZpcm9ubWVudCBjbGFzcyBvbmNlIHdlIGhhdmUgaXRcbiAgc2V0R2xvYmFsVmFyKHBhdGg6IHN0cmluZywgdmFsdWU6IGFueSkgeyBzZXRWYWx1ZU9uUGF0aChnbG9iYWwsIHBhdGgsIHZhbHVlKTsgfVxuICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoY2FsbGJhY2spOiBudW1iZXIgeyByZXR1cm4gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShjYWxsYmFjayk7IH1cbiAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQ6IG51bWJlcikgeyB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOyB9XG4gIHBlcmZvcm1hbmNlTm93KCk6IG51bWJlciB7XG4gICAgLy8gcGVyZm9ybWFuY2Uubm93KCkgaXMgbm90IGF2YWlsYWJsZSBpbiBhbGwgYnJvd3NlcnMsIHNlZVxuICAgIC8vIGh0dHA6Ly9jYW5pdXNlLmNvbS8jc2VhcmNoPXBlcmZvcm1hbmNlLm5vd1xuICAgIGlmIChpc1ByZXNlbnQod2luZG93LnBlcmZvcm1hbmNlKSAmJiBpc1ByZXNlbnQod2luZG93LnBlcmZvcm1hbmNlLm5vdykpIHtcbiAgICAgIHJldHVybiB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBEYXRlV3JhcHBlci50b01pbGxpcyhEYXRlV3JhcHBlci5ub3coKSk7XG4gICAgfVxuICB9XG59XG5cblxudmFyIGJhc2VFbGVtZW50ID0gbnVsbDtcbmZ1bmN0aW9uIGdldEJhc2VFbGVtZW50SHJlZigpOiBzdHJpbmcge1xuICBpZiAoaXNCbGFuayhiYXNlRWxlbWVudCkpIHtcbiAgICBiYXNlRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Jhc2UnKTtcbiAgICBpZiAoaXNCbGFuayhiYXNlRWxlbWVudCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmFzZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG59XG5cbi8vIGJhc2VkIG9uIHVybFV0aWxzLmpzIGluIEFuZ3VsYXJKUyAxXG52YXIgdXJsUGFyc2luZ05vZGUgPSBudWxsO1xuZnVuY3Rpb24gcmVsYXRpdmVQYXRoKHVybCk6IHN0cmluZyB7XG4gIGlmIChpc0JsYW5rKHVybFBhcnNpbmdOb2RlKSkge1xuICAgIHVybFBhcnNpbmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImFcIik7XG4gIH1cbiAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgdXJsKTtcbiAgcmV0dXJuICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgPyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy8nICsgdXJsUGFyc2luZ05vZGUucGF0aG5hbWU7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci9icm93c2VyX2FkYXB0ZXIudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyLCBTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzRnVuY3Rpb24sIFR5cGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0RvbUFkYXB0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtYSFJJbXBsfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci94aHJfaW1wbCc7XG5cblxuLyoqXG4gKiBQcm92aWRlcyBET00gb3BlcmF0aW9ucyBpbiBhbnkgYnJvd3NlciBlbnZpcm9ubWVudC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEdlbmVyaWNCcm93c2VyRG9tQWRhcHRlciBleHRlbmRzIERvbUFkYXB0ZXIge1xuICBwcml2YXRlIF9hbmltYXRpb25QcmVmaXg6IHN0cmluZyA9IG51bGw7XG4gIHByaXZhdGUgX3RyYW5zaXRpb25FbmQ6IHN0cmluZyA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBlbGVtZW50ID0gdGhpcy5jcmVhdGVFbGVtZW50KCdkaXYnLCB0aGlzLmRlZmF1bHREb2MoKSk7XG4gICAgICBpZiAoaXNQcmVzZW50KHRoaXMuZ2V0U3R5bGUoZWxlbWVudCwgJ2FuaW1hdGlvbk5hbWUnKSkpIHtcbiAgICAgICAgdGhpcy5fYW5pbWF0aW9uUHJlZml4ID0gJyc7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgZG9tUHJlZml4ZXMgPSBbJ1dlYmtpdCcsICdNb3onLCAnTycsICdtcyddO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvbVByZWZpeGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmdldFN0eWxlKGVsZW1lbnQsIGRvbVByZWZpeGVzW2ldICsgJ0FuaW1hdGlvbk5hbWUnKSkpIHtcbiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvblByZWZpeCA9ICctJyArIGRvbVByZWZpeGVzW2ldLnRvTG93ZXJDYXNlKCkgKyAnLSc7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHZhciB0cmFuc0VuZEV2ZW50TmFtZXM6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge1xuICAgICAgICBXZWJraXRUcmFuc2l0aW9uOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG4gICAgICAgIE1velRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJyxcbiAgICAgICAgT1RyYW5zaXRpb246ICdvVHJhbnNpdGlvbkVuZCBvdHJhbnNpdGlvbmVuZCcsXG4gICAgICAgIHRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJ1xuICAgICAgfTtcbiAgICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaCh0cmFuc0VuZEV2ZW50TmFtZXMsICh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5nZXRTdHlsZShlbGVtZW50LCBrZXkpKSkge1xuICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhpcy5fYW5pbWF0aW9uUHJlZml4ID0gbnVsbDtcbiAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmQgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGdldFhIUigpOiBUeXBlIHsgcmV0dXJuIFhIUkltcGw7IH1cbiAgZ2V0RGlzdHJpYnV0ZWROb2RlcyhlbDogSFRNTEVsZW1lbnQpOiBOb2RlW10geyByZXR1cm4gKDxhbnk+ZWwpLmdldERpc3RyaWJ1dGVkTm9kZXMoKTsgfVxuICByZXNvbHZlQW5kU2V0SHJlZihlbDogSFRNTEFuY2hvckVsZW1lbnQsIGJhc2VVcmw6IHN0cmluZywgaHJlZjogc3RyaW5nKSB7XG4gICAgZWwuaHJlZiA9IGhyZWYgPT0gbnVsbCA/IGJhc2VVcmwgOiBiYXNlVXJsICsgJy8uLi8nICsgaHJlZjtcbiAgfVxuICBzdXBwb3J0c0RPTUV2ZW50cygpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cbiAgc3VwcG9ydHNOYXRpdmVTaGFkb3dET00oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzRnVuY3Rpb24oKDxhbnk+dGhpcy5kZWZhdWx0RG9jKCkuYm9keSkuY3JlYXRlU2hhZG93Um9vdCk7XG4gIH1cbiAgZ2V0QW5pbWF0aW9uUHJlZml4KCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9hbmltYXRpb25QcmVmaXgpID8gdGhpcy5fYW5pbWF0aW9uUHJlZml4IDogXCJcIjtcbiAgfVxuICBnZXRUcmFuc2l0aW9uRW5kKCk6IHN0cmluZyB7IHJldHVybiBpc1ByZXNlbnQodGhpcy5fdHJhbnNpdGlvbkVuZCkgPyB0aGlzLl90cmFuc2l0aW9uRW5kIDogXCJcIjsgfVxuICBzdXBwb3J0c0FuaW1hdGlvbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaXNQcmVzZW50KHRoaXMuX2FuaW1hdGlvblByZWZpeCkgJiYgaXNQcmVzZW50KHRoaXMuX3RyYW5zaXRpb25FbmQpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci9nZW5lcmljX2Jyb3dzZXJfYWRhcHRlci50c1xuICoqLyIsImltcG9ydCB7UHJvbWlzZSwgUHJvbWlzZVdyYXBwZXIsIFByb21pc2VDb21wbGV0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvcHJvbWlzZSc7XG5pbXBvcnQge2lzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7WEhSfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyJztcblxuZXhwb3J0IGNsYXNzIFhIUkltcGwgZXh0ZW5kcyBYSFIge1xuICBnZXQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHZhciBjb21wbGV0ZXI6IFByb21pc2VDb21wbGV0ZXIgPCBzdHJpbmcgPj0gUHJvbWlzZVdyYXBwZXIuY29tcGxldGVyKCk7XG4gICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpO1xuICAgIHhoci5yZXNwb25zZVR5cGUgPSAndGV4dCc7XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICAvLyByZXNwb25zZVRleHQgaXMgdGhlIG9sZC1zY2hvb2wgd2F5IG9mIHJldHJpZXZpbmcgcmVzcG9uc2UgKHN1cHBvcnRlZCBieSBJRTggJiA5KVxuICAgICAgLy8gcmVzcG9uc2UvcmVzcG9uc2VUeXBlIHByb3BlcnRpZXMgd2VyZSBpbnRyb2R1Y2VkIGluIFhIUiBMZXZlbDIgc3BlYyAoc3VwcG9ydGVkIGJ5IElFMTApXG4gICAgICB2YXIgcmVzcG9uc2UgPSBpc1ByZXNlbnQoeGhyLnJlc3BvbnNlKSA/IHhoci5yZXNwb25zZSA6IHhoci5yZXNwb25zZVRleHQ7XG5cbiAgICAgIC8vIG5vcm1hbGl6ZSBJRTkgYnVnIChodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xNDUwKVxuICAgICAgdmFyIHN0YXR1cyA9IHhoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiB4aHIuc3RhdHVzO1xuXG4gICAgICAvLyBmaXggc3RhdHVzIGNvZGUgd2hlbiBpdCBpcyAwICgwIHN0YXR1cyBpcyB1bmRvY3VtZW50ZWQpLlxuICAgICAgLy8gT2NjdXJzIHdoZW4gYWNjZXNzaW5nIGZpbGUgcmVzb3VyY2VzIG9yIG9uIEFuZHJvaWQgNC4xIHN0b2NrIGJyb3dzZXJcbiAgICAgIC8vIHdoaWxlIHJldHJpZXZpbmcgZmlsZXMgZnJvbSBhcHBsaWNhdGlvbiBjYWNoZS5cbiAgICAgIGlmIChzdGF0dXMgPT09IDApIHtcbiAgICAgICAgc3RhdHVzID0gcmVzcG9uc2UgPyAyMDAgOiAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoMjAwIDw9IHN0YXR1cyAmJiBzdGF0dXMgPD0gMzAwKSB7XG4gICAgICAgIGNvbXBsZXRlci5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbXBsZXRlci5yZWplY3QoYEZhaWxlZCB0byBsb2FkICR7dXJsfWAsIG51bGwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICB4aHIub25lcnJvciA9IGZ1bmN0aW9uKCkgeyBjb21wbGV0ZXIucmVqZWN0KGBGYWlsZWQgdG8gbG9hZCAke3VybH1gLCBudWxsKTsgfTtcblxuICAgIHhoci5zZW5kKCk7XG4gICAgcmV0dXJuIGNvbXBsZXRlci5wcm9taXNlO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci94aHJfaW1wbC50c1xuICoqLyIsImltcG9ydCB7TWFwLCBNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7Q09OU1QsIENPTlNUX0VYUFIsIGdsb2JhbCwgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQcm9taXNlV3JhcHBlciwgT2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuXG5pbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5cbmltcG9ydCB7XG4gIEluamVjdGFibGUsXG4gIFRlc3RhYmlsaXR5UmVnaXN0cnksXG4gIFRlc3RhYmlsaXR5LFxuICBHZXRUZXN0YWJpbGl0eSxcbiAgc2V0VGVzdGFiaWxpdHlHZXR0ZXJcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmNsYXNzIFB1YmxpY1Rlc3RhYmlsaXR5IHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdGVzdGFiaWxpdHk6IFRlc3RhYmlsaXR5O1xuXG4gIGNvbnN0cnVjdG9yKHRlc3RhYmlsaXR5OiBUZXN0YWJpbGl0eSkgeyB0aGlzLl90ZXN0YWJpbGl0eSA9IHRlc3RhYmlsaXR5OyB9XG5cbiAgaXNTdGFibGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl90ZXN0YWJpbGl0eS5pc1N0YWJsZSgpOyB9XG5cbiAgd2hlblN0YWJsZShjYWxsYmFjazogRnVuY3Rpb24pIHsgdGhpcy5fdGVzdGFiaWxpdHkud2hlblN0YWJsZShjYWxsYmFjayk7IH1cblxuICBmaW5kQmluZGluZ3ModXNpbmc6IGFueSwgcHJvdmlkZXI6IHN0cmluZywgZXhhY3RNYXRjaDogYm9vbGVhbik6IGFueVtdIHtcbiAgICByZXR1cm4gdGhpcy5maW5kUHJvdmlkZXJzKHVzaW5nLCBwcm92aWRlciwgZXhhY3RNYXRjaCk7XG4gIH1cblxuICBmaW5kUHJvdmlkZXJzKHVzaW5nOiBhbnksIHByb3ZpZGVyOiBzdHJpbmcsIGV4YWN0TWF0Y2g6IGJvb2xlYW4pOiBhbnlbXSB7XG4gICAgcmV0dXJuIHRoaXMuX3Rlc3RhYmlsaXR5LmZpbmRCaW5kaW5ncyh1c2luZywgcHJvdmlkZXIsIGV4YWN0TWF0Y2gpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBCcm93c2VyR2V0VGVzdGFiaWxpdHkgaW1wbGVtZW50cyBHZXRUZXN0YWJpbGl0eSB7XG4gIHN0YXRpYyBpbml0KCkgeyBzZXRUZXN0YWJpbGl0eUdldHRlcihuZXcgQnJvd3NlckdldFRlc3RhYmlsaXR5KCkpOyB9XG5cbiAgYWRkVG9XaW5kb3cocmVnaXN0cnk6IFRlc3RhYmlsaXR5UmVnaXN0cnkpOiB2b2lkIHtcbiAgICBnbG9iYWwuZ2V0QW5ndWxhclRlc3RhYmlsaXR5ID0gKGVsZW06IGFueSwgZmluZEluQW5jZXN0b3JzOiBib29sZWFuID0gdHJ1ZSkgPT4ge1xuICAgICAgdmFyIHRlc3RhYmlsaXR5ID0gcmVnaXN0cnkuZmluZFRlc3RhYmlsaXR5SW5UcmVlKGVsZW0sIGZpbmRJbkFuY2VzdG9ycyk7XG4gICAgICBpZiAodGVzdGFiaWxpdHkgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHRlc3RhYmlsaXR5IGZvciBlbGVtZW50LicpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBQdWJsaWNUZXN0YWJpbGl0eSh0ZXN0YWJpbGl0eSk7XG4gICAgfTtcblxuICAgIGdsb2JhbC5nZXRBbGxBbmd1bGFyVGVzdGFiaWxpdGllcyA9ICgpID0+IHtcbiAgICAgIHZhciB0ZXN0YWJpbGl0aWVzID0gcmVnaXN0cnkuZ2V0QWxsVGVzdGFiaWxpdGllcygpO1xuICAgICAgcmV0dXJuIHRlc3RhYmlsaXRpZXMubWFwKCh0ZXN0YWJpbGl0eSkgPT4geyByZXR1cm4gbmV3IFB1YmxpY1Rlc3RhYmlsaXR5KHRlc3RhYmlsaXR5KTsgfSk7XG4gICAgfTtcbiAgfVxuXG4gIGZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeTogVGVzdGFiaWxpdHlSZWdpc3RyeSwgZWxlbTogYW55LFxuICAgICAgICAgICAgICAgICAgICAgICAgZmluZEluQW5jZXN0b3JzOiBib29sZWFuKTogVGVzdGFiaWxpdHkge1xuICAgIGlmIChlbGVtID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICB2YXIgdCA9IHJlZ2lzdHJ5LmdldFRlc3RhYmlsaXR5KGVsZW0pO1xuICAgIGlmIChpc1ByZXNlbnQodCkpIHtcbiAgICAgIHJldHVybiB0O1xuICAgIH0gZWxzZSBpZiAoIWZpbmRJbkFuY2VzdG9ycykge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChET00uaXNTaGFkb3dSb290KGVsZW0pKSB7XG4gICAgICByZXR1cm4gdGhpcy5maW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnksIERPTS5nZXRIb3N0KGVsZW0pLCB0cnVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmluZFRlc3RhYmlsaXR5SW5UcmVlKHJlZ2lzdHJ5LCBET00ucGFyZW50RWxlbWVudChlbGVtKSwgdHJ1ZSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9icm93c2VyL3Rlc3RhYmlsaXR5LnRzXG4gKiovIiwiLyoqXG4gKiBUaGlzIGlzIGhlcmUgYmVjYXVzZSBEQVJUIHJlcXVpcmVzIGl0LiBJdCBpcyBub29wIGluIEpTLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd3RmSW5pdCgpIHt9XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvY29yZS9wcm9maWxlL3d0Zl9pbml0LnRzXG4gKiovIiwiaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuXG4vKipcbiAqIEEgc2VydmljZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCBhbmQgc2V0IHRoZSB0aXRsZSBvZiBhIGN1cnJlbnQgSFRNTCBkb2N1bWVudC5cbiAqXG4gKiBTaW5jZSBhbiBBbmd1bGFyIDIgYXBwbGljYXRpb24gY2FuJ3QgYmUgYm9vdHN0cmFwcGVkIG9uIHRoZSBlbnRpcmUgSFRNTCBkb2N1bWVudCAoYDxodG1sPmAgdGFnKVxuICogaXQgaXMgbm90IHBvc3NpYmxlIHRvIGJpbmQgdG8gdGhlIGB0ZXh0YCBwcm9wZXJ0eSBvZiB0aGUgYEhUTUxUaXRsZUVsZW1lbnRgIGVsZW1lbnRzXG4gKiAocmVwcmVzZW50aW5nIHRoZSBgPHRpdGxlPmAgdGFnKS4gSW5zdGVhZCwgdGhpcyBzZXJ2aWNlIGNhbiBiZSB1c2VkIHRvIHNldCBhbmQgZ2V0IHRoZSBjdXJyZW50XG4gKiB0aXRsZSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRpdGxlIHtcbiAgLyoqXG4gICAqIEdldCB0aGUgdGl0bGUgb2YgdGhlIGN1cnJlbnQgSFRNTCBkb2N1bWVudC5cbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGdldFRpdGxlKCk6IHN0cmluZyB7IHJldHVybiBET00uZ2V0VGl0bGUoKTsgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IEhUTUwgZG9jdW1lbnQuXG4gICAqIEBwYXJhbSBuZXdUaXRsZVxuICAgKi9cbiAgc2V0VGl0bGUobmV3VGl0bGU6IHN0cmluZykgeyBET00uc2V0VGl0bGUobmV3VGl0bGUpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vYnJvd3Nlci90aXRsZS50c1xuICoqLyIsIi8qKlxuICogVGhpcyBpcyBhIHNldCBvZiBjbGFzc2VzIGFuZCBvYmplY3RzIHRoYXQgY2FuIGJlIHVzZWQgYm90aCBpbiB0aGUgYnJvd3NlciBhbmQgb24gdGhlIHNlcnZlci5cbiAqL1xuZXhwb3J0IHtET00sIHNldFJvb3REb21BZGFwdGVyLCBEb21BZGFwdGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcbmV4cG9ydCB7RG9tUmVuZGVyZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX3JlbmRlcmVyJztcbmV4cG9ydCB7RE9DVU1FTlR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX3Rva2Vucyc7XG5leHBvcnQge1NoYXJlZFN0eWxlc0hvc3QsIERvbVNoYXJlZFN0eWxlc0hvc3R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vc2hhcmVkX3N0eWxlc19ob3N0JztcbmV4cG9ydCB7RG9tRXZlbnRzUGx1Z2lufSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9kb21fZXZlbnRzJztcbmV4cG9ydCB7XG4gIEVWRU5UX01BTkFHRVJfUExVR0lOUyxcbiAgRXZlbnRNYW5hZ2VyLFxuICBFdmVudE1hbmFnZXJQbHVnaW5cbn0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9ldmVudHMvZXZlbnRfbWFuYWdlcic7XG5leHBvcnQgKiBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RlYnVnL2J5JztcbmV4cG9ydCAqIGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZGVidWcvZGVidWdfZWxlbWVudF92aWV3X2xpc3RlbmVyJztcblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9wbGF0Zm9ybS9jb21tb25fZG9tLnRzXG4gKiovIiwiaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge1ByZWRpY2F0ZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7RE9NfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcbmltcG9ydCB7RGVidWdFbGVtZW50fSBmcm9tICdhbmd1bGFyMi9jb3JlJztcblxuLyoqXG4gKiBQcmVkaWNhdGVzIGZvciB1c2Ugd2l0aCB7QGxpbmsgRGVidWdFbGVtZW50fSdzIHF1ZXJ5IGZ1bmN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJ5IHtcbiAgLyoqXG4gICAqIE1hdGNoIGFsbCBlbGVtZW50cy5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgcGxhdGZvcm0vZG9tL2RlYnVnL3RzL2J5L2J5LnRzIHJlZ2lvbj0nYnlfYWxsJ31cbiAgICovXG4gIHN0YXRpYyBhbGwoKTogUHJlZGljYXRlPERlYnVnRWxlbWVudD4geyByZXR1cm4gKGRlYnVnRWxlbWVudCkgPT4gdHJ1ZTsgfVxuXG4gIC8qKlxuICAgKiBNYXRjaCBlbGVtZW50cyBieSB0aGUgZ2l2ZW4gQ1NTIHNlbGVjdG9yLlxuICAgKlxuICAgKiAjIyBFeGFtcGxlXG4gICAqXG4gICAqIHtAZXhhbXBsZSBwbGF0Zm9ybS9kb20vZGVidWcvdHMvYnkvYnkudHMgcmVnaW9uPSdieV9jc3MnfVxuICAgKi9cbiAgc3RhdGljIGNzcyhzZWxlY3Rvcjogc3RyaW5nKTogUHJlZGljYXRlPERlYnVnRWxlbWVudD4ge1xuICAgIHJldHVybiAoZGVidWdFbGVtZW50KSA9PiB7XG4gICAgICByZXR1cm4gaXNQcmVzZW50KGRlYnVnRWxlbWVudC5uYXRpdmVFbGVtZW50KSA/XG4gICAgICAgICAgICAgICAgIERPTS5lbGVtZW50TWF0Y2hlcyhkZWJ1Z0VsZW1lbnQubmF0aXZlRWxlbWVudCwgc2VsZWN0b3IpIDpcbiAgICAgICAgICAgICAgICAgZmFsc2U7XG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXRjaCBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIGdpdmVuIGRpcmVjdGl2ZSBwcmVzZW50LlxuICAgKlxuICAgKiAjIyBFeGFtcGxlXG4gICAqXG4gICAqIHtAZXhhbXBsZSBwbGF0Zm9ybS9kb20vZGVidWcvdHMvYnkvYnkudHMgcmVnaW9uPSdieV9kaXJlY3RpdmUnfVxuICAgKi9cbiAgc3RhdGljIGRpcmVjdGl2ZSh0eXBlOiBUeXBlKTogUHJlZGljYXRlPERlYnVnRWxlbWVudD4ge1xuICAgIHJldHVybiAoZGVidWdFbGVtZW50KSA9PiB7IHJldHVybiBkZWJ1Z0VsZW1lbnQuaGFzRGlyZWN0aXZlKHR5cGUpOyB9O1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RlYnVnL2J5LnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSLCBpc1ByZXNlbnQsIE51bWJlcldyYXBwZXIsIFN0cmluZ1dyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge01hcFdyYXBwZXIsIE1hcCwgTGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0luamVjdGFibGUsIHByb3ZpZGUsIFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0FwcFZpZXdMaXN0ZW5lcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfbGlzdGVuZXInO1xuaW1wb3J0IHtBcHBWaWV3fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlldyc7XG5pbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5pbXBvcnQge1JlbmRlcmVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpJztcbmltcG9ydCB7RGVidWdFbGVtZW50LCBEZWJ1Z0VsZW1lbnRffSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kZWJ1Zy9kZWJ1Z19lbGVtZW50JztcblxuY29uc3QgTkdfSURfUFJPUEVSVFkgPSAnbmdpZCc7XG5jb25zdCBJTlNQRUNUX0dMT0JBTF9OQU1FID0gJ25nLnByb2JlJztcblxuY29uc3QgTkdfSURfU0VQQVJBVE9SID0gJyMnO1xuXG4vLyBOZWVkIHRvIGtlZXAgdGhlIHZpZXdzIGluIGEgZ2xvYmFsIE1hcCBzbyB0aGF0IG11bHRpcGxlIGFuZ3VsYXIgYXBwcyBhcmUgc3VwcG9ydGVkXG52YXIgX2FsbElkc0J5VmlldyA9IG5ldyBNYXA8QXBwVmlldywgbnVtYmVyPigpO1xudmFyIF9hbGxWaWV3c0J5SWQgPSBuZXcgTWFwPG51bWJlciwgQXBwVmlldz4oKTtcblxudmFyIF9uZXh0SWQgPSAwO1xuXG5mdW5jdGlvbiBfc2V0RWxlbWVudElkKGVsZW1lbnQsIGluZGljZXM6IG51bWJlcltdKSB7XG4gIGlmIChpc1ByZXNlbnQoZWxlbWVudCkgJiYgRE9NLmlzRWxlbWVudE5vZGUoZWxlbWVudCkpIHtcbiAgICBET00uc2V0RGF0YShlbGVtZW50LCBOR19JRF9QUk9QRVJUWSwgaW5kaWNlcy5qb2luKE5HX0lEX1NFUEFSQVRPUikpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9nZXRFbGVtZW50SWQoZWxlbWVudCk6IG51bWJlcltdIHtcbiAgdmFyIGVsSWQgPSBET00uZ2V0RGF0YShlbGVtZW50LCBOR19JRF9QUk9QRVJUWSk7XG4gIGlmIChpc1ByZXNlbnQoZWxJZCkpIHtcbiAgICByZXR1cm4gZWxJZC5zcGxpdChOR19JRF9TRVBBUkFUT1IpLm1hcChwYXJ0U3RyID0+IE51bWJlcldyYXBwZXIucGFyc2VJbnQocGFydFN0ciwgMTApKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSB7QGxpbmsgRGVidWdFbGVtZW50fSBmb3IgdGhlIGdpdmVuIG5hdGl2ZSBET00gZWxlbWVudCwgb3JcbiAqIG51bGwgaWYgdGhlIGdpdmVuIG5hdGl2ZSBlbGVtZW50IGRvZXMgbm90IGhhdmUgYW4gQW5ndWxhciB2aWV3IGFzc29jaWF0ZWRcbiAqIHdpdGggaXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnNwZWN0TmF0aXZlRWxlbWVudChlbGVtZW50KTogRGVidWdFbGVtZW50IHtcbiAgdmFyIGVsSWQgPSBfZ2V0RWxlbWVudElkKGVsZW1lbnQpO1xuICBpZiAoaXNQcmVzZW50KGVsSWQpKSB7XG4gICAgdmFyIHZpZXcgPSBfYWxsVmlld3NCeUlkLmdldChlbElkWzBdKTtcbiAgICBpZiAoaXNQcmVzZW50KHZpZXcpKSB7XG4gICAgICByZXR1cm4gbmV3IERlYnVnRWxlbWVudF8odmlldywgZWxJZFsxXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGVidWdFbGVtZW50Vmlld0xpc3RlbmVyIGltcGxlbWVudHMgQXBwVmlld0xpc3RlbmVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVuZGVyZXI6IFJlbmRlcmVyKSB7XG4gICAgRE9NLnNldEdsb2JhbFZhcihJTlNQRUNUX0dMT0JBTF9OQU1FLCBpbnNwZWN0TmF0aXZlRWxlbWVudCk7XG4gIH1cblxuICBvblZpZXdDcmVhdGVkKHZpZXc6IEFwcFZpZXcpIHtcbiAgICB2YXIgdmlld0lkID0gX25leHRJZCsrO1xuICAgIF9hbGxWaWV3c0J5SWQuc2V0KHZpZXdJZCwgdmlldyk7XG4gICAgX2FsbElkc0J5Vmlldy5zZXQodmlldywgdmlld0lkKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcuZWxlbWVudFJlZnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBlbCA9IHZpZXcuZWxlbWVudFJlZnNbaV07XG4gICAgICBfc2V0RWxlbWVudElkKHRoaXMuX3JlbmRlcmVyLmdldE5hdGl2ZUVsZW1lbnRTeW5jKGVsKSwgW3ZpZXdJZCwgaV0pO1xuICAgIH1cbiAgfVxuXG4gIG9uVmlld0Rlc3Ryb3llZCh2aWV3OiBBcHBWaWV3KSB7XG4gICAgdmFyIHZpZXdJZCA9IF9hbGxJZHNCeVZpZXcuZ2V0KHZpZXcpO1xuICAgIF9hbGxJZHNCeVZpZXcuZGVsZXRlKHZpZXcpO1xuICAgIF9hbGxWaWV3c0J5SWQuZGVsZXRlKHZpZXdJZCk7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcnMgd2hpY2ggc3VwcG9ydCBkZWJ1Z2dpbmcgQW5ndWxhciBhcHBsaWNhdGlvbnMgKGUuZy4gdmlhIGBuZy5wcm9iZWApLlxuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgcGxhdGZvcm0vZG9tL2RlYnVnL3RzL2RlYnVnX2VsZW1lbnRfdmlld19saXN0ZW5lci9wcm92aWRlcnMudHMgcmVnaW9uPSdwcm92aWRlcnMnfVxuICovXG5leHBvcnQgY29uc3QgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlM6IGFueVtdID0gQ09OU1RfRVhQUihbXG4gIERlYnVnRWxlbWVudFZpZXdMaXN0ZW5lcixcbiAgQ09OU1RfRVhQUihuZXcgUHJvdmlkZXIoQXBwVmlld0xpc3RlbmVyLCB7dXNlRXhpc3Rpbmc6IERlYnVnRWxlbWVudFZpZXdMaXN0ZW5lcn0pKSxcbl0pO1xuXG4vKipcbiAqIFVzZSB7QGxpbmsgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlN9LlxuICpcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBjb25zdCBFTEVNRU5UX1BST0JFX0JJTkRJTkdTID0gRUxFTUVOVF9QUk9CRV9QUk9WSURFUlM7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RlYnVnL2RlYnVnX2VsZW1lbnRfdmlld19saXN0ZW5lci50c1xuICoqLyIsImltcG9ydCB7Z2xvYmFsfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtDb21wb25lbnRSZWZ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9keW5hbWljX2NvbXBvbmVudF9sb2FkZXInO1xuaW1wb3J0IHtBbmd1bGFyVG9vbHN9IGZyb20gJy4vY29tbW9uX3Rvb2xzJztcblxudmFyIGNvbnRleHQgPSA8YW55Pmdsb2JhbDtcblxuLyoqXG4gKiBFbmFibGVkIEFuZ3VsYXIgMiBkZWJ1ZyB0b29scyB0aGF0IGFyZSBhY2Nlc3NpYmxlIHZpYSB5b3VyIGJyb3dzZXInc1xuICogZGV2ZWxvcGVyIGNvbnNvbGUuXG4gKlxuICogVXNhZ2U6XG4gKlxuICogMS4gT3BlbiBkZXZlbG9wZXIgY29uc29sZSAoZS5nLiBpbiBDaHJvbWUgQ3RybCArIFNoaWZ0ICsgailcbiAqIDEuIFR5cGUgYG5nLmAgKHVzdWFsbHkgdGhlIGNvbnNvbGUgd2lsbCBzaG93IGF1dG8tY29tcGxldGUgc3VnZ2VzdGlvbilcbiAqIDEuIFRyeSB0aGUgY2hhbmdlIGRldGVjdGlvbiBwcm9maWxlciBgbmcucHJvZmlsZXIudGltZUNoYW5nZURldGVjdGlvbigpYFxuICogICAgdGhlbiBoaXQgRW50ZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbmFibGVEZWJ1Z1Rvb2xzKHJlZjogQ29tcG9uZW50UmVmKTogdm9pZCB7XG4gIGNvbnRleHQubmcgPSBuZXcgQW5ndWxhclRvb2xzKHJlZik7XG59XG5cbi8qKlxuICogRGlzYWJsZXMgQW5ndWxhciAyIHRvb2xzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzYWJsZURlYnVnVG9vbHMoKTogdm9pZCB7XG4gIGRlbGV0ZSBjb250ZXh0Lm5nO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdG9vbHMvdG9vbHMudHNcbiAqKi8iLCJpbXBvcnQge0FwcGxpY2F0aW9uUmVmfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9hcHBsaWNhdGlvbl9yZWYnO1xuaW1wb3J0IHtDb21wb25lbnRSZWYsIENvbXBvbmVudFJlZl99IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9keW5hbWljX2NvbXBvbmVudF9sb2FkZXInO1xuaW1wb3J0IHtpc1ByZXNlbnQsIE51bWJlcldyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge3dpbmRvd30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9icm93c2VyJztcbmltcG9ydCB7RE9NfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV9hZGFwdGVyJztcblxuLyoqXG4gKiBFbnRyeSBwb2ludCBmb3IgYWxsIEFuZ3VsYXIgZGVidWcgdG9vbHMuIFRoaXMgb2JqZWN0IGNvcnJlc3BvbmRzIHRvIHRoZSBgbmdgXG4gKiBnbG9iYWwgdmFyaWFibGUgYWNjZXNzaWJsZSBpbiB0aGUgZGV2IGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbmd1bGFyVG9vbHMge1xuICBwcm9maWxlcjogQW5ndWxhclByb2ZpbGVyO1xuXG4gIGNvbnN0cnVjdG9yKHJlZjogQ29tcG9uZW50UmVmKSB7IHRoaXMucHJvZmlsZXIgPSBuZXcgQW5ndWxhclByb2ZpbGVyKHJlZik7IH1cbn1cblxuLyoqXG4gKiBFbnRyeSBwb2ludCBmb3IgYWxsIEFuZ3VsYXIgcHJvZmlsaW5nLXJlbGF0ZWQgZGVidWcgdG9vbHMuIFRoaXMgb2JqZWN0XG4gKiBjb3JyZXNwb25kcyB0byB0aGUgYG5nLnByb2ZpbGVyYCBpbiB0aGUgZGV2IGNvbnNvbGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBBbmd1bGFyUHJvZmlsZXIge1xuICBhcHBSZWY6IEFwcGxpY2F0aW9uUmVmO1xuXG4gIGNvbnN0cnVjdG9yKHJlZjogQ29tcG9uZW50UmVmKSB7XG4gICAgdGhpcy5hcHBSZWYgPSAoPENvbXBvbmVudFJlZl8+cmVmKS5pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZXJjaXNlcyBjaGFuZ2UgZGV0ZWN0aW9uIGluIGEgbG9vcCBhbmQgdGhlbiBwcmludHMgdGhlIGF2ZXJhZ2UgYW1vdW50IG9mXG4gICAqIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGhvdyBsb25nIGEgc2luZ2xlIHJvdW5kIG9mIGNoYW5nZSBkZXRlY3Rpb24gdGFrZXMgZm9yXG4gICAqIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBVSS4gSXQgcnVucyBhIG1pbmltdW0gb2YgNSByb3VuZHMgZm9yIGEgbWluaW11bVxuICAgKiBvZiA1MDAgbWlsbGlzZWNvbmRzLlxuICAgKlxuICAgKiBPcHRpb25hbGx5LCBhIHVzZXIgbWF5IHBhc3MgYSBgY29uZmlnYCBwYXJhbWV0ZXIgY29udGFpbmluZyBhIG1hcCBvZlxuICAgKiBvcHRpb25zLiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gICAqXG4gICAqIGByZWNvcmRgIChib29sZWFuKSAtIGNhdXNlcyB0aGUgcHJvZmlsZXIgdG8gcmVjb3JkIGEgQ1BVIHByb2ZpbGUgd2hpbGVcbiAgICogaXQgZXhlcmNpc2VzIHRoZSBjaGFuZ2UgZGV0ZWN0b3IuIEV4YW1wbGU6XG4gICAqXG4gICAqIGBgYFxuICAgKiBuZy5wcm9maWxlci50aW1lQ2hhbmdlRGV0ZWN0aW9uKHtyZWNvcmQ6IHRydWV9KVxuICAgKiBgYGBcbiAgICovXG4gIHRpbWVDaGFuZ2VEZXRlY3Rpb24oY29uZmlnOiBhbnkpIHtcbiAgICB2YXIgcmVjb3JkID0gaXNQcmVzZW50KGNvbmZpZykgJiYgY29uZmlnWydyZWNvcmQnXTtcbiAgICB2YXIgcHJvZmlsZU5hbWUgPSAnQ2hhbmdlIERldGVjdGlvbic7XG4gICAgLy8gUHJvZmlsZXIgaXMgbm90IGF2YWlsYWJsZSBpbiBBbmRyb2lkIGJyb3dzZXJzLCBub3IgaW4gSUUgOSB3aXRob3V0IGRldiB0b29scyBvcGVuZWRcbiAgICB2YXIgaXNQcm9maWxlckF2YWlsYWJsZSA9IGlzUHJlc2VudCh3aW5kb3cuY29uc29sZS5wcm9maWxlKTtcbiAgICBpZiAocmVjb3JkICYmIGlzUHJvZmlsZXJBdmFpbGFibGUpIHtcbiAgICAgIHdpbmRvdy5jb25zb2xlLnByb2ZpbGUocHJvZmlsZU5hbWUpO1xuICAgIH1cbiAgICB2YXIgc3RhcnQgPSBET00ucGVyZm9ybWFuY2VOb3coKTtcbiAgICB2YXIgbnVtVGlja3MgPSAwO1xuICAgIHdoaWxlIChudW1UaWNrcyA8IDUgfHwgKERPTS5wZXJmb3JtYW5jZU5vdygpIC0gc3RhcnQpIDwgNTAwKSB7XG4gICAgICB0aGlzLmFwcFJlZi50aWNrKCk7XG4gICAgICBudW1UaWNrcysrO1xuICAgIH1cbiAgICB2YXIgZW5kID0gRE9NLnBlcmZvcm1hbmNlTm93KCk7XG4gICAgaWYgKHJlY29yZCAmJiBpc1Byb2ZpbGVyQXZhaWxhYmxlKSB7XG4gICAgICAvLyBuZWVkIHRvIGNhc3QgdG8gPGFueT4gYmVjYXVzZSB0eXBlIGNoZWNrZXIgdGhpbmtzIHRoZXJlJ3Mgbm8gYXJndW1lbnRcbiAgICAgIC8vIHdoaWxlIGluIGZhY3QgdGhlcmUgaXM6XG4gICAgICAvL1xuICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0NvbnNvbGUvcHJvZmlsZUVuZFxuICAgICAgKDxhbnk+d2luZG93LmNvbnNvbGUucHJvZmlsZUVuZCkocHJvZmlsZU5hbWUpO1xuICAgIH1cbiAgICB2YXIgbXNQZXJUaWNrID0gKGVuZCAtIHN0YXJ0KSAvIG51bVRpY2tzO1xuICAgIHdpbmRvdy5jb25zb2xlLmxvZyhgcmFuICR7bnVtVGlja3N9IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzYCk7XG4gICAgd2luZG93LmNvbnNvbGUubG9nKGAke051bWJlcldyYXBwZXIudG9GaXhlZChtc1BlclRpY2ssIDIpfSBtcyBwZXIgY2hlY2tgKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2Jyb3dzZXIvdG9vbHMvY29tbW9uX3Rvb2xzLnRzXG4gKiovIiwiLyoqXG4gKiBKUyB2ZXJzaW9uIG9mIGJyb3dzZXIgQVBJcy4gVGhpcyBsaWJyYXJ5IGNhbiBvbmx5IHJ1biBpbiB0aGUgYnJvd3Nlci5cbiAqL1xudmFyIHdpbiA9IHdpbmRvdztcblxuZXhwb3J0IHt3aW4gYXMgd2luZG93fTtcbmV4cG9ydCB2YXIgZG9jdW1lbnQgPSB3aW5kb3cuZG9jdW1lbnQ7XG5leHBvcnQgdmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uO1xuZXhwb3J0IHZhciBnYyA9IHdpbmRvd1snZ2MnXSA/ICgpID0+IHdpbmRvd1snZ2MnXSgpIDogKCkgPT4gbnVsbDtcbmV4cG9ydCB2YXIgcGVyZm9ybWFuY2UgPSB3aW5kb3dbJ3BlcmZvcm1hbmNlJ10gPyB3aW5kb3dbJ3BlcmZvcm1hbmNlJ10gOiBudWxsO1xuZXhwb3J0IGNvbnN0IEV2ZW50ID0gd2luZG93WydFdmVudCddO1xuZXhwb3J0IGNvbnN0IE1vdXNlRXZlbnQgPSB3aW5kb3dbJ01vdXNlRXZlbnQnXTtcbmV4cG9ydCBjb25zdCBLZXlib2FyZEV2ZW50ID0gd2luZG93WydLZXlib2FyZEV2ZW50J107XG5leHBvcnQgY29uc3QgRXZlbnRUYXJnZXQgPSB3aW5kb3dbJ0V2ZW50VGFyZ2V0J107XG5leHBvcnQgY29uc3QgSGlzdG9yeSA9IHdpbmRvd1snSGlzdG9yeSddO1xuZXhwb3J0IGNvbnN0IExvY2F0aW9uID0gd2luZG93WydMb2NhdGlvbiddO1xuZXhwb3J0IGNvbnN0IEV2ZW50TGlzdGVuZXIgPSB3aW5kb3dbJ0V2ZW50TGlzdGVuZXInXTtcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9mYWNhZGUvYnJvd3Nlci50c1xuICoqLyIsIi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGUgaHR0cCBtb2R1bGUgcHJvdmlkZXMgc2VydmljZXMgdG8gcGVyZm9ybSBodHRwIHJlcXVlc3RzLiBUbyBnZXQgc3RhcnRlZCwgc2VlIHRoZSB7QGxpbmsgSHR0cH1cbiAqIGNsYXNzLlxuICovXG5pbXBvcnQge3Byb3ZpZGUsIFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7SHR0cCwgSnNvbnB9IGZyb20gJy4vc3JjL2h0dHAvaHR0cCc7XG5pbXBvcnQge1hIUkJhY2tlbmQsIFhIUkNvbm5lY3Rpb259IGZyb20gJy4vc3JjL2h0dHAvYmFja2VuZHMveGhyX2JhY2tlbmQnO1xuaW1wb3J0IHtKU09OUEJhY2tlbmQsIEpTT05QQmFja2VuZF8sIEpTT05QQ29ubmVjdGlvbn0gZnJvbSAnLi9zcmMvaHR0cC9iYWNrZW5kcy9qc29ucF9iYWNrZW5kJztcbmltcG9ydCB7QnJvd3Nlclhocn0gZnJvbSAnLi9zcmMvaHR0cC9iYWNrZW5kcy9icm93c2VyX3hocic7XG5pbXBvcnQge0Jyb3dzZXJKc29ucH0gZnJvbSAnLi9zcmMvaHR0cC9iYWNrZW5kcy9icm93c2VyX2pzb25wJztcbmltcG9ydCB7QmFzZVJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0T3B0aW9uc30gZnJvbSAnLi9zcmMvaHR0cC9iYXNlX3JlcXVlc3Rfb3B0aW9ucyc7XG5pbXBvcnQge0Nvbm5lY3Rpb25CYWNrZW5kfSBmcm9tICcuL3NyYy9odHRwL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtCYXNlUmVzcG9uc2VPcHRpb25zLCBSZXNwb25zZU9wdGlvbnN9IGZyb20gJy4vc3JjL2h0dHAvYmFzZV9yZXNwb25zZV9vcHRpb25zJztcbmV4cG9ydCB7UmVxdWVzdH0gZnJvbSAnLi9zcmMvaHR0cC9zdGF0aWNfcmVxdWVzdCc7XG5leHBvcnQge1Jlc3BvbnNlfSBmcm9tICcuL3NyYy9odHRwL3N0YXRpY19yZXNwb25zZSc7XG5cbmV4cG9ydCB7XG4gIFJlcXVlc3RPcHRpb25zQXJncyxcbiAgUmVzcG9uc2VPcHRpb25zQXJncyxcbiAgQ29ubmVjdGlvbixcbiAgQ29ubmVjdGlvbkJhY2tlbmRcbn0gZnJvbSAnLi9zcmMvaHR0cC9pbnRlcmZhY2VzJztcblxuZXhwb3J0IHtCcm93c2VyWGhyfSBmcm9tICcuL3NyYy9odHRwL2JhY2tlbmRzL2Jyb3dzZXJfeGhyJztcbmV4cG9ydCB7QmFzZVJlcXVlc3RPcHRpb25zLCBSZXF1ZXN0T3B0aW9uc30gZnJvbSAnLi9zcmMvaHR0cC9iYXNlX3JlcXVlc3Rfb3B0aW9ucyc7XG5leHBvcnQge0Jhc2VSZXNwb25zZU9wdGlvbnMsIFJlc3BvbnNlT3B0aW9uc30gZnJvbSAnLi9zcmMvaHR0cC9iYXNlX3Jlc3BvbnNlX29wdGlvbnMnO1xuZXhwb3J0IHtYSFJCYWNrZW5kLCBYSFJDb25uZWN0aW9ufSBmcm9tICcuL3NyYy9odHRwL2JhY2tlbmRzL3hocl9iYWNrZW5kJztcbmV4cG9ydCB7SlNPTlBCYWNrZW5kLCBKU09OUENvbm5lY3Rpb259IGZyb20gJy4vc3JjL2h0dHAvYmFja2VuZHMvanNvbnBfYmFja2VuZCc7XG5leHBvcnQge0h0dHAsIEpzb25wfSBmcm9tICcuL3NyYy9odHRwL2h0dHAnO1xuXG5leHBvcnQge0hlYWRlcnN9IGZyb20gJy4vc3JjL2h0dHAvaGVhZGVycyc7XG5cbmV4cG9ydCB7UmVzcG9uc2VUeXBlLCBSZWFkeVN0YXRlLCBSZXF1ZXN0TWV0aG9kfSBmcm9tICcuL3NyYy9odHRwL2VudW1zJztcbmV4cG9ydCB7VVJMU2VhcmNoUGFyYW1zfSBmcm9tICcuL3NyYy9odHRwL3VybF9zZWFyY2hfcGFyYW1zJztcblxuLyoqXG4gKiBQcm92aWRlcyBhIGJhc2ljIHNldCBvZiBpbmplY3RhYmxlcyB0byB1c2UgdGhlIHtAbGluayBIdHRwfSBzZXJ2aWNlIGluIGFueSBhcHBsaWNhdGlvbi5cbiAqXG4gKiBUaGUgYEhUVFBfUFJPVklERVJTYCBzaG91bGQgYmUgaW5jbHVkZWQgZWl0aGVyIGluIGEgY29tcG9uZW50J3MgaW5qZWN0b3IsXG4gKiBvciBpbiB0aGUgcm9vdCBpbmplY3RvciB3aGVuIGJvb3RzdHJhcHBpbmcgYW4gYXBwbGljYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3NuajdOdj9wPXByZXZpZXcpKVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtib290c3RyYXB9IGZyb20gJ2FuZ3VsYXIyL3BsYXRmb3JtL2Jyb3dzZXInO1xuICogaW1wb3J0IHtOZ0Zvcn0gZnJvbSAnYW5ndWxhcjIvY29tbW9uJztcbiAqIGltcG9ydCB7SFRUUF9QUk9WSURFUlMsIEh0dHB9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICpcbiAqIEBDb21wb25lbnQoe1xuICogICBzZWxlY3RvcjogJ2FwcCcsXG4gKiAgIHByb3ZpZGVyczogW0hUVFBfUFJPVklERVJTXSxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8ZGl2PlxuICogICAgICAgPGgxPlBlb3BsZTwvaDE+XG4gKiAgICAgICA8dWw+XG4gKiAgICAgICAgIDxsaSAqbmdGb3I9XCIjcGVyc29uIG9mIHBlb3BsZVwiPlxuICogICAgICAgICAgIHt7cGVyc29uLm5hbWV9fVxuICogICAgICAgICA8L2xpPlxuICogICAgICAgPC91bD5cbiAqICAgICA8L2Rpdj5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW05nRm9yXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHAge1xuICogICBwZW9wbGU6IE9iamVjdFtdO1xuICogICBjb25zdHJ1Y3RvcihodHRwOkh0dHApIHtcbiAqICAgICBodHRwLmdldCgncGVvcGxlLmpzb24nKS5zdWJzY3JpYmUocmVzID0+IHtcbiAqICAgICAgIHRoaXMucGVvcGxlID0gcmVzLmpzb24oKTtcbiAqICAgICB9KTtcbiAqICAgfVxuICogICBhY3RpdmU6Ym9vbGVhbiA9IGZhbHNlO1xuICogICB0b2dnbGVBY3RpdmVTdGF0ZSgpIHtcbiAqICAgICB0aGlzLmFjdGl2ZSA9ICF0aGlzLmFjdGl2ZTtcbiAqICAgfVxuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHApXG4gKiAgIC5jYXRjaChlcnIgPT4gY29uc29sZS5lcnJvcihlcnIpKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBwcmltYXJ5IHB1YmxpYyBBUEkgaW5jbHVkZWQgaW4gYEhUVFBfUFJPVklERVJTYCBpcyB0aGUge0BsaW5rIEh0dHB9IGNsYXNzLlxuICogSG93ZXZlciwgb3RoZXIgcHJvdmlkZXJzIHJlcXVpcmVkIGJ5IGBIdHRwYCBhcmUgaW5jbHVkZWQsXG4gKiB3aGljaCBtYXkgYmUgYmVuZWZpY2lhbCB0byBvdmVycmlkZSBpbiBjZXJ0YWluIGNhc2VzLlxuICpcbiAqIFRoZSBwcm92aWRlcnMgaW5jbHVkZWQgaW4gYEhUVFBfUFJPVklERVJTYCBpbmNsdWRlOlxuICogICoge0BsaW5rIEh0dHB9XG4gKiAgKiB7QGxpbmsgWEhSQmFja2VuZH1cbiAqICAqIGBCcm93c2VyWEhSYCAtIFByaXZhdGUgZmFjdG9yeSB0byBjcmVhdGUgYFhNTEh0dHBSZXF1ZXN0YCBpbnN0YW5jZXNcbiAqICAqIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gLSBCb3VuZCB0byB7QGxpbmsgQmFzZVJlcXVlc3RPcHRpb25zfSBjbGFzc1xuICogICoge0BsaW5rIFJlc3BvbnNlT3B0aW9uc30gLSBCb3VuZCB0byB7QGxpbmsgQmFzZVJlc3BvbnNlT3B0aW9uc30gY2xhc3NcbiAqXG4gKiBUaGVyZSBtYXkgYmUgY2FzZXMgd2hlcmUgaXQgbWFrZXMgc2Vuc2UgdG8gZXh0ZW5kIHRoZSBiYXNlIHJlcXVlc3Qgb3B0aW9ucyxcbiAqIHN1Y2ggYXMgdG8gYWRkIGEgc2VhcmNoIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0byBhbGwgVVJMcy5cbiAqIFRvIGFjY29tcGxpc2ggdGhpcywgYSBuZXcgcHJvdmlkZXIgZm9yIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gc2hvdWxkXG4gKiBiZSBhZGRlZCBpbiB0aGUgc2FtZSBpbmplY3RvciBhcyBgSFRUUF9QUk9WSURFUlNgLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9hQ01FWGk/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7cHJvdmlkZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge2Jvb3RzdHJhcH0gZnJvbSAnYW5ndWxhcjIvcGxhdGZvcm0vYnJvd3Nlcic7XG4gKiBpbXBvcnQge0hUVFBfUFJPVklERVJTLCBCYXNlUmVxdWVzdE9wdGlvbnMsIFJlcXVlc3RPcHRpb25zfSBmcm9tICdhbmd1bGFyMi9odHRwJztcbiAqXG4gKiBjbGFzcyBNeU9wdGlvbnMgZXh0ZW5kcyBCYXNlUmVxdWVzdE9wdGlvbnMge1xuICogICBzZWFyY2g6IHN0cmluZyA9ICdjb3JlVGVhbT10cnVlJztcbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwLCBbSFRUUF9QUk9WSURFUlMsIHByb3ZpZGUoUmVxdWVzdE9wdGlvbnMsIHt1c2VDbGFzczogTXlPcHRpb25zfSldKVxuICogICAuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSk7XG4gKiBgYGBcbiAqXG4gKiBMaWtld2lzZSwgdG8gdXNlIGEgbW9jayBiYWNrZW5kIGZvciB1bml0IHRlc3RzLCB0aGUge0BsaW5rIFhIUkJhY2tlbmR9XG4gKiBwcm92aWRlciBzaG91bGQgYmUgYm91bmQgdG8ge0BsaW5rIE1vY2tCYWNrZW5kfS5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvN0xXQUxEP3A9cHJldmlldykpXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge3Byb3ZpZGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtib290c3RyYXB9IGZyb20gJ2FuZ3VsYXIyL3BsYXRmb3JtL2Jyb3dzZXInO1xuICogaW1wb3J0IHtIVFRQX1BST1ZJREVSUywgSHR0cCwgUmVzcG9uc2UsIFhIUkJhY2tlbmR9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICogaW1wb3J0IHtNb2NrQmFja2VuZH0gZnJvbSAnYW5ndWxhcjIvaHR0cC90ZXN0aW5nJztcbiAqXG4gKiB2YXIgcGVvcGxlID0gW3tuYW1lOiAnSmVmZid9LCB7bmFtZTogJ1RvYmlhcyd9XTtcbiAqXG4gKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICAgSFRUUF9QUk9WSURFUlMsXG4gKiAgIE1vY2tCYWNrZW5kLFxuICogICBwcm92aWRlKFhIUkJhY2tlbmQsIHt1c2VFeGlzdGluZzogTW9ja0JhY2tlbmR9KVxuICogXSk7XG4gKiB2YXIgaHR0cCA9IGluamVjdG9yLmdldChIdHRwKTtcbiAqIHZhciBiYWNrZW5kID0gaW5qZWN0b3IuZ2V0KE1vY2tCYWNrZW5kKTtcbiAqXG4gKiAvLyBMaXN0ZW4gZm9yIGFueSBuZXcgcmVxdWVzdHNcbiAqIGJhY2tlbmQuY29ubmVjdGlvbnMub2JzZXJ2ZXIoe1xuICogICBuZXh0OiBjb25uZWN0aW9uID0+IHtcbiAqICAgICB2YXIgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2Uoe2JvZHk6IHBlb3BsZX0pO1xuICogICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICogICAgICAgLy8gU2VuZCBhIHJlc3BvbnNlIHRvIHRoZSByZXF1ZXN0XG4gKiAgICAgICBjb25uZWN0aW9uLm1vY2tSZXNwb25kKHJlc3BvbnNlKTtcbiAqICAgICB9KTtcbiAqICAgfSk7XG4gKlxuICogaHR0cC5nZXQoJ3Blb3BsZS5qc29uJykub2JzZXJ2ZXIoe1xuICogICBuZXh0OiByZXMgPT4ge1xuICogICAgIC8vIFJlc3BvbnNlIGNhbWUgZnJvbSBtb2NrIGJhY2tlbmRcbiAqICAgICBjb25zb2xlLmxvZygnZmlyc3QgcGVyc29uJywgcmVzLmpzb24oKVswXS5uYW1lKTtcbiAqICAgfVxuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IEhUVFBfUFJPVklERVJTOiBhbnlbXSA9IFtcbiAgLy8gVE9ETyhwYXNjYWwpOiB1c2UgZmFjdG9yeSB0eXBlIGFubm90YXRpb25zIG9uY2Ugc3VwcG9ydGVkIGluIERJXG4gIC8vIGlzc3VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8zMTgzXG4gIHByb3ZpZGUoSHR0cCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VGYWN0b3J5OiAoeGhyQmFja2VuZCwgcmVxdWVzdE9wdGlvbnMpID0+IG5ldyBIdHRwKHhockJhY2tlbmQsIHJlcXVlc3RPcHRpb25zKSxcbiAgICAgICAgICAgIGRlcHM6IFtYSFJCYWNrZW5kLCBSZXF1ZXN0T3B0aW9uc11cbiAgICAgICAgICB9KSxcbiAgQnJvd3NlclhocixcbiAgcHJvdmlkZShSZXF1ZXN0T3B0aW9ucywge3VzZUNsYXNzOiBCYXNlUmVxdWVzdE9wdGlvbnN9KSxcbiAgcHJvdmlkZShSZXNwb25zZU9wdGlvbnMsIHt1c2VDbGFzczogQmFzZVJlc3BvbnNlT3B0aW9uc30pLFxuICBYSFJCYWNrZW5kXG5dO1xuXG4vKipcbiAqIFNlZSB7QGxpbmsgSFRUUF9QUk9WSURFUlN9IGluc3RlYWQuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEhUVFBfQklORElOR1MgPSBIVFRQX1BST1ZJREVSUztcblxuLyoqXG4gKiBQcm92aWRlcyBhIGJhc2ljIHNldCBvZiBwcm92aWRlcnMgdG8gdXNlIHRoZSB7QGxpbmsgSnNvbnB9IHNlcnZpY2UgaW4gYW55IGFwcGxpY2F0aW9uLlxuICpcbiAqIFRoZSBgSlNPTlBfUFJPVklERVJTYCBzaG91bGQgYmUgaW5jbHVkZWQgZWl0aGVyIGluIGEgY29tcG9uZW50J3MgaW5qZWN0b3IsXG4gKiBvciBpbiB0aGUgcm9vdCBpbmplY3RvciB3aGVuIGJvb3RzdHJhcHBpbmcgYW4gYXBwbGljYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3ZtZU40Rj9wPXByZXZpZXcpKVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtOZ0Zvcn0gZnJvbSAnYW5ndWxhcjIvY29tbW9uJztcbiAqIGltcG9ydCB7SlNPTlBfUFJPVklERVJTLCBKc29ucH0gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKlxuICogQENvbXBvbmVudCh7XG4gKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAqICAgcHJvdmlkZXJzOiBbSlNPTlBfUFJPVklERVJTXSxcbiAqICAgdGVtcGxhdGU6IGBcbiAqICAgICA8ZGl2PlxuICogICAgICAgPGgxPlBlb3BsZTwvaDE+XG4gKiAgICAgICA8dWw+XG4gKiAgICAgICAgIDxsaSAqbmdGb3I9XCIjcGVyc29uIG9mIHBlb3BsZVwiPlxuICogICAgICAgICAgIHt7cGVyc29uLm5hbWV9fVxuICogICAgICAgICA8L2xpPlxuICogICAgICAgPC91bD5cbiAqICAgICA8L2Rpdj5cbiAqICAgYCxcbiAqICAgZGlyZWN0aXZlczogW05nRm9yXVxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBcHAge1xuICogICBwZW9wbGU6IEFycmF5PE9iamVjdD47XG4gKiAgIGNvbnN0cnVjdG9yKGpzb25wOkpzb25wKSB7XG4gKiAgICAganNvbnAucmVxdWVzdCgncGVvcGxlLmpzb24nKS5zdWJzY3JpYmUocmVzID0+IHtcbiAqICAgICAgIHRoaXMucGVvcGxlID0gcmVzLmpzb24oKTtcbiAqICAgICB9KVxuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKiBUaGUgcHJpbWFyeSBwdWJsaWMgQVBJIGluY2x1ZGVkIGluIGBKU09OUF9QUk9WSURFUlNgIGlzIHRoZSB7QGxpbmsgSnNvbnB9IGNsYXNzLlxuICogSG93ZXZlciwgb3RoZXIgcHJvdmlkZXJzIHJlcXVpcmVkIGJ5IGBKc29ucGAgYXJlIGluY2x1ZGVkLFxuICogd2hpY2ggbWF5IGJlIGJlbmVmaWNpYWwgdG8gb3ZlcnJpZGUgaW4gY2VydGFpbiBjYXNlcy5cbiAqXG4gKiBUaGUgcHJvdmlkZXJzIGluY2x1ZGVkIGluIGBKU09OUF9QUk9WSURFUlNgIGluY2x1ZGU6XG4gKiAgKiB7QGxpbmsgSnNvbnB9XG4gKiAgKiB7QGxpbmsgSlNPTlBCYWNrZW5kfVxuICogICogYEJyb3dzZXJKc29ucGAgLSBQcml2YXRlIGZhY3RvcnlcbiAqICAqIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gLSBCb3VuZCB0byB7QGxpbmsgQmFzZVJlcXVlc3RPcHRpb25zfSBjbGFzc1xuICogICoge0BsaW5rIFJlc3BvbnNlT3B0aW9uc30gLSBCb3VuZCB0byB7QGxpbmsgQmFzZVJlc3BvbnNlT3B0aW9uc30gY2xhc3NcbiAqXG4gKiBUaGVyZSBtYXkgYmUgY2FzZXMgd2hlcmUgaXQgbWFrZXMgc2Vuc2UgdG8gZXh0ZW5kIHRoZSBiYXNlIHJlcXVlc3Qgb3B0aW9ucyxcbiAqIHN1Y2ggYXMgdG8gYWRkIGEgc2VhcmNoIHN0cmluZyB0byBiZSBhcHBlbmRlZCB0byBhbGwgVVJMcy5cbiAqIFRvIGFjY29tcGxpc2ggdGhpcywgYSBuZXcgcHJvdmlkZXIgZm9yIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gc2hvdWxkXG4gKiBiZSBhZGRlZCBpbiB0aGUgc2FtZSBpbmplY3RvciBhcyBgSlNPTlBfUFJPVklERVJTYC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvVEZ1Zzd4P3A9cHJldmlldykpXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge3Byb3ZpZGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtib290c3RyYXB9IGZyb20gJ2FuZ3VsYXIyL3BsYXRmb3JtL2Jyb3dzZXInO1xuICogaW1wb3J0IHtKU09OUF9QUk9WSURFUlMsIEJhc2VSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdE9wdGlvbnN9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICpcbiAqIGNsYXNzIE15T3B0aW9ucyBleHRlbmRzIEJhc2VSZXF1ZXN0T3B0aW9ucyB7XG4gKiAgIHNlYXJjaDogc3RyaW5nID0gJ2NvcmVUZWFtPXRydWUnO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHAsIFtKU09OUF9QUk9WSURFUlMsIHByb3ZpZGUoUmVxdWVzdE9wdGlvbnMsIHt1c2VDbGFzczogTXlPcHRpb25zfSldKVxuICogICAuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyKSk7XG4gKiBgYGBcbiAqXG4gKiBMaWtld2lzZSwgdG8gdXNlIGEgbW9jayBiYWNrZW5kIGZvciB1bml0IHRlc3RzLCB0aGUge0BsaW5rIEpTT05QQmFja2VuZH1cbiAqIHByb3ZpZGVyIHNob3VsZCBiZSBib3VuZCB0byB7QGxpbmsgTW9ja0JhY2tlbmR9LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9IRHFaV0w/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7cHJvdmlkZSwgSW5qZWN0b3J9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtKU09OUF9QUk9WSURFUlMsIEpzb25wLCBSZXNwb25zZSwgSlNPTlBCYWNrZW5kfSBmcm9tICdhbmd1bGFyMi9odHRwJztcbiAqIGltcG9ydCB7TW9ja0JhY2tlbmR9IGZyb20gJ2FuZ3VsYXIyL2h0dHAvdGVzdGluZyc7XG4gKlxuICogdmFyIHBlb3BsZSA9IFt7bmFtZTogJ0plZmYnfSwge25hbWU6ICdUb2JpYXMnfV07XG4gKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICAgSlNPTlBfUFJPVklERVJTLFxuICogICBNb2NrQmFja2VuZCxcbiAqICAgcHJvdmlkZShKU09OUEJhY2tlbmQsIHt1c2VFeGlzdGluZzogTW9ja0JhY2tlbmR9KVxuICogXSk7XG4gKiB2YXIganNvbnAgPSBpbmplY3Rvci5nZXQoSnNvbnApO1xuICogdmFyIGJhY2tlbmQgPSBpbmplY3Rvci5nZXQoTW9ja0JhY2tlbmQpO1xuICpcbiAqIC8vIExpc3RlbiBmb3IgYW55IG5ldyByZXF1ZXN0c1xuICogYmFja2VuZC5jb25uZWN0aW9ucy5vYnNlcnZlcih7XG4gKiAgIG5leHQ6IGNvbm5lY3Rpb24gPT4ge1xuICogICAgIHZhciByZXNwb25zZSA9IG5ldyBSZXNwb25zZSh7Ym9keTogcGVvcGxlfSk7XG4gKiAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gKiAgICAgICAvLyBTZW5kIGEgcmVzcG9uc2UgdG8gdGhlIHJlcXVlc3RcbiAqICAgICAgIGNvbm5lY3Rpb24ubW9ja1Jlc3BvbmQocmVzcG9uc2UpO1xuICogICAgIH0pO1xuICogICB9KTtcblxuICoganNvbnAuZ2V0KCdwZW9wbGUuanNvbicpLm9ic2VydmVyKHtcbiAqICAgbmV4dDogcmVzID0+IHtcbiAqICAgICAvLyBSZXNwb25zZSBjYW1lIGZyb20gbW9jayBiYWNrZW5kXG4gKiAgICAgY29uc29sZS5sb2coJ2ZpcnN0IHBlcnNvbicsIHJlcy5qc29uKClbMF0ubmFtZSk7XG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBKU09OUF9QUk9WSURFUlM6IGFueVtdID0gW1xuICAvLyBUT0RPKHBhc2NhbCk6IHVzZSBmYWN0b3J5IHR5cGUgYW5ub3RhdGlvbnMgb25jZSBzdXBwb3J0ZWQgaW4gRElcbiAgLy8gaXNzdWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzMxODNcbiAgcHJvdmlkZShKc29ucCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB1c2VGYWN0b3J5OiAoanNvbnBCYWNrZW5kLCByZXF1ZXN0T3B0aW9ucykgPT4gbmV3IEpzb25wKGpzb25wQmFja2VuZCwgcmVxdWVzdE9wdGlvbnMpLFxuICAgICAgICAgICAgZGVwczogW0pTT05QQmFja2VuZCwgUmVxdWVzdE9wdGlvbnNdXG4gICAgICAgICAgfSksXG4gIEJyb3dzZXJKc29ucCxcbiAgcHJvdmlkZShSZXF1ZXN0T3B0aW9ucywge3VzZUNsYXNzOiBCYXNlUmVxdWVzdE9wdGlvbnN9KSxcbiAgcHJvdmlkZShSZXNwb25zZU9wdGlvbnMsIHt1c2VDbGFzczogQmFzZVJlc3BvbnNlT3B0aW9uc30pLFxuICBwcm92aWRlKEpTT05QQmFja2VuZCwge3VzZUNsYXNzOiBKU09OUEJhY2tlbmRffSlcbl07XG5cbi8qKlxuICogU2VlIHtAbGluayBKU09OUF9QUk9WSURFUlN9IGluc3RlYWQuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IEpTT05fQklORElOR1MgPSBKU09OUF9QUk9WSURFUlM7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9odHRwLnRzXG4gKiovIiwiaW1wb3J0IHtpc1N0cmluZywgaXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHttYWtlVHlwZUVycm9yfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7UmVxdWVzdE9wdGlvbnNBcmdzLCBDb25uZWN0aW9uLCBDb25uZWN0aW9uQmFja2VuZH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7UmVxdWVzdH0gZnJvbSAnLi9zdGF0aWNfcmVxdWVzdCc7XG5pbXBvcnQge1Jlc3BvbnNlfSBmcm9tICcuL3N0YXRpY19yZXNwb25zZSc7XG5pbXBvcnQge0Jhc2VSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdE9wdGlvbnN9IGZyb20gJy4vYmFzZV9yZXF1ZXN0X29wdGlvbnMnO1xuaW1wb3J0IHtSZXF1ZXN0TWV0aG9kfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcblxuZnVuY3Rpb24gaHR0cFJlcXVlc3QoYmFja2VuZDogQ29ubmVjdGlvbkJhY2tlbmQsIHJlcXVlc3Q6IFJlcXVlc3QpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gIHJldHVybiBiYWNrZW5kLmNyZWF0ZUNvbm5lY3Rpb24ocmVxdWVzdCkucmVzcG9uc2U7XG59XG5cbmZ1bmN0aW9uIG1lcmdlT3B0aW9ucyhkZWZhdWx0T3B0cywgcHJvdmlkZWRPcHRzLCBtZXRob2QsIHVybCk6IFJlcXVlc3RPcHRpb25zIHtcbiAgdmFyIG5ld09wdGlvbnMgPSBkZWZhdWx0T3B0cztcbiAgaWYgKGlzUHJlc2VudChwcm92aWRlZE9wdHMpKSB7XG4gICAgLy8gSGFjayBzbyBEYXJ0IGNhbiB1c2VkIG5hbWVkIHBhcmFtZXRlcnNcbiAgICByZXR1cm4gbmV3T3B0aW9ucy5tZXJnZShuZXcgUmVxdWVzdE9wdGlvbnMoe1xuICAgICAgbWV0aG9kOiBwcm92aWRlZE9wdHMubWV0aG9kIHx8IG1ldGhvZCxcbiAgICAgIHVybDogcHJvdmlkZWRPcHRzLnVybCB8fCB1cmwsXG4gICAgICBzZWFyY2g6IHByb3ZpZGVkT3B0cy5zZWFyY2gsXG4gICAgICBoZWFkZXJzOiBwcm92aWRlZE9wdHMuaGVhZGVycyxcbiAgICAgIGJvZHk6IHByb3ZpZGVkT3B0cy5ib2R5XG4gICAgfSkpO1xuICB9XG4gIGlmIChpc1ByZXNlbnQobWV0aG9kKSkge1xuICAgIHJldHVybiBuZXdPcHRpb25zLm1lcmdlKG5ldyBSZXF1ZXN0T3B0aW9ucyh7bWV0aG9kOiBtZXRob2QsIHVybDogdXJsfSkpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXdPcHRpb25zLm1lcmdlKG5ldyBSZXF1ZXN0T3B0aW9ucyh7dXJsOiB1cmx9KSk7XG4gIH1cbn1cblxuLyoqXG4gKiBQZXJmb3JtcyBodHRwIHJlcXVlc3RzIHVzaW5nIGBYTUxIdHRwUmVxdWVzdGAgYXMgdGhlIGRlZmF1bHQgYmFja2VuZC5cbiAqXG4gKiBgSHR0cGAgaXMgYXZhaWxhYmxlIGFzIGFuIGluamVjdGFibGUgY2xhc3MsIHdpdGggbWV0aG9kcyB0byBwZXJmb3JtIGh0dHAgcmVxdWVzdHMuIENhbGxpbmdcbiAqIGByZXF1ZXN0YCByZXR1cm5zIGFuIGBPYnNlcnZhYmxlYCB3aGljaCB3aWxsIGVtaXQgYSBzaW5nbGUge0BsaW5rIFJlc3BvbnNlfSB3aGVuIGFcbiAqIHJlc3BvbnNlIGlzIHJlY2VpdmVkLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHtIdHRwLCBIVFRQX1BST1ZJREVSU30gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICdodHRwLWFwcCcsXG4gKiAgIHZpZXdQcm92aWRlcnM6IFtIVFRQX1BST1ZJREVSU10sXG4gKiAgIHRlbXBsYXRlVXJsOiAncGVvcGxlLmh0bWwnXG4gKiB9KVxuICogY2xhc3MgUGVvcGxlQ29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IoaHR0cDogSHR0cCkge1xuICogICAgIGh0dHAuZ2V0KCdwZW9wbGUuanNvbicpXG4gKiAgICAgICAvLyBDYWxsIG1hcCBvbiB0aGUgcmVzcG9uc2Ugb2JzZXJ2YWJsZSB0byBnZXQgdGhlIHBhcnNlZCBwZW9wbGUgb2JqZWN0XG4gKiAgICAgICAubWFwKHJlcyA9PiByZXMuanNvbigpKVxuICogICAgICAgLy8gU3Vic2NyaWJlIHRvIHRoZSBvYnNlcnZhYmxlIHRvIGdldCB0aGUgcGFyc2VkIHBlb3BsZSBvYmplY3QgYW5kIGF0dGFjaCBpdCB0byB0aGVcbiAqICAgICAgIC8vIGNvbXBvbmVudFxuICogICAgICAgLnN1YnNjcmliZShwZW9wbGUgPT4gdGhpcy5wZW9wbGUgPSBwZW9wbGUpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIGh0dHAuZ2V0KCdwZW9wbGUuanNvbicpLm9ic2VydmVyKHtuZXh0OiAodmFsdWUpID0+IHRoaXMucGVvcGxlID0gdmFsdWV9KTtcbiAqIGBgYFxuICpcbiAqIFRoZSBkZWZhdWx0IGNvbnN0cnVjdCB1c2VkIHRvIHBlcmZvcm0gcmVxdWVzdHMsIGBYTUxIdHRwUmVxdWVzdGAsIGlzIGFic3RyYWN0ZWQgYXMgYSBcIkJhY2tlbmRcIiAoXG4gKiB7QGxpbmsgWEhSQmFja2VuZH0gaW4gdGhpcyBjYXNlKSwgd2hpY2ggY291bGQgYmUgbW9ja2VkIHdpdGggZGVwZW5kZW5jeSBpbmplY3Rpb24gYnkgcmVwbGFjaW5nXG4gKiB0aGUge0BsaW5rIFhIUkJhY2tlbmR9IHByb3ZpZGVyLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGU6XG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge0Jhc2VSZXF1ZXN0T3B0aW9ucywgSHR0cH0gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKiBpbXBvcnQge01vY2tCYWNrZW5kfSBmcm9tICdhbmd1bGFyMi9odHRwL3Rlc3RpbmcnO1xuICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbXG4gKiAgIEJhc2VSZXF1ZXN0T3B0aW9ucyxcbiAqICAgTW9ja0JhY2tlbmQsXG4gKiAgIHByb3ZpZGUoSHR0cCwge3VzZUZhY3Rvcnk6XG4gKiAgICAgICBmdW5jdGlvbihiYWNrZW5kLCBkZWZhdWx0T3B0aW9ucykge1xuICogICAgICAgICByZXR1cm4gbmV3IEh0dHAoYmFja2VuZCwgZGVmYXVsdE9wdGlvbnMpO1xuICogICAgICAgfSxcbiAqICAgICAgIGRlcHM6IFtNb2NrQmFja2VuZCwgQmFzZVJlcXVlc3RPcHRpb25zXX0pXG4gKiBdKTtcbiAqIHZhciBodHRwID0gaW5qZWN0b3IuZ2V0KEh0dHApO1xuICogaHR0cC5nZXQoJ3JlcXVlc3QtZnJvbS1tb2NrLWJhY2tlbmQuanNvbicpLnN1YnNjcmliZSgocmVzOlJlc3BvbnNlKSA9PiBkb1NvbWV0aGluZyhyZXMpKTtcbiAqIGBgYFxuICpcbiAqKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBIdHRwIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIF9iYWNrZW5kOiBDb25uZWN0aW9uQmFja2VuZCwgcHJvdGVjdGVkIF9kZWZhdWx0T3B0aW9uczogUmVxdWVzdE9wdGlvbnMpIHt9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFueSB0eXBlIG9mIGh0dHAgcmVxdWVzdC4gRmlyc3QgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCBjYW4gZWl0aGVyIGJlIGEgdXJsIG9yXG4gICAqIGEge0BsaW5rIFJlcXVlc3R9IGluc3RhbmNlLiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYSB1cmwsIGFuIG9wdGlvbmFsIHtAbGluayBSZXF1ZXN0T3B0aW9uc31cbiAgICogb2JqZWN0IGNhbiBiZSBwcm92aWRlZCBhcyB0aGUgMm5kIGFyZ3VtZW50LiBUaGUgb3B0aW9ucyBvYmplY3Qgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGUgdmFsdWVzXG4gICAqIG9mIHtAbGluayBCYXNlUmVxdWVzdE9wdGlvbnN9IGJlZm9yZSBwZXJmb3JtaW5nIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgcmVxdWVzdCh1cmw6IHN0cmluZyB8IFJlcXVlc3QsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgdmFyIHJlc3BvbnNlT2JzZXJ2YWJsZTogYW55O1xuICAgIGlmIChpc1N0cmluZyh1cmwpKSB7XG4gICAgICByZXNwb25zZU9ic2VydmFibGUgPSBodHRwUmVxdWVzdChcbiAgICAgICAgICB0aGlzLl9iYWNrZW5kLFxuICAgICAgICAgIG5ldyBSZXF1ZXN0KG1lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucywgb3B0aW9ucywgUmVxdWVzdE1ldGhvZC5HZXQsIHVybCkpKTtcbiAgICB9IGVsc2UgaWYgKHVybCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIHJlc3BvbnNlT2JzZXJ2YWJsZSA9IGh0dHBSZXF1ZXN0KHRoaXMuX2JhY2tlbmQsIHVybCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG1ha2VUeXBlRXJyb3IoJ0ZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSB1cmwgc3RyaW5nIG9yIFJlcXVlc3QgaW5zdGFuY2UuJyk7XG4gICAgfVxuICAgIHJldHVybiByZXNwb25zZU9ic2VydmFibGU7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSByZXF1ZXN0IHdpdGggYGdldGAgaHR0cCBtZXRob2QuXG4gICAqL1xuICBnZXQodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGh0dHBSZXF1ZXN0KHRoaXMuX2JhY2tlbmQsIG5ldyBSZXF1ZXN0KG1lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucywgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2QuR2V0LCB1cmwpKSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSByZXF1ZXN0IHdpdGggYHBvc3RgIGh0dHAgbWV0aG9kLlxuICAgKi9cbiAgcG9zdCh1cmw6IHN0cmluZywgYm9keTogc3RyaW5nLCBvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNBcmdzKTogT2JzZXJ2YWJsZTxSZXNwb25zZT4ge1xuICAgIHJldHVybiBodHRwUmVxdWVzdChcbiAgICAgICAgdGhpcy5fYmFja2VuZCxcbiAgICAgICAgbmV3IFJlcXVlc3QobWVyZ2VPcHRpb25zKHRoaXMuX2RlZmF1bHRPcHRpb25zLm1lcmdlKG5ldyBSZXF1ZXN0T3B0aW9ucyh7Ym9keTogYm9keX0pKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMsIFJlcXVlc3RNZXRob2QuUG9zdCwgdXJsKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgcmVxdWVzdCB3aXRoIGBwdXRgIGh0dHAgbWV0aG9kLlxuICAgKi9cbiAgcHV0KHVybDogc3RyaW5nLCBib2R5OiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGh0dHBSZXF1ZXN0KFxuICAgICAgICB0aGlzLl9iYWNrZW5kLFxuICAgICAgICBuZXcgUmVxdWVzdChtZXJnZU9wdGlvbnModGhpcy5fZGVmYXVsdE9wdGlvbnMubWVyZ2UobmV3IFJlcXVlc3RPcHRpb25zKHtib2R5OiBib2R5fSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgUmVxdWVzdE1ldGhvZC5QdXQsIHVybCkpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQZXJmb3JtcyBhIHJlcXVlc3Qgd2l0aCBgZGVsZXRlYCBodHRwIG1ldGhvZC5cbiAgICovXG4gIGRlbGV0ZSAodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGh0dHBSZXF1ZXN0KHRoaXMuX2JhY2tlbmQsIG5ldyBSZXF1ZXN0KG1lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucywgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2QuRGVsZXRlLCB1cmwpKSk7XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybXMgYSByZXF1ZXN0IHdpdGggYHBhdGNoYCBodHRwIG1ldGhvZC5cbiAgICovXG4gIHBhdGNoKHVybDogc3RyaW5nLCBib2R5OiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGh0dHBSZXF1ZXN0KFxuICAgICAgICB0aGlzLl9iYWNrZW5kLFxuICAgICAgICBuZXcgUmVxdWVzdChtZXJnZU9wdGlvbnModGhpcy5fZGVmYXVsdE9wdGlvbnMubWVyZ2UobmV3IFJlcXVlc3RPcHRpb25zKHtib2R5OiBib2R5fSkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucywgUmVxdWVzdE1ldGhvZC5QYXRjaCwgdXJsKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGEgcmVxdWVzdCB3aXRoIGBoZWFkYCBodHRwIG1ldGhvZC5cbiAgICovXG4gIGhlYWQodXJsOiBzdHJpbmcsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGh0dHBSZXF1ZXN0KHRoaXMuX2JhY2tlbmQsIG5ldyBSZXF1ZXN0KG1lcmdlT3B0aW9ucyh0aGlzLl9kZWZhdWx0T3B0aW9ucywgb3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcXVlc3RNZXRob2QuSGVhZCwgdXJsKSkpO1xuICB9XG59XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBKc29ucCBleHRlbmRzIEh0dHAge1xuICBjb25zdHJ1Y3RvcihiYWNrZW5kOiBDb25uZWN0aW9uQmFja2VuZCwgZGVmYXVsdE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zKSB7XG4gICAgc3VwZXIoYmFja2VuZCwgZGVmYXVsdE9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFBlcmZvcm1zIGFueSB0eXBlIG9mIGh0dHAgcmVxdWVzdC4gRmlyc3QgYXJndW1lbnQgaXMgcmVxdWlyZWQsIGFuZCBjYW4gZWl0aGVyIGJlIGEgdXJsIG9yXG4gICAqIGEge0BsaW5rIFJlcXVlc3R9IGluc3RhbmNlLiBJZiB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYSB1cmwsIGFuIG9wdGlvbmFsIHtAbGluayBSZXF1ZXN0T3B0aW9uc31cbiAgICogb2JqZWN0IGNhbiBiZSBwcm92aWRlZCBhcyB0aGUgMm5kIGFyZ3VtZW50LiBUaGUgb3B0aW9ucyBvYmplY3Qgd2lsbCBiZSBtZXJnZWQgd2l0aCB0aGUgdmFsdWVzXG4gICAqIG9mIHtAbGluayBCYXNlUmVxdWVzdE9wdGlvbnN9IGJlZm9yZSBwZXJmb3JtaW5nIHRoZSByZXF1ZXN0LlxuICAgKi9cbiAgcmVxdWVzdCh1cmw6IHN0cmluZyB8IFJlcXVlc3QsIG9wdGlvbnM/OiBSZXF1ZXN0T3B0aW9uc0FyZ3MpOiBPYnNlcnZhYmxlPFJlc3BvbnNlPiB7XG4gICAgdmFyIHJlc3BvbnNlT2JzZXJ2YWJsZTogYW55O1xuICAgIGlmIChpc1N0cmluZyh1cmwpKSB7XG4gICAgICB1cmwgPSBuZXcgUmVxdWVzdChtZXJnZU9wdGlvbnModGhpcy5fZGVmYXVsdE9wdGlvbnMsIG9wdGlvbnMsIFJlcXVlc3RNZXRob2QuR2V0LCB1cmwpKTtcbiAgICB9XG4gICAgaWYgKHVybCBpbnN0YW5jZW9mIFJlcXVlc3QpIHtcbiAgICAgIGlmICh1cmwubWV0aG9kICE9PSBSZXF1ZXN0TWV0aG9kLkdldCkge1xuICAgICAgICBtYWtlVHlwZUVycm9yKCdKU09OUCByZXF1ZXN0cyBtdXN0IHVzZSBHRVQgcmVxdWVzdCBtZXRob2QuJyk7XG4gICAgICB9XG4gICAgICByZXNwb25zZU9ic2VydmFibGUgPSBodHRwUmVxdWVzdCh0aGlzLl9iYWNrZW5kLCB1cmwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBtYWtlVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgdXJsIHN0cmluZyBvciBSZXF1ZXN0IGluc3RhbmNlLicpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VPYnNlcnZhYmxlO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9odHRwLnRzXG4gKiovIiwiaW1wb3J0IHtSZWFkeVN0YXRlLCBSZXF1ZXN0TWV0aG9kLCBSZXNwb25zZVR5cGV9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHtIZWFkZXJzfSBmcm9tICcuL2hlYWRlcnMnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtSZXF1ZXN0fSBmcm9tICcuL3N0YXRpY19yZXF1ZXN0JztcbmltcG9ydCB7VVJMU2VhcmNoUGFyYW1zfSBmcm9tICcuL3VybF9zZWFyY2hfcGFyYW1zJztcblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyBmcm9tIHdoaWNoIHJlYWwgYmFja2VuZHMgYXJlIGRlcml2ZWQuXG4gKlxuICogVGhlIHByaW1hcnkgcHVycG9zZSBvZiBhIGBDb25uZWN0aW9uQmFja2VuZGAgaXMgdG8gY3JlYXRlIG5ldyBjb25uZWN0aW9ucyB0byBmdWxmaWxsIGEgZ2l2ZW5cbiAqIHtAbGluayBSZXF1ZXN0fS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbm5lY3Rpb25CYWNrZW5kIHsgYWJzdHJhY3QgY3JlYXRlQ29ubmVjdGlvbihyZXF1ZXN0OiBhbnkpOiBDb25uZWN0aW9uOyB9XG5cbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgZnJvbSB3aGljaCByZWFsIGNvbm5lY3Rpb25zIGFyZSBkZXJpdmVkLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29ubmVjdGlvbiB7XG4gIHJlYWR5U3RhdGU6IFJlYWR5U3RhdGU7XG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG4gIHJlc3BvbnNlOiBhbnk7ICAvLyBUT0RPOiBnZW5lcmljIG9mIDxSZXNwb25zZT47XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciBvcHRpb25zIHRvIGNvbnN0cnVjdCBhIFJlcXVlc3RPcHRpb25zLCBiYXNlZCBvblxuICogW1JlcXVlc3RJbml0XShodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVxdWVzdGluaXQpIGZyb20gdGhlIEZldGNoIHNwZWMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdE9wdGlvbnNBcmdzIHtcbiAgdXJsPzogc3RyaW5nO1xuICBtZXRob2Q/OiBzdHJpbmcgfCBSZXF1ZXN0TWV0aG9kO1xuICBzZWFyY2g/OiBzdHJpbmcgfCBVUkxTZWFyY2hQYXJhbXM7XG4gIGhlYWRlcnM/OiBIZWFkZXJzO1xuICAvLyBUT0RPOiBTdXBwb3J0IEJsb2IsIEFycmF5QnVmZmVyLCBKU09OLCBVUkxTZWFyY2hQYXJhbXMsIEZvcm1EYXRhXG4gIGJvZHk/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogUmVxdWlyZWQgc3RydWN0dXJlIHdoZW4gY29uc3RydWN0aW5nIG5ldyBSZXF1ZXN0KCk7XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVxdWVzdEFyZ3MgZXh0ZW5kcyBSZXF1ZXN0T3B0aW9uc0FyZ3MgeyB1cmw6IHN0cmluZzsgfVxuXG4vKipcbiAqIEludGVyZmFjZSBmb3Igb3B0aW9ucyB0byBjb25zdHJ1Y3QgYSBSZXNwb25zZSwgYmFzZWQgb25cbiAqIFtSZXNwb25zZUluaXRdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZWluaXQpIGZyb20gdGhlIEZldGNoIHNwZWMuXG4gKi9cbmV4cG9ydCB0eXBlIFJlc3BvbnNlT3B0aW9uc0FyZ3MgPSB7XG4gIC8vIFRPRE86IFN1cHBvcnQgQmxvYiwgQXJyYXlCdWZmZXIsIEpTT05cbiAgYm9keT86IHN0cmluZyB8IE9iamVjdCB8IEZvcm1EYXRhO1xuICBzdGF0dXM/OiBudW1iZXI7XG4gIHN0YXR1c1RleHQ/OiBzdHJpbmc7XG4gIGhlYWRlcnM/OiBIZWFkZXJzO1xuICB0eXBlPzogUmVzcG9uc2VUeXBlO1xuICB1cmw/OiBzdHJpbmc7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9pbnRlcmZhY2VzLnRzXG4gKiovIiwiaW1wb3J0IHtSZXF1ZXN0TWV0aG9kfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7UmVxdWVzdEFyZ3N9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0hlYWRlcnN9IGZyb20gJy4vaGVhZGVycyc7XG5pbXBvcnQge25vcm1hbGl6ZU1ldGhvZE5hbWV9IGZyb20gJy4vaHR0cF91dGlscyc7XG5pbXBvcnQge1xuICBSZWdFeHBXcmFwcGVyLFxuICBDT05TVF9FWFBSLFxuICBpc1ByZXNlbnQsXG4gIGlzSnNPYmplY3QsXG4gIFN0cmluZ1dyYXBwZXJcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuLy8gVE9ETyhqZWZmYmNyb3NzKTogcHJvcGVybHkgaW1wbGVtZW50IGJvZHkgYWNjZXNzb3JzXG4vKipcbiAqIENyZWF0ZXMgYFJlcXVlc3RgIGluc3RhbmNlcyBmcm9tIHByb3ZpZGVkIHZhbHVlcy5cbiAqXG4gKiBUaGUgUmVxdWVzdCdzIGludGVyZmFjZSBpcyBpbnNwaXJlZCBieSB0aGUgUmVxdWVzdCBjb25zdHJ1Y3RvciBkZWZpbmVkIGluIHRoZSBbRmV0Y2hcbiAqIFNwZWNdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0LWNsYXNzKSxcbiAqIGJ1dCBpcyBjb25zaWRlcmVkIGEgc3RhdGljIHZhbHVlIHdob3NlIGJvZHkgY2FuIGJlIGFjY2Vzc2VkIG1hbnkgdGltZXMuIFRoZXJlIGFyZSBvdGhlclxuICogZGlmZmVyZW5jZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uLCBidXQgdGhpcyBpcyB0aGUgbW9zdCBzaWduaWZpY2FudC5cbiAqXG4gKiBgUmVxdWVzdGAgaW5zdGFuY2VzIGFyZSB0eXBpY2FsbHkgY3JlYXRlZCBieSBoaWdoZXItbGV2ZWwgY2xhc3NlcywgbGlrZSB7QGxpbmsgSHR0cH0gYW5kXG4gKiB7QGxpbmsgSnNvbnB9LCBidXQgaXQgbWF5IG9jY2FzaW9uYWxseSBiZSB1c2VmdWwgdG8gZXhwbGljaXRseSBjcmVhdGUgYFJlcXVlc3RgIGluc3RhbmNlcy5cbiAqIE9uZSBzdWNoIGV4YW1wbGUgaXMgd2hlbiBjcmVhdGluZyBzZXJ2aWNlcyB0aGF0IHdyYXAgaGlnaGVyLWxldmVsIHNlcnZpY2VzLCBsaWtlIHtAbGluayBIdHRwfSxcbiAqIHdoZXJlIGl0IG1heSBiZSB1c2VmdWwgdG8gZ2VuZXJhdGUgYSBgUmVxdWVzdGAgd2l0aCBhcmJpdHJhcnkgaGVhZGVycyBhbmQgc2VhcmNoIHBhcmFtcy5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge0luamVjdGFibGUsIEluamVjdG9yfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7SFRUUF9QUk9WSURFUlMsIEh0dHAsIFJlcXVlc3QsIFJlcXVlc3RNZXRob2R9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICpcbiAqIEBJbmplY3RhYmxlKClcbiAqIGNsYXNzIEF1dG9BdXRoZW50aWNhdG9yIHtcbiAqICAgY29uc3RydWN0b3IocHVibGljIGh0dHA6SHR0cCkge31cbiAqICAgcmVxdWVzdCh1cmw6c3RyaW5nKSB7XG4gKiAgICAgcmV0dXJuIHRoaXMuaHR0cC5yZXF1ZXN0KG5ldyBSZXF1ZXN0KHtcbiAqICAgICAgIG1ldGhvZDogUmVxdWVzdE1ldGhvZC5HZXQsXG4gKiAgICAgICB1cmw6IHVybCxcbiAqICAgICAgIHNlYXJjaDogJ3Bhc3N3b3JkPTEyMydcbiAqICAgICB9KSk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtIVFRQX1BST1ZJREVSUywgQXV0b0F1dGhlbnRpY2F0b3JdKTtcbiAqIHZhciBhdXRoZW50aWNhdG9yID0gaW5qZWN0b3IuZ2V0KEF1dG9BdXRoZW50aWNhdG9yKTtcbiAqIGF1dGhlbnRpY2F0b3IucmVxdWVzdCgncGVvcGxlLmpzb24nKS5zdWJzY3JpYmUocmVzID0+IHtcbiAqICAgLy9VUkwgc2hvdWxkIGhhdmUgaW5jbHVkZWQgJz9wYXNzd29yZD0xMjMnXG4gKiAgIGNvbnNvbGUubG9nKCdwZW9wbGUnLCByZXMuanNvbigpKTtcbiAqIH0pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0IHtcbiAgLyoqXG4gICAqIEh0dHAgbWV0aG9kIHdpdGggd2hpY2ggdG8gcGVyZm9ybSB0aGUgcmVxdWVzdC5cbiAgICovXG4gIG1ldGhvZDogUmVxdWVzdE1ldGhvZDtcbiAgLyoqXG4gICAqIHtAbGluayBIZWFkZXJzfSBpbnN0YW5jZVxuICAgKi9cbiAgaGVhZGVyczogSGVhZGVycztcbiAgLyoqIFVybCBvZiB0aGUgcmVtb3RlIHJlc291cmNlICovXG4gIHVybDogc3RyaW5nO1xuICAvLyBUT0RPOiBzdXBwb3J0IFVSTFNlYXJjaFBhcmFtcyB8IEZvcm1EYXRhIHwgQmxvYiB8IEFycmF5QnVmZmVyXG4gIHByaXZhdGUgX2JvZHk6IHN0cmluZztcbiAgY29uc3RydWN0b3IocmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RBcmdzKSB7XG4gICAgLy8gVE9ETzogYXNzZXJ0IHRoYXQgdXJsIGlzIHByZXNlbnRcbiAgICBsZXQgdXJsID0gcmVxdWVzdE9wdGlvbnMudXJsO1xuICAgIHRoaXMudXJsID0gcmVxdWVzdE9wdGlvbnMudXJsO1xuICAgIGlmIChpc1ByZXNlbnQocmVxdWVzdE9wdGlvbnMuc2VhcmNoKSkge1xuICAgICAgbGV0IHNlYXJjaCA9IHJlcXVlc3RPcHRpb25zLnNlYXJjaC50b1N0cmluZygpO1xuICAgICAgaWYgKHNlYXJjaC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxldCBwcmVmaXggPSAnPyc7XG4gICAgICAgIGlmIChTdHJpbmdXcmFwcGVyLmNvbnRhaW5zKHRoaXMudXJsLCAnPycpKSB7XG4gICAgICAgICAgcHJlZml4ID0gKHRoaXMudXJsW3RoaXMudXJsLmxlbmd0aCAtIDFdID09ICcmJykgPyAnJyA6ICcmJztcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPOiBqdXN0IGRlbGV0ZSBzZWFyY2gtcXVlcnktbG9va2luZyBzdHJpbmcgaW4gdXJsP1xuICAgICAgICB0aGlzLnVybCA9IHVybCArIHByZWZpeCArIHNlYXJjaDtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5fYm9keSA9IHJlcXVlc3RPcHRpb25zLmJvZHk7XG4gICAgdGhpcy5tZXRob2QgPSBub3JtYWxpemVNZXRob2ROYW1lKHJlcXVlc3RPcHRpb25zLm1ldGhvZCk7XG4gICAgLy8gVE9ETyhqZWZmYmNyb3NzKTogaW1wbGVtZW50IGJlaGF2aW9yXG4gICAgLy8gRGVmYXVsdHMgdG8gJ29taXQnLCBjb25zaXN0ZW50IHdpdGggYnJvd3NlclxuICAgIC8vIFRPRE8oamVmZmJjcm9zcyk6IGltcGxlbWVudCBiZWhhdmlvclxuICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIZWFkZXJzKHJlcXVlc3RPcHRpb25zLmhlYWRlcnMpO1xuICB9XG5cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgcmVxdWVzdCdzIGJvZHkgYXMgc3RyaW5nLCBhc3N1bWluZyB0aGF0IGJvZHkgZXhpc3RzLiBJZiBib2R5IGlzIHVuZGVmaW5lZCwgcmV0dXJuXG4gICAqIGVtcHR5XG4gICAqIHN0cmluZy5cbiAgICovXG4gIHRleHQoKTogU3RyaW5nIHsgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9ib2R5KSA/IHRoaXMuX2JvZHkudG9TdHJpbmcoKSA6ICcnOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9zdGF0aWNfcmVxdWVzdC50c1xuICoqLyIsImltcG9ydCB7XG4gIGlzUHJlc2VudCxcbiAgaXNCbGFuayxcbiAgaXNKc09iamVjdCxcbiAgaXNUeXBlLFxuICBTdHJpbmdXcmFwcGVyLFxuICBKc29uXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1xuICBpc0xpc3RMaWtlSXRlcmFibGUsXG4gIE1hcCxcbiAgTWFwV3JhcHBlcixcbiAgU3RyaW5nTWFwV3JhcHBlcixcbiAgTGlzdFdyYXBwZXIsXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbi8qKlxuICogUG9seWZpbGwgZm9yIFtIZWFkZXJzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSGVhZGVycy9IZWFkZXJzKSwgYXNcbiAqIHNwZWNpZmllZCBpbiB0aGUgW0ZldGNoIFNwZWNdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNoZWFkZXJzLWNsYXNzKS5cbiAqXG4gKiBUaGUgb25seSBrbm93biBkaWZmZXJlbmNlIGJldHdlZW4gdGhpcyBgSGVhZGVyc2AgaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzcGVjIGlzIHRoZVxuICogbGFjayBvZiBhbiBgZW50cmllc2AgbWV0aG9kLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9NVGR3VDY/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7SGVhZGVyc30gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKlxuICogdmFyIGZpcnN0SGVhZGVycyA9IG5ldyBIZWFkZXJzKCk7XG4gKiBmaXJzdEhlYWRlcnMuYXBwZW5kKCdDb250ZW50LVR5cGUnLCAnaW1hZ2UvanBlZycpO1xuICogY29uc29sZS5sb2coZmlyc3RIZWFkZXJzLmdldCgnQ29udGVudC1UeXBlJykpIC8vJ2ltYWdlL2pwZWcnXG4gKlxuICogLy8gQ3JlYXRlIGhlYWRlcnMgZnJvbSBQbGFpbiBPbGQgSmF2YVNjcmlwdCBPYmplY3RcbiAqIHZhciBzZWNvbmRIZWFkZXJzID0gbmV3IEhlYWRlcnMoe1xuICogICAnWC1NeS1DdXN0b20tSGVhZGVyJzogJ0FuZ3VsYXInXG4gKiB9KTtcbiAqIGNvbnNvbGUubG9nKHNlY29uZEhlYWRlcnMuZ2V0KCdYLU15LUN1c3RvbS1IZWFkZXInKSk7IC8vJ0FuZ3VsYXInXG4gKlxuICogdmFyIHRoaXJkSGVhZGVycyA9IG5ldyBIZWFkZXJzKHNlY29uZEhlYWRlcnMpO1xuICogY29uc29sZS5sb2codGhpcmRIZWFkZXJzLmdldCgnWC1NeS1DdXN0b20tSGVhZGVyJykpOyAvLydBbmd1bGFyJ1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBIZWFkZXJzIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaGVhZGVyc01hcDogTWFwPHN0cmluZywgc3RyaW5nW10+O1xuICBjb25zdHJ1Y3RvcihoZWFkZXJzPzogSGVhZGVycyB8IHtba2V5OiBzdHJpbmddOiBhbnl9KSB7XG4gICAgaWYgKGhlYWRlcnMgaW5zdGFuY2VvZiBIZWFkZXJzKSB7XG4gICAgICB0aGlzLl9oZWFkZXJzTWFwID0gKDxIZWFkZXJzPmhlYWRlcnMpLl9oZWFkZXJzTWFwO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2hlYWRlcnNNYXAgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nW10+KCk7XG5cbiAgICBpZiAoaXNCbGFuayhoZWFkZXJzKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGhlYWRlcnMgaW5zdGFuY2VvZiBTdHJpbmdNYXBcbiAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goXG4gICAgICAgIGhlYWRlcnMsICh2LCBrKSA9PiB7IHRoaXMuX2hlYWRlcnNNYXAuc2V0KGssIGlzTGlzdExpa2VJdGVyYWJsZSh2KSA/IHYgOiBbdl0pOyB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgbmV3IEhlYWRlcnMgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gRE9NU3RyaW5nIG9mIFJlc3BvbnNlIEhlYWRlcnNcbiAgICovXG4gIHN0YXRpYyBmcm9tUmVzcG9uc2VIZWFkZXJTdHJpbmcoaGVhZGVyc1N0cmluZzogc3RyaW5nKTogSGVhZGVycyB7XG4gICAgcmV0dXJuIGhlYWRlcnNTdHJpbmcudHJpbSgpXG4gICAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgICAgLm1hcCh2YWwgPT4gdmFsLnNwbGl0KCc6JykpXG4gICAgICAgIC5tYXAoKFtrZXksIC4uLnBhcnRzXSkgPT4gKFtrZXkudHJpbSgpLCBwYXJ0cy5qb2luKCc6JykudHJpbSgpXSkpXG4gICAgICAgIC5yZWR1Y2UoKGhlYWRlcnMsIFtrZXksIHZhbHVlXSkgPT4gIWhlYWRlcnMuc2V0KGtleSwgdmFsdWUpICYmIGhlYWRlcnMsIG5ldyBIZWFkZXJzKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFwcGVuZHMgYSBoZWFkZXIgdG8gZXhpc3RpbmcgbGlzdCBvZiBoZWFkZXIgdmFsdWVzIGZvciBhIGdpdmVuIGhlYWRlciBuYW1lLlxuICAgKi9cbiAgYXBwZW5kKG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHZhciBtYXBOYW1lID0gdGhpcy5faGVhZGVyc01hcC5nZXQobmFtZSk7XG4gICAgdmFyIGxpc3QgPSBpc0xpc3RMaWtlSXRlcmFibGUobWFwTmFtZSkgPyBtYXBOYW1lIDogW107XG4gICAgbGlzdC5wdXNoKHZhbHVlKTtcbiAgICB0aGlzLl9oZWFkZXJzTWFwLnNldChuYW1lLCBsaXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGFsbCBoZWFkZXIgdmFsdWVzIGZvciB0aGUgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIGRlbGV0ZSAobmFtZTogc3RyaW5nKTogdm9pZCB7IHRoaXMuX2hlYWRlcnNNYXAuZGVsZXRlKG5hbWUpOyB9XG5cbiAgZm9yRWFjaChmbjogKHZhbHVlczogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgaGVhZGVyczogTWFwPHN0cmluZywgc3RyaW5nW10+KSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5faGVhZGVyc01hcC5mb3JFYWNoKGZuKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGZpcnN0IGhlYWRlciB0aGF0IG1hdGNoZXMgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIGdldChoZWFkZXI6IHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBMaXN0V3JhcHBlci5maXJzdCh0aGlzLl9oZWFkZXJzTWFwLmdldChoZWFkZXIpKTsgfVxuXG4gIC8qKlxuICAgKiBDaGVjayBmb3IgZXhpc3RlbmNlIG9mIGhlYWRlciBieSBnaXZlbiBuYW1lLlxuICAgKi9cbiAgaGFzKGhlYWRlcjogc3RyaW5nKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9oZWFkZXJzTWFwLmhhcyhoZWFkZXIpOyB9XG5cbiAgLyoqXG4gICAqIFByb3ZpZGVzIG5hbWVzIG9mIHNldCBoZWFkZXJzXG4gICAqL1xuICBrZXlzKCk6IHN0cmluZ1tdIHsgcmV0dXJuIE1hcFdyYXBwZXIua2V5cyh0aGlzLl9oZWFkZXJzTWFwKTsgfVxuXG4gIC8qKlxuICAgKiBTZXRzIG9yIG92ZXJyaWRlcyBoZWFkZXIgdmFsdWUgZm9yIGdpdmVuIG5hbWUuXG4gICAqL1xuICBzZXQoaGVhZGVyOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcgfCBzdHJpbmdbXSk6IHZvaWQge1xuICAgIHZhciBsaXN0ID0gW107XG5cbiAgICBpZiAoaXNMaXN0TGlrZUl0ZXJhYmxlKHZhbHVlKSkge1xuICAgICAgdmFyIHB1c2hWYWx1ZSA9ICg8c3RyaW5nW10+dmFsdWUpLmpvaW4oJywnKTtcbiAgICAgIGxpc3QucHVzaChwdXNoVmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBsaXN0LnB1c2godmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMuX2hlYWRlcnNNYXAuc2V0KGhlYWRlciwgbGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB2YWx1ZXMgb2YgYWxsIGhlYWRlcnMuXG4gICAqL1xuICB2YWx1ZXMoKTogc3RyaW5nW11bXSB7IHJldHVybiBNYXBXcmFwcGVyLnZhbHVlcyh0aGlzLl9oZWFkZXJzTWFwKTsgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHN0cmluZyBvZiBhbGwgaGVhZGVycy5cbiAgICovXG4gIHRvSlNPTigpOiBzdHJpbmcgeyByZXR1cm4gSnNvbi5zdHJpbmdpZnkodGhpcy52YWx1ZXMoKSk7IH1cblxuICAvKipcbiAgICogUmV0dXJucyBsaXN0IG9mIGhlYWRlciB2YWx1ZXMgZm9yIGEgZ2l2ZW4gbmFtZS5cbiAgICovXG4gIGdldEFsbChoZWFkZXI6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICB2YXIgaGVhZGVycyA9IHRoaXMuX2hlYWRlcnNNYXAuZ2V0KGhlYWRlcik7XG4gICAgcmV0dXJuIGlzTGlzdExpa2VJdGVyYWJsZShoZWFkZXJzKSA/IGhlYWRlcnMgOiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBub3QgaW1wbGVtZW50ZWQuXG4gICAqL1xuICBlbnRyaWVzKCkgeyB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignXCJlbnRyaWVzXCIgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBIZWFkZXJzIGNsYXNzJyk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9odHRwL2hlYWRlcnMudHNcbiAqKi8iLCJpbXBvcnQge2lzU3RyaW5nfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtSZXF1ZXN0TWV0aG9kfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7bWFrZVR5cGVFcnJvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7UmVzcG9uc2V9IGZyb20gJy4vc3RhdGljX3Jlc3BvbnNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZU1ldGhvZE5hbWUobWV0aG9kKTogUmVxdWVzdE1ldGhvZCB7XG4gIGlmIChpc1N0cmluZyhtZXRob2QpKSB7XG4gICAgdmFyIG9yaWdpbmFsTWV0aG9kID0gbWV0aG9kO1xuICAgIG1ldGhvZCA9IG1ldGhvZC5yZXBsYWNlKC8oXFx3KShcXHcqKS9nLCAoZzAsIGcxLCBnMikgPT4gZzEudG9VcHBlckNhc2UoKSArIGcyLnRvTG93ZXJDYXNlKCkpO1xuICAgIG1ldGhvZCA9IFJlcXVlc3RNZXRob2RbbWV0aG9kXTtcbiAgICBpZiAodHlwZW9mIG1ldGhvZCAhPT0gJ251bWJlcicpXG4gICAgICB0aHJvdyBtYWtlVHlwZUVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIHJlcXVlc3QgbWV0aG9kLiBUaGUgbWV0aG9kIFwiJHtvcmlnaW5hbE1ldGhvZH1cIiBpcyBub3Qgc3VwcG9ydGVkLmApO1xuICB9XG4gIHJldHVybiBtZXRob2Q7XG59XG5cbmV4cG9ydCBjb25zdCBpc1N1Y2Nlc3MgPSAoc3RhdHVzOiBudW1iZXIpOiBib29sZWFuID0+IChzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNwb25zZVVSTCh4aHI6IGFueSk6IHN0cmluZyB7XG4gIGlmICgncmVzcG9uc2VVUkwnIGluIHhocikge1xuICAgIHJldHVybiB4aHIucmVzcG9uc2VVUkw7XG4gIH1cbiAgaWYgKC9eWC1SZXF1ZXN0LVVSTDovbS50ZXN0KHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSkpIHtcbiAgICByZXR1cm4geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdYLVJlcXVlc3QtVVJMJyk7XG4gIH1cbiAgcmV0dXJuO1xufVxuXG5leHBvcnQge2lzSnNPYmplY3R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9odHRwX3V0aWxzLnRzXG4gKiovIiwiaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG4vKipcbiAqIFN1cHBvcnRlZCBodHRwIG1ldGhvZHMuXG4gKi9cbmV4cG9ydCBlbnVtIFJlcXVlc3RNZXRob2Qge1xuICBHZXQsXG4gIFBvc3QsXG4gIFB1dCxcbiAgRGVsZXRlLFxuICBPcHRpb25zLFxuICBIZWFkLFxuICBQYXRjaFxufVxuXG4vKipcbiAqIEFsbCBwb3NzaWJsZSBzdGF0ZXMgaW4gd2hpY2ggYSBjb25uZWN0aW9uIGNhbiBiZSwgYmFzZWQgb25cbiAqIFtTdGF0ZXNdKGh0dHA6Ly93d3cudzMub3JnL1RSL1hNTEh0dHBSZXF1ZXN0LyNzdGF0ZXMpIGZyb20gdGhlIGBYTUxIdHRwUmVxdWVzdGAgc3BlYywgYnV0IHdpdGggYW5cbiAqIGFkZGl0aW9uYWwgXCJDQU5DRUxMRURcIiBzdGF0ZS5cbiAqL1xuZXhwb3J0IGVudW0gUmVhZHlTdGF0ZSB7XG4gIFVuc2VudCxcbiAgT3BlbixcbiAgSGVhZGVyc1JlY2VpdmVkLFxuICBMb2FkaW5nLFxuICBEb25lLFxuICBDYW5jZWxsZWRcbn1cblxuLyoqXG4gKiBBY2NlcHRhYmxlIHJlc3BvbnNlIHR5cGVzIHRvIGJlIGFzc29jaWF0ZWQgd2l0aCBhIHtAbGluayBSZXNwb25zZX0sIGJhc2VkIG9uXG4gKiBbUmVzcG9uc2VUeXBlXShodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVzcG9uc2V0eXBlKSBmcm9tIHRoZSBGZXRjaCBzcGVjLlxuICovXG5leHBvcnQgZW51bSBSZXNwb25zZVR5cGUge1xuICBCYXNpYyxcbiAgQ29ycyxcbiAgRGVmYXVsdCxcbiAgRXJyb3IsXG4gIE9wYXF1ZVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2h0dHAvZW51bXMudHNcbiAqKi8iLCJpbXBvcnQge2lzUHJlc2VudCwgaXNTdHJpbmd9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0hlYWRlcnN9IGZyb20gJy4vaGVhZGVycyc7XG5pbXBvcnQge1JlcXVlc3RNZXRob2R9IGZyb20gJy4vZW51bXMnO1xuaW1wb3J0IHtSZXF1ZXN0T3B0aW9uc0FyZ3N9IGZyb20gJy4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtVUkxTZWFyY2hQYXJhbXN9IGZyb20gJy4vdXJsX3NlYXJjaF9wYXJhbXMnO1xuaW1wb3J0IHtub3JtYWxpemVNZXRob2ROYW1lfSBmcm9tICcuL2h0dHBfdXRpbHMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSByZXF1ZXN0IG9wdGlvbnMgb2JqZWN0IHRvIGJlIG9wdGlvbmFsbHkgcHJvdmlkZWQgd2hlbiBpbnN0YW50aWF0aW5nIGFcbiAqIHtAbGluayBSZXF1ZXN0fS5cbiAqXG4gKiBUaGlzIGNsYXNzIGlzIGJhc2VkIG9uIHRoZSBgUmVxdWVzdEluaXRgIGRlc2NyaXB0aW9uIGluIHRoZSBbRmV0Y2hcbiAqIFNwZWNdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXF1ZXN0aW5pdCkuXG4gKlxuICogQWxsIHZhbHVlcyBhcmUgbnVsbCBieSBkZWZhdWx0LiBUeXBpY2FsIGRlZmF1bHRzIGNhbiBiZSBmb3VuZCBpbiB0aGUge0BsaW5rIEJhc2VSZXF1ZXN0T3B0aW9uc31cbiAqIGNsYXNzLCB3aGljaCBzdWItY2xhc3NlcyBgUmVxdWVzdE9wdGlvbnNgLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC83V3ZpM2xmTHE0MWFRUEtseEI0Tz9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7UmVxdWVzdE9wdGlvbnMsIFJlcXVlc3QsIFJlcXVlc3RNZXRob2R9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICpcbiAqIHZhciBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtcbiAqICAgbWV0aG9kOiBSZXF1ZXN0TWV0aG9kLlBvc3QsXG4gKiAgIHVybDogJ2h0dHBzOi8vZ29vZ2xlLmNvbSdcbiAqIH0pO1xuICogdmFyIHJlcSA9IG5ldyBSZXF1ZXN0KG9wdGlvbnMpO1xuICogY29uc29sZS5sb2coJ3JlcS5tZXRob2Q6JywgUmVxdWVzdE1ldGhvZFtyZXEubWV0aG9kXSk7IC8vIFBvc3RcbiAqIGNvbnNvbGUubG9nKCdvcHRpb25zLnVybDonLCBvcHRpb25zLnVybCk7IC8vIGh0dHBzOi8vZ29vZ2xlLmNvbVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXF1ZXN0T3B0aW9ucyB7XG4gIC8qKlxuICAgKiBIdHRwIG1ldGhvZCB3aXRoIHdoaWNoIHRvIGV4ZWN1dGUgYSB7QGxpbmsgUmVxdWVzdH0uXG4gICAqIEFjY2VwdGFibGUgbWV0aG9kcyBhcmUgZGVmaW5lZCBpbiB0aGUge0BsaW5rIFJlcXVlc3RNZXRob2R9IGVudW0uXG4gICAqL1xuICBtZXRob2Q6IFJlcXVlc3RNZXRob2QgfCBzdHJpbmc7XG4gIC8qKlxuICAgKiB7QGxpbmsgSGVhZGVyc30gdG8gYmUgYXR0YWNoZWQgdG8gYSB7QGxpbmsgUmVxdWVzdH0uXG4gICAqL1xuICBoZWFkZXJzOiBIZWFkZXJzO1xuICAvKipcbiAgICogQm9keSB0byBiZSB1c2VkIHdoZW4gY3JlYXRpbmcgYSB7QGxpbmsgUmVxdWVzdH0uXG4gICAqL1xuICAvLyBUT0RPOiBzdXBwb3J0IEZvcm1EYXRhLCBCbG9iLCBVUkxTZWFyY2hQYXJhbXNcbiAgYm9keTogc3RyaW5nO1xuICAvKipcbiAgICogVXJsIHdpdGggd2hpY2ggdG8gcGVyZm9ybSBhIHtAbGluayBSZXF1ZXN0fS5cbiAgICovXG4gIHVybDogc3RyaW5nO1xuICAvKipcbiAgICogU2VhcmNoIHBhcmFtZXRlcnMgdG8gYmUgaW5jbHVkZWQgaW4gYSB7QGxpbmsgUmVxdWVzdH0uXG4gICAqL1xuICBzZWFyY2g6IFVSTFNlYXJjaFBhcmFtcztcbiAgY29uc3RydWN0b3Ioe21ldGhvZCwgaGVhZGVycywgYm9keSwgdXJsLCBzZWFyY2h9OiBSZXF1ZXN0T3B0aW9uc0FyZ3MgPSB7fSkge1xuICAgIHRoaXMubWV0aG9kID0gaXNQcmVzZW50KG1ldGhvZCkgPyBub3JtYWxpemVNZXRob2ROYW1lKG1ldGhvZCkgOiBudWxsO1xuICAgIHRoaXMuaGVhZGVycyA9IGlzUHJlc2VudChoZWFkZXJzKSA/IGhlYWRlcnMgOiBudWxsO1xuICAgIHRoaXMuYm9keSA9IGlzUHJlc2VudChib2R5KSA/IGJvZHkgOiBudWxsO1xuICAgIHRoaXMudXJsID0gaXNQcmVzZW50KHVybCkgPyB1cmwgOiBudWxsO1xuICAgIHRoaXMuc2VhcmNoID0gaXNQcmVzZW50KHNlYXJjaCkgPyAoaXNTdHJpbmcoc2VhcmNoKSA/IG5ldyBVUkxTZWFyY2hQYXJhbXMoPHN0cmluZz4oc2VhcmNoKSkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxVUkxTZWFyY2hQYXJhbXM+KHNlYXJjaCkpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgY29weSBvZiB0aGUgYFJlcXVlc3RPcHRpb25zYCBpbnN0YW5jZSwgdXNpbmcgdGhlIG9wdGlvbmFsIGlucHV0IGFzIHZhbHVlcyB0byBvdmVycmlkZVxuICAgKiBleGlzdGluZyB2YWx1ZXMuIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSBvbiB3aGljaCBpdCBpcyBiZWluZ1xuICAgKiBjYWxsZWQuXG4gICAqXG4gICAqIE5vdGUgdGhhdCBgaGVhZGVyc2AgYW5kIGBzZWFyY2hgIHdpbGwgb3ZlcnJpZGUgZXhpc3RpbmcgdmFsdWVzIGNvbXBsZXRlbHkgaWYgcHJlc2VudCBpblxuICAgKiB0aGUgYG9wdGlvbnNgIG9iamVjdC4gSWYgdGhlc2UgdmFsdWVzIHNob3VsZCBiZSBtZXJnZWQsIGl0IHNob3VsZCBiZSBkb25lIHByaW9yIHRvIGNhbGxpbmdcbiAgICogYG1lcmdlYCBvbiB0aGUgYFJlcXVlc3RPcHRpb25zYCBpbnN0YW5jZS5cbiAgICpcbiAgICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0LzZ3OFhBOFlUa0RSY1BZcGRCOWRrP3A9cHJldmlldykpXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaW1wb3J0IHtSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdCwgUmVxdWVzdE1ldGhvZH0gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gICAqXG4gICAqIHZhciBvcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKHtcbiAgICogICBtZXRob2Q6IFJlcXVlc3RNZXRob2QuUG9zdFxuICAgKiB9KTtcbiAgICogdmFyIHJlcSA9IG5ldyBSZXF1ZXN0KG9wdGlvbnMubWVyZ2Uoe1xuICAgKiAgIHVybDogJ2h0dHBzOi8vZ29vZ2xlLmNvbSdcbiAgICogfSkpO1xuICAgKiBjb25zb2xlLmxvZygncmVxLm1ldGhvZDonLCBSZXF1ZXN0TWV0aG9kW3JlcS5tZXRob2RdKTsgLy8gUG9zdFxuICAgKiBjb25zb2xlLmxvZygnb3B0aW9ucy51cmw6Jywgb3B0aW9ucy51cmwpOyAvLyBudWxsXG4gICAqIGNvbnNvbGUubG9nKCdyZXEudXJsOicsIHJlcS51cmwpOyAvLyBodHRwczovL2dvb2dsZS5jb21cbiAgICogYGBgXG4gICAqL1xuICBtZXJnZShvcHRpb25zPzogUmVxdWVzdE9wdGlvbnNBcmdzKTogUmVxdWVzdE9wdGlvbnMge1xuICAgIHJldHVybiBuZXcgUmVxdWVzdE9wdGlvbnMoe1xuICAgICAgbWV0aG9kOiBpc1ByZXNlbnQob3B0aW9ucykgJiYgaXNQcmVzZW50KG9wdGlvbnMubWV0aG9kKSA/IG9wdGlvbnMubWV0aG9kIDogdGhpcy5tZXRob2QsXG4gICAgICBoZWFkZXJzOiBpc1ByZXNlbnQob3B0aW9ucykgJiYgaXNQcmVzZW50KG9wdGlvbnMuaGVhZGVycykgPyBvcHRpb25zLmhlYWRlcnMgOiB0aGlzLmhlYWRlcnMsXG4gICAgICBib2R5OiBpc1ByZXNlbnQob3B0aW9ucykgJiYgaXNQcmVzZW50KG9wdGlvbnMuYm9keSkgPyBvcHRpb25zLmJvZHkgOiB0aGlzLmJvZHksXG4gICAgICB1cmw6IGlzUHJlc2VudChvcHRpb25zKSAmJiBpc1ByZXNlbnQob3B0aW9ucy51cmwpID8gb3B0aW9ucy51cmwgOiB0aGlzLnVybCxcbiAgICAgIHNlYXJjaDogaXNQcmVzZW50KG9wdGlvbnMpICYmIGlzUHJlc2VudChvcHRpb25zLnNlYXJjaCkgP1xuICAgICAgICAgICAgICAgICAgKGlzU3RyaW5nKG9wdGlvbnMuc2VhcmNoKSA/IG5ldyBVUkxTZWFyY2hQYXJhbXMoPHN0cmluZz4ob3B0aW9ucy5zZWFyY2gpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDxVUkxTZWFyY2hQYXJhbXM+KG9wdGlvbnMuc2VhcmNoKSkuY2xvbmUoKSkgOlxuICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hcbiAgICB9KTtcbiAgfVxufVxuXG5cbi8qKlxuICogU3ViY2xhc3Mgb2Yge0BsaW5rIFJlcXVlc3RPcHRpb25zfSwgd2l0aCBkZWZhdWx0IHZhbHVlcy5cbiAqXG4gKiBEZWZhdWx0IHZhbHVlczpcbiAqICAqIG1ldGhvZDoge0BsaW5rIFJlcXVlc3RNZXRob2QgUmVxdWVzdE1ldGhvZC5HZXR9XG4gKiAgKiBoZWFkZXJzOiBlbXB0eSB7QGxpbmsgSGVhZGVyc30gb2JqZWN0XG4gKlxuICogVGhpcyBjbGFzcyBjb3VsZCBiZSBleHRlbmRlZCBhbmQgYm91bmQgdG8gdGhlIHtAbGluayBSZXF1ZXN0T3B0aW9uc30gY2xhc3NcbiAqIHdoZW4gY29uZmlndXJpbmcgYW4ge0BsaW5rIEluamVjdG9yfSwgaW4gb3JkZXIgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICogdXNlZCBieSB7QGxpbmsgSHR0cH0gdG8gY3JlYXRlIGFuZCBzZW5kIHtAbGluayBSZXF1ZXN0IFJlcXVlc3RzfS5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvTEVLVlN4P3A9cHJldmlldykpXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogaW1wb3J0IHtwcm92aWRlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7Ym9vdHN0cmFwfSBmcm9tICdhbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyJztcbiAqIGltcG9ydCB7SFRUUF9QUk9WSURFUlMsIEh0dHAsIEJhc2VSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdE9wdGlvbnN9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICogaW1wb3J0IHtBcHB9IGZyb20gJy4vbXlhcHAnO1xuICpcbiAqIGNsYXNzIE15T3B0aW9ucyBleHRlbmRzIEJhc2VSZXF1ZXN0T3B0aW9ucyB7XG4gKiAgIHNlYXJjaDogc3RyaW5nID0gJ2NvcmVUZWFtPXRydWUnO1xuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHAsIFtIVFRQX1BST1ZJREVSUywgcHJvdmlkZShSZXF1ZXN0T3B0aW9ucywge3VzZUNsYXNzOiBNeU9wdGlvbnN9KV0pO1xuICogYGBgXG4gKlxuICogVGhlIG9wdGlvbnMgY291bGQgYWxzbyBiZSBleHRlbmRlZCB3aGVuIG1hbnVhbGx5IGNyZWF0aW5nIGEge0BsaW5rIFJlcXVlc3R9XG4gKiBvYmplY3QuXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L295Qm9Fdk50RGhPU2ZpOVl4YVZiP3A9cHJldmlldykpXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0Jhc2VSZXF1ZXN0T3B0aW9ucywgUmVxdWVzdCwgUmVxdWVzdE1ldGhvZH0gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKlxuICogdmFyIG9wdGlvbnMgPSBuZXcgQmFzZVJlcXVlc3RPcHRpb25zKCk7XG4gKiB2YXIgcmVxID0gbmV3IFJlcXVlc3Qob3B0aW9ucy5tZXJnZSh7XG4gKiAgIG1ldGhvZDogUmVxdWVzdE1ldGhvZC5Qb3N0LFxuICogICB1cmw6ICdodHRwczovL2dvb2dsZS5jb20nXG4gKiB9KSk7XG4gKiBjb25zb2xlLmxvZygncmVxLm1ldGhvZDonLCBSZXF1ZXN0TWV0aG9kW3JlcS5tZXRob2RdKTsgLy8gUG9zdFxuICogY29uc29sZS5sb2coJ29wdGlvbnMudXJsOicsIG9wdGlvbnMudXJsKTsgLy8gbnVsbFxuICogY29uc29sZS5sb2coJ3JlcS51cmw6JywgcmVxLnVybCk7IC8vIGh0dHBzOi8vZ29vZ2xlLmNvbVxuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCYXNlUmVxdWVzdE9wdGlvbnMgZXh0ZW5kcyBSZXF1ZXN0T3B0aW9ucyB7XG4gIGNvbnN0cnVjdG9yKCkgeyBzdXBlcih7bWV0aG9kOiBSZXF1ZXN0TWV0aG9kLkdldCwgaGVhZGVyczogbmV3IEhlYWRlcnMoKX0pOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9iYXNlX3JlcXVlc3Rfb3B0aW9ucy50c1xuICoqLyIsImltcG9ydCB7Q09OU1RfRVhQUiwgaXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtNYXAsIE1hcFdyYXBwZXIsIExpc3RXcmFwcGVyLCBpc0xpc3RMaWtlSXRlcmFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmZ1bmN0aW9uIHBhcmFtUGFyc2VyKHJhd1BhcmFtczogc3RyaW5nID0gJycpOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT4ge1xuICB2YXIgbWFwID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZ1tdPigpO1xuICBpZiAocmF3UGFyYW1zLmxlbmd0aCA+IDApIHtcbiAgICB2YXIgcGFyYW1zOiBzdHJpbmdbXSA9IHJhd1BhcmFtcy5zcGxpdCgnJicpO1xuICAgIHBhcmFtcy5mb3JFYWNoKChwYXJhbTogc3RyaW5nKSA9PiB7XG4gICAgICB2YXIgc3BsaXQ6IHN0cmluZ1tdID0gcGFyYW0uc3BsaXQoJz0nKTtcbiAgICAgIHZhciBrZXkgPSBzcGxpdFswXTtcbiAgICAgIHZhciB2YWwgPSBzcGxpdFsxXTtcbiAgICAgIHZhciBsaXN0ID0gaXNQcmVzZW50KG1hcC5nZXQoa2V5KSkgPyBtYXAuZ2V0KGtleSkgOiBbXTtcbiAgICAgIGxpc3QucHVzaCh2YWwpO1xuICAgICAgbWFwLnNldChrZXksIGxpc3QpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBtYXA7XG59XG5cbi8qKlxuICogTWFwLWxpa2UgcmVwcmVzZW50YXRpb24gb2YgdXJsIHNlYXJjaCBwYXJhbWV0ZXJzLCBiYXNlZCBvblxuICogW1VSTFNlYXJjaFBhcmFtc10oaHR0cHM6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmxzZWFyY2hwYXJhbXMpIGluIHRoZSB1cmwgbGl2aW5nIHN0YW5kYXJkLFxuICogd2l0aCBzZXZlcmFsIGV4dGVuc2lvbnMgZm9yIG1lcmdpbmcgVVJMU2VhcmNoUGFyYW1zIG9iamVjdHM6XG4gKiAgIC0gc2V0QWxsKClcbiAqICAgLSBhcHBlbmRBbGwoKVxuICogICAtIHJlcGxhY2VBbGwoKVxuICovXG5leHBvcnQgY2xhc3MgVVJMU2VhcmNoUGFyYW1zIHtcbiAgcGFyYW1zTWFwOiBNYXA8c3RyaW5nLCBzdHJpbmdbXT47XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByYXdQYXJhbXM6IHN0cmluZyA9ICcnKSB7IHRoaXMucGFyYW1zTWFwID0gcGFyYW1QYXJzZXIocmF3UGFyYW1zKTsgfVxuXG4gIGNsb25lKCk6IFVSTFNlYXJjaFBhcmFtcyB7XG4gICAgdmFyIGNsb25lID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIGNsb25lLmFwcGVuZEFsbCh0aGlzKTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICBoYXMocGFyYW06IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wYXJhbXNNYXAuaGFzKHBhcmFtKTsgfVxuXG4gIGdldChwYXJhbTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICB2YXIgc3RvcmVkUGFyYW0gPSB0aGlzLnBhcmFtc01hcC5nZXQocGFyYW0pO1xuICAgIGlmIChpc0xpc3RMaWtlSXRlcmFibGUoc3RvcmVkUGFyYW0pKSB7XG4gICAgICByZXR1cm4gTGlzdFdyYXBwZXIuZmlyc3Qoc3RvcmVkUGFyYW0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cblxuICBnZXRBbGwocGFyYW06IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICB2YXIgbWFwUGFyYW0gPSB0aGlzLnBhcmFtc01hcC5nZXQocGFyYW0pO1xuICAgIHJldHVybiBpc1ByZXNlbnQobWFwUGFyYW0pID8gbWFwUGFyYW0gOiBbXTtcbiAgfVxuXG4gIHNldChwYXJhbTogc3RyaW5nLCB2YWw6IHN0cmluZykge1xuICAgIHZhciBtYXBQYXJhbSA9IHRoaXMucGFyYW1zTWFwLmdldChwYXJhbSk7XG4gICAgdmFyIGxpc3QgPSBpc1ByZXNlbnQobWFwUGFyYW0pID8gbWFwUGFyYW0gOiBbXTtcbiAgICBMaXN0V3JhcHBlci5jbGVhcihsaXN0KTtcbiAgICBsaXN0LnB1c2godmFsKTtcbiAgICB0aGlzLnBhcmFtc01hcC5zZXQocGFyYW0sIGxpc3QpO1xuICB9XG5cbiAgLy8gQSBtZXJnZSBvcGVyYXRpb25cbiAgLy8gRm9yIGVhY2ggbmFtZS12YWx1ZXMgcGFpciBpbiBgc2VhcmNoUGFyYW1zYCwgcGVyZm9ybSBgc2V0KG5hbWUsIHZhbHVlc1swXSlgXG4gIC8vXG4gIC8vIEUuZzogXCJhPVsxLDIsM10sIGM9WzhdXCIgKyBcImE9WzQsNSw2XSwgYj1bN11cIiA9IFwiYT1bNF0sIGM9WzhdLCBiPVs3XVwiXG4gIC8vXG4gIC8vIFRPRE8oQGNhaXRwKTogZG9jdW1lbnQgdGhpcyBiZXR0ZXJcbiAgc2V0QWxsKHNlYXJjaFBhcmFtczogVVJMU2VhcmNoUGFyYW1zKSB7XG4gICAgc2VhcmNoUGFyYW1zLnBhcmFtc01hcC5mb3JFYWNoKCh2YWx1ZSwgcGFyYW0pID0+IHtcbiAgICAgIHZhciBtYXBQYXJhbSA9IHRoaXMucGFyYW1zTWFwLmdldChwYXJhbSk7XG4gICAgICB2YXIgbGlzdCA9IGlzUHJlc2VudChtYXBQYXJhbSkgPyBtYXBQYXJhbSA6IFtdO1xuICAgICAgTGlzdFdyYXBwZXIuY2xlYXIobGlzdCk7XG4gICAgICBsaXN0LnB1c2godmFsdWVbMF0pO1xuICAgICAgdGhpcy5wYXJhbXNNYXAuc2V0KHBhcmFtLCBsaXN0KTtcbiAgICB9KTtcbiAgfVxuXG4gIGFwcGVuZChwYXJhbTogc3RyaW5nLCB2YWw6IHN0cmluZyk6IHZvaWQge1xuICAgIHZhciBtYXBQYXJhbSA9IHRoaXMucGFyYW1zTWFwLmdldChwYXJhbSk7XG4gICAgdmFyIGxpc3QgPSBpc1ByZXNlbnQobWFwUGFyYW0pID8gbWFwUGFyYW0gOiBbXTtcbiAgICBsaXN0LnB1c2godmFsKTtcbiAgICB0aGlzLnBhcmFtc01hcC5zZXQocGFyYW0sIGxpc3QpO1xuICB9XG5cbiAgLy8gQSBtZXJnZSBvcGVyYXRpb25cbiAgLy8gRm9yIGVhY2ggbmFtZS12YWx1ZXMgcGFpciBpbiBgc2VhcmNoUGFyYW1zYCwgcGVyZm9ybSBgYXBwZW5kKG5hbWUsIHZhbHVlKWBcbiAgLy8gZm9yIGVhY2ggdmFsdWUgaW4gYHZhbHVlc2AuXG4gIC8vXG4gIC8vIEUuZzogXCJhPVsxLDJdLCBjPVs4XVwiICsgXCJhPVszLDRdLCBiPVs3XVwiID0gXCJhPVsxLDIsMyw0XSwgYz1bOF0sIGI9WzddXCJcbiAgLy9cbiAgLy8gVE9ETyhAY2FpdHApOiBkb2N1bWVudCB0aGlzIGJldHRlclxuICBhcHBlbmRBbGwoc2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICBzZWFyY2hQYXJhbXMucGFyYW1zTWFwLmZvckVhY2goKHZhbHVlLCBwYXJhbSkgPT4ge1xuICAgICAgdmFyIG1hcFBhcmFtID0gdGhpcy5wYXJhbXNNYXAuZ2V0KHBhcmFtKTtcbiAgICAgIHZhciBsaXN0ID0gaXNQcmVzZW50KG1hcFBhcmFtKSA/IG1hcFBhcmFtIDogW107XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGxpc3QucHVzaCh2YWx1ZVtpXSk7XG4gICAgICB9XG4gICAgICB0aGlzLnBhcmFtc01hcC5zZXQocGFyYW0sIGxpc3QpO1xuICAgIH0pO1xuICB9XG5cblxuICAvLyBBIG1lcmdlIG9wZXJhdGlvblxuICAvLyBGb3IgZWFjaCBuYW1lLXZhbHVlcyBwYWlyIGluIGBzZWFyY2hQYXJhbXNgLCBwZXJmb3JtIGBkZWxldGUobmFtZSlgLFxuICAvLyBmb2xsb3dlZCBieSBgc2V0KG5hbWUsIHZhbHVlcylgXG4gIC8vXG4gIC8vIEUuZzogXCJhPVsxLDIsM10sIGM9WzhdXCIgKyBcImE9WzQsNSw2XSwgYj1bN11cIiA9IFwiYT1bNCw1LDZdLCBjPVs4XSwgYj1bN11cIlxuICAvL1xuICAvLyBUT0RPKEBjYWl0cCk6IGRvY3VtZW50IHRoaXMgYmV0dGVyXG4gIHJlcGxhY2VBbGwoc2VhcmNoUGFyYW1zOiBVUkxTZWFyY2hQYXJhbXMpIHtcbiAgICBzZWFyY2hQYXJhbXMucGFyYW1zTWFwLmZvckVhY2goKHZhbHVlLCBwYXJhbSkgPT4ge1xuICAgICAgdmFyIG1hcFBhcmFtID0gdGhpcy5wYXJhbXNNYXAuZ2V0KHBhcmFtKTtcbiAgICAgIHZhciBsaXN0ID0gaXNQcmVzZW50KG1hcFBhcmFtKSA/IG1hcFBhcmFtIDogW107XG4gICAgICBMaXN0V3JhcHBlci5jbGVhcihsaXN0KTtcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgbGlzdC5wdXNoKHZhbHVlW2ldKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFyYW1zTWFwLnNldChwYXJhbSwgbGlzdCk7XG4gICAgfSk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHZhciBwYXJhbXNMaXN0ID0gW107XG4gICAgdGhpcy5wYXJhbXNNYXAuZm9yRWFjaCgodmFsdWVzLCBrKSA9PiB7IHZhbHVlcy5mb3JFYWNoKHYgPT4gcGFyYW1zTGlzdC5wdXNoKGsgKyAnPScgKyB2KSk7IH0pO1xuICAgIHJldHVybiBwYXJhbXNMaXN0LmpvaW4oJyYnKTtcbiAgfVxuXG4gIGRlbGV0ZSAocGFyYW06IHN0cmluZyk6IHZvaWQgeyB0aGlzLnBhcmFtc01hcC5kZWxldGUocGFyYW0pOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC91cmxfc2VhcmNoX3BhcmFtcy50c1xuICoqLyIsImltcG9ydCB7Q29ubmVjdGlvbkJhY2tlbmQsIENvbm5lY3Rpb259IGZyb20gJy4uL2ludGVyZmFjZXMnO1xuaW1wb3J0IHtSZWFkeVN0YXRlLCBSZXF1ZXN0TWV0aG9kLCBSZXNwb25zZVR5cGV9IGZyb20gJy4uL2VudW1zJztcbmltcG9ydCB7UmVxdWVzdH0gZnJvbSAnLi4vc3RhdGljX3JlcXVlc3QnO1xuaW1wb3J0IHtSZXNwb25zZX0gZnJvbSAnLi4vc3RhdGljX3Jlc3BvbnNlJztcbmltcG9ydCB7SGVhZGVyc30gZnJvbSAnLi4vaGVhZGVycyc7XG5pbXBvcnQge1Jlc3BvbnNlT3B0aW9ucywgQmFzZVJlc3BvbnNlT3B0aW9uc30gZnJvbSAnLi4vYmFzZV9yZXNwb25zZV9vcHRpb25zJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge0Jyb3dzZXJYaHJ9IGZyb20gJy4vYnJvd3Nlcl94aHInO1xuaW1wb3J0IHtpc1ByZXNlbnR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMvT2JzZXJ2YWJsZSc7XG5pbXBvcnQge2lzU3VjY2VzcywgZ2V0UmVzcG9uc2VVUkx9IGZyb20gJy4uL2h0dHBfdXRpbHMnO1xuLyoqXG4qIENyZWF0ZXMgY29ubmVjdGlvbnMgdXNpbmcgYFhNTEh0dHBSZXF1ZXN0YC4gR2l2ZW4gYSBmdWxseS1xdWFsaWZpZWRcbiogcmVxdWVzdCwgYW4gYFhIUkNvbm5lY3Rpb25gIHdpbGwgaW1tZWRpYXRlbHkgY3JlYXRlIGFuIGBYTUxIdHRwUmVxdWVzdGAgb2JqZWN0IGFuZCBzZW5kIHRoZVxuKiByZXF1ZXN0LlxuKlxuKiBUaGlzIGNsYXNzIHdvdWxkIHR5cGljYWxseSBub3QgYmUgY3JlYXRlZCBvciBpbnRlcmFjdGVkIHdpdGggZGlyZWN0bHkgaW5zaWRlIGFwcGxpY2F0aW9ucywgdGhvdWdoXG4qIHRoZSB7QGxpbmsgTW9ja0Nvbm5lY3Rpb259IG1heSBiZSBpbnRlcmFjdGVkIHdpdGggaW4gdGVzdHMuXG4qL1xuZXhwb3J0IGNsYXNzIFhIUkNvbm5lY3Rpb24gaW1wbGVtZW50cyBDb25uZWN0aW9uIHtcbiAgcmVxdWVzdDogUmVxdWVzdDtcbiAgLyoqXG4gICAqIFJlc3BvbnNlIHtAbGluayBFdmVudEVtaXR0ZXJ9IHdoaWNoIGVtaXRzIGEgc2luZ2xlIHtAbGluayBSZXNwb25zZX0gdmFsdWUgb24gbG9hZCBldmVudCBvZlxuICAgKiBgWE1MSHR0cFJlcXVlc3RgLlxuICAgKi9cbiAgcmVzcG9uc2U6IE9ic2VydmFibGU8UmVzcG9uc2U+O1xuICByZWFkeVN0YXRlOiBSZWFkeVN0YXRlO1xuICBjb25zdHJ1Y3RvcihyZXE6IFJlcXVlc3QsIGJyb3dzZXJYSFI6IEJyb3dzZXJYaHIsIGJhc2VSZXNwb25zZU9wdGlvbnM/OiBSZXNwb25zZU9wdGlvbnMpIHtcbiAgICB0aGlzLnJlcXVlc3QgPSByZXE7XG4gICAgdGhpcy5yZXNwb25zZSA9IG5ldyBPYnNlcnZhYmxlKHJlc3BvbnNlT2JzZXJ2ZXIgPT4ge1xuICAgICAgbGV0IF94aHI6IFhNTEh0dHBSZXF1ZXN0ID0gYnJvd3NlclhIUi5idWlsZCgpO1xuICAgICAgX3hoci5vcGVuKFJlcXVlc3RNZXRob2RbcmVxLm1ldGhvZF0udG9VcHBlckNhc2UoKSwgcmVxLnVybCk7XG4gICAgICAvLyBsb2FkIGV2ZW50IGhhbmRsZXJcbiAgICAgIGxldCBvbkxvYWQgPSAoKSA9PiB7XG4gICAgICAgIC8vIHJlc3BvbnNlVGV4dCBpcyB0aGUgb2xkLXNjaG9vbCB3YXkgb2YgcmV0cmlldmluZyByZXNwb25zZSAoc3VwcG9ydGVkIGJ5IElFOCAmIDkpXG4gICAgICAgIC8vIHJlc3BvbnNlL3Jlc3BvbnNlVHlwZSBwcm9wZXJ0aWVzIHdlcmUgaW50cm9kdWNlZCBpbiBYSFIgTGV2ZWwyIHNwZWMgKHN1cHBvcnRlZCBieVxuICAgICAgICAvLyBJRTEwKVxuICAgICAgICBsZXQgYm9keSA9IGlzUHJlc2VudChfeGhyLnJlc3BvbnNlKSA/IF94aHIucmVzcG9uc2UgOiBfeGhyLnJlc3BvbnNlVGV4dDtcblxuICAgICAgICBsZXQgaGVhZGVycyA9IEhlYWRlcnMuZnJvbVJlc3BvbnNlSGVhZGVyU3RyaW5nKF94aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpO1xuXG4gICAgICAgIGxldCB1cmwgPSBnZXRSZXNwb25zZVVSTChfeGhyKTtcblxuICAgICAgICAvLyBub3JtYWxpemUgSUU5IGJ1ZyAoaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTQ1MClcbiAgICAgICAgbGV0IHN0YXR1czogbnVtYmVyID0gX3hoci5zdGF0dXMgPT09IDEyMjMgPyAyMDQgOiBfeGhyLnN0YXR1cztcblxuICAgICAgICAvLyBmaXggc3RhdHVzIGNvZGUgd2hlbiBpdCBpcyAwICgwIHN0YXR1cyBpcyB1bmRvY3VtZW50ZWQpLlxuICAgICAgICAvLyBPY2N1cnMgd2hlbiBhY2Nlc3NpbmcgZmlsZSByZXNvdXJjZXMgb3Igb24gQW5kcm9pZCA0LjEgc3RvY2sgYnJvd3NlclxuICAgICAgICAvLyB3aGlsZSByZXRyaWV2aW5nIGZpbGVzIGZyb20gYXBwbGljYXRpb24gY2FjaGUuXG4gICAgICAgIGlmIChzdGF0dXMgPT09IDApIHtcbiAgICAgICAgICBzdGF0dXMgPSBib2R5ID8gMjAwIDogMDtcbiAgICAgICAgfVxuICAgICAgICB2YXIgcmVzcG9uc2VPcHRpb25zID0gbmV3IFJlc3BvbnNlT3B0aW9ucyh7Ym9keSwgc3RhdHVzLCBoZWFkZXJzLCB1cmx9KTtcbiAgICAgICAgaWYgKGlzUHJlc2VudChiYXNlUmVzcG9uc2VPcHRpb25zKSkge1xuICAgICAgICAgIHJlc3BvbnNlT3B0aW9ucyA9IGJhc2VSZXNwb25zZU9wdGlvbnMubWVyZ2UocmVzcG9uc2VPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzcG9uc2UgPSBuZXcgUmVzcG9uc2UocmVzcG9uc2VPcHRpb25zKTtcbiAgICAgICAgaWYgKGlzU3VjY2VzcyhzdGF0dXMpKSB7XG4gICAgICAgICAgcmVzcG9uc2VPYnNlcnZlci5uZXh0KHJlc3BvbnNlKTtcbiAgICAgICAgICAvLyBUT0RPKGdkaTIyOTApOiBkZWZlciBjb21wbGV0ZSBpZiBhcnJheSBidWZmZXIgdW50aWwgZG9uZVxuICAgICAgICAgIHJlc3BvbnNlT2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVzcG9uc2VPYnNlcnZlci5lcnJvcihyZXNwb25zZSk7XG4gICAgICB9O1xuICAgICAgLy8gZXJyb3IgZXZlbnQgaGFuZGxlclxuICAgICAgbGV0IG9uRXJyb3IgPSAoZXJyKSA9PiB7XG4gICAgICAgIHZhciByZXNwb25zZU9wdGlvbnMgPSBuZXcgUmVzcG9uc2VPcHRpb25zKHtib2R5OiBlcnIsIHR5cGU6IFJlc3BvbnNlVHlwZS5FcnJvcn0pO1xuICAgICAgICBpZiAoaXNQcmVzZW50KGJhc2VSZXNwb25zZU9wdGlvbnMpKSB7XG4gICAgICAgICAgcmVzcG9uc2VPcHRpb25zID0gYmFzZVJlc3BvbnNlT3B0aW9ucy5tZXJnZShyZXNwb25zZU9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIHJlc3BvbnNlT2JzZXJ2ZXIuZXJyb3IobmV3IFJlc3BvbnNlKHJlc3BvbnNlT3B0aW9ucykpO1xuICAgICAgfTtcblxuICAgICAgaWYgKGlzUHJlc2VudChyZXEuaGVhZGVycykpIHtcbiAgICAgICAgcmVxLmhlYWRlcnMuZm9yRWFjaCgodmFsdWVzLCBuYW1lKSA9PiBfeGhyLnNldFJlcXVlc3RIZWFkZXIobmFtZSwgdmFsdWVzLmpvaW4oJywnKSkpO1xuICAgICAgfVxuXG4gICAgICBfeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpO1xuICAgICAgX3hoci5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuXG4gICAgICBfeGhyLnNlbmQodGhpcy5yZXF1ZXN0LnRleHQoKSk7XG5cbiAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgIF94aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7XG4gICAgICAgIF94aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgX3hoci5hYm9ydCgpO1xuICAgICAgfTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMge0BsaW5rIFhIUkNvbm5lY3Rpb259IGluc3RhbmNlcy5cbiAqXG4gKiBUaGlzIGNsYXNzIHdvdWxkIHR5cGljYWxseSBub3QgYmUgdXNlZCBieSBlbmQgdXNlcnMsIGJ1dCBjb3VsZCBiZVxuICogb3ZlcnJpZGRlbiBpZiBhIGRpZmZlcmVudCBiYWNrZW5kIGltcGxlbWVudGF0aW9uIHNob3VsZCBiZSB1c2VkLFxuICogc3VjaCBhcyBpbiBhIG5vZGUgYmFja2VuZC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtIdHRwLCBNeU5vZGVCYWNrZW5kLCBIVFRQX1BST1ZJREVSUywgQmFzZVJlcXVlc3RPcHRpb25zfSBmcm9tICdhbmd1bGFyMi9odHRwJztcbiAqIEBDb21wb25lbnQoe1xuICogICB2aWV3UHJvdmlkZXJzOiBbXG4gKiAgICAgSFRUUF9QUk9WSURFUlMsXG4gKiAgICAgcHJvdmlkZShIdHRwLCB7dXNlRmFjdG9yeTogKGJhY2tlbmQsIG9wdGlvbnMpID0+IHtcbiAqICAgICAgIHJldHVybiBuZXcgSHR0cChiYWNrZW5kLCBvcHRpb25zKTtcbiAqICAgICB9LCBkZXBzOiBbTXlOb2RlQmFja2VuZCwgQmFzZVJlcXVlc3RPcHRpb25zXX0pXVxuICogfSlcbiAqIGNsYXNzIE15Q29tcG9uZW50IHtcbiAqICAgY29uc3RydWN0b3IoaHR0cDpIdHRwKSB7XG4gKiAgICAgaHR0cC5yZXF1ZXN0KCdwZW9wbGUuanNvbicpLnN1YnNjcmliZShyZXMgPT4gdGhpcy5wZW9wbGUgPSByZXMuanNvbigpKTtcbiAqICAgfVxuICogfVxuICogYGBgXG4gKlxuICoqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFhIUkJhY2tlbmQgaW1wbGVtZW50cyBDb25uZWN0aW9uQmFja2VuZCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jyb3dzZXJYSFI6IEJyb3dzZXJYaHIsIHByaXZhdGUgX2Jhc2VSZXNwb25zZU9wdGlvbnM6IFJlc3BvbnNlT3B0aW9ucykge31cbiAgY3JlYXRlQ29ubmVjdGlvbihyZXF1ZXN0OiBSZXF1ZXN0KTogWEhSQ29ubmVjdGlvbiB7XG4gICAgcmV0dXJuIG5ldyBYSFJDb25uZWN0aW9uKHJlcXVlc3QsIHRoaXMuX2Jyb3dzZXJYSFIsIHRoaXMuX2Jhc2VSZXNwb25zZU9wdGlvbnMpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9iYWNrZW5kcy94aHJfYmFja2VuZC50c1xuICoqLyIsImltcG9ydCB7UmVzcG9uc2VUeXBlfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7Q09OU1RfRVhQUiwgaXNTdHJpbmcsIGlzUHJlc2VudCwgSnNvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7SGVhZGVyc30gZnJvbSAnLi9oZWFkZXJzJztcbmltcG9ydCB7UmVzcG9uc2VPcHRpb25zfSBmcm9tICcuL2Jhc2VfcmVzcG9uc2Vfb3B0aW9ucyc7XG5pbXBvcnQge2lzSnNPYmplY3R9IGZyb20gJy4vaHR0cF91dGlscyc7XG5cbi8qKlxuICogQ3JlYXRlcyBgUmVzcG9uc2VgIGluc3RhbmNlcyBmcm9tIHByb3ZpZGVkIHZhbHVlcy5cbiAqXG4gKiBUaG91Z2ggdGhpcyBvYmplY3QgaXNuJ3RcbiAqIHVzdWFsbHkgaW5zdGFudGlhdGVkIGJ5IGVuZC11c2VycywgaXQgaXMgdGhlIHByaW1hcnkgb2JqZWN0IGludGVyYWN0ZWQgd2l0aCB3aGVuIGl0IGNvbWVzIHRpbWUgdG9cbiAqIGFkZCBkYXRhIHRvIGEgdmlldy5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogaHR0cC5yZXF1ZXN0KCdteS1mcmllbmRzLnR4dCcpLnN1YnNjcmliZShyZXNwb25zZSA9PiB0aGlzLmZyaWVuZHMgPSByZXNwb25zZS50ZXh0KCkpO1xuICogYGBgXG4gKlxuICogVGhlIFJlc3BvbnNlJ3MgaW50ZXJmYWNlIGlzIGluc3BpcmVkIGJ5IHRoZSBSZXNwb25zZSBjb25zdHJ1Y3RvciBkZWZpbmVkIGluIHRoZSBbRmV0Y2hcbiAqIFNwZWNdKGh0dHBzOi8vZmV0Y2guc3BlYy53aGF0d2cub3JnLyNyZXNwb25zZS1jbGFzcyksIGJ1dCBpcyBjb25zaWRlcmVkIGEgc3RhdGljIHZhbHVlIHdob3NlIGJvZHlcbiAqIGNhbiBiZSBhY2Nlc3NlZCBtYW55IHRpbWVzLiBUaGVyZSBhcmUgb3RoZXIgZGlmZmVyZW5jZXMgaW4gdGhlIGltcGxlbWVudGF0aW9uLCBidXQgdGhpcyBpcyB0aGVcbiAqIG1vc3Qgc2lnbmlmaWNhbnQuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNwb25zZSB7XG4gIC8qKlxuICAgKiBPbmUgb2YgXCJiYXNpY1wiLCBcImNvcnNcIiwgXCJkZWZhdWx0XCIsIFwiZXJyb3IsIG9yIFwib3BhcXVlXCIuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIFwiZGVmYXVsdFwiLlxuICAgKi9cbiAgdHlwZTogUmVzcG9uc2VUeXBlO1xuICAvKipcbiAgICogVHJ1ZSBpZiB0aGUgcmVzcG9uc2UncyBzdGF0dXMgaXMgd2l0aGluIDIwMC0yOTlcbiAgICovXG4gIG9rOiBib29sZWFuO1xuICAvKipcbiAgICogVVJMIG9mIHJlc3BvbnNlLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBlbXB0eSBzdHJpbmcuXG4gICAqL1xuICB1cmw6IHN0cmluZztcbiAgLyoqXG4gICAqIFN0YXR1cyBjb2RlIHJldHVybmVkIGJ5IHNlcnZlci5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gMjAwLlxuICAgKi9cbiAgc3RhdHVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBUZXh0IHJlcHJlc2VudGluZyB0aGUgY29ycmVzcG9uZGluZyByZWFzb24gcGhyYXNlIHRvIHRoZSBgc3RhdHVzYCwgYXMgZGVmaW5lZCBpbiBbaWV0ZiByZmMgMjYxNlxuICAgKiBzZWN0aW9uIDYuMS4xXShodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMjYxNiNzZWN0aW9uLTYuMS4xKVxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBcIk9LXCJcbiAgICovXG4gIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgLyoqXG4gICAqIE5vbi1zdGFuZGFyZCBwcm9wZXJ0eVxuICAgKlxuICAgKiBEZW5vdGVzIGhvdyBtYW55IG9mIHRoZSByZXNwb25zZSBib2R5J3MgYnl0ZXMgaGF2ZSBiZWVuIGxvYWRlZCwgZm9yIGV4YW1wbGUgaWYgdGhlIHJlc3BvbnNlIGlzXG4gICAqIHRoZSByZXN1bHQgb2YgYSBwcm9ncmVzcyBldmVudC5cbiAgICovXG4gIGJ5dGVzTG9hZGVkOiBudW1iZXI7XG4gIC8qKlxuICAgKiBOb24tc3RhbmRhcmQgcHJvcGVydHlcbiAgICpcbiAgICogRGVub3RlcyBob3cgbWFueSBieXRlcyBhcmUgZXhwZWN0ZWQgaW4gdGhlIGZpbmFsIHJlc3BvbnNlIGJvZHkuXG4gICAqL1xuICB0b3RhbEJ5dGVzOiBudW1iZXI7XG4gIC8qKlxuICAgKiBIZWFkZXJzIG9iamVjdCBiYXNlZCBvbiB0aGUgYEhlYWRlcnNgIGNsYXNzIGluIHRoZSBbRmV0Y2hcbiAgICogU3BlY10oaHR0cHM6Ly9mZXRjaC5zcGVjLndoYXR3Zy5vcmcvI2hlYWRlcnMtY2xhc3MpLlxuICAgKi9cbiAgaGVhZGVyczogSGVhZGVycztcbiAgLy8gVE9ETzogU3VwcG9ydCBBcnJheUJ1ZmZlciwgSlNPTiwgRm9ybURhdGEsIEJsb2JcbiAgcHJpdmF0ZSBfYm9keTogc3RyaW5nIHwgT2JqZWN0O1xuICBjb25zdHJ1Y3RvcihyZXNwb25zZU9wdGlvbnM6IFJlc3BvbnNlT3B0aW9ucykge1xuICAgIHRoaXMuX2JvZHkgPSByZXNwb25zZU9wdGlvbnMuYm9keTtcbiAgICB0aGlzLnN0YXR1cyA9IHJlc3BvbnNlT3B0aW9ucy5zdGF0dXM7XG4gICAgdGhpcy5zdGF0dXNUZXh0ID0gcmVzcG9uc2VPcHRpb25zLnN0YXR1c1RleHQ7XG4gICAgdGhpcy5oZWFkZXJzID0gcmVzcG9uc2VPcHRpb25zLmhlYWRlcnM7XG4gICAgdGhpcy50eXBlID0gcmVzcG9uc2VPcHRpb25zLnR5cGU7XG4gICAgdGhpcy51cmwgPSByZXNwb25zZU9wdGlvbnMudXJsO1xuICB9XG5cbiAgLyoqXG4gICAqIE5vdCB5ZXQgaW1wbGVtZW50ZWRcbiAgICovXG4gIC8vIFRPRE86IEJsb2IgcmV0dXJuIHR5cGVcbiAgYmxvYigpOiBhbnkgeyB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignXCJibG9iKClcIiBtZXRob2Qgbm90IGltcGxlbWVudGVkIG9uIFJlc3BvbnNlIHN1cGVyY2xhc3MnKTsgfVxuXG4gIC8qKlxuICAgKiBBdHRlbXB0cyB0byByZXR1cm4gYm9keSBhcyBwYXJzZWQgYEpTT05gIG9iamVjdCwgb3IgcmFpc2VzIGFuIGV4Y2VwdGlvbi5cbiAgICovXG4gIGpzb24oKTogYW55IHtcbiAgICB2YXIganNvblJlc3BvbnNlO1xuICAgIGlmIChpc0pzT2JqZWN0KHRoaXMuX2JvZHkpKSB7XG4gICAgICBqc29uUmVzcG9uc2UgPSB0aGlzLl9ib2R5O1xuICAgIH0gZWxzZSBpZiAoaXNTdHJpbmcodGhpcy5fYm9keSkpIHtcbiAgICAgIGpzb25SZXNwb25zZSA9IEpzb24ucGFyc2UoPHN0cmluZz50aGlzLl9ib2R5KTtcbiAgICB9XG4gICAgcmV0dXJuIGpzb25SZXNwb25zZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBib2R5IGFzIGEgc3RyaW5nLCBwcmVzdW1pbmcgYHRvU3RyaW5nKClgIGNhbiBiZSBjYWxsZWQgb24gdGhlIHJlc3BvbnNlIGJvZHkuXG4gICAqL1xuICB0ZXh0KCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9ib2R5LnRvU3RyaW5nKCk7IH1cblxuICAvKipcbiAgICogTm90IHlldCBpbXBsZW1lbnRlZFxuICAgKi9cbiAgLy8gVE9ETzogQXJyYXlCdWZmZXIgcmV0dXJuIHR5cGVcbiAgYXJyYXlCdWZmZXIoKTogYW55IHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignXCJhcnJheUJ1ZmZlcigpXCIgbWV0aG9kIG5vdCBpbXBsZW1lbnRlZCBvbiBSZXNwb25zZSBzdXBlcmNsYXNzJyk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9odHRwL3N0YXRpY19yZXNwb25zZS50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge2lzUHJlc2VudCwgaXNKc09iamVjdH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7SGVhZGVyc30gZnJvbSAnLi9oZWFkZXJzJztcbmltcG9ydCB7UmVzcG9uc2VUeXBlfSBmcm9tICcuL2VudW1zJztcbmltcG9ydCB7UmVzcG9uc2VPcHRpb25zQXJnc30gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgcmVzcG9uc2Ugb3B0aW9ucyBvYmplY3QgdG8gYmUgb3B0aW9uYWxseSBwcm92aWRlZCB3aGVuIGluc3RhbnRpYXRpbmcgYVxuICoge0BsaW5rIFJlc3BvbnNlfS5cbiAqXG4gKiBUaGlzIGNsYXNzIGlzIGJhc2VkIG9uIHRoZSBgUmVzcG9uc2VJbml0YCBkZXNjcmlwdGlvbiBpbiB0aGUgW0ZldGNoXG4gKiBTcGVjXShodHRwczovL2ZldGNoLnNwZWMud2hhdHdnLm9yZy8jcmVzcG9uc2Vpbml0KS5cbiAqXG4gKiBBbGwgdmFsdWVzIGFyZSBudWxsIGJ5IGRlZmF1bHQuIFR5cGljYWwgZGVmYXVsdHMgY2FuIGJlIGZvdW5kIGluIHRoZVxuICoge0BsaW5rIEJhc2VSZXNwb25zZU9wdGlvbnN9IGNsYXNzLCB3aGljaCBzdWItY2xhc3NlcyBgUmVzcG9uc2VPcHRpb25zYC5cbiAqXG4gKiBUaGlzIGNsYXNzIG1heSBiZSB1c2VkIGluIHRlc3RzIHRvIGJ1aWxkIHtAbGluayBSZXNwb25zZSBSZXNwb25zZXN9IGZvclxuICogbW9jayByZXNwb25zZXMgKHNlZSB7QGxpbmsgTW9ja0JhY2tlbmR9KS5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvUDlKa2s4ZThjejZOVnpiY3hFc0Q/cD1wcmV2aWV3KSlcbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBpbXBvcnQge1Jlc3BvbnNlT3B0aW9ucywgUmVzcG9uc2V9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICpcbiAqIHZhciBvcHRpb25zID0gbmV3IFJlc3BvbnNlT3B0aW9ucyh7XG4gKiAgIGJvZHk6ICd7XCJuYW1lXCI6XCJKZWZmXCJ9J1xuICogfSk7XG4gKiB2YXIgcmVzID0gbmV3IFJlc3BvbnNlKG9wdGlvbnMpO1xuICpcbiAqIGNvbnNvbGUubG9nKCdyZXMuanNvbigpOicsIHJlcy5qc29uKCkpOyAvLyBPYmplY3Qge25hbWU6IFwiSmVmZlwifVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNwb25zZU9wdGlvbnMge1xuICAvLyBUT0RPOiBBcnJheUJ1ZmZlciB8IEZvcm1EYXRhIHwgQmxvYlxuICAvKipcbiAgICogU3RyaW5nIG9yIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGJvZHkgb2YgdGhlIHtAbGluayBSZXNwb25zZX0uXG4gICAqL1xuICBib2R5OiBzdHJpbmcgfCBPYmplY3Q7XG4gIC8qKlxuICAgKiBIdHRwIHtAbGluayBodHRwOi8vd3d3LnczLm9yZy9Qcm90b2NvbHMvcmZjMjYxNi9yZmMyNjE2LXNlYzEwLmh0bWwgc3RhdHVzIGNvZGV9XG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVzcG9uc2UuXG4gICAqL1xuICBzdGF0dXM6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlc3BvbnNlIHtAbGluayBIZWFkZXJzIGhlYWRlcnN9XG4gICAqL1xuICBoZWFkZXJzOiBIZWFkZXJzO1xuICAvKipcbiAgICogQGludGVybmFsXG4gICAqL1xuICBzdGF0dXNUZXh0OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAaW50ZXJuYWxcbiAgICovXG4gIHR5cGU6IFJlc3BvbnNlVHlwZTtcbiAgdXJsOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHtib2R5LCBzdGF0dXMsIGhlYWRlcnMsIHN0YXR1c1RleHQsIHR5cGUsIHVybH06IFJlc3BvbnNlT3B0aW9uc0FyZ3MgPSB7fSkge1xuICAgIHRoaXMuYm9keSA9IGlzUHJlc2VudChib2R5KSA/IGJvZHkgOiBudWxsO1xuICAgIHRoaXMuc3RhdHVzID0gaXNQcmVzZW50KHN0YXR1cykgPyBzdGF0dXMgOiBudWxsO1xuICAgIHRoaXMuaGVhZGVycyA9IGlzUHJlc2VudChoZWFkZXJzKSA/IGhlYWRlcnMgOiBudWxsO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9IGlzUHJlc2VudChzdGF0dXNUZXh0KSA/IHN0YXR1c1RleHQgOiBudWxsO1xuICAgIHRoaXMudHlwZSA9IGlzUHJlc2VudCh0eXBlKSA/IHR5cGUgOiBudWxsO1xuICAgIHRoaXMudXJsID0gaXNQcmVzZW50KHVybCkgPyB1cmwgOiBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBjb3B5IG9mIHRoZSBgUmVzcG9uc2VPcHRpb25zYCBpbnN0YW5jZSwgdXNpbmcgdGhlIG9wdGlvbmFsIGlucHV0IGFzIHZhbHVlcyB0b1xuICAgKiBvdmVycmlkZVxuICAgKiBleGlzdGluZyB2YWx1ZXMuIFRoaXMgbWV0aG9kIHdpbGwgbm90IGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZSBpbnN0YW5jZSBvbiB3aGljaCBpdCBpcyBiZWluZ1xuICAgKiBjYWxsZWQuXG4gICAqXG4gICAqIFRoaXMgbWF5IGJlIHVzZWZ1bCB3aGVuIHNoYXJpbmcgYSBiYXNlIGBSZXNwb25zZU9wdGlvbnNgIG9iamVjdCBpbnNpZGUgdGVzdHMsXG4gICAqIHdoZXJlIGNlcnRhaW4gcHJvcGVydGllcyBtYXkgY2hhbmdlIGZyb20gdGVzdCB0byB0ZXN0LlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvMWxYcXVxRmZnZHVURkJXak5vUkU/cD1wcmV2aWV3KSlcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBpbXBvcnQge1Jlc3BvbnNlT3B0aW9ucywgUmVzcG9uc2V9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICAgKlxuICAgKiB2YXIgb3B0aW9ucyA9IG5ldyBSZXNwb25zZU9wdGlvbnMoe1xuICAgKiAgIGJvZHk6IHtuYW1lOiAnSmVmZid9XG4gICAqIH0pO1xuICAgKiB2YXIgcmVzID0gbmV3IFJlc3BvbnNlKG9wdGlvbnMubWVyZ2Uoe1xuICAgKiAgIHVybDogJ2h0dHBzOi8vZ29vZ2xlLmNvbSdcbiAgICogfSkpO1xuICAgKiBjb25zb2xlLmxvZygnb3B0aW9ucy51cmw6Jywgb3B0aW9ucy51cmwpOyAvLyBudWxsXG4gICAqIGNvbnNvbGUubG9nKCdyZXMuanNvbigpOicsIHJlcy5qc29uKCkpOyAvLyBPYmplY3Qge25hbWU6IFwiSmVmZlwifVxuICAgKiBjb25zb2xlLmxvZygncmVzLnVybDonLCByZXMudXJsKTsgLy8gaHR0cHM6Ly9nb29nbGUuY29tXG4gICAqIGBgYFxuICAgKi9cbiAgbWVyZ2Uob3B0aW9ucz86IFJlc3BvbnNlT3B0aW9uc0FyZ3MpOiBSZXNwb25zZU9wdGlvbnMge1xuICAgIHJldHVybiBuZXcgUmVzcG9uc2VPcHRpb25zKHtcbiAgICAgIGJvZHk6IGlzUHJlc2VudChvcHRpb25zKSAmJiBpc1ByZXNlbnQob3B0aW9ucy5ib2R5KSA/IG9wdGlvbnMuYm9keSA6IHRoaXMuYm9keSxcbiAgICAgIHN0YXR1czogaXNQcmVzZW50KG9wdGlvbnMpICYmIGlzUHJlc2VudChvcHRpb25zLnN0YXR1cykgPyBvcHRpb25zLnN0YXR1cyA6IHRoaXMuc3RhdHVzLFxuICAgICAgaGVhZGVyczogaXNQcmVzZW50KG9wdGlvbnMpICYmIGlzUHJlc2VudChvcHRpb25zLmhlYWRlcnMpID8gb3B0aW9ucy5oZWFkZXJzIDogdGhpcy5oZWFkZXJzLFxuICAgICAgc3RhdHVzVGV4dDogaXNQcmVzZW50KG9wdGlvbnMpICYmIGlzUHJlc2VudChvcHRpb25zLnN0YXR1c1RleHQpID8gb3B0aW9ucy5zdGF0dXNUZXh0IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdHVzVGV4dCxcbiAgICAgIHR5cGU6IGlzUHJlc2VudChvcHRpb25zKSAmJiBpc1ByZXNlbnQob3B0aW9ucy50eXBlKSA/IG9wdGlvbnMudHlwZSA6IHRoaXMudHlwZSxcbiAgICAgIHVybDogaXNQcmVzZW50KG9wdGlvbnMpICYmIGlzUHJlc2VudChvcHRpb25zLnVybCkgPyBvcHRpb25zLnVybCA6IHRoaXMudXJsLFxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogU3ViY2xhc3Mgb2Yge0BsaW5rIFJlc3BvbnNlT3B0aW9uc30sIHdpdGggZGVmYXVsdCB2YWx1ZXMuXG4gKlxuICogRGVmYXVsdCB2YWx1ZXM6XG4gKiAgKiBzdGF0dXM6IDIwMFxuICogICogaGVhZGVyczogZW1wdHkge0BsaW5rIEhlYWRlcnN9IG9iamVjdFxuICpcbiAqIFRoaXMgY2xhc3MgY291bGQgYmUgZXh0ZW5kZWQgYW5kIGJvdW5kIHRvIHRoZSB7QGxpbmsgUmVzcG9uc2VPcHRpb25zfSBjbGFzc1xuICogd2hlbiBjb25maWd1cmluZyBhbiB7QGxpbmsgSW5qZWN0b3J9LCBpbiBvcmRlciB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvcHRpb25zXG4gKiB1c2VkIGJ5IHtAbGluayBIdHRwfSB0byBjcmVhdGUge0BsaW5rIFJlc3BvbnNlIFJlc3BvbnNlc30uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L3F2OERMVD9wPXByZXZpZXcpKVxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGltcG9ydCB7cHJvdmlkZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge2Jvb3RzdHJhcH0gZnJvbSAnYW5ndWxhcjIvcGxhdGZvcm0vYnJvd3Nlcic7XG4gKiBpbXBvcnQge0hUVFBfUFJPVklERVJTLCBIZWFkZXJzLCBIdHRwLCBCYXNlUmVzcG9uc2VPcHRpb25zLCBSZXNwb25zZU9wdGlvbnN9IGZyb21cbiAqICdhbmd1bGFyMi9odHRwJztcbiAqIGltcG9ydCB7QXBwfSBmcm9tICcuL215YXBwJztcbiAqXG4gKiBjbGFzcyBNeU9wdGlvbnMgZXh0ZW5kcyBCYXNlUmVzcG9uc2VPcHRpb25zIHtcbiAqICAgaGVhZGVyczpIZWFkZXJzID0gbmV3IEhlYWRlcnMoe25ldHdvcms6ICdnaXRodWInfSk7XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcCwgW0hUVFBfUFJPVklERVJTLCBwcm92aWRlKFJlc3BvbnNlT3B0aW9ucywge3VzZUNsYXNzOiBNeU9wdGlvbnN9KV0pO1xuICogYGBgXG4gKlxuICogVGhlIG9wdGlvbnMgY291bGQgYWxzbyBiZSBleHRlbmRlZCB3aGVuIG1hbnVhbGx5IGNyZWF0aW5nIGEge0BsaW5rIFJlc3BvbnNlfVxuICogb2JqZWN0LlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9Wbmdvc09XaWFFeEV0YnN0RG9peD9wPXByZXZpZXcpKVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtCYXNlUmVzcG9uc2VPcHRpb25zLCBSZXNwb25zZX0gZnJvbSAnYW5ndWxhcjIvaHR0cCc7XG4gKlxuICogdmFyIG9wdGlvbnMgPSBuZXcgQmFzZVJlc3BvbnNlT3B0aW9ucygpO1xuICogdmFyIHJlcyA9IG5ldyBSZXNwb25zZShvcHRpb25zLm1lcmdlKHtcbiAqICAgYm9keTogJ0FuZ3VsYXIyJyxcbiAqICAgaGVhZGVyczogbmV3IEhlYWRlcnMoe2ZyYW1ld29yazogJ2FuZ3VsYXInfSlcbiAqIH0pKTtcbiAqIGNvbnNvbGUubG9nKCdyZXMuaGVhZGVycy5nZXQoXCJmcmFtZXdvcmtcIik6JywgcmVzLmhlYWRlcnMuZ2V0KCdmcmFtZXdvcmsnKSk7IC8vIGFuZ3VsYXJcbiAqIGNvbnNvbGUubG9nKCdyZXMudGV4dCgpOicsIHJlcy50ZXh0KCkpOyAvLyBBbmd1bGFyMjtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQmFzZVJlc3BvbnNlT3B0aW9ucyBleHRlbmRzIFJlc3BvbnNlT3B0aW9ucyB7XG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKHtzdGF0dXM6IDIwMCwgc3RhdHVzVGV4dDogJ09rJywgdHlwZTogUmVzcG9uc2VUeXBlLkRlZmF1bHQsIGhlYWRlcnM6IG5ldyBIZWFkZXJzKCl9KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2h0dHAvYmFzZV9yZXNwb25zZV9vcHRpb25zLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcblxuLyoqXG4gKiBBIGJhY2tlbmQgZm9yIGh0dHAgdGhhdCB1c2VzIHRoZSBgWE1MSHR0cFJlcXVlc3RgIGJyb3dzZXIgQVBJLlxuICpcbiAqIFRha2UgY2FyZSBub3QgdG8gZXZhbHVhdGUgdGhpcyBpbiBub24tYnJvd3NlciBjb250ZXh0cy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEJyb3dzZXJYaHIge1xuICBjb25zdHJ1Y3RvcigpIHt9XG4gIGJ1aWxkKCk6IGFueSB7IHJldHVybiA8YW55PihuZXcgWE1MSHR0cFJlcXVlc3QoKSk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9odHRwL2JhY2tlbmRzL2Jyb3dzZXJfeGhyLnRzXG4gKiovIiwiaW1wb3J0IHtDb25uZWN0aW9uQmFja2VuZCwgQ29ubmVjdGlvbn0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge1JlYWR5U3RhdGUsIFJlcXVlc3RNZXRob2QsIFJlc3BvbnNlVHlwZX0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHtSZXF1ZXN0fSBmcm9tICcuLi9zdGF0aWNfcmVxdWVzdCc7XG5pbXBvcnQge1Jlc3BvbnNlfSBmcm9tICcuLi9zdGF0aWNfcmVzcG9uc2UnO1xuaW1wb3J0IHtSZXNwb25zZU9wdGlvbnMsIEJhc2VSZXNwb25zZU9wdGlvbnN9IGZyb20gJy4uL2Jhc2VfcmVzcG9uc2Vfb3B0aW9ucyc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtCcm93c2VySnNvbnB9IGZyb20gJy4vYnJvd3Nlcl9qc29ucCc7XG5pbXBvcnQge21ha2VUeXBlRXJyb3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1N0cmluZ1dyYXBwZXIsIGlzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcy9PYnNlcnZhYmxlJztcblxuY29uc3QgSlNPTlBfRVJSX05PX0NBTExCQUNLID0gJ0pTT05QIGluamVjdGVkIHNjcmlwdCBkaWQgbm90IGludm9rZSBjYWxsYmFjay4nO1xuY29uc3QgSlNPTlBfRVJSX1dST05HX01FVEhPRCA9ICdKU09OUCByZXF1ZXN0cyBtdXN0IHVzZSBHRVQgcmVxdWVzdCBtZXRob2QuJztcblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbiBpbi1mbGlnaHQgSlNPTlAgcmVxdWVzdC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEpTT05QQ29ubmVjdGlvbiBpbXBsZW1lbnRzIENvbm5lY3Rpb24ge1xuICAvKipcbiAgICogVGhlIHtAbGluayBSZWFkeVN0YXRlfSBvZiB0aGlzIHJlcXVlc3QuXG4gICAqL1xuICByZWFkeVN0YXRlOiBSZWFkeVN0YXRlO1xuXG4gIC8qKlxuICAgKiBUaGUgb3V0Z29pbmcgSFRUUCByZXF1ZXN0LlxuICAgKi9cbiAgcmVxdWVzdDogUmVxdWVzdDtcblxuICAvKipcbiAgICogQW4gb2JzZXJ2YWJsZSB0aGF0IGNvbXBsZXRlcyB3aXRoIHRoZSByZXNwb25zZSwgd2hlbiB0aGUgcmVxdWVzdCBpcyBmaW5pc2hlZC5cbiAgICovXG4gIHJlc3BvbnNlOiBPYnNlcnZhYmxlPFJlc3BvbnNlPjtcblxuICAvKipcbiAgICogQ2FsbGJhY2sgY2FsbGVkIHdoZW4gdGhlIEpTT05QIHJlcXVlc3QgY29tcGxldGVzLCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uXG4gICAqIG9mIHRoZSBuZXcgZGF0YS5cbiAgICovXG4gIGFic3RyYWN0IGZpbmlzaGVkKGRhdGE/OiBhbnkpOiB2b2lkO1xufVxuXG5leHBvcnQgY2xhc3MgSlNPTlBDb25uZWN0aW9uXyBleHRlbmRzIEpTT05QQ29ubmVjdGlvbiB7XG4gIHByaXZhdGUgX2lkOiBzdHJpbmc7XG4gIHByaXZhdGUgX3NjcmlwdDogRWxlbWVudDtcbiAgcHJpdmF0ZSBfcmVzcG9uc2VEYXRhOiBhbnk7XG4gIHByaXZhdGUgX2ZpbmlzaGVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocmVxOiBSZXF1ZXN0LCBwcml2YXRlIF9kb206IEJyb3dzZXJKc29ucCxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBiYXNlUmVzcG9uc2VPcHRpb25zPzogUmVzcG9uc2VPcHRpb25zKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAocmVxLm1ldGhvZCAhPT0gUmVxdWVzdE1ldGhvZC5HZXQpIHtcbiAgICAgIHRocm93IG1ha2VUeXBlRXJyb3IoSlNPTlBfRVJSX1dST05HX01FVEhPRCk7XG4gICAgfVxuICAgIHRoaXMucmVxdWVzdCA9IHJlcTtcbiAgICB0aGlzLnJlc3BvbnNlID0gbmV3IE9ic2VydmFibGUocmVzcG9uc2VPYnNlcnZlciA9PiB7XG5cbiAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFJlYWR5U3RhdGUuTG9hZGluZztcbiAgICAgIGxldCBpZCA9IHRoaXMuX2lkID0gX2RvbS5uZXh0UmVxdWVzdElEKCk7XG5cbiAgICAgIF9kb20uZXhwb3NlQ29ubmVjdGlvbihpZCwgdGhpcyk7XG5cbiAgICAgIC8vIFdvcmthcm91bmQgRGFydFxuICAgICAgLy8gdXJsID0gdXJsLnJlcGxhY2UoLz1KU09OUF9DQUxMQkFDSygmfCQpLywgYGdlbmVyYXRlZCBtZXRob2RgKTtcbiAgICAgIGxldCBjYWxsYmFjayA9IF9kb20ucmVxdWVzdENhbGxiYWNrKHRoaXMuX2lkKTtcbiAgICAgIGxldCB1cmw6IHN0cmluZyA9IHJlcS51cmw7XG4gICAgICBpZiAodXJsLmluZGV4T2YoJz1KU09OUF9DQUxMQkFDSyYnKSA+IC0xKSB7XG4gICAgICAgIHVybCA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZSh1cmwsICc9SlNPTlBfQ0FMTEJBQ0smJywgYD0ke2NhbGxiYWNrfSZgKTtcbiAgICAgIH0gZWxzZSBpZiAodXJsLmxhc3RJbmRleE9mKCc9SlNPTlBfQ0FMTEJBQ0snKSA9PT0gdXJsLmxlbmd0aCAtICc9SlNPTlBfQ0FMTEJBQ0snLmxlbmd0aCkge1xuICAgICAgICB1cmwgPSB1cmwuc3Vic3RyaW5nKDAsIHVybC5sZW5ndGggLSAnPUpTT05QX0NBTExCQUNLJy5sZW5ndGgpICsgYD0ke2NhbGxiYWNrfWA7XG4gICAgICB9XG5cbiAgICAgIGxldCBzY3JpcHQgPSB0aGlzLl9zY3JpcHQgPSBfZG9tLmJ1aWxkKHVybCk7XG5cbiAgICAgIGxldCBvbkxvYWQgPSBldmVudCA9PiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFJlYWR5U3RhdGUuQ2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFJlYWR5U3RhdGUuRG9uZTtcbiAgICAgICAgX2RvbS5jbGVhbnVwKHNjcmlwdCk7XG4gICAgICAgIGlmICghdGhpcy5fZmluaXNoZWQpIHtcbiAgICAgICAgICBsZXQgcmVzcG9uc2VPcHRpb25zID1cbiAgICAgICAgICAgICAgbmV3IFJlc3BvbnNlT3B0aW9ucyh7Ym9keTogSlNPTlBfRVJSX05PX0NBTExCQUNLLCB0eXBlOiBSZXNwb25zZVR5cGUuRXJyb3IsIHVybH0pO1xuICAgICAgICAgIGlmIChpc1ByZXNlbnQoYmFzZVJlc3BvbnNlT3B0aW9ucykpIHtcbiAgICAgICAgICAgIHJlc3BvbnNlT3B0aW9ucyA9IGJhc2VSZXNwb25zZU9wdGlvbnMubWVyZ2UocmVzcG9uc2VPcHRpb25zKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmVzcG9uc2VPYnNlcnZlci5lcnJvcihuZXcgUmVzcG9uc2UocmVzcG9uc2VPcHRpb25zKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlT3B0aW9ucyA9IG5ldyBSZXNwb25zZU9wdGlvbnMoe2JvZHk6IHRoaXMuX3Jlc3BvbnNlRGF0YSwgdXJsfSk7XG4gICAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5iYXNlUmVzcG9uc2VPcHRpb25zKSkge1xuICAgICAgICAgIHJlc3BvbnNlT3B0aW9ucyA9IHRoaXMuYmFzZVJlc3BvbnNlT3B0aW9ucy5tZXJnZShyZXNwb25zZU9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVzcG9uc2VPYnNlcnZlci5uZXh0KG5ldyBSZXNwb25zZShyZXNwb25zZU9wdGlvbnMpKTtcbiAgICAgICAgcmVzcG9uc2VPYnNlcnZlci5jb21wbGV0ZSgpO1xuICAgICAgfTtcblxuICAgICAgbGV0IG9uRXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFJlYWR5U3RhdGUuQ2FuY2VsbGVkKSByZXR1cm47XG4gICAgICAgIHRoaXMucmVhZHlTdGF0ZSA9IFJlYWR5U3RhdGUuRG9uZTtcbiAgICAgICAgX2RvbS5jbGVhbnVwKHNjcmlwdCk7XG4gICAgICAgIGxldCByZXNwb25zZU9wdGlvbnMgPSBuZXcgUmVzcG9uc2VPcHRpb25zKHtib2R5OiBlcnJvci5tZXNzYWdlLCB0eXBlOiBSZXNwb25zZVR5cGUuRXJyb3J9KTtcbiAgICAgICAgaWYgKGlzUHJlc2VudChiYXNlUmVzcG9uc2VPcHRpb25zKSkge1xuICAgICAgICAgIHJlc3BvbnNlT3B0aW9ucyA9IGJhc2VSZXNwb25zZU9wdGlvbnMubWVyZ2UocmVzcG9uc2VPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICByZXNwb25zZU9ic2VydmVyLmVycm9yKG5ldyBSZXNwb25zZShyZXNwb25zZU9wdGlvbnMpKTtcbiAgICAgIH07XG5cbiAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICAgIHNjcmlwdC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIG9uRXJyb3IpO1xuXG4gICAgICBfZG9tLnNlbmQoc2NyaXB0KTtcblxuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgdGhpcy5yZWFkeVN0YXRlID0gUmVhZHlTdGF0ZS5DYW5jZWxsZWQ7XG4gICAgICAgIHNjcmlwdC5yZW1vdmVFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTtcbiAgICAgICAgc2NyaXB0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIGlmIChpc1ByZXNlbnQoc2NyaXB0KSkge1xuICAgICAgICAgIHRoaXMuX2RvbS5jbGVhbnVwKHNjcmlwdCk7XG4gICAgICAgIH1cblxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGZpbmlzaGVkKGRhdGE/OiBhbnkpIHtcbiAgICAvLyBEb24ndCBsZWFrIGNvbm5lY3Rpb25zXG4gICAgdGhpcy5fZmluaXNoZWQgPSB0cnVlO1xuICAgIHRoaXMuX2RvbS5yZW1vdmVDb25uZWN0aW9uKHRoaXMuX2lkKTtcbiAgICBpZiAodGhpcy5yZWFkeVN0YXRlID09PSBSZWFkeVN0YXRlLkNhbmNlbGxlZCkgcmV0dXJuO1xuICAgIHRoaXMuX3Jlc3BvbnNlRGF0YSA9IGRhdGE7XG4gIH1cbn1cblxuLyoqXG4gKiBBIHtAbGluayBDb25uZWN0aW9uQmFja2VuZH0gdGhhdCB1c2VzIHRoZSBKU09OUCBzdHJhdGVneSBvZiBtYWtpbmcgcmVxdWVzdHMuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBKU09OUEJhY2tlbmQgZXh0ZW5kcyBDb25uZWN0aW9uQmFja2VuZCB7fVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgSlNPTlBCYWNrZW5kXyBleHRlbmRzIEpTT05QQmFja2VuZCB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Jyb3dzZXJKU09OUDogQnJvd3Nlckpzb25wLCBwcml2YXRlIF9iYXNlUmVzcG9uc2VPcHRpb25zOiBSZXNwb25zZU9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgY3JlYXRlQ29ubmVjdGlvbihyZXF1ZXN0OiBSZXF1ZXN0KTogSlNPTlBDb25uZWN0aW9uIHtcbiAgICByZXR1cm4gbmV3IEpTT05QQ29ubmVjdGlvbl8ocmVxdWVzdCwgdGhpcy5fYnJvd3NlckpTT05QLCB0aGlzLl9iYXNlUmVzcG9uc2VPcHRpb25zKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL2h0dHAvYmFja2VuZHMvanNvbnBfYmFja2VuZC50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge2dsb2JhbH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxubGV0IF9uZXh0UmVxdWVzdElkID0gMDtcbmV4cG9ydCBjb25zdCBKU09OUF9IT01FID0gJ19fbmdfanNvbnBfXyc7XG52YXIgX2pzb25wQ29ubmVjdGlvbnMgPSBudWxsO1xuXG5mdW5jdGlvbiBfZ2V0SnNvbnBDb25uZWN0aW9ucygpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gIGlmIChfanNvbnBDb25uZWN0aW9ucyA9PT0gbnVsbCkge1xuICAgIF9qc29ucENvbm5lY3Rpb25zID0gZ2xvYmFsW0pTT05QX0hPTUVdID0ge307XG4gIH1cbiAgcmV0dXJuIF9qc29ucENvbm5lY3Rpb25zO1xufVxuXG4vLyBNYWtlIHN1cmUgbm90IHRvIGV2YWx1YXRlIHRoaXMgaW4gYSBub24tYnJvd3NlciBlbnZpcm9ubWVudCFcbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBCcm93c2VySnNvbnAge1xuICAvLyBDb25zdHJ1Y3QgYSA8c2NyaXB0PiBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBVUkxcbiAgYnVpbGQodXJsOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XG4gICAgbm9kZS5zcmMgPSB1cmw7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICBuZXh0UmVxdWVzdElEKCk6IHN0cmluZyB7IHJldHVybiBgX19yZXEke19uZXh0UmVxdWVzdElkKyt9YDsgfVxuXG4gIHJlcXVlc3RDYWxsYmFjayhpZDogc3RyaW5nKTogc3RyaW5nIHsgcmV0dXJuIGAke0pTT05QX0hPTUV9LiR7aWR9LmZpbmlzaGVkYDsgfVxuXG4gIGV4cG9zZUNvbm5lY3Rpb24oaWQ6IHN0cmluZywgY29ubmVjdGlvbjogYW55KSB7XG4gICAgbGV0IGNvbm5lY3Rpb25zID0gX2dldEpzb25wQ29ubmVjdGlvbnMoKTtcbiAgICBjb25uZWN0aW9uc1tpZF0gPSBjb25uZWN0aW9uO1xuICB9XG5cbiAgcmVtb3ZlQ29ubmVjdGlvbihpZDogc3RyaW5nKSB7XG4gICAgdmFyIGNvbm5lY3Rpb25zID0gX2dldEpzb25wQ29ubmVjdGlvbnMoKTtcbiAgICBjb25uZWN0aW9uc1tpZF0gPSBudWxsO1xuICB9XG5cbiAgLy8gQXR0YWNoIHRoZSA8c2NyaXB0PiBlbGVtZW50IHRvIHRoZSBET01cbiAgc2VuZChub2RlOiBhbnkpIHsgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCg8Tm9kZT4obm9kZSkpOyB9XG5cbiAgLy8gUmVtb3ZlIDxzY3JpcHQ+IGVsZW1lbnQgZnJvbSB0aGUgRE9NXG4gIGNsZWFudXAobm9kZTogYW55KSB7XG4gICAgaWYgKG5vZGUucGFyZW50Tm9kZSkge1xuICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKDxOb2RlPihub2RlKSk7XG4gICAgfVxuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvaHR0cC9iYWNrZW5kcy9icm93c2VyX2pzb25wLnRzXG4gKiovIiwiLyoqXG4gKiBAbW9kdWxlXG4gKiBAZGVzY3JpcHRpb25cbiAqIE1hcHMgYXBwbGljYXRpb24gVVJMcyBpbnRvIGFwcGxpY2F0aW9uIHN0YXRlcywgdG8gc3VwcG9ydCBkZWVwLWxpbmtpbmcgYW5kIG5hdmlnYXRpb24uXG4gKi9cblxuZXhwb3J0IHtSb3V0ZXJ9IGZyb20gJy4vc3JjL3JvdXRlci9yb3V0ZXInO1xuZXhwb3J0IHtSb3V0ZXJPdXRsZXR9IGZyb20gJy4vc3JjL3JvdXRlci9yb3V0ZXJfb3V0bGV0JztcbmV4cG9ydCB7Um91dGVyTGlua30gZnJvbSAnLi9zcmMvcm91dGVyL3JvdXRlcl9saW5rJztcbmV4cG9ydCB7Um91dGVQYXJhbXMsIFJvdXRlRGF0YX0gZnJvbSAnLi9zcmMvcm91dGVyL2luc3RydWN0aW9uJztcbmV4cG9ydCB7UGxhdGZvcm1Mb2NhdGlvbn0gZnJvbSAnLi9zcmMvcm91dGVyL3BsYXRmb3JtX2xvY2F0aW9uJztcbmV4cG9ydCB7Um91dGVSZWdpc3RyeSwgUk9VVEVSX1BSSU1BUllfQ09NUE9ORU5UfSBmcm9tICcuL3NyYy9yb3V0ZXIvcm91dGVfcmVnaXN0cnknO1xuZXhwb3J0IHtMb2NhdGlvblN0cmF0ZWd5LCBBUFBfQkFTRV9IUkVGfSBmcm9tICcuL3NyYy9yb3V0ZXIvbG9jYXRpb25fc3RyYXRlZ3knO1xuZXhwb3J0IHtIYXNoTG9jYXRpb25TdHJhdGVneX0gZnJvbSAnLi9zcmMvcm91dGVyL2hhc2hfbG9jYXRpb25fc3RyYXRlZ3knO1xuZXhwb3J0IHtQYXRoTG9jYXRpb25TdHJhdGVneX0gZnJvbSAnLi9zcmMvcm91dGVyL3BhdGhfbG9jYXRpb25fc3RyYXRlZ3knO1xuZXhwb3J0IHtMb2NhdGlvbn0gZnJvbSAnLi9zcmMvcm91dGVyL2xvY2F0aW9uJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL3JvdXRlci9yb3V0ZV9jb25maWdfZGVjb3JhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL3JvdXRlci9yb3V0ZV9kZWZpbml0aW9uJztcbmV4cG9ydCB7T25BY3RpdmF0ZSwgT25EZWFjdGl2YXRlLCBPblJldXNlLCBDYW5EZWFjdGl2YXRlLCBDYW5SZXVzZX0gZnJvbSAnLi9zcmMvcm91dGVyL2ludGVyZmFjZXMnO1xuZXhwb3J0IHtDYW5BY3RpdmF0ZX0gZnJvbSAnLi9zcmMvcm91dGVyL2xpZmVjeWNsZV9hbm5vdGF0aW9ucyc7XG5leHBvcnQge0luc3RydWN0aW9uLCBDb21wb25lbnRJbnN0cnVjdGlvbn0gZnJvbSAnLi9zcmMvcm91dGVyL2luc3RydWN0aW9uJztcbmV4cG9ydCB7T3BhcXVlVG9rZW59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQge1BsYXRmb3JtTG9jYXRpb259IGZyb20gJy4vc3JjL3JvdXRlci9wbGF0Zm9ybV9sb2NhdGlvbic7XG5pbXBvcnQge0xvY2F0aW9uU3RyYXRlZ3l9IGZyb20gJy4vc3JjL3JvdXRlci9sb2NhdGlvbl9zdHJhdGVneSc7XG5pbXBvcnQge1BhdGhMb2NhdGlvblN0cmF0ZWd5fSBmcm9tICcuL3NyYy9yb3V0ZXIvcGF0aF9sb2NhdGlvbl9zdHJhdGVneSc7XG5pbXBvcnQge1JvdXRlciwgUm9vdFJvdXRlcn0gZnJvbSAnLi9zcmMvcm91dGVyL3JvdXRlcic7XG5pbXBvcnQge1JvdXRlck91dGxldH0gZnJvbSAnLi9zcmMvcm91dGVyL3JvdXRlcl9vdXRsZXQnO1xuaW1wb3J0IHtSb3V0ZXJMaW5rfSBmcm9tICcuL3NyYy9yb3V0ZXIvcm91dGVyX2xpbmsnO1xuaW1wb3J0IHtSb3V0ZVJlZ2lzdHJ5LCBST1VURVJfUFJJTUFSWV9DT01QT05FTlR9IGZyb20gJy4vc3JjL3JvdXRlci9yb3V0ZV9yZWdpc3RyeSc7XG5pbXBvcnQge0xvY2F0aW9ufSBmcm9tICcuL3NyYy9yb3V0ZXIvbG9jYXRpb24nO1xuaW1wb3J0IHtBcHBsaWNhdGlvblJlZiwgcHJvdmlkZSwgT3BhcXVlVG9rZW4sIFByb3ZpZGVyfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnLi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG4vKipcbiAqIEEgbGlzdCBvZiBkaXJlY3RpdmVzLiBUbyB1c2UgdGhlIHJvdXRlciBkaXJlY3RpdmVzIGxpa2Uge0BsaW5rIFJvdXRlck91dGxldH0gYW5kXG4gKiB7QGxpbmsgUm91dGVyTGlua30sIGFkZCB0aGlzIHRvIHlvdXIgYGRpcmVjdGl2ZXNgIGFycmF5IGluIHRoZSB7QGxpbmsgVmlld30gZGVjb3JhdG9yIG9mIHlvdXJcbiAqIGNvbXBvbmVudC5cbiAqXG4gKiAjIyMgRXhhbXBsZSAoW2xpdmUgZGVtb10oaHR0cDovL3BsbmtyLmNvL2VkaXQvaVJVUDhCNU9VYnhDV1EzQWNJRG0pKVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtST1VURVJfRElSRUNUSVZFUywgUk9VVEVSX1BST1ZJREVSUywgUm91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHsuLi59LFxuICogXSlcbiAqIGNsYXNzIEFwcENtcCB7XG4gKiAgICAvLyAuLi5cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwQ21wLCBbUk9VVEVSX1BST1ZJREVSU10pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBST1VURVJfRElSRUNUSVZFUzogYW55W10gPSBDT05TVF9FWFBSKFtSb3V0ZXJPdXRsZXQsIFJvdXRlckxpbmtdKTtcblxuLyoqXG4gKiBBIGxpc3Qgb2Yge0BsaW5rIFByb3ZpZGVyfXMuIFRvIHVzZSB0aGUgcm91dGVyLCB5b3UgbXVzdCBhZGQgdGhpcyB0byB5b3VyIGFwcGxpY2F0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlIChbbGl2ZSBkZW1vXShodHRwOi8vcGxua3IuY28vZWRpdC9pUlVQOEI1T1VieENXUTNBY0lEbSkpXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge1xuICogICBST1VURVJfRElSRUNUSVZFUyxcbiAqICAgUk9VVEVSX1BST1ZJREVSUyxcbiAqICAgUm91dGVDb25maWdcbiAqIH0gZnJvbSAnYW5ndWxhcjIvcm91dGVyJztcbiAqXG4gKiBAQ29tcG9uZW50KHtkaXJlY3RpdmVzOiBbUk9VVEVSX0RJUkVDVElWRVNdfSlcbiAqIEBSb3V0ZUNvbmZpZyhbXG4gKiAgey4uLn0sXG4gKiBdKVxuICogY2xhc3MgQXBwQ21wIHtcbiAqICAgLy8gLi4uXG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcENtcCwgW1JPVVRFUl9QUk9WSURFUlNdKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgUk9VVEVSX1BST1ZJREVSUzogYW55W10gPSBDT05TVF9FWFBSKFtcbiAgUm91dGVSZWdpc3RyeSxcbiAgQ09OU1RfRVhQUihuZXcgUHJvdmlkZXIoTG9jYXRpb25TdHJhdGVneSwge3VzZUNsYXNzOiBQYXRoTG9jYXRpb25TdHJhdGVneX0pKSxcbiAgUGxhdGZvcm1Mb2NhdGlvbixcbiAgTG9jYXRpb24sXG4gIENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKFxuICAgICAgUm91dGVyLFxuICAgICAge1xuICAgICAgICB1c2VGYWN0b3J5OiByb3V0ZXJGYWN0b3J5LFxuICAgICAgICBkZXBzOiBDT05TVF9FWFBSKFtSb3V0ZVJlZ2lzdHJ5LCBMb2NhdGlvbiwgUk9VVEVSX1BSSU1BUllfQ09NUE9ORU5ULCBBcHBsaWNhdGlvblJlZl0pXG4gICAgICB9KSksXG4gIENPTlNUX0VYUFIobmV3IFByb3ZpZGVyKFxuICAgICAgUk9VVEVSX1BSSU1BUllfQ09NUE9ORU5ULFxuICAgICAge3VzZUZhY3Rvcnk6IHJvdXRlclByaW1hcnlDb21wb25lbnRGYWN0b3J5LCBkZXBzOiBDT05TVF9FWFBSKFtBcHBsaWNhdGlvblJlZl0pfSkpXG5dKTtcblxuLyoqXG4gKiBVc2Uge0BsaW5rIFJPVVRFUl9QUk9WSURFUlN9IGluc3RlYWQuXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqL1xuZXhwb3J0IGNvbnN0IFJPVVRFUl9CSU5ESU5HUyA9IFJPVVRFUl9QUk9WSURFUlM7XG5cbmZ1bmN0aW9uIHJvdXRlckZhY3RvcnkocmVnaXN0cnksIGxvY2F0aW9uLCBwcmltYXJ5Q29tcG9uZW50LCBhcHBSZWYpIHtcbiAgdmFyIHJvb3RSb3V0ZXIgPSBuZXcgUm9vdFJvdXRlcihyZWdpc3RyeSwgbG9jYXRpb24sIHByaW1hcnlDb21wb25lbnQpO1xuICBhcHBSZWYucmVnaXN0ZXJEaXNwb3NlTGlzdGVuZXIoKCkgPT4gcm9vdFJvdXRlci5kaXNwb3NlKCkpO1xuICByZXR1cm4gcm9vdFJvdXRlcjtcbn1cblxuZnVuY3Rpb24gcm91dGVyUHJpbWFyeUNvbXBvbmVudEZhY3RvcnkoYXBwKSB7XG4gIGlmIChhcHAuY29tcG9uZW50VHlwZXMubGVuZ3RoID09IDApIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcIkJvb3RzdHJhcCBhdCBsZWFzdCBvbmUgY29tcG9uZW50IGJlZm9yZSBpbmplY3RpbmcgUm91dGVyLlwiKTtcbiAgfVxuICByZXR1cm4gYXBwLmNvbXBvbmVudFR5cGVzWzBdO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvcm91dGVyLnRzXG4gKiovIiwiaW1wb3J0IHtQcm9taXNlLCBQcm9taXNlV3JhcHBlciwgRXZlbnRFbWl0dGVyLCBPYnNlcnZhYmxlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge01hcCwgU3RyaW5nTWFwV3JhcHBlciwgTWFwV3JhcHBlciwgTGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge2lzQmxhbmssIGlzU3RyaW5nLCBpc1ByZXNlbnQsIFR5cGUsIGlzQXJyYXl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmltcG9ydCB7Um91dGVSZWdpc3RyeSwgUk9VVEVSX1BSSU1BUllfQ09NUE9ORU5UfSBmcm9tICcuL3JvdXRlX3JlZ2lzdHJ5JztcbmltcG9ydCB7XG4gIENvbXBvbmVudEluc3RydWN0aW9uLFxuICBJbnN0cnVjdGlvbixcbn0gZnJvbSAnLi9pbnN0cnVjdGlvbic7XG5pbXBvcnQge1JvdXRlck91dGxldH0gZnJvbSAnLi9yb3V0ZXJfb3V0bGV0JztcbmltcG9ydCB7TG9jYXRpb259IGZyb20gJy4vbG9jYXRpb24nO1xuaW1wb3J0IHtnZXRDYW5BY3RpdmF0ZUhvb2t9IGZyb20gJy4vcm91dGVfbGlmZWN5Y2xlX3JlZmxlY3Rvcic7XG5pbXBvcnQge1JvdXRlRGVmaW5pdGlvbn0gZnJvbSAnLi9yb3V0ZV9jb25maWdfaW1wbCc7XG5cbmxldCBfcmVzb2x2ZVRvVHJ1ZSA9IFByb21pc2VXcmFwcGVyLnJlc29sdmUodHJ1ZSk7XG5sZXQgX3Jlc29sdmVUb0ZhbHNlID0gUHJvbWlzZVdyYXBwZXIucmVzb2x2ZShmYWxzZSk7XG5cbi8qKlxuICogVGhlIGBSb3V0ZXJgIGlzIHJlc3BvbnNpYmxlIGZvciBtYXBwaW5nIFVSTHMgdG8gY29tcG9uZW50cy5cbiAqXG4gKiBZb3UgY2FuIHNlZSB0aGUgc3RhdGUgb2YgdGhlIHJvdXRlciBieSBpbnNwZWN0aW5nIHRoZSByZWFkLW9ubHkgZmllbGQgYHJvdXRlci5uYXZpZ2F0aW5nYC5cbiAqIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc2hvd2luZyBhIHNwaW5uZXIsIGZvciBpbnN0YW5jZS5cbiAqXG4gKiAjIyBDb25jZXB0c1xuICpcbiAqIFJvdXRlcnMgYW5kIGNvbXBvbmVudCBpbnN0YW5jZXMgaGF2ZSBhIDE6MSBjb3JyZXNwb25kZW5jZS5cbiAqXG4gKiBUaGUgcm91dGVyIGhvbGRzIHJlZmVyZW5jZSB0byBhIG51bWJlciBvZiB7QGxpbmsgUm91dGVyT3V0bGV0fS5cbiAqIEFuIG91dGxldCBpcyBhIHBsYWNlaG9sZGVyIHRoYXQgdGhlIHJvdXRlciBkeW5hbWljYWxseSBmaWxscyBpbiBkZXBlbmRpbmcgb24gdGhlIGN1cnJlbnQgVVJMLlxuICpcbiAqIFdoZW4gdGhlIHJvdXRlciBuYXZpZ2F0ZXMgZnJvbSBhIFVSTCwgaXQgbXVzdCBmaXJzdCByZWNvZ25pemUgaXQgYW5kIHNlcmlhbGl6ZSBpdCBpbnRvIGFuXG4gKiBgSW5zdHJ1Y3Rpb25gLlxuICogVGhlIHJvdXRlciB1c2VzIHRoZSBgUm91dGVSZWdpc3RyeWAgdG8gZ2V0IGFuIGBJbnN0cnVjdGlvbmAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3V0ZXIge1xuICBuYXZpZ2F0aW5nOiBib29sZWFuID0gZmFsc2U7XG4gIGxhc3ROYXZpZ2F0aW9uQXR0ZW1wdDogc3RyaW5nO1xuXG4gIHByaXZhdGUgX2N1cnJlbnRJbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24gPSBudWxsO1xuXG4gIHByaXZhdGUgX2N1cnJlbnROYXZpZ2F0aW9uOiBQcm9taXNlPGFueT4gPSBfcmVzb2x2ZVRvVHJ1ZTtcbiAgcHJpdmF0ZSBfb3V0bGV0OiBSb3V0ZXJPdXRsZXQgPSBudWxsO1xuXG4gIHByaXZhdGUgX2F1eFJvdXRlcnMgPSBuZXcgTWFwPHN0cmluZywgUm91dGVyPigpO1xuICBwcml2YXRlIF9jaGlsZFJvdXRlcjogUm91dGVyO1xuXG4gIHByaXZhdGUgX3N1YmplY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuXG5cbiAgY29uc3RydWN0b3IocHVibGljIHJlZ2lzdHJ5OiBSb3V0ZVJlZ2lzdHJ5LCBwdWJsaWMgcGFyZW50OiBSb3V0ZXIsIHB1YmxpYyBob3N0Q29tcG9uZW50OiBhbnkpIHt9XG5cblxuICAvKipcbiAgICogQ29uc3RydWN0cyBhIGNoaWxkIHJvdXRlci4gWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gdXNlIHRoaXMgdW5sZXNzIHlvdSdyZSB3cml0aW5nIGEgcmV1c2FibGVcbiAgICogY29tcG9uZW50LlxuICAgKi9cbiAgY2hpbGRSb3V0ZXIoaG9zdENvbXBvbmVudDogYW55KTogUm91dGVyIHtcbiAgICByZXR1cm4gdGhpcy5fY2hpbGRSb3V0ZXIgPSBuZXcgQ2hpbGRSb3V0ZXIodGhpcywgaG9zdENvbXBvbmVudCk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgY2hpbGQgcm91dGVyLiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byB1c2UgdGhpcyB1bmxlc3MgeW91J3JlIHdyaXRpbmcgYSByZXVzYWJsZVxuICAgKiBjb21wb25lbnQuXG4gICAqL1xuICBhdXhSb3V0ZXIoaG9zdENvbXBvbmVudDogYW55KTogUm91dGVyIHsgcmV0dXJuIG5ldyBDaGlsZFJvdXRlcih0aGlzLCBob3N0Q29tcG9uZW50KTsgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhbiBvdXRsZXQgdG8gYmUgbm90aWZpZWQgb2YgcHJpbWFyeSByb3V0ZSBjaGFuZ2VzLlxuICAgKlxuICAgKiBZb3UgcHJvYmFibHkgZG9uJ3QgbmVlZCB0byB1c2UgdGhpcyB1bmxlc3MgeW91J3JlIHdyaXRpbmcgYSByZXVzYWJsZSBjb21wb25lbnQuXG4gICAqL1xuICByZWdpc3RlclByaW1hcnlPdXRsZXQob3V0bGV0OiBSb3V0ZXJPdXRsZXQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoaXNQcmVzZW50KG91dGxldC5uYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYHJlZ2lzdGVyUHJpbWFyeU91dGxldCBleHBlY3RzIHRvIGJlIGNhbGxlZCB3aXRoIGFuIHVubmFtZWQgb3V0bGV0LmApO1xuICAgIH1cblxuICAgIHRoaXMuX291dGxldCA9IG91dGxldDtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbikpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbW1pdCh0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24sIGZhbHNlKTtcbiAgICB9XG4gICAgcmV0dXJuIF9yZXNvbHZlVG9UcnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlZ2lzdGVyIGFuIG91dGxldCB0byBub3RpZmllZCBvZiBhdXhpbGlhcnkgcm91dGUgY2hhbmdlcy5cbiAgICpcbiAgICogWW91IHByb2JhYmx5IGRvbid0IG5lZWQgdG8gdXNlIHRoaXMgdW5sZXNzIHlvdSdyZSB3cml0aW5nIGEgcmV1c2FibGUgY29tcG9uZW50LlxuICAgKi9cbiAgcmVnaXN0ZXJBdXhPdXRsZXQob3V0bGV0OiBSb3V0ZXJPdXRsZXQpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICB2YXIgb3V0bGV0TmFtZSA9IG91dGxldC5uYW1lO1xuICAgIGlmIChpc0JsYW5rKG91dGxldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgcmVnaXN0ZXJBdXhPdXRsZXQgZXhwZWN0cyB0byBiZSBjYWxsZWQgd2l0aCBhbiBvdXRsZXQgd2l0aCBhIG5hbWUuYCk7XG4gICAgfVxuXG4gICAgLy8gVE9ETy4uLlxuICAgIC8vIHdoYXQgaXMgdGhlIGhvc3Qgb2YgYW4gYXV4IHJvdXRlPz8/XG4gICAgdmFyIHJvdXRlciA9IHRoaXMuYXV4Um91dGVyKHRoaXMuaG9zdENvbXBvbmVudCk7XG5cbiAgICB0aGlzLl9hdXhSb3V0ZXJzLnNldChvdXRsZXROYW1lLCByb3V0ZXIpO1xuICAgIHJvdXRlci5fb3V0bGV0ID0gb3V0bGV0O1xuXG4gICAgdmFyIGF1eEluc3RydWN0aW9uO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fY3VycmVudEluc3RydWN0aW9uKSAmJlxuICAgICAgICBpc1ByZXNlbnQoYXV4SW5zdHJ1Y3Rpb24gPSB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24uYXV4SW5zdHJ1Y3Rpb25bb3V0bGV0TmFtZV0pKSB7XG4gICAgICByZXR1cm4gcm91dGVyLmNvbW1pdChhdXhJbnN0cnVjdGlvbik7XG4gICAgfVxuICAgIHJldHVybiBfcmVzb2x2ZVRvVHJ1ZTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdpdmVuIGFuIGluc3RydWN0aW9uLCByZXR1cm5zIGB0cnVlYCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgY3VycmVudGx5IGFjdGl2ZSxcbiAgICogb3RoZXJ3aXNlIGBmYWxzZWAuXG4gICAqL1xuICBpc1JvdXRlQWN0aXZlKGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbik6IGJvb2xlYW4ge1xuICAgIHZhciByb3V0ZXI6IFJvdXRlciA9IHRoaXM7XG4gICAgd2hpbGUgKGlzUHJlc2VudChyb3V0ZXIucGFyZW50KSAmJiBpc1ByZXNlbnQoaW5zdHJ1Y3Rpb24uY2hpbGQpKSB7XG4gICAgICByb3V0ZXIgPSByb3V0ZXIucGFyZW50O1xuICAgICAgaW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi5jaGlsZDtcbiAgICB9XG4gICAgcmV0dXJuIGlzUHJlc2VudCh0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24pICYmXG4gICAgICAgICAgIHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbi5jb21wb25lbnQgPT0gaW5zdHJ1Y3Rpb24uY29tcG9uZW50O1xuICB9XG5cblxuICAvKipcbiAgICogRHluYW1pY2FsbHkgdXBkYXRlIHRoZSByb3V0aW5nIGNvbmZpZ3VyYXRpb24gYW5kIHRyaWdnZXIgYSBuYXZpZ2F0aW9uLlxuICAgKlxuICAgKiAjIyMgVXNhZ2VcbiAgICpcbiAgICogYGBgXG4gICAqIHJvdXRlci5jb25maWcoW1xuICAgKiAgIHsgJ3BhdGgnOiAnLycsICdjb21wb25lbnQnOiBJbmRleENvbXAgfSxcbiAgICogICB7ICdwYXRoJzogJy91c2VyLzppZCcsICdjb21wb25lbnQnOiBVc2VyQ29tcCB9LFxuICAgKiBdKTtcbiAgICogYGBgXG4gICAqL1xuICBjb25maWcoZGVmaW5pdGlvbnM6IFJvdXRlRGVmaW5pdGlvbltdKTogUHJvbWlzZTxhbnk+IHtcbiAgICBkZWZpbml0aW9ucy5mb3JFYWNoKFxuICAgICAgICAocm91dGVEZWZpbml0aW9uKSA9PiB7IHRoaXMucmVnaXN0cnkuY29uZmlnKHRoaXMuaG9zdENvbXBvbmVudCwgcm91dGVEZWZpbml0aW9uKTsgfSk7XG4gICAgcmV0dXJuIHRoaXMucmVuYXZpZ2F0ZSgpO1xuICB9XG5cblxuICAvKipcbiAgICogTmF2aWdhdGUgYmFzZWQgb24gdGhlIHByb3ZpZGVkIFJvdXRlIExpbmsgRFNMLiBJdCdzIHByZWZlcnJlZCB0byBuYXZpZ2F0ZSB3aXRoIHRoaXMgbWV0aG9kXG4gICAqIG92ZXIgYG5hdmlnYXRlQnlVcmxgLlxuICAgKlxuICAgKiAjIyMgVXNhZ2VcbiAgICpcbiAgICogVGhpcyBtZXRob2QgdGFrZXMgYW4gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBSb3V0ZSBMaW5rIERTTDpcbiAgICogYGBgXG4gICAqIFsnLi9NeUNtcCcsIHtwYXJhbTogM31dXG4gICAqIGBgYFxuICAgKiBTZWUgdGhlIHtAbGluayBSb3V0ZXJMaW5rfSBkaXJlY3RpdmUgZm9yIG1vcmUuXG4gICAqL1xuICBuYXZpZ2F0ZShsaW5rUGFyYW1zOiBhbnlbXSk6IFByb21pc2U8YW55PiB7XG4gICAgdmFyIGluc3RydWN0aW9uID0gdGhpcy5nZW5lcmF0ZShsaW5rUGFyYW1zKTtcbiAgICByZXR1cm4gdGhpcy5uYXZpZ2F0ZUJ5SW5zdHJ1Y3Rpb24oaW5zdHJ1Y3Rpb24sIGZhbHNlKTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIHRvIGEgVVJMLiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gbmF2aWdhdGlvbiBpcyBjb21wbGV0ZS5cbiAgICogSXQncyBwcmVmZXJyZWQgdG8gbmF2aWdhdGUgd2l0aCBgbmF2aWdhdGVgIGluc3RlYWQgb2YgdGhpcyBtZXRob2QsIHNpbmNlIFVSTHMgYXJlIG1vcmUgYnJpdHRsZS5cbiAgICpcbiAgICogSWYgdGhlIGdpdmVuIFVSTCBiZWdpbnMgd2l0aCBhIGAvYCwgcm91dGVyIHdpbGwgbmF2aWdhdGUgYWJzb2x1dGVseS5cbiAgICogSWYgdGhlIGdpdmVuIFVSTCBkb2VzIG5vdCBiZWdpbiB3aXRoIGAvYCwgdGhlIHJvdXRlciB3aWxsIG5hdmlnYXRlIHJlbGF0aXZlIHRvIHRoaXMgY29tcG9uZW50LlxuICAgKi9cbiAgbmF2aWdhdGVCeVVybCh1cmw6IHN0cmluZywgX3NraXBMb2NhdGlvbkNoYW5nZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudE5hdmlnYXRpb24gPSB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbi50aGVuKChfKSA9PiB7XG4gICAgICB0aGlzLmxhc3ROYXZpZ2F0aW9uQXR0ZW1wdCA9IHVybDtcbiAgICAgIHRoaXMuX3N0YXJ0TmF2aWdhdGluZygpO1xuICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyUHJvbWlzZUZpbmlzaE5hdmlnYXRpbmcodGhpcy5yZWNvZ25pemUodXJsKS50aGVuKChpbnN0cnVjdGlvbikgPT4ge1xuICAgICAgICBpZiAoaXNCbGFuayhpbnN0cnVjdGlvbikpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX25hdmlnYXRlKGluc3RydWN0aW9uLCBfc2tpcExvY2F0aW9uQ2hhbmdlKTtcbiAgICAgIH0pKTtcbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlIHZpYSB0aGUgcHJvdmlkZWQgaW5zdHJ1Y3Rpb24uIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiBuYXZpZ2F0aW9uIGlzXG4gICAqIGNvbXBsZXRlLlxuICAgKi9cbiAgbmF2aWdhdGVCeUluc3RydWN0aW9uKGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgIF9za2lwTG9jYXRpb25DaGFuZ2U6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKGlzQmxhbmsoaW5zdHJ1Y3Rpb24pKSB7XG4gICAgICByZXR1cm4gX3Jlc29sdmVUb0ZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fY3VycmVudE5hdmlnYXRpb24gPSB0aGlzLl9jdXJyZW50TmF2aWdhdGlvbi50aGVuKChfKSA9PiB7XG4gICAgICB0aGlzLl9zdGFydE5hdmlnYXRpbmcoKTtcbiAgICAgIHJldHVybiB0aGlzLl9hZnRlclByb21pc2VGaW5pc2hOYXZpZ2F0aW5nKHRoaXMuX25hdmlnYXRlKGluc3RydWN0aW9uLCBfc2tpcExvY2F0aW9uQ2hhbmdlKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9uYXZpZ2F0ZShpbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24sIF9za2lwTG9jYXRpb25DaGFuZ2U6IGJvb2xlYW4pOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0bGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbilcbiAgICAgICAgLnRoZW4oKF8pID0+IHRoaXMuX3JvdXRlckNhblJldXNlKGluc3RydWN0aW9uKSlcbiAgICAgICAgLnRoZW4oKF8pID0+IHRoaXMuX2NhbkFjdGl2YXRlKGluc3RydWN0aW9uKSlcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0aGlzLl9yb3V0ZXJDYW5EZWFjdGl2YXRlKGluc3RydWN0aW9uKVxuICAgICAgICAgICAgICAudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tbWl0KGluc3RydWN0aW9uLCBfc2tpcExvY2F0aW9uQ2hhbmdlKVxuICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChfKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbWl0TmF2aWdhdGlvbkZpbmlzaChpbnN0cnVjdGlvbi50b1Jvb3RVcmwoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3NldHRsZUluc3RydWN0aW9uKGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbik6IFByb21pc2U8YW55PiB7XG4gICAgcmV0dXJuIGluc3RydWN0aW9uLnJlc29sdmVDb21wb25lbnQoKS50aGVuKChfKSA9PiB7XG4gICAgICBpbnN0cnVjdGlvbi5jb21wb25lbnQucmV1c2UgPSBmYWxzZTtcblxuICAgICAgdmFyIHVuc2V0dGxlZEluc3RydWN0aW9uczogQXJyYXk8UHJvbWlzZTxhbnk+PiA9IFtdO1xuXG4gICAgICBpZiAoaXNQcmVzZW50KGluc3RydWN0aW9uLmNoaWxkKSkge1xuICAgICAgICB1bnNldHRsZWRJbnN0cnVjdGlvbnMucHVzaCh0aGlzLl9zZXR0bGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbi5jaGlsZCkpO1xuICAgICAgfVxuXG4gICAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2goaW5zdHJ1Y3Rpb24uYXV4SW5zdHJ1Y3Rpb24sIChpbnN0cnVjdGlvbiwgXykgPT4ge1xuICAgICAgICB1bnNldHRsZWRJbnN0cnVjdGlvbnMucHVzaCh0aGlzLl9zZXR0bGVJbnN0cnVjdGlvbihpbnN0cnVjdGlvbikpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gUHJvbWlzZVdyYXBwZXIuYWxsKHVuc2V0dGxlZEluc3RydWN0aW9ucyk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9lbWl0TmF2aWdhdGlvbkZpbmlzaCh1cmwpOiB2b2lkIHsgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fc3ViamVjdCwgdXJsKTsgfVxuXG4gIHByaXZhdGUgX2FmdGVyUHJvbWlzZUZpbmlzaE5hdmlnYXRpbmcocHJvbWlzZTogUHJvbWlzZTxhbnk+KTogUHJvbWlzZTxhbnk+IHtcbiAgICByZXR1cm4gUHJvbWlzZVdyYXBwZXIuY2F0Y2hFcnJvcihwcm9taXNlLnRoZW4oKF8pID0+IHRoaXMuX2ZpbmlzaE5hdmlnYXRpbmcoKSksIChlcnIpID0+IHtcbiAgICAgIHRoaXMuX2ZpbmlzaE5hdmlnYXRpbmcoKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qXG4gICAqIFJlY3Vyc2l2ZWx5IHNldCByZXVzZSBmbGFnc1xuICAgKi9cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcm91dGVyQ2FuUmV1c2UoaW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAoaXNCbGFuayh0aGlzLl9vdXRsZXQpKSB7XG4gICAgICByZXR1cm4gX3Jlc29sdmVUb0ZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fb3V0bGV0LnJvdXRlckNhblJldXNlKGluc3RydWN0aW9uLmNvbXBvbmVudClcbiAgICAgICAgLnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgICAgICAgIGluc3RydWN0aW9uLmNvbXBvbmVudC5yZXVzZSA9IHJlc3VsdDtcbiAgICAgICAgICBpZiAocmVzdWx0ICYmIGlzUHJlc2VudCh0aGlzLl9jaGlsZFJvdXRlcikgJiYgaXNQcmVzZW50KGluc3RydWN0aW9uLmNoaWxkKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NoaWxkUm91dGVyLl9yb3V0ZXJDYW5SZXVzZShpbnN0cnVjdGlvbi5jaGlsZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2NhbkFjdGl2YXRlKG5leHRJbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICByZXR1cm4gY2FuQWN0aXZhdGVPbmUobmV4dEluc3RydWN0aW9uLCB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24pO1xuICB9XG5cbiAgcHJpdmF0ZSBfcm91dGVyQ2FuRGVhY3RpdmF0ZShpbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAoaXNCbGFuayh0aGlzLl9vdXRsZXQpKSB7XG4gICAgICByZXR1cm4gX3Jlc29sdmVUb1RydWU7XG4gICAgfVxuICAgIHZhciBuZXh0OiBQcm9taXNlPGJvb2xlYW4+O1xuICAgIHZhciBjaGlsZEluc3RydWN0aW9uOiBJbnN0cnVjdGlvbiA9IG51bGw7XG4gICAgdmFyIHJldXNlOiBib29sZWFuID0gZmFsc2U7XG4gICAgdmFyIGNvbXBvbmVudEluc3RydWN0aW9uOiBDb21wb25lbnRJbnN0cnVjdGlvbiA9IG51bGw7XG4gICAgaWYgKGlzUHJlc2VudChpbnN0cnVjdGlvbikpIHtcbiAgICAgIGNoaWxkSW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi5jaGlsZDtcbiAgICAgIGNvbXBvbmVudEluc3RydWN0aW9uID0gaW5zdHJ1Y3Rpb24uY29tcG9uZW50O1xuICAgICAgcmV1c2UgPSBpbnN0cnVjdGlvbi5jb21wb25lbnQucmV1c2U7XG4gICAgfVxuICAgIGlmIChyZXVzZSkge1xuICAgICAgbmV4dCA9IF9yZXNvbHZlVG9UcnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0ID0gdGhpcy5fb3V0bGV0LnJvdXRlckNhbkRlYWN0aXZhdGUoY29tcG9uZW50SW5zdHJ1Y3Rpb24pO1xuICAgIH1cbiAgICAvLyBUT0RPOiBhdXggcm91dGUgbGlmZWN5Y2xlIGhvb2tzXG4gICAgcmV0dXJuIG5leHQudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0ID09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGlmIChpc1ByZXNlbnQodGhpcy5fY2hpbGRSb3V0ZXIpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9jaGlsZFJvdXRlci5fcm91dGVyQ2FuRGVhY3RpdmF0ZShjaGlsZEluc3RydWN0aW9uKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhpcyByb3V0ZXIgYW5kIGFsbCBkZXNjZW5kYW50IHJvdXRlcnMgYWNjb3JkaW5nIHRvIHRoZSBnaXZlbiBpbnN0cnVjdGlvblxuICAgKi9cbiAgY29tbWl0KGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbiwgX3NraXBMb2NhdGlvbkNoYW5nZTogYm9vbGVhbiA9IGZhbHNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbjtcbiAgICB2YXIgbmV4dDogUHJvbWlzZTxhbnk+ID0gX3Jlc29sdmVUb1RydWU7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9vdXRsZXQpKSB7XG4gICAgICB2YXIgY29tcG9uZW50SW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi5jb21wb25lbnQ7XG4gICAgICBpZiAoY29tcG9uZW50SW5zdHJ1Y3Rpb24ucmV1c2UpIHtcbiAgICAgICAgbmV4dCA9IHRoaXMuX291dGxldC5yZXVzZShjb21wb25lbnRJbnN0cnVjdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXh0ID1cbiAgICAgICAgICAgIHRoaXMuZGVhY3RpdmF0ZShpbnN0cnVjdGlvbikudGhlbigoXykgPT4gdGhpcy5fb3V0bGV0LmFjdGl2YXRlKGNvbXBvbmVudEluc3RydWN0aW9uKSk7XG4gICAgICB9XG4gICAgICBpZiAoaXNQcmVzZW50KGluc3RydWN0aW9uLmNoaWxkKSkge1xuICAgICAgICBuZXh0ID0gbmV4dC50aGVuKChfKSA9PiB7XG4gICAgICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLl9jaGlsZFJvdXRlcikpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGlsZFJvdXRlci5jb21taXQoaW5zdHJ1Y3Rpb24uY2hpbGQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb21pc2VzID0gW107XG4gICAgdGhpcy5fYXV4Um91dGVycy5mb3JFYWNoKChyb3V0ZXIsIG5hbWUpID0+IHtcbiAgICAgIGlmIChpc1ByZXNlbnQoaW5zdHJ1Y3Rpb24uYXV4SW5zdHJ1Y3Rpb25bbmFtZV0pKSB7XG4gICAgICAgIHByb21pc2VzLnB1c2gocm91dGVyLmNvbW1pdChpbnN0cnVjdGlvbi5hdXhJbnN0cnVjdGlvbltuYW1lXSkpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5leHQudGhlbigoXykgPT4gUHJvbWlzZVdyYXBwZXIuYWxsKHByb21pc2VzKSk7XG4gIH1cblxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N0YXJ0TmF2aWdhdGluZygpOiB2b2lkIHsgdGhpcy5uYXZpZ2F0aW5nID0gdHJ1ZTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2ZpbmlzaE5hdmlnYXRpbmcoKTogdm9pZCB7IHRoaXMubmF2aWdhdGluZyA9IGZhbHNlOyB9XG5cblxuICAvKipcbiAgICogU3Vic2NyaWJlIHRvIFVSTCB1cGRhdGVzIGZyb20gdGhlIHJvdXRlclxuICAgKi9cbiAgc3Vic2NyaWJlKG9uTmV4dDogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiBPYmplY3Qge1xuICAgIHJldHVybiBPYnNlcnZhYmxlV3JhcHBlci5zdWJzY3JpYmUodGhpcy5fc3ViamVjdCwgb25OZXh0KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgcm91dGVyJ3Mgb3V0bGV0IGFuZCBhbGwgZGVzY2VuZGFudCBvdXRsZXRzXG4gICAqL1xuICBkZWFjdGl2YXRlKGluc3RydWN0aW9uOiBJbnN0cnVjdGlvbik6IFByb21pc2U8YW55PiB7XG4gICAgdmFyIGNoaWxkSW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uID0gbnVsbDtcbiAgICB2YXIgY29tcG9uZW50SW5zdHJ1Y3Rpb246IENvbXBvbmVudEluc3RydWN0aW9uID0gbnVsbDtcbiAgICBpZiAoaXNQcmVzZW50KGluc3RydWN0aW9uKSkge1xuICAgICAgY2hpbGRJbnN0cnVjdGlvbiA9IGluc3RydWN0aW9uLmNoaWxkO1xuICAgICAgY29tcG9uZW50SW5zdHJ1Y3Rpb24gPSBpbnN0cnVjdGlvbi5jb21wb25lbnQ7XG4gICAgfVxuICAgIHZhciBuZXh0OiBQcm9taXNlPGFueT4gPSBfcmVzb2x2ZVRvVHJ1ZTtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX2NoaWxkUm91dGVyKSkge1xuICAgICAgbmV4dCA9IHRoaXMuX2NoaWxkUm91dGVyLmRlYWN0aXZhdGUoY2hpbGRJbnN0cnVjdGlvbik7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fb3V0bGV0KSkge1xuICAgICAgbmV4dCA9IG5leHQudGhlbigoXykgPT4gdGhpcy5fb3V0bGV0LmRlYWN0aXZhdGUoY29tcG9uZW50SW5zdHJ1Y3Rpb24pKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBoYW5kbGUgYXV4IHJvdXRlc1xuXG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIFVSTCwgcmV0dXJucyBhbiBpbnN0cnVjdGlvbiByZXByZXNlbnRpbmcgdGhlIGNvbXBvbmVudCBncmFwaFxuICAgKi9cbiAgcmVjb2duaXplKHVybDogc3RyaW5nKTogUHJvbWlzZTxJbnN0cnVjdGlvbj4ge1xuICAgIHZhciBhbmNlc3RvckNvbXBvbmVudHMgPSB0aGlzLl9nZXRBbmNlc3Rvckluc3RydWN0aW9ucygpO1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LnJlY29nbml6ZSh1cmwsIGFuY2VzdG9yQ29tcG9uZW50cyk7XG4gIH1cblxuICBwcml2YXRlIF9nZXRBbmNlc3Rvckluc3RydWN0aW9ucygpOiBJbnN0cnVjdGlvbltdIHtcbiAgICB2YXIgYW5jZXN0b3JDb21wb25lbnRzID0gW107XG4gICAgdmFyIGFuY2VzdG9yUm91dGVyOiBSb3V0ZXIgPSB0aGlzO1xuICAgIHdoaWxlIChpc1ByZXNlbnQoYW5jZXN0b3JSb3V0ZXIucGFyZW50KSAmJlxuICAgICAgICAgICBpc1ByZXNlbnQoYW5jZXN0b3JSb3V0ZXIucGFyZW50Ll9jdXJyZW50SW5zdHJ1Y3Rpb24pKSB7XG4gICAgICBhbmNlc3RvclJvdXRlciA9IGFuY2VzdG9yUm91dGVyLnBhcmVudDtcbiAgICAgIGFuY2VzdG9yQ29tcG9uZW50cy51bnNoaWZ0KGFuY2VzdG9yUm91dGVyLl9jdXJyZW50SW5zdHJ1Y3Rpb24pO1xuICAgIH1cblxuICAgIHJldHVybiBhbmNlc3RvckNvbXBvbmVudHM7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgdG8gZWl0aGVyIHRoZSBsYXN0IFVSTCBzdWNjZXNzZnVsbHkgbmF2aWdhdGVkIHRvLCBvciB0aGUgbGFzdCBVUkwgcmVxdWVzdGVkIGlmIHRoZVxuICAgKiByb3V0ZXIgaGFzIHlldCB0byBzdWNjZXNzZnVsbHkgbmF2aWdhdGUuXG4gICAqL1xuICByZW5hdmlnYXRlKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKGlzQmxhbmsodGhpcy5sYXN0TmF2aWdhdGlvbkF0dGVtcHQpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY3VycmVudE5hdmlnYXRpb247XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5hdmlnYXRlQnlVcmwodGhpcy5sYXN0TmF2aWdhdGlvbkF0dGVtcHQpO1xuICB9XG5cblxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gYEluc3RydWN0aW9uYCBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgUm91dGUgTGluayBEU0wuXG4gICAqL1xuICBnZW5lcmF0ZShsaW5rUGFyYW1zOiBhbnlbXSk6IEluc3RydWN0aW9uIHtcbiAgICB2YXIgYW5jZXN0b3JJbnN0cnVjdGlvbnMgPSB0aGlzLl9nZXRBbmNlc3Rvckluc3RydWN0aW9ucygpO1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdlbmVyYXRlKGxpbmtQYXJhbXMsIGFuY2VzdG9ySW5zdHJ1Y3Rpb25zKTtcbiAgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUm9vdFJvdXRlciBleHRlbmRzIFJvdXRlciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2xvY2F0aW9uOiBMb2NhdGlvbjtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfbG9jYXRpb25TdWI6IE9iamVjdDtcblxuICBjb25zdHJ1Y3RvcihyZWdpc3RyeTogUm91dGVSZWdpc3RyeSwgbG9jYXRpb246IExvY2F0aW9uLFxuICAgICAgICAgICAgICBASW5qZWN0KFJPVVRFUl9QUklNQVJZX0NPTVBPTkVOVCkgcHJpbWFyeUNvbXBvbmVudDogVHlwZSkge1xuICAgIHN1cGVyKHJlZ2lzdHJ5LCBudWxsLCBwcmltYXJ5Q29tcG9uZW50KTtcbiAgICB0aGlzLl9sb2NhdGlvbiA9IGxvY2F0aW9uO1xuICAgIHRoaXMuX2xvY2F0aW9uU3ViID0gdGhpcy5fbG9jYXRpb24uc3Vic2NyaWJlKChjaGFuZ2UpID0+IHtcbiAgICAgIC8vIHdlIGNhbGwgcmVjb2duaXplIG91cnNlbHZlc1xuICAgICAgdGhpcy5yZWNvZ25pemUoY2hhbmdlWyd1cmwnXSlcbiAgICAgICAgICAudGhlbigoaW5zdHJ1Y3Rpb24pID0+IHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVCeUluc3RydWN0aW9uKGluc3RydWN0aW9uLCBpc1ByZXNlbnQoY2hhbmdlWydwb3AnXSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKF8pID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBwb3BzdGF0ZSBldmVudDsgbm8gbmVlZCB0byBjaGFuZ2UgdGhlIFVSTFxuICAgICAgICAgICAgICAgICAgaWYgKGlzUHJlc2VudChjaGFuZ2VbJ3BvcCddKSAmJiBjaGFuZ2VbJ3R5cGUnXSAhPSAnaGFzaGNoYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgdmFyIGVtaXRQYXRoID0gaW5zdHJ1Y3Rpb24udG9VcmxQYXRoKCk7XG4gICAgICAgICAgICAgICAgICB2YXIgZW1pdFF1ZXJ5ID0gaW5zdHJ1Y3Rpb24udG9VcmxRdWVyeSgpO1xuICAgICAgICAgICAgICAgICAgaWYgKGVtaXRQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgZW1pdFBhdGggPSAnLycgKyBlbWl0UGF0aDtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB3ZSd2ZSBvcHRlZCB0byB1c2UgQWxsIGhhc2hjaGFuZ2UgZXZlbnRzIG9jY3VyIG91dHNpZGUgQW5ndWxhci5cbiAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGFwcHMgdGhhdCBhcmUgbWlncmF0aW5nIG1pZ2h0IGhhdmUgaGFzaCBsaW5rcyB0aGF0IG9wZXJhdGUgb3V0c2lkZVxuICAgICAgICAgICAgICAgICAgLy8gYW5ndWxhciB0byB3aGljaCByb3V0aW5nIG11c3QgcmVzcG9uZC5cbiAgICAgICAgICAgICAgICAgIC8vIFRvIHN1cHBvcnQgdGhlc2UgY2FzZXMgd2hlcmUgd2UgcmVzcG9uZCB0byBoYXNoY2hhbmdlcyBhbmQgcmVkaXJlY3QgYXMgYVxuICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0LCB3ZSBuZWVkIHRvIHJlcGxhY2UgdGhlIHRvcCBpdGVtIG9uIHRoZSBzdGFjay5cbiAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VbJ3R5cGUnXSA9PSAnaGFzaGNoYW5nZScpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uLnRvUm9vdFVybCgpICE9IHRoaXMuX2xvY2F0aW9uLnBhdGgoKSkge1xuICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvY2F0aW9uLnJlcGxhY2VTdGF0ZShlbWl0UGF0aCwgZW1pdFF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9jYXRpb24uZ28oZW1pdFBhdGgsIGVtaXRRdWVyeSk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICB0aGlzLnJlZ2lzdHJ5LmNvbmZpZ0Zyb21Db21wb25lbnQocHJpbWFyeUNvbXBvbmVudCk7XG4gICAgdGhpcy5uYXZpZ2F0ZUJ5VXJsKGxvY2F0aW9uLnBhdGgoKSk7XG4gIH1cblxuICBjb21taXQoaW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uLCBfc2tpcExvY2F0aW9uQ2hhbmdlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT4ge1xuICAgIHZhciBlbWl0UGF0aCA9IGluc3RydWN0aW9uLnRvVXJsUGF0aCgpO1xuICAgIHZhciBlbWl0UXVlcnkgPSBpbnN0cnVjdGlvbi50b1VybFF1ZXJ5KCk7XG4gICAgaWYgKGVtaXRQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgIGVtaXRQYXRoID0gJy8nICsgZW1pdFBhdGg7XG4gICAgfVxuICAgIHZhciBwcm9taXNlID0gc3VwZXIuY29tbWl0KGluc3RydWN0aW9uKTtcbiAgICBpZiAoIV9za2lwTG9jYXRpb25DaGFuZ2UpIHtcbiAgICAgIHByb21pc2UgPSBwcm9taXNlLnRoZW4oKF8pID0+IHsgdGhpcy5fbG9jYXRpb24uZ28oZW1pdFBhdGgsIGVtaXRRdWVyeSk7IH0pO1xuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9sb2NhdGlvblN1YikpIHtcbiAgICAgIE9ic2VydmFibGVXcmFwcGVyLmRpc3Bvc2UodGhpcy5fbG9jYXRpb25TdWIpO1xuICAgICAgdGhpcy5fbG9jYXRpb25TdWIgPSBudWxsO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBDaGlsZFJvdXRlciBleHRlbmRzIFJvdXRlciB7XG4gIGNvbnN0cnVjdG9yKHBhcmVudDogUm91dGVyLCBob3N0Q29tcG9uZW50KSB7XG4gICAgc3VwZXIocGFyZW50LnJlZ2lzdHJ5LCBwYXJlbnQsIGhvc3RDb21wb25lbnQpO1xuICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuICB9XG5cblxuICBuYXZpZ2F0ZUJ5VXJsKHVybDogc3RyaW5nLCBfc2tpcExvY2F0aW9uQ2hhbmdlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIERlbGVnYXRlIG5hdmlnYXRpb24gdG8gdGhlIHJvb3Qgcm91dGVyXG4gICAgcmV0dXJuIHRoaXMucGFyZW50Lm5hdmlnYXRlQnlVcmwodXJsLCBfc2tpcExvY2F0aW9uQ2hhbmdlKTtcbiAgfVxuXG4gIG5hdmlnYXRlQnlJbnN0cnVjdGlvbihpbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBfc2tpcExvY2F0aW9uQ2hhbmdlOiBib29sZWFuID0gZmFsc2UpOiBQcm9taXNlPGFueT4ge1xuICAgIC8vIERlbGVnYXRlIG5hdmlnYXRpb24gdG8gdGhlIHJvb3Qgcm91dGVyXG4gICAgcmV0dXJuIHRoaXMucGFyZW50Lm5hdmlnYXRlQnlJbnN0cnVjdGlvbihpbnN0cnVjdGlvbiwgX3NraXBMb2NhdGlvbkNoYW5nZSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBjYW5BY3RpdmF0ZU9uZShuZXh0SW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkluc3RydWN0aW9uOiBJbnN0cnVjdGlvbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICB2YXIgbmV4dCA9IF9yZXNvbHZlVG9UcnVlO1xuICBpZiAoaXNQcmVzZW50KG5leHRJbnN0cnVjdGlvbi5jaGlsZCkpIHtcbiAgICBuZXh0ID0gY2FuQWN0aXZhdGVPbmUobmV4dEluc3RydWN0aW9uLmNoaWxkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZXNlbnQocHJldkluc3RydWN0aW9uKSA/IHByZXZJbnN0cnVjdGlvbi5jaGlsZCA6IG51bGwpO1xuICB9XG4gIHJldHVybiBuZXh0LnRoZW4oKHJlc3VsdCkgPT4ge1xuICAgIGlmIChyZXN1bHQgPT0gZmFsc2UpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKG5leHRJbnN0cnVjdGlvbi5jb21wb25lbnQucmV1c2UpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICB2YXIgaG9vayA9IGdldENhbkFjdGl2YXRlSG9vayhuZXh0SW5zdHJ1Y3Rpb24uY29tcG9uZW50LmNvbXBvbmVudFR5cGUpO1xuICAgIGlmIChpc1ByZXNlbnQoaG9vaykpIHtcbiAgICAgIHJldHVybiBob29rKG5leHRJbnN0cnVjdGlvbi5jb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICBpc1ByZXNlbnQocHJldkluc3RydWN0aW9uKSA/IHByZXZJbnN0cnVjdGlvbi5jb21wb25lbnQgOiBudWxsKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH0pO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZXIudHNcbiAqKi8iLCJpbXBvcnQge0xpc3RXcmFwcGVyLCBNYXAsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge1Byb21pc2UsIFByb21pc2VXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7XG4gIGlzUHJlc2VudCxcbiAgaXNBcnJheSxcbiAgaXNCbGFuayxcbiAgaXNUeXBlLFxuICBpc1N0cmluZyxcbiAgaXNTdHJpbmdNYXAsXG4gIFR5cGUsXG4gIGdldFR5cGVOYW1lRm9yRGVidWdnaW5nLFxuICBDT05TVF9FWFBSXG59IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge3JlZmxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcbmltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0LCBPcGFxdWVUb2tlbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmltcG9ydCB7XG4gIFJvdXRlQ29uZmlnLFxuICBBc3luY1JvdXRlLFxuICBSb3V0ZSxcbiAgQXV4Um91dGUsXG4gIFJlZGlyZWN0LFxuICBSb3V0ZURlZmluaXRpb25cbn0gZnJvbSAnLi9yb3V0ZV9jb25maWdfaW1wbCc7XG5pbXBvcnQge1BhdGhNYXRjaCwgUmVkaXJlY3RNYXRjaCwgUm91dGVNYXRjaH0gZnJvbSAnLi9yb3V0ZV9yZWNvZ25pemVyJztcbmltcG9ydCB7Q29tcG9uZW50UmVjb2duaXplcn0gZnJvbSAnLi9jb21wb25lbnRfcmVjb2duaXplcic7XG5pbXBvcnQge1xuICBJbnN0cnVjdGlvbixcbiAgUmVzb2x2ZWRJbnN0cnVjdGlvbixcbiAgUmVkaXJlY3RJbnN0cnVjdGlvbixcbiAgVW5yZXNvbHZlZEluc3RydWN0aW9uLFxuICBEZWZhdWx0SW5zdHJ1Y3Rpb25cbn0gZnJvbSAnLi9pbnN0cnVjdGlvbic7XG5cbmltcG9ydCB7bm9ybWFsaXplUm91dGVDb25maWcsIGFzc2VydENvbXBvbmVudEV4aXN0c30gZnJvbSAnLi9yb3V0ZV9jb25maWdfbm9tYWxpemVyJztcbmltcG9ydCB7cGFyc2VyLCBVcmwsIHBhdGhTZWdtZW50c1RvVXJsfSBmcm9tICcuL3VybF9wYXJzZXInO1xuXG52YXIgX3Jlc29sdmVUb051bGwgPSBQcm9taXNlV3JhcHBlci5yZXNvbHZlKG51bGwpO1xuXG5cblxuLyoqXG4gKiBUb2tlbiB1c2VkIHRvIGJpbmQgdGhlIGNvbXBvbmVudCB3aXRoIHRoZSB0b3AtbGV2ZWwge0BsaW5rIFJvdXRlQ29uZmlnfXMgZm9yIHRoZVxuICogYXBwbGljYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGUgKFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L2lSVVA4QjVPVWJ4Q1dRM0FjSURtKSlcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7Q29tcG9uZW50fSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7XG4gKiAgIFJPVVRFUl9ESVJFQ1RJVkVTLFxuICogICBST1VURVJfUFJPVklERVJTLFxuICogICBSb3V0ZUNvbmZpZ1xuICogfSBmcm9tICdhbmd1bGFyMi9yb3V0ZXInO1xuICpcbiAqIEBDb21wb25lbnQoe2RpcmVjdGl2ZXM6IFtST1VURVJfRElSRUNUSVZFU119KVxuICogQFJvdXRlQ29uZmlnKFtcbiAqICB7Li4ufSxcbiAqIF0pXG4gKiBjbGFzcyBBcHBDbXAge1xuICogICAvLyAuLi5cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwQ21wLCBbUk9VVEVSX1BST1ZJREVSU10pO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjb25zdCBST1VURVJfUFJJTUFSWV9DT01QT05FTlQ6IE9wYXF1ZVRva2VuID1cbiAgICBDT05TVF9FWFBSKG5ldyBPcGFxdWVUb2tlbignUm91dGVyUHJpbWFyeUNvbXBvbmVudCcpKTtcblxuXG4vKipcbiAqIFRoZSBSb3V0ZVJlZ2lzdHJ5IGhvbGRzIHJvdXRlIGNvbmZpZ3VyYXRpb25zIGZvciBlYWNoIGNvbXBvbmVudCBpbiBhbiBBbmd1bGFyIGFwcC5cbiAqIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyBJbnN0cnVjdGlvbnMgZnJvbSBVUkxzLCBhbmQgZ2VuZXJhdGluZyBVUkxzIGJhc2VkIG9uIHJvdXRlIGFuZFxuICogcGFyYW1ldGVycy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJvdXRlUmVnaXN0cnkge1xuICBwcml2YXRlIF9ydWxlcyA9IG5ldyBNYXA8YW55LCBDb21wb25lbnRSZWNvZ25pemVyPigpO1xuXG4gIGNvbnN0cnVjdG9yKEBJbmplY3QoUk9VVEVSX1BSSU1BUllfQ09NUE9ORU5UKSBwcml2YXRlIF9yb290Q29tcG9uZW50OiBUeXBlKSB7fVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIGNvbXBvbmVudCBhbmQgYSBjb25maWd1cmF0aW9uIG9iamVjdCwgYWRkIHRoZSByb3V0ZSB0byB0aGlzIHJlZ2lzdHJ5XG4gICAqL1xuICBjb25maWcocGFyZW50Q29tcG9uZW50OiBhbnksIGNvbmZpZzogUm91dGVEZWZpbml0aW9uKTogdm9pZCB7XG4gICAgY29uZmlnID0gbm9ybWFsaXplUm91dGVDb25maWcoY29uZmlnLCB0aGlzKTtcblxuICAgIC8vIHRoaXMgaXMgaGVyZSBiZWNhdXNlIERhcnQgdHlwZSBndWFyZCByZWFzb25zXG4gICAgaWYgKGNvbmZpZyBpbnN0YW5jZW9mIFJvdXRlKSB7XG4gICAgICBhc3NlcnRDb21wb25lbnRFeGlzdHMoY29uZmlnLmNvbXBvbmVudCwgY29uZmlnLnBhdGgpO1xuICAgIH0gZWxzZSBpZiAoY29uZmlnIGluc3RhbmNlb2YgQXV4Um91dGUpIHtcbiAgICAgIGFzc2VydENvbXBvbmVudEV4aXN0cyhjb25maWcuY29tcG9uZW50LCBjb25maWcucGF0aCk7XG4gICAgfVxuXG4gICAgdmFyIHJlY29nbml6ZXI6IENvbXBvbmVudFJlY29nbml6ZXIgPSB0aGlzLl9ydWxlcy5nZXQocGFyZW50Q29tcG9uZW50KTtcblxuICAgIGlmIChpc0JsYW5rKHJlY29nbml6ZXIpKSB7XG4gICAgICByZWNvZ25pemVyID0gbmV3IENvbXBvbmVudFJlY29nbml6ZXIoKTtcbiAgICAgIHRoaXMuX3J1bGVzLnNldChwYXJlbnRDb21wb25lbnQsIHJlY29nbml6ZXIpO1xuICAgIH1cblxuICAgIHZhciB0ZXJtaW5hbCA9IHJlY29nbml6ZXIuY29uZmlnKGNvbmZpZyk7XG5cbiAgICBpZiAoY29uZmlnIGluc3RhbmNlb2YgUm91dGUpIHtcbiAgICAgIGlmICh0ZXJtaW5hbCkge1xuICAgICAgICBhc3NlcnRUZXJtaW5hbENvbXBvbmVudChjb25maWcuY29tcG9uZW50LCBjb25maWcucGF0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvbmZpZ0Zyb21Db21wb25lbnQoY29uZmlnLmNvbXBvbmVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJlYWRzIHRoZSBhbm5vdGF0aW9ucyBvZiBhIGNvbXBvbmVudCBhbmQgY29uZmlndXJlcyB0aGUgcmVnaXN0cnkgYmFzZWQgb24gdGhlbVxuICAgKi9cbiAgY29uZmlnRnJvbUNvbXBvbmVudChjb21wb25lbnQ6IGFueSk6IHZvaWQge1xuICAgIGlmICghaXNUeXBlKGNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEb24ndCByZWFkIHRoZSBhbm5vdGF0aW9ucyBmcm9tIGEgdHlwZSBtb3JlIHRoYW4gb25jZSDigJNcbiAgICAvLyB0aGlzIHByZXZlbnRzIGFuIGluZmluaXRlIGxvb3AgaWYgYSBjb21wb25lbnQgcm91dGVzIHJlY3Vyc2l2ZWx5LlxuICAgIGlmICh0aGlzLl9ydWxlcy5oYXMoY29tcG9uZW50KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB2YXIgYW5ub3RhdGlvbnMgPSByZWZsZWN0b3IuYW5ub3RhdGlvbnMoY29tcG9uZW50KTtcbiAgICBpZiAoaXNQcmVzZW50KGFubm90YXRpb25zKSkge1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYW5ub3RhdGlvbiA9IGFubm90YXRpb25zW2ldO1xuXG4gICAgICAgIGlmIChhbm5vdGF0aW9uIGluc3RhbmNlb2YgUm91dGVDb25maWcpIHtcbiAgICAgICAgICBsZXQgcm91dGVDZmdzOiBSb3V0ZURlZmluaXRpb25bXSA9IGFubm90YXRpb24uY29uZmlncztcbiAgICAgICAgICByb3V0ZUNmZ3MuZm9yRWFjaChjb25maWcgPT4gdGhpcy5jb25maWcoY29tcG9uZW50LCBjb25maWcpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgVVJMIGFuZCBhIHBhcmVudCBjb21wb25lbnQsIHJldHVybiB0aGUgbW9zdCBzcGVjaWZpYyBpbnN0cnVjdGlvbiBmb3IgbmF2aWdhdGluZ1xuICAgKiB0aGUgYXBwbGljYXRpb24gaW50byB0aGUgc3RhdGUgc3BlY2lmaWVkIGJ5IHRoZSB1cmxcbiAgICovXG4gIHJlY29nbml6ZSh1cmw6IHN0cmluZywgYW5jZXN0b3JJbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uW10pOiBQcm9taXNlPEluc3RydWN0aW9uPiB7XG4gICAgdmFyIHBhcnNlZFVybCA9IHBhcnNlci5wYXJzZSh1cmwpO1xuICAgIHJldHVybiB0aGlzLl9yZWNvZ25pemUocGFyc2VkVXJsLCBhbmNlc3Rvckluc3RydWN0aW9ucyk7XG4gIH1cblxuXG4gIC8qKlxuICAgKiBSZWNvZ25pemVzIGFsbCBwYXJlbnQtY2hpbGQgcm91dGVzLCBidXQgY3JlYXRlcyB1bnJlc29sdmVkIGF1eGlsaWFyeSByb3V0ZXNcbiAgICovXG5cbiAgcHJpdmF0ZSBfcmVjb2duaXplKHBhcnNlZFVybDogVXJsLCBhbmNlc3Rvckluc3RydWN0aW9uczogSW5zdHJ1Y3Rpb25bXSxcbiAgICAgICAgICAgICAgICAgICAgIF9hdXggPSBmYWxzZSk6IFByb21pc2U8SW5zdHJ1Y3Rpb24+IHtcbiAgICB2YXIgcGFyZW50Q29tcG9uZW50ID1cbiAgICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCA/XG4gICAgICAgICAgICBhbmNlc3Rvckluc3RydWN0aW9uc1thbmNlc3Rvckluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5jb21wb25lbnQuY29tcG9uZW50VHlwZSA6XG4gICAgICAgICAgICB0aGlzLl9yb290Q29tcG9uZW50O1xuXG4gICAgdmFyIGNvbXBvbmVudFJlY29nbml6ZXIgPSB0aGlzLl9ydWxlcy5nZXQocGFyZW50Q29tcG9uZW50KTtcbiAgICBpZiAoaXNCbGFuayhjb21wb25lbnRSZWNvZ25pemVyKSkge1xuICAgICAgcmV0dXJuIF9yZXNvbHZlVG9OdWxsO1xuICAgIH1cblxuICAgIC8vIE1hdGNoZXMgc29tZSBiZWdpbm5pbmcgcGFydCBvZiB0aGUgZ2l2ZW4gVVJMXG4gICAgdmFyIHBvc3NpYmxlTWF0Y2hlczogUHJvbWlzZTxSb3V0ZU1hdGNoPltdID1cbiAgICAgICAgX2F1eCA/IGNvbXBvbmVudFJlY29nbml6ZXIucmVjb2duaXplQXV4aWxpYXJ5KHBhcnNlZFVybCkgOlxuICAgICAgICAgICAgICAgY29tcG9uZW50UmVjb2duaXplci5yZWNvZ25pemUocGFyc2VkVXJsKTtcblxuICAgIHZhciBtYXRjaFByb21pc2VzOiBQcm9taXNlPEluc3RydWN0aW9uPltdID0gcG9zc2libGVNYXRjaGVzLm1hcChcbiAgICAgICAgKGNhbmRpZGF0ZTogUHJvbWlzZTxSb3V0ZU1hdGNoPikgPT4gY2FuZGlkYXRlLnRoZW4oKGNhbmRpZGF0ZTogUm91dGVNYXRjaCkgPT4ge1xuXG4gICAgICAgICAgaWYgKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIFBhdGhNYXRjaCkge1xuICAgICAgICAgICAgdmFyIGF1eFBhcmVudEluc3RydWN0aW9ucyA9XG4gICAgICAgICAgICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCA/XG4gICAgICAgICAgICAgICAgICAgIFthbmNlc3Rvckluc3RydWN0aW9uc1thbmNlc3Rvckluc3RydWN0aW9ucy5sZW5ndGggLSAxXV0gOlxuICAgICAgICAgICAgICAgICAgICBbXTtcbiAgICAgICAgICAgIHZhciBhdXhJbnN0cnVjdGlvbnMgPVxuICAgICAgICAgICAgICAgIHRoaXMuX2F1eFJvdXRlc1RvVW5yZXNvbHZlZChjYW5kaWRhdGUucmVtYWluaW5nQXV4LCBhdXhQYXJlbnRJbnN0cnVjdGlvbnMpO1xuICAgICAgICAgICAgdmFyIGluc3RydWN0aW9uID0gbmV3IFJlc29sdmVkSW5zdHJ1Y3Rpb24oY2FuZGlkYXRlLmluc3RydWN0aW9uLCBudWxsLCBhdXhJbnN0cnVjdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmluc3RydWN0aW9uLnRlcm1pbmFsKSB7XG4gICAgICAgICAgICAgIHJldHVybiBpbnN0cnVjdGlvbjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIG5ld0FuY2VzdG9yQ29tcG9uZW50cyA9IGFuY2VzdG9ySW5zdHJ1Y3Rpb25zLmNvbmNhdChbaW5zdHJ1Y3Rpb25dKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlY29nbml6ZShjYW5kaWRhdGUucmVtYWluaW5nLCBuZXdBbmNlc3RvckNvbXBvbmVudHMpXG4gICAgICAgICAgICAgICAgLnRoZW4oKGNoaWxkSW5zdHJ1Y3Rpb24pID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChpc0JsYW5rKGNoaWxkSW5zdHJ1Y3Rpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAvLyByZWRpcmVjdCBpbnN0cnVjdGlvbnMgYXJlIGFscmVhZHkgYWJzb2x1dGVcbiAgICAgICAgICAgICAgICAgIGlmIChjaGlsZEluc3RydWN0aW9uIGluc3RhbmNlb2YgUmVkaXJlY3RJbnN0cnVjdGlvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGRJbnN0cnVjdGlvbjtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLmNoaWxkID0gY2hpbGRJbnN0cnVjdGlvbjtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBpbnN0cnVjdGlvbjtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY2FuZGlkYXRlIGluc3RhbmNlb2YgUmVkaXJlY3RNYXRjaCkge1xuICAgICAgICAgICAgdmFyIGluc3RydWN0aW9uID0gdGhpcy5nZW5lcmF0ZShjYW5kaWRhdGUucmVkaXJlY3RUbywgYW5jZXN0b3JJbnN0cnVjdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWRpcmVjdEluc3RydWN0aW9uKGluc3RydWN0aW9uLmNvbXBvbmVudCwgaW5zdHJ1Y3Rpb24uY2hpbGQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24uYXV4SW5zdHJ1Y3Rpb24pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuXG4gICAgaWYgKChpc0JsYW5rKHBhcnNlZFVybCkgfHwgcGFyc2VkVXJsLnBhdGggPT0gJycpICYmIHBvc3NpYmxlTWF0Y2hlcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLnJlc29sdmUodGhpcy5nZW5lcmF0ZURlZmF1bHQocGFyZW50Q29tcG9uZW50KSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLmFsbChtYXRjaFByb21pc2VzKS50aGVuKG1vc3RTcGVjaWZpYyk7XG4gIH1cblxuICBwcml2YXRlIF9hdXhSb3V0ZXNUb1VucmVzb2x2ZWQoYXV4Um91dGVzOiBVcmxbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudEluc3RydWN0aW9uczogSW5zdHJ1Y3Rpb25bXSk6IHtba2V5OiBzdHJpbmddOiBJbnN0cnVjdGlvbn0ge1xuICAgIHZhciB1bnJlc29sdmVkQXV4SW5zdHJ1Y3Rpb25zOiB7W2tleTogc3RyaW5nXTogSW5zdHJ1Y3Rpb259ID0ge307XG5cbiAgICBhdXhSb3V0ZXMuZm9yRWFjaCgoYXV4VXJsOiBVcmwpID0+IHtcbiAgICAgIHVucmVzb2x2ZWRBdXhJbnN0cnVjdGlvbnNbYXV4VXJsLnBhdGhdID0gbmV3IFVucmVzb2x2ZWRJbnN0cnVjdGlvbihcbiAgICAgICAgICAoKSA9PiB7IHJldHVybiB0aGlzLl9yZWNvZ25pemUoYXV4VXJsLCBwYXJlbnRJbnN0cnVjdGlvbnMsIHRydWUpOyB9KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB1bnJlc29sdmVkQXV4SW5zdHJ1Y3Rpb25zO1xuICB9XG5cblxuICAvKipcbiAgICogR2l2ZW4gYSBub3JtYWxpemVkIGxpc3Qgd2l0aCBjb21wb25lbnQgbmFtZXMgYW5kIHBhcmFtcyBsaWtlOiBgWyd1c2VyJywge2lkOiAzIH1dYFxuICAgKiBnZW5lcmF0ZXMgYSB1cmwgd2l0aCBhIGxlYWRpbmcgc2xhc2ggcmVsYXRpdmUgdG8gdGhlIHByb3ZpZGVkIGBwYXJlbnRDb21wb25lbnRgLlxuICAgKlxuICAgKiBJZiB0aGUgb3B0aW9uYWwgcGFyYW0gYF9hdXhgIGlzIGB0cnVlYCwgdGhlbiB3ZSBnZW5lcmF0ZSBzdGFydGluZyBhdCBhbiBhdXhpbGlhcnlcbiAgICogcm91dGUgYm91bmRhcnkuXG4gICAqL1xuICBnZW5lcmF0ZShsaW5rUGFyYW1zOiBhbnlbXSwgYW5jZXN0b3JJbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uW10sIF9hdXggPSBmYWxzZSk6IEluc3RydWN0aW9uIHtcbiAgICBsZXQgbm9ybWFsaXplZExpbmtQYXJhbXMgPSBzcGxpdEFuZEZsYXR0ZW5MaW5rUGFyYW1zKGxpbmtQYXJhbXMpO1xuXG4gICAgdmFyIGZpcnN0ID0gTGlzdFdyYXBwZXIuZmlyc3Qobm9ybWFsaXplZExpbmtQYXJhbXMpO1xuICAgIHZhciByZXN0ID0gTGlzdFdyYXBwZXIuc2xpY2Uobm9ybWFsaXplZExpbmtQYXJhbXMsIDEpO1xuXG4gICAgLy8gVGhlIGZpcnN0IHNlZ21lbnQgc2hvdWxkIGJlIGVpdGhlciAnLicgKGdlbmVyYXRlIGZyb20gcGFyZW50KSBvciAnJyAoZ2VuZXJhdGUgZnJvbSByb290KS5cbiAgICAvLyBXaGVuIHdlIG5vcm1hbGl6ZSBhYm92ZSwgd2Ugc3RyaXAgYWxsIHRoZSBzbGFzaGVzLCAnLi8nIGJlY29tZXMgJy4nIGFuZCAnLycgYmVjb21lcyAnJy5cbiAgICBpZiAoZmlyc3QgPT0gJycpIHtcbiAgICAgIGFuY2VzdG9ySW5zdHJ1Y3Rpb25zID0gW107XG4gICAgfSBlbHNlIGlmIChmaXJzdCA9PSAnLi4nKSB7XG4gICAgICAvLyB3ZSBhbHJlYWR5IGNhcHR1cmVkIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiBcIi4uXCIsIHNvIHdlIG5lZWQgdG8gcG9wIG9mZiBhbiBhbmNlc3RvclxuICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnMucG9wKCk7XG4gICAgICB3aGlsZSAoTGlzdFdyYXBwZXIuZmlyc3QocmVzdCkgPT0gJy4uJykge1xuICAgICAgICByZXN0ID0gTGlzdFdyYXBwZXIuc2xpY2UocmVzdCwgMSk7XG4gICAgICAgIGFuY2VzdG9ySW5zdHJ1Y3Rpb25zLnBvcCgpO1xuICAgICAgICBpZiAoYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoIDw9IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICAgICAgYExpbmsgXCIke0xpc3RXcmFwcGVyLnRvSlNPTihsaW5rUGFyYW1zKX1cIiBoYXMgdG9vIG1hbnkgXCIuLi9cIiBzZWdtZW50cy5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZmlyc3QgIT0gJy4nKSB7XG4gICAgICBsZXQgcGFyZW50Q29tcG9uZW50ID0gdGhpcy5fcm9vdENvbXBvbmVudDtcbiAgICAgIGxldCBncmFuZHBhcmVudENvbXBvbmVudCA9IG51bGw7XG4gICAgICBpZiAoYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoID4gMSkge1xuICAgICAgICBwYXJlbnRDb21wb25lbnQgPVxuICAgICAgICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnNbYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoIC0gMV0uY29tcG9uZW50LmNvbXBvbmVudFR5cGU7XG4gICAgICAgIGdyYW5kcGFyZW50Q29tcG9uZW50ID1cbiAgICAgICAgICAgIGFuY2VzdG9ySW5zdHJ1Y3Rpb25zW2FuY2VzdG9ySW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDJdLmNvbXBvbmVudC5jb21wb25lbnRUeXBlO1xuICAgICAgfSBlbHNlIGlmIChhbmNlc3Rvckluc3RydWN0aW9ucy5sZW5ndGggPT0gMSkge1xuICAgICAgICBwYXJlbnRDb21wb25lbnQgPSBhbmNlc3Rvckluc3RydWN0aW9uc1swXS5jb21wb25lbnQuY29tcG9uZW50VHlwZTtcbiAgICAgICAgZ3JhbmRwYXJlbnRDb21wb25lbnQgPSB0aGlzLl9yb290Q29tcG9uZW50O1xuICAgICAgfVxuXG4gICAgICAvLyBGb3IgYSBsaW5rIHdpdGggbm8gbGVhZGluZyBgLi9gLCBgL2AsIG9yIGAuLi9gLCB3ZSBsb29rIGZvciBhIHNpYmxpbmcgYW5kIGNoaWxkLlxuICAgICAgLy8gSWYgYm90aCBleGlzdCwgd2UgdGhyb3cuIE90aGVyd2lzZSwgd2UgcHJlZmVyIHdoaWNoZXZlciBleGlzdHMuXG4gICAgICB2YXIgY2hpbGRSb3V0ZUV4aXN0cyA9IHRoaXMuaGFzUm91dGUoZmlyc3QsIHBhcmVudENvbXBvbmVudCk7XG4gICAgICB2YXIgcGFyZW50Um91dGVFeGlzdHMgPVxuICAgICAgICAgIGlzUHJlc2VudChncmFuZHBhcmVudENvbXBvbmVudCkgJiYgdGhpcy5oYXNSb3V0ZShmaXJzdCwgZ3JhbmRwYXJlbnRDb21wb25lbnQpO1xuXG4gICAgICBpZiAocGFyZW50Um91dGVFeGlzdHMgJiYgY2hpbGRSb3V0ZUV4aXN0cykge1xuICAgICAgICBsZXQgbXNnID1cbiAgICAgICAgICAgIGBMaW5rIFwiJHtMaXN0V3JhcHBlci50b0pTT04obGlua1BhcmFtcyl9XCIgaXMgYW1iaWd1b3VzLCB1c2UgXCIuL1wiIG9yIFwiLi4vXCIgdG8gZGlzYW1iaWd1YXRlLmA7XG4gICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKG1zZyk7XG4gICAgICB9XG4gICAgICBpZiAocGFyZW50Um91dGVFeGlzdHMpIHtcbiAgICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnMucG9wKCk7XG4gICAgICB9XG4gICAgICByZXN0ID0gbGlua1BhcmFtcztcbiAgICB9XG5cbiAgICBpZiAocmVzdFtyZXN0Lmxlbmd0aCAtIDFdID09ICcnKSB7XG4gICAgICByZXN0LnBvcCgpO1xuICAgIH1cblxuICAgIGlmIChyZXN0Lmxlbmd0aCA8IDEpIHtcbiAgICAgIGxldCBtc2cgPSBgTGluayBcIiR7TGlzdFdyYXBwZXIudG9KU09OKGxpbmtQYXJhbXMpfVwiIG11c3QgaW5jbHVkZSBhIHJvdXRlIG5hbWUuYDtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKG1zZyk7XG4gICAgfVxuXG4gICAgdmFyIGdlbmVyYXRlZEluc3RydWN0aW9uID0gdGhpcy5fZ2VuZXJhdGUocmVzdCwgYW5jZXN0b3JJbnN0cnVjdGlvbnMsIF9hdXgpO1xuXG4gICAgZm9yICh2YXIgaSA9IGFuY2VzdG9ySW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBsZXQgYW5jZXN0b3JJbnN0cnVjdGlvbiA9IGFuY2VzdG9ySW5zdHJ1Y3Rpb25zW2ldO1xuICAgICAgZ2VuZXJhdGVkSW5zdHJ1Y3Rpb24gPSBhbmNlc3Rvckluc3RydWN0aW9uLnJlcGxhY2VDaGlsZChnZW5lcmF0ZWRJbnN0cnVjdGlvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdlbmVyYXRlZEluc3RydWN0aW9uO1xuICB9XG5cblxuICAvKlxuICAgKiBJbnRlcm5hbCBoZWxwZXIgdGhhdCBkb2VzIG5vdCBtYWtlIGFueSBhc3NlcnRpb25zIGFib3V0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmsgRFNMXG4gICAqL1xuICBwcml2YXRlIF9nZW5lcmF0ZShsaW5rUGFyYW1zOiBhbnlbXSwgYW5jZXN0b3JJbnN0cnVjdGlvbnM6IEluc3RydWN0aW9uW10sXG4gICAgICAgICAgICAgICAgICAgIF9hdXggPSBmYWxzZSk6IEluc3RydWN0aW9uIHtcbiAgICBsZXQgcGFyZW50Q29tcG9uZW50ID1cbiAgICAgICAgYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCA/XG4gICAgICAgICAgICBhbmNlc3Rvckluc3RydWN0aW9uc1thbmNlc3Rvckluc3RydWN0aW9ucy5sZW5ndGggLSAxXS5jb21wb25lbnQuY29tcG9uZW50VHlwZSA6XG4gICAgICAgICAgICB0aGlzLl9yb290Q29tcG9uZW50O1xuXG5cbiAgICBpZiAobGlua1BhcmFtcy5sZW5ndGggPT0gMCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2VuZXJhdGVEZWZhdWx0KHBhcmVudENvbXBvbmVudCk7XG4gICAgfVxuICAgIGxldCBsaW5rSW5kZXggPSAwO1xuICAgIGxldCByb3V0ZU5hbWUgPSBsaW5rUGFyYW1zW2xpbmtJbmRleF07XG5cbiAgICBpZiAoIWlzU3RyaW5nKHJvdXRlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBVbmV4cGVjdGVkIHNlZ21lbnQgXCIke3JvdXRlTmFtZX1cIiBpbiBsaW5rIERTTC4gRXhwZWN0ZWQgYSBzdHJpbmcuYCk7XG4gICAgfSBlbHNlIGlmIChyb3V0ZU5hbWUgPT0gJycgfHwgcm91dGVOYW1lID09ICcuJyB8fCByb3V0ZU5hbWUgPT0gJy4uJykge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFwiJHtyb3V0ZU5hbWV9L1wiIGlzIG9ubHkgYWxsb3dlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluayBEU0wuYCk7XG4gICAgfVxuXG4gICAgbGV0IHBhcmFtcyA9IHt9O1xuICAgIGlmIChsaW5rSW5kZXggKyAxIDwgbGlua1BhcmFtcy5sZW5ndGgpIHtcbiAgICAgIGxldCBuZXh0U2VnbWVudCA9IGxpbmtQYXJhbXNbbGlua0luZGV4ICsgMV07XG4gICAgICBpZiAoaXNTdHJpbmdNYXAobmV4dFNlZ21lbnQpICYmICFpc0FycmF5KG5leHRTZWdtZW50KSkge1xuICAgICAgICBwYXJhbXMgPSBuZXh0U2VnbWVudDtcbiAgICAgICAgbGlua0luZGV4ICs9IDE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGF1eEluc3RydWN0aW9uczoge1trZXk6IHN0cmluZ106IEluc3RydWN0aW9ufSA9IHt9O1xuICAgIHZhciBuZXh0U2VnbWVudDtcbiAgICB3aGlsZSAobGlua0luZGV4ICsgMSA8IGxpbmtQYXJhbXMubGVuZ3RoICYmIGlzQXJyYXkobmV4dFNlZ21lbnQgPSBsaW5rUGFyYW1zW2xpbmtJbmRleCArIDFdKSkge1xuICAgICAgbGV0IGF1eFBhcmVudEluc3RydWN0aW9uID0gYW5jZXN0b3JJbnN0cnVjdGlvbnMubGVuZ3RoID4gMCA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2FuY2VzdG9ySW5zdHJ1Y3Rpb25zW2FuY2VzdG9ySW5zdHJ1Y3Rpb25zLmxlbmd0aCAtIDFdXSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW107XG4gICAgICBsZXQgYXV4SW5zdHJ1Y3Rpb24gPSB0aGlzLl9nZW5lcmF0ZShuZXh0U2VnbWVudCwgYXV4UGFyZW50SW5zdHJ1Y3Rpb24sIHRydWUpO1xuXG4gICAgICAvLyBUT0RPOiB0aGlzIHdpbGwgbm90IHdvcmsgZm9yIGF1eCByb3V0ZXMgd2l0aCBwYXJhbWV0ZXJzIG9yIG11bHRpcGxlIHNlZ21lbnRzXG4gICAgICBhdXhJbnN0cnVjdGlvbnNbYXV4SW5zdHJ1Y3Rpb24uY29tcG9uZW50LnVybFBhdGhdID0gYXV4SW5zdHJ1Y3Rpb247XG4gICAgICBsaW5rSW5kZXggKz0gMTtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50UmVjb2duaXplciA9IHRoaXMuX3J1bGVzLmdldChwYXJlbnRDb21wb25lbnQpO1xuICAgIGlmIChpc0JsYW5rKGNvbXBvbmVudFJlY29nbml6ZXIpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgQ29tcG9uZW50IFwiJHtnZXRUeXBlTmFtZUZvckRlYnVnZ2luZyhwYXJlbnRDb21wb25lbnQpfVwiIGhhcyBubyByb3V0ZSBjb25maWcuYCk7XG4gICAgfVxuXG4gICAgdmFyIHJvdXRlUmVjb2duaXplciA9XG4gICAgICAgIChfYXV4ID8gY29tcG9uZW50UmVjb2duaXplci5hdXhOYW1lcyA6IGNvbXBvbmVudFJlY29nbml6ZXIubmFtZXMpLmdldChyb3V0ZU5hbWUpO1xuXG4gICAgaWYgKCFpc1ByZXNlbnQocm91dGVSZWNvZ25pemVyKSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXG4gICAgICAgICAgYENvbXBvbmVudCBcIiR7Z2V0VHlwZU5hbWVGb3JEZWJ1Z2dpbmcocGFyZW50Q29tcG9uZW50KX1cIiBoYXMgbm8gcm91dGUgbmFtZWQgXCIke3JvdXRlTmFtZX1cIi5gKTtcbiAgICB9XG5cbiAgICBpZiAoIWlzUHJlc2VudChyb3V0ZVJlY29nbml6ZXIuaGFuZGxlci5jb21wb25lbnRUeXBlKSkge1xuICAgICAgdmFyIGNvbXBJbnN0cnVjdGlvbiA9IHJvdXRlUmVjb2duaXplci5nZW5lcmF0ZUNvbXBvbmVudFBhdGhWYWx1ZXMocGFyYW1zKTtcbiAgICAgIHJldHVybiBuZXcgVW5yZXNvbHZlZEluc3RydWN0aW9uKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHJvdXRlUmVjb2duaXplci5oYW5kbGVyLnJlc29sdmVDb21wb25lbnRUeXBlKCkudGhlbihcbiAgICAgICAgICAgIChfKSA9PiB7IHJldHVybiB0aGlzLl9nZW5lcmF0ZShsaW5rUGFyYW1zLCBhbmNlc3Rvckluc3RydWN0aW9ucywgX2F1eCk7IH0pO1xuICAgICAgfSwgY29tcEluc3RydWN0aW9uWyd1cmxQYXRoJ10sIGNvbXBJbnN0cnVjdGlvblsndXJsUGFyYW1zJ10pO1xuICAgIH1cblxuICAgIHZhciBjb21wb25lbnRJbnN0cnVjdGlvbiA9IF9hdXggPyBjb21wb25lbnRSZWNvZ25pemVyLmdlbmVyYXRlQXV4aWxpYXJ5KHJvdXRlTmFtZSwgcGFyYW1zKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlY29nbml6ZXIuZ2VuZXJhdGUocm91dGVOYW1lLCBwYXJhbXMpO1xuXG5cblxuICAgIHZhciByZW1haW5pbmcgPSBsaW5rUGFyYW1zLnNsaWNlKGxpbmtJbmRleCArIDEpO1xuXG4gICAgdmFyIGluc3RydWN0aW9uID0gbmV3IFJlc29sdmVkSW5zdHJ1Y3Rpb24oY29tcG9uZW50SW5zdHJ1Y3Rpb24sIG51bGwsIGF1eEluc3RydWN0aW9ucyk7XG5cbiAgICAvLyB0aGUgY29tcG9uZW50IGlzIHN5bmNcbiAgICBpZiAoaXNQcmVzZW50KGNvbXBvbmVudEluc3RydWN0aW9uLmNvbXBvbmVudFR5cGUpKSB7XG4gICAgICBsZXQgY2hpbGRJbnN0cnVjdGlvbjogSW5zdHJ1Y3Rpb24gPSBudWxsO1xuICAgICAgaWYgKGxpbmtJbmRleCArIDEgPCBsaW5rUGFyYW1zLmxlbmd0aCkge1xuICAgICAgICBsZXQgY2hpbGRBbmNlc3RvckNvbXBvbmVudHMgPSBhbmNlc3Rvckluc3RydWN0aW9ucy5jb25jYXQoW2luc3RydWN0aW9uXSk7XG4gICAgICAgIGNoaWxkSW5zdHJ1Y3Rpb24gPSB0aGlzLl9nZW5lcmF0ZShyZW1haW5pbmcsIGNoaWxkQW5jZXN0b3JDb21wb25lbnRzKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNvbXBvbmVudEluc3RydWN0aW9uLnRlcm1pbmFsKSB7XG4gICAgICAgIC8vIC4uLiBsb29rIGZvciBkZWZhdWx0c1xuICAgICAgICBjaGlsZEluc3RydWN0aW9uID0gdGhpcy5nZW5lcmF0ZURlZmF1bHQoY29tcG9uZW50SW5zdHJ1Y3Rpb24uY29tcG9uZW50VHlwZSk7XG5cbiAgICAgICAgaWYgKGlzQmxhbmsoY2hpbGRJbnN0cnVjdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICAgICAgYExpbmsgXCIke0xpc3RXcmFwcGVyLnRvSlNPTihsaW5rUGFyYW1zKX1cIiBkb2VzIG5vdCByZXNvbHZlIHRvIGEgdGVybWluYWwgaW5zdHJ1Y3Rpb24uYCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGluc3RydWN0aW9uLmNoaWxkID0gY2hpbGRJbnN0cnVjdGlvbjtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5zdHJ1Y3Rpb247XG4gIH1cblxuICBwdWJsaWMgaGFzUm91dGUobmFtZTogc3RyaW5nLCBwYXJlbnRDb21wb25lbnQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHZhciBjb21wb25lbnRSZWNvZ25pemVyOiBDb21wb25lbnRSZWNvZ25pemVyID0gdGhpcy5fcnVsZXMuZ2V0KHBhcmVudENvbXBvbmVudCk7XG4gICAgaWYgKGlzQmxhbmsoY29tcG9uZW50UmVjb2duaXplcikpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBvbmVudFJlY29nbml6ZXIuaGFzUm91dGUobmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2VuZXJhdGVEZWZhdWx0KGNvbXBvbmVudEN1cnNvcjogVHlwZSk6IEluc3RydWN0aW9uIHtcbiAgICBpZiAoaXNCbGFuayhjb21wb25lbnRDdXJzb3IpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgY29tcG9uZW50UmVjb2duaXplciA9IHRoaXMuX3J1bGVzLmdldChjb21wb25lbnRDdXJzb3IpO1xuICAgIGlmIChpc0JsYW5rKGNvbXBvbmVudFJlY29nbml6ZXIpIHx8IGlzQmxhbmsoY29tcG9uZW50UmVjb2duaXplci5kZWZhdWx0Um91dGUpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cblxuICAgIHZhciBkZWZhdWx0Q2hpbGQgPSBudWxsO1xuICAgIGlmIChpc1ByZXNlbnQoY29tcG9uZW50UmVjb2duaXplci5kZWZhdWx0Um91dGUuaGFuZGxlci5jb21wb25lbnRUeXBlKSkge1xuICAgICAgdmFyIGNvbXBvbmVudEluc3RydWN0aW9uID0gY29tcG9uZW50UmVjb2duaXplci5kZWZhdWx0Um91dGUuZ2VuZXJhdGUoe30pO1xuICAgICAgaWYgKCFjb21wb25lbnRSZWNvZ25pemVyLmRlZmF1bHRSb3V0ZS50ZXJtaW5hbCkge1xuICAgICAgICBkZWZhdWx0Q2hpbGQgPSB0aGlzLmdlbmVyYXRlRGVmYXVsdChjb21wb25lbnRSZWNvZ25pemVyLmRlZmF1bHRSb3V0ZS5oYW5kbGVyLmNvbXBvbmVudFR5cGUpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0SW5zdHJ1Y3Rpb24oY29tcG9uZW50SW5zdHJ1Y3Rpb24sIGRlZmF1bHRDaGlsZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBVbnJlc29sdmVkSW5zdHJ1Y3Rpb24oKCkgPT4ge1xuICAgICAgcmV0dXJuIGNvbXBvbmVudFJlY29nbml6ZXIuZGVmYXVsdFJvdXRlLmhhbmRsZXIucmVzb2x2ZUNvbXBvbmVudFR5cGUoKS50aGVuKFxuICAgICAgICAgIChfKSA9PiB0aGlzLmdlbmVyYXRlRGVmYXVsdChjb21wb25lbnRDdXJzb3IpKTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKlxuICogR2l2ZW46IFsnL2EvYicsIHtjOiAyfV1cbiAqIFJldHVybnM6IFsnJywgJ2EnLCAnYicsIHtjOiAyfV1cbiAqL1xuZnVuY3Rpb24gc3BsaXRBbmRGbGF0dGVuTGlua1BhcmFtcyhsaW5rUGFyYW1zOiBhbnlbXSk6IGFueVtdIHtcbiAgcmV0dXJuIGxpbmtQYXJhbXMucmVkdWNlKChhY2N1bXVsYXRpb246IGFueVtdLCBpdGVtKSA9PiB7XG4gICAgaWYgKGlzU3RyaW5nKGl0ZW0pKSB7XG4gICAgICBsZXQgc3RySXRlbTogc3RyaW5nID0gaXRlbTtcbiAgICAgIHJldHVybiBhY2N1bXVsYXRpb24uY29uY2F0KHN0ckl0ZW0uc3BsaXQoJy8nKSk7XG4gICAgfVxuICAgIGFjY3VtdWxhdGlvbi5wdXNoKGl0ZW0pO1xuICAgIHJldHVybiBhY2N1bXVsYXRpb247XG4gIH0sIFtdKTtcbn1cblxuLypcbiAqIEdpdmVuIGEgbGlzdCBvZiBpbnN0cnVjdGlvbnMsIHJldHVybnMgdGhlIG1vc3Qgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25cbiAqL1xuZnVuY3Rpb24gbW9zdFNwZWNpZmljKGluc3RydWN0aW9uczogSW5zdHJ1Y3Rpb25bXSk6IEluc3RydWN0aW9uIHtcbiAgcmV0dXJuIExpc3RXcmFwcGVyLm1heGltdW0oaW5zdHJ1Y3Rpb25zLCAoaW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uKSA9PiBpbnN0cnVjdGlvbi5zcGVjaWZpY2l0eSk7XG59XG5cbmZ1bmN0aW9uIGFzc2VydFRlcm1pbmFsQ29tcG9uZW50KGNvbXBvbmVudCwgcGF0aCkge1xuICBpZiAoIWlzVHlwZShjb21wb25lbnQpKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGFubm90YXRpb25zID0gcmVmbGVjdG9yLmFubm90YXRpb25zKGNvbXBvbmVudCk7XG4gIGlmIChpc1ByZXNlbnQoYW5ub3RhdGlvbnMpKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTtcblxuICAgICAgaWYgKGFubm90YXRpb24gaW5zdGFuY2VvZiBSb3V0ZUNvbmZpZykge1xuICAgICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICAgIGBDaGlsZCByb3V0ZXMgYXJlIG5vdCBhbGxvd2VkIGZvciBcIiR7cGF0aH1cIi4gVXNlIFwiLi4uXCIgb24gdGhlIHBhcmVudCdzIHJvdXRlIHBhdGguYCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlX3JlZ2lzdHJ5LnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVCwgVHlwZSwgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtSb3V0ZURlZmluaXRpb259IGZyb20gJy4vcm91dGVfZGVmaW5pdGlvbic7XG5leHBvcnQge1JvdXRlRGVmaW5pdGlvbn0gZnJvbSAnLi9yb3V0ZV9kZWZpbml0aW9uJztcblxuLyoqXG4gKiBUaGUgYFJvdXRlQ29uZmlnYCBkZWNvcmF0b3IgZGVmaW5lcyByb3V0ZXMgZm9yIGEgZ2l2ZW4gY29tcG9uZW50LlxuICpcbiAqIEl0IHRha2VzIGFuIGFycmF5IG9mIHtAbGluayBSb3V0ZURlZmluaXRpb259cy5cbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBSb3V0ZUNvbmZpZyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBjb25maWdzOiBSb3V0ZURlZmluaXRpb25bXSkge31cbn1cblxuLyoqXG4gKiBgUm91dGVgIGlzIGEgdHlwZSBvZiB7QGxpbmsgUm91dGVEZWZpbml0aW9ufSB1c2VkIHRvIHJvdXRlIGEgcGF0aCB0byBhIGNvbXBvbmVudC5cbiAqXG4gKiBJdCBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogLSBgcGF0aGAgaXMgYSBzdHJpbmcgdGhhdCB1c2VzIHRoZSByb3V0ZSBtYXRjaGVyIERTTC5cbiAqIC0gYGNvbXBvbmVudGAgYSBjb21wb25lbnQgdHlwZS5cbiAqIC0gYG5hbWVgIGlzIGFuIG9wdGlvbmFsIGBDYW1lbENhc2VgIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhlIHJvdXRlLlxuICogLSBgZGF0YWAgaXMgYW4gb3B0aW9uYWwgcHJvcGVydHkgb2YgYW55IHR5cGUgcmVwcmVzZW50aW5nIGFyYml0cmFyeSByb3V0ZSBtZXRhZGF0YSBmb3IgdGhlIGdpdmVuXG4gKiByb3V0ZS4gSXQgaXMgaW5qZWN0YWJsZSB2aWEge0BsaW5rIFJvdXRlRGF0YX0uXG4gKiAtIGB1c2VBc0RlZmF1bHRgIGlzIGEgYm9vbGVhbiB2YWx1ZS4gSWYgYHRydWVgLCB0aGUgY2hpbGQgcm91dGUgd2lsbCBiZSBuYXZpZ2F0ZWQgdG8gaWYgbm8gY2hpbGRcbiAqIHJvdXRlIGlzIHNwZWNpZmllZCBkdXJpbmcgdGhlIG5hdmlnYXRpb24uXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqIGBgYFxuICogaW1wb3J0IHtSb3V0ZUNvbmZpZ30gZnJvbSAnYW5ndWxhcjIvcm91dGVyJztcbiAqXG4gKiBAUm91dGVDb25maWcoW1xuICogICB7cGF0aDogJy9ob21lJywgY29tcG9uZW50OiBIb21lQ21wLCBuYW1lOiAnSG9tZUNtcCcgfVxuICogXSlcbiAqIGNsYXNzIE15QXBwIHt9XG4gKiBgYGBcbiAqL1xuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBSb3V0ZSBpbXBsZW1lbnRzIFJvdXRlRGVmaW5pdGlvbiB7XG4gIGRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnl9O1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbXBvbmVudDogVHlwZTtcbiAgbmFtZTogc3RyaW5nO1xuICB1c2VBc0RlZmF1bHQ6IGJvb2xlYW47XG4gIC8vIGFkZGVkIG5leHQgdGhyZWUgcHJvcGVydGllcyB0byB3b3JrIGFyb3VuZCBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzQxMDdcbiAgYXV4OiBzdHJpbmcgPSBudWxsO1xuICBsb2FkZXI6IEZ1bmN0aW9uID0gbnVsbDtcbiAgcmVkaXJlY3RUbzogYW55W10gPSBudWxsO1xuICBjb25zdHJ1Y3Rvcih7cGF0aCwgY29tcG9uZW50LCBuYW1lLCBkYXRhLCB1c2VBc0RlZmF1bHR9OiB7XG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGNvbXBvbmVudDogVHlwZSwgbmFtZT86IHN0cmluZywgZGF0YT86IHtba2V5OiBzdHJpbmddOiBhbnl9LCB1c2VBc0RlZmF1bHQ/OiBib29sZWFuXG4gIH0pIHtcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50O1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnVzZUFzRGVmYXVsdCA9IHVzZUFzRGVmYXVsdDtcbiAgfVxufVxuXG4vKipcbiAqIGBBdXhSb3V0ZWAgaXMgYSB0eXBlIG9mIHtAbGluayBSb3V0ZURlZmluaXRpb259IHVzZWQgdG8gZGVmaW5lIGFuIGF1eGlsaWFyeSByb3V0ZS5cbiAqXG4gKiBJdCB0YWtlcyBhbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBwYXRoYCBpcyBhIHN0cmluZyB0aGF0IHVzZXMgdGhlIHJvdXRlIG1hdGNoZXIgRFNMLlxuICogLSBgY29tcG9uZW50YCBhIGNvbXBvbmVudCB0eXBlLlxuICogLSBgbmFtZWAgaXMgYW4gb3B0aW9uYWwgYENhbWVsQ2FzZWAgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGUgcm91dGUuXG4gKiAtIGBkYXRhYCBpcyBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiBhbnkgdHlwZSByZXByZXNlbnRpbmcgYXJiaXRyYXJ5IHJvdXRlIG1ldGFkYXRhIGZvciB0aGUgZ2l2ZW5cbiAqIHJvdXRlLiBJdCBpcyBpbmplY3RhYmxlIHZpYSB7QGxpbmsgUm91dGVEYXRhfS5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICogYGBgXG4gKiBpbXBvcnQge1JvdXRlQ29uZmlnLCBBdXhSb3V0ZX0gZnJvbSAnYW5ndWxhcjIvcm91dGVyJztcbiAqXG4gKiBAUm91dGVDb25maWcoW1xuICogICBuZXcgQXV4Um91dGUoe3BhdGg6ICcvaG9tZScsIGNvbXBvbmVudDogSG9tZUNtcH0pXG4gKiBdKVxuICogY2xhc3MgTXlBcHAge31cbiAqIGBgYFxuICovXG5AQ09OU1QoKVxuZXhwb3J0IGNsYXNzIEF1eFJvdXRlIGltcGxlbWVudHMgUm91dGVEZWZpbml0aW9uIHtcbiAgZGF0YToge1trZXk6IHN0cmluZ106IGFueX0gPSBudWxsO1xuICBwYXRoOiBzdHJpbmc7XG4gIGNvbXBvbmVudDogVHlwZTtcbiAgbmFtZTogc3RyaW5nO1xuICAvLyBhZGRlZCBuZXh0IHRocmVlIHByb3BlcnRpZXMgdG8gd29yayBhcm91bmQgaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy80MTA3XG4gIGF1eDogc3RyaW5nID0gbnVsbDtcbiAgbG9hZGVyOiBGdW5jdGlvbiA9IG51bGw7XG4gIHJlZGlyZWN0VG86IGFueVtdID0gbnVsbDtcbiAgdXNlQXNEZWZhdWx0OiBib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKHtwYXRoLCBjb21wb25lbnQsIG5hbWV9OiB7cGF0aDogc3RyaW5nLCBjb21wb25lbnQ6IFR5cGUsIG5hbWU/OiBzdHJpbmd9KSB7XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG59XG5cbi8qKlxuICogYEFzeW5jUm91dGVgIGlzIGEgdHlwZSBvZiB7QGxpbmsgUm91dGVEZWZpbml0aW9ufSB1c2VkIHRvIHJvdXRlIGEgcGF0aCB0byBhbiBhc3luY2hyb25vdXNseVxuICogbG9hZGVkIGNvbXBvbmVudC5cbiAqXG4gKiBJdCBoYXMgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogLSBgcGF0aGAgaXMgYSBzdHJpbmcgdGhhdCB1c2VzIHRoZSByb3V0ZSBtYXRjaGVyIERTTC5cbiAqIC0gYGxvYWRlcmAgaXMgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBjb21wb25lbnQuXG4gKiAtIGBuYW1lYCBpcyBhbiBvcHRpb25hbCBgQ2FtZWxDYXNlYCBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoZSByb3V0ZS5cbiAqIC0gYGRhdGFgIGlzIGFuIG9wdGlvbmFsIHByb3BlcnR5IG9mIGFueSB0eXBlIHJlcHJlc2VudGluZyBhcmJpdHJhcnkgcm91dGUgbWV0YWRhdGEgZm9yIHRoZSBnaXZlblxuICogcm91dGUuIEl0IGlzIGluamVjdGFibGUgdmlhIHtAbGluayBSb3V0ZURhdGF9LlxuICogLSBgdXNlQXNEZWZhdWx0YCBpcyBhIGJvb2xlYW4gdmFsdWUuIElmIGB0cnVlYCwgdGhlIGNoaWxkIHJvdXRlIHdpbGwgYmUgbmF2aWdhdGVkIHRvIGlmIG5vIGNoaWxkXG4gKiByb3V0ZSBpcyBzcGVjaWZpZWQgZHVyaW5nIHRoZSBuYXZpZ2F0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKiBgYGBcbiAqIGltcG9ydCB7Um91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQFJvdXRlQ29uZmlnKFtcbiAqICAge3BhdGg6ICcvaG9tZScsIGxvYWRlcjogKCkgPT4gUHJvbWlzZS5yZXNvbHZlKE15TG9hZGVkQ21wKSwgbmFtZTogJ015TG9hZGVkQ21wJ31cbiAqIF0pXG4gKiBjbGFzcyBNeUFwcCB7fVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgQXN5bmNSb3V0ZSBpbXBsZW1lbnRzIFJvdXRlRGVmaW5pdGlvbiB7XG4gIGRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnl9O1xuICBwYXRoOiBzdHJpbmc7XG4gIGxvYWRlcjogRnVuY3Rpb247XG4gIG5hbWU6IHN0cmluZztcbiAgdXNlQXNEZWZhdWx0OiBib29sZWFuO1xuICBhdXg6IHN0cmluZyA9IG51bGw7XG4gIGNvbnN0cnVjdG9yKHtwYXRoLCBsb2FkZXIsIG5hbWUsIGRhdGEsIHVzZUFzRGVmYXVsdH06IHtcbiAgICBwYXRoOiBzdHJpbmcsXG4gICAgbG9hZGVyOiBGdW5jdGlvbiwgbmFtZT86IHN0cmluZywgZGF0YT86IHtba2V5OiBzdHJpbmddOiBhbnl9LCB1c2VBc0RlZmF1bHQ/OiBib29sZWFuXG4gIH0pIHtcbiAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgIHRoaXMubG9hZGVyID0gbG9hZGVyO1xuICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgdGhpcy5kYXRhID0gZGF0YTtcbiAgICB0aGlzLnVzZUFzRGVmYXVsdCA9IHVzZUFzRGVmYXVsdDtcbiAgfVxufVxuXG4vKipcbiAqIGBSZWRpcmVjdGAgaXMgYSB0eXBlIG9mIHtAbGluayBSb3V0ZURlZmluaXRpb259IHVzZWQgdG8gcm91dGUgYSBwYXRoIHRvIGEgY2Fub25pY2FsIHJvdXRlLlxuICpcbiAqIEl0IGhhcyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBwYXRoYCBpcyBhIHN0cmluZyB0aGF0IHVzZXMgdGhlIHJvdXRlIG1hdGNoZXIgRFNMLlxuICogLSBgcmVkaXJlY3RUb2AgaXMgYW4gYXJyYXkgcmVwcmVzZW50aW5nIHRoZSBsaW5rIERTTC5cbiAqXG4gKiBOb3RlIHRoYXQgcmVkaXJlY3RzICoqZG8gbm90KiogYWZmZWN0IGhvdyBsaW5rcyBhcmUgZ2VuZXJhdGVkLiBGb3IgdGhhdCwgc2VlIHRoZSBgdXNlQXNEZWZhdWx0YFxuICogb3B0aW9uLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKiBgYGBcbiAqIGltcG9ydCB7Um91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQFJvdXRlQ29uZmlnKFtcbiAqICAge3BhdGg6ICcvJywgcmVkaXJlY3RUbzogWycvSG9tZSddIH0sXG4gKiAgIHtwYXRoOiAnL2hvbWUnLCBjb21wb25lbnQ6IEhvbWVDbXAsIG5hbWU6ICdIb21lJ31cbiAqIF0pXG4gKiBjbGFzcyBNeUFwcCB7fVxuICogYGBgXG4gKi9cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgUmVkaXJlY3QgaW1wbGVtZW50cyBSb3V0ZURlZmluaXRpb24ge1xuICBwYXRoOiBzdHJpbmc7XG4gIHJlZGlyZWN0VG86IGFueVtdO1xuICBuYW1lOiBzdHJpbmcgPSBudWxsO1xuICAvLyBhZGRlZCBuZXh0IHRocmVlIHByb3BlcnRpZXMgdG8gd29yayBhcm91bmQgaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy80MTA3XG4gIGxvYWRlcjogRnVuY3Rpb24gPSBudWxsO1xuICBkYXRhOiBhbnkgPSBudWxsO1xuICBhdXg6IHN0cmluZyA9IG51bGw7XG4gIHVzZUFzRGVmYXVsdDogYm9vbGVhbiA9IGZhbHNlO1xuICBjb25zdHJ1Y3Rvcih7cGF0aCwgcmVkaXJlY3RUb306IHtwYXRoOiBzdHJpbmcsIHJlZGlyZWN0VG86IGFueVtdfSkge1xuICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgdGhpcy5yZWRpcmVjdFRvID0gcmVkaXJlY3RUbztcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9jb25maWdfaW1wbC50c1xuICoqLyIsImltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQcm9taXNlV3JhcHBlciwgUHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9wcm9taXNlJztcbmltcG9ydCB7TWFwfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG5pbXBvcnQge1JvdXRlSGFuZGxlcn0gZnJvbSAnLi9yb3V0ZV9oYW5kbGVyJztcbmltcG9ydCB7VXJsfSBmcm9tICcuL3VybF9wYXJzZXInO1xuaW1wb3J0IHtDb21wb25lbnRJbnN0cnVjdGlvbn0gZnJvbSAnLi9pbnN0cnVjdGlvbic7XG5pbXBvcnQge1BhdGhSZWNvZ25pemVyfSBmcm9tICcuL3BhdGhfcmVjb2duaXplcic7XG5cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJvdXRlTWF0Y2gge31cblxuZXhwb3J0IGludGVyZmFjZSBBYnN0cmFjdFJlY29nbml6ZXIge1xuICBoYXNoOiBzdHJpbmc7XG4gIHBhdGg6IHN0cmluZztcbiAgcmVjb2duaXplKGJlZ2lubmluZ1NlZ21lbnQ6IFVybCk6IFByb21pc2U8Um91dGVNYXRjaD47XG4gIGdlbmVyYXRlKHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0pOiBDb21wb25lbnRJbnN0cnVjdGlvbjtcbn1cblxuXG5leHBvcnQgY2xhc3MgUGF0aE1hdGNoIGV4dGVuZHMgUm91dGVNYXRjaCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbnN0cnVjdGlvbjogQ29tcG9uZW50SW5zdHJ1Y3Rpb24sIHB1YmxpYyByZW1haW5pbmc6IFVybCxcbiAgICAgICAgICAgICAgcHVibGljIHJlbWFpbmluZ0F1eDogVXJsW10pIHtcbiAgICBzdXBlcigpO1xuICB9XG59XG5cblxuZXhwb3J0IGNsYXNzIFJlZGlyZWN0TWF0Y2ggZXh0ZW5kcyBSb3V0ZU1hdGNoIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlZGlyZWN0VG86IGFueVtdLCBwdWJsaWMgc3BlY2lmaWNpdHkpIHsgc3VwZXIoKTsgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVkaXJlY3RSZWNvZ25pemVyIGltcGxlbWVudHMgQWJzdHJhY3RSZWNvZ25pemVyIHtcbiAgcHJpdmF0ZSBfcGF0aFJlY29nbml6ZXI6IFBhdGhSZWNvZ25pemVyO1xuICBwdWJsaWMgaGFzaDogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXRoOiBzdHJpbmcsIHB1YmxpYyByZWRpcmVjdFRvOiBhbnlbXSkge1xuICAgIHRoaXMuX3BhdGhSZWNvZ25pemVyID0gbmV3IFBhdGhSZWNvZ25pemVyKHBhdGgpO1xuICAgIHRoaXMuaGFzaCA9IHRoaXMuX3BhdGhSZWNvZ25pemVyLmhhc2g7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBgbnVsbGAgb3IgYSBgUGFyc2VkVXJsYCByZXByZXNlbnRpbmcgdGhlIG5ldyBwYXRoIHRvIG1hdGNoXG4gICAqL1xuICByZWNvZ25pemUoYmVnaW5uaW5nU2VnbWVudDogVXJsKTogUHJvbWlzZTxSb3V0ZU1hdGNoPiB7XG4gICAgdmFyIG1hdGNoID0gbnVsbDtcbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3BhdGhSZWNvZ25pemVyLnJlY29nbml6ZShiZWdpbm5pbmdTZWdtZW50KSkpIHtcbiAgICAgIG1hdGNoID0gbmV3IFJlZGlyZWN0TWF0Y2godGhpcy5yZWRpcmVjdFRvLCB0aGlzLl9wYXRoUmVjb2duaXplci5zcGVjaWZpY2l0eSk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlV3JhcHBlci5yZXNvbHZlKG1hdGNoKTtcbiAgfVxuXG4gIGdlbmVyYXRlKHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0pOiBDb21wb25lbnRJbnN0cnVjdGlvbiB7XG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFRyaWVkIHRvIGdlbmVyYXRlIGEgcmVkaXJlY3QuYCk7XG4gIH1cbn1cblxuXG4vLyByZXByZXNlbnRzIHNvbWV0aGluZyBsaWtlICcvZm9vLzpiYXInXG5leHBvcnQgY2xhc3MgUm91dGVSZWNvZ25pemVyIGltcGxlbWVudHMgQWJzdHJhY3RSZWNvZ25pemVyIHtcbiAgc3BlY2lmaWNpdHk6IG51bWJlcjtcbiAgdGVybWluYWw6IGJvb2xlYW4gPSB0cnVlO1xuICBoYXNoOiBzdHJpbmc7XG5cbiAgcHJpdmF0ZSBfY2FjaGU6IE1hcDxzdHJpbmcsIENvbXBvbmVudEluc3RydWN0aW9uPiA9IG5ldyBNYXA8c3RyaW5nLCBDb21wb25lbnRJbnN0cnVjdGlvbj4oKTtcbiAgcHJpdmF0ZSBfcGF0aFJlY29nbml6ZXI6IFBhdGhSZWNvZ25pemVyO1xuXG4gIC8vIFRPRE86IGNhY2hlIGNvbXBvbmVudCBpbnN0cnVjdGlvbiBpbnN0YW5jZXMgYnkgcGFyYW1zIGFuZCBieSBQYXJzZWRVcmwgaW5zdGFuY2VcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGF0aDogc3RyaW5nLCBwdWJsaWMgaGFuZGxlcjogUm91dGVIYW5kbGVyKSB7XG4gICAgdGhpcy5fcGF0aFJlY29nbml6ZXIgPSBuZXcgUGF0aFJlY29nbml6ZXIocGF0aCk7XG4gICAgdGhpcy5zcGVjaWZpY2l0eSA9IHRoaXMuX3BhdGhSZWNvZ25pemVyLnNwZWNpZmljaXR5O1xuICAgIHRoaXMuaGFzaCA9IHRoaXMuX3BhdGhSZWNvZ25pemVyLmhhc2g7XG4gICAgdGhpcy50ZXJtaW5hbCA9IHRoaXMuX3BhdGhSZWNvZ25pemVyLnRlcm1pbmFsO1xuICB9XG5cbiAgcmVjb2duaXplKGJlZ2lubmluZ1NlZ21lbnQ6IFVybCk6IFByb21pc2U8Um91dGVNYXRjaD4ge1xuICAgIHZhciByZXMgPSB0aGlzLl9wYXRoUmVjb2duaXplci5yZWNvZ25pemUoYmVnaW5uaW5nU2VnbWVudCk7XG4gICAgaWYgKGlzQmxhbmsocmVzKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlci5yZXNvbHZlQ29tcG9uZW50VHlwZSgpLnRoZW4oKF8pID0+IHtcbiAgICAgIHZhciBjb21wb25lbnRJbnN0cnVjdGlvbiA9XG4gICAgICAgICAgdGhpcy5fZ2V0SW5zdHJ1Y3Rpb24ocmVzWyd1cmxQYXRoJ10sIHJlc1sndXJsUGFyYW1zJ10sIHJlc1snYWxsUGFyYW1zJ10pO1xuICAgICAgcmV0dXJuIG5ldyBQYXRoTWF0Y2goY29tcG9uZW50SW5zdHJ1Y3Rpb24sIHJlc1snbmV4dFNlZ21lbnQnXSwgcmVzWydhdXhpbGlhcnknXSk7XG4gICAgfSk7XG4gIH1cblxuICBnZW5lcmF0ZShwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogQ29tcG9uZW50SW5zdHJ1Y3Rpb24ge1xuICAgIHZhciBnZW5lcmF0ZWQgPSB0aGlzLl9wYXRoUmVjb2duaXplci5nZW5lcmF0ZShwYXJhbXMpO1xuICAgIHZhciB1cmxQYXRoID0gZ2VuZXJhdGVkWyd1cmxQYXRoJ107XG4gICAgdmFyIHVybFBhcmFtcyA9IGdlbmVyYXRlZFsndXJsUGFyYW1zJ107XG4gICAgcmV0dXJuIHRoaXMuX2dldEluc3RydWN0aW9uKHVybFBhdGgsIHVybFBhcmFtcywgcGFyYW1zKTtcbiAgfVxuXG4gIGdlbmVyYXRlQ29tcG9uZW50UGF0aFZhbHVlcyhwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KToge1trZXk6IHN0cmluZ106IGFueX0ge1xuICAgIHJldHVybiB0aGlzLl9wYXRoUmVjb2duaXplci5nZW5lcmF0ZShwYXJhbXMpO1xuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0SW5zdHJ1Y3Rpb24odXJsUGF0aDogc3RyaW5nLCB1cmxQYXJhbXM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBhbnl9KTogQ29tcG9uZW50SW5zdHJ1Y3Rpb24ge1xuICAgIGlmIChpc0JsYW5rKHRoaXMuaGFuZGxlci5jb21wb25lbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFRyaWVkIHRvIGdldCBpbnN0cnVjdGlvbiBiZWZvcmUgdGhlIHR5cGUgd2FzIGxvYWRlZC5gKTtcbiAgICB9XG5cbiAgICB2YXIgaGFzaEtleSA9IHVybFBhdGggKyAnPycgKyB1cmxQYXJhbXMuam9pbignPycpO1xuICAgIGlmICh0aGlzLl9jYWNoZS5oYXMoaGFzaEtleSkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9jYWNoZS5nZXQoaGFzaEtleSk7XG4gICAgfVxuICAgIHZhciBpbnN0cnVjdGlvbiA9XG4gICAgICAgIG5ldyBDb21wb25lbnRJbnN0cnVjdGlvbih1cmxQYXRoLCB1cmxQYXJhbXMsIHRoaXMuaGFuZGxlci5kYXRhLCB0aGlzLmhhbmRsZXIuY29tcG9uZW50VHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGVybWluYWwsIHRoaXMuc3BlY2lmaWNpdHksIHBhcmFtcyk7XG4gICAgdGhpcy5fY2FjaGUuc2V0KGhhc2hLZXksIGluc3RydWN0aW9uKTtcblxuICAgIHJldHVybiBpbnN0cnVjdGlvbjtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9yZWNvZ25pemVyLnRzXG4gKiovIiwiaW1wb3J0IHtNYXAsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXIsIExpc3RXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzQmxhbmssIG5vcm1hbGl6ZUJsYW5rLCBUeXBlLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQcm9taXNlLCBQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cblxuLyoqXG4gKiBgUm91dGVQYXJhbXNgIGlzIGFuIGltbXV0YWJsZSBtYXAgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGdpdmVuIHJvdXRlXG4gKiBiYXNlZCBvbiB0aGUgdXJsIG1hdGNoZXIgYW5kIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIHRoYXQgcm91dGUuXG4gKlxuICogWW91IGNhbiBpbmplY3QgYFJvdXRlUGFyYW1zYCBpbnRvIHRoZSBjb25zdHJ1Y3RvciBvZiBhIGNvbXBvbmVudCB0byB1c2UgaXQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7Q29tcG9uZW50fSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7Ym9vdHN0cmFwfSBmcm9tICdhbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyJztcbiAqIGltcG9ydCB7Um91dGVyLCBST1VURVJfRElSRUNUSVZFUywgUk9VVEVSX1BST1ZJREVSUywgUm91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHtwYXRoOiAnL3VzZXIvOmlkJywgY29tcG9uZW50OiBVc2VyQ21wLCBhczogJ1VzZXJDbXAnfSxcbiAqIF0pXG4gKiBjbGFzcyBBcHBDbXAge31cbiAqXG4gKiBAQ29tcG9uZW50KHsgdGVtcGxhdGU6ICd1c2VyOiB7e2lkfX0nIH0pXG4gKiBjbGFzcyBVc2VyQ21wIHtcbiAqICAgaWQ6IHN0cmluZztcbiAqICAgY29uc3RydWN0b3IocGFyYW1zOiBSb3V0ZVBhcmFtcykge1xuICogICAgIHRoaXMuaWQgPSBwYXJhbXMuZ2V0KCdpZCcpO1xuICogICB9XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcENtcCwgUk9VVEVSX1BST1ZJREVSUyk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFJvdXRlUGFyYW1zIHtcbiAgY29uc3RydWN0b3IocHVibGljIHBhcmFtczoge1trZXk6IHN0cmluZ106IHN0cmluZ30pIHt9XG5cbiAgZ2V0KHBhcmFtOiBzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gbm9ybWFsaXplQmxhbmsoU3RyaW5nTWFwV3JhcHBlci5nZXQodGhpcy5wYXJhbXMsIHBhcmFtKSk7IH1cbn1cblxuLyoqXG4gKiBgUm91dGVEYXRhYCBpcyBhbiBpbW11dGFibGUgbWFwIG9mIGFkZGl0aW9uYWwgZGF0YSB5b3UgY2FuIGNvbmZpZ3VyZSBpbiB5b3VyIHtAbGluayBSb3V0ZX0uXG4gKlxuICogWW91IGNhbiBpbmplY3QgYFJvdXRlRGF0YWAgaW50byB0aGUgY29uc3RydWN0b3Igb2YgYSBjb21wb25lbnQgdG8gdXNlIGl0LlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudCwgVmlld30gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge2Jvb3RzdHJhcH0gZnJvbSAnYW5ndWxhcjIvcGxhdGZvcm0vYnJvd3Nlcic7XG4gKiBpbXBvcnQge1JvdXRlciwgUk9VVEVSX0RJUkVDVElWRVMsIHJvdXRlckJpbmRpbmdzLCBSb3V0ZUNvbmZpZ30gZnJvbSAnYW5ndWxhcjIvcm91dGVyJztcbiAqXG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogQFZpZXcoe2RpcmVjdGl2ZXM6IFtST1VURVJfRElSRUNUSVZFU119KVxuICogQFJvdXRlQ29uZmlnKFtcbiAqICB7cGF0aDogJy91c2VyLzppZCcsIGNvbXBvbmVudDogVXNlckNtcCwgYXM6ICdVc2VyQ21wJywgZGF0YToge2lzQWRtaW46IHRydWV9fSxcbiAqIF0pXG4gKiBjbGFzcyBBcHBDbXAge31cbiAqXG4gKiBAQ29tcG9uZW50KHsuLi59KVxuICogQFZpZXcoeyB0ZW1wbGF0ZTogJ3VzZXI6IHt7aXNBZG1pbn19JyB9KVxuICogY2xhc3MgVXNlckNtcCB7XG4gKiAgIHN0cmluZzogaXNBZG1pbjtcbiAqICAgY29uc3RydWN0b3IoZGF0YTogUm91dGVEYXRhKSB7XG4gKiAgICAgdGhpcy5pc0FkbWluID0gZGF0YS5nZXQoJ2lzQWRtaW4nKTtcbiAqICAgfVxuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHBDbXAsIHJvdXRlckJpbmRpbmdzKEFwcENtcCkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBSb3V0ZURhdGEge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGF0YToge1trZXk6IHN0cmluZ106IGFueX0gPSBDT05TVF9FWFBSKHt9KSkge31cblxuICBnZXQoa2V5OiBzdHJpbmcpOiBhbnkgeyByZXR1cm4gbm9ybWFsaXplQmxhbmsoU3RyaW5nTWFwV3JhcHBlci5nZXQodGhpcy5kYXRhLCBrZXkpKTsgfVxufVxuXG5leHBvcnQgdmFyIEJMQU5LX1JPVVRFX0RBVEEgPSBuZXcgUm91dGVEYXRhKCk7XG5cbi8qKlxuICogYEluc3RydWN0aW9uYCBpcyBhIHRyZWUgb2Yge0BsaW5rIENvbXBvbmVudEluc3RydWN0aW9ufXMgd2l0aCBhbGwgdGhlIGluZm9ybWF0aW9uIG5lZWRlZFxuICogdG8gdHJhbnNpdGlvbiBlYWNoIGNvbXBvbmVudCBpbiB0aGUgYXBwIHRvIGEgZ2l2ZW4gcm91dGUsIGluY2x1ZGluZyBhbGwgYXV4aWxpYXJ5IHJvdXRlcy5cbiAqXG4gKiBgSW5zdHJ1Y3Rpb25gcyBjYW4gYmUgY3JlYXRlZCB1c2luZyB7QGxpbmsgUm91dGVyI2dlbmVyYXRlfSwgYW5kIGNhbiBiZSB1c2VkIHRvXG4gKiBwZXJmb3JtIHJvdXRlIGNoYW5nZXMgd2l0aCB7QGxpbmsgUm91dGVyI25hdmlnYXRlQnlJbnN0cnVjdGlvbn0uXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7Q29tcG9uZW50fSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAqIGltcG9ydCB7Ym9vdHN0cmFwfSBmcm9tICdhbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyJztcbiAqIGltcG9ydCB7Um91dGVyLCBST1VURVJfRElSRUNUSVZFUywgUk9VVEVSX1BST1ZJREVSUywgUm91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHsuLi59LFxuICogXSlcbiAqIGNsYXNzIEFwcENtcCB7XG4gKiAgIGNvbnN0cnVjdG9yKHJvdXRlcjogUm91dGVyKSB7XG4gKiAgICAgdmFyIGluc3RydWN0aW9uID0gcm91dGVyLmdlbmVyYXRlKFsnL015Um91dGUnXSk7XG4gKiAgICAgcm91dGVyLm5hdmlnYXRlQnlJbnN0cnVjdGlvbihpbnN0cnVjdGlvbik7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwQ21wLCBST1VURVJfUFJPVklERVJTKTtcbiAqIGBgYFxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgSW5zdHJ1Y3Rpb24ge1xuICBwdWJsaWMgY29tcG9uZW50OiBDb21wb25lbnRJbnN0cnVjdGlvbjtcbiAgcHVibGljIGNoaWxkOiBJbnN0cnVjdGlvbjtcbiAgcHVibGljIGF1eEluc3RydWN0aW9uOiB7W2tleTogc3RyaW5nXTogSW5zdHJ1Y3Rpb259ID0ge307XG5cbiAgZ2V0IHVybFBhdGgoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuY29tcG9uZW50LnVybFBhdGg7IH1cblxuICBnZXQgdXJsUGFyYW1zKCk6IHN0cmluZ1tdIHsgcmV0dXJuIHRoaXMuY29tcG9uZW50LnVybFBhcmFtczsgfVxuXG4gIGdldCBzcGVjaWZpY2l0eSgpOiBudW1iZXIge1xuICAgIHZhciB0b3RhbCA9IDA7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIHRvdGFsICs9IHRoaXMuY29tcG9uZW50LnNwZWNpZmljaXR5O1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuY2hpbGQpKSB7XG4gICAgICB0b3RhbCArPSB0aGlzLmNoaWxkLnNwZWNpZmljaXR5O1xuICAgIH1cbiAgICByZXR1cm4gdG90YWw7XG4gIH1cblxuICBhYnN0cmFjdCByZXNvbHZlQ29tcG9uZW50KCk6IFByb21pc2U8Q29tcG9uZW50SW5zdHJ1Y3Rpb24+O1xuXG4gIC8qKlxuICAgKiBjb252ZXJ0cyB0aGUgaW5zdHJ1Y3Rpb24gaW50byBhIFVSTCBzdHJpbmdcbiAgICovXG4gIHRvUm9vdFVybCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy50b1VybFBhdGgoKSArIHRoaXMudG9VcmxRdWVyeSgpOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdG9Ob25Sb290VXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmluZ2lmeVBhdGhNYXRyaXhBdXhQcmVmaXhlZCgpICtcbiAgICAgICAgICAgKGlzUHJlc2VudCh0aGlzLmNoaWxkKSA/IHRoaXMuY2hpbGQuX3RvTm9uUm9vdFVybCgpIDogJycpO1xuICB9XG5cbiAgdG9VcmxRdWVyeSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy51cmxQYXJhbXMubGVuZ3RoID4gMCA/ICgnPycgKyB0aGlzLnVybFBhcmFtcy5qb2luKCcmJykpIDogJyc7IH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIG5ldyBpbnN0cnVjdGlvbiB0aGF0IHNoYXJlcyB0aGUgc3RhdGUgb2YgdGhlIGV4aXN0aW5nIGluc3RydWN0aW9uLCBidXQgd2l0aFxuICAgKiB0aGUgZ2l2ZW4gY2hpbGQge0BsaW5rIEluc3RydWN0aW9ufSByZXBsYWNpbmcgdGhlIGV4aXN0aW5nIGNoaWxkLlxuICAgKi9cbiAgcmVwbGFjZUNoaWxkKGNoaWxkOiBJbnN0cnVjdGlvbik6IEluc3RydWN0aW9uIHtcbiAgICByZXR1cm4gbmV3IFJlc29sdmVkSW5zdHJ1Y3Rpb24odGhpcy5jb21wb25lbnQsIGNoaWxkLCB0aGlzLmF1eEluc3RydWN0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJZiB0aGUgZmluYWwgVVJMIGZvciB0aGUgaW5zdHJ1Y3Rpb24gaXMgYGBcbiAgICovXG4gIHRvVXJsUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnVybFBhdGggKyB0aGlzLl9zdHJpbmdpZnlBdXgoKSArXG4gICAgICAgICAgIChpc1ByZXNlbnQodGhpcy5jaGlsZCkgPyB0aGlzLmNoaWxkLl90b05vblJvb3RVcmwoKSA6ICcnKTtcbiAgfVxuXG4gIC8vIGRlZmF1bHQgaW5zdHJ1Y3Rpb25zIG92ZXJyaWRlIHRoZXNlXG4gIHRvTGlua1VybCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnVybFBhdGggKyB0aGlzLl9zdHJpbmdpZnlBdXgoKSArXG4gICAgICAgICAgIChpc1ByZXNlbnQodGhpcy5jaGlsZCkgPyB0aGlzLmNoaWxkLl90b0xpbmtVcmwoKSA6ICcnKTtcbiAgfVxuXG4gIC8vIHRoaXMgaXMgdGhlIG5vbi1yb290IHZlcnNpb24gKGNhbGxlZCByZWN1cnNpdmVseSlcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdG9MaW5rVXJsKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3N0cmluZ2lmeVBhdGhNYXRyaXhBdXhQcmVmaXhlZCgpICtcbiAgICAgICAgICAgKGlzUHJlc2VudCh0aGlzLmNoaWxkKSA/IHRoaXMuY2hpbGQuX3RvTGlua1VybCgpIDogJycpO1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc3RyaW5naWZ5UGF0aE1hdHJpeEF1eFByZWZpeGVkKCk6IHN0cmluZyB7XG4gICAgdmFyIHByaW1hcnkgPSB0aGlzLl9zdHJpbmdpZnlQYXRoTWF0cml4QXV4KCk7XG4gICAgaWYgKHByaW1hcnkubGVuZ3RoID4gMCkge1xuICAgICAgcHJpbWFyeSA9ICcvJyArIHByaW1hcnk7XG4gICAgfVxuICAgIHJldHVybiBwcmltYXJ5O1xuICB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc3RyaW5naWZ5TWF0cml4UGFyYW1zKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMudXJsUGFyYW1zLmxlbmd0aCA+IDAgPyAoJzsnICsgdGhpcy5jb21wb25lbnQudXJsUGFyYW1zLmpvaW4oJzsnKSkgOiAnJztcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N0cmluZ2lmeVBhdGhNYXRyaXhBdXgoKTogc3RyaW5nIHtcbiAgICBpZiAoaXNCbGFuayh0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXJsUGF0aCArIHRoaXMuX3N0cmluZ2lmeU1hdHJpeFBhcmFtcygpICsgdGhpcy5fc3RyaW5naWZ5QXV4KCk7XG4gIH1cblxuICAvKiogQGludGVybmFsICovXG4gIF9zdHJpbmdpZnlBdXgoKTogc3RyaW5nIHtcbiAgICB2YXIgcm91dGVzID0gW107XG4gICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKHRoaXMuYXV4SW5zdHJ1Y3Rpb24sIChhdXhJbnN0cnVjdGlvbiwgXykgPT4ge1xuICAgICAgcm91dGVzLnB1c2goYXV4SW5zdHJ1Y3Rpb24uX3N0cmluZ2lmeVBhdGhNYXRyaXhBdXgoKSk7XG4gICAgfSk7XG4gICAgaWYgKHJvdXRlcy5sZW5ndGggPiAwKSB7XG4gICAgICByZXR1cm4gJygnICsgcm91dGVzLmpvaW4oJy8vJykgKyAnKSc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbiAgfVxufVxuXG5cbi8qKlxuICogYSByZXNvbHZlZCBpbnN0cnVjdGlvbiBoYXMgYW4gb3V0bGV0IGluc3RydWN0aW9uIGZvciBpdHNlbGYsIGJ1dCBtYXliZSBub3QgZm9yLi4uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvbHZlZEluc3RydWN0aW9uIGV4dGVuZHMgSW5zdHJ1Y3Rpb24ge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50OiBDb21wb25lbnRJbnN0cnVjdGlvbiwgcHVibGljIGNoaWxkOiBJbnN0cnVjdGlvbixcbiAgICAgICAgICAgICAgcHVibGljIGF1eEluc3RydWN0aW9uOiB7W2tleTogc3RyaW5nXTogSW5zdHJ1Y3Rpb259KSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHJlc29sdmVDb21wb25lbnQoKTogUHJvbWlzZTxDb21wb25lbnRJbnN0cnVjdGlvbj4ge1xuICAgIHJldHVybiBQcm9taXNlV3JhcHBlci5yZXNvbHZlKHRoaXMuY29tcG9uZW50KTtcbiAgfVxufVxuXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHJlc29sdmVkIGRlZmF1bHQgcm91dGVcbiAqL1xuZXhwb3J0IGNsYXNzIERlZmF1bHRJbnN0cnVjdGlvbiBleHRlbmRzIEluc3RydWN0aW9uIHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvbXBvbmVudDogQ29tcG9uZW50SW5zdHJ1Y3Rpb24sIHB1YmxpYyBjaGlsZDogRGVmYXVsdEluc3RydWN0aW9uKSB7IHN1cGVyKCk7IH1cblxuICByZXNvbHZlQ29tcG9uZW50KCk6IFByb21pc2U8Q29tcG9uZW50SW5zdHJ1Y3Rpb24+IHtcbiAgICByZXR1cm4gUHJvbWlzZVdyYXBwZXIucmVzb2x2ZSh0aGlzLmNvbXBvbmVudCk7XG4gIH1cblxuICB0b0xpbmtVcmwoKTogc3RyaW5nIHsgcmV0dXJuICcnOyB9XG5cbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdG9MaW5rVXJsKCk6IHN0cmluZyB7IHJldHVybiAnJzsgfVxufVxuXG5cbi8qKlxuICogUmVwcmVzZW50cyBhIGNvbXBvbmVudCB0aGF0IG1heSBuZWVkIHRvIGRvIHNvbWUgcmVkaXJlY3Rpb24gb3IgbGF6eSBsb2FkaW5nIGF0IGEgbGF0ZXIgdGltZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFVucmVzb2x2ZWRJbnN0cnVjdGlvbiBleHRlbmRzIEluc3RydWN0aW9uIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcmVzb2x2ZXI6ICgpID0+IFByb21pc2U8SW5zdHJ1Y3Rpb24+LCBwcml2YXRlIF91cmxQYXRoOiBzdHJpbmcgPSAnJyxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdXJsUGFyYW1zOiBzdHJpbmdbXSA9IENPTlNUX0VYUFIoW10pKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIGdldCB1cmxQYXRoKCk6IHN0cmluZyB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC51cmxQYXRoO1xuICAgIH1cbiAgICBpZiAoaXNQcmVzZW50KHRoaXMuX3VybFBhdGgpKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdXJsUGF0aDtcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgZ2V0IHVybFBhcmFtcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbXBvbmVudC51cmxQYXJhbXM7XG4gICAgfVxuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fdXJsUGFyYW1zKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3VybFBhcmFtcztcbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgcmVzb2x2ZUNvbXBvbmVudCgpOiBQcm9taXNlPENvbXBvbmVudEluc3RydWN0aW9uPiB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLmNvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlV3JhcHBlci5yZXNvbHZlKHRoaXMuY29tcG9uZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX3Jlc29sdmVyKCkudGhlbigocmVzb2x1dGlvbjogSW5zdHJ1Y3Rpb24pID0+IHtcbiAgICAgIHRoaXMuY2hpbGQgPSByZXNvbHV0aW9uLmNoaWxkO1xuICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50ID0gcmVzb2x1dGlvbi5jb21wb25lbnQ7XG4gICAgfSk7XG4gIH1cbn1cblxuXG5leHBvcnQgY2xhc3MgUmVkaXJlY3RJbnN0cnVjdGlvbiBleHRlbmRzIFJlc29sdmVkSW5zdHJ1Y3Rpb24ge1xuICBjb25zdHJ1Y3Rvcihjb21wb25lbnQ6IENvbXBvbmVudEluc3RydWN0aW9uLCBjaGlsZDogSW5zdHJ1Y3Rpb24sXG4gICAgICAgICAgICAgIGF1eEluc3RydWN0aW9uOiB7W2tleTogc3RyaW5nXTogSW5zdHJ1Y3Rpb259KSB7XG4gICAgc3VwZXIoY29tcG9uZW50LCBjaGlsZCwgYXV4SW5zdHJ1Y3Rpb24pO1xuICB9XG59XG5cblxuLyoqXG4gKiBBIGBDb21wb25lbnRJbnN0cnVjdGlvbmAgcmVwcmVzZW50cyB0aGUgcm91dGUgc3RhdGUgZm9yIGEgc2luZ2xlIGNvbXBvbmVudC4gQW4gYEluc3RydWN0aW9uYCBpc1xuICogY29tcG9zZWQgb2YgYSB0cmVlIG9mIHRoZXNlIGBDb21wb25lbnRJbnN0cnVjdGlvbmBzLlxuICpcbiAqIGBDb21wb25lbnRJbnN0cnVjdGlvbnNgIGlzIGEgcHVibGljIEFQSS4gSW5zdGFuY2VzIG9mIGBDb21wb25lbnRJbnN0cnVjdGlvbmAgYXJlIHBhc3NlZFxuICogdG8gcm91dGUgbGlmZWN5Y2xlIGhvb2tzLCBsaWtlIHtAbGluayBDYW5BY3RpdmF0ZX0uXG4gKlxuICogYENvbXBvbmVudEluc3RydWN0aW9uYHMgYXJlIFtodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IYXNoX2NvbnNpbmddKGhhc2ggY29uc2VkKS4gWW91IHNob3VsZFxuICogbmV2ZXIgY29uc3RydWN0IG9uZSB5b3Vyc2VsZiB3aXRoIFwibmV3LlwiIEluc3RlYWQsIHJlbHkgb24ge0BsaW5rIFJvdXRlci9Sb3V0ZVJlY29nbml6ZXJ9IHRvXG4gKiBjb25zdHJ1Y3QgYENvbXBvbmVudEluc3RydWN0aW9uYHMuXG4gKlxuICogWW91IHNob3VsZCBub3QgbW9kaWZ5IHRoaXMgb2JqZWN0LiBJdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBpbW11dGFibGUuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRJbnN0cnVjdGlvbiB7XG4gIHJldXNlOiBib29sZWFuID0gZmFsc2U7XG4gIHB1YmxpYyByb3V0ZURhdGE6IFJvdXRlRGF0YTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgdXJsUGF0aDogc3RyaW5nLCBwdWJsaWMgdXJsUGFyYW1zOiBzdHJpbmdbXSwgZGF0YTogUm91dGVEYXRhLFxuICAgICAgICAgICAgICBwdWJsaWMgY29tcG9uZW50VHlwZSwgcHVibGljIHRlcm1pbmFsOiBib29sZWFuLCBwdWJsaWMgc3BlY2lmaWNpdHk6IG51bWJlcixcbiAgICAgICAgICAgICAgcHVibGljIHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0gPSBudWxsKSB7XG4gICAgdGhpcy5yb3V0ZURhdGEgPSBpc1ByZXNlbnQoZGF0YSkgPyBkYXRhIDogQkxBTktfUk9VVEVfREFUQTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9pbnN0cnVjdGlvbi50c1xuICoqLyIsImltcG9ydCB7XG4gIFJlZ0V4cCxcbiAgUmVnRXhwV3JhcHBlcixcbiAgUmVnRXhwTWF0Y2hlcldyYXBwZXIsXG4gIFN0cmluZ1dyYXBwZXIsXG4gIGlzUHJlc2VudCxcbiAgaXNCbGFua1xufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtNYXAsIE1hcFdyYXBwZXIsIFN0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5cbmltcG9ydCB7VXJsLCBSb290VXJsLCBzZXJpYWxpemVQYXJhbXN9IGZyb20gJy4vdXJsX3BhcnNlcic7XG5cbmNsYXNzIFRvdWNoTWFwIHtcbiAgbWFwOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICBrZXlzOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihtYXA6IHtba2V5OiBzdHJpbmddOiBhbnl9KSB7XG4gICAgaWYgKGlzUHJlc2VudChtYXApKSB7XG4gICAgICBTdHJpbmdNYXBXcmFwcGVyLmZvckVhY2gobWFwLCAodmFsdWUsIGtleSkgPT4ge1xuICAgICAgICB0aGlzLm1hcFtrZXldID0gaXNQcmVzZW50KHZhbHVlKSA/IHZhbHVlLnRvU3RyaW5nKCkgOiBudWxsO1xuICAgICAgICB0aGlzLmtleXNba2V5XSA9IHRydWU7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBnZXQoa2V5OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIFN0cmluZ01hcFdyYXBwZXIuZGVsZXRlKHRoaXMua2V5cywga2V5KTtcbiAgICByZXR1cm4gdGhpcy5tYXBba2V5XTtcbiAgfVxuXG4gIGdldFVudXNlZCgpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgdmFyIHVudXNlZDoge1trZXk6IHN0cmluZ106IGFueX0gPSB7fTtcbiAgICB2YXIga2V5cyA9IFN0cmluZ01hcFdyYXBwZXIua2V5cyh0aGlzLmtleXMpO1xuICAgIGtleXMuZm9yRWFjaChrZXkgPT4gdW51c2VkW2tleV0gPSBTdHJpbmdNYXBXcmFwcGVyLmdldCh0aGlzLm1hcCwga2V5KSk7XG4gICAgcmV0dXJuIHVudXNlZDtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3JtYWxpemVTdHJpbmcob2JqOiBhbnkpOiBzdHJpbmcge1xuICBpZiAoaXNCbGFuayhvYmopKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG9iai50b1N0cmluZygpO1xuICB9XG59XG5cbmludGVyZmFjZSBTZWdtZW50IHtcbiAgbmFtZTogc3RyaW5nO1xuICBnZW5lcmF0ZShwYXJhbXM6IFRvdWNoTWFwKTogc3RyaW5nO1xuICBtYXRjaChwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG5jbGFzcyBDb250aW51YXRpb25TZWdtZW50IGltcGxlbWVudHMgU2VnbWVudCB7XG4gIG5hbWU6IHN0cmluZyA9ICcnO1xuICBnZW5lcmF0ZShwYXJhbXM6IFRvdWNoTWFwKTogc3RyaW5nIHsgcmV0dXJuICcnOyB9XG4gIG1hdGNoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdHJ1ZTsgfVxufVxuXG5jbGFzcyBTdGF0aWNTZWdtZW50IGltcGxlbWVudHMgU2VnbWVudCB7XG4gIG5hbWU6IHN0cmluZyA9ICcnO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcGF0aDogc3RyaW5nKSB7fVxuICBtYXRjaChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHBhdGggPT0gdGhpcy5wYXRoOyB9XG4gIGdlbmVyYXRlKHBhcmFtczogVG91Y2hNYXApOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5wYXRoOyB9XG59XG5cbmNsYXNzIER5bmFtaWNTZWdtZW50IGltcGxlbWVudHMgU2VnbWVudCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBuYW1lOiBzdHJpbmcpIHt9XG4gIG1hdGNoKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gcGF0aC5sZW5ndGggPiAwOyB9XG4gIGdlbmVyYXRlKHBhcmFtczogVG91Y2hNYXApOiBzdHJpbmcge1xuICAgIGlmICghU3RyaW5nTWFwV3JhcHBlci5jb250YWlucyhwYXJhbXMubWFwLCB0aGlzLm5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgUm91dGUgZ2VuZXJhdG9yIGZvciAnJHt0aGlzLm5hbWV9JyB3YXMgbm90IGluY2x1ZGVkIGluIHBhcmFtZXRlcnMgcGFzc2VkLmApO1xuICAgIH1cbiAgICByZXR1cm4gbm9ybWFsaXplU3RyaW5nKHBhcmFtcy5nZXQodGhpcy5uYW1lKSk7XG4gIH1cbn1cblxuXG5jbGFzcyBTdGFyU2VnbWVudCBpbXBsZW1lbnRzIFNlZ21lbnQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7fVxuICBtYXRjaChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRydWU7IH1cbiAgZ2VuZXJhdGUocGFyYW1zOiBUb3VjaE1hcCk6IHN0cmluZyB7IHJldHVybiBub3JtYWxpemVTdHJpbmcocGFyYW1zLmdldCh0aGlzLm5hbWUpKTsgfVxufVxuXG5cbnZhciBwYXJhbU1hdGNoZXIgPSAvXjooW15cXC9dKykkL2c7XG52YXIgd2lsZGNhcmRNYXRjaGVyID0gL15cXCooW15cXC9dKykkL2c7XG5cbmZ1bmN0aW9uIHBhcnNlUGF0aFN0cmluZyhyb3V0ZTogc3RyaW5nKToge1trZXk6IHN0cmluZ106IGFueX0ge1xuICAvLyBub3JtYWxpemUgcm91dGUgYXMgbm90IHN0YXJ0aW5nIHdpdGggYSBcIi9cIi4gUmVjb2duaXRpb24gd2lsbFxuICAvLyBhbHNvIG5vcm1hbGl6ZS5cbiAgaWYgKHJvdXRlLnN0YXJ0c1dpdGgoXCIvXCIpKSB7XG4gICAgcm91dGUgPSByb3V0ZS5zdWJzdHJpbmcoMSk7XG4gIH1cblxuICB2YXIgc2VnbWVudHMgPSBzcGxpdEJ5U2xhc2gocm91dGUpO1xuICB2YXIgcmVzdWx0cyA9IFtdO1xuICB2YXIgc3BlY2lmaWNpdHkgPSAwO1xuXG4gIC8vIFRoZSBcInNwZWNpZmljaXR5XCIgb2YgYSBwYXRoIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIHJvdXRlIGlzIHVzZWQgd2hlbiBtdWx0aXBsZSByb3V0ZXMgbWF0Y2hcbiAgLy8gYSBVUkwuXG4gIC8vIFN0YXRpYyBzZWdtZW50cyAobGlrZSBcIi9mb29cIikgYXJlIHRoZSBtb3N0IHNwZWNpZmljLCBmb2xsb3dlZCBieSBkeW5hbWljIHNlZ21lbnRzIChsaWtlXG4gIC8vIFwiLzppZFwiKS4gU3RhciBzZWdtZW50c1xuICAvLyBhZGQgbm8gc3BlY2lmaWNpdHkuIFNlZ21lbnRzIGF0IHRoZSBzdGFydCBvZiB0aGUgcGF0aCBhcmUgbW9yZSBzcGVjaWZpYyB0aGFuIHByb2NlZWRpbmcgb25lcy5cbiAgLy8gVGhlIGNvZGUgYmVsb3cgdXNlcyBwbGFjZSB2YWx1ZXMgdG8gY29tYmluZSB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIHNlZ21lbnRzIGludG8gYSBzaW5nbGVcbiAgLy8gaW50ZWdlciB0aGF0IHdlIGNhblxuICAvLyBzb3J0IGxhdGVyLiBFYWNoIHN0YXRpYyBzZWdtZW50IGlzIHdvcnRoIGh1bmRyZWRzIG9mIHBvaW50cyBvZiBzcGVjaWZpY2l0eSAoMTAwMDAsIDk5MDAsIC4uLixcbiAgLy8gMjAwKSwgYW5kIGVhY2hcbiAgLy8gZHluYW1pYyBzZWdtZW50IGlzIHdvcnRoIHNpbmdsZSBwb2ludHMgb2Ygc3BlY2lmaWNpdHkgKDEwMCwgOTksIC4uLiAyKS5cbiAgaWYgKHNlZ21lbnRzLmxlbmd0aCA+IDk4KSB7XG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYCcke3JvdXRlfScgaGFzIG1vcmUgdGhhbiB0aGUgbWF4aW11bSBzdXBwb3J0ZWQgbnVtYmVyIG9mIHNlZ21lbnRzLmApO1xuICB9XG5cbiAgdmFyIGxpbWl0ID0gc2VnbWVudHMubGVuZ3RoIC0gMTtcbiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbGltaXQ7IGkrKykge1xuICAgIHZhciBzZWdtZW50ID0gc2VnbWVudHNbaV0sIG1hdGNoO1xuXG4gICAgaWYgKGlzUHJlc2VudChtYXRjaCA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChwYXJhbU1hdGNoZXIsIHNlZ21lbnQpKSkge1xuICAgICAgcmVzdWx0cy5wdXNoKG5ldyBEeW5hbWljU2VnbWVudChtYXRjaFsxXSkpO1xuICAgICAgc3BlY2lmaWNpdHkgKz0gKDEwMCAtIGkpO1xuICAgIH0gZWxzZSBpZiAoaXNQcmVzZW50KG1hdGNoID0gUmVnRXhwV3JhcHBlci5maXJzdE1hdGNoKHdpbGRjYXJkTWF0Y2hlciwgc2VnbWVudCkpKSB7XG4gICAgICByZXN1bHRzLnB1c2gobmV3IFN0YXJTZWdtZW50KG1hdGNoWzFdKSk7XG4gICAgfSBlbHNlIGlmIChzZWdtZW50ID09ICcuLi4nKSB7XG4gICAgICBpZiAoaSA8IGxpbWl0KSB7XG4gICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBVbmV4cGVjdGVkIFwiLi4uXCIgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIHBhdGggZm9yIFwiJHtyb3V0ZX1cIi5gKTtcbiAgICAgIH1cbiAgICAgIHJlc3VsdHMucHVzaChuZXcgQ29udGludWF0aW9uU2VnbWVudCgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0cy5wdXNoKG5ldyBTdGF0aWNTZWdtZW50KHNlZ21lbnQpKTtcbiAgICAgIHNwZWNpZmljaXR5ICs9IDEwMCAqICgxMDAgLSBpKTtcbiAgICB9XG4gIH1cbiAgdmFyIHJlc3VsdCA9IFN0cmluZ01hcFdyYXBwZXIuY3JlYXRlKCk7XG4gIFN0cmluZ01hcFdyYXBwZXIuc2V0KHJlc3VsdCwgJ3NlZ21lbnRzJywgcmVzdWx0cyk7XG4gIFN0cmluZ01hcFdyYXBwZXIuc2V0KHJlc3VsdCwgJ3NwZWNpZmljaXR5Jywgc3BlY2lmaWNpdHkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vLyB0aGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSByb3V0ZSBjb25maWcgcGF0aCBsaWtlIGAvZm9vLzppZGAgY29sbGlkZXMgd2l0aFxuLy8gYC9mb28vOm5hbWVgXG5mdW5jdGlvbiBwYXRoRHNsSGFzaChzZWdtZW50czogU2VnbWVudFtdKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNlZ21lbnRzLm1hcCgoc2VnbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgICAgIGlmIChzZWdtZW50IGluc3RhbmNlb2YgU3RhclNlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnKic7XG4gICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWdtZW50IGluc3RhbmNlb2YgQ29udGludWF0aW9uU2VnbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcuLi4nO1xuICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudCBpbnN0YW5jZW9mIER5bmFtaWNTZWdtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICByZXR1cm4gJzonO1xuICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc2VnbWVudCBpbnN0YW5jZW9mIFN0YXRpY1NlZ21lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWdtZW50LnBhdGg7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICB9KVxuICAgICAgLmpvaW4oJy8nKTtcbn1cblxuZnVuY3Rpb24gc3BsaXRCeVNsYXNoKHVybDogc3RyaW5nKTogc3RyaW5nW10ge1xuICByZXR1cm4gdXJsLnNwbGl0KCcvJyk7XG59XG5cbnZhciBSRVNFUlZFRF9DSEFSUyA9IFJlZ0V4cFdyYXBwZXIuY3JlYXRlKCcvL3xcXFxcKHxcXFxcKXw7fFxcXFw/fD0nKTtcbmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aDogc3RyaW5nKSB7XG4gIGlmIChTdHJpbmdXcmFwcGVyLmNvbnRhaW5zKHBhdGgsICcjJykpIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgYFBhdGggXCIke3BhdGh9XCIgc2hvdWxkIG5vdCBpbmNsdWRlIFwiI1wiLiBVc2UgXCJIYXNoTG9jYXRpb25TdHJhdGVneVwiIGluc3RlYWQuYCk7XG4gIH1cbiAgdmFyIGlsbGVnYWxDaGFyYWN0ZXIgPSBSZWdFeHBXcmFwcGVyLmZpcnN0TWF0Y2goUkVTRVJWRURfQ0hBUlMsIHBhdGgpO1xuICBpZiAoaXNQcmVzZW50KGlsbGVnYWxDaGFyYWN0ZXIpKSB7XG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXG4gICAgICAgIGBQYXRoIFwiJHtwYXRofVwiIGNvbnRhaW5zIFwiJHtpbGxlZ2FsQ2hhcmFjdGVyWzBdfVwiIHdoaWNoIGlzIG5vdCBhbGxvd2VkIGluIGEgcm91dGUgY29uZmlnLmApO1xuICB9XG59XG5cblxuLyoqXG4gKiBQYXJzZXMgYSBVUkwgc3RyaW5nIHVzaW5nIGEgZ2l2ZW4gbWF0Y2hlciBEU0wsIGFuZCBnZW5lcmF0ZXMgVVJMcyBmcm9tIHBhcmFtIG1hcHNcbiAqL1xuZXhwb3J0IGNsYXNzIFBhdGhSZWNvZ25pemVyIHtcbiAgcHJpdmF0ZSBfc2VnbWVudHM6IFNlZ21lbnRbXTtcbiAgc3BlY2lmaWNpdHk6IG51bWJlcjtcbiAgdGVybWluYWw6IGJvb2xlYW4gPSB0cnVlO1xuICBoYXNoOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IocHVibGljIHBhdGg6IHN0cmluZykge1xuICAgIGFzc2VydFBhdGgocGF0aCk7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlUGF0aFN0cmluZyhwYXRoKTtcblxuICAgIHRoaXMuX3NlZ21lbnRzID0gcGFyc2VkWydzZWdtZW50cyddO1xuICAgIHRoaXMuc3BlY2lmaWNpdHkgPSBwYXJzZWRbJ3NwZWNpZmljaXR5J107XG4gICAgdGhpcy5oYXNoID0gcGF0aERzbEhhc2godGhpcy5fc2VnbWVudHMpO1xuXG4gICAgdmFyIGxhc3RTZWdtZW50ID0gdGhpcy5fc2VnbWVudHNbdGhpcy5fc2VnbWVudHMubGVuZ3RoIC0gMV07XG4gICAgdGhpcy50ZXJtaW5hbCA9ICEobGFzdFNlZ21lbnQgaW5zdGFuY2VvZiBDb250aW51YXRpb25TZWdtZW50KTtcbiAgfVxuXG4gIHJlY29nbml6ZShiZWdpbm5pbmdTZWdtZW50OiBVcmwpOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgdmFyIG5leHRTZWdtZW50ID0gYmVnaW5uaW5nU2VnbWVudDtcbiAgICB2YXIgY3VycmVudFNlZ21lbnQ6IFVybDtcbiAgICB2YXIgcG9zaXRpb25hbFBhcmFtcyA9IHt9O1xuICAgIHZhciBjYXB0dXJlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWdtZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgdmFyIHNlZ21lbnQgPSB0aGlzLl9zZWdtZW50c1tpXTtcblxuICAgICAgY3VycmVudFNlZ21lbnQgPSBuZXh0U2VnbWVudDtcbiAgICAgIGlmIChzZWdtZW50IGluc3RhbmNlb2YgQ29udGludWF0aW9uU2VnbWVudCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgaWYgKGlzUHJlc2VudChjdXJyZW50U2VnbWVudCkpIHtcbiAgICAgICAgY2FwdHVyZWQucHVzaChjdXJyZW50U2VnbWVudC5wYXRoKTtcblxuICAgICAgICAvLyB0aGUgc3RhciBzZWdtZW50IGNvbnN1bWVzIGFsbCBvZiB0aGUgcmVtYWluaW5nIFVSTCwgaW5jbHVkaW5nIG1hdHJpeCBwYXJhbXNcbiAgICAgICAgaWYgKHNlZ21lbnQgaW5zdGFuY2VvZiBTdGFyU2VnbWVudCkge1xuICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbXNbc2VnbWVudC5uYW1lXSA9IGN1cnJlbnRTZWdtZW50LnRvU3RyaW5nKCk7XG4gICAgICAgICAgbmV4dFNlZ21lbnQgPSBudWxsO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHNlZ21lbnQgaW5zdGFuY2VvZiBEeW5hbWljU2VnbWVudCkge1xuICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbXNbc2VnbWVudC5uYW1lXSA9IGN1cnJlbnRTZWdtZW50LnBhdGg7XG4gICAgICAgIH0gZWxzZSBpZiAoIXNlZ21lbnQubWF0Y2goY3VycmVudFNlZ21lbnQucGF0aCkpIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRTZWdtZW50ID0gY3VycmVudFNlZ21lbnQuY2hpbGQ7XG4gICAgICB9IGVsc2UgaWYgKCFzZWdtZW50Lm1hdGNoKCcnKSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZXJtaW5hbCAmJiBpc1ByZXNlbnQobmV4dFNlZ21lbnQpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdXJsUGF0aCA9IGNhcHR1cmVkLmpvaW4oJy8nKTtcblxuICAgIHZhciBhdXhpbGlhcnk7XG4gICAgdmFyIHVybFBhcmFtcztcbiAgICB2YXIgYWxsUGFyYW1zO1xuICAgIGlmIChpc1ByZXNlbnQoY3VycmVudFNlZ21lbnQpKSB7XG4gICAgICAvLyBJZiB0aGlzIGlzIHRoZSByb290IGNvbXBvbmVudCwgcmVhZCBxdWVyeSBwYXJhbXMuIE90aGVyd2lzZSwgcmVhZCBtYXRyaXggcGFyYW1zLlxuICAgICAgdmFyIHBhcmFtc1NlZ21lbnQgPSBiZWdpbm5pbmdTZWdtZW50IGluc3RhbmNlb2YgUm9vdFVybCA/IGJlZ2lubmluZ1NlZ21lbnQgOiBjdXJyZW50U2VnbWVudDtcblxuICAgICAgYWxsUGFyYW1zID0gaXNQcmVzZW50KHBhcmFtc1NlZ21lbnQucGFyYW1zKSA/XG4gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTWFwV3JhcHBlci5tZXJnZShwYXJhbXNTZWdtZW50LnBhcmFtcywgcG9zaXRpb25hbFBhcmFtcykgOlxuICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uYWxQYXJhbXM7XG5cbiAgICAgIHVybFBhcmFtcyA9IHNlcmlhbGl6ZVBhcmFtcyhwYXJhbXNTZWdtZW50LnBhcmFtcyk7XG5cblxuICAgICAgYXV4aWxpYXJ5ID0gY3VycmVudFNlZ21lbnQuYXV4aWxpYXJ5O1xuICAgIH0gZWxzZSB7XG4gICAgICBhbGxQYXJhbXMgPSBwb3NpdGlvbmFsUGFyYW1zO1xuICAgICAgYXV4aWxpYXJ5ID0gW107XG4gICAgICB1cmxQYXJhbXMgPSBbXTtcbiAgICB9XG4gICAgcmV0dXJuIHt1cmxQYXRoLCB1cmxQYXJhbXMsIGFsbFBhcmFtcywgYXV4aWxpYXJ5LCBuZXh0U2VnbWVudH07XG4gIH1cblxuXG4gIGdlbmVyYXRlKHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0pOiB7W2tleTogc3RyaW5nXTogYW55fSB7XG4gICAgdmFyIHBhcmFtVG9rZW5zID0gbmV3IFRvdWNoTWFwKHBhcmFtcyk7XG5cbiAgICB2YXIgcGF0aCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zZWdtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLl9zZWdtZW50c1tpXTtcbiAgICAgIGlmICghKHNlZ21lbnQgaW5zdGFuY2VvZiBDb250aW51YXRpb25TZWdtZW50KSkge1xuICAgICAgICBwYXRoLnB1c2goc2VnbWVudC5nZW5lcmF0ZShwYXJhbVRva2VucykpO1xuICAgICAgfVxuICAgIH1cbiAgICB2YXIgdXJsUGF0aCA9IHBhdGguam9pbignLycpO1xuXG4gICAgdmFyIG5vblBvc2l0aW9uYWxQYXJhbXMgPSBwYXJhbVRva2Vucy5nZXRVbnVzZWQoKTtcbiAgICB2YXIgdXJsUGFyYW1zID0gc2VyaWFsaXplUGFyYW1zKG5vblBvc2l0aW9uYWxQYXJhbXMpO1xuXG4gICAgcmV0dXJuIHt1cmxQYXRoLCB1cmxQYXJhbXN9O1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL3BhdGhfcmVjb2duaXplci50c1xuICoqLyIsImltcG9ydCB7U3RyaW5nTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7aXNQcmVzZW50LCBpc0JsYW5rLCBSZWdFeHBXcmFwcGVyLCBDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuXG4vKipcbiAqIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHBhcnNlZCBVUkxcbiAqL1xuZXhwb3J0IGNsYXNzIFVybCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwYXRoOiBzdHJpbmcsIHB1YmxpYyBjaGlsZDogVXJsID0gbnVsbCxcbiAgICAgICAgICAgICAgcHVibGljIGF1eGlsaWFyeTogVXJsW10gPSBDT05TVF9FWFBSKFtdKSxcbiAgICAgICAgICAgICAgcHVibGljIHBhcmFtczoge1trZXk6IHN0cmluZ106IGFueX0gPSBudWxsKSB7fVxuXG4gIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGF0aCArIHRoaXMuX21hdHJpeFBhcmFtc1RvU3RyaW5nKCkgKyB0aGlzLl9hdXhUb1N0cmluZygpICsgdGhpcy5fY2hpbGRTdHJpbmcoKTtcbiAgfVxuXG4gIHNlZ21lbnRUb1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5wYXRoICsgdGhpcy5fbWF0cml4UGFyYW1zVG9TdHJpbmcoKTsgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2F1eFRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuYXV4aWxpYXJ5Lmxlbmd0aCA+IDAgP1xuICAgICAgICAgICAgICAgKCcoJyArIHRoaXMuYXV4aWxpYXJ5Lm1hcChzaWJsaW5nID0+IHNpYmxpbmcudG9TdHJpbmcoKSkuam9pbignLy8nKSArICcpJykgOlxuICAgICAgICAgICAgICAgJyc7XG4gIH1cblxuICBwcml2YXRlIF9tYXRyaXhQYXJhbXNUb1N0cmluZygpOiBzdHJpbmcge1xuICAgIGlmIChpc0JsYW5rKHRoaXMucGFyYW1zKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiAnOycgKyBzZXJpYWxpemVQYXJhbXModGhpcy5wYXJhbXMpLmpvaW4oJzsnKTtcbiAgfVxuXG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NoaWxkU3RyaW5nKCk6IHN0cmluZyB7IHJldHVybiBpc1ByZXNlbnQodGhpcy5jaGlsZCkgPyAoJy8nICsgdGhpcy5jaGlsZC50b1N0cmluZygpKSA6ICcnOyB9XG59XG5cbmV4cG9ydCBjbGFzcyBSb290VXJsIGV4dGVuZHMgVXJsIHtcbiAgY29uc3RydWN0b3IocGF0aDogc3RyaW5nLCBjaGlsZDogVXJsID0gbnVsbCwgYXV4aWxpYXJ5OiBVcmxbXSA9IENPTlNUX0VYUFIoW10pLFxuICAgICAgICAgICAgICBwYXJhbXM6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0gbnVsbCkge1xuICAgIHN1cGVyKHBhdGgsIGNoaWxkLCBhdXhpbGlhcnksIHBhcmFtcyk7XG4gIH1cblxuICB0b1N0cmluZygpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnBhdGggKyB0aGlzLl9hdXhUb1N0cmluZygpICsgdGhpcy5fY2hpbGRTdHJpbmcoKSArIHRoaXMuX3F1ZXJ5UGFyYW1zVG9TdHJpbmcoKTtcbiAgfVxuXG4gIHNlZ21lbnRUb1N0cmluZygpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5wYXRoICsgdGhpcy5fcXVlcnlQYXJhbXNUb1N0cmluZygpOyB9XG5cbiAgcHJpdmF0ZSBfcXVlcnlQYXJhbXNUb1N0cmluZygpOiBzdHJpbmcge1xuICAgIGlmIChpc0JsYW5rKHRoaXMucGFyYW1zKSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHJldHVybiAnPycgKyBzZXJpYWxpemVQYXJhbXModGhpcy5wYXJhbXMpLmpvaW4oJyYnKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGF0aFNlZ21lbnRzVG9VcmwocGF0aFNlZ21lbnRzOiBzdHJpbmdbXSk6IFVybCB7XG4gIHZhciB1cmwgPSBuZXcgVXJsKHBhdGhTZWdtZW50c1twYXRoU2VnbWVudHMubGVuZ3RoIC0gMV0pO1xuICBmb3IgKHZhciBpID0gcGF0aFNlZ21lbnRzLmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAxKSB7XG4gICAgdXJsID0gbmV3IFVybChwYXRoU2VnbWVudHNbaV0sIHVybCk7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn1cblxudmFyIFNFR01FTlRfUkUgPSBSZWdFeHBXcmFwcGVyLmNyZWF0ZSgnXlteXFxcXC9cXFxcKFxcXFwpXFxcXD87PSYjXSsnKTtcbmZ1bmN0aW9uIG1hdGNoVXJsU2VnbWVudChzdHI6IHN0cmluZyk6IHN0cmluZyB7XG4gIHZhciBtYXRjaCA9IFJlZ0V4cFdyYXBwZXIuZmlyc3RNYXRjaChTRUdNRU5UX1JFLCBzdHIpO1xuICByZXR1cm4gaXNQcmVzZW50KG1hdGNoKSA/IG1hdGNoWzBdIDogJyc7XG59XG5cbmV4cG9ydCBjbGFzcyBVcmxQYXJzZXIge1xuICBwcml2YXRlIF9yZW1haW5pbmc6IHN0cmluZztcblxuICBwZWVrU3RhcnRzV2l0aChzdHI6IHN0cmluZyk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fcmVtYWluaW5nLnN0YXJ0c1dpdGgoc3RyKTsgfVxuXG4gIGNhcHR1cmUoc3RyOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3JlbWFpbmluZy5zdGFydHNXaXRoKHN0cikpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBFeHBlY3RlZCBcIiR7c3RyfVwiLmApO1xuICAgIH1cbiAgICB0aGlzLl9yZW1haW5pbmcgPSB0aGlzLl9yZW1haW5pbmcuc3Vic3RyaW5nKHN0ci5sZW5ndGgpO1xuICB9XG5cbiAgcGFyc2UodXJsOiBzdHJpbmcpOiBVcmwge1xuICAgIHRoaXMuX3JlbWFpbmluZyA9IHVybDtcbiAgICBpZiAodXJsID09ICcnIHx8IHVybCA9PSAnLycpIHtcbiAgICAgIHJldHVybiBuZXcgVXJsKCcnKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucGFyc2VSb290KCk7XG4gIH1cblxuICAvLyBzZWdtZW50ICsgKGF1eCBzZWdtZW50cykgKyAocXVlcnkgcGFyYW1zKVxuICBwYXJzZVJvb3QoKTogVXJsIHtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICB0aGlzLmNhcHR1cmUoJy8nKTtcbiAgICB9XG4gICAgdmFyIHBhdGggPSBtYXRjaFVybFNlZ21lbnQodGhpcy5fcmVtYWluaW5nKTtcbiAgICB0aGlzLmNhcHR1cmUocGF0aCk7XG5cbiAgICB2YXIgYXV4ID0gW107XG4gICAgaWYgKHRoaXMucGVla1N0YXJ0c1dpdGgoJygnKSkge1xuICAgICAgYXV4ID0gdGhpcy5wYXJzZUF1eGlsaWFyeVJvdXRlcygpO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnOycpKSB7XG4gICAgICAvLyBUT0RPOiBzaG91bGQgdGhlc2UgcGFyYW1zIGp1c3QgYmUgZHJvcHBlZD9cbiAgICAgIHRoaXMucGFyc2VNYXRyaXhQYXJhbXMoKTtcbiAgICB9XG4gICAgdmFyIGNoaWxkID0gbnVsbDtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnLycpICYmICF0aGlzLnBlZWtTdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICB0aGlzLmNhcHR1cmUoJy8nKTtcbiAgICAgIGNoaWxkID0gdGhpcy5wYXJzZVNlZ21lbnQoKTtcbiAgICB9XG4gICAgdmFyIHF1ZXJ5UGFyYW1zID0gbnVsbDtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnPycpKSB7XG4gICAgICBxdWVyeVBhcmFtcyA9IHRoaXMucGFyc2VRdWVyeVBhcmFtcygpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IFJvb3RVcmwocGF0aCwgY2hpbGQsIGF1eCwgcXVlcnlQYXJhbXMpO1xuICB9XG5cbiAgLy8gc2VnbWVudCArIChtYXRyaXggcGFyYW1zKSArIChhdXggc2VnbWVudHMpXG4gIHBhcnNlU2VnbWVudCgpOiBVcmwge1xuICAgIGlmICh0aGlzLl9yZW1haW5pbmcubGVuZ3RoID09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnLycpKSB7XG4gICAgICB0aGlzLmNhcHR1cmUoJy8nKTtcbiAgICB9XG4gICAgdmFyIHBhdGggPSBtYXRjaFVybFNlZ21lbnQodGhpcy5fcmVtYWluaW5nKTtcbiAgICB0aGlzLmNhcHR1cmUocGF0aCk7XG5cbiAgICB2YXIgbWF0cml4UGFyYW1zID0gbnVsbDtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnOycpKSB7XG4gICAgICBtYXRyaXhQYXJhbXMgPSB0aGlzLnBhcnNlTWF0cml4UGFyYW1zKCk7XG4gICAgfVxuICAgIHZhciBhdXggPSBbXTtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnKCcpKSB7XG4gICAgICBhdXggPSB0aGlzLnBhcnNlQXV4aWxpYXJ5Um91dGVzKCk7XG4gICAgfVxuICAgIHZhciBjaGlsZCA9IG51bGw7XG4gICAgaWYgKHRoaXMucGVla1N0YXJ0c1dpdGgoJy8nKSAmJiAhdGhpcy5wZWVrU3RhcnRzV2l0aCgnLy8nKSkge1xuICAgICAgdGhpcy5jYXB0dXJlKCcvJyk7XG4gICAgICBjaGlsZCA9IHRoaXMucGFyc2VTZWdtZW50KCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVXJsKHBhdGgsIGNoaWxkLCBhdXgsIG1hdHJpeFBhcmFtcyk7XG4gIH1cblxuICBwYXJzZVF1ZXJ5UGFyYW1zKCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgdGhpcy5jYXB0dXJlKCc/Jyk7XG4gICAgdGhpcy5wYXJzZVBhcmFtKHBhcmFtcyk7XG4gICAgd2hpbGUgKHRoaXMuX3JlbWFpbmluZy5sZW5ndGggPiAwICYmIHRoaXMucGVla1N0YXJ0c1dpdGgoJyYnKSkge1xuICAgICAgdGhpcy5jYXB0dXJlKCcmJyk7XG4gICAgICB0aGlzLnBhcnNlUGFyYW0ocGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHBhcnNlTWF0cml4UGFyYW1zKCk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICB2YXIgcGFyYW1zID0ge307XG4gICAgd2hpbGUgKHRoaXMuX3JlbWFpbmluZy5sZW5ndGggPiAwICYmIHRoaXMucGVla1N0YXJ0c1dpdGgoJzsnKSkge1xuICAgICAgdGhpcy5jYXB0dXJlKCc7Jyk7XG4gICAgICB0aGlzLnBhcnNlUGFyYW0ocGFyYW1zKTtcbiAgICB9XG4gICAgcmV0dXJuIHBhcmFtcztcbiAgfVxuXG4gIHBhcnNlUGFyYW0ocGFyYW1zOiB7W2tleTogc3RyaW5nXTogYW55fSk6IHZvaWQge1xuICAgIHZhciBrZXkgPSBtYXRjaFVybFNlZ21lbnQodGhpcy5fcmVtYWluaW5nKTtcbiAgICBpZiAoaXNCbGFuayhrZXkpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuY2FwdHVyZShrZXkpO1xuICAgIHZhciB2YWx1ZTogYW55ID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5wZWVrU3RhcnRzV2l0aCgnPScpKSB7XG4gICAgICB0aGlzLmNhcHR1cmUoJz0nKTtcbiAgICAgIHZhciB2YWx1ZU1hdGNoID0gbWF0Y2hVcmxTZWdtZW50KHRoaXMuX3JlbWFpbmluZyk7XG4gICAgICBpZiAoaXNQcmVzZW50KHZhbHVlTWF0Y2gpKSB7XG4gICAgICAgIHZhbHVlID0gdmFsdWVNYXRjaDtcbiAgICAgICAgdGhpcy5jYXB0dXJlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJhbXNba2V5XSA9IHZhbHVlO1xuICB9XG5cbiAgcGFyc2VBdXhpbGlhcnlSb3V0ZXMoKTogVXJsW10ge1xuICAgIHZhciByb3V0ZXMgPSBbXTtcbiAgICB0aGlzLmNhcHR1cmUoJygnKTtcblxuICAgIHdoaWxlICghdGhpcy5wZWVrU3RhcnRzV2l0aCgnKScpICYmIHRoaXMuX3JlbWFpbmluZy5sZW5ndGggPiAwKSB7XG4gICAgICByb3V0ZXMucHVzaCh0aGlzLnBhcnNlU2VnbWVudCgpKTtcbiAgICAgIGlmICh0aGlzLnBlZWtTdGFydHNXaXRoKCcvLycpKSB7XG4gICAgICAgIHRoaXMuY2FwdHVyZSgnLy8nKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5jYXB0dXJlKCcpJyk7XG5cbiAgICByZXR1cm4gcm91dGVzO1xuICB9XG59XG5cbmV4cG9ydCB2YXIgcGFyc2VyID0gbmV3IFVybFBhcnNlcigpO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplUGFyYW1zKHBhcmFtTWFwOiB7W2tleTogc3RyaW5nXTogYW55fSk6IHN0cmluZ1tdIHtcbiAgdmFyIHBhcmFtcyA9IFtdO1xuICBpZiAoaXNQcmVzZW50KHBhcmFtTWFwKSkge1xuICAgIFN0cmluZ01hcFdyYXBwZXIuZm9yRWFjaChwYXJhbU1hcCwgKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIGlmICh2YWx1ZSA9PSB0cnVlKSB7XG4gICAgICAgIHBhcmFtcy5wdXNoKGtleSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJhbXMucHVzaChrZXkgKyAnPScgKyB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvdXJsX3BhcnNlci50c1xuICoqLyIsImltcG9ydCB7aXNCbGFuaywgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtNYXAsIE1hcFdyYXBwZXIsIExpc3RXcmFwcGVyLCBTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtQcm9taXNlLCBQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cbmltcG9ydCB7XG4gIEFic3RyYWN0UmVjb2duaXplcixcbiAgUm91dGVSZWNvZ25pemVyLFxuICBSZWRpcmVjdFJlY29nbml6ZXIsXG4gIFJvdXRlTWF0Y2hcbn0gZnJvbSAnLi9yb3V0ZV9yZWNvZ25pemVyJztcbmltcG9ydCB7Um91dGUsIEFzeW5jUm91dGUsIEF1eFJvdXRlLCBSZWRpcmVjdCwgUm91dGVEZWZpbml0aW9ufSBmcm9tICcuL3JvdXRlX2NvbmZpZ19pbXBsJztcbmltcG9ydCB7QXN5bmNSb3V0ZUhhbmRsZXJ9IGZyb20gJy4vYXN5bmNfcm91dGVfaGFuZGxlcic7XG5pbXBvcnQge1N5bmNSb3V0ZUhhbmRsZXJ9IGZyb20gJy4vc3luY19yb3V0ZV9oYW5kbGVyJztcbmltcG9ydCB7VXJsfSBmcm9tICcuL3VybF9wYXJzZXInO1xuaW1wb3J0IHtDb21wb25lbnRJbnN0cnVjdGlvbn0gZnJvbSAnLi9pbnN0cnVjdGlvbic7XG5cblxuLyoqXG4gKiBgQ29tcG9uZW50UmVjb2duaXplcmAgaXMgcmVzcG9uc2libGUgZm9yIHJlY29nbml6aW5nIHJvdXRlcyBmb3IgYSBzaW5nbGUgY29tcG9uZW50LlxuICogSXQgaXMgY29uc3VtZWQgYnkgYFJvdXRlUmVnaXN0cnlgLCB3aGljaCBrbm93cyBob3cgdG8gcmVjb2duaXplIGFuIGVudGlyZSBoaWVyYXJjaHkgb2ZcbiAqIGNvbXBvbmVudHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb21wb25lbnRSZWNvZ25pemVyIHtcbiAgbmFtZXMgPSBuZXcgTWFwPHN0cmluZywgUm91dGVSZWNvZ25pemVyPigpO1xuXG4gIC8vIG1hcCBmcm9tIG5hbWUgdG8gcmVjb2duaXplclxuICBhdXhOYW1lcyA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZVJlY29nbml6ZXI+KCk7XG5cbiAgLy8gbWFwIGZyb20gc3RhcnRpbmcgcGF0aCB0byByZWNvZ25pemVyXG4gIGF1eFJvdXRlcyA9IG5ldyBNYXA8c3RyaW5nLCBSb3V0ZVJlY29nbml6ZXI+KCk7XG5cbiAgLy8gVE9ETzogb3B0aW1pemUgdGhpcyBpbnRvIGEgdHJpZVxuICBtYXRjaGVyczogQWJzdHJhY3RSZWNvZ25pemVyW10gPSBbXTtcblxuICBkZWZhdWx0Um91dGU6IFJvdXRlUmVjb2duaXplciA9IG51bGw7XG5cbiAgLyoqXG4gICAqIHJldHVybnMgd2hldGhlciBvciBub3QgdGhlIGNvbmZpZyBpcyB0ZXJtaW5hbFxuICAgKi9cbiAgY29uZmlnKGNvbmZpZzogUm91dGVEZWZpbml0aW9uKTogYm9vbGVhbiB7XG4gICAgdmFyIGhhbmRsZXI7XG5cbiAgICBpZiAoaXNQcmVzZW50KGNvbmZpZy5uYW1lKSAmJiBjb25maWcubmFtZVswXS50b1VwcGVyQ2FzZSgpICE9IGNvbmZpZy5uYW1lWzBdKSB7XG4gICAgICB2YXIgc3VnZ2VzdGVkTmFtZSA9IGNvbmZpZy5uYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBjb25maWcubmFtZS5zdWJzdHJpbmcoMSk7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgUm91dGUgXCIke2NvbmZpZy5wYXRofVwiIHdpdGggbmFtZSBcIiR7Y29uZmlnLm5hbWV9XCIgZG9lcyBub3QgYmVnaW4gd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyLiBSb3V0ZSBuYW1lcyBzaG91bGQgYmUgQ2FtZWxDYXNlIGxpa2UgXCIke3N1Z2dlc3RlZE5hbWV9XCIuYCk7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZyBpbnN0YW5jZW9mIEF1eFJvdXRlKSB7XG4gICAgICBoYW5kbGVyID0gbmV3IFN5bmNSb3V0ZUhhbmRsZXIoY29uZmlnLmNvbXBvbmVudCwgY29uZmlnLmRhdGEpO1xuICAgICAgbGV0IHBhdGggPSBjb25maWcucGF0aC5zdGFydHNXaXRoKCcvJykgPyBjb25maWcucGF0aC5zdWJzdHJpbmcoMSkgOiBjb25maWcucGF0aDtcbiAgICAgIHZhciByZWNvZ25pemVyID0gbmV3IFJvdXRlUmVjb2duaXplcihjb25maWcucGF0aCwgaGFuZGxlcik7XG4gICAgICB0aGlzLmF1eFJvdXRlcy5zZXQocGF0aCwgcmVjb2duaXplcik7XG4gICAgICBpZiAoaXNQcmVzZW50KGNvbmZpZy5uYW1lKSkge1xuICAgICAgICB0aGlzLmF1eE5hbWVzLnNldChjb25maWcubmFtZSwgcmVjb2duaXplcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVjb2duaXplci50ZXJtaW5hbDtcbiAgICB9XG5cbiAgICB2YXIgdXNlQXNEZWZhdWx0ID0gZmFsc2U7XG5cbiAgICBpZiAoY29uZmlnIGluc3RhbmNlb2YgUmVkaXJlY3QpIHtcbiAgICAgIGxldCByZWRpcmVjdG9yID0gbmV3IFJlZGlyZWN0UmVjb2duaXplcihjb25maWcucGF0aCwgY29uZmlnLnJlZGlyZWN0VG8pO1xuICAgICAgdGhpcy5fYXNzZXJ0Tm9IYXNoQ29sbGlzaW9uKHJlZGlyZWN0b3IuaGFzaCwgY29uZmlnLnBhdGgpO1xuICAgICAgdGhpcy5tYXRjaGVycy5wdXNoKHJlZGlyZWN0b3IpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGNvbmZpZyBpbnN0YW5jZW9mIFJvdXRlKSB7XG4gICAgICBoYW5kbGVyID0gbmV3IFN5bmNSb3V0ZUhhbmRsZXIoY29uZmlnLmNvbXBvbmVudCwgY29uZmlnLmRhdGEpO1xuICAgICAgdXNlQXNEZWZhdWx0ID0gaXNQcmVzZW50KGNvbmZpZy51c2VBc0RlZmF1bHQpICYmIGNvbmZpZy51c2VBc0RlZmF1bHQ7XG4gICAgfSBlbHNlIGlmIChjb25maWcgaW5zdGFuY2VvZiBBc3luY1JvdXRlKSB7XG4gICAgICBoYW5kbGVyID0gbmV3IEFzeW5jUm91dGVIYW5kbGVyKGNvbmZpZy5sb2FkZXIsIGNvbmZpZy5kYXRhKTtcbiAgICAgIHVzZUFzRGVmYXVsdCA9IGlzUHJlc2VudChjb25maWcudXNlQXNEZWZhdWx0KSAmJiBjb25maWcudXNlQXNEZWZhdWx0O1xuICAgIH1cbiAgICB2YXIgcmVjb2duaXplciA9IG5ldyBSb3V0ZVJlY29nbml6ZXIoY29uZmlnLnBhdGgsIGhhbmRsZXIpO1xuXG4gICAgdGhpcy5fYXNzZXJ0Tm9IYXNoQ29sbGlzaW9uKHJlY29nbml6ZXIuaGFzaCwgY29uZmlnLnBhdGgpO1xuXG4gICAgaWYgKHVzZUFzRGVmYXVsdCkge1xuICAgICAgaWYgKGlzUHJlc2VudCh0aGlzLmRlZmF1bHRSb3V0ZSkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYE9ubHkgb25lIHJvdXRlIGNhbiBiZSBkZWZhdWx0YCk7XG4gICAgICB9XG4gICAgICB0aGlzLmRlZmF1bHRSb3V0ZSA9IHJlY29nbml6ZXI7XG4gICAgfVxuXG4gICAgdGhpcy5tYXRjaGVycy5wdXNoKHJlY29nbml6ZXIpO1xuICAgIGlmIChpc1ByZXNlbnQoY29uZmlnLm5hbWUpKSB7XG4gICAgICB0aGlzLm5hbWVzLnNldChjb25maWcubmFtZSwgcmVjb2duaXplcik7XG4gICAgfVxuICAgIHJldHVybiByZWNvZ25pemVyLnRlcm1pbmFsO1xuICB9XG5cblxuICBwcml2YXRlIF9hc3NlcnROb0hhc2hDb2xsaXNpb24oaGFzaDogc3RyaW5nLCBwYXRoKSB7XG4gICAgdGhpcy5tYXRjaGVycy5mb3JFYWNoKChtYXRjaGVyKSA9PiB7XG4gICAgICBpZiAoaGFzaCA9PSBtYXRjaGVyLmhhc2gpIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXG4gICAgICAgICAgICBgQ29uZmlndXJhdGlvbiAnJHtwYXRofScgY29uZmxpY3RzIHdpdGggZXhpc3Rpbmcgcm91dGUgJyR7bWF0Y2hlci5wYXRofSdgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgVVJMLCByZXR1cm5zIGEgbGlzdCBvZiBgUm91dGVNYXRjaGBlcywgd2hpY2ggYXJlIHBhcnRpYWwgcmVjb2duaXRpb25zIGZvciBzb21lIHJvdXRlLlxuICAgKi9cbiAgcmVjb2duaXplKHVybFBhcnNlOiBVcmwpOiBQcm9taXNlPFJvdXRlTWF0Y2g+W10ge1xuICAgIHZhciBzb2x1dGlvbnMgPSBbXTtcblxuICAgIHRoaXMubWF0Y2hlcnMuZm9yRWFjaCgocm91dGVSZWNvZ25pemVyOiBBYnN0cmFjdFJlY29nbml6ZXIpID0+IHtcbiAgICAgIHZhciBwYXRoTWF0Y2ggPSByb3V0ZVJlY29nbml6ZXIucmVjb2duaXplKHVybFBhcnNlKTtcblxuICAgICAgaWYgKGlzUHJlc2VudChwYXRoTWF0Y2gpKSB7XG4gICAgICAgIHNvbHV0aW9ucy5wdXNoKHBhdGhNYXRjaCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc29sdXRpb25zO1xuICB9XG5cbiAgcmVjb2duaXplQXV4aWxpYXJ5KHVybFBhcnNlOiBVcmwpOiBQcm9taXNlPFJvdXRlTWF0Y2g+W10ge1xuICAgIHZhciByb3V0ZVJlY29nbml6ZXI6IFJvdXRlUmVjb2duaXplciA9IHRoaXMuYXV4Um91dGVzLmdldCh1cmxQYXJzZS5wYXRoKTtcbiAgICBpZiAoaXNQcmVzZW50KHJvdXRlUmVjb2duaXplcikpIHtcbiAgICAgIHJldHVybiBbcm91dGVSZWNvZ25pemVyLnJlY29nbml6ZSh1cmxQYXJzZSldO1xuICAgIH1cblxuICAgIHJldHVybiBbUHJvbWlzZVdyYXBwZXIucmVzb2x2ZShudWxsKV07XG4gIH1cblxuICBoYXNSb3V0ZShuYW1lOiBzdHJpbmcpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMubmFtZXMuaGFzKG5hbWUpOyB9XG5cbiAgY29tcG9uZW50TG9hZGVkKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmhhc1JvdXRlKG5hbWUpICYmIGlzUHJlc2VudCh0aGlzLm5hbWVzLmdldChuYW1lKS5oYW5kbGVyLmNvbXBvbmVudFR5cGUpO1xuICB9XG5cbiAgbG9hZENvbXBvbmVudChuYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLm5hbWVzLmdldChuYW1lKS5oYW5kbGVyLnJlc29sdmVDb21wb25lbnRUeXBlKCk7XG4gIH1cblxuICBnZW5lcmF0ZShuYW1lOiBzdHJpbmcsIHBhcmFtczogYW55KTogQ29tcG9uZW50SW5zdHJ1Y3Rpb24ge1xuICAgIHZhciBwYXRoUmVjb2duaXplcjogUm91dGVSZWNvZ25pemVyID0gdGhpcy5uYW1lcy5nZXQobmFtZSk7XG4gICAgaWYgKGlzQmxhbmsocGF0aFJlY29nbml6ZXIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhSZWNvZ25pemVyLmdlbmVyYXRlKHBhcmFtcyk7XG4gIH1cblxuICBnZW5lcmF0ZUF1eGlsaWFyeShuYW1lOiBzdHJpbmcsIHBhcmFtczogYW55KTogQ29tcG9uZW50SW5zdHJ1Y3Rpb24ge1xuICAgIHZhciBwYXRoUmVjb2duaXplcjogUm91dGVSZWNvZ25pemVyID0gdGhpcy5hdXhOYW1lcy5nZXQobmFtZSk7XG4gICAgaWYgKGlzQmxhbmsocGF0aFJlY29nbml6ZXIpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHBhdGhSZWNvZ25pemVyLmdlbmVyYXRlKHBhcmFtcyk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvY29tcG9uZW50X3JlY29nbml6ZXIudHNcbiAqKi8iLCJpbXBvcnQge1Byb21pc2UsIFByb21pc2VXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7aXNQcmVzZW50LCBUeXBlfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge1JvdXRlSGFuZGxlcn0gZnJvbSAnLi9yb3V0ZV9oYW5kbGVyJztcbmltcG9ydCB7Um91dGVEYXRhLCBCTEFOS19ST1VURV9EQVRBfSBmcm9tICcuL2luc3RydWN0aW9uJztcblxuXG5leHBvcnQgY2xhc3MgQXN5bmNSb3V0ZUhhbmRsZXIgaW1wbGVtZW50cyBSb3V0ZUhhbmRsZXIge1xuICAvKiogQGludGVybmFsICovXG4gIF9yZXNvbHZlZENvbXBvbmVudDogUHJvbWlzZTxhbnk+ID0gbnVsbDtcbiAgY29tcG9uZW50VHlwZTogVHlwZTtcbiAgcHVibGljIGRhdGE6IFJvdXRlRGF0YTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9sb2FkZXI6IEZ1bmN0aW9uLCBkYXRhOiB7W2tleTogc3RyaW5nXTogYW55fSA9IG51bGwpIHtcbiAgICB0aGlzLmRhdGEgPSBpc1ByZXNlbnQoZGF0YSkgPyBuZXcgUm91dGVEYXRhKGRhdGEpIDogQkxBTktfUk9VVEVfREFUQTtcbiAgfVxuXG4gIHJlc29sdmVDb21wb25lbnRUeXBlKCk6IFByb21pc2U8YW55PiB7XG4gICAgaWYgKGlzUHJlc2VudCh0aGlzLl9yZXNvbHZlZENvbXBvbmVudCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZXNvbHZlZENvbXBvbmVudDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fcmVzb2x2ZWRDb21wb25lbnQgPSB0aGlzLl9sb2FkZXIoKS50aGVuKChjb21wb25lbnRUeXBlKSA9PiB7XG4gICAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlO1xuICAgICAgcmV0dXJuIGNvbXBvbmVudFR5cGU7XG4gICAgfSk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvYXN5bmNfcm91dGVfaGFuZGxlci50c1xuICoqLyIsImltcG9ydCB7UHJvbWlzZSwgUHJvbWlzZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtpc1ByZXNlbnQsIFR5cGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbmltcG9ydCB7Um91dGVIYW5kbGVyfSBmcm9tICcuL3JvdXRlX2hhbmRsZXInO1xuaW1wb3J0IHtSb3V0ZURhdGEsIEJMQU5LX1JPVVRFX0RBVEF9IGZyb20gJy4vaW5zdHJ1Y3Rpb24nO1xuXG5cbmV4cG9ydCBjbGFzcyBTeW5jUm91dGVIYW5kbGVyIGltcGxlbWVudHMgUm91dGVIYW5kbGVyIHtcbiAgcHVibGljIGRhdGE6IFJvdXRlRGF0YTtcblxuICAvKiogQGludGVybmFsICovXG4gIF9yZXNvbHZlZENvbXBvbmVudDogUHJvbWlzZTxhbnk+ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgY29tcG9uZW50VHlwZTogVHlwZSwgZGF0YT86IHtba2V5OiBzdHJpbmddOiBhbnl9KSB7XG4gICAgdGhpcy5fcmVzb2x2ZWRDb21wb25lbnQgPSBQcm9taXNlV3JhcHBlci5yZXNvbHZlKGNvbXBvbmVudFR5cGUpO1xuICAgIHRoaXMuZGF0YSA9IGlzUHJlc2VudChkYXRhKSA/IG5ldyBSb3V0ZURhdGEoZGF0YSkgOiBCTEFOS19ST1VURV9EQVRBO1xuICB9XG5cbiAgcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTogUHJvbWlzZTxhbnk+IHsgcmV0dXJuIHRoaXMuX3Jlc29sdmVkQ29tcG9uZW50OyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL3N5bmNfcm91dGVfaGFuZGxlci50c1xuICoqLyIsImltcG9ydCB7QXN5bmNSb3V0ZSwgQXV4Um91dGUsIFJvdXRlLCBSZWRpcmVjdCwgUm91dGVEZWZpbml0aW9ufSBmcm9tICcuL3JvdXRlX2NvbmZpZ19kZWNvcmF0b3InO1xuaW1wb3J0IHtDb21wb25lbnREZWZpbml0aW9ufSBmcm9tICcuL3JvdXRlX2RlZmluaXRpb24nO1xuaW1wb3J0IHtpc1R5cGUsIFR5cGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5pbXBvcnQge1JvdXRlUmVnaXN0cnl9IGZyb20gJy4vcm91dGVfcmVnaXN0cnknO1xuXG5cbi8qKlxuICogR2l2ZW4gYSBKUyBPYmplY3QgdGhhdCByZXByZXNlbnRzIGEgcm91dGUgY29uZmlnLCByZXR1cm5zIGEgY29ycmVzcG9uZGluZyBSb3V0ZSwgQXN5bmNSb3V0ZSxcbiAqIEF1eFJvdXRlIG9yIFJlZGlyZWN0IG9iamVjdC5cbiAqXG4gKiBBbHNvIHdyYXBzIGFuIEFzeW5jUm91dGUncyBsb2FkZXIgZnVuY3Rpb24gdG8gYWRkIHRoZSBsb2FkZWQgY29tcG9uZW50J3Mgcm91dGUgY29uZmlnIHRvIHRoZVxuICogYFJvdXRlUmVnaXN0cnlgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUm91dGVDb25maWcoY29uZmlnOiBSb3V0ZURlZmluaXRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnk6IFJvdXRlUmVnaXN0cnkpOiBSb3V0ZURlZmluaXRpb24ge1xuICBpZiAoY29uZmlnIGluc3RhbmNlb2YgQXN5bmNSb3V0ZSkge1xuICAgIHZhciB3cmFwcGVkTG9hZGVyID0gd3JhcExvYWRlclRvUmVjb25maWd1cmVSZWdpc3RyeShjb25maWcubG9hZGVyLCByZWdpc3RyeSk7XG4gICAgcmV0dXJuIG5ldyBBc3luY1JvdXRlKHtcbiAgICAgIHBhdGg6IGNvbmZpZy5wYXRoLFxuICAgICAgbG9hZGVyOiB3cmFwcGVkTG9hZGVyLFxuICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICBkYXRhOiBjb25maWcuZGF0YSxcbiAgICAgIHVzZUFzRGVmYXVsdDogY29uZmlnLnVzZUFzRGVmYXVsdFxuICAgIH0pO1xuICB9XG4gIGlmIChjb25maWcgaW5zdGFuY2VvZiBSb3V0ZSB8fCBjb25maWcgaW5zdGFuY2VvZiBSZWRpcmVjdCB8fCBjb25maWcgaW5zdGFuY2VvZiBBdXhSb3V0ZSkge1xuICAgIHJldHVybiA8Um91dGVEZWZpbml0aW9uPmNvbmZpZztcbiAgfVxuXG4gIGlmICgoKyEhY29uZmlnLmNvbXBvbmVudCkgKyAoKyEhY29uZmlnLnJlZGlyZWN0VG8pICsgKCshIWNvbmZpZy5sb2FkZXIpICE9IDEpIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgYFJvdXRlIGNvbmZpZyBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSBcImNvbXBvbmVudFwiLCBcImxvYWRlclwiLCBvciBcInJlZGlyZWN0VG9cIiBwcm9wZXJ0eS5gKTtcbiAgfVxuICBpZiAoY29uZmlnLmFzICYmIGNvbmZpZy5uYW1lKSB7XG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFJvdXRlIGNvbmZpZyBzaG91bGQgY29udGFpbiBleGFjdGx5IG9uZSBcImFzXCIgb3IgXCJuYW1lXCIgcHJvcGVydHkuYCk7XG4gIH1cbiAgaWYgKGNvbmZpZy5hcykge1xuICAgIGNvbmZpZy5uYW1lID0gY29uZmlnLmFzO1xuICB9XG4gIGlmIChjb25maWcubG9hZGVyKSB7XG4gICAgdmFyIHdyYXBwZWRMb2FkZXIgPSB3cmFwTG9hZGVyVG9SZWNvbmZpZ3VyZVJlZ2lzdHJ5KGNvbmZpZy5sb2FkZXIsIHJlZ2lzdHJ5KTtcbiAgICByZXR1cm4gbmV3IEFzeW5jUm91dGUoe1xuICAgICAgcGF0aDogY29uZmlnLnBhdGgsXG4gICAgICBsb2FkZXI6IHdyYXBwZWRMb2FkZXIsXG4gICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgIHVzZUFzRGVmYXVsdDogY29uZmlnLnVzZUFzRGVmYXVsdFxuICAgIH0pO1xuICB9XG4gIGlmIChjb25maWcuYXV4KSB7XG4gICAgcmV0dXJuIG5ldyBBdXhSb3V0ZSh7cGF0aDogY29uZmlnLmF1eCwgY29tcG9uZW50OjxUeXBlPmNvbmZpZy5jb21wb25lbnQsIG5hbWU6IGNvbmZpZy5uYW1lfSk7XG4gIH1cbiAgaWYgKGNvbmZpZy5jb21wb25lbnQpIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5jb21wb25lbnQgPT0gJ29iamVjdCcpIHtcbiAgICAgIGxldCBjb21wb25lbnREZWZpbml0aW9uT2JqZWN0ID0gPENvbXBvbmVudERlZmluaXRpb24+Y29uZmlnLmNvbXBvbmVudDtcbiAgICAgIGlmIChjb21wb25lbnREZWZpbml0aW9uT2JqZWN0LnR5cGUgPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICByZXR1cm4gbmV3IFJvdXRlKHtcbiAgICAgICAgICBwYXRoOiBjb25maWcucGF0aCxcbiAgICAgICAgICBjb21wb25lbnQ6PFR5cGU+Y29tcG9uZW50RGVmaW5pdGlvbk9iamVjdC5jb25zdHJ1Y3RvcixcbiAgICAgICAgICBuYW1lOiBjb25maWcubmFtZSxcbiAgICAgICAgICBkYXRhOiBjb25maWcuZGF0YSxcbiAgICAgICAgICB1c2VBc0RlZmF1bHQ6IGNvbmZpZy51c2VBc0RlZmF1bHRcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKGNvbXBvbmVudERlZmluaXRpb25PYmplY3QudHlwZSA9PSAnbG9hZGVyJykge1xuICAgICAgICByZXR1cm4gbmV3IEFzeW5jUm91dGUoe1xuICAgICAgICAgIHBhdGg6IGNvbmZpZy5wYXRoLFxuICAgICAgICAgIGxvYWRlcjogY29tcG9uZW50RGVmaW5pdGlvbk9iamVjdC5sb2FkZXIsXG4gICAgICAgICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgdXNlQXNEZWZhdWx0OiBjb25maWcudXNlQXNEZWZhdWx0XG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oXG4gICAgICAgICAgICBgSW52YWxpZCBjb21wb25lbnQgdHlwZSBcIiR7Y29tcG9uZW50RGVmaW5pdGlvbk9iamVjdC50eXBlfVwiLiBWYWxpZCB0eXBlcyBhcmUgXCJjb25zdHJ1Y3RvclwiIGFuZCBcImxvYWRlclwiLmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3IFJvdXRlKDx7XG4gICAgICBwYXRoOiBzdHJpbmc7XG4gICAgICBjb21wb25lbnQ6IFR5cGU7XG4gICAgICBuYW1lPzogc3RyaW5nO1xuICAgICAgZGF0YT86IHtba2V5OiBzdHJpbmddOiBhbnl9O1xuICAgICAgdXNlQXNEZWZhdWx0PzogYm9vbGVhbjtcbiAgICB9PmNvbmZpZyk7XG4gIH1cblxuICBpZiAoY29uZmlnLnJlZGlyZWN0VG8pIHtcbiAgICByZXR1cm4gbmV3IFJlZGlyZWN0KHtwYXRoOiBjb25maWcucGF0aCwgcmVkaXJlY3RUbzogY29uZmlnLnJlZGlyZWN0VG99KTtcbiAgfVxuXG4gIHJldHVybiBjb25maWc7XG59XG5cblxuZnVuY3Rpb24gd3JhcExvYWRlclRvUmVjb25maWd1cmVSZWdpc3RyeShsb2FkZXI6IEZ1bmN0aW9uLCByZWdpc3RyeTogUm91dGVSZWdpc3RyeSk6IEZ1bmN0aW9uIHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICByZXR1cm4gbG9hZGVyKCkudGhlbigoY29tcG9uZW50VHlwZSkgPT4ge1xuICAgICAgcmVnaXN0cnkuY29uZmlnRnJvbUNvbXBvbmVudChjb21wb25lbnRUeXBlKTtcbiAgICAgIHJldHVybiBjb21wb25lbnRUeXBlO1xuICAgIH0pO1xuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Q29tcG9uZW50RXhpc3RzKGNvbXBvbmVudDogVHlwZSwgcGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghaXNUeXBlKGNvbXBvbmVudCkpIHtcbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ29tcG9uZW50IGZvciByb3V0ZSBcIiR7cGF0aH1cIiBpcyBub3QgZGVmaW5lZCwgb3IgaXMgbm90IGEgY2xhc3MuYCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVfY29uZmlnX25vbWFsaXplci50c1xuICoqLyIsImltcG9ydCB7Um91dGVDb25maWcgYXMgUm91dGVDb25maWdBbm5vdGF0aW9uLCBSb3V0ZURlZmluaXRpb259IGZyb20gJy4vcm91dGVfY29uZmlnX2ltcGwnO1xuaW1wb3J0IHttYWtlRGVjb3JhdG9yfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS91dGlsL2RlY29yYXRvcnMnO1xuXG5leHBvcnQge1JvdXRlLCBSZWRpcmVjdCwgQXV4Um91dGUsIEFzeW5jUm91dGUsIFJvdXRlRGVmaW5pdGlvbn0gZnJvbSAnLi9yb3V0ZV9jb25maWdfaW1wbCc7XG5cbi8vIENvcGllZCBmcm9tIFJvdXRlQ29uZmlnIGluIHJvdXRlX2NvbmZpZ19pbXBsLlxuLyoqXG4gKiBUaGUgYFJvdXRlQ29uZmlnYCBkZWNvcmF0b3IgZGVmaW5lcyByb3V0ZXMgZm9yIGEgZ2l2ZW4gY29tcG9uZW50LlxuICpcbiAqIEl0IHRha2VzIGFuIGFycmF5IG9mIHtAbGluayBSb3V0ZURlZmluaXRpb259cy5cbiAqL1xuZXhwb3J0IHZhciBSb3V0ZUNvbmZpZzogKGNvbmZpZ3M6IFJvdXRlRGVmaW5pdGlvbltdKSA9PiBDbGFzc0RlY29yYXRvciA9XG4gICAgbWFrZURlY29yYXRvcihSb3V0ZUNvbmZpZ0Fubm90YXRpb24pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZV9jb25maWdfZGVjb3JhdG9yLnRzXG4gKiovIiwiaW1wb3J0IHtMb2NhdGlvblN0cmF0ZWd5fSBmcm9tICcuL2xvY2F0aW9uX3N0cmF0ZWd5JztcbmltcG9ydCB7RXZlbnRFbWl0dGVyLCBPYnNlcnZhYmxlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge0luamVjdGFibGUsIEluamVjdH0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbi8qKlxuICogYExvY2F0aW9uYCBpcyBhIHNlcnZpY2UgdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0byBpbnRlcmFjdCB3aXRoIGEgYnJvd3NlcidzIFVSTC5cbiAqIERlcGVuZGluZyBvbiB3aGljaCB7QGxpbmsgTG9jYXRpb25TdHJhdGVneX0gaXMgdXNlZCwgYExvY2F0aW9uYCB3aWxsIGVpdGhlciBwZXJzaXN0XG4gKiB0byB0aGUgVVJMJ3MgcGF0aCBvciB0aGUgVVJMJ3MgaGFzaCBzZWdtZW50LlxuICpcbiAqIE5vdGU6IGl0J3MgYmV0dGVyIHRvIHVzZSB7QGxpbmsgUm91dGVyI25hdmlnYXRlfSBzZXJ2aWNlIHRvIHRyaWdnZXIgcm91dGUgY2hhbmdlcy4gVXNlXG4gKiBgTG9jYXRpb25gIG9ubHkgaWYgeW91IG5lZWQgdG8gaW50ZXJhY3Qgd2l0aCBvciBjcmVhdGUgbm9ybWFsaXplZCBVUkxzIG91dHNpZGUgb2ZcbiAqIHJvdXRpbmcuXG4gKlxuICogYExvY2F0aW9uYCBpcyByZXNwb25zaWJsZSBmb3Igbm9ybWFsaXppbmcgdGhlIFVSTCBhZ2FpbnN0IHRoZSBhcHBsaWNhdGlvbidzIGJhc2UgaHJlZi5cbiAqIEEgbm9ybWFsaXplZCBVUkwgaXMgYWJzb2x1dGUgZnJvbSB0aGUgVVJMIGhvc3QsIGluY2x1ZGVzIHRoZSBhcHBsaWNhdGlvbidzIGJhc2UgaHJlZiwgYW5kIGhhcyBub1xuICogdHJhaWxpbmcgc2xhc2g6XG4gKiAtIGAvbXkvYXBwL3VzZXIvMTIzYCBpcyBub3JtYWxpemVkXG4gKiAtIGBteS9hcHAvdXNlci8xMjNgICoqaXMgbm90Kiogbm9ybWFsaXplZFxuICogLSBgL215L2FwcC91c2VyLzEyMy9gICoqaXMgbm90Kiogbm9ybWFsaXplZFxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudH0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge1xuICogICBST1VURVJfRElSRUNUSVZFUyxcbiAqICAgUk9VVEVSX1BST1ZJREVSUyxcbiAqICAgUm91dGVDb25maWcsXG4gKiAgIExvY2F0aW9uXG4gKiB9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHsuLi59LFxuICogXSlcbiAqIGNsYXNzIEFwcENtcCB7XG4gKiAgIGNvbnN0cnVjdG9yKGxvY2F0aW9uOiBMb2NhdGlvbikge1xuICogICAgIGxvY2F0aW9uLmdvKCcvZm9vJyk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwQ21wLCBbUk9VVEVSX1BST1ZJREVSU10pO1xuICogYGBgXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2NhdGlvbiB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3N1YmplY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICAvKiogQGludGVybmFsICovXG4gIF9iYXNlSHJlZjogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBwbGF0Zm9ybVN0cmF0ZWd5OiBMb2NhdGlvblN0cmF0ZWd5KSB7XG4gICAgdmFyIGJyb3dzZXJCYXNlSHJlZiA9IHRoaXMucGxhdGZvcm1TdHJhdGVneS5nZXRCYXNlSHJlZigpO1xuICAgIHRoaXMuX2Jhc2VIcmVmID0gc3RyaXBUcmFpbGluZ1NsYXNoKHN0cmlwSW5kZXhIdG1sKGJyb3dzZXJCYXNlSHJlZikpO1xuICAgIHRoaXMucGxhdGZvcm1TdHJhdGVneS5vblBvcFN0YXRlKChldikgPT4ge1xuICAgICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fc3ViamVjdCwgeyd1cmwnOiB0aGlzLnBhdGgoKSwgJ3BvcCc6IHRydWUsICd0eXBlJzogZXYudHlwZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIG5vcm1hbGl6ZWQgVVJMIHBhdGguXG4gICAqL1xuICBwYXRoKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLm5vcm1hbGl6ZSh0aGlzLnBsYXRmb3JtU3RyYXRlZ3kucGF0aCgpKTsgfVxuXG4gIC8qKlxuICAgKiBHaXZlbiBhIHN0cmluZyByZXByZXNlbnRpbmcgYSBVUkwsIHJldHVybnMgdGhlIG5vcm1hbGl6ZWQgVVJMIHBhdGggd2l0aG91dCBsZWFkaW5nIG9yXG4gICAqIHRyYWlsaW5nIHNsYXNoZXNcbiAgICovXG4gIG5vcm1hbGl6ZSh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHN0cmlwVHJhaWxpbmdTbGFzaChfc3RyaXBCYXNlSHJlZih0aGlzLl9iYXNlSHJlZiwgc3RyaXBJbmRleEh0bWwodXJsKSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdpdmVuIGEgc3RyaW5nIHJlcHJlc2VudGluZyBhIFVSTCwgcmV0dXJucyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgZXh0ZXJuYWwgVVJMIHBhdGguXG4gICAqIElmIHRoZSBnaXZlbiBVUkwgZG9lc24ndCBiZWdpbiB3aXRoIGEgbGVhZGluZyBzbGFzaCAoYCcvJ2ApLCB0aGlzIG1ldGhvZCBhZGRzIG9uZVxuICAgKiBiZWZvcmUgbm9ybWFsaXppbmcuIFRoaXMgbWV0aG9kIHdpbGwgYWxzbyBhZGQgYSBoYXNoIGlmIGBIYXNoTG9jYXRpb25TdHJhdGVneWAgaXNcbiAgICogdXNlZCwgb3IgdGhlIGBBUFBfQkFTRV9IUkVGYCBpZiB0aGUgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YCBpcyBpbiB1c2UuXG4gICAqL1xuICBwcmVwYXJlRXh0ZXJuYWxVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh1cmwubGVuZ3RoID4gMCAmJiAhdXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgdXJsID0gJy8nICsgdXJsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5wbGF0Zm9ybVN0cmF0ZWd5LnByZXBhcmVFeHRlcm5hbFVybCh1cmwpO1xuICB9XG5cbiAgLy8gVE9ETzogcmVuYW1lIHRoaXMgbWV0aG9kIHRvIHB1c2hTdGF0ZVxuICAvKipcbiAgICogQ2hhbmdlcyB0aGUgYnJvd3NlcnMgVVJMIHRvIHRoZSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIFVSTCwgYW5kIHB1c2hlcyBhXG4gICAqIG5ldyBpdGVtIG9udG8gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeS5cbiAgICovXG4gIGdvKHBhdGg6IHN0cmluZywgcXVlcnk6IHN0cmluZyA9ICcnKTogdm9pZCB7XG4gICAgdGhpcy5wbGF0Zm9ybVN0cmF0ZWd5LnB1c2hTdGF0ZShudWxsLCAnJywgcGF0aCwgcXVlcnkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoYW5nZXMgdGhlIGJyb3dzZXJzIFVSTCB0byB0aGUgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBVUkwsIGFuZCByZXBsYWNlc1xuICAgKiB0aGUgdG9wIGl0ZW0gb24gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeSBzdGFjay5cbiAgICovXG4gIHJlcGxhY2VTdGF0ZShwYXRoOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcgPSAnJyk6IHZvaWQge1xuICAgIHRoaXMucGxhdGZvcm1TdHJhdGVneS5yZXBsYWNlU3RhdGUobnVsbCwgJycsIHBhdGgsIHF1ZXJ5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgZm9yd2FyZCBpbiB0aGUgcGxhdGZvcm0ncyBoaXN0b3J5LlxuICAgKi9cbiAgZm9yd2FyZCgpOiB2b2lkIHsgdGhpcy5wbGF0Zm9ybVN0cmF0ZWd5LmZvcndhcmQoKTsgfVxuXG4gIC8qKlxuICAgKiBOYXZpZ2F0ZXMgYmFjayBpbiB0aGUgcGxhdGZvcm0ncyBoaXN0b3J5LlxuICAgKi9cbiAgYmFjaygpOiB2b2lkIHsgdGhpcy5wbGF0Zm9ybVN0cmF0ZWd5LmJhY2soKTsgfVxuXG4gIC8qKlxuICAgKiBTdWJzY3JpYmUgdG8gdGhlIHBsYXRmb3JtJ3MgYHBvcFN0YXRlYCBldmVudHMuXG4gICAqL1xuICBzdWJzY3JpYmUob25OZXh0OiAodmFsdWU6IGFueSkgPT4gdm9pZCwgb25UaHJvdzogKGV4Y2VwdGlvbjogYW55KSA9PiB2b2lkID0gbnVsbCxcbiAgICAgICAgICAgIG9uUmV0dXJuOiAoKSA9PiB2b2lkID0gbnVsbCk6IE9iamVjdCB7XG4gICAgcmV0dXJuIE9ic2VydmFibGVXcmFwcGVyLnN1YnNjcmliZSh0aGlzLl9zdWJqZWN0LCBvbk5leHQsIG9uVGhyb3csIG9uUmV0dXJuKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc3RyaXBCYXNlSHJlZihiYXNlSHJlZjogc3RyaW5nLCB1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChiYXNlSHJlZi5sZW5ndGggPiAwICYmIHVybC5zdGFydHNXaXRoKGJhc2VIcmVmKSkge1xuICAgIHJldHVybiB1cmwuc3Vic3RyaW5nKGJhc2VIcmVmLmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIHVybDtcbn1cblxuZnVuY3Rpb24gc3RyaXBJbmRleEh0bWwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoL1xcL2luZGV4Lmh0bWwkL2cudGVzdCh1cmwpKSB7XG4gICAgLy8gJy9pbmRleC5odG1sJy5sZW5ndGggPT0gMTFcbiAgICByZXR1cm4gdXJsLnN1YnN0cmluZygwLCB1cmwubGVuZ3RoIC0gMTEpO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5cbmZ1bmN0aW9uIHN0cmlwVHJhaWxpbmdTbGFzaCh1cmw6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICgvXFwvJC9nLnRlc3QodXJsKSkge1xuICAgIHVybCA9IHVybC5zdWJzdHJpbmcoMCwgdXJsLmxlbmd0aCAtIDEpO1xuICB9XG4gIHJldHVybiB1cmw7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL2xvY2F0aW9uLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtPcGFxdWVUb2tlbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbi8qKlxuICogYExvY2F0aW9uU3RyYXRlZ3lgIGlzIHJlc3BvbnNpYmxlIGZvciByZXByZXNlbnRpbmcgYW5kIHJlYWRpbmcgcm91dGUgc3RhdGVcbiAqIGZyb20gdGhlIGJyb3dzZXIncyBVUkwuIEFuZ3VsYXIgcHJvdmlkZXMgdHdvIHN0cmF0ZWdpZXM6XG4gKiB7QGxpbmsgSGFzaExvY2F0aW9uU3RyYXRlZ3l9IChkZWZhdWx0KSBhbmQge0BsaW5rIFBhdGhMb2NhdGlvblN0cmF0ZWd5fS5cbiAqXG4gKiBUaGlzIGlzIHVzZWQgdW5kZXIgdGhlIGhvb2Qgb2YgdGhlIHtAbGluayBMb2NhdGlvbn0gc2VydmljZS5cbiAqXG4gKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUge0BsaW5rIFJvdXRlcn0gb3Ige0BsaW5rIExvY2F0aW9ufSBzZXJ2aWNlcyB0b1xuICogaW50ZXJhY3Qgd2l0aCBhcHBsaWNhdGlvbiByb3V0ZSBzdGF0ZS5cbiAqXG4gKiBGb3IgaW5zdGFuY2UsIHtAbGluayBIYXNoTG9jYXRpb25TdHJhdGVneX0gcHJvZHVjZXMgVVJMcyBsaWtlXG4gKiBgaHR0cDovL2V4YW1wbGUuY29tIy9mb29gLCBhbmQge0BsaW5rIFBhdGhMb2NhdGlvblN0cmF0ZWd5fSBwcm9kdWNlc1xuICogYGh0dHA6Ly9leGFtcGxlLmNvbS9mb29gIGFzIGFuIGVxdWl2YWxlbnQgVVJMLlxuICpcbiAqIFNlZSB0aGVzZSB0d28gY2xhc3NlcyBmb3IgbW9yZS5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIExvY2F0aW9uU3RyYXRlZ3kge1xuICBhYnN0cmFjdCBwYXRoKCk6IHN0cmluZztcbiAgYWJzdHJhY3QgcHJlcGFyZUV4dGVybmFsVXJsKGludGVybmFsOiBzdHJpbmcpOiBzdHJpbmc7XG4gIGFic3RyYWN0IHB1c2hTdGF0ZShzdGF0ZTogYW55LCB0aXRsZTogc3RyaW5nLCB1cmw6IHN0cmluZywgcXVlcnlQYXJhbXM6IHN0cmluZyk6IHZvaWQ7XG4gIGFic3RyYWN0IHJlcGxhY2VTdGF0ZShzdGF0ZTogYW55LCB0aXRsZTogc3RyaW5nLCB1cmw6IHN0cmluZywgcXVlcnlQYXJhbXM6IHN0cmluZyk6IHZvaWQ7XG4gIGFic3RyYWN0IGZvcndhcmQoKTogdm9pZDtcbiAgYWJzdHJhY3QgYmFjaygpOiB2b2lkO1xuICBhYnN0cmFjdCBvblBvcFN0YXRlKGZuOiAoXzogYW55KSA9PiBhbnkpOiB2b2lkO1xuICBhYnN0cmFjdCBnZXRCYXNlSHJlZigpOiBzdHJpbmc7XG59XG5cblxuLyoqXG4gKiBUaGUgYEFQUF9CQVNFX0hSRUZgIHRva2VuIHJlcHJlc2VudHMgdGhlIGJhc2UgaHJlZiB0byBiZSB1c2VkIHdpdGggdGhlXG4gKiB7QGxpbmsgUGF0aExvY2F0aW9uU3RyYXRlZ3l9LlxuICpcbiAqIElmIHlvdSdyZSB1c2luZyB7QGxpbmsgUGF0aExvY2F0aW9uU3RyYXRlZ3l9LCB5b3UgbXVzdCBwcm92aWRlIGEgcHJvdmlkZXIgdG8gYSBzdHJpbmdcbiAqIHJlcHJlc2VudGluZyB0aGUgVVJMIHByZWZpeCB0aGF0IHNob3VsZCBiZSBwcmVzZXJ2ZWQgd2hlbiBnZW5lcmF0aW5nIGFuZCByZWNvZ25pemluZ1xuICogVVJMcy5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtDb21wb25lbnR9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtST1VURVJfRElSRUNUSVZFUywgUk9VVEVSX1BST1ZJREVSUywgUm91dGVDb25maWd9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHsuLi59LFxuICogXSlcbiAqIGNsYXNzIEFwcENtcCB7XG4gKiAgIC8vIC4uLlxuICogfVxuICpcbiAqIGJvb3RzdHJhcChBcHBDbXAsIFtcbiAqICAgUk9VVEVSX1BST1ZJREVSUyxcbiAqICAgUGF0aExvY2F0aW9uU3RyYXRlZ3ksXG4gKiAgIHByb3ZpZGUoQVBQX0JBU0VfSFJFRiwge3VzZVZhbHVlOiAnL215L2FwcCd9KVxuICogXSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNvbnN0IEFQUF9CQVNFX0hSRUY6IE9wYXF1ZVRva2VuID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oJ2FwcEJhc2VIcmVmJykpO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplUXVlcnlQYXJhbXMocGFyYW1zOiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gKHBhcmFtcy5sZW5ndGggPiAwICYmIHBhcmFtcy5zdWJzdHJpbmcoMCwgMSkgIT0gJz8nKSA/ICgnPycgKyBwYXJhbXMpIDogcGFyYW1zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gam9pbldpdGhTbGFzaChzdGFydDogc3RyaW5nLCBlbmQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChzdGFydC5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybiBlbmQ7XG4gIH1cbiAgaWYgKGVuZC5sZW5ndGggPT0gMCkge1xuICAgIHJldHVybiBzdGFydDtcbiAgfVxuICB2YXIgc2xhc2hlcyA9IDA7XG4gIGlmIChzdGFydC5lbmRzV2l0aCgnLycpKSB7XG4gICAgc2xhc2hlcysrO1xuICB9XG4gIGlmIChlbmQuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgc2xhc2hlcysrO1xuICB9XG4gIGlmIChzbGFzaGVzID09IDIpIHtcbiAgICByZXR1cm4gc3RhcnQgKyBlbmQuc3Vic3RyaW5nKDEpO1xuICB9XG4gIGlmIChzbGFzaGVzID09IDEpIHtcbiAgICByZXR1cm4gc3RhcnQgKyBlbmQ7XG4gIH1cbiAgcmV0dXJuIHN0YXJ0ICsgJy8nICsgZW5kO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9sb2NhdGlvbl9zdHJhdGVneS50c1xuICoqLyIsImltcG9ydCB7VHlwZSwgaXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtSb3V0ZUxpZmVjeWNsZUhvb2ssIENhbkFjdGl2YXRlfSBmcm9tICcuL2xpZmVjeWNsZV9hbm5vdGF0aW9uc19pbXBsJztcbmltcG9ydCB7cmVmbGVjdG9yfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9yZWZsZWN0aW9uL3JlZmxlY3Rpb24nO1xuXG5leHBvcnQgZnVuY3Rpb24gaGFzTGlmZWN5Y2xlSG9vayhlOiBSb3V0ZUxpZmVjeWNsZUhvb2ssIHR5cGUpOiBib29sZWFuIHtcbiAgaWYgKCEodHlwZSBpbnN0YW5jZW9mIFR5cGUpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBlLm5hbWUgaW4oPGFueT50eXBlKS5wcm90b3R5cGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDYW5BY3RpdmF0ZUhvb2sodHlwZSk6IEZ1bmN0aW9uIHtcbiAgdmFyIGFubm90YXRpb25zID0gcmVmbGVjdG9yLmFubm90YXRpb25zKHR5cGUpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbGV0IGFubm90YXRpb24gPSBhbm5vdGF0aW9uc1tpXTtcbiAgICBpZiAoYW5ub3RhdGlvbiBpbnN0YW5jZW9mIENhbkFjdGl2YXRlKSB7XG4gICAgICByZXR1cm4gYW5ub3RhdGlvbi5mbjtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVfbGlmZWN5Y2xlX3JlZmxlY3Rvci50c1xuICoqLyIsImltcG9ydCB7Q09OU1QsIENPTlNUX0VYUFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbkBDT05TVCgpXG5leHBvcnQgY2xhc3MgUm91dGVMaWZlY3ljbGVIb29rIHtcbiAgY29uc3RydWN0b3IocHVibGljIG5hbWU6IHN0cmluZykge31cbn1cblxuQENPTlNUKClcbmV4cG9ydCBjbGFzcyBDYW5BY3RpdmF0ZSB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBmbjogRnVuY3Rpb24pIHt9XG59XG5cbmV4cG9ydCBjb25zdCByb3V0ZXJDYW5SZXVzZTogUm91dGVMaWZlY3ljbGVIb29rID1cbiAgICBDT05TVF9FWFBSKG5ldyBSb3V0ZUxpZmVjeWNsZUhvb2soXCJyb3V0ZXJDYW5SZXVzZVwiKSk7XG5leHBvcnQgY29uc3Qgcm91dGVyQ2FuRGVhY3RpdmF0ZTogUm91dGVMaWZlY3ljbGVIb29rID1cbiAgICBDT05TVF9FWFBSKG5ldyBSb3V0ZUxpZmVjeWNsZUhvb2soXCJyb3V0ZXJDYW5EZWFjdGl2YXRlXCIpKTtcbmV4cG9ydCBjb25zdCByb3V0ZXJPbkFjdGl2YXRlOiBSb3V0ZUxpZmVjeWNsZUhvb2sgPVxuICAgIENPTlNUX0VYUFIobmV3IFJvdXRlTGlmZWN5Y2xlSG9vayhcInJvdXRlck9uQWN0aXZhdGVcIikpO1xuZXhwb3J0IGNvbnN0IHJvdXRlck9uUmV1c2U6IFJvdXRlTGlmZWN5Y2xlSG9vayA9XG4gICAgQ09OU1RfRVhQUihuZXcgUm91dGVMaWZlY3ljbGVIb29rKFwicm91dGVyT25SZXVzZVwiKSk7XG5leHBvcnQgY29uc3Qgcm91dGVyT25EZWFjdGl2YXRlOiBSb3V0ZUxpZmVjeWNsZUhvb2sgPVxuICAgIENPTlNUX0VYUFIobmV3IFJvdXRlTGlmZWN5Y2xlSG9vayhcInJvdXRlck9uRGVhY3RpdmF0ZVwiKSk7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL2xpZmVjeWNsZV9hbm5vdGF0aW9uc19pbXBsLnRzXG4gKiovIiwiaW1wb3J0IHtQcm9taXNlLCBQcm9taXNlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5pbXBvcnQge1N0cmluZ01hcFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge2lzQmxhbmssIGlzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcblxuaW1wb3J0IHtcbiAgRGlyZWN0aXZlLFxuICBBdHRyaWJ1dGUsXG4gIER5bmFtaWNDb21wb25lbnRMb2FkZXIsXG4gIENvbXBvbmVudFJlZixcbiAgRWxlbWVudFJlZixcbiAgSW5qZWN0b3IsXG4gIHByb3ZpZGUsXG4gIERlcGVuZGVuY3lcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5cbmltcG9ydCAqIGFzIHJvdXRlck1vZCBmcm9tICcuL3JvdXRlcic7XG5pbXBvcnQge0NvbXBvbmVudEluc3RydWN0aW9uLCBSb3V0ZVBhcmFtcywgUm91dGVEYXRhfSBmcm9tICcuL2luc3RydWN0aW9uJztcbmltcG9ydCAqIGFzIGhvb2tNb2QgZnJvbSAnLi9saWZlY3ljbGVfYW5ub3RhdGlvbnMnO1xuaW1wb3J0IHtoYXNMaWZlY3ljbGVIb29rfSBmcm9tICcuL3JvdXRlX2xpZmVjeWNsZV9yZWZsZWN0b3InO1xuaW1wb3J0IHtPbkFjdGl2YXRlLCBDYW5SZXVzZSwgT25SZXVzZSwgT25EZWFjdGl2YXRlLCBDYW5EZWFjdGl2YXRlfSBmcm9tICcuL2ludGVyZmFjZXMnO1xuXG5sZXQgX3Jlc29sdmVUb1RydWUgPSBQcm9taXNlV3JhcHBlci5yZXNvbHZlKHRydWUpO1xuXG4vKipcbiAqIEEgcm91dGVyIG91dGxldCBpcyBhIHBsYWNlaG9sZGVyIHRoYXQgQW5ndWxhciBkeW5hbWljYWxseSBmaWxscyBiYXNlZCBvbiB0aGUgYXBwbGljYXRpb24ncyByb3V0ZS5cbiAqXG4gKiAjIyBVc2VcbiAqXG4gKiBgYGBcbiAqIDxyb3V0ZXItb3V0bGV0Pjwvcm91dGVyLW91dGxldD5cbiAqIGBgYFxuICovXG5ARGlyZWN0aXZlKHtzZWxlY3RvcjogJ3JvdXRlci1vdXRsZXQnfSlcbmV4cG9ydCBjbGFzcyBSb3V0ZXJPdXRsZXQge1xuICBuYW1lOiBzdHJpbmcgPSBudWxsO1xuICBwcml2YXRlIF9jb21wb25lbnRSZWY6IENvbXBvbmVudFJlZiA9IG51bGw7XG4gIHByaXZhdGUgX2N1cnJlbnRJbnN0cnVjdGlvbjogQ29tcG9uZW50SW5zdHJ1Y3Rpb24gPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2VsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgX2xvYWRlcjogRHluYW1pY0NvbXBvbmVudExvYWRlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfcGFyZW50Um91dGVyOiByb3V0ZXJNb2QuUm91dGVyLCBAQXR0cmlidXRlKCduYW1lJykgbmFtZUF0dHI6IHN0cmluZykge1xuICAgIGlmIChpc1ByZXNlbnQobmFtZUF0dHIpKSB7XG4gICAgICB0aGlzLm5hbWUgPSBuYW1lQXR0cjtcbiAgICAgIHRoaXMuX3BhcmVudFJvdXRlci5yZWdpc3RlckF1eE91dGxldCh0aGlzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5fcGFyZW50Um91dGVyLnJlZ2lzdGVyUHJpbWFyeU91dGxldCh0aGlzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGJ5IHRoZSBSb3V0ZXIgdG8gaW5zdGFudGlhdGUgYSBuZXcgY29tcG9uZW50IGR1cmluZyB0aGUgY29tbWl0IHBoYXNlIG9mIGEgbmF2aWdhdGlvbi5cbiAgICogVGhpcyBtZXRob2QgaW4gdHVybiBpcyByZXNwb25zaWJsZSBmb3IgY2FsbGluZyB0aGUgYHJvdXRlck9uQWN0aXZhdGVgIGhvb2sgb2YgaXRzIGNoaWxkLlxuICAgKi9cbiAgYWN0aXZhdGUobmV4dEluc3RydWN0aW9uOiBDb21wb25lbnRJbnN0cnVjdGlvbik6IFByb21pc2U8YW55PiB7XG4gICAgdmFyIHByZXZpb3VzSW5zdHJ1Y3Rpb24gPSB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb247XG4gICAgdGhpcy5fY3VycmVudEluc3RydWN0aW9uID0gbmV4dEluc3RydWN0aW9uO1xuICAgIHZhciBjb21wb25lbnRUeXBlID0gbmV4dEluc3RydWN0aW9uLmNvbXBvbmVudFR5cGU7XG4gICAgdmFyIGNoaWxkUm91dGVyID0gdGhpcy5fcGFyZW50Um91dGVyLmNoaWxkUm91dGVyKGNvbXBvbmVudFR5cGUpO1xuXG4gICAgdmFyIHByb3ZpZGVycyA9IEluamVjdG9yLnJlc29sdmUoW1xuICAgICAgcHJvdmlkZShSb3V0ZURhdGEsIHt1c2VWYWx1ZTogbmV4dEluc3RydWN0aW9uLnJvdXRlRGF0YX0pLFxuICAgICAgcHJvdmlkZShSb3V0ZVBhcmFtcywge3VzZVZhbHVlOiBuZXcgUm91dGVQYXJhbXMobmV4dEluc3RydWN0aW9uLnBhcmFtcyl9KSxcbiAgICAgIHByb3ZpZGUocm91dGVyTW9kLlJvdXRlciwge3VzZVZhbHVlOiBjaGlsZFJvdXRlcn0pXG4gICAgXSk7XG4gICAgcmV0dXJuIHRoaXMuX2xvYWRlci5sb2FkTmV4dFRvTG9jYXRpb24oY29tcG9uZW50VHlwZSwgdGhpcy5fZWxlbWVudFJlZiwgcHJvdmlkZXJzKVxuICAgICAgICAudGhlbigoY29tcG9uZW50UmVmKSA9PiB7XG4gICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gY29tcG9uZW50UmVmO1xuICAgICAgICAgIGlmIChoYXNMaWZlY3ljbGVIb29rKGhvb2tNb2Qucm91dGVyT25BY3RpdmF0ZSwgY29tcG9uZW50VHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiAoPE9uQWN0aXZhdGU+dGhpcy5fY29tcG9uZW50UmVmLmluc3RhbmNlKVxuICAgICAgICAgICAgICAgIC5yb3V0ZXJPbkFjdGl2YXRlKG5leHRJbnN0cnVjdGlvbiwgcHJldmlvdXNJbnN0cnVjdGlvbik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHtAbGluayBSb3V0ZXJ9IGR1cmluZyB0aGUgY29tbWl0IHBoYXNlIG9mIGEgbmF2aWdhdGlvbiB3aGVuIGFuIG91dGxldFxuICAgKiByZXVzZXMgYSBjb21wb25lbnQgYmV0d2VlbiBkaWZmZXJlbnQgcm91dGVzLlxuICAgKiBUaGlzIG1ldGhvZCBpbiB0dXJuIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoZSBgcm91dGVyT25SZXVzZWAgaG9vayBvZiBpdHMgY2hpbGQuXG4gICAqL1xuICByZXVzZShuZXh0SW5zdHJ1Y3Rpb246IENvbXBvbmVudEluc3RydWN0aW9uKTogUHJvbWlzZTxhbnk+IHtcbiAgICB2YXIgcHJldmlvdXNJbnN0cnVjdGlvbiA9IHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbjtcbiAgICB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24gPSBuZXh0SW5zdHJ1Y3Rpb247XG5cbiAgICBpZiAoaXNCbGFuayh0aGlzLl9jb21wb25lbnRSZWYpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgQ2Fubm90IHJldXNlIGFuIG91dGxldCB0aGF0IGRvZXMgbm90IGNvbnRhaW4gYSBjb21wb25lbnQuYCk7XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlV3JhcHBlci5yZXNvbHZlKFxuICAgICAgICBoYXNMaWZlY3ljbGVIb29rKGhvb2tNb2Qucm91dGVyT25SZXVzZSwgdGhpcy5fY3VycmVudEluc3RydWN0aW9uLmNvbXBvbmVudFR5cGUpID9cbiAgICAgICAgICAgICg8T25SZXVzZT50aGlzLl9jb21wb25lbnRSZWYuaW5zdGFuY2UpXG4gICAgICAgICAgICAgICAgLnJvdXRlck9uUmV1c2UobmV4dEluc3RydWN0aW9uLCBwcmV2aW91c0luc3RydWN0aW9uKSA6XG4gICAgICAgICAgICB0cnVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHtAbGluayBSb3V0ZXJ9IHdoZW4gYW4gb3V0bGV0IGRpc3Bvc2VzIG9mIGEgY29tcG9uZW50J3MgY29udGVudHMuXG4gICAqIFRoaXMgbWV0aG9kIGluIHR1cm4gaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlIGByb3V0ZXJPbkRlYWN0aXZhdGVgIGhvb2sgb2YgaXRzIGNoaWxkLlxuICAgKi9cbiAgZGVhY3RpdmF0ZShuZXh0SW5zdHJ1Y3Rpb246IENvbXBvbmVudEluc3RydWN0aW9uKTogUHJvbWlzZTxhbnk+IHtcbiAgICB2YXIgbmV4dCA9IF9yZXNvbHZlVG9UcnVlO1xuICAgIGlmIChpc1ByZXNlbnQodGhpcy5fY29tcG9uZW50UmVmKSAmJiBpc1ByZXNlbnQodGhpcy5fY3VycmVudEluc3RydWN0aW9uKSAmJlxuICAgICAgICBoYXNMaWZlY3ljbGVIb29rKGhvb2tNb2Qucm91dGVyT25EZWFjdGl2YXRlLCB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24uY29tcG9uZW50VHlwZSkpIHtcbiAgICAgIG5leHQgPSBQcm9taXNlV3JhcHBlci5yZXNvbHZlKFxuICAgICAgICAgICg8T25EZWFjdGl2YXRlPnRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZSlcbiAgICAgICAgICAgICAgLnJvdXRlck9uRGVhY3RpdmF0ZShuZXh0SW5zdHJ1Y3Rpb24sIHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbikpO1xuICAgIH1cbiAgICByZXR1cm4gbmV4dC50aGVuKChfKSA9PiB7XG4gICAgICBpZiAoaXNQcmVzZW50KHRoaXMuX2NvbXBvbmVudFJlZikpIHtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgYnkgdGhlIHtAbGluayBSb3V0ZXJ9IGR1cmluZyByZWNvZ25pdGlvbiBwaGFzZSBvZiBhIG5hdmlnYXRpb24uXG4gICAqXG4gICAqIElmIHRoaXMgcmVzb2x2ZXMgdG8gYGZhbHNlYCwgdGhlIGdpdmVuIG5hdmlnYXRpb24gaXMgY2FuY2VsbGVkLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBkZWxlZ2F0ZXMgdG8gdGhlIGNoaWxkIGNvbXBvbmVudCdzIGByb3V0ZXJDYW5EZWFjdGl2YXRlYCBob29rIGlmIGl0IGV4aXN0cyxcbiAgICogYW5kIG90aGVyd2lzZSByZXNvbHZlcyB0byB0cnVlLlxuICAgKi9cbiAgcm91dGVyQ2FuRGVhY3RpdmF0ZShuZXh0SW5zdHJ1Y3Rpb246IENvbXBvbmVudEluc3RydWN0aW9uKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKGlzQmxhbmsodGhpcy5fY3VycmVudEluc3RydWN0aW9uKSkge1xuICAgICAgcmV0dXJuIF9yZXNvbHZlVG9UcnVlO1xuICAgIH1cbiAgICBpZiAoaGFzTGlmZWN5Y2xlSG9vayhob29rTW9kLnJvdXRlckNhbkRlYWN0aXZhdGUsIHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbi5jb21wb25lbnRUeXBlKSkge1xuICAgICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLnJlc29sdmUoXG4gICAgICAgICAgKDxDYW5EZWFjdGl2YXRlPnRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZSlcbiAgICAgICAgICAgICAgLnJvdXRlckNhbkRlYWN0aXZhdGUobmV4dEluc3RydWN0aW9uLCB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24pKTtcbiAgICB9XG4gICAgcmV0dXJuIF9yZXNvbHZlVG9UcnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBieSB0aGUge0BsaW5rIFJvdXRlcn0gZHVyaW5nIHJlY29nbml0aW9uIHBoYXNlIG9mIGEgbmF2aWdhdGlvbi5cbiAgICpcbiAgICogSWYgdGhlIG5ldyBjaGlsZCBjb21wb25lbnQgaGFzIGEgZGlmZmVyZW50IFR5cGUgdGhhbiB0aGUgZXhpc3RpbmcgY2hpbGQgY29tcG9uZW50LFxuICAgKiB0aGlzIHdpbGwgcmVzb2x2ZSB0byBgZmFsc2VgLiBZb3UgY2FuJ3QgcmV1c2UgYW4gb2xkIGNvbXBvbmVudCB3aGVuIHRoZSBuZXcgY29tcG9uZW50XG4gICAqIGlzIG9mIGEgZGlmZmVyZW50IFR5cGUuXG4gICAqXG4gICAqIE90aGVyd2lzZSwgdGhpcyBtZXRob2QgZGVsZWdhdGVzIHRvIHRoZSBjaGlsZCBjb21wb25lbnQncyBgcm91dGVyQ2FuUmV1c2VgIGhvb2sgaWYgaXQgZXhpc3RzLFxuICAgKiBvciByZXNvbHZlcyB0byB0cnVlIGlmIHRoZSBob29rIGlzIG5vdCBwcmVzZW50LlxuICAgKi9cbiAgcm91dGVyQ2FuUmV1c2UobmV4dEluc3RydWN0aW9uOiBDb21wb25lbnRJbnN0cnVjdGlvbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHZhciByZXN1bHQ7XG5cbiAgICBpZiAoaXNCbGFuayh0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24pIHx8XG4gICAgICAgIHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbi5jb21wb25lbnRUeXBlICE9IG5leHRJbnN0cnVjdGlvbi5jb21wb25lbnRUeXBlKSB7XG4gICAgICByZXN1bHQgPSBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKGhhc0xpZmVjeWNsZUhvb2soaG9va01vZC5yb3V0ZXJDYW5SZXVzZSwgdGhpcy5fY3VycmVudEluc3RydWN0aW9uLmNvbXBvbmVudFR5cGUpKSB7XG4gICAgICByZXN1bHQgPSAoPENhblJldXNlPnRoaXMuX2NvbXBvbmVudFJlZi5pbnN0YW5jZSlcbiAgICAgICAgICAgICAgICAgICAucm91dGVyQ2FuUmV1c2UobmV4dEluc3RydWN0aW9uLCB0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBuZXh0SW5zdHJ1Y3Rpb24gPT0gdGhpcy5fY3VycmVudEluc3RydWN0aW9uIHx8XG4gICAgICAgICAgICAgICAoaXNQcmVzZW50KG5leHRJbnN0cnVjdGlvbi5wYXJhbXMpICYmIGlzUHJlc2VudCh0aGlzLl9jdXJyZW50SW5zdHJ1Y3Rpb24ucGFyYW1zKSAmJlxuICAgICAgICAgICAgICAgIFN0cmluZ01hcFdyYXBwZXIuZXF1YWxzKG5leHRJbnN0cnVjdGlvbi5wYXJhbXMsIHRoaXMuX2N1cnJlbnRJbnN0cnVjdGlvbi5wYXJhbXMpKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2VXcmFwcGVyLnJlc29sdmUocmVzdWx0KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9yb3V0ZXJfb3V0bGV0LnRzXG4gKiovIiwiLyoqXG4gKiBUaGlzIGluZGlyZWN0aW9uIGlzIG5lZWRlZCB0byBmcmVlIHVwIENvbXBvbmVudCwgZXRjIHN5bWJvbHMgaW4gdGhlIHB1YmxpYyBBUElcbiAqIHRvIGJlIHVzZWQgYnkgdGhlIGRlY29yYXRvciB2ZXJzaW9ucyBvZiB0aGVzZSBhbm5vdGF0aW9ucy5cbiAqL1xuXG5pbXBvcnQge21ha2VEZWNvcmF0b3J9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL3V0aWwvZGVjb3JhdG9ycyc7XG5pbXBvcnQge0NhbkFjdGl2YXRlIGFzIENhbkFjdGl2YXRlQW5ub3RhdGlvbn0gZnJvbSAnLi9saWZlY3ljbGVfYW5ub3RhdGlvbnNfaW1wbCc7XG5pbXBvcnQge1Byb21pc2V9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtDb21wb25lbnRJbnN0cnVjdGlvbn0gZnJvbSAnLi9pbnN0cnVjdGlvbic7XG5cbmV4cG9ydCB7XG4gIHJvdXRlckNhblJldXNlLFxuICByb3V0ZXJDYW5EZWFjdGl2YXRlLFxuICByb3V0ZXJPbkFjdGl2YXRlLFxuICByb3V0ZXJPblJldXNlLFxuICByb3V0ZXJPbkRlYWN0aXZhdGVcbn0gZnJvbSAnLi9saWZlY3ljbGVfYW5ub3RhdGlvbnNfaW1wbCc7XG5cbi8qKlxuICogRGVmaW5lcyByb3V0ZSBsaWZlY3ljbGUgaG9vayBgQ2FuQWN0aXZhdGVgLCB3aGljaCBpcyBjYWxsZWQgYnkgdGhlIHJvdXRlciB0byBkZXRlcm1pbmVcbiAqIGlmIGEgY29tcG9uZW50IGNhbiBiZSBpbnN0YW50aWF0ZWQgYXMgcGFydCBvZiBhIG5hdmlnYXRpb24uXG4gKlxuICogPGFzaWRlIGNsYXNzPVwiaXMtcmlnaHRcIj5cbiAqIE5vdGUgdGhhdCB1bmxpa2Ugb3RoZXIgbGlmZWN5Y2xlIGhvb2tzLCB0aGlzIG9uZSB1c2VzIGFuIGFubm90YXRpb24gcmF0aGVyIHRoYW4gYW4gaW50ZXJmYWNlLlxuICogVGhpcyBpcyBiZWNhdXNlIHRoZSBgQ2FuQWN0aXZhdGVgIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQuXG4gKiA8L2FzaWRlPlxuICpcbiAqIFRoZSBgQ2FuQWN0aXZhdGVgIGhvb2sgaXMgY2FsbGVkIHdpdGggdHdvIHtAbGluayBDb21wb25lbnRJbnN0cnVjdGlvbn1zIGFzIHBhcmFtZXRlcnMsIHRoZSBmaXJzdFxuICogcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHJvdXRlIGJlaW5nIG5hdmlnYXRlZCB0bywgYW5kIHRoZSBzZWNvbmQgcGFyYW1ldGVyIHJlcHJlc2VudGluZyB0aGVcbiAqIHByZXZpb3VzIHJvdXRlIG9yIGBudWxsYC5cbiAqXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBAQ2FuQWN0aXZhdGUoKG5leHQsIHByZXYpID0+IGJvb2xlYW4gfCBQcm9taXNlPGJvb2xlYW4+KVxuICogYGBgXG4gKlxuICogSWYgYENhbkFjdGl2YXRlYCByZXR1cm5zIG9yIHJlc29sdmVzIHRvIGBmYWxzZWAsIHRoZSBuYXZpZ2F0aW9uIGlzIGNhbmNlbGxlZC5cbiAqIElmIGBDYW5BY3RpdmF0ZWAgdGhyb3dzIG9yIHJlamVjdHMsIHRoZSBuYXZpZ2F0aW9uIGlzIGFsc28gY2FuY2VsbGVkLlxuICogSWYgYENhbkFjdGl2YXRlYCByZXR1cm5zIG9yIHJlc29sdmVzIHRvIGB0cnVlYCwgbmF2aWdhdGlvbiBjb250aW51ZXMsIHRoZSBjb21wb25lbnQgaXNcbiAqIGluc3RhbnRpYXRlZCwgYW5kIHRoZSB7QGxpbmsgT25BY3RpdmF0ZX0gaG9vayBvZiB0aGF0IGNvbXBvbmVudCBpcyBjYWxsZWQgaWYgaW1wbGVtZW50ZWQuXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgcm91dGVyL3RzL2Nhbl9hY3RpdmF0ZS9jYW5fYWN0aXZhdGVfZXhhbXBsZS50cyByZWdpb249J2NhbkFjdGl2YXRlJyB9XG4gKi9cbmV4cG9ydCB2YXIgQ2FuQWN0aXZhdGU6IChob29rOiAobmV4dDogQ29tcG9uZW50SW5zdHJ1Y3Rpb24sIHByZXY6IENvbXBvbmVudEluc3RydWN0aW9uKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9taXNlPGJvb2xlYW4+fCBib29sZWFuKSA9PiBDbGFzc0RlY29yYXRvciA9XG4gICAgbWFrZURlY29yYXRvcihDYW5BY3RpdmF0ZUFubm90YXRpb24pO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9saWZlY3ljbGVfYW5ub3RhdGlvbnMudHNcbiAqKi8iLCJpbXBvcnQge0RpcmVjdGl2ZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge2lzU3RyaW5nfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuXG5pbXBvcnQge1JvdXRlcn0gZnJvbSAnLi9yb3V0ZXInO1xuaW1wb3J0IHtMb2NhdGlvbn0gZnJvbSAnLi9sb2NhdGlvbic7XG5pbXBvcnQge0luc3RydWN0aW9ufSBmcm9tICcuL2luc3RydWN0aW9uJztcblxuLyoqXG4gKiBUaGUgUm91dGVyTGluayBkaXJlY3RpdmUgbGV0cyB5b3UgbGluayB0byBzcGVjaWZpYyBwYXJ0cyBvZiB5b3VyIGFwcC5cbiAqXG4gKiBDb25zaWRlciB0aGUgZm9sbG93aW5nIHJvdXRlIGNvbmZpZ3VyYXRpb246XG5cbiAqIGBgYFxuICogQFJvdXRlQ29uZmlnKFtcbiAqICAgeyBwYXRoOiAnL3VzZXInLCBjb21wb25lbnQ6IFVzZXJDbXAsIGFzOiAnVXNlcicgfVxuICogXSk7XG4gKiBjbGFzcyBNeUNvbXAge31cbiAqIGBgYFxuICpcbiAqIFdoZW4gbGlua2luZyB0byB0aGlzIGBVc2VyYCByb3V0ZSwgeW91IGNhbiB3cml0ZTpcbiAqXG4gKiBgYGBcbiAqIDxhIFtyb3V0ZXJMaW5rXT1cIlsnLi9Vc2VyJ11cIj5saW5rIHRvIHVzZXIgY29tcG9uZW50PC9hPlxuICogYGBgXG4gKlxuICogUm91dGVyTGluayBleHBlY3RzIHRoZSB2YWx1ZSB0byBiZSBhbiBhcnJheSBvZiByb3V0ZSBuYW1lcywgZm9sbG93ZWQgYnkgdGhlIHBhcmFtc1xuICogZm9yIHRoYXQgbGV2ZWwgb2Ygcm91dGluZy4gRm9yIGluc3RhbmNlIGBbJy9UZWFtJywge3RlYW1JZDogMX0sICdVc2VyJywge3VzZXJJZDogMn1dYFxuICogbWVhbnMgdGhhdCB3ZSB3YW50IHRvIGdlbmVyYXRlIGEgbGluayBmb3IgdGhlIGBUZWFtYCByb3V0ZSB3aXRoIHBhcmFtcyBge3RlYW1JZDogMX1gLFxuICogYW5kIHdpdGggYSBjaGlsZCByb3V0ZSBgVXNlcmAgd2l0aCBwYXJhbXMgYHt1c2VySWQ6IDJ9YC5cbiAqXG4gKiBUaGUgZmlyc3Qgcm91dGUgbmFtZSBzaG91bGQgYmUgcHJlcGVuZGVkIHdpdGggYC9gLCBgLi9gLCBvciBgLi4vYC5cbiAqIElmIHRoZSByb3V0ZSBiZWdpbnMgd2l0aCBgL2AsIHRoZSByb3V0ZXIgd2lsbCBsb29rIHVwIHRoZSByb3V0ZSBmcm9tIHRoZSByb290IG9mIHRoZSBhcHAuXG4gKiBJZiB0aGUgcm91dGUgYmVnaW5zIHdpdGggYC4vYCwgdGhlIHJvdXRlciB3aWxsIGluc3RlYWQgbG9vayBpbiB0aGUgY3VycmVudCBjb21wb25lbnQnc1xuICogY2hpbGRyZW4gZm9yIHRoZSByb3V0ZS4gQW5kIGlmIHRoZSByb3V0ZSBiZWdpbnMgd2l0aCBgLi4vYCwgdGhlIHJvdXRlciB3aWxsIGxvb2sgYXQgdGhlXG4gKiBjdXJyZW50IGNvbXBvbmVudCdzIHBhcmVudC5cbiAqL1xuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW3JvdXRlckxpbmtdJyxcbiAgaW5wdXRzOiBbJ3JvdXRlUGFyYW1zOiByb3V0ZXJMaW5rJywgJ3RhcmdldDogdGFyZ2V0J10sXG4gIGhvc3Q6IHtcbiAgICAnKGNsaWNrKSc6ICdvbkNsaWNrKCknLFxuICAgICdbYXR0ci5ocmVmXSc6ICd2aXNpYmxlSHJlZicsXG4gICAgJ1tjbGFzcy5yb3V0ZXItbGluay1hY3RpdmVdJzogJ2lzUm91dGVBY3RpdmUnXG4gIH1cbn0pXG5leHBvcnQgY2xhc3MgUm91dGVyTGluayB7XG4gIHByaXZhdGUgX3JvdXRlUGFyYW1zOiBhbnlbXTtcblxuICAvLyB0aGUgdXJsIGRpc3BsYXllZCBvbiB0aGUgYW5jaG9yIGVsZW1lbnQuXG4gIHZpc2libGVIcmVmOiBzdHJpbmc7XG4gIHRhcmdldDogc3RyaW5nO1xuXG4gIC8vIHRoZSBpbnN0cnVjdGlvbiBwYXNzZWQgdG8gdGhlIHJvdXRlciB0byBuYXZpZ2F0ZVxuICBwcml2YXRlIF9uYXZpZ2F0aW9uSW5zdHJ1Y3Rpb246IEluc3RydWN0aW9uO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3JvdXRlcjogUm91dGVyLCBwcml2YXRlIF9sb2NhdGlvbjogTG9jYXRpb24pIHt9XG5cbiAgZ2V0IGlzUm91dGVBY3RpdmUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl9yb3V0ZXIuaXNSb3V0ZUFjdGl2ZSh0aGlzLl9uYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24pOyB9XG5cbiAgc2V0IHJvdXRlUGFyYW1zKGNoYW5nZXM6IGFueVtdKSB7XG4gICAgdGhpcy5fcm91dGVQYXJhbXMgPSBjaGFuZ2VzO1xuICAgIHRoaXMuX25hdmlnYXRpb25JbnN0cnVjdGlvbiA9IHRoaXMuX3JvdXRlci5nZW5lcmF0ZSh0aGlzLl9yb3V0ZVBhcmFtcyk7XG5cbiAgICB2YXIgbmF2aWdhdGlvbkhyZWYgPSB0aGlzLl9uYXZpZ2F0aW9uSW5zdHJ1Y3Rpb24udG9MaW5rVXJsKCk7XG4gICAgdGhpcy52aXNpYmxlSHJlZiA9IHRoaXMuX2xvY2F0aW9uLnByZXBhcmVFeHRlcm5hbFVybChuYXZpZ2F0aW9uSHJlZik7XG4gIH1cblxuICBvbkNsaWNrKCk6IGJvb2xlYW4ge1xuICAgIC8vIElmIG5vIHRhcmdldCwgb3IgaWYgdGFyZ2V0IGlzIF9zZWxmLCBwcmV2ZW50IGRlZmF1bHQgYnJvd3NlciBiZWhhdmlvclxuICAgIGlmICghaXNTdHJpbmcodGhpcy50YXJnZXQpIHx8IHRoaXMudGFyZ2V0ID09ICdfc2VsZicpIHtcbiAgICAgIHRoaXMuX3JvdXRlci5uYXZpZ2F0ZUJ5SW5zdHJ1Y3Rpb24odGhpcy5fbmF2aWdhdGlvbkluc3RydWN0aW9uKTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyX2xpbmsudHNcbiAqKi8iLCJpbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtFdmVudExpc3RlbmVyLCBIaXN0b3J5LCBMb2NhdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9icm93c2VyJztcblxuLyoqXG4gKiBgUGxhdGZvcm1Mb2NhdGlvbmAgZW5jYXBzdWxhdGVzIGFsbCBvZiB0aGUgZGlyZWN0IGNhbGxzIHRvIHBsYXRmb3JtIEFQSXMuXG4gKiBUaGlzIGNsYXNzIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSBieSBhbiBhcHBsaWNhdGlvbiBkZXZlbG9wZXIuIEluc3RlYWQsIHVzZVxuICoge0BsaW5rIExvY2F0aW9ufS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFBsYXRmb3JtTG9jYXRpb24ge1xuICBwcml2YXRlIF9sb2NhdGlvbjogTG9jYXRpb247XG4gIHByaXZhdGUgX2hpc3Rvcnk6IEhpc3Rvcnk7XG5cbiAgY29uc3RydWN0b3IoKSB7IHRoaXMuX2luaXQoKTsgfVxuXG4gIC8vIFRoaXMgaXMgbW92ZWQgdG8gaXRzIG93biBtZXRob2Qgc28gdGhhdCBgTW9ja1BsYXRmb3JtTG9jYXRpb25TdHJhdGVneWAgY2FuIG92ZXJ3cml0ZSBpdFxuICAvKiogQGludGVybmFsICovXG4gIF9pbml0KCkge1xuICAgIHRoaXMuX2xvY2F0aW9uID0gRE9NLmdldExvY2F0aW9uKCk7XG4gICAgdGhpcy5faGlzdG9yeSA9IERPTS5nZXRIaXN0b3J5KCk7XG4gIH1cblxuICBnZXRCYXNlSHJlZkZyb21ET00oKTogc3RyaW5nIHsgcmV0dXJuIERPTS5nZXRCYXNlSHJlZigpOyB9XG5cbiAgb25Qb3BTdGF0ZShmbjogRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIERPTS5nZXRHbG9iYWxFdmVudFRhcmdldCgnd2luZG93JykuYWRkRXZlbnRMaXN0ZW5lcigncG9wc3RhdGUnLCBmbiwgZmFsc2UpO1xuICB9XG5cbiAgb25IYXNoQ2hhbmdlKGZuOiBFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgRE9NLmdldEdsb2JhbEV2ZW50VGFyZ2V0KCd3aW5kb3cnKS5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgZm4sIGZhbHNlKTtcbiAgfVxuXG4gIGdldCBwYXRobmFtZSgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fbG9jYXRpb24ucGF0aG5hbWU7IH1cbiAgZ2V0IHNlYXJjaCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fbG9jYXRpb24uc2VhcmNoOyB9XG4gIGdldCBoYXNoKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9sb2NhdGlvbi5oYXNoOyB9XG4gIHNldCBwYXRobmFtZShuZXdQYXRoOiBzdHJpbmcpIHsgdGhpcy5fbG9jYXRpb24ucGF0aG5hbWUgPSBuZXdQYXRoOyB9XG5cbiAgcHVzaFN0YXRlKHN0YXRlOiBhbnksIHRpdGxlOiBzdHJpbmcsIHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5faGlzdG9yeS5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICB9XG5cbiAgcmVwbGFjZVN0YXRlKHN0YXRlOiBhbnksIHRpdGxlOiBzdHJpbmcsIHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5faGlzdG9yeS5yZXBsYWNlU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICB9XG5cbiAgZm9yd2FyZCgpOiB2b2lkIHsgdGhpcy5faGlzdG9yeS5mb3J3YXJkKCk7IH1cblxuICBiYWNrKCk6IHZvaWQgeyB0aGlzLl9oaXN0b3J5LmJhY2soKTsgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3JvdXRlci9wbGF0Zm9ybV9sb2NhdGlvbi50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0LCBPcHRpb25hbH0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge1xuICBMb2NhdGlvblN0cmF0ZWd5LFxuICBqb2luV2l0aFNsYXNoLFxuICBBUFBfQkFTRV9IUkVGLFxuICBub3JtYWxpemVRdWVyeVBhcmFtc1xufSBmcm9tICcuL2xvY2F0aW9uX3N0cmF0ZWd5JztcbmltcG9ydCB7RXZlbnRMaXN0ZW5lcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9icm93c2VyJztcbmltcG9ydCB7aXNQcmVzZW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtQbGF0Zm9ybUxvY2F0aW9ufSBmcm9tICcuL3BsYXRmb3JtX2xvY2F0aW9uJztcblxuLyoqXG4gKiBgSGFzaExvY2F0aW9uU3RyYXRlZ3lgIGlzIGEge0BsaW5rIExvY2F0aW9uU3RyYXRlZ3l9IHVzZWQgdG8gY29uZmlndXJlIHRoZVxuICoge0BsaW5rIExvY2F0aW9ufSBzZXJ2aWNlIHRvIHJlcHJlc2VudCBpdHMgc3RhdGUgaW4gdGhlXG4gKiBbaGFzaCBmcmFnbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pZm9ybV9SZXNvdXJjZV9Mb2NhdG9yI1N5bnRheClcbiAqIG9mIHRoZSBicm93c2VyJ3MgVVJMLlxuICpcbiAqIEZvciBpbnN0YW5jZSwgaWYgeW91IGNhbGwgYGxvY2F0aW9uLmdvKCcvZm9vJylgLCB0aGUgYnJvd3NlcidzIFVSTCB3aWxsIGJlY29tZVxuICogYGV4YW1wbGUuY29tIy9mb29gLlxuICpcbiAqICMjIyBFeGFtcGxlXG4gKlxuICogYGBgXG4gKiBpbXBvcnQge0NvbXBvbmVudCwgcHJvdmlkZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG4gKiBpbXBvcnQge1xuICogICBST1VURVJfRElSRUNUSVZFUyxcbiAqICAgUk9VVEVSX1BST1ZJREVSUyxcbiAqICAgUm91dGVDb25maWcsXG4gKiAgIExvY2F0aW9uLFxuICogICBMb2NhdGlvblN0cmF0ZWd5LFxuICogICBIYXNoTG9jYXRpb25TdHJhdGVneVxuICogfSBmcm9tICdhbmd1bGFyMi9yb3V0ZXInO1xuICpcbiAqIEBDb21wb25lbnQoe2RpcmVjdGl2ZXM6IFtST1VURVJfRElSRUNUSVZFU119KVxuICogQFJvdXRlQ29uZmlnKFtcbiAqICB7Li4ufSxcbiAqIF0pXG4gKiBjbGFzcyBBcHBDbXAge1xuICogICBjb25zdHJ1Y3Rvcihsb2NhdGlvbjogTG9jYXRpb24pIHtcbiAqICAgICBsb2NhdGlvbi5nbygnL2ZvbycpO1xuICogICB9XG4gKiB9XG4gKlxuICogYm9vdHN0cmFwKEFwcENtcCwgW1xuICogICBST1VURVJfUFJPVklERVJTLFxuICogICBwcm92aWRlKExvY2F0aW9uU3RyYXRlZ3ksIHt1c2VDbGFzczogSGFzaExvY2F0aW9uU3RyYXRlZ3l9KVxuICogXSk7XG4gKiBgYGBcbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIEhhc2hMb2NhdGlvblN0cmF0ZWd5IGV4dGVuZHMgTG9jYXRpb25TdHJhdGVneSB7XG4gIHByaXZhdGUgX2Jhc2VIcmVmOiBzdHJpbmcgPSAnJztcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfcGxhdGZvcm1Mb2NhdGlvbjogUGxhdGZvcm1Mb2NhdGlvbixcbiAgICAgICAgICAgICAgQE9wdGlvbmFsKCkgQEluamVjdChBUFBfQkFTRV9IUkVGKSBfYmFzZUhyZWY/OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChpc1ByZXNlbnQoX2Jhc2VIcmVmKSkge1xuICAgICAgdGhpcy5fYmFzZUhyZWYgPSBfYmFzZUhyZWY7XG4gICAgfVxuICB9XG5cbiAgb25Qb3BTdGF0ZShmbjogRXZlbnRMaXN0ZW5lcik6IHZvaWQge1xuICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ub25Qb3BTdGF0ZShmbik7XG4gICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5vbkhhc2hDaGFuZ2UoZm4pO1xuICB9XG5cbiAgZ2V0QmFzZUhyZWYoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX2Jhc2VIcmVmOyB9XG5cbiAgcGF0aCgpOiBzdHJpbmcge1xuICAgIC8vIHRoZSBoYXNoIHZhbHVlIGlzIGFsd2F5cyBwcmVmaXhlZCB3aXRoIGEgYCNgXG4gICAgLy8gYW5kIGlmIGl0IGlzIGVtcHR5IHRoZW4gaXQgd2lsbCBzdGF5IGVtcHR5XG4gICAgdmFyIHBhdGggPSB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmhhc2g7XG5cbiAgICAvLyBEYXJ0IHdpbGwgY29tcGxhaW4gaWYgYSBjYWxsIHRvIHN1YnN0cmluZyBpc1xuICAgIC8vIGV4ZWN1dGVkIHdpdGggYSBwb3NpdGlvbiB2YWx1ZSB0aGF0IGV4dGVuZHMgdGhlXG4gICAgLy8gbGVuZ3RoIG9mIHN0cmluZy5cbiAgICByZXR1cm4gKHBhdGgubGVuZ3RoID4gMCA/IHBhdGguc3Vic3RyaW5nKDEpIDogcGF0aCkgK1xuICAgICAgICAgICBub3JtYWxpemVRdWVyeVBhcmFtcyh0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnNlYXJjaCk7XG4gIH1cblxuICBwcmVwYXJlRXh0ZXJuYWxVcmwoaW50ZXJuYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgdmFyIHVybCA9IGpvaW5XaXRoU2xhc2godGhpcy5fYmFzZUhyZWYsIGludGVybmFsKTtcbiAgICByZXR1cm4gdXJsLmxlbmd0aCA+IDAgPyAoJyMnICsgdXJsKSA6IHVybDtcbiAgfVxuXG4gIHB1c2hTdGF0ZShzdGF0ZTogYW55LCB0aXRsZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zOiBzdHJpbmcpIHtcbiAgICB2YXIgdXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwocGF0aCArIG5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zKSk7XG4gICAgaWYgKHVybC5sZW5ndGggPT0gMCkge1xuICAgICAgdXJsID0gdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wYXRobmFtZTtcbiAgICB9XG4gICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpO1xuICB9XG5cbiAgcmVwbGFjZVN0YXRlKHN0YXRlOiBhbnksIHRpdGxlOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgcXVlcnlQYXJhbXM6IHN0cmluZykge1xuICAgIHZhciB1cmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybChwYXRoICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTtcbiAgICBpZiAodXJsLmxlbmd0aCA9PSAwKSB7XG4gICAgICB1cmwgPSB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIH1cbiAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCk7XG4gIH1cblxuICBmb3J3YXJkKCk6IHZvaWQgeyB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmZvcndhcmQoKTsgfVxuXG4gIGJhY2soKTogdm9pZCB7IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uYmFjaygpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvcm91dGVyL2hhc2hfbG9jYXRpb25fc3RyYXRlZ3kudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGUsIEluamVjdCwgT3B0aW9uYWx9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtFdmVudExpc3RlbmVyLCBIaXN0b3J5LCBMb2NhdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9icm93c2VyJztcbmltcG9ydCB7aXNCbGFua30gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7XG4gIExvY2F0aW9uU3RyYXRlZ3ksXG4gIEFQUF9CQVNFX0hSRUYsXG4gIG5vcm1hbGl6ZVF1ZXJ5UGFyYW1zLFxuICBqb2luV2l0aFNsYXNoXG59IGZyb20gJy4vbG9jYXRpb25fc3RyYXRlZ3knO1xuaW1wb3J0IHtQbGF0Zm9ybUxvY2F0aW9ufSBmcm9tICcuL3BsYXRmb3JtX2xvY2F0aW9uJztcblxuLyoqXG4gKiBgUGF0aExvY2F0aW9uU3RyYXRlZ3lgIGlzIGEge0BsaW5rIExvY2F0aW9uU3RyYXRlZ3l9IHVzZWQgdG8gY29uZmlndXJlIHRoZVxuICoge0BsaW5rIExvY2F0aW9ufSBzZXJ2aWNlIHRvIHJlcHJlc2VudCBpdHMgc3RhdGUgaW4gdGhlXG4gKiBbcGF0aF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pZm9ybV9SZXNvdXJjZV9Mb2NhdG9yI1N5bnRheCkgb2YgdGhlXG4gKiBicm93c2VyJ3MgVVJMLlxuICpcbiAqIGBQYXRoTG9jYXRpb25TdHJhdGVneWAgaXMgdGhlIGRlZmF1bHQgYmluZGluZyBmb3Ige0BsaW5rIExvY2F0aW9uU3RyYXRlZ3l9XG4gKiBwcm92aWRlZCBpbiB7QGxpbmsgUk9VVEVSX1BST1ZJREVSU30uXG4gKlxuICogSWYgeW91J3JlIHVzaW5nIGBQYXRoTG9jYXRpb25TdHJhdGVneWAsIHlvdSBtdXN0IHByb3ZpZGUgYSBwcm92aWRlciBmb3JcbiAqIHtAbGluayBBUFBfQkFTRV9IUkVGfSB0byBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIFVSTCBwcmVmaXggdGhhdCBzaG91bGRcbiAqIGJlIHByZXNlcnZlZCB3aGVuIGdlbmVyYXRpbmcgYW5kIHJlY29nbml6aW5nIFVSTHMuXG4gKlxuICogRm9yIGluc3RhbmNlLCBpZiB5b3UgcHJvdmlkZSBhbiBgQVBQX0JBU0VfSFJFRmAgb2YgYCcvbXkvYXBwJ2AgYW5kIGNhbGxcbiAqIGBsb2NhdGlvbi5nbygnL2ZvbycpYCwgdGhlIGJyb3dzZXIncyBVUkwgd2lsbCBiZWNvbWVcbiAqIGBleGFtcGxlLmNvbS9teS9hcHAvZm9vYC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogaW1wb3J0IHtDb21wb25lbnQsIHByb3ZpZGV9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuICogaW1wb3J0IHtcbiAqICAgQVBQX0JBU0VfSFJFRlxuICogICBST1VURVJfRElSRUNUSVZFUyxcbiAqICAgUk9VVEVSX1BST1ZJREVSUyxcbiAqICAgUm91dGVDb25maWcsXG4gKiAgIExvY2F0aW9uXG4gKiB9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlcic7XG4gKlxuICogQENvbXBvbmVudCh7ZGlyZWN0aXZlczogW1JPVVRFUl9ESVJFQ1RJVkVTXX0pXG4gKiBAUm91dGVDb25maWcoW1xuICogIHsuLi59LFxuICogXSlcbiAqIGNsYXNzIEFwcENtcCB7XG4gKiAgIGNvbnN0cnVjdG9yKGxvY2F0aW9uOiBMb2NhdGlvbikge1xuICogICAgIGxvY2F0aW9uLmdvKCcvZm9vJyk7XG4gKiAgIH1cbiAqIH1cbiAqXG4gKiBib290c3RyYXAoQXBwQ21wLCBbXG4gKiAgIFJPVVRFUl9QUk9WSURFUlMsIC8vIGluY2x1ZGVzIGJpbmRpbmcgdG8gUGF0aExvY2F0aW9uU3RyYXRlZ3lcbiAqICAgcHJvdmlkZShBUFBfQkFTRV9IUkVGLCB7dXNlVmFsdWU6ICcvbXkvYXBwJ30pXG4gKiBdKTtcbiAqIGBgYFxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUGF0aExvY2F0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhdGlvblN0cmF0ZWd5IHtcbiAgcHJpdmF0ZSBfYmFzZUhyZWY6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9wbGF0Zm9ybUxvY2F0aW9uOiBQbGF0Zm9ybUxvY2F0aW9uLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBASW5qZWN0KEFQUF9CQVNFX0hSRUYpIGhyZWY/OiBzdHJpbmcpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgaWYgKGlzQmxhbmsoaHJlZikpIHtcbiAgICAgIGhyZWYgPSB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmdldEJhc2VIcmVmRnJvbURPTSgpO1xuICAgIH1cblxuICAgIGlmIChpc0JsYW5rKGhyZWYpKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgTm8gYmFzZSBocmVmIHNldC4gUGxlYXNlIHByb3ZpZGUgYSB2YWx1ZSBmb3IgdGhlIEFQUF9CQVNFX0hSRUYgdG9rZW4gb3IgYWRkIGEgYmFzZSBlbGVtZW50IHRvIHRoZSBkb2N1bWVudC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLl9iYXNlSHJlZiA9IGhyZWY7XG4gIH1cblxuICBvblBvcFN0YXRlKGZuOiBFdmVudExpc3RlbmVyKTogdm9pZCB7XG4gICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5vblBvcFN0YXRlKGZuKTtcbiAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uSGFzaENoYW5nZShmbik7XG4gIH1cblxuICBnZXRCYXNlSHJlZigpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5fYmFzZUhyZWY7IH1cblxuICBwcmVwYXJlRXh0ZXJuYWxVcmwoaW50ZXJuYWw6IHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBqb2luV2l0aFNsYXNoKHRoaXMuX2Jhc2VIcmVmLCBpbnRlcm5hbCk7IH1cblxuICBwYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUgKyBub3JtYWxpemVRdWVyeVBhcmFtcyh0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnNlYXJjaCk7XG4gIH1cblxuICBwdXNoU3RhdGUoc3RhdGU6IGFueSwgdGl0bGU6IHN0cmluZywgdXJsOiBzdHJpbmcsIHF1ZXJ5UGFyYW1zOiBzdHJpbmcpIHtcbiAgICB2YXIgZXh0ZXJuYWxVcmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh1cmwgKyBub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykpO1xuICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucHVzaFN0YXRlKHN0YXRlLCB0aXRsZSwgZXh0ZXJuYWxVcmwpO1xuICB9XG5cbiAgcmVwbGFjZVN0YXRlKHN0YXRlOiBhbnksIHRpdGxlOiBzdHJpbmcsIHVybDogc3RyaW5nLCBxdWVyeVBhcmFtczogc3RyaW5nKSB7XG4gICAgdmFyIGV4dGVybmFsVXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwodXJsICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTtcbiAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIGV4dGVybmFsVXJsKTtcbiAgfVxuXG4gIGZvcndhcmQoKTogdm9pZCB7IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uZm9yd2FyZCgpOyB9XG5cbiAgYmFjaygpOiB2b2lkIHsgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5iYWNrKCk7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvcGF0aF9sb2NhdGlvbl9zdHJhdGVneS50c1xuICoqLyIsImltcG9ydCB7VEVNUExBVEVfVFJBTlNGT1JNU30gZnJvbSAnYW5ndWxhcjIvY29tcGlsZXInO1xuaW1wb3J0IHtQcm92aWRlcn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge1JvdXRlckxpbmtUcmFuc2Zvcm19IGZyb20gJ2FuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyX2xpbmtfdHJhbnNmb3JtJztcbmltcG9ydCB7Q09OU1RfRVhQUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuZXhwb3J0IHtSb3V0ZXJMaW5rVHJhbnNmb3JtfSBmcm9tICdhbmd1bGFyMi9zcmMvcm91dGVyL3JvdXRlcl9saW5rX3RyYW5zZm9ybSc7XG5cbi8qKlxuICogRW5hYmxlcyB0aGUgcm91dGVyIGxpbmsgRFNMLlxuICpcbiAqIFdhcm5pbmcuIFRoaXMgZmVhdHVyZSBpcyBleHBlcmltZW50YWwgYW5kIGNhbiBjaGFuZ2UuXG4gKlxuICogVG8gZW5hYmxlIHRoZSB0cmFuc2Zvcm1lciBwYXNzIHRoZSByb3V0ZXIgbGluayBEU0wgcHJvdmlkZXIgdG8gYGJvb3RzdHJhcGAuXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqIGBgYFxuICogaW1wb3J0IHtib290c3RyYXB9IGZyb20gJ2FuZ3VsYXIyL3BsYXRmb3JtL2Jyb3dzZXInO1xuICogaW1wb3J0IHtST1VURVJfTElOS19EU0xfUFJPVklERVJ9IGZyb20gJ2FuZ3VsYXIyL3JvdXRlci9yb3V0ZXJfbGlua19kc2wnO1xuICpcbiAqIGJvb3RzdHJhcChDdXN0b21BcHAsIFtST1VURVJfTElOS19EU0xfUFJPVklERVJdKTtcbiAqIGBgYFxuICpcbiAqIFRoZSBEU0wgYWxsb3dzIHlvdSB0byBleHByZXNzIHJvdXRlciBsaW5rcyBhcyBmb2xsb3dzOlxuICogYGBgXG4gKiA8YSBbcm91dGVyTGlua109XCJyb3V0ZTpVc2VyXCI+IDwhLS0gU2FtZSBhcyA8YSBbcm91dGVyTGlua109XCJbJ1VzZXInXVwiPiAtLT5cbiAqIDxhIFtyb3V0ZXJMaW5rXT1cInJvdXRlOi9Vc2VyXCI+IDwhLS0gU2FtZSBhcyA8YSBbcm91dGVyTGlua109XCJbJ1VzZXInXVwiPiAtLT5cbiAqIDxhIFtyb3V0ZXJMaW5rXT1cInJvdXRlOi4vVXNlclwiPiA8IS0tIFNhbWUgYXMgPGEgW3JvdXRlckxpbmtdPVwiWycuL1VzZXInXVwiPiAtLT5cbiAqIDxhIFtyb3V0ZXJMaW5rXT1cIi4vVXNlcihpZDogdmFsdWUsIG5hbWU6ICdCb2InKVwiPiA8IS0tIFNhbWUgYXMgPGEgW3JvdXRlckxpbmtdPVwiWycuL1VzZXInLCB7aWQ6XG4gKiB2YWx1ZSwgbmFtZTogJ0JvYid9XVwiPiAtLT5cbiAqIDxhIFtyb3V0ZXJMaW5rXT1cIi9Vc2VyL01vZGFsXCI+IDwhLS0gU2FtZSBhcyA8YSBbcm91dGVyTGlua109XCJbJy9Vc2VyJywgJ01vZGFsJ11cIj4gLS0+XG4gKiA8YSBbcm91dGVyTGlua109XCJVc2VyW01vZGFsXVwiPiA8IS0tIFNhbWUgYXMgPGEgW3JvdXRlckxpbmtdPVwiWydVc2VyJywgWydNb2RhbCddXVwiPiAtLT5cbiAqIGBgYFxuICovXG5leHBvcnQgY29uc3QgUk9VVEVSX0xJTktfRFNMX1BST1ZJREVSID1cbiAgICBDT05TVF9FWFBSKG5ldyBQcm92aWRlcihURU1QTEFURV9UUkFOU0ZPUk1TLCB7dXNlQ2xhc3M6IFJvdXRlckxpbmtUcmFuc2Zvcm0sIG11bHRpOiB0cnVlfSkpO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvcm91dGVyL3JvdXRlcl9saW5rX2RzbC50c1xuICoqLyIsImltcG9ydCB7XG4gIFRlbXBsYXRlQXN0VmlzaXRvcixcbiAgRWxlbWVudEFzdCxcbiAgQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdCxcbiAgRGlyZWN0aXZlQXN0LFxuICBCb3VuZEVsZW1lbnRQcm9wZXJ0eUFzdFxufSBmcm9tICdhbmd1bGFyMi9jb21waWxlcic7XG5pbXBvcnQge1xuICBBc3RUcmFuc2Zvcm1lcixcbiAgUXVvdGUsXG4gIEFTVCxcbiAgRW1wdHlFeHByLFxuICBMaXRlcmFsQXJyYXksXG4gIExpdGVyYWxQcmltaXRpdmUsXG4gIEFTVFdpdGhTb3VyY2Vcbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9wYXJzZXIvYXN0JztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge1BhcnNlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvY2hhbmdlX2RldGVjdGlvbi9wYXJzZXIvcGFyc2VyJztcblxuLyoqXG4gKiBlLmcuLCAnLi9Vc2VyJywgJ01vZGFsJyBpbiAuL1VzZXJbTW9kYWwocGFyYW06IHZhbHVlKV1cbiAqL1xuY2xhc3MgRml4ZWRQYXJ0IHtcbiAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBzdHJpbmcpIHt9XG59XG5cbi8qKlxuICogVGhlIHNxdWFyZSBicmFja2V0XG4gKi9cbmNsYXNzIEF1eGlsaWFyeVN0YXJ0IHtcbiAgY29uc3RydWN0b3IoKSB7fVxufVxuXG4vKipcbiAqIFRoZSBzcXVhcmUgYnJhY2tldFxuICovXG5jbGFzcyBBdXhpbGlhcnlFbmQge1xuICBjb25zdHJ1Y3RvcigpIHt9XG59XG5cbi8qKlxuICogZS5nLiwgcGFyYW06dmFsdWUgaW4gLi9Vc2VyW01vZGFsKHBhcmFtOiB2YWx1ZSldXG4gKi9cbmNsYXNzIFBhcmFtcyB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBhc3Q6IEFTVCkge31cbn1cblxuY2xhc3MgUm91dGVyTGlua0xleGVyIHtcbiAgaW5kZXg6IG51bWJlciA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYXJzZXI6IFBhcnNlciwgcHJpdmF0ZSBleHA6IHN0cmluZykge31cblxuICB0b2tlbml6ZSgpOiBBcnJheTxGaXhlZFBhcnQgfCBBdXhpbGlhcnlTdGFydCB8IEF1eGlsaWFyeUVuZCB8IFBhcmFtcz4ge1xuICAgIGxldCB0b2tlbnMgPSBbXTtcbiAgICB3aGlsZSAodGhpcy5pbmRleCA8IHRoaXMuZXhwLmxlbmd0aCkge1xuICAgICAgdG9rZW5zLnB1c2godGhpcy5fcGFyc2VUb2tlbigpKTtcbiAgICB9XG4gICAgcmV0dXJuIHRva2VucztcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlVG9rZW4oKSB7XG4gICAgbGV0IGMgPSB0aGlzLmV4cFt0aGlzLmluZGV4XTtcbiAgICBpZiAoYyA9PSAnWycpIHtcbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgIHJldHVybiBuZXcgQXV4aWxpYXJ5U3RhcnQoKTtcblxuICAgIH0gZWxzZSBpZiAoYyA9PSAnXScpIHtcbiAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgIHJldHVybiBuZXcgQXV4aWxpYXJ5RW5kKCk7XG5cbiAgICB9IGVsc2UgaWYgKGMgPT0gJygnKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcGFyc2VQYXJhbXMoKTtcblxuICAgIH0gZWxzZSBpZiAoYyA9PSAnLycgJiYgdGhpcy5pbmRleCAhPT0gMCkge1xuICAgICAgdGhpcy5pbmRleCsrO1xuICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlRml4ZWRQYXJ0KCk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3BhcnNlRml4ZWRQYXJ0KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfcGFyc2VQYXJhbXMoKSB7XG4gICAgbGV0IHN0YXJ0ID0gdGhpcy5pbmRleDtcbiAgICBmb3IgKDsgdGhpcy5pbmRleCA8IHRoaXMuZXhwLmxlbmd0aDsgKyt0aGlzLmluZGV4KSB7XG4gICAgICBsZXQgYyA9IHRoaXMuZXhwW3RoaXMuaW5kZXhdO1xuICAgICAgaWYgKGMgPT0gJyknKSB7XG4gICAgICAgIGxldCBwYXJhbXNDb250ZW50ID0gdGhpcy5leHAuc3Vic3RyaW5nKHN0YXJ0ICsgMSwgdGhpcy5pbmRleCk7XG4gICAgICAgIHRoaXMuaW5kZXgrKztcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJhbXModGhpcy5wYXJzZXIucGFyc2VCaW5kaW5nKGB7JHtwYXJhbXNDb250ZW50fX1gLCBudWxsKS5hc3QpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcIkNhbm5vdCBmaW5kICcpJ1wiKTtcbiAgfVxuXG4gIHByaXZhdGUgX3BhcnNlRml4ZWRQYXJ0KCkge1xuICAgIGxldCBzdGFydCA9IHRoaXMuaW5kZXg7XG4gICAgbGV0IHNhd05vblNsYXNoID0gZmFsc2U7XG5cblxuICAgIGZvciAoOyB0aGlzLmluZGV4IDwgdGhpcy5leHAubGVuZ3RoOyArK3RoaXMuaW5kZXgpIHtcbiAgICAgIGxldCBjID0gdGhpcy5leHBbdGhpcy5pbmRleF07XG5cbiAgICAgIGlmIChjID09ICcoJyB8fCBjID09ICdbJyB8fCBjID09ICddJyB8fCAoYyA9PSAnLycgJiYgc2F3Tm9uU2xhc2gpKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBpZiAoYyAhPSAnLicgJiYgYyAhPSAnLycpIHtcbiAgICAgICAgc2F3Tm9uU2xhc2ggPSB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGxldCBmaXhlZCA9IHRoaXMuZXhwLnN1YnN0cmluZyhzdGFydCwgdGhpcy5pbmRleCk7XG5cbiAgICBpZiAoc3RhcnQgPT09IHRoaXMuaW5kZXggfHwgIXNhd05vblNsYXNoIHx8IGZpeGVkLnN0YXJ0c1dpdGgoJy8vJykpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFwiSW52YWxpZCByb3V0ZXIgbGlua1wiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IEZpeGVkUGFydChmaXhlZCk7XG4gIH1cbn1cblxuY2xhc3MgUm91dGVyTGlua0FzdEdlbmVyYXRvciB7XG4gIGluZGV4OiBudW1iZXIgPSAwO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRva2VuczogYW55W10pIHt9XG5cbiAgZ2VuZXJhdGUoKTogQVNUIHsgcmV0dXJuIHRoaXMuX2dlbkF1eGlsaWFyeSgpOyB9XG5cbiAgcHJpdmF0ZSBfZ2VuQXV4aWxpYXJ5KCk6IEFTVCB7XG4gICAgbGV0IGFyciA9IFtdO1xuICAgIGZvciAoOyB0aGlzLmluZGV4IDwgdGhpcy50b2tlbnMubGVuZ3RoOyB0aGlzLmluZGV4KyspIHtcbiAgICAgIGxldCByID0gdGhpcy50b2tlbnNbdGhpcy5pbmRleF07XG5cbiAgICAgIGlmIChyIGluc3RhbmNlb2YgRml4ZWRQYXJ0KSB7XG4gICAgICAgIGFyci5wdXNoKG5ldyBMaXRlcmFsUHJpbWl0aXZlKHIudmFsdWUpKTtcblxuICAgICAgfSBlbHNlIGlmIChyIGluc3RhbmNlb2YgUGFyYW1zKSB7XG4gICAgICAgIGFyci5wdXNoKHIuYXN0KTtcblxuICAgICAgfSBlbHNlIGlmIChyIGluc3RhbmNlb2YgQXV4aWxpYXJ5RW5kKSB7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICB9IGVsc2UgaWYgKHIgaW5zdGFuY2VvZiBBdXhpbGlhcnlTdGFydCkge1xuICAgICAgICB0aGlzLmluZGV4Kys7XG4gICAgICAgIGFyci5wdXNoKHRoaXMuX2dlbkF1eGlsaWFyeSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IExpdGVyYWxBcnJheShhcnIpO1xuICB9XG59XG5cbmNsYXNzIFJvdXRlckxpbmtBc3RUcmFuc2Zvcm1lciBleHRlbmRzIEFzdFRyYW5zZm9ybWVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBwYXJzZXI6IFBhcnNlcikgeyBzdXBlcigpOyB9XG5cbiAgdmlzaXRRdW90ZShhc3Q6IFF1b3RlKTogQVNUIHtcbiAgICBpZiAoYXN0LnByZWZpeCA9PSBcInJvdXRlXCIpIHtcbiAgICAgIHJldHVybiBwYXJzZVJvdXRlckxpbmtFeHByZXNzaW9uKHRoaXMucGFyc2VyLCBhc3QudW5pbnRlcnByZXRlZEV4cHJlc3Npb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3VwZXIudmlzaXRRdW90ZShhc3QpO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VSb3V0ZXJMaW5rRXhwcmVzc2lvbihwYXJzZXI6IFBhcnNlciwgZXhwOiBzdHJpbmcpOiBBU1Qge1xuICBsZXQgdG9rZW5zID0gbmV3IFJvdXRlckxpbmtMZXhlcihwYXJzZXIsIGV4cC50cmltKCkpLnRva2VuaXplKCk7XG4gIHJldHVybiBuZXcgUm91dGVyTGlua0FzdEdlbmVyYXRvcih0b2tlbnMpLmdlbmVyYXRlKCk7XG59XG5cbi8qKlxuICogQSBjb21waWxlciBwbHVnaW4gdGhhdCBpbXBsZW1lbnRzIHRoZSByb3V0ZXIgbGluayBEU0wuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBSb3V0ZXJMaW5rVHJhbnNmb3JtIGltcGxlbWVudHMgVGVtcGxhdGVBc3RWaXNpdG9yIHtcbiAgcHJpdmF0ZSBhc3RUcmFuc2Zvcm1lcjtcblxuICBjb25zdHJ1Y3RvcihwYXJzZXI6IFBhcnNlcikgeyB0aGlzLmFzdFRyYW5zZm9ybWVyID0gbmV3IFJvdXRlckxpbmtBc3RUcmFuc2Zvcm1lcihwYXJzZXIpOyB9XG5cbiAgdmlzaXROZ0NvbnRlbnQoYXN0OiBhbnksIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiBhc3Q7IH1cblxuICB2aXNpdEVtYmVkZGVkVGVtcGxhdGUoYXN0OiBhbnksIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiBhc3Q7IH1cblxuICB2aXNpdEVsZW1lbnQoYXN0OiBFbGVtZW50QXN0LCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIGxldCB1cGRhdGVkQ2hpbGRyZW4gPSBhc3QuY2hpbGRyZW4ubWFwKGMgPT4gYy52aXNpdCh0aGlzLCBjb250ZXh0KSk7XG4gICAgbGV0IHVwZGF0ZWRJbnB1dHMgPSBhc3QuaW5wdXRzLm1hcChjID0+IGMudmlzaXQodGhpcywgY29udGV4dCkpO1xuICAgIGxldCB1cGRhdGVkRGlyZWN0aXZlcyA9IGFzdC5kaXJlY3RpdmVzLm1hcChjID0+IGMudmlzaXQodGhpcywgY29udGV4dCkpO1xuICAgIHJldHVybiBuZXcgRWxlbWVudEFzdChhc3QubmFtZSwgYXN0LmF0dHJzLCB1cGRhdGVkSW5wdXRzLCBhc3Qub3V0cHV0cywgYXN0LmV4cG9ydEFzVmFycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlZERpcmVjdGl2ZXMsIHVwZGF0ZWRDaGlsZHJlbiwgYXN0Lm5nQ29udGVudEluZGV4LCBhc3Quc291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdFZhcmlhYmxlKGFzdDogYW55LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gYXN0OyB9XG5cbiAgdmlzaXRFdmVudChhc3Q6IGFueSwgY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIGFzdDsgfVxuXG4gIHZpc2l0RWxlbWVudFByb3BlcnR5KGFzdDogYW55LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gYXN0OyB9XG5cbiAgdmlzaXRBdHRyKGFzdDogYW55LCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gYXN0OyB9XG5cbiAgdmlzaXRCb3VuZFRleHQoYXN0OiBhbnksIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiBhc3Q7IH1cblxuICB2aXNpdFRleHQoYXN0OiBhbnksIGNvbnRleHQ6IGFueSk6IGFueSB7IHJldHVybiBhc3Q7IH1cblxuICB2aXNpdERpcmVjdGl2ZShhc3Q6IERpcmVjdGl2ZUFzdCwgY29udGV4dDogYW55KTogYW55IHtcbiAgICBsZXQgdXBkYXRlZElucHV0cyA9IGFzdC5pbnB1dHMubWFwKGMgPT4gYy52aXNpdCh0aGlzLCBjb250ZXh0KSk7XG4gICAgcmV0dXJuIG5ldyBEaXJlY3RpdmVBc3QoYXN0LmRpcmVjdGl2ZSwgdXBkYXRlZElucHV0cywgYXN0Lmhvc3RQcm9wZXJ0aWVzLCBhc3QuaG9zdEV2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3QuZXhwb3J0QXNWYXJzLCBhc3Quc291cmNlU3Bhbik7XG4gIH1cblxuICB2aXNpdERpcmVjdGl2ZVByb3BlcnR5KGFzdDogQm91bmREaXJlY3RpdmVQcm9wZXJ0eUFzdCwgY29udGV4dDogYW55KTogYW55IHtcbiAgICBsZXQgdHJhbnNmb3JtZWRWYWx1ZSA9IGFzdC52YWx1ZS52aXNpdCh0aGlzLmFzdFRyYW5zZm9ybWVyKTtcbiAgICByZXR1cm4gbmV3IEJvdW5kRGlyZWN0aXZlUHJvcGVydHlBc3QoYXN0LmRpcmVjdGl2ZU5hbWUsIGFzdC50ZW1wbGF0ZU5hbWUsIHRyYW5zZm9ybWVkVmFsdWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdC5zb3VyY2VTcGFuKTtcbiAgfVxufVxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9yb3V0ZXIvcm91dGVyX2xpbmtfdHJhbnNmb3JtLnRzXG4gKiovIiwiZXhwb3J0IHtcbiAgd3RmQ3JlYXRlU2NvcGUsXG4gIHd0ZkxlYXZlLFxuICB3dGZTdGFydFRpbWVSYW5nZSxcbiAgd3RmRW5kVGltZVJhbmdlLFxuICBXdGZTY29wZUZuXG59IGZyb20gJy4vc3JjL2NvcmUvcHJvZmlsZS9wcm9maWxlJztcblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL2luc3RydW1lbnRhdGlvbi50c1xuICoqLyIsIi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBBZGFwdGVyIGFsbG93aW5nIEFuZ3VsYXJKUyB2MSBhbmQgQW5ndWxhciB2MiB0byBydW4gc2lkZSBieSBzaWRlIGluIHRoZSBzYW1lIGFwcGxpY2F0aW9uLlxuICovXG5leHBvcnQge1VwZ3JhZGVBZGFwdGVyLCBVcGdyYWRlQWRhcHRlclJlZn0gZnJvbSAnLi9zcmMvdXBncmFkZS91cGdyYWRlX2FkYXB0ZXInO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvdXBncmFkZS50c1xuICoqLyIsImltcG9ydCB7XG4gIHByb3ZpZGUsXG4gIHBsYXRmb3JtLFxuICBBcHBsaWNhdGlvblJlZixcbiAgQXBwVmlld01hbmFnZXIsXG4gIENvbXBpbGVyLFxuICBJbmplY3RvcixcbiAgTmdab25lLFxuICBQbGF0Zm9ybVJlZixcbiAgUHJvdG9WaWV3UmVmLFxuICBQcm92aWRlcixcbiAgVHlwZSxcbiAgQVBQTElDQVRJT05fQ09NTU9OX1BST1ZJREVSU1xufSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtCUk9XU0VSX1BST1ZJREVSUywgQlJPV1NFUl9BUFBfUFJPVklERVJTfSBmcm9tICdhbmd1bGFyMi9wbGF0Zm9ybS9icm93c2VyJztcblxuaW1wb3J0IHtnZXRDb21wb25lbnRJbmZvLCBDb21wb25lbnRJbmZvfSBmcm9tICcuL21ldGFkYXRhJztcbmltcG9ydCB7b25FcnJvciwgY29udHJvbGxlcktleX0gZnJvbSAnLi91dGlsJztcbmltcG9ydCB7XG4gIE5HMV9DT01QSUxFLFxuICBORzFfSU5KRUNUT1IsXG4gIE5HMV9QQVJTRSxcbiAgTkcxX1JPT1RfU0NPUEUsXG4gIE5HMV9TQ09QRSxcbiAgTkcyX0FQUF9WSUVXX01BTkFHRVIsXG4gIE5HMl9DT01QSUxFUixcbiAgTkcyX0lOSkVDVE9SLFxuICBORzJfUFJPVE9fVklFV19SRUZfTUFQLFxuICBORzJfWk9ORSxcbiAgUkVRVUlSRV9JTkpFQ1RPUlxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge0Rvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXJ9IGZyb20gJy4vZG93bmdyYWRlX25nMl9hZGFwdGVyJztcbmltcG9ydCB7VXBncmFkZU5nMUNvbXBvbmVudEFkYXB0ZXJCdWlsZGVyfSBmcm9tICcuL3VwZ3JhZGVfbmcxX2FkYXB0ZXInO1xuaW1wb3J0ICogYXMgYW5ndWxhciBmcm9tICcuL2FuZ3VsYXJfanMnO1xuXG52YXIgdXBncmFkZUNvdW50OiBudW1iZXIgPSAwO1xuXG4vKipcbiAqIFVzZSBgVXBncmFkZUFkYXB0ZXJgIHRvIGFsbG93IEFuZ3VsYXJKUyB2MSBhbmQgQW5ndWxhciB2MiB0byBjb2V4aXN0IGluIGEgc2luZ2xlIGFwcGxpY2F0aW9uLlxuICpcbiAqIFRoZSBgVXBncmFkZUFkYXB0ZXJgIGFsbG93czpcbiAqIDEuIGNyZWF0aW9uIG9mIEFuZ3VsYXIgdjIgY29tcG9uZW50IGZyb20gQW5ndWxhckpTIHYxIGNvbXBvbmVudCBkaXJlY3RpdmVcbiAqICAgIChTZWUgW1VwZ3JhZGVBZGFwdGVyI3VwZ3JhZGVOZzFDb21wb25lbnQoKV0pXG4gKiAyLiBjcmVhdGlvbiBvZiBBbmd1bGFySlMgdjEgZGlyZWN0aXZlIGZyb20gQW5ndWxhciB2MiBjb21wb25lbnQuXG4gKiAgICAoU2VlIFtVcGdyYWRlQWRhcHRlciNkb3duZ3JhZGVOZzJDb21wb25lbnQoKV0pXG4gKiAzLiBCb290c3RyYXBwaW5nIG9mIGEgaHlicmlkIEFuZ3VsYXIgYXBwbGljYXRpb24gd2hpY2ggY29udGFpbnMgYm90aCBvZiB0aGUgZnJhbWV3b3Jrc1xuICogICAgY29leGlzdGluZyBpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbi5cbiAqXG4gKiAjIyBNZW50YWwgTW9kZWxcbiAqXG4gKiBXaGVuIHJlYXNvbmluZyBhYm91dCBob3cgYSBoeWJyaWQgYXBwbGljYXRpb24gd29ya3MgaXQgaXMgdXNlZnVsIHRvIGhhdmUgYSBtZW50YWwgbW9kZWwgd2hpY2hcbiAqIGRlc2NyaWJlcyB3aGF0IGlzIGhhcHBlbmluZyBhbmQgZXhwbGFpbnMgd2hhdCBpcyBoYXBwZW5pbmcgYXQgdGhlIGxvd2VzdCBsZXZlbC5cbiAqXG4gKiAxLiBUaGVyZSBhcmUgdHdvIGluZGVwZW5kZW50IGZyYW1ld29ya3MgcnVubmluZyBpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbiwgZWFjaCBmcmFtZXdvcmsgdHJlYXRzXG4gKiAgICB0aGUgb3RoZXIgYXMgYSBibGFjayBib3guXG4gKiAyLiBFYWNoIERPTSBlbGVtZW50IG9uIHRoZSBwYWdlIGlzIG93bmVkIGV4YWN0bHkgYnkgb25lIGZyYW1ld29yay4gV2hpY2hldmVyIGZyYW1ld29ya1xuICogICAgaW5zdGFudGlhdGVkIHRoZSBlbGVtZW50IGlzIHRoZSBvd25lci4gRWFjaCBmcmFtZXdvcmsgb25seSB1cGRhdGVzL2ludGVyYWN0cyB3aXRoIGl0cyBvd25cbiAqICAgIERPTSBlbGVtZW50cyBhbmQgaWdub3JlcyBvdGhlcnMuXG4gKiAzLiBBbmd1bGFySlMgdjEgZGlyZWN0aXZlcyBhbHdheXMgZXhlY3V0ZSBpbnNpZGUgQW5ndWxhckpTIHYxIGZyYW1ld29yayBjb2RlYmFzZSByZWdhcmRsZXNzIG9mXG4gKiAgICB3aGVyZSB0aGV5IGFyZSBpbnN0YW50aWF0ZWQuXG4gKiA0LiBBbmd1bGFyIHYyIGNvbXBvbmVudHMgYWx3YXlzIGV4ZWN1dGUgaW5zaWRlIEFuZ3VsYXIgdjIgZnJhbWV3b3JrIGNvZGViYXNlIHJlZ2FyZGxlc3Mgb2ZcbiAqICAgIHdoZXJlIHRoZXkgYXJlIGluc3RhbnRpYXRlZC5cbiAqIDUuIEFuIEFuZ3VsYXJKUyB2MSBjb21wb25lbnQgY2FuIGJlIHVwZ3JhZGVkIHRvIGFuIEFuZ3VsYXIgdjIgY29tcG9uZW50LiBUaGlzIGNyZWF0ZXMgYW5cbiAqICAgIEFuZ3VsYXIgdjIgZGlyZWN0aXZlLCB3aGljaCBib290c3RyYXBzIHRoZSBBbmd1bGFySlMgdjEgY29tcG9uZW50IGRpcmVjdGl2ZSBpbiB0aGF0IGxvY2F0aW9uLlxuICogNi4gQW4gQW5ndWxhciB2MiBjb21wb25lbnQgY2FuIGJlIGRvd25ncmFkZWQgdG8gYW4gQW5ndWxhckpTIHYxIGNvbXBvbmVudCBkaXJlY3RpdmUuIFRoaXMgY3JlYXRlc1xuICogICAgYW4gQW5ndWxhckpTIHYxIGRpcmVjdGl2ZSwgd2hpY2ggYm9vdHN0cmFwcyB0aGUgQW5ndWxhciB2MiBjb21wb25lbnQgaW4gdGhhdCBsb2NhdGlvbi5cbiAqIDcuIFdoZW5ldmVyIGFuIGFkYXB0ZXIgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCB0aGUgaG9zdCBlbGVtZW50IGlzIG93bmVkIGJ5IHRoZSBmcmFtZXdvcmtcbiAqICAgIGRvaW5nIHRoZSBpbnN0YW50aWF0aW9uLiBUaGUgb3RoZXIgZnJhbWV3b3JrIHRoZW4gaW5zdGFudGlhdGVzIGFuZCBvd25zIHRoZSB2aWV3IGZvciB0aGF0XG4gKiAgICBjb21wb25lbnQuIFRoaXMgaW1wbGllcyB0aGF0IGNvbXBvbmVudCBiaW5kaW5ncyB3aWxsIGFsd2F5cyBmb2xsb3cgdGhlIHNlbWFudGljcyBvZiB0aGVcbiAqICAgIGluc3RhbnRpYXRpb24gZnJhbWV3b3JrLiBUaGUgc3ludGF4IGlzIGFsd2F5cyB0aGF0IG9mIEFuZ3VsYXIgdjIgc3ludGF4LlxuICogOC4gQW5ndWxhckpTIHYxIGlzIGFsd2F5cyBib290c3RyYXBwZWQgZmlyc3QgYW5kIG93bnMgdGhlIGJvdHRvbSBtb3N0IHZpZXcuXG4gKiA5LiBUaGUgbmV3IGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW4gQW5ndWxhciB2MiB6b25lLCBhbmQgdGhlcmVmb3JlIGl0IG5vIGxvbmdlciBuZWVkcyBjYWxscyB0b1xuICogICAgYCRhcHBseSgpYC5cbiAqXG4gKiAjIyMgRXhhbXBsZVxuICpcbiAqIGBgYFxuICogdmFyIGFkYXB0ZXIgPSBuZXcgVXBncmFkZUFkYXB0ZXIoKTtcbiAqIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnbXlFeGFtcGxlJywgW10pO1xuICogbW9kdWxlLmRpcmVjdGl2ZSgnbmcyJywgYWRhcHRlci5kb3duZ3JhZGVOZzJDb21wb25lbnQoTmcyKSk7XG4gKlxuICogbW9kdWxlLmRpcmVjdGl2ZSgnbmcxJywgZnVuY3Rpb24oKSB7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgIHNjb3BlOiB7IHRpdGxlOiAnPScgfSxcbiAqICAgICAgdGVtcGxhdGU6ICduZzFbSGVsbG8ge3t0aXRsZX19IV0oPHNwYW4gbmctdHJhbnNjbHVkZT48L3NwYW4+KSdcbiAqICAgfTtcbiAqIH0pO1xuICpcbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICAgc2VsZWN0b3I6ICduZzInLFxuICogICBpbnB1dHM6IFsnbmFtZSddLFxuICogICB0ZW1wbGF0ZTogJ25nMls8bmcxIFt0aXRsZV09XCJuYW1lXCI+dHJhbnNjbHVkZTwvbmcxPl0oPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PiknLFxuICogICBkaXJlY3RpdmVzOiBbYWRhcHRlci51cGdyYWRlTmcxQ29tcG9uZW50KCduZzEnKV1cbiAqIH0pXG4gKiBjbGFzcyBOZzIge1xuICogfVxuICpcbiAqIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gJzxuZzIgbmFtZT1cIldvcmxkXCI+cHJvamVjdDwvbmcyPic7XG4gKlxuICogYWRhcHRlci5ib290c3RyYXAoZG9jdW1lbnQuYm9keSwgWydteUV4YW1wbGUnXSkucmVhZHkoZnVuY3Rpb24oKSB7XG4gKiAgIGV4cGVjdChkb2N1bWVudC5ib2R5LnRleHRDb250ZW50KS50b0VxdWFsKFxuICogICAgICAgXCJuZzJbbmcxW0hlbGxvIFdvcmxkIV0odHJhbnNjbHVkZSldKHByb2plY3QpXCIpO1xuICogfSk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIFVwZ3JhZGVBZGFwdGVyIHtcbiAgLyogQGludGVybmFsICovXG4gIHByaXZhdGUgaWRQcmVmaXg6IHN0cmluZyA9IGBORzJfVVBHUkFERV8ke3VwZ3JhZGVDb3VudCsrfV9gO1xuICAvKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSB1cGdyYWRlZENvbXBvbmVudHM6IFR5cGVbXSA9IFtdO1xuICAvKiBAaW50ZXJuYWwgKi9cbiAgcHJpdmF0ZSBkb3duZ3JhZGVkQ29tcG9uZW50czoge1tuYW1lOiBzdHJpbmddOiBVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXJ9ID0ge307XG4gIC8qIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIHByb3ZpZGVyczogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+ID0gW107XG5cbiAgLyoqXG4gICAqIEFsbG93cyBBbmd1bGFyIHYyIENvbXBvbmVudCB0byBiZSB1c2VkIGZyb20gQW5ndWxhckpTIHYxLlxuICAgKlxuICAgKiBVc2UgYGRvd25ncmFkZU5nMkNvbXBvbmVudGAgdG8gY3JlYXRlIGFuIEFuZ3VsYXJKUyB2MSBEaXJlY3RpdmUgRGVmaW5pdGlvbiBGYWN0b3J5IGZyb21cbiAgICogQW5ndWxhciB2MiBDb21wb25lbnQuIFRoZSBhZGFwdGVyIHdpbGwgYm9vdHN0cmFwIEFuZ3VsYXIgdjIgY29tcG9uZW50IGZyb20gd2l0aGluIHRoZVxuICAgKiBBbmd1bGFySlMgdjEgdGVtcGxhdGUuXG4gICAqXG4gICAqICMjIE1lbnRhbCBNb2RlbFxuICAgKlxuICAgKiAxLiBUaGUgY29tcG9uZW50IGlzIGluc3RhbnRpYXRlZCBieSBiZWluZyBsaXN0ZWQgaW4gQW5ndWxhckpTIHYxIHRlbXBsYXRlLiBUaGlzIG1lYW5zIHRoYXQgdGhlXG4gICAqICAgIGhvc3QgZWxlbWVudCBpcyBjb250cm9sbGVkIGJ5IEFuZ3VsYXJKUyB2MSwgYnV0IHRoZSBjb21wb25lbnQncyB2aWV3IHdpbGwgYmUgY29udHJvbGxlZCBieVxuICAgKiAgICBBbmd1bGFyIHYyLlxuICAgKiAyLiBFdmVuIHRob3VnaHQgdGhlIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgaW4gQW5ndWxhckpTIHYxLCBpdCB3aWxsIGJlIHVzaW5nIEFuZ3VsYXIgdjJcbiAgICogICAgc3ludGF4LiBUaGlzIGhhcyB0byBiZSBkb25lLCB0aGlzIHdheSBiZWNhdXNlIHdlIG11c3QgZm9sbG93IEFuZ3VsYXIgdjIgY29tcG9uZW50cyBkbyBub3RcbiAgICogICAgZGVjbGFyZSBob3cgdGhlIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGludGVycHJldGVkLlxuICAgKlxuICAgKiAjIyBTdXBwb3J0ZWQgRmVhdHVyZXNcbiAgICpcbiAgICogLSBCaW5kaW5nczpcbiAgICogICAtIEF0dHJpYnV0ZTogYDxjb21wIG5hbWU9XCJXb3JsZFwiPmBcbiAgICogICAtIEludGVycG9sYXRpb246ICBgPGNvbXAgZ3JlZXRpbmc9XCJIZWxsbyB7e25hbWV9fSFcIj5gXG4gICAqICAgLSBFeHByZXNzaW9uOiAgYDxjb21wIFtuYW1lXT1cInVzZXJuYW1lXCI+YFxuICAgKiAgIC0gRXZlbnQ6ICBgPGNvbXAgKGNsb3NlKT1cImRvU29tZXRoaW5nKClcIj5gXG4gICAqIC0gQ29udGVudCBwcm9qZWN0aW9uOiB5ZXNcbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgXG4gICAqIHZhciBhZGFwdGVyID0gbmV3IFVwZ3JhZGVBZGFwdGVyKCk7XG4gICAqIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnbXlFeGFtcGxlJywgW10pO1xuICAgKiBtb2R1bGUuZGlyZWN0aXZlKCdncmVldCcsIGFkYXB0ZXIuZG93bmdyYWRlTmcyQ29tcG9uZW50KEdyZWV0ZXIpKTtcbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICdncmVldCcsXG4gICAqICAgdGVtcGxhdGU6ICd7e3NhbHV0YXRpb259fSB7e25hbWV9fSEgLSA8bmctY29udGVudD48L25nLWNvbnRlbnQ+J1xuICAgKiB9KVxuICAgKiBjbGFzcyBHcmVldGVyIHtcbiAgICogICBASW5wdXQoKSBzYWx1dGF0aW9uOiBzdHJpbmc7XG4gICAqICAgQElucHV0KCkgbmFtZTogc3RyaW5nO1xuICAgKiB9XG4gICAqXG4gICAqIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID1cbiAgICogICAnbmcxIHRlbXBsYXRlOiA8Z3JlZXQgc2FsdXRhdGlvbj1cIkhlbGxvXCIgW25hbWVdPVwid29ybGRcIj50ZXh0PC9ncmVldD4nO1xuICAgKlxuICAgKiBhZGFwdGVyLmJvb3RzdHJhcChkb2N1bWVudC5ib2R5LCBbJ215RXhhbXBsZSddKS5yZWFkeShmdW5jdGlvbigpIHtcbiAgICogICBleHBlY3QoZG9jdW1lbnQuYm9keS50ZXh0Q29udGVudCkudG9FcXVhbChcIm5nMSB0ZW1wbGF0ZTogSGVsbG8gd29ybGQhIC0gdGV4dFwiKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgZG93bmdyYWRlTmcyQ29tcG9uZW50KHR5cGU6IFR5cGUpOiBGdW5jdGlvbiB7XG4gICAgdGhpcy51cGdyYWRlZENvbXBvbmVudHMucHVzaCh0eXBlKTtcbiAgICB2YXIgaW5mbzogQ29tcG9uZW50SW5mbyA9IGdldENvbXBvbmVudEluZm8odHlwZSk7XG4gICAgcmV0dXJuIG5nMUNvbXBvbmVudERpcmVjdGl2ZShpbmZvLCBgJHt0aGlzLmlkUHJlZml4fSR7aW5mby5zZWxlY3Rvcn1fY2ApO1xuICB9XG5cbiAgLyoqXG4gICAqIEFsbG93cyBBbmd1bGFySlMgdjEgQ29tcG9uZW50IHRvIGJlIHVzZWQgZnJvbSBBbmd1bGFyIHYyLlxuICAgKlxuICAgKiBVc2UgYHVwZ3JhZGVOZzFDb21wb25lbnRgIHRvIGNyZWF0ZSBhbiBBbmd1bGFyIHYyIGNvbXBvbmVudCBmcm9tIEFuZ3VsYXJKUyB2MSBDb21wb25lbnRcbiAgICogZGlyZWN0aXZlLiBUaGUgYWRhcHRlciB3aWxsIGJvb3RzdHJhcCBBbmd1bGFySlMgdjEgY29tcG9uZW50IGZyb20gd2l0aGluIHRoZSBBbmd1bGFyIHYyXG4gICAqIHRlbXBsYXRlLlxuICAgKlxuICAgKiAjIyBNZW50YWwgTW9kZWxcbiAgICpcbiAgICogMS4gVGhlIGNvbXBvbmVudCBpcyBpbnN0YW50aWF0ZWQgYnkgYmVpbmcgbGlzdGVkIGluIEFuZ3VsYXIgdjIgdGVtcGxhdGUuIFRoaXMgbWVhbnMgdGhhdCB0aGVcbiAgICogICAgaG9zdCBlbGVtZW50IGlzIGNvbnRyb2xsZWQgYnkgQW5ndWxhciB2MiwgYnV0IHRoZSBjb21wb25lbnQncyB2aWV3IHdpbGwgYmUgY29udHJvbGxlZCBieVxuICAgKiAgICBBbmd1bGFySlMgdjEuXG4gICAqXG4gICAqICMjIFN1cHBvcnRlZCBGZWF0dXJlc1xuICAgKlxuICAgKiAtIEJpbmRpbmdzOlxuICAgKiAgIC0gQXR0cmlidXRlOiBgPGNvbXAgbmFtZT1cIldvcmxkXCI+YFxuICAgKiAgIC0gSW50ZXJwb2xhdGlvbjogIGA8Y29tcCBncmVldGluZz1cIkhlbGxvIHt7bmFtZX19IVwiPmBcbiAgICogICAtIEV4cHJlc3Npb246ICBgPGNvbXAgW25hbWVdPVwidXNlcm5hbWVcIj5gXG4gICAqICAgLSBFdmVudDogIGA8Y29tcCAoY2xvc2UpPVwiZG9Tb21ldGhpbmcoKVwiPmBcbiAgICogLSBUcmFuc2NsdXNpb246IHllc1xuICAgKiAtIE9ubHkgc29tZSBvZiB0aGUgZmVhdHVyZXMgb2ZcbiAgICogICBbRGlyZWN0aXZlIERlZmluaXRpb24gT2JqZWN0XShodHRwczovL2RvY3MuYW5ndWxhcmpzLm9yZy9hcGkvbmcvc2VydmljZS8kY29tcGlsZSkgYXJlXG4gICAqICAgc3VwcG9ydGVkOlxuICAgKiAgIC0gYGNvbXBpbGVgOiBub3Qgc3VwcG9ydGVkIGJlY2F1c2UgdGhlIGhvc3QgZWxlbWVudCBpcyBvd25lZCBieSBBbmd1bGFyIHYyLCB3aGljaCBkb2VzXG4gICAqICAgICBub3QgYWxsb3cgbW9kaWZ5aW5nIERPTSBzdHJ1Y3R1cmUgZHVyaW5nIGNvbXBpbGF0aW9uLlxuICAgKiAgIC0gYGNvbnRyb2xsZXJgOiBzdXBwb3J0ZWQuIChOT1RFOiBpbmplY3Rpb24gb2YgYCRhdHRyc2AgYW5kIGAkdHJhbnNjbHVkZWAgaXMgbm90IHN1cHBvcnRlZC4pXG4gICAqICAgLSBgY29udHJvbGxlckFzJzogc3VwcG9ydGVkLlxuICAgKiAgIC0gYGJpbmRUb0NvbnRyb2xsZXInOiBzdXBwb3J0ZWQuXG4gICAqICAgLSBgbGluayc6IHN1cHBvcnRlZC4gKE5PVEU6IG9ubHkgcHJlLWxpbmsgZnVuY3Rpb24gaXMgc3VwcG9ydGVkLilcbiAgICogICAtIGBuYW1lJzogc3VwcG9ydGVkLlxuICAgKiAgIC0gYHByaW9yaXR5JzogaWdub3JlZC5cbiAgICogICAtIGByZXBsYWNlJzogbm90IHN1cHBvcnRlZC5cbiAgICogICAtIGByZXF1aXJlYDogc3VwcG9ydGVkLlxuICAgKiAgIC0gYHJlc3RyaWN0YDogbXVzdCBiZSBzZXQgdG8gJ0UnLlxuICAgKiAgIC0gYHNjb3BlYDogc3VwcG9ydGVkLlxuICAgKiAgIC0gYHRlbXBsYXRlYDogc3VwcG9ydGVkLlxuICAgKiAgIC0gYHRlbXBsYXRlVXJsYDogc3VwcG9ydGVkLlxuICAgKiAgIC0gYHRlcm1pbmFsYDogaWdub3JlZC5cbiAgICogICAtIGB0cmFuc2NsdWRlYDogc3VwcG9ydGVkLlxuICAgKlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogdmFyIGFkYXB0ZXIgPSBuZXcgVXBncmFkZUFkYXB0ZXIoKTtcbiAgICogdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdteUV4YW1wbGUnLCBbXSk7XG4gICAqXG4gICAqIG1vZHVsZS5kaXJlY3RpdmUoJ2dyZWV0JywgZnVuY3Rpb24oKSB7XG4gICAqICAgcmV0dXJuIHtcbiAgICogICAgIHNjb3BlOiB7c2FsdXRhdGlvbjogJz0nLCBuYW1lOiAnPScgfSxcbiAgICogICAgIHRlbXBsYXRlOiAne3tzYWx1dGF0aW9ufX0ge3tuYW1lfX0hIC0gPHNwYW4gbmctdHJhbnNjbHVkZT48L3NwYW4+J1xuICAgKiAgIH07XG4gICAqIH0pO1xuICAgKlxuICAgKiBtb2R1bGUuZGlyZWN0aXZlKCduZzInLCBhZGFwdGVyLmRvd25ncmFkZU5nMkNvbXBvbmVudChOZzIpKTtcbiAgICpcbiAgICogQENvbXBvbmVudCh7XG4gICAqICAgc2VsZWN0b3I6ICduZzInLFxuICAgKiAgIHRlbXBsYXRlOiAnbmcyIHRlbXBsYXRlOiA8Z3JlZXQgc2FsdXRhdGlvbj1cIkhlbGxvXCIgW25hbWVdPVwid29ybGRcIj50ZXh0PC9ncmVldD4nXG4gICAqICAgZGlyZWN0aXZlczogW2FkYXB0ZXIudXBncmFkZU5nMUNvbXBvbmVudCgnZ3JlZXQnKV1cbiAgICogfSlcbiAgICogY2xhc3MgTmcyIHtcbiAgICogfVxuICAgKlxuICAgKiBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9ICc8bmcyPjwvbmcyPic7XG4gICAqXG4gICAqIGFkYXB0ZXIuYm9vdHN0cmFwKGRvY3VtZW50LmJvZHksIFsnbXlFeGFtcGxlJ10pLnJlYWR5KGZ1bmN0aW9uKCkge1xuICAgKiAgIGV4cGVjdChkb2N1bWVudC5ib2R5LnRleHRDb250ZW50KS50b0VxdWFsKFwibmcyIHRlbXBsYXRlOiBIZWxsbyB3b3JsZCEgLSB0ZXh0XCIpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICB1cGdyYWRlTmcxQ29tcG9uZW50KG5hbWU6IHN0cmluZyk6IFR5cGUge1xuICAgIGlmICgoPGFueT50aGlzLmRvd25ncmFkZWRDb21wb25lbnRzKS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgcmV0dXJuIHRoaXMuZG93bmdyYWRlZENvbXBvbmVudHNbbmFtZV0udHlwZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICh0aGlzLmRvd25ncmFkZWRDb21wb25lbnRzW25hbWVdID0gbmV3IFVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlcihuYW1lKSkudHlwZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQm9vdHN0cmFwIGEgaHlicmlkIEFuZ3VsYXJKUyB2MSAvIEFuZ3VsYXIgdjIgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIFRoaXMgYGJvb3RzdHJhcGAgbWV0aG9kIGlzIGEgZGlyZWN0IHJlcGxhY2VtZW50ICh0YWtlcyBzYW1lIGFyZ3VtZW50cykgZm9yIEFuZ3VsYXJKUyB2MVxuICAgKiBbYGJvb3RzdHJhcGBdKGh0dHBzOi8vZG9jcy5hbmd1bGFyanMub3JnL2FwaS9uZy9mdW5jdGlvbi9hbmd1bGFyLmJvb3RzdHJhcCkgbWV0aG9kLiBVbmxpa2VcbiAgICogQW5ndWxhckpTIHYxLCB0aGlzIGJvb3RzdHJhcCBpcyBhc3luY2hyb25vdXMuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiB2YXIgYWRhcHRlciA9IG5ldyBVcGdyYWRlQWRhcHRlcigpO1xuICAgKiB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ215RXhhbXBsZScsIFtdKTtcbiAgICogbW9kdWxlLmRpcmVjdGl2ZSgnbmcyJywgYWRhcHRlci5kb3duZ3JhZGVOZzJDb21wb25lbnQoTmcyKSk7XG4gICAqXG4gICAqIG1vZHVsZS5kaXJlY3RpdmUoJ25nMScsIGZ1bmN0aW9uKCkge1xuICAgKiAgIHJldHVybiB7XG4gICAqICAgICAgc2NvcGU6IHsgdGl0bGU6ICc9JyB9LFxuICAgKiAgICAgIHRlbXBsYXRlOiAnbmcxW0hlbGxvIHt7dGl0bGV9fSFdKDxzcGFuIG5nLXRyYW5zY2x1ZGU+PC9zcGFuPiknXG4gICAqICAgfTtcbiAgICogfSk7XG4gICAqXG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnbmcyJyxcbiAgICogICBpbnB1dHM6IFsnbmFtZSddLFxuICAgKiAgIHRlbXBsYXRlOiAnbmcyWzxuZzEgW3RpdGxlXT1cIm5hbWVcIj50cmFuc2NsdWRlPC9uZzE+XSg8bmctY29udGVudD48L25nLWNvbnRlbnQ+KScsXG4gICAqICAgZGlyZWN0aXZlczogW2FkYXB0ZXIudXBncmFkZU5nMUNvbXBvbmVudCgnbmcxJyldXG4gICAqIH0pXG4gICAqIGNsYXNzIE5nMiB7XG4gICAqIH1cbiAgICpcbiAgICogZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnPG5nMiBuYW1lPVwiV29ybGRcIj5wcm9qZWN0PC9uZzI+JztcbiAgICpcbiAgICogYWRhcHRlci5ib290c3RyYXAoZG9jdW1lbnQuYm9keSwgWydteUV4YW1wbGUnXSkucmVhZHkoZnVuY3Rpb24oKSB7XG4gICAqICAgZXhwZWN0KGRvY3VtZW50LmJvZHkudGV4dENvbnRlbnQpLnRvRXF1YWwoXG4gICAqICAgICAgIFwibmcyW25nMVtIZWxsbyBXb3JsZCFdKHRyYW5zY2x1ZGUpXShwcm9qZWN0KVwiKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgYm9vdHN0cmFwKGVsZW1lbnQ6IEVsZW1lbnQsIG1vZHVsZXM/OiBhbnlbXSxcbiAgICAgICAgICAgIGNvbmZpZz86IGFuZ3VsYXIuSUFuZ3VsYXJCb290c3RyYXBDb25maWcpOiBVcGdyYWRlQWRhcHRlclJlZiB7XG4gICAgdmFyIHVwZ3JhZGUgPSBuZXcgVXBncmFkZUFkYXB0ZXJSZWYoKTtcbiAgICB2YXIgbmcxSW5qZWN0b3I6IGFuZ3VsYXIuSUluamVjdG9yU2VydmljZSA9IG51bGw7XG4gICAgdmFyIHBsYXRmb3JtUmVmOiBQbGF0Zm9ybVJlZiA9IHBsYXRmb3JtKEJST1dTRVJfUFJPVklERVJTKTtcbiAgICB2YXIgYXBwbGljYXRpb25SZWY6IEFwcGxpY2F0aW9uUmVmID0gcGxhdGZvcm1SZWYuYXBwbGljYXRpb24oW1xuICAgICAgQlJPV1NFUl9BUFBfUFJPVklERVJTLFxuICAgICAgcHJvdmlkZShORzFfSU5KRUNUT1IsIHt1c2VGYWN0b3J5OiAoKSA9PiBuZzFJbmplY3Rvcn0pLFxuICAgICAgcHJvdmlkZShORzFfQ09NUElMRSwge3VzZUZhY3Rvcnk6ICgpID0+IG5nMUluamVjdG9yLmdldChORzFfQ09NUElMRSl9KSxcbiAgICAgIHRoaXMucHJvdmlkZXJzXG4gICAgXSk7XG4gICAgdmFyIGluamVjdG9yOiBJbmplY3RvciA9IGFwcGxpY2F0aW9uUmVmLmluamVjdG9yO1xuICAgIHZhciBuZ1pvbmU6IE5nWm9uZSA9IGluamVjdG9yLmdldChOZ1pvbmUpO1xuICAgIHZhciBjb21waWxlcjogQ29tcGlsZXIgPSBpbmplY3Rvci5nZXQoQ29tcGlsZXIpO1xuICAgIHZhciBkZWxheUFwcGx5RXhwczogRnVuY3Rpb25bXSA9IFtdO1xuICAgIHZhciBvcmlnaW5hbCRhcHBseUZuOiBGdW5jdGlvbjtcbiAgICB2YXIgcm9vdFNjb3BlUHJvdG90eXBlOiBhbnk7XG4gICAgdmFyIHJvb3RTY29wZTogYW5ndWxhci5JUm9vdFNjb3BlU2VydmljZTtcbiAgICB2YXIgcHJvdG9WaWV3UmVmTWFwOiBQcm90b1ZpZXdSZWZNYXAgPSB7fTtcbiAgICB2YXIgbmcxTW9kdWxlID0gYW5ndWxhci5tb2R1bGUodGhpcy5pZFByZWZpeCwgbW9kdWxlcyk7XG4gICAgdmFyIG5nMWNvbXBpbGVQcm9taXNlOiBQcm9taXNlPGFueT4gPSBudWxsO1xuICAgIG5nMU1vZHVsZS52YWx1ZShORzJfSU5KRUNUT1IsIGluamVjdG9yKVxuICAgICAgICAudmFsdWUoTkcyX1pPTkUsIG5nWm9uZSlcbiAgICAgICAgLnZhbHVlKE5HMl9DT01QSUxFUiwgY29tcGlsZXIpXG4gICAgICAgIC52YWx1ZShORzJfUFJPVE9fVklFV19SRUZfTUFQLCBwcm90b1ZpZXdSZWZNYXApXG4gICAgICAgIC52YWx1ZShORzJfQVBQX1ZJRVdfTUFOQUdFUiwgaW5qZWN0b3IuZ2V0KEFwcFZpZXdNYW5hZ2VyKSlcbiAgICAgICAgLmNvbmZpZyhbXG4gICAgICAgICAgJyRwcm92aWRlJyxcbiAgICAgICAgICAocHJvdmlkZSkgPT4ge1xuICAgICAgICAgICAgcHJvdmlkZS5kZWNvcmF0b3IoTkcxX1JPT1RfU0NPUEUsIFtcbiAgICAgICAgICAgICAgJyRkZWxlZ2F0ZScsXG4gICAgICAgICAgICAgIGZ1bmN0aW9uKHJvb3RTY29wZURlbGVnYXRlOiBhbmd1bGFyLklSb290U2NvcGVTZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgcm9vdFNjb3BlUHJvdG90eXBlID0gcm9vdFNjb3BlRGVsZWdhdGUuY29uc3RydWN0b3IucHJvdG90eXBlO1xuICAgICAgICAgICAgICAgIGlmIChyb290U2NvcGVQcm90b3R5cGUuaGFzT3duUHJvcGVydHkoJyRhcHBseScpKSB7XG4gICAgICAgICAgICAgICAgICBvcmlnaW5hbCRhcHBseUZuID0gcm9vdFNjb3BlUHJvdG90eXBlLiRhcHBseTtcbiAgICAgICAgICAgICAgICAgIHJvb3RTY29wZVByb3RvdHlwZS4kYXBwbHkgPSAoZXhwKSA9PiBkZWxheUFwcGx5RXhwcy5wdXNoKGV4cCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkZhaWxlZCB0byBmaW5kICckYXBwbHknIG9uICckcm9vdFNjb3BlJyFcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByb290U2NvcGUgPSByb290U2NvcGVEZWxlZ2F0ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXSk7XG4gICAgICAgICAgfVxuICAgICAgICBdKVxuICAgICAgICAucnVuKFtcbiAgICAgICAgICAnJGluamVjdG9yJyxcbiAgICAgICAgICAnJHJvb3RTY29wZScsXG4gICAgICAgICAgKGluamVjdG9yOiBhbmd1bGFyLklJbmplY3RvclNlcnZpY2UsIHJvb3RTY29wZTogYW5ndWxhci5JUm9vdFNjb3BlU2VydmljZSkgPT4ge1xuICAgICAgICAgICAgbmcxSW5qZWN0b3IgPSBpbmplY3RvcjtcbiAgICAgICAgICAgIE9ic2VydmFibGVXcmFwcGVyLnN1YnNjcmliZShuZ1pvbmUub25UdXJuRG9uZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoXykgPT4geyBuZ1pvbmUucnVuKCgpID0+IHJvb3RTY29wZS4kYXBwbHkoKSk7IH0pO1xuICAgICAgICAgICAgbmcxY29tcGlsZVByb21pc2UgPVxuICAgICAgICAgICAgICAgIFVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlci5yZXNvbHZlKHRoaXMuZG93bmdyYWRlZENvbXBvbmVudHMsIGluamVjdG9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIF0pO1xuXG4gICAgYW5ndWxhci5lbGVtZW50KGVsZW1lbnQpLmRhdGEoY29udHJvbGxlcktleShORzJfSU5KRUNUT1IpLCBpbmplY3Rvcik7XG4gICAgbmdab25lLnJ1bigoKSA9PiB7IGFuZ3VsYXIuYm9vdHN0cmFwKGVsZW1lbnQsIFt0aGlzLmlkUHJlZml4XSwgY29uZmlnKTsgfSk7XG4gICAgUHJvbWlzZS5hbGwoW3RoaXMuY29tcGlsZU5nMkNvbXBvbmVudHMoY29tcGlsZXIsIHByb3RvVmlld1JlZk1hcCksIG5nMWNvbXBpbGVQcm9taXNlXSlcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHJvb3RTY29wZVByb3RvdHlwZSkge1xuICAgICAgICAgICAgICByb290U2NvcGVQcm90b3R5cGUuJGFwcGx5ID0gb3JpZ2luYWwkYXBwbHlGbjsgIC8vIHJlc3RvcmUgb3JpZ2luYWwgJGFwcGx5XG4gICAgICAgICAgICAgIHdoaWxlIChkZWxheUFwcGx5RXhwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByb290U2NvcGUuJGFwcGx5KGRlbGF5QXBwbHlFeHBzLnNoaWZ0KCkpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICg8YW55PnVwZ3JhZGUpLl9ib290c3RyYXBEb25lKGFwcGxpY2F0aW9uUmVmLCBuZzFJbmplY3Rvcik7XG4gICAgICAgICAgICAgIHJvb3RTY29wZVByb3RvdHlwZSA9IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sIG9uRXJyb3IpO1xuICAgIHJldHVybiB1cGdyYWRlO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBwcm92aWRlciB0byB0aGUgdG9wIGxldmVsIGVudmlyb25tZW50IG9mIGEgaHlicmlkIEFuZ3VsYXJKUyB2MSAvIEFuZ3VsYXIgdjIgYXBwbGljYXRpb24uXG4gICAqXG4gICAqIEluIGh5YnJpZCBBbmd1bGFySlMgdjEgLyBBbmd1bGFyIHYyIGFwcGxpY2F0aW9uLCB0aGVyZSBpcyBubyBvbmUgcm9vdCBBbmd1bGFyIHYyIGNvbXBvbmVudCxcbiAgICogZm9yIHRoaXMgcmVhc29uIHdlIHByb3ZpZGUgYW4gYXBwbGljYXRpb24gZ2xvYmFsIHdheSBvZiByZWdpc3RlcmluZyBwcm92aWRlcnMgd2hpY2ggaXNcbiAgICogY29uc2lzdGVudCB3aXRoIHNpbmdsZSBnbG9iYWwgaW5qZWN0aW9uIGluIEFuZ3VsYXJKUyB2MS5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICpcbiAgICogYGBgXG4gICAqIGNsYXNzIEdyZWV0ZXIge1xuICAgKiAgIGdyZWV0KG5hbWUpIHtcbiAgICogICAgIGFsZXJ0KCdIZWxsbyAnICsgbmFtZSArICchJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIEBDb21wb25lbnQoe1xuICAgKiAgIHNlbGVjdG9yOiAnYXBwJyxcbiAgICogICB0ZW1wbGF0ZTogJydcbiAgICogfSlcbiAgICogY2xhc3MgQXBwIHtcbiAgICogICBjb25zdHJ1Y3RvcihncmVldGVyOiBHcmVldGVyKSB7XG4gICAqICAgICB0aGlzLmdyZWV0ZXIoJ1dvcmxkJyk7XG4gICAqICAgfVxuICAgKiB9XG4gICAqXG4gICAqIHZhciBhZGFwdGVyID0gbmV3IFVwZ3JhZGVBZGFwdGVyKCk7XG4gICAqIGFkYXB0ZXIuYWRkUHJvdmlkZXIoR3JlZXRlcik7XG4gICAqXG4gICAqIHZhciBtb2R1bGUgPSBhbmd1bGFyLm1vZHVsZSgnbXlFeGFtcGxlJywgW10pO1xuICAgKiBtb2R1bGUuZGlyZWN0aXZlKCdhcHAnLCBhZGFwdGVyLmRvd25ncmFkZU5nMkNvbXBvbmVudChBcHApKTtcbiAgICpcbiAgICogZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAnPGFwcD48L2FwcD4nXG4gICAqIGFkYXB0ZXIuYm9vdHN0cmFwKGRvY3VtZW50LmJvZHksIFsnbXlFeGFtcGxlJ10pO1xuICAgKmBgYFxuICAgKi9cbiAgcHVibGljIGFkZFByb3ZpZGVyKHByb3ZpZGVyOiBUeXBlIHwgUHJvdmlkZXIgfCBhbnlbXSk6IHZvaWQgeyB0aGlzLnByb3ZpZGVycy5wdXNoKHByb3ZpZGVyKTsgfVxuXG4gIC8qKlxuICAgKiBBbGxvd3MgQW5ndWxhckpTIHYxIHNlcnZpY2UgdG8gYmUgYWNjZXNzaWJsZSBmcm9tIEFuZ3VsYXIgdjIuXG4gICAqXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiBjbGFzcyBMb2dpbiB7IC4uLiB9XG4gICAqIGNsYXNzIFNlcnZlciB7IC4uLiB9XG4gICAqXG4gICAqIEBJbmplY3RhYmxlKClcbiAgICogY2xhc3MgRXhhbXBsZSB7XG4gICAqICAgY29uc3RydWN0b3IoQEluamVjdCgnc2VydmVyJykgc2VydmVyLCBsb2dpbjogTG9naW4pIHtcbiAgICogICAgIC4uLlxuICAgKiAgIH1cbiAgICogfVxuICAgKlxuICAgKiB2YXIgbW9kdWxlID0gYW5ndWxhci5tb2R1bGUoJ215RXhhbXBsZScsIFtdKTtcbiAgICogbW9kdWxlLnNlcnZpY2UoJ3NlcnZlcicsIFNlcnZlcik7XG4gICAqIG1vZHVsZS5zZXJ2aWNlKCdsb2dpbicsIExvZ2luKTtcbiAgICpcbiAgICogdmFyIGFkYXB0ZXIgPSBuZXcgVXBncmFkZUFkYXB0ZXIoKTtcbiAgICogYWRhcHRlci51cGdyYWRlTmcxUHJvdmlkZXIoJ3NlcnZlcicpO1xuICAgKiBhZGFwdGVyLnVwZ3JhZGVOZzFQcm92aWRlcignbG9naW4nLCB7YXNUb2tlbjogTG9naW59KTtcbiAgICogYWRhcHRlci5hZGRQcm92aWRlcihFeGFtcGxlKTtcbiAgICpcbiAgICogYWRhcHRlci5ib290c3RyYXAoZG9jdW1lbnQuYm9keSwgWydteUV4YW1wbGUnXSkucmVhZHkoKHJlZikgPT4ge1xuICAgKiAgIHZhciBleGFtcGxlOiBFeGFtcGxlID0gcmVmLm5nMkluamVjdG9yLmdldChFeGFtcGxlKTtcbiAgICogfSk7XG4gICAqXG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIHVwZ3JhZGVOZzFQcm92aWRlcihuYW1lOiBzdHJpbmcsIG9wdGlvbnM/OiB7YXNUb2tlbjogYW55fSkge1xuICAgIHZhciB0b2tlbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5hc1Rva2VuIHx8IG5hbWU7XG4gICAgdGhpcy5wcm92aWRlcnMucHVzaChwcm92aWRlKHRva2VuLCB7XG4gICAgICB1c2VGYWN0b3J5OiAobmcxSW5qZWN0b3I6IGFuZ3VsYXIuSUluamVjdG9yU2VydmljZSkgPT4gbmcxSW5qZWN0b3IuZ2V0KG5hbWUpLFxuICAgICAgZGVwczogW05HMV9JTkpFQ1RPUl1cbiAgICB9KSk7XG4gIH1cblxuICAvKipcbiAgICogQWxsb3dzIEFuZ3VsYXIgdjIgc2VydmljZSB0byBiZSBhY2Nlc3NpYmxlIGZyb20gQW5ndWxhckpTIHYxLlxuICAgKlxuICAgKlxuICAgKiAjIyMgRXhhbXBsZVxuICAgKlxuICAgKiBgYGBcbiAgICogY2xhc3MgRXhhbXBsZSB7XG4gICAqIH1cbiAgICpcbiAgICogdmFyIGFkYXB0ZXIgPSBuZXcgVXBncmFkZUFkYXB0ZXIoKTtcbiAgICogYWRhcHRlci5hZGRQcm92aWRlcihFeGFtcGxlKTtcbiAgICpcbiAgICogdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlKCdteUV4YW1wbGUnLCBbXSk7XG4gICAqIG1vZHVsZS5mYWN0b3J5KCdleGFtcGxlJywgYWRhcHRlci5kb3duZ3JhZGVOZzJQcm92aWRlcihFeGFtcGxlKSk7XG4gICAqXG4gICAqIGFkYXB0ZXIuYm9vdHN0cmFwKGRvY3VtZW50LmJvZHksIFsnbXlFeGFtcGxlJ10pLnJlYWR5KChyZWYpID0+IHtcbiAgICogICB2YXIgZXhhbXBsZTogRXhhbXBsZSA9IHJlZi5uZzFJbmplY3Rvci5nZXQoJ2V4YW1wbGUnKTtcbiAgICogfSk7XG4gICAqXG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGRvd25ncmFkZU5nMlByb3ZpZGVyKHRva2VuOiBhbnkpOiBGdW5jdGlvbiB7XG4gICAgdmFyIGZhY3RvcnkgPSBmdW5jdGlvbihpbmplY3RvcjogSW5qZWN0b3IpIHsgcmV0dXJuIGluamVjdG9yLmdldCh0b2tlbik7IH07XG4gICAgKDxhbnk+ZmFjdG9yeSkuJGluamVjdCA9IFtORzJfSU5KRUNUT1JdO1xuICAgIHJldHVybiBmYWN0b3J5O1xuICB9XG5cbiAgLyogQGludGVybmFsICovXG4gIHByaXZhdGUgY29tcGlsZU5nMkNvbXBvbmVudHMoY29tcGlsZXI6IENvbXBpbGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvVmlld1JlZk1hcDogUHJvdG9WaWV3UmVmTWFwKTogUHJvbWlzZTxQcm90b1ZpZXdSZWZNYXA+IHtcbiAgICB2YXIgcHJvbWlzZXM6IEFycmF5PFByb21pc2U8UHJvdG9WaWV3UmVmPj4gPSBbXTtcbiAgICB2YXIgdHlwZXMgPSB0aGlzLnVwZ3JhZGVkQ29tcG9uZW50cztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBwcm9taXNlcy5wdXNoKGNvbXBpbGVyLmNvbXBpbGVJbkhvc3QodHlwZXNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKChwcm90b1ZpZXdzOiBBcnJheTxQcm90b1ZpZXdSZWY+KSA9PiB7XG4gICAgICB2YXIgdHlwZXMgPSB0aGlzLnVwZ3JhZGVkQ29tcG9uZW50cztcbiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvdG9WaWV3cy5sZW5ndGg7IGkrKykge1xuICAgICAgICBwcm90b1ZpZXdSZWZNYXBbZ2V0Q29tcG9uZW50SW5mbyh0eXBlc1tpXSkuc2VsZWN0b3JdID0gcHJvdG9WaWV3c1tpXTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm90b1ZpZXdSZWZNYXA7XG4gICAgfSwgb25FcnJvcik7XG4gIH1cbn1cblxuaW50ZXJmYWNlIFByb3RvVmlld1JlZk1hcCB7XG4gIFtzZWxlY3Rvcjogc3RyaW5nXTogUHJvdG9WaWV3UmVmO1xufVxuXG5mdW5jdGlvbiBuZzFDb21wb25lbnREaXJlY3RpdmUoaW5mbzogQ29tcG9uZW50SW5mbywgaWRQcmVmaXg6IHN0cmluZyk6IEZ1bmN0aW9uIHtcbiAgKDxhbnk+ZGlyZWN0aXZlRmFjdG9yeSkuJGluamVjdCA9IFtORzJfUFJPVE9fVklFV19SRUZfTUFQLCBORzJfQVBQX1ZJRVdfTUFOQUdFUiwgTkcxX1BBUlNFXTtcbiAgZnVuY3Rpb24gZGlyZWN0aXZlRmFjdG9yeShwcm90b1ZpZXdSZWZNYXA6IFByb3RvVmlld1JlZk1hcCwgdmlld01hbmFnZXI6IEFwcFZpZXdNYW5hZ2VyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlOiBhbmd1bGFyLklQYXJzZVNlcnZpY2UpOiBhbmd1bGFyLklEaXJlY3RpdmUge1xuICAgIHZhciBwcm90b1ZpZXc6IFByb3RvVmlld1JlZiA9IHByb3RvVmlld1JlZk1hcFtpbmZvLnNlbGVjdG9yXTtcbiAgICBpZiAoIXByb3RvVmlldykgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RpbmcgUHJvdG9WaWV3UmVmIGZvcjogJyArIGluZm8uc2VsZWN0b3IpO1xuICAgIHZhciBpZENvdW50ID0gMDtcbiAgICByZXR1cm4ge1xuICAgICAgcmVzdHJpY3Q6ICdFJyxcbiAgICAgIHJlcXVpcmU6IFJFUVVJUkVfSU5KRUNUT1IsXG4gICAgICBsaW5rOiB7XG4gICAgICAgIHBvc3Q6IChzY29wZTogYW5ndWxhci5JU2NvcGUsIGVsZW1lbnQ6IGFuZ3VsYXIuSUF1Z21lbnRlZEpRdWVyeSwgYXR0cnM6IGFuZ3VsYXIuSUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICBwYXJlbnRJbmplY3RvcjogYW55LCB0cmFuc2NsdWRlOiBhbmd1bGFyLklUcmFuc2NsdWRlRnVuY3Rpb24pOiB2b2lkID0+IHtcbiAgICAgICAgICB2YXIgZG9tRWxlbWVudCA9IDxhbnk+ZWxlbWVudFswXTtcbiAgICAgICAgICB2YXIgZmFjYWRlID0gbmV3IERvd25ncmFkZU5nMkNvbXBvbmVudEFkYXB0ZXIoaWRQcmVmaXggKyAoaWRDb3VudCsrKSwgaW5mbywgZWxlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMsIHNjb3BlLCA8SW5qZWN0b3I+cGFyZW50SW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlLCB2aWV3TWFuYWdlciwgcHJvdG9WaWV3KTtcbiAgICAgICAgICBmYWNhZGUuc2V0dXBJbnB1dHMoKTtcbiAgICAgICAgICBmYWNhZGUuYm9vdHN0cmFwTmcyKCk7XG4gICAgICAgICAgZmFjYWRlLnByb2plY3RDb250ZW50KCk7XG4gICAgICAgICAgZmFjYWRlLnNldHVwT3V0cHV0cygpO1xuICAgICAgICAgIGZhY2FkZS5yZWdpc3RlckNsZWFudXAoKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIGRpcmVjdGl2ZUZhY3Rvcnk7XG59XG5cbi8qKlxuICogVXNlIGBVZ3JhZGVBZGFwdGVyUmVmYCB0byBjb250cm9sIGEgaHlicmlkIEFuZ3VsYXJKUyB2MSAvIEFuZ3VsYXIgdjIgYXBwbGljYXRpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBVcGdyYWRlQWRhcHRlclJlZiB7XG4gIC8qIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9yZWFkeUZuOiAodXBncmFkZUFkYXB0ZXJSZWY/OiBVcGdyYWRlQWRhcHRlclJlZikgPT4gdm9pZCA9IG51bGw7XG5cbiAgcHVibGljIG5nMVJvb3RTY29wZTogYW5ndWxhci5JUm9vdFNjb3BlU2VydmljZSA9IG51bGw7XG4gIHB1YmxpYyBuZzFJbmplY3RvcjogYW5ndWxhci5JSW5qZWN0b3JTZXJ2aWNlID0gbnVsbDtcbiAgcHVibGljIG5nMkFwcGxpY2F0aW9uUmVmOiBBcHBsaWNhdGlvblJlZiA9IG51bGw7XG4gIHB1YmxpYyBuZzJJbmplY3RvcjogSW5qZWN0b3IgPSBudWxsO1xuXG4gIC8qIEBpbnRlcm5hbCAqL1xuICBwcml2YXRlIF9ib290c3RyYXBEb25lKGFwcGxpY2F0aW9uUmVmOiBBcHBsaWNhdGlvblJlZiwgbmcxSW5qZWN0b3I6IGFuZ3VsYXIuSUluamVjdG9yU2VydmljZSkge1xuICAgIHRoaXMubmcyQXBwbGljYXRpb25SZWYgPSBhcHBsaWNhdGlvblJlZjtcbiAgICB0aGlzLm5nMkluamVjdG9yID0gYXBwbGljYXRpb25SZWYuaW5qZWN0b3I7XG4gICAgdGhpcy5uZzFJbmplY3RvciA9IG5nMUluamVjdG9yO1xuICAgIHRoaXMubmcxUm9vdFNjb3BlID0gbmcxSW5qZWN0b3IuZ2V0KE5HMV9ST09UX1NDT1BFKTtcbiAgICB0aGlzLl9yZWFkeUZuICYmIHRoaXMuX3JlYWR5Rm4odGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayBmdW5jdGlvbiB3aGljaCBpcyBub3RpZmllZCB1cG9uIHN1Y2Nlc3NmdWwgaHlicmlkIEFuZ3VsYXJKUyB2MSAvIEFuZ3VsYXIgdjJcbiAgICogYXBwbGljYXRpb24gaGFzIGJlZW4gYm9vdHN0cmFwcGVkLlxuICAgKlxuICAgKiBUaGUgYHJlYWR5YCBjYWxsYmFjayBmdW5jdGlvbiBpcyBpbnZva2VkIGluc2lkZSB0aGUgQW5ndWxhciB2MiB6b25lLCB0aGVyZWZvcmUgaXQgZG9lcyBub3RcbiAgICogcmVxdWlyZSBhIGNhbGwgdG8gYCRhcHBseSgpYC5cbiAgICovXG4gIHB1YmxpYyByZWFkeShmbjogKHVwZ3JhZGVBZGFwdGVyUmVmPzogVXBncmFkZUFkYXB0ZXJSZWYpID0+IHZvaWQpIHsgdGhpcy5fcmVhZHlGbiA9IGZuOyB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2Ugb2YgcnVubmluZyBoeWJyaWQgQW5ndWxhckpTIHYxIC8gQW5ndWxhciB2MiBhcHBsaWNhdGlvbi5cbiAgICovXG4gIHB1YmxpYyBkaXNwb3NlKCkge1xuICAgIHRoaXMubmcxSW5qZWN0b3IuZ2V0KE5HMV9ST09UX1NDT1BFKS4kZGVzdHJveSgpO1xuICAgIHRoaXMubmcyQXBwbGljYXRpb25SZWYuZGlzcG9zZSgpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdXBncmFkZS91cGdyYWRlX2FkYXB0ZXIudHNcbiAqKi8iLCJpbXBvcnQge1R5cGUsIERpcmVjdGl2ZVJlc29sdmVyLCBEaXJlY3RpdmVNZXRhZGF0YX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge3N0cmluZ2lmeX0gZnJvbSAnLi91dGlsJztcblxudmFyIENPTVBPTkVOVF9TRUxFQ1RPUiA9IC9eW1xcd3wtXSokLztcbnZhciBTS0VXRVJfQ0FTRSA9IC8tKFxcdykvZztcbnZhciBkaXJlY3RpdmVSZXNvbHZlciA9IG5ldyBEaXJlY3RpdmVSZXNvbHZlcigpO1xuXG5leHBvcnQgaW50ZXJmYWNlIEF0dHJQcm9wIHtcbiAgcHJvcDogc3RyaW5nO1xuICBhdHRyOiBzdHJpbmc7XG4gIGJyYWNrZXRBdHRyOiBzdHJpbmc7XG4gIGJyYWNrZXRQYXJlbkF0dHI6IHN0cmluZztcbiAgcGFyZW5BdHRyOiBzdHJpbmc7XG4gIG9uQXR0cjogc3RyaW5nO1xuICBiaW5kQXR0cjogc3RyaW5nO1xuICBiaW5kb25BdHRyOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29tcG9uZW50SW5mbyB7XG4gIHR5cGU6IFR5cGU7XG4gIHNlbGVjdG9yOiBzdHJpbmc7XG4gIGlucHV0czogQXR0clByb3BbXTtcbiAgb3V0cHV0czogQXR0clByb3BbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbXBvbmVudEluZm8odHlwZTogVHlwZSk6IENvbXBvbmVudEluZm8ge1xuICB2YXIgcmVzb2x2ZWRNZXRhZGF0YTogRGlyZWN0aXZlTWV0YWRhdGEgPSBkaXJlY3RpdmVSZXNvbHZlci5yZXNvbHZlKHR5cGUpO1xuICB2YXIgc2VsZWN0b3IgPSByZXNvbHZlZE1ldGFkYXRhLnNlbGVjdG9yO1xuICBpZiAoIXNlbGVjdG9yLm1hdGNoKENPTVBPTkVOVF9TRUxFQ1RPUikpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgc2VsZWN0b3JzIG1hdGNoaW5nIGVsZW1lbnQgbmFtZXMgYXJlIHN1cHBvcnRlZCwgZ290OiAnICsgc2VsZWN0b3IpO1xuICB9XG4gIHZhciBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoU0tFV0VSX0NBU0UsIChhbGwsIGxldHRlcjogc3RyaW5nKSA9PiBsZXR0ZXIudG9VcHBlckNhc2UoKSk7XG4gIHJldHVybiB7XG4gICAgdHlwZTogdHlwZSxcbiAgICBzZWxlY3Rvcjogc2VsZWN0b3IsXG4gICAgaW5wdXRzOiBwYXJzZUZpZWxkcyhyZXNvbHZlZE1ldGFkYXRhLmlucHV0cyksXG4gICAgb3V0cHV0czogcGFyc2VGaWVsZHMocmVzb2x2ZWRNZXRhZGF0YS5vdXRwdXRzKVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VGaWVsZHMobmFtZXM6IHN0cmluZ1tdKTogQXR0clByb3BbXSB7XG4gIHZhciBhdHRyUHJvcHM6IEF0dHJQcm9wW10gPSBbXTtcbiAgaWYgKG5hbWVzKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHBhcnRzID0gbmFtZXNbaV0uc3BsaXQoJzonKTtcbiAgICAgIHZhciBwcm9wID0gcGFydHNbMF0udHJpbSgpO1xuICAgICAgdmFyIGF0dHIgPSAocGFydHNbMV0gfHwgcGFydHNbMF0pLnRyaW0oKTtcbiAgICAgIHZhciBjYXBpdGFsQXR0ciA9IGF0dHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBhdHRyLnN1YnN0cigxKTtcbiAgICAgIGF0dHJQcm9wcy5wdXNoKDxBdHRyUHJvcD57XG4gICAgICAgIHByb3A6IHByb3AsXG4gICAgICAgIGF0dHI6IGF0dHIsXG4gICAgICAgIGJyYWNrZXRBdHRyOiBgWyR7YXR0cn1dYCxcbiAgICAgICAgcGFyZW5BdHRyOiBgKCR7YXR0cn0pYCxcbiAgICAgICAgYnJhY2tldFBhcmVuQXR0cjogYFsoJHthdHRyfSldYCxcbiAgICAgICAgb25BdHRyOiBgb24ke2NhcGl0YWxBdHRyfWAsXG4gICAgICAgIGJpbmRBdHRyOiBgYmluZCR7Y2FwaXRhbEF0dHJ9YCxcbiAgICAgICAgYmluZG9uQXR0cjogYGJpbmRvbiR7Y2FwaXRhbEF0dHJ9YFxuICAgICAgfSk7XG4gICAgfVxuICB9XG4gIHJldHVybiBhdHRyUHJvcHM7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdXBncmFkZS9tZXRhZGF0YS50c1xuICoqLyIsIlxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ2lmeShvYmo6IGFueSk6IHN0cmluZyB7XG4gIGlmICh0eXBlb2Ygb2JqID09ICdmdW5jdGlvbicpIHJldHVybiBvYmoubmFtZSB8fCBvYmoudG9TdHJpbmcoKTtcbiAgcmV0dXJuICcnICsgb2JqO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBvbkVycm9yKGU6IGFueSkge1xuICAvLyBUT0RPOiAobWlza28pOiBXZSBzZWVtIHRvIG5vdCBoYXZlIGEgc3RhY2sgdHJhY2UgaGVyZSFcbiAgY29uc29sZS5sb2coZSwgZS5zdGFjayk7XG4gIHRocm93IGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb250cm9sbGVyS2V5KG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiAnJCcgKyBuYW1lICsgJ0NvbnRyb2xsZXInO1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3VwZ3JhZGUvdXRpbC50c1xuICoqLyIsImV4cG9ydCBjb25zdCBORzJfQVBQX1ZJRVdfTUFOQUdFUiA9ICduZzIuQXBwVmlld01hbmFnZXInO1xuZXhwb3J0IGNvbnN0IE5HMl9DT01QSUxFUiA9ICduZzIuQ29tcGlsZXInO1xuZXhwb3J0IGNvbnN0IE5HMl9JTkpFQ1RPUiA9ICduZzIuSW5qZWN0b3InO1xuZXhwb3J0IGNvbnN0IE5HMl9QUk9UT19WSUVXX1JFRl9NQVAgPSAnbmcyLlByb3RvVmlld1JlZk1hcCc7XG5leHBvcnQgY29uc3QgTkcyX1pPTkUgPSAnbmcyLk5nWm9uZSc7XG5cbmV4cG9ydCBjb25zdCBORzFfQ09OVFJPTExFUiA9ICckY29udHJvbGxlcic7XG5leHBvcnQgY29uc3QgTkcxX1NDT1BFID0gJyRzY29wZSc7XG5leHBvcnQgY29uc3QgTkcxX1JPT1RfU0NPUEUgPSAnJHJvb3RTY29wZSc7XG5leHBvcnQgY29uc3QgTkcxX0NPTVBJTEUgPSAnJGNvbXBpbGUnO1xuZXhwb3J0IGNvbnN0IE5HMV9IVFRQX0JBQ0tFTkQgPSAnJGh0dHBCYWNrZW5kJztcbmV4cG9ydCBjb25zdCBORzFfSU5KRUNUT1IgPSAnJGluamVjdG9yJztcbmV4cG9ydCBjb25zdCBORzFfUEFSU0UgPSAnJHBhcnNlJztcbmV4cG9ydCBjb25zdCBORzFfVEVNUExBVEVfQ0FDSEUgPSAnJHRlbXBsYXRlQ2FjaGUnO1xuZXhwb3J0IGNvbnN0IFJFUVVJUkVfSU5KRUNUT1IgPSAnXicgKyBORzJfSU5KRUNUT1I7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdXBncmFkZS9jb25zdGFudHMudHNcbiAqKi8iLCJpbXBvcnQge1xuICBwcm92aWRlLFxuICBBcHBWaWV3TWFuYWdlcixcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEhvc3RWaWV3UmVmLFxuICBJbmplY3RvcixcbiAgT25DaGFuZ2VzLFxuICBQcm90b1ZpZXdSZWYsXG4gIFNpbXBsZUNoYW5nZVxufSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7TkcxX1NDT1BFfSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge0NvbXBvbmVudEluZm99IGZyb20gJy4vbWV0YWRhdGEnO1xuaW1wb3J0IEVsZW1lbnQgPSBwcm90cmFjdG9yLkVsZW1lbnQ7XG5pbXBvcnQgKiBhcyBhbmd1bGFyIGZyb20gJy4vYW5ndWxhcl9qcyc7XG5cbmNvbnN0IElOSVRJQUxfVkFMVUUgPSB7XG4gIF9fVU5JTklUSUFMSVpFRF9fOiB0cnVlXG59O1xuXG5leHBvcnQgY2xhc3MgRG93bmdyYWRlTmcyQ29tcG9uZW50QWRhcHRlciB7XG4gIGNvbXBvbmVudDogYW55ID0gbnVsbDtcbiAgaW5wdXRDaGFuZ2VDb3VudDogbnVtYmVyID0gMDtcbiAgaW5wdXRDaGFuZ2VzOiB7W2tleTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlfSA9IG51bGw7XG4gIGhvc3RWaWV3UmVmOiBIb3N0Vmlld1JlZiA9IG51bGw7XG4gIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZiA9IG51bGw7XG4gIGNvbXBvbmVudFNjb3BlOiBhbmd1bGFyLklTY29wZTtcbiAgY2hpbGROb2RlczogTm9kZVtdO1xuICBjb250ZW50SW5zZXJjdGlvblBvaW50OiBOb2RlID0gbnVsbDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGlkOiBzdHJpbmcsIHByaXZhdGUgaW5mbzogQ29tcG9uZW50SW5mbyxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBlbGVtZW50OiBhbmd1bGFyLklBdWdtZW50ZWRKUXVlcnksIHByaXZhdGUgYXR0cnM6IGFuZ3VsYXIuSUF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgIHByaXZhdGUgc2NvcGU6IGFuZ3VsYXIuSVNjb3BlLCBwcml2YXRlIHBhcmVudEluamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBwYXJzZTogYW5ndWxhci5JUGFyc2VTZXJ2aWNlLCBwcml2YXRlIHZpZXdNYW5hZ2VyOiBBcHBWaWV3TWFuYWdlcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBwcm90b1ZpZXc6IFByb3RvVmlld1JlZikge1xuICAgICg8YW55PnRoaXMuZWxlbWVudFswXSkuaWQgPSBpZDtcbiAgICB0aGlzLmNvbXBvbmVudFNjb3BlID0gc2NvcGUuJG5ldygpO1xuICAgIHRoaXMuY2hpbGROb2RlcyA9IDxOb2RlW10+PGFueT5lbGVtZW50LmNvbnRlbnRzKCk7XG4gIH1cblxuICBib290c3RyYXBOZzIoKSB7XG4gICAgdmFyIGNoaWxkSW5qZWN0b3IgPSB0aGlzLnBhcmVudEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGVDaGlsZChcbiAgICAgICAgW3Byb3ZpZGUoTkcxX1NDT1BFLCB7dXNlVmFsdWU6IHRoaXMuY29tcG9uZW50U2NvcGV9KV0pO1xuICAgIHRoaXMuaG9zdFZpZXdSZWYgPVxuICAgICAgICB0aGlzLnZpZXdNYW5hZ2VyLmNyZWF0ZVJvb3RIb3N0Vmlldyh0aGlzLnByb3RvVmlldywgJyMnICsgdGhpcy5pZCwgY2hpbGRJbmplY3Rvcik7XG4gICAgdmFyIHJlbmRlcmVyOiBhbnkgPSAoPGFueT50aGlzLmhvc3RWaWV3UmVmKS5yZW5kZXI7XG4gICAgdmFyIGhvc3RFbGVtZW50ID0gdGhpcy52aWV3TWFuYWdlci5nZXRIb3N0RWxlbWVudCh0aGlzLmhvc3RWaWV3UmVmKTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yID0gdGhpcy5ob3N0Vmlld1JlZi5jaGFuZ2VEZXRlY3RvclJlZjtcbiAgICB0aGlzLmNvbXBvbmVudCA9IHRoaXMudmlld01hbmFnZXIuZ2V0Q29tcG9uZW50KGhvc3RFbGVtZW50KTtcbiAgICB0aGlzLmNvbnRlbnRJbnNlcmN0aW9uUG9pbnQgPSByZW5kZXJlci5yb290Q29udGVudEluc2VydGlvblBvaW50c1swXTtcbiAgfVxuXG4gIHNldHVwSW5wdXRzKCk6IHZvaWQge1xuICAgIHZhciBhdHRycyA9IHRoaXMuYXR0cnM7XG4gICAgdmFyIGlucHV0cyA9IHRoaXMuaW5mby5pbnB1dHM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpbnB1dCA9IGlucHV0c1tpXTtcbiAgICAgIHZhciBleHByID0gbnVsbDtcbiAgICAgIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShpbnB1dC5hdHRyKSkge1xuICAgICAgICB2YXIgb2JzZXJ2ZUZuID0gKChwcm9wKSA9PiB7XG4gICAgICAgICAgdmFyIHByZXZWYWx1ZSA9IElOSVRJQUxfVkFMVUU7XG4gICAgICAgICAgcmV0dXJuICh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5wdXRDaGFuZ2VzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRoaXMuaW5wdXRDaGFuZ2VDb3VudCsrO1xuICAgICAgICAgICAgICB0aGlzLmlucHV0Q2hhbmdlc1twcm9wXSA9XG4gICAgICAgICAgICAgICAgICBuZXcgTmcxQ2hhbmdlKHZhbHVlLCBwcmV2VmFsdWUgPT09IElOSVRJQUxfVkFMVUUgPyB2YWx1ZSA6IHByZXZWYWx1ZSk7XG4gICAgICAgICAgICAgIHByZXZWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5jb21wb25lbnRbcHJvcF0gPSB2YWx1ZTtcbiAgICAgICAgICB9O1xuICAgICAgICB9KShpbnB1dC5wcm9wKTtcbiAgICAgICAgYXR0cnMuJG9ic2VydmUoaW5wdXQuYXR0ciwgb2JzZXJ2ZUZuKTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0cnMuaGFzT3duUHJvcGVydHkoaW5wdXQuYmluZEF0dHIpKSB7XG4gICAgICAgIGV4cHIgPSBhdHRyc1tpbnB1dC5iaW5kQXR0cl07XG4gICAgICB9IGVsc2UgaWYgKGF0dHJzLmhhc093blByb3BlcnR5KGlucHV0LmJyYWNrZXRBdHRyKSkge1xuICAgICAgICBleHByID0gYXR0cnNbaW5wdXQuYnJhY2tldEF0dHJdO1xuICAgICAgfSBlbHNlIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShpbnB1dC5iaW5kb25BdHRyKSkge1xuICAgICAgICBleHByID0gYXR0cnNbaW5wdXQuYmluZG9uQXR0cl07XG4gICAgICB9IGVsc2UgaWYgKGF0dHJzLmhhc093blByb3BlcnR5KGlucHV0LmJyYWNrZXRQYXJlbkF0dHIpKSB7XG4gICAgICAgIGV4cHIgPSBhdHRyc1tpbnB1dC5icmFja2V0UGFyZW5BdHRyXTtcbiAgICAgIH1cbiAgICAgIGlmIChleHByICE9IG51bGwpIHtcbiAgICAgICAgdmFyIHdhdGNoRm4gPSAoKHByb3ApID0+ICh2YWx1ZSwgcHJldlZhbHVlKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaW5wdXRDaGFuZ2VzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHRoaXMuaW5wdXRDaGFuZ2VDb3VudCsrO1xuICAgICAgICAgICAgdGhpcy5pbnB1dENoYW5nZXNbcHJvcF0gPSBuZXcgTmcxQ2hhbmdlKHByZXZWYWx1ZSwgdmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmNvbXBvbmVudFtwcm9wXSA9IHZhbHVlO1xuICAgICAgICB9KShpbnB1dC5wcm9wKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRTY29wZS4kd2F0Y2goZXhwciwgd2F0Y2hGbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHByb3RvdHlwZSA9IHRoaXMuaW5mby50eXBlLnByb3RvdHlwZTtcbiAgICBpZiAocHJvdG90eXBlICYmICg8T25DaGFuZ2VzPnByb3RvdHlwZSkubmdPbkNoYW5nZXMpIHtcbiAgICAgIC8vIERldGVjdDogT25DaGFuZ2VzIGludGVyZmFjZVxuICAgICAgdGhpcy5pbnB1dENoYW5nZXMgPSB7fTtcbiAgICAgIHRoaXMuY29tcG9uZW50U2NvcGUuJHdhdGNoKCgpID0+IHRoaXMuaW5wdXRDaGFuZ2VDb3VudCwgKCkgPT4ge1xuICAgICAgICB2YXIgaW5wdXRDaGFuZ2VzID0gdGhpcy5pbnB1dENoYW5nZXM7XG4gICAgICAgIHRoaXMuaW5wdXRDaGFuZ2VzID0ge307XG4gICAgICAgICg8T25DaGFuZ2VzPnRoaXMuY29tcG9uZW50KS5uZ09uQ2hhbmdlcyhpbnB1dENoYW5nZXMpO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMuY29tcG9uZW50U2NvcGUuJHdhdGNoKCgpID0+IHRoaXMuY2hhbmdlRGV0ZWN0b3IgJiYgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCkpO1xuICB9XG5cbiAgcHJvamVjdENvbnRlbnQoKSB7XG4gICAgdmFyIGNoaWxkTm9kZXMgPSB0aGlzLmNoaWxkTm9kZXM7XG4gICAgaWYgKHRoaXMuY29udGVudEluc2VyY3Rpb25Qb2ludCkge1xuICAgICAgdmFyIHBhcmVudCA9IHRoaXMuY29udGVudEluc2VyY3Rpb25Qb2ludC5wYXJlbnROb2RlO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGlpID0gY2hpbGROb2Rlcy5sZW5ndGg7IGkgPCBpaTsgaSsrKSB7XG4gICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGROb2Rlc1tpXSwgdGhpcy5jb250ZW50SW5zZXJjdGlvblBvaW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXR1cE91dHB1dHMoKSB7XG4gICAgdmFyIGF0dHJzID0gdGhpcy5hdHRycztcbiAgICB2YXIgb3V0cHV0cyA9IHRoaXMuaW5mby5vdXRwdXRzO1xuICAgIGZvciAodmFyIGogPSAwOyBqIDwgb3V0cHV0cy5sZW5ndGg7IGorKykge1xuICAgICAgdmFyIG91dHB1dCA9IG91dHB1dHNbal07XG4gICAgICB2YXIgZXhwciA9IG51bGw7XG4gICAgICB2YXIgYXNzaWduRXhwciA9IGZhbHNlO1xuXG4gICAgICB2YXIgYmluZG9uQXR0ciA9XG4gICAgICAgICAgb3V0cHV0LmJpbmRvbkF0dHIgPyBvdXRwdXQuYmluZG9uQXR0ci5zdWJzdHJpbmcoMCwgb3V0cHV0LmJpbmRvbkF0dHIubGVuZ3RoIC0gNikgOiBudWxsO1xuICAgICAgdmFyIGJyYWNrZXRQYXJlbkF0dHIgPVxuICAgICAgICAgIG91dHB1dC5icmFja2V0UGFyZW5BdHRyID9cbiAgICAgICAgICAgICAgYFsoJHtvdXRwdXQuYnJhY2tldFBhcmVuQXR0ci5zdWJzdHJpbmcoMiwgb3V0cHV0LmJyYWNrZXRQYXJlbkF0dHIubGVuZ3RoIC0gOCl9KV1gIDpcbiAgICAgICAgICAgICAgbnVsbDtcblxuICAgICAgaWYgKGF0dHJzLmhhc093blByb3BlcnR5KG91dHB1dC5vbkF0dHIpKSB7XG4gICAgICAgIGV4cHIgPSBhdHRyc1tvdXRwdXQub25BdHRyXTtcbiAgICAgIH0gZWxzZSBpZiAoYXR0cnMuaGFzT3duUHJvcGVydHkob3V0cHV0LnBhcmVuQXR0cikpIHtcbiAgICAgICAgZXhwciA9IGF0dHJzW291dHB1dC5wYXJlbkF0dHJdO1xuICAgICAgfSBlbHNlIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShiaW5kb25BdHRyKSkge1xuICAgICAgICBleHByID0gYXR0cnNbYmluZG9uQXR0cl07XG4gICAgICAgIGFzc2lnbkV4cHIgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShicmFja2V0UGFyZW5BdHRyKSkge1xuICAgICAgICBleHByID0gYXR0cnNbYnJhY2tldFBhcmVuQXR0cl07XG4gICAgICAgIGFzc2lnbkV4cHIgPSB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhwciAhPSBudWxsICYmIGFzc2lnbkV4cHIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgZ2V0dGVyID0gdGhpcy5wYXJzZShleHByKTtcbiAgICAgICAgdmFyIHNldHRlciA9IGdldHRlci5hc3NpZ247XG4gICAgICAgIGlmIChhc3NpZ25FeHByICYmICFzZXR0ZXIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cHJlc3Npb24gJyR7ZXhwcn0nIGlzIG5vdCBhc3NpZ25hYmxlIWApO1xuICAgICAgICB9XG4gICAgICAgIHZhciBlbWl0dGVyID0gdGhpcy5jb21wb25lbnRbb3V0cHV0LnByb3BdO1xuICAgICAgICBpZiAoZW1pdHRlcikge1xuICAgICAgICAgIGVtaXR0ZXIuc3Vic2NyaWJlKHtcbiAgICAgICAgICAgIG5leHQ6IGFzc2lnbkV4cHIgPyAoKHNldHRlcikgPT4gKHZhbHVlKSA9PiBzZXR0ZXIodGhpcy5zY29wZSwgdmFsdWUpKShzZXR0ZXIpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGdldHRlcikgPT4gKHZhbHVlKSA9PiBnZXR0ZXIodGhpcy5zY29wZSwgeyRldmVudDogdmFsdWV9KSkoZ2V0dGVyKVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBlbWl0dGVyICcke291dHB1dC5wcm9wfScgb24gY29tcG9uZW50ICcke3RoaXMuaW5mby5zZWxlY3Rvcn0nIWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJDbGVhbnVwKCkge1xuICAgIHRoaXMuZWxlbWVudC5iaW5kKCckcmVtb3ZlJywgKCkgPT4gdGhpcy52aWV3TWFuYWdlci5kZXN0cm95Um9vdEhvc3RWaWV3KHRoaXMuaG9zdFZpZXdSZWYpKTtcbiAgfVxufVxuXG5jbGFzcyBOZzFDaGFuZ2UgaW1wbGVtZW50cyBTaW1wbGVDaGFuZ2Uge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcHJldmlvdXNWYWx1ZTogYW55LCBwdWJsaWMgY3VycmVudFZhbHVlOiBhbnkpIHt9XG5cbiAgaXNGaXJzdENoYW5nZSgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucHJldmlvdXNWYWx1ZSA9PT0gdGhpcy5jdXJyZW50VmFsdWU7IH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy91cGdyYWRlL2Rvd25ncmFkZV9uZzJfYWRhcHRlci50c1xuICoqLyIsImltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlLFxuICBUeXBlXG59IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuaW1wb3J0IHtcbiAgTkcxX0NPTVBJTEUsXG4gIE5HMV9TQ09QRSxcbiAgTkcxX0hUVFBfQkFDS0VORCxcbiAgTkcxX1RFTVBMQVRFX0NBQ0hFLFxuICBORzFfQ09OVFJPTExFUlxufSBmcm9tICcuL2NvbnN0YW50cyc7XG5pbXBvcnQge2NvbnRyb2xsZXJLZXl9IGZyb20gJy4vdXRpbCc7XG5pbXBvcnQgKiBhcyBhbmd1bGFyIGZyb20gJy4vYW5ndWxhcl9qcyc7XG5cbmNvbnN0IENBTUVMX0NBU0UgPSAvKFtBLVpdKS9nO1xuY29uc3QgSU5JVElBTF9WQUxVRSA9IHtcbiAgX19VTklOSVRJQUxJWkVEX186IHRydWVcbn07XG5jb25zdCBOT1RfU1VQUE9SVEVEOiBhbnkgPSAnTk9UX1NVUFBPUlRFRCc7XG5cblxuZXhwb3J0IGNsYXNzIFVwZ3JhZGVOZzFDb21wb25lbnRBZGFwdGVyQnVpbGRlciB7XG4gIHR5cGU6IFR5cGU7XG4gIGlucHV0czogc3RyaW5nW10gPSBbXTtcbiAgaW5wdXRzUmVuYW1lOiBzdHJpbmdbXSA9IFtdO1xuICBvdXRwdXRzOiBzdHJpbmdbXSA9IFtdO1xuICBvdXRwdXRzUmVuYW1lOiBzdHJpbmdbXSA9IFtdO1xuICBwcm9wZXJ0eU91dHB1dHM6IHN0cmluZ1tdID0gW107XG4gIGNoZWNrUHJvcGVydGllczogc3RyaW5nW10gPSBbXTtcbiAgcHJvcGVydHlNYXA6IHtbbmFtZTogc3RyaW5nXTogc3RyaW5nfSA9IHt9O1xuICBsaW5rRm46IGFuZ3VsYXIuSUxpbmtGbiA9IG51bGw7XG4gIGRpcmVjdGl2ZTogYW5ndWxhci5JRGlyZWN0aXZlID0gbnVsbDtcbiAgJGNvbnRyb2xsZXI6IGFuZ3VsYXIuSUNvbnRyb2xsZXJTZXJ2aWNlID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmFtZTogc3RyaW5nKSB7XG4gICAgdmFyIHNlbGVjdG9yID0gbmFtZS5yZXBsYWNlKENBTUVMX0NBU0UsIChhbGwsIG5leHQ6IHN0cmluZykgPT4gJy0nICsgbmV4dC50b0xvd2VyQ2FzZSgpKTtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgdGhpcy50eXBlID1cbiAgICAgICAgRGlyZWN0aXZlKHtzZWxlY3Rvcjogc2VsZWN0b3IsIGlucHV0czogdGhpcy5pbnB1dHNSZW5hbWUsIG91dHB1dHM6IHRoaXMub3V0cHV0c1JlbmFtZX0pXG4gICAgICAgICAgICAuQ2xhc3Moe1xuICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogW1xuICAgICAgICAgICAgICAgIG5ldyBJbmplY3QoTkcxX1NDT1BFKSxcbiAgICAgICAgICAgICAgICBFbGVtZW50UmVmLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHNjb3BlOiBhbmd1bGFyLklTY29wZSwgZWxlbWVudFJlZjogRWxlbWVudFJlZikge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlcihcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmLmxpbmtGbiwgc2NvcGUsIHNlbGYuZGlyZWN0aXZlLCBlbGVtZW50UmVmLCBzZWxmLiRjb250cm9sbGVyLCBzZWxmLmlucHV0cyxcbiAgICAgICAgICAgICAgICAgICAgICBzZWxmLm91dHB1dHMsIHNlbGYucHJvcGVydHlPdXRwdXRzLCBzZWxmLmNoZWNrUHJvcGVydGllcywgc2VsZi5wcm9wZXJ0eU1hcCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICBuZ09uQ2hhbmdlczogZnVuY3Rpb24oKSB7IC8qIG5lZWRzIHRvIGJlIGhlcmUgZm9yIG5nMiB0byBwcm9wZXJseSBkZXRlY3QgaXQgKi8gfSxcbiAgICAgICAgICAgICAgbmdEb0NoZWNrOiBmdW5jdGlvbigpIHsgLyogbmVlZHMgdG8gYmUgaGVyZSBmb3IgbmcyIHRvIHByb3Blcmx5IGRldGVjdCBpdCAqLyB9XG4gICAgICAgICAgICB9KTtcbiAgfVxuXG4gIGV4dHJhY3REaXJlY3RpdmUoaW5qZWN0b3I6IGFuZ3VsYXIuSUluamVjdG9yU2VydmljZSk6IGFuZ3VsYXIuSURpcmVjdGl2ZSB7XG4gICAgdmFyIGRpcmVjdGl2ZXM6IGFuZ3VsYXIuSURpcmVjdGl2ZVtdID0gaW5qZWN0b3IuZ2V0KHRoaXMubmFtZSArICdEaXJlY3RpdmUnKTtcbiAgICBpZiAoZGlyZWN0aXZlcy5sZW5ndGggPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ09ubHkgc3VwcG9ydCBzaW5nbGUgZGlyZWN0aXZlIGRlZmluaXRpb24gZm9yOiAnICsgdGhpcy5uYW1lKTtcbiAgICB9XG4gICAgdmFyIGRpcmVjdGl2ZSA9IGRpcmVjdGl2ZXNbMF07XG4gICAgaWYgKGRpcmVjdGl2ZS5yZXBsYWNlKSB0aGlzLm5vdFN1cHBvcnRlZCgncmVwbGFjZScpO1xuICAgIGlmIChkaXJlY3RpdmUudGVybWluYWwpIHRoaXMubm90U3VwcG9ydGVkKCd0ZXJtaW5hbCcpO1xuICAgIHZhciBsaW5rID0gZGlyZWN0aXZlLmxpbms7XG4gICAgaWYgKHR5cGVvZiBsaW5rID09ICdvYmplY3QnKSB7XG4gICAgICBpZiAoKDxhbmd1bGFyLklEaXJlY3RpdmVQcmVQb3N0PmxpbmspLnBvc3QpIHRoaXMubm90U3VwcG9ydGVkKCdsaW5rLnBvc3QnKTtcbiAgICB9XG4gICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgfVxuXG4gIHByaXZhdGUgbm90U3VwcG9ydGVkKGZlYXR1cmU6IHN0cmluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVXBncmFkZWQgZGlyZWN0aXZlICcke3RoaXMubmFtZX0nIGRvZXMgbm90IHN1cHBvcnQgJyR7ZmVhdHVyZX0nLmApO1xuICB9XG5cbiAgZXh0cmFjdEJpbmRpbmdzKCkge1xuICAgIHZhciBzY29wZSA9IHRoaXMuZGlyZWN0aXZlLnNjb3BlO1xuICAgIGlmICh0eXBlb2Ygc2NvcGUgPT0gJ29iamVjdCcpIHtcbiAgICAgIGZvciAodmFyIG5hbWUgaW4gc2NvcGUpIHtcbiAgICAgICAgaWYgKCg8YW55PnNjb3BlKS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIHZhciBsb2NhbE5hbWUgPSBzY29wZVtuYW1lXTtcbiAgICAgICAgICB2YXIgdHlwZSA9IGxvY2FsTmFtZS5jaGFyQXQoMCk7XG4gICAgICAgICAgbG9jYWxOYW1lID0gbG9jYWxOYW1lLnN1YnN0cigxKSB8fCBuYW1lO1xuICAgICAgICAgIHZhciBvdXRwdXROYW1lID0gJ291dHB1dF8nICsgbmFtZTtcbiAgICAgICAgICB2YXIgb3V0cHV0TmFtZVJlbmFtZSA9IG91dHB1dE5hbWUgKyAnOiAnICsgbmFtZTtcbiAgICAgICAgICB2YXIgb3V0cHV0TmFtZVJlbmFtZUNoYW5nZSA9IG91dHB1dE5hbWUgKyAnOiAnICsgbmFtZSArICdDaGFuZ2UnO1xuICAgICAgICAgIHZhciBpbnB1dE5hbWUgPSAnaW5wdXRfJyArIG5hbWU7XG4gICAgICAgICAgdmFyIGlucHV0TmFtZVJlbmFtZSA9IGlucHV0TmFtZSArICc6ICcgKyBuYW1lO1xuICAgICAgICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnPSc6XG4gICAgICAgICAgICAgIHRoaXMucHJvcGVydHlPdXRwdXRzLnB1c2gob3V0cHV0TmFtZSk7XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tQcm9wZXJ0aWVzLnB1c2gobG9jYWxOYW1lKTtcbiAgICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2gob3V0cHV0TmFtZSk7XG4gICAgICAgICAgICAgIHRoaXMub3V0cHV0c1JlbmFtZS5wdXNoKG91dHB1dE5hbWVSZW5hbWVDaGFuZ2UpO1xuICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5TWFwW291dHB1dE5hbWVdID0gbG9jYWxOYW1lO1xuICAgICAgICAgICAgLy8gZG9uJ3QgYnJlYWs7IGxldCBpdCBmYWxsIHRocm91Z2ggdG8gJ0AnXG4gICAgICAgICAgICBjYXNlICdAJzpcbiAgICAgICAgICAgICAgdGhpcy5pbnB1dHMucHVzaChpbnB1dE5hbWUpO1xuICAgICAgICAgICAgICB0aGlzLmlucHV0c1JlbmFtZS5wdXNoKGlucHV0TmFtZVJlbmFtZSk7XG4gICAgICAgICAgICAgIHRoaXMucHJvcGVydHlNYXBbaW5wdXROYW1lXSA9IGxvY2FsTmFtZTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcmJzpcbiAgICAgICAgICAgICAgdGhpcy5vdXRwdXRzLnB1c2gob3V0cHV0TmFtZSk7XG4gICAgICAgICAgICAgIHRoaXMub3V0cHV0c1JlbmFtZS5wdXNoKG91dHB1dE5hbWVSZW5hbWUpO1xuICAgICAgICAgICAgICB0aGlzLnByb3BlcnR5TWFwW291dHB1dE5hbWVdID0gbG9jYWxOYW1lO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgIHZhciBqc29uID0gSlNPTi5zdHJpbmdpZnkoc2NvcGUpO1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgVW5leHBlY3RlZCBtYXBwaW5nICcke3R5cGV9JyBpbiAnJHtqc29ufScgaW4gJyR7dGhpcy5uYW1lfScgZGlyZWN0aXZlLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbXBpbGVUZW1wbGF0ZShjb21waWxlOiBhbmd1bGFyLklDb21waWxlU2VydmljZSwgdGVtcGxhdGVDYWNoZTogYW5ndWxhci5JVGVtcGxhdGVDYWNoZVNlcnZpY2UsXG4gICAgICAgICAgICAgICAgICBodHRwQmFja2VuZDogYW5ndWxhci5JSHR0cEJhY2tlbmRTZXJ2aWNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICBpZiAodGhpcy5kaXJlY3RpdmUudGVtcGxhdGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5saW5rRm4gPSBjb21waWxlSHRtbCh0aGlzLmRpcmVjdGl2ZS50ZW1wbGF0ZSk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmRpcmVjdGl2ZS50ZW1wbGF0ZVVybCkge1xuICAgICAgdmFyIHVybCA9IHRoaXMuZGlyZWN0aXZlLnRlbXBsYXRlVXJsO1xuICAgICAgdmFyIGh0bWwgPSB0ZW1wbGF0ZUNhY2hlLmdldCh1cmwpO1xuICAgICAgaWYgKGh0bWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmxpbmtGbiA9IGNvbXBpbGVIdG1sKGh0bWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCBlcnIpID0+IHtcbiAgICAgICAgICBodHRwQmFja2VuZCgnR0VUJywgdXJsLCBudWxsLCAoc3RhdHVzLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzLmxpbmtGbiA9IGNvbXBpbGVIdG1sKHRlbXBsYXRlQ2FjaGUucHV0KHVybCwgcmVzcG9uc2UpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlcnIoYEdFVCAke3VybH0gcmV0dXJuZWQgJHtzdGF0dXN9OiAke3Jlc3BvbnNlfWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaXJlY3RpdmUgJyR7dGhpcy5uYW1lfScgaXMgbm90IGEgY29tcG9uZW50LCBpdCBpcyBtaXNzaW5nIHRlbXBsYXRlLmApO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgICBmdW5jdGlvbiBjb21waWxlSHRtbChodG1sKTogYW5ndWxhci5JTGlua0ZuIHtcbiAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgICAgIGRpdi5pbm5lckhUTUwgPSBodG1sO1xuICAgICAgcmV0dXJuIGNvbXBpbGUoZGl2LmNoaWxkTm9kZXMpO1xuICAgIH1cbiAgfVxuXG4gIHN0YXRpYyByZXNvbHZlKGV4cG9ydGVkQ29tcG9uZW50czoge1tuYW1lOiBzdHJpbmddOiBVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlckJ1aWxkZXJ9LFxuICAgICAgICAgICAgICAgICBpbmplY3RvcjogYW5ndWxhci5JSW5qZWN0b3JTZXJ2aWNlKTogUHJvbWlzZTxhbnk+IHtcbiAgICB2YXIgcHJvbWlzZXMgPSBbXTtcbiAgICB2YXIgY29tcGlsZTogYW5ndWxhci5JQ29tcGlsZVNlcnZpY2UgPSBpbmplY3Rvci5nZXQoTkcxX0NPTVBJTEUpO1xuICAgIHZhciB0ZW1wbGF0ZUNhY2hlOiBhbmd1bGFyLklUZW1wbGF0ZUNhY2hlU2VydmljZSA9IGluamVjdG9yLmdldChORzFfVEVNUExBVEVfQ0FDSEUpO1xuICAgIHZhciBodHRwQmFja2VuZDogYW5ndWxhci5JSHR0cEJhY2tlbmRTZXJ2aWNlID0gaW5qZWN0b3IuZ2V0KE5HMV9IVFRQX0JBQ0tFTkQpO1xuICAgIHZhciAkY29udHJvbGxlcjogYW5ndWxhci5JQ29udHJvbGxlclNlcnZpY2UgPSBpbmplY3Rvci5nZXQoTkcxX0NPTlRST0xMRVIpO1xuICAgIGZvciAodmFyIG5hbWUgaW4gZXhwb3J0ZWRDb21wb25lbnRzKSB7XG4gICAgICBpZiAoKDxhbnk+ZXhwb3J0ZWRDb21wb25lbnRzKS5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICB2YXIgZXhwb3J0ZWRDb21wb25lbnQgPSBleHBvcnRlZENvbXBvbmVudHNbbmFtZV07XG4gICAgICAgIGV4cG9ydGVkQ29tcG9uZW50LmRpcmVjdGl2ZSA9IGV4cG9ydGVkQ29tcG9uZW50LmV4dHJhY3REaXJlY3RpdmUoaW5qZWN0b3IpO1xuICAgICAgICBleHBvcnRlZENvbXBvbmVudC4kY29udHJvbGxlciA9ICRjb250cm9sbGVyO1xuICAgICAgICBleHBvcnRlZENvbXBvbmVudC5leHRyYWN0QmluZGluZ3MoKTtcbiAgICAgICAgdmFyIHByb21pc2UgPSBleHBvcnRlZENvbXBvbmVudC5jb21waWxlVGVtcGxhdGUoY29tcGlsZSwgdGVtcGxhdGVDYWNoZSwgaHR0cEJhY2tlbmQpO1xuICAgICAgICBpZiAocHJvbWlzZSkgcHJvbWlzZXMucHVzaChwcm9taXNlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgfVxufVxuXG5jbGFzcyBVcGdyYWRlTmcxQ29tcG9uZW50QWRhcHRlciBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgRG9DaGVjayB7XG4gIGRlc3RpbmF0aW9uT2JqOiBhbnkgPSBudWxsO1xuICBjaGVja0xhc3RWYWx1ZXM6IGFueVtdID0gW107XG5cbiAgY29uc3RydWN0b3IobGlua0ZuOiBhbmd1bGFyLklMaW5rRm4sIHNjb3BlOiBhbmd1bGFyLklTY29wZSwgcHJpdmF0ZSBkaXJlY3RpdmU6IGFuZ3VsYXIuSURpcmVjdGl2ZSxcbiAgICAgICAgICAgICAgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgJGNvbnRyb2xsZXI6IGFuZ3VsYXIuSUNvbnRyb2xsZXJTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIGlucHV0czogc3RyaW5nW10sIHByaXZhdGUgb3V0cHV0czogc3RyaW5nW10sIHByaXZhdGUgcHJvcE91dHM6IHN0cmluZ1tdLFxuICAgICAgICAgICAgICBwcml2YXRlIGNoZWNrUHJvcGVydGllczogc3RyaW5nW10sIHByaXZhdGUgcHJvcGVydHlNYXA6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9KSB7XG4gICAgdmFyIGVsZW1lbnQ6IEVsZW1lbnQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7XG4gICAgdmFyIGNoaWxkTm9kZXM6IE5vZGVbXSA9IFtdO1xuICAgIHZhciBjaGlsZE5vZGU7XG4gICAgd2hpbGUgKGNoaWxkTm9kZSA9IGVsZW1lbnQuZmlyc3RDaGlsZCkge1xuICAgICAgZWxlbWVudC5yZW1vdmVDaGlsZChjaGlsZE5vZGUpO1xuICAgICAgY2hpbGROb2Rlcy5wdXNoKGNoaWxkTm9kZSk7XG4gICAgfVxuICAgIHZhciBjb21wb25lbnRTY29wZSA9IHNjb3BlLiRuZXcoISFkaXJlY3RpdmUuc2NvcGUpO1xuICAgIHZhciAkZWxlbWVudCA9IGFuZ3VsYXIuZWxlbWVudChlbGVtZW50KTtcbiAgICB2YXIgY29udHJvbGxlclR5cGUgPSBkaXJlY3RpdmUuY29udHJvbGxlcjtcbiAgICB2YXIgY29udHJvbGxlcjogYW55ID0gbnVsbDtcbiAgICBpZiAoY29udHJvbGxlclR5cGUpIHtcbiAgICAgIHZhciBsb2NhbHMgPSB7JHNjb3BlOiBjb21wb25lbnRTY29wZSwgJGVsZW1lbnQ6ICRlbGVtZW50fTtcbiAgICAgIGNvbnRyb2xsZXIgPSAkY29udHJvbGxlcihjb250cm9sbGVyVHlwZSwgbG9jYWxzLCBudWxsLCBkaXJlY3RpdmUuY29udHJvbGxlckFzKTtcbiAgICAgICRlbGVtZW50LmRhdGEoY29udHJvbGxlcktleShkaXJlY3RpdmUubmFtZSksIGNvbnRyb2xsZXIpO1xuICAgIH1cbiAgICB2YXIgbGluayA9IGRpcmVjdGl2ZS5saW5rO1xuICAgIGlmICh0eXBlb2YgbGluayA9PSAnb2JqZWN0JykgbGluayA9ICg8YW5ndWxhci5JRGlyZWN0aXZlUHJlUG9zdD5saW5rKS5wcmU7XG4gICAgaWYgKGxpbmspIHtcbiAgICAgIHZhciBhdHRyczogYW5ndWxhci5JQXR0cmlidXRlcyA9IE5PVF9TVVBQT1JURUQ7XG4gICAgICB2YXIgdHJhbnNjbHVkZUZuOiBhbmd1bGFyLklUcmFuc2NsdWRlRnVuY3Rpb24gPSBOT1RfU1VQUE9SVEVEO1xuICAgICAgdmFyIGxpbmtDb250cm9sbGVyID0gdGhpcy5yZXNvbHZlUmVxdWlyZWQoJGVsZW1lbnQsIGRpcmVjdGl2ZS5yZXF1aXJlKTtcbiAgICAgICg8YW5ndWxhci5JRGlyZWN0aXZlTGlua0ZuPmRpcmVjdGl2ZS5saW5rKShjb21wb25lbnRTY29wZSwgJGVsZW1lbnQsIGF0dHJzLCBsaW5rQ29udHJvbGxlcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2NsdWRlRm4pO1xuICAgIH1cbiAgICB0aGlzLmRlc3RpbmF0aW9uT2JqID0gZGlyZWN0aXZlLmJpbmRUb0NvbnRyb2xsZXIgJiYgY29udHJvbGxlciA/IGNvbnRyb2xsZXIgOiBjb21wb25lbnRTY29wZTtcblxuICAgIGxpbmtGbihjb21wb25lbnRTY29wZSwgKGNsb25lZEVsZW1lbnQ6IE5vZGVbXSwgc2NvcGU6IGFuZ3VsYXIuSVNjb3BlKSA9PiB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgaWkgPSBjbG9uZWRFbGVtZW50Lmxlbmd0aDsgaSA8IGlpOyBpKyspIHtcbiAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjbG9uZWRFbGVtZW50W2ldKTtcbiAgICAgIH1cbiAgICB9LCB7cGFyZW50Qm91bmRUcmFuc2NsdWRlRm46IChzY29wZSwgY2xvbmVBdHRhY2gpID0+IHsgY2xvbmVBdHRhY2goY2hpbGROb2Rlcyk7IH19KTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB0aGlzW2lucHV0c1tpXV0gPSBudWxsO1xuICAgIH1cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG91dHB1dHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIHZhciBlbWl0dGVyID0gdGhpc1tvdXRwdXRzW2pdXSA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgICAgIHRoaXMuc2V0Q29tcG9uZW50UHJvcGVydHkob3V0cHV0c1tqXSwgKChlbWl0dGVyKSA9PiAodmFsdWUpID0+IGVtaXR0ZXIuZW1pdCh2YWx1ZSkpKGVtaXR0ZXIpKTtcbiAgICB9XG4gICAgZm9yICh2YXIgayA9IDA7IGsgPCBwcm9wT3V0cy5sZW5ndGg7IGsrKykge1xuICAgICAgdGhpc1twcm9wT3V0c1trXV0gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gICAgICB0aGlzLmNoZWNrTGFzdFZhbHVlcy5wdXNoKElOSVRJQUxfVkFMVUUpO1xuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IHtbbmFtZTogc3RyaW5nXTogU2ltcGxlQ2hhbmdlfSkge1xuICAgIGZvciAodmFyIG5hbWUgaW4gY2hhbmdlcykge1xuICAgICAgaWYgKCg8T2JqZWN0PmNoYW5nZXMpLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHZhciBjaGFuZ2U6IFNpbXBsZUNoYW5nZSA9IGNoYW5nZXNbbmFtZV07XG4gICAgICAgIHRoaXMuc2V0Q29tcG9uZW50UHJvcGVydHkobmFtZSwgY2hhbmdlLmN1cnJlbnRWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdEb0NoZWNrKCk6IG51bWJlciB7XG4gICAgdmFyIGNvdW50ID0gMDtcbiAgICB2YXIgZGVzdGluYXRpb25PYmogPSB0aGlzLmRlc3RpbmF0aW9uT2JqO1xuICAgIHZhciBsYXN0VmFsdWVzID0gdGhpcy5jaGVja0xhc3RWYWx1ZXM7XG4gICAgdmFyIGNoZWNrUHJvcGVydGllcyA9IHRoaXMuY2hlY2tQcm9wZXJ0aWVzO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hlY2tQcm9wZXJ0aWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBkZXN0aW5hdGlvbk9ialtjaGVja1Byb3BlcnRpZXNbaV1dO1xuICAgICAgdmFyIGxhc3QgPSBsYXN0VmFsdWVzW2ldO1xuICAgICAgaWYgKHZhbHVlICE9PSBsYXN0KSB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgaXNOYU4odmFsdWUpICYmIHR5cGVvZiBsYXN0ID09ICdudW1iZXInICYmIGlzTmFOKGxhc3QpKSB7XG4gICAgICAgICAgLy8gaWdub3JlIGJlY2F1c2UgTmFOICE9IE5hTlxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhciBldmVudEVtaXR0ZXI6IEV2ZW50RW1pdHRlcjxhbnk+ID0gdGhpc1t0aGlzLnByb3BPdXRzW2ldXTtcbiAgICAgICAgICBldmVudEVtaXR0ZXIuZW1pdChsYXN0VmFsdWVzW2ldID0gdmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjb3VudDtcbiAgfVxuXG4gIHNldENvbXBvbmVudFByb3BlcnR5KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSkge1xuICAgIHRoaXMuZGVzdGluYXRpb25PYmpbdGhpcy5wcm9wZXJ0eU1hcFtuYW1lXV0gPSB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVzb2x2ZVJlcXVpcmVkKCRlbGVtZW50OiBhbmd1bGFyLklBdWdtZW50ZWRKUXVlcnksIHJlcXVpcmU6IHN0cmluZyB8IHN0cmluZ1tdKTogYW55IHtcbiAgICBpZiAoIXJlcXVpcmUpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgcmVxdWlyZSA9PSAnc3RyaW5nJykge1xuICAgICAgdmFyIG5hbWU6IHN0cmluZyA9IDxzdHJpbmc+cmVxdWlyZTtcbiAgICAgIHZhciBpc09wdGlvbmFsID0gZmFsc2U7XG4gICAgICB2YXIgc3RhcnRQYXJlbnQgPSBmYWxzZTtcbiAgICAgIHZhciBzZWFyY2hQYXJlbnRzID0gZmFsc2U7XG4gICAgICB2YXIgY2g6IHN0cmluZztcbiAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PSAnPycpIHtcbiAgICAgICAgaXNPcHRpb25hbCA9IHRydWU7XG4gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PSAnXicpIHtcbiAgICAgICAgc2VhcmNoUGFyZW50cyA9IHRydWU7XG4gICAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYW1lLmNoYXJBdCgwKSA9PSAnXicpIHtcbiAgICAgICAgc3RhcnRQYXJlbnQgPSB0cnVlO1xuICAgICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSk7XG4gICAgICB9XG5cbiAgICAgIHZhciBrZXkgPSBjb250cm9sbGVyS2V5KG5hbWUpO1xuICAgICAgaWYgKHN0YXJ0UGFyZW50KSAkZWxlbWVudCA9ICRlbGVtZW50LnBhcmVudCgpO1xuICAgICAgdmFyIGRlcCA9IHNlYXJjaFBhcmVudHMgPyAkZWxlbWVudC5pbmhlcml0ZWREYXRhKGtleSkgOiAkZWxlbWVudC5kYXRhKGtleSk7XG4gICAgICBpZiAoIWRlcCAmJiAhaXNPcHRpb25hbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbiBub3QgbG9jYXRlICcke3JlcXVpcmV9JyBpbiAnJHt0aGlzLmRpcmVjdGl2ZS5uYW1lfScuYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZGVwO1xuICAgIH0gZWxzZSBpZiAocmVxdWlyZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgICB2YXIgZGVwcyA9IFtdO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXF1aXJlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGRlcHMucHVzaCh0aGlzLnJlc29sdmVSZXF1aXJlZCgkZWxlbWVudCwgcmVxdWlyZVtpXSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGRlcHM7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERpcmVjdGl2ZSAnJHt0aGlzLmRpcmVjdGl2ZS5uYW1lfScgcmVxdWlyZSBzeW50YXggdW5yZWNvZ25pemVkOiAke3RoaXMuZGlyZWN0aXZlLnJlcXVpcmV9YCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy91cGdyYWRlL3VwZ3JhZGVfbmcxX2FkYXB0ZXIudHNcbiAqKi8iLCJleHBvcnQgaW50ZXJmYWNlIElNb2R1bGUge1xuICBjb25maWcoZm46IGFueSk6IElNb2R1bGU7XG4gIGRpcmVjdGl2ZShzZWxlY3Rvcjogc3RyaW5nLCBmYWN0b3J5OiBhbnkpOiBJTW9kdWxlO1xuICBjb250cm9sbGVyKG5hbWU6IHN0cmluZywgdHlwZTogYW55KTogSU1vZHVsZTtcbiAgZmFjdG9yeShrZXk6IHN0cmluZywgZmFjdG9yeUZuOiBhbnkpOiBJTW9kdWxlO1xuICB2YWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IGFueSk6IElNb2R1bGU7XG4gIHJ1bihhOiBhbnkpOiB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBJQ29tcGlsZVNlcnZpY2Uge1xuICAoZWxlbWVudDogRWxlbWVudCB8IE5vZGVMaXN0IHwgc3RyaW5nLCB0cmFuc2NsdWRlPzogRnVuY3Rpb24pOiBJTGlua0ZuO1xufVxuZXhwb3J0IGludGVyZmFjZSBJTGlua0ZuIHtcbiAgKHNjb3BlOiBJU2NvcGUsIGNsb25lQXR0YWNoRm4/OiBGdW5jdGlvbiwgb3B0aW9ucz86IElMaW5rRm5PcHRpb25zKTogdm9pZDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUxpbmtGbk9wdGlvbnMge1xuICBwYXJlbnRCb3VuZFRyYW5zY2x1ZGVGbj86IEZ1bmN0aW9uO1xuICB0cmFuc2NsdWRlQ29udHJvbGxlcnM/OiB7W2tleTogc3RyaW5nXTogYW55fTtcbiAgZnV0dXJlUGFyZW50RWxlbWVudD86IE5vZGU7XG59XG5leHBvcnQgaW50ZXJmYWNlIElSb290U2NvcGVTZXJ2aWNlIHtcbiAgJG5ldyhpc29sYXRlPzogYm9vbGVhbik6IElTY29wZTtcbiAgJGlkOiBzdHJpbmc7XG4gICR3YXRjaChleHByOiBhbnksIGZuPzogKGExPzogYW55LCBhMj86IGFueSkgPT4gdm9pZCk6IEZ1bmN0aW9uO1xuICAkYXBwbHkoKTogYW55O1xuICAkYXBwbHkoZXhwOiBzdHJpbmcpOiBhbnk7XG4gICRhcHBseShleHA6IEZ1bmN0aW9uKTogYW55O1xuICAkJGNoaWxkVGFpbDogSVNjb3BlO1xuICAkJGNoaWxkSGVhZDogSVNjb3BlO1xuICAkJG5leHRTaWJsaW5nOiBJU2NvcGU7XG59XG5leHBvcnQgaW50ZXJmYWNlIElTY29wZSBleHRlbmRzIElSb290U2NvcGVTZXJ2aWNlIHt9XG5leHBvcnQgaW50ZXJmYWNlIElBbmd1bGFyQm9vdHN0cmFwQ29uZmlnIHt9XG5leHBvcnQgaW50ZXJmYWNlIElEaXJlY3RpdmUge1xuICBjb21waWxlPzogSURpcmVjdGl2ZUNvbXBpbGVGbjtcbiAgY29udHJvbGxlcj86IGFueTtcbiAgY29udHJvbGxlckFzPzogc3RyaW5nO1xuICBiaW5kVG9Db250cm9sbGVyPzogYm9vbGVhbiB8IE9iamVjdDtcbiAgbGluaz86IElEaXJlY3RpdmVMaW5rRm4gfCBJRGlyZWN0aXZlUHJlUG9zdDtcbiAgbmFtZT86IHN0cmluZztcbiAgcHJpb3JpdHk/OiBudW1iZXI7XG4gIHJlcGxhY2U/OiBib29sZWFuO1xuICByZXF1aXJlPzogYW55O1xuICByZXN0cmljdD86IHN0cmluZztcbiAgc2NvcGU/OiBhbnk7XG4gIHRlbXBsYXRlPzogYW55O1xuICB0ZW1wbGF0ZVVybD86IGFueTtcbiAgdGVybWluYWw/OiBib29sZWFuO1xuICB0cmFuc2NsdWRlPzogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJRGlyZWN0aXZlQ29tcGlsZUZuIHtcbiAgKHRlbXBsYXRlRWxlbWVudDogSUF1Z21lbnRlZEpRdWVyeSwgdGVtcGxhdGVBdHRyaWJ1dGVzOiBJQXR0cmlidXRlcyxcbiAgIHRyYW5zY2x1ZGU6IElUcmFuc2NsdWRlRnVuY3Rpb24pOiBJRGlyZWN0aXZlUHJlUG9zdDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSURpcmVjdGl2ZVByZVBvc3Qge1xuICBwcmU/OiBJRGlyZWN0aXZlTGlua0ZuO1xuICBwb3N0PzogSURpcmVjdGl2ZUxpbmtGbjtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSURpcmVjdGl2ZUxpbmtGbiB7XG4gIChzY29wZTogSVNjb3BlLCBpbnN0YW5jZUVsZW1lbnQ6IElBdWdtZW50ZWRKUXVlcnksIGluc3RhbmNlQXR0cmlidXRlczogSUF0dHJpYnV0ZXMsXG4gICBjb250cm9sbGVyOiBhbnksIHRyYW5zY2x1ZGU6IElUcmFuc2NsdWRlRnVuY3Rpb24pOiB2b2lkO1xufVxuZXhwb3J0IGludGVyZmFjZSBJQXR0cmlidXRlcyB7ICRvYnNlcnZlKGF0dHI6IHN0cmluZywgZm46ICh2OiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkOyB9XG5leHBvcnQgaW50ZXJmYWNlIElUcmFuc2NsdWRlRnVuY3Rpb24ge1xuICAvLyBJZiB0aGUgc2NvcGUgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIGNsb25lQXR0YWNoRm4gbXVzdCBiZSBhcyB3ZWxsLlxuICAoc2NvcGU6IElTY29wZSwgY2xvbmVBdHRhY2hGbjogSUNsb25lQXR0YWNoRnVuY3Rpb24pOiBJQXVnbWVudGVkSlF1ZXJ5O1xuICAvLyBJZiBvbmUgYXJndW1lbnQgaXMgcHJvdmlkZWQsIHRoZW4gaXQncyBhc3N1bWVkIHRvIGJlIHRoZSBjbG9uZUF0dGFjaEZuLlxuICAoY2xvbmVBdHRhY2hGbj86IElDbG9uZUF0dGFjaEZ1bmN0aW9uKTogSUF1Z21lbnRlZEpRdWVyeTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUNsb25lQXR0YWNoRnVuY3Rpb24ge1xuICAvLyBMZXQncyBoaW50IGJ1dCBub3QgZm9yY2UgY2xvbmVBdHRhY2hGbidzIHNpZ25hdHVyZVxuICAoY2xvbmVkRWxlbWVudD86IElBdWdtZW50ZWRKUXVlcnksIHNjb3BlPzogSVNjb3BlKTogYW55O1xufVxuZXhwb3J0IGludGVyZmFjZSBJQXVnbWVudGVkSlF1ZXJ5IHtcbiAgYmluZChuYW1lOiBzdHJpbmcsIGZuOiAoKSA9PiB2b2lkKTogdm9pZDtcbiAgZGF0YShuYW1lOiBzdHJpbmcsIHZhbHVlPzogYW55KTogYW55O1xuICBpbmhlcml0ZWREYXRhKG5hbWU6IHN0cmluZywgdmFsdWU/OiBhbnkpOiBhbnk7XG4gIGNvbnRlbnRzKCk6IElBdWdtZW50ZWRKUXVlcnk7XG4gIHBhcmVudCgpOiBJQXVnbWVudGVkSlF1ZXJ5O1xuICBsZW5ndGg6IG51bWJlcjtcbiAgW2luZGV4OiBudW1iZXJdOiBOb2RlO1xufVxuZXhwb3J0IGludGVyZmFjZSBJUGFyc2VTZXJ2aWNlIHsgKGV4cHJlc3Npb246IHN0cmluZyk6IElDb21waWxlZEV4cHJlc3Npb247IH1cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBpbGVkRXhwcmVzc2lvbiB7IGFzc2lnbihjb250ZXh0OiBhbnksIHZhbHVlOiBhbnkpOiBhbnk7IH1cbmV4cG9ydCBpbnRlcmZhY2UgSUh0dHBCYWNrZW5kU2VydmljZSB7XG4gIChtZXRob2Q6IHN0cmluZywgdXJsOiBzdHJpbmcsIHBvc3Q/OiBhbnksIGNhbGxiYWNrPzogRnVuY3Rpb24sIGhlYWRlcnM/OiBhbnksIHRpbWVvdXQ/OiBudW1iZXIsXG4gICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuKTogdm9pZDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSUNhY2hlT2JqZWN0IHtcbiAgcHV0PFQ+KGtleTogc3RyaW5nLCB2YWx1ZT86IFQpOiBUO1xuICBnZXQoa2V5OiBzdHJpbmcpOiBhbnk7XG59XG5leHBvcnQgaW50ZXJmYWNlIElUZW1wbGF0ZUNhY2hlU2VydmljZSBleHRlbmRzIElDYWNoZU9iamVjdCB7fVxuZXhwb3J0IGludGVyZmFjZSBJQ29udHJvbGxlclNlcnZpY2Uge1xuICAoY29udHJvbGxlckNvbnN0cnVjdG9yOiBGdW5jdGlvbiwgbG9jYWxzPzogYW55LCBsYXRlcj86IGFueSwgaWRlbnQ/OiBhbnkpOiBhbnk7XG4gIChjb250cm9sbGVyTmFtZTogc3RyaW5nLCBsb2NhbHM/OiBhbnkpOiBhbnk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUluamVjdG9yU2VydmljZSB7IGdldChrZXk6IHN0cmluZyk6IGFueTsgfVxuXG5mdW5jdGlvbiBub05nKCkge1xuICB0aHJvdyBuZXcgRXJyb3IoJ0FuZ3VsYXJKUyB2MS54IGlzIG5vdCBsb2FkZWQhJyk7XG59XG5cbnZhciBhbmd1bGFyOiB7XG4gIGJvb3RzdHJhcDogKGU6IEVsZW1lbnQsIG1vZHVsZXM6IHN0cmluZ1tdLCBjb25maWc6IElBbmd1bGFyQm9vdHN0cmFwQ29uZmlnKSA9PiB2b2lkLFxuICBtb2R1bGU6IChwcmVmaXg6IHN0cmluZywgZGVwZW5kZW5jaWVzPzogc3RyaW5nW10pID0+IElNb2R1bGUsXG4gIGVsZW1lbnQ6IChlOiBFbGVtZW50KSA9PiBJQXVnbWVudGVkSlF1ZXJ5LFxuICB2ZXJzaW9uOiB7bWFqb3I6IG51bWJlcn1cbn0gPSA8YW55Pntib290c3RyYXA6IG5vTmcsIG1vZHVsZTogbm9OZywgZWxlbWVudDogbm9OZywgdmVyc2lvbjogbm9OZ307XG5cblxudHJ5IHtcbiAgaWYgKHdpbmRvdy5oYXNPd25Qcm9wZXJ0eSgnYW5ndWxhcicpKSB7XG4gICAgYW5ndWxhciA9ICg8YW55PndpbmRvdykuYW5ndWxhcjtcbiAgfVxufSBjYXRjaCAoZSkge1xuICAvLyBpZ25vcmUgaW4gQ0pTIG1vZGUuXG59XG5cbmV4cG9ydCB2YXIgYm9vdHN0cmFwID0gYW5ndWxhci5ib290c3RyYXA7XG5leHBvcnQgdmFyIG1vZHVsZSA9IGFuZ3VsYXIubW9kdWxlO1xuZXhwb3J0IHZhciBlbGVtZW50ID0gYW5ndWxhci5lbGVtZW50O1xuZXhwb3J0IHZhciB2ZXJzaW9uID0gYW5ndWxhci52ZXJzaW9uO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3VwZ3JhZGUvYW5ndWxhcl9qcy50c1xuICoqLyIsIi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBUaGlzIG1vZHVsZSBpcyB1c2VkIGZvciB3cml0aW5nIHRlc3RzIGZvciBhcHBsaWNhdGlvbnMgd3JpdHRlbiBpbiBBbmd1bGFyLlxuICpcbiAqIFRoaXMgbW9kdWxlIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYGFuZ3VsYXIyYCBtb2R1bGU7IHlvdSBtdXN0IGltcG9ydCB0aGUgdGVzdCBtb2R1bGUgZXhwbGljaXRseS5cbiAqXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vc3JjL3Rlc3RpbmcvdGVzdGluZyc7XG5leHBvcnQge0NvbXBvbmVudEZpeHR1cmUsIFRlc3RDb21wb25lbnRCdWlsZGVyfSBmcm9tICcuL3NyYy90ZXN0aW5nL3Rlc3RfY29tcG9uZW50X2J1aWxkZXInO1xuZXhwb3J0ICogZnJvbSAnLi9zcmMvdGVzdGluZy90ZXN0X2luamVjdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vc3JjL3Rlc3RpbmcvZmFrZV9hc3luYyc7XG5cbmV4cG9ydCB7TW9ja1ZpZXdSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svdmlld19yZXNvbHZlcl9tb2NrJztcbmV4cG9ydCB7TW9ja1hIUn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL3hocl9tb2NrJztcbmV4cG9ydCB7TW9ja05nWm9uZX0gZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svbmdfem9uZV9tb2NrJztcbmV4cG9ydCB7TW9ja0FwcGxpY2F0aW9uUmVmfSBmcm9tICdhbmd1bGFyMi9zcmMvbW9jay9tb2NrX2FwcGxpY2F0aW9uX3JlZic7XG5leHBvcnQge01vY2tEaXJlY3RpdmVSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svZGlyZWN0aXZlX3Jlc29sdmVyX21vY2snO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvdGVzdGluZy50c1xuICoqLyIsIi8qKlxuICogUHVibGljIFRlc3QgTGlicmFyeSBmb3IgdW5pdCB0ZXN0aW5nIEFuZ3VsYXIyIEFwcGxpY2F0aW9ucy4gVXNlcyB0aGVcbiAqIEphc21pbmUgZnJhbWV3b3JrLlxuICovXG5pbXBvcnQge2dsb2JhbH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge2JpbmR9IGZyb20gJ2FuZ3VsYXIyL2NvcmUnO1xuXG5pbXBvcnQge1xuICBjcmVhdGVUZXN0SW5qZWN0b3JXaXRoUnVudGltZUNvbXBpbGVyLFxuICBGdW5jdGlvbldpdGhQYXJhbVRva2VucyxcbiAgaW5qZWN0LFxuICBpbmplY3RBc3luY1xufSBmcm9tICcuL3Rlc3RfaW5qZWN0b3InO1xuXG5leHBvcnQge2luamVjdCwgaW5qZWN0QXN5bmN9IGZyb20gJy4vdGVzdF9pbmplY3Rvcic7XG5cbmV4cG9ydCB7ZXhwZWN0LCBOZ01hdGNoZXJzfSBmcm9tICcuL21hdGNoZXJzJztcblxudmFyIF9nbG9iYWw6IGphc21pbmUuR2xvYmFsUG9sbHV0ZXIgPSA8YW55Pih0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHdpbmRvdyk7XG5cbi8qKlxuICogUnVuIGEgZnVuY3Rpb24gKHdpdGggYW4gb3B0aW9uYWwgYXN5bmNocm9ub3VzIGNhbGxiYWNrKSBhZnRlciBlYWNoIHRlc3QgY2FzZS5cbiAqXG4gKiBTZWUgaHR0cDovL2phc21pbmUuZ2l0aHViLmlvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqICMjIEV4YW1wbGU6XG4gKlxuICoge0BleGFtcGxlIHRlc3RpbmcvdHMvdGVzdGluZy50cyByZWdpb249J2FmdGVyRWFjaCd9XG4gKi9cbmV4cG9ydCB2YXIgYWZ0ZXJFYWNoOiBGdW5jdGlvbiA9IF9nbG9iYWwuYWZ0ZXJFYWNoO1xuXG4vKipcbiAqIEdyb3VwIHRlc3QgY2FzZXMgdG9nZXRoZXIgdW5kZXIgYSBjb21tb24gZGVzY3JpcHRpb24gcHJlZml4LlxuICpcbiAqIFNlZSBodHRwOi8vamFzbWluZS5naXRodWIuaW8vIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy90ZXN0aW5nLnRzIHJlZ2lvbj0nZGVzY3JpYmVJdCd9XG4gKi9cbmV4cG9ydCB2YXIgZGVzY3JpYmU6IEZ1bmN0aW9uID0gX2dsb2JhbC5kZXNjcmliZTtcblxuLyoqXG4gKiBTZWUge0BsaW5rIGZkZXNjcmliZX0uXG4gKi9cbmV4cG9ydCB2YXIgZGRlc2NyaWJlOiBGdW5jdGlvbiA9IF9nbG9iYWwuZmRlc2NyaWJlO1xuXG4vKipcbiAqIExpa2Uge0BsaW5rIGRlc2NyaWJlfSwgYnV0IGluc3RydWN0cyB0aGUgdGVzdCBydW5uZXIgdG8gb25seSBydW5cbiAqIHRoZSB0ZXN0IGNhc2VzIGluIHRoaXMgZ3JvdXAuIFRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gKlxuICogU2VlIGh0dHA6Ly9qYXNtaW5lLmdpdGh1Yi5pby8gZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiAjIyBFeGFtcGxlOlxuICpcbiAqIHtAZXhhbXBsZSB0ZXN0aW5nL3RzL3Rlc3RpbmcudHMgcmVnaW9uPSdmZGVzY3JpYmUnfVxuICovXG5leHBvcnQgdmFyIGZkZXNjcmliZTogRnVuY3Rpb24gPSBfZ2xvYmFsLmZkZXNjcmliZTtcblxuLyoqXG4gKiBMaWtlIHtAbGluayBkZXNjcmliZX0sIGJ1dCBpbnN0cnVjdHMgdGhlIHRlc3QgcnVubmVyIHRvIGV4Y2x1ZGVcbiAqIHRoaXMgZ3JvdXAgb2YgdGVzdCBjYXNlcyBmcm9tIGV4ZWN1dGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yXG4gKiBkZWJ1Z2dpbmcsIG9yIGZvciBleGNsdWRpbmcgYnJva2VuIHRlc3RzIHVudGlsIHRoZXkgY2FuIGJlIGZpeGVkLlxuICpcbiAqIFNlZSBodHRwOi8vamFzbWluZS5naXRodWIuaW8vIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy90ZXN0aW5nLnRzIHJlZ2lvbj0neGRlc2NyaWJlJ31cbiAqL1xuZXhwb3J0IHZhciB4ZGVzY3JpYmU6IEZ1bmN0aW9uID0gX2dsb2JhbC54ZGVzY3JpYmU7XG5cbi8qKlxuICogU2lnbmF0dXJlIGZvciBhIHN5bmNocm9ub3VzIHRlc3QgZnVuY3Rpb24gKG5vIGFyZ3VtZW50cykuXG4gKi9cbmV4cG9ydCB0eXBlIFN5bmNUZXN0Rm4gPSAoKSA9PiB2b2lkO1xuXG4vKipcbiAqIFNpZ25hdHVyZSBmb3IgYW4gYXN5bmNocm9ub3VzIHRlc3QgZnVuY3Rpb24gd2hpY2ggdGFrZXMgYVxuICogYGRvbmVgIGNhbGxiYWNrLlxuICovXG5leHBvcnQgdHlwZSBBc3luY1Rlc3RGbiA9IChkb25lOiAoKSA9PiB2b2lkKSA9PiB2b2lkO1xuXG4vKipcbiAqIFNpZ25hdHVyZSBmb3IgYW55IHNpbXBsZSB0ZXN0aW5nIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBBbnlUZXN0Rm4gPSBTeW5jVGVzdEZuIHwgQXN5bmNUZXN0Rm47XG5cbnZhciBqc21CZWZvcmVFYWNoID0gX2dsb2JhbC5iZWZvcmVFYWNoO1xudmFyIGpzbUl0ID0gX2dsb2JhbC5pdDtcbnZhciBqc21JSXQgPSBfZ2xvYmFsLmZpdDtcbnZhciBqc21YSXQgPSBfZ2xvYmFsLnhpdDtcblxudmFyIHRlc3RQcm92aWRlcnM7XG52YXIgaW5qZWN0b3I7XG5cbi8vIFJlc2V0IHRoZSB0ZXN0IHByb3ZpZGVycyBiZWZvcmUgZWFjaCB0ZXN0LlxuanNtQmVmb3JlRWFjaCgoKSA9PiB7XG4gIHRlc3RQcm92aWRlcnMgPSBbXTtcbiAgaW5qZWN0b3IgPSBudWxsO1xufSk7XG5cbi8qKlxuICogQWxsb3dzIG92ZXJyaWRpbmcgZGVmYXVsdCBwcm92aWRlcnMgb2YgdGhlIHRlc3QgaW5qZWN0b3IsXG4gKiB3aGljaCBhcmUgZGVmaW5lZCBpbiB0ZXN0X2luamVjdG9yLmpzLlxuICpcbiAqIFRoZSBnaXZlbiBmdW5jdGlvbiBtdXN0IHJldHVybiBhIGxpc3Qgb2YgREkgcHJvdmlkZXJzLlxuICpcbiAqICMjIEV4YW1wbGU6XG4gKlxuICoge0BleGFtcGxlIHRlc3RpbmcvdHMvdGVzdGluZy50cyByZWdpb249J2JlZm9yZUVhY2hQcm92aWRlcnMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYmVmb3JlRWFjaFByb3ZpZGVycyhmbik6IHZvaWQge1xuICBqc21CZWZvcmVFYWNoKCgpID0+IHtcbiAgICB2YXIgcHJvdmlkZXJzID0gZm4oKTtcbiAgICBpZiAoIXByb3ZpZGVycykgcmV0dXJuO1xuICAgIHRlc3RQcm92aWRlcnMgPSBbLi4udGVzdFByb3ZpZGVycywgLi4ucHJvdmlkZXJzXTtcbiAgICBpZiAoaW5qZWN0b3IgIT09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignYmVmb3JlRWFjaFByb3ZpZGVycyB3YXMgY2FsbGVkIGFmdGVyIHRoZSBpbmplY3RvciBoYWQgJyArXG4gICAgICAgICAgICAgICAgICAgICAgJ2JlZW4gdXNlZCBpbiBhIGJlZm9yZUVhY2ggb3IgaXQgYmxvY2suIFRoaXMgaW52YWxpZGF0ZXMgdGhlICcgK1xuICAgICAgICAgICAgICAgICAgICAgICd0ZXN0IGluamVjdG9yJyk7XG4gICAgfVxuICB9KTtcbn1cblxuZnVuY3Rpb24gX2lzUHJvbWlzZUxpa2UoaW5wdXQpOiBib29sZWFuIHtcbiAgcmV0dXJuIGlucHV0ICYmICEhKGlucHV0LnRoZW4pO1xufVxuXG5mdW5jdGlvbiBydW5JblRlc3Rab25lKGZuVG9FeGVjdXRlLCBmaW5pc2hDYWxsYmFjaywgZmFpbENhbGxiYWNrKTogYW55IHtcbiAgdmFyIHBlbmRpbmdNaWNyb3Rhc2tzID0gMDtcbiAgdmFyIHBlbmRpbmdUaW1lb3V0cyA9IFtdO1xuXG4gIHZhciBuZ1Rlc3Rab25lID0gKDxab25lPmdsb2JhbC56b25lKVxuICAgICAgICAgICAgICAgICAgICAgICAuZm9yayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgb25FcnJvcjogZnVuY3Rpb24oZSkgeyBmYWlsQ2FsbGJhY2soZSk7IH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgJyRydW4nOiBmdW5jdGlvbihwYXJlbnRSdW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50UnVuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlbmRpbmdNaWNyb3Rhc2tzID09IDAgJiYgcGVuZGluZ1RpbWVvdXRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICckc2NoZWR1bGVNaWNyb3Rhc2snOiBmdW5jdGlvbihwYXJlbnRTY2hlZHVsZU1pY3JvdGFzaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGZuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdNaWNyb3Rhc2tzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtaWNyb3Rhc2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ01pY3JvdGFza3MtLTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFNjaGVkdWxlTWljcm90YXNrLmNhbGwodGhpcywgbWljcm90YXNrKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAnJHNldFRpbWVvdXQnOiBmdW5jdGlvbihwYXJlbnRTZXRUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oZm46IEZ1bmN0aW9uLCBkZWxheTogbnVtYmVyLCAuLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNiID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0V3JhcHBlci5yZW1vdmUocGVuZGluZ1RpbWVvdXRzLCBpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gcGFyZW50U2V0VGltZW91dChjYiwgZGVsYXksIGFyZ3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nVGltZW91dHMucHVzaChpZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAnJGNsZWFyVGltZW91dCc6IGZ1bmN0aW9uKHBhcmVudENsZWFyVGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGlkOiBudW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Q2xlYXJUaW1lb3V0KGlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlKHBlbmRpbmdUaW1lb3V0cywgaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICByZXR1cm4gbmdUZXN0Wm9uZS5ydW4oZm5Ub0V4ZWN1dGUpO1xufVxuXG5mdW5jdGlvbiBfaXQoanNtRm46IEZ1bmN0aW9uLCBuYW1lOiBzdHJpbmcsIHRlc3RGbjogRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMgfCBBbnlUZXN0Rm4sXG4gICAgICAgICAgICAgdGVzdFRpbWVPdXQ6IG51bWJlcik6IHZvaWQge1xuICB2YXIgdGltZU91dCA9IHRlc3RUaW1lT3V0O1xuXG4gIGlmICh0ZXN0Rm4gaW5zdGFuY2VvZiBGdW5jdGlvbldpdGhQYXJhbVRva2Vucykge1xuICAgIGpzbUZuKG5hbWUsIChkb25lKSA9PiB7XG4gICAgICBpZiAoIWluamVjdG9yKSB7XG4gICAgICAgIGluamVjdG9yID0gY3JlYXRlVGVzdEluamVjdG9yV2l0aFJ1bnRpbWVDb21waWxlcih0ZXN0UHJvdmlkZXJzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIGZpbmlzaENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IG9uZSBtb3JlIGV2ZW50IGxvb3AgdG8gbWFrZSBzdXJlIHdlIGNhdGNoIHVucmV0dXJuZWQgcHJvbWlzZXMgYW5kXG4gICAgICAgIC8vIHByb21pc2UgcmVqZWN0aW9ucy5cbiAgICAgICAgc2V0VGltZW91dChkb25lLCAwKTtcbiAgICAgIH07XG4gICAgICB2YXIgcmV0dXJuZWRUZXN0VmFsdWUgPVxuICAgICAgICAgIHJ1bkluVGVzdFpvbmUoKCkgPT4gdGVzdEZuLmV4ZWN1dGUoaW5qZWN0b3IpLCBmaW5pc2hDYWxsYmFjaywgZG9uZS5mYWlsKTtcblxuICAgICAgaWYgKHRlc3RGbi5pc0FzeW5jKSB7XG4gICAgICAgIGlmIChfaXNQcm9taXNlTGlrZShyZXR1cm5lZFRlc3RWYWx1ZSkpIHtcbiAgICAgICAgICAoPFByb21pc2U8YW55Pj5yZXR1cm5lZFRlc3RWYWx1ZSkudGhlbihudWxsLCAoZXJyKSA9PiB7IGRvbmUuZmFpbChlcnIpOyB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkb25lLmZhaWwoJ0Vycm9yOiBpbmplY3RBc3luYyB3YXMgZXhwZWN0ZWQgdG8gcmV0dXJuIGEgcHJvbWlzZSwgYnV0IHRoZSAnICtcbiAgICAgICAgICAgICAgICAgICAgJyByZXR1cm5lZCB2YWx1ZSB3YXM6ICcgKyByZXR1cm5lZFRlc3RWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghKHJldHVybmVkVGVzdFZhbHVlID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgZG9uZS5mYWlsKCdFcnJvcjogaW5qZWN0IHJldHVybmVkIGEgdmFsdWUuIERpZCB5b3UgbWVhbiB0byB1c2UgaW5qZWN0QXN5bmM/IFJldHVybmVkICcgK1xuICAgICAgICAgICAgICAgICAgICAndmFsdWUgd2FzOiAnICsgcmV0dXJuZWRUZXN0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSwgdGltZU91dCk7XG4gIH0gZWxzZSB7XG4gICAgLy8gVGhlIHRlc3QgY2FzZSBkb2Vzbid0IHVzZSBpbmplY3QoKS4gaWUgYGl0KCd0ZXN0JywgKGRvbmUpID0+IHsgLi4uIH0pKTtgXG4gICAganNtRm4obmFtZSwgdGVzdEZuLCB0aW1lT3V0KTtcbiAgfVxufVxuXG4vKipcbiAqIFdyYXBwZXIgYXJvdW5kIEphc21pbmUgYmVmb3JlRWFjaCBmdW5jdGlvbi5cbiAqXG4gKiBiZWZvcmVFYWNoIG1heSBiZSB1c2VkIHdpdGggdGhlIGBpbmplY3RgIGZ1bmN0aW9uIHRvIGZldGNoIGRlcGVuZGVuY2llcy5cbiAqIFRoZSB0ZXN0IHdpbGwgYXV0b21hdGljYWxseSB3YWl0IGZvciBhbnkgYXN5bmNocm9ub3VzIGNhbGxzIGluc2lkZSB0aGVcbiAqIGluamVjdGVkIHRlc3QgZnVuY3Rpb24gdG8gY29tcGxldGUuXG4gKlxuICogU2VlIGh0dHA6Ly9qYXNtaW5lLmdpdGh1Yi5pby8gZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiAjIyBFeGFtcGxlOlxuICpcbiAqIHtAZXhhbXBsZSB0ZXN0aW5nL3RzL3Rlc3RpbmcudHMgcmVnaW9uPSdiZWZvcmVFYWNoJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJlZm9yZUVhY2goZm46IEZ1bmN0aW9uV2l0aFBhcmFtVG9rZW5zIHwgQW55VGVzdEZuKTogdm9pZCB7XG4gIGlmIChmbiBpbnN0YW5jZW9mIEZ1bmN0aW9uV2l0aFBhcmFtVG9rZW5zKSB7XG4gICAgLy8gVGhlIHRlc3QgY2FzZSB1c2VzIGluamVjdCgpLiBpZSBgYmVmb3JlRWFjaChpbmplY3QoW0NsYXNzQV0sIChhKSA9PiB7IC4uLlxuICAgIC8vIH0pKTtgXG4gICAganNtQmVmb3JlRWFjaCgoZG9uZSkgPT4ge1xuICAgICAgdmFyIGZpbmlzaENhbGxiYWNrID0gKCkgPT4ge1xuICAgICAgICAvLyBXYWl0IG9uZSBtb3JlIGV2ZW50IGxvb3AgdG8gbWFrZSBzdXJlIHdlIGNhdGNoIHVucmV0dXJuZWQgcHJvbWlzZXMgYW5kXG4gICAgICAgIC8vIHByb21pc2UgcmVqZWN0aW9ucy5cbiAgICAgICAgc2V0VGltZW91dChkb25lLCAwKTtcbiAgICAgIH07XG4gICAgICBpZiAoIWluamVjdG9yKSB7XG4gICAgICAgIGluamVjdG9yID0gY3JlYXRlVGVzdEluamVjdG9yV2l0aFJ1bnRpbWVDb21waWxlcih0ZXN0UHJvdmlkZXJzKTtcbiAgICAgIH1cblxuICAgICAgdmFyIHJldHVybmVkVGVzdFZhbHVlID0gcnVuSW5UZXN0Wm9uZSgoKSA9PiBmbi5leGVjdXRlKGluamVjdG9yKSwgZmluaXNoQ2FsbGJhY2ssIGRvbmUuZmFpbCk7XG4gICAgICBpZiAoZm4uaXNBc3luYykge1xuICAgICAgICBpZiAoX2lzUHJvbWlzZUxpa2UocmV0dXJuZWRUZXN0VmFsdWUpKSB7XG4gICAgICAgICAgKDxQcm9taXNlPGFueT4+cmV0dXJuZWRUZXN0VmFsdWUpLnRoZW4obnVsbCwgKGVycikgPT4geyBkb25lLmZhaWwoZXJyKTsgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZG9uZS5mYWlsKCdFcnJvcjogaW5qZWN0QXN5bmMgd2FzIGV4cGVjdGVkIHRvIHJldHVybiBhIHByb21pc2UsIGJ1dCB0aGUgJyArXG4gICAgICAgICAgICAgICAgICAgICcgcmV0dXJuZWQgdmFsdWUgd2FzOiAnICsgcmV0dXJuZWRUZXN0VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoIShyZXR1cm5lZFRlc3RWYWx1ZSA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgIGRvbmUuZmFpbCgnRXJyb3I6IGluamVjdCByZXR1cm5lZCBhIHZhbHVlLiBEaWQgeW91IG1lYW4gdG8gdXNlIGluamVjdEFzeW5jPyBSZXR1cm5lZCAnICtcbiAgICAgICAgICAgICAgICAgICAgJ3ZhbHVlIHdhczogJyArIHJldHVybmVkVGVzdFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZSB0ZXN0IGNhc2UgZG9lc24ndCB1c2UgaW5qZWN0KCkuIGllIGBiZWZvcmVFYWNoKChkb25lKSA9PiB7IC4uLiB9KSk7YFxuICAgIGlmICgoPGFueT5mbikubGVuZ3RoID09PSAwKSB7XG4gICAgICBqc21CZWZvcmVFYWNoKCgpID0+IHsgKDxTeW5jVGVzdEZuPmZuKSgpOyB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAganNtQmVmb3JlRWFjaCgoZG9uZSkgPT4geyAoPEFzeW5jVGVzdEZuPmZuKShkb25lKTsgfSk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogRGVmaW5lIGEgc2luZ2xlIHRlc3QgY2FzZSB3aXRoIHRoZSBnaXZlbiB0ZXN0IG5hbWUgYW5kIGV4ZWN1dGlvbiBmdW5jdGlvbi5cbiAqXG4gKiBUaGUgdGVzdCBmdW5jdGlvbiBjYW4gYmUgZWl0aGVyIGEgc3luY2hyb25vdXMgZnVuY3Rpb24sIGFuIGFzeW5jaHJvbm91cyBmdW5jdGlvblxuICogdGhhdCB0YWtlcyBhIGNvbXBsZXRpb24gY2FsbGJhY2ssIG9yIGFuIGluamVjdGVkIGZ1bmN0aW9uIGNyZWF0ZWQgdmlhIHtAbGluayBpbmplY3R9XG4gKiBvciB7QGxpbmsgaW5qZWN0QXN5bmN9LiBUaGUgdGVzdCB3aWxsIGF1dG9tYXRpY2FsbHkgd2FpdCBmb3IgYW55IGFzeW5jaHJvbm91cyBjYWxsc1xuICogaW5zaWRlIHRoZSBpbmplY3RlZCB0ZXN0IGZ1bmN0aW9uIHRvIGNvbXBsZXRlLlxuICpcbiAqIFdyYXBwZXIgYXJvdW5kIEphc21pbmUgaXQgZnVuY3Rpb24uIFNlZSBodHRwOi8vamFzbWluZS5naXRodWIuaW8vIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogIyMgRXhhbXBsZTpcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy90ZXN0aW5nLnRzIHJlZ2lvbj0nZGVzY3JpYmVJdCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdChuYW1lOiBzdHJpbmcsIGZuOiBGdW5jdGlvbldpdGhQYXJhbVRva2VucyB8IEFueVRlc3RGbixcbiAgICAgICAgICAgICAgICAgICB0aW1lT3V0OiBudW1iZXIgPSBudWxsKTogdm9pZCB7XG4gIHJldHVybiBfaXQoanNtSXQsIG5hbWUsIGZuLCB0aW1lT3V0KTtcbn1cblxuLyoqXG4gKiBMaWtlIHtAbGluayBpdH0sIGJ1dCBpbnN0cnVjdHMgdGhlIHRlc3QgcnVubmVyIHRvIGV4Y2x1ZGUgdGhpcyB0ZXN0XG4gKiBlbnRpcmVseS4gVXNlZnVsIGZvciBkZWJ1Z2dpbmcgb3IgZm9yIGV4Y2x1ZGluZyBicm9rZW4gdGVzdHMgdW50aWxcbiAqIHRoZXkgY2FuIGJlIGZpeGVkLlxuICpcbiAqIFdyYXBwZXIgYXJvdW5kIEphc21pbmUgeGl0IGZ1bmN0aW9uLiBTZWUgaHR0cDovL2phc21pbmUuZ2l0aHViLmlvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqICMjIEV4YW1wbGU6XG4gKlxuICoge0BleGFtcGxlIHRlc3RpbmcvdHMvdGVzdGluZy50cyByZWdpb249J3hpdCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB4aXQobmFtZTogc3RyaW5nLCBmbjogRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMgfCBBbnlUZXN0Rm4sXG4gICAgICAgICAgICAgICAgICAgIHRpbWVPdXQ6IG51bWJlciA9IG51bGwpOiB2b2lkIHtcbiAgcmV0dXJuIF9pdChqc21YSXQsIG5hbWUsIGZuLCB0aW1lT3V0KTtcbn1cblxuLyoqXG4gKiBTZWUge0BsaW5rIGZpdH0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpaXQobmFtZTogc3RyaW5nLCBmbjogRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMgfCBBbnlUZXN0Rm4sXG4gICAgICAgICAgICAgICAgICAgIHRpbWVPdXQ6IG51bWJlciA9IG51bGwpOiB2b2lkIHtcbiAgcmV0dXJuIF9pdChqc21JSXQsIG5hbWUsIGZuLCB0aW1lT3V0KTtcbn1cblxuLyoqXG4gKiBMaWtlIHtAbGluayBpdH0sIGJ1dCBpbnN0cnVjdHMgdGhlIHRlc3QgcnVubmVyIHRvIG9ubHkgcnVuIHRoaXMgdGVzdC5cbiAqIFVzZWZ1bCBmb3IgZGVidWdnaW5nLlxuICpcbiAqIFdyYXBwZXIgYXJvdW5kIEphc21pbmUgZml0IGZ1bmN0aW9uLiBTZWUgaHR0cDovL2phc21pbmUuZ2l0aHViLmlvLyBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqICMjIEV4YW1wbGU6XG4gKlxuICoge0BleGFtcGxlIHRlc3RpbmcvdHMvdGVzdGluZy50cyByZWdpb249J2ZpdCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaXQobmFtZTogc3RyaW5nLCBmbjogRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnMgfCBBbnlUZXN0Rm4sXG4gICAgICAgICAgICAgICAgICAgIHRpbWVPdXQ6IG51bWJlciA9IG51bGwpOiB2b2lkIHtcbiAgcmV0dXJuIF9pdChqc21JSXQsIG5hbWUsIGZuLCB0aW1lT3V0KTtcbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy90ZXN0aW5nL3Rlc3RpbmcudHNcbiAqKi8iLCJpbXBvcnQge1xuICBBUFBfSUQsXG4gIEFQUExJQ0FUSU9OX0NPTU1PTl9QUk9WSURFUlMsXG4gIEFwcFZpZXdNYW5hZ2VyLFxuICBEaXJlY3RpdmVSZXNvbHZlcixcbiAgRHluYW1pY0NvbXBvbmVudExvYWRlcixcbiAgSW5qZWN0b3IsXG4gIE5nWm9uZSxcbiAgUmVuZGVyZXIsXG4gIFByb3ZpZGVyLFxuICBWaWV3UmVzb2x2ZXIsXG4gIHByb3ZpZGVcbn0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9hbmltYXRlL2FuaW1hdGlvbl9idWlsZGVyJztcbmltcG9ydCB7TW9ja0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9tb2NrL2FuaW1hdGlvbl9idWlsZGVyX21vY2snO1xuXG5pbXBvcnQge1Byb3RvVmlld0ZhY3Rvcnl9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9wcm90b192aWV3X2ZhY3RvcnknO1xuaW1wb3J0IHtSZWZsZWN0b3IsIHJlZmxlY3Rvcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvcmVmbGVjdGlvbi9yZWZsZWN0aW9uJztcbmltcG9ydCB7XG4gIEl0ZXJhYmxlRGlmZmVycyxcbiAgZGVmYXVsdEl0ZXJhYmxlRGlmZmVycyxcbiAgS2V5VmFsdWVEaWZmZXJzLFxuICBkZWZhdWx0S2V5VmFsdWVEaWZmZXJzLFxuICBDaGFuZ2VEZXRlY3RvckdlbkNvbmZpZ1xufSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9jaGFuZ2VfZGV0ZWN0aW9uL2NoYW5nZV9kZXRlY3Rpb24nO1xuaW1wb3J0IHtFeGNlcHRpb25IYW5kbGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQaXBlUmVzb2x2ZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci9waXBlX3Jlc29sdmVyJztcbmltcG9ydCB7WEhSfSBmcm9tICdhbmd1bGFyMi9zcmMvY29tcGlsZXIveGhyJztcblxuaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuXG5pbXBvcnQge01vY2tEaXJlY3RpdmVSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svZGlyZWN0aXZlX3Jlc29sdmVyX21vY2snO1xuaW1wb3J0IHtNb2NrVmlld1Jlc29sdmVyfSBmcm9tICdhbmd1bGFyMi9zcmMvbW9jay92aWV3X3Jlc29sdmVyX21vY2snO1xuaW1wb3J0IHtNb2NrTG9jYXRpb25TdHJhdGVneX0gZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svbW9ja19sb2NhdGlvbl9zdHJhdGVneSc7XG5pbXBvcnQge0xvY2F0aW9uU3RyYXRlZ3l9IGZyb20gJ2FuZ3VsYXIyL3NyYy9yb3V0ZXIvbG9jYXRpb25fc3RyYXRlZ3knO1xuaW1wb3J0IHtNb2NrTmdab25lfSBmcm9tICdhbmd1bGFyMi9zcmMvbW9jay9uZ196b25lX21vY2snO1xuXG5pbXBvcnQge1Rlc3RDb21wb25lbnRCdWlsZGVyfSBmcm9tICcuL3Rlc3RfY29tcG9uZW50X2J1aWxkZXInO1xuXG5pbXBvcnQge1xuICBFdmVudE1hbmFnZXIsXG4gIEVWRU5UX01BTkFHRVJfUExVR0lOUyxcbiAgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlNcbn0gZnJvbSAnYW5ndWxhcjIvcGxhdGZvcm0vY29tbW9uX2RvbSc7XG5cbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0Z1bmN0aW9uV3JhcHBlciwgVHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcblxuaW1wb3J0IHtBcHBWaWV3UG9vbCwgQVBQX1ZJRVdfUE9PTF9DQVBBQ0lUWX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcG9vbCc7XG5pbXBvcnQge0FwcFZpZXdNYW5hZ2VyVXRpbHN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X21hbmFnZXJfdXRpbHMnO1xuXG5pbXBvcnQge0RPQ1VNRU5UfSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2RvbV90b2tlbnMnO1xuaW1wb3J0IHtEb21SZW5kZXJlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fcmVuZGVyZXInO1xuaW1wb3J0IHtEb21TaGFyZWRTdHlsZXNIb3N0fSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL3NoYXJlZF9zdHlsZXNfaG9zdCc7XG5pbXBvcnQge1NoYXJlZFN0eWxlc0hvc3R9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vc2hhcmVkX3N0eWxlc19ob3N0JztcbmltcG9ydCB7RG9tRXZlbnRzUGx1Z2lufSBmcm9tICdhbmd1bGFyMi9zcmMvcGxhdGZvcm0vZG9tL2V2ZW50cy9kb21fZXZlbnRzJztcblxuaW1wb3J0IHtTZXJpYWxpemVyfSBmcm9tIFwiYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9zZXJpYWxpemVyXCI7XG5pbXBvcnQge0xvZ30gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQge0NPTVBJTEVSX1BST1ZJREVSU30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvbXBpbGVyL2NvbXBpbGVyJztcbmltcG9ydCB7RG9tUmVuZGVyZXJffSBmcm9tIFwiYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fcmVuZGVyZXJcIjtcbmltcG9ydCB7RHluYW1pY0NvbXBvbmVudExvYWRlcl99IGZyb20gXCJhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZHluYW1pY19jb21wb25lbnRfbG9hZGVyXCI7XG5pbXBvcnQge0FwcFZpZXdNYW5hZ2VyX30gZnJvbSBcImFuZ3VsYXIyL3NyYy9jb3JlL2xpbmtlci92aWV3X21hbmFnZXJcIjtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByb290IGluamVjdG9yIHByb3ZpZGVycy5cbiAqXG4gKiBUaGlzIG11c3QgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIF9yb290QmluZGluZ3MgaW4gYXBwbGljYXRpb24uanNcbiAqXG4gKiBAcmV0dXJucyB7YW55W119XG4gKi9cbmZ1bmN0aW9uIF9nZXRSb290UHJvdmlkZXJzKCkge1xuICByZXR1cm4gW3Byb3ZpZGUoUmVmbGVjdG9yLCB7dXNlVmFsdWU6IHJlZmxlY3Rvcn0pXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBhcHBsaWNhdGlvbiBpbmplY3RvciBwcm92aWRlcnMuXG4gKlxuICogVGhpcyBtdXN0IGJlIGtlcHQgaW4gc3luYyB3aXRoIF9pbmplY3RvckJpbmRpbmdzKCkgaW4gYXBwbGljYXRpb24uanNcbiAqXG4gKiBAcmV0dXJucyB7YW55W119XG4gKi9cbmZ1bmN0aW9uIF9nZXRBcHBCaW5kaW5ncygpIHtcbiAgdmFyIGFwcERvYztcblxuICAvLyBUaGUgZG9jdW1lbnQgaXMgb25seSBhdmFpbGFibGUgaW4gYnJvd3NlciBlbnZpcm9ubWVudFxuICB0cnkge1xuICAgIGFwcERvYyA9IERPTS5kZWZhdWx0RG9jKCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBhcHBEb2MgPSBudWxsO1xuICB9XG5cbiAgcmV0dXJuIFtcbiAgICBBUFBMSUNBVElPTl9DT01NT05fUFJPVklERVJTLFxuICAgIHByb3ZpZGUoQ2hhbmdlRGV0ZWN0b3JHZW5Db25maWcsIHt1c2VWYWx1ZTogbmV3IENoYW5nZURldGVjdG9yR2VuQ29uZmlnKHRydWUsIGZhbHNlLCB0cnVlKX0pLFxuICAgIHByb3ZpZGUoRE9DVU1FTlQsIHt1c2VWYWx1ZTogYXBwRG9jfSksXG4gICAgcHJvdmlkZShEb21SZW5kZXJlciwge3VzZUNsYXNzOiBEb21SZW5kZXJlcl99KSxcbiAgICBwcm92aWRlKFJlbmRlcmVyLCB7dXNlRXhpc3Rpbmc6IERvbVJlbmRlcmVyfSksXG4gICAgcHJvdmlkZShBUFBfSUQsIHt1c2VWYWx1ZTogJ2EnfSksXG4gICAgRG9tU2hhcmVkU3R5bGVzSG9zdCxcbiAgICBwcm92aWRlKFNoYXJlZFN0eWxlc0hvc3QsIHt1c2VFeGlzdGluZzogRG9tU2hhcmVkU3R5bGVzSG9zdH0pLFxuICAgIEFwcFZpZXdQb29sLFxuICAgIHByb3ZpZGUoQXBwVmlld01hbmFnZXIsIHt1c2VDbGFzczogQXBwVmlld01hbmFnZXJffSksXG4gICAgQXBwVmlld01hbmFnZXJVdGlscyxcbiAgICBTZXJpYWxpemVyLFxuICAgIEVMRU1FTlRfUFJPQkVfUFJPVklERVJTLFxuICAgIHByb3ZpZGUoQVBQX1ZJRVdfUE9PTF9DQVBBQ0lUWSwge3VzZVZhbHVlOiA1MDB9KSxcbiAgICBQcm90b1ZpZXdGYWN0b3J5LFxuICAgIHByb3ZpZGUoRGlyZWN0aXZlUmVzb2x2ZXIsIHt1c2VDbGFzczogTW9ja0RpcmVjdGl2ZVJlc29sdmVyfSksXG4gICAgcHJvdmlkZShWaWV3UmVzb2x2ZXIsIHt1c2VDbGFzczogTW9ja1ZpZXdSZXNvbHZlcn0pLFxuICAgIHByb3ZpZGUoSXRlcmFibGVEaWZmZXJzLCB7dXNlVmFsdWU6IGRlZmF1bHRJdGVyYWJsZURpZmZlcnN9KSxcbiAgICBwcm92aWRlKEtleVZhbHVlRGlmZmVycywge3VzZVZhbHVlOiBkZWZhdWx0S2V5VmFsdWVEaWZmZXJzfSksXG4gICAgTG9nLFxuICAgIHByb3ZpZGUoRHluYW1pY0NvbXBvbmVudExvYWRlciwge3VzZUNsYXNzOiBEeW5hbWljQ29tcG9uZW50TG9hZGVyX30pLFxuICAgIFBpcGVSZXNvbHZlcixcbiAgICBwcm92aWRlKEV4Y2VwdGlvbkhhbmRsZXIsIHt1c2VWYWx1ZTogbmV3IEV4Y2VwdGlvbkhhbmRsZXIoRE9NKX0pLFxuICAgIHByb3ZpZGUoTG9jYXRpb25TdHJhdGVneSwge3VzZUNsYXNzOiBNb2NrTG9jYXRpb25TdHJhdGVneX0pLFxuICAgIHByb3ZpZGUoWEhSLCB7dXNlQ2xhc3M6IERPTS5nZXRYSFIoKX0pLFxuICAgIFRlc3RDb21wb25lbnRCdWlsZGVyLFxuICAgIHByb3ZpZGUoTmdab25lLCB7dXNlQ2xhc3M6IE1vY2tOZ1pvbmV9KSxcbiAgICBwcm92aWRlKEFuaW1hdGlvbkJ1aWxkZXIsIHt1c2VDbGFzczogTW9ja0FuaW1hdGlvbkJ1aWxkZXJ9KSxcbiAgICBFdmVudE1hbmFnZXIsXG4gICAgbmV3IFByb3ZpZGVyKEVWRU5UX01BTkFHRVJfUExVR0lOUywge3VzZUNsYXNzOiBEb21FdmVudHNQbHVnaW4sIG11bHRpOiB0cnVlfSlcbiAgXTtcbn1cblxuZnVuY3Rpb24gX3J1bnRpbWVDb21waWxlckJpbmRpbmdzKCkge1xuICByZXR1cm4gW1xuICAgIHByb3ZpZGUoWEhSLCB7dXNlQ2xhc3M6IERPTS5nZXRYSFIoKX0pLFxuICAgIENPTVBJTEVSX1BST1ZJREVSUyxcbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVRlc3RJbmplY3Rvcihwcm92aWRlcnM6IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IEluamVjdG9yIHtcbiAgdmFyIHJvb3RJbmplY3RvciA9IEluamVjdG9yLnJlc29sdmVBbmRDcmVhdGUoX2dldFJvb3RQcm92aWRlcnMoKSk7XG4gIHJldHVybiByb290SW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZUNoaWxkKExpc3RXcmFwcGVyLmNvbmNhdChfZ2V0QXBwQmluZGluZ3MoKSwgcHJvdmlkZXJzKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVUZXN0SW5qZWN0b3JXaXRoUnVudGltZUNvbXBpbGVyKFxuICAgIHByb3ZpZGVyczogQXJyYXk8VHlwZSB8IFByb3ZpZGVyIHwgYW55W10+KTogSW5qZWN0b3Ige1xuICByZXR1cm4gY3JlYXRlVGVzdEluamVjdG9yKExpc3RXcmFwcGVyLmNvbmNhdChfcnVudGltZUNvbXBpbGVyQmluZGluZ3MoKSwgcHJvdmlkZXJzKSk7XG59XG5cbi8qKlxuICogQWxsb3dzIGluamVjdGluZyBkZXBlbmRlbmNpZXMgaW4gYGJlZm9yZUVhY2goKWAgYW5kIGBpdCgpYC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYFxuICogYmVmb3JlRWFjaChpbmplY3QoW0RlcGVuZGVuY3ksIEFDbGFzc10sIChkZXAsIG9iamVjdCkgPT4ge1xuICogICAvLyBzb21lIGNvZGUgdGhhdCB1c2VzIGBkZXBgIGFuZCBgb2JqZWN0YFxuICogICAvLyAuLi5cbiAqIH0pKTtcbiAqXG4gKiBpdCgnLi4uJywgaW5qZWN0KFtBQ2xhc3NdLCAob2JqZWN0KSA9PiB7XG4gKiAgIG9iamVjdC5kb1NvbWV0aGluZygpO1xuICogICBleHBlY3QoLi4uKTtcbiAqIH0pXG4gKiBgYGBcbiAqXG4gKiBOb3RlczpcbiAqIC0gaW5qZWN0IGlzIGN1cnJlbnRseSBhIGZ1bmN0aW9uIGJlY2F1c2Ugb2Ygc29tZSBUcmFjZXVyIGxpbWl0YXRpb24gdGhlIHN5bnRheCBzaG91bGQgZXZlbnR1YWxseVxuICogICBiZWNvbWVzIGBpdCgnLi4uJywgQEluamVjdCAob2JqZWN0OiBBQ2xhc3MsIGFzeW5jOiBBc3luY1Rlc3RDb21wbGV0ZXIpID0+IHsgLi4uIH0pO2BcbiAqXG4gKiBAcGFyYW0ge0FycmF5fSB0b2tlbnNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGZuXG4gKiBAcmV0dXJuIHtGdW5jdGlvbldpdGhQYXJhbVRva2Vuc31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluamVjdCh0b2tlbnM6IGFueVtdLCBmbjogRnVuY3Rpb24pOiBGdW5jdGlvbldpdGhQYXJhbVRva2VucyB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnModG9rZW5zLCBmbiwgZmFsc2UpO1xufVxuXG4vKipcbiAqIEFsbG93cyBpbmplY3RpbmcgZGVwZW5kZW5jaWVzIGluIGBiZWZvcmVFYWNoKClgIGFuZCBgaXQoKWAuIFRoZSB0ZXN0IG11c3QgcmV0dXJuXG4gKiBhIHByb21pc2Ugd2hpY2ggd2lsbCByZXNvbHZlIHdoZW4gYWxsIGFzeW5jaHJvbm91cyBhY3Rpdml0eSBpcyBjb21wbGV0ZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYFxuICogaXQoJy4uLicsIGluamVjdEFzeW5jKFtBQ2xhc3NdLCAob2JqZWN0KSA9PiB7XG4gKiAgIHJldHVybiBvYmplY3QuZG9Tb21ldGhpbmcoKS50aGVuKCgpID0+IHtcbiAqICAgICBleHBlY3QoLi4uKTtcbiAqICAgfSk7XG4gKiB9KVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtBcnJheX0gdG9rZW5zXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnN9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbmplY3RBc3luYyh0b2tlbnM6IGFueVtdLCBmbjogRnVuY3Rpb24pOiBGdW5jdGlvbldpdGhQYXJhbVRva2VucyB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25XaXRoUGFyYW1Ub2tlbnModG9rZW5zLCBmbiwgdHJ1ZSk7XG59XG5cbmV4cG9ydCBjbGFzcyBGdW5jdGlvbldpdGhQYXJhbVRva2VucyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX3Rva2VuczogYW55W10sIHByaXZhdGUgX2ZuOiBGdW5jdGlvbiwgcHVibGljIGlzQXN5bmM6IGJvb2xlYW4pIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBleGVjdXRlZCBmdW5jdGlvbi5cbiAgICovXG4gIGV4ZWN1dGUoaW5qZWN0b3I6IEluamVjdG9yKTogYW55IHtcbiAgICB2YXIgcGFyYW1zID0gdGhpcy5fdG9rZW5zLm1hcCh0ID0+IGluamVjdG9yLmdldCh0KSk7XG4gICAgcmV0dXJuIEZ1bmN0aW9uV3JhcHBlci5hcHBseSh0aGlzLl9mbiwgcGFyYW1zKTtcbiAgfVxuXG4gIGhhc1Rva2VuKHRva2VuOiBhbnkpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3Rva2Vucy5pbmRleE9mKHRva2VuKSA+IC0xOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdGVzdGluZy90ZXN0X2luamVjdG9yLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0FuaW1hdGlvbkJ1aWxkZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9hbmltYXRlL2FuaW1hdGlvbl9idWlsZGVyJztcbmltcG9ydCB7Q3NzQW5pbWF0aW9uQnVpbGRlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2FuaW1hdGUvY3NzX2FuaW1hdGlvbl9idWlsZGVyJztcbmltcG9ydCB7Q3NzQW5pbWF0aW9uT3B0aW9uc30gZnJvbSAnYW5ndWxhcjIvc3JjL2FuaW1hdGUvY3NzX2FuaW1hdGlvbl9vcHRpb25zJztcbmltcG9ydCB7QW5pbWF0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvYW5pbWF0ZS9hbmltYXRpb24nO1xuaW1wb3J0IHtCcm93c2VyRGV0YWlsc30gZnJvbSAnYW5ndWxhcjIvc3JjL2FuaW1hdGUvYnJvd3Nlcl9kZXRhaWxzJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vY2tBbmltYXRpb25CdWlsZGVyIGV4dGVuZHMgQW5pbWF0aW9uQnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKCkgeyBzdXBlcihudWxsKTsgfVxuICBjc3MoKTogQ3NzQW5pbWF0aW9uQnVpbGRlciB7IHJldHVybiBuZXcgTW9ja0Nzc0FuaW1hdGlvbkJ1aWxkZXIoKTsgfVxufVxuXG5jbGFzcyBNb2NrQ3NzQW5pbWF0aW9uQnVpbGRlciBleHRlbmRzIENzc0FuaW1hdGlvbkJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIobnVsbCk7IH1cbiAgc3RhcnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiBBbmltYXRpb24geyByZXR1cm4gbmV3IE1vY2tBbmltYXRpb24oZWxlbWVudCwgdGhpcy5kYXRhKTsgfVxufVxuXG5jbGFzcyBNb2NrQnJvd3NlckFic3RyYWN0aW9uIGV4dGVuZHMgQnJvd3NlckRldGFpbHMge1xuICBkb2VzRWxhcHNlZFRpbWVJbmNsdWRlc0RlbGF5KCk6IHZvaWQgeyB0aGlzLmVsYXBzZWRUaW1lSW5jbHVkZXNEZWxheSA9IGZhbHNlOyB9XG59XG5cbmNsYXNzIE1vY2tBbmltYXRpb24gZXh0ZW5kcyBBbmltYXRpb24ge1xuICBwcml2YXRlIF9jYWxsYmFjazogRnVuY3Rpb247XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBkYXRhOiBDc3NBbmltYXRpb25PcHRpb25zKSB7XG4gICAgc3VwZXIoZWxlbWVudCwgZGF0YSwgbmV3IE1vY2tCcm93c2VyQWJzdHJhY3Rpb24oKSk7XG4gIH1cbiAgd2FpdChjYWxsYmFjazogRnVuY3Rpb24pIHsgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsgfVxuICBmbHVzaCgpIHtcbiAgICB0aGlzLl9jYWxsYmFjaygwKTtcbiAgICB0aGlzLl9jYWxsYmFjayA9IG51bGw7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9tb2NrL2FuaW1hdGlvbl9idWlsZGVyX21vY2sudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7TWFwLCBNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7VHlwZSwgaXNQcmVzZW50LCBzdHJpbmdpZnksIGlzQmxhbmssIHByaW50fSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtEaXJlY3RpdmVNZXRhZGF0YSwgQ29tcG9uZW50TWV0YWRhdGF9IGZyb20gJy4uL2NvcmUvbWV0YWRhdGEnO1xuaW1wb3J0IHtEaXJlY3RpdmVSZXNvbHZlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL2RpcmVjdGl2ZV9yZXNvbHZlcic7XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIERpcmVjdGl2ZVJlc29sdmVyfSB0aGF0IGFsbG93cyBvdmVycmlkaW5nXG4gKiB2YXJpb3VzIHByb3BlcnRpZXMgb2YgZGlyZWN0aXZlcy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vY2tEaXJlY3RpdmVSZXNvbHZlciBleHRlbmRzIERpcmVjdGl2ZVJlc29sdmVyIHtcbiAgcHJpdmF0ZSBfcHJvdmlkZXJPdmVycmlkZXMgPSBuZXcgTWFwPFR5cGUsIGFueVtdPigpO1xuICBwcml2YXRlIHZpZXdQcm92aWRlck92ZXJyaWRlcyA9IG5ldyBNYXA8VHlwZSwgYW55W10+KCk7XG5cbiAgcmVzb2x2ZSh0eXBlOiBUeXBlKTogRGlyZWN0aXZlTWV0YWRhdGEge1xuICAgIHZhciBkbSA9IHN1cGVyLnJlc29sdmUodHlwZSk7XG5cbiAgICB2YXIgcHJvdmlkZXJPdmVycmlkZXMgPSB0aGlzLl9wcm92aWRlck92ZXJyaWRlcy5nZXQodHlwZSk7XG4gICAgdmFyIHZpZXdQcm92aWRlck92ZXJyaWRlcyA9IHRoaXMudmlld1Byb3ZpZGVyT3ZlcnJpZGVzLmdldCh0eXBlKTtcblxuICAgIHZhciBwcm92aWRlcnMgPSBkbS5wcm92aWRlcnM7XG4gICAgaWYgKGlzUHJlc2VudChwcm92aWRlck92ZXJyaWRlcykpIHtcbiAgICAgIHByb3ZpZGVycyA9IGRtLnByb3ZpZGVycy5jb25jYXQocHJvdmlkZXJPdmVycmlkZXMpO1xuICAgIH1cblxuICAgIGlmIChkbSBpbnN0YW5jZW9mIENvbXBvbmVudE1ldGFkYXRhKSB7XG4gICAgICB2YXIgdmlld1Byb3ZpZGVycyA9IGRtLnZpZXdQcm92aWRlcnM7XG4gICAgICBpZiAoaXNQcmVzZW50KHZpZXdQcm92aWRlck92ZXJyaWRlcykpIHtcbiAgICAgICAgdmlld1Byb3ZpZGVycyA9IGRtLnZpZXdQcm92aWRlcnMuY29uY2F0KHZpZXdQcm92aWRlck92ZXJyaWRlcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBuZXcgQ29tcG9uZW50TWV0YWRhdGEoe1xuICAgICAgICBzZWxlY3RvcjogZG0uc2VsZWN0b3IsXG4gICAgICAgIGlucHV0czogZG0uaW5wdXRzLFxuICAgICAgICBvdXRwdXRzOiBkbS5vdXRwdXRzLFxuICAgICAgICBob3N0OiBkbS5ob3N0LFxuICAgICAgICBleHBvcnRBczogZG0uZXhwb3J0QXMsXG4gICAgICAgIG1vZHVsZUlkOiBkbS5tb2R1bGVJZCxcbiAgICAgICAgcXVlcmllczogZG0ucXVlcmllcyxcbiAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBkbS5jaGFuZ2VEZXRlY3Rpb24sXG4gICAgICAgIHByb3ZpZGVyczogcHJvdmlkZXJzLFxuICAgICAgICB2aWV3UHJvdmlkZXJzOiB2aWV3UHJvdmlkZXJzXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IERpcmVjdGl2ZU1ldGFkYXRhKHtcbiAgICAgIHNlbGVjdG9yOiBkbS5zZWxlY3RvcixcbiAgICAgIGlucHV0czogZG0uaW5wdXRzLFxuICAgICAgb3V0cHV0czogZG0ub3V0cHV0cyxcbiAgICAgIGhvc3Q6IGRtLmhvc3QsXG4gICAgICBwcm92aWRlcnM6IHByb3ZpZGVycyxcbiAgICAgIGV4cG9ydEFzOiBkbS5leHBvcnRBcyxcbiAgICAgIHF1ZXJpZXM6IGRtLnF1ZXJpZXNcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgc2V0QmluZGluZ3NPdmVycmlkZSh0eXBlOiBUeXBlLCBiaW5kaW5nczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLl9wcm92aWRlck92ZXJyaWRlcy5zZXQodHlwZSwgYmluZGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkXG4gICAqL1xuICBzZXRWaWV3QmluZGluZ3NPdmVycmlkZSh0eXBlOiBUeXBlLCB2aWV3QmluZGluZ3M6IGFueVtdKTogdm9pZCB7XG4gICAgdGhpcy52aWV3UHJvdmlkZXJPdmVycmlkZXMuc2V0KHR5cGUsIHZpZXdCaW5kaW5ncyk7XG4gIH1cblxuICBzZXRQcm92aWRlcnNPdmVycmlkZSh0eXBlOiBUeXBlLCBiaW5kaW5nczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLl9wcm92aWRlck92ZXJyaWRlcy5zZXQodHlwZSwgYmluZGluZ3MpO1xuICB9XG5cbiAgc2V0Vmlld1Byb3ZpZGVyc092ZXJyaWRlKHR5cGU6IFR5cGUsIHZpZXdCaW5kaW5nczogYW55W10pOiB2b2lkIHtcbiAgICB0aGlzLnZpZXdQcm92aWRlck92ZXJyaWRlcy5zZXQodHlwZSwgdmlld0JpbmRpbmdzKTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL21vY2svZGlyZWN0aXZlX3Jlc29sdmVyX21vY2sudHNcbiAqKi8iLCJpbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7TWFwLCBNYXBXcmFwcGVyLCBMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7VHlwZSwgaXNQcmVzZW50LCBzdHJpbmdpZnksIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5cbmltcG9ydCB7Vmlld01ldGFkYXRhfSBmcm9tICcuLi9jb3JlL21ldGFkYXRhJztcbmltcG9ydCB7Vmlld1Jlc29sdmVyfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlld19yZXNvbHZlcic7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2NrVmlld1Jlc29sdmVyIGV4dGVuZHMgVmlld1Jlc29sdmVyIHtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfdmlld3MgPSBuZXcgTWFwPFR5cGUsIFZpZXdNZXRhZGF0YT4oKTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfaW5saW5lVGVtcGxhdGVzID0gbmV3IE1hcDxUeXBlLCBzdHJpbmc+KCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZpZXdDYWNoZSA9IG5ldyBNYXA8VHlwZSwgVmlld01ldGFkYXRhPigpO1xuICAvKiogQGludGVybmFsICovXG4gIF9kaXJlY3RpdmVPdmVycmlkZXMgPSBuZXcgTWFwPFR5cGUsIE1hcDxUeXBlLCBUeXBlPj4oKTtcblxuICBjb25zdHJ1Y3RvcigpIHsgc3VwZXIoKTsgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIHtAbGluayBWaWV3TWV0YWRhdGF9IGZvciBhIGNvbXBvbmVudC5cbiAgICpcbiAgICogQHBhcmFtIHtUeXBlfSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtWaWV3RGVmaW5pdGlvbn0gdmlld1xuICAgKi9cbiAgc2V0Vmlldyhjb21wb25lbnQ6IFR5cGUsIHZpZXc6IFZpZXdNZXRhZGF0YSk6IHZvaWQge1xuICAgIHRoaXMuX2NoZWNrT3ZlcnJpZGVhYmxlKGNvbXBvbmVudCk7XG4gICAgdGhpcy5fdmlld3Muc2V0KGNvbXBvbmVudCwgdmlldyk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIHRoZSBpbmxpbmUgdGVtcGxhdGUgZm9yIGEgY29tcG9uZW50IC0gb3RoZXIgY29uZmlndXJhdGlvbiByZW1haW5zIHVuY2hhbmdlZC5cbiAgICpcbiAgICogQHBhcmFtIHtUeXBlfSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRlbXBsYXRlXG4gICAqL1xuICBzZXRJbmxpbmVUZW1wbGF0ZShjb21wb25lbnQ6IFR5cGUsIHRlbXBsYXRlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9jaGVja092ZXJyaWRlYWJsZShjb21wb25lbnQpO1xuICAgIHRoaXMuX2lubGluZVRlbXBsYXRlcy5zZXQoY29tcG9uZW50LCB0ZW1wbGF0ZSk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIGEgZGlyZWN0aXZlIGZyb20gdGhlIGNvbXBvbmVudCB7QGxpbmsgVmlld01ldGFkYXRhfS5cbiAgICpcbiAgICogQHBhcmFtIHtUeXBlfSBjb21wb25lbnRcbiAgICogQHBhcmFtIHtUeXBlfSBmcm9tXG4gICAqIEBwYXJhbSB7VHlwZX0gdG9cbiAgICovXG4gIG92ZXJyaWRlVmlld0RpcmVjdGl2ZShjb21wb25lbnQ6IFR5cGUsIGZyb206IFR5cGUsIHRvOiBUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5fY2hlY2tPdmVycmlkZWFibGUoY29tcG9uZW50KTtcblxuICAgIHZhciBvdmVycmlkZXMgPSB0aGlzLl9kaXJlY3RpdmVPdmVycmlkZXMuZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoaXNCbGFuayhvdmVycmlkZXMpKSB7XG4gICAgICBvdmVycmlkZXMgPSBuZXcgTWFwPFR5cGUsIFR5cGU+KCk7XG4gICAgICB0aGlzLl9kaXJlY3RpdmVPdmVycmlkZXMuc2V0KGNvbXBvbmVudCwgb3ZlcnJpZGVzKTtcbiAgICB9XG5cbiAgICBvdmVycmlkZXMuc2V0KGZyb20sIHRvKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB7QGxpbmsgVmlld01ldGFkYXRhfSBmb3IgYSBjb21wb25lbnQ6XG4gICAqIC0gU2V0IHRoZSB7QGxpbmsgVmlld01ldGFkYXRhfSB0byB0aGUgb3ZlcnJpZGRlbiB2aWV3IHdoZW4gaXQgZXhpc3RzIG9yIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0XG4gICAqIGBWaWV3UmVzb2x2ZXJgLFxuICAgKiAgIHNlZSBgc2V0Vmlld2AuXG4gICAqIC0gT3ZlcnJpZGUgdGhlIGRpcmVjdGl2ZXMsIHNlZSBgb3ZlcnJpZGVWaWV3RGlyZWN0aXZlYC5cbiAgICogLSBPdmVycmlkZSB0aGUgQFZpZXcgZGVmaW5pdGlvbiwgc2VlIGBzZXRJbmxpbmVUZW1wbGF0ZWAuXG4gICAqXG4gICAqIEBwYXJhbSBjb21wb25lbnRcbiAgICogQHJldHVybnMge1ZpZXdEZWZpbml0aW9ufVxuICAgKi9cbiAgcmVzb2x2ZShjb21wb25lbnQ6IFR5cGUpOiBWaWV3TWV0YWRhdGEge1xuICAgIHZhciB2aWV3ID0gdGhpcy5fdmlld0NhY2hlLmdldChjb21wb25lbnQpO1xuICAgIGlmIChpc1ByZXNlbnQodmlldykpIHJldHVybiB2aWV3O1xuXG4gICAgdmlldyA9IHRoaXMuX3ZpZXdzLmdldChjb21wb25lbnQpO1xuICAgIGlmIChpc0JsYW5rKHZpZXcpKSB7XG4gICAgICB2aWV3ID0gc3VwZXIucmVzb2x2ZShjb21wb25lbnQpO1xuICAgIH1cblxuICAgIHZhciBkaXJlY3RpdmVzID0gdmlldy5kaXJlY3RpdmVzO1xuICAgIHZhciBvdmVycmlkZXMgPSB0aGlzLl9kaXJlY3RpdmVPdmVycmlkZXMuZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoaXNQcmVzZW50KG92ZXJyaWRlcykgJiYgaXNQcmVzZW50KGRpcmVjdGl2ZXMpKSB7XG4gICAgICBkaXJlY3RpdmVzID0gTGlzdFdyYXBwZXIuY2xvbmUodmlldy5kaXJlY3RpdmVzKTtcbiAgICAgIG92ZXJyaWRlcy5mb3JFYWNoKCh0bywgZnJvbSkgPT4ge1xuICAgICAgICB2YXIgc3JjSW5kZXggPSBkaXJlY3RpdmVzLmluZGV4T2YoZnJvbSk7XG4gICAgICAgIGlmIChzcmNJbmRleCA9PSAtMSkge1xuICAgICAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgICAgICBgT3ZlcnJpZGVuIGRpcmVjdGl2ZSAke3N0cmluZ2lmeShmcm9tKX0gbm90IGZvdW5kIGluIHRoZSB0ZW1wbGF0ZSBvZiAke3N0cmluZ2lmeShjb21wb25lbnQpfWApO1xuICAgICAgICB9XG4gICAgICAgIGRpcmVjdGl2ZXNbc3JjSW5kZXhdID0gdG87XG4gICAgICB9KTtcbiAgICAgIHZpZXcgPSBuZXcgVmlld01ldGFkYXRhKFxuICAgICAgICAgIHt0ZW1wbGF0ZTogdmlldy50ZW1wbGF0ZSwgdGVtcGxhdGVVcmw6IHZpZXcudGVtcGxhdGVVcmwsIGRpcmVjdGl2ZXM6IGRpcmVjdGl2ZXN9KTtcbiAgICB9XG5cbiAgICB2YXIgaW5saW5lVGVtcGxhdGUgPSB0aGlzLl9pbmxpbmVUZW1wbGF0ZXMuZ2V0KGNvbXBvbmVudCk7XG4gICAgaWYgKGlzUHJlc2VudChpbmxpbmVUZW1wbGF0ZSkpIHtcbiAgICAgIHZpZXcgPSBuZXcgVmlld01ldGFkYXRhKFxuICAgICAgICAgIHt0ZW1wbGF0ZTogaW5saW5lVGVtcGxhdGUsIHRlbXBsYXRlVXJsOiBudWxsLCBkaXJlY3RpdmVzOiB2aWV3LmRpcmVjdGl2ZXN9KTtcbiAgICB9XG5cbiAgICB0aGlzLl92aWV3Q2FjaGUuc2V0KGNvbXBvbmVudCwgdmlldyk7XG4gICAgcmV0dXJuIHZpZXc7XG4gIH1cblxuICAvKipcbiAgICogQGludGVybmFsXG4gICAqXG4gICAqIE9uY2UgYSBjb21wb25lbnQgaGFzIGJlZW4gY29tcGlsZWQsIHRoZSBBcHBQcm90b1ZpZXcgaXMgc3RvcmVkIGluIHRoZSBjb21waWxlciBjYWNoZS5cbiAgICpcbiAgICogVGhlbiBpdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIG92ZXJyaWRlIHRoZSBjb21wb25lbnQgY29uZmlndXJhdGlvbiBhZnRlciB0aGUgY29tcG9uZW50XG4gICAqIGhhcyBiZWVuIGNvbXBpbGVkLlxuICAgKlxuICAgKiBAcGFyYW0ge1R5cGV9IGNvbXBvbmVudFxuICAgKi9cbiAgX2NoZWNrT3ZlcnJpZGVhYmxlKGNvbXBvbmVudDogVHlwZSk6IHZvaWQge1xuICAgIHZhciBjYWNoZWQgPSB0aGlzLl92aWV3Q2FjaGUuZ2V0KGNvbXBvbmVudCk7XG5cbiAgICBpZiAoaXNQcmVzZW50KGNhY2hlZCkpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFxuICAgICAgICAgIGBUaGUgY29tcG9uZW50ICR7c3RyaW5naWZ5KGNvbXBvbmVudCl9IGhhcyBhbHJlYWR5IGJlZW4gY29tcGlsZWQsIGl0cyBjb25maWd1cmF0aW9uIGNhbiBub3QgYmUgY2hhbmdlZGApO1xuICAgIH1cbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL21vY2svdmlld19yZXNvbHZlcl9tb2NrLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge0V2ZW50RW1pdHRlciwgT2JzZXJ2YWJsZVdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtMb2NhdGlvblN0cmF0ZWd5fSBmcm9tICdhbmd1bGFyMi9zcmMvcm91dGVyL2xvY2F0aW9uX3N0cmF0ZWd5JztcblxuXG4vKipcbiAqIEEgbW9jayBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTG9jYXRpb25TdHJhdGVneX0gdGhhdCBhbGxvd3MgdGVzdHMgdG8gZmlyZSBzaW11bGF0ZWRcbiAqIGxvY2F0aW9uIGV2ZW50cy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vY2tMb2NhdGlvblN0cmF0ZWd5IGV4dGVuZHMgTG9jYXRpb25TdHJhdGVneSB7XG4gIGludGVybmFsQmFzZUhyZWY6IHN0cmluZyA9ICcvJztcbiAgaW50ZXJuYWxQYXRoOiBzdHJpbmcgPSAnLyc7XG4gIGludGVybmFsVGl0bGU6IHN0cmluZyA9ICcnO1xuICB1cmxDaGFuZ2VzOiBzdHJpbmdbXSA9IFtdO1xuICAvKiogQGludGVybmFsICovXG4gIF9zdWJqZWN0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgY29uc3RydWN0b3IoKSB7IHN1cGVyKCk7IH1cblxuICBzaW11bGF0ZVBvcFN0YXRlKHVybDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5pbnRlcm5hbFBhdGggPSB1cmw7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fc3ViamVjdCwgbmV3IF9Nb2NrUG9wU3RhdGVFdmVudCh0aGlzLnBhdGgoKSkpO1xuICB9XG5cbiAgcGF0aCgpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy5pbnRlcm5hbFBhdGg7IH1cblxuICBwcmVwYXJlRXh0ZXJuYWxVcmwoaW50ZXJuYWw6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGludGVybmFsLnN0YXJ0c1dpdGgoJy8nKSAmJiB0aGlzLmludGVybmFsQmFzZUhyZWYuZW5kc1dpdGgoJy8nKSkge1xuICAgICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxCYXNlSHJlZiArIGludGVybmFsLnN1YnN0cmluZygxKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW50ZXJuYWxCYXNlSHJlZiArIGludGVybmFsO1xuICB9XG5cbiAgcHVzaFN0YXRlKGN0eDogYW55LCB0aXRsZTogc3RyaW5nLCBwYXRoOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLmludGVybmFsVGl0bGUgPSB0aXRsZTtcblxuICAgIHZhciB1cmwgPSBwYXRoICsgKHF1ZXJ5Lmxlbmd0aCA+IDAgPyAoJz8nICsgcXVlcnkpIDogJycpO1xuICAgIHRoaXMuaW50ZXJuYWxQYXRoID0gdXJsO1xuXG4gICAgdmFyIGV4dGVybmFsVXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwodXJsKTtcbiAgICB0aGlzLnVybENoYW5nZXMucHVzaChleHRlcm5hbFVybCk7XG4gIH1cblxuICByZXBsYWNlU3RhdGUoY3R4OiBhbnksIHRpdGxlOiBzdHJpbmcsIHBhdGg6IHN0cmluZywgcXVlcnk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuaW50ZXJuYWxUaXRsZSA9IHRpdGxlO1xuXG4gICAgdmFyIHVybCA9IHBhdGggKyAocXVlcnkubGVuZ3RoID4gMCA/ICgnPycgKyBxdWVyeSkgOiAnJyk7XG4gICAgdGhpcy5pbnRlcm5hbFBhdGggPSB1cmw7XG5cbiAgICB2YXIgZXh0ZXJuYWxVcmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh1cmwpO1xuICAgIHRoaXMudXJsQ2hhbmdlcy5wdXNoKCdyZXBsYWNlOiAnICsgZXh0ZXJuYWxVcmwpO1xuICB9XG5cbiAgb25Qb3BTdGF0ZShmbjogKHZhbHVlOiBhbnkpID0+IHZvaWQpOiB2b2lkIHsgT2JzZXJ2YWJsZVdyYXBwZXIuc3Vic2NyaWJlKHRoaXMuX3N1YmplY3QsIGZuKTsgfVxuXG4gIGdldEJhc2VIcmVmKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLmludGVybmFsQmFzZUhyZWY7IH1cblxuICBiYWNrKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnVybENoYW5nZXMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy51cmxDaGFuZ2VzLnBvcCgpO1xuICAgICAgdmFyIG5leHRVcmwgPSB0aGlzLnVybENoYW5nZXMubGVuZ3RoID4gMCA/IHRoaXMudXJsQ2hhbmdlc1t0aGlzLnVybENoYW5nZXMubGVuZ3RoIC0gMV0gOiAnJztcbiAgICAgIHRoaXMuc2ltdWxhdGVQb3BTdGF0ZShuZXh0VXJsKTtcbiAgICB9XG4gIH1cblxuICBmb3J3YXJkKCk6IHZvaWQgeyB0aHJvdyAnbm90IGltcGxlbWVudGVkJzsgfVxufVxuXG5jbGFzcyBfTW9ja1BvcFN0YXRlRXZlbnQge1xuICBwb3A6IGJvb2xlYW4gPSB0cnVlO1xuICB0eXBlOiBzdHJpbmcgPSAncG9wc3RhdGUnO1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgbmV3VXJsOiBzdHJpbmcpIHt9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvbW9jay9tb2NrX2xvY2F0aW9uX3N0cmF0ZWd5LnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge05nWm9uZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvem9uZS9uZ196b25lJztcbmltcG9ydCB7RXZlbnRFbWl0dGVyLCBPYnNlcnZhYmxlV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cbi8qKlxuICogQSBtb2NrIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBOZ1pvbmV9LlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgTW9ja05nWm9uZSBleHRlbmRzIE5nWm9uZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX21vY2tPbkV2ZW50RG9uZTogRXZlbnRFbWl0dGVyPGFueT47XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoe2VuYWJsZUxvbmdTdGFja1RyYWNlOiBmYWxzZX0pO1xuICAgIHRoaXMuX21vY2tPbkV2ZW50RG9uZSA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PihmYWxzZSk7XG4gIH1cblxuICBnZXQgb25FdmVudERvbmUoKSB7IHJldHVybiB0aGlzLl9tb2NrT25FdmVudERvbmU7IH1cblxuICBydW4oZm46IEZ1bmN0aW9uKTogYW55IHsgcmV0dXJuIGZuKCk7IH1cblxuICBydW5PdXRzaWRlQW5ndWxhcihmbjogRnVuY3Rpb24pOiBhbnkgeyByZXR1cm4gZm4oKTsgfVxuXG4gIHNpbXVsYXRlWm9uZUV4aXQoKTogdm9pZCB7IE9ic2VydmFibGVXcmFwcGVyLmNhbGxOZXh0KHRoaXMub25FdmVudERvbmUsIG51bGwpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvbW9jay9uZ196b25lX21vY2sudHNcbiAqKi8iLCJpbXBvcnQge1xuICBDb21wb25lbnRSZWYsXG4gIERlYnVnRWxlbWVudCxcbiAgRGlyZWN0aXZlUmVzb2x2ZXIsXG4gIER5bmFtaWNDb21wb25lbnRMb2FkZXIsXG4gIEluamVjdG9yLFxuICBJbmplY3RhYmxlLFxuICBWaWV3TWV0YWRhdGEsXG4gIFZpZXdSZWYsXG4gIFZpZXdSZXNvbHZlcixcbiAgcHJvdmlkZVxufSBmcm9tICdhbmd1bGFyMi9jb3JlJztcblxuaW1wb3J0IHtUeXBlLCBpc1ByZXNlbnQsIGlzQmxhbmt9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5pbXBvcnQge1Byb21pc2V9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvYXN5bmMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwV3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcblxuaW1wb3J0IHtBcHBWaWV3fSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvdmlldyc7XG5pbXBvcnQge2ludGVybmFsVmlld30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvbGlua2VyL3ZpZXdfcmVmJztcblxuaW1wb3J0IHtlbH0gZnJvbSAnLi91dGlscyc7XG5cbmltcG9ydCB7RE9DVU1FTlR9IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX3Rva2Vucyc7XG5pbXBvcnQge0RPTX0gZnJvbSAnYW5ndWxhcjIvc3JjL3BsYXRmb3JtL2RvbS9kb21fYWRhcHRlcic7XG5cbmltcG9ydCB7RGVidWdFbGVtZW50X30gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGVidWcvZGVidWdfZWxlbWVudCc7XG5cblxuLyoqXG4gKiBGaXh0dXJlIGZvciBkZWJ1Z2dpbmcgYW5kIHRlc3RpbmcgYSBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb21wb25lbnRGaXh0dXJlIHtcbiAgLyoqXG4gICAqIFRoZSBEZWJ1Z0VsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIHRoZSByb290IGVsZW1lbnQgb2YgdGhpcyBjb21wb25lbnQuXG4gICAqL1xuICBkZWJ1Z0VsZW1lbnQ6IERlYnVnRWxlbWVudDtcblxuICAvKipcbiAgICogVGhlIGluc3RhbmNlIG9mIHRoZSByb290IGNvbXBvbmVudCBjbGFzcy5cbiAgICovXG4gIGNvbXBvbmVudEluc3RhbmNlOiBhbnk7XG5cbiAgLyoqXG4gICAqIFRoZSBuYXRpdmUgZWxlbWVudCBhdCB0aGUgcm9vdCBvZiB0aGUgY29tcG9uZW50LlxuICAgKi9cbiAgbmF0aXZlRWxlbWVudDogYW55O1xuXG4gIC8qKlxuICAgKiBUcmlnZ2VyIGEgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSBmb3IgdGhlIGNvbXBvbmVudC5cbiAgICovXG4gIGFic3RyYWN0IGRldGVjdENoYW5nZXMoKTogdm9pZDtcblxuICAvKipcbiAgICogVHJpZ2dlciBjb21wb25lbnQgZGVzdHJ1Y3Rpb24uXG4gICAqL1xuICBhYnN0cmFjdCBkZXN0cm95KCk6IHZvaWQ7XG59XG5cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEZpeHR1cmVfIGV4dGVuZHMgQ29tcG9uZW50Rml4dHVyZSB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2NvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmO1xuICAvKiogQGludGVybmFsICovXG4gIF9jb21wb25lbnRQYXJlbnRWaWV3OiBBcHBWaWV3O1xuXG4gIGNvbnN0cnVjdG9yKGNvbXBvbmVudFJlZjogQ29tcG9uZW50UmVmKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmRlYnVnRWxlbWVudCA9IG5ldyBEZWJ1Z0VsZW1lbnRfKGludGVybmFsVmlldyg8Vmlld1JlZj5jb21wb25lbnRSZWYuaG9zdFZpZXcpLCAwKTtcbiAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlID0gdGhpcy5kZWJ1Z0VsZW1lbnQuY29tcG9uZW50SW5zdGFuY2U7XG4gICAgdGhpcy5uYXRpdmVFbGVtZW50ID0gdGhpcy5kZWJ1Z0VsZW1lbnQubmF0aXZlRWxlbWVudDtcbiAgICB0aGlzLl9jb21wb25lbnRQYXJlbnRWaWV3ID0gaW50ZXJuYWxWaWV3KDxWaWV3UmVmPmNvbXBvbmVudFJlZi5ob3N0Vmlldyk7XG4gICAgdGhpcy5fY29tcG9uZW50UmVmID0gY29tcG9uZW50UmVmO1xuICB9XG5cbiAgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgICB0aGlzLl9jb21wb25lbnRQYXJlbnRWaWV3LmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgICB0aGlzLl9jb21wb25lbnRQYXJlbnRWaWV3LmNoYW5nZURldGVjdG9yLmNoZWNrTm9DaGFuZ2VzKCk7XG4gIH1cblxuICBkZXN0cm95KCk6IHZvaWQgeyB0aGlzLl9jb21wb25lbnRSZWYuZGlzcG9zZSgpOyB9XG59XG5cbnZhciBfbmV4dFJvb3RFbGVtZW50SWQgPSAwO1xuXG4vKipcbiAqIEJ1aWxkcyBhIENvbXBvbmVudEZpeHR1cmUgZm9yIHVzZSBpbiBjb21wb25lbnQgbGV2ZWwgdGVzdHMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBUZXN0Q29tcG9uZW50QnVpbGRlciB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2JpbmRpbmdzT3ZlcnJpZGVzID0gbmV3IE1hcDxUeXBlLCBhbnlbXT4oKTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfZGlyZWN0aXZlT3ZlcnJpZGVzID0gbmV3IE1hcDxUeXBlLCBNYXA8VHlwZSwgVHlwZT4+KCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3RlbXBsYXRlT3ZlcnJpZGVzID0gbmV3IE1hcDxUeXBlLCBzdHJpbmc+KCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZpZXdCaW5kaW5nc092ZXJyaWRlcyA9IG5ldyBNYXA8VHlwZSwgYW55W10+KCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZpZXdPdmVycmlkZXMgPSBuZXcgTWFwPFR5cGUsIFZpZXdNZXRhZGF0YT4oKTtcblxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgX2luamVjdG9yOiBJbmplY3Rvcikge31cblxuICAvKiogQGludGVybmFsICovXG4gIF9jbG9uZSgpOiBUZXN0Q29tcG9uZW50QnVpbGRlciB7XG4gICAgdmFyIGNsb25lID0gbmV3IFRlc3RDb21wb25lbnRCdWlsZGVyKHRoaXMuX2luamVjdG9yKTtcbiAgICBjbG9uZS5fdmlld092ZXJyaWRlcyA9IE1hcFdyYXBwZXIuY2xvbmUodGhpcy5fdmlld092ZXJyaWRlcyk7XG4gICAgY2xvbmUuX2RpcmVjdGl2ZU92ZXJyaWRlcyA9IE1hcFdyYXBwZXIuY2xvbmUodGhpcy5fZGlyZWN0aXZlT3ZlcnJpZGVzKTtcbiAgICBjbG9uZS5fdGVtcGxhdGVPdmVycmlkZXMgPSBNYXBXcmFwcGVyLmNsb25lKHRoaXMuX3RlbXBsYXRlT3ZlcnJpZGVzKTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIG9ubHkgdGhlIGh0bWwgb2YgYSB7QGxpbmsgQ29tcG9uZW50TWV0YWRhdGF9LlxuICAgKiBBbGwgdGhlIG90aGVyIHByb3BlcnRpZXMgb2YgdGhlIGNvbXBvbmVudCdzIHtAbGluayBWaWV3TWV0YWRhdGF9IGFyZSBwcmVzZXJ2ZWQuXG4gICAqXG4gICAqIEBwYXJhbSB7VHlwZX0gY29tcG9uZW50XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBodG1sXG4gICAqXG4gICAqIEByZXR1cm4ge1Rlc3RDb21wb25lbnRCdWlsZGVyfVxuICAgKi9cbiAgb3ZlcnJpZGVUZW1wbGF0ZShjb21wb25lbnRUeXBlOiBUeXBlLCB0ZW1wbGF0ZTogc3RyaW5nKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHZhciBjbG9uZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgY2xvbmUuX3RlbXBsYXRlT3ZlcnJpZGVzLnNldChjb21wb25lbnRUeXBlLCB0ZW1wbGF0ZSk7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyBhIGNvbXBvbmVudCdzIHtAbGluayBWaWV3TWV0YWRhdGF9LlxuICAgKlxuICAgKiBAcGFyYW0ge1R5cGV9IGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge3ZpZXd9IFZpZXdcbiAgICpcbiAgICogQHJldHVybiB7VGVzdENvbXBvbmVudEJ1aWxkZXJ9XG4gICAqL1xuICBvdmVycmlkZVZpZXcoY29tcG9uZW50VHlwZTogVHlwZSwgdmlldzogVmlld01ldGFkYXRhKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHZhciBjbG9uZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgY2xvbmUuX3ZpZXdPdmVycmlkZXMuc2V0KGNvbXBvbmVudFR5cGUsIHZpZXcpO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZXMgdGhlIGRpcmVjdGl2ZXMgZnJvbSB0aGUgY29tcG9uZW50IHtAbGluayBWaWV3TWV0YWRhdGF9LlxuICAgKlxuICAgKiBAcGFyYW0ge1R5cGV9IGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge1R5cGV9IGZyb21cbiAgICogQHBhcmFtIHtUeXBlfSB0b1xuICAgKlxuICAgKiBAcmV0dXJuIHtUZXN0Q29tcG9uZW50QnVpbGRlcn1cbiAgICovXG4gIG92ZXJyaWRlRGlyZWN0aXZlKGNvbXBvbmVudFR5cGU6IFR5cGUsIGZyb206IFR5cGUsIHRvOiBUeXBlKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHZhciBjbG9uZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgdmFyIG92ZXJyaWRlc0ZvckNvbXBvbmVudCA9IGNsb25lLl9kaXJlY3RpdmVPdmVycmlkZXMuZ2V0KGNvbXBvbmVudFR5cGUpO1xuICAgIGlmICghaXNQcmVzZW50KG92ZXJyaWRlc0ZvckNvbXBvbmVudCkpIHtcbiAgICAgIGNsb25lLl9kaXJlY3RpdmVPdmVycmlkZXMuc2V0KGNvbXBvbmVudFR5cGUsIG5ldyBNYXA8VHlwZSwgVHlwZT4oKSk7XG4gICAgICBvdmVycmlkZXNGb3JDb21wb25lbnQgPSBjbG9uZS5fZGlyZWN0aXZlT3ZlcnJpZGVzLmdldChjb21wb25lbnRUeXBlKTtcbiAgICB9XG4gICAgb3ZlcnJpZGVzRm9yQ29tcG9uZW50LnNldChmcm9tLCB0byk7XG4gICAgcmV0dXJuIGNsb25lO1xuICB9XG5cbiAgLyoqXG4gICAqIE92ZXJyaWRlcyBvbmUgb3IgbW9yZSBpbmplY3RhYmxlcyBjb25maWd1cmVkIHZpYSBgcHJvdmlkZXJzYCBtZXRhZGF0YSBwcm9wZXJ0eSBvZiBhIGRpcmVjdGl2ZVxuICAgKiBvclxuICAgKiBjb21wb25lbnQuXG4gICAqIFZlcnkgdXNlZnVsIHdoZW4gY2VydGFpbiBwcm92aWRlcnMgbmVlZCB0byBiZSBtb2NrZWQgb3V0LlxuICAgKlxuICAgKiBUaGUgcHJvdmlkZXJzIHNwZWNpZmllZCB2aWEgdGhpcyBtZXRob2QgYXJlIGFwcGVuZGVkIHRvIHRoZSBleGlzdGluZyBgcHJvdmlkZXJzYCBjYXVzaW5nIHRoZVxuICAgKiBkdXBsaWNhdGVkIHByb3ZpZGVycyB0b1xuICAgKiBiZSBvdmVycmlkZGVuLlxuICAgKlxuICAgKiBAcGFyYW0ge1R5cGV9IGNvbXBvbmVudFxuICAgKiBAcGFyYW0ge2FueVtdfSBwcm92aWRlcnNcbiAgICpcbiAgICogQHJldHVybiB7VGVzdENvbXBvbmVudEJ1aWxkZXJ9XG4gICAqL1xuICBvdmVycmlkZVByb3ZpZGVycyh0eXBlOiBUeXBlLCBwcm92aWRlcnM6IGFueVtdKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHZhciBjbG9uZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgY2xvbmUuX2JpbmRpbmdzT3ZlcnJpZGVzLnNldCh0eXBlLCBwcm92aWRlcnMpO1xuICAgIHJldHVybiBjbG9uZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVwcmVjYXRlZFxuICAgKi9cbiAgb3ZlcnJpZGVCaW5kaW5ncyh0eXBlOiBUeXBlLCBwcm92aWRlcnM6IGFueVtdKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHJldHVybiB0aGlzLm92ZXJyaWRlUHJvdmlkZXJzKHR5cGUsIHByb3ZpZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogT3ZlcnJpZGVzIG9uZSBvciBtb3JlIGluamVjdGFibGVzIGNvbmZpZ3VyZWQgdmlhIGBwcm92aWRlcnNgIG1ldGFkYXRhIHByb3BlcnR5IG9mIGEgZGlyZWN0aXZlXG4gICAqIG9yXG4gICAqIGNvbXBvbmVudC5cbiAgICogVmVyeSB1c2VmdWwgd2hlbiBjZXJ0YWluIHByb3ZpZGVycyBuZWVkIHRvIGJlIG1vY2tlZCBvdXQuXG4gICAqXG4gICAqIFRoZSBwcm92aWRlcnMgc3BlY2lmaWVkIHZpYSB0aGlzIG1ldGhvZCBhcmUgYXBwZW5kZWQgdG8gdGhlIGV4aXN0aW5nIGBwcm92aWRlcnNgIGNhdXNpbmcgdGhlXG4gICAqIGR1cGxpY2F0ZWQgcHJvdmlkZXJzIHRvXG4gICAqIGJlIG92ZXJyaWRkZW4uXG4gICAqXG4gICAqIEBwYXJhbSB7VHlwZX0gY29tcG9uZW50XG4gICAqIEBwYXJhbSB7YW55W119IHByb3ZpZGVyc1xuICAgKlxuICAgKiBAcmV0dXJuIHtUZXN0Q29tcG9uZW50QnVpbGRlcn1cbiAgICovXG4gIG92ZXJyaWRlVmlld1Byb3ZpZGVycyh0eXBlOiBUeXBlLCBwcm92aWRlcnM6IGFueVtdKTogVGVzdENvbXBvbmVudEJ1aWxkZXIge1xuICAgIHZhciBjbG9uZSA9IHRoaXMuX2Nsb25lKCk7XG4gICAgY2xvbmUuX3ZpZXdCaW5kaW5nc092ZXJyaWRlcy5zZXQodHlwZSwgcHJvdmlkZXJzKTtcbiAgICByZXR1cm4gY2xvbmU7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIG92ZXJyaWRlVmlld0JpbmRpbmdzKHR5cGU6IFR5cGUsIHByb3ZpZGVyczogYW55W10pOiBUZXN0Q29tcG9uZW50QnVpbGRlciB7XG4gICAgcmV0dXJuIHRoaXMub3ZlcnJpZGVWaWV3UHJvdmlkZXJzKHR5cGUsIHByb3ZpZGVycyk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGRzIGFuZCByZXR1cm5zIGEgQ29tcG9uZW50Rml4dHVyZS5cbiAgICpcbiAgICogQHJldHVybiB7UHJvbWlzZTxDb21wb25lbnRGaXh0dXJlPn1cbiAgICovXG4gIGNyZWF0ZUFzeW5jKHJvb3RDb21wb25lbnRUeXBlOiBUeXBlKTogUHJvbWlzZTxDb21wb25lbnRGaXh0dXJlPiB7XG4gICAgdmFyIG1vY2tEaXJlY3RpdmVSZXNvbHZlciA9IHRoaXMuX2luamVjdG9yLmdldChEaXJlY3RpdmVSZXNvbHZlcik7XG4gICAgdmFyIG1vY2tWaWV3UmVzb2x2ZXIgPSB0aGlzLl9pbmplY3Rvci5nZXQoVmlld1Jlc29sdmVyKTtcbiAgICB0aGlzLl92aWV3T3ZlcnJpZGVzLmZvckVhY2goKHZpZXcsIHR5cGUpID0+IG1vY2tWaWV3UmVzb2x2ZXIuc2V0Vmlldyh0eXBlLCB2aWV3KSk7XG4gICAgdGhpcy5fdGVtcGxhdGVPdmVycmlkZXMuZm9yRWFjaCgodGVtcGxhdGUsIHR5cGUpID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9ja1ZpZXdSZXNvbHZlci5zZXRJbmxpbmVUZW1wbGF0ZSh0eXBlLCB0ZW1wbGF0ZSkpO1xuICAgIHRoaXMuX2RpcmVjdGl2ZU92ZXJyaWRlcy5mb3JFYWNoKChvdmVycmlkZXMsIGNvbXBvbmVudCkgPT4ge1xuICAgICAgb3ZlcnJpZGVzLmZvckVhY2goXG4gICAgICAgICAgKHRvLCBmcm9tKSA9PiB7IG1vY2tWaWV3UmVzb2x2ZXIub3ZlcnJpZGVWaWV3RGlyZWN0aXZlKGNvbXBvbmVudCwgZnJvbSwgdG8pOyB9KTtcbiAgICB9KTtcblxuICAgIHRoaXMuX2JpbmRpbmdzT3ZlcnJpZGVzLmZvckVhY2goKGJpbmRpbmdzLCB0eXBlKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vY2tEaXJlY3RpdmVSZXNvbHZlci5zZXRCaW5kaW5nc092ZXJyaWRlKHR5cGUsIGJpbmRpbmdzKSk7XG4gICAgdGhpcy5fdmlld0JpbmRpbmdzT3ZlcnJpZGVzLmZvckVhY2goXG4gICAgICAgIChiaW5kaW5ncywgdHlwZSkgPT4gbW9ja0RpcmVjdGl2ZVJlc29sdmVyLnNldFZpZXdCaW5kaW5nc092ZXJyaWRlKHR5cGUsIGJpbmRpbmdzKSk7XG5cbiAgICB2YXIgcm9vdEVsSWQgPSBgcm9vdCR7X25leHRSb290RWxlbWVudElkKyt9YDtcbiAgICB2YXIgcm9vdEVsID0gZWwoYDxkaXYgaWQ9XCIke3Jvb3RFbElkfVwiPjwvZGl2PmApO1xuICAgIHZhciBkb2MgPSB0aGlzLl9pbmplY3Rvci5nZXQoRE9DVU1FTlQpO1xuXG4gICAgLy8gVE9ETyhqdWxpZW1yKTogY2FuL3Nob3VsZCB0aGlzIGJlIG9wdGlvbmFsP1xuICAgIHZhciBvbGRSb290cyA9IERPTS5xdWVyeVNlbGVjdG9yQWxsKGRvYywgJ1tpZF49cm9vdF0nKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9sZFJvb3RzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBET00ucmVtb3ZlKG9sZFJvb3RzW2ldKTtcbiAgICB9XG4gICAgRE9NLmFwcGVuZENoaWxkKGRvYy5ib2R5LCByb290RWwpO1xuXG5cbiAgICByZXR1cm4gdGhpcy5faW5qZWN0b3IuZ2V0KER5bmFtaWNDb21wb25lbnRMb2FkZXIpXG4gICAgICAgIC5sb2FkQXNSb290KHJvb3RDb21wb25lbnRUeXBlLCBgIyR7cm9vdEVsSWR9YCwgdGhpcy5faW5qZWN0b3IpXG4gICAgICAgIC50aGVuKChjb21wb25lbnRSZWYpID0+IHsgcmV0dXJuIG5ldyBDb21wb25lbnRGaXh0dXJlXyhjb21wb25lbnRSZWYpOyB9KTtcbiAgfVxufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3Rlc3RpbmcvdGVzdF9jb21wb25lbnRfYnVpbGRlci50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvY29yZSc7XG5pbXBvcnQge0xpc3RXcmFwcGVyLCBNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtpc1ByZXNlbnQsIGlzU3RyaW5nLCBSZWdFeHBXcmFwcGVyLCBTdHJpbmdXcmFwcGVyLCBSZWdFeHB9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvbGFuZyc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMb2cge1xuICAvKiogQGludGVybmFsICovXG4gIF9yZXN1bHQ6IGFueVtdO1xuXG4gIGNvbnN0cnVjdG9yKCkgeyB0aGlzLl9yZXN1bHQgPSBbXTsgfVxuXG4gIGFkZCh2YWx1ZSk6IHZvaWQgeyB0aGlzLl9yZXN1bHQucHVzaCh2YWx1ZSk7IH1cblxuICBmbih2YWx1ZSkge1xuICAgIHJldHVybiAoYTEgPSBudWxsLCBhMiA9IG51bGwsIGEzID0gbnVsbCwgYTQgPSBudWxsLCBhNSA9IG51bGwpID0+IHsgdGhpcy5fcmVzdWx0LnB1c2godmFsdWUpOyB9XG4gIH1cblxuICBjbGVhcigpOiB2b2lkIHsgdGhpcy5fcmVzdWx0ID0gW107IH1cblxuICByZXN1bHQoKTogc3RyaW5nIHsgcmV0dXJuIHRoaXMuX3Jlc3VsdC5qb2luKFwiOyBcIik7IH1cbn1cblxuXG5leHBvcnQgY2xhc3MgQnJvd3NlckRldGVjdGlvbiB7XG4gIHByaXZhdGUgX3VhOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IodWE6IHN0cmluZykge1xuICAgIGlmIChpc1ByZXNlbnQodWEpKSB7XG4gICAgICB0aGlzLl91YSA9IHVhO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl91YSA9IGlzUHJlc2VudChET00pID8gRE9NLmdldFVzZXJBZ2VudCgpIDogJyc7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGlzRmlyZWZveCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMuX3VhLmluZGV4T2YoJ0ZpcmVmb3gnKSA+IC0xOyB9XG5cbiAgZ2V0IGlzQW5kcm9pZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fdWEuaW5kZXhPZignTW96aWxsYS81LjAnKSA+IC0xICYmIHRoaXMuX3VhLmluZGV4T2YoJ0FuZHJvaWQnKSA+IC0xICYmXG4gICAgICAgICAgIHRoaXMuX3VhLmluZGV4T2YoJ0FwcGxlV2ViS2l0JykgPiAtMSAmJiB0aGlzLl91YS5pbmRleE9mKCdDaHJvbWUnKSA9PSAtMTtcbiAgfVxuXG4gIGdldCBpc0VkZ2UoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLl91YS5pbmRleE9mKCdFZGdlJykgPiAtMTsgfVxuXG4gIGdldCBpc0lFKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5fdWEuaW5kZXhPZignVHJpZGVudCcpID4gLTE7IH1cblxuICBnZXQgaXNXZWJraXQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3VhLmluZGV4T2YoJ0FwcGxlV2ViS2l0JykgPiAtMSAmJiB0aGlzLl91YS5pbmRleE9mKCdFZGdlJykgPT0gLTE7XG4gIH1cblxuICBnZXQgaXNJT1M3KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl91YS5pbmRleE9mKCdpUGhvbmUgT1MgNycpID4gLTEgfHwgdGhpcy5fdWEuaW5kZXhPZignaVBhZCBPUyA3JykgPiAtMTtcbiAgfVxuXG4gIGdldCBpc1Nsb3coKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLmlzQW5kcm9pZCB8fCB0aGlzLmlzSUUgfHwgdGhpcy5pc0lPUzc7IH1cblxuICAvLyBUaGUgSW50bCBBUEkgaXMgb25seSBwcm9wZXJseSBzdXBwb3J0ZWQgaW4gcmVjZW50IENocm9tZSBhbmQgT3BlcmEuXG4gIC8vIE5vdGU6IEVkZ2UgaXMgZGlzZ3Vpc2VkIGFzIENocm9tZSA0Miwgc28gY2hlY2tpbmcgdGhlIFwiRWRnZVwiIHBhcnQgaXMgbmVlZGVkLFxuICAvLyBzZWUgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9oaDg2OTMwMSh2PXZzLjg1KS5hc3B4XG4gIGdldCBzdXBwb3J0c0ludGxBcGkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3VhLmluZGV4T2YoJ0Nocm9tZS80JykgPiAtMSAmJiB0aGlzLl91YS5pbmRleE9mKCdFZGdlJykgPT0gLTE7XG4gIH1cbn1cbmV4cG9ydCB2YXIgYnJvd3NlckRldGVjdGlvbjogQnJvd3NlckRldGVjdGlvbiA9IG5ldyBCcm93c2VyRGV0ZWN0aW9uKG51bGwpO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChlbGVtZW50LCBldmVudFR5cGUpOiB2b2lkIHtcbiAgRE9NLmRpc3BhdGNoRXZlbnQoZWxlbWVudCwgRE9NLmNyZWF0ZUV2ZW50KGV2ZW50VHlwZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZWwoaHRtbDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICByZXR1cm4gPEhUTUxFbGVtZW50PkRPTS5maXJzdENoaWxkKERPTS5jb250ZW50KERPTS5jcmVhdGVUZW1wbGF0ZShodG1sKSkpO1xufVxuXG52YXIgX1JFX1NQRUNJQUxfQ0hBUlMgPVxuICAgIFsnLScsICdbJywgJ10nLCAnLycsICd7JywgJ30nLCAnXFxcXCcsICcoJywgJyknLCAnKicsICcrJywgJz8nLCAnLicsICdeJywgJyQnLCAnfCddO1xudmFyIF9FU0NBUEVfUkUgPSBSZWdFeHBXcmFwcGVyLmNyZWF0ZShgW1xcXFwke19SRV9TUEVDSUFMX0NIQVJTLmpvaW4oJ1xcXFwnKX1dYCk7XG5leHBvcnQgZnVuY3Rpb24gY29udGFpbnNSZWdleHAoaW5wdXQ6IHN0cmluZyk6IFJlZ0V4cCB7XG4gIHJldHVybiBSZWdFeHBXcmFwcGVyLmNyZWF0ZShcbiAgICAgIFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbE1hcHBlZChpbnB1dCwgX0VTQ0FQRV9SRSwgKG1hdGNoKSA9PiBgXFxcXCR7bWF0Y2hbMF19YCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplQ1NTKGNzczogc3RyaW5nKTogc3RyaW5nIHtcbiAgY3NzID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKGNzcywgL1xccysvZywgJyAnKTtcbiAgY3NzID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKGNzcywgLzpcXHMvZywgJzonKTtcbiAgY3NzID0gU3RyaW5nV3JhcHBlci5yZXBsYWNlQWxsKGNzcywgLycvZywgJ1wiJyk7XG4gIGNzcyA9IFN0cmluZ1dyYXBwZXIucmVwbGFjZUFsbChjc3MsIC8gfS9nLCAnfScpO1xuICBjc3MgPSBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQoY3NzLCAvdXJsXFwoKFxcXCJ8XFxzKSguKykoXFxcInxcXHMpXFwpKFxccyopL2csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWF0Y2gpID0+IGB1cmwoXCIke21hdGNoWzJdfVwiKWApO1xuICBjc3MgPSBTdHJpbmdXcmFwcGVyLnJlcGxhY2VBbGxNYXBwZWQoY3NzLCAvXFxbKC4rKT0oW15cIlxcXV0rKVxcXS9nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1hdGNoKSA9PiBgWyR7bWF0Y2hbMV19PVwiJHttYXRjaFsyXX1cIl1gKTtcbiAgcmV0dXJuIGNzcztcbn1cblxudmFyIF9zaW5nbGVUYWdXaGl0ZWxpc3QgPSBbJ2JyJywgJ2hyJywgJ2lucHV0J107XG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5RWxlbWVudChlbCk6IHN0cmluZyB7XG4gIHZhciByZXN1bHQgPSAnJztcbiAgaWYgKERPTS5pc0VsZW1lbnROb2RlKGVsKSkge1xuICAgIHZhciB0YWdOYW1lID0gRE9NLnRhZ05hbWUoZWwpLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBPcGVuaW5nIHRhZ1xuICAgIHJlc3VsdCArPSBgPCR7dGFnTmFtZX1gO1xuXG4gICAgLy8gQXR0cmlidXRlcyBpbiBhbiBvcmRlcmVkIHdheVxuICAgIHZhciBhdHRyaWJ1dGVNYXAgPSBET00uYXR0cmlidXRlTWFwKGVsKTtcbiAgICB2YXIga2V5cyA9IFtdO1xuICAgIGF0dHJpYnV0ZU1hcC5mb3JFYWNoKCh2LCBrKSA9PiBrZXlzLnB1c2goaykpO1xuICAgIExpc3RXcmFwcGVyLnNvcnQoa2V5cyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIga2V5ID0ga2V5c1tpXTtcbiAgICAgIHZhciBhdHRWYWx1ZSA9IGF0dHJpYnV0ZU1hcC5nZXQoa2V5KTtcbiAgICAgIGlmICghaXNTdHJpbmcoYXR0VmFsdWUpKSB7XG4gICAgICAgIHJlc3VsdCArPSBgICR7a2V5fWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHQgKz0gYCAke2tleX09XCIke2F0dFZhbHVlfVwiYDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmVzdWx0ICs9ICc+JztcblxuICAgIC8vIENoaWxkcmVuXG4gICAgdmFyIGNoaWxkcmVuUm9vdCA9IERPTS50ZW1wbGF0ZUF3YXJlUm9vdChlbCk7XG4gICAgdmFyIGNoaWxkcmVuID0gaXNQcmVzZW50KGNoaWxkcmVuUm9vdCkgPyBET00uY2hpbGROb2RlcyhjaGlsZHJlblJvb3QpIDogW107XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBjaGlsZHJlbi5sZW5ndGg7IGorKykge1xuICAgICAgcmVzdWx0ICs9IHN0cmluZ2lmeUVsZW1lbnQoY2hpbGRyZW5bal0pO1xuICAgIH1cblxuICAgIC8vIENsb3NpbmcgdGFnXG4gICAgaWYgKCFMaXN0V3JhcHBlci5jb250YWlucyhfc2luZ2xlVGFnV2hpdGVsaXN0LCB0YWdOYW1lKSkge1xuICAgICAgcmVzdWx0ICs9IGA8LyR7dGFnTmFtZX0+YDtcbiAgICB9XG4gIH0gZWxzZSBpZiAoRE9NLmlzQ29tbWVudE5vZGUoZWwpKSB7XG4gICAgcmVzdWx0ICs9IGA8IS0tJHtET00ubm9kZVZhbHVlKGVsKX0tLT5gO1xuICB9IGVsc2Uge1xuICAgIHJlc3VsdCArPSBET00uZ2V0VGV4dChlbCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3Rlc3RpbmcvdXRpbHMudHNcbiAqKi8iLCJpbXBvcnQge1R5cGUsIGlzQXJyYXksIGlzUHJlc2VudCwgc2VyaWFsaXplRW51bSwgZGVzZXJpYWxpemVFbnVtfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nXCI7XG5pbXBvcnQge0Jhc2VFeGNlcHRpb24sIFdyYXBwZWRFeGNlcHRpb259IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvZXhjZXB0aW9ucyc7XG5cbmltcG9ydCB7TWFwLCBTdHJpbmdNYXBXcmFwcGVyLCBNYXBXcmFwcGVyfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uXCI7XG5pbXBvcnQge1xuICBSZW5kZXJQcm90b1ZpZXdSZWYsXG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlckZyYWdtZW50UmVmLFxuICBSZW5kZXJFbGVtZW50UmVmLFxuICBSZW5kZXJUZW1wbGF0ZUNtZCxcbiAgUmVuZGVyQ29tbWFuZFZpc2l0b3IsXG4gIFJlbmRlclRleHRDbWQsXG4gIFJlbmRlck5nQ29udGVudENtZCxcbiAgUmVuZGVyQmVnaW5FbGVtZW50Q21kLFxuICBSZW5kZXJCZWdpbkNvbXBvbmVudENtZCxcbiAgUmVuZGVyRW1iZWRkZWRUZW1wbGF0ZUNtZCxcbiAgUmVuZGVyQ29tcG9uZW50VGVtcGxhdGVcbn0gZnJvbSBcImFuZ3VsYXIyL3NyYy9jb3JlL3JlbmRlci9hcGlcIjtcbmltcG9ydCB7XG4gIFdlYldvcmtlckVsZW1lbnRSZWYsXG4gIFdlYldvcmtlclRlbXBsYXRlQ21kLFxuICBXZWJXb3JrZXJUZXh0Q21kLFxuICBXZWJXb3JrZXJOZ0NvbnRlbnRDbWQsXG4gIFdlYldvcmtlckJlZ2luRWxlbWVudENtZCxcbiAgV2ViV29ya2VyRW5kRWxlbWVudENtZCxcbiAgV2ViV29ya2VyQmVnaW5Db21wb25lbnRDbWQsXG4gIFdlYldvcmtlckVuZENvbXBvbmVudENtZCxcbiAgV2ViV29ya2VyRW1iZWRkZWRUZW1wbGF0ZUNtZFxufSBmcm9tICdhbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL2FwaSc7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gXCJhbmd1bGFyMi9zcmMvY29yZS9kaVwiO1xuaW1wb3J0IHtSZW5kZXJQcm90b1ZpZXdSZWZTdG9yZX0gZnJvbSAnYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9yZW5kZXJfcHJvdG9fdmlld19yZWZfc3RvcmUnO1xuaW1wb3J0IHtcbiAgUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZVxufSBmcm9tICdhbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL3JlbmRlcl92aWV3X3dpdGhfZnJhZ21lbnRzX3N0b3JlJztcbmltcG9ydCB7Vmlld0VuY2Fwc3VsYXRpb24sIFZJRVdfRU5DQVBTVUxBVElPTl9WQUxVRVN9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL21ldGFkYXRhL3ZpZXcnO1xuXG4vLyBQUklNSVRJVkUgaXMgYW55IHR5cGUgdGhhdCBkb2VzIG5vdCBuZWVkIHRvIGJlIHNlcmlhbGl6ZWQgKHN0cmluZywgbnVtYmVyLCBib29sZWFuKVxuLy8gV2Ugc2V0IGl0IHRvIFN0cmluZyBzbyB0aGF0IGl0IGlzIGNvbnNpZGVyZWQgYSBUeXBlLlxuZXhwb3J0IGNvbnN0IFBSSU1JVElWRTogVHlwZSA9IFN0cmluZztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFNlcmlhbGl6ZXIge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9wcm90b1ZpZXdTdG9yZTogUmVuZGVyUHJvdG9WaWV3UmVmU3RvcmUsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3JlbmRlclZpZXdTdG9yZTogUmVuZGVyVmlld1dpdGhGcmFnbWVudHNTdG9yZSkge31cblxuICBzZXJpYWxpemUob2JqOiBhbnksIHR5cGU6IGFueSk6IE9iamVjdCB7XG4gICAgaWYgKCFpc1ByZXNlbnQob2JqKSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KG9iaikpIHtcbiAgICAgIHJldHVybiAoPGFueVtdPm9iaikubWFwKHYgPT4gdGhpcy5zZXJpYWxpemUodiwgdHlwZSkpO1xuICAgIH1cbiAgICBpZiAodHlwZSA9PSBQUklNSVRJVkUpIHtcbiAgICAgIHJldHVybiBvYmo7XG4gICAgfVxuICAgIGlmICh0eXBlID09IFJlbmRlclByb3RvVmlld1JlZikge1xuICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvVmlld1N0b3JlLnNlcmlhbGl6ZShvYmopO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBSZW5kZXJWaWV3UmVmKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVmlld1N0b3JlLnNlcmlhbGl6ZVJlbmRlclZpZXdSZWYob2JqKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gUmVuZGVyRnJhZ21lbnRSZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJWaWV3U3RvcmUuc2VyaWFsaXplUmVuZGVyRnJhZ21lbnRSZWYob2JqKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gV2ViV29ya2VyRWxlbWVudFJlZikge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZVdvcmtlckVsZW1lbnRSZWYob2JqKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gV2ViV29ya2VyVGVtcGxhdGVDbWQpIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVUZW1wbGF0ZUNtZChvYmopO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUmVuZGVyQ29tcG9uZW50VGVtcGxhdGUpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVSZW5kZXJUZW1wbGF0ZShvYmopO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVmlld0VuY2Fwc3VsYXRpb24pIHtcbiAgICAgIHJldHVybiBzZXJpYWxpemVFbnVtKG9iaik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFwiTm8gc2VyaWFsaXplciBmb3IgXCIgKyB0eXBlLnRvU3RyaW5nKCkpO1xuICAgIH1cbiAgfVxuXG4gIGRlc2VyaWFsaXplKG1hcDogYW55LCB0eXBlOiBhbnksIGRhdGE/OiBhbnkpOiBhbnkge1xuICAgIGlmICghaXNQcmVzZW50KG1hcCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShtYXApKSB7XG4gICAgICB2YXIgb2JqOiBhbnlbXSA9IFtdO1xuICAgICAgKDxhbnlbXT5tYXApLmZvckVhY2godmFsID0+IG9iai5wdXNoKHRoaXMuZGVzZXJpYWxpemUodmFsLCB0eXBlLCBkYXRhKSkpO1xuICAgICAgcmV0dXJuIG9iajtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT0gUFJJTUlUSVZFKSB7XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09IFJlbmRlclByb3RvVmlld1JlZikge1xuICAgICAgcmV0dXJuIHRoaXMuX3Byb3RvVmlld1N0b3JlLmRlc2VyaWFsaXplKG1hcCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFJlbmRlclZpZXdSZWYpIHtcbiAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJWaWV3U3RvcmUuZGVzZXJpYWxpemVSZW5kZXJWaWV3UmVmKG1hcCk7XG4gICAgfSBlbHNlIGlmICh0eXBlID09IFJlbmRlckZyYWdtZW50UmVmKSB7XG4gICAgICByZXR1cm4gdGhpcy5fcmVuZGVyVmlld1N0b3JlLmRlc2VyaWFsaXplUmVuZGVyRnJhZ21lbnRSZWYobWFwKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gV2ViV29ya2VyRWxlbWVudFJlZikge1xuICAgICAgcmV0dXJuIHRoaXMuX2Rlc2VyaWFsaXplV29ya2VyRWxlbWVudFJlZihtYXApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PSBXZWJXb3JrZXJUZW1wbGF0ZUNtZCkge1xuICAgICAgcmV0dXJuIGRlc2VyaWFsaXplVGVtcGxhdGVDbWQobWFwKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVzZXJpYWxpemVSZW5kZXJUZW1wbGF0ZShtYXApO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gVmlld0VuY2Fwc3VsYXRpb24pIHtcbiAgICAgIHJldHVybiBWSUVXX0VOQ0FQU1VMQVRJT05fVkFMVUVTW21hcF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKFwiTm8gZGVzZXJpYWxpemVyIGZvciBcIiArIHR5cGUudG9TdHJpbmcoKSk7XG4gICAgfVxuICB9XG5cbiAgbWFwVG9PYmplY3QobWFwOiBNYXA8c3RyaW5nLCBhbnk+LCB0eXBlPzogVHlwZSk6IE9iamVjdCB7XG4gICAgdmFyIG9iamVjdCA9IHt9O1xuICAgIHZhciBzZXJpYWxpemUgPSBpc1ByZXNlbnQodHlwZSk7XG5cbiAgICBtYXAuZm9yRWFjaCgodmFsdWUsIGtleSkgPT4ge1xuICAgICAgaWYgKHNlcmlhbGl6ZSkge1xuICAgICAgICBvYmplY3Rba2V5XSA9IHRoaXMuc2VyaWFsaXplKHZhbHVlLCB0eXBlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfVxuXG4gIC8qXG4gICAqIFRyYW5zZm9ybXMgYSBKYXZhc2NyaXB0IG9iamVjdCAoU3RyaW5nTWFwKSBpbnRvIGEgTWFwPHN0cmluZywgVj5cbiAgICogSWYgdGhlIHZhbHVlcyBuZWVkIHRvIGJlIGRlc2VyaWFsaXplZCBwYXNzIGluIHRoZWlyIHR5cGVcbiAgICogYW5kIHRoZXkgd2lsbCBiZSBkZXNlcmlhbGl6ZWQgYmVmb3JlIGJlaW5nIHBsYWNlZCBpbiB0aGUgbWFwXG4gICAqL1xuICBvYmplY3RUb01hcChvYmo6IHtba2V5OiBzdHJpbmddOiBhbnl9LCB0eXBlPzogVHlwZSwgZGF0YT86IGFueSk6IE1hcDxzdHJpbmcsIGFueT4ge1xuICAgIGlmIChpc1ByZXNlbnQodHlwZSkpIHtcbiAgICAgIHZhciBtYXAgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICAgICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKG9iaixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmFsLCBrZXkpID0+IHsgbWFwLnNldChrZXksIHRoaXMuZGVzZXJpYWxpemUodmFsLCB0eXBlLCBkYXRhKSk7IH0pO1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIE1hcFdyYXBwZXIuY3JlYXRlRnJvbVN0cmluZ01hcChvYmopO1xuICAgIH1cbiAgfVxuXG4gIGFsbG9jYXRlUmVuZGVyVmlld3MoZnJhZ21lbnRDb3VudDogbnVtYmVyKSB7IHRoaXMuX3JlbmRlclZpZXdTdG9yZS5hbGxvY2F0ZShmcmFnbWVudENvdW50KTsgfVxuXG4gIHByaXZhdGUgX3NlcmlhbGl6ZVdvcmtlckVsZW1lbnRSZWYoZWxlbWVudFJlZjogUmVuZGVyRWxlbWVudFJlZik6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ3JlbmRlclZpZXcnOiB0aGlzLnNlcmlhbGl6ZShlbGVtZW50UmVmLnJlbmRlclZpZXcsIFJlbmRlclZpZXdSZWYpLFxuICAgICAgJ2JvdW5kRWxlbWVudEluZGV4JzogZWxlbWVudFJlZi5ib3VuZEVsZW1lbnRJbmRleFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIF9kZXNlcmlhbGl6ZVdvcmtlckVsZW1lbnRSZWYobWFwOiB7W2tleTogc3RyaW5nXTogYW55fSk6IFJlbmRlckVsZW1lbnRSZWYge1xuICAgIHJldHVybiBuZXcgV2ViV29ya2VyRWxlbWVudFJlZih0aGlzLmRlc2VyaWFsaXplKG1hcFsncmVuZGVyVmlldyddLCBSZW5kZXJWaWV3UmVmKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwWydib3VuZEVsZW1lbnRJbmRleCddKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplUmVuZGVyVGVtcGxhdGUob2JqOiBSZW5kZXJDb21wb25lbnRUZW1wbGF0ZSk6IE9iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdpZCc6IG9iai5pZCxcbiAgICAgICdzaG9ydElkJzogb2JqLnNob3J0SWQsXG4gICAgICAnZW5jYXBzdWxhdGlvbic6IHRoaXMuc2VyaWFsaXplKG9iai5lbmNhcHN1bGF0aW9uLCBWaWV3RW5jYXBzdWxhdGlvbiksXG4gICAgICAnY29tbWFuZHMnOiB0aGlzLnNlcmlhbGl6ZShvYmouY29tbWFuZHMsIFdlYldvcmtlclRlbXBsYXRlQ21kKSxcbiAgICAgICdzdHlsZXMnOiB0aGlzLnNlcmlhbGl6ZShvYmouc3R5bGVzLCBQUklNSVRJVkUpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgX2Rlc2VyaWFsaXplUmVuZGVyVGVtcGxhdGUobWFwOiB7W2tleTogc3RyaW5nXTogYW55fSk6IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlIHtcbiAgICByZXR1cm4gbmV3IFJlbmRlckNvbXBvbmVudFRlbXBsYXRlKG1hcFsnaWQnXSwgbWFwWydzaG9ydElkJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2VyaWFsaXplKG1hcFsnZW5jYXBzdWxhdGlvbiddLCBWaWV3RW5jYXBzdWxhdGlvbiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc2VyaWFsaXplKG1hcFsnY29tbWFuZHMnXSwgV2ViV29ya2VyVGVtcGxhdGVDbWQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXNlcmlhbGl6ZShtYXBbJ3N0eWxlcyddLCBQUklNSVRJVkUpKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHNlcmlhbGl6ZVRlbXBsYXRlQ21kKGNtZDogUmVuZGVyVGVtcGxhdGVDbWQpOiBPYmplY3Qge1xuICByZXR1cm4gY21kLnZpc2l0KFJFTkRFUl9URU1QTEFURV9DTURfU0VSSUFMSVpFUiwgbnVsbCk7XG59XG5cbmZ1bmN0aW9uIGRlc2VyaWFsaXplVGVtcGxhdGVDbWQoZGF0YToge1trZXk6IHN0cmluZ106IGFueX0pOiBSZW5kZXJUZW1wbGF0ZUNtZCB7XG4gIHJldHVybiBSRU5ERVJfVEVNUExBVEVfQ01EX0RFU0VSSUFMSVpFUlNbZGF0YVsnZGVzZXJpYWxpemVySW5kZXgnXV0oZGF0YSk7XG59XG5cbmNsYXNzIFJlbmRlclRlbXBsYXRlQ21kU2VyaWFsaXplciBpbXBsZW1lbnRzIFJlbmRlckNvbW1hbmRWaXNpdG9yIHtcbiAgdmlzaXRUZXh0KGNtZDogUmVuZGVyVGV4dENtZCwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2Rlc2VyaWFsaXplckluZGV4JzogMCxcbiAgICAgICdpc0JvdW5kJzogY21kLmlzQm91bmQsXG4gICAgICAnbmdDb250ZW50SW5kZXgnOiBjbWQubmdDb250ZW50SW5kZXgsXG4gICAgICAndmFsdWUnOiBjbWQudmFsdWVcbiAgICB9O1xuICB9XG4gIHZpc2l0TmdDb250ZW50KGNtZDogUmVuZGVyTmdDb250ZW50Q21kLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB7J2Rlc2VyaWFsaXplckluZGV4JzogMSwgJ2luZGV4JzogY21kLmluZGV4LCAnbmdDb250ZW50SW5kZXgnOiBjbWQubmdDb250ZW50SW5kZXh9O1xuICB9XG4gIHZpc2l0QmVnaW5FbGVtZW50KGNtZDogUmVuZGVyQmVnaW5FbGVtZW50Q21kLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB7XG4gICAgICAnZGVzZXJpYWxpemVySW5kZXgnOiAyLFxuICAgICAgJ2lzQm91bmQnOiBjbWQuaXNCb3VuZCxcbiAgICAgICduZ0NvbnRlbnRJbmRleCc6IGNtZC5uZ0NvbnRlbnRJbmRleCxcbiAgICAgICduYW1lJzogY21kLm5hbWUsXG4gICAgICAnYXR0ck5hbWVBbmRWYWx1ZXMnOiBjbWQuYXR0ck5hbWVBbmRWYWx1ZXMsXG4gICAgICAnZXZlbnRUYXJnZXRBbmROYW1lcyc6IGNtZC5ldmVudFRhcmdldEFuZE5hbWVzXG4gICAgfTtcbiAgfVxuICB2aXNpdEVuZEVsZW1lbnQoY29udGV4dDogYW55KTogYW55IHsgcmV0dXJuIHsnZGVzZXJpYWxpemVySW5kZXgnOiAzfTsgfVxuICB2aXNpdEJlZ2luQ29tcG9uZW50KGNtZDogUmVuZGVyQmVnaW5Db21wb25lbnRDbWQsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICdkZXNlcmlhbGl6ZXJJbmRleCc6IDQsXG4gICAgICAnaXNCb3VuZCc6IGNtZC5pc0JvdW5kLFxuICAgICAgJ25nQ29udGVudEluZGV4JzogY21kLm5nQ29udGVudEluZGV4LFxuICAgICAgJ25hbWUnOiBjbWQubmFtZSxcbiAgICAgICdhdHRyTmFtZUFuZFZhbHVlcyc6IGNtZC5hdHRyTmFtZUFuZFZhbHVlcyxcbiAgICAgICdldmVudFRhcmdldEFuZE5hbWVzJzogY21kLmV2ZW50VGFyZ2V0QW5kTmFtZXMsXG4gICAgICAndGVtcGxhdGVJZCc6IGNtZC50ZW1wbGF0ZUlkXG4gICAgfTtcbiAgfVxuICB2aXNpdEVuZENvbXBvbmVudChjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4geydkZXNlcmlhbGl6ZXJJbmRleCc6IDV9OyB9XG4gIHZpc2l0RW1iZWRkZWRUZW1wbGF0ZShjbWQ6IFJlbmRlckVtYmVkZGVkVGVtcGxhdGVDbWQsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgdmFyIGNoaWxkcmVuID0gY21kLmNoaWxkcmVuLm1hcChjaGlsZCA9PiBjaGlsZC52aXNpdCh0aGlzLCBudWxsKSk7XG4gICAgcmV0dXJuIHtcbiAgICAgICdkZXNlcmlhbGl6ZXJJbmRleCc6IDYsXG4gICAgICAnaXNCb3VuZCc6IGNtZC5pc0JvdW5kLFxuICAgICAgJ25nQ29udGVudEluZGV4JzogY21kLm5nQ29udGVudEluZGV4LFxuICAgICAgJ25hbWUnOiBjbWQubmFtZSxcbiAgICAgICdhdHRyTmFtZUFuZFZhbHVlcyc6IGNtZC5hdHRyTmFtZUFuZFZhbHVlcyxcbiAgICAgICdldmVudFRhcmdldEFuZE5hbWVzJzogY21kLmV2ZW50VGFyZ2V0QW5kTmFtZXMsXG4gICAgICAnaXNNZXJnZWQnOiBjbWQuaXNNZXJnZWQsXG4gICAgICAnY2hpbGRyZW4nOiBjaGlsZHJlblxuICAgIH07XG4gIH1cbn1cblxudmFyIFJFTkRFUl9URU1QTEFURV9DTURfU0VSSUFMSVpFUiA9IG5ldyBSZW5kZXJUZW1wbGF0ZUNtZFNlcmlhbGl6ZXIoKTtcblxudmFyIFJFTkRFUl9URU1QTEFURV9DTURfREVTRVJJQUxJWkVSUyA9IFtcbiAgKGRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnl9KSA9PlxuICAgICAgbmV3IFdlYldvcmtlclRleHRDbWQoZGF0YVsnaXNCb3VuZCddLCBkYXRhWyduZ0NvbnRlbnRJbmRleCddLCBkYXRhWyd2YWx1ZSddKSxcbiAgKGRhdGE6IHtba2V5OiBzdHJpbmddOiBhbnl9KSA9PiBuZXcgV2ViV29ya2VyTmdDb250ZW50Q21kKGRhdGFbJ2luZGV4J10sIGRhdGFbJ25nQ29udGVudEluZGV4J10pLFxuICAoZGF0YToge1trZXk6IHN0cmluZ106IGFueX0pID0+XG4gICAgICBuZXcgV2ViV29ya2VyQmVnaW5FbGVtZW50Q21kKGRhdGFbJ2lzQm91bmQnXSwgZGF0YVsnbmdDb250ZW50SW5kZXgnXSwgZGF0YVsnbmFtZSddLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhWydhdHRyTmFtZUFuZFZhbHVlcyddLCBkYXRhWydldmVudFRhcmdldEFuZE5hbWVzJ10pLFxuICAoZGF0YToge1trZXk6IHN0cmluZ106IGFueX0pID0+IG5ldyBXZWJXb3JrZXJFbmRFbGVtZW50Q21kKCksXG4gIChkYXRhOiB7W2tleTogc3RyaW5nXTogYW55fSkgPT4gbmV3IFdlYldvcmtlckJlZ2luQ29tcG9uZW50Q21kKFxuICAgICAgZGF0YVsnaXNCb3VuZCddLCBkYXRhWyduZ0NvbnRlbnRJbmRleCddLCBkYXRhWyduYW1lJ10sIGRhdGFbJ2F0dHJOYW1lQW5kVmFsdWVzJ10sXG4gICAgICBkYXRhWydldmVudFRhcmdldEFuZE5hbWVzJ10sIGRhdGFbJ3RlbXBsYXRlSWQnXSksXG4gIChkYXRhOiB7W2tleTogc3RyaW5nXTogYW55fSkgPT4gbmV3IFdlYldvcmtlckVuZENvbXBvbmVudENtZCgpLFxuICAoZGF0YToge1trZXk6IHN0cmluZ106IGFueX0pID0+IG5ldyBXZWJXb3JrZXJFbWJlZGRlZFRlbXBsYXRlQ21kKFxuICAgICAgZGF0YVsnaXNCb3VuZCddLCBkYXRhWyduZ0NvbnRlbnRJbmRleCddLCBkYXRhWyduYW1lJ10sIGRhdGFbJ2F0dHJOYW1lQW5kVmFsdWVzJ10sXG4gICAgICBkYXRhWydldmVudFRhcmdldEFuZE5hbWVzJ10sIGRhdGFbJ2lzTWVyZ2VkJ10sXG4gICAgICAoPGFueVtdPmRhdGFbJ2NoaWxkcmVuJ10pLm1hcChjaGlsZERhdGEgPT4gZGVzZXJpYWxpemVUZW1wbGF0ZUNtZChjaGlsZERhdGEpKSksXG5dO1xuXG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9zZXJpYWxpemVyLnRzXG4gKiovIiwiaW1wb3J0IHtDT05TVF9FWFBSfSBmcm9tIFwiYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nXCI7XG5pbXBvcnQge09wYXF1ZVRva2VufSBmcm9tIFwiYW5ndWxhcjIvc3JjL2NvcmUvZGlcIjtcbmltcG9ydCB7XG4gIFJlbmRlckVsZW1lbnRSZWYsXG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlclRlbXBsYXRlQ21kLFxuICBSZW5kZXJUZXh0Q21kLFxuICBSZW5kZXJOZ0NvbnRlbnRDbWQsXG4gIFJlbmRlckJlZ2luRWxlbWVudENtZCxcbiAgUmVuZGVyQmVnaW5Db21wb25lbnRDbWQsXG4gIFJlbmRlckVtYmVkZGVkVGVtcGxhdGVDbWQsXG4gIFJlbmRlckNvbW1hbmRWaXNpdG9yXG59IGZyb20gXCJhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpXCI7XG5cbmV4cG9ydCBjb25zdCBPTl9XRUJfV09SS0VSID0gQ09OU1RfRVhQUihuZXcgT3BhcXVlVG9rZW4oJ1dlYldvcmtlci5vbldlYldvcmtlcicpKTtcblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlckVsZW1lbnRSZWYgaW1wbGVtZW50cyBSZW5kZXJFbGVtZW50UmVmIHtcbiAgY29uc3RydWN0b3IocHVibGljIHJlbmRlclZpZXc6IFJlbmRlclZpZXdSZWYsIHB1YmxpYyBib3VuZEVsZW1lbnRJbmRleDogbnVtYmVyKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgV2ViV29ya2VyVGVtcGxhdGVDbWQgaW1wbGVtZW50cyBSZW5kZXJUZW1wbGF0ZUNtZCB7XG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkgeyByZXR1cm4gbnVsbDsgfVxufVxuXG5leHBvcnQgY2xhc3MgV2ViV29ya2VyVGV4dENtZCBpbXBsZW1lbnRzIFJlbmRlclRleHRDbWQge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgaXNCb3VuZDogYm9vbGVhbiwgcHVibGljIG5nQ29udGVudEluZGV4OiBudW1iZXIsIHB1YmxpYyB2YWx1ZTogc3RyaW5nKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdFRleHQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlck5nQ29udGVudENtZCBpbXBsZW1lbnRzIFJlbmRlck5nQ29udGVudENtZCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpbmRleDogbnVtYmVyLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlcikge31cbiAgdmlzaXQodmlzaXRvcjogUmVuZGVyQ29tbWFuZFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXROZ0NvbnRlbnQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlckJlZ2luRWxlbWVudENtZCBpbXBsZW1lbnRzIFJlbmRlckJlZ2luRWxlbWVudENtZCB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBpc0JvdW5kOiBib29sZWFuLCBwdWJsaWMgbmdDb250ZW50SW5kZXg6IG51bWJlciwgcHVibGljIG5hbWU6IHN0cmluZyxcbiAgICAgICAgICAgICAgcHVibGljIGF0dHJOYW1lQW5kVmFsdWVzOiBzdHJpbmdbXSwgcHVibGljIGV2ZW50VGFyZ2V0QW5kTmFtZXM6IHN0cmluZ1tdKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdEJlZ2luRWxlbWVudCh0aGlzLCBjb250ZXh0KTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2ViV29ya2VyRW5kRWxlbWVudENtZCBpbXBsZW1lbnRzIFJlbmRlclRlbXBsYXRlQ21kIHtcbiAgdmlzaXQodmlzaXRvcjogUmVuZGVyQ29tbWFuZFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbmRFbGVtZW50KGNvbnRleHQpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBXZWJXb3JrZXJCZWdpbkNvbXBvbmVudENtZCBpbXBsZW1lbnRzIFJlbmRlckJlZ2luQ29tcG9uZW50Q21kIHtcbiAgY29uc3RydWN0b3IocHVibGljIGlzQm91bmQ6IGJvb2xlYW4sIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLCBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICBwdWJsaWMgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBwdWJsaWMgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgIHB1YmxpYyB0ZW1wbGF0ZUlkOiBzdHJpbmcpIHt9XG4gIHZpc2l0KHZpc2l0b3I6IFJlbmRlckNvbW1hbmRWaXNpdG9yLCBjb250ZXh0OiBhbnkpOiBhbnkge1xuICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QmVnaW5Db21wb25lbnQodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlckVuZENvbXBvbmVudENtZCBpbXBsZW1lbnRzIFJlbmRlclRlbXBsYXRlQ21kIHtcbiAgdmlzaXQodmlzaXRvcjogUmVuZGVyQ29tbWFuZFZpc2l0b3IsIGNvbnRleHQ6IGFueSk6IGFueSB7XG4gICAgcmV0dXJuIHZpc2l0b3IudmlzaXRFbmRDb21wb25lbnQoY29udGV4dCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlckVtYmVkZGVkVGVtcGxhdGVDbWQgaW1wbGVtZW50cyBSZW5kZXJFbWJlZGRlZFRlbXBsYXRlQ21kIHtcbiAgY29uc3RydWN0b3IocHVibGljIGlzQm91bmQ6IGJvb2xlYW4sIHB1YmxpYyBuZ0NvbnRlbnRJbmRleDogbnVtYmVyLCBwdWJsaWMgbmFtZTogc3RyaW5nLFxuICAgICAgICAgICAgICBwdWJsaWMgYXR0ck5hbWVBbmRWYWx1ZXM6IHN0cmluZ1tdLCBwdWJsaWMgZXZlbnRUYXJnZXRBbmROYW1lczogc3RyaW5nW10sXG4gICAgICAgICAgICAgIHB1YmxpYyBpc01lcmdlZDogYm9vbGVhbiwgcHVibGljIGNoaWxkcmVuOiBSZW5kZXJUZW1wbGF0ZUNtZFtdKSB7fVxuICB2aXNpdCh2aXNpdG9yOiBSZW5kZXJDb21tYW5kVmlzaXRvciwgY29udGV4dDogYW55KTogYW55IHtcbiAgICByZXR1cm4gdmlzaXRvci52aXNpdEVtYmVkZGVkVGVtcGxhdGUodGhpcywgY29udGV4dCk7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy93ZWJfd29ya2Vycy9zaGFyZWQvYXBpLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlLCBJbmplY3R9IGZyb20gXCJhbmd1bGFyMi9zcmMvY29yZS9kaVwiO1xuaW1wb3J0IHtSZW5kZXJQcm90b1ZpZXdSZWZ9IGZyb20gXCJhbmd1bGFyMi9zcmMvY29yZS9yZW5kZXIvYXBpXCI7XG5pbXBvcnQge09OX1dFQl9XT1JLRVJ9IGZyb20gXCJhbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL2FwaVwiO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVuZGVyUHJvdG9WaWV3UmVmU3RvcmUge1xuICBwcml2YXRlIF9sb29rdXBCeUluZGV4OiBNYXA8bnVtYmVyLCBSZW5kZXJQcm90b1ZpZXdSZWY+ID0gbmV3IE1hcDxudW1iZXIsIFJlbmRlclByb3RvVmlld1JlZj4oKTtcbiAgcHJpdmF0ZSBfbG9va3VwQnlQcm90b1ZpZXc6IE1hcDxSZW5kZXJQcm90b1ZpZXdSZWYsIG51bWJlcj4gPVxuICAgICAgbmV3IE1hcDxSZW5kZXJQcm90b1ZpZXdSZWYsIG51bWJlcj4oKTtcbiAgcHJpdmF0ZSBfbmV4dEluZGV4OiBudW1iZXIgPSAwO1xuICBwcml2YXRlIF9vbldlYndvcmtlcjogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE9OX1dFQl9XT1JLRVIpIG9uV2Vid29ya2VyKSB7IHRoaXMuX29uV2Vid29ya2VyID0gb25XZWJ3b3JrZXI7IH1cblxuICBhbGxvY2F0ZSgpOiBSZW5kZXJQcm90b1ZpZXdSZWYge1xuICAgIHZhciBpbmRleCA9IHRoaXMuX25leHRJbmRleCsrO1xuICAgIHZhciByZXN1bHQgPSBuZXcgV2ViV29ya2VyUmVuZGVyUHJvdG9WaWV3UmVmKGluZGV4KTtcbiAgICB0aGlzLnN0b3JlKHJlc3VsdCwgaW5kZXgpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBzdG9yZShyZWY6IFJlbmRlclByb3RvVmlld1JlZiwgaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2xvb2t1cEJ5UHJvdG9WaWV3LnNldChyZWYsIGluZGV4KTtcbiAgICB0aGlzLl9sb29rdXBCeUluZGV4LnNldChpbmRleCwgcmVmKTtcbiAgfVxuXG4gIGRlc2VyaWFsaXplKGluZGV4OiBudW1iZXIpOiBSZW5kZXJQcm90b1ZpZXdSZWYge1xuICAgIGlmIChpbmRleCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuX2xvb2t1cEJ5SW5kZXguZ2V0KGluZGV4KTtcbiAgfVxuXG4gIHNlcmlhbGl6ZShyZWY6IFJlbmRlclByb3RvVmlld1JlZik6IG51bWJlciB7XG4gICAgaWYgKHJlZiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKHRoaXMuX29uV2Vid29ya2VyKSB7XG4gICAgICByZXR1cm4gKDxXZWJXb3JrZXJSZW5kZXJQcm90b1ZpZXdSZWY+cmVmKS5yZWZOdW1iZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLl9sb29rdXBCeVByb3RvVmlldy5nZXQocmVmKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlclJlbmRlclByb3RvVmlld1JlZiBleHRlbmRzIFJlbmRlclByb3RvVmlld1JlZiB7XG4gIGNvbnN0cnVjdG9yKHB1YmxpYyByZWZOdW1iZXI6IG51bWJlcikgeyBzdXBlcigpOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL3JlbmRlcl9wcm90b192aWV3X3JlZl9zdG9yZS50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZSwgSW5qZWN0fSBmcm9tIFwiYW5ndWxhcjIvc3JjL2NvcmUvZGlcIjtcbmltcG9ydCB7XG4gIFJlbmRlclZpZXdSZWYsXG4gIFJlbmRlckZyYWdtZW50UmVmLFxuICBSZW5kZXJWaWV3V2l0aEZyYWdtZW50c1xufSBmcm9tIFwiYW5ndWxhcjIvc3JjL2NvcmUvcmVuZGVyL2FwaVwiO1xuaW1wb3J0IHtPTl9XRUJfV09SS0VSfSBmcm9tIFwiYW5ndWxhcjIvc3JjL3dlYl93b3JrZXJzL3NoYXJlZC9hcGlcIjtcbmltcG9ydCB7TWFwV3JhcHBlciwgTGlzdFdyYXBwZXJ9IGZyb20gXCJhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb25cIjtcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzU3RvcmUge1xuICBwcml2YXRlIF9uZXh0SW5kZXg6IG51bWJlciA9IDA7XG4gIHByaXZhdGUgX29uV2ViV29ya2VyOiBib29sZWFuO1xuICBwcml2YXRlIF9sb29rdXBCeUluZGV4OiBNYXA8bnVtYmVyLCBSZW5kZXJWaWV3UmVmIHwgUmVuZGVyRnJhZ21lbnRSZWY+O1xuICBwcml2YXRlIF9sb29rdXBCeVZpZXc6IE1hcDxSZW5kZXJWaWV3UmVmIHwgUmVuZGVyRnJhZ21lbnRSZWYsIG51bWJlcj47XG4gIHByaXZhdGUgX3ZpZXdGcmFnbWVudHM6IE1hcDxSZW5kZXJWaWV3UmVmLCBSZW5kZXJGcmFnbWVudFJlZltdPjtcblxuICBjb25zdHJ1Y3RvcihASW5qZWN0KE9OX1dFQl9XT1JLRVIpIG9uV2ViV29ya2VyKSB7XG4gICAgdGhpcy5fb25XZWJXb3JrZXIgPSBvbldlYldvcmtlcjtcbiAgICB0aGlzLl9sb29rdXBCeUluZGV4ID0gbmV3IE1hcDxudW1iZXIsIFJlbmRlclZpZXdSZWYgfCBSZW5kZXJGcmFnbWVudFJlZj4oKTtcbiAgICB0aGlzLl9sb29rdXBCeVZpZXcgPSBuZXcgTWFwPFJlbmRlclZpZXdSZWYgfCBSZW5kZXJGcmFnbWVudFJlZiwgbnVtYmVyPigpO1xuICAgIHRoaXMuX3ZpZXdGcmFnbWVudHMgPSBuZXcgTWFwPFJlbmRlclZpZXdSZWYsIFJlbmRlckZyYWdtZW50UmVmW10+KCk7XG4gIH1cblxuICBhbGxvY2F0ZShmcmFnbWVudENvdW50OiBudW1iZXIpOiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyB7XG4gICAgdmFyIGluaXRpYWxJbmRleCA9IHRoaXMuX25leHRJbmRleDtcblxuICAgIHZhciB2aWV3UmVmID0gbmV3IFdlYldvcmtlclJlbmRlclZpZXdSZWYodGhpcy5fbmV4dEluZGV4KyspO1xuICAgIHZhciBmcmFnbWVudFJlZnMgPSBMaXN0V3JhcHBlci5jcmVhdGVHcm93YWJsZVNpemUoZnJhZ21lbnRDb3VudCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZyYWdtZW50Q291bnQ7IGkrKykge1xuICAgICAgZnJhZ21lbnRSZWZzW2ldID0gbmV3IFdlYldvcmtlclJlbmRlckZyYWdtZW50UmVmKHRoaXMuX25leHRJbmRleCsrKTtcbiAgICB9XG4gICAgdmFyIHJlbmRlclZpZXdXaXRoRnJhZ21lbnRzID0gbmV3IFJlbmRlclZpZXdXaXRoRnJhZ21lbnRzKHZpZXdSZWYsIGZyYWdtZW50UmVmcyk7XG4gICAgdGhpcy5zdG9yZShyZW5kZXJWaWV3V2l0aEZyYWdtZW50cywgaW5pdGlhbEluZGV4KTtcbiAgICByZXR1cm4gcmVuZGVyVmlld1dpdGhGcmFnbWVudHM7XG4gIH1cblxuICBzdG9yZSh2aWV3OiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cywgc3RhcnRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgdGhpcy5fbG9va3VwQnlJbmRleC5zZXQoc3RhcnRJbmRleCwgdmlldy52aWV3UmVmKTtcbiAgICB0aGlzLl9sb29rdXBCeVZpZXcuc2V0KHZpZXcudmlld1JlZiwgc3RhcnRJbmRleCk7XG4gICAgc3RhcnRJbmRleCsrO1xuXG4gICAgdmlldy5mcmFnbWVudFJlZnMuZm9yRWFjaChyZWYgPT4ge1xuICAgICAgdGhpcy5fbG9va3VwQnlJbmRleC5zZXQoc3RhcnRJbmRleCwgcmVmKTtcbiAgICAgIHRoaXMuX2xvb2t1cEJ5Vmlldy5zZXQocmVmLCBzdGFydEluZGV4KTtcbiAgICAgIHN0YXJ0SW5kZXgrKztcbiAgICB9KTtcblxuICAgIHRoaXMuX3ZpZXdGcmFnbWVudHMuc2V0KHZpZXcudmlld1JlZiwgdmlldy5mcmFnbWVudFJlZnMpO1xuICB9XG5cbiAgcmVtb3ZlKHZpZXc6IFJlbmRlclZpZXdSZWYpOiB2b2lkIHtcbiAgICB0aGlzLl9yZW1vdmVSZWYodmlldyk7XG4gICAgdmFyIGZyYWdtZW50cyA9IHRoaXMuX3ZpZXdGcmFnbWVudHMuZ2V0KHZpZXcpO1xuICAgIGZyYWdtZW50cy5mb3JFYWNoKChmcmFnbWVudCkgPT4geyB0aGlzLl9yZW1vdmVSZWYoZnJhZ21lbnQpOyB9KTtcbiAgICB0aGlzLl92aWV3RnJhZ21lbnRzLmRlbGV0ZSh2aWV3KTtcbiAgfVxuXG4gIHByaXZhdGUgX3JlbW92ZVJlZihyZWY6IFJlbmRlclZpZXdSZWYgfCBSZW5kZXJGcmFnbWVudFJlZikge1xuICAgIHZhciBpbmRleCA9IHRoaXMuX2xvb2t1cEJ5Vmlldy5nZXQocmVmKTtcbiAgICB0aGlzLl9sb29rdXBCeVZpZXcuZGVsZXRlKHJlZik7XG4gICAgdGhpcy5fbG9va3VwQnlJbmRleC5kZWxldGUoaW5kZXgpO1xuICB9XG5cbiAgc2VyaWFsaXplUmVuZGVyVmlld1JlZih2aWV3UmVmOiBSZW5kZXJWaWV3UmVmKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplUmVuZGVyRnJhZ21lbnRPclZpZXdSZWYodmlld1JlZik7XG4gIH1cblxuICBzZXJpYWxpemVSZW5kZXJGcmFnbWVudFJlZihmcmFnbWVudFJlZjogUmVuZGVyRnJhZ21lbnRSZWYpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zZXJpYWxpemVSZW5kZXJGcmFnbWVudE9yVmlld1JlZihmcmFnbWVudFJlZik7XG4gIH1cblxuICBkZXNlcmlhbGl6ZVJlbmRlclZpZXdSZWYocmVmOiBudW1iZXIpOiBSZW5kZXJWaWV3UmVmIHtcbiAgICBpZiAocmVmID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXRyaWV2ZShyZWYpO1xuICB9XG5cbiAgZGVzZXJpYWxpemVSZW5kZXJGcmFnbWVudFJlZihyZWY6IG51bWJlcik6IFJlbmRlckZyYWdtZW50UmVmIHtcbiAgICBpZiAocmVmID09IG51bGwpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9yZXRyaWV2ZShyZWYpO1xuICB9XG5cbiAgcHJpdmF0ZSBfcmV0cmlldmUocmVmOiBudW1iZXIpOiBSZW5kZXJWaWV3UmVmIHwgUmVuZGVyRnJhZ21lbnRSZWYge1xuICAgIGlmIChyZWYgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl9sb29rdXBCeUluZGV4LmhhcyhyZWYpKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fbG9va3VwQnlJbmRleC5nZXQocmVmKTtcbiAgfVxuXG5cbiAgcHJpdmF0ZSBfc2VyaWFsaXplUmVuZGVyRnJhZ21lbnRPclZpZXdSZWYocmVmOiBSZW5kZXJWaWV3UmVmIHwgUmVuZGVyRnJhZ21lbnRSZWYpOiBudW1iZXIge1xuICAgIGlmIChyZWYgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX29uV2ViV29ya2VyKSB7XG4gICAgICByZXR1cm4gKDxXZWJXb3JrZXJSZW5kZXJGcmFnbWVudFJlZiB8IFdlYldvcmtlclJlbmRlclZpZXdSZWY+cmVmKS5zZXJpYWxpemUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX2xvb2t1cEJ5Vmlldy5nZXQocmVmKTtcbiAgICB9XG4gIH1cblxuICBzZXJpYWxpemVWaWV3V2l0aEZyYWdtZW50cyh2aWV3OiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyk6IHtba2V5OiBzdHJpbmddOiBhbnl9IHtcbiAgICBpZiAodmlldyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fb25XZWJXb3JrZXIpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgICd2aWV3UmVmJzogKDxXZWJXb3JrZXJSZW5kZXJWaWV3UmVmPnZpZXcudmlld1JlZikuc2VyaWFsaXplKCksXG4gICAgICAgICdmcmFnbWVudFJlZnMnOiB2aWV3LmZyYWdtZW50UmVmcy5tYXAodmFsID0+ICg8YW55PnZhbCkuc2VyaWFsaXplKCkpXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICAndmlld1JlZic6IHRoaXMuX2xvb2t1cEJ5Vmlldy5nZXQodmlldy52aWV3UmVmKSxcbiAgICAgICAgJ2ZyYWdtZW50UmVmcyc6IHZpZXcuZnJhZ21lbnRSZWZzLm1hcCh2YWwgPT4gdGhpcy5fbG9va3VwQnlWaWV3LmdldCh2YWwpKVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBkZXNlcmlhbGl6ZVZpZXdXaXRoRnJhZ21lbnRzKG9iajoge1trZXk6IHN0cmluZ106IGFueX0pOiBSZW5kZXJWaWV3V2l0aEZyYWdtZW50cyB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICB2YXIgdmlld1JlZiA9IHRoaXMuZGVzZXJpYWxpemVSZW5kZXJWaWV3UmVmKG9ialsndmlld1JlZiddKTtcbiAgICB2YXIgZnJhZ21lbnRzID0gKDxhbnlbXT5vYmpbJ2ZyYWdtZW50UmVmcyddKS5tYXAodmFsID0+IHRoaXMuZGVzZXJpYWxpemVSZW5kZXJGcmFnbWVudFJlZih2YWwpKTtcblxuICAgIHJldHVybiBuZXcgUmVuZGVyVmlld1dpdGhGcmFnbWVudHModmlld1JlZiwgZnJhZ21lbnRzKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgV2ViV29ya2VyUmVuZGVyVmlld1JlZiBleHRlbmRzIFJlbmRlclZpZXdSZWYge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmTnVtYmVyOiBudW1iZXIpIHsgc3VwZXIoKTsgfVxuICBzZXJpYWxpemUoKTogbnVtYmVyIHsgcmV0dXJuIHRoaXMucmVmTnVtYmVyOyB9XG5cbiAgc3RhdGljIGRlc2VyaWFsaXplKHJlZjogbnVtYmVyKTogV2ViV29ya2VyUmVuZGVyVmlld1JlZiB7XG4gICAgcmV0dXJuIG5ldyBXZWJXb3JrZXJSZW5kZXJWaWV3UmVmKHJlZik7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFdlYldvcmtlclJlbmRlckZyYWdtZW50UmVmIGV4dGVuZHMgUmVuZGVyRnJhZ21lbnRSZWYge1xuICBjb25zdHJ1Y3RvcihwdWJsaWMgcmVmTnVtYmVyOiBudW1iZXIpIHsgc3VwZXIoKTsgfVxuXG4gIHNlcmlhbGl6ZSgpOiBudW1iZXIgeyByZXR1cm4gdGhpcy5yZWZOdW1iZXI7IH1cblxuICBzdGF0aWMgZGVzZXJpYWxpemUocmVmOiBudW1iZXIpOiBXZWJXb3JrZXJSZW5kZXJGcmFnbWVudFJlZiB7XG4gICAgcmV0dXJuIG5ldyBXZWJXb3JrZXJSZW5kZXJGcmFnbWVudFJlZihyZWYpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvd2ViX3dvcmtlcnMvc2hhcmVkL3JlbmRlcl92aWV3X3dpdGhfZnJhZ21lbnRzX3N0b3JlLnRzXG4gKiovIiwiaW1wb3J0IHtET019IGZyb20gJ2FuZ3VsYXIyL3NyYy9wbGF0Zm9ybS9kb20vZG9tX2FkYXB0ZXInO1xuaW1wb3J0IHtnbG9iYWwsIGlzU3RyaW5nfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtTdHJpbmdNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuXG4vKipcbiAqIEphc21pbmUgbWF0Y2hlcnMgdGhhdCBjaGVjayBBbmd1bGFyIHNwZWNpZmljIGNvbmRpdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTmdNYXRjaGVycyBleHRlbmRzIGphc21pbmUuTWF0Y2hlcnMge1xuICAvKipcbiAgICogRXhwZWN0IHRoZSB2YWx1ZSB0byBiZSBhIGBQcm9taXNlYC5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvQmVQcm9taXNlJ31cbiAgICovXG4gIHRvQmVQcm9taXNlKCk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV4cGVjdCB0aGUgdmFsdWUgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgYSBjbGFzcy5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvQmVBbkluc3RhbmNlT2YnfVxuICAgKi9cbiAgdG9CZUFuSW5zdGFuY2VPZihleHBlY3RlZDogYW55KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXhwZWN0IHRoZSBlbGVtZW50IHRvIGhhdmUgZXhhY3RseSB0aGUgZ2l2ZW4gdGV4dC5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvSGF2ZVRleHQnfVxuICAgKi9cbiAgdG9IYXZlVGV4dChleHBlY3RlZDogYW55KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXhwZWN0IHRoZSBlbGVtZW50IHRvIGhhdmUgdGhlIGdpdmVuIENTUyBjbGFzcy5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvSGF2ZUNzc0NsYXNzJ31cbiAgICovXG4gIHRvSGF2ZUNzc0NsYXNzKGV4cGVjdGVkOiBhbnkpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHBlY3QgdGhlIGVsZW1lbnQgdG8gaGF2ZSB0aGUgZ2l2ZW4gQ1NTIHN0eWxlcy5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvSGF2ZUNzc1N0eWxlJ31cbiAgICovXG4gIHRvSGF2ZUNzc1N0eWxlKGV4cGVjdGVkOiBhbnkpOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBFeHBlY3QgYSBjbGFzcyB0byBpbXBsZW1lbnQgdGhlIGludGVyZmFjZSBvZiB0aGUgZ2l2ZW4gY2xhc3MuXG4gICAqXG4gICAqICMjIEV4YW1wbGVcbiAgICpcbiAgICoge0BleGFtcGxlIHRlc3RpbmcvdHMvbWF0Y2hlcnMudHMgcmVnaW9uPSd0b0ltcGxlbWVudCd9XG4gICAqL1xuICB0b0ltcGxlbWVudChleHBlY3RlZDogYW55KTogYm9vbGVhbjtcblxuICAvKipcbiAgICogRXhwZWN0IGFuIGV4Y2VwdGlvbiB0byBjb250YWluIHRoZSBnaXZlbiBlcnJvciB0ZXh0LlxuICAgKlxuICAgKiAjIyBFeGFtcGxlXG4gICAqXG4gICAqIHtAZXhhbXBsZSB0ZXN0aW5nL3RzL21hdGNoZXJzLnRzIHJlZ2lvbj0ndG9Db250YWluRXJyb3InfVxuICAgKi9cbiAgdG9Db250YWluRXJyb3IoZXhwZWN0ZWQ6IGFueSk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEV4cGVjdCBhIGZ1bmN0aW9uIHRvIHRocm93IGFuIGVycm9yIHdpdGggdGhlIGdpdmVuIGVycm9yIHRleHQgd2hlbiBleGVjdXRlZC5cbiAgICpcbiAgICogIyMgRXhhbXBsZVxuICAgKlxuICAgKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvVGhyb3dFcnJvcldpdGgnfVxuICAgKi9cbiAgdG9UaHJvd0Vycm9yV2l0aChleHBlY3RlZE1lc3NhZ2U6IGFueSk6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEludmVydCB0aGUgbWF0Y2hlcnMuXG4gICAqL1xuICBub3Q6IE5nTWF0Y2hlcnM7XG59XG5cbnZhciBfZ2xvYmFsOiBqYXNtaW5lLkdsb2JhbFBvbGx1dGVyID0gPGFueT4odHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWwgOiB3aW5kb3cpO1xuXG4vKipcbiAqIEphc21pbmUgbWF0Y2hpbmcgZnVuY3Rpb24gd2l0aCBBbmd1bGFyIG1hdGNoZXJzIG1peGVkIGluLlxuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy9tYXRjaGVycy50cyByZWdpb249J3RvSGF2ZVRleHQnfVxuICovXG5leHBvcnQgdmFyIGV4cGVjdDogKGFjdHVhbDogYW55KSA9PiBOZ01hdGNoZXJzID0gPGFueT5fZ2xvYmFsLmV4cGVjdDtcblxuXG4vLyBTb21lIE1hcCBwb2x5ZmlsbHMgZG9uJ3QgcG9seWZpbGwgTWFwLnRvU3RyaW5nIGNvcnJlY3RseSwgd2hpY2hcbi8vIGdpdmVzIHVzIGJhZCBlcnJvciBtZXNzYWdlcyBpbiB0ZXN0cy5cbi8vIFRoZSBvbmx5IHdheSB0byBkbyB0aGlzIGluIEphc21pbmUgaXMgdG8gbW9ua2V5IHBhdGNoIGEgbWV0aG9kXG4vLyB0byB0aGUgb2JqZWN0IDotKFxuTWFwLnByb3RvdHlwZVsnamFzbWluZVRvU3RyaW5nJ10gPSBmdW5jdGlvbigpIHtcbiAgdmFyIG0gPSB0aGlzO1xuICBpZiAoIW0pIHtcbiAgICByZXR1cm4gJycgKyBtO1xuICB9XG4gIHZhciByZXMgPSBbXTtcbiAgbS5mb3JFYWNoKCh2LCBrKSA9PiB7IHJlcy5wdXNoKGAke2t9OiR7dn1gKTsgfSk7XG4gIHJldHVybiBgeyAke3Jlcy5qb2luKCcsJyl9IH1gO1xufTtcblxuX2dsb2JhbC5iZWZvcmVFYWNoKGZ1bmN0aW9uKCkge1xuICBqYXNtaW5lLmFkZE1hdGNoZXJzKHtcbiAgICAvLyBDdXN0b20gaGFuZGxlciBmb3IgTWFwIGFzIEphc21pbmUgZG9lcyBub3Qgc3VwcG9ydCBpdCB5ZXRcbiAgICB0b0VxdWFsOiBmdW5jdGlvbih1dGlsLCBjdXN0b21FcXVhbGl0eVRlc3RlcnMpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgICAgICAgICByZXR1cm4ge3Bhc3M6IHV0aWwuZXF1YWxzKGFjdHVhbCwgZXhwZWN0ZWQsIFtjb21wYXJlTWFwXSl9O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBmdW5jdGlvbiBjb21wYXJlTWFwKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgICAgICAgaWYgKGFjdHVhbCBpbnN0YW5jZW9mIE1hcCkge1xuICAgICAgICAgIHZhciBwYXNzID0gYWN0dWFsLnNpemUgPT09IGV4cGVjdGVkLnNpemU7XG4gICAgICAgICAgaWYgKHBhc3MpIHtcbiAgICAgICAgICAgIGFjdHVhbC5mb3JFYWNoKCh2LCBrKSA9PiB7IHBhc3MgPSBwYXNzICYmIHV0aWwuZXF1YWxzKHYsIGV4cGVjdGVkLmdldChrKSk7IH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcGFzcztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSxcblxuICAgIHRvQmVQcm9taXNlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uKGFjdHVhbCwgZXhwZWN0ZWRDbGFzcykge1xuICAgICAgICAgIHZhciBwYXNzID0gdHlwZW9mIGFjdHVhbCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIGFjdHVhbC50aGVuID09PSAnZnVuY3Rpb24nO1xuICAgICAgICAgIHJldHVybiB7cGFzczogcGFzcywgZ2V0IG1lc3NhZ2UoKSB7IHJldHVybiAnRXhwZWN0ZWQgJyArIGFjdHVhbCArICcgdG8gYmUgYSBwcm9taXNlJzsgfX07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcblxuICAgIHRvQmVBbkluc3RhbmNlT2Y6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tcGFyZTogZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZENsYXNzKSB7XG4gICAgICAgICAgdmFyIHBhc3MgPSB0eXBlb2YgYWN0dWFsID09PSAnb2JqZWN0JyAmJiBhY3R1YWwgaW5zdGFuY2VvZiBleHBlY3RlZENsYXNzO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYXNzOiBwYXNzLFxuICAgICAgICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgICAgICAgIHJldHVybiAnRXhwZWN0ZWQgJyArIGFjdHVhbCArICcgdG8gYmUgYW4gaW5zdGFuY2Ugb2YgJyArIGV4cGVjdGVkQ2xhc3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgdG9IYXZlVGV4dDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWwsIGV4cGVjdGVkVGV4dCkge1xuICAgICAgICAgIHZhciBhY3R1YWxUZXh0ID0gZWxlbWVudFRleHQoYWN0dWFsKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGFzczogYWN0dWFsVGV4dCA9PSBleHBlY3RlZFRleHQsXG4gICAgICAgICAgICBnZXQgbWVzc2FnZSgpIHsgcmV0dXJuICdFeHBlY3RlZCAnICsgYWN0dWFsVGV4dCArICcgdG8gYmUgZXF1YWwgdG8gJyArIGV4cGVjdGVkVGV4dDsgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcblxuICAgIHRvSGF2ZUNzc0NsYXNzOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7Y29tcGFyZTogYnVpbGRFcnJvcihmYWxzZSksIG5lZ2F0aXZlQ29tcGFyZTogYnVpbGRFcnJvcih0cnVlKX07XG5cbiAgICAgIGZ1bmN0aW9uIGJ1aWxkRXJyb3IoaXNOb3QpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFjdHVhbCwgY2xhc3NOYW1lKSB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhc3M6IERPTS5oYXNDbGFzcyhhY3R1YWwsIGNsYXNzTmFtZSkgPT0gIWlzTm90LFxuICAgICAgICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgICAgICAgIHJldHVybiBgRXhwZWN0ZWQgJHthY3R1YWwub3V0ZXJIVE1MfSAke2lzTm90ID8gJ25vdCAnIDogJyd9dG8gY29udGFpbiB0aGUgQ1NTIGNsYXNzIFwiJHtjbGFzc05hbWV9XCJgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9XG4gICAgfSxcblxuICAgIHRvSGF2ZUNzc1N0eWxlOiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNvbXBhcmU6IGZ1bmN0aW9uKGFjdHVhbCwgc3R5bGVzKSB7XG4gICAgICAgICAgdmFyIGFsbFBhc3NlZDtcbiAgICAgICAgICBpZiAoaXNTdHJpbmcoc3R5bGVzKSkge1xuICAgICAgICAgICAgYWxsUGFzc2VkID0gRE9NLmhhc1N0eWxlKGFjdHVhbCwgc3R5bGVzKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWxsUGFzc2VkID0gIVN0cmluZ01hcFdyYXBwZXIuaXNFbXB0eShzdHlsZXMpO1xuICAgICAgICAgICAgU3RyaW5nTWFwV3JhcHBlci5mb3JFYWNoKHN0eWxlcywgKHN0eWxlLCBwcm9wKSA9PiB7XG4gICAgICAgICAgICAgIGFsbFBhc3NlZCA9IGFsbFBhc3NlZCAmJiBET00uaGFzU3R5bGUoYWN0dWFsLCBwcm9wLCBzdHlsZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGFzczogYWxsUGFzc2VkLFxuICAgICAgICAgICAgZ2V0IG1lc3NhZ2UoKSB7XG4gICAgICAgICAgICAgIHZhciBleHBlY3RlZFZhbHVlU3RyID0gaXNTdHJpbmcoc3R5bGVzKSA/IHN0eWxlcyA6IEpTT04uc3RyaW5naWZ5KHN0eWxlcyk7XG4gICAgICAgICAgICAgIHJldHVybiBgRXhwZWN0ZWQgJHthY3R1YWwub3V0ZXJIVE1MfSAkeyFhbGxQYXNzZWQgPyAnICcgOiAnbm90ICd9dG8gY29udGFpbiB0aGVcbiAgICAgICAgICAgICAgICAgICAgICBDU1MgJHtpc1N0cmluZyhzdHlsZXMpID8gJ3Byb3BlcnR5JyA6ICdzdHlsZXMnfSBcIiR7ZXhwZWN0ZWRWYWx1ZVN0cn1cImA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9LFxuXG4gICAgdG9Db250YWluRXJyb3I6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tcGFyZTogZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZFRleHQpIHtcbiAgICAgICAgICB2YXIgZXJyb3JNZXNzYWdlID0gYWN0dWFsLnRvU3RyaW5nKCk7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhc3M6IGVycm9yTWVzc2FnZS5pbmRleE9mKGV4cGVjdGVkVGV4dCkgPiAtMSxcbiAgICAgICAgICAgIGdldCBtZXNzYWdlKCkgeyByZXR1cm4gJ0V4cGVjdGVkICcgKyBlcnJvck1lc3NhZ2UgKyAnIHRvIGNvbnRhaW4gJyArIGV4cGVjdGVkVGV4dDsgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSxcblxuICAgIHRvVGhyb3dFcnJvcldpdGg6IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgY29tcGFyZTogZnVuY3Rpb24oYWN0dWFsLCBleHBlY3RlZFRleHQpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYWN0dWFsKCk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICBwYXNzOiBmYWxzZSxcbiAgICAgICAgICAgICAgZ2V0IG1lc3NhZ2UoKSB7IHJldHVybiBcIldhcyBleHBlY3RlZCB0byB0aHJvdywgYnV0IGRpZCBub3QgdGhyb3dcIjsgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB2YXIgZXJyb3JNZXNzYWdlID0gZS50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcGFzczogZXJyb3JNZXNzYWdlLmluZGV4T2YoZXhwZWN0ZWRUZXh0KSA+IC0xLFxuICAgICAgICAgICAgICBnZXQgbWVzc2FnZSgpIHsgcmV0dXJuICdFeHBlY3RlZCAnICsgZXJyb3JNZXNzYWdlICsgJyB0byBjb250YWluICcgKyBleHBlY3RlZFRleHQ7IH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0sXG5cbiAgICB0b0ltcGxlbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjb21wYXJlOiBmdW5jdGlvbihhY3R1YWxPYmplY3QsIGV4cGVjdGVkSW50ZXJmYWNlKSB7XG4gICAgICAgICAgdmFyIG9ialByb3BzID0gT2JqZWN0LmtleXMoYWN0dWFsT2JqZWN0LmNvbnN0cnVjdG9yLnByb3RvdHlwZSk7XG4gICAgICAgICAgdmFyIGludFByb3BzID0gT2JqZWN0LmtleXMoZXhwZWN0ZWRJbnRlcmZhY2UucHJvdG90eXBlKTtcblxuICAgICAgICAgIHZhciBtaXNzZWRNZXRob2RzID0gW107XG4gICAgICAgICAgaW50UHJvcHMuZm9yRWFjaCgoaykgPT4ge1xuICAgICAgICAgICAgaWYgKCFhY3R1YWxPYmplY3QuY29uc3RydWN0b3IucHJvdG90eXBlW2tdKSBtaXNzZWRNZXRob2RzLnB1c2goayk7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcGFzczogbWlzc2VkTWV0aG9kcy5sZW5ndGggPT0gMCxcbiAgICAgICAgICAgIGdldCBtZXNzYWdlKCkge1xuICAgICAgICAgICAgICByZXR1cm4gJ0V4cGVjdGVkICcgKyBhY3R1YWxPYmplY3QgKyAnIHRvIGhhdmUgdGhlIGZvbGxvd2luZyBtZXRob2RzOiAnICtcbiAgICAgICAgICAgICAgICAgICAgIG1pc3NlZE1ldGhvZHMuam9pbihcIiwgXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICB9KTtcbn0pO1xuXG5mdW5jdGlvbiBlbGVtZW50VGV4dChuKSB7XG4gIHZhciBoYXNOb2RlcyA9IChuKSA9PiB7XG4gICAgdmFyIGNoaWxkcmVuID0gRE9NLmNoaWxkTm9kZXMobik7XG4gICAgcmV0dXJuIGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCA+IDA7XG4gIH07XG5cbiAgaWYgKG4gaW5zdGFuY2VvZiBBcnJheSkge1xuICAgIHJldHVybiBuLm1hcChlbGVtZW50VGV4dCkuam9pbihcIlwiKTtcbiAgfVxuXG4gIGlmIChET00uaXNDb21tZW50Tm9kZShuKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIGlmIChET00uaXNFbGVtZW50Tm9kZShuKSAmJiBET00udGFnTmFtZShuKSA9PSAnQ09OVEVOVCcpIHtcbiAgICByZXR1cm4gZWxlbWVudFRleHQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KERPTS5nZXREaXN0cmlidXRlZE5vZGVzKG4pKSk7XG4gIH1cblxuICBpZiAoRE9NLmhhc1NoYWRvd1Jvb3QobikpIHtcbiAgICByZXR1cm4gZWxlbWVudFRleHQoRE9NLmNoaWxkTm9kZXNBc0xpc3QoRE9NLmdldFNoYWRvd1Jvb3QobikpKTtcbiAgfVxuXG4gIGlmIChoYXNOb2RlcyhuKSkge1xuICAgIHJldHVybiBlbGVtZW50VGV4dChET00uY2hpbGROb2Rlc0FzTGlzdChuKSk7XG4gIH1cblxuICByZXR1cm4gRE9NLmdldFRleHQobik7XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdGVzdGluZy9tYXRjaGVycy50c1xuICoqLyIsImltcG9ydCB7Z2xvYmFsfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtMaXN0V3JhcHBlcn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9jb2xsZWN0aW9uJztcbmltcG9ydCB7Tmdab25lWm9uZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvem9uZS9uZ196b25lJztcblxudmFyIF9zY2hlZHVsZXI7XG52YXIgX21pY3JvdGFza3M6IEZ1bmN0aW9uW10gPSBbXTtcbnZhciBfcGVuZGluZ1BlcmlvZGljVGltZXJzOiBudW1iZXJbXSA9IFtdO1xudmFyIF9wZW5kaW5nVGltZXJzOiBudW1iZXJbXSA9IFtdO1xuXG5pbnRlcmZhY2UgRmFrZUFzeW5jWm9uZSBleHRlbmRzIE5nWm9uZVpvbmUge1xuICBfaW5GYWtlQXN5bmNab25lOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFdyYXBzIGEgZnVuY3Rpb24gdG8gYmUgZXhlY3V0ZWQgaW4gdGhlIGZha2VBc3luYyB6b25lOlxuICogLSBtaWNyb3Rhc2tzIGFyZSBtYW51YWxseSBleGVjdXRlZCBieSBjYWxsaW5nIGBmbHVzaE1pY3JvdGFza3MoKWAsXG4gKiAtIHRpbWVycyBhcmUgc3luY2hyb25vdXMsIGB0aWNrKClgIHNpbXVsYXRlcyB0aGUgYXN5bmNocm9ub3VzIHBhc3NhZ2Ugb2YgdGltZS5cbiAqXG4gKiBJZiB0aGVyZSBhcmUgYW55IHBlbmRpbmcgdGltZXJzIGF0IHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLCBhbiBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uXG4gKlxuICogIyMgRXhhbXBsZVxuICpcbiAqIHtAZXhhbXBsZSB0ZXN0aW5nL3RzL2Zha2VfYXN5bmMudHMgcmVnaW9uPSdiYXNpYyd9XG4gKlxuICogQHBhcmFtIGZuXG4gKiBAcmV0dXJucyB7RnVuY3Rpb259IFRoZSBmdW5jdGlvbiB3cmFwcGVkIHRvIGJlIGV4ZWN1dGVkIGluIHRoZSBmYWtlQXN5bmMgem9uZVxuICovXG5leHBvcnQgZnVuY3Rpb24gZmFrZUFzeW5jKGZuOiBGdW5jdGlvbik6IEZ1bmN0aW9uIHtcbiAgaWYgKCg8RmFrZUFzeW5jWm9uZT5nbG9iYWwuem9uZSkuX2luRmFrZUFzeW5jWm9uZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignZmFrZUFzeW5jKCkgY2FsbHMgY2FuIG5vdCBiZSBuZXN0ZWQnKTtcbiAgfVxuXG4gIHZhciBmYWtlQXN5bmNab25lID0gPEZha2VBc3luY1pvbmU+Z2xvYmFsLnpvbmUuZm9yayh7XG4gICAgc2V0VGltZW91dDogX3NldFRpbWVvdXQsXG4gICAgY2xlYXJUaW1lb3V0OiBfY2xlYXJUaW1lb3V0LFxuICAgIHNldEludGVydmFsOiBfc2V0SW50ZXJ2YWwsXG4gICAgY2xlYXJJbnRlcnZhbDogX2NsZWFySW50ZXJ2YWwsXG4gICAgc2NoZWR1bGVNaWNyb3Rhc2s6IF9zY2hlZHVsZU1pY3JvdGFzayxcbiAgICBfaW5GYWtlQXN5bmNab25lOiB0cnVlXG4gIH0pO1xuXG4gIHJldHVybiBmdW5jdGlvbiguLi5hcmdzKSB7XG4gICAgLy8gVE9ETyh0Ym9zY2gpOiBUaGlzIGNsYXNzIHNob3VsZCBhbHJlYWR5IGJlIHBhcnQgb2YgdGhlIGphc21pbmUgdHlwaW5ncyBidXQgaXQgaXMgbm90Li4uXG4gICAgX3NjaGVkdWxlciA9IG5ldyAoPGFueT5qYXNtaW5lKS5EZWxheWVkRnVuY3Rpb25TY2hlZHVsZXIoKTtcbiAgICBjbGVhclBlbmRpbmdUaW1lcnMoKTtcblxuICAgIGxldCByZXMgPSBmYWtlQXN5bmNab25lLnJ1bigoKSA9PiB7XG4gICAgICBsZXQgcmVzID0gZm4oLi4uYXJncyk7XG4gICAgICBmbHVzaE1pY3JvdGFza3MoKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfSk7XG5cbiAgICBpZiAoX3BlbmRpbmdQZXJpb2RpY1RpbWVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihcbiAgICAgICAgICBgJHtfcGVuZGluZ1BlcmlvZGljVGltZXJzLmxlbmd0aH0gcGVyaW9kaWMgdGltZXIocykgc3RpbGwgaW4gdGhlIHF1ZXVlLmApO1xuICAgIH1cblxuICAgIGlmIChfcGVuZGluZ1RpbWVycy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgJHtfcGVuZGluZ1RpbWVycy5sZW5ndGh9IHRpbWVyKHMpIHN0aWxsIGluIHRoZSBxdWV1ZS5gKTtcbiAgICB9XG5cbiAgICBfc2NoZWR1bGVyID0gbnVsbDtcbiAgICBMaXN0V3JhcHBlci5jbGVhcihfbWljcm90YXNrcyk7XG5cbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbi8qKlxuICogQ2xlYXIgdGhlIHF1ZXVlIG9mIHBlbmRpbmcgdGltZXJzIGFuZCBtaWNyb3Rhc2tzLlxuICpcbiAqIFVzZWZ1bCBmb3IgY2xlYW5pbmcgdXAgYWZ0ZXIgYW4gYXN5bmNocm9ub3VzIHRlc3QgcGFzc2VzLlxuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy9mYWtlX2FzeW5jLnRzIHJlZ2lvbj0ncGVuZGluZyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGVhclBlbmRpbmdUaW1lcnMoKTogdm9pZCB7XG4gIC8vIFRPRE8gd2Ugc2hvdWxkIGZpeCB0aWNrIHRvIGRlcXVldWUgdGhlIGZhaWxlZCB0aW1lciBpbnN0ZWFkIG9mIHJlbHlpbmcgb24gY2xlYXJQZW5kaW5nVGltZXJzXG4gIExpc3RXcmFwcGVyLmNsZWFyKF9taWNyb3Rhc2tzKTtcbiAgTGlzdFdyYXBwZXIuY2xlYXIoX3BlbmRpbmdQZXJpb2RpY1RpbWVycyk7XG4gIExpc3RXcmFwcGVyLmNsZWFyKF9wZW5kaW5nVGltZXJzKTtcbn1cblxuXG4vKipcbiAqIFNpbXVsYXRlcyB0aGUgYXN5bmNocm9ub3VzIHBhc3NhZ2Ugb2YgdGltZSBmb3IgdGhlIHRpbWVycyBpbiB0aGUgZmFrZUFzeW5jIHpvbmUuXG4gKlxuICogVGhlIG1pY3JvdGFza3MgcXVldWUgaXMgZHJhaW5lZCBhdCB0aGUgdmVyeSBzdGFydCBvZiB0aGlzIGZ1bmN0aW9uIGFuZCBhZnRlciBhbnkgdGltZXIgY2FsbGJhY2tcbiAqIGhhcyBiZWVuIGV4ZWN1dGVkLlxuICpcbiAqICMjIEV4YW1wbGVcbiAqXG4gKiB7QGV4YW1wbGUgdGVzdGluZy90cy9mYWtlX2FzeW5jLnRzIHJlZ2lvbj0nYmFzaWMnfVxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSBtaWxsaXMgTnVtYmVyIG9mIG1pbGxpc2Vjb25kLCBkZWZhdWx0cyB0byAwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWNrKG1pbGxpczogbnVtYmVyID0gMCk6IHZvaWQge1xuICBfYXNzZXJ0SW5GYWtlQXN5bmNab25lKCk7XG4gIGZsdXNoTWljcm90YXNrcygpO1xuICBfc2NoZWR1bGVyLnRpY2sobWlsbGlzKTtcbn1cblxuLyoqXG4gKiBGbHVzaCBhbnkgcGVuZGluZyBtaWNyb3Rhc2tzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmx1c2hNaWNyb3Rhc2tzKCk6IHZvaWQge1xuICBfYXNzZXJ0SW5GYWtlQXN5bmNab25lKCk7XG4gIHdoaWxlIChfbWljcm90YXNrcy5sZW5ndGggPiAwKSB7XG4gICAgdmFyIG1pY3JvdGFzayA9IExpc3RXcmFwcGVyLnJlbW92ZUF0KF9taWNyb3Rhc2tzLCAwKTtcbiAgICBtaWNyb3Rhc2soKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBfc2V0VGltZW91dChmbjogRnVuY3Rpb24sIGRlbGF5OiBudW1iZXIsIC4uLmFyZ3MpOiBudW1iZXIge1xuICB2YXIgY2IgPSBfZm5BbmRGbHVzaChmbik7XG4gIHZhciBpZCA9IF9zY2hlZHVsZXIuc2NoZWR1bGVGdW5jdGlvbihjYiwgZGVsYXksIGFyZ3MpO1xuICBfcGVuZGluZ1RpbWVycy5wdXNoKGlkKTtcbiAgX3NjaGVkdWxlci5zY2hlZHVsZUZ1bmN0aW9uKF9kZXF1ZXVlVGltZXIoaWQpLCBkZWxheSk7XG4gIHJldHVybiBpZDtcbn1cblxuZnVuY3Rpb24gX2NsZWFyVGltZW91dChpZDogbnVtYmVyKSB7XG4gIF9kZXF1ZXVlVGltZXIoaWQpO1xuICByZXR1cm4gX3NjaGVkdWxlci5yZW1vdmVGdW5jdGlvbldpdGhJZChpZCk7XG59XG5cbmZ1bmN0aW9uIF9zZXRJbnRlcnZhbChmbjogRnVuY3Rpb24sIGludGVydmFsOiBudW1iZXIsIC4uLmFyZ3MpIHtcbiAgdmFyIGNiID0gX2ZuQW5kRmx1c2goZm4pO1xuICB2YXIgaWQgPSBfc2NoZWR1bGVyLnNjaGVkdWxlRnVuY3Rpb24oY2IsIGludGVydmFsLCBhcmdzLCB0cnVlKTtcbiAgX3BlbmRpbmdQZXJpb2RpY1RpbWVycy5wdXNoKGlkKTtcbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBfY2xlYXJJbnRlcnZhbChpZDogbnVtYmVyKSB7XG4gIExpc3RXcmFwcGVyLnJlbW92ZShfcGVuZGluZ1BlcmlvZGljVGltZXJzLCBpZCk7XG4gIHJldHVybiBfc2NoZWR1bGVyLnJlbW92ZUZ1bmN0aW9uV2l0aElkKGlkKTtcbn1cblxuZnVuY3Rpb24gX2ZuQW5kRmx1c2goZm46IEZ1bmN0aW9uKTogRnVuY3Rpb24ge1xuICByZXR1cm4gKC4uLmFyZ3MpID0+IHtcbiAgICBmbi5hcHBseShnbG9iYWwsIGFyZ3MpO1xuICAgIGZsdXNoTWljcm90YXNrcygpO1xuICB9XG59XG5cbmZ1bmN0aW9uIF9zY2hlZHVsZU1pY3JvdGFzayhtaWNyb3Rhc2s6IEZ1bmN0aW9uKTogdm9pZCB7XG4gIF9taWNyb3Rhc2tzLnB1c2gobWljcm90YXNrKTtcbn1cblxuZnVuY3Rpb24gX2RlcXVldWVUaW1lcihpZDogbnVtYmVyKTogRnVuY3Rpb24ge1xuICByZXR1cm4gZnVuY3Rpb24oKSB7IExpc3RXcmFwcGVyLnJlbW92ZShfcGVuZGluZ1RpbWVycywgaWQpOyB9XG59XG5cbmZ1bmN0aW9uIF9hc3NlcnRJbkZha2VBc3luY1pvbmUoKTogdm9pZCB7XG4gIGlmICghZ2xvYmFsLnpvbmUgfHwgISg8RmFrZUFzeW5jWm9uZT5nbG9iYWwuem9uZSkuX2luRmFrZUFzeW5jWm9uZSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNvZGUgc2hvdWxkIGJlIHJ1bm5pbmcgaW4gdGhlIGZha2VBc3luYyB6b25lIHRvIGNhbGwgdGhpcyBmdW5jdGlvbicpO1xuICB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvdGVzdGluZy9mYWtlX2FzeW5jLnRzXG4gKiovIiwiaW1wb3J0IHtYSFJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb21waWxlci94aHInO1xuaW1wb3J0IHtMaXN0V3JhcHBlciwgTWFwLCBNYXBXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2NvbGxlY3Rpb24nO1xuaW1wb3J0IHtpc0JsYW5rLCBpc1ByZXNlbnQsIG5vcm1hbGl6ZUJsYW5rfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2xhbmcnO1xuaW1wb3J0IHtCYXNlRXhjZXB0aW9uLCBXcmFwcGVkRXhjZXB0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHtQcm9taXNlQ29tcGxldGVyLCBQcm9taXNlV3JhcHBlciwgUHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cbi8qKlxuICogQSBtb2NrIGltcGxlbWVuYXRpb24gb2Yge0BsaW5rIFhIUn0gdGhhdCBhbGxvd3Mgb3V0Z29pbmcgcmVxdWVzdHMgdG8gYmUgbW9ja2VkXG4gKiBhbmQgcmVzcG9uZGVkIHRvIHdpdGhpbiBhIHNpbmdsZSB0ZXN0LCB3aXRob3V0IGdvaW5nIHRvIHRoZSBuZXR3b3JrLlxuICovXG5leHBvcnQgY2xhc3MgTW9ja1hIUiBleHRlbmRzIFhIUiB7XG4gIHByaXZhdGUgX2V4cGVjdGF0aW9uczogX0V4cGVjdGF0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBfZGVmaW5pdGlvbnMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICBwcml2YXRlIF9yZXF1ZXN0czogX1BlbmRpbmdSZXF1ZXN0W10gPSBbXTtcblxuICBnZXQodXJsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHZhciByZXF1ZXN0ID0gbmV3IF9QZW5kaW5nUmVxdWVzdCh1cmwpO1xuICAgIHRoaXMuX3JlcXVlc3RzLnB1c2gocmVxdWVzdCk7XG4gICAgcmV0dXJuIHJlcXVlc3QuZ2V0UHJvbWlzZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhbiBleHBlY3RhdGlvbiBmb3IgdGhlIGdpdmVuIFVSTC4gSW5jb21pbmcgcmVxdWVzdHMgd2lsbCBiZSBjaGVja2VkIGFnYWluc3RcbiAgICogdGhlIG5leHQgZXhwZWN0YXRpb24gKGluIEZJRk8gb3JkZXIpLiBUaGUgYHZlcmlmeU5vT3V0c3RhbmRpbmdFeHBlY3RhdGlvbnNgIG1ldGhvZFxuICAgKiBjYW4gYmUgdXNlZCB0byBjaGVjayBpZiBhbnkgZXhwZWN0YXRpb25zIGhhdmUgbm90IHlldCBiZWVuIG1ldC5cbiAgICpcbiAgICogVGhlIHJlc3BvbnNlIGdpdmVuIHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGV4cGVjdGF0aW9uIG1hdGNoZXMuXG4gICAqL1xuICBleHBlY3QodXJsOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcpIHtcbiAgICB2YXIgZXhwZWN0YXRpb24gPSBuZXcgX0V4cGVjdGF0aW9uKHVybCwgcmVzcG9uc2UpO1xuICAgIHRoaXMuX2V4cGVjdGF0aW9ucy5wdXNoKGV4cGVjdGF0aW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSBkZWZpbml0aW9uIGZvciB0aGUgZ2l2ZW4gVVJMIHRvIHJldHVybiB0aGUgZ2l2ZW4gcmVzcG9uc2UuIFVubGlrZSBleHBlY3RhdGlvbnMsXG4gICAqIGRlZmluaXRpb25zIGhhdmUgbm8gb3JkZXIgYW5kIHdpbGwgc2F0aXNmeSBhbnkgbWF0Y2hpbmcgcmVxdWVzdCBhdCBhbnkgdGltZS4gQWxzb1xuICAgKiB1bmxpa2UgZXhwZWN0YXRpb25zLCB1bnVzZWQgZGVmaW5pdGlvbnMgZG8gbm90IGNhdXNlIGB2ZXJpZnlOb091dHN0YW5kaW5nRXhwZWN0YXRpb25zYFxuICAgKiB0byByZXR1cm4gYW4gZXJyb3IuXG4gICAqL1xuICB3aGVuKHVybDogc3RyaW5nLCByZXNwb25zZTogc3RyaW5nKSB7IHRoaXMuX2RlZmluaXRpb25zLnNldCh1cmwsIHJlc3BvbnNlKTsgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzIHBlbmRpbmcgcmVxdWVzdHMgYW5kIHZlcmlmeSB0aGVyZSBhcmUgbm8gb3V0c3RhbmRpbmcgZXhwZWN0YXRpb25zLiBBbHNvIGZhaWxzXG4gICAqIGlmIG5vIHJlcXVlc3RzIGFyZSBwZW5kaW5nLlxuICAgKi9cbiAgZmx1c2goKSB7XG4gICAgaWYgKHRoaXMuX3JlcXVlc3RzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oJ05vIHBlbmRpbmcgcmVxdWVzdHMgdG8gZmx1c2gnKTtcbiAgICB9XG5cbiAgICBkbyB7XG4gICAgICB0aGlzLl9wcm9jZXNzUmVxdWVzdCh0aGlzLl9yZXF1ZXN0cy5zaGlmdCgpKTtcbiAgICB9IHdoaWxlICh0aGlzLl9yZXF1ZXN0cy5sZW5ndGggPiAwKTtcblxuICAgIHRoaXMudmVyaWZ5Tm9PdXRzdGFuZGluZ0V4cGVjdGF0aW9ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBhbnkgZXhwZWN0YXRpb25zIGhhdmUgbm90IGJlZW4gc2F0aXNmaWVkLlxuICAgKi9cbiAgdmVyaWZ5Tm9PdXRzdGFuZGluZ0V4cGVjdGF0aW9ucygpIHtcbiAgICBpZiAodGhpcy5fZXhwZWN0YXRpb25zLmxlbmd0aCA9PT0gMCkgcmV0dXJuO1xuXG4gICAgdmFyIHVybHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2V4cGVjdGF0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGV4cGVjdGF0aW9uID0gdGhpcy5fZXhwZWN0YXRpb25zW2ldO1xuICAgICAgdXJscy5wdXNoKGV4cGVjdGF0aW9uLnVybCk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFVuc2F0aXNmaWVkIHJlcXVlc3RzOiAke3VybHMuam9pbignLCAnKX1gKTtcbiAgfVxuXG4gIHByaXZhdGUgX3Byb2Nlc3NSZXF1ZXN0KHJlcXVlc3Q6IF9QZW5kaW5nUmVxdWVzdCkge1xuICAgIHZhciB1cmwgPSByZXF1ZXN0LnVybDtcblxuICAgIGlmICh0aGlzLl9leHBlY3RhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgdmFyIGV4cGVjdGF0aW9uID0gdGhpcy5fZXhwZWN0YXRpb25zWzBdO1xuICAgICAgaWYgKGV4cGVjdGF0aW9uLnVybCA9PSB1cmwpIHtcbiAgICAgICAgTGlzdFdyYXBwZXIucmVtb3ZlKHRoaXMuX2V4cGVjdGF0aW9ucywgZXhwZWN0YXRpb24pO1xuICAgICAgICByZXF1ZXN0LmNvbXBsZXRlKGV4cGVjdGF0aW9uLnJlc3BvbnNlKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLl9kZWZpbml0aW9ucy5oYXModXJsKSkge1xuICAgICAgdmFyIHJlc3BvbnNlID0gdGhpcy5fZGVmaW5pdGlvbnMuZ2V0KHVybCk7XG4gICAgICByZXF1ZXN0LmNvbXBsZXRlKG5vcm1hbGl6ZUJsYW5rKHJlc3BvbnNlKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEJhc2VFeGNlcHRpb24oYFVuZXhwZWN0ZWQgcmVxdWVzdCAke3VybH1gKTtcbiAgfVxufVxuXG5jbGFzcyBfUGVuZGluZ1JlcXVlc3Qge1xuICB1cmw6IHN0cmluZztcbiAgY29tcGxldGVyOiBQcm9taXNlQ29tcGxldGVyPHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IodXJsKSB7XG4gICAgdGhpcy51cmwgPSB1cmw7XG4gICAgdGhpcy5jb21wbGV0ZXIgPSBQcm9taXNlV3JhcHBlci5jb21wbGV0ZXIoKTtcbiAgfVxuXG4gIGNvbXBsZXRlKHJlc3BvbnNlOiBzdHJpbmcpIHtcbiAgICBpZiAoaXNCbGFuayhyZXNwb25zZSkpIHtcbiAgICAgIHRoaXMuY29tcGxldGVyLnJlamVjdChgRmFpbGVkIHRvIGxvYWQgJHt0aGlzLnVybH1gLCBudWxsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jb21wbGV0ZXIucmVzb2x2ZShyZXNwb25zZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0UHJvbWlzZSgpOiBQcm9taXNlPHN0cmluZz4geyByZXR1cm4gdGhpcy5jb21wbGV0ZXIucHJvbWlzZTsgfVxufVxuXG5jbGFzcyBfRXhwZWN0YXRpb24ge1xuICB1cmw6IHN0cmluZztcbiAgcmVzcG9uc2U6IHN0cmluZztcbiAgY29uc3RydWN0b3IodXJsOiBzdHJpbmcsIHJlc3BvbnNlOiBzdHJpbmcpIHtcbiAgICB0aGlzLnVybCA9IHVybDtcbiAgICB0aGlzLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9jb21waWxlci94aHJfbW9jay50c1xuICoqLyIsImltcG9ydCB7QXBwbGljYXRpb25SZWZ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2FwcGxpY2F0aW9uX3JlZic7XG5pbXBvcnQge0luamVjdGFibGV9IGZyb20gJ2FuZ3VsYXIyL3NyYy9jb3JlL2RpJztcbmltcG9ydCB7VHlwZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7Q29tcG9uZW50UmVmfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9saW5rZXIvZHluYW1pY19jb21wb25lbnRfbG9hZGVyJztcbmltcG9ydCB7UHJvdmlkZXIsIEluamVjdG9yfSBmcm9tICdhbmd1bGFyMi9zcmMvY29yZS9kaSc7XG5pbXBvcnQge05nWm9uZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvem9uZS9uZ196b25lJztcbmltcG9ydCB7UHJvbWlzZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9hc3luYyc7XG5cbi8qKlxuICogQSBuby1vcCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQXBwbGljYXRpb25SZWZ9LCB1c2VmdWwgZm9yIHRlc3RpbmcuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBNb2NrQXBwbGljYXRpb25SZWYgZXh0ZW5kcyBBcHBsaWNhdGlvblJlZiB7XG4gIHJlZ2lzdGVyQm9vdHN0cmFwTGlzdGVuZXIobGlzdGVuZXI6IChyZWY6IENvbXBvbmVudFJlZikgPT4gdm9pZCk6IHZvaWQge31cblxuICByZWdpc3RlckRpc3Bvc2VMaXN0ZW5lcihkaXNwb3NlOiAoKSA9PiB2b2lkKTogdm9pZCB7fVxuXG4gIGJvb3RzdHJhcChjb21wb25lbnRUeXBlOiBUeXBlLCBiaW5kaW5ncz86IEFycmF5PFR5cGUgfCBQcm92aWRlciB8IGFueVtdPik6IFByb21pc2U8Q29tcG9uZW50UmVmPiB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXQgaW5qZWN0b3IoKTogSW5qZWN0b3IgeyByZXR1cm4gbnVsbDsgfTtcblxuICBnZXQgem9uZSgpOiBOZ1pvbmUgeyByZXR1cm4gbnVsbDsgfTtcblxuICBkaXNwb3NlKCk6IHZvaWQge31cblxuICB0aWNrKCk6IHZvaWQge31cblxuICBnZXQgY29tcG9uZW50VHlwZXMoKTogVHlwZVtdIHsgcmV0dXJuIG51bGw7IH07XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvbW9jay9tb2NrX2FwcGxpY2F0aW9uX3JlZi50c1xuICoqLyIsImV4cG9ydCAqIGZyb20gJ2FuZ3VsYXIyL3NyYy9odHRwL2JhY2tlbmRzL21vY2tfYmFja2VuZCc7XG5cblxuLyoqIFdFQlBBQ0sgRk9PVEVSICoqXG4gKiogYW5ndWxhcjIvaHR0cC90ZXN0aW5nLnRzXG4gKiovIiwiaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbmltcG9ydCB7UmVxdWVzdH0gZnJvbSAnLi4vc3RhdGljX3JlcXVlc3QnO1xuaW1wb3J0IHtSZXNwb25zZX0gZnJvbSAnLi4vc3RhdGljX3Jlc3BvbnNlJztcbmltcG9ydCB7UmVhZHlTdGF0ZX0gZnJvbSAnLi4vZW51bXMnO1xuaW1wb3J0IHtDb25uZWN0aW9uLCBDb25uZWN0aW9uQmFja2VuZH0gZnJvbSAnLi4vaW50ZXJmYWNlcyc7XG5pbXBvcnQge2lzUHJlc2VudH0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9sYW5nJztcbmltcG9ydCB7QmFzZUV4Y2VwdGlvbiwgV3JhcHBlZEV4Y2VwdGlvbn0gZnJvbSAnYW5ndWxhcjIvc3JjL2ZhY2FkZS9leGNlcHRpb25zJztcbmltcG9ydCB7U3ViamVjdH0gZnJvbSAncnhqcy9TdWJqZWN0JztcbmltcG9ydCB7UmVwbGF5U3ViamVjdH0gZnJvbSAncnhqcy9zdWJqZWN0L1JlcGxheVN1YmplY3QnO1xuaW1wb3J0IHt0YWtlfSBmcm9tICdyeGpzL29wZXJhdG9yL3Rha2UnO1xuXG4vKipcbiAqXG4gKiBNb2NrIENvbm5lY3Rpb24gdG8gcmVwcmVzZW50IGEge0BsaW5rIENvbm5lY3Rpb259IGZvciB0ZXN0cy5cbiAqXG4gKiovXG5leHBvcnQgY2xhc3MgTW9ja0Nvbm5lY3Rpb24gaW1wbGVtZW50cyBDb25uZWN0aW9uIHtcbiAgLy8gVE9ETyBOYW1lIGByZWFkeVN0YXRlYCBzaG91bGQgY2hhbmdlIHRvIGJlIG1vcmUgZ2VuZXJpYywgYW5kIHN0YXRlcyBjb3VsZCBiZSBtYWRlIHRvIGJlIG1vcmVcbiAgLy8gZGVzY3JpcHRpdmUgdGhhbiBYSFIgc3RhdGVzLlxuICAvKipcbiAgICogRGVzY3JpYmVzIHRoZSBzdGF0ZSBvZiB0aGUgY29ubmVjdGlvbiwgYmFzZWQgb24gYFhNTEh0dHBSZXF1ZXN0LnJlYWR5U3RhdGVgLCBidXQgd2l0aFxuICAgKiBhZGRpdGlvbmFsIHN0YXRlcy4gRm9yIGV4YW1wbGUsIHN0YXRlIDUgaW5kaWNhdGVzIGFuIGFib3J0ZWQgY29ubmVjdGlvbi5cbiAgICovXG4gIHJlYWR5U3RhdGU6IFJlYWR5U3RhdGU7XG5cbiAgLyoqXG4gICAqIHtAbGluayBSZXF1ZXN0fSBpbnN0YW5jZSB1c2VkIHRvIGNyZWF0ZSB0aGUgY29ubmVjdGlvbi5cbiAgICovXG4gIHJlcXVlc3Q6IFJlcXVlc3Q7XG5cbiAgLyoqXG4gICAqIHtAbGluayBFdmVudEVtaXR0ZXJ9IG9mIHtAbGluayBSZXNwb25zZX0uIENhbiBiZSBzdWJzY3JpYmVkIHRvIGluIG9yZGVyIHRvIGJlIG5vdGlmaWVkIHdoZW4gYVxuICAgKiByZXNwb25zZSBpcyBhdmFpbGFibGUuXG4gICAqL1xuICByZXNwb25zZTogYW55OyAgLy8gU3ViamVjdDxSZXNwb25zZT5cblxuICBjb25zdHJ1Y3RvcihyZXE6IFJlcXVlc3QpIHtcbiAgICB0aGlzLnJlc3BvbnNlID0gdGFrZS5jYWxsKG5ldyBSZXBsYXlTdWJqZWN0KDEpLCAxKTtcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBSZWFkeVN0YXRlLk9wZW47XG4gICAgdGhpcy5yZXF1ZXN0ID0gcmVxO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgbW9jayByZXNwb25zZSB0byB0aGUgY29ubmVjdGlvbi4gVGhpcyByZXNwb25zZSBpcyB0aGUgdmFsdWUgdGhhdCBpcyBlbWl0dGVkIHRvIHRoZVxuICAgKiB7QGxpbmsgRXZlbnRFbWl0dGVyfSByZXR1cm5lZCBieSB7QGxpbmsgSHR0cH0uXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiB2YXIgY29ubmVjdGlvbjtcbiAgICogYmFja2VuZC5jb25uZWN0aW9ucy5zdWJzY3JpYmUoYyA9PiBjb25uZWN0aW9uID0gYyk7XG4gICAqIGh0dHAucmVxdWVzdCgnZGF0YS5qc29uJykuc3Vic2NyaWJlKHJlcyA9PiBjb25zb2xlLmxvZyhyZXMudGV4dCgpKSk7XG4gICAqIGNvbm5lY3Rpb24ubW9ja1Jlc3BvbmQobmV3IFJlc3BvbnNlKCdmYWtlIHJlc3BvbnNlJykpOyAvL2xvZ3MgJ2Zha2UgcmVzcG9uc2UnXG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgbW9ja1Jlc3BvbmQocmVzOiBSZXNwb25zZSkge1xuICAgIGlmICh0aGlzLnJlYWR5U3RhdGUgPT09IFJlYWR5U3RhdGUuRG9uZSB8fCB0aGlzLnJlYWR5U3RhdGUgPT09IFJlYWR5U3RhdGUuQ2FuY2VsbGVkKSB7XG4gICAgICB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbignQ29ubmVjdGlvbiBoYXMgYWxyZWFkeSBiZWVuIHJlc29sdmVkJyk7XG4gICAgfVxuICAgIHRoaXMucmVhZHlTdGF0ZSA9IFJlYWR5U3RhdGUuRG9uZTtcbiAgICB0aGlzLnJlc3BvbnNlLm5leHQocmVzKTtcbiAgICB0aGlzLnJlc3BvbnNlLmNvbXBsZXRlKCk7XG4gIH1cblxuICAvKipcbiAgICogTm90IHlldCBpbXBsZW1lbnRlZCFcbiAgICpcbiAgICogU2VuZHMgdGhlIHByb3ZpZGVkIHtAbGluayBSZXNwb25zZX0gdG8gdGhlIGBkb3dubG9hZE9ic2VydmVyYCBvZiB0aGUgYFJlcXVlc3RgXG4gICAqIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNvbm5lY3Rpb24uXG4gICAqL1xuICBtb2NrRG93bmxvYWQocmVzOiBSZXNwb25zZSkge1xuICAgIC8vIHRoaXMucmVxdWVzdC5kb3dubG9hZE9ic2VydmVyLm9uTmV4dChyZXMpO1xuICAgIC8vIGlmIChyZXMuYnl0ZXNMb2FkZWQgPT09IHJlcy50b3RhbEJ5dGVzKSB7XG4gICAgLy8gICB0aGlzLnJlcXVlc3QuZG93bmxvYWRPYnNlcnZlci5vbkNvbXBsZXRlZCgpO1xuICAgIC8vIH1cbiAgfVxuXG4gIC8vIFRPRE8oamVmZmJjcm9zcyk6IGNvbnNpZGVyIHVzaW5nIFJlc3BvbnNlIHR5cGVcbiAgLyoqXG4gICAqIEVtaXRzIHRoZSBwcm92aWRlZCBlcnJvciBvYmplY3QgYXMgYW4gZXJyb3IgdG8gdGhlIHtAbGluayBSZXNwb25zZX0ge0BsaW5rIEV2ZW50RW1pdHRlcn1cbiAgICogcmV0dXJuZWRcbiAgICogZnJvbSB7QGxpbmsgSHR0cH0uXG4gICAqL1xuICBtb2NrRXJyb3IoZXJyPzogRXJyb3IpIHtcbiAgICAvLyBNYXRjaGVzIFhIUiBzZW1hbnRpY3NcbiAgICB0aGlzLnJlYWR5U3RhdGUgPSBSZWFkeVN0YXRlLkRvbmU7XG4gICAgdGhpcy5yZXNwb25zZS5lcnJvcihlcnIpO1xuICB9XG59XG5cbi8qKlxuICogQSBtb2NrIGJhY2tlbmQgZm9yIHRlc3RpbmcgdGhlIHtAbGluayBIdHRwfSBzZXJ2aWNlLlxuICpcbiAqIFRoaXMgY2xhc3MgY2FuIGJlIGluamVjdGVkIGluIHRlc3RzLCBhbmQgc2hvdWxkIGJlIHVzZWQgdG8gb3ZlcnJpZGUgcHJvdmlkZXJzXG4gKiB0byBvdGhlciBiYWNrZW5kcywgc3VjaCBhcyB7QGxpbmsgWEhSQmFja2VuZH0uXG4gKlxuICogIyMjIEV4YW1wbGVcbiAqXG4gKiBgYGBcbiAqIGltcG9ydCB7RGVmYXVsdE9wdGlvbnMsIEh0dHB9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICogaW1wb3J0IHtNb2NrQmFja2VuZH0gZnJvbSAnYW5ndWxhcjIvaHR0cC90ZXN0aW5nJztcbiAqIGl0KCdzaG91bGQgZ2V0IHNvbWUgZGF0YScsIGluamVjdChbQXN5bmNUZXN0Q29tcGxldGVyXSwgKGFzeW5jKSA9PiB7XG4gKiAgIHZhciBjb25uZWN0aW9uO1xuICogICB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAqICAgICBNb2NrQmFja2VuZCxcbiAqICAgICBwcm92aWRlKEh0dHAsIHt1c2VGYWN0b3J5OiAoYmFja2VuZCwgZGVmYXVsdE9wdGlvbnMpID0+IHtcbiAqICAgICAgIHJldHVybiBuZXcgSHR0cChiYWNrZW5kLCBkZWZhdWx0T3B0aW9ucylcbiAqICAgICB9LCBkZXBzOiBbTW9ja0JhY2tlbmQsIERlZmF1bHRPcHRpb25zXX0pXSk7XG4gKiAgIHZhciBodHRwID0gaW5qZWN0b3IuZ2V0KEh0dHApO1xuICogICB2YXIgYmFja2VuZCA9IGluamVjdG9yLmdldChNb2NrQmFja2VuZCk7XG4gKiAgIC8vQXNzaWduIGFueSBuZXdseS1jcmVhdGVkIGNvbm5lY3Rpb24gdG8gbG9jYWwgdmFyaWFibGVcbiAqICAgYmFja2VuZC5jb25uZWN0aW9ucy5zdWJzY3JpYmUoYyA9PiBjb25uZWN0aW9uID0gYyk7XG4gKiAgIGh0dHAucmVxdWVzdCgnZGF0YS5qc29uJykuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAqICAgICBleHBlY3QocmVzLnRleHQoKSkudG9CZSgnYXdlc29tZScpO1xuICogICAgIGFzeW5jLmRvbmUoKTtcbiAqICAgfSk7XG4gKiAgIGNvbm5lY3Rpb24ubW9ja1Jlc3BvbmQobmV3IFJlc3BvbnNlKCdhd2Vzb21lJykpO1xuICogfSkpO1xuICogYGBgXG4gKlxuICogVGhpcyBtZXRob2Qgb25seSBleGlzdHMgaW4gdGhlIG1vY2sgaW1wbGVtZW50YXRpb24sIG5vdCBpbiByZWFsIEJhY2tlbmRzLlxuICoqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE1vY2tCYWNrZW5kIGltcGxlbWVudHMgQ29ubmVjdGlvbkJhY2tlbmQge1xuICAvKipcbiAgICoge0BsaW5rIEV2ZW50RW1pdHRlcn1cbiAgICogb2Yge0BsaW5rIE1vY2tDb25uZWN0aW9ufSBpbnN0YW5jZXMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGlzIGJhY2tlbmQuIENhbiBiZSBzdWJzY3JpYmVkXG4gICAqIHRvIGluIG9yZGVyIHRvIHJlc3BvbmQgdG8gY29ubmVjdGlvbnMuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqXG4gICAqIGBgYFxuICAgKiBpbXBvcnQge01vY2tCYWNrZW5kLCBIdHRwLCBCYXNlUmVxdWVzdE9wdGlvbnN9IGZyb20gJ2FuZ3VsYXIyL2h0dHAnO1xuICAgKiBpbXBvcnQge0luamVjdG9yfSBmcm9tICdhbmd1bGFyMi9jb3JlJztcbiAgICpcbiAgICogaXQoJ3Nob3VsZCBnZXQgYSByZXNwb25zZScsICgpID0+IHtcbiAgICogICB2YXIgY29ubmVjdGlvbjsgLy90aGlzIHdpbGwgYmUgc2V0IHdoZW4gYSBuZXcgY29ubmVjdGlvbiBpcyBlbWl0dGVkIGZyb20gdGhlIGJhY2tlbmQuXG4gICAqICAgdmFyIHRleHQ7IC8vdGhpcyB3aWxsIGJlIHNldCBmcm9tIG1vY2sgcmVzcG9uc2VcbiAgICogICB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtcbiAgICogICAgIE1vY2tCYWNrZW5kLFxuICAgKiAgICAgcHJvdmlkZShIdHRwLCB7dXNlRmFjdG9yeTogKGJhY2tlbmQsIG9wdGlvbnMpIHtcbiAgICogICAgICAgcmV0dXJuIG5ldyBIdHRwKGJhY2tlbmQsIG9wdGlvbnMpO1xuICAgKiAgICAgfSwgZGVwczogW01vY2tCYWNrZW5kLCBCYXNlUmVxdWVzdE9wdGlvbnNdfV0pO1xuICAgKiAgIHZhciBiYWNrZW5kID0gaW5qZWN0b3IuZ2V0KE1vY2tCYWNrZW5kKTtcbiAgICogICB2YXIgaHR0cCA9IGluamVjdG9yLmdldChIdHRwKTtcbiAgICogICBiYWNrZW5kLmNvbm5lY3Rpb25zLnN1YnNjcmliZShjID0+IGNvbm5lY3Rpb24gPSBjKTtcbiAgICogICBodHRwLnJlcXVlc3QoJ3NvbWV0aGluZy5qc29uJykuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAqICAgICB0ZXh0ID0gcmVzLnRleHQoKTtcbiAgICogICB9KTtcbiAgICogICBjb25uZWN0aW9uLm1vY2tSZXNwb25kKG5ldyBSZXNwb25zZSh7Ym9keTogJ1NvbWV0aGluZyd9KSk7XG4gICAqICAgZXhwZWN0KHRleHQpLnRvQmUoJ1NvbWV0aGluZycpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIFRoaXMgcHJvcGVydHkgb25seSBleGlzdHMgaW4gdGhlIG1vY2sgaW1wbGVtZW50YXRpb24sIG5vdCBpbiByZWFsIEJhY2tlbmRzLlxuICAgKi9cbiAgY29ubmVjdGlvbnM6IGFueTsgIC8vPE1vY2tDb25uZWN0aW9uPlxuXG4gIC8qKlxuICAgKiBBbiBhcnJheSByZXByZXNlbnRhdGlvbiBvZiBgY29ubmVjdGlvbnNgLiBUaGlzIGFycmF5IHdpbGwgYmUgdXBkYXRlZCB3aXRoIGVhY2ggY29ubmVjdGlvbiB0aGF0XG4gICAqIGlzIGNyZWF0ZWQgYnkgdGhpcyBiYWNrZW5kLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IG9ubHkgZXhpc3RzIGluIHRoZSBtb2NrIGltcGxlbWVudGF0aW9uLCBub3QgaW4gcmVhbCBCYWNrZW5kcy5cbiAgICovXG4gIGNvbm5lY3Rpb25zQXJyYXk6IE1vY2tDb25uZWN0aW9uW107XG4gIC8qKlxuICAgKiB7QGxpbmsgRXZlbnRFbWl0dGVyfSBvZiB7QGxpbmsgTW9ja0Nvbm5lY3Rpb259IGluc3RhbmNlcyB0aGF0IGhhdmVuJ3QgeWV0IGJlZW4gcmVzb2x2ZWQgKGkuZS5cbiAgICogd2l0aCBhIGByZWFkeVN0YXRlYFxuICAgKiBsZXNzIHRoYW4gNCkuIFVzZWQgaW50ZXJuYWxseSB0byB2ZXJpZnkgdGhhdCBubyBjb25uZWN0aW9ucyBhcmUgcGVuZGluZyB2aWEgdGhlXG4gICAqIGB2ZXJpZnlOb1BlbmRpbmdSZXF1ZXN0c2AgbWV0aG9kLlxuICAgKlxuICAgKiBUaGlzIHByb3BlcnR5IG9ubHkgZXhpc3RzIGluIHRoZSBtb2NrIGltcGxlbWVudGF0aW9uLCBub3QgaW4gcmVhbCBCYWNrZW5kcy5cbiAgICovXG4gIHBlbmRpbmdDb25uZWN0aW9uczogYW55OyAgLy8gU3ViamVjdDxNb2NrQ29ubmVjdGlvbj5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5jb25uZWN0aW9uc0FycmF5ID0gW107XG4gICAgdGhpcy5jb25uZWN0aW9ucyA9IG5ldyBTdWJqZWN0KCk7XG4gICAgdGhpcy5jb25uZWN0aW9ucy5zdWJzY3JpYmUoY29ubmVjdGlvbiA9PiB0aGlzLmNvbm5lY3Rpb25zQXJyYXkucHVzaChjb25uZWN0aW9uKSk7XG4gICAgdGhpcy5wZW5kaW5nQ29ubmVjdGlvbnMgPSBuZXcgU3ViamVjdCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyBhbGwgY29ubmVjdGlvbnMsIGFuZCByYWlzZXMgYW4gZXhjZXB0aW9uIGlmIGFueSBjb25uZWN0aW9uIGhhcyBub3QgcmVjZWl2ZWQgYSByZXNwb25zZS5cbiAgICpcbiAgICogVGhpcyBtZXRob2Qgb25seSBleGlzdHMgaW4gdGhlIG1vY2sgaW1wbGVtZW50YXRpb24sIG5vdCBpbiByZWFsIEJhY2tlbmRzLlxuICAgKi9cbiAgdmVyaWZ5Tm9QZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgbGV0IHBlbmRpbmcgPSAwO1xuICAgIHRoaXMucGVuZGluZ0Nvbm5lY3Rpb25zLnN1YnNjcmliZShjID0+IHBlbmRpbmcrKyk7XG4gICAgaWYgKHBlbmRpbmcgPiAwKSB0aHJvdyBuZXcgQmFzZUV4Y2VwdGlvbihgJHtwZW5kaW5nfSBwZW5kaW5nIGNvbm5lY3Rpb25zIHRvIGJlIHJlc29sdmVkYCk7XG4gIH1cblxuICAvKipcbiAgICogQ2FuIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgdmVyaWZ5Tm9QZW5kaW5nUmVxdWVzdHNgIHRvIHJlc29sdmUgYW55IG5vdC15ZXQtcmVzb2x2ZVxuICAgKiBjb25uZWN0aW9ucywgaWYgaXQncyBleHBlY3RlZCB0aGF0IHRoZXJlIGFyZSBjb25uZWN0aW9ucyB0aGF0IGhhdmUgbm90IHlldCByZWNlaXZlZCBhIHJlc3BvbnNlLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBvbmx5IGV4aXN0cyBpbiB0aGUgbW9jayBpbXBsZW1lbnRhdGlvbiwgbm90IGluIHJlYWwgQmFja2VuZHMuXG4gICAqL1xuICByZXNvbHZlQWxsQ29ubmVjdGlvbnMoKSB7IHRoaXMuY29ubmVjdGlvbnMuc3Vic2NyaWJlKGMgPT4gYy5yZWFkeVN0YXRlID0gNCk7IH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgTW9ja0Nvbm5lY3Rpb259LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgbmV3XG4gICAqIE1vY2tDb25uZWN0aW9uKClgLCBleGNlcHQgdGhhdCBpdCBhbHNvIHdpbGwgZW1pdCB0aGUgbmV3IGBDb25uZWN0aW9uYCB0byB0aGUgYGNvbm5lY3Rpb25zYFxuICAgKiBlbWl0dGVyIG9mIHRoaXMgYE1vY2tCYWNrZW5kYCBpbnN0YW5jZS4gVGhpcyBtZXRob2Qgd2lsbCB1c3VhbGx5IG9ubHkgYmUgdXNlZCBieSB0ZXN0c1xuICAgKiBhZ2FpbnN0IHRoZSBmcmFtZXdvcmsgaXRzZWxmLCBub3QgYnkgZW5kLXVzZXJzLlxuICAgKi9cbiAgY3JlYXRlQ29ubmVjdGlvbihyZXE6IFJlcXVlc3QpOiBDb25uZWN0aW9uIHtcbiAgICBpZiAoIWlzUHJlc2VudChyZXEpIHx8ICEocmVxIGluc3RhbmNlb2YgUmVxdWVzdCkpIHtcbiAgICAgIHRocm93IG5ldyBCYXNlRXhjZXB0aW9uKGBjcmVhdGVDb25uZWN0aW9uIHJlcXVpcmVzIGFuIGluc3RhbmNlIG9mIFJlcXVlc3QsIGdvdCAke3JlcX1gKTtcbiAgICB9XG4gICAgbGV0IGNvbm5lY3Rpb24gPSBuZXcgTW9ja0Nvbm5lY3Rpb24ocmVxKTtcbiAgICB0aGlzLmNvbm5lY3Rpb25zLm5leHQoY29ubmVjdGlvbik7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG4gIH1cbn1cblxuXG5cbi8qKiBXRUJQQUNLIEZPT1RFUiAqKlxuICoqIGFuZ3VsYXIyL3NyYy9odHRwL2JhY2tlbmRzL21vY2tfYmFja2VuZC50c1xuICoqLyIsIm1vZHVsZS5leHBvcnRzID0gX19XRUJQQUNLX0VYVEVSTkFMX01PRFVMRV8yNzlfXztcblxuXG4vKioqKioqKioqKioqKioqKipcbiAqKiBXRUJQQUNLIEZPT1RFUlxuICoqIGV4dGVybmFsIHtcImNvbW1vbmpzXCI6XCJyeGpzL3N1YmplY3QvUmVwbGF5U3ViamVjdFwiLFwiY29tbW9uanMyXCI6XCJyeGpzL3N1YmplY3QvUmVwbGF5U3ViamVjdFwiLFwiYW1kXCI6XCJyeGpzL3N1YmplY3QvUmVwbGF5U3ViamVjdFwiLFwicm9vdFwiOltcIlJ4XCJdfVxuICoqIG1vZHVsZSBpZCA9IDI3OVxuICoqIG1vZHVsZSBjaHVua3MgPSAwXG4gKiovIiwibW9kdWxlLmV4cG9ydHMgPSBfX1dFQlBBQ0tfRVhURVJOQUxfTU9EVUxFXzI4MF9fO1xuXG5cbi8qKioqKioqKioqKioqKioqKlxuICoqIFdFQlBBQ0sgRk9PVEVSXG4gKiogZXh0ZXJuYWwge1wiY29tbW9uanNcIjpcInJ4anMvb3BlcmF0b3IvdGFrZVwiLFwiY29tbW9uanMyXCI6XCJyeGpzL29wZXJhdG9yL3Rha2VcIixcImFtZFwiOlwicnhqcy9vcGVyYXRvci90YWtlXCIsXCJyb290XCI6W1wiUnhcIixcIk9ic2VydmFibGVcIixcInByb3RvdHlwZVwiXX1cbiAqKiBtb2R1bGUgaWQgPSAyODBcbiAqKiBtb2R1bGUgY2h1bmtzID0gMFxuICoqLyIsImV4cG9ydCAqIGZyb20gJ2FuZ3VsYXIyL3NyYy9tb2NrL21vY2tfbG9jYXRpb25fc3RyYXRlZ3knO1xuZXhwb3J0ICogZnJvbSAnYW5ndWxhcjIvc3JjL21vY2svbG9jYXRpb25fbW9jayc7XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9yb3V0ZXIvdGVzdGluZy50c1xuICoqLyIsImltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnYW5ndWxhcjIvc3JjL2NvcmUvZGknO1xuaW1wb3J0IHtFdmVudEVtaXR0ZXIsIE9ic2VydmFibGVXcmFwcGVyfSBmcm9tICdhbmd1bGFyMi9zcmMvZmFjYWRlL2FzeW5jJztcbmltcG9ydCB7TGlzdFdyYXBwZXJ9IGZyb20gJ2FuZ3VsYXIyL3NyYy9mYWNhZGUvY29sbGVjdGlvbic7XG5pbXBvcnQge0xvY2F0aW9ufSBmcm9tICdhbmd1bGFyMi9zcmMvcm91dGVyL2xvY2F0aW9uJztcblxuLyoqXG4gKiBBIHNweSBmb3Ige0BsaW5rIExvY2F0aW9ufSB0aGF0IGFsbG93cyB0ZXN0cyB0byBmaXJlIHNpbXVsYXRlZCBsb2NhdGlvbiBldmVudHMuXG4gKi9cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTcHlMb2NhdGlvbiBpbXBsZW1lbnRzIExvY2F0aW9uIHtcbiAgdXJsQ2hhbmdlczogc3RyaW5nW10gPSBbXTtcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfcGF0aDogc3RyaW5nID0gJyc7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3F1ZXJ5OiBzdHJpbmcgPSAnJztcbiAgLyoqIEBpbnRlcm5hbCAqL1xuICBfc3ViamVjdDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX2Jhc2VIcmVmOiBzdHJpbmcgPSAnJztcblxuICBzZXRJbml0aWFsUGF0aCh1cmw6IHN0cmluZykgeyB0aGlzLl9wYXRoID0gdXJsOyB9XG5cbiAgc2V0QmFzZUhyZWYodXJsOiBzdHJpbmcpIHsgdGhpcy5fYmFzZUhyZWYgPSB1cmw7IH1cblxuICBwYXRoKCk6IHN0cmluZyB7IHJldHVybiB0aGlzLl9wYXRoOyB9XG5cbiAgc2ltdWxhdGVVcmxQb3AocGF0aG5hbWU6IHN0cmluZykge1xuICAgIE9ic2VydmFibGVXcmFwcGVyLmNhbGxFbWl0KHRoaXMuX3N1YmplY3QsIHsndXJsJzogcGF0aG5hbWUsICdwb3AnOiB0cnVlfSk7XG4gIH1cblxuICBzaW11bGF0ZUhhc2hDaGFuZ2UocGF0aG5hbWU6IHN0cmluZykge1xuICAgIC8vIEJlY2F1c2Ugd2UgZG9uJ3QgcHJldmVudCB0aGUgbmF0aXZlIGV2ZW50LCB0aGUgYnJvd3NlciB3aWxsIGluZGVwZW5kZW50bHkgdXBkYXRlIHRoZSBwYXRoXG4gICAgdGhpcy5zZXRJbml0aWFsUGF0aChwYXRobmFtZSk7XG4gICAgdGhpcy51cmxDaGFuZ2VzLnB1c2goJ2hhc2g6ICcgKyBwYXRobmFtZSk7XG4gICAgT2JzZXJ2YWJsZVdyYXBwZXIuY2FsbEVtaXQodGhpcy5fc3ViamVjdCwgeyd1cmwnOiBwYXRobmFtZSwgJ3BvcCc6IHRydWUsICd0eXBlJzogJ2hhc2hjaGFuZ2UnfSk7XG4gIH1cblxuICBwcmVwYXJlRXh0ZXJuYWxVcmwodXJsOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmICh1cmwubGVuZ3RoID4gMCAmJiAhdXJsLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgICAgdXJsID0gJy8nICsgdXJsO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5fYmFzZUhyZWYgKyB1cmw7XG4gIH1cblxuICBnbyhwYXRoOiBzdHJpbmcsIHF1ZXJ5OiBzdHJpbmcgPSAnJykge1xuICAgIHBhdGggPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybChwYXRoKTtcbiAgICBpZiAodGhpcy5fcGF0aCA9PSBwYXRoICYmIHRoaXMuX3F1ZXJ5ID09IHF1ZXJ5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3BhdGggPSBwYXRoO1xuICAgIHRoaXMuX3F1ZXJ5ID0gcXVlcnk7XG5cbiAgICB2YXIgdXJsID0gcGF0aCArIChxdWVyeS5sZW5ndGggPiAwID8gKCc/JyArIHF1ZXJ5KSA6ICcnKTtcbiAgICB0aGlzLnVybENoYW5nZXMucHVzaCh1cmwpO1xuICB9XG5cbiAgcmVwbGFjZVN0YXRlKHBhdGg6IHN0cmluZywgcXVlcnk6IHN0cmluZyA9ICcnKSB7XG4gICAgcGF0aCA9IHRoaXMucHJlcGFyZUV4dGVybmFsVXJsKHBhdGgpO1xuICAgIHRoaXMuX3BhdGggPSBwYXRoO1xuICAgIHRoaXMuX3F1ZXJ5ID0gcXVlcnk7XG5cbiAgICB2YXIgdXJsID0gcGF0aCArIChxdWVyeS5sZW5ndGggPiAwID8gKCc/JyArIHF1ZXJ5KSA6ICcnKTtcbiAgICB0aGlzLnVybENoYW5nZXMucHVzaCgncmVwbGFjZTogJyArIHVybCk7XG4gIH1cblxuICBmb3J3YXJkKCkge1xuICAgIC8vIFRPRE9cbiAgfVxuXG4gIGJhY2soKSB7XG4gICAgLy8gVE9ET1xuICB9XG5cbiAgc3Vic2NyaWJlKG9uTmV4dDogKHZhbHVlOiBhbnkpID0+IHZvaWQsIG9uVGhyb3c6IChlcnJvcjogYW55KSA9PiB2b2lkID0gbnVsbCxcbiAgICAgICAgICAgIG9uUmV0dXJuOiAoKSA9PiB2b2lkID0gbnVsbCk6IE9iamVjdCB7XG4gICAgcmV0dXJuIE9ic2VydmFibGVXcmFwcGVyLnN1YnNjcmliZSh0aGlzLl9zdWJqZWN0LCBvbk5leHQsIG9uVGhyb3csIG9uUmV0dXJuKTtcbiAgfVxuXG4gIC8vIFRPRE86IHJlbW92ZSB0aGVzZSBvbmNlIExvY2F0aW9uIGlzIGFuIGludGVyZmFjZSwgYW5kIGNhbiBiZSBpbXBsZW1lbnRlZCBjbGVhbmx5XG4gIHBsYXRmb3JtU3RyYXRlZ3k6IGFueSA9IG51bGw7XG4gIG5vcm1hbGl6ZSh1cmw6IHN0cmluZyk6IHN0cmluZyB7IHJldHVybiBudWxsOyB9XG59XG5cblxuXG4vKiogV0VCUEFDSyBGT09URVIgKipcbiAqKiBhbmd1bGFyMi9zcmMvbW9jay9sb2NhdGlvbl9tb2NrLnRzXG4gKiovIl0sInNvdXJjZVJvb3QiOiIifQ==