1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183 |
- 'use strict';
- var fs = require('fs-extra');
- var path = require('path');
- var tsMorph = require('ts-morph');
- var LiveServer = require('@compodoc/live-server');
- var _ = require('lodash');
- var ts = require('typescript');
- var semver = require('semver');
- var i18next = require('i18next');
- var JSON5 = require('json5');
- var htmlEntities = require('html-entities');
- var cheerio = require('cheerio');
- var uuid = require('uuid');
- var cosmiconfig = require('cosmiconfig');
- function _interopNamespaceDefault(e) {
- var n = Object.create(null);
- if (e) {
- Object.keys(e).forEach(function (k) {
- if (k !== 'default') {
- var d = Object.getOwnPropertyDescriptor(e, k);
- Object.defineProperty(n, k, d.get ? d : {
- enumerable: true,
- get: function () { return e[k]; }
- });
- }
- });
- }
- n.default = e;
- return Object.freeze(n);
- }
- var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
- var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
- var LiveServer__namespace = /*#__PURE__*/_interopNamespaceDefault(LiveServer);
- var ___namespace = /*#__PURE__*/_interopNamespaceDefault(_);
- var ts__namespace = /*#__PURE__*/_interopNamespaceDefault(ts);
- var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
- var JSON5__namespace = /*#__PURE__*/_interopNamespaceDefault(JSON5);
- var cheerio__namespace = /*#__PURE__*/_interopNamespaceDefault(cheerio);
- /******************************************************************************
- Copyright (c) Microsoft Corporation.
- Permission to use, copy, modify, and/or distribute this software for any
- purpose with or without fee is hereby granted.
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
- PERFORMANCE OF THIS SOFTWARE.
- ***************************************************************************** */
- /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
- var extendStatics = function(d, b) {
- extendStatics = Object.setPrototypeOf ||
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
- return extendStatics(d, b);
- };
- function __extends(d, b) {
- if (typeof b !== "function" && b !== null)
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
- extendStatics(d, b);
- function __() { this.constructor = d; }
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
- }
- var __assign = function() {
- __assign = Object.assign || function __assign(t) {
- for (var s, i = 1, n = arguments.length; i < n; i++) {
- s = arguments[i];
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
- }
- return t;
- };
- return __assign.apply(this, arguments);
- };
- function __values(o) {
- var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
- if (m) return m.call(o);
- if (o && typeof o.length === "number") return {
- next: function () {
- if (o && i >= o.length) o = void 0;
- return { value: o && o[i++], done: !o };
- }
- };
- throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
- }
- function __read(o, n) {
- var m = typeof Symbol === "function" && o[Symbol.iterator];
- if (!m) return o;
- var i = m.call(o), r, ar = [], e;
- try {
- while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
- }
- catch (error) { e = { error: error }; }
- finally {
- try {
- if (r && !r.done && (m = i["return"])) m.call(i);
- }
- finally { if (e) throw e.error; }
- }
- return ar;
- }
- function __spreadArray(to, from, pack) {
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
- if (ar || !(i in from)) {
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
- ar[i] = from[i];
- }
- }
- return to.concat(ar || Array.prototype.slice.call(from));
- }
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
- var e = new Error(message);
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
- };
- var log = require('fancy-log');
- var c = require('picocolors');
- var LEVEL;
- (function (LEVEL) {
- LEVEL[LEVEL["INFO"] = 0] = "INFO";
- LEVEL[LEVEL["DEBUG"] = 1] = "DEBUG";
- LEVEL[LEVEL["ERROR"] = 2] = "ERROR";
- LEVEL[LEVEL["WARN"] = 3] = "WARN";
- })(LEVEL || (LEVEL = {}));
- var Logger = /** @class */ (function () {
- function Logger() {
- this.logger = log;
- this.silent = true;
- }
- Logger.prototype.info = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (!this.silent) {
- return;
- }
- this.logger(this.format.apply(this, __spreadArray([LEVEL.INFO], __read(args), false)));
- };
- Logger.prototype.error = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- this.logger(this.format.apply(this, __spreadArray([LEVEL.ERROR], __read(args), false)));
- };
- Logger.prototype.warn = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (!this.silent) {
- return;
- }
- this.logger(this.format.apply(this, __spreadArray([LEVEL.WARN], __read(args), false)));
- };
- Logger.prototype.debug = function () {
- var args = [];
- for (var _i = 0; _i < arguments.length; _i++) {
- args[_i] = arguments[_i];
- }
- if (!this.silent) {
- return;
- }
- this.logger(this.format.apply(this, __spreadArray([LEVEL.DEBUG], __read(args), false)));
- };
- Logger.prototype.format = function (level) {
- var args = [];
- for (var _i = 1; _i < arguments.length; _i++) {
- args[_i - 1] = arguments[_i];
- }
- var pad = function (s, l, z) {
- return s + Array(Math.max(0, l - s.length + 1)).join(z);
- };
- var msg = args.join(' ');
- if (args.length > 1) {
- msg = "".concat(pad(args.shift(), 15, ' '), ": ").concat(args.join(' '));
- }
- switch (level) {
- case LEVEL.INFO:
- msg = c.green(msg);
- break;
- case LEVEL.DEBUG:
- msg = c.cyan(msg);
- break;
- case LEVEL.WARN:
- msg = c.yellow(msg);
- break;
- case LEVEL.ERROR:
- msg = c.red(msg);
- break;
- }
- return [msg].join('');
- };
- return Logger;
- }());
- var logger = new Logger();
- var COMPODOC_DEFAULTS = {
- title: 'Application documentation',
- additionalEntryName: 'Additional documentation',
- additionalEntryPath: 'additional-documentation',
- folder: './documentation/',
- hostname: '127.0.0.1',
- port: 8080,
- theme: 'gitbook',
- exportFormat: 'html',
- exportFormatsSupported: ['html', 'json'],
- base: '/',
- defaultCoverageThreshold: 70,
- defaultCoverageMinimumPerFile: 0,
- coverageTestThresholdFail: true,
- toggleMenuItems: ['all'],
- navTabConfig: [],
- disableSourceCode: false,
- disableDomTree: false,
- disableTemplateTab: false,
- disableStyleTab: false,
- disableGraph: false,
- disableMainGraph: false,
- disableCoverage: false,
- disablePrivate: false,
- disableProtected: false,
- disableInternal: false,
- disableLifeCycleHooks: false,
- disableConstructors: false,
- disableRoutesGraph: false,
- disableDependencies: false,
- disableProperties: false,
- PAGE_TYPES: {
- ROOT: 'root',
- INTERNAL: 'internal'
- },
- gaSite: 'auto',
- coverageTestShowOnlyFailed: false,
- language: 'en-US',
- maxSearchResults: 15
- };
- var Configuration = /** @class */ (function () {
- function Configuration() {
- this._pages = [];
- this._mainData = {
- output: COMPODOC_DEFAULTS.folder,
- theme: COMPODOC_DEFAULTS.theme,
- extTheme: '',
- serve: false,
- hostname: COMPODOC_DEFAULTS.hostname,
- host: '',
- port: COMPODOC_DEFAULTS.port,
- open: false,
- assetsFolder: '',
- documentationMainName: COMPODOC_DEFAULTS.title,
- documentationMainDescription: '',
- base: COMPODOC_DEFAULTS.base,
- hideGenerator: false,
- hideDarkModeToggle: false,
- hasFilesToCoverage: false,
- modules: [],
- readme: false,
- changelog: '',
- contributing: '',
- license: '',
- todo: '',
- markdowns: [],
- additionalPages: [],
- pipes: [],
- classes: [],
- interfaces: [],
- components: [],
- controllers: [],
- entities: [],
- directives: [],
- injectables: [],
- interceptors: [],
- guards: [],
- miscellaneous: [],
- routes: [],
- tsconfig: '',
- toggleMenuItems: COMPODOC_DEFAULTS.toggleMenuItems,
- navTabConfig: [],
- templates: '',
- includes: '',
- includesName: COMPODOC_DEFAULTS.additionalEntryName,
- includesFolder: COMPODOC_DEFAULTS.additionalEntryPath,
- disableSourceCode: COMPODOC_DEFAULTS.disableSourceCode,
- disableDomTree: COMPODOC_DEFAULTS.disableDomTree,
- disableTemplateTab: COMPODOC_DEFAULTS.disableTemplateTab,
- disableStyleTab: COMPODOC_DEFAULTS.disableStyleTab,
- disableGraph: COMPODOC_DEFAULTS.disableGraph,
- disableMainGraph: COMPODOC_DEFAULTS.disableMainGraph,
- disableCoverage: COMPODOC_DEFAULTS.disableCoverage,
- disablePrivate: COMPODOC_DEFAULTS.disablePrivate,
- disableInternal: COMPODOC_DEFAULTS.disableInternal,
- disableProtected: COMPODOC_DEFAULTS.disableProtected,
- disableLifeCycleHooks: COMPODOC_DEFAULTS.disableLifeCycleHooks,
- disableConstructors: COMPODOC_DEFAULTS.disableConstructors,
- disableRoutesGraph: COMPODOC_DEFAULTS.disableRoutesGraph,
- disableSearch: false,
- disableDependencies: COMPODOC_DEFAULTS.disableDependencies,
- disableProperties: COMPODOC_DEFAULTS.disableProperties,
- watch: false,
- mainGraph: '',
- coverageTest: false,
- coverageTestThreshold: COMPODOC_DEFAULTS.defaultCoverageThreshold,
- coverageTestThresholdFail: COMPODOC_DEFAULTS.coverageTestThresholdFail,
- coverageTestPerFile: false,
- coverageMinimumPerFile: COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile,
- unitTestCoverage: '',
- unitTestData: undefined,
- coverageTestShowOnlyFailed: COMPODOC_DEFAULTS.coverageTestShowOnlyFailed,
- routesLength: 0,
- angularVersion: '',
- exportFormat: COMPODOC_DEFAULTS.exportFormat,
- coverageData: {},
- customFavicon: '',
- customLogo: '',
- packageDependencies: [],
- packagePeerDependencies: [],
- packageProperties: {},
- gaID: '',
- gaSite: '',
- angularProject: false,
- angularJSProject: false,
- language: COMPODOC_DEFAULTS.language,
- maxSearchResults: 15
- };
- }
- Configuration.getInstance = function () {
- if (!Configuration.instance) {
- Configuration.instance = new Configuration();
- }
- return Configuration.instance;
- };
- Configuration.prototype.addPage = function (page) {
- var indexPage = ___namespace.findIndex(this._pages, { name: page.name });
- if (indexPage === -1) {
- this._pages.push(page);
- }
- };
- Configuration.prototype.hasPage = function (name) {
- var indexPage = ___namespace.findIndex(this._pages, { name: name });
- return indexPage !== -1;
- };
- Configuration.prototype.addAdditionalPage = function (page) {
- this._mainData.additionalPages.push(page);
- };
- Configuration.prototype.getAdditionalPageById = function (id) {
- return this._mainData.additionalPages.find(function (page) { return page.id === id; });
- };
- Configuration.prototype.resetPages = function () {
- this._pages = [];
- };
- Configuration.prototype.resetAdditionalPages = function () {
- this._mainData.additionalPages = [];
- };
- Configuration.prototype.resetRootMarkdownPages = function () {
- var indexPage = ___namespace.findIndex(this._pages, { name: 'index' });
- this._pages.splice(indexPage, 1);
- indexPage = ___namespace.findIndex(this._pages, { name: 'changelog' });
- this._pages.splice(indexPage, 1);
- indexPage = ___namespace.findIndex(this._pages, { name: 'contributing' });
- this._pages.splice(indexPage, 1);
- indexPage = ___namespace.findIndex(this._pages, { name: 'license' });
- this._pages.splice(indexPage, 1);
- indexPage = ___namespace.findIndex(this._pages, { name: 'todo' });
- this._pages.splice(indexPage, 1);
- this._mainData.markdowns = [];
- };
- Object.defineProperty(Configuration.prototype, "pages", {
- get: function () {
- return this._pages;
- },
- set: function (pages) {
- this._pages = [];
- },
- enumerable: false,
- configurable: true
- });
- Object.defineProperty(Configuration.prototype, "markDownPages", {
- get: function () {
- return this._pages.filter(function (page) { return page.markdown; });
- },
- enumerable: false,
- configurable: true
- });
- Object.defineProperty(Configuration.prototype, "mainData", {
- get: function () {
- return this._mainData;
- },
- set: function (data) {
- Object.assign(this._mainData, data);
- },
- enumerable: false,
- configurable: true
- });
- return Configuration;
- }());
- var Configuration$1 = Configuration.getInstance();
- var AngularAPIs = require('../src/data/api-list.json');
- var AngularApiUtil = /** @class */ (function () {
- function AngularApiUtil() {
- }
- AngularApiUtil.getInstance = function () {
- if (!AngularApiUtil.instance) {
- AngularApiUtil.instance = new AngularApiUtil();
- }
- return AngularApiUtil.instance;
- };
- AngularApiUtil.prototype.findApi = function (type) {
- var foundedApi;
- ___namespace.forEach(AngularAPIs, function (mainApi) {
- ___namespace.forEach(mainApi.items, function (api) {
- if (api.title === type) {
- foundedApi = api;
- }
- });
- });
- return {
- source: 'external',
- data: foundedApi
- };
- };
- return AngularApiUtil;
- }());
- var AngularApiUtil$1 = AngularApiUtil.getInstance();
- function extractLeadingText(string, completeTag) {
- var tagIndex = string.indexOf(completeTag);
- var leadingText = undefined;
- var leadingTextRegExp = /\[(.+?)\]/g;
- var leadingTextInfo = leadingTextRegExp.exec(string);
- // did we find leading text, and if so, does it immediately precede the tag?
- while (leadingTextInfo && leadingTextInfo.length) {
- if (leadingTextInfo.index + leadingTextInfo[0].length === tagIndex) {
- string = string.replace(leadingTextInfo[0], '');
- leadingText = leadingTextInfo[1];
- break;
- }
- leadingTextInfo = leadingTextRegExp.exec(string);
- }
- return {
- leadingText: leadingText,
- string: string
- };
- }
- function splitLinkText(text) {
- var linkText;
- var target;
- var splitIndex;
- // if a pipe is not present, we split on the first space
- splitIndex = text.indexOf('|');
- if (splitIndex === -1) {
- splitIndex = text.search(/\s/);
- }
- if (splitIndex !== -1) {
- linkText = text.substr(splitIndex + 1);
- // Normalize subsequent newlines to a single space.
- linkText = linkText.replace(/\n+/, ' ');
- target = text.substr(0, splitIndex);
- }
- return {
- linkText: linkText,
- target: target || text
- };
- }
- var LinkParser = (function () {
- var processTheLink = function (string, tagInfo, leadingText) {
- var leading = extractLeadingText(string, tagInfo.completeTag), linkText, split, target, stringtoReplace;
- linkText = leadingText ? leadingText : leading.leadingText || '';
- split = splitLinkText(tagInfo.text);
- target = split.target;
- if (leading.leadingText !== undefined) {
- stringtoReplace = '[' + leading.leadingText + ']' + tagInfo.completeTag;
- }
- else if (typeof split.linkText !== 'undefined') {
- stringtoReplace = tagInfo.completeTag;
- linkText = split.linkText;
- }
- if (linkText === '' || linkText == null || target == null) {
- return string;
- }
- return string.replace(stringtoReplace, '[' + linkText + '](' + target + ')');
- };
- /**
- * Convert
- * {@link http://www.google.com|Google} or {@link https://github.com GitHub} or [Github]{@link https://github.com} to [Github](https://github.com)
- */
- var replaceLinkTag = function (str) {
- if (typeof str === 'undefined') {
- return {
- newString: ''
- };
- }
- // new RegExp('\\[((?:.|\n)+?)]\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TO DO]{@link Todo} fo') -> "[TO DO]{@link Todo}", "TO DO", "Todo"
- // new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TODO]{@link Todo} fo') -> "{@link Todo}", "Todo"
- var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExp, matches, previousString;
- tagRegExp = str.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
- function replaceMatch(replacer, tag, match, text, linkText) {
- var matchedTag = {
- completeTag: match,
- tag: tag,
- text: text
- };
- if (linkText) {
- return replacer(str, matchedTag, linkText);
- }
- else {
- return replacer(str, matchedTag);
- }
- }
- do {
- matches = tagRegExp.exec(str);
- if (matches) {
- previousString = str;
- if (matches.length === 2) {
- str = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
- }
- if (matches.length === 3) {
- str = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
- }
- }
- } while (matches && previousString !== str);
- return {
- newString: str
- };
- };
- var _resolveLinks = function (str) {
- return replaceLinkTag(str).newString;
- };
- return {
- resolveLinks: _resolveLinks
- };
- })();
- var AngularLifecycleHooks;
- (function (AngularLifecycleHooks) {
- AngularLifecycleHooks[AngularLifecycleHooks["ngOnChanges"] = 0] = "ngOnChanges";
- AngularLifecycleHooks[AngularLifecycleHooks["ngOnInit"] = 1] = "ngOnInit";
- AngularLifecycleHooks[AngularLifecycleHooks["ngDoCheck"] = 2] = "ngDoCheck";
- AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentInit"] = 3] = "ngAfterContentInit";
- AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentChecked"] = 4] = "ngAfterContentChecked";
- AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewInit"] = 5] = "ngAfterViewInit";
- AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewChecked"] = 6] = "ngAfterViewChecked";
- AngularLifecycleHooks[AngularLifecycleHooks["ngOnDestroy"] = 7] = "ngOnDestroy";
- })(AngularLifecycleHooks || (AngularLifecycleHooks = {}));
- var KindType;
- (function (KindType) {
- KindType["UNKNOWN"] = "";
- KindType["STRING"] = "string";
- KindType["NUMBER"] = "number";
- KindType["ARRAY"] = "[]";
- KindType["VOID"] = "void";
- KindType["FUNCTION"] = "function";
- KindType["TEMPLATE_LITERAL"] = "template literal type";
- KindType["LITERAL"] = "literal type";
- KindType["BOOLEAN"] = "boolean";
- KindType["ANY"] = "any";
- KindType["NULL"] = "null";
- KindType["SYMBOL"] = "symbol";
- KindType["NEVER"] = "never";
- KindType["UNDEFINED"] = "undefined";
- KindType["OBJECT"] = "object";
- })(KindType || (KindType = {}));
- var IsKindType = {
- ANY: function (kind) {
- return kindToType(kind) === KindType.ANY;
- },
- ARRAY: function (kind) {
- return kindToType(kind) === KindType.ARRAY;
- },
- BOOLEAN: function (kind) {
- return kindToType(kind) === KindType.BOOLEAN;
- },
- FUNCTION: function (kind) {
- return kindToType(kind) === KindType.FUNCTION;
- },
- LITERAL: function (kind) {
- return kindToType(kind) === KindType.LITERAL;
- },
- NEVER: function (kind) {
- return kindToType(kind) === KindType.NEVER;
- },
- NULL: function (kind) {
- return kindToType(kind) === KindType.NULL;
- },
- NUMBER: function (kind) {
- return kindToType(kind) === KindType.NUMBER;
- },
- OBJECT: function (kind) {
- return kindToType(kind) === KindType.OBJECT;
- },
- STRING: function (kind) {
- return kindToType(kind) === KindType.STRING;
- },
- SYMBOL: function (kind) {
- return kindToType(kind) === KindType.SYMBOL;
- },
- TEMPLATE_LITERAL: function (kind) {
- return kindToType(kind) === KindType.TEMPLATE_LITERAL;
- },
- UNDEFINED: function (kind) {
- return kindToType(kind) === KindType.UNDEFINED;
- },
- UNKNOWN: function (kind) {
- return kindToType(kind) === KindType.UNKNOWN;
- },
- VOID: function (kind) {
- return kindToType(kind) === KindType.VOID;
- }
- };
- function kindToType(kind) {
- var _type = KindType.UNKNOWN;
- switch (kind) {
- case tsMorph.SyntaxKind.StringKeyword:
- case tsMorph.SyntaxKind.StringLiteral:
- _type = KindType.STRING;
- break;
- case tsMorph.SyntaxKind.NumberKeyword:
- case tsMorph.SyntaxKind.NumericLiteral:
- _type = KindType.NUMBER;
- break;
- case tsMorph.SyntaxKind.ArrayType:
- case tsMorph.SyntaxKind.ArrayLiteralExpression:
- _type = KindType.ARRAY;
- break;
- case tsMorph.SyntaxKind.VoidKeyword:
- _type = KindType.VOID;
- break;
- case tsMorph.SyntaxKind.FunctionType:
- _type = KindType.FUNCTION;
- break;
- case tsMorph.SyntaxKind.TemplateLiteralType:
- _type = KindType.TEMPLATE_LITERAL;
- break;
- case tsMorph.SyntaxKind.TypeLiteral:
- _type = KindType.LITERAL;
- break;
- case tsMorph.SyntaxKind.BooleanKeyword:
- _type = KindType.BOOLEAN;
- break;
- case tsMorph.SyntaxKind.AnyKeyword:
- _type = KindType.ANY;
- break;
- case tsMorph.SyntaxKind.NullKeyword:
- _type = KindType.NULL;
- break;
- case tsMorph.SyntaxKind.SymbolKeyword:
- _type = KindType.SYMBOL;
- break;
- case tsMorph.SyntaxKind.NeverKeyword:
- _type = KindType.NEVER;
- break;
- case tsMorph.SyntaxKind.UndefinedKeyword:
- _type = KindType.UNDEFINED;
- break;
- case tsMorph.SyntaxKind.ObjectKeyword:
- case tsMorph.SyntaxKind.ObjectLiteralExpression:
- _type = KindType.OBJECT;
- break;
- }
- return _type;
- }
- var tsany = ts__namespace;
- // https://github.com/Microsoft/TypeScript/blob/v2.1.4/src/compiler/utilities.ts#L1423
- function getJSDocCommentRanges(node, text) {
- return tsany.getJSDocCommentRanges.apply(this, arguments);
- }
- var JsdocParserUtil = /** @class */ (function () {
- function JsdocParserUtil() {
- }
- JsdocParserUtil.prototype.isVariableLike = function (node) {
- if (node) {
- switch (node.kind) {
- case tsMorph.SyntaxKind.BindingElement:
- case tsMorph.SyntaxKind.EnumMember:
- case tsMorph.SyntaxKind.Parameter:
- case tsMorph.SyntaxKind.PropertyAssignment:
- case tsMorph.SyntaxKind.PropertyDeclaration:
- case tsMorph.SyntaxKind.PropertySignature:
- case tsMorph.SyntaxKind.ShorthandPropertyAssignment:
- case tsMorph.SyntaxKind.VariableDeclaration:
- return true;
- }
- }
- return false;
- };
- JsdocParserUtil.prototype.isTopmostModuleDeclaration = function (node) {
- if (node.nextContainer && node.nextContainer.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
- var next = node.nextContainer;
- if (node.name.end + 1 === next.name.pos) {
- return false;
- }
- }
- return true;
- };
- JsdocParserUtil.prototype.getRootModuleDeclaration = function (node) {
- while (node.parent && node.parent.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
- var parent = node.parent;
- if (node.name.pos === parent.name.end + 1) {
- node = parent;
- }
- else {
- break;
- }
- }
- return node;
- };
- JsdocParserUtil.prototype.getMainCommentOfNode = function (node, sourceFile) {
- var description = '';
- if (node.parent && node.parent.kind === tsMorph.ts.SyntaxKind.VariableDeclarationList) {
- node = node.parent.parent;
- }
- else if (node.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
- if (!this.isTopmostModuleDeclaration(node)) {
- return null;
- }
- else {
- node = this.getRootModuleDeclaration(node);
- }
- }
- var comments = getJSDocCommentRanges(node, sourceFile.text);
- if (comments && comments.length) {
- var comment = void 0;
- if (node.kind === tsMorph.ts.SyntaxKind.SourceFile) {
- if (comments.length === 1) {
- return null;
- }
- comment = comments[0];
- }
- else {
- comment = comments[comments.length - 1];
- }
- description = sourceFile.text.substring(comment.pos, comment.end);
- }
- return description;
- };
- JsdocParserUtil.prototype.parseComment = function (text) {
- var comment = '';
- var shortText = 0;
- function readBareLine(line) {
- comment += '\n' + line;
- if (line === '' && shortText === 0) ;
- else if (line === '' && shortText === 1) {
- shortText = 2;
- }
- else {
- if (shortText === 2) {
- comment += (comment === '' ? '' : '\n') + line;
- }
- }
- }
- var CODE_FENCE = /^\s*```(?!.*```)/;
- var inCode = false;
- var inExample = false; // first line with @example, end line with empty string or string or */
- function readLine(line, index) {
- line = line.replace(/^\s*\*? ?/, '');
- line = line.replace(/\s*$/, '');
- if (CODE_FENCE.test(line)) {
- inCode = !inCode;
- }
- if (line.indexOf('@example') !== -1) {
- inExample = true;
- line = '```html';
- }
- if (inExample && line === '') {
- inExample = false;
- line = '```';
- }
- if (!inCode) {
- var tag = /^@(\S+)/.exec(line);
- var SeeTag = /^@see/.exec(line);
- if (SeeTag) {
- line = line.replace(/^@see/, 'See');
- }
- if (tag && !SeeTag) {
- return;
- }
- }
- readBareLine(line);
- }
- text = text.replace(/^\s*\/\*+/, '');
- text = text.replace(/\*+\/\s*$/, '');
- text.split(/\r\n?|\n/).length;
- text.split(/\r\n?|\n/).forEach(readLine);
- return comment;
- };
- JsdocParserUtil.prototype.getJSDocTags = function (node, kind) {
- var e_1, _a;
- var docs = this.getJSDocs(node);
- if (docs) {
- var result = [];
- try {
- for (var docs_1 = __values(docs), docs_1_1 = docs_1.next(); !docs_1_1.done; docs_1_1 = docs_1.next()) {
- var doc = docs_1_1.value;
- if (tsMorph.ts.isJSDocParameterTag(doc)) {
- if (doc.kind === kind) {
- result.push(doc);
- }
- }
- else if (tsMorph.ts.isJSDoc(doc)) {
- result.push.apply(result, __spreadArray([], __read(___namespace.filter(doc.tags, function (tag) { return tag.kind === kind; })), false));
- }
- else {
- throw new Error('Unexpected type');
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (docs_1_1 && !docs_1_1.done && (_a = docs_1.return)) _a.call(docs_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- return result;
- }
- };
- JsdocParserUtil.prototype.getJSDocs = function (node) {
- // TODO: jsDocCache is internal, see if there's a way around it
- var cache = node.jsDocCache;
- if (!cache) {
- cache = this.getJSDocsWorker(node, []).filter(function (x) { return x; });
- node.jsDocCache = cache;
- }
- return cache;
- };
- // Try to recognize this pattern when node is initializer
- // of variable declaration and JSDoc comments are on containing variable statement.
- // /**
- // * @param {number} name
- // * @returns {number}
- // */
- // var x = function(name) { return name.length; }
- JsdocParserUtil.prototype.getJSDocsWorker = function (node, cache) {
- var parent = node.parent;
- var isInitializerOfVariableDeclarationInStatement = this.isVariableLike(parent) &&
- parent.initializer === node &&
- tsMorph.ts.isVariableStatement(parent.parent.parent);
- var isVariableOfVariableDeclarationStatement = this.isVariableLike(node) && tsMorph.ts.isVariableStatement(parent.parent);
- var variableStatementNode = isInitializerOfVariableDeclarationInStatement
- ? parent.parent.parent
- : isVariableOfVariableDeclarationStatement
- ? parent.parent
- : undefined;
- if (variableStatementNode) {
- cache = this.getJSDocsWorker(variableStatementNode, cache);
- }
- // Also recognize when the node is the RHS of an assignment expression
- var isSourceOfAssignmentExpressionStatement = parent &&
- parent.parent &&
- tsMorph.ts.isBinaryExpression(parent) &&
- parent.operatorToken.kind === tsMorph.SyntaxKind.EqualsToken &&
- tsMorph.ts.isExpressionStatement(parent.parent);
- if (isSourceOfAssignmentExpressionStatement) {
- cache = this.getJSDocsWorker(parent.parent, cache);
- }
- var isModuleDeclaration = tsMorph.ts.isModuleDeclaration(node) && parent && tsMorph.ts.isModuleDeclaration(parent);
- var isPropertyAssignmentExpression = parent && tsMorph.ts.isPropertyAssignment(parent);
- if (isModuleDeclaration || isPropertyAssignmentExpression) {
- cache = this.getJSDocsWorker(parent, cache);
- }
- // Pull parameter comments from declaring function as well
- if (tsMorph.ts.isParameter(node)) {
- cache = ___namespace.concat(cache, this.getJSDocParameterTags(node));
- }
- if (this.isVariableLike(node) && node.initializer) {
- cache = ___namespace.concat(cache, node.initializer.jsDoc);
- }
- cache = ___namespace.concat(cache, node.jsDoc);
- return cache;
- };
- JsdocParserUtil.prototype.getJSDocParameterTags = function (param) {
- var func = param.parent;
- var tags = this.getJSDocTags(func, tsMorph.SyntaxKind.JSDocParameterTag);
- if (!param.name) {
- // this is an anonymous jsdoc param from a `function(type1, type2): type3` specification
- var i = func.parameters.indexOf(param);
- var paramTags = ___namespace.filter(tags, function (tag) { return tsMorph.ts.isJSDocParameterTag(tag); });
- if (paramTags && 0 <= i && i < paramTags.length) {
- return [paramTags[i]];
- }
- }
- else if (tsMorph.ts.isIdentifier(param.name)) {
- var name_1 = param.name.text;
- return ___namespace.filter(tags, function (tag) {
- if (tsMorph.ts && tsMorph.ts.isJSDocParameterTag(tag)) {
- var t = tag;
- if (typeof t.parameterName !== 'undefined') {
- return t.parameterName.text === name_1;
- }
- else if (typeof t.name !== 'undefined') {
- if (typeof t.name.escapedText !== 'undefined') {
- return t.name.escapedText === name_1;
- }
- }
- }
- });
- }
- else {
- // TODO: it's a destructured parameter, so it should look up an "object type" series of multiple lines
- // But multi-line object types aren't supported yet either
- return undefined;
- }
- };
- JsdocParserUtil.prototype.parseJSDocNode = function (node) {
- var rawDescription = '';
- if (typeof node.comment === 'string') {
- rawDescription += node.comment;
- }
- else {
- if (node.comment) {
- var len = node.comment.length;
- for (var i = 0; i < len; i++) {
- var JSDocNode = node.comment[i];
- switch (JSDocNode.kind) {
- case tsMorph.SyntaxKind.JSDocComment:
- rawDescription += JSDocNode.comment;
- break;
- case tsMorph.SyntaxKind.JSDocText:
- rawDescription += JSDocNode.text;
- break;
- case tsMorph.SyntaxKind.JSDocLink:
- if (JSDocNode.name) {
- var text = JSDocNode.name.escapedText;
- if (text === undefined &&
- JSDocNode.name.left &&
- JSDocNode.name.right) {
- text =
- JSDocNode.name.left.escapedText +
- '.' +
- JSDocNode.name.right.escapedText;
- }
- rawDescription += JSDocNode.text + '{@link ' + text + '}';
- }
- break;
- }
- }
- }
- }
- return rawDescription;
- };
- return JsdocParserUtil;
- }());
- var marked = require('marked').marked;
- marked.use({
- mangle: false,
- headerIds: false
- });
- var markedAcl = marked;
- var getCurrentDirectory = tsMorph.ts.sys.getCurrentDirectory;
- var useCaseSensitiveFileNames = tsMorph.ts.sys.useCaseSensitiveFileNames;
- var newLine = tsMorph.ts.sys.newLine;
- function getNewLine() {
- return newLine;
- }
- function cleanNameWithoutSpaceAndToLowerCase(name) {
- return name.toLowerCase().replace(/ /g, '-');
- }
- function getCanonicalFileName(fileName) {
- return useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
- }
- var formatDiagnosticsHost = {
- getCurrentDirectory: getCurrentDirectory,
- getCanonicalFileName: getCanonicalFileName,
- getNewLine: getNewLine
- };
- function markedtags(tags) {
- var jsdocParserUtil = new JsdocParserUtil();
- var mtags = tags;
- ___namespace.forEach(mtags, function (tag) {
- var rawComment = jsdocParserUtil.parseJSDocNode(tag);
- tag.comment = markedAcl(LinkParser.resolveLinks(rawComment));
- });
- return mtags;
- }
- function mergeTagsAndArgs(args, jsdoctags) {
- var margs = ___namespace.cloneDeep(args);
- ___namespace.forEach(margs, function (arg) {
- arg.tagName = {
- text: 'param'
- };
- if (jsdoctags) {
- ___namespace.forEach(jsdoctags, function (jsdoctag) {
- if (jsdoctag.name && jsdoctag.name.text === arg.name) {
- arg.tagName = jsdoctag.tagName;
- arg.name = jsdoctag.name;
- arg.comment = jsdoctag.comment;
- arg.typeExpression = jsdoctag.typeExpression;
- }
- });
- }
- });
- // Add example & returns & private
- if (jsdoctags) {
- ___namespace.forEach(jsdoctags, function (jsdoctag) {
- if (jsdoctag.tagName &&
- (jsdoctag.tagName.text === 'example' || jsdoctag.tagName.text === 'private')) {
- margs.push({
- tagName: jsdoctag.tagName,
- comment: jsdoctag.comment
- });
- }
- if (jsdoctag.tagName &&
- (jsdoctag.tagName.text === 'returns' || jsdoctag.tagName.text === 'return')) {
- var ret = {
- tagName: jsdoctag.tagName,
- comment: jsdoctag.comment
- };
- if (jsdoctag.typeExpression && jsdoctag.typeExpression.type) {
- ret.returnType = kindToType(jsdoctag.typeExpression.type.kind);
- }
- margs.push(ret);
- }
- });
- }
- return margs;
- }
- function readConfig(configFile) {
- var result = tsMorph.ts.readConfigFile(configFile, tsMorph.ts.sys.readFile);
- if (result.error) {
- var message = tsMorph.ts.formatDiagnostics([result.error], formatDiagnosticsHost);
- throw new Error(message);
- }
- return result.config;
- }
- function stripBom(source) {
- if (source.charCodeAt(0) === 0xfeff) {
- return source.slice(1);
- }
- return source;
- }
- function hasBom(source) {
- return source.charCodeAt(0) === 0xfeff;
- }
- function cleanLifecycleHooksFromMethods(methods) {
- var result = [];
- if (typeof methods !== 'undefined') {
- var i = 0;
- var len = methods.length;
- for (i; i < len; i++) {
- if (!(methods[i].name in AngularLifecycleHooks)) {
- result.push(methods[i]);
- }
- }
- }
- return result;
- }
- function cleanSourcesForWatch(list) {
- return list.filter(function (element) {
- if (fs__namespace.existsSync(process.cwd() + path__namespace.sep + element)) {
- return element;
- }
- });
- }
- function getNamesCompareFn(name) {
- /**
- * Copyright https://github.com/ng-bootstrap/ng-bootstrap
- */
- name = name || 'name';
- var t = function (a, b) {
- if (a[name]) {
- return a[name].localeCompare(b[name]);
- }
- else {
- return 0;
- }
- };
- return t;
- }
- function isIgnore(member) {
- var e_1, _a, e_2, _b;
- if (member.jsDoc) {
- try {
- for (var _c = __values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
- var doc = _d.value;
- if (doc.tags) {
- try {
- for (var _e = (e_2 = void 0, __values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
- var tag = _f.value;
- if (tag.tagName.text.indexOf('ignore') > -1) {
- return true;
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
- }
- finally { if (e_2) throw e_2.error; }
- }
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- return false;
- }
- // https://tc39.github.io/ecma262/#sec-array.prototype.includes
- if (!Array.prototype.includes) {
- Object.defineProperty(Array.prototype, 'includes', {
- value: function (searchElement, fromIndex) {
- if (this == null) {
- throw new TypeError('"this" is null or not defined');
- }
- // 1. Let O be ? ToObject(this value).
- var o = Object(this);
- // 2. Let len be ? ToLength(? Get(O, "length")).
- var len = o.length >>> 0;
- // 3. If len is 0, return false.
- if (len === 0) {
- return false;
- }
- // 4. Let n be ? ToInteger(fromIndex).
- // (If fromIndex is undefined, this step produces the value 0.)
- var n = fromIndex | 0;
- // 5. If n ≥ 0, then
- // a. Let k be n.
- // 6. Else n < 0,
- // a. Let k be len + n.
- // b. If k < 0, let k be 0.
- var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
- function sameValueZero(x, y) {
- return (x === y ||
- (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)));
- }
- // 7. Repeat, while k < len
- while (k < len) {
- // a. Let elementK be the result of ? Get(O, ! ToString(k)).
- // b. If SameValueZero(searchElement, elementK) is true, return true.
- if (sameValueZero(o[k], searchElement)) {
- return true;
- }
- // c. Increase k by 1.
- k++;
- }
- // 8. Return false
- return false;
- }
- });
- }
- function findMainSourceFolder(files) {
- var mainFolder = '';
- var mainFolderCount = 0;
- var rawFolders = files.map(function (filepath) {
- var shortPath = filepath.replace(process.cwd() + path__namespace.sep, '');
- return path__namespace.dirname(shortPath);
- });
- var folders = {};
- rawFolders = ___namespace.uniq(rawFolders);
- for (var i = 0; i < rawFolders.length; i++) {
- var sep = rawFolders[i].split(path__namespace.sep);
- sep.forEach(function (folder) {
- if (folders[folder]) {
- folders[folder] += 1;
- }
- else {
- folders[folder] = 1;
- }
- });
- }
- for (var f in folders) {
- if (folders[f] > mainFolderCount) {
- mainFolderCount = folders[f];
- mainFolder = f;
- }
- }
- return mainFolder;
- }
- // Create a compilerHost object to allow the compiler to read and write files
- function compilerHost(transpileOptions) {
- var inputFileName = transpileOptions.fileName || (transpileOptions.jsx ? 'module.tsx' : 'module.ts');
- var toReturn = {
- getSourceFile: function (fileName) {
- if (fileName.lastIndexOf('.ts') !== -1 || fileName.lastIndexOf('.js') !== -1) {
- if (fileName === 'lib.d.ts') {
- return undefined;
- }
- if (fileName.substr(-5) === '.d.ts') {
- return undefined;
- }
- if (path__namespace.isAbsolute(fileName) === false) {
- fileName = path__namespace.join(transpileOptions.tsconfigDirectory, fileName);
- }
- if (!fs__namespace.existsSync(fileName)) {
- return undefined;
- }
- var libSource = '';
- try {
- libSource = fs__namespace.readFileSync(fileName).toString();
- if (hasBom(libSource)) {
- libSource = stripBom(libSource);
- }
- }
- catch (e) {
- logger.debug(e, fileName);
- }
- return tsMorph.ts.createSourceFile(fileName, libSource, transpileOptions.target, false);
- }
- return undefined;
- },
- writeFile: function (name, text) { },
- getDefaultLibFileName: function () { return 'lib.d.ts'; },
- useCaseSensitiveFileNames: function () { return false; },
- getCanonicalFileName: function (fileName) { return fileName; },
- getCurrentDirectory: function () { return ''; },
- getNewLine: function () { return '\n'; },
- fileExists: function (fileName) { return fileName === inputFileName; },
- readFile: function () { return ''; },
- directoryExists: function () { return true; },
- getDirectories: function () { return []; }
- };
- return toReturn;
- }
- function detectIndent(str, count) {
- var stripIndent = function (stripedString) {
- var match = stripedString.match(/^[ \t]*(?=\S)/gm);
- if (!match) {
- return stripedString;
- }
- // TODO: use spread operator when targeting Node.js 6
- var indent = Math.min.apply(Math, match.map(function (x) { return x.length; })); // eslint-disable-line
- var re = new RegExp("^[ \\t]{".concat(indent, "}"), 'gm');
- return indent > 0 ? stripedString.replace(re, '') : stripedString;
- };
- var repeating = function (n, repeatString) {
- repeatString = repeatString === undefined ? ' ' : repeatString;
- if (typeof repeatString !== 'string') {
- throw new TypeError("Expected `input` to be a `string`, got `".concat(typeof repeatString, "`"));
- }
- if (n < 0) {
- throw new TypeError("Expected `count` to be a positive finite number, got `".concat(n, "`"));
- }
- var ret = '';
- do {
- if (n & 1) {
- ret += repeatString;
- }
- repeatString += repeatString;
- } while ((n >>= 1));
- return ret;
- };
- var indentString = function (indentedString, indentCount) {
- var indent = ' ';
- indentCount = indentCount === undefined ? 1 : indentCount;
- if (typeof indentedString !== 'string') {
- throw new TypeError("Expected `input` to be a `string`, got `".concat(typeof indentedString, "`"));
- }
- if (typeof indentCount !== 'number') {
- throw new TypeError("Expected `count` to be a `number`, got `".concat(typeof indentCount, "`"));
- }
- if (typeof indent !== 'string') {
- throw new TypeError("Expected `indent` to be a `string`, got `".concat(typeof indent, "`"));
- }
- if (indentCount === 0) {
- return indentedString;
- }
- indent = indentCount > 1 ? repeating(indentCount, indent) : indent;
- return indentedString.replace(/^(?!\s*$)/gm, indent);
- };
- return indentString(stripIndent(str), 0);
- }
- var INCLUDE_PATTERNS = ['**/*.ts', '**/*.tsx'];
- var EXCLUDE_PATTERNS = ['**/.git', '**/node_modules', '**/*.d.ts', '**/*.spec.ts'];
- var traverse$3 = require('neotraverse/legacy');
- var DependenciesEngine = /** @class */ (function () {
- function DependenciesEngine() {
- this.miscellaneous = {
- variables: [],
- functions: [],
- typealiases: [],
- enumerations: [],
- groupedVariables: [],
- groupedFunctions: [],
- groupedEnumerations: [],
- groupedTypeAliases: []
- };
- }
- DependenciesEngine.getInstance = function () {
- if (!DependenciesEngine.instance) {
- DependenciesEngine.instance = new DependenciesEngine();
- }
- return DependenciesEngine.instance;
- };
- DependenciesEngine.prototype.updateModulesDeclarationsExportsTypes = function () {
- var _this = this;
- var mergeTypes = function (entry) {
- var directive = _this.findInCompodocDependencies(entry.name, _this.directives, entry.file);
- if (typeof directive.data !== 'undefined') {
- entry.type = 'directive';
- entry.id = directive.data.id;
- }
- var component = _this.findInCompodocDependencies(entry.name, _this.components, entry.file);
- if (typeof component.data !== 'undefined') {
- entry.type = 'component';
- entry.id = component.data.id;
- }
- var pipe = _this.findInCompodocDependencies(entry.name, _this.pipes, entry.file);
- if (typeof pipe.data !== 'undefined') {
- entry.type = 'pipe';
- entry.id = pipe.data.id;
- }
- };
- this.modules.forEach(function (module) {
- module.declarations.forEach(function (declaration) {
- mergeTypes(declaration);
- });
- module.exports.forEach(function (expt) {
- mergeTypes(expt);
- });
- module.entryComponents.forEach(function (ent) {
- mergeTypes(ent);
- });
- });
- };
- DependenciesEngine.prototype.init = function (data) {
- traverse$3(data).forEach(function (node) {
- if (node) {
- if (node.parent) {
- delete node.parent;
- }
- if (node.initializer) {
- delete node.initializer;
- }
- }
- });
- this.rawData = data;
- this.modules = ___namespace.sortBy(this.rawData.modules, [function (el) { return el.name.toLowerCase(); }]);
- this.rawModulesForOverview = ___namespace.sortBy(data.modulesForGraph, [function (el) { return el.name.toLowerCase(); }]);
- this.rawModules = ___namespace.sortBy(data.modulesForGraph, [function (el) { return el.name.toLowerCase(); }]);
- this.components = ___namespace.sortBy(this.rawData.components, [function (el) { return el.name.toLowerCase(); }]);
- this.controllers = ___namespace.sortBy(this.rawData.controllers, [function (el) { return el.name.toLowerCase(); }]);
- this.entities = ___namespace.sortBy(this.rawData.entities, [function (el) { return el.name.toLowerCase(); }]);
- this.directives = ___namespace.sortBy(this.rawData.directives, [function (el) { return el.name.toLowerCase(); }]);
- this.injectables = ___namespace.sortBy(this.rawData.injectables, [function (el) { return el.name.toLowerCase(); }]);
- this.interceptors = ___namespace.sortBy(this.rawData.interceptors, [function (el) { return el.name.toLowerCase(); }]);
- this.guards = ___namespace.sortBy(this.rawData.guards, [function (el) { return el.name.toLowerCase(); }]);
- this.interfaces = ___namespace.sortBy(this.rawData.interfaces, [function (el) { return el.name.toLowerCase(); }]);
- this.pipes = ___namespace.sortBy(this.rawData.pipes, [function (el) { return el.name.toLowerCase(); }]);
- this.classes = ___namespace.sortBy(this.rawData.classes, [function (el) { return el.name.toLowerCase(); }]);
- this.miscellaneous = this.rawData.miscellaneous;
- this.prepareMiscellaneous();
- this.updateModulesDeclarationsExportsTypes();
- this.routes = this.rawData.routesTree;
- this.manageDuplicatesName();
- this.cleanRawModulesNames();
- };
- DependenciesEngine.prototype.cleanRawModulesNames = function () {
- this.rawModulesForOverview = this.rawModulesForOverview.map(function (module) {
- module.name = module.name.replace('$', '');
- return module;
- });
- };
- DependenciesEngine.prototype.findInCompodocDependencies = function (name, data, file) {
- var _result = {
- source: 'internal',
- data: undefined,
- score: 0
- };
- var nameFoundCounter = 0;
- if (data && data.length > 0) {
- for (var i = 0; i < data.length; i++) {
- if (typeof name !== 'undefined') {
- if (typeof file !== 'undefined') {
- if (name === data[i].name &&
- file.replace(/\\/g, '/').indexOf(data[i].file) !== -1) {
- nameFoundCounter += 1;
- _result.data = data[i];
- _result.score = 2;
- }
- else if (name.indexOf(data[i].name) !== -1 &&
- file.replace(/\\/g, '/').indexOf(data[i].file) !== -1) {
- nameFoundCounter += 1;
- _result.data = data[i];
- _result.score = 1;
- }
- }
- else {
- if (name === data[i].name) {
- nameFoundCounter += 1;
- _result.data = data[i];
- _result.score = 2;
- }
- else if (name.indexOf(data[i].name) !== -1) {
- nameFoundCounter += 1;
- _result.data = data[i];
- _result.score = 1;
- }
- }
- }
- }
- // Prevent wrong matching like MultiSelectOptionDirective with SelectOptionDirective, or QueryParamGroupService with QueryParamGroup
- if (nameFoundCounter > 1) {
- var found = false;
- for (var i = 0; i < data.length; i++) {
- if (typeof name !== 'undefined') {
- if (typeof file !== 'undefined') {
- if (name === data[i].name) {
- found = true;
- _result.data = data[i];
- _result.score = 2;
- }
- }
- else {
- if (name === data[i].name) {
- found = true;
- _result.data = data[i];
- _result.score = 2;
- }
- }
- }
- }
- if (!found) {
- _result = {
- source: 'internal',
- data: undefined,
- score: 0
- };
- }
- }
- }
- return _result;
- };
- DependenciesEngine.prototype.manageDuplicatesName = function () {
- var processDuplicates = function (element, index, array) {
- var elementsWithSameName = ___namespace.filter(array, { name: element.name });
- if (elementsWithSameName.length > 1) {
- // First element is the reference for duplicates
- for (var i = 1; i < elementsWithSameName.length; i++) {
- var elementToEdit = elementsWithSameName[i];
- if (typeof elementToEdit.isDuplicate === 'undefined') {
- elementToEdit.isDuplicate = true;
- elementToEdit.duplicateId = i;
- elementToEdit.duplicateName =
- elementToEdit.name + '-' + elementToEdit.duplicateId;
- elementToEdit.id = elementToEdit.id + '-' + elementToEdit.duplicateId;
- }
- }
- }
- return element;
- };
- this.classes = this.classes.map(processDuplicates);
- this.interfaces = this.interfaces.map(processDuplicates);
- this.injectables = this.injectables.map(processDuplicates);
- this.pipes = this.pipes.map(processDuplicates);
- this.interceptors = this.interceptors.map(processDuplicates);
- this.guards = this.guards.map(processDuplicates);
- this.modules = this.modules.map(processDuplicates);
- this.components = this.components.map(processDuplicates);
- this.controllers = this.controllers.map(processDuplicates);
- this.entities = this.entities.map(processDuplicates);
- this.directives = this.directives.map(processDuplicates);
- };
- DependenciesEngine.prototype.find = function (name) {
- var e_1, _a;
- var _this = this;
- var searchFunctions = [
- function () { return _this.findInCompodocDependencies(name, _this.modules); },
- function () { return _this.findInCompodocDependencies(name, _this.injectables); },
- function () { return _this.findInCompodocDependencies(name, _this.interceptors); },
- function () { return _this.findInCompodocDependencies(name, _this.guards); },
- function () { return _this.findInCompodocDependencies(name, _this.interfaces); },
- function () { return _this.findInCompodocDependencies(name, _this.classes); },
- function () { return _this.findInCompodocDependencies(name, _this.components); },
- function () { return _this.findInCompodocDependencies(name, _this.controllers); },
- function () { return _this.findInCompodocDependencies(name, _this.entities); },
- function () { return _this.findInCompodocDependencies(name, _this.directives); },
- function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.variables); },
- function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.functions); },
- function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.typealiases); },
- function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.enumerations); },
- function () { return AngularApiUtil$1.findApi(name); }
- ];
- var bestScore = 0;
- var bestResult = undefined;
- try {
- for (var searchFunctions_1 = __values(searchFunctions), searchFunctions_1_1 = searchFunctions_1.next(); !searchFunctions_1_1.done; searchFunctions_1_1 = searchFunctions_1.next()) {
- var searchFunction = searchFunctions_1_1.value;
- var result = searchFunction();
- if (result.data && result.score > bestScore) {
- bestScore = result.score;
- bestResult = result;
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (searchFunctions_1_1 && !searchFunctions_1_1.done && (_a = searchFunctions_1.return)) _a.call(searchFunctions_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- return bestResult;
- };
- DependenciesEngine.prototype.update = function (updatedData) {
- var _this = this;
- if (updatedData.modules.length > 0) {
- ___namespace.forEach(updatedData.modules, function (module) {
- var _index = ___namespace.findIndex(_this.modules, { name: module.name });
- _this.modules[_index] = module;
- });
- }
- if (updatedData.components.length > 0) {
- ___namespace.forEach(updatedData.components, function (component) {
- var _index = ___namespace.findIndex(_this.components, { name: component.name });
- _this.components[_index] = component;
- });
- }
- if (updatedData.controllers.length > 0) {
- ___namespace.forEach(updatedData.controllers, function (controller) {
- var _index = ___namespace.findIndex(_this.controllers, { name: controller.name });
- _this.controllers[_index] = controller;
- });
- }
- if (updatedData.entities.length > 0) {
- ___namespace.forEach(updatedData.entities, function (entity) {
- var _index = ___namespace.findIndex(_this.entities, { name: entity.name });
- _this.entities[_index] = entity;
- });
- }
- if (updatedData.directives.length > 0) {
- ___namespace.forEach(updatedData.directives, function (directive) {
- var _index = ___namespace.findIndex(_this.directives, { name: directive.name });
- _this.directives[_index] = directive;
- });
- }
- if (updatedData.injectables.length > 0) {
- ___namespace.forEach(updatedData.injectables, function (injectable) {
- var _index = ___namespace.findIndex(_this.injectables, { name: injectable.name });
- _this.injectables[_index] = injectable;
- });
- }
- if (updatedData.interceptors.length > 0) {
- ___namespace.forEach(updatedData.interceptors, function (interceptor) {
- var _index = ___namespace.findIndex(_this.interceptors, { name: interceptor.name });
- _this.interceptors[_index] = interceptor;
- });
- }
- if (updatedData.guards.length > 0) {
- ___namespace.forEach(updatedData.guards, function (guard) {
- var _index = ___namespace.findIndex(_this.guards, { name: guard.name });
- _this.guards[_index] = guard;
- });
- }
- if (updatedData.interfaces.length > 0) {
- ___namespace.forEach(updatedData.interfaces, function (int) {
- var _index = ___namespace.findIndex(_this.interfaces, { name: int.name });
- _this.interfaces[_index] = int;
- });
- }
- if (updatedData.pipes.length > 0) {
- ___namespace.forEach(updatedData.pipes, function (pipe) {
- var _index = ___namespace.findIndex(_this.pipes, { name: pipe.name });
- _this.pipes[_index] = pipe;
- });
- }
- if (updatedData.classes.length > 0) {
- ___namespace.forEach(updatedData.classes, function (classe) {
- var _index = ___namespace.findIndex(_this.classes, { name: classe.name });
- _this.classes[_index] = classe;
- });
- }
- /**
- * Miscellaneous update
- */
- if (updatedData.miscellaneous.variables.length > 0) {
- ___namespace.forEach(updatedData.miscellaneous.variables, function (variable) {
- var _index = ___namespace.findIndex(_this.miscellaneous.variables, {
- name: variable.name,
- file: variable.file
- });
- _this.miscellaneous.variables[_index] = variable;
- });
- }
- if (updatedData.miscellaneous.functions.length > 0) {
- ___namespace.forEach(updatedData.miscellaneous.functions, function (func) {
- var _index = ___namespace.findIndex(_this.miscellaneous.functions, {
- name: func.name,
- file: func.file
- });
- _this.miscellaneous.functions[_index] = func;
- });
- }
- if (updatedData.miscellaneous.typealiases.length > 0) {
- ___namespace.forEach(updatedData.miscellaneous.typealiases, function (typealias) {
- var _index = ___namespace.findIndex(_this.miscellaneous.typealiases, {
- name: typealias.name,
- file: typealias.file
- });
- _this.miscellaneous.typealiases[_index] = typealias;
- });
- }
- if (updatedData.miscellaneous.enumerations.length > 0) {
- ___namespace.forEach(updatedData.miscellaneous.enumerations, function (enumeration) {
- var _index = ___namespace.findIndex(_this.miscellaneous.enumerations, {
- name: enumeration.name,
- file: enumeration.file
- });
- _this.miscellaneous.enumerations[_index] = enumeration;
- });
- }
- this.prepareMiscellaneous();
- };
- DependenciesEngine.prototype.findInCompodoc = function (name) {
- var mergedData = ___namespace.concat([], this.modules, this.components, this.controllers, this.entities, this.directives, this.injectables, this.interceptors, this.guards, this.interfaces, this.pipes, this.classes, this.miscellaneous.enumerations, this.miscellaneous.typealiases, this.miscellaneous.variables, this.miscellaneous.functions);
- var result = ___namespace.find(mergedData, { name: name });
- return result || false;
- };
- DependenciesEngine.prototype.prepareMiscellaneous = function () {
- this.miscellaneous.variables.sort(getNamesCompareFn());
- this.miscellaneous.functions.sort(getNamesCompareFn());
- this.miscellaneous.enumerations.sort(getNamesCompareFn());
- this.miscellaneous.typealiases.sort(getNamesCompareFn());
- // group each subgoup by file
- this.miscellaneous.groupedVariables = ___namespace.groupBy(this.miscellaneous.variables, 'file');
- this.miscellaneous.groupedFunctions = ___namespace.groupBy(this.miscellaneous.functions, 'file');
- this.miscellaneous.groupedEnumerations = ___namespace.groupBy(this.miscellaneous.enumerations, 'file');
- this.miscellaneous.groupedTypeAliases = ___namespace.groupBy(this.miscellaneous.typealiases, 'file');
- };
- DependenciesEngine.prototype.getModule = function (name) {
- return ___namespace.find(this.modules, ['name', name]);
- };
- DependenciesEngine.prototype.getRawModule = function (name) {
- return ___namespace.find(this.rawModules, ['name', name]);
- };
- DependenciesEngine.prototype.getModules = function () {
- return this.modules;
- };
- DependenciesEngine.prototype.getComponents = function () {
- return this.components;
- };
- DependenciesEngine.prototype.getControllers = function () {
- return this.controllers;
- };
- DependenciesEngine.prototype.getEntities = function () {
- return this.entities;
- };
- DependenciesEngine.prototype.getDirectives = function () {
- return this.directives;
- };
- DependenciesEngine.prototype.getInjectables = function () {
- return this.injectables;
- };
- DependenciesEngine.prototype.getInterceptors = function () {
- return this.interceptors;
- };
- DependenciesEngine.prototype.getGuards = function () {
- return this.guards;
- };
- DependenciesEngine.prototype.getInterfaces = function () {
- return this.interfaces;
- };
- DependenciesEngine.prototype.getRoutes = function () {
- return this.routes;
- };
- DependenciesEngine.prototype.getPipes = function () {
- return this.pipes;
- };
- DependenciesEngine.prototype.getClasses = function () {
- return this.classes;
- };
- DependenciesEngine.prototype.getMiscellaneous = function () {
- return this.miscellaneous;
- };
- return DependenciesEngine;
- }());
- var DependenciesEngine$1 = DependenciesEngine.getInstance();
- var FileEngine = /** @class */ (function () {
- function FileEngine() {
- }
- FileEngine.getInstance = function () {
- if (!FileEngine.instance) {
- FileEngine.instance = new FileEngine();
- }
- return FileEngine.instance;
- };
- FileEngine.prototype.get = function (filepath) {
- return new Promise(function (resolve, reject) {
- fs__namespace.readFile(path__namespace.resolve(filepath), 'utf8', function (err, data) {
- if (err) {
- reject('Error during ' + filepath + ' read');
- }
- else {
- resolve(data);
- }
- });
- });
- };
- FileEngine.prototype.write = function (filepath, contents) {
- return new Promise(function (resolve, reject) {
- fs__namespace.outputFile(path__namespace.resolve(filepath), contents, function (err) {
- if (err) {
- reject(err);
- }
- else {
- resolve();
- }
- });
- });
- };
- FileEngine.prototype.writeSync = function (filepath, contents) {
- fs__namespace.outputFileSync(filepath, contents);
- };
- FileEngine.prototype.getSync = function (filepath) {
- return fs__namespace.readFileSync(path__namespace.resolve(filepath), 'utf8');
- };
- /**
- * @param file The file to check
- */
- FileEngine.prototype.existsSync = function (file) {
- return fs__namespace.existsSync(file);
- };
- return FileEngine;
- }());
- var FileEngine$1 = FileEngine.getInstance();
- var traverse$2 = require('neotraverse/legacy');
- var ExportJsonEngine = /** @class */ (function () {
- function ExportJsonEngine() {
- }
- ExportJsonEngine.getInstance = function () {
- if (!ExportJsonEngine.instance) {
- ExportJsonEngine.instance = new ExportJsonEngine();
- }
- return ExportJsonEngine.instance;
- };
- ExportJsonEngine.prototype.export = function (outputFolder, data) {
- var exportData = {};
- traverse$2(data).forEach(function (node) {
- if (node) {
- if (node.parent) {
- delete node.parent;
- }
- if (node.initializer) {
- delete node.initializer;
- }
- if (Configuration$1.mainData.disableSourceCode) {
- delete node.sourceCode;
- delete node.templateData;
- delete node.styleUrlsData;
- delete node.stylesData;
- }
- }
- });
- exportData.pipes = data.pipes;
- exportData.interfaces = data.interfaces;
- exportData.injectables = data.injectables;
- exportData.guards = data.guards;
- exportData.interceptors = data.interceptors;
- exportData.classes = data.classes;
- exportData.directives = data.directives;
- exportData.components = data.components;
- exportData.modules = this.processModules();
- exportData.miscellaneous = data.miscellaneous;
- if (!Configuration$1.mainData.disableRoutesGraph) {
- exportData.routes = data.routes;
- }
- if (!Configuration$1.mainData.disableCoverage) {
- exportData.coverage = data.coverageData;
- }
- return FileEngine$1.write(outputFolder + path__namespace.sep + '/documentation.json', JSON.stringify(exportData, undefined, 4)).catch(function (err) {
- logger.error('Error during export file generation ', err);
- return Promise.reject(err);
- });
- };
- ExportJsonEngine.prototype.processModules = function () {
- var modules = DependenciesEngine$1.getModules();
- var _resultedModules = [];
- for (var moduleNr = 0; moduleNr < modules.length; moduleNr++) {
- var module_1 = modules[moduleNr];
- var moduleElement = {
- name: module_1.name,
- id: module_1.id,
- description: module_1.description,
- rawDescription: module_1.rawDescription,
- deprecationMessage: module_1.deprecationMessage,
- deprecated: module_1.deprecated,
- file: module_1.file,
- methods: module_1.methods,
- sourceCode: module_1.sourceCode,
- children: [
- {
- type: 'providers',
- elements: []
- },
- {
- type: 'declarations',
- elements: []
- },
- {
- type: 'imports',
- elements: []
- },
- {
- type: 'exports',
- elements: []
- },
- {
- type: 'bootstrap',
- elements: []
- },
- {
- type: 'classes',
- elements: []
- }
- ]
- };
- for (var k = 0; k < module_1.providers.length; k++) {
- var providerElement = {
- name: module_1.providers[k].name
- };
- moduleElement.children[0].elements.push(providerElement);
- }
- for (var k = 0; k < module_1.declarations.length; k++) {
- var declarationElement = {
- name: module_1.declarations[k].name
- };
- moduleElement.children[1].elements.push(declarationElement);
- }
- for (var k = 0; k < module_1.imports.length; k++) {
- var importElement = {
- name: module_1.imports[k].name
- };
- moduleElement.children[2].elements.push(importElement);
- }
- for (var k = 0; k < module_1.exports.length; k++) {
- var exportElement = {
- name: module_1.exports[k].name
- };
- moduleElement.children[3].elements.push(exportElement);
- }
- for (var k = 0; k < module_1.bootstrap.length; k++) {
- var bootstrapElement = {
- name: module_1.bootstrap[k].name
- };
- moduleElement.children[4].elements.push(bootstrapElement);
- }
- _resultedModules.push(moduleElement);
- }
- return _resultedModules;
- };
- return ExportJsonEngine;
- }());
- var ExportJsonEngine$1 = ExportJsonEngine.getInstance();
- var ExportEngine = /** @class */ (function () {
- function ExportEngine() {
- }
- ExportEngine.getInstance = function () {
- if (!ExportEngine.instance) {
- ExportEngine.instance = new ExportEngine();
- }
- return ExportEngine.instance;
- };
- ExportEngine.prototype.export = function (outputFolder, data) {
- switch (Configuration$1.mainData.exportFormat) {
- case 'json':
- return ExportJsonEngine$1.export(outputFolder, data);
- /*case 'pdf':
- return ExportPdfEngine.export(outputFolder);*/
- }
- };
- return ExportEngine;
- }());
- var ExportEngine$1 = ExportEngine.getInstance();
- var Handlebars$9 = require('handlebars');
- var BreakCommaHelper = /** @class */ (function () {
- function BreakCommaHelper(bars) {
- this.bars = bars;
- }
- BreakCommaHelper.prototype.helperFunc = function (context, text) {
- text = this.bars.Utils.escapeExpression(text);
- text = text.replace(/,/g, ',<br>');
- return new Handlebars$9.SafeString(text);
- };
- return BreakCommaHelper;
- }());
- var Handlebars$8 = require('handlebars');
- var BreakLinesHelper = /** @class */ (function () {
- function BreakLinesHelper(bars) {
- this.bars = bars;
- }
- BreakLinesHelper.prototype.helperFunc = function (context, text) {
- text = this.bars.Utils.escapeExpression(text);
- text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
- text = text.replace(/ /gm, ' ');
- text = text.replace(/ /gm, ' ');
- return new Handlebars$8.SafeString(text);
- };
- return BreakLinesHelper;
- }());
- require('handlebars');
- var CapitalizeHelper = /** @class */ (function () {
- function CapitalizeHelper() {
- }
- CapitalizeHelper.prototype.helperFunc = function (context, text) {
- return text.charAt(0).toUpperCase() + text.slice(1);
- };
- return CapitalizeHelper;
- }());
- var Handlebars$7 = require('handlebars');
- var CleanParagraphHelper = /** @class */ (function () {
- function CleanParagraphHelper() {
- }
- CleanParagraphHelper.prototype.helperFunc = function (context, text) {
- text = text.replace(/<p>/gm, '');
- text = text.replace(/<\/p>/gm, '');
- return new Handlebars$7.SafeString(text);
- };
- return CleanParagraphHelper;
- }());
- var CompareHelper = /** @class */ (function () {
- function CompareHelper() {
- }
- CompareHelper.prototype.helperFunc = function (context, a, operator, b, options) {
- if (arguments.length < 4) {
- throw new Error('handlebars Helper {{compare}} expects 4 arguments');
- }
- var result;
- switch (operator) {
- case 'indexof':
- result = b.indexOf(a) !== -1;
- break;
- case '===':
- result = a === b;
- break;
- case '!==':
- result = a !== b;
- break;
- case '>':
- result = a > b;
- break;
- default: {
- throw new Error('helper {{compare}}: invalid operator: `' + operator + '`');
- }
- }
- if (result === false) {
- return options.inverse(context);
- }
- return options.fn(context);
- };
- return CompareHelper;
- }());
- var DebugHelper = /** @class */ (function () {
- function DebugHelper() {
- }
- DebugHelper.prototype.helperFunc = function (context, optionalValue) {
- console.log('Current Context');
- console.log('====================');
- console.log(context);
- if (optionalValue) {
- console.log('OptionalValue');
- console.log('====================');
- console.log(optionalValue);
- }
- };
- return DebugHelper;
- }());
- var ElementAloneHelper = /** @class */ (function () {
- function ElementAloneHelper() {
- }
- ElementAloneHelper.prototype.helperFunc = function (context, elements, elementType, options) {
- var alones = [];
- var modules = DependenciesEngine$1.modules;
- elements.forEach(function (element) {
- var foundInOneModule = false;
- modules.forEach(function (module) {
- module.declarations.forEach(function (declaration) {
- if (declaration.id === element.id) {
- foundInOneModule = true;
- }
- if (declaration.file === element.file) {
- foundInOneModule = true;
- }
- });
- module.bootstrap.forEach(function (boostrapedElement) {
- if (boostrapedElement.id === element.id) {
- foundInOneModule = true;
- }
- if (boostrapedElement.file === element.file) {
- foundInOneModule = true;
- }
- });
- module.controllers.forEach(function (controller) {
- if (controller.id === element.id) {
- foundInOneModule = true;
- }
- if (controller.file === element.file) {
- foundInOneModule = true;
- }
- });
- module.providers.forEach(function (provider) {
- if (provider.id === element.id) {
- foundInOneModule = true;
- }
- if (provider.file === element.file) {
- foundInOneModule = true;
- }
- });
- });
- if (!foundInOneModule) {
- alones.push(element);
- }
- });
- if (alones.length > 0) {
- switch (elementType) {
- case 'component':
- context.components = alones;
- break;
- case 'directive':
- context.directives = alones;
- break;
- case 'controller':
- context.controllers = alones;
- break;
- case 'injectable':
- context.injectables = alones;
- break;
- case 'pipe':
- context.pipes = alones;
- break;
- }
- return options.fn(context);
- }
- };
- return ElementAloneHelper;
- }());
- var EscapeSimpleQuoteHelper = /** @class */ (function () {
- function EscapeSimpleQuoteHelper() {
- }
- EscapeSimpleQuoteHelper.prototype.helperFunc = function (context, text) {
- if (!text) {
- return;
- }
- text = text.replace(/'/g, "\\'");
- text = text.replace(/(\r\n|\n|\r)/gm, '');
- return text;
- };
- return EscapeSimpleQuoteHelper;
- }());
- var FilterAngular2ModulesHelper = /** @class */ (function () {
- function FilterAngular2ModulesHelper() {
- }
- FilterAngular2ModulesHelper.prototype.helperFunc = function (context, text, options) {
- var NG2_MODULES = [
- 'BrowserModule',
- 'FormsModule',
- 'HttpModule',
- 'RouterModule'
- ];
- var len = NG2_MODULES.length;
- var i = 0;
- var result = false;
- for (i; i < len; i++) {
- if (text.indexOf(NG2_MODULES[i]) > -1) {
- result = true;
- }
- }
- if (result) {
- return options.fn(context);
- }
- else {
- return options.inverse(context);
- }
- };
- return FilterAngular2ModulesHelper;
- }());
- var AngularVersionUtil = /** @class */ (function () {
- function AngularVersionUtil() {
- }
- AngularVersionUtil.getInstance = function () {
- if (!AngularVersionUtil.instance) {
- AngularVersionUtil.instance = new AngularVersionUtil();
- }
- return AngularVersionUtil.instance;
- };
- AngularVersionUtil.prototype.cleanVersion = function (version) {
- return version
- .replace('~', '')
- .replace('^', '')
- .replace('=', '')
- .replace('<', '')
- .replace('>', '');
- };
- AngularVersionUtil.prototype.getAngularVersionOfProject = function (packageData) {
- var _result = '';
- if (packageData.dependencies) {
- var angularCore = packageData.dependencies[AngularVersionUtil.CorePackage];
- if (angularCore) {
- _result = this.cleanVersion(angularCore);
- }
- }
- return _result;
- };
- AngularVersionUtil.prototype.isAngularVersionArchived = function (version) {
- var result;
- try {
- result = semver__namespace.compare(version, '2.4.10') <= 0;
- }
- catch (e) { }
- return result;
- };
- AngularVersionUtil.prototype.prefixOfficialDoc = function (version) {
- return this.isAngularVersionArchived(version) ? 'v2.' : '';
- };
- AngularVersionUtil.prototype.getApiLink = function (api, angularVersion) {
- var angularDocPrefix = this.prefixOfficialDoc(angularVersion);
- return "https://".concat(angularDocPrefix, "angular.io/").concat(api.path);
- };
- AngularVersionUtil.CorePackage = '@angular/core';
- return AngularVersionUtil;
- }());
- var AngularVersionUtil$1 = AngularVersionUtil.getInstance();
- var BasicTypes;
- (function (BasicTypes) {
- BasicTypes[BasicTypes["number"] = 0] = "number";
- BasicTypes[BasicTypes["boolean"] = 1] = "boolean";
- BasicTypes[BasicTypes["string"] = 2] = "string";
- BasicTypes[BasicTypes["object"] = 3] = "object";
- BasicTypes[BasicTypes["date"] = 4] = "date";
- BasicTypes[BasicTypes["function"] = 5] = "function";
- })(BasicTypes || (BasicTypes = {}));
- var BasicTypeScriptTypes;
- (function (BasicTypeScriptTypes) {
- BasicTypeScriptTypes[BasicTypeScriptTypes["any"] = 0] = "any";
- BasicTypeScriptTypes[BasicTypeScriptTypes["void"] = 1] = "void";
- })(BasicTypeScriptTypes || (BasicTypeScriptTypes = {}));
- var BasicTypeUtil = /** @class */ (function () {
- function BasicTypeUtil() {
- }
- BasicTypeUtil.getInstance = function () {
- if (!BasicTypeUtil.instance) {
- BasicTypeUtil.instance = new BasicTypeUtil();
- }
- return BasicTypeUtil.instance;
- };
- /**
- * Checks if a given types is a basic javascript type
- * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
- * @param type The type to check
- */
- BasicTypeUtil.prototype.isJavascriptType = function (type) {
- if (typeof type !== 'undefined' && type.toLowerCase) {
- return type.toLowerCase() in BasicTypes;
- }
- else {
- return false;
- }
- };
- /**
- * Checks if a given type is a typescript type (That is not a javascript type)
- * https://www.typescriptlang.org/docs/handbook/basic-types.html
- * @param type The type to check
- */
- BasicTypeUtil.prototype.isTypeScriptType = function (type) {
- if (typeof type !== 'undefined' && type.toLowerCase) {
- return type.toLowerCase() in BasicTypeScriptTypes;
- }
- else {
- return false;
- }
- };
- /**
- * Check if the type is a typescript or javascript type
- * @param type The type to check
- */
- BasicTypeUtil.prototype.isKnownType = function (type) {
- return this.isJavascriptType(type) || this.isTypeScriptType(type);
- };
- /**
- * Returns a official documentation link to either the javascript or typescript type
- * @param type The type to check
- * @returns The documentation link or undefined if type not found
- */
- BasicTypeUtil.prototype.getTypeUrl = function (type) {
- if (this.isJavascriptType(type)) {
- return "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/".concat(type);
- }
- if (this.isTypeScriptType(type)) {
- return "https://www.typescriptlang.org/docs/handbook/basic-types.html";
- }
- return undefined;
- };
- return BasicTypeUtil;
- }());
- var BasicTypeUtil$1 = BasicTypeUtil.getInstance();
- var Handlebars$6 = require('handlebars');
- var FunctionSignatureHelper = /** @class */ (function () {
- function FunctionSignatureHelper() {
- }
- FunctionSignatureHelper.prototype.handleFunction = function (arg) {
- var _this = this;
- if (arg.function.length === 0) {
- return "".concat(arg.name).concat(this.getOptionalString(arg), ": () => void");
- }
- var argums = arg.function.map(function (argu) {
- var _result = DependenciesEngine$1.find(argu.type);
- if (_result) {
- if (_result.source === 'internal') {
- var path = _result.data.type;
- if (_result.data.type === 'class') {
- path = 'classe';
- }
- return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"../").concat(path, "s/").concat(_result.data.name, ".html\">").concat(argu.type, "</a>");
- }
- else {
- var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
- return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
- }
- }
- else if (BasicTypeUtil$1.isKnownType(argu.type)) {
- var path = BasicTypeUtil$1.getTypeUrl(argu.type);
- return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
- }
- else {
- if (argu.name && argu.type) {
- return "".concat(argu.name).concat(_this.getOptionalString(arg), ": ").concat(argu.type);
- }
- else {
- if (argu.name) {
- return "".concat(argu.name.text);
- }
- else {
- return '';
- }
- }
- }
- });
- return "".concat(arg.name).concat(this.getOptionalString(arg), ": (").concat(argums, ") => void");
- };
- FunctionSignatureHelper.prototype.getOptionalString = function (arg) {
- return arg.optional ? '?' : '';
- };
- FunctionSignatureHelper.prototype.helperFunc = function (context, method) {
- var _this = this;
- var args = '';
- var argDestructuredCounterInitial = 0;
- var argDestructuredCounterReal = 0;
- if (method.args) {
- method.args.forEach(function (arg) {
- if (arg.destructuredParameter) {
- argDestructuredCounterInitial += 1;
- }
- });
- method.args.forEach(function (arg, index) {
- var _result = DependenciesEngine$1.find(arg.type);
- if (arg.destructuredParameter) {
- if (argDestructuredCounterReal === 0) {
- args += '__namedParameters: {';
- }
- argDestructuredCounterReal += 1;
- }
- if (_result) {
- if (_result.source === 'internal') {
- var path = _result.data.type;
- if (_result.data.type === 'class') {
- path = 'classe';
- }
- args += "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"../").concat(path, "s/").concat(_result.data.name, ".html\" target=\"_self\">").concat(Handlebars$6.escapeExpression(arg.type), "</a>");
- }
- else {
- var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
- args += "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(Handlebars$6.escapeExpression(arg.type), "</a>");
- }
- }
- else if (arg.dotDotDotToken) {
- args += "...".concat(arg.name, ": ").concat(arg.type);
- }
- else if (arg.function) {
- args += _this.handleFunction(arg);
- }
- else if (BasicTypeUtil$1.isKnownType(arg.type)) {
- var path = BasicTypeUtil$1.getTypeUrl(arg.type);
- args += "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(Handlebars$6.escapeExpression(arg.type), "</a>");
- }
- else {
- if (arg.type) {
- args += "".concat(arg.name).concat(_this.getOptionalString(arg), ": ").concat(arg.type);
- }
- else {
- args += "".concat(arg.name).concat(_this.getOptionalString(arg));
- }
- }
- if (arg.destructuredParameter) {
- if (argDestructuredCounterReal === argDestructuredCounterInitial) {
- args += '}';
- }
- }
- if (index < method.args.length - 1) {
- args += ', ';
- }
- });
- }
- if (method.name) {
- return "".concat(method.name, "(").concat(args, ")");
- }
- else {
- return "(".concat(args, ")");
- }
- };
- return FunctionSignatureHelper;
- }());
- var HasOwnHelper = /** @class */ (function () {
- function HasOwnHelper() {
- }
- HasOwnHelper.prototype.helperFunc = function (context, entity, key, options) {
- if (Object.hasOwnProperty.call(entity, key)) {
- return options.fn(context);
- }
- else {
- return options.inverse(context);
- }
- };
- return HasOwnHelper;
- }());
- var TRANSLATION_DE_DE = {
- accessors: 'Accessors',
- arguments: 'Argumente',
- bootstrap: 'Bootstrap',
- branches: 'Branches',
- browse: 'Durchsuche',
- classe: 'Klasse',
- classes: 'Klassen',
- component: 'Komponente',
- components: 'Komponenten',
- constructor: 'Konstruktor',
- controllers: 'Controllers',
- controller: 'Controller',
- 'coverage-page-title': 'Dokumentation Abdeckung',
- declarations: 'Declarations',
- decorators: 'Decorators',
- 'default-value': 'Standardwert',
- 'defined-in': 'Definiert in',
- dependencies: 'Abhängigkeiten',
- deprecated: 'Veraltet',
- description: 'Beschreibung',
- directive: 'Direktive',
- directives: 'Direktiven',
- 'dom tree': 'DOM baum',
- entities: 'Entities',
- entity: 'Entity',
- entrycomponents: 'EntryComponents',
- enumerations: 'Enumerations',
- enums: 'Enums',
- example: 'Beispiel',
- examples: 'Beispiele',
- exports: 'Exportiert',
- extends: 'Erweitert',
- file: 'Datei',
- functions: 'Funktionen',
- 'generated-using': 'Dokumentation generiert mit',
- 'getting-started': "Los geht's",
- guard: 'Guard',
- guards: 'Guards',
- hostbindings: 'HostBindings',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'HostListeners',
- 'html-element': 'Html Element',
- 'html-element-with-directive': 'Html-Element mit Direktive',
- identifier: 'Kennung',
- implements: 'Implementiert',
- imports: 'Importiert',
- index: 'Index',
- indexable: 'Indizierbar',
- info: 'Information',
- 'inherited-from': 'Geerbt von',
- injectable: 'Injectable',
- injectables: 'Injectables',
- inputs: 'Inputs',
- interceptors: 'Interceptors',
- interface: 'Interface',
- interfaces: 'Interfaces',
- legend: 'Legende',
- license: 'Lizenz',
- lines: 'Linien',
- metadata: 'Metadata',
- methods: 'Methoden',
- miscellaneous: 'Verschiedenes',
- module: 'Modul',
- modules: 'Module',
- name: 'Name',
- no: 'Nein',
- 'no-graph': 'Kein Graph verfügbar.',
- 'no-iframe': 'Dein Browser unterstützt keine iframes.',
- 'no-result-matching': 'Kein passendes Ergebnis',
- 'no-svg': 'Dein Browser unterstützt kein SVG',
- optional: 'Optional',
- outputs: 'Ausgaben',
- overview: 'Übersicht',
- parameters: 'Parameter',
- 'peer-dependencies': 'Peer-Abhängigkeiten',
- pipe: 'Pipe',
- pipes: 'Pipes',
- prefix: 'Präfix',
- properties: 'Eigenschaften',
- providers: 'Providers',
- pure: 'Pure',
- readme: 'README',
- required: 'Erforderlich',
- reset: 'Zurücksetzen',
- 'results-matching': 'übereinstimmende Ergebnisse',
- returns: 'Returns',
- route: 'Route',
- routes: 'Routen',
- schemas: 'Schemata',
- 'search-placeholder': 'Eingeben zur Suche',
- selector: 'Selektor',
- signature: 'Unterschrift',
- source: 'Quelle',
- standalone: 'Standalone',
- statements: 'Statements',
- styles: 'Stile',
- template: 'Vorlage',
- type: 'Typ',
- 'type-aliases': 'Typ Aliase',
- 'type-parameters': 'Typ Parameter',
- types: 'Typen',
- 'unamed-property': 'Unbenannte Eigenschaft',
- 'unit-test-coverage': 'Unit-Test-Abdeckung',
- value: 'Wert',
- variables: 'Variablen',
- yes: 'Ja',
- zoomin: 'Vergrößern',
- zoomout: 'Verkleinern'
- };
- var TRANSLATION_EN_US = {
- accessors: 'Accessors',
- arguments: 'Arguments',
- bootstrap: 'Bootstrap',
- branches: 'Branches',
- browse: 'Browse',
- classe: 'Class',
- classes: 'Classes',
- component: 'Component',
- components: 'Components',
- constructor: 'Constructor',
- controllers: 'Controllers',
- controller: 'Controller',
- 'coverage-page-title': 'Documentation coverage',
- declarations: 'Declarations',
- decorators: 'Decorators',
- 'default-value': 'Default value',
- 'defined-in': 'Defined in',
- dependencies: 'Dependencies',
- deprecated: 'Deprecated',
- description: 'Description',
- directive: 'Directive',
- directives: 'Directives',
- 'dom tree': 'DOM tree',
- entities: 'Entities',
- entity: 'Entity',
- entrycomponents: 'EntryComponents',
- enumerations: 'Enumerations',
- enums: 'Enums',
- example: 'Example',
- examples: 'Examples',
- exports: 'Exports',
- extends: 'Extends',
- file: 'File',
- functions: 'Functions',
- 'generated-using': 'Documentation generated using',
- 'getting-started': 'Getting started',
- guard: 'Guard',
- guards: 'Guards',
- hostbindings: 'HostBindings',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'HostListeners',
- 'html-element': 'Html element',
- 'html-element-with-directive': 'Html element with directive',
- identifier: 'Identifier',
- implements: 'Implements',
- imports: 'Imports',
- index: 'Index',
- indexable: 'Indexable',
- info: 'Information',
- 'inherited-from': 'Inherited from',
- injectable: 'Injectable',
- injectables: 'Injectables',
- inputs: 'Inputs',
- interceptors: 'Interceptors',
- interface: 'Interface',
- interfaces: 'Interfaces',
- legend: 'Legend',
- license: 'License',
- lines: 'Lines',
- metadata: 'Metadata',
- methods: 'Methods',
- miscellaneous: 'Miscellaneous',
- module: 'Module',
- modules: 'Modules',
- name: 'Name',
- no: 'No',
- 'no-graph': 'No graph available.',
- 'no-iframe': 'Your browser does not support iframes.',
- 'no-result-matching': 'No results matching',
- 'no-svg': 'Your browser does not support SVG',
- optional: 'Optional',
- outputs: 'Outputs',
- overview: 'Overview',
- parameters: 'Parameters',
- 'peer-dependencies': 'Peer dependencies',
- pipe: 'Pipe',
- pipes: 'Pipes',
- prefix: 'Prefix',
- properties: 'Properties',
- providers: 'Providers',
- pure: 'Pure',
- readme: 'README',
- required: 'Required',
- reset: 'Reset',
- 'results-matching': 'results matching',
- returns: 'Returns',
- route: 'Route',
- routes: 'Routes',
- schemas: 'Schemas',
- 'search-placeholder': 'Type to search',
- selector: 'Selector',
- signature: 'Signature',
- source: 'Source',
- standalone: 'Standalone',
- statements: 'Statements',
- styles: 'Styles',
- template: 'Template',
- type: 'Type',
- 'type-aliases': 'Type aliases',
- 'type-parameters': 'Type parameters',
- types: 'Types',
- 'unamed-property': 'Unamed property',
- 'unit-test-coverage': 'Unit test coverage',
- value: 'Value',
- variables: 'Variables',
- yes: 'Yes',
- zoomin: 'Zoom in',
- zoomout: 'Zoom out'
- };
- var TRANSLATION_ES_ES = {
- accessors: 'Accesorios',
- arguments: 'Argumentos',
- bootstrap: 'Arranque',
- branches: 'Ramas',
- browse: 'Navegar',
- classe: 'Clase',
- classes: 'Clases',
- component: 'Componente',
- components: 'Componentes',
- constructor: 'Constructor',
- controllers: 'Controladores',
- controller: 'Controlador',
- 'coverage-page-title': 'Cobertura de la documentación',
- declarations: 'Declaraciones',
- decorators: 'Decoradores',
- 'default-value': 'Valor por defecto',
- 'defined-in': 'Definido en',
- dependencies: 'Dependencias',
- deprecated: 'Obsoleta',
- description: 'Descripción',
- directive: 'Directiva',
- directives: 'Directivas',
- 'dom tree': 'DOM arbol',
- entities: 'Entidades',
- entity: 'Entidad',
- entrycomponents: 'Componentes de entrada',
- enumerations: 'Enumeraciones',
- enums: 'Enums',
- example: 'Ejemplo',
- examples: 'Ejemplos',
- exports: 'Exporta',
- extends: 'Extiende',
- file: 'Fichero',
- functions: 'Funciones',
- 'generated-using': 'Documentación generada utilizando',
- 'getting-started': 'Comenzando',
- guard: 'Guardia',
- guards: 'Guardias',
- hostbindings: 'Fijaciones de Host',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'Escuchadores de Host',
- 'html-element': 'Elemento Html',
- 'html-element-with-directive': 'Elemento Html con directiva',
- identifier: 'Identificador',
- implements: 'Implementa',
- imports: 'Importa',
- index: 'Índice',
- indexable: 'Indexable',
- info: 'Información',
- 'inherited-from': 'Heredado desde',
- injectable: 'Inyectable',
- injectables: 'Inyectables',
- inputs: 'Entradas',
- interceptors: 'Interceptores',
- interface: 'Interfaz',
- interfaces: 'Interfaces',
- legend: 'Leyenda',
- license: 'Licencia',
- lines: 'Líneas',
- metadata: 'Meta datos',
- methods: 'Métodos',
- miscellaneous: 'Miscelánea',
- module: 'Módulo',
- modules: 'Módulos',
- name: 'Nombre',
- no: 'No',
- 'no-graph': 'No hay gráfica disponible.',
- 'no-iframe': 'Tu navegador no soporta iframes.',
- 'no-result-matching': 'No hay resultados que coincidan',
- 'no-svg': 'Tu navegador no soporta SVG',
- optional: 'Opcional',
- outputs: 'Salidas',
- overview: 'Descripción general',
- parameters: 'Parámetros',
- 'peer-dependencies': 'Dependencias entre pares',
- pipe: 'Tubería',
- pipes: 'Tuberías',
- prefix: 'Prefijo',
- properties: 'Propiedades',
- providers: 'Proveedores',
- pure: 'Puro',
- readme: 'Léeme',
- required: 'Requerido',
- reset: 'Restablecer',
- 'results-matching': 'comparación de resultados',
- returns: 'Devuelve',
- route: 'Ruta',
- routes: 'Rutas',
- schemas: 'Esquemas',
- 'search-placeholder': 'Escribe para buscar',
- selector: 'Selector',
- signature: 'Firma',
- source: 'Fuente',
- standalone: 'Standalone',
- statements: 'Declaraciones',
- styles: 'Estilos',
- template: 'Plantilla',
- type: 'Tipo',
- 'type-aliases': 'Alias de tipo',
- 'type-parameters': 'Parámetros de tipo',
- types: 'Tipos',
- 'unamed-property': 'Propiedad sin nombre',
- 'unit-test-coverage': 'Cobertura de las pruebas unitarias',
- value: 'Valor',
- variables: 'Variables',
- yes: 'Si',
- zoomin: 'Ampliar',
- zoomout: 'Alejar'
- };
- var TRANSLATION_FR_FR = {
- accessors: 'Accesseurs',
- arguments: 'Arguments',
- bootstrap: 'Bootstrap',
- branches: 'Branches',
- browse: 'Parcourir',
- classe: 'Class',
- classes: 'Classes',
- component: 'Composant',
- components: 'Composants',
- constructor: 'Constructeur',
- controllers: 'Contrôleurs',
- controller: 'Contrôleur',
- 'coverage-page-title': 'Couverture de documentation',
- declarations: 'Déclarations',
- decorators: 'Décorateurs',
- 'default-value': 'Valeur par défaut',
- 'defined-in': 'Défini dans',
- dependencies: 'Dépendances',
- deprecated: 'Obsolète',
- description: 'Description',
- directive: 'Directive',
- directives: 'Directives',
- 'dom tree': 'Arbre DOM',
- entities: 'Entités',
- entity: 'Entité',
- entrycomponents: "Composants d'entrée",
- enumerations: 'Enumérations',
- enums: 'Enumérations',
- example: 'Example',
- examples: 'Examples',
- exports: 'Exports',
- extends: 'Etend',
- file: 'Fichier',
- functions: 'Fonctions',
- 'generated-using': 'Documentation générée avec',
- 'getting-started': 'Démarrage',
- guard: 'Garde',
- guards: 'Gardes',
- hostbindings: 'HostBindings',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'HostListeners',
- 'html-element': 'Elément Html',
- 'html-element-with-directive': 'Elément Html avec une directive',
- identifier: 'Identifiant',
- implements: 'Implémente',
- imports: 'Imports',
- index: 'Index',
- indexable: 'Indexable',
- info: 'Information',
- 'inherited-from': 'Hérité de',
- injectable: 'Injectable',
- injectables: 'Injectables',
- inputs: 'Entrées',
- interceptors: 'Intercepteurs',
- interface: 'Interface',
- interfaces: 'Interfaces',
- legend: 'Légende',
- license: 'License',
- lines: 'Lignes',
- metadata: 'Métadonnées',
- methods: 'Méthodes',
- miscellaneous: 'Divers',
- module: 'Module',
- modules: 'Modules',
- name: 'Nom',
- no: 'Non',
- 'no-graph': 'Aucun graphique disponible.',
- 'no-iframe': 'Votre navigateur ne supporte pas les iframes.',
- 'no-result-matching': 'Aucun résultat matchant',
- 'no-svg': 'Votre navigateur ne supporte pas le SVG',
- optional: 'Optionnel',
- outputs: 'Sorties',
- overview: "Vue d'ensemble",
- parameters: 'Paramètres',
- 'peer-dependencies': 'Dépendances de pair',
- pipe: 'Pipe',
- pipes: 'Pipes',
- prefix: 'Préfixe',
- properties: 'Propriétés',
- providers: 'Providers',
- pure: 'Pure',
- readme: 'README',
- required: 'Requis',
- reset: 'Remise à zéro',
- 'results-matching': 'résultats matchant',
- returns: 'Renvoie',
- route: 'Route',
- routes: 'Routes',
- schemas: 'Schémas',
- 'search-placeholder': 'Saisissez un texte',
- selector: 'Sélecteur',
- signature: 'Signature',
- source: 'Source',
- standalone: 'Standalone',
- statements: 'Déclarations',
- styles: 'Styles',
- template: 'Template',
- 'table-of-contents': 'Table des matières',
- type: 'Type',
- 'type-aliases': 'Alias de type',
- 'type-parameters': 'Paramètres de type',
- types: 'Types',
- 'unamed-property': 'Propriété non nommée',
- 'unit-test-coverage': 'Couverture de test unitaire',
- value: 'Valeur',
- variables: 'Variables',
- yes: 'Oui',
- zoomin: 'Zoom avant',
- zoomout: 'Zoom arrière'
- };
- var TRANSLATION_HU_HU = {
- accessors: 'Getter/setter metódusok',
- arguments: 'Argumentumok',
- bootstrap: 'Betöltés',
- branches: 'Branchek',
- browse: 'Böngészés',
- classe: 'Osztály',
- classes: 'Osztályok',
- component: 'Komponens',
- components: 'Komponensek',
- constructor: 'Konstruktor',
- controllers: 'Kontrollerek',
- controller: 'Kontroller',
- 'coverage-page-title': 'Dokumentáció lefedettség',
- declarations: 'Deklarációk',
- decorators: 'Dekorátorok',
- 'default-value': 'Alapértelmezett érték',
- 'defined-in': 'Definíció helye:',
- dependencies: 'Függőségek',
- deprecated: 'Elavult',
- description: 'Leírás',
- directive: 'Direktíva',
- directives: 'Direktívák',
- 'dom tree': 'DOM fa',
- entities: 'Entitások',
- entity: 'Entitás',
- entrycomponents: 'Entry komponensek',
- enumerations: 'Enumerációk',
- enums: 'Enumok',
- example: 'Példa',
- examples: 'Példák',
- exports: 'Exportok',
- extends: 'Ősosztály',
- file: 'File',
- functions: 'Függvények',
- 'generated-using': 'A dokumentációt generálta:',
- 'getting-started': 'Bevezető',
- guard: 'Guard',
- guards: 'Guardok',
- hostbindings: 'HostBindingok',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'HostListenerek',
- 'html-element': 'Html elem',
- 'html-element-with-directive': 'Html elem direktívával',
- identifier: 'Azonosító',
- implements: 'Implementált interfészek',
- imports: 'Importok',
- index: 'Tartalomjegyzék',
- indexable: 'Indexelhető',
- info: 'Információ',
- 'inherited-from': 'Örökölve innen:',
- injectable: 'Injektálható',
- injectables: 'Injektálhatók',
- inputs: 'Bemenetek',
- interceptors: 'Interceptorok',
- interface: 'Interfész',
- interfaces: 'Interfészek',
- legend: 'Jelmagyarázat',
- license: 'Licenc',
- lines: 'Sorok',
- metadata: 'Metaadatok',
- methods: 'Metódusok',
- miscellaneous: 'Egyéb',
- module: 'Modul',
- modules: 'Modulok',
- name: 'Név',
- no: 'Nem',
- 'no-graph': 'Grafikon nem elérhető.',
- 'no-iframe': 'A böngészője nem támogatja az iframe-eket.',
- 'no-result-matching': 'Nincs találat',
- 'no-svg': 'A böngészője nem támogatja az SVG formátumot.',
- optional: 'Opcionális',
- outputs: 'Kimenetek',
- overview: 'Áttekintés',
- parameters: 'Paraméterek',
- 'peer-dependencies': 'Peer függőségek',
- pipe: 'Pipe',
- pipes: 'Pipe-ok',
- prefix: 'Előtag',
- properties: 'Tagváltozók',
- providers: 'Providerek',
- pure: 'Pure',
- readme: 'README',
- required: 'Kívánt',
- reset: 'Visszaállít',
- 'results-matching': 'találat',
- returns: 'Visszatérési érték',
- route: 'Útvonal',
- routes: 'Útvonalak',
- schemas: 'Sémák',
- 'search-placeholder': 'Keresendő kifejezés',
- selector: 'Szelektor',
- signature: 'Aláírás',
- source: 'Forrás',
- standalone: 'Standalone',
- statements: 'Utasítások',
- styles: 'Stílusok',
- template: 'Sablon',
- type: 'Típus',
- 'type-aliases': 'Típus álnév',
- 'type-parameters': 'Típus paraméterek',
- types: 'Típusok',
- 'unamed-property': 'Névtelen property',
- 'unit-test-coverage': 'Unit teszt lefedettség',
- value: 'Érték',
- variables: 'Változók',
- yes: 'Igen',
- zoomin: 'Nagyítás',
- zoomout: 'Kicsinyítés'
- };
- var TRANSLATION_IT_IT = {
- accessors: 'Accessori',
- arguments: 'Argomenti',
- bootstrap: 'Bootstrap',
- branches: 'Rami',
- browse: 'Cerca',
- classe: 'Classe',
- classes: 'Classi',
- component: 'Componente',
- components: 'Componenti',
- constructor: 'Costruttore',
- controllers: 'Controllers',
- controller: 'Controller',
- 'coverage-page-title': 'Copertura codice',
- declarations: 'Dichiarazioni',
- decorators: 'Decorators',
- 'default-value': 'Valore predefinito',
- 'defined-in': 'Definito in',
- dependencies: 'Dependencies',
- deprecated: 'Deprecata',
- description: 'Descrizione',
- directive: 'Direttiva',
- directives: 'Direttive',
- 'dom tree': 'Albero DOM',
- entities: 'Entità',
- entity: 'Entità',
- entrycomponents: 'EntryComponents',
- enumerations: 'Enumerations',
- enums: 'Enums',
- example: 'Esempio',
- examples: 'Esempi',
- exports: 'Exports',
- extends: 'Extends',
- file: 'File',
- functions: 'Funzioni',
- 'generated-using': 'Documentazione generata usando',
- 'getting-started': 'Iniziamo',
- guard: 'Guardia',
- guards: 'Guardie',
- hostbindings: 'HostBindings',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'HostListeners',
- 'html-element': 'Elemento Html',
- 'html-element-with-directive': 'Elemento html con direttive',
- identifier: 'Identificatore',
- implements: 'Implementa',
- imports: 'Importa',
- index: 'Indice',
- indexable: 'Indicizzabile',
- info: 'Informazione',
- 'inherited-from': 'ereditato da',
- injectable: 'Injectable',
- injectables: 'Injectables',
- inputs: 'Input',
- interceptors: 'Interceptors',
- interface: 'Interfaccia',
- interfaces: 'Interfacce',
- legend: 'Legenda',
- license: 'Licenza',
- lines: 'Linee',
- metadata: 'Metadati',
- methods: 'Metodi',
- miscellaneous: 'Varie',
- module: 'Modulo',
- modules: 'Moduli',
- name: 'Nome',
- no: 'No',
- 'no-graph': 'Grafico non disponibile.',
- 'no-iframe': 'Il tuo browser non supporta iframe.',
- 'no-result-matching': 'Nessun risultato corrispondente',
- 'no-svg': 'Il tuo browser non supporta SVG',
- optional: 'Opzionale',
- outputs: 'Output',
- overview: 'Sommario',
- parameters: 'Parametri',
- 'peer-dependencies': 'Peer dependencies',
- pipe: 'Pipe',
- pipes: 'Pipes',
- prefix: 'Prefisso',
- properties: 'Proprietà',
- providers: 'Providers',
- pure: 'Pure',
- readme: 'README',
- required: 'Necessario',
- reset: 'Reset',
- 'results-matching': 'corrispondenza',
- returns: 'Returns',
- route: 'Route',
- routes: 'Routes',
- schemas: 'Schemas',
- 'search-placeholder': 'Digita per avviare la ricerca',
- selector: 'Selector',
- signature: 'Signature',
- source: 'Fonte',
- standalone: 'Standalone',
- statements: 'Statements',
- styles: 'Stili',
- template: 'Modello',
- type: 'Tipo',
- 'type-aliases': 'Type aliases',
- 'type-parameters': 'Type parameters',
- types: 'Tipi',
- 'unamed-property': 'Proprietà senza nome',
- 'unit-test-coverage': 'Copertura unit test',
- value: 'Valori',
- variables: 'Variabili',
- yes: 'Si',
- zoomin: 'Ingrandisci',
- zoomout: 'Rimpocciolisci'
- };
- var TRANSLATION_JA_JP = {
- accessors: 'アクセサ',
- arguments: '引数',
- bootstrap: 'ブートストラップ',
- branches: 'ブランチ',
- browse: 'ブラウズ',
- classe: 'クラス',
- classes: 'クラス',
- component: 'コンポーネント',
- components: 'コンポーネント',
- constructor: 'コンストラクタ',
- controllers: 'コントローラー',
- controller: 'コントローラー',
- 'coverage-page-title': 'カバレッジ',
- declarations: '宣言',
- decorators: 'デコレーター',
- 'default-value': '初期値',
- 'defined-in': 'Defined in',
- dependencies: '依存関係',
- deprecated: '非推奨',
- description: '説明',
- directive: 'ディレクティブ',
- directives: 'ディレクティブ',
- 'dom tree': 'DOM ツリー',
- entities: 'エンティティ',
- entity: '実在物',
- entrycomponents: 'エントリーコンポーネント',
- enumerations: '列挙型',
- enums: 'Enums',
- example: '例',
- examples: '例',
- exports: 'エクスポート',
- extends: '継承',
- file: 'ファイル',
- functions: '関数',
- 'generated-using': 'このドキュメントは以下を使用して生成されています',
- 'getting-started': 'はじめに',
- guard: 'ガード',
- guards: 'ガード',
- hostbindings: 'ホストバインディング',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'ホストリスナー',
- 'html-element': 'Html要素',
- 'html-element-with-directive': 'ディレクティブHtml要素',
- identifier: '識別子',
- implements: '実装',
- imports: 'インポート',
- index: '索引',
- indexable: 'インデクサブル',
- info: '情報',
- 'inherited-from': 'Inherited from',
- injectable: 'インジェクタブル',
- injectables: 'インジェクタブル',
- inputs: '入力',
- interceptors: 'インターセプター',
- interface: 'インターフェイス',
- interfaces: 'インターフェイス',
- legend: '凡例',
- license: 'ライセンス',
- lines: '行数',
- metadata: 'メタデータ',
- methods: 'メソッド',
- miscellaneous: 'その他',
- module: 'モジュール',
- modules: 'モジュール',
- name: '名前',
- no: 'いいえ',
- 'no-graph': '使用できるグラフがありません',
- 'no-iframe': 'ブラウザがiframeを対応していません',
- 'no-result-matching': '見つかりませんでした',
- 'no-svg': 'ブラウザがSVGに対応してません',
- optional: 'オプション',
- outputs: '出力',
- overview: '概要',
- parameters: 'パラメータ',
- 'peer-dependencies': 'Peer dependencies',
- pipe: 'パイプ',
- pipes: 'パイプ',
- prefix: '接頭辞',
- properties: 'プロパティ',
- providers: 'プロバイダー',
- pure: 'Pure',
- readme: 'README',
- required: '必要',
- reset: 'リセット',
- 'results-matching': '件の結果が一致しました',
- returns: '戻り値',
- route: 'ルート',
- routes: 'ルート',
- schemas: 'スキーマ',
- 'search-placeholder': '入力して検索',
- selector: 'セレクタ',
- signature: 'シグネチャ',
- source: 'ソース',
- standalone: 'Standalone',
- statements: '文',
- styles: 'スタイル',
- template: 'テンプレート',
- type: '型',
- 'type-aliases': 'タイプエイリアス',
- 'type-parameters': '型パラメーター',
- types: '型',
- 'unamed-property': '匿名プロパティ',
- 'unit-test-coverage': 'ユニットテストカバレッジ',
- value: '値',
- variables: '変数',
- yes: 'はい',
- zoomin: '拡大',
- zoomout: '縮小'
- };
- var TRANSLATION_KA_GE = {
- accessors: 'აქსესორი',
- arguments: 'არგუმენტები',
- bootstrap: 'ჩამტვირთავი',
- branches: 'ტოტები',
- browse: 'დაათვალიერე',
- classe: 'კლასი',
- classes: 'კლასები',
- component: 'კომპონენტი',
- components: 'კომპონენტები',
- constructor: 'კონსტრუქტორი',
- controllers: 'კონტროლერები',
- controller: 'კონტროლერი',
- 'coverage-page-title': 'დოკუმენტაციის გაშუქება',
- declarations: 'დეკლარაციები',
- decorators: 'დეკორატორები',
- 'default-value': 'ნაგულისხმევი მნიშვნელობა',
- 'defined-in': 'აღწერილია',
- dependencies: 'დამოკიდებულებები',
- deprecated: 'მოძველებულია',
- description: 'აღწერა',
- directive: 'დირექტივა',
- directives: 'დირექტივები',
- 'dom tree': 'DOM ხე',
- entities: 'სუბიექტები',
- entity: 'სუბიექტი',
- entrycomponents: 'შესვლის კომპონენტები',
- enumerations: 'ჩამოთვლები',
- enums: 'ენამები',
- example: 'მაგალითი',
- examples: 'მაგალითები',
- exports: 'ექსპორტი',
- extends: 'აგრძელებს',
- file: 'ფაილი',
- functions: 'ფუნქციები',
- 'generated-using': 'დოკუმენტაცია დაგენერირდა გამოყენებით',
- 'getting-started': 'ვიწყებთ',
- guard: 'მცველი',
- guards: 'მცველები',
- hostbindings: 'ჰოსტის დამაკავშირებლები',
- hostdirectives: 'ჰოსტის დირექტივები',
- hostlisteners: 'ჰოსტის მსმენელები',
- 'html-element': 'Html ელემენტი',
- 'html-element-with-directive': 'Html ელემენტი დირექტივით',
- identifier: 'იდენტიფიკატორი',
- implements: 'ახორციელებს',
- imports: 'იმპორტი',
- index: 'ინდექსი',
- indexable: 'ინდექსირებადი',
- info: 'ინფორმაცია',
- 'inherited-from': 'მემკვიდრეობით მიიღო',
- injectable: 'ინექცია',
- injectables: 'საინექციო საშუალებები',
- inputs: 'შეყვანები',
- interceptors: 'ჩამჭრელები',
- interface: 'ინტერფეისი',
- interfaces: 'ინტერფეისები',
- legend: 'ლეგენდა',
- license: 'ლიცენზია',
- lines: 'ხაზები',
- metadata: 'მეტამონაცემები',
- methods: 'მეთოდები',
- miscellaneous: 'სხვადასხვა',
- module: 'მოდული',
- modules: 'მოდულები',
- name: 'სახელები',
- no: 'არა',
- 'no-graph': 'გრაფი არ არის ხელმისაწვდომი.',
- 'no-iframe': 'თქვენს ბრაუზერს არ აქვს iframes-ის მხარდაჭერა.',
- 'no-result-matching': 'არ არის შესაბამისი შედეგები',
- 'no-svg': 'თქვენს ბრაუზერს არ აქვს SVG მხარდაჭერა',
- optional: 'სურვილისამებრ',
- outputs: 'შედეგები',
- overview: 'მიმოხილვა',
- parameters: 'პარამეტრები',
- 'peer-dependencies': 'თანატოლებთან დამოკიდებულებები',
- pipe: 'მილი',
- pipes: 'მილები',
- prefix: 'პრეფიქსი',
- properties: 'თვისება',
- providers: 'პროვაიდერი',
- pure: 'წმინდა',
- readme: 'README',
- required: 'აუცილებელი',
- reset: 'გადატვირთვა',
- 'results-matching': 'შედეგები ემთხვევა',
- returns: 'ბრუნდება',
- route: 'მარშრუტი',
- routes: 'მარშრუტები',
- schemas: 'სქემები',
- 'search-placeholder': 'დაწერე მოსაძებნად',
- selector: 'სელექტორი',
- signature: 'ხელმოწერა',
- source: 'წყარო',
- standalone: 'დამოუკიდებელი',
- statements: 'განცხადებები',
- styles: 'სტილები',
- template: 'შაბლონი',
- type: 'ტიპი',
- 'type-aliases': 'მეტსახელის ტიპი',
- 'type-parameters': 'პარამეტრების ტიპი',
- types: 'ტიპები',
- 'unamed-property': 'უსახელო თვისება',
- 'unit-test-coverage': 'ერთეული ტესტის გაშუქება',
- value: 'მნიშვნელობა',
- variables: 'ცვლადები',
- yes: 'კი',
- zoomin: 'მიახლოვება',
- zoomout: 'მასშტაბირება'
- };
- var TRANSLATION_KO_KR = {
- accessors: '접근자',
- arguments: '인수',
- bootstrap: 'Bootstrap',
- branches: '브랜치',
- browse: '탐색',
- classe: '클래스',
- classes: '클래스',
- component: '컴포넌트',
- components: '컴포넌트',
- constructor: '생성자',
- controllers: '컨트롤러',
- controller: '컨트롤러',
- 'coverage-page-title': '문서 커버리지',
- declarations: '선언',
- decorators: '데코레이터',
- 'default-value': '기본 값',
- 'defined-in': '다음에 정의됨',
- dependencies: '의존성',
- deprecated: '비추천',
- description: '설명',
- directive: 'Directive',
- directives: 'Directives',
- 'dom tree': '돔 트리',
- entities: '엔티티',
- entity: '실재',
- entrycomponents: 'EntryComponents',
- enumerations: '열거',
- enums: 'Enums',
- example: '예시',
- examples: '예',
- exports: '내보내기',
- extends: 'Extends',
- file: '파일',
- functions: '함수',
- 'generated-using': '이 문서는 다음을 이용하여 생성되었습니다',
- 'getting-started': '시작하기',
- guard: '가드',
- guards: '가드',
- hostbindings: 'HostBindings',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'HostListeners',
- 'html-element': 'HTML 요소',
- 'html-element-with-directive': '지시어가 있는 HTML 요소',
- identifier: '식별자',
- implements: '구현',
- imports: '가져오기',
- index: '색인',
- indexable: 'Indexable',
- info: '정보',
- 'inherited-from': '다음에서 상속됨',
- injectable: 'Injectable',
- injectables: 'Injectables',
- inputs: '입력',
- interceptors: 'Interceptors',
- interface: '인터페이스',
- interfaces: '인터페이스',
- legend: '범례',
- license: '라이선스',
- lines: '줄',
- metadata: '메타데이터',
- methods: '메소드',
- miscellaneous: '기타',
- module: '모듈',
- modules: '모듈',
- name: '이름',
- no: '아니오',
- 'no-graph': '사용할 수 있는 그래프가 없습니다.',
- 'no-iframe': '사용중인 브라우저가 iframe을 지원하지 않습니다',
- 'no-result-matching': '검색 결과가 없습니다',
- 'no-svg': '브라우저가 SVG를 지원하지 않습니다',
- optional: '선택적',
- outputs: '결과물',
- overview: '개요',
- parameters: '매개변수',
- 'peer-dependencies': '상호 의존성',
- pipe: '파이프',
- pipes: '파이프',
- prefix: '접두어',
- properties: '속성',
- providers: '제공자',
- pure: 'Pure',
- readme: 'README',
- required: '필수의',
- reset: '초기화',
- 'results-matching': '개의 결과가 일치했습니다',
- returns: '반환',
- route: 'Route',
- routes: 'Routes',
- schemas: '스키마',
- 'search-placeholder': '검색어 입력',
- selector: '선택자',
- signature: 'Signature',
- source: '출처',
- standalone: 'Standalone',
- statements: 'Statements',
- styles: '스타일',
- template: '주형',
- type: '타입',
- 'type-aliases': '타입 별칭',
- 'type-parameters': '타입 매개 변수',
- types: '타입',
- 'unamed-property': '익명 속성',
- 'unit-test-coverage': '단위 테스트 커버리지',
- value: '값',
- variables: '변수',
- yes: '네',
- zoomin: '확대',
- zoomout: '축소'
- };
- var TRANSLATION_NL_NL = {
- accessors: 'Accessors',
- arguments: 'Argumenten',
- bootstrap: 'Bootstrap',
- branches: 'Branches',
- browse: 'Browse',
- classe: 'Klasse',
- classes: 'Klassen',
- component: 'Component',
- components: 'Componenten',
- constructor: 'Constructor',
- controllers: 'Controllers',
- controller: 'Controller',
- 'coverage-page-title': 'Documentatie coverage',
- declarations: 'Declaraties',
- decorators: 'Decorators',
- 'default-value': 'Default waarde',
- 'defined-in': 'Gedefinieerd in',
- dependencies: 'Dependencies',
- deprecated: 'Verouderd',
- description: 'Omschrijving',
- directive: 'Directive',
- directives: 'Directives',
- 'dom tree': 'DOM boom',
- entities: 'Entiteiten',
- entity: 'Entiteit',
- entrycomponents: 'EntryComponents',
- enumerations: 'Enumerations',
- enums: 'Enums',
- example: 'Voorbeeld',
- examples: 'Voorbeelden',
- exports: 'Exports',
- extends: 'Extends',
- file: 'Bestand',
- functions: 'Functies',
- 'generated-using': 'Documentatie gegenereed met',
- 'getting-started': 'Aan de slag',
- guard: 'Guard',
- guards: 'Guards',
- hostbindings: 'HostBindings',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'HostListeners',
- 'html-element': 'Html element',
- 'html-element-with-directive': 'Html element met directive',
- identifier: 'Identifier',
- implements: 'Implementeert',
- imports: 'Imports',
- index: 'Index',
- indexable: 'Indexeerbaar',
- info: 'Informatie',
- 'inherited-from': 'Inherited van',
- injectable: 'Injectable',
- injectables: 'Injectables',
- inputs: 'Inputs',
- interceptors: 'Interceptors',
- interface: 'Interface',
- interfaces: 'Interfaces',
- legend: 'Legenda',
- license: 'Licentie',
- lines: 'Regels',
- metadata: 'Metadata',
- methods: 'Methods',
- miscellaneous: 'Diversen',
- module: 'Module',
- modules: 'Modules',
- name: 'Naam',
- no: 'Nee',
- 'no-graph': 'Geen diagram beschikbaar.',
- 'no-iframe': 'Uw browser ondersteund geen iframes.',
- 'no-result-matching': 'Geen overeenkomende resultaten',
- 'no-svg': 'Uw browser ondersteund geen SVG',
- optional: 'Optioneel',
- outputs: 'Outputs',
- overview: 'Overzicht',
- parameters: 'Parameters',
- 'peer-dependencies': 'Peer dependencies',
- pipe: 'Pipe',
- pipes: 'Pipes',
- prefix: 'Voorvoegsel',
- properties: 'Properties',
- providers: 'Providers',
- pure: 'Puur',
- readme: 'README',
- required: 'Vereist',
- reset: 'Reset',
- 'results-matching': 'overeenkomende resultaten',
- returns: 'Returns',
- route: 'Route',
- routes: 'Routes',
- schemas: "Schema's",
- 'search-placeholder': 'Type om te zoeken',
- selector: 'Selector',
- signature: 'Handtekening',
- source: 'Bron',
- standalone: 'Standalone',
- statements: 'Statements',
- styles: 'Stijlen',
- template: 'Sjabloon',
- type: 'Type',
- 'type-aliases': 'Type aliassen',
- 'type-parameters': 'Type parameters',
- types: 'Types',
- 'unamed-property': 'Naamloze property',
- 'unit-test-coverage': 'Unit test coverage',
- value: 'Waarde',
- variables: 'Variabelen',
- yes: 'Ja',
- zoomin: 'Zoom in',
- zoomout: 'Zoom uit'
- };
- var TRANSLATION_PL_PL = {
- accessors: 'Akcesor',
- arguments: 'Argumenty',
- bootstrap: 'Uruchomienie',
- branches: 'Gałęzie',
- browse: 'Przeglądaj',
- classe: 'Klasa',
- classes: 'Klasy',
- component: 'Komponent',
- components: 'Komponenty',
- constructor: 'Konstruktor',
- controllers: 'Kontrolery',
- controller: 'Kontroler',
- 'coverage-page-title': 'Pokrycie dokumentacją',
- declarations: 'Deklaracje',
- decorators: 'Dekoratory',
- 'default-value': 'Domyślna wartość',
- 'defined-in': 'Zdefiniowane w',
- dependencies: 'Biblioteki',
- deprecated: 'Przestarzałe',
- description: 'Opis',
- directive: 'Dyrektywa',
- directives: 'Dyrektywy',
- 'dom tree': 'DOM drzewo',
- entities: 'Podmioty',
- entity: 'Podmiot',
- entrycomponents: 'EntryComponents',
- enumerations: 'Enumeracje',
- enums: 'Enumy',
- example: 'Przykład',
- examples: 'Przykłady',
- exports: 'Exporty',
- extends: 'Rozszerza',
- file: 'Plik',
- functions: 'Funkcje',
- 'generated-using': 'Dokumentacja wygenerowana przy użyciu',
- 'getting-started': 'Start',
- guard: 'Guard',
- guards: "Guard'y",
- hostbindings: 'HostBindingi',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'HostListenery',
- 'html-element': 'Html element',
- 'html-element-with-directive': 'Html element z dyrektywą',
- identifier: 'Identyfikator',
- implements: 'Implementuje',
- imports: 'Importuje',
- index: 'Indeks',
- indexable: 'Indeksowany',
- info: 'Informatie',
- 'inherited-from': 'Dziedziczy z',
- injectable: 'Injectable',
- injectables: 'Injectables',
- inputs: 'Inputy',
- interceptors: 'Interceptory',
- interface: 'Interfejs',
- interfaces: 'Interfejsy',
- legend: 'Legenda',
- license: 'Licencja',
- lines: 'Linie',
- metadata: 'Metadane',
- methods: 'Metody',
- miscellaneous: 'Różne',
- module: 'Moduł',
- modules: 'Moduły',
- name: 'Nazwa',
- no: 'Nie',
- 'no-graph': 'Graf niedostępny.',
- 'no-iframe': "Twoja przeglądarka nie wspiera iframe'ów.",
- 'no-result-matching': 'Brak pasujących wyników',
- 'no-svg': 'Twoja przeglądarka nie wspiera SVG',
- optional: 'Opcjonalne',
- outputs: 'Outputy',
- overview: 'Przegląd',
- parameters: 'Parametry',
- 'peer-dependencies': 'Biblioteki zależne',
- pipe: 'Pipe',
- pipes: "Pipe'y",
- prefix: 'Prefiks',
- properties: 'Włąściwości',
- providers: 'Dostarczyciele',
- pure: 'Czysty',
- readme: 'README',
- required: 'Wymagany',
- reset: 'Reset',
- 'results-matching': 'pasujących wyników',
- returns: 'Zwraca',
- route: 'Route',
- routes: "Route'y",
- schemas: 'Schematy',
- 'search-placeholder': 'Wprowadź tekst wyszukiwania',
- selector: 'Selektor',
- signature: 'Podpis',
- source: 'Source',
- standalone: 'Standalone',
- statements: 'Instrukcje',
- styles: 'Estilos',
- template: 'Modelo',
- type: 'Typ',
- 'type-aliases': 'Aliasy typów',
- 'type-parameters': 'Parametry typów',
- types: 'Typy',
- 'unamed-property': 'Nienazwana właśność',
- 'unit-test-coverage': 'Pokrycie testami jednostkowymi',
- value: 'Wartość',
- variables: 'Zmienne',
- yes: 'Tak',
- zoomin: 'Przybliż',
- zoomout: 'Oddal'
- };
- var TRANSLATION_PT_BR = {
- accessors: 'Acessores',
- arguments: 'Argumentos',
- bootstrap: 'Bootstrap',
- branches: 'Branches',
- browse: 'Navegar',
- classe: 'Classe',
- classes: 'Classes',
- component: 'Componente',
- components: 'Componentes',
- constructor: 'Construtor',
- controllers: 'Controladores',
- controller: 'Controlador',
- 'coverage-page-title': 'Cobertura da documentação',
- declarations: 'Declarações',
- decorators: 'Decoradores',
- 'default-value': 'Valor padrão',
- 'defined-in': 'Definido em',
- dependencies: 'Dependências',
- deprecated: 'Descontinuada',
- description: 'Descrição',
- directive: 'Diretiva',
- directives: 'Diretivas',
- 'dom tree': 'Arvore DOM',
- entities: 'Entidades',
- entity: 'Entidade',
- entrycomponents: 'EntryComponents',
- enumerations: 'Enumerações',
- enums: 'Enums',
- example: 'Exemplo',
- examples: 'Exemplos',
- exports: 'Exports',
- extends: 'Extende',
- file: 'Arquivo',
- functions: 'Funções',
- 'generated-using': 'Documentação gerada usando',
- 'getting-started': 'Começando',
- guard: 'Guarda',
- guards: 'Guardas',
- hostbindings: 'HostBindings',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'HostListeners',
- 'html-element': 'Elemento HTML',
- 'html-element-with-directive': 'Elemento HTML com diretiva',
- identifier: 'Identificador',
- implements: 'Implementa',
- imports: 'Imports',
- index: 'Index',
- indexable: 'Indexável',
- info: 'Informação',
- 'inherited-from': 'Herdado de',
- injectable: 'Injetável',
- injectables: 'Injetáveis',
- inputs: 'Inputs',
- interceptors: 'Interceptors',
- interface: 'Interface',
- interfaces: 'Interfaces',
- legend: 'Legend',
- license: 'Licença',
- lines: 'Linhas',
- metadata: 'Metadata',
- methods: 'Métodos',
- miscellaneous: 'Miscelânea',
- module: 'Módulo',
- modules: 'Módulos',
- name: 'Nome',
- no: 'Não',
- 'no-graph': 'Sem gráfico disponível.',
- 'no-iframe': 'Seu browser não tem suporte a iframes.',
- 'no-result-matching': 'Nenhum resultado correspondente',
- 'no-svg': 'Seu browser não tem suporte a SVG',
- optional: 'Opcional',
- outputs: 'Outputs',
- overview: 'Visão geral',
- parameters: 'Parâmetros',
- 'peer-dependencies': 'Peer dependencies',
- pipe: 'Pipe',
- pipes: 'Pipes',
- prefix: 'Prefixo',
- properties: 'Propriedades',
- providers: 'Providers',
- pure: 'Puro',
- readme: 'README',
- required: 'Obrigatório',
- reset: 'Resetar',
- 'results-matching': 'resultados correspondentes',
- returns: 'Retorna',
- route: 'Rota',
- routes: 'Rotas',
- schemas: 'Esquemas',
- 'search-placeholder': 'Digite para pesquisar',
- selector: 'Seletor',
- signature: 'Assinatura',
- source: 'Fonte',
- standalone: 'Standalone',
- statements: 'Statements',
- styles: 'Estilos',
- template: 'Modelo',
- type: 'Tipo',
- 'type-aliases': 'Aliases de tipo',
- 'type-parameters': 'Parâmetros de tipo',
- types: 'Tipos',
- 'unamed-property': 'Propriedade não-nomeada',
- 'unit-test-coverage': 'Cobertura de teste unitário',
- value: 'Valor',
- variables: 'Variáveis',
- yes: 'Sim',
- zoomin: 'Zoom in',
- zoomout: 'Zoom out'
- };
- var TRANSLATION_RU_RU = {
- accessors: 'Аксессор',
- arguments: 'Аргументы',
- bootstrap: 'Загрузчик',
- branches: 'Ветки',
- browse: 'Обзор',
- classe: 'Класс',
- classes: 'Классы',
- component: 'Компонент',
- components: 'Компоненты',
- constructor: 'Конструктор',
- controllers: 'Контроллеры',
- controller: 'Контроллер',
- 'coverage-page-title': 'Покрытие документацией',
- declarations: 'Декларации',
- decorators: 'Декораторы',
- 'default-value': 'Значение по умолчанию',
- 'defined-in': 'Определен в',
- dependencies: 'Зависимости',
- deprecated: 'Устаревшая',
- description: 'Описание',
- directive: 'Директива',
- directives: 'Директивы',
- 'dom tree': 'DOM-дерево',
- entities: 'Сущности',
- entity: 'Сущность',
- entrycomponents: 'Входные компоненты',
- enumerations: 'Перечисления',
- enums: 'Перечисления',
- example: 'Пример',
- examples: 'Примеры',
- exports: 'Экспорт',
- extends: 'Расширяет',
- file: 'Файл',
- functions: 'Функции',
- 'generated-using': 'Документация создана с помощью',
- 'getting-started': 'Начало работы',
- guard: 'Защитник',
- guards: 'Защитники',
- hostbindings: 'Привязки хоста',
- hostdirectives: 'Директивы хоста',
- hostlisteners: 'Слушатели хоста',
- 'html-element': 'Html-элемент',
- 'html-element-with-directive': 'Html-элемент с директивой',
- identifier: 'Идентификатор',
- implements: 'Реализует',
- imports: 'Импорт',
- index: 'Индекс',
- indexable: 'Индексируемый',
- info: 'Информация',
- 'inherited-from': 'Наследуемый из',
- injectable: 'Внедрение',
- injectables: 'Внедрения',
- inputs: 'Входные данные',
- interceptors: 'Перехватчики',
- interface: 'Интерфейс',
- interfaces: 'Интерфейсы',
- legend: 'Легенда',
- license: 'Лицензия',
- lines: 'Строки',
- metadata: 'Метаданные',
- methods: 'Методы',
- miscellaneous: 'Разное',
- module: 'Модуль',
- modules: 'Модули',
- name: 'Имя',
- no: 'Нет',
- 'no-graph': 'Диаграмма недоступна.',
- 'no-iframe': 'Браузер не поддерживает iframes.',
- 'no-result-matching': 'Результаты не найдены',
- 'no-svg': 'Браузер не поддерживает SVG',
- optional: 'Опциональный',
- outputs: 'Выходные данные',
- overview: 'Обзор',
- parameters: 'Параметры',
- 'peer-dependencies': 'Одноранговые зависимости',
- pipe: 'Конвейер',
- pipes: 'Конвейеры',
- prefix: 'Префикс',
- properties: 'Свойства',
- providers: 'Провайдеры',
- pure: 'Чистый',
- readme: 'README',
- required: 'Требуемый',
- reset: 'Сброс',
- 'results-matching': 'результатов найдено',
- returns: 'Тип возвращаемого значения',
- route: 'Маршрут',
- routes: 'Маршруты',
- schemas: 'Схемы',
- 'search-placeholder': 'Введите для поиска',
- selector: 'Селектор',
- signature: 'Сигнатура',
- source: 'Источник',
- standalone: 'Автономный',
- statements: 'Утверждения',
- styles: 'Стили',
- template: 'Шаблон',
- type: 'Тип',
- 'type-aliases': 'Псевдонимы типов',
- 'type-parameters': 'Типы параметров',
- types: 'Типы',
- 'unamed-property': 'Безымянное свойство',
- 'unit-test-coverage': 'Покрытие модульными тестами',
- value: 'Значение',
- variables: 'Переменные',
- yes: 'Да',
- zoomin: 'Приблизить',
- zoomout: 'Отдалить'
- };
- var TRANSLATION_SK_SK = {
- accessors: 'Modifikátory prístupu',
- arguments: 'Argumenty',
- bootstrap: 'Bootstrap',
- branches: 'Vetvy',
- browse: 'Prezerať',
- classe: 'Trieda',
- classes: 'Triedy',
- component: 'Komponent',
- components: 'Komponenty',
- constructor: 'Konštruktor',
- controllers: 'Controllers',
- controller: 'Controller',
- 'coverage-page-title': 'Pokrytie dokumentáciou',
- declarations: 'Deklarácie',
- decorators: 'Dekorátory',
- 'default-value': 'Predvolená hodnota',
- 'defined-in': 'Definované v',
- dependencies: 'Závislosti',
- deprecated: 'Zastarel',
- description: 'Popis',
- directive: 'Direktíva',
- directives: 'Direktívy',
- 'dom tree': 'DOM strom',
- entities: 'Subjektov',
- entity: 'Subjekt',
- entrycomponents: 'EntryComponents',
- enumerations: 'Enumerátory',
- enums: 'Enumerátory',
- example: 'Príklad',
- examples: 'Príklady',
- exports: 'Exporty',
- extends: 'Rozširuje',
- file: 'Súbor',
- functions: 'Funkcie',
- 'generated-using': 'Dokumentácia vytvorená pomocou',
- 'getting-started': 'Začíname',
- guard: 'Guard',
- guards: 'Guards',
- hostbindings: 'HostBindings',
- hostdirectives: 'HostDirectives',
- hostlisteners: 'HostListeners',
- 'html-element': 'HTML element',
- 'html-element-with-directive': 'HTML element s direktívou',
- identifier: 'Identifikátor',
- implements: 'Implementuje',
- imports: 'Importuje',
- index: 'Index',
- indexable: 'Indexovateľný',
- info: 'Informácie',
- 'inherited-from': 'Zdedené od',
- injectable: 'Injectable',
- injectables: 'Injectables',
- inputs: 'Vstupy',
- interceptors: 'Interceptors',
- interface: 'Rozhranie',
- interfaces: 'Rozhrania',
- legend: 'Legenda',
- license: 'Licencia',
- lines: 'Riadky',
- metadata: 'Metadáta',
- methods: 'Metódy',
- miscellaneous: 'Rôzne',
- module: 'Modul',
- modules: 'Moduly',
- name: 'Názov',
- no: 'Nie',
- 'no-graph': 'Nie je k dispozícii žiadny graf.',
- 'no-iframe': 'Váš prehliadač nepodporuje iframe',
- 'no-result-matching': 'Nenájdené žiadne výsledky pre',
- 'no-svg': 'Váš prehliadač nepodporuje SVG',
- optional: 'Voliteľný',
- outputs: 'Výstupy',
- overview: 'Prehľad',
- parameters: 'Parametre',
- 'peer-dependencies': 'Peer dependencies',
- pipe: 'Pipe',
- pipes: 'Pipes',
- prefix: 'Prefix',
- properties: 'Vlastnosti',
- providers: 'Providers',
- pure: 'Pure',
- readme: 'README',
- required: 'Požadovaný',
- reset: 'Resetovať',
- 'results-matching': 'výsledkov pre',
- returns: 'Návratová hodnota',
- route: 'Route',
- routes: 'Routes',
- schemas: 'Schémy',
- 'search-placeholder': 'Zadajte hľadaný text',
- selector: 'Selektor',
- signature: 'Podpis',
- source: 'Zdroj',
- standalone: 'Standalone',
- statements: 'Statements',
- styles: 'Štýly',
- template: 'Šablóna',
- type: 'Typ',
- 'type-aliases': 'Type aliases',
- 'type-parameters': 'Type parameters',
- types: 'Typy',
- 'unamed-property': 'Nepomenovaný atribút',
- 'unit-test-coverage': 'Pokrytie unit testami',
- value: 'Hodnota',
- variables: 'Premenné',
- yes: 'Áno',
- zoomin: 'Priblížiť',
- zoomout: 'Oddialiť'
- };
- var TRANSLATION_ZH_CN = {
- accessors: '存取器',
- arguments: 'Arguments',
- bootstrap: '根组件',
- branches: '分支',
- browse: '查看',
- classe: '类',
- classes: '类列表',
- component: '组件',
- components: '组件列表',
- constructor: '构造方法',
- controllers: 'Controllers',
- controller: 'Controller',
- 'coverage-page-title': '文档概览',
- declarations: '可声明对象列表',
- decorators: '装饰器列表',
- 'default-value': '缺省值',
- 'defined-in': '被定义在',
- dependencies: '依赖项',
- deprecated: '已弃用',
- description: '描述',
- directive: '指令',
- directives: '指令列表',
- 'dom tree': 'DOM 树',
- entities: '实体',
- entity: '实体',
- entrycomponents: '入口组件列表',
- enumerations: '列举',
- enums: '枚举列表',
- example: '例子',
- examples: '例子',
- exports: '导出',
- extends: '继承',
- file: '文件',
- functions: '函数',
- 'generated-using': '文档生成使用',
- 'getting-started': '入门指南',
- guard: '路由守卫',
- guards: '路由守卫列表',
- hostbindings: '宿主绑定',
- hostdirectives: 'Host Directives',
- hostlisteners: '宿主监听',
- 'html-element': 'Html 元素',
- 'html-element-with-directive': '带指令的Html元素',
- identifier: '标识符',
- implements: '实现',
- imports: '引入',
- index: '索引',
- indexable: 'Indexable',
- info: '信息',
- 'inherited-from': '继承自',
- injectable: '可注入的',
- injectables: '可注入的',
- inputs: '输入属性',
- interceptors: '拦截器',
- interface: '接口',
- interfaces: '接口',
- legend: '图例',
- license: '许可协议',
- lines: 'Lines',
- metadata: '元数据',
- methods: '方法',
- miscellaneous: '其他',
- module: '模块',
- modules: '模块列表',
- name: '名称',
- no: '否',
- 'no-graph': '无数据显示',
- 'no-iframe': '你的浏览器不支持iframes',
- 'no-result-matching': '无匹配的结果',
- 'no-svg': '你的浏览器不支持SVG',
- optional: '可选的',
- outputs: '输出属性',
- overview: '概述',
- parameters: '参数列表',
- 'peer-dependencies': '同级依赖',
- pipe: '管道',
- pipes: '管道列表',
- prefix: '字首',
- properties: '属性列表',
- providers: '提供商列表',
- pure: 'Pure',
- readme: '手册',
- required: '必需的',
- reset: '重置',
- 'results-matching': '匹配的结果',
- returns: '返回',
- route: '路由',
- routes: '路由列表',
- schemas: '模式',
- 'search-placeholder': '请输入查询关键字',
- selector: '选择器',
- signature: '签名',
- source: '来源',
- standalone: 'Standalone',
- statements: '注释',
- styles: '样式',
- template: '模板',
- type: '类型',
- 'type-aliases': '类型别名',
- 'type-parameters': '类型参数',
- types: '类型',
- 'unamed-property': '未命名属性',
- 'unit-test-coverage': '单元测试概览',
- value: '值',
- variables: '变量',
- yes: '是',
- zoomin: '放大',
- zoomout: '缩小'
- };
- var TRANSLATION_ZH_TW = {
- accessors: '存取器',
- arguments: '參數',
- bootstrap: '根元件',
- branches: '分支',
- browse: '瀏覽',
- classe: '類別',
- classes: '類別',
- component: '元件',
- components: '元件列表',
- constructor: '建構式方法',
- controllers: 'Controllers',
- controller: 'Controller',
- 'coverage-page-title': '覆蓋率頁面標題',
- declarations: 'Declarations',
- decorators: '裝飾器列表',
- 'default-value': '預設值',
- 'defined-in': '被定義在',
- dependencies: '依賴項',
- deprecated: '已棄用',
- description: '描述',
- directive: '指令 (Directive)',
- directives: '指令 (Directives)',
- 'dom tree': 'DOM 樹',
- entities: '實體',
- entity: '實體',
- entrycomponents: 'Entrycomponents',
- enumerations: '列舉',
- enums: '枚舉列表',
- example: '範例',
- examples: '範例',
- exports: '匯出',
- extends: '繼承',
- file: '檔案',
- functions: '函數',
- 'generated-using': '產生文件使用',
- 'getting-started': '快速上手',
- guard: '路由守衛',
- guards: '路由守衛列表',
- hostbindings: 'Host Bindings',
- hostdirectives: 'Host Directives',
- hostlisteners: 'Host Listeners',
- 'html-element': 'HTML 元素',
- 'html-element-with-directive': '帶指令的 HTML 元素',
- identifier: '識別符號',
- implements: '實作',
- imports: '匯入',
- index: '索引',
- indexable: 'Indexable',
- info: '資訊',
- 'inherited-from': '繼承自',
- injectable: 'Injectable',
- injectables: 'Injectables',
- inputs: '輸入屬性',
- interceptors: '攔截器',
- interface: '介面',
- interfaces: '介面',
- legend: '圖例',
- license: '授權協議',
- lines: 'Lines',
- metadata: '元數據',
- methods: '方法',
- miscellaneous: '其他',
- module: '模組',
- modules: '模組列表',
- name: '名稱',
- no: '否',
- 'no-graph': '無數據顯示',
- 'no-iframe': '你的瀏覽器不支援 iframes',
- 'no-result-matching': '無匹配的結果',
- 'no-svg': '你的瀏覽器不支援 SVG',
- optional: '可選的',
- outputs: '輸出屬性',
- overview: '概述',
- parameters: '參數列表',
- 'peer-dependencies': 'Peer Dependencies',
- pipe: '管道',
- pipes: '管道列表',
- prefix: '前置詞',
- properties: '屬性列表',
- providers: '提供者列表',
- pure: 'Pure',
- readme: 'README',
- required: '必需的',
- reset: '重設',
- 'results-matching': '匹配的結果',
- returns: '回傳值',
- route: '路由',
- routes: '路由列表',
- schemas: 'Schemas',
- 'search-placeholder': '請輸入查詢關鍵字',
- selector: '選擇器',
- signature: '簽名',
- source: '來源',
- standalone: 'Standalone',
- statements: '陳述式',
- styles: '樣式',
- template: '範本',
- type: '型別',
- 'type-aliases': '型別別名',
- 'type-parameters': '型別參數',
- types: '型別',
- 'unamed-property': '未命名屬性',
- 'unit-test-coverage': '單元測試覆蓋率',
- value: '值',
- variables: '變數',
- yes: '是',
- zoomin: '放大',
- zoomout: '縮小'
- };
- var I18nEngine = /** @class */ (function () {
- function I18nEngine() {
- this.availablesLanguages = {
- 'bg-BG': 'bg-BG',
- 'de-DE': 'de-DE',
- 'en-US': 'en-US',
- 'es-ES': 'es-ES',
- 'fr-FR': 'fr-FR',
- 'hu-HU': 'hu-HU',
- 'it-IT': 'it-IT',
- 'ja-JP': 'ja-JP',
- 'ka-GE': 'ka-GE',
- 'ko-KR': 'ko-KR',
- 'nl-NL': 'nl-NL',
- 'pl-PL': 'pl-PL',
- 'pt-BR': 'pt-BR',
- 'ru-RU': 'ru-RU',
- 'sk-SK': 'sk-SK',
- 'zh-CN': 'zh-CN',
- 'zh-TW': 'zh-TW'
- };
- this.fallbackLanguage = 'en-US';
- }
- I18nEngine.getInstance = function () {
- if (!I18nEngine.instance) {
- I18nEngine.instance = new I18nEngine();
- }
- return I18nEngine.instance;
- };
- I18nEngine.prototype.init = function (language) {
- i18next.init({
- lng: language,
- fallbackLng: this.fallbackLanguage,
- interpolation: {
- skipOnVariables: false
- }
- });
- i18next.addResources('de-DE', 'translation', TRANSLATION_DE_DE);
- i18next.addResources('en-US', 'translation', TRANSLATION_EN_US);
- i18next.addResources('es-ES', 'translation', TRANSLATION_ES_ES);
- i18next.addResources('fr-FR', 'translation', TRANSLATION_FR_FR);
- i18next.addResources('hu-HU', 'translation', TRANSLATION_HU_HU);
- i18next.addResources('it-IT', 'translation', TRANSLATION_IT_IT);
- i18next.addResources('ja-JP', 'translation', TRANSLATION_JA_JP);
- i18next.addResources('ka-GE', 'translation', TRANSLATION_KA_GE);
- i18next.addResources('ko-KR', 'translation', TRANSLATION_KO_KR);
- i18next.addResources('nl-NL', 'translation', TRANSLATION_NL_NL);
- i18next.addResources('pl-PL', 'translation', TRANSLATION_PL_PL);
- i18next.addResources('pt-BR', 'translation', TRANSLATION_PT_BR);
- i18next.addResources('ru-RU', 'translation', TRANSLATION_RU_RU);
- i18next.addResources('sk-SK', 'translation', TRANSLATION_SK_SK);
- i18next.addResources('zh-CN', 'translation', TRANSLATION_ZH_CN);
- i18next.addResources('zh-TW', 'translation', TRANSLATION_ZH_TW);
- };
- I18nEngine.prototype.translate = function (key) {
- return i18next.t(key);
- };
- I18nEngine.prototype.exists = function (key) {
- return i18next.exists(key);
- };
- I18nEngine.prototype.supportLanguage = function (language) {
- return typeof this.availablesLanguages[language] !== 'undefined';
- };
- return I18nEngine;
- }());
- var I18nEngine$1 = I18nEngine.getInstance();
- require('handlebars');
- var I18nHelper = /** @class */ (function () {
- function I18nHelper() {
- }
- I18nHelper.prototype.helperFunc = function (context, i18n_key) {
- if (I18nEngine$1.exists(i18n_key)) {
- return I18nEngine$1.translate(i18n_key.toLowerCase());
- }
- else {
- return i18n_key;
- }
- };
- return I18nHelper;
- }());
- var IfStringHelper = /** @class */ (function () {
- function IfStringHelper() {
- }
- IfStringHelper.prototype.helperFunc = function (context, a, options) {
- if (typeof a === 'string') {
- return options.fn(context);
- }
- return options.inverse(context);
- };
- return IfStringHelper;
- }());
- var IndexableSignatureHelper = /** @class */ (function () {
- function IndexableSignatureHelper() {
- }
- IndexableSignatureHelper.prototype.helperFunc = function (context, method) {
- var args = method.args.map(function (arg) { return "".concat(arg.name, ": ").concat(arg.type); }).join(', ');
- if (method.name) {
- return "".concat(method.name, "[").concat(args, "]");
- }
- else {
- return "[".concat(args, "]");
- }
- };
- return IndexableSignatureHelper;
- }());
- var IsInitialTabHelper = /** @class */ (function () {
- function IsInitialTabHelper() {
- }
- IsInitialTabHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
- return tabs[0].id === tabId ? options.fn(context) : options.inverse(context);
- };
- return IsInitialTabHelper;
- }());
- var IsNotToggleHelper = /** @class */ (function () {
- function IsNotToggleHelper() {
- }
- IsNotToggleHelper.prototype.helperFunc = function (context, type, options) {
- var result = Configuration$1.mainData.toggleMenuItems.indexOf(type);
- if (Configuration$1.mainData.toggleMenuItems.indexOf('all') !== -1) {
- return options.inverse(context);
- }
- else if (result !== -1) {
- return options.fn(context);
- }
- else {
- return options.inverse(context);
- }
- };
- return IsNotToggleHelper;
- }());
- var IsTabEnabledHelper = /** @class */ (function () {
- function IsTabEnabledHelper() {
- }
- IsTabEnabledHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
- var isTabEnabled = -1 !== ___namespace.findIndex(tabs, { id: tabId });
- return isTabEnabled ? options.fn(context) : options.inverse(context);
- };
- return IsTabEnabledHelper;
- }());
- var JsdocCodeExampleHelper = /** @class */ (function () {
- function JsdocCodeExampleHelper() {
- }
- JsdocCodeExampleHelper.prototype.cleanTag = function (comment) {
- if (comment.charAt(0) === '*') {
- comment = comment.substring(1, comment.length);
- }
- if (comment.charAt(0) === ' ') {
- comment = comment.substring(1, comment.length);
- }
- if (comment.indexOf('<p>') === 0) {
- comment = comment.substring(3, comment.length);
- }
- if (comment.substr(-1) === '\n') {
- comment = comment.substring(0, comment.length - 1);
- }
- if (comment.substr(-4) === '</p>') {
- comment = comment.substring(0, comment.length - 4);
- }
- return comment;
- };
- JsdocCodeExampleHelper.prototype.getHtmlEntities = function (str) {
- return String(str)
- .replace(/&/g, '&')
- .replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/"/g, '"');
- };
- JsdocCodeExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
- var i = 0;
- var len = jsdocTags.length;
- var tags = [];
- var type = 'html';
- if (options.hash.type) {
- type = options.hash.type;
- }
- for (i; i < len; i++) {
- if (jsdocTags[i].tagName) {
- if (jsdocTags[i].tagName.text === 'example') {
- var tag = {};
- if (jsdocTags[i].comment) {
- if (jsdocTags[i].comment.indexOf('<caption>') !== -1) {
- tag.comment = jsdocTags[i].comment
- .replace(/<caption>/g, '<b><i>')
- .replace(/\/caption>/g, '/b></i>');
- }
- else {
- tag.comment =
- "<pre class=\"line-numbers\"><code class=\"language-".concat(type, "\">") +
- this.getHtmlEntities(this.cleanTag(jsdocTags[i].comment)) +
- "</code></pre>";
- }
- tags.push(tag);
- }
- }
- }
- }
- if (tags.length > 0) {
- context.tags = tags;
- return options.fn(context);
- }
- };
- return JsdocCodeExampleHelper;
- }());
- var JsdocDefaultHelper = /** @class */ (function () {
- function JsdocDefaultHelper() {
- }
- JsdocDefaultHelper.prototype.helperFunc = function (context, jsdocTags, options) {
- if (jsdocTags) {
- var i = 0;
- var len = jsdocTags.length;
- var tag = {};
- var defaultValue = false;
- for (i; i < len; i++) {
- if (jsdocTags[i].tagName) {
- if (jsdocTags[i].tagName.text === 'default') {
- defaultValue = true;
- if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
- tag.type = jsdocTags[i].typeExpression.type.name.text;
- }
- if (jsdocTags[i].comment) {
- tag.comment = jsdocTags[i].comment;
- }
- if (jsdocTags[i].name) {
- tag.name = jsdocTags[i].name.text;
- }
- }
- }
- }
- if (defaultValue) {
- context.tag = tag;
- return options.fn(context);
- }
- }
- };
- return JsdocDefaultHelper;
- }());
- var JsdocExampleHelper = /** @class */ (function () {
- function JsdocExampleHelper() {
- }
- JsdocExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
- var i = 0;
- var len = jsdocTags.length;
- var tags = [];
- for (i; i < len; i++) {
- if (jsdocTags[i].tagName) {
- if (jsdocTags[i].tagName.text === 'example') {
- var tag = {};
- if (jsdocTags[i].comment) {
- tag.comment = jsdocTags[i].comment
- .replace(/<caption>/g, '<b><i>')
- .replace(/\/caption>/g, '/b></i>');
- }
- tags.push(tag);
- }
- }
- }
- if (tags.length > 0) {
- context.tags = tags;
- return options.fn(context);
- }
- };
- return JsdocExampleHelper;
- }());
- var JsdocParamsValidHelper = /** @class */ (function () {
- function JsdocParamsValidHelper() {
- }
- JsdocParamsValidHelper.prototype.helperFunc = function (context, jsdocTags, options) {
- var i = 0;
- var len = jsdocTags.length;
- var valid = false;
- for (i; i < len; i++) {
- if (jsdocTags[i].tagName) {
- if (jsdocTags[i].tagName.text === 'param') {
- valid = true;
- }
- }
- }
- if (valid) {
- return options.fn(context);
- }
- else {
- return options.inverse(context);
- }
- };
- return JsdocParamsValidHelper;
- }());
- var JsdocParamsHelper = /** @class */ (function () {
- function JsdocParamsHelper() {
- }
- JsdocParamsHelper.prototype.helperFunc = function (context, jsdocTags, options) {
- var i = 0;
- var len = jsdocTags.length;
- var tags = [];
- for (i; i < len; i++) {
- if (jsdocTags[i].tagName) {
- if (jsdocTags[i].tagName.text === 'param') {
- var tag = {};
- if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.kind) {
- tag.type = kindToType(jsdocTags[i].typeExpression.type.kind);
- }
- if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
- tag.type = jsdocTags[i].typeExpression.type.name.text;
- }
- else {
- tag.type = jsdocTags[i].type;
- }
- if (jsdocTags[i].comment) {
- tag.comment = jsdocTags[i].comment;
- }
- if (jsdocTags[i].defaultValue) {
- tag.defaultValue = jsdocTags[i].defaultValue;
- }
- if (jsdocTags[i].name) {
- if (jsdocTags[i].name.text) {
- tag.name = jsdocTags[i].name.text;
- }
- else {
- tag.name = jsdocTags[i].name;
- }
- }
- if (jsdocTags[i].optional) {
- tag.optional = true;
- }
- tags.push(tag);
- }
- }
- }
- if (tags.length >= 1) {
- context.tags = tags;
- return options.fn(context);
- }
- };
- return JsdocParamsHelper;
- }());
- var JsdocReturnsCommentHelper = /** @class */ (function () {
- function JsdocReturnsCommentHelper() {
- }
- JsdocReturnsCommentHelper.prototype.helperFunc = function (context, jsdocTags, options) {
- var i = 0;
- var len = jsdocTags.length;
- var result;
- for (i; i < len; i++) {
- if (jsdocTags[i].tagName) {
- if (jsdocTags[i].tagName.text === 'returns' ||
- jsdocTags[i].tagName.text === 'return') {
- result = jsdocTags[i].comment;
- break;
- }
- }
- }
- return result;
- };
- return JsdocReturnsCommentHelper;
- }());
- var ast$1 = new tsMorph.Project();
- var ImportsUtil = /** @class */ (function () {
- function ImportsUtil() {
- }
- ImportsUtil.getInstance = function () {
- if (!ImportsUtil.instance) {
- ImportsUtil.instance = new ImportsUtil();
- }
- return ImportsUtil.instance;
- };
- /**
- * Find for a sourceFile a variable value in a local enum
- * @param srcFile
- * @param variableName
- * @param variableValue
- */
- ImportsUtil.prototype.findInEnums = function (srcFile, variableName, variableValue) {
- var res = '';
- srcFile.getEnum(function (e) {
- if (e.getName() === variableName) {
- e.getMember(function (m) {
- if (m.getName() === variableValue) {
- res = m.getValue();
- }
- });
- }
- });
- return res;
- };
- /**
- * Find for a sourceFile a variable value in a local static class
- * @param srcFile
- * @param variableName
- * @param variableValue
- */
- ImportsUtil.prototype.findInClasses = function (srcFile, variableName, variableValue) {
- var res = '';
- srcFile.getClass(function (c) {
- var staticProperty = c.getStaticProperty(variableValue);
- if (staticProperty) {
- if (staticProperty.getInitializer()) {
- res = staticProperty.getInitializer().getText();
- }
- }
- });
- return res;
- };
- /**
- * Find a value in a local variable declaration like an object
- * @param variableDeclaration
- * @param variablesAttributes
- */
- ImportsUtil.prototype.findInObjectVariableDeclaration = function (variableDeclaration, variablesAttributes) {
- var variableKind = variableDeclaration.getKind();
- if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
- var initializer = variableDeclaration.getInitializer();
- if (initializer) {
- var initializerKind = initializer.getKind();
- if (initializerKind && initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
- var compilerNode = initializer.compilerNode, finalValue_1 = '';
- // Find thestring from AVAR.BVAR.thestring inside properties
- var depth_1 = 0;
- var loopProperties_1 = function (properties) {
- properties.forEach(function (prop) {
- if (prop.name) {
- if (variablesAttributes[depth_1 + 1]) {
- if (prop.name.getText() === variablesAttributes[depth_1 + 1]) {
- if (prop.initializer) {
- if (prop.initializer.properties) {
- depth_1 += 1;
- loopProperties_1(prop.initializer.properties);
- }
- else {
- finalValue_1 = prop.initializer.text;
- }
- }
- else {
- finalValue_1 = prop.initializer.text;
- }
- }
- }
- }
- });
- };
- loopProperties_1(compilerNode.properties);
- return finalValue_1;
- }
- }
- }
- };
- /**
- * Find in imports something like myvar
- * @param {string} inputVariableName like myvar
- * @return {[type]} myvar value
- */
- ImportsUtil.prototype.findValueInImportOrLocalVariables = function (inputVariableName, sourceFile, decoratorType) {
- var e_1, _a;
- var metadataVariableName = inputVariableName, searchedImport, aliasOriginalName = '', foundWithNamedImport = false, foundWithAlias = false;
- var file = typeof ast$1.getSourceFile(sourceFile.fileName) !== 'undefined'
- ? ast$1.getSourceFile(sourceFile.fileName)
- : ast$1.addSourceFileAtPathIfExists(sourceFile.fileName); // tslint:disable-line
- var imports = file.getImportDeclarations();
- /**
- * Loop through all imports, and find one matching inputVariableName
- */
- imports.forEach(function (i) {
- var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
- if (namedImportsLength > 0) {
- for (j; j < namedImportsLength; j++) {
- var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
- if (namedImports[j].getAliasNode()) {
- importAlias = namedImports[j].getAliasNode().getText();
- }
- if (importName === metadataVariableName) {
- foundWithNamedImport = true;
- searchedImport = i;
- break;
- }
- if (importAlias === metadataVariableName) {
- foundWithNamedImport = true;
- foundWithAlias = true;
- aliasOriginalName = importName;
- searchedImport = i;
- break;
- }
- }
- }
- var namespaceImport = i.getNamespaceImport();
- if (namespaceImport) {
- var namespaceImportLocalName = namespaceImport.getText();
- if (namespaceImportLocalName === metadataVariableName) {
- searchedImport = i;
- }
- }
- if (!foundWithNamedImport) {
- var defaultImport = i.getDefaultImport();
- if (defaultImport) {
- var defaultImportText = defaultImport.getText();
- if (defaultImportText === metadataVariableName) {
- searchedImport = i;
- }
- }
- }
- });
- function hasFoundValues(variableDeclaration) {
- var variableKind = variableDeclaration.getKind();
- if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
- var initializer = variableDeclaration.getInitializer();
- if (initializer) {
- var initializerKind = initializer.getKind();
- if (initializerKind && initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
- var compilerNode = initializer.compilerNode;
- return compilerNode.properties;
- }
- }
- }
- }
- if (typeof searchedImport !== 'undefined') {
- var importPathReference = searchedImport.getModuleSpecifierSourceFile();
- var importPath = void 0;
- if (typeof importPathReference !== 'undefined') {
- importPath = importPathReference.compilerNode.fileName;
- var sourceFileImport = typeof ast$1.getSourceFile(importPath) !== 'undefined'
- ? ast$1.getSourceFile(importPath)
- : ast$1.addSourceFileAtPathIfExists(importPath); // tslint:disable-line
- if (sourceFileImport) {
- var variableName_1 = foundWithAlias ? aliasOriginalName : metadataVariableName;
- var variableDeclaration = sourceFileImport.getVariableDeclaration(variableName_1);
- if (variableDeclaration) {
- return hasFoundValues(variableDeclaration);
- }
- else {
- // Try with exports
- var exportDeclarations = sourceFileImport.getExportedDeclarations();
- if (exportDeclarations && exportDeclarations.size > 0) {
- try {
- for (var exportDeclarations_1 = __values(exportDeclarations), exportDeclarations_1_1 = exportDeclarations_1.next(); !exportDeclarations_1_1.done; exportDeclarations_1_1 = exportDeclarations_1.next()) {
- var _b = __read(exportDeclarations_1_1.value, 2), exportDeclarationKey = _b[0], exportDeclarationValues = _b[1];
- exportDeclarationValues.forEach(function (exportDeclarationValue) {
- if (exportDeclarationValue instanceof tsMorph.VariableDeclaration &&
- exportDeclarationValue.getName() === variableName_1) {
- return hasFoundValues(exportDeclarationValue);
- }
- });
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (exportDeclarations_1_1 && !exportDeclarations_1_1.done && (_a = exportDeclarations_1.return)) _a.call(exportDeclarations_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- }
- }
- }
- if (!importPathReference &&
- decoratorType === 'template' &&
- searchedImport.getModuleSpecifierValue().indexOf('.html') !== -1) {
- var originalSourceFilePath = sourceFile.path;
- var originalSourceFilePathFolder = originalSourceFilePath.substring(0, originalSourceFilePath.lastIndexOf('/'));
- var finalImportedPath = originalSourceFilePathFolder + '/' + searchedImport.getModuleSpecifierValue();
- var finalImportedPathData = FileEngine$1.getSync(finalImportedPath);
- return finalImportedPathData;
- }
- }
- else {
- // Find in local variables of the file
- var variableDeclaration = file.getVariableDeclaration(metadataVariableName);
- if (variableDeclaration) {
- var variableKind = variableDeclaration.getKind();
- if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
- var initializer = variableDeclaration.getInitializer();
- if (initializer) {
- var initializerKind = initializer.getKind();
- if (initializerKind &&
- initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
- var compilerNode = initializer.compilerNode;
- return compilerNode.properties;
- }
- else if (initializerKind &&
- (initializerKind === tsMorph.SyntaxKind.StringLiteral ||
- initializerKind === tsMorph.SyntaxKind.NoSubstitutionTemplateLiteral)) {
- if (decoratorType === 'template') {
- return initializer.getText();
- }
- else {
- return variableDeclaration.compilerNode;
- }
- }
- else if (initializerKind) {
- return variableDeclaration.compilerNode;
- }
- }
- }
- }
- }
- return [];
- };
- ImportsUtil.prototype.getFileNameOfImport = function (variableName, sourceFile) {
- var file = typeof ast$1.getSourceFile(sourceFile.fileName) !== 'undefined'
- ? ast$1.getSourceFile(sourceFile.fileName)
- : ast$1.addSourceFileAtPath(sourceFile.fileName); // tslint:disable-line
- var imports = file.getImportDeclarations();
- var searchedImport, finalPath = '';
- imports.forEach(function (i) {
- var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
- if (namedImportsLength > 0) {
- for (j; j < namedImportsLength; j++) {
- var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
- if (namedImports[j].getAliasNode()) {
- importAlias = namedImports[j].getAliasNode().getText();
- }
- if (importName === variableName) {
- searchedImport = i;
- break;
- }
- if (importAlias === variableName) {
- searchedImport = i;
- break;
- }
- }
- }
- });
- if (typeof searchedImport !== 'undefined') {
- var importPath = path__namespace.resolve(path__namespace.dirname(sourceFile.fileName) +
- '/' +
- searchedImport.getModuleSpecifierValue() +
- '.ts');
- var cleaner = (process.cwd() + path__namespace.sep).replace(/\\/g, '/');
- finalPath = importPath.replace(cleaner, '');
- }
- return finalPath;
- };
- /**
- * Find the file path of imported variable
- * @param {string} inputVariableName like thestring
- * @return {[type]} thestring destination path
- */
- ImportsUtil.prototype.findFilePathOfImportedVariable = function (inputVariableName, sourceFilePath) {
- var searchedImport, finalPath = '';
- var file = typeof ast$1.getSourceFile(sourceFilePath) !== 'undefined'
- ? ast$1.getSourceFile(sourceFilePath)
- : ast$1.addSourceFileAtPath(sourceFilePath); // tslint:disable-line
- var imports = file.getImportDeclarations();
- /**
- * Loop through all imports, and find one matching inputVariableName
- */
- imports.forEach(function (i) {
- var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
- if (namedImportsLength > 0) {
- for (j; j < namedImportsLength; j++) {
- var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
- if (namedImports[j].getAliasNode()) {
- importAlias = namedImports[j].getAliasNode().getText();
- }
- if (importName === inputVariableName) {
- searchedImport = i;
- break;
- }
- if (importAlias === inputVariableName) {
- searchedImport = i;
- break;
- }
- }
- }
- });
- if (typeof searchedImport !== 'undefined') {
- finalPath = path__namespace.resolve(path__namespace.dirname(sourceFilePath) +
- '/' +
- searchedImport.getModuleSpecifierValue() +
- '.ts');
- }
- return finalPath;
- };
- /**
- * Find in imports something like VAR.AVAR.BVAR.thestring
- * @param {string} inputVariableName like VAR.AVAR.BVAR.thestring
- * @return {[type]} thestring value
- */
- ImportsUtil.prototype.findPropertyValueInImportOrLocalVariables = function (inputVariableName, sourceFile) {
- var variablesAttributes = inputVariableName.split('.'), metadataVariableName = variablesAttributes[0], searchedImport, aliasOriginalName = '', foundWithAlias = false;
- var file = typeof ast$1.getSourceFile(sourceFile.fileName) !== 'undefined'
- ? ast$1.getSourceFile(sourceFile.fileName)
- : ast$1.addSourceFileAtPath(sourceFile.fileName); // tslint:disable-line
- var imports = file.getImportDeclarations();
- /**
- * Loop through all imports, and find one matching inputVariableName
- */
- imports.forEach(function (i) {
- var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
- if (namedImportsLength > 0) {
- for (j; j < namedImportsLength; j++) {
- var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
- if (namedImports[j].getAliasNode()) {
- importAlias = namedImports[j].getAliasNode().getText();
- }
- if (importName === metadataVariableName) {
- searchedImport = i;
- break;
- }
- if (importAlias === metadataVariableName) {
- foundWithAlias = true;
- aliasOriginalName = importName;
- searchedImport = i;
- break;
- }
- }
- }
- });
- var fileToSearchIn, variableDeclaration;
- if (typeof searchedImport !== 'undefined') {
- var importPath = path__namespace.resolve(path__namespace.dirname(sourceFile.fileName) +
- '/' +
- searchedImport.getModuleSpecifierValue() +
- '.ts');
- var sourceFileImport = typeof ast$1.getSourceFile(importPath) !== 'undefined'
- ? ast$1.getSourceFile(importPath)
- : ast$1.addSourceFileAtPath(importPath); // tslint:disable-line
- if (sourceFileImport) {
- fileToSearchIn = sourceFileImport;
- var variableName = foundWithAlias ? aliasOriginalName : metadataVariableName;
- variableDeclaration = fileToSearchIn.getVariableDeclaration(variableName);
- }
- }
- else {
- fileToSearchIn = file;
- // Find in local variables of the file
- variableDeclaration = fileToSearchIn.getVariableDeclaration(metadataVariableName);
- }
- if (variableDeclaration) {
- return this.findInObjectVariableDeclaration(variableDeclaration, variablesAttributes);
- }
- // Try find it in enums
- if (variablesAttributes.length > 0) {
- if (typeof fileToSearchIn !== 'undefined') {
- var val = this.findInEnums(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
- if (val !== '') {
- return val;
- }
- val = this.findInClasses(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
- if (val !== '') {
- return val;
- }
- }
- }
- };
- return ImportsUtil;
- }());
- var ImportsUtil$1 = ImportsUtil.getInstance();
- var Handlebars$5 = require('handlebars');
- var traverse$1 = require('neotraverse/legacy');
- var ast = new tsMorph.Project();
- var RouterParserUtil = /** @class */ (function () {
- function RouterParserUtil() {
- this.scannedFiles = [];
- this.routes = [];
- this.incompleteRoutes = [];
- this.modules = [];
- this.modulesWithRoutes = [];
- this.transformAngular8ImportSyntax = /(['"]loadChildren['"]:)\(\)(:[^)]+?)?=>"import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)\.then\(\(?\w+?\)?=>\S+?\.([^)]+?)\)(\\'|'|")/g;
- this.transformAngular8ImportSyntaxComponent = /(['"]loadComponent['"]:)\(\)(:[^)]+?)?=>"import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)\.then\(\(?\w+?\)?=>\S+?\.([^)]+?)\)(\\'|'|")/g;
- this.transformAngular8ImportSyntaxAsyncAwait = /(['"]loadChildren['"]:)\(\)(:[^)]+?)?=>\("import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)"\)\.['"]([^)]+?)['"]/g;
- this.transformAngular8ImportSyntaxComponentAsyncAwait = /(['"]loadComponent['"]:)\(\)(:[^)]+?)?=>\("import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)"\)\.['"]([^)]+?)['"]/g;
- this.trailingComma = /,\s*([\]})])/g;
- }
- RouterParserUtil.getInstance = function () {
- if (!RouterParserUtil.instance) {
- RouterParserUtil.instance = new RouterParserUtil();
- }
- return RouterParserUtil.instance;
- };
- RouterParserUtil.prototype.addRoute = function (route) {
- this.routes.push(route);
- this.routes = ___namespace.sortBy(___namespace.uniqWith(this.routes, ___namespace.isEqual), ['name']);
- };
- RouterParserUtil.prototype.addIncompleteRoute = function (route) {
- this.incompleteRoutes.push(route);
- this.incompleteRoutes = ___namespace.sortBy(___namespace.uniqWith(this.incompleteRoutes, ___namespace.isEqual), ['name']);
- };
- RouterParserUtil.prototype.addModuleWithRoutes = function (moduleName, moduleImports, filename) {
- this.modulesWithRoutes.push({
- name: moduleName,
- importsNode: moduleImports,
- filename: filename
- });
- this.modulesWithRoutes = ___namespace.sortBy(___namespace.uniqWith(this.modulesWithRoutes, ___namespace.isEqual), ['name']);
- };
- RouterParserUtil.prototype.addModule = function (moduleName, moduleImports) {
- this.modules.push({
- name: moduleName,
- importsNode: moduleImports
- });
- this.modules = ___namespace.sortBy(___namespace.uniqWith(this.modules, ___namespace.isEqual), ['name']);
- };
- RouterParserUtil.prototype.cleanRawRouteParsed = function (route) {
- return JSON5__namespace.parse(this.cleanRawRoute(route));
- };
- RouterParserUtil.prototype.cleanRawRoute = function (route) {
- return route
- .replace(/\s/g, '')
- .replace(this.trailingComma, '$1')
- .replace(this.transformAngular8ImportSyntax, '$1"$4#$6"')
- .replace(this.transformAngular8ImportSyntaxAsyncAwait, '$1"$4#$6"')
- .replace(this.transformAngular8ImportSyntaxComponent, '$1"$4#$6"')
- .replace(this.transformAngular8ImportSyntaxComponentAsyncAwait, '$1"$4#$6"');
- };
- RouterParserUtil.prototype.setRootModule = function (module) {
- this.rootModule = module;
- };
- RouterParserUtil.prototype.hasRouterModuleInImports = function (imports) {
- for (var i = 0; i < imports.length; i++) {
- if (imports[i].name.indexOf('RouterModule.forChild') !== -1 ||
- imports[i].name.indexOf('RouterModule.forRoot') !== -1 ||
- imports[i].name.indexOf('RouterModule') !== -1) {
- return true;
- }
- }
- return false;
- };
- RouterParserUtil.prototype.fixIncompleteRoutes = function (miscellaneousVariables) {
- var matchingVariables = [];
- // For each incompleteRoute, scan if one misc variable is in code
- // if ok, try recreating complete route
- for (var i = 0; i < this.incompleteRoutes.length; i++) {
- for (var j = 0; j < miscellaneousVariables.length; j++) {
- if (this.incompleteRoutes[i].data.indexOf(miscellaneousVariables[j].name) !== -1) {
- console.log('found one misc var inside incompleteRoute');
- console.log(miscellaneousVariables[j].name);
- matchingVariables.push(miscellaneousVariables[j]);
- }
- }
- // Clean incompleteRoute
- this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace('[', '');
- this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace(']', '');
- }
- };
- RouterParserUtil.prototype.linkModulesAndRoutes = function () {
- var _this = this;
- var i = 0;
- var len = this.modulesWithRoutes.length;
- for (i; i < len; i++) {
- ___namespace.forEach(this.modulesWithRoutes[i].importsNode, function (node) {
- var initializer = node.initializer;
- if (initializer) {
- if (initializer.elements) {
- ___namespace.forEach(initializer.elements, function (element) {
- // find element with arguments
- if (element.arguments) {
- ___namespace.forEach(element.arguments, function (argument) {
- ___namespace.forEach(_this.routes, function (route) {
- if (argument.text &&
- route.name === argument.text &&
- route.filename === _this.modulesWithRoutes[i].filename) {
- route.module = _this.modulesWithRoutes[i].name;
- }
- else if (argument.text &&
- route.name === argument.text &&
- route.filename !== _this.modulesWithRoutes[i].filename) {
- var argumentImportPath = ImportsUtil$1.findFilePathOfImportedVariable(argument.text, _this.modulesWithRoutes[i].filename);
- argumentImportPath = argumentImportPath
- .replace(process.cwd() + path__namespace.sep, '')
- .replace(/\\/g, '/');
- if (argument.text &&
- route.name === argument.text &&
- route.filename === argumentImportPath) {
- route.module = _this.modulesWithRoutes[i].name;
- }
- }
- });
- });
- }
- });
- }
- }
- /**
- * direct support of for example
- * export const HomeRoutingModule: ModuleWithProviders = RouterModule.forChild(HOME_ROUTES);
- */
- if (tsMorph.ts.isCallExpression(node)) {
- if (node.arguments) {
- ___namespace.forEach(node.arguments, function (argument) {
- ___namespace.forEach(_this.routes, function (route) {
- if (argument.text &&
- route.name === argument.text &&
- route.filename === _this.modulesWithRoutes[i].filename) {
- route.module = _this.modulesWithRoutes[i].name;
- }
- });
- });
- }
- }
- });
- }
- };
- RouterParserUtil.prototype.foundRouteWithModuleName = function (moduleName) {
- return ___namespace.find(this.routes, { module: moduleName });
- };
- RouterParserUtil.prototype.foundLazyModuleWithPath = function (modulePath) {
- // path is like app/customers/customers.module#CustomersModule
- var split = modulePath.split('#');
- var lazyModuleName = split[1];
- return lazyModuleName;
- };
- RouterParserUtil.prototype.foundLazyComponentWithPath = function (componentPath) {
- // path is like app/customers/customers.component#CustomersComponent
- var split = componentPath.split('#');
- var lazyComponentName = split[1];
- return lazyComponentName;
- };
- RouterParserUtil.prototype.constructRoutesTree = function () {
- var _this = this;
- // routes[] contains routes with module link
- // modulesTree contains modules tree
- // make a final routes tree with that
- traverse$1(this.modulesTree).forEach(function (node) {
- if (node) {
- if (node.parent) {
- delete node.parent;
- }
- if (node.initializer) {
- delete node.initializer;
- }
- if (node.importsNode) {
- delete node.importsNode;
- }
- }
- });
- this.cleanModulesTree = ___namespace.cloneDeep(this.modulesTree);
- var routesTree = {
- name: '<root>',
- kind: 'module',
- className: this.rootModule,
- children: []
- };
- var loopModulesParser = function (node) {
- if (node.children && node.children.length > 0) {
- // If module has child modules
- for (var i in node.children) {
- var route = _this.foundRouteWithModuleName(node.children[i].name);
- if (route && route.data) {
- try {
- route.children = JSON5__namespace.parse(route.data);
- }
- catch (e) {
- logger.error('Error during generation of routes JSON file, maybe a trailing comma or an external variable inside one route.');
- }
- delete route.data;
- route.kind = 'module';
- routesTree.children.push(route);
- }
- if (node.children[i].children) {
- loopModulesParser(node.children[i]);
- }
- }
- }
- else {
- // else routes are directly inside the module
- var rawRoutes = _this.foundRouteWithModuleName(node.name);
- if (rawRoutes) {
- var routes = JSON5__namespace.parse(rawRoutes.data);
- if (routes) {
- var i = 0;
- var len = routes.length;
- var routeAddedOnce = false;
- for (i; i < len; i++) {
- var route = routes[i];
- if (routes[i].component) {
- routeAddedOnce = true;
- routesTree.children.push({
- kind: 'component',
- component: routes[i].component,
- path: routes[i].path
- });
- }
- }
- if (!routeAddedOnce) {
- routesTree.children = __spreadArray(__spreadArray([], __read(routesTree.children), false), __read(routes), false);
- }
- }
- }
- }
- };
- var startModule = ___namespace.find(this.cleanModulesTree, { name: this.rootModule });
- if (startModule) {
- loopModulesParser(startModule);
- // Loop twice for routes with lazy loading
- // loopModulesParser(routesTree);
- }
- var cleanedRoutesTree = undefined;
- var cleanRoutesTree = function (route) {
- for (var i in route.children) {
- route.children[i].routes;
- }
- return route;
- };
- cleanedRoutesTree = cleanRoutesTree(routesTree);
- // Try updating routes with lazy loading
- var loopInsideModule = function (mod, _rawModule) {
- if (mod.children) {
- for (var z in mod.children) {
- var route = _this.foundRouteWithModuleName(mod.children[z].name);
- if (typeof route !== 'undefined') {
- if (route.data) {
- route.children = JSON5__namespace.parse(route.data);
- delete route.data;
- route.kind = 'module';
- _rawModule.children.push(route);
- }
- }
- }
- }
- else {
- var route = _this.foundRouteWithModuleName(mod.name);
- if (typeof route !== 'undefined') {
- if (route.data) {
- route.children = JSON5__namespace.parse(route.data);
- delete route.data;
- route.kind = 'module';
- _rawModule.children.push(route);
- }
- }
- }
- };
- var loopRoutesParser = function (route) {
- if (route.children) {
- for (var i in route.children) {
- if (route.children[i].loadChildren) {
- var child = _this.foundLazyModuleWithPath(route.children[i].loadChildren);
- var module_1 = ___namespace.find(_this.cleanModulesTree, {
- name: child
- });
- if (module_1) {
- var _rawModule = {};
- _rawModule.kind = 'module';
- _rawModule.children = [];
- _rawModule.module = module_1.name;
- loopInsideModule(module_1, _rawModule);
- route.children[i].children = [];
- route.children[i].children.push(_rawModule);
- }
- }
- if (route.children[i].loadComponent) {
- var child = _this.foundLazyComponentWithPath(route.children[i].loadComponent);
- if (child) {
- route.children[i].component = child;
- }
- }
- loopRoutesParser(route.children[i]);
- }
- }
- };
- loopRoutesParser(cleanedRoutesTree);
- return cleanedRoutesTree;
- };
- RouterParserUtil.prototype.constructModulesTree = function () {
- var _this = this;
- var getNestedChildren = function (arr, parent) {
- var out = [];
- for (var i in arr) {
- if (arr[i].parent === parent) {
- var children = getNestedChildren(arr, arr[i].name);
- if (children.length) {
- arr[i].children = children;
- }
- out.push(arr[i]);
- }
- }
- return out;
- };
- // Scan each module and add parent property
- ___namespace.forEach(this.modules, function (firstLoopModule) {
- ___namespace.forEach(firstLoopModule.importsNode, function (importNode) {
- ___namespace.forEach(_this.modules, function (module) {
- if (module.name === importNode.name) {
- module.parent = firstLoopModule.name;
- }
- });
- });
- });
- this.modulesTree = getNestedChildren(this.modules);
- };
- RouterParserUtil.prototype.generateRoutesIndex = function (outputFolder, routes) {
- return FileEngine$1.get(__dirname + '/../src/templates/partials/routes-index.hbs').then(function (data) {
- var template = Handlebars$5.compile(data);
- var result = template({
- routes: JSON.stringify(routes)
- });
- var testOutputDir = outputFolder.match(process.cwd());
- if (testOutputDir && testOutputDir.length > 0) {
- outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
- }
- return FileEngine$1.write(outputFolder + path__namespace.sep + '/js/routes/routes_index.js', result);
- }, function (err) { return Promise.reject('Error during routes index generation'); });
- };
- RouterParserUtil.prototype.routesLength = function () {
- var _n = 0;
- var routesParser = function (route) {
- if (typeof route.path !== 'undefined') {
- _n += 1;
- }
- if (route.children) {
- for (var j in route.children) {
- routesParser(route.children[j]);
- }
- }
- };
- for (var i in this.routes) {
- routesParser(this.routes[i]);
- }
- return _n;
- };
- RouterParserUtil.prototype.printRoutes = function () {
- console.log('');
- console.log('printRoutes: ');
- console.log(this.routes);
- };
- RouterParserUtil.prototype.printModulesRoutes = function () {
- console.log('');
- console.log('printModulesRoutes: ');
- console.log(this.modulesWithRoutes);
- };
- RouterParserUtil.prototype.isVariableRoutes = function (node) {
- var result = false;
- if (node.declarationList && node.declarationList.declarations) {
- var i = 0;
- var len = node.declarationList.declarations.length;
- for (i; i < len; i++) {
- if (node.declarationList.declarations[i].type) {
- if (node.declarationList.declarations[i].type.typeName &&
- node.declarationList.declarations[i].type.typeName.text === 'Routes') {
- result = true;
- }
- }
- }
- }
- return result;
- };
- RouterParserUtil.prototype.cleanFileIdentifiers = function (sourceFile) {
- var e_1, _a, e_2, _b;
- var _this = this;
- var file = sourceFile;
- var identifiers = file.getDescendantsOfKind(tsMorph.SyntaxKind.Identifier).filter(function (p) {
- return (tsMorph.Node.isArrayLiteralExpression(p.getParentOrThrow()) ||
- tsMorph.Node.isPropertyAssignment(p.getParentOrThrow()));
- });
- var identifiersInRoutesVariableStatement = [];
- var _loop_1 = function (identifier) {
- // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
- var foundParentVariableStatement = false;
- identifier.getParentWhile(function (n) {
- if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
- if (_this.isVariableRoutes(n.compilerNode)) {
- foundParentVariableStatement = true;
- }
- }
- return true;
- });
- if (foundParentVariableStatement) {
- identifiersInRoutesVariableStatement.push(identifier);
- }
- };
- try {
- for (var identifiers_1 = __values(identifiers), identifiers_1_1 = identifiers_1.next(); !identifiers_1_1.done; identifiers_1_1 = identifiers_1.next()) {
- var identifier = identifiers_1_1.value;
- _loop_1(identifier);
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (identifiers_1_1 && !identifiers_1_1.done && (_a = identifiers_1.return)) _a.call(identifiers_1);
- }
- finally { if (e_1) throw e_1.error; }
- }
- try {
- // inline the property access expressions
- for (var identifiersInRoutesVariableStatement_1 = __values(identifiersInRoutesVariableStatement), identifiersInRoutesVariableStatement_1_1 = identifiersInRoutesVariableStatement_1.next(); !identifiersInRoutesVariableStatement_1_1.done; identifiersInRoutesVariableStatement_1_1 = identifiersInRoutesVariableStatement_1.next()) {
- var identifier = identifiersInRoutesVariableStatement_1_1.value;
- var identifierDeclaration = identifier
- .getSymbolOrThrow()
- .getValueDeclarationOrThrow();
- if (!tsMorph.Node.isPropertyAssignment(identifierDeclaration) &&
- tsMorph.Node.isVariableDeclaration(identifierDeclaration) &&
- tsMorph.Node.isPropertyAssignment(identifierDeclaration) &&
- !tsMorph.Node.isVariableDeclaration(identifierDeclaration)) {
- throw new Error("Not implemented referenced declaration kind: ".concat(identifierDeclaration.getKindName()));
- }
- if (tsMorph.Node.isVariableDeclaration(identifierDeclaration)) {
- identifier.replaceWithText(identifierDeclaration.getInitializerOrThrow().getText());
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (identifiersInRoutesVariableStatement_1_1 && !identifiersInRoutesVariableStatement_1_1.done && (_b = identifiersInRoutesVariableStatement_1.return)) _b.call(identifiersInRoutesVariableStatement_1);
- }
- finally { if (e_2) throw e_2.error; }
- }
- return file;
- };
- RouterParserUtil.prototype.cleanFileSpreads = function (sourceFile) {
- var e_3, _a, e_4, _b;
- var _this = this;
- var file = sourceFile;
- var spreadElements = file
- .getDescendantsOfKind(tsMorph.SyntaxKind.SpreadElement)
- .filter(function (p) { return tsMorph.Node.isArrayLiteralExpression(p.getParentOrThrow()); });
- var spreadElementsInRoutesVariableStatement = [];
- var _loop_2 = function (spreadElement) {
- // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
- var foundParentVariableStatement = false;
- spreadElement.getParentWhile(function (n) {
- if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
- if (_this.isVariableRoutes(n.compilerNode)) {
- foundParentVariableStatement = true;
- }
- }
- return true;
- });
- if (foundParentVariableStatement) {
- spreadElementsInRoutesVariableStatement.push(spreadElement);
- }
- };
- try {
- for (var spreadElements_1 = __values(spreadElements), spreadElements_1_1 = spreadElements_1.next(); !spreadElements_1_1.done; spreadElements_1_1 = spreadElements_1.next()) {
- var spreadElement = spreadElements_1_1.value;
- _loop_2(spreadElement);
- }
- }
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
- finally {
- try {
- if (spreadElements_1_1 && !spreadElements_1_1.done && (_a = spreadElements_1.return)) _a.call(spreadElements_1);
- }
- finally { if (e_3) throw e_3.error; }
- }
- var _loop_3 = function (spreadElement) {
- var spreadElementIdentifier = spreadElement.getExpression().getText(), searchedImport, aliasOriginalName = '', foundWithAliasInImports = false, foundWithAlias = false;
- // Try to find it in imports
- var imports = file.getImportDeclarations();
- imports.forEach(function (i) {
- var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
- if (namedImportsLength > 0) {
- for (j; j < namedImportsLength; j++) {
- var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
- if (namedImports[j].getAliasNode()) {
- importAlias = namedImports[j].getAliasNode().getText();
- }
- if (importName === spreadElementIdentifier) {
- foundWithAliasInImports = true;
- searchedImport = i;
- break;
- }
- if (importAlias === spreadElementIdentifier) {
- foundWithAliasInImports = true;
- foundWithAlias = true;
- aliasOriginalName = importName;
- searchedImport = i;
- break;
- }
- }
- }
- });
- var referencedDeclaration = void 0;
- if (foundWithAliasInImports) {
- if (typeof searchedImport !== 'undefined') {
- var routePathIsBad = function (path) {
- var result = _this.scannedFiles.find(function (scannedFile) { return path === scannedFile.path; });
- return !result;
- };
- var getIndicesOf = function (searchStr, str, caseSensitive) {
- var searchStrLen = searchStr.length;
- if (searchStrLen == 0) {
- return [];
- }
- var startIndex = 0, index, indices = [];
- if (!caseSensitive) {
- str = str.toLowerCase();
- searchStr = searchStr.toLowerCase();
- }
- while ((index = str.indexOf(searchStr, startIndex)) > -1) {
- indices.push(index);
- startIndex = index + searchStrLen;
- }
- return indices;
- };
- var dirNamePath = path__namespace.dirname(file.getFilePath());
- var searchedImportPath = searchedImport.getModuleSpecifierValue();
- var leadingFilePath = searchedImportPath.split('/').shift();
- var importPath = path__namespace.resolve(dirNamePath + '/' + searchedImport.getModuleSpecifierValue() + '.ts');
- if (routePathIsBad(importPath)) {
- var leadingIndices = getIndicesOf(leadingFilePath, importPath, true);
- if (leadingIndices.length > 1) {
- // Nested route fixes
- var startIndex = leadingIndices[0];
- var endIndex = leadingIndices[leadingIndices.length - 1];
- importPath =
- importPath.slice(0, startIndex) + importPath.slice(endIndex);
- }
- else {
- // Top level route fixes
- importPath =
- path__namespace.dirname(dirNamePath) + '/' + searchedImportPath + '.ts';
- }
- }
- var sourceFileImport = typeof ast.getSourceFile(importPath) !== 'undefined'
- ? ast.getSourceFile(importPath)
- : ast.addSourceFileAtPath(importPath);
- if (sourceFileImport) {
- var variableName = foundWithAlias
- ? aliasOriginalName
- : spreadElementIdentifier;
- referencedDeclaration =
- sourceFileImport.getVariableDeclaration(variableName);
- }
- }
- }
- else {
- // if not, try directly in file
- referencedDeclaration = spreadElement
- .getExpression()
- .getSymbolOrThrow()
- .getValueDeclarationOrThrow();
- }
- if (!tsMorph.Node.isVariableDeclaration(referencedDeclaration)) {
- throw new Error("Not implemented referenced declaration kind: ".concat(referencedDeclaration.getKindName()));
- }
- var referencedArray = referencedDeclaration.getInitializerIfKindOrThrow(tsMorph.SyntaxKind.ArrayLiteralExpression);
- var spreadElementArray = spreadElement.getParentIfKindOrThrow(tsMorph.SyntaxKind.ArrayLiteralExpression);
- var insertIndex = spreadElementArray.getElements().indexOf(spreadElement);
- spreadElementArray.removeElement(spreadElement);
- spreadElementArray.insertElements(insertIndex, referencedArray.getElements().map(function (e) { return e.getText(); }));
- };
- try {
- // inline the ArrayLiteralExpression SpreadElements
- for (var spreadElementsInRoutesVariableStatement_1 = __values(spreadElementsInRoutesVariableStatement), spreadElementsInRoutesVariableStatement_1_1 = spreadElementsInRoutesVariableStatement_1.next(); !spreadElementsInRoutesVariableStatement_1_1.done; spreadElementsInRoutesVariableStatement_1_1 = spreadElementsInRoutesVariableStatement_1.next()) {
- var spreadElement = spreadElementsInRoutesVariableStatement_1_1.value;
- _loop_3(spreadElement);
- }
- }
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
- finally {
- try {
- if (spreadElementsInRoutesVariableStatement_1_1 && !spreadElementsInRoutesVariableStatement_1_1.done && (_b = spreadElementsInRoutesVariableStatement_1.return)) _b.call(spreadElementsInRoutesVariableStatement_1);
- }
- finally { if (e_4) throw e_4.error; }
- }
- return file;
- };
- RouterParserUtil.prototype.cleanFileDynamics = function (sourceFile) {
- var e_5, _a, e_6, _b;
- var _this = this;
- var file = sourceFile;
- var propertyAccessExpressions = file
- .getDescendantsOfKind(tsMorph.SyntaxKind.PropertyAccessExpression)
- .filter(function (p) { return !tsMorph.Node.isPropertyAccessExpression(p.getParentOrThrow()); });
- var propertyAccessExpressionsInRoutesVariableStatement = [];
- var _loop_4 = function (propertyAccessExpression) {
- // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
- var foundParentVariableStatement = false;
- propertyAccessExpression.getParentWhile(function (n) {
- if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
- if (_this.isVariableRoutes(n.compilerNode)) {
- foundParentVariableStatement = true;
- }
- }
- return true;
- });
- if (foundParentVariableStatement) {
- propertyAccessExpressionsInRoutesVariableStatement.push(propertyAccessExpression);
- }
- };
- try {
- for (var propertyAccessExpressions_1 = __values(propertyAccessExpressions), propertyAccessExpressions_1_1 = propertyAccessExpressions_1.next(); !propertyAccessExpressions_1_1.done; propertyAccessExpressions_1_1 = propertyAccessExpressions_1.next()) {
- var propertyAccessExpression = propertyAccessExpressions_1_1.value;
- _loop_4(propertyAccessExpression);
- }
- }
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
- finally {
- try {
- if (propertyAccessExpressions_1_1 && !propertyAccessExpressions_1_1.done && (_a = propertyAccessExpressions_1.return)) _a.call(propertyAccessExpressions_1);
- }
- finally { if (e_5) throw e_5.error; }
- }
- try {
- // inline the property access expressions
- for (var propertyAccessExpressionsInRoutesVariableStatement_1 = __values(propertyAccessExpressionsInRoutesVariableStatement), propertyAccessExpressionsInRoutesVariableStatement_1_1 = propertyAccessExpressionsInRoutesVariableStatement_1.next(); !propertyAccessExpressionsInRoutesVariableStatement_1_1.done; propertyAccessExpressionsInRoutesVariableStatement_1_1 = propertyAccessExpressionsInRoutesVariableStatement_1.next()) {
- var propertyAccessExpression = propertyAccessExpressionsInRoutesVariableStatement_1_1.value;
- var propertyAccessExpressionNodeName = propertyAccessExpression.getNameNode();
- if (propertyAccessExpressionNodeName) {
- try {
- var propertyAccessExpressionNodeNameSymbol = propertyAccessExpressionNodeName.getSymbolOrThrow();
- if (propertyAccessExpressionNodeNameSymbol) {
- var referencedDeclaration = propertyAccessExpressionNodeNameSymbol.getValueDeclarationOrThrow();
- if (!tsMorph.Node.isPropertyAssignment(referencedDeclaration) &&
- tsMorph.Node.isEnumMember(referencedDeclaration) &&
- tsMorph.Node.isPropertyAssignment(referencedDeclaration) &&
- !tsMorph.Node.isEnumMember(referencedDeclaration)) {
- throw new Error("Not implemented referenced declaration kind: ".concat(referencedDeclaration.getKindName()));
- }
- if (typeof referencedDeclaration.getInitializerOrThrow !== 'undefined') {
- propertyAccessExpression.replaceWithText(referencedDeclaration.getInitializerOrThrow().getText());
- }
- }
- }
- catch (e) { }
- }
- }
- }
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
- finally {
- try {
- if (propertyAccessExpressionsInRoutesVariableStatement_1_1 && !propertyAccessExpressionsInRoutesVariableStatement_1_1.done && (_b = propertyAccessExpressionsInRoutesVariableStatement_1.return)) _b.call(propertyAccessExpressionsInRoutesVariableStatement_1);
- }
- finally { if (e_6) throw e_6.error; }
- }
- return file;
- };
- /**
- * replace callexpressions with string : utils.doWork() -> 'utils.doWork()' doWork() -> 'doWork()'
- * @param sourceFile ts.SourceFile
- */
- RouterParserUtil.prototype.cleanCallExpressions = function (sourceFile) {
- var e_7, _a;
- var file = sourceFile;
- var variableStatements = sourceFile.getVariableDeclaration(function (v) {
- var result = false;
- var type = v.compilerNode.type;
- if (typeof type !== 'undefined' && typeof type.typeName !== 'undefined') {
- result = type.typeName.text === 'Routes';
- }
- return result;
- });
- var initializer = variableStatements.getInitializer();
- var _loop_5 = function (callExpr) {
- if (callExpr.wasForgotten()) {
- return "continue";
- }
- callExpr.replaceWithText(function (writer) { return writer.quote(callExpr.getText()); });
- };
- try {
- for (var _b = __values(initializer.getDescendantsOfKind(tsMorph.SyntaxKind.CallExpression)), _c = _b.next(); !_c.done; _c = _b.next()) {
- var callExpr = _c.value;
- _loop_5(callExpr);
- }
- }
- catch (e_7_1) { e_7 = { error: e_7_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_7) throw e_7.error; }
- }
- return file;
- };
- /**
- * Clean routes definition with imported data, for example path, children, or dynamic stuff inside data
- *
- * const MY_ROUTES: Routes = [
- * {
- * path: 'home',
- * component: HomeComponent
- * },
- * {
- * path: PATHS.home,
- * component: HomeComponent
- * }
- * ];
- *
- * The initializer is an array (ArrayLiteralExpression - 177 ), it has elements, objects (ObjectLiteralExpression - 178)
- * with properties (PropertyAssignment - 261)
- *
- * For each know property (https://angular.io/api/router/Routes#description), we try to see if we have what we want
- *
- * Ex: path and pathMatch want a string, component a component reference.
- *
- * It is an imperative approach, not a generic way, parsing all the tree
- * and find something like this which willl break JSON.stringify : MYIMPORT.path
- *
- * @param {ts.Node} initializer The node of routes definition
- * @return {ts.Node} The edited node
- */
- RouterParserUtil.prototype.cleanRoutesDefinitionWithImport = function (initializer, node, sourceFile) {
- initializer.elements.forEach(function (element) {
- element.properties.forEach(function (property) {
- var propertyName = property.name.getText(), propertyInitializer = property.initializer;
- switch (propertyName) {
- case 'path':
- case 'redirectTo':
- case 'outlet':
- case 'pathMatch':
- if (propertyInitializer) {
- if (propertyInitializer.kind !== tsMorph.SyntaxKind.StringLiteral) {
- // Identifier(71) won't break parsing, but it will be better to retrive them
- // PropertyAccessExpression(179) ex: MYIMPORT.path will break it, find it in import
- if (propertyInitializer.kind === tsMorph.SyntaxKind.PropertyAccessExpression) {
- var lastObjectLiteralAttributeName = propertyInitializer.name.getText(), firstObjectLiteralAttributeName = void 0;
- if (propertyInitializer.expression) {
- firstObjectLiteralAttributeName =
- propertyInitializer.expression.getText();
- var result = ImportsUtil$1.findPropertyValueInImportOrLocalVariables(firstObjectLiteralAttributeName +
- '.' +
- lastObjectLiteralAttributeName, sourceFile); // tslint:disable-line
- if (result !== '') {
- propertyInitializer.kind = 9;
- propertyInitializer.text = result;
- }
- }
- }
- }
- }
- break;
- }
- });
- });
- return initializer;
- };
- return RouterParserUtil;
- }());
- var RouterParserUtil$1 = RouterParserUtil.getInstance();
- function isModuleWithProviders(node) {
- var result = false;
- if (node.declarationList) {
- if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
- var i = 0; node.declarationList.declarations; var len = node.declarationList.declarations.length;
- for (i; i < len; i++) {
- var declaration = node.declarationList.declarations[i];
- if (declaration.type) {
- var type = declaration.type;
- if (type.typeName) {
- var text = type.typeName.getText();
- if (text === 'ModuleWithProviders') {
- result = true;
- }
- }
- }
- }
- }
- }
- return result;
- }
- function getModuleWithProviders(node) {
- var result;
- if (node.declarationList) {
- if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
- var i = 0, len = node.declarationList.declarations.length;
- for (i; i < len; i++) {
- var declaration = node.declarationList.declarations[i];
- if (declaration.type) {
- var type = declaration.type;
- if (type.typeName) {
- var text = type.typeName.getText();
- if (text === 'ModuleWithProviders') {
- result = declaration.initializer;
- }
- }
- }
- }
- }
- }
- return result;
- }
- var ExtendsMerger = /** @class */ (function () {
- function ExtendsMerger() {
- }
- ExtendsMerger.getInstance = function () {
- if (!ExtendsMerger.instance) {
- ExtendsMerger.instance = new ExtendsMerger();
- }
- return ExtendsMerger.instance;
- };
- ExtendsMerger.prototype.merge = function (deps) {
- var _this = this;
- this.components = deps.components;
- this.classes = deps.classes;
- this.injectables = deps.injectables;
- this.directives = deps.directives;
- this.controllers = deps.controllers;
- this.aliases = deps.aliases;
- var mergeExtendedProperties = function (component) {
- var ext;
- if (typeof component.extends !== 'undefined') {
- ext = _this.findInDependencies(component.extends[0]);
- if (ext) {
- var recursiveScanWithInheritance_1 = function (cls) {
- // From class to component
- if (typeof cls.methods !== 'undefined' && cls.methods.length > 0) {
- var newMethods = _.cloneDeep(cls.methods);
- newMethods = _this.markInheritance(newMethods, cls);
- if (typeof component.methodsClass !== 'undefined') {
- _this.mergeInheritance(component, 'methodsClass', newMethods);
- }
- }
- if (typeof cls.properties !== 'undefined' && cls.properties.length > 0) {
- var newProperties = _.cloneDeep(cls.properties);
- newProperties = _this.markInheritance(newProperties, cls);
- if (typeof component.propertiesClass !== 'undefined') {
- _this.mergeInheritance(component, 'propertiesClass', newProperties);
- }
- }
- // From component to component or directive to component
- if (typeof cls.inputsClass !== 'undefined' && cls.inputsClass.length > 0) {
- var newInputs = _.cloneDeep(cls.inputsClass);
- newInputs = _this.markInheritance(newInputs, cls);
- if (typeof component.inputsClass !== 'undefined') {
- _this.mergeInheritance(component, 'inputsClass', newInputs);
- }
- }
- if (typeof cls.outputsClass !== 'undefined' &&
- cls.outputsClass.length > 0) {
- var newOutputs = _.cloneDeep(cls.outputsClass);
- newOutputs = _this.markInheritance(newOutputs, cls);
- if (typeof component.outputsClass !== 'undefined') {
- _this.mergeInheritance(component, 'outputsClass', newOutputs);
- }
- }
- if (typeof cls.methodsClass !== 'undefined' &&
- cls.methodsClass.length > 0) {
- var newMethods = _.cloneDeep(cls.methodsClass);
- newMethods = _this.markInheritance(newMethods, cls);
- if (typeof component.methodsClass !== 'undefined') {
- _this.mergeInheritance(component, 'methodsClass', newMethods);
- }
- }
- if (typeof cls.propertiesClass !== 'undefined' &&
- cls.propertiesClass.length > 0) {
- var newProperties = _.cloneDeep(cls.propertiesClass);
- newProperties = _this.markInheritance(newProperties, cls);
- if (typeof component.propertiesClass !== 'undefined') {
- _this.mergeInheritance(component, 'propertiesClass', newProperties);
- }
- }
- if (typeof cls.hostBindings !== 'undefined' &&
- cls.hostBindings.length > 0) {
- var newHostBindings = _.cloneDeep(cls.hostBindings);
- newHostBindings = _this.markInheritance(newHostBindings, cls);
- if (typeof component.hostBindings !== 'undefined') {
- _this.mergeInheritance(component, 'hostBindings', newHostBindings);
- }
- }
- if (typeof cls.hostListeners !== 'undefined' &&
- cls.hostListeners.length > 0) {
- var newHostListeners = _.cloneDeep(cls.hostListeners);
- newHostListeners = _this.markInheritance(newHostListeners, cls);
- if (typeof component.hostListeners !== 'undefined') {
- _this.mergeInheritance(component, 'hostListeners', newHostListeners);
- }
- }
- if (Configuration$1.mainData.disableLifeCycleHooks) {
- component.methodsClass = cleanLifecycleHooksFromMethods(component.methodsClass);
- }
- if (cls.extends) {
- recursiveScanWithInheritance_1(_this.findInDependencies(cls.extends[0]));
- }
- };
- // From class to class
- recursiveScanWithInheritance_1(ext);
- }
- }
- };
- this.components.forEach(mergeExtendedProperties);
- this.directives.forEach(mergeExtendedProperties);
- this.controllers.forEach(mergeExtendedProperties);
- var mergeExtendedClasses = function (el) {
- var ext;
- if (typeof el.extends !== 'undefined') {
- ext = _this.findInDependencies(el.extends[0]);
- if (ext) {
- var recursiveScanWithInheritance_2 = function (cls) {
- if (typeof cls.methods !== 'undefined' && cls.methods.length > 0) {
- var newMethods = _.cloneDeep(cls.methods);
- newMethods = _this.markInheritance(newMethods, cls);
- if (typeof el.methods !== 'undefined') {
- _this.mergeInheritance(el, 'methods', newMethods);
- }
- }
- if (typeof cls.properties !== 'undefined' && cls.properties.length > 0) {
- var newProperties = _.cloneDeep(cls.properties);
- newProperties = _this.markInheritance(newProperties, cls);
- if (typeof el.properties !== 'undefined') {
- _this.mergeInheritance(el, 'properties', newProperties);
- }
- }
- if (cls.extends) {
- recursiveScanWithInheritance_2(_this.findInDependencies(cls.extends[0]));
- }
- };
- // From elss to elss
- recursiveScanWithInheritance_2(ext);
- }
- }
- };
- this.classes.forEach(mergeExtendedClasses);
- this.injectables.forEach(mergeExtendedClasses);
- this.directives.forEach(mergeExtendedClasses);
- this.controllers.forEach(mergeExtendedClasses);
- return deps;
- };
- ExtendsMerger.prototype.markInheritance = function (data, originalource) {
- return data.map(function (el) {
- var newElement = el;
- newElement.inheritance = {
- file: originalource.name
- };
- return newElement;
- });
- };
- ExtendsMerger.prototype.mergeInheritance = function (component, metaPropertyId, newMembers) {
- newMembers.forEach(function (newMember) {
- var overriddenMethod = component[metaPropertyId].find(function (componentMember) { return componentMember.name === newMember.name; });
- if (overriddenMethod) {
- overriddenMethod.inheritance = newMember.inheritance;
- }
- else {
- component[metaPropertyId].push(newMember);
- }
- });
- };
- ExtendsMerger.prototype.findInDependencies = function (name) {
- var mergedData = _.concat([], this.components, this.classes, this.injectables, this.directives, this.controllers);
- var result = _.find(mergedData, { name: name });
- // Find in aliases ?
- if (!result) {
- var aliases = Object.values(this.aliases);
- var isInAlias = aliases.includes(name);
- if (isInAlias) {
- var finalOriginalName = this.findInAliases(name);
- if (finalOriginalName) {
- result = _.find(mergedData, { name: finalOriginalName });
- }
- }
- }
- return result || false;
- };
- ExtendsMerger.prototype.findInAliases = function (name) {
- var finalOriginalName = null;
- for (var originalName in this.aliases) {
- if (this.aliases[originalName].includes(name)) {
- finalOriginalName = originalName;
- }
- }
- return finalOriginalName;
- };
- return ExtendsMerger;
- }());
- var ExtendsMerger$1 = ExtendsMerger.getInstance();
- var LinkTypeHelper = /** @class */ (function () {
- function LinkTypeHelper() {
- }
- LinkTypeHelper.prototype.helperFunc = function (context, name, options) {
- var _result = DependenciesEngine$1.find(name);
- // Find in aliases ?
- if (!_result) {
- var potentialAlias = ExtendsMerger$1.findInAliases(name);
- if (potentialAlias) {
- _result = DependenciesEngine$1.find(potentialAlias);
- }
- }
- var angularDocPrefix = AngularVersionUtil$1.prefixOfficialDoc(Configuration$1.mainData.angularVersion);
- if (_result) {
- context.type = {
- raw: name,
- indexKey: ''
- };
- if (_result.source === 'internal') {
- if (_result.data.type === 'class') {
- _result.data.type = 'classe';
- }
- context.type.href = '../' + _result.data.type + 's/' + _result.data.name + '.html';
- if (context.indexKey !== '' && context.indexKey !== undefined) {
- context.type.href += '#' + context.indexKey;
- context.type.indexKey = context.indexKey;
- }
- if (_result.data.type === 'miscellaneous' ||
- (_result.data.ctype && _result.data.ctype === 'miscellaneous')) {
- var mainpage = '';
- switch (_result.data.subtype) {
- case 'enum':
- mainpage = 'enumerations';
- break;
- case 'function':
- mainpage = 'functions';
- break;
- case 'typealias':
- mainpage = 'typealiases';
- break;
- case 'variable':
- mainpage = 'variables';
- }
- context.type.href = '../' + _result.data.ctype + '/' + mainpage + '.html';
- if (_result.data && _result.data.name) {
- context.type.href += '#' + _result.data.name;
- }
- }
- if (!context.type.indexKey) {
- context.type.indexKey = '';
- }
- context.type.target = '_self';
- }
- else {
- context.type.href = "https://".concat(angularDocPrefix, "angular.io/").concat(_result.data.path);
- context.type.target = '_blank';
- }
- return options.fn(context);
- }
- else if (BasicTypeUtil$1.isKnownType(name)) {
- context.type = {
- raw: name,
- indexKey: ''
- };
- context.type.target = '_blank';
- context.type.href = BasicTypeUtil$1.getTypeUrl(name);
- return options.fn(context);
- }
- else {
- return options.inverse(context);
- }
- };
- return LinkTypeHelper;
- }());
- var ModifIconHelper = /** @class */ (function () {
- function ModifIconHelper() {
- }
- ModifIconHelper.prototype.helperFunc = function (context, kind) {
- var _kindText = '';
- switch (kind) {
- case tsMorph.SyntaxKind.PrivateKeyword:
- _kindText = 'lock'; // private
- break;
- case tsMorph.SyntaxKind.ProtectedKeyword:
- _kindText = 'lock'; // protected
- break;
- case tsMorph.SyntaxKind.StaticKeyword:
- _kindText = 'reset'; // static
- break;
- case tsMorph.SyntaxKind.ExportKeyword:
- _kindText = 'export'; // export
- break;
- default:
- _kindText = 'reset';
- break;
- }
- return _kindText;
- };
- return ModifIconHelper;
- }());
- var Handlebars$4 = require('handlebars');
- var ModifKindHelper = /** @class */ (function () {
- function ModifKindHelper() {
- }
- /**
- * Transform SyntaxKind into string
- * @param {any} context Handlebars context
- * @param {SyntaxKind[]} kind SyntaxKind concatenated
- * @return {string} Parsed string
- */
- ModifKindHelper.prototype.helperFunc = function (context, kind) {
- var _kindText = '';
- switch (kind) {
- case tsMorph.SyntaxKind.PrivateKeyword:
- _kindText = 'Private';
- break;
- case tsMorph.SyntaxKind.ReadonlyKeyword:
- _kindText = 'Readonly';
- break;
- case tsMorph.SyntaxKind.ProtectedKeyword:
- _kindText = 'Protected';
- break;
- case tsMorph.SyntaxKind.PublicKeyword:
- _kindText = 'Public';
- break;
- case tsMorph.SyntaxKind.StaticKeyword:
- _kindText = 'Static';
- break;
- case tsMorph.SyntaxKind.AsyncKeyword:
- _kindText = 'Async';
- break;
- case tsMorph.SyntaxKind.AbstractKeyword:
- _kindText = 'Abstract';
- break;
- }
- return new Handlebars$4.SafeString(_kindText);
- };
- return ModifKindHelper;
- }());
- var ObjectLengthHelper = /** @class */ (function () {
- function ObjectLengthHelper() {
- }
- ObjectLengthHelper.prototype.helperFunc = function (context, obj, operator, length) {
- var len = arguments.length - 1;
- var options = arguments[len];
- if (typeof obj !== 'object') {
- return options.inverse(context);
- }
- var size = 0, key;
- for (key in obj) {
- if (obj.hasOwnProperty(key)) {
- size++;
- }
- }
- var result;
- switch (operator) {
- case '===':
- result = size === length;
- break;
- case '!==':
- result = size !== length;
- break;
- case '>':
- result = size > length;
- break;
- default: {
- throw new Error('helper {{objectLength}}: invalid operator: `' + operator + '`');
- }
- }
- if (result === false) {
- return options.inverse(context);
- }
- return options.fn(context);
- };
- return ObjectLengthHelper;
- }());
- var Handlebars$3 = require('handlebars');
- var ObjectHelper = /** @class */ (function () {
- function ObjectHelper() {
- }
- ObjectHelper.prototype.helperFunc = function (context, text) {
- text = JSON.stringify(text);
- text = text.replace(/{"/, '{<br> "');
- text = text.replace(/,"/, ',<br> "');
- text = text.replace(/}$/, '<br>}');
- return new Handlebars$3.SafeString(text);
- };
- return ObjectHelper;
- }());
- var OneParameterHasHelper = /** @class */ (function () {
- function OneParameterHasHelper() {
- }
- OneParameterHasHelper.prototype.helperFunc = function (context, tags, typeToCheck) {
- var result = false;
- var len = arguments.length - 1;
- var options = arguments[len];
- var i = 0, leng = tags.length;
- for (i; i < leng; i++) {
- if (typeof tags[i][typeToCheck] !== 'undefined' && tags[i][typeToCheck] !== '') {
- result = true;
- }
- }
- if (result) {
- return options.fn(context);
- }
- else {
- return options.inverse(context);
- }
- };
- return OneParameterHasHelper;
- }());
- var OrLengthHelper = /** @class */ (function () {
- function OrLengthHelper() {
- }
- OrLengthHelper.prototype.helperFunc = function (context /* any, any, ..., options */) {
- var len = arguments.length - 1;
- var options = arguments[len];
- // We start at 1 because of options
- for (var i = 1; i < len; i++) {
- if (typeof arguments[i] !== 'undefined') {
- if (Object.keys(arguments[i]).length > 0) {
- return options.fn(context);
- }
- }
- }
- return options.inverse(context);
- };
- return OrLengthHelper;
- }());
- var OrHelper = /** @class */ (function () {
- function OrHelper() {
- }
- OrHelper.prototype.helperFunc = function (context /* any, any, ..., options */) {
- var len = arguments.length - 1;
- var options = arguments[len];
- // We start at 1 because of options
- for (var i = 1; i < len; i++) {
- if (arguments[i]) {
- return options.fn(context);
- }
- }
- return options.inverse(context);
- };
- return OrHelper;
- }());
- var ParseDescriptionHelper = /** @class */ (function () {
- function ParseDescriptionHelper() {
- }
- ParseDescriptionHelper.prototype.helperFunc = function (context, description, depth) {
- var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
- var tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
- var tagRegExp;
- var matches;
- var previousString;
- tagRegExp = description.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
- var processTheLink = function (originalDescription, matchedTag, leadingText) {
- var leading = extractLeadingText(originalDescription, matchedTag.completeTag);
- var split;
- var resultInCompodoc;
- var newLink;
- var rootPath;
- var stringtoReplace;
- var anchor = '';
- var label;
- var pageName;
- split = splitLinkText(matchedTag.text);
- if (typeof split.linkText !== 'undefined') {
- resultInCompodoc = DependenciesEngine$1.findInCompodoc(split.target);
- }
- else {
- var info = matchedTag.text;
- if (matchedTag.text.indexOf('#') !== -1) {
- anchor = matchedTag.text.substr(matchedTag.text.indexOf('#'), matchedTag.text.length);
- info = matchedTag.text.substr(0, matchedTag.text.indexOf('#'));
- }
- resultInCompodoc = DependenciesEngine$1.findInCompodoc(info);
- }
- if (resultInCompodoc) {
- label = resultInCompodoc.name;
- pageName = resultInCompodoc.name;
- if (leadingText) {
- stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
- }
- else if (leading.leadingText !== undefined) {
- stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
- }
- else if (typeof split.linkText !== 'undefined') {
- stringtoReplace = matchedTag.completeTag;
- }
- else {
- stringtoReplace = matchedTag.completeTag;
- }
- if (resultInCompodoc.type === 'class') {
- resultInCompodoc.type = 'classes';
- }
- else if (resultInCompodoc.type === 'miscellaneous' ||
- (resultInCompodoc.ctype && resultInCompodoc.ctype === 'miscellaneous')) {
- resultInCompodoc.type = 'miscellaneous'; // Not a typo, it is for matching other single types : component, module etc
- label = resultInCompodoc.name;
- anchor = '#' + resultInCompodoc.name;
- if (resultInCompodoc.subtype === 'enum') {
- pageName = 'enumerations';
- }
- else if (resultInCompodoc.subtype === 'function') {
- pageName = 'functions';
- }
- else if (resultInCompodoc.subtype === 'typealias') {
- pageName = 'typealiases';
- }
- else if (resultInCompodoc.subtype === 'variable') {
- pageName = 'variables';
- }
- }
- rootPath = '';
- switch (depth) {
- case 0:
- rootPath = './';
- break;
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- rootPath = '../'.repeat(depth);
- break;
- }
- if (leading.leadingText !== undefined) {
- label = leading.leadingText;
- }
- if (typeof split.linkText !== 'undefined') {
- label = split.linkText;
- }
- if (resultInCompodoc.type === 'miscellaneous' ||
- resultInCompodoc.type === 'classes') {
- newLink = "<a href=\"".concat(rootPath).concat(resultInCompodoc.type, "/").concat(pageName, ".html").concat(anchor, "\">").concat(label, "</a>");
- }
- else {
- newLink = "<a href=\"".concat(rootPath).concat(resultInCompodoc.type, "s/").concat(pageName, ".html").concat(anchor, "\">").concat(label, "</a>");
- }
- return originalDescription.replace(stringtoReplace, newLink);
- }
- else if (!resultInCompodoc && typeof split.linkText !== 'undefined') {
- newLink = "<a href=\"".concat(split.target, "\">").concat(split.linkText, "</a>");
- if (leadingText) {
- stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
- }
- else if (leading.leadingText !== undefined) {
- stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
- }
- else if (typeof split.linkText !== 'undefined') {
- stringtoReplace = matchedTag.completeTag;
- }
- else {
- stringtoReplace = matchedTag.completeTag;
- }
- return originalDescription.replace(stringtoReplace, newLink);
- }
- else if (!resultInCompodoc && leading && typeof leading.leadingText !== 'undefined') {
- newLink = "<a href=\"".concat(split.target, "\">").concat(leading.leadingText, "</a>");
- if (leadingText) {
- stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
- }
- else if (leading.leadingText !== undefined) {
- stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
- }
- else if (typeof split.linkText !== 'undefined') {
- stringtoReplace = matchedTag.completeTag;
- }
- else {
- stringtoReplace = matchedTag.completeTag;
- }
- return originalDescription.replace(stringtoReplace, newLink);
- }
- else if (!resultInCompodoc && typeof split.linkText === 'undefined') {
- newLink = "<a href=\"".concat(split.target, "\">").concat(split.target, "</a>");
- if (leadingText) {
- stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
- }
- else if (leading.leadingText !== undefined) {
- stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
- }
- else {
- stringtoReplace = matchedTag.completeTag;
- }
- return originalDescription.replace(stringtoReplace, newLink);
- }
- else {
- return originalDescription;
- }
- };
- function replaceMatch(replacer, tag, match, text, linkText) {
- var matchedTag = {
- completeTag: match,
- tag: tag,
- text: text
- };
- if (linkText) {
- return replacer(description, matchedTag, linkText);
- }
- else {
- return replacer(description, matchedTag);
- }
- }
- // Clean description for marked a tag parsed too early
- if (description.indexOf('href=') !== -1) {
- var insideMarkedATagResults = description.match(/<a [^>]+>([^<]+)<\/a>/g);
- if (insideMarkedATagResults && insideMarkedATagResults.length > 0) {
- for (var i = 0; i < insideMarkedATagResults.length; i++) {
- var markedATagRegExp = new RegExp('<a [^>]+>([^<]+)</a>', 'gm');
- var parsedATag = markedATagRegExp.exec(description);
- if (parsedATag && parsedATag.length === 2) {
- var insideMarkedATag = parsedATag[1];
- description = description.replace("{@link <a href=\"".concat(encodeURI(insideMarkedATag), "\">").concat(insideMarkedATag, "</a>"), "{@link ".concat(insideMarkedATag));
- }
- }
- }
- }
- do {
- matches = tagRegExp.exec(description);
- // Did we have {@link ?
- if (matches) {
- previousString = description;
- if (matches.length === 2) {
- description = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
- }
- if (matches.length === 3) {
- description = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
- }
- }
- } while (matches && previousString !== description);
- return description;
- };
- return ParseDescriptionHelper;
- }());
- require('handlebars');
- var ParsePropertyHelper = /** @class */ (function () {
- function ParsePropertyHelper() {
- }
- ParsePropertyHelper.prototype.helperFunc = function (context, text) {
- var prop = text;
- if (!!text && text.constructor === Object && text['url'] !== undefined) {
- prop = text['url'];
- }
- if (!!text && text.constructor === Object && text['name'] !== undefined) {
- prop = text['name'];
- }
- if (!!text && text.constructor === Object && Object.keys(text).length === 0) {
- prop = '';
- }
- if (prop instanceof String && prop !== '' && prop.indexOf('https') !== -1) {
- return "<a href=\"".concat(prop, "\" target=\"_blank\">").concat(prop, "</a>");
- }
- else if (prop !== '' && prop instanceof Array && prop.length > 0) {
- prop = JSON.stringify(prop);
- prop = prop.replace(/","/g, ', ');
- prop = prop.replace(/\["/g, '');
- prop = prop.replace(/"]/g, '');
- return prop;
- }
- else {
- return prop;
- }
- };
- return ParsePropertyHelper;
- }());
- var RelativeURLHelper = /** @class */ (function () {
- function RelativeURLHelper() {
- }
- RelativeURLHelper.prototype.helperFunc = function (context, currentDepth, options) {
- switch (currentDepth) {
- case 0:
- return './';
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- return '../'.repeat(currentDepth);
- }
- return '';
- };
- return RelativeURLHelper;
- }());
- var ShortURLHelper = /** @class */ (function () {
- function ShortURLHelper() {
- }
- ShortURLHelper.prototype.helperFunc = function (context, url, options) {
- var newUrl = url;
- var firstIndexOfSlash = newUrl.indexOf('/');
- var lastIndexOfSlash = newUrl.lastIndexOf('/');
- if (firstIndexOfSlash !== -1 || lastIndexOfSlash !== -1) {
- newUrl =
- newUrl.substr(0, firstIndexOfSlash + 1) +
- '...' +
- newUrl.substr(lastIndexOfSlash, newUrl.length);
- }
- return newUrl;
- };
- return ShortURLHelper;
- }());
- var StripURLHelper = /** @class */ (function () {
- function StripURLHelper() {
- }
- StripURLHelper.prototype.helperFunc = function (context, prefix, url, options) {
- return prefix + url.split("/").pop();
- };
- return StripURLHelper;
- }());
- var IfEqualStringHelper = /** @class */ (function () {
- function IfEqualStringHelper() {
- }
- IfEqualStringHelper.prototype.helperFunc = function (context, a, b, options) {
- if (a == b) {
- return options.fn(context);
- }
- return options.inverse(context);
- };
- return IfEqualStringHelper;
- }());
- var Handlebars$2 = require('handlebars');
- var HtmlEngineHelpers = /** @class */ (function () {
- function HtmlEngineHelpers() {
- }
- HtmlEngineHelpers.prototype.registerHelpers = function (bars) {
- this.registerHelper(bars, 'compare', new CompareHelper());
- this.registerHelper(bars, 'or', new OrHelper());
- this.registerHelper(bars, 'functionSignature', new FunctionSignatureHelper());
- this.registerHelper(bars, 'isNotToggle', new IsNotToggleHelper());
- this.registerHelper(bars, 'isInitialTab', new IsInitialTabHelper());
- this.registerHelper(bars, 'isTabEnabled', new IsTabEnabledHelper());
- this.registerHelper(bars, 'ifString', new IfStringHelper());
- this.registerHelper(bars, 'ifEqualString', new IfEqualStringHelper());
- this.registerHelper(bars, 'orLength', new OrLengthHelper());
- this.registerHelper(bars, 'filterAngular2Modules', new FilterAngular2ModulesHelper());
- this.registerHelper(bars, 'debug', new DebugHelper());
- this.registerHelper(bars, 'breaklines', new BreakLinesHelper(bars));
- this.registerHelper(bars, 'clean-paragraph', new CleanParagraphHelper());
- this.registerHelper(bars, 'escapeSimpleQuote', new EscapeSimpleQuoteHelper());
- this.registerHelper(bars, 'breakComma', new BreakCommaHelper(bars));
- this.registerHelper(bars, 'modifKind', new ModifKindHelper());
- this.registerHelper(bars, 'modifIcon', new ModifIconHelper());
- this.registerHelper(bars, 'relativeURL', new RelativeURLHelper());
- this.registerHelper(bars, 'jsdoc-returns-comment', new JsdocReturnsCommentHelper());
- this.registerHelper(bars, 'jsdoc-code-example', new JsdocCodeExampleHelper());
- this.registerHelper(bars, 'jsdoc-example', new JsdocExampleHelper());
- this.registerHelper(bars, 'jsdoc-params', new JsdocParamsHelper());
- this.registerHelper(bars, 'jsdoc-params-valid', new JsdocParamsValidHelper());
- this.registerHelper(bars, 'jsdoc-default', new JsdocDefaultHelper());
- this.registerHelper(bars, 'linkType', new LinkTypeHelper());
- this.registerHelper(bars, 'indexableSignature', new IndexableSignatureHelper());
- this.registerHelper(bars, 'object', new ObjectHelper());
- this.registerHelper(bars, 'objectLength', new ObjectLengthHelper());
- this.registerHelper(bars, 'parseDescription', new ParseDescriptionHelper());
- this.registerHelper(bars, 'one-parameter-has', new OneParameterHasHelper());
- this.registerHelper(bars, 'element-alone', new ElementAloneHelper());
- this.registerHelper(bars, 'hasOwn', new HasOwnHelper());
- this.registerHelper(bars, 'short-url', new ShortURLHelper());
- this.registerHelper(bars, 'strip-url', new StripURLHelper());
- this.registerHelper(bars, 't', new I18nHelper());
- this.registerHelper(bars, 'capitalize', new CapitalizeHelper());
- this.registerHelper(bars, 'parse-property', new ParsePropertyHelper());
- };
- HtmlEngineHelpers.prototype.registerHelper = function (bars, key, helper) {
- Handlebars$2.registerHelper(key, function () {
- // tslint:disable-next-line:no-invalid-this
- return helper.helperFunc.apply(helper, __spreadArray([this], __read(___namespace.slice(arguments)), false));
- });
- };
- return HtmlEngineHelpers;
- }());
- var Handlebars$1 = require('handlebars');
- var HtmlEngine = /** @class */ (function () {
- function HtmlEngine() {
- this.cache = {};
- var helper = new HtmlEngineHelpers();
- helper.registerHelpers(Handlebars$1);
- }
- HtmlEngine.getInstance = function () {
- if (!HtmlEngine.instance) {
- HtmlEngine.instance = new HtmlEngine();
- }
- return HtmlEngine.instance;
- };
- HtmlEngine.prototype.init = function (templatePath) {
- var _this = this;
- var partials = [
- 'overview',
- 'markdown',
- 'modules',
- 'module',
- 'component',
- 'controller',
- 'entity',
- 'component-detail',
- 'directive',
- 'injectable',
- 'interceptor',
- 'guard',
- 'pipe',
- 'class',
- 'interface',
- 'routes',
- 'index',
- 'index-misc',
- 'search-results',
- 'search-input',
- 'link-type',
- 'block-method',
- 'block-host-listener',
- 'block-enum',
- 'block-property',
- 'block-index',
- 'block-constructor',
- 'block-typealias',
- 'block-accessors',
- 'block-input',
- 'block-output',
- 'coverage-report',
- 'unit-test-report',
- 'miscellaneous-functions',
- 'miscellaneous-variables',
- 'miscellaneous-typealiases',
- 'miscellaneous-enumerations',
- 'additional-page',
- 'package-dependencies',
- 'package-properties'
- ];
- if (templatePath) {
- if (FileEngine$1.existsSync(path__namespace.resolve(process.cwd() + path__namespace.sep + templatePath)) ===
- false) {
- logger.warn('Template path specificed but does not exist...using default templates');
- }
- }
- return Promise.all(partials.map(function (partial) {
- var partialPath = _this.determineTemplatePath(templatePath, 'partials/' + partial + '.hbs');
- return FileEngine$1.get(partialPath).then(function (data) {
- return Handlebars$1.registerPartial(partial, data);
- });
- }))
- .then(function () {
- var pagePath = _this.determineTemplatePath(templatePath, 'page.hbs');
- return FileEngine$1.get(pagePath).then(function (data) {
- _this.cache.page = data;
- _this.compiledPage = Handlebars$1.compile(_this.cache.page, {
- preventIndent: true,
- strict: true
- });
- });
- })
- .then(function () {
- var menuPath = _this.determineTemplatePath(templatePath, 'partials/menu.hbs');
- return FileEngine$1.get(menuPath).then(function (menuTemplate) {
- _this.precompiledMenu = Handlebars$1.compile(menuTemplate, {
- preventIndent: true,
- strict: true
- });
- });
- });
- };
- HtmlEngine.prototype.renderMenu = function (templatePath, data) {
- var menuPath = this.determineTemplatePath(templatePath, 'partials/menu.hbs');
- return FileEngine$1.get(menuPath).then(function (menuTemplate) {
- data.menu = 'normal';
- return Handlebars$1.compile(menuTemplate, {
- preventIndent: true,
- strict: true
- })(__assign({}, data));
- });
- };
- HtmlEngine.prototype.render = function (mainData, page) {
- var o = mainData;
- Object.assign(o, page);
- // let mem = process.memoryUsage();
- // console.log(`heapTotal: ${mem.heapTotal} | heapUsed: ${mem.heapUsed}`);
- return this.compiledPage({
- data: o
- });
- };
- HtmlEngine.prototype.determineTemplatePath = function (templatePath, filePath) {
- var outPath = path__namespace.resolve(__dirname + '/../src/templates/' + filePath);
- if (templatePath) {
- var testPath = path__namespace.resolve(process.cwd() + path__namespace.sep + templatePath + path__namespace.sep + filePath);
- outPath = FileEngine$1.existsSync(testPath) ? testPath : outPath;
- }
- return outPath;
- };
- HtmlEngine.prototype.generateCoverageBadge = function (outputFolder, label, coverageData) {
- return FileEngine$1.get(path__namespace.resolve(__dirname + '/../src/templates/partials/coverage-badge.hbs')).then(function (data) {
- var template = Handlebars$1.compile(data);
- coverageData.label = label;
- var result = template({
- data: coverageData
- });
- var testOutputDir = outputFolder.match(process.cwd());
- if (testOutputDir && testOutputDir.length > 0) {
- outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
- }
- return FileEngine$1.write(outputFolder + path__namespace.sep + '/images/coverage-badge-' + label + '.svg', result).catch(function (err) {
- logger.error('Error during coverage badge ' + label + ' file generation ', err);
- return Promise.reject(err);
- });
- }, function (err) { return Promise.reject('Error during coverage badge generation'); });
- };
- return HtmlEngine;
- }());
- var HtmlEngine$1 = HtmlEngine.getInstance();
- var decache = require('decache');
- var MarkdownEngine = /** @class */ (function () {
- function MarkdownEngine() {
- var _this = this;
- /**
- * List of markdown files without .md extension
- */
- this.markdownFiles = ['README', 'CHANGELOG', 'LICENSE', 'CONTRIBUTING', 'TODO'];
- decache('marked');
- this.markedInstance = markedAcl;
- var renderer = new this.markedInstance.Renderer();
- renderer.code = function (code, language) {
- var highlighted = code;
- if (!language) {
- language = 'none';
- }
- highlighted = _this.escape(code);
- return "<b>".concat(I18nEngine$1.translate('example'), " :</b><div><pre class=\"line-numbers\"><code class=\"language-").concat(language, "\">").concat(highlighted, "</code></pre></div>");
- };
- renderer.table = function (header, body) {
- return ('<table class="table table-bordered compodoc-table">\n' +
- '<thead>\n' +
- header +
- '</thead>\n' +
- '<tbody>\n' +
- body +
- '</tbody>\n' +
- '</table>\n');
- };
- renderer.image = function (href, title, text) {
- var out = '<img src="' + href + '" alt="' + text + '" class="img-responsive"';
- if (title) {
- out += ' title="' + title + '"';
- }
- out += '>';
- return out;
- };
- this.markedInstance.setOptions({
- renderer: renderer,
- gfm: true,
- breaks: false
- });
- }
- MarkdownEngine.getInstance = function () {
- if (!MarkdownEngine.instance) {
- MarkdownEngine.instance = new MarkdownEngine();
- }
- return MarkdownEngine.instance;
- };
- MarkdownEngine.prototype.getTraditionalMarkdown = function (filepath) {
- var _this = this;
- return FileEngine$1.get(process.cwd() + path__namespace.sep + filepath + '.md')
- .catch(function (err) { return FileEngine$1.get(process.cwd() + path__namespace.sep + filepath).then(); })
- .then(function (data) {
- var returnedData = {
- markdown: _this.markedInstance(data),
- rawData: data
- };
- return returnedData;
- });
- };
- MarkdownEngine.prototype.getTraditionalMarkdownSync = function (filepath) {
- return this.markedInstance(FileEngine$1.getSync(process.cwd() + path__namespace.sep + filepath));
- };
- MarkdownEngine.prototype.getReadmeFile = function () {
- var _this = this;
- return FileEngine$1.get(process.cwd() + path__namespace.sep + 'README.md').then(function (data) {
- return _this.markedInstance(data);
- });
- };
- MarkdownEngine.prototype.readNeighbourReadmeFile = function (file) {
- var dirname = path__namespace.dirname(file);
- var readmeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
- return fs__namespace.readFileSync(readmeFile, 'utf8');
- };
- MarkdownEngine.prototype.hasNeighbourReadmeFile = function (file) {
- var dirname = path__namespace.dirname(file);
- var readmeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
- return FileEngine$1.existsSync(readmeFile);
- };
- MarkdownEngine.prototype.componentReadmeFile = function (file) {
- var dirname = path__namespace.dirname(file);
- var readmeFile = dirname + path__namespace.sep + 'README.md';
- var readmeAlternativeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
- var finalPath = '';
- if (FileEngine$1.existsSync(readmeFile)) {
- finalPath = readmeFile;
- }
- else {
- finalPath = readmeAlternativeFile;
- }
- return finalPath;
- };
- /**
- * Checks if any of the markdown files is exists with or without endings
- */
- MarkdownEngine.prototype.hasRootMarkdowns = function () {
- return this.addEndings(this.markdownFiles).some(function (x) {
- return FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x);
- });
- };
- MarkdownEngine.prototype.listRootMarkdowns = function () {
- var foundFiles = this.markdownFiles.filter(function (x) {
- return FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x + '.md') ||
- FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x);
- });
- return this.addEndings(foundFiles);
- };
- MarkdownEngine.prototype.escape = function (html) {
- return html
- .replace(/&/g, '&')
- .replace(/</g, '<')
- .replace(/>/g, '>')
- .replace(/"/g, '"')
- .replace(/'/g, ''')
- .replace(/@/g, '@');
- };
- /**
- * ['README'] => ['README', 'README.md']
- */
- MarkdownEngine.prototype.addEndings = function (files) {
- return ___namespace.flatMap(files, function (x) { return [x, x + '.md']; });
- };
- return MarkdownEngine;
- }());
- var MarkdownEngine$1 = MarkdownEngine.getInstance();
- var ngdT = require('@compodoc/ngd-transformer');
- var NgdEngine = /** @class */ (function () {
- function NgdEngine() {
- }
- NgdEngine.getInstance = function () {
- if (!NgdEngine.instance) {
- NgdEngine.instance = new NgdEngine();
- }
- return NgdEngine.instance;
- };
- NgdEngine.prototype.init = function (outputpath) {
- this.engine = new ngdT.DotEngine({
- output: outputpath,
- displayLegend: true,
- outputFormats: 'svg',
- silent: true
- });
- };
- NgdEngine.prototype.renderGraph = function (filepath, outputpath, type, name) {
- this.engine.updateOutput(outputpath);
- if (type === 'f') {
- return this.engine.generateGraph([DependenciesEngine$1.getRawModule(name)]);
- }
- else {
- return this.engine.generateGraph(DependenciesEngine$1.rawModulesForOverview);
- }
- };
- NgdEngine.prototype.readGraph = function (filepath, name) {
- return FileEngine$1.get(filepath).catch(function (err) {
- return Promise.reject('Error during graph read ' + name);
- });
- };
- return NgdEngine;
- }());
- var NgdEngine$1 = NgdEngine.getInstance();
- var COMPODOC_CONSTANTS = {
- navTabDefinitions: [
- {
- id: 'info',
- href: '#info',
- 'data-link': 'info',
- label: 'Info',
- depTypes: ['all']
- },
- {
- id: 'readme',
- href: '#readme',
- 'data-link': 'readme',
- label: 'README',
- depTypes: ['all']
- },
- {
- id: 'source',
- href: '#source',
- 'data-link': 'source',
- label: 'Source',
- depTypes: ['all']
- },
- {
- id: 'templateData',
- href: '#templateData',
- 'data-link': 'template',
- label: 'Template',
- depTypes: ['component']
- },
- {
- id: 'styleData',
- href: '#styleData',
- 'data-link': 'style',
- label: 'Styles',
- depTypes: ['component']
- },
- {
- id: 'tree',
- href: '#tree',
- 'data-link': 'dom-tree',
- label: 'DOM Tree',
- depTypes: ['component']
- },
- {
- id: 'example',
- href: '#example',
- 'data-link': 'example',
- label: 'Examples',
- depTypes: ['component', 'directive', 'injectable', 'pipe']
- }
- ]
- };
- /**
- * Max length for the string of a file during Lunr search engine indexing.
- * Prevent stack size exceeded
- */
- var MAX_SIZE_FILE_SEARCH_INDEX = 50000;
- /**
- * Max length for the string of a file during cheerio parsing.
- * Prevent stack size exceeded
- */
- var MAX_SIZE_FILE_CHEERIO_PARSING = 400000000;
- var Handlebars = require('handlebars');
- var lunr = require('lunr');
- var SearchEngine = /** @class */ (function () {
- function SearchEngine() {
- this.searchDocuments = [];
- this.documentsStore = {};
- this.amountOfMemory = 0;
- }
- SearchEngine.getInstance = function () {
- if (!SearchEngine.instance) {
- SearchEngine.instance = new SearchEngine();
- }
- return SearchEngine.instance;
- };
- SearchEngine.prototype.indexPage = function (page) {
- var text;
- this.amountOfMemory += page.rawData.length;
- if (this.amountOfMemory < MAX_SIZE_FILE_CHEERIO_PARSING) {
- var indexStartContent = page.rawData.indexOf('<!-- START CONTENT -->');
- var indexEndContent = page.rawData.indexOf('<!-- END CONTENT -->');
- var $ = cheerio__namespace.load(page.rawData.substring(indexStartContent + 1, indexEndContent));
- text = $('.content').html();
- text = htmlEntities.decode(text);
- text = text.replace(/(<([^>]+)>)/gi, '');
- page.url = page.url.replace(Configuration$1.mainData.output, '');
- var doc = {
- url: page.url,
- title: page.infos.context + ' - ' + page.infos.name,
- body: text
- };
- if (!this.documentsStore.hasOwnProperty(doc.url) &&
- doc.body.length < MAX_SIZE_FILE_SEARCH_INDEX) {
- this.documentsStore[doc.url] = doc;
- this.searchDocuments.push(doc);
- }
- }
- };
- SearchEngine.prototype.generateSearchIndexJson = function (outputFolder) {
- var _this = this;
- var that = this;
- var searchIndex = lunr(function () {
- /* tslint:disable:no-invalid-this */
- this.ref('url');
- this.field('title');
- this.field('body');
- this.pipeline.remove(lunr.stemmer);
- var i = 0;
- var len = that.searchDocuments.length;
- for (i; i < len; i++) {
- this.add(that.searchDocuments[i]);
- }
- });
- return FileEngine$1.get(__dirname + '/../src/templates/partials/search-index.hbs').then(function (data) {
- var template = Handlebars.compile(data);
- var result = template({
- index: JSON.stringify(searchIndex),
- store: JSON.stringify(_this.documentsStore)
- });
- var testOutputDir = outputFolder.match(process.cwd());
- if (testOutputDir && testOutputDir.length > 0) {
- outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
- }
- return FileEngine$1.write(outputFolder + path__namespace.sep + '/js/search/search_index.js', result).catch(function (err) {
- logger.error('Error during search index file generation ', err);
- return Promise.reject(err);
- });
- }, function (err) { return Promise.reject('Error during search index generation'); });
- };
- return SearchEngine;
- }());
- var SearchEngine$1 = SearchEngine.getInstance();
- var ComponentsTreeEngine = /** @class */ (function () {
- function ComponentsTreeEngine() {
- this.components = [];
- this.componentsForTree = [];
- }
- ComponentsTreeEngine.getInstance = function () {
- if (!ComponentsTreeEngine.instance) {
- ComponentsTreeEngine.instance = new ComponentsTreeEngine();
- }
- return ComponentsTreeEngine.instance;
- };
- ComponentsTreeEngine.prototype.addComponent = function (component) {
- this.components.push(component);
- };
- ComponentsTreeEngine.prototype.readTemplates = function () {
- var _this = this;
- return new Promise(function (resolve, reject) {
- var i = 0;
- var len = _this.componentsForTree.length;
- var loop = function () {
- if (i <= len - 1) {
- if (_this.componentsForTree[i].templateUrl) {
- var filePath = process.cwd() +
- path__namespace.sep +
- path__namespace.dirname(_this.componentsForTree[i].file) +
- path__namespace.sep +
- _this.componentsForTree[i].templateUrl;
- FileEngine$1.get(filePath).then(function (templateData) {
- _this.componentsForTree[i].templateData = templateData;
- i++;
- loop();
- }, function (e) {
- logger.error(e);
- reject();
- });
- }
- else {
- _this.componentsForTree[i].templateData = _this.componentsForTree[i].template;
- i++;
- loop();
- }
- }
- else {
- resolve();
- }
- };
- loop();
- });
- };
- ComponentsTreeEngine.prototype.findChildrenAndParents = function () {
- var _this = this;
- return new Promise(function (resolve, reject) {
- ___namespace.forEach(_this.componentsForTree, function (component) {
- var $component = cheerio__namespace(component.templateData);
- ___namespace.forEach(_this.componentsForTree, function (componentToFind) {
- if ($component.find(componentToFind.selector).length > 0) {
- console.log(componentToFind.name + ' found in ' + component.name);
- component.children.push(componentToFind.name);
- }
- });
- });
- resolve();
- });
- };
- ComponentsTreeEngine.prototype.createTreesForComponents = function () {
- var _this = this;
- return new Promise(function (resolve, reject) {
- ___namespace.forEach(_this.components, function (component) {
- var _component = {
- name: component.name,
- file: component.file,
- selector: component.selector,
- children: [],
- template: '',
- templateUrl: ''
- };
- if (typeof component.template !== 'undefined') {
- _component.template = component.template;
- }
- if (component.templateUrl.length > 0) {
- _component.templateUrl = component.templateUrl[0];
- }
- _this.componentsForTree.push(_component);
- });
- _this.readTemplates().then(function () {
- _this.findChildrenAndParents().then(function () {
- // console.log('this.componentsForTree: ', this.componentsForTree);
- resolve();
- }, function (e) {
- logger.error(e);
- reject();
- });
- }, function (e) {
- logger.error(e);
- });
- });
- };
- return ComponentsTreeEngine;
- }());
- var ComponentsTreeEngine$1 = ComponentsTreeEngine.getInstance();
- function StringifyArrowFunction(af) {
- var i = 0, result = '(';
- var len = af.parameters.length;
- if (len === 1) {
- result = '';
- }
- for (i; i < len; i++) {
- if (af.parameters[i].name && af.parameters[i].name.escapedText) {
- result += af.parameters[i].name.escapedText;
- }
- if (i < len - 1) {
- result += ', ';
- }
- }
- if (len > 1 || len === 0) {
- result += ')';
- }
- // body
- result += ' => ';
- if (af.body) {
- if (af.body.kind === tsMorph.SyntaxKind.Identifier && af.body.escapedText) {
- result += af.body.escapedText;
- }
- else if (af.body.kind === tsMorph.SyntaxKind.PropertyAccessExpression &&
- af.body.expression &&
- af.body.name) {
- result += af.body.expression.escapedText;
- result += '.' + af.body.name.escapedText;
- }
- else if (af.body.kind === tsMorph.SyntaxKind.StringLiteral && af.body.text) {
- result += af.body.text;
- }
- }
- return result;
- }
- function StringifyObjectLiteralExpression(ole) {
- var returnedString = '{';
- if (ole.properties && ole.properties.length > 0) {
- ole.properties.forEach(function (property, index) {
- if (property.name) {
- returnedString += property.name.text + ': ';
- }
- if (property.initializer) {
- if (property.initializer.kind === tsMorph.SyntaxKind.StringLiteral) {
- returnedString += "'" + property.initializer.text + "'";
- }
- else if (property.initializer.kind === tsMorph.SyntaxKind.TrueKeyword) {
- returnedString += "true";
- }
- else if (property.initializer.kind === tsMorph.SyntaxKind.FalseKeyword) {
- returnedString += "false";
- }
- else if (property.initializer.kind === tsMorph.SyntaxKind.ArrowFunction) {
- returnedString += StringifyArrowFunction(property.initializer);
- }
- else {
- returnedString += property.initializer.text;
- }
- }
- if (index < ole.properties.length - 1) {
- returnedString += ', ';
- }
- });
- }
- returnedString += '}';
- return returnedString;
- }
- function nodeHasDecorator(node) {
- var result = false;
- var nodeModifiers = node.modifiers; // ts.getModifiers(node);
- if (nodeModifiers && nodeModifiers.length > 0) {
- nodeModifiers.forEach(function (nodeModifier) {
- if (nodeModifier.kind === tsMorph.ts.SyntaxKind.Decorator) {
- result = true;
- }
- });
- }
- return result;
- }
- function getNodeDecorators(node) {
- var result = [];
- var nodeModifiers = node.modifiers; // ts.getModifiers(node);
- if (nodeModifiers && nodeModifiers.length > 0) {
- nodeModifiers.forEach(function (nodeModifier) {
- if (nodeModifier.kind === tsMorph.ts.SyntaxKind.Decorator) {
- result.push(nodeModifier);
- }
- });
- }
- return result;
- }
- var crypto$7 = require('crypto');
- var ClassHelper = /** @class */ (function () {
- function ClassHelper(typeChecker) {
- this.typeChecker = typeChecker;
- this.jsdocParserUtil = new JsdocParserUtil();
- }
- /**
- * HELPERS
- */
- ClassHelper.prototype.stringifyDefaultValue = function (node) {
- /**
- * Copyright https://github.com/ng-bootstrap/ng-bootstrap
- */
- if (node.getText()) {
- return node.getText();
- }
- else if (node.kind === tsMorph.SyntaxKind.FalseKeyword) {
- return 'false';
- }
- else if (node.kind === tsMorph.SyntaxKind.TrueKeyword) {
- return 'true';
- }
- };
- ClassHelper.prototype.checkForDeprecation = function (tags, result) {
- ___namespace.forEach(tags, function (tag) {
- if (tag.tagName && tag.tagName.text && tag.tagName.text.indexOf('deprecated') > -1) {
- result.deprecated = true;
- result.deprecationMessage = tag.comment || '';
- }
- });
- };
- ClassHelper.prototype.getDecoratorOfType = function (node, decoratorType) {
- var decorators = getNodeDecorators(node) || [];
- var result = [];
- var len = decorators.length;
- if (len > 1) {
- for (var i = 0; i < decorators.length; i++) {
- if (decorators[i].expression.expression) {
- if (decorators[i].expression.expression.text === decoratorType) {
- result.push(decorators[i]);
- }
- }
- }
- if (result.length > 0) {
- return result;
- }
- }
- else {
- if (len === 1 && decorators[0].expression && decorators[0].expression.expression) {
- if (decorators[0].expression.expression.text === decoratorType) {
- result.push(decorators[0]);
- return result;
- }
- }
- }
- return undefined;
- };
- ClassHelper.prototype.formatDecorators = function (decorators) {
- var _this = this;
- var _decorators = [];
- ___namespace.forEach(decorators, function (decorator) {
- if (decorator.expression) {
- if (decorator.expression.text) {
- _decorators.push({ name: decorator.expression.text });
- }
- if (decorator.expression.expression) {
- var info = { name: decorator.expression.expression.text };
- if (decorator.expression.arguments) {
- info.stringifiedArguments = _this.stringifyArguments(decorator.expression.arguments);
- }
- _decorators.push(info);
- }
- }
- });
- return _decorators;
- };
- ClassHelper.prototype.handleFunction = function (arg) {
- var _this = this;
- if (arg.function.length === 0) {
- return "".concat(arg.name).concat(this.getOptionalString(arg), ": () => void");
- }
- var argums = arg.function.map(function (argu) {
- var _result = DependenciesEngine$1.find(argu.type);
- if (_result) {
- if (_result.source === 'internal') {
- var path = _result.data.type;
- if (_result.data.type === 'class') {
- path = 'classe';
- }
- return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"../").concat(path, "s/").concat(_result.data.name, ".html\">").concat(argu.type, "</a>");
- }
- else {
- var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
- return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
- }
- }
- else if (BasicTypeUtil$1.isKnownType(argu.type)) {
- var path = BasicTypeUtil$1.getTypeUrl(argu.type);
- return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
- }
- else {
- if (argu.name && argu.type) {
- return "".concat(argu.name).concat(_this.getOptionalString(arg), ": ").concat(argu.type);
- }
- else {
- if (argu.name) {
- return "".concat(argu.name.text);
- }
- else {
- return '';
- }
- }
- }
- });
- return "".concat(arg.name).concat(this.getOptionalString(arg), ": (").concat(argums, ") => void");
- };
- ClassHelper.prototype.getOptionalString = function (arg) {
- return arg.optional ? '?' : '';
- };
- ClassHelper.prototype.stringifyArguments = function (args) {
- var _this = this;
- var stringifyArgs = [];
- stringifyArgs = args
- .map(function (arg) {
- var _result = DependenciesEngine$1.find(arg.type);
- if (_result) {
- if (_result.source === 'internal') {
- var path = _result.data.type;
- if (_result.data.type === 'class') {
- path = 'classe';
- }
- return "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"../").concat(path, "s/").concat(_result.data.name, ".html\">").concat(arg.type, "</a>");
- }
- else {
- var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
- return "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(arg.type, "</a>");
- }
- }
- else if (arg.dotDotDotToken) {
- return "...".concat(arg.name, ": ").concat(arg.type);
- }
- else if (arg.function) {
- return _this.handleFunction(arg);
- }
- else if (arg.expression && arg.name) {
- return arg.expression.text + '.' + arg.name.text;
- }
- else if (arg.expression && arg.kind === tsMorph.SyntaxKind.NewExpression) {
- return 'new ' + arg.expression.text + '()';
- }
- else if (arg.kind && arg.kind === tsMorph.SyntaxKind.StringLiteral) {
- return "'" + arg.text + "'";
- }
- else if (arg.kind &&
- arg.kind === tsMorph.SyntaxKind.ArrayLiteralExpression &&
- arg.elements &&
- arg.elements.length > 0) {
- var i = 0, len = arg.elements.length, result = '[';
- for (i; i < len; i++) {
- result += "'" + arg.elements[i].text + "'";
- if (i < len - 1) {
- result += ', ';
- }
- }
- result += ']';
- return result;
- }
- else if (arg.kind &&
- arg.kind === tsMorph.SyntaxKind.ArrowFunction &&
- arg.parameters &&
- arg.parameters.length > 0) {
- return StringifyArrowFunction(arg);
- }
- else if (arg.kind && arg.kind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
- return StringifyObjectLiteralExpression(arg);
- }
- else if (BasicTypeUtil$1.isKnownType(arg.type)) {
- var path = BasicTypeUtil$1.getTypeUrl(arg.type);
- return "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(arg.type, "</a>");
- }
- else {
- if (arg.type) {
- var finalStringifiedArgument = '';
- var separator = ':';
- if (arg.name) {
- finalStringifiedArgument += arg.name;
- }
- if (arg.kind === tsMorph.SyntaxKind.AsExpression &&
- arg.expression &&
- arg.expression.text) {
- finalStringifiedArgument += arg.expression.text;
- separator = ' as';
- }
- if (arg.optional) {
- finalStringifiedArgument += _this.getOptionalString(arg);
- }
- if (arg.type) {
- finalStringifiedArgument += separator + ' ' + _this.visitType(arg.type);
- }
- return finalStringifiedArgument;
- }
- else if (arg.text) {
- return "".concat(arg.text);
- }
- else {
- return "".concat(arg.name).concat(_this.getOptionalString(arg));
- }
- }
- })
- .join(', ');
- return stringifyArgs;
- };
- ClassHelper.prototype.getPosition = function (node, sourceFile) {
- var position;
- if (node.name && node.name.end) {
- position = tsMorph.ts.getLineAndCharacterOfPosition(sourceFile, node.name.end);
- }
- else {
- position = tsMorph.ts.getLineAndCharacterOfPosition(sourceFile, node.pos);
- }
- return position;
- };
- ClassHelper.prototype.addAccessor = function (accessors, nodeAccessor, sourceFile) {
- var _this = this;
- var nodeName = '';
- if (nodeAccessor.name) {
- nodeName = nodeAccessor.name.text;
- var jsdoctags = this.jsdocParserUtil.getJSDocs(nodeAccessor);
- if (!accessors[nodeName]) {
- accessors[nodeName] = {
- name: nodeName,
- setSignature: undefined,
- getSignature: undefined
- };
- }
- if (nodeAccessor.kind === tsMorph.SyntaxKind.SetAccessor) {
- var setSignature = {
- name: nodeName,
- type: 'void',
- deprecated: false,
- deprecationMessage: '',
- args: nodeAccessor.parameters.map(function (param) { return _this.visitArgument(param); }),
- returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : 'void',
- line: this.getPosition(nodeAccessor, sourceFile).line + 1
- };
- if (nodeAccessor.jsDoc && nodeAccessor.jsDoc.length >= 1) {
- var comment = this.jsdocParserUtil.getMainCommentOfNode(nodeAccessor, sourceFile);
- if (typeof comment !== 'undefined') {
- var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
- setSignature.rawdescription = cleanedDescription;
- setSignature.description = markedAcl(cleanedDescription);
- }
- }
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, setSignature);
- setSignature.jsdoctags = markedtags(jsdoctags[0].tags);
- }
- if (setSignature.jsdoctags && setSignature.jsdoctags.length > 0) {
- setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args, setSignature.jsdoctags);
- }
- else if (setSignature.args && setSignature.args.length > 0) {
- setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args);
- }
- accessors[nodeName].setSignature = setSignature;
- }
- if (nodeAccessor.kind === tsMorph.SyntaxKind.GetAccessor) {
- var getSignature = {
- name: nodeName,
- type: nodeAccessor.type ? kindToType(nodeAccessor.type.kind) : '',
- returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : '',
- line: this.getPosition(nodeAccessor, sourceFile).line + 1
- };
- if (nodeAccessor.jsDoc && nodeAccessor.jsDoc.length >= 1) {
- var comment = this.jsdocParserUtil.getMainCommentOfNode(nodeAccessor, sourceFile);
- if (typeof comment !== 'undefined') {
- var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
- getSignature.rawdescription = cleanedDescription;
- getSignature.description = markedAcl(cleanedDescription);
- }
- }
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, getSignature);
- getSignature.jsdoctags = markedtags(jsdoctags[0].tags);
- }
- accessors[nodeName].getSignature = getSignature;
- }
- }
- };
- ClassHelper.prototype.isDirectiveDecorator = function (decorator) {
- if (decorator.expression.expression) {
- var decoratorIdentifierText = decorator.expression.expression.text;
- return (decoratorIdentifierText === 'Directive' || decoratorIdentifierText === 'Component');
- }
- else {
- return false;
- }
- };
- ClassHelper.prototype.isServiceDecorator = function (decorator) {
- return decorator.expression.expression
- ? decorator.expression.expression.text === 'Injectable'
- : false;
- };
- ClassHelper.prototype.isPrivate = function (member) {
- /**
- * Copyright https://github.com/ng-bootstrap/ng-bootstrap
- */
- if (member.modifiers) {
- var isPrivate = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.PrivateKeyword; });
- if (isPrivate) {
- return true;
- }
- }
- // Check for ECMAScript Private Fields
- if (member.name && member.name.escapedText) {
- var isPrivate = member.name.escapedText.indexOf('#') === 0;
- if (isPrivate) {
- return true;
- }
- }
- return this.isHiddenMember(member);
- };
- ClassHelper.prototype.isProtected = function (member) {
- if (member.modifiers) {
- var isProtected = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.ProtectedKeyword; });
- if (isProtected) {
- return true;
- }
- }
- return this.isHiddenMember(member);
- };
- ClassHelper.prototype.isInternal = function (member) {
- var e_1, _a, e_2, _b;
- /**
- * Copyright https://github.com/ng-bootstrap/ng-bootstrap
- */
- var internalTags = ['internal'];
- if (member.jsDoc) {
- try {
- for (var _c = __values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
- var doc = _d.value;
- if (doc.tags) {
- try {
- for (var _e = (e_2 = void 0, __values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
- var tag = _f.value;
- if (internalTags.indexOf(tag.tagName.text) > -1) {
- return true;
- }
- }
- }
- catch (e_2_1) { e_2 = { error: e_2_1 }; }
- finally {
- try {
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
- }
- finally { if (e_2) throw e_2.error; }
- }
- }
- }
- }
- catch (e_1_1) { e_1 = { error: e_1_1 }; }
- finally {
- try {
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
- }
- finally { if (e_1) throw e_1.error; }
- }
- }
- return false;
- };
- ClassHelper.prototype.isPublic = function (member) {
- if (member.modifiers) {
- var isPublic = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.PublicKeyword; });
- if (isPublic) {
- return true;
- }
- }
- return this.isHiddenMember(member);
- };
- ClassHelper.prototype.isHiddenMember = function (member) {
- var e_3, _a, e_4, _b;
- /**
- * Copyright https://github.com/ng-bootstrap/ng-bootstrap
- */
- var internalTags = ['hidden'];
- if (member.jsDoc) {
- try {
- for (var _c = __values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
- var doc = _d.value;
- if (doc.tags) {
- try {
- for (var _e = (e_4 = void 0, __values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
- var tag = _f.value;
- if (internalTags.indexOf(tag.tagName.text) > -1) {
- return true;
- }
- }
- }
- catch (e_4_1) { e_4 = { error: e_4_1 }; }
- finally {
- try {
- if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
- }
- finally { if (e_4) throw e_4.error; }
- }
- }
- }
- }
- catch (e_3_1) { e_3 = { error: e_3_1 }; }
- finally {
- try {
- if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
- }
- finally { if (e_3) throw e_3.error; }
- }
- }
- return false;
- };
- ClassHelper.prototype.isPipeDecorator = function (decorator) {
- return decorator.expression.expression
- ? decorator.expression.expression.text === 'Pipe'
- : false;
- };
- ClassHelper.prototype.isControllerDecorator = function (decorator) {
- return decorator.expression.expression
- ? decorator.expression.expression.text === 'Controller'
- : false;
- };
- ClassHelper.prototype.isModuleDecorator = function (decorator) {
- return decorator.expression.expression
- ? decorator.expression.expression.text === 'NgModule' ||
- decorator.expression.expression.text === 'Module'
- : false;
- };
- /**
- * VISITERS
- */
- ClassHelper.prototype.visitClassDeclaration = function (fileName, classDeclaration, sourceFile, astFile) {
- var symbol = this.typeChecker.getSymbolAtLocation(classDeclaration.name);
- var rawdescription = '';
- var deprecated = false;
- var deprecationMessage = '';
- var description = '';
- var jsdoctags = [];
- if (symbol) {
- var comment = this.jsdocParserUtil.getMainCommentOfNode(classDeclaration, sourceFile);
- rawdescription = this.jsdocParserUtil.parseComment(comment);
- description = markedAcl(rawdescription);
- if (symbol.valueDeclaration && isIgnore(symbol.valueDeclaration)) {
- return [{ ignore: true }];
- }
- if (symbol.declarations && symbol.declarations.length > 0) {
- var declarationsjsdoctags = this.jsdocParserUtil.getJSDocs(symbol.declarations[0]);
- if (declarationsjsdoctags &&
- declarationsjsdoctags.length >= 1 &&
- declarationsjsdoctags[0].tags) {
- var deprecation = { deprecated: false, deprecationMessage: '' };
- this.checkForDeprecation(declarationsjsdoctags[0].tags, deprecation);
- deprecated = deprecation.deprecated;
- deprecationMessage = deprecation.deprecationMessage;
- }
- if (isIgnore(symbol.declarations[0])) {
- return [{ ignore: true }];
- }
- }
- if (symbol.valueDeclaration) {
- jsdoctags = this.jsdocParserUtil.getJSDocs(symbol.valueDeclaration);
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- var deprecation = { deprecated: false, deprecationMessage: '' };
- this.checkForDeprecation(jsdoctags[0].tags, deprecation);
- deprecated = deprecation.deprecated;
- deprecationMessage = deprecation.deprecationMessage;
- jsdoctags = markedtags(jsdoctags[0].tags);
- }
- }
- }
- var className = classDeclaration.name.text;
- var members;
- var implementsElements = [];
- var extendsElements = [];
- if (typeof tsMorph.ts.getEffectiveImplementsTypeNodes !== 'undefined') {
- var implementedTypes = tsMorph.ts.getEffectiveImplementsTypeNodes(classDeclaration);
- if (implementedTypes) {
- var i = 0;
- var len = implementedTypes.length;
- for (i; i < len; i++) {
- if (implementedTypes[i].expression) {
- implementsElements.push(implementedTypes[i].expression.text);
- }
- }
- }
- }
- if (typeof tsMorph.ts.getClassExtendsHeritageElement !== 'undefined') {
- if (astFile) {
- var interfaceOrClassNode = astFile.getInterface(className);
- if (!interfaceOrClassNode) {
- interfaceOrClassNode = astFile.getClass(className);
- }
- if (interfaceOrClassNode) {
- var extendsListRaw = interfaceOrClassNode.getExtends();
- var extendsList_1 = [];
- if (extendsListRaw) {
- if (Array.isArray(extendsListRaw)) {
- if (extendsListRaw.length > 0) {
- extendsListRaw.forEach(function (extendElement) {
- var extendElementExpression = extendElement.getExpression();
- if (extendElementExpression) {
- var text = extendElementExpression.getText();
- if (text) {
- extendsList_1.push(text);
- }
- }
- });
- }
- }
- else {
- var extendElementExpression = extendsListRaw.getExpression();
- if (extendElementExpression) {
- var text = extendElementExpression.getText();
- if (text) {
- extendsList_1.push(text);
- }
- }
- }
- }
- extendsElements = extendsList_1;
- }
- }
- }
- members = this.visitMembers(classDeclaration.members, sourceFile);
- if (nodeHasDecorator(classDeclaration)) {
- var classDecorators = getNodeDecorators(classDeclaration);
- // Loop and search for official decorators at top-level :
- // Angular : @NgModule, @Component, @Directive, @Injectable, @Pipe
- // Nestjs : @Controller, @Module, @Injectable
- // Stencil : @Component
- var isDirective = false;
- var isService = false;
- var isPipe = false;
- var isModule = false;
- var isController = false;
- for (var a = 0; a < classDecorators.length; a++) {
- //console.log(classDeclaration.decorators[i].expression);
- // RETURN TOO EARLY FOR MANY DECORATORS !!!!
- // iterating through the decorators array we have to keep the flags `true` values from the previous loop iteration
- isDirective = isDirective || this.isDirectiveDecorator(classDecorators[a]);
- isService = isService || this.isServiceDecorator(classDecorators[a]);
- isPipe = isPipe || this.isPipeDecorator(classDecorators[a]);
- isModule = isModule || this.isModuleDecorator(classDecorators[a]);
- isController = isController || this.isControllerDecorator(classDecorators[a]);
- }
- if (isDirective) {
- return {
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: description,
- rawdescription: rawdescription,
- inputs: members.inputs,
- outputs: members.outputs,
- hostBindings: members.hostBindings,
- hostListeners: members.hostListeners,
- properties: members.properties,
- methods: members.methods,
- indexSignatures: members.indexSignatures,
- kind: members.kind,
- constructor: members.constructor,
- jsdoctags: jsdoctags,
- extends: extendsElements,
- implements: implementsElements,
- accessors: members.accessors
- };
- }
- else if (isService) {
- return [
- {
- fileName: fileName,
- className: className,
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: description,
- rawdescription: rawdescription,
- methods: members.methods,
- indexSignatures: members.indexSignatures,
- properties: members.properties,
- kind: members.kind,
- constructor: members.constructor,
- jsdoctags: jsdoctags,
- extends: extendsElements,
- implements: implementsElements,
- accessors: members.accessors
- }
- ];
- }
- else if (isPipe) {
- return [
- {
- fileName: fileName,
- className: className,
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: description,
- rawdescription: rawdescription,
- jsdoctags: jsdoctags,
- properties: members.properties,
- methods: members.methods
- }
- ];
- }
- else if (isModule) {
- return [
- {
- fileName: fileName,
- className: className,
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: description,
- rawdescription: rawdescription,
- jsdoctags: jsdoctags,
- methods: members.methods
- }
- ];
- }
- else {
- return [
- {
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: description,
- rawdescription: rawdescription,
- methods: members.methods,
- indexSignatures: members.indexSignatures,
- properties: members.properties,
- kind: members.kind,
- constructor: members.constructor,
- jsdoctags: jsdoctags,
- extends: extendsElements,
- implements: implementsElements,
- accessors: members.accessors
- }
- ];
- }
- }
- else if (description) {
- return [
- {
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: description,
- rawdescription: rawdescription,
- inputs: members.inputs,
- outputs: members.outputs,
- hostBindings: members.hostBindings,
- hostListeners: members.hostListeners,
- methods: members.methods,
- indexSignatures: members.indexSignatures,
- properties: members.properties,
- kind: members.kind,
- constructor: members.constructor,
- jsdoctags: jsdoctags,
- extends: extendsElements,
- implements: implementsElements,
- accessors: members.accessors
- }
- ];
- }
- else {
- return [
- {
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- methods: members.methods,
- inputs: members.inputs,
- outputs: members.outputs,
- hostBindings: members.hostBindings,
- hostListeners: members.hostListeners,
- indexSignatures: members.indexSignatures,
- properties: members.properties,
- kind: members.kind,
- constructor: members.constructor,
- jsdoctags: jsdoctags,
- extends: extendsElements,
- implements: implementsElements,
- accessors: members.accessors
- }
- ];
- }
- };
- ClassHelper.prototype.visitMembers = function (members, sourceFile) {
- /**
- * Copyright https://github.com/ng-bootstrap/ng-bootstrap
- */
- var inputs = [];
- var outputs = [];
- var methods = [];
- var properties = [];
- var indexSignatures = [];
- var kind;
- var inputDecorator;
- var hostBindings = [];
- var hostListeners = [];
- var constructor;
- var outputDecorator;
- var accessors = {};
- var result = {};
- for (var i = 0; i < members.length; i++) {
- // Allows typescript guess type when using ts.is*
- var member = members[i];
- inputDecorator = this.getDecoratorOfType(member, 'Input');
- outputDecorator = this.getDecoratorOfType(member, 'Output');
- var parsedHostBindings = this.getDecoratorOfType(member, 'HostBinding');
- var parsedHostListeners = this.getDecoratorOfType(member, 'HostListener');
- kind = member.kind;
- if (isIgnore(member)) {
- continue;
- }
- if (this.isInternal(member) && Configuration$1.mainData.disableInternal) {
- continue;
- }
- if (inputDecorator && inputDecorator.length > 0) {
- inputs.push(this.visitInputAndHostBinding(member, inputDecorator[0], sourceFile));
- if (tsMorph.ts.isSetAccessorDeclaration(member)) {
- this.addAccessor(accessors, members[i], sourceFile);
- }
- }
- else if (outputDecorator && outputDecorator.length > 0) {
- outputs.push(this.visitOutput(member, outputDecorator[0], sourceFile));
- }
- else if (parsedHostBindings && parsedHostBindings.length > 0) {
- var k = 0;
- var lenHB = parsedHostBindings.length;
- for (k; k < lenHB; k++) {
- hostBindings.push(this.visitInputAndHostBinding(member, parsedHostBindings[k], sourceFile));
- }
- }
- else if (parsedHostListeners && parsedHostListeners.length > 0) {
- var l = 0;
- var lenHL = parsedHostListeners.length;
- for (l; l < lenHL; l++) {
- hostListeners.push(this.visitHostListener(member, parsedHostListeners[l], sourceFile));
- }
- }
- if (!this.isHiddenMember(member)) {
- if (!(this.isPrivate(member) && Configuration$1.mainData.disablePrivate)) {
- if (!(this.isInternal(member) && Configuration$1.mainData.disableInternal)) {
- if (!(this.isProtected(member) && Configuration$1.mainData.disableProtected)) {
- if (tsMorph.ts.isMethodDeclaration(member) || tsMorph.ts.isMethodSignature(member)) {
- methods.push(this.visitMethodDeclaration(member, sourceFile));
- }
- else if (tsMorph.ts.isPropertyDeclaration(member) ||
- tsMorph.ts.isPropertySignature(member)) {
- if (!inputDecorator && !outputDecorator) {
- properties.push(this.visitProperty(member, sourceFile));
- }
- }
- else if (tsMorph.ts.isCallSignatureDeclaration(member)) {
- properties.push(this.visitCallDeclaration(member, sourceFile));
- }
- else if (tsMorph.ts.isGetAccessorDeclaration(member) ||
- tsMorph.ts.isSetAccessorDeclaration(member)) {
- this.addAccessor(accessors, members[i], sourceFile);
- }
- else if (tsMorph.ts.isIndexSignatureDeclaration(member)) {
- indexSignatures.push(this.visitIndexDeclaration(member, sourceFile));
- }
- else if (tsMorph.ts.isConstructorDeclaration(member)) {
- var _constructorProperties = this.visitConstructorProperties(member, sourceFile);
- var j = 0;
- var len = _constructorProperties.length;
- for (j; j < len; j++) {
- properties.push(_constructorProperties[j]);
- }
- constructor = this.visitConstructorDeclaration(member, sourceFile);
- }
- }
- }
- }
- }
- }
- inputs.sort(getNamesCompareFn());
- outputs.sort(getNamesCompareFn());
- hostBindings.sort(getNamesCompareFn());
- hostListeners.sort(getNamesCompareFn());
- properties.sort(getNamesCompareFn());
- methods.sort(getNamesCompareFn());
- indexSignatures.sort(getNamesCompareFn());
- result = {
- inputs: inputs,
- outputs: outputs,
- hostBindings: hostBindings,
- hostListeners: hostListeners,
- methods: methods,
- properties: properties,
- indexSignatures: indexSignatures,
- kind: kind,
- constructor: constructor
- };
- if (Object.keys(accessors).length) {
- result['accessors'] = accessors;
- }
- return result;
- };
- ClassHelper.prototype.visitTypeName = function (typeName) {
- if (typeName.escapedText) {
- return typeName.escapedText;
- }
- if (typeName.text) {
- return typeName.text;
- }
- if (typeName.left && typeName.right) {
- return this.visitTypeName(typeName.left) + '.' + this.visitTypeName(typeName.right);
- }
- return '';
- };
- ClassHelper.prototype.visitTypeIndex = function (node) {
- var _return = '';
- if (!node) {
- return _return;
- }
- if (node.type &&
- node.type.kind === tsMorph.SyntaxKind.IndexedAccessType &&
- node.type.indexType &&
- node.type.indexType.literal) {
- return this.visitTypeName(node.type.indexType.literal);
- }
- return _return;
- };
- ClassHelper.prototype.visitType = function (node) {
- var e_5, _a;
- var _this = this;
- var _return = 'void';
- if (!node) {
- return _return;
- }
- if (node.typeName) {
- _return = this.visitTypeName(node.typeName);
- }
- else if (node.type) {
- if (node.type.kind) {
- _return = kindToType(node.type.kind);
- }
- if (node.type.typeName) {
- _return = this.visitTypeName(node.type.typeName);
- }
- if (node.type.typeArguments) {
- _return += '<';
- var typeArguments = [];
- try {
- for (var _b = __values(node.type.typeArguments), _c = _b.next(); !_c.done; _c = _b.next()) {
- var argument = _c.value;
- typeArguments.push(this.visitType(argument));
- }
- }
- catch (e_5_1) { e_5 = { error: e_5_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_5) throw e_5.error; }
- }
- _return += typeArguments.join(' | ');
- _return += '>';
- }
- if (node.type.elementType) {
- var _firstPart = this.visitType(node.type.elementType);
- _return = _firstPart + kindToType(node.type.kind);
- if (node.type.elementType.kind === tsMorph.SyntaxKind.ParenthesizedType) {
- _return = '(' + _firstPart + ')' + kindToType(node.type.kind);
- }
- }
- var parseTypesOrElements = function (arr, separator) {
- var e_6, _a;
- var i = 0;
- var len = arr.length;
- for (i; i < len; i++) {
- var type = arr[i];
- if (type.elementType) {
- var _firstPart = _this.visitType(type.elementType);
- if (type.elementType.kind === tsMorph.SyntaxKind.ParenthesizedType) {
- _return += '(' + _firstPart + ')' + kindToType(type.kind);
- }
- else {
- _return += _firstPart + kindToType(type.kind);
- }
- }
- else {
- if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
- if (type.literal.text) {
- _return += '"' + type.literal.text + '"';
- }
- else {
- _return += kindToType(type.literal.kind);
- }
- }
- else {
- _return += kindToType(type.kind);
- }
- if (type.typeName) {
- _return += _this.visitTypeName(type.typeName);
- }
- if (type.kind === tsMorph.SyntaxKind.RestType && type.type) {
- _return += '...' + _this.visitType(type.type);
- }
- if (type.typeArguments) {
- _return += '<';
- var typeArguments = [];
- try {
- for (var _b = (e_6 = void 0, __values(type.typeArguments)), _c = _b.next(); !_c.done; _c = _b.next()) {
- var argument = _c.value;
- typeArguments.push(_this.visitType(argument));
- }
- }
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
- finally {
- try {
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
- }
- finally { if (e_6) throw e_6.error; }
- }
- _return += typeArguments.join(separator);
- _return += '>';
- }
- }
- if (i < len - 1) {
- _return += separator;
- }
- }
- };
- if (node.type.elements && tsMorph.ts.isTupleTypeNode(node.type)) {
- _return += '[';
- parseTypesOrElements(node.type.elements, ', ');
- _return += ']';
- }
- if (node.type.types && tsMorph.ts.isUnionTypeNode(node.type)) {
- parseTypesOrElements(node.type.types, ' | ');
- }
- if (node.type.elementTypes) {
- var elementTypes = node.type.elementTypes;
- var i = 0;
- var len = elementTypes.length;
- if (len > 0) {
- _return = '[';
- for (i; i < len; i++) {
- var type = elementTypes[i];
- if (type.kind === tsMorph.SyntaxKind.ArrayType && type.elementType) {
- _return += kindToType(type.elementType.kind);
- _return += kindToType(type.kind);
- }
- else {
- _return += kindToType(type.kind);
- }
- if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
- if (type.literal.text) {
- _return += '"' + type.literal.text + '"';
- }
- else {
- _return += kindToType(type.literal.kind);
- }
- }
- if (type.typeName) {
- _return += this.visitTypeName(type.typeName);
- }
- if (type.kind === tsMorph.SyntaxKind.RestType && type.type) {
- _return += '...' + this.visitType(type.type);
- }
- if (type.kind === tsMorph.SyntaxKind.TypeReference &&
- type.typeName &&
- typeof type.typeName.escapedText !== 'undefined' &&
- type.typeName.escapedText === '') {
- continue;
- }
- if (i < len - 1) {
- _return += ', ';
- }
- }
- _return += ']';
- }
- }
- if (node.type &&
- node.type.kind === tsMorph.SyntaxKind.IndexedAccessType &&
- node.type.objectType &&
- node.type.objectType.typeName) {
- _return = this.visitTypeName(node.type.objectType.typeName);
- }
- }
- else if (node.elementType) {
- _return = kindToType(node.elementType.kind) + kindToType(node.kind);
- if (node.elementType.typeName) {
- _return = this.visitTypeName(node.elementType.typeName) + kindToType(node.kind);
- }
- }
- else if (node.types && tsMorph.ts.isUnionTypeNode(node)) {
- _return = '';
- var i = 0;
- var len = node.types.length;
- for (i; i < len; i++) {
- var type = node.types[i];
- _return += kindToType(type.kind);
- if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
- if (type.literal.text) {
- _return += '"' + type.literal.text + '"';
- }
- else {
- _return += kindToType(type.literal.kind);
- }
- }
- if (type.typeName) {
- _return += this.visitTypeName(type.typeName);
- }
- if (i < len - 1) {
- _return += ' | ';
- }
- }
- }
- else if (node.dotDotDotToken) {
- _return = 'any[]';
- }
- else {
- _return = kindToType(node.kind);
- if (_return === '' &&
- node.initializer &&
- node.initializer.kind &&
- (node.kind === tsMorph.SyntaxKind.PropertyDeclaration || node.kind === tsMorph.SyntaxKind.Parameter)) {
- _return = kindToType(node.initializer.kind);
- }
- if (node.kind === tsMorph.SyntaxKind.TypeParameter) {
- _return = node.name.text;
- }
- if (node.kind === tsMorph.SyntaxKind.LiteralType) {
- _return = node.literal.text;
- }
- }
- if (node.typeArguments && node.typeArguments.length > 0) {
- _return += '<';
- var i = 0, len = node.typeArguments.length;
- for (i; i < len; i++) {
- var argument = node.typeArguments[i];
- _return += this.visitType(argument);
- if (i >= 0 && i < len - 1) {
- _return += ', ';
- }
- }
- _return += '>';
- }
- return _return;
- };
- ClassHelper.prototype.visitCallDeclaration = function (method, sourceFile) {
- var _this = this;
- var sourceCode = sourceFile.getText();
- var hash = crypto$7.createHash('sha512').update(sourceCode).digest('hex');
- var result = {
- id: 'call-declaration-' + hash,
- args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
- returnType: this.visitType(method.type),
- line: this.getPosition(method, sourceFile).line + 1,
- deprecated: false,
- deprecationMessage: ''
- };
- if (method.jsDoc) {
- var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
- var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
- result.rawdescription = cleanedDescription;
- result.description = markedAcl(cleanedDescription);
- }
- var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, result);
- result.jsdoctags = markedtags(jsdoctags[0].tags);
- }
- return result;
- };
- ClassHelper.prototype.visitIndexDeclaration = function (method, sourceFile) {
- var _this = this;
- var sourceCode = sourceFile.getText();
- var hash = crypto$7.createHash('sha512').update(sourceCode).digest('hex');
- var result = {
- id: 'index-declaration-' + hash,
- args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
- returnType: this.visitType(method.type),
- line: this.getPosition(method, sourceFile).line + 1,
- deprecated: false,
- deprecationMessage: ''
- };
- var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
- if (method.jsDoc) {
- var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
- var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
- result.rawdescription = cleanedDescription;
- result.description = markedAcl(cleanedDescription);
- }
- if (jsdoctags && jsdoctags.length >= 1) {
- if (jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, result);
- if (method.jsDoc) {
- result.jsdoctags = markedtags(jsdoctags[0].tags);
- }
- }
- }
- return result;
- };
- ClassHelper.prototype.visitConstructorDeclaration = function (method, sourceFile) {
- var _this = this;
- /**
- * Copyright https://github.com/ng-bootstrap/ng-bootstrap
- */
- var result = {
- name: 'constructor',
- description: '',
- deprecated: false,
- deprecationMessage: '',
- args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
- line: this.getPosition(method, sourceFile).line + 1
- };
- var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
- if (method.jsDoc) {
- var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
- var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
- result.rawdescription = cleanedDescription;
- result.description = markedAcl(cleanedDescription);
- }
- if (method.modifiers) {
- if (method.modifiers.length > 0) {
- var kinds = method.modifiers.map(function (modifier) {
- return modifier.kind;
- });
- if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
- ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
- kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
- }
- result.modifierKind = kinds;
- }
- }
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, result);
- result.jsdoctags = markedtags(jsdoctags[0].tags);
- }
- if (result.jsdoctags && result.jsdoctags.length > 0) {
- result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
- }
- else if (result.args.length > 0) {
- result.jsdoctags = mergeTagsAndArgs(result.args);
- }
- return result;
- };
- ClassHelper.prototype.visitProperty = function (property, sourceFile) {
- var result = {
- name: property.name.text,
- defaultValue: property.initializer
- ? this.stringifyDefaultValue(property.initializer)
- : undefined,
- deprecated: false,
- deprecationMessage: '',
- type: this.visitType(property),
- indexKey: this.visitTypeIndex(property),
- optional: typeof property.questionToken !== 'undefined',
- description: '',
- line: this.getPosition(property, sourceFile).line + 1
- };
- var jsdoctags;
- if (property.initializer && property.initializer.kind === tsMorph.SyntaxKind.ArrowFunction) {
- result.defaultValue = '() => {...}';
- }
- if (typeof result.name === 'undefined' && typeof property.name.expression !== 'undefined') {
- result.name = property.name.expression.text;
- }
- jsdoctags = this.jsdocParserUtil.getJSDocs(property);
- if (property.jsDoc) {
- var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
- var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
- result.rawdescription = cleanedDescription;
- result.description = markedAcl(cleanedDescription);
- }
- if (nodeHasDecorator(property)) {
- var propertyDecorators = getNodeDecorators(property);
- result.decorators = this.formatDecorators(propertyDecorators);
- }
- if (property.modifiers) {
- if (property.modifiers.length > 0) {
- var kinds = property.modifiers.map(function (modifier) {
- return modifier.kind;
- });
- if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
- ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
- kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
- }
- result.modifierKind = kinds;
- }
- }
- // Check for ECMAScript Private Fields
- if (this.isPrivate(property)) {
- if (!result.modifierKind) {
- result.modifierKind = [];
- }
- var hasAlreadyPrivateLeyword_1 = false;
- result.modifierKind.forEach(function (modifierKind) {
- if (modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
- hasAlreadyPrivateLeyword_1 = true;
- }
- });
- if (!hasAlreadyPrivateLeyword_1) {
- result.modifierKind.push(tsMorph.SyntaxKind.PrivateKeyword);
- }
- }
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, result);
- if (property.jsDoc) {
- result.jsdoctags = markedtags(jsdoctags[0].tags);
- }
- }
- return result;
- };
- ClassHelper.prototype.visitConstructorProperties = function (constr, sourceFile) {
- if (constr.parameters) {
- var _parameters_1 = [];
- var i = 0;
- var len = constr.parameters.length;
- for (i; i < len; i++) {
- var parameterOfConstructor = constr.parameters[i];
- if (isIgnore(parameterOfConstructor)) {
- continue;
- }
- if (this.isInternal(parameterOfConstructor) &&
- Configuration$1.mainData.disableInternal) {
- continue;
- }
- if (this.isPublic(parameterOfConstructor)) {
- _parameters_1.push(this.visitProperty(constr.parameters[i], sourceFile));
- }
- }
- /**
- * Merge JSDoc tags description from constructor with parameters
- */
- if (constr.jsDoc) {
- if (constr.jsDoc.length > 0) {
- var constrTags = constr.jsDoc[0].tags;
- if (constrTags && constrTags.length > 0) {
- constrTags.forEach(function (tag) {
- _parameters_1.forEach(function (param) {
- if (tag.tagName &&
- tag.tagName.escapedText &&
- tag.tagName.escapedText === 'param') {
- if (tag.name &&
- tag.name.escapedText &&
- tag.name.escapedText === param.name) {
- param.description = tag.comment;
- }
- }
- });
- });
- }
- }
- }
- return _parameters_1;
- }
- else {
- return [];
- }
- };
- ClassHelper.prototype.visitMethodDeclaration = function (method, sourceFile) {
- var _this = this;
- var result = {
- name: method.name.text,
- args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
- optional: typeof method.questionToken !== 'undefined',
- returnType: this.visitType(method.type),
- typeParameters: [],
- line: this.getPosition(method, sourceFile).line + 1,
- deprecated: false,
- deprecationMessage: ''
- };
- var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
- if (typeof method.type === 'undefined') {
- // Try to get inferred type
- if (method.symbol) {
- var symbol = method.symbol;
- if (symbol.valueDeclaration) {
- var symbolType = this.typeChecker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration);
- if (symbolType) {
- try {
- var signature = this.typeChecker.getSignatureFromDeclaration(method);
- var returnType = signature.getReturnType();
- result.returnType = this.typeChecker.typeToString(returnType);
- // tslint:disable-next-line:no-empty
- }
- catch (error) { }
- }
- }
- }
- }
- if (method.typeParameters && method.typeParameters.length > 0) {
- result.typeParameters = method.typeParameters.map(function (typeParameter) {
- return _this.visitType(typeParameter);
- });
- }
- if (method.jsDoc) {
- var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
- var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
- result.rawdescription = cleanedDescription;
- result.description = markedAcl(cleanedDescription);
- }
- if (nodeHasDecorator(method)) {
- var methodDecorators = getNodeDecorators(method);
- result.decorators = this.formatDecorators(methodDecorators);
- }
- if (method.modifiers) {
- if (method.modifiers.length > 0) {
- var kinds = method.modifiers.map(function (modifier) {
- return modifier.kind;
- });
- if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
- ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
- kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
- }
- result.modifierKind = kinds;
- }
- }
- // Check for ECMAScript Private Fields
- if (this.isPrivate(method)) {
- if (!result.modifierKind) {
- result.modifierKind = [];
- }
- var hasAlreadyPrivateLeyword_2 = false;
- result.modifierKind.forEach(function (modifierKind) {
- if (modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
- hasAlreadyPrivateLeyword_2 = true;
- }
- });
- if (!hasAlreadyPrivateLeyword_2) {
- result.modifierKind.push(tsMorph.SyntaxKind.PrivateKeyword);
- }
- }
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, result);
- result.jsdoctags = markedtags(jsdoctags[0].tags);
- }
- if (result.jsdoctags && result.jsdoctags.length > 0) {
- result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
- }
- else if (result.args.length > 0) {
- result.jsdoctags = mergeTagsAndArgs(result.args);
- }
- return result;
- };
- ClassHelper.prototype.visitOutput = function (property, outDecorator, sourceFile) {
- var inArgs = outDecorator.expression.arguments;
- var _return = {
- name: inArgs.length > 0 ? inArgs[0].text : property.name.text,
- defaultValue: property.initializer
- ? this.stringifyDefaultValue(property.initializer)
- : undefined,
- deprecated: false,
- deprecationMessage: ''
- };
- if (property.jsDoc) {
- var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
- var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
- var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
- _return.rawdescription = cleanedDescription;
- _return.description = markedAcl(cleanedDescription);
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, _return);
- _return.jsdoctags = markedtags(jsdoctags[0].tags);
- }
- }
- if (!_return.description) {
- if (property.jsDoc && property.jsDoc.length > 0) {
- if (typeof property.jsDoc[0].comment !== 'undefined') {
- var rawDescription = property.jsDoc[0].comment;
- _return.rawdescription = rawDescription;
- _return.description = markedAcl(rawDescription);
- }
- }
- }
- _return.line = this.getPosition(property, sourceFile).line + 1;
- if (property.type) {
- _return.type = this.visitType(property);
- }
- else {
- // handle NewExpression
- if (property.initializer) {
- if (tsMorph.ts.isNewExpression(property.initializer)) {
- if (property.initializer.expression) {
- _return.type = property.initializer.expression.text;
- }
- }
- }
- }
- return _return;
- };
- ClassHelper.prototype.visitArgument = function (arg) {
- var _this = this;
- var _result = {
- name: arg.name.text,
- type: this.visitType(arg),
- deprecated: false,
- deprecationMessage: ''
- };
- if (arg.dotDotDotToken) {
- _result.dotDotDotToken = true;
- }
- if (arg.questionToken) {
- _result.optional = true;
- }
- if (arg.type) {
- if (arg.type.kind) {
- if (tsMorph.ts.isFunctionTypeNode(arg.type)) {
- _result.function = arg.type.parameters
- ? arg.type.parameters.map(function (prop) { return _this.visitArgument(prop); })
- : [];
- }
- }
- }
- if (arg.initializer) {
- _result.defaultValue = this.stringifyDefaultValue(arg.initializer);
- }
- var jsdoctags = this.jsdocParserUtil.getJSDocs(arg);
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, _result);
- }
- return _result;
- };
- ClassHelper.prototype.visitInputAndHostBinding = function (property, inDecorator, sourceFile) {
- var inArgs = inDecorator.expression.arguments;
- var _return = {};
- var isInputConfigStringLiteral = false;
- var isInputConfigObjectLiteralExpression = false;
- var hasRequiredField = false;
- var hasAlias = false;
- var getRequiredField = function () {
- return inArgs[0].properties.find(function (property) { return property.name.escapedText === 'required'; });
- };
- var getAliasProperty = function () {
- return inArgs[0].properties.find(function (property) { return property.name.escapedText === 'alias'; });
- };
- if (inArgs.length > 0) {
- isInputConfigStringLiteral = inArgs[0] && tsMorph.ts.isStringLiteral(inArgs[0]);
- isInputConfigObjectLiteralExpression =
- inArgs[0] && tsMorph.ts.isObjectLiteralExpression(inArgs[0]);
- if (isInputConfigObjectLiteralExpression && inArgs[0].properties) {
- hasRequiredField = isInputConfigObjectLiteralExpression && !!getRequiredField();
- hasAlias = isInputConfigObjectLiteralExpression ? !!getAliasProperty() : false;
- _return.required = !!getRequiredField();
- }
- _return.name = isInputConfigStringLiteral
- ? inArgs[0].text
- : hasAlias
- ? getAliasProperty().initializer.text
- : property.name.text;
- }
- else {
- _return.name = property.name.text;
- }
- _return.defaultValue = property.initializer
- ? this.stringifyDefaultValue(property.initializer)
- : undefined;
- _return.deprecated = false;
- _return.deprecationMessage = '';
- if (inArgs.length > 0 && inArgs[0].properties && hasRequiredField) {
- _return.optional = getRequiredField().initializer.kind !== tsMorph.SyntaxKind.TrueKeyword;
- }
- if (!_return.description) {
- if (property.jsDoc) {
- if (property.jsDoc.length > 0) {
- var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, _return);
- _return.jsdoctags = markedtags(jsdoctags[0].tags);
- }
- if (typeof property.jsDoc[0].comment !== 'undefined') {
- var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
- var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
- _return.rawdescription = cleanedDescription;
- _return.description = markedAcl(cleanedDescription);
- }
- }
- }
- }
- _return.line = this.getPosition(property, sourceFile).line + 1;
- if (property.type) {
- _return.type = this.visitType(property);
- }
- else {
- // handle NewExpression
- if (property.initializer) {
- if (tsMorph.ts.isNewExpression(property.initializer)) {
- if (property.initializer.expression) {
- _return.type = property.initializer.expression.text;
- }
- }
- }
- // Try to get inferred type
- if (property.symbol) {
- var symbol = property.symbol;
- if (symbol.valueDeclaration) {
- var symbolType = this.typeChecker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration);
- if (symbolType) {
- _return.type = this.typeChecker.typeToString(symbolType);
- }
- }
- }
- }
- if (property.kind === tsMorph.SyntaxKind.SetAccessor) {
- // For setter accessor, find type in first parameter
- if (property.parameters && property.parameters.length === 1) {
- if (property.parameters[0].type) {
- _return.type = this.visitType(property.parameters[0].type);
- }
- }
- }
- if (nodeHasDecorator(property)) {
- var propertyDecorators = getNodeDecorators(property);
- _return.decorators = this.formatDecorators(propertyDecorators).filter(function (item) { return item.name !== 'Input' && item.name !== 'HostBinding'; });
- }
- return _return;
- };
- ClassHelper.prototype.visitHostListener = function (property, hostListenerDecorator, sourceFile) {
- var _this = this;
- var inArgs = hostListenerDecorator.expression.arguments;
- var _return = {};
- _return.name = inArgs.length > 0 ? inArgs[0].text : property.name.text;
- _return.args = property.parameters
- ? property.parameters.map(function (prop) { return _this.visitArgument(prop); })
- : [];
- _return.argsDecorator =
- inArgs.length > 1
- ? inArgs[1].elements.map(function (prop) {
- return prop.text;
- })
- : [];
- _return.deprecated = false;
- _return.deprecationMessage = '';
- if (property.jsDoc) {
- var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
- var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
- var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
- _return.rawdescription = cleanedDescription;
- _return.description = markedAcl(cleanedDescription);
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, _return);
- _return.jsdoctags = markedtags(jsdoctags[0].tags);
- }
- }
- if (!_return.description) {
- if (property.jsDoc) {
- if (property.jsDoc.length > 0) {
- if (typeof property.jsDoc[0].comment !== 'undefined') {
- var rawDescription = property.jsDoc[0].comment;
- _return.rawdescription = rawDescription;
- _return.description = markedAcl(rawDescription);
- }
- }
- }
- }
- _return.line = this.getPosition(property, sourceFile).line + 1;
- return _return;
- };
- return ClassHelper;
- }());
- var TsPrinterUtil = /** @class */ (function () {
- function TsPrinterUtil() {
- this.printer = tsMorph.ts.createPrinter({
- newLine: tsMorph.ts.NewLineKind.LineFeed
- });
- }
- TsPrinterUtil.prototype.print = function (node) {
- return this.printer.printNode(tsMorph.ts.EmitHint.Unspecified, node, tsMorph.ts.createSourceFile('', '', tsMorph.ts.ScriptTarget.Latest));
- };
- return TsPrinterUtil;
- }());
- var SymbolHelper = /** @class */ (function () {
- function SymbolHelper() {
- this.unknown = '???';
- }
- SymbolHelper.prototype.parseDeepIndentifier = function (name, srcFile) {
- var result = {
- name: '',
- type: ''
- };
- if (typeof name === 'undefined') {
- return result;
- }
- var nsModule = name.split('.');
- var type = this.getType(name);
- if (nsModule.length > 1) {
- result.ns = nsModule[0];
- result.name = name;
- result.type = type;
- return result;
- }
- if (typeof srcFile !== 'undefined') {
- result.file = ImportsUtil$1.getFileNameOfImport(name, srcFile);
- }
- result.name = name;
- result.type = type;
- return result;
- };
- SymbolHelper.prototype.getType = function (name) {
- var type;
- if (name.toLowerCase().indexOf('component') !== -1) {
- type = 'component';
- }
- else if (name.toLowerCase().indexOf('pipe') !== -1) {
- type = 'pipe';
- }
- else if (name.toLowerCase().indexOf('controller') !== -1) {
- type = 'controller';
- }
- else if (name.toLowerCase().indexOf('module') !== -1) {
- type = 'module';
- }
- else if (name.toLowerCase().indexOf('directive') !== -1) {
- type = 'directive';
- }
- else if (name.toLowerCase().indexOf('injectable') !== -1 ||
- name.toLowerCase().indexOf('service') !== -1) {
- type = 'injectable';
- }
- return type;
- };
- /**
- * Output
- * RouterModule.forRoot 179
- */
- SymbolHelper.prototype.buildIdentifierName = function (node, name) {
- if (tsMorph.ts.isIdentifier(node) && !tsMorph.ts.isPropertyAccessExpression(node)) {
- return "".concat(node.text, ".").concat(name);
- }
- name = name ? ".".concat(name) : '';
- var nodeName = this.unknown;
- if (node.name) {
- nodeName = node.name.text;
- }
- else if (node.text) {
- nodeName = node.text;
- }
- else if (node.expression) {
- if (node.expression.text) {
- nodeName = node.expression.text;
- }
- else if (node.expression.elements) {
- if (tsMorph.ts.isArrayLiteralExpression(node.expression)) {
- nodeName = node.expression.elements.map(function (el) { return el.text; }).join(', ');
- nodeName = "[".concat(nodeName, "]");
- }
- }
- }
- if (tsMorph.ts.isSpreadElement(node)) {
- return "...".concat(nodeName);
- }
- return "".concat(this.buildIdentifierName(node.expression, nodeName)).concat(name);
- };
- /**
- * parse expressions such as:
- * { provide: APP_BASE_HREF, useValue: '/' }
- * { provide: 'Date', useFactory: (d1, d2) => new Date(), deps: ['d1', 'd2'] }
- */
- SymbolHelper.prototype.parseProviderConfiguration = function (node) {
- if (node.kind && node.kind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
- // Search for provide: HTTP_INTERCEPTORS
- // and if true, return type: 'interceptor' + name
- var interceptorName_1, hasInterceptor_1;
- if (node.properties) {
- if (node.properties.length > 0) {
- ___namespace.forEach(node.properties, function (property) {
- if (property.kind && property.kind === tsMorph.SyntaxKind.PropertyAssignment) {
- if (property.name.text === 'provide') {
- if (property.initializer.text === 'HTTP_INTERCEPTORS') {
- hasInterceptor_1 = true;
- }
- }
- if (property.name.text === 'useClass' ||
- property.name.text === 'useExisting') {
- interceptorName_1 = property.initializer.text;
- }
- }
- });
- }
- }
- if (hasInterceptor_1) {
- return interceptorName_1;
- }
- else {
- return new TsPrinterUtil().print(node);
- }
- }
- else {
- return new TsPrinterUtil().print(node);
- }
- };
- /**
- * Kind
- * 181 CallExpression => "RouterModule.forRoot(args)"
- * 71 Identifier => "RouterModule" "TodoStore"
- * 9 StringLiteral => "./app.component.css" "./tab.scss"
- */
- SymbolHelper.prototype.parseSymbolElements = function (node) {
- // parse expressions such as: AngularFireModule.initializeApp(firebaseConfig)
- // if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) {
- if ((tsMorph.ts.isCallExpression(node) && tsMorph.ts.isPropertyAccessExpression(node.expression)) ||
- (tsMorph.ts.isNewExpression(node) && tsMorph.ts.isElementAccessExpression(node.expression))) {
- var className = this.buildIdentifierName(node.expression);
- // function arguments could be really complex. There are so
- // many use cases that we can't handle. Just print "args" to indicate
- // that we have arguments.
- var functionArgs = node.arguments.length > 0 ? 'args' : '';
- var text = "".concat(className, "(").concat(functionArgs, ")");
- return text;
- }
- else if (tsMorph.ts.isPropertyAccessExpression(node)) {
- // parse expressions such as: Shared.Module
- return this.buildIdentifierName(node);
- }
- else if (tsMorph.ts.isIdentifier(node)) {
- // parse expressions such as: MyComponent
- if (node.text) {
- return node.text;
- }
- if (node.escapedText) {
- return node.escapedText;
- }
- }
- else if (tsMorph.ts.isSpreadElement(node)) {
- // parse expressions such as: ...MYARRAY
- // Resolve MYARRAY in imports or local file variables after full scan, just return the name of the variable
- if (node.expression && node.expression.text) {
- return node.expression.text;
- }
- }
- return node.text ? node.text : this.parseProviderConfiguration(node);
- };
- /**
- * Kind
- * 177 ArrayLiteralExpression
- * 122 BooleanKeyword
- * 9 StringLiteral
- */
- SymbolHelper.prototype.parseSymbols = function (node, srcFile, decoratorType) {
- var _this = this;
- var localNode = node;
- if (tsMorph.ts.isShorthandPropertyAssignment(localNode) && decoratorType !== 'template') {
- localNode = ImportsUtil$1.findValueInImportOrLocalVariables(node.name.text, srcFile, decoratorType);
- }
- if (tsMorph.ts.isShorthandPropertyAssignment(localNode) && decoratorType === 'template') {
- var data = ImportsUtil$1.findValueInImportOrLocalVariables(node.name.text, srcFile, decoratorType);
- return [data];
- }
- if (localNode.initializer && tsMorph.ts.isArrayLiteralExpression(localNode.initializer)) {
- return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
- }
- else if ((localNode.initializer && tsMorph.ts.isStringLiteral(localNode.initializer)) ||
- (localNode.initializer && tsMorph.ts.isTemplateLiteral(localNode.initializer)) ||
- (localNode.initializer &&
- tsMorph.ts.isPropertyAssignment(localNode) &&
- localNode.initializer.text)) {
- return [localNode.initializer.text];
- }
- else if (localNode.initializer &&
- localNode.initializer.kind &&
- (localNode.initializer.kind === tsMorph.SyntaxKind.TrueKeyword ||
- localNode.initializer.kind === tsMorph.SyntaxKind.FalseKeyword)) {
- return [localNode.initializer.kind === tsMorph.SyntaxKind.TrueKeyword ? true : false];
- }
- else if (localNode.initializer && tsMorph.ts.isPropertyAccessExpression(localNode.initializer)) {
- var identifier = this.parseSymbolElements(localNode.initializer);
- return [identifier];
- }
- else if (localNode.initializer &&
- localNode.initializer.elements &&
- localNode.initializer.elements.length > 0) {
- // Node replaced by ts-simple-ast & kind = 265
- return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
- }
- };
- SymbolHelper.prototype.getSymbolDeps = function (props, decoratorType, srcFile, multiLine) {
- var _this = this;
- if (props.length === 0) {
- return [];
- }
- var i = 0, len = props.length, filteredProps = [];
- for (i; i < len; i++) {
- if (props[i].name && props[i].name.text === decoratorType) {
- filteredProps.push(props[i]);
- }
- }
- return filteredProps.map(function (x) { return _this.parseSymbols(x, srcFile, decoratorType); }).pop() || [];
- };
- SymbolHelper.prototype.getSymbolDepsRaw = function (props, type, multiLine) {
- return props.filter(function (node) { return node.name.text === type; });
- };
- return SymbolHelper;
- }());
- var ComponentHelper = /** @class */ (function () {
- function ComponentHelper(classHelper, symbolHelper) {
- if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
- this.classHelper = classHelper;
- this.symbolHelper = symbolHelper;
- }
- ComponentHelper.prototype.getComponentChangeDetection = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'changeDetection', srcFile).pop();
- };
- ComponentHelper.prototype.getComponentEncapsulation = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'encapsulation', srcFile);
- };
- ComponentHelper.prototype.getComponentPure = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'pure', srcFile).pop();
- };
- ComponentHelper.prototype.getComponentName = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'name', srcFile).pop();
- };
- ComponentHelper.prototype.getComponentExportAs = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'exportAs', srcFile).pop();
- };
- ComponentHelper.prototype.getComponentHostDirectives = function (props) {
- var hostDirectiveSymbolParsed = this.symbolHelper.getSymbolDepsRaw(props, 'hostDirectives');
- var hostDirectiveSymbol = null;
- if (hostDirectiveSymbolParsed.length > 0) {
- hostDirectiveSymbol = hostDirectiveSymbolParsed.pop();
- }
- var result = [];
- if (hostDirectiveSymbol &&
- hostDirectiveSymbol.initializer &&
- hostDirectiveSymbol.initializer.elements &&
- hostDirectiveSymbol.initializer.elements.length > 0) {
- hostDirectiveSymbol.initializer.elements.forEach(function (element) {
- if (element.kind === tsMorph.SyntaxKind.Identifier) {
- result.push({
- name: element.escapedText
- });
- }
- else if (element.kind === tsMorph.SyntaxKind.ObjectLiteralExpression &&
- element.properties &&
- element.properties.length > 0) {
- var parsedDirective_1 = {
- name: '',
- inputs: [],
- outputs: []
- };
- element.properties.forEach(function (property) {
- if (property.name.escapedText === 'directive') {
- parsedDirective_1.name = property.initializer.escapedText;
- }
- else if (property.name.escapedText === 'inputs') {
- if (property.initializer &&
- property.initializer.elements &&
- property.initializer.elements.length > 0) {
- property.initializer.elements.forEach(function (propertyElement) {
- parsedDirective_1.inputs.push(propertyElement.text);
- });
- }
- }
- else if (property.name.escapedText === 'outputs') {
- if (property.initializer &&
- property.initializer.elements &&
- property.initializer.elements.length > 0) {
- property.initializer.elements.forEach(function (propertyElement) {
- parsedDirective_1.outputs.push(propertyElement.text);
- });
- }
- }
- });
- result.push(parsedDirective_1);
- }
- });
- }
- return result;
- };
- ComponentHelper.prototype.getComponentHost = function (props) {
- return this.getSymbolDepsObject(props, 'host');
- };
- ComponentHelper.prototype.getComponentTag = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'tag', srcFile).pop();
- };
- ComponentHelper.prototype.getComponentInputsMetadata = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'inputs', srcFile);
- };
- ComponentHelper.prototype.getInputSignals = function (props) {
- var inputSignals = [];
- props === null || props === void 0 ? void 0 : props.forEach(function (prop, i) {
- var _a, _b, _c, _d;
- var regexpInput = /input(?:\.(required))?(?:<([\w-]+)>)?\(([\w-]+)?\)/;
- var resInput = regexpInput.exec(prop.defaultValue);
- if (resInput) {
- var newInput = prop;
- newInput.defaultValue = resInput[resInput.length - 1];
- newInput.required = (_b = (_a = resInput[0]) === null || _a === void 0 ? void 0 : _a.includes('.required')) !== null && _b !== void 0 ? _b : false;
- inputSignals.push(newInput);
- }
- else {
- var regexpModel = /model(?:\.(required))?(?:<([\w-]+)>)?\(([\w-]+)?\)/;
- var resModel = regexpModel.exec(prop.defaultValue);
- if (resModel) {
- var newInput = prop;
- newInput.defaultValue = resModel[resModel.length - 1];
- newInput.required = (_d = (_c = resModel[0]) === null || _c === void 0 ? void 0 : _c.includes('.required')) !== null && _d !== void 0 ? _d : false;
- inputSignals.push(newInput);
- }
- }
- });
- return inputSignals;
- };
- ComponentHelper.prototype.getOutputSignals = function (props) {
- var outputSignals = [];
- props === null || props === void 0 ? void 0 : props.forEach(function (prop, i) {
- var _a, _b;
- var regexp = /output(?:\.(required))?(?:<([\w-]+)>)?\(([\w-]+)?\)/;
- var res = regexp.exec(prop.defaultValue);
- if (res) {
- var newOutput = prop;
- newOutput.defaultValue = res[res.length - 1];
- newOutput.required = (_b = (_a = res[0]) === null || _a === void 0 ? void 0 : _a.includes('.required')) !== null && _b !== void 0 ? _b : false;
- outputSignals.push(newOutput);
- }
- });
- return outputSignals;
- };
- ComponentHelper.prototype.getComponentStandalone = function (props, srcFile) {
- var result = null;
- var parsedData = this.symbolHelper.getSymbolDeps(props, 'standalone', srcFile);
- if (parsedData.length === 1) {
- result = JSON.parse(parsedData[0]);
- }
- return result;
- };
- ComponentHelper.prototype.getComponentTemplate = function (props, srcFile) {
- var t = this.symbolHelper.getSymbolDeps(props, 'template', srcFile, true).pop();
- if (t) {
- t = detectIndent(t);
- t = t.replace(/\n/, '');
- t = t.replace(/ +$/gm, '');
- }
- return t;
- };
- ComponentHelper.prototype.getComponentStyleUrls = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'styleUrls', srcFile);
- };
- ComponentHelper.prototype.getComponentStyleUrl = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'styleUrl', srcFile).pop();
- };
- ComponentHelper.prototype.getComponentShadow = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'shadow', srcFile).pop();
- };
- ComponentHelper.prototype.getComponentScoped = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'scoped', srcFile).pop();
- };
- ComponentHelper.prototype.getComponentAssetsDir = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'assetsDir', srcFile).pop();
- };
- ComponentHelper.prototype.getComponentAssetsDirs = function (props, srcFile) {
- return this.sanitizeUrls(this.symbolHelper.getSymbolDeps(props, 'assetsDir', srcFile));
- };
- ComponentHelper.prototype.getComponentStyles = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'styles', srcFile);
- };
- ComponentHelper.prototype.getComponentModuleId = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'moduleId', srcFile).pop();
- };
- ComponentHelper.prototype.getComponentOutputs = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'outputs', srcFile);
- };
- ComponentHelper.prototype.getComponentProviders = function (props, srcFile) {
- var _this = this;
- return this.symbolHelper
- .getSymbolDeps(props, 'providers', srcFile)
- .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
- };
- ComponentHelper.prototype.getComponentImports = function (props, srcFile) {
- var _this = this;
- return this.symbolHelper
- .getSymbolDeps(props, 'imports', srcFile)
- .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
- };
- ComponentHelper.prototype.getComponentEntryComponents = function (props, srcFile) {
- var _this = this;
- return this.symbolHelper
- .getSymbolDeps(props, 'entryComponents', srcFile)
- .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
- };
- ComponentHelper.prototype.getComponentViewProviders = function (props, srcFile) {
- var _this = this;
- return this.symbolHelper
- .getSymbolDeps(props, 'viewProviders', srcFile)
- .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
- };
- ComponentHelper.prototype.getComponentTemplateUrl = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'templateUrl', srcFile);
- };
- ComponentHelper.prototype.getComponentExampleUrls = function (text) {
- var exampleUrlsMatches = text.match(/<example-url>(.*?)<\/example-url>/g);
- var exampleUrls = undefined;
- if (exampleUrlsMatches && exampleUrlsMatches.length) {
- exampleUrls = exampleUrlsMatches.map(function (val) {
- return val.replace(/<\/?example-url>/g, '');
- });
- }
- return exampleUrls;
- };
- ComponentHelper.prototype.getComponentPreserveWhitespaces = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'preserveWhitespaces', srcFile).pop();
- };
- ComponentHelper.prototype.getComponentSelector = function (props, srcFile) {
- return this.symbolHelper.getSymbolDeps(props, 'selector', srcFile).pop();
- };
- ComponentHelper.prototype.parseProperties = function (node) {
- var obj = new Map();
- var properties = node.initializer.properties || [];
- properties.forEach(function (prop) {
- obj.set(prop.name.text, prop.initializer.text);
- });
- return obj;
- };
- ComponentHelper.prototype.getSymbolDepsObject = function (props, type, multiLine) {
- var _this = this;
- var i = 0, len = props.length, filteredProps = [];
- for (i; i < len; i++) {
- if (props[i].name && props[i].name.text === type) {
- filteredProps.push(props[i]);
- }
- }
- return filteredProps.map(function (x) { return _this.parseProperties(x); }).pop();
- };
- ComponentHelper.prototype.getComponentIO = function (filename, sourceFile, node, fileBody, astFile) {
- var _this = this;
- /**
- * Copyright https://github.com/ng-bootstrap/ng-bootstrap
- */
- var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
- var res = reducedSource.reduce(function (directive, statement) {
- if (tsMorph.ts.isClassDeclaration(statement)) {
- if (statement.pos === node.pos && statement.end === node.end) {
- return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile, astFile));
- }
- }
- return directive;
- }, []);
- return res[0] || {};
- };
- ComponentHelper.prototype.sanitizeUrls = function (urls) {
- return urls.map(function (url) { return url.replace('./', ''); });
- };
- return ComponentHelper;
- }());
- var ComponentCache = /** @class */ (function () {
- function ComponentCache() {
- this.cache = new Map();
- }
- ComponentCache.prototype.get = function (key) {
- return this.cache.get(key);
- };
- ComponentCache.prototype.set = function (key, value) {
- this.cache.set(key, value);
- };
- return ComponentCache;
- }());
- var FrameworkDependencies = /** @class */ (function () {
- function FrameworkDependencies(files, options) {
- this.files = files;
- var transpileOptions = {
- target: tsMorph.ts.ScriptTarget.ES5,
- module: tsMorph.ts.ModuleKind.CommonJS,
- tsconfigDirectory: options.tsconfigDirectory,
- allowJs: true
- };
- this.program = tsMorph.ts.createProgram(this.files, transpileOptions, compilerHost(transpileOptions));
- this.typeChecker = this.program.getTypeChecker();
- this.classHelper = new ClassHelper(this.typeChecker);
- this.componentHelper = new ComponentHelper(this.classHelper);
- }
- return FrameworkDependencies;
- }());
- var CodeGenerator = /** @class */ (function () {
- function CodeGenerator() {
- }
- CodeGenerator.prototype.generate = function (node) {
- return this.visitAndRecognize(node, []).join('');
- };
- CodeGenerator.prototype.visitAndRecognize = function (node, code, depth) {
- var _this = this;
- if (depth === void 0) { depth = 0; }
- this.recognize(node, code);
- node.getChildren().forEach(function (c) { return _this.visitAndRecognize(c, code, depth + 1); });
- return code;
- };
- CodeGenerator.prototype.recognize = function (node, code) {
- var _this = this;
- var conversion = TsKindConversion.find(function (x) { return x.kinds.some(function (z) { return z === node.kind; }); });
- if (conversion) {
- var result = conversion.output(node);
- result.forEach(function (text) { return _this.gen(text, code); });
- }
- };
- CodeGenerator.prototype.gen = function (token, code) {
- if (!token) {
- return;
- }
- if (token === '\n') {
- code.push('');
- }
- else {
- code.push(token);
- }
- };
- return CodeGenerator;
- }());
- var TsKindsToText = /** @class */ (function () {
- function TsKindsToText(output, kinds) {
- this.output = output;
- this.kinds = kinds;
- }
- return TsKindsToText;
- }());
- var TsKindConversion = [
- new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [tsMorph.SyntaxKind.FirstLiteralToken, tsMorph.SyntaxKind.Identifier]),
- new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [tsMorph.SyntaxKind.StringLiteral]),
- new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.ArrayLiteralExpression]),
- new TsKindsToText(function (node) { return ['import', ' ']; }, [tsMorph.SyntaxKind.ImportKeyword]),
- new TsKindsToText(function (node) { return ['from', ' ']; }, [tsMorph.SyntaxKind.FromKeyword]),
- new TsKindsToText(function (node) { return ['\n', 'export', ' ']; }, [tsMorph.SyntaxKind.ExportKeyword]),
- new TsKindsToText(function (node) { return ['class', ' ']; }, [tsMorph.SyntaxKind.ClassKeyword]),
- new TsKindsToText(function (node) { return ['this']; }, [tsMorph.SyntaxKind.ThisKeyword]),
- new TsKindsToText(function (node) { return ['constructor']; }, [tsMorph.SyntaxKind.ConstructorKeyword]),
- new TsKindsToText(function (node) { return ['false']; }, [tsMorph.SyntaxKind.FalseKeyword]),
- new TsKindsToText(function (node) { return ['true']; }, [tsMorph.SyntaxKind.TrueKeyword]),
- new TsKindsToText(function (node) { return ['null']; }, [tsMorph.SyntaxKind.NullKeyword]),
- new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.AtToken]),
- new TsKindsToText(function (node) { return ['+']; }, [tsMorph.SyntaxKind.PlusToken]),
- new TsKindsToText(function (node) { return [' => ']; }, [tsMorph.SyntaxKind.EqualsGreaterThanToken]),
- new TsKindsToText(function (node) { return ['(']; }, [tsMorph.SyntaxKind.OpenParenToken]),
- new TsKindsToText(function (node) { return ['{', ' ']; }, [tsMorph.SyntaxKind.ImportClause, tsMorph.SyntaxKind.ObjectLiteralExpression]),
- new TsKindsToText(function (node) { return ['{', '\n']; }, [tsMorph.SyntaxKind.Block]),
- new TsKindsToText(function (node) { return ['}']; }, [tsMorph.SyntaxKind.CloseBraceToken]),
- new TsKindsToText(function (node) { return [')']; }, [tsMorph.SyntaxKind.CloseParenToken]),
- new TsKindsToText(function (node) { return ['[']; }, [tsMorph.SyntaxKind.OpenBracketToken]),
- new TsKindsToText(function (node) { return [']']; }, [tsMorph.SyntaxKind.CloseBracketToken]),
- new TsKindsToText(function (node) { return [';', '\n']; }, [tsMorph.SyntaxKind.SemicolonToken]),
- new TsKindsToText(function (node) { return [',', ' ']; }, [tsMorph.SyntaxKind.CommaToken]),
- new TsKindsToText(function (node) { return [' ', ':', ' ']; }, [tsMorph.SyntaxKind.ColonToken]),
- new TsKindsToText(function (node) { return ['.']; }, [tsMorph.SyntaxKind.DotToken]),
- new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.DoStatement]),
- new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.Decorator]),
- new TsKindsToText(function (node) { return [' = ']; }, [tsMorph.SyntaxKind.FirstAssignment]),
- new TsKindsToText(function (node) { return [' ']; }, [tsMorph.SyntaxKind.FirstPunctuation]),
- new TsKindsToText(function (node) { return ['private', ' ']; }, [tsMorph.SyntaxKind.PrivateKeyword]),
- new TsKindsToText(function (node) { return ['public', ' ']; }, [tsMorph.SyntaxKind.PublicKeyword])
- ];
- var crypto$6 = require('crypto');
- var ComponentDepFactory = /** @class */ (function () {
- function ComponentDepFactory(helper) {
- this.helper = helper;
- }
- ComponentDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
- // console.log(util.inspect(props, { showHidden: true, depth: 10 }));
- var sourceCode = srcFile.getText();
- var hash = crypto$6.createHash('sha512').update(sourceCode).digest('hex');
- var componentDep = {
- name: name,
- id: 'component-' + name + '-' + hash,
- file: file,
- // animations?: string[]; // TODO
- changeDetection: this.helper.getComponentChangeDetection(props, srcFile),
- encapsulation: this.helper.getComponentEncapsulation(props, srcFile),
- entryComponents: this.helper.getComponentEntryComponents(props, srcFile),
- exportAs: this.helper.getComponentExportAs(props, srcFile),
- host: this.helper.getComponentHost(props),
- inputs: this.helper.getComponentInputsMetadata(props, srcFile),
- // interpolation?: string; // TODO waiting doc infos
- moduleId: this.helper.getComponentModuleId(props, srcFile),
- outputs: this.helper.getComponentOutputs(props, srcFile),
- providers: this.helper.getComponentProviders(props, srcFile),
- // queries?: Deps[]; // TODO
- selector: this.helper.getComponentSelector(props, srcFile),
- styleUrls: this.helper.getComponentStyleUrls(props, srcFile),
- styles: this.helper.getComponentStyles(props, srcFile), // TODO fix args
- template: this.helper.getComponentTemplate(props, srcFile),
- templateUrl: this.helper.getComponentTemplateUrl(props, srcFile),
- viewProviders: this.helper.getComponentViewProviders(props, srcFile),
- hostDirectives: __spreadArray([], __read(this.helper.getComponentHostDirectives(props)), false),
- inputsClass: IO.inputs,
- outputsClass: IO.outputs,
- propertiesClass: IO.properties,
- methodsClass: IO.methods,
- deprecated: IO.deprecated,
- deprecationMessage: IO.deprecationMessage,
- hostBindings: IO.hostBindings,
- hostListeners: IO.hostListeners,
- standalone: this.helper.getComponentStandalone(props, srcFile) ? true : false,
- imports: this.helper.getComponentImports(props, srcFile),
- description: IO.description,
- rawdescription: IO.rawdescription,
- type: 'component',
- sourceCode: srcFile.getText(),
- exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText()),
- tag: this.helper.getComponentTag(props, srcFile),
- styleUrl: this.helper.getComponentStyleUrl(props, srcFile),
- shadow: this.helper.getComponentShadow(props, srcFile),
- scoped: this.helper.getComponentScoped(props, srcFile),
- assetsDir: this.helper.getComponentAssetsDir(props, srcFile),
- assetsDirs: this.helper.getComponentAssetsDirs(props, srcFile),
- styleUrlsData: '',
- stylesData: ''
- };
- if (typeof this.helper.getComponentPreserveWhitespaces(props, srcFile) !== 'undefined') {
- componentDep.preserveWhitespaces = this.helper.getComponentPreserveWhitespaces(props, srcFile);
- }
- if (Configuration$1.mainData.disableLifeCycleHooks) {
- componentDep.methodsClass = cleanLifecycleHooksFromMethods(componentDep.methodsClass);
- }
- if (IO.jsdoctags && IO.jsdoctags.length > 0) {
- componentDep.jsdoctags = IO.jsdoctags[0].tags;
- }
- if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
- componentDep.constructorObj = IO.constructor;
- }
- if (IO.extends) {
- componentDep.extends = IO.extends;
- }
- if (IO.implements && IO.implements.length > 0) {
- componentDep.implements = IO.implements;
- }
- if (IO.accessors) {
- componentDep.accessors = IO.accessors;
- }
- if (IO.properties) {
- componentDep.inputsClass = componentDep.inputsClass.concat(this.helper.getInputSignals(IO.properties));
- componentDep.outputsClass = componentDep.outputsClass.concat(this.helper.getOutputSignals(IO.properties));
- }
- return componentDep;
- };
- return ComponentDepFactory;
- }());
- var crypto$5 = require('crypto');
- var ControllerDepFactory = /** @class */ (function () {
- function ControllerDepFactory() {
- }
- ControllerDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
- var sourceCode = srcFile.getText();
- var hash = crypto$5.createHash('sha512').update(sourceCode).digest('hex');
- var infos = {
- name: name,
- id: 'controller-' + name + '-' + hash,
- file: file,
- methodsClass: IO.methods,
- type: 'controller',
- description: IO.description,
- rawdescription: IO.rawdescription,
- sourceCode: srcFile.text,
- deprecated: IO.deprecated,
- deprecationMessage: IO.deprecationMessage
- };
- if (properties && properties.length === 1) {
- if (properties[0].text) {
- infos.prefix = properties[0].text;
- }
- }
- if (IO.extends) {
- infos.extends = IO.extends;
- }
- return infos;
- };
- return ControllerDepFactory;
- }());
- var crypto$4 = require('crypto');
- var DirectiveDepFactory = /** @class */ (function () {
- function DirectiveDepFactory(helper) {
- this.helper = helper;
- }
- DirectiveDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
- var sourceCode = srcFile.getText();
- var hash = crypto$4.createHash('sha512').update(sourceCode).digest('hex');
- var directiveDeps = {
- name: name,
- id: 'directive-' + name + '-' + hash,
- file: file,
- type: 'directive',
- description: IO.description,
- rawdescription: IO.rawdescription,
- sourceCode: srcFile.getText(),
- selector: this.helper.getComponentSelector(props, srcFile),
- providers: this.helper.getComponentProviders(props, srcFile),
- exportAs: this.helper.getComponentExportAs(props, srcFile),
- hostDirectives: __spreadArray([], __read(this.helper.getComponentHostDirectives(props)), false),
- standalone: this.helper.getComponentStandalone(props, srcFile) ? true : false,
- inputsClass: this.helper.getInputSignals(IO.properties).concat(IO.inputs),
- outputsClass: this.helper.getInputSignals(IO.properties).concat(IO.outputs),
- deprecated: IO.deprecated,
- deprecationMessage: IO.deprecationMessage,
- hostBindings: IO.hostBindings,
- hostListeners: IO.hostListeners,
- propertiesClass: IO.properties,
- methodsClass: IO.methods,
- exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText())
- };
- if (Configuration$1.mainData.disableLifeCycleHooks) {
- directiveDeps.methodsClass = cleanLifecycleHooksFromMethods(directiveDeps.methodsClass);
- }
- if (IO.jsdoctags && IO.jsdoctags.length > 0) {
- directiveDeps.jsdoctags = IO.jsdoctags[0].tags;
- }
- if (IO.extends) {
- directiveDeps.extends = IO.extends;
- }
- if (IO.implements && IO.implements.length > 0) {
- directiveDeps.implements = IO.implements;
- }
- if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
- directiveDeps.constructorObj = IO.constructor;
- }
- if (IO.accessors) {
- directiveDeps.accessors = IO.accessors;
- }
- return directiveDeps;
- };
- return DirectiveDepFactory;
- }());
- var JsDocHelper = /** @class */ (function () {
- function JsDocHelper() {
- }
- JsDocHelper.prototype.hasJSDocInternalTag = function (filename, sourceFile, node) {
- if (typeof sourceFile.statements !== 'undefined') {
- return this.checkStatements(sourceFile.statements, node);
- }
- return false;
- };
- JsDocHelper.prototype.checkStatements = function (statements, node) {
- var _this = this;
- return statements.some(function (x) { return _this.checkStatement(x, node); });
- };
- JsDocHelper.prototype.checkStatement = function (statement, node) {
- if (statement.pos === node.pos && statement.end === node.end) {
- if (node.jsDoc && node.jsDoc.length > 0) {
- return this.checkJsDocs(node.jsDoc);
- }
- }
- return false;
- };
- JsDocHelper.prototype.checkJsDocs = function (jsDocs) {
- var _this = this;
- return jsDocs
- .filter(function (x) { return x.tags && x.tags.length > 0; })
- .some(function (x) { return _this.checkJsDocTags(x.tags); });
- };
- JsDocHelper.prototype.checkJsDocTags = function (tags) {
- return tags.some(function (x) { return x.tagName && x.tagName.text === 'internal'; });
- };
- return JsDocHelper;
- }());
- var ModuleHelper = /** @class */ (function () {
- function ModuleHelper(cache, symbolHelper) {
- if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
- this.cache = cache;
- this.symbolHelper = symbolHelper;
- }
- ModuleHelper.prototype.getModuleProviders = function (props, srcFile) {
- var _this = this;
- return this.symbolHelper
- .getSymbolDeps(props, 'providers', srcFile)
- .map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
- };
- ModuleHelper.prototype.getModuleControllers = function (props, srcFile) {
- var _this = this;
- return this.symbolHelper
- .getSymbolDeps(props, 'controllers', srcFile)
- .map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
- };
- ModuleHelper.prototype.getModuleDeclarations = function (props, srcFile) {
- var _this = this;
- return this.symbolHelper.getSymbolDeps(props, 'declarations', srcFile).map(function (name) {
- var component = _this.cache.get(name);
- if (component) {
- return component;
- }
- return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
- });
- };
- ModuleHelper.prototype.getModuleEntryComponents = function (props, srcFile) {
- var _this = this;
- return this.symbolHelper.getSymbolDeps(props, 'entryComponents', srcFile).map(function (name) {
- var component = _this.cache.get(name);
- if (component) {
- return component;
- }
- return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
- });
- };
- ModuleHelper.prototype.cleanImportForRootForChild = function (name) {
- var nsModule = name.split('.');
- if (nsModule.length > 0) {
- name = nsModule[0];
- }
- return name;
- };
- ModuleHelper.prototype.getModuleImports = function (props, srcFile) {
- var _this = this;
- return this.symbolHelper
- .getSymbolDeps(props, 'imports', srcFile)
- .map(function (name) { return _this.cleanImportForRootForChild(name); })
- .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
- };
- ModuleHelper.prototype.getModuleExports = function (props, srcFile) {
- var _this = this;
- return this.symbolHelper
- .getSymbolDeps(props, 'exports', srcFile)
- .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
- };
- ModuleHelper.prototype.getModuleImportsRaw = function (props, srcFile) {
- return this.symbolHelper.getSymbolDepsRaw(props, 'imports');
- };
- ModuleHelper.prototype.getModuleId = function (props, srcFile) {
- var _id = this.symbolHelper.getSymbolDeps(props, 'id', srcFile), id;
- if (_id.length === 1) {
- id = _id[0];
- }
- return id;
- };
- ModuleHelper.prototype.getModuleSchemas = function (props, srcFile) {
- var schemas = this.symbolHelper.getSymbolDeps(props, 'schemas', srcFile);
- return schemas;
- };
- ModuleHelper.prototype.getModuleBootstrap = function (props, srcFile) {
- var _this = this;
- return this.symbolHelper
- .getSymbolDeps(props, 'bootstrap', srcFile)
- .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
- };
- return ModuleHelper;
- }());
- var crypto$3 = require('crypto');
- var ModuleDepFactory = /** @class */ (function () {
- function ModuleDepFactory(moduleHelper) {
- this.moduleHelper = moduleHelper;
- }
- ModuleDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
- var sourceCode = srcFile.getText();
- var hash = crypto$3.createHash('sha512').update(sourceCode).digest('hex');
- return {
- name: name,
- id: 'module-' + name + '-' + hash,
- file: file,
- ngid: this.moduleHelper.getModuleId(properties, srcFile),
- providers: this.moduleHelper.getModuleProviders(properties, srcFile),
- declarations: this.moduleHelper.getModuleDeclarations(properties, srcFile),
- controllers: this.moduleHelper.getModuleControllers(properties, srcFile),
- entryComponents: this.moduleHelper.getModuleEntryComponents(properties, srcFile),
- imports: this.moduleHelper.getModuleImports(properties, srcFile),
- exports: this.moduleHelper.getModuleExports(properties, srcFile),
- schemas: this.moduleHelper.getModuleSchemas(properties, srcFile),
- bootstrap: this.moduleHelper.getModuleBootstrap(properties, srcFile),
- type: 'module',
- rawdescription: IO.rawdescription,
- methods: IO.methods,
- description: IO.description,
- sourceCode: srcFile.text,
- deprecated: IO.deprecated,
- deprecationMessage: IO.deprecationMessage
- };
- };
- return ModuleDepFactory;
- }());
- var crypto$2 = require('crypto');
- var EntityDepFactory = /** @class */ (function () {
- function EntityDepFactory() {
- }
- EntityDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
- var sourceCode = srcFile.getText();
- var hash = crypto$2.createHash('sha512').update(sourceCode).digest('hex');
- var infos = {
- name: name,
- id: 'controller-' + name + '-' + hash,
- file: file,
- type: 'entity',
- description: IO.description,
- rawdescription: IO.rawdescription,
- sourceCode: srcFile.text,
- deprecated: IO.deprecated,
- deprecationMessage: IO.deprecationMessage,
- properties: IO.properties
- };
- return infos;
- };
- return EntityDepFactory;
- }());
- var crypto$1 = require('crypto');
- var project = new tsMorph.Project();
- // TypeScript reference : https://github.com/Microsoft/TypeScript/blob/master/lib/typescript.d.ts
- var AngularDependencies = /** @class */ (function (_super) {
- __extends(AngularDependencies, _super);
- function AngularDependencies(files, options) {
- var _this = _super.call(this, files, options) || this;
- _this.cache = new ComponentCache();
- _this.moduleHelper = new ModuleHelper(_this.cache);
- _this.jsDocHelper = new JsDocHelper();
- _this.symbolHelper = new SymbolHelper();
- _this.jsdocParserUtil = new JsdocParserUtil();
- return _this;
- }
- AngularDependencies.prototype.getDependencies = function () {
- var _this = this;
- var deps = {
- aliases: {},
- modules: [],
- modulesForGraph: [],
- components: [],
- controllers: [],
- entities: [],
- injectables: [],
- interceptors: [],
- guards: [],
- pipes: [],
- directives: [],
- routes: [],
- classes: [],
- interfaces: [],
- typescriptImports: [],
- miscellaneous: {
- variables: [],
- functions: [],
- typealiases: [],
- enumerations: []
- },
- routesTree: undefined
- };
- var sourceFiles = this.program.getSourceFiles() || [];
- RouterParserUtil$1.scannedFiles = sourceFiles;
- sourceFiles.map(function (file) {
- var filePath = file.fileName;
- if (path__namespace.extname(filePath) === '.ts' || path__namespace.extname(filePath) === '.tsx') {
- if (!Configuration$1.mainData.angularJSProject && path__namespace.extname(filePath) === '.js') {
- logger.info('parsing', filePath);
- _this.getSourceFileDecorators(file, deps);
- }
- else {
- if (filePath.lastIndexOf('.d.ts') === -1 &&
- filePath.lastIndexOf('spec.ts') === -1) {
- logger.info('parsing', filePath);
- _this.getTypescriptExportsAliases(file, deps);
- _this.getTypescriptImportsAliases(file, deps);
- _this.getSourceFileDecorators(file, deps);
- }
- }
- }
- return deps;
- });
- // End of file scanning
- // Try merging inside the same file declarated variables & modules with imports | exports | declarations | providers
- if (deps.miscellaneous.variables.length > 0) {
- deps.miscellaneous.variables.forEach(function (_variable) {
- var newVar = [];
- // link ...VAR to VAR values, recursively
- (function (_var, _newVar) {
- // getType pr reconstruire....
- var elementsMatcher = function (variabelToReplace) {
- if (variabelToReplace.initializer) {
- if (variabelToReplace.initializer.elements) {
- if (variabelToReplace.initializer.elements.length > 0) {
- variabelToReplace.initializer.elements.forEach(function (element) {
- // Direct value -> Kind 79
- if (element.text &&
- element.kind === tsMorph.SyntaxKind.Identifier) {
- newVar.push({
- name: element.text,
- type: _this.symbolHelper.getType(element.text)
- });
- }
- // if _variable is ArrayLiteralExpression 203
- // and has SpreadElements in his elements
- // merge them
- if (element.kind === tsMorph.SyntaxKind.SpreadElement &&
- element.expression) {
- var el = deps.miscellaneous.variables.find(function (variable) {
- return variable.name === element.expression.text;
- });
- if (el) {
- elementsMatcher(el);
- }
- }
- });
- }
- }
- }
- };
- elementsMatcher(_var);
- })(_variable);
- var onLink = function (mod) {
- var process = function (initialArray, _var) {
- var indexToClean = 0;
- var found = false;
- var findVariableInArray = function (el, index) {
- if (el.name === _var.name) {
- indexToClean = index;
- found = true;
- }
- };
- initialArray.forEach(findVariableInArray);
- // Clean indexes to replace
- if (found) {
- initialArray.splice(indexToClean, 1);
- // Add variable
- newVar.forEach(function (newEle) {
- if (typeof ___namespace.find(initialArray, { name: newEle.name }) ===
- 'undefined') {
- initialArray.push(newEle);
- }
- });
- }
- };
- process(mod.imports, _variable);
- process(mod.exports, _variable);
- process(mod.controllers, _variable);
- process(mod.declarations, _variable);
- process(mod.providers, _variable);
- };
- deps.modules.forEach(onLink);
- deps.modulesForGraph.forEach(onLink);
- });
- }
- /**
- * If one thing extends another, merge them, only for internal sources
- * - classes
- * - components
- * - injectables
- * - directives
- * for
- * - inputs
- * - outputs
- * - properties
- * - methods
- */
- deps = ExtendsMerger$1.merge(deps);
- // RouterParserUtil.printModulesRoutes();
- // RouterParserUtil.printRoutes();
- if (!Configuration$1.mainData.disableRoutesGraph) {
- RouterParserUtil$1.linkModulesAndRoutes();
- RouterParserUtil$1.constructModulesTree();
- deps.routesTree = RouterParserUtil$1.constructRoutesTree();
- }
- return deps;
- };
- AngularDependencies.prototype.processClass = function (node, file, srcFile, outputSymbols, fileBody, astFile) {
- var name = this.getSymboleName(node);
- var IO = this.getClassIO(file, srcFile, node, fileBody, astFile);
- var sourceCode = srcFile.getText();
- var hash = crypto$1.createHash('sha512').update(sourceCode).digest('hex');
- var deps = {
- name: name,
- id: 'class-' + name + '-' + hash,
- file: file,
- deprecated: IO.deprecated,
- deprecationMessage: IO.deprecationMessage,
- type: 'class',
- sourceCode: srcFile.getText()
- };
- var excludeFromClassArray = false;
- if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
- deps.constructorObj = IO.constructor;
- }
- if (IO.inputs) {
- deps.inputsClass = IO.inputs;
- }
- if (IO.outputs) {
- deps.outputsClass = IO.outputs;
- }
- if (IO.properties) {
- deps.properties = IO.properties;
- deps.inputsClass = deps.inputsClass
- ? deps.inputsClass.concat(this.componentHelper.getInputSignals(IO.properties))
- : this.componentHelper.getInputSignals(IO.properties);
- deps.outputsClass = deps.outputsClass
- ? deps.outputsClass.concat(this.componentHelper.getOutputSignals(IO.properties))
- : this.componentHelper.getOutputSignals(IO.properties);
- }
- if (IO.description) {
- deps.description = IO.description;
- }
- if (IO.rawdescription) {
- deps.rawdescription = IO.rawdescription;
- }
- if (IO.methods) {
- deps.methods = IO.methods;
- }
- if (IO.indexSignatures) {
- deps.indexSignatures = IO.indexSignatures;
- }
- if (IO.extends) {
- deps.extends = IO.extends;
- }
- if (IO.jsdoctags && IO.jsdoctags.length > 0) {
- deps.jsdoctags = IO.jsdoctags[0].tags;
- }
- if (IO.accessors) {
- deps.accessors = IO.accessors;
- }
- if (IO.hostBindings) {
- deps.hostBindings = IO.hostBindings;
- }
- if (IO.hostListeners) {
- deps.hostListeners = IO.hostListeners;
- }
- if (Configuration$1.mainData.disableLifeCycleHooks) {
- deps.methods = cleanLifecycleHooksFromMethods(deps.methods);
- }
- if (IO.implements && IO.implements.length > 0) {
- deps.implements = IO.implements;
- if (this.isGuard(IO.implements)) {
- // We don't want the Guard to show up in the Classes menu
- excludeFromClassArray = true;
- deps.type = 'guard';
- outputSymbols.guards.push(deps);
- }
- }
- if (typeof IO.ignore === 'undefined') {
- this.debug(deps);
- if (!excludeFromClassArray) {
- outputSymbols.classes.push(deps);
- }
- }
- else {
- this.ignore(deps);
- }
- };
- AngularDependencies.prototype.getTypescriptImportsAliases = function (initialSrcFile, outputSymbols) {
- var astFile = typeof project.getSourceFile(initialSrcFile.fileName) !== 'undefined'
- ? project.getSourceFile(initialSrcFile.fileName)
- : project.addSourceFileAtPath(initialSrcFile.fileName);
- if (astFile) {
- var importDeclarations = astFile.getImportDeclarations();
- if (importDeclarations && importDeclarations.length > 0) {
- importDeclarations.forEach(function (importDeclaration) {
- var namedImports = importDeclaration.getNamedImports();
- if (namedImports && namedImports.length > 0) {
- namedImports.forEach(function (namedImport) {
- if (namedImport.getAliasNode()) {
- if (outputSymbols.aliases.hasOwnProperty(namedImport.getName())) {
- outputSymbols.aliases[namedImport.getName()].push(namedImport.getAliasNode().getText());
- }
- else {
- outputSymbols.aliases[namedImport.getName()] = [
- namedImport.getAliasNode().getText()
- ];
- }
- }
- });
- }
- });
- }
- }
- };
- AngularDependencies.prototype.getTypescriptExportsAliases = function (initialSrcFile, outputSymbols) {
- var astFile = typeof project.getSourceFile(initialSrcFile.fileName) !== 'undefined'
- ? project.getSourceFile(initialSrcFile.fileName)
- : project.addSourceFileAtPath(initialSrcFile.fileName);
- if (astFile) {
- var exportDeclarations = astFile.getExportDeclarations();
- if (exportDeclarations && exportDeclarations.length > 0) {
- exportDeclarations.forEach(function (exportDeclaration) {
- var hasNamedExports = exportDeclaration.hasNamedExports();
- if (hasNamedExports) {
- var namedExports = exportDeclaration.getNamedExports();
- if (namedExports && namedExports.length > 0) {
- namedExports.forEach(function (namedExport) {
- if (namedExport.getAliasNode()) {
- if (outputSymbols.aliases.hasOwnProperty(namedExport.getName())) {
- outputSymbols.aliases[namedExport.getName()].push(namedExport.getAliasNode().getText());
- }
- else {
- outputSymbols.aliases[namedExport.getName()] = [
- namedExport.getAliasNode().getText()
- ];
- }
- }
- });
- }
- }
- });
- }
- }
- };
- AngularDependencies.prototype.getSourceFileDecorators = function (initialSrcFile, outputSymbols) {
- var _this = this;
- var cleaner = (process.cwd() + path__namespace.sep).replace(/\\/g, '/');
- var fileName = initialSrcFile.fileName.replace(cleaner, '');
- var scannedFile = initialSrcFile;
- // Search in file for variable statement as routes definitions
- var astFile = typeof project.getSourceFile(initialSrcFile.fileName) !== 'undefined'
- ? project.getSourceFile(initialSrcFile.fileName)
- : project.addSourceFileAtPath(initialSrcFile.fileName);
- var variableRoutesStatements = astFile.getVariableStatements();
- var hasRoutesStatements = false;
- if (variableRoutesStatements.length > 0) {
- // Clean file for spread and dynamics inside routes definitions
- variableRoutesStatements.forEach(function (s) {
- var variableDeclarations = s.getDeclarations();
- var len = variableDeclarations.length;
- var i = 0;
- for (i; i < len; i++) {
- if (variableDeclarations[i].compilerNode.type) {
- if (variableDeclarations[i].compilerNode.type.typeName &&
- variableDeclarations[i].compilerNode.type.typeName.text === 'Routes') {
- hasRoutesStatements = true;
- }
- }
- }
- });
- }
- if (hasRoutesStatements && !Configuration$1.mainData.disableRoutesGraph) {
- // Clean file for spread and dynamics inside routes definitions
- logger.info('Analysing routes definitions and clean them if necessary');
- // scannedFile = RouterParserUtil.cleanFileIdentifiers(astFile).compilerNode;
- RouterParserUtil$1.cleanFileSpreads(astFile);
- scannedFile = RouterParserUtil$1.cleanCallExpressions(astFile).compilerNode;
- scannedFile = RouterParserUtil$1.cleanFileDynamics(astFile).compilerNode;
- scannedFile.kind = tsMorph.SyntaxKind.SourceFile;
- }
- tsMorph.ts.forEachChild(scannedFile, function (initialNode) {
- if (_this.jsDocHelper.hasJSDocInternalTag(fileName, scannedFile, initialNode) &&
- Configuration$1.mainData.disableInternal) {
- return;
- }
- var parseNode = function (file, srcFile, node, fileBody, astFile) {
- var sourceCode = srcFile.getText();
- var hash = crypto$1.createHash('sha512').update(sourceCode).digest('hex');
- if (nodeHasDecorator(node)) {
- var classWithCustomDecorator_1 = false;
- var nodeDecorators_1 = getNodeDecorators(node);
- var visitDecorator = function (visitedDecorator, index) {
- var deps;
- var name = _this.getSymboleName(node);
- var props = _this.findProperties(visitedDecorator, srcFile);
- var IO = _this.componentHelper.getComponentIO(file, srcFile, node, fileBody, astFile);
- if (_this.isModule(visitedDecorator)) {
- var moduleDep = new ModuleDepFactory(_this.moduleHelper).create(file, srcFile, name, props, IO);
- if (RouterParserUtil$1.hasRouterModuleInImports(moduleDep.imports)) {
- RouterParserUtil$1.addModuleWithRoutes(name, _this.moduleHelper.getModuleImportsRaw(props, srcFile), file);
- }
- deps = moduleDep;
- if (typeof IO.ignore === 'undefined') {
- RouterParserUtil$1.addModule(name, moduleDep.imports);
- outputSymbols.modules.push(moduleDep);
- outputSymbols.modulesForGraph.push(moduleDep);
- }
- }
- else if (_this.isComponent(visitedDecorator)) {
- if (props.length === 0) {
- return;
- }
- var componentDep = new ComponentDepFactory(_this.componentHelper).create(file, srcFile, name, props, IO);
- deps = componentDep;
- if (typeof IO.ignore === 'undefined') {
- ComponentsTreeEngine$1.addComponent(componentDep);
- outputSymbols.components.push(componentDep);
- }
- }
- else if (_this.isController(visitedDecorator)) {
- var controllerDep = new ControllerDepFactory().create(file, srcFile, name, props, IO);
- deps = controllerDep;
- if (typeof IO.ignore === 'undefined') {
- outputSymbols.controllers.push(controllerDep);
- }
- }
- else if (_this.isEntity(visitedDecorator)) {
- var entityDep = new EntityDepFactory().create(file, srcFile, name, props, IO);
- deps = entityDep;
- if (typeof IO.ignore === 'undefined') {
- outputSymbols.entities.push(entityDep);
- }
- }
- else if (_this.isInjectable(visitedDecorator)) {
- var injectableDeps = {
- name: name,
- id: 'injectable-' + name + '-' + hash,
- file: file,
- properties: IO.properties,
- methods: IO.methods,
- deprecated: IO.deprecated,
- deprecationMessage: IO.deprecationMessage,
- description: IO.description,
- rawdescription: IO.rawdescription,
- sourceCode: srcFile.getText(),
- exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
- };
- if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
- injectableDeps.constructorObj = IO.constructor;
- }
- if (IO.jsdoctags && IO.jsdoctags.length > 0) {
- injectableDeps.jsdoctags = IO.jsdoctags[0].tags;
- }
- if (IO.accessors) {
- injectableDeps.accessors = IO.accessors;
- }
- if (IO.extends) {
- injectableDeps.extends = IO.extends;
- }
- if (Configuration$1.mainData.disableLifeCycleHooks) {
- injectableDeps.methods = cleanLifecycleHooksFromMethods(injectableDeps.methods);
- }
- deps = injectableDeps;
- if (typeof IO.ignore === 'undefined') {
- if (___namespace.includes(IO.implements, 'HttpInterceptor')) {
- injectableDeps.type = 'interceptor';
- outputSymbols.interceptors.push(injectableDeps);
- }
- else if (_this.isGuard(IO.implements)) {
- injectableDeps.type = 'guard';
- outputSymbols.guards.push(injectableDeps);
- }
- else {
- injectableDeps.type = 'injectable';
- _this.addNewEntityInStore(injectableDeps, outputSymbols.injectables);
- }
- }
- }
- else if (_this.isPipe(visitedDecorator)) {
- var pipeDeps = {
- name: name,
- id: 'pipe-' + name + '-' + hash,
- file: file,
- type: 'pipe',
- deprecated: IO.deprecated,
- deprecationMessage: IO.deprecationMessage,
- description: IO.description,
- rawdescription: IO.rawdescription,
- properties: IO.properties,
- methods: IO.methods,
- standalone: _this.componentHelper.getComponentStandalone(props, srcFile)
- ? true
- : false,
- pure: _this.componentHelper.getComponentPure(props, srcFile),
- ngname: _this.componentHelper.getComponentName(props, srcFile),
- sourceCode: srcFile.getText(),
- exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
- };
- if (Configuration$1.mainData.disableLifeCycleHooks) {
- pipeDeps.methods = cleanLifecycleHooksFromMethods(pipeDeps.methods);
- }
- if (IO.jsdoctags && IO.jsdoctags.length > 0) {
- pipeDeps.jsdoctags = IO.jsdoctags[0].tags;
- }
- deps = pipeDeps;
- if (typeof IO.ignore === 'undefined') {
- outputSymbols.pipes.push(pipeDeps);
- }
- }
- else if (_this.isDirective(visitedDecorator)) {
- var directiveDeps = new DirectiveDepFactory(_this.componentHelper).create(file, srcFile, name, props, IO);
- deps = directiveDeps;
- if (typeof IO.ignore === 'undefined') {
- outputSymbols.directives.push(directiveDeps);
- }
- }
- else {
- var hasMultipleDecoratorsWithInternalOne = _this.hasInternalDecorator(nodeDecorators_1);
- // Just a class
- if (!classWithCustomDecorator_1 &&
- !hasMultipleDecoratorsWithInternalOne) {
- classWithCustomDecorator_1 = true;
- _this.processClass(node, file, srcFile, outputSymbols, fileBody);
- }
- }
- _this.cache.set(name, deps);
- if (typeof IO.ignore === 'undefined') {
- _this.debug(deps);
- }
- else {
- _this.ignore(deps);
- }
- };
- var filterByDecorators = function (filteredNode) {
- if (filteredNode.expression && filteredNode.expression.expression) {
- var _test = /(NgModule|Component|Injectable|Pipe|Directive)/.test(filteredNode.expression.expression.text);
- if (!_test && tsMorph.ts.isClassDeclaration(node)) {
- _test = true;
- }
- return _test;
- }
- if (tsMorph.ts.isClassDeclaration(node)) {
- return true;
- }
- return false;
- };
- nodeDecorators_1.filter(filterByDecorators).forEach(visitDecorator);
- }
- else if (node.symbol) {
- if (node.symbol.flags === tsMorph.ts.SymbolFlags.Class) {
- _this.processClass(node, file, srcFile, outputSymbols, fileBody, astFile);
- }
- else if (node.symbol.flags === tsMorph.ts.SymbolFlags.Interface) {
- var name = _this.getSymboleName(node);
- var IO = _this.getInterfaceIO(file, srcFile, node, fileBody, astFile);
- var interfaceDeps = {
- name: name,
- id: 'interface-' + name + '-' + hash,
- file: file,
- deprecated: IO.deprecated,
- deprecationMessage: IO.deprecationMessage,
- type: 'interface',
- sourceCode: srcFile.getText()
- };
- if (IO.properties) {
- interfaceDeps.properties = IO.properties;
- }
- if (IO.indexSignatures) {
- interfaceDeps.indexSignatures = IO.indexSignatures;
- }
- if (IO.kind) {
- interfaceDeps.kind = IO.kind;
- }
- if (IO.description) {
- interfaceDeps.description = IO.description;
- interfaceDeps.rawdescription = IO.rawdescription;
- }
- if (IO.methods) {
- interfaceDeps.methods = IO.methods;
- }
- if (IO.extends) {
- interfaceDeps.extends = IO.extends;
- }
- if (typeof IO.ignore === 'undefined') {
- _this.debug(interfaceDeps);
- outputSymbols.interfaces.push(interfaceDeps);
- }
- else {
- _this.ignore(interfaceDeps);
- }
- }
- else if (tsMorph.ts.isFunctionDeclaration(node)) {
- var infos = _this.visitFunctionDeclaration(node);
- var name = infos.name;
- var deprecated = infos.deprecated;
- var deprecationMessage = infos.deprecationMessage;
- var functionDep = {
- name: name,
- file: file,
- ctype: 'miscellaneous',
- subtype: 'function',
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
- };
- if (infos.args) {
- functionDep.args = infos.args;
- }
- if (infos.returnType) {
- functionDep.returnType = infos.returnType;
- }
- if (infos.jsdoctags && infos.jsdoctags.length > 0) {
- functionDep.jsdoctags = infos.jsdoctags;
- }
- if (typeof infos.ignore === 'undefined') {
- if (!(_this.hasPrivateJSDocTag(functionDep.jsdoctags) &&
- Configuration$1.mainData.disablePrivate)) {
- _this.debug(functionDep);
- outputSymbols.miscellaneous.functions.push(functionDep);
- }
- }
- }
- else if (tsMorph.ts.isEnumDeclaration(node)) {
- var infos = _this.visitEnumDeclaration(node);
- var name = infos.name;
- var deprecated = infos.deprecated;
- var deprecationMessage = infos.deprecationMessage;
- var enumDeps = {
- name: name,
- childs: infos.members,
- ctype: 'miscellaneous',
- subtype: 'enum',
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
- file: file
- };
- if (!isIgnore(node)) {
- _this.debug(enumDeps);
- outputSymbols.miscellaneous.enumerations.push(enumDeps);
- }
- }
- else if (tsMorph.ts.isTypeAliasDeclaration(node)) {
- var infos = _this.visitTypeDeclaration(node);
- var name = infos.name;
- var deprecated = infos.deprecated;
- var deprecationMessage = infos.deprecationMessage;
- var typeAliasDeps = {
- name: name,
- ctype: 'miscellaneous',
- subtype: 'typealias',
- rawtype: _this.classHelper.visitType(node),
- file: file,
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
- };
- if (node.type) {
- typeAliasDeps.kind = node.type.kind;
- if (typeAliasDeps.rawtype === '') {
- typeAliasDeps.rawtype = _this.classHelper.visitType(node);
- }
- }
- if (typeAliasDeps.kind &&
- typeAliasDeps.kind === tsMorph.SyntaxKind.TemplateLiteralType &&
- node.type) {
- typeAliasDeps.rawtype = srcFile.text.substring(node.type.pos, node.type.end);
- }
- if (!isIgnore(node)) {
- outputSymbols.miscellaneous.typealiases.push(typeAliasDeps);
- }
- if (typeof infos.ignore === 'undefined') {
- _this.debug(typeAliasDeps);
- }
- }
- else if (tsMorph.ts.isModuleDeclaration(node)) {
- if (node.body) {
- if (node.body.statements && node.body.statements.length > 0) {
- node.body.statements.forEach(function (statement) {
- return parseNode(file, srcFile, statement, node.body, astFile);
- });
- }
- }
- }
- }
- else {
- var IO = _this.getRouteIO(file, srcFile, node);
- if (IO.routes) {
- var newRoutes = void 0;
- try {
- newRoutes = RouterParserUtil$1.cleanRawRouteParsed(IO.routes);
- }
- catch (e) {
- // tslint:disable-next-line:max-line-length
- logger.error('Routes parsing error, maybe a trailing comma or an external variable, trying to fix that later after sources scanning.');
- newRoutes = IO.routes.replace(/ /gm, '');
- RouterParserUtil$1.addIncompleteRoute({
- data: newRoutes,
- file: file
- });
- return true;
- }
- outputSymbols.routes = __spreadArray(__spreadArray([], __read(outputSymbols.routes), false), __read(newRoutes), false);
- }
- if (tsMorph.ts.isClassDeclaration(node)) {
- _this.processClass(node, file, srcFile, outputSymbols, fileBody);
- }
- if (tsMorph.ts.isExpressionStatement(node) || tsMorph.ts.isIfStatement(node)) {
- var bootstrapModuleReference = 'bootstrapModule';
- // Find the root module with bootstrapModule call
- // 1. find a simple call : platformBrowserDynamic().bootstrapModule(AppModule);
- // 2. or inside a call :
- // () => {
- // platformBrowserDynamic().bootstrapModule(AppModule);
- // });
- // 3. with a catch : platformBrowserDynamic().bootstrapModule(AppModule).catch(error => console.error(error));
- // 4. with parameters : platformBrowserDynamic().bootstrapModule(AppModule, {}).catch(error => console.error(error));
- // Find recusively in expression nodes one with name 'bootstrapModule'
- var rootModule_1;
- var resultNode = void 0;
- if (srcFile.text.indexOf(bootstrapModuleReference) !== -1) {
- if (node.expression) {
- resultNode = _this.findExpressionByNameInExpressions(node.expression, 'bootstrapModule');
- }
- if (typeof node.thenStatement !== 'undefined') {
- if (node.thenStatement.statements &&
- node.thenStatement.statements.length > 0) {
- var firstStatement = node.thenStatement.statements[0];
- resultNode = _this.findExpressionByNameInExpressions(firstStatement.expression, 'bootstrapModule');
- }
- }
- if (!resultNode) {
- if (node.expression &&
- node.expression.arguments &&
- node.expression.arguments.length > 0) {
- resultNode = _this.findExpressionByNameInExpressionArguments(node.expression.arguments, 'bootstrapModule');
- }
- }
- if (resultNode) {
- if (resultNode.arguments.length > 0) {
- ___namespace.forEach(resultNode.arguments, function (argument) {
- if (argument.text) {
- rootModule_1 = argument.text;
- }
- });
- }
- if (rootModule_1) {
- RouterParserUtil$1.setRootModule(rootModule_1);
- }
- }
- }
- }
- if (tsMorph.ts.isVariableStatement(node) && !RouterParserUtil$1.isVariableRoutes(node)) {
- var isDestructured = false;
- // Check for destructuring array
- var nodeVariableDeclarations = node.declarationList.declarations;
- if (nodeVariableDeclarations) {
- if (nodeVariableDeclarations.length > 0) {
- if (nodeVariableDeclarations[0].name &&
- nodeVariableDeclarations[0].name.kind ===
- tsMorph.SyntaxKind.ArrayBindingPattern) {
- isDestructured = true;
- }
- }
- }
- var visitVariableNode = function (variableNode) {
- var infos = _this.visitVariableDeclaration(variableNode);
- if (infos) {
- var name = infos.name;
- var deprecated = infos.deprecated;
- var deprecationMessage = infos.deprecationMessage;
- var deps = {
- name: name,
- ctype: 'miscellaneous',
- subtype: 'variable',
- file: file,
- deprecated: deprecated,
- deprecationMessage: deprecationMessage
- };
- deps.type = infos.type ? infos.type : '';
- if (infos.defaultValue) {
- deps.defaultValue = infos.defaultValue;
- }
- if (infos.initializer) {
- deps.initializer = infos.initializer;
- }
- if (variableNode.jsDoc &&
- variableNode.jsDoc.length > 0 &&
- variableNode.jsDoc[0].comment) {
- var rawDescription = _this.jsdocParserUtil.parseJSDocNode(variableNode.jsDoc[0]);
- deps.rawdescription = rawDescription;
- deps.description = markedAcl(rawDescription);
- }
- if (isModuleWithProviders(variableNode)) {
- var routingInitializer = getModuleWithProviders(variableNode);
- RouterParserUtil$1.addModuleWithRoutes(name, [routingInitializer], file);
- RouterParserUtil$1.addModule(name, [routingInitializer]);
- }
- if (!isIgnore(variableNode)) {
- _this.debug(deps);
- outputSymbols.miscellaneous.variables.push(deps);
- }
- }
- };
- if (isDestructured) {
- if (nodeVariableDeclarations[0].name.elements) {
- var destructuredVariables = nodeVariableDeclarations[0].name.elements;
- for (var i = 0; i < destructuredVariables.length; i++) {
- var destructuredVariable = destructuredVariables[i];
- var name = destructuredVariable.name
- ? destructuredVariable.name.escapedText
- : '';
- var deps = {
- name: name,
- ctype: 'miscellaneous',
- subtype: 'variable',
- file: file
- };
- if (nodeVariableDeclarations[0].initializer) {
- if (nodeVariableDeclarations[0].initializer.elements) {
- deps.initializer =
- nodeVariableDeclarations[0].initializer.elements[i];
- }
- deps.defaultValue = deps.initializer
- ? _this.classHelper.stringifyDefaultValue(deps.initializer)
- : undefined;
- }
- if (!isIgnore(destructuredVariables[i])) {
- _this.debug(deps);
- outputSymbols.miscellaneous.variables.push(deps);
- }
- }
- }
- }
- else {
- visitVariableNode(node);
- }
- }
- if (tsMorph.ts.isTypeAliasDeclaration(node)) {
- var infos = _this.visitTypeDeclaration(node);
- var name = infos.name;
- var deprecated = infos.deprecated;
- var deprecationMessage = infos.deprecationMessage;
- var deps = {
- name: name,
- ctype: 'miscellaneous',
- subtype: 'typealias',
- rawtype: _this.classHelper.visitType(node),
- file: file,
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
- };
- if (node.type) {
- deps.kind = node.type.kind;
- }
- if (deps.kind &&
- deps.kind === tsMorph.SyntaxKind.TemplateLiteralType &&
- node.type) {
- deps.rawtype = srcFile.text.substring(node.type.pos, node.type.end);
- }
- if (!isIgnore(node)) {
- _this.debug(deps);
- outputSymbols.miscellaneous.typealiases.push(deps);
- }
- }
- if (tsMorph.ts.isFunctionDeclaration(node)) {
- var infos = _this.visitFunctionDeclaration(node);
- var name = infos.name;
- var deprecated = infos.deprecated;
- var deprecationMessage = infos.deprecationMessage;
- var functionDep = {
- name: name,
- ctype: 'miscellaneous',
- subtype: 'function',
- file: file,
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
- };
- if (infos.args) {
- functionDep.args = infos.args;
- }
- if (infos.returnType) {
- functionDep.returnType = infos.returnType;
- }
- if (infos.jsdoctags && infos.jsdoctags.length > 0) {
- functionDep.jsdoctags = infos.jsdoctags;
- }
- if (typeof infos.ignore === 'undefined') {
- if (!(_this.hasPrivateJSDocTag(functionDep.jsdoctags) &&
- Configuration$1.mainData.disablePrivate)) {
- _this.debug(functionDep);
- outputSymbols.miscellaneous.functions.push(functionDep);
- }
- }
- }
- if (tsMorph.ts.isEnumDeclaration(node)) {
- var infos = _this.visitEnumDeclaration(node);
- var name = infos.name;
- var deprecated = infos.deprecated;
- var deprecationMessage = infos.deprecationMessage;
- var enumDeps = {
- name: name,
- childs: infos.members,
- ctype: 'miscellaneous',
- subtype: 'enum',
- deprecated: deprecated,
- deprecationMessage: deprecationMessage,
- description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
- file: file
- };
- if (!isIgnore(node)) {
- _this.debug(enumDeps);
- outputSymbols.miscellaneous.enumerations.push(enumDeps);
- }
- }
- }
- };
- parseNode(fileName, scannedFile, initialNode, null, astFile);
- });
- };
- /**
- * Function to in a specific store an entity, and check before is there is not the same one
- * in that store : same name, id and file
- * @param entity Entity to store
- * @param store Store
- */
- AngularDependencies.prototype.addNewEntityInStore = function (entity, store) {
- var findSameEntityInStore = ___namespace.filter(store, {
- name: entity.name,
- id: entity.id,
- file: entity.file
- });
- if (findSameEntityInStore.length === 0) {
- store.push(entity);
- }
- };
- AngularDependencies.prototype.debug = function (deps) {
- if (deps) {
- logger.debug('found', "".concat(deps.name));
- }
- else {
- return;
- }
- ['imports', 'exports', 'declarations', 'providers', 'bootstrap'].forEach(function (symbols) {
- if (deps[symbols] && deps[symbols].length > 0) {
- logger.debug('', "- ".concat(symbols, ":"));
- deps[symbols]
- .map(function (i) { return i.name; })
- .forEach(function (d) {
- logger.debug('', "\t- ".concat(d));
- });
- }
- });
- };
- AngularDependencies.prototype.ignore = function (deps) {
- if (deps) {
- logger.warn('ignore', "".concat(deps.name));
- }
- else {
- return;
- }
- };
- AngularDependencies.prototype.checkForDeprecation = function (tags, result) {
- ___namespace.forEach(tags, function (tag) {
- if (tag.tagName && tag.tagName.text && tag.tagName.text.indexOf('deprecated') > -1) {
- result.deprecated = true;
- result.deprecationMessage = tag.comment || '';
- }
- });
- };
- AngularDependencies.prototype.findExpressionByNameInExpressions = function (entryNode, name) {
- var result;
- var loop = function (node, z) {
- if (node) {
- if (node.expression && !node.expression.name) {
- loop(node.expression, z);
- }
- if (node.expression && node.expression.name) {
- if (node.expression.name.text === z) {
- result = node;
- }
- else {
- loop(node.expression, z);
- }
- }
- }
- };
- loop(entryNode, name);
- return result;
- };
- AngularDependencies.prototype.findExpressionByNameInExpressionArguments = function (arg, name) {
- var result;
- var that = this;
- var i = 0;
- var len = arg.length;
- var loop = function (node, z) {
- if (node.body) {
- if (node.body.statements && node.body.statements.length > 0) {
- var j = 0;
- var leng = node.body.statements.length;
- for (j; j < leng; j++) {
- result = that.findExpressionByNameInExpressions(node.body.statements[j], z);
- }
- }
- }
- };
- for (i; i < len; i++) {
- loop(arg[i], name);
- }
- return result;
- };
- AngularDependencies.prototype.parseDecorators = function (decorators, type) {
- var result = false;
- if (decorators.length > 1) {
- ___namespace.forEach(decorators, function (decorator) {
- if (decorator.expression.expression) {
- if (decorator.expression.expression.text === type) {
- result = true;
- }
- }
- });
- }
- else {
- if (decorators[0].expression.expression) {
- if (decorators[0].expression.expression.text === type) {
- result = true;
- }
- }
- }
- return result;
- };
- AngularDependencies.prototype.parseDecorator = function (decorator, type) {
- var result = false;
- if (decorator.expression.expression) {
- if (decorator.expression.expression.text === type) {
- result = true;
- }
- }
- return result;
- };
- AngularDependencies.prototype.isController = function (metadata) {
- return this.parseDecorator(metadata, 'Controller');
- };
- AngularDependencies.prototype.isEntity = function (metadata) {
- return this.parseDecorator(metadata, 'Entity');
- };
- AngularDependencies.prototype.isComponent = function (metadata) {
- return this.parseDecorator(metadata, 'Component');
- };
- AngularDependencies.prototype.isPipe = function (metadata) {
- return this.parseDecorator(metadata, 'Pipe');
- };
- AngularDependencies.prototype.isDirective = function (metadata) {
- return this.parseDecorator(metadata, 'Directive');
- };
- AngularDependencies.prototype.isInjectable = function (metadata) {
- return this.parseDecorator(metadata, 'Injectable');
- };
- AngularDependencies.prototype.isModule = function (metadata) {
- return this.parseDecorator(metadata, 'NgModule') || this.parseDecorator(metadata, 'Module');
- };
- AngularDependencies.prototype.hasInternalDecorator = function (metadatas) {
- return (this.parseDecorators(metadatas, 'Controller') ||
- this.parseDecorators(metadatas, 'Component') ||
- this.parseDecorators(metadatas, 'Pipe') ||
- this.parseDecorators(metadatas, 'Directive') ||
- this.parseDecorators(metadatas, 'Injectable') ||
- this.parseDecorators(metadatas, 'NgModule') ||
- this.parseDecorators(metadatas, 'Module'));
- };
- AngularDependencies.prototype.isGuard = function (ioImplements) {
- return (___namespace.includes(ioImplements, 'CanActivate') ||
- ___namespace.includes(ioImplements, 'CanActivateChild') ||
- ___namespace.includes(ioImplements, 'CanDeactivate') ||
- ___namespace.includes(ioImplements, 'Resolve') ||
- ___namespace.includes(ioImplements, 'CanLoad'));
- };
- AngularDependencies.prototype.getSymboleName = function (node) {
- return node.name.text;
- };
- AngularDependencies.prototype.findProperties = function (visitedNode, sourceFile) {
- if (visitedNode.expression &&
- visitedNode.expression.arguments &&
- visitedNode.expression.arguments.length > 0) {
- var pop = visitedNode.expression.arguments[0];
- if (pop && pop.properties && pop.properties.length >= 0) {
- return pop.properties;
- }
- else if (pop && pop.kind && pop.kind === tsMorph.SyntaxKind.StringLiteral) {
- return [pop];
- }
- else {
- logger.warn('Empty metadatas, trying to find it with imports.');
- return ImportsUtil$1.findValueInImportOrLocalVariables(pop.text, sourceFile);
- }
- }
- return [];
- };
- AngularDependencies.prototype.isAngularLifecycleHook = function (methodName) {
- /**
- * Copyright https://github.com/ng-bootstrap/ng-bootstrap
- */
- var ANGULAR_LIFECYCLE_METHODS = [
- 'ngOnInit',
- 'ngOnChanges',
- 'ngDoCheck',
- 'ngOnDestroy',
- 'ngAfterContentInit',
- 'ngAfterContentChecked',
- 'ngAfterViewInit',
- 'ngAfterViewChecked',
- 'writeValue',
- 'registerOnChange',
- 'registerOnTouched',
- 'setDisabledState'
- ];
- return ANGULAR_LIFECYCLE_METHODS.indexOf(methodName) >= 0;
- };
- AngularDependencies.prototype.visitTypeDeclaration = function (node) {
- var result = {
- deprecated: false,
- deprecationMessage: '',
- name: node.name.text,
- kind: node.kind
- };
- var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, result);
- result.jsdoctags = markedtags(jsdoctags[0].tags);
- }
- return result;
- };
- AngularDependencies.prototype.visitArgument = function (arg) {
- var _this = this;
- if (arg.name && arg.name.kind == tsMorph.SyntaxKind.ObjectBindingPattern) {
- var results = [];
- var destrucuredGroupId_1 = uuid.v4();
- results = arg.name.elements.map(function (element) { return _this.visitArgument(element); });
- results = results.map(function (result) {
- result.destrucuredGroupId = destrucuredGroupId_1;
- return result;
- });
- if (arg.name.elements && arg.type && arg.type.members) {
- if (arg.name.elements.length === arg.type.members.length) {
- for (var i = 0; i < arg.name.elements.length; i++) {
- results[i].type = this.classHelper.visitType(arg.type.members[i]);
- }
- }
- }
- if (arg.name.elements && arg.type && arg.type.typeName) {
- results[0].type = this.classHelper.visitType(arg.type);
- }
- return results;
- }
- else {
- var result = {
- name: arg.name.text,
- type: this.classHelper.visitType(arg),
- deprecated: false,
- deprecationMessage: ''
- };
- if (arg.dotDotDotToken) {
- result.dotDotDotToken = true;
- }
- if (arg.questionToken) {
- result.optional = true;
- }
- if (arg.initializer) {
- result.defaultValue = arg.initializer
- ? this.classHelper.stringifyDefaultValue(arg.initializer)
- : undefined;
- }
- if (arg.type) {
- result.type = this.mapType(arg.type.kind);
- if (arg.type.kind === tsMorph.SyntaxKind.TypeReference) {
- // try replace TypeReference with typeName
- if (arg.type.typeName) {
- result.type = arg.type.typeName.text;
- }
- }
- }
- var jsdoctags = this.jsdocParserUtil.getJSDocs(arg);
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, result);
- }
- return result;
- }
- };
- AngularDependencies.prototype.mapType = function (type) {
- switch (type) {
- case tsMorph.SyntaxKind.NullKeyword:
- return 'null';
- case tsMorph.SyntaxKind.AnyKeyword:
- return 'any';
- case tsMorph.SyntaxKind.BooleanKeyword:
- return 'boolean';
- case tsMorph.SyntaxKind.NeverKeyword:
- return 'never';
- case tsMorph.SyntaxKind.NumberKeyword:
- return 'number';
- case tsMorph.SyntaxKind.StringKeyword:
- return 'string';
- case tsMorph.SyntaxKind.UndefinedKeyword:
- return 'undefined';
- case tsMorph.SyntaxKind.TypeReference:
- return 'typeReference';
- }
- };
- AngularDependencies.prototype.hasPrivateJSDocTag = function (tags) {
- var result = false;
- if (tags) {
- tags.forEach(function (tag) {
- if (tag.tagName && tag.tagName.text && tag.tagName.text === 'private') {
- result = true;
- }
- });
- }
- return result;
- };
- AngularDependencies.prototype.visitFunctionDeclaration = function (method) {
- var methodName = method.name ? method.name.text : 'Unnamed function';
- var resultArguments = [];
- var result = {
- deprecated: false,
- deprecationMessage: '',
- name: methodName
- };
- for (var i = 0; i < method.parameters.length; i++) {
- var argument = method.parameters[i];
- if (argument) {
- var argumentParsed = this.visitArgument(argument);
- if (argumentParsed.length > 0) {
- for (var j = 0; j < argumentParsed.length; j++) {
- var argumentParsedInside = argumentParsed[j];
- argumentParsedInside.destructuredParameter = true;
- resultArguments.push(argumentParsedInside);
- }
- }
- else {
- resultArguments.push(argumentParsed);
- }
- }
- }
- result.args = resultArguments;
- var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
- if (typeof method.type !== 'undefined') {
- result.returnType = this.classHelper.visitType(method.type);
- }
- if (method.modifiers) {
- if (method.modifiers.length > 0) {
- var kinds = method.modifiers
- .map(function (modifier) {
- return modifier.kind;
- })
- .reverse();
- if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
- ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
- kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
- }
- }
- }
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, result);
- result.jsdoctags = markedtags(jsdoctags[0].tags);
- ___namespace.forEach(jsdoctags[0].tags, function (tag) {
- if (tag.tagName) {
- if (tag.tagName.text) {
- if (tag.tagName.text.indexOf('ignore') > -1) {
- result.ignore = true;
- }
- }
- }
- });
- }
- if (result.jsdoctags && result.jsdoctags.length > 0) {
- result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
- }
- else if (result.args.length > 0) {
- result.jsdoctags = mergeTagsAndArgs(result.args);
- }
- return result;
- };
- AngularDependencies.prototype.visitVariableDeclaration = function (node) {
- if (node.declarationList && node.declarationList.declarations) {
- var i = 0;
- var len = node.declarationList.declarations.length;
- for (i; i < len; i++) {
- var result = {
- name: node.declarationList.declarations[i].name.text,
- defaultValue: node.declarationList.declarations[i].initializer
- ? this.classHelper.stringifyDefaultValue(node.declarationList.declarations[i].initializer)
- : undefined,
- deprecated: false,
- deprecationMessage: ''
- };
- if (node.declarationList.declarations[i].initializer) {
- result.initializer = node.declarationList.declarations[i].initializer;
- }
- if (node.declarationList.declarations[i].type) {
- result.type = this.classHelper.visitType(node.declarationList.declarations[i].type);
- }
- if (typeof result.type === 'undefined' && result.initializer) {
- result.type = kindToType(result.initializer.kind);
- }
- var jsdoctags = this.jsdocParserUtil.getJSDocs(node.declarationList.declarations[i]);
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, result);
- }
- return result;
- }
- }
- };
- AngularDependencies.prototype.visitEnumTypeAliasFunctionDeclarationDescription = function (node) {
- var description = '';
- if (node.jsDoc) {
- if (node.jsDoc.length > 0) {
- if (typeof node.jsDoc[0].comment !== 'undefined') {
- var rawDescription = this.jsdocParserUtil.parseJSDocNode(node.jsDoc[0]);
- description = markedAcl(rawDescription);
- }
- }
- }
- return description;
- };
- AngularDependencies.prototype.visitEnumDeclaration = function (node) {
- var result = {
- deprecated: false,
- deprecationMessage: '',
- name: node.name.text,
- members: []
- };
- if (node.members) {
- var i = 0;
- var len = node.members.length;
- var memberjsdoctags = [];
- for (i; i < len; i++) {
- var member = {
- name: node.members[i].name.text,
- deprecated: false,
- deprecationMessage: ''
- };
- if (node.members[i].initializer) {
- // if the initializer kind is a number do cast to the number type
- member.value = IsKindType.NUMBER(node.members[i].initializer.kind)
- ? Number(node.members[i].initializer.text)
- : node.members[i].initializer.text;
- }
- memberjsdoctags = this.jsdocParserUtil.getJSDocs(node.members[i]);
- if (memberjsdoctags && memberjsdoctags.length >= 1 && memberjsdoctags[0].tags) {
- this.checkForDeprecation(memberjsdoctags[0].tags, member);
- }
- result.members.push(member);
- }
- }
- var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
- if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
- this.checkForDeprecation(jsdoctags[0].tags, result);
- }
- return result;
- };
- AngularDependencies.prototype.visitEnumDeclarationForRoutes = function (fileName, node) {
- if (node.declarationList.declarations) {
- var i = 0;
- var len = node.declarationList.declarations.length;
- for (i; i < len; i++) {
- var routesInitializer = node.declarationList.declarations[i].initializer;
- var data = new CodeGenerator().generate(routesInitializer);
- RouterParserUtil$1.addRoute({
- name: node.declarationList.declarations[i].name.text,
- data: RouterParserUtil$1.cleanRawRoute(data),
- filename: fileName
- });
- return [
- {
- routes: data
- }
- ];
- }
- }
- return [];
- };
- AngularDependencies.prototype.getRouteIO = function (filename, sourceFile, node) {
- var _this = this;
- var res;
- if (sourceFile.statements) {
- res = sourceFile.statements.reduce(function (directive, statement) {
- if (RouterParserUtil$1.isVariableRoutes(statement)) {
- if (statement.pos === node.pos && statement.end === node.end) {
- return directive.concat(_this.visitEnumDeclarationForRoutes(filename, statement));
- }
- }
- return directive;
- }, []);
- return res[0] || {};
- }
- else {
- return {};
- }
- };
- AngularDependencies.prototype.getClassIO = function (filename, sourceFile, node, fileBody, astFile) {
- var _this = this;
- /**
- * Copyright https://github.com/ng-bootstrap/ng-bootstrap
- */
- var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
- var res = reducedSource.reduce(function (directive, statement) {
- if (tsMorph.ts.isClassDeclaration(statement)) {
- if (statement.pos === node.pos && statement.end === node.end) {
- return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile, astFile));
- }
- }
- return directive;
- }, []);
- return res[0] || {};
- };
- AngularDependencies.prototype.getInterfaceIO = function (filename, sourceFile, node, fileBody, astFile) {
- var _this = this;
- /**
- * Copyright https://github.com/ng-bootstrap/ng-bootstrap
- */
- var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
- var res = reducedSource.reduce(function (directive, statement) {
- if (tsMorph.ts.isInterfaceDeclaration(statement)) {
- if (statement.pos === node.pos && statement.end === node.end) {
- return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile, astFile));
- }
- }
- return directive;
- }, []);
- return res[0] || {};
- };
- return AngularDependencies;
- }(FrameworkDependencies));
- var AngularJSDependencies = /** @class */ (function (_super) {
- __extends(AngularJSDependencies, _super);
- function AngularJSDependencies(files, options) {
- var _this = _super.call(this, files, options) || this;
- _this.cache = new ComponentCache();
- _this.moduleHelper = new ModuleHelper(_this.cache);
- _this.jsDocHelper = new JsDocHelper();
- _this.symbolHelper = new SymbolHelper();
- return _this;
- }
- AngularJSDependencies.prototype.getDependencies = function () {
- var deps = {
- modules: [],
- modulesForGraph: [],
- components: [],
- injectables: [],
- interceptors: [],
- pipes: [],
- directives: [],
- routes: [],
- classes: [],
- interfaces: [],
- miscellaneous: {
- variables: [],
- functions: [],
- typealiases: [],
- enumerations: []
- },
- routesTree: undefined
- };
- return deps;
- };
- return AngularJSDependencies;
- }(FrameworkDependencies));
- function promiseSequential(promises) {
- if (!Array.isArray(promises)) {
- throw new Error('First argument need to be an array of Promises');
- }
- return new Promise(function (resolve, reject) {
- var count = 0;
- var results = [];
- var iterateeFunc = function (previousPromise, currentPromise) {
- return previousPromise
- .then(function (result) {
- if (count++ !== 0) {
- results = results.concat(result);
- }
- return currentPromise(result, results, count);
- })
- .catch(function (err) {
- return reject(err);
- });
- };
- promises = promises.concat(function () { return Promise.resolve(); });
- promises.reduce(iterateeFunc, Promise.resolve(false)).then(function (res) {
- resolve(results);
- });
- });
- }
- var chokidar = require('chokidar');
- var traverse = require('neotraverse/legacy');
- var crypto = require('crypto');
- var babel = require('@babel/core');
- var cwd$1 = process.cwd();
- var startTime = new Date();
- var generationPromiseResolve;
- var generationPromiseReject;
- var generationPromise = new Promise(function (resolve, reject) {
- generationPromiseResolve = resolve;
- generationPromiseReject = reject;
- });
- var Application = /** @class */ (function () {
- /**
- * Create a new compodoc application instance.
- *
- * @param options An object containing the options that should be used.
- */
- function Application(options) {
- var _this = this;
- /**
- * Files changed during watch scanning
- */
- this.watchChangedFiles = [];
- /**
- * Boolean for watching status
- * @type {boolean}
- */
- this.isWatching = false;
- /**
- * Store package.json data
- */
- this.packageJsonData = {};
- this.preparePipes = function (somePipes) {
- logger.info('Prepare pipes');
- Configuration$1.mainData.pipes = somePipes ? somePipes : DependenciesEngine$1.getPipes();
- return new Promise(function (resolve, reject) {
- var i = 0;
- var len = Configuration$1.mainData.pipes.length;
- var loop = function () {
- if (i < len) {
- var pipe = Configuration$1.mainData.pipes[i];
- if (MarkdownEngine$1.hasNeighbourReadmeFile(pipe.file)) {
- logger.info(" ".concat(pipe.name, " has a README file, include it"));
- var readme = MarkdownEngine$1.readNeighbourReadmeFile(pipe.file);
- pipe.readme = markedAcl(readme);
- }
- var page = {
- path: 'pipes',
- name: pipe.name,
- id: pipe.id,
- navTabs: _this.getNavTabs(pipe),
- context: 'pipe',
- pipe: pipe,
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- };
- if (pipe.isDuplicate) {
- page.name += '-' + pipe.duplicateId;
- }
- Configuration$1.addPage(page);
- i++;
- loop();
- }
- else {
- resolve(true);
- }
- };
- loop();
- });
- };
- this.prepareClasses = function (someClasses) {
- logger.info('Prepare classes');
- Configuration$1.mainData.classes = someClasses
- ? someClasses
- : DependenciesEngine$1.getClasses();
- return new Promise(function (resolve, reject) {
- var i = 0;
- var len = Configuration$1.mainData.classes.length;
- var loop = function () {
- if (i < len) {
- var classe = Configuration$1.mainData.classes[i];
- if (MarkdownEngine$1.hasNeighbourReadmeFile(classe.file)) {
- logger.info(" ".concat(classe.name, " has a README file, include it"));
- var readme = MarkdownEngine$1.readNeighbourReadmeFile(classe.file);
- classe.readme = markedAcl(readme);
- }
- var page = {
- path: 'classes',
- name: classe.name,
- id: classe.id,
- navTabs: _this.getNavTabs(classe),
- context: 'class',
- class: classe,
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- };
- if (classe.isDuplicate) {
- page.name += '-' + classe.duplicateId;
- }
- Configuration$1.addPage(page);
- i++;
- loop();
- }
- else {
- resolve(true);
- }
- };
- loop();
- });
- };
- for (var option in options) {
- if (typeof Configuration$1.mainData[option] !== 'undefined') {
- Configuration$1.mainData[option] = options[option];
- }
- // For documentationMainName, process it outside the loop, for handling conflict with pages name
- if (option === 'name') {
- Configuration$1.mainData.documentationMainName = options[option];
- }
- // For documentationMainName, process it outside the loop, for handling conflict with pages name
- if (option === 'silent') {
- logger.silent = false;
- }
- }
- }
- /**
- * Start compodoc process
- */
- Application.prototype.generate = function () {
- var _this = this;
- process.on('unhandledRejection', this.unhandledRejectionListener);
- process.on('uncaughtException', this.uncaughtExceptionListener);
- I18nEngine$1.init(Configuration$1.mainData.language);
- if (Configuration$1.mainData.output.charAt(Configuration$1.mainData.output.length - 1) !== '/') {
- Configuration$1.mainData.output += '/';
- }
- if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
- this.processPackageJson();
- }
- else {
- HtmlEngine$1.init(Configuration$1.mainData.templates).then(function () { return _this.processPackageJson(); });
- }
- return generationPromise;
- };
- Application.prototype.endCallback = function () {
- process.removeListener('unhandledRejection', this.unhandledRejectionListener);
- process.removeListener('uncaughtException', this.uncaughtExceptionListener);
- };
- Application.prototype.unhandledRejectionListener = function (err, p) {
- console.log('Unhandled Rejection at:', p, 'reason:', err);
- logger.error('Sorry, but there was a problem during parsing or generation of the documentation. Please fill an issue on github. (https://github.com/compodoc/compodoc/issues/new)'); // tslint:disable-line
- process.exit(1);
- };
- Application.prototype.uncaughtExceptionListener = function (err) {
- logger.error(err);
- logger.error('Sorry, but there was a problem during parsing or generation of the documentation. Please fill an issue on github. (https://github.com/compodoc/compodoc/issues/new)'); // tslint:disable-line
- process.exit(1);
- };
- /**
- * Start compodoc documentation coverage
- */
- Application.prototype.testCoverage = function () {
- this.getDependenciesData();
- };
- /**
- * Store files for initial processing
- * @param {Array<string>} files Files found during source folder and tsconfig scan
- */
- Application.prototype.setFiles = function (files) {
- this.files = files;
- };
- /**
- * Store files for watch processing
- * @param {Array<string>} files Files found during source folder and tsconfig scan
- */
- Application.prototype.setUpdatedFiles = function (files) {
- this.updatedFiles = files;
- };
- /**
- * Return a boolean indicating presence of one TypeScript file in updatedFiles list
- * @return {boolean} Result of scan
- */
- Application.prototype.hasWatchedFilesTSFiles = function () {
- var result = false;
- ___namespace.forEach(this.updatedFiles, function (file) {
- if (path__namespace.extname(file) === '.ts') {
- result = true;
- }
- });
- return result;
- };
- /**
- * Return a boolean indicating presence of one root markdown files in updatedFiles list
- * @return {boolean} Result of scan
- */
- Application.prototype.hasWatchedFilesRootMarkdownFiles = function () {
- var result = false;
- ___namespace.forEach(this.updatedFiles, function (file) {
- if (path__namespace.extname(file) === '.md' && path__namespace.dirname(file) === cwd$1) {
- result = true;
- }
- });
- return result;
- };
- /**
- * Clear files for watch processing
- */
- Application.prototype.clearUpdatedFiles = function () {
- this.updatedFiles = [];
- this.watchChangedFiles = [];
- };
- Application.prototype.processPackageJson = function () {
- var _this = this;
- logger.info('Searching package.json file');
- FileEngine$1.get(cwd$1 + path__namespace.sep + 'package.json').then(function (packageData) {
- var parsedData = JSON.parse(packageData);
- _this.packageJsonData = parsedData;
- if (typeof parsedData.name !== 'undefined' &&
- Configuration$1.mainData.documentationMainName === COMPODOC_DEFAULTS.title) {
- Configuration$1.mainData.documentationMainName =
- parsedData.name + ' documentation';
- }
- if (typeof parsedData.description !== 'undefined') {
- Configuration$1.mainData.documentationMainDescription = parsedData.description;
- }
- Configuration$1.mainData.angularVersion =
- AngularVersionUtil$1.getAngularVersionOfProject(parsedData);
- logger.info('package.json file found');
- if (!Configuration$1.mainData.disableDependencies) {
- if (typeof parsedData.dependencies !== 'undefined') {
- _this.processPackageDependencies(parsedData.dependencies);
- }
- if (typeof parsedData.peerDependencies !== 'undefined') {
- _this.processPackagePeerDependencies(parsedData.peerDependencies);
- }
- }
- if (!Configuration$1.mainData.disableProperties) {
- var propertiesToCheck = [
- 'version',
- 'description',
- 'keywords',
- 'homepage',
- 'bugs',
- 'license',
- 'repository',
- 'author'
- ];
- var hasOneOfCheckedProperties_1 = false;
- propertiesToCheck.forEach(function (prop) {
- if (prop in parsedData) {
- hasOneOfCheckedProperties_1 = true;
- Configuration$1.mainData.packageProperties[prop] = parsedData[prop];
- }
- });
- if (hasOneOfCheckedProperties_1) {
- Configuration$1.addPage({
- name: 'properties',
- id: 'packageProperties',
- context: 'package-properties',
- depth: 0,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
- });
- }
- }
- _this.processMarkdowns().then(function () {
- _this.getDependenciesData();
- }, function (errorMessage) {
- logger.error(errorMessage);
- process.exit(1);
- });
- }, function (errorMessage) {
- logger.error(errorMessage);
- logger.error('Continuing without package.json file');
- _this.processMarkdowns().then(function () {
- _this.getDependenciesData();
- }, function (errorMessage1) {
- logger.error(errorMessage1);
- process.exit(1);
- });
- });
- };
- Application.prototype.processPackagePeerDependencies = function (dependencies) {
- logger.info('Processing package.json peerDependencies');
- Configuration$1.mainData.packagePeerDependencies = dependencies;
- if (!Configuration$1.hasPage('dependencies')) {
- Configuration$1.addPage({
- name: 'dependencies',
- id: 'packageDependencies',
- context: 'package-dependencies',
- depth: 0,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
- });
- }
- };
- Application.prototype.processPackageDependencies = function (dependencies) {
- logger.info('Processing package.json dependencies');
- Configuration$1.mainData.packageDependencies = dependencies;
- Configuration$1.addPage({
- name: 'dependencies',
- id: 'packageDependencies',
- context: 'package-dependencies',
- depth: 0,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
- });
- };
- Application.prototype.processMarkdowns = function () {
- logger.info('Searching README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md files');
- return new Promise(function (resolve, reject) {
- var i = 0;
- var markdowns = ['readme', 'changelog', 'contributing', 'license', 'todo'];
- var numberOfMarkdowns = 5;
- var loop = function () {
- if (i < numberOfMarkdowns) {
- MarkdownEngine$1.getTraditionalMarkdown(markdowns[i].toUpperCase()).then(function (readmeData) {
- Configuration$1.addPage({
- name: markdowns[i] === 'readme' ? 'index' : markdowns[i],
- context: 'getting-started',
- id: 'getting-started',
- markdown: readmeData.markdown,
- data: readmeData.rawData,
- depth: 0,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
- });
- if (markdowns[i] === 'readme') {
- Configuration$1.mainData.readme = true;
- Configuration$1.addPage({
- name: 'overview',
- id: 'overview',
- context: 'overview',
- depth: 0,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
- });
- }
- else {
- Configuration$1.mainData.markdowns.push({
- name: markdowns[i],
- uppername: markdowns[i].toUpperCase(),
- depth: 0,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
- });
- }
- logger.info("".concat(markdowns[i].toUpperCase(), ".md file found"));
- i++;
- loop();
- }, function (errorMessage) {
- logger.warn(errorMessage);
- logger.warn("Continuing without ".concat(markdowns[i].toUpperCase(), ".md file"));
- if (markdowns[i] === 'readme') {
- Configuration$1.addPage({
- name: 'index',
- id: 'index',
- context: 'overview',
- depth: 0,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
- });
- }
- i++;
- loop();
- });
- }
- else {
- resolve(true);
- }
- };
- loop();
- });
- };
- Application.prototype.rebuildRootMarkdowns = function () {
- var _this = this;
- logger.info('Regenerating README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md pages');
- var actions = [];
- Configuration$1.resetRootMarkdownPages();
- actions.push(function () {
- return _this.processMarkdowns();
- });
- promiseSequential(actions)
- .then(function (res) {
- _this.processPages();
- _this.clearUpdatedFiles();
- })
- .catch(function (errorMessage) {
- logger.error(errorMessage);
- });
- };
- /**
- * Get dependency data for small group of updated files during watch process
- */
- Application.prototype.getMicroDependenciesData = function () {
- logger.info('Get diff dependencies data');
- var dependenciesClass = AngularDependencies;
- Configuration$1.mainData.angularProject = true;
- if (this.detectAngularJSProjects()) {
- logger.info('AngularJS project detected');
- Configuration$1.mainData.angularProject = false;
- Configuration$1.mainData.angularJSProject = true;
- dependenciesClass = AngularJSDependencies;
- }
- var crawler = new dependenciesClass(this.updatedFiles, {
- tsconfigDirectory: path__namespace.dirname(Configuration$1.mainData.tsconfig)
- }, Configuration$1, RouterParserUtil$1);
- var dependenciesData = crawler.getDependencies();
- DependenciesEngine$1.update(dependenciesData);
- this.prepareJustAFewThings(dependenciesData);
- };
- /**
- * Rebuild external documentation during watch process
- */
- Application.prototype.rebuildExternalDocumentation = function () {
- var _this = this;
- logger.info('Rebuild external documentation');
- var actions = [];
- Configuration$1.resetAdditionalPages();
- if (Configuration$1.mainData.includes !== '') {
- actions.push(function () {
- return _this.prepareExternalIncludes();
- });
- }
- promiseSequential(actions)
- .then(function (res) {
- _this.processPages();
- _this.clearUpdatedFiles();
- })
- .catch(function (errorMessage) {
- logger.error(errorMessage);
- });
- };
- Application.prototype.detectAngularJSProjects = function () {
- if (typeof this.packageJsonData.dependencies !== 'undefined') {
- if (typeof this.packageJsonData.dependencies.angular !== 'undefined') ;
- else {
- var countJSFiles_1 = 0;
- this.files.forEach(function (file) {
- if (path__namespace.extname(file) === '.js') {
- countJSFiles_1 += 1;
- }
- });
- (countJSFiles_1 * 100) / this.files.length;
- }
- }
- return false;
- };
- Application.prototype.getDependenciesData = function () {
- logger.info('Get dependencies data');
- /**
- * AngularJS detection strategy :
- * - if in package.json
- * - if 75% of scanned files are *.js files
- */
- var dependenciesClass = AngularDependencies;
- Configuration$1.mainData.angularProject = true;
- if (this.detectAngularJSProjects()) {
- logger.info('AngularJS project detected');
- Configuration$1.mainData.angularProject = false;
- Configuration$1.mainData.angularJSProject = true;
- dependenciesClass = AngularJSDependencies;
- }
- var crawler = new dependenciesClass(this.files, {
- tsconfigDirectory: path__namespace.dirname(Configuration$1.mainData.tsconfig)
- }, Configuration$1, RouterParserUtil$1);
- var dependenciesData = crawler.getDependencies();
- DependenciesEngine$1.init(dependenciesData);
- Configuration$1.mainData.routesLength = RouterParserUtil$1.routesLength();
- this.printStatistics();
- this.prepareEverything();
- };
- Application.prototype.prepareJustAFewThings = function (diffCrawledData) {
- var _this = this;
- var actions = [];
- Configuration$1.resetPages();
- if (!Configuration$1.mainData.disableRoutesGraph) {
- actions.push(function () { return _this.prepareRoutes(); });
- }
- if (diffCrawledData.components.length > 0) {
- actions.push(function () { return _this.prepareComponents(); });
- }
- if (diffCrawledData.controllers.length > 0) {
- actions.push(function () { return _this.prepareControllers(); });
- }
- if (diffCrawledData.entities.length > 0) {
- actions.push(function () { return _this.prepareEntities(); });
- }
- if (diffCrawledData.modules.length > 0) {
- actions.push(function () { return _this.prepareModules(); });
- }
- if (diffCrawledData.directives.length > 0) {
- actions.push(function () { return _this.prepareDirectives(); });
- }
- if (diffCrawledData.injectables.length > 0) {
- actions.push(function () { return _this.prepareInjectables(); });
- }
- if (diffCrawledData.interceptors.length > 0) {
- actions.push(function () { return _this.prepareInterceptors(); });
- }
- if (diffCrawledData.guards.length > 0) {
- actions.push(function () { return _this.prepareGuards(); });
- }
- if (diffCrawledData.pipes.length > 0) {
- actions.push(function () { return _this.preparePipes(); });
- }
- if (diffCrawledData.classes.length > 0) {
- actions.push(function () { return _this.prepareClasses(); });
- }
- if (diffCrawledData.interfaces.length > 0) {
- actions.push(function () { return _this.prepareInterfaces(); });
- }
- if (diffCrawledData.miscellaneous.variables.length > 0 ||
- diffCrawledData.miscellaneous.functions.length > 0 ||
- diffCrawledData.miscellaneous.typealiases.length > 0 ||
- diffCrawledData.miscellaneous.enumerations.length > 0) {
- actions.push(function () { return _this.prepareMiscellaneous(); });
- }
- if (!Configuration$1.mainData.disableCoverage) {
- actions.push(function () { return _this.prepareCoverage(); });
- }
- promiseSequential(actions)
- .then(function (res) {
- if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
- if (COMPODOC_DEFAULTS.exportFormatsSupported.indexOf(Configuration$1.mainData.exportFormat) > -1) {
- logger.info("Generating documentation in export format ".concat(Configuration$1.mainData.exportFormat));
- ExportEngine$1.export(Configuration$1.mainData.output, Configuration$1.mainData).then(function () {
- generationPromiseResolve(true);
- _this.endCallback();
- logger.info('Documentation generated in ' +
- Configuration$1.mainData.output +
- ' in ' +
- _this.getElapsedTime() +
- ' seconds');
- if (Configuration$1.mainData.serve) {
- logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(Configuration$1.mainData.port));
- _this.runWebServer(Configuration$1.mainData.output);
- }
- });
- }
- else {
- logger.warn("Exported format not supported");
- }
- }
- else {
- _this.processGraphs();
- _this.clearUpdatedFiles();
- }
- })
- .catch(function (errorMessage) {
- logger.error(errorMessage);
- });
- };
- Application.prototype.printStatistics = function () {
- logger.info('-------------------');
- logger.info('Project statistics ');
- if (DependenciesEngine$1.modules.length > 0) {
- logger.info("- files : ".concat(this.files.length));
- }
- if (DependenciesEngine$1.modules.length > 0) {
- logger.info("- module : ".concat(DependenciesEngine$1.modules.length));
- }
- if (DependenciesEngine$1.components.length > 0) {
- logger.info("- component : ".concat(DependenciesEngine$1.components.length));
- }
- if (DependenciesEngine$1.controllers.length > 0) {
- logger.info("- controller : ".concat(DependenciesEngine$1.controllers.length));
- }
- if (DependenciesEngine$1.entities.length > 0) {
- logger.info("- entity : ".concat(DependenciesEngine$1.entities.length));
- }
- if (DependenciesEngine$1.directives.length > 0) {
- logger.info("- directive : ".concat(DependenciesEngine$1.directives.length));
- }
- if (DependenciesEngine$1.injectables.length > 0) {
- logger.info("- injectable : ".concat(DependenciesEngine$1.injectables.length));
- }
- if (DependenciesEngine$1.interceptors.length > 0) {
- logger.info("- injector : ".concat(DependenciesEngine$1.interceptors.length));
- }
- if (DependenciesEngine$1.guards.length > 0) {
- logger.info("- guard : ".concat(DependenciesEngine$1.guards.length));
- }
- if (DependenciesEngine$1.pipes.length > 0) {
- logger.info("- pipe : ".concat(DependenciesEngine$1.pipes.length));
- }
- if (DependenciesEngine$1.classes.length > 0) {
- logger.info("- class : ".concat(DependenciesEngine$1.classes.length));
- }
- if (DependenciesEngine$1.interfaces.length > 0) {
- logger.info("- interface : ".concat(DependenciesEngine$1.interfaces.length));
- }
- if (Configuration$1.mainData.routesLength > 0) {
- logger.info("- route : ".concat(Configuration$1.mainData.routesLength));
- }
- if (DependenciesEngine$1.miscellaneous.typealiases.length > 0) {
- logger.info("- type aliases : ".concat(DependenciesEngine$1.miscellaneous.typealiases.length));
- }
- logger.info('-------------------');
- };
- Application.prototype.prepareEverything = function () {
- var _this = this;
- var actions = [];
- actions.push(function () {
- return _this.prepareComponents();
- });
- actions.push(function () {
- return _this.prepareModules();
- });
- if (DependenciesEngine$1.directives.length > 0) {
- actions.push(function () {
- return _this.prepareDirectives();
- });
- }
- if (DependenciesEngine$1.controllers.length > 0) {
- actions.push(function () {
- return _this.prepareControllers();
- });
- }
- if (DependenciesEngine$1.entities.length > 0) {
- actions.push(function () {
- return _this.prepareEntities();
- });
- }
- if (DependenciesEngine$1.injectables.length > 0) {
- actions.push(function () {
- return _this.prepareInjectables();
- });
- }
- if (DependenciesEngine$1.interceptors.length > 0) {
- actions.push(function () {
- return _this.prepareInterceptors();
- });
- }
- if (DependenciesEngine$1.guards.length > 0) {
- actions.push(function () {
- return _this.prepareGuards();
- });
- }
- if (DependenciesEngine$1.routes &&
- DependenciesEngine$1.routes.children.length > 0 &&
- !Configuration$1.mainData.disableRoutesGraph) {
- actions.push(function () {
- return _this.prepareRoutes();
- });
- }
- if (DependenciesEngine$1.pipes.length > 0) {
- actions.push(function () {
- return _this.preparePipes();
- });
- }
- if (DependenciesEngine$1.classes.length > 0) {
- actions.push(function () {
- return _this.prepareClasses();
- });
- }
- if (DependenciesEngine$1.interfaces.length > 0) {
- actions.push(function () {
- return _this.prepareInterfaces();
- });
- }
- if (DependenciesEngine$1.miscellaneous.variables.length > 0 ||
- DependenciesEngine$1.miscellaneous.functions.length > 0 ||
- DependenciesEngine$1.miscellaneous.typealiases.length > 0 ||
- DependenciesEngine$1.miscellaneous.enumerations.length > 0) {
- actions.push(function () {
- return _this.prepareMiscellaneous();
- });
- }
- if (!Configuration$1.mainData.disableCoverage) {
- actions.push(function () {
- return _this.prepareCoverage();
- });
- }
- if (Configuration$1.mainData.unitTestCoverage !== '') {
- actions.push(function () {
- return _this.prepareUnitTestCoverage();
- });
- }
- if (Configuration$1.mainData.includes !== '') {
- actions.push(function () {
- return _this.prepareExternalIncludes();
- });
- }
- promiseSequential(actions)
- .then(function (res) {
- if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
- if (COMPODOC_DEFAULTS.exportFormatsSupported.indexOf(Configuration$1.mainData.exportFormat) > -1) {
- logger.info("Generating documentation in export format ".concat(Configuration$1.mainData.exportFormat));
- ExportEngine$1.export(Configuration$1.mainData.output, Configuration$1.mainData).then(function () {
- generationPromiseResolve(true);
- _this.endCallback();
- logger.info('Documentation generated in ' +
- Configuration$1.mainData.output +
- ' in ' +
- _this.getElapsedTime() +
- ' seconds');
- if (Configuration$1.mainData.serve) {
- logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(Configuration$1.mainData.port));
- _this.runWebServer(Configuration$1.mainData.output);
- }
- });
- }
- else {
- logger.warn("Exported format not supported");
- }
- }
- else {
- _this.processGraphs();
- }
- })
- .catch(function (errorMessage) {
- logger.error(errorMessage);
- process.exit(1);
- });
- };
- Application.prototype.getIncludedPathForFile = function (file) {
- return path__namespace.join(Configuration$1.mainData.includes, file);
- };
- Application.prototype.prepareExternalIncludes = function () {
- var _this = this;
- logger.info('Adding external markdown files');
- // Scan include folder for files detailed in summary.json
- // For each file, add to Configuration.mainData.additionalPages
- // Each file will be converted to html page, inside COMPODOC_DEFAULTS.additionalEntryPath
- return new Promise(function (resolve, reject) {
- FileEngine$1.get(_this.getIncludedPathForFile('summary.json')).then(function (summaryData) {
- logger.info('Additional documentation: summary.json file found');
- var parsedSummaryData = JSON.parse(summaryData);
- var that = _this;
- var lastLevelOnePage = undefined;
- traverse(parsedSummaryData).forEach(function () {
- // tslint:disable-next-line:no-invalid-this
- if (this.notRoot && typeof this.node === 'object') {
- // tslint:disable-next-line:no-invalid-this
- var rawPath = this.path;
- // tslint:disable-next-line:no-invalid-this
- var additionalNode = this.node;
- var file = additionalNode.file;
- var title = additionalNode.title;
- var finalPath_1 = Configuration$1.mainData.includesFolder;
- var finalDepth = rawPath.filter(function (el) {
- return !isNaN(parseInt(el, 10));
- });
- if (typeof file !== 'undefined' && typeof title !== 'undefined') {
- var url = cleanNameWithoutSpaceAndToLowerCase(title);
- /**
- * Id created with title + file path hash, seems to be hypothetically unique here
- */
- var id = crypto
- .createHash('sha512')
- .update(title + file)
- .digest('hex');
- // tslint:disable-next-line:no-invalid-this
- this.node.id = id;
- var lastElementRootTree_1 = undefined;
- finalDepth.forEach(function (el) {
- var elementTree = typeof lastElementRootTree_1 === 'undefined'
- ? parsedSummaryData
- : lastElementRootTree_1;
- if (typeof elementTree.children !== 'undefined') {
- elementTree = elementTree.children[el];
- }
- else {
- elementTree = elementTree[el];
- }
- finalPath_1 +=
- '/' +
- cleanNameWithoutSpaceAndToLowerCase(elementTree.title);
- lastElementRootTree_1 = elementTree;
- });
- finalPath_1 = finalPath_1.replace('/' + url, '');
- var markdownFile = MarkdownEngine$1.getTraditionalMarkdownSync(that.getIncludedPathForFile(file));
- if (finalDepth.length > 5) {
- logger.error('Only 5 levels of depth are supported');
- }
- else {
- var _page = {
- name: title,
- id: id,
- filename: url,
- context: 'additional-page',
- path: finalPath_1,
- additionalPage: markdownFile,
- depth: finalDepth.length,
- childrenLength: additionalNode.children
- ? additionalNode.children.length
- : 0,
- children: [],
- lastChild: false,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- };
- if (finalDepth.length === 1) {
- lastLevelOnePage = _page;
- }
- if (finalDepth.length > 1) {
- // store all child pages of the last root level 1 page inside it
- lastLevelOnePage.children.push(_page);
- }
- else {
- Configuration$1.addAdditionalPage(_page);
- }
- }
- }
- }
- });
- resolve(true);
- }, function (errorMessage) {
- logger.error(errorMessage);
- reject('Error during Additional documentation generation');
- });
- });
- };
- Application.prototype.prepareModules = function (someModules) {
- var _this = this;
- logger.info('Prepare modules');
- var i = 0;
- var _modules = someModules ? someModules : DependenciesEngine$1.getModules();
- return new Promise(function (resolve, reject) {
- Configuration$1.mainData.modules = _modules.map(function (ngModule) {
- ngModule.compodocLinks = {
- components: [],
- controllers: [],
- directives: [],
- injectables: [],
- pipes: []
- };
- ['declarations', 'bootstrap', 'imports', 'exports', 'controllers'].forEach(function (metadataType) {
- ngModule[metadataType] = ngModule[metadataType].filter(function (metaDataItem) {
- switch (metaDataItem.type) {
- case 'directive':
- return DependenciesEngine$1.getDirectives().some(function (directive) {
- var selectedDirective;
- if (typeof metaDataItem.id !== 'undefined') {
- selectedDirective =
- directive.id === metaDataItem.id;
- }
- else {
- selectedDirective =
- directive.name === metaDataItem.name;
- }
- if (selectedDirective &&
- !ngModule.compodocLinks.directives.includes(directive)) {
- ngModule.compodocLinks.directives.push(directive);
- }
- return selectedDirective;
- });
- case 'component':
- return DependenciesEngine$1.getComponents().some(function (component) {
- var selectedComponent;
- if (typeof metaDataItem.id !== 'undefined') {
- selectedComponent =
- component.id === metaDataItem.id;
- }
- else {
- selectedComponent =
- component.name === metaDataItem.name;
- }
- if (selectedComponent &&
- !ngModule.compodocLinks.components.includes(component)) {
- if (!component.standalone) {
- ngModule.compodocLinks.components.push(component);
- }
- }
- return selectedComponent;
- });
- case 'controller':
- return DependenciesEngine$1.getControllers().some(function (controller) {
- var selectedController;
- if (typeof metaDataItem.id !== 'undefined') {
- selectedController =
- controller.id === metaDataItem.id;
- }
- else {
- selectedController =
- controller.name === metaDataItem.name;
- }
- if (selectedController &&
- !ngModule.compodocLinks.controllers.includes(controller)) {
- ngModule.compodocLinks.controllers.push(controller);
- }
- return selectedController;
- });
- case 'module':
- return DependenciesEngine$1.getModules().some(function (module) { return module.name === metaDataItem.name; });
- case 'pipe':
- return DependenciesEngine$1.getPipes().some(function (pipe) {
- var selectedPipe;
- if (typeof metaDataItem.id !== 'undefined') {
- selectedPipe = pipe.id === metaDataItem.id;
- }
- else {
- selectedPipe = pipe.name === metaDataItem.name;
- }
- if (selectedPipe &&
- !ngModule.compodocLinks.pipes.includes(pipe)) {
- ngModule.compodocLinks.pipes.push(pipe);
- }
- return selectedPipe;
- });
- default:
- return true;
- }
- });
- });
- ngModule.providers = ngModule.providers.filter(function (provider) {
- return (DependenciesEngine$1.getInjectables().some(function (injectable) {
- var selectedInjectable = injectable.name === provider.name;
- if (selectedInjectable &&
- !ngModule.compodocLinks.injectables.includes(injectable)) {
- ngModule.compodocLinks.injectables.push(injectable);
- }
- return selectedInjectable;
- }) ||
- DependenciesEngine$1.getInterceptors().some(function (interceptor) { return interceptor.name === provider.name; }));
- });
- // Try fixing type undefined for each providers
- ___namespace.forEach(ngModule.providers, function (provider) {
- if (DependenciesEngine$1.getInjectables().find(function (injectable) { return injectable.name === provider.name; })) {
- provider.type = 'injectable';
- }
- if (DependenciesEngine$1.getInterceptors().find(function (interceptor) { return interceptor.name === provider.name; })) {
- provider.type = 'interceptor';
- }
- });
- // Order things
- ngModule.compodocLinks.components = ___namespace.sortBy(ngModule.compodocLinks.components, [
- 'name'
- ]);
- ngModule.compodocLinks.controllers = ___namespace.sortBy(ngModule.compodocLinks.controllers, [
- 'name'
- ]);
- ngModule.compodocLinks.directives = ___namespace.sortBy(ngModule.compodocLinks.directives, [
- 'name'
- ]);
- ngModule.compodocLinks.injectables = ___namespace.sortBy(ngModule.compodocLinks.injectables, [
- 'name'
- ]);
- ngModule.compodocLinks.pipes = ___namespace.sortBy(ngModule.compodocLinks.pipes, ['name']);
- ngModule.declarations = ___namespace.sortBy(ngModule.declarations, ['name']);
- ngModule.entryComponents = ___namespace.sortBy(ngModule.entryComponents, ['name']);
- ngModule.providers = ___namespace.sortBy(ngModule.providers, ['name']);
- ngModule.imports = ___namespace.sortBy(ngModule.imports, ['name']);
- ngModule.exports = ___namespace.sortBy(ngModule.exports, ['name']);
- return ngModule;
- });
- Configuration$1.addPage({
- name: 'modules',
- id: 'modules',
- context: 'modules',
- depth: 0,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
- });
- var len = Configuration$1.mainData.modules.length;
- var loop = function () {
- if (i < len) {
- if (MarkdownEngine$1.hasNeighbourReadmeFile(Configuration$1.mainData.modules[i].file)) {
- logger.info(" ".concat(Configuration$1.mainData.modules[i].name, " has a README file, include it"));
- var readme = MarkdownEngine$1.readNeighbourReadmeFile(Configuration$1.mainData.modules[i].file);
- Configuration$1.mainData.modules[i].readme = markedAcl(readme);
- }
- Configuration$1.addPage({
- path: 'modules',
- name: Configuration$1.mainData.modules[i].name,
- id: Configuration$1.mainData.modules[i].id,
- navTabs: _this.getNavTabs(Configuration$1.mainData.modules[i]),
- context: 'module',
- module: Configuration$1.mainData.modules[i],
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- });
- i++;
- loop();
- }
- else {
- resolve(true);
- }
- };
- loop();
- });
- };
- Application.prototype.prepareInterfaces = function (someInterfaces) {
- var _this = this;
- logger.info('Prepare interfaces');
- Configuration$1.mainData.interfaces = someInterfaces
- ? someInterfaces
- : DependenciesEngine$1.getInterfaces();
- return new Promise(function (resolve, reject) {
- var i = 0;
- var len = Configuration$1.mainData.interfaces.length;
- var loop = function () {
- if (i < len) {
- var interf = Configuration$1.mainData.interfaces[i];
- if (MarkdownEngine$1.hasNeighbourReadmeFile(interf.file)) {
- logger.info(" ".concat(interf.name, " has a README file, include it"));
- var readme = MarkdownEngine$1.readNeighbourReadmeFile(interf.file);
- interf.readme = markedAcl(readme);
- }
- var page = {
- path: 'interfaces',
- name: interf.name,
- id: interf.id,
- navTabs: _this.getNavTabs(interf),
- context: 'interface',
- interface: interf,
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- };
- if (interf.isDuplicate) {
- page.name += '-' + interf.duplicateId;
- }
- Configuration$1.addPage(page);
- i++;
- loop();
- }
- else {
- resolve(true);
- }
- };
- loop();
- });
- };
- Application.prototype.prepareMiscellaneous = function (someMisc) {
- logger.info('Prepare miscellaneous');
- Configuration$1.mainData.miscellaneous = someMisc
- ? someMisc
- : DependenciesEngine$1.getMiscellaneous();
- return new Promise(function (resolve, reject) {
- if (Configuration$1.mainData.miscellaneous.functions.length > 0) {
- Configuration$1.addPage({
- path: 'miscellaneous',
- name: 'functions',
- id: 'miscellaneous-functions',
- context: 'miscellaneous-functions',
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- });
- }
- if (Configuration$1.mainData.miscellaneous.variables.length > 0) {
- Configuration$1.addPage({
- path: 'miscellaneous',
- name: 'variables',
- id: 'miscellaneous-variables',
- context: 'miscellaneous-variables',
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- });
- }
- if (Configuration$1.mainData.miscellaneous.typealiases.length > 0) {
- Configuration$1.addPage({
- path: 'miscellaneous',
- name: 'typealiases',
- id: 'miscellaneous-typealiases',
- context: 'miscellaneous-typealiases',
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- });
- }
- if (Configuration$1.mainData.miscellaneous.enumerations.length > 0) {
- Configuration$1.addPage({
- path: 'miscellaneous',
- name: 'enumerations',
- id: 'miscellaneous-enumerations',
- context: 'miscellaneous-enumerations',
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- });
- }
- resolve(true);
- });
- };
- Application.prototype.handleTemplateurl = function (component) {
- var dirname = path__namespace.dirname(component.file);
- var templatePath = path__namespace.resolve(dirname + path__namespace.sep + component.templateUrl);
- if (!FileEngine$1.existsSync(templatePath)) {
- var err = "Cannot read template for ".concat(component.name);
- logger.error(err);
- return new Promise(function (resolve, reject) { });
- }
- return FileEngine$1.get(templatePath).then(function (data) { return (component.templateData = data); }, function (err) {
- logger.error(err);
- return Promise.reject('');
- });
- };
- Application.prototype.handleStyles = function (component) {
- var styles = component.styles;
- component.stylesData = '';
- return new Promise(function (resolveStyles, rejectStyles) {
- styles.forEach(function (style) {
- component.stylesData = component.stylesData + style + '\n';
- });
- resolveStyles(true);
- });
- };
- Application.prototype.handleStyleurls = function (component) {
- var dirname = path__namespace.dirname(component.file);
- var styleDataPromise = component.styleUrls.map(function (styleUrl) {
- var stylePath = path__namespace.resolve(dirname + path__namespace.sep + styleUrl);
- if (!FileEngine$1.existsSync(stylePath)) {
- var err = "Cannot read style url ".concat(stylePath, " for ").concat(component.name);
- logger.error(err);
- return new Promise(function (resolve, reject) { });
- }
- return new Promise(function (resolve, reject) {
- FileEngine$1.get(stylePath).then(function (data) {
- resolve({
- data: data,
- styleUrl: styleUrl
- });
- });
- });
- });
- return Promise.all(styleDataPromise).then(function (data) { return (component.styleUrlsData = data); }, function (err) {
- logger.error(err);
- return Promise.reject('');
- });
- };
- Application.prototype.getNavTabs = function (dependency) {
- var navTabConfig = Configuration$1.mainData.navTabConfig;
- var hasCustomNavTabConfig = navTabConfig.length !== 0;
- navTabConfig =
- navTabConfig.length === 0
- ? ___namespace.cloneDeep(COMPODOC_CONSTANTS.navTabDefinitions)
- : navTabConfig;
- var matchDepType = function (depType) {
- return depType === 'all' || depType === dependency.type;
- };
- var navTabs = [];
- ___namespace.forEach(navTabConfig, function (customTab) {
- var navTab = ___namespace.find(COMPODOC_CONSTANTS.navTabDefinitions, { id: customTab.id });
- if (!navTab) {
- throw new Error("Invalid tab ID '".concat(customTab.id, "' specified in tab configuration"));
- }
- navTab.label = customTab.label;
- if (hasCustomNavTabConfig) {
- navTab.custom = true;
- }
- // is tab applicable to target dependency?
- if (-1 === ___namespace.findIndex(navTab.depTypes, matchDepType)) {
- return;
- }
- // global config
- if (customTab.id === 'tree' && Configuration$1.mainData.disableDomTree) {
- return;
- }
- if (customTab.id === 'source' && Configuration$1.mainData.disableSourceCode) {
- return;
- }
- if (customTab.id === 'templateData' && Configuration$1.mainData.disableTemplateTab) {
- return;
- }
- if (customTab.id === 'styleData' && Configuration$1.mainData.disableStyleTab) {
- return;
- }
- // per dependency config
- if (customTab.id === 'readme' && !dependency.readme) {
- return;
- }
- if (customTab.id === 'example' && !dependency.exampleUrls) {
- return;
- }
- if (customTab.id === 'templateData' &&
- (!dependency.templateUrl || dependency.templateUrl.length === 0)) {
- return;
- }
- if (customTab.id === 'styleData' &&
- (!dependency.styleUrls || dependency.styleUrls.length === 0) &&
- (!dependency.styles || dependency.styles.length === 0)) {
- return;
- }
- navTabs.push(navTab);
- });
- if (navTabs.length === 0) {
- throw new Error("No valid navigation tabs have been defined for dependency type '".concat(dependency.type, "'. Specify at least one config for the 'info' or 'source' tab in --navTabConfig."));
- }
- return navTabs;
- };
- Application.prototype.prepareControllers = function (someControllers) {
- var _this = this;
- logger.info('Prepare controllers');
- Configuration$1.mainData.controllers = someControllers
- ? someControllers
- : DependenciesEngine$1.getControllers();
- return new Promise(function (resolve, reject) {
- var i = 0;
- var len = Configuration$1.mainData.controllers.length;
- var loop = function () {
- if (i < len) {
- var controller = Configuration$1.mainData.controllers[i];
- var page = {
- path: 'controllers',
- name: controller.name,
- id: controller.id,
- navTabs: _this.getNavTabs(controller),
- context: 'controller',
- controller: controller,
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- };
- if (controller.isDuplicate) {
- page.name += '-' + controller.duplicateId;
- }
- Configuration$1.addPage(page);
- i++;
- loop();
- }
- else {
- resolve(true);
- }
- };
- loop();
- });
- };
- Application.prototype.prepareEntities = function (someEntities) {
- var _this = this;
- logger.info('Prepare entities');
- Configuration$1.mainData.entities = someEntities
- ? someEntities
- : DependenciesEngine$1.getEntities();
- return new Promise(function (resolve, reject) {
- var i = 0;
- var len = Configuration$1.mainData.entities.length;
- var loop = function () {
- if (i < len) {
- var entity = Configuration$1.mainData.entities[i];
- var page = {
- path: 'entities',
- name: entity.name,
- id: entity.id,
- navTabs: _this.getNavTabs(entity),
- context: 'entity',
- entity: entity,
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- };
- if (entity.isDuplicate) {
- page.name += '-' + entity.duplicateId;
- }
- Configuration$1.addPage(page);
- i++;
- loop();
- }
- else {
- resolve(true);
- }
- };
- loop();
- });
- };
- Application.prototype.prepareComponents = function (someComponents) {
- var _this = this;
- logger.info('Prepare components');
- Configuration$1.mainData.components = someComponents
- ? someComponents
- : DependenciesEngine$1.getComponents();
- return new Promise(function (mainPrepareComponentResolve, mainPrepareComponentReject) {
- var i = 0;
- var len = Configuration$1.mainData.components.length;
- var loop = function () {
- if (i <= len - 1) {
- var component_1 = Configuration$1.mainData.components[i];
- if (MarkdownEngine$1.hasNeighbourReadmeFile(component_1.file)) {
- logger.info(" ".concat(component_1.name, " has a README file, include it"));
- var readmeFile = MarkdownEngine$1.readNeighbourReadmeFile(component_1.file);
- component_1.readme = markedAcl(readmeFile);
- }
- var page = {
- path: 'components',
- name: component_1.name,
- id: component_1.id,
- navTabs: _this.getNavTabs(component_1),
- context: 'component',
- component: component_1,
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- };
- if (component_1.isDuplicate) {
- page.name += '-' + component_1.duplicateId;
- }
- Configuration$1.addPage(page);
- var componentTemplateUrlPromise = new Promise(function (componentTemplateUrlResolve, componentTemplateUrlReject) {
- if (component_1.templateUrl.length > 0) {
- logger.info(" ".concat(component_1.name, " has a templateUrl, include it"));
- _this.handleTemplateurl(component_1).then(function () {
- componentTemplateUrlResolve(true);
- }, function (e) {
- logger.error(e);
- componentTemplateUrlReject();
- });
- }
- else {
- componentTemplateUrlResolve(true);
- }
- });
- var componentStyleUrlsPromise = new Promise(function (componentStyleUrlsResolve, componentStyleUrlsReject) {
- if (component_1.styleUrls.length > 0) {
- logger.info(" ".concat(component_1.name, " has styleUrls, include them"));
- _this.handleStyleurls(component_1).then(function () {
- componentStyleUrlsResolve(true);
- }, function (e) {
- logger.error(e);
- componentStyleUrlsReject();
- });
- }
- else {
- componentStyleUrlsResolve(true);
- }
- });
- var componentStylesPromise = new Promise(function (componentStylesResolve, componentStylesReject) {
- if (component_1.styles.length > 0) {
- logger.info(" ".concat(component_1.name, " has styles, include them"));
- _this.handleStyles(component_1).then(function () {
- componentStylesResolve(true);
- }, function (e) {
- logger.error(e);
- componentStylesReject();
- });
- }
- else {
- componentStylesResolve(true);
- }
- });
- Promise.all([
- componentTemplateUrlPromise,
- componentStyleUrlsPromise,
- componentStylesPromise
- ]).then(function () {
- i++;
- loop();
- });
- }
- else {
- mainPrepareComponentResolve(true);
- }
- };
- loop();
- });
- };
- Application.prototype.prepareDirectives = function (someDirectives) {
- var _this = this;
- logger.info('Prepare directives');
- Configuration$1.mainData.directives = someDirectives
- ? someDirectives
- : DependenciesEngine$1.getDirectives();
- return new Promise(function (resolve, reject) {
- var i = 0;
- var len = Configuration$1.mainData.directives.length;
- var loop = function () {
- if (i < len) {
- var directive = Configuration$1.mainData.directives[i];
- if (MarkdownEngine$1.hasNeighbourReadmeFile(directive.file)) {
- logger.info(" ".concat(directive.name, " has a README file, include it"));
- var readme = MarkdownEngine$1.readNeighbourReadmeFile(directive.file);
- directive.readme = markedAcl(readme);
- }
- var page = {
- path: 'directives',
- name: directive.name,
- id: directive.id,
- navTabs: _this.getNavTabs(directive),
- context: 'directive',
- directive: directive,
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- };
- if (directive.isDuplicate) {
- page.name += '-' + directive.duplicateId;
- }
- Configuration$1.addPage(page);
- i++;
- loop();
- }
- else {
- resolve(true);
- }
- };
- loop();
- });
- };
- Application.prototype.prepareInjectables = function (someInjectables) {
- var _this = this;
- logger.info('Prepare injectables');
- Configuration$1.mainData.injectables = someInjectables
- ? someInjectables
- : DependenciesEngine$1.getInjectables();
- return new Promise(function (resolve, reject) {
- var i = 0;
- var len = Configuration$1.mainData.injectables.length;
- var loop = function () {
- if (i < len) {
- var injec = Configuration$1.mainData.injectables[i];
- if (MarkdownEngine$1.hasNeighbourReadmeFile(injec.file)) {
- logger.info(" ".concat(injec.name, " has a README file, include it"));
- var readme = MarkdownEngine$1.readNeighbourReadmeFile(injec.file);
- injec.readme = markedAcl(readme);
- }
- var page = {
- path: 'injectables',
- name: injec.name,
- id: injec.id,
- navTabs: _this.getNavTabs(injec),
- context: 'injectable',
- injectable: injec,
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- };
- if (injec.isDuplicate) {
- page.name += '-' + injec.duplicateId;
- }
- Configuration$1.addPage(page);
- i++;
- loop();
- }
- else {
- resolve();
- }
- };
- loop();
- });
- };
- Application.prototype.prepareInterceptors = function (someInterceptors) {
- var _this = this;
- logger.info('Prepare interceptors');
- Configuration$1.mainData.interceptors = someInterceptors
- ? someInterceptors
- : DependenciesEngine$1.getInterceptors();
- return new Promise(function (resolve, reject) {
- var i = 0;
- var len = Configuration$1.mainData.interceptors.length;
- var loop = function () {
- if (i < len) {
- var interceptor = Configuration$1.mainData.interceptors[i];
- if (MarkdownEngine$1.hasNeighbourReadmeFile(interceptor.file)) {
- logger.info(" ".concat(interceptor.name, " has a README file, include it"));
- var readme = MarkdownEngine$1.readNeighbourReadmeFile(interceptor.file);
- interceptor.readme = markedAcl(readme);
- }
- var page = {
- path: 'interceptors',
- name: interceptor.name,
- id: interceptor.id,
- navTabs: _this.getNavTabs(interceptor),
- context: 'interceptor',
- injectable: interceptor,
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- };
- if (interceptor.isDuplicate) {
- page.name += '-' + interceptor.duplicateId;
- }
- Configuration$1.addPage(page);
- i++;
- loop();
- }
- else {
- resolve();
- }
- };
- loop();
- });
- };
- Application.prototype.prepareGuards = function (someGuards) {
- var _this = this;
- logger.info('Prepare guards');
- Configuration$1.mainData.guards = someGuards ? someGuards : DependenciesEngine$1.getGuards();
- return new Promise(function (resolve, reject) {
- var i = 0;
- var len = Configuration$1.mainData.guards.length;
- var loop = function () {
- if (i < len) {
- var guard = Configuration$1.mainData.guards[i];
- if (MarkdownEngine$1.hasNeighbourReadmeFile(guard.file)) {
- logger.info(" ".concat(guard.name, " has a README file, include it"));
- var readme = MarkdownEngine$1.readNeighbourReadmeFile(guard.file);
- guard.readme = markedAcl(readme);
- }
- var page = {
- path: 'guards',
- name: guard.name,
- id: guard.id,
- navTabs: _this.getNavTabs(guard),
- context: 'guard',
- injectable: guard,
- depth: 1,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
- };
- if (guard.isDuplicate) {
- page.name += '-' + guard.duplicateId;
- }
- Configuration$1.addPage(page);
- i++;
- loop();
- }
- else {
- resolve();
- }
- };
- loop();
- });
- };
- Application.prototype.prepareRoutes = function () {
- logger.info('Process routes');
- Configuration$1.mainData.routes = DependenciesEngine$1.getRoutes();
- return new Promise(function (resolve, reject) {
- Configuration$1.addPage({
- name: 'routes',
- id: 'routes',
- context: 'routes',
- depth: 0,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
- });
- if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
- RouterParserUtil$1.generateRoutesIndex(Configuration$1.mainData.output, Configuration$1.mainData.routes).then(function () {
- logger.info(' Routes index generated');
- resolve();
- }, function (e) {
- logger.error(e);
- reject();
- });
- }
- else {
- resolve();
- }
- });
- };
- Application.prototype.prepareCoverage = function () {
- logger.info('Process documentation coverage report');
- return new Promise(function (resolve, reject) {
- /*
- * loop with components, directives, controllers, entities, classes, injectables, interfaces, pipes, guards, misc functions variables
- */
- var files = [];
- var totalProjectStatementDocumented = 0;
- var getStatus = function (percent) {
- var status;
- if (percent <= 25) {
- status = 'low';
- }
- else if (percent > 25 && percent <= 50) {
- status = 'medium';
- }
- else if (percent > 50 && percent <= 75) {
- status = 'good';
- }
- else {
- status = 'very-good';
- }
- return status;
- };
- var processComponentsAndDirectivesAndControllersAndEntities = function (list) {
- ___namespace.forEach(list, function (el) {
- var element = Object.assign({}, el);
- if (!element.propertiesClass) {
- element.propertiesClass = [];
- }
- if (!element.methodsClass) {
- element.methodsClass = [];
- }
- if (!element.hostBindings) {
- element.hostBindings = [];
- }
- if (!element.hostListeners) {
- element.hostListeners = [];
- }
- if (!element.inputsClass) {
- element.inputsClass = [];
- }
- if (!element.outputsClass) {
- element.outputsClass = [];
- }
- var cl = {
- filePath: element.file,
- type: element.type,
- linktype: element.type,
- name: element.name
- };
- var totalStatementDocumented = 0;
- var totalStatements = element.propertiesClass.length +
- element.methodsClass.length +
- element.inputsClass.length +
- element.hostBindings.length +
- element.hostListeners.length +
- element.outputsClass.length +
- 1; // +1 for element decorator comment
- if (element.constructorObj) {
- totalStatements += 1;
- if (element.constructorObj &&
- element.constructorObj.description &&
- element.constructorObj.description !== '') {
- totalStatementDocumented += 1;
- }
- }
- if (element.description && element.description !== '') {
- totalStatementDocumented += 1;
- }
- ___namespace.forEach(element.propertiesClass, function (property) {
- if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
- // Doesn't handle private for coverage
- totalStatements -= 1;
- }
- if (property.description &&
- property.description !== '' &&
- property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
- totalStatementDocumented += 1;
- }
- });
- ___namespace.forEach(element.methodsClass, function (method) {
- if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
- // Doesn't handle private for coverage
- totalStatements -= 1;
- }
- if (method.description &&
- method.description !== '' &&
- method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
- totalStatementDocumented += 1;
- }
- });
- ___namespace.forEach(element.hostBindings, function (property) {
- if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
- // Doesn't handle private for coverage
- totalStatements -= 1;
- }
- if (property.description &&
- property.description !== '' &&
- property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
- totalStatementDocumented += 1;
- }
- });
- ___namespace.forEach(element.hostListeners, function (method) {
- if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
- // Doesn't handle private for coverage
- totalStatements -= 1;
- }
- if (method.description &&
- method.description !== '' &&
- method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
- totalStatementDocumented += 1;
- }
- });
- ___namespace.forEach(element.inputsClass, function (input) {
- if (input.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
- // Doesn't handle private for coverage
- totalStatements -= 1;
- }
- if (input.description &&
- input.description !== '' &&
- input.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
- totalStatementDocumented += 1;
- }
- });
- ___namespace.forEach(element.outputsClass, function (output) {
- if (output.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
- // Doesn't handle private for coverage
- totalStatements -= 1;
- }
- if (output.description &&
- output.description !== '' &&
- output.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
- totalStatementDocumented += 1;
- }
- });
- cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
- if (totalStatements === 0) {
- cl.coveragePercent = 0;
- }
- cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
- cl.status = getStatus(cl.coveragePercent);
- totalProjectStatementDocumented += cl.coveragePercent;
- files.push(cl);
- });
- };
- var processCoveragePerFile = function () {
- logger.info('Process documentation coverage per file');
- logger.info('-------------------');
- var overFiles = files.filter(function (f) {
- var overTest = f.coveragePercent >= Configuration$1.mainData.coverageMinimumPerFile;
- if (overTest && !Configuration$1.mainData.coverageTestShowOnlyFailed) {
- logger.info("".concat(f.coveragePercent, " % for file ").concat(f.filePath, " - ").concat(f.name, " - over minimum per file"));
- }
- return overTest;
- });
- var underFiles = files.filter(function (f) {
- var underTest = f.coveragePercent < Configuration$1.mainData.coverageMinimumPerFile;
- if (underTest) {
- logger.error("".concat(f.coveragePercent, " % for file ").concat(f.filePath, " - ").concat(f.name, " - under minimum per file"));
- }
- return underTest;
- });
- logger.info('-------------------');
- return {
- overFiles: overFiles,
- underFiles: underFiles
- };
- };
- var processFunctionsAndVariables = function (id, type) {
- ___namespace.forEach(id, function (el) {
- var cl = {
- filePath: el.file,
- type: type,
- linktype: el.type,
- linksubtype: el.subtype,
- name: el.name
- };
- if (type === 'variable' || type === 'function' || type === 'type alias') {
- cl.linktype = 'miscellaneous';
- }
- var totalStatementDocumented = 0;
- var totalStatements = 1;
- if (el.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
- // Doesn't handle private for coverage
- totalStatements -= 1;
- }
- if (el.description &&
- el.description !== '' &&
- el.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
- totalStatementDocumented += 1;
- }
- cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
- cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
- cl.status = getStatus(cl.coveragePercent);
- totalProjectStatementDocumented += cl.coveragePercent;
- files.push(cl);
- });
- };
- var processClasses = function (list, type, linktype) {
- ___namespace.forEach(list, function (cl) {
- var element = Object.assign({}, cl);
- if (!element.properties) {
- element.properties = [];
- }
- if (!element.methods) {
- element.methods = [];
- }
- var cla = {
- filePath: element.file,
- type: type,
- linktype: linktype,
- name: element.name
- };
- var totalStatementDocumented = 0;
- var totalStatements = element.properties.length + element.methods.length + 1; // +1 for element itself
- if (element.constructorObj) {
- totalStatements += 1;
- if (element.constructorObj &&
- element.constructorObj.description &&
- element.constructorObj.description !== '') {
- totalStatementDocumented += 1;
- }
- }
- if (element.description && element.description !== '') {
- totalStatementDocumented += 1;
- }
- ___namespace.forEach(element.properties, function (property) {
- if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
- // Doesn't handle private for coverage
- totalStatements -= 1;
- }
- if (property.description &&
- property.description !== '' &&
- property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
- totalStatementDocumented += 1;
- }
- });
- ___namespace.forEach(element.methods, function (method) {
- if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
- // Doesn't handle private for coverage
- totalStatements -= 1;
- }
- if (method.description &&
- method.description !== '' &&
- method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
- totalStatementDocumented += 1;
- }
- });
- cla.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
- if (totalStatements === 0) {
- cla.coveragePercent = 0;
- }
- cla.coverageCount = totalStatementDocumented + '/' + totalStatements;
- cla.status = getStatus(cla.coveragePercent);
- totalProjectStatementDocumented += cla.coveragePercent;
- files.push(cla);
- });
- };
- processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.components);
- processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.directives);
- processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.controllers);
- processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.entities);
- processClasses(Configuration$1.mainData.classes, 'class', 'classe');
- processClasses(Configuration$1.mainData.injectables, 'injectable', 'injectable');
- processClasses(Configuration$1.mainData.interfaces, 'interface', 'interface');
- processClasses(Configuration$1.mainData.guards, 'guard', 'guard');
- processClasses(Configuration$1.mainData.interceptors, 'interceptor', 'interceptor');
- ___namespace.forEach(Configuration$1.mainData.pipes, function (pipe) {
- var cl = {
- filePath: pipe.file,
- type: pipe.type,
- linktype: pipe.type,
- name: pipe.name
- };
- var totalStatementDocumented = 0;
- var totalStatements = 1;
- if (pipe.description && pipe.description !== '') {
- totalStatementDocumented += 1;
- }
- cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
- cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
- cl.status = getStatus(cl.coveragePercent);
- totalProjectStatementDocumented += cl.coveragePercent;
- files.push(cl);
- });
- processFunctionsAndVariables(Configuration$1.mainData.miscellaneous.functions, 'function');
- processFunctionsAndVariables(Configuration$1.mainData.miscellaneous.variables, 'variable');
- processFunctionsAndVariables(Configuration$1.mainData.miscellaneous.typealiases, 'type alias');
- files = ___namespace.sortBy(files, ['filePath']);
- var coverageData = {
- count: files.length > 0
- ? Math.floor(totalProjectStatementDocumented / files.length)
- : 0,
- status: '',
- files: files
- };
- coverageData.status = getStatus(coverageData.count);
- Configuration$1.addPage({
- name: 'coverage',
- id: 'coverage',
- context: 'coverage',
- files: files,
- data: coverageData,
- depth: 0,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
- });
- coverageData.files = files;
- Configuration$1.mainData.coverageData = coverageData;
- if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
- HtmlEngine$1.generateCoverageBadge(Configuration$1.mainData.output, 'documentation', coverageData);
- }
- files = ___namespace.sortBy(files, ['coveragePercent']);
- var coverageTestPerFileResults;
- if (Configuration$1.mainData.coverageTest &&
- !Configuration$1.mainData.coverageTestPerFile) {
- // Global coverage test and not per file
- if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold) {
- logger.info("Documentation coverage (".concat(coverageData.count, "%) is over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"));
- generationPromiseResolve(true);
- process.exit(0);
- }
- else {
- var message = "Documentation coverage (".concat(coverageData.count, "%) is not over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)");
- generationPromiseReject();
- if (Configuration$1.mainData.coverageTestThresholdFail) {
- logger.error(message);
- process.exit(1);
- }
- else {
- logger.warn(message);
- process.exit(0);
- }
- }
- }
- else if (!Configuration$1.mainData.coverageTest &&
- Configuration$1.mainData.coverageTestPerFile) {
- coverageTestPerFileResults = processCoveragePerFile();
- // Per file coverage test and not global
- if (coverageTestPerFileResults.underFiles.length > 0) {
- var message = "Documentation coverage per file is not over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)");
- generationPromiseReject();
- if (Configuration$1.mainData.coverageTestThresholdFail) {
- logger.error(message);
- process.exit(1);
- }
- else {
- logger.warn(message);
- process.exit(0);
- }
- }
- else {
- logger.info("Documentation coverage per file is over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)"));
- generationPromiseResolve(true);
- process.exit(0);
- }
- }
- else if (Configuration$1.mainData.coverageTest &&
- Configuration$1.mainData.coverageTestPerFile) {
- // Per file coverage test and global
- coverageTestPerFileResults = processCoveragePerFile();
- if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold &&
- coverageTestPerFileResults.underFiles.length === 0) {
- logger.info("Documentation coverage (".concat(coverageData.count, "%) is over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"));
- logger.info("Documentation coverage per file is over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)"));
- generationPromiseResolve(true);
- process.exit(0);
- }
- else if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold &&
- coverageTestPerFileResults.underFiles.length > 0) {
- logger.info("Documentation coverage (".concat(coverageData.count, "%) is over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"));
- var message = "Documentation coverage per file is not over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)");
- generationPromiseReject();
- if (Configuration$1.mainData.coverageTestThresholdFail) {
- logger.error(message);
- process.exit(1);
- }
- else {
- logger.warn(message);
- process.exit(0);
- }
- }
- else if (coverageData.count < Configuration$1.mainData.coverageTestThreshold &&
- coverageTestPerFileResults.underFiles.length > 0) {
- var messageGlobal = "Documentation coverage (".concat(coverageData.count, "%) is not over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"), messagePerFile = "Documentation coverage per file is not over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)");
- generationPromiseReject();
- if (Configuration$1.mainData.coverageTestThresholdFail) {
- logger.error(messageGlobal);
- logger.error(messagePerFile);
- process.exit(1);
- }
- else {
- logger.warn(messageGlobal);
- logger.warn(messagePerFile);
- process.exit(0);
- }
- }
- else {
- var message = "Documentation coverage (".concat(coverageData.count, "%) is not over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"), messagePerFile = "Documentation coverage per file is over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)");
- generationPromiseReject();
- if (Configuration$1.mainData.coverageTestThresholdFail) {
- logger.error(message);
- logger.info(messagePerFile);
- process.exit(1);
- }
- else {
- logger.warn(message);
- logger.info(messagePerFile);
- process.exit(0);
- }
- }
- }
- else {
- resolve(true);
- }
- });
- };
- Application.prototype.prepareUnitTestCoverage = function () {
- logger.info('Process unit test coverage report');
- return new Promise(function (resolve, reject) {
- var covDat, covFileNames;
- var coverageData = Configuration$1.mainData.coverageData;
- if (!coverageData.files) {
- logger.warn('Missing documentation coverage data');
- }
- else {
- covDat = {};
- covFileNames = ___namespace.map(coverageData.files, function (el) {
- var fileName = path__namespace.normalize(el.filePath);
- covDat[fileName] = {
- type: el.type,
- linktype: el.linktype,
- linksubtype: el.linksubtype,
- name: el.name
- };
- return fileName;
- });
- }
- // read coverage summary file and data
- var unitTestSummary = {};
- var fileDat = FileEngine$1.getSync(Configuration$1.mainData.unitTestCoverage);
- if (fileDat) {
- unitTestSummary = JSON.parse(fileDat);
- }
- else {
- return Promise.reject('Error reading unit test coverage file');
- }
- var getCovStatus = function (percent, totalLines) {
- var status;
- if (totalLines === 0) {
- status = 'uncovered';
- }
- else if (percent <= 25) {
- status = 'low';
- }
- else if (percent > 25 && percent <= 50) {
- status = 'medium';
- }
- else if (percent > 50 && percent <= 75) {
- status = 'good';
- }
- else {
- status = 'very-good';
- }
- return status;
- };
- var getCoverageData = function (data, fileName) {
- var out = {};
- if (fileName !== 'total') {
- if (covDat === undefined) {
- // need a name to include in output but this isn't visible
- out = { name: fileName, filePath: fileName };
- }
- else {
- var findMatch = ___namespace.filter(covFileNames, function (el) {
- var normalizedFilename = path__namespace.normalize(fileName).replace(/\\/g, '/');
- return el.includes(fileName) || normalizedFilename.includes(el);
- });
- if (findMatch.length > 0) {
- out = ___namespace.clone(covDat[findMatch[0]]);
- out['filePath'] = fileName;
- }
- }
- }
- var keysToGet = ['statements', 'branches', 'functions', 'lines'];
- ___namespace.forEach(keysToGet, function (key) {
- if (data[key]) {
- var t = data[key];
- out[key] = {
- coveragePercent: Math.round(t.pct),
- coverageCount: '' + t.covered + '/' + t.total,
- status: getCovStatus(t.pct, t.total)
- };
- }
- });
- return out;
- };
- var unitTestData = {};
- var files = [];
- for (var file in unitTestSummary) {
- var dat = getCoverageData(unitTestSummary[file], file);
- if (file === 'total') {
- unitTestData['total'] = dat;
- }
- else {
- files.push(dat);
- }
- }
- unitTestData['files'] = files;
- unitTestData['idColumn'] = covDat !== undefined; // should we include the id column
- Configuration$1.mainData.unitTestData = unitTestData;
- Configuration$1.addPage({
- name: 'unit-test',
- id: 'unit-test',
- context: 'unit-test',
- files: files,
- data: unitTestData,
- depth: 0,
- pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
- });
- if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
- var keysToGet = ['statements', 'branches', 'functions', 'lines'];
- ___namespace.forEach(keysToGet, function (key) {
- if (unitTestData['total'][key]) {
- HtmlEngine$1.generateCoverageBadge(Configuration$1.mainData.output, key, {
- count: unitTestData['total'][key]['coveragePercent'],
- status: unitTestData['total'][key]['status']
- });
- }
- });
- }
- resolve(true);
- });
- };
- Application.prototype.processPage = function (page) {
- logger.info('Process page', page.name);
- var htmlData = HtmlEngine$1.render(Configuration$1.mainData, page);
- var finalPath = Configuration$1.mainData.output;
- if (Configuration$1.mainData.output.lastIndexOf('/') === -1) {
- finalPath += '/';
- }
- if (page.path) {
- finalPath += page.path + '/';
- }
- if (page.filename) {
- finalPath += page.filename + '.html';
- }
- else {
- finalPath += page.name + '.html';
- }
- if (!Configuration$1.mainData.disableSearch) {
- SearchEngine$1.indexPage({
- infos: page,
- rawData: htmlData,
- url: finalPath
- });
- }
- FileEngine$1.writeSync(finalPath, htmlData);
- return Promise.resolve(true);
- };
- Application.prototype.processPages = function () {
- var _this = this;
- var pages = ___namespace.sortBy(Configuration$1.pages, ['name']);
- logger.info('Process pages');
- Promise.all(pages.map(function (page) { return _this.processPage(page); }))
- .then(function () {
- var callbacksAfterGenerateSearchIndexJson = function () {
- if (Configuration$1.mainData.additionalPages.length > 0) {
- _this.processAdditionalPages();
- }
- else {
- if (Configuration$1.mainData.assetsFolder !== '') {
- _this.processAssetsFolder();
- }
- _this.processResources();
- }
- };
- if (!Configuration$1.mainData.disableSearch) {
- SearchEngine$1.generateSearchIndexJson(Configuration$1.mainData.output).then(function () {
- callbacksAfterGenerateSearchIndexJson();
- }, function (e) {
- logger.error(e);
- });
- }
- else {
- callbacksAfterGenerateSearchIndexJson();
- }
- })
- .then(function () {
- return _this.processMenu(Configuration$1.mainData);
- })
- .catch(function (e) {
- logger.error(e);
- });
- };
- Application.prototype.transpileMenuWCToES5 = function (es6Code) {
- return babel.transformAsync(es6Code, {
- cwd: __dirname,
- filename: 'menu-wc_es5.js',
- presets: [
- [
- '@babel/preset-env',
- {
- targets: {
- ie: '11'
- }
- }
- ]
- ],
- plugins: [
- [
- '@babel/plugin-transform-private-methods',
- {
- loose: false
- }
- ]
- ]
- });
- };
- Application.prototype.processMenu = function (mainData) {
- var _this = this;
- logger.info('Process menu...');
- return new Promise(function (resolveProcessMenu, rejectProcessMenu) {
- var output = mainData.output.slice();
- var outputLastCharacter = output.lastIndexOf('/');
- if (outputLastCharacter !== -1) {
- output = output.slice(0, -1);
- }
- var finalPathES6 = "".concat(output, "/js/menu-wc.js");
- var finalPathES5 = "".concat(output, "/js/menu-wc_es5.js");
- HtmlEngine$1.renderMenu(Configuration$1.mainData.templates, mainData)
- .then(function (htmlData) {
- FileEngine$1.write(finalPathES6, htmlData)
- .then(function () {
- _this.transpileMenuWCToES5(htmlData)
- .then(function (es5Data) {
- FileEngine$1.write(finalPathES5, es5Data.code)
- .then(function () {
- resolveProcessMenu();
- })
- .catch(function (err) {
- logger.error('Error during ' + finalPathES5 + ' page generation');
- logger.error(err);
- return rejectProcessMenu('');
- });
- })
- .catch(function (err) {
- logger.error('Error during ' + finalPathES5 + ' page generation');
- logger.error(err);
- return rejectProcessMenu('');
- });
- })
- .catch(function (err) {
- logger.error('Error during ' + finalPathES6 + ' page generation');
- logger.error(err);
- return rejectProcessMenu('');
- });
- })
- .catch(function (err) {
- logger.error('Error during ' + finalPathES6 + ' page generation');
- logger.error(err);
- return rejectProcessMenu('');
- });
- });
- };
- Application.prototype.processAdditionalPages = function () {
- var _this = this;
- logger.info('Process additional pages');
- var pages = Configuration$1.mainData.additionalPages;
- Promise.all(pages.map(function (page) {
- if (page.children.length > 0) {
- return Promise.all(__spreadArray([
- _this.processPage(page)
- ], __read(page.children.map(function (childPage) { return _this.processPage(childPage); })), false));
- }
- else {
- return _this.processPage(page);
- }
- }))
- .then(function () {
- SearchEngine$1.generateSearchIndexJson(Configuration$1.mainData.output).then(function () {
- if (Configuration$1.mainData.assetsFolder !== '') {
- _this.processAssetsFolder();
- }
- _this.processResources();
- });
- })
- .catch(function (e) {
- logger.error(e);
- return Promise.reject(e);
- });
- };
- Application.prototype.processAssetsFolder = function () {
- logger.info('Copy assets folder');
- if (!FileEngine$1.existsSync(Configuration$1.mainData.assetsFolder)) {
- logger.error("Provided assets folder ".concat(Configuration$1.mainData.assetsFolder, " did not exist"));
- }
- else {
- var finalOutput = Configuration$1.mainData.output;
- var testOutputDir = Configuration$1.mainData.output.match(cwd$1);
- if (testOutputDir && testOutputDir.length > 0) {
- finalOutput = Configuration$1.mainData.output.replace(cwd$1 + path__namespace.sep, '');
- }
- var destination = path__namespace.join(finalOutput, path__namespace.basename(Configuration$1.mainData.assetsFolder));
- fs__namespace.copy(path__namespace.resolve(Configuration$1.mainData.assetsFolder), path__namespace.resolve(destination), function (err) {
- if (err) {
- logger.error('Error during resources copy ', err);
- }
- });
- }
- };
- Application.prototype.processResources = function () {
- var _this = this;
- logger.info('Copy main resources');
- var onComplete = function () {
- logger.info('Documentation generated in ' +
- Configuration$1.mainData.output +
- ' in ' +
- _this.getElapsedTime() +
- ' seconds using ' +
- Configuration$1.mainData.theme +
- ' theme');
- if (Configuration$1.mainData.serve) {
- logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(Configuration$1.mainData.port));
- _this.runWebServer(Configuration$1.mainData.output);
- }
- else {
- generationPromiseResolve(true);
- _this.endCallback();
- }
- };
- var finalOutput = Configuration$1.mainData.output;
- var testOutputDir = Configuration$1.mainData.output.match(cwd$1);
- if (testOutputDir && testOutputDir.length > 0) {
- finalOutput = Configuration$1.mainData.output.replace(cwd$1 + path__namespace.sep, '');
- }
- fs__namespace.copy(path__namespace.resolve(__dirname + '/../src/resources/'), path__namespace.resolve(finalOutput), function (errorCopy) {
- if (errorCopy) {
- logger.error('Error during resources copy ', errorCopy);
- }
- else {
- var extThemePromise = new Promise(function (extThemeResolve, extThemeReject) {
- if (Configuration$1.mainData.extTheme) {
- fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.extTheme), path__namespace.resolve(finalOutput + '/styles/'), function (errorCopyTheme) {
- if (errorCopyTheme) {
- logger.error('Error during external styling theme copy ', errorCopyTheme);
- extThemeReject();
- }
- else {
- logger.info('External styling theme copy succeeded');
- extThemeResolve(true);
- }
- });
- }
- else {
- extThemeResolve(true);
- }
- });
- var customFaviconPromise = new Promise(function (customFaviconResolve, customFaviconReject) {
- if (Configuration$1.mainData.customFavicon !== '') {
- logger.info("Custom favicon supplied");
- fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.customFavicon), path__namespace.resolve(finalOutput + '/images/favicon.ico'), function (errorCopyFavicon) {
- // tslint:disable-line
- if (errorCopyFavicon) {
- logger.error('Error during resources copy of favicon', errorCopyFavicon);
- customFaviconReject();
- }
- else {
- logger.info('External custom favicon copy succeeded');
- customFaviconResolve(true);
- }
- });
- }
- else {
- customFaviconResolve(true);
- }
- });
- var customLogoPromise = new Promise(function (customLogoResolve, customLogoReject) {
- if (Configuration$1.mainData.customLogo !== '') {
- logger.info("Custom logo supplied");
- fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.customLogo), path__namespace.resolve(finalOutput +
- '/images/' +
- Configuration$1.mainData.customLogo.split('/').pop()), function (errorCopyLogo) {
- // tslint:disable-line
- if (errorCopyLogo) {
- logger.error('Error during resources copy of logo', errorCopyLogo);
- customLogoReject();
- }
- else {
- logger.info('External custom logo copy succeeded');
- customLogoResolve(true);
- }
- });
- }
- else {
- customLogoResolve(true);
- }
- });
- Promise.all([extThemePromise, customFaviconPromise, customLogoPromise]).then(function () {
- onComplete();
- });
- }
- });
- };
- /**
- * Calculates the elapsed time since the program was started.
- *
- * @returns {number}
- */
- Application.prototype.getElapsedTime = function () {
- return (new Date().valueOf() - startTime.valueOf()) / 1000;
- };
- Application.prototype.processGraphs = function () {
- var _this = this;
- if (Configuration$1.mainData.disableGraph) {
- logger.info('Graph generation disabled');
- this.processPages();
- }
- else {
- logger.info('Process main graph');
- var modules_1 = Configuration$1.mainData.modules;
- var i_1 = 0;
- var len_1 = modules_1.length;
- var loop_1 = function () {
- if (i_1 <= len_1 - 1) {
- logger.info('Process module graph ', modules_1[i_1].name);
- var finalPath_2 = Configuration$1.mainData.output;
- if (Configuration$1.mainData.output.lastIndexOf('/') === -1) {
- finalPath_2 += '/';
- }
- finalPath_2 += 'modules/' + modules_1[i_1].name;
- var _rawModule = DependenciesEngine$1.getRawModule(modules_1[i_1].name);
- if (_rawModule.declarations.length > 0 ||
- _rawModule.bootstrap.length > 0 ||
- _rawModule.imports.length > 0 ||
- _rawModule.exports.length > 0 ||
- _rawModule.providers.length > 0) {
- NgdEngine$1.renderGraph(modules_1[i_1].file, finalPath_2, 'f', modules_1[i_1].name).then(function () {
- NgdEngine$1.readGraph(path__namespace.resolve(finalPath_2 + path__namespace.sep + 'dependencies.svg'), modules_1[i_1].name).then(function (data) {
- modules_1[i_1].graph = data;
- i_1++;
- loop_1();
- }, function (err) {
- logger.error('Error during graph read: ', err);
- });
- }, function (errorMessage) {
- logger.error(errorMessage);
- });
- }
- else {
- i_1++;
- loop_1();
- }
- }
- else {
- _this.processPages();
- }
- };
- var finalMainGraphPath_1 = Configuration$1.mainData.output;
- if (finalMainGraphPath_1.lastIndexOf('/') === -1) {
- finalMainGraphPath_1 += '/';
- }
- finalMainGraphPath_1 += 'graph';
- NgdEngine$1.init(path__namespace.resolve(finalMainGraphPath_1));
- NgdEngine$1.renderGraph(Configuration$1.mainData.tsconfig, path__namespace.resolve(finalMainGraphPath_1), 'p').then(function () {
- NgdEngine$1.readGraph(path__namespace.resolve(finalMainGraphPath_1 + path__namespace.sep + 'dependencies.svg'), 'Main graph').then(function (data) {
- Configuration$1.mainData.mainGraph = data;
- loop_1();
- }, function (err) {
- logger.error('Error during main graph reading : ', err);
- Configuration$1.mainData.disableMainGraph = true;
- loop_1();
- });
- }, function (err) {
- logger.error('Ooops error during main graph generation, moving on next part with main graph disabled : ', err);
- Configuration$1.mainData.disableMainGraph = true;
- loop_1();
- });
- }
- };
- Application.prototype.runWebServer = function (folder) {
- if (!this.isWatching) {
- var liveServerConfiguration = {
- root: folder,
- open: Configuration$1.mainData.open,
- quiet: true,
- logLevel: 0,
- wait: 1000,
- port: Configuration$1.mainData.port
- };
- if (Configuration$1.mainData.host !== '') {
- liveServerConfiguration.host = Configuration$1.mainData.host;
- }
- LiveServer__namespace.start(liveServerConfiguration);
- }
- if (Configuration$1.mainData.watch && !this.isWatching) {
- if (typeof this.files === 'undefined') {
- logger.error('No sources files available, please use -p flag');
- generationPromiseReject();
- process.exit(1);
- }
- else {
- this.runWatch();
- }
- }
- else if (Configuration$1.mainData.watch && this.isWatching) {
- var srcFolder = findMainSourceFolder(this.files);
- logger.info("Already watching sources in ".concat(srcFolder, " folder"));
- }
- };
- Application.prototype.runWatch = function () {
- var _this = this;
- var sources = [findMainSourceFolder(this.files)];
- var watcherReady = false;
- this.isWatching = true;
- logger.info("Watching sources in ".concat(findMainSourceFolder(this.files), " folder"));
- if (MarkdownEngine$1.hasRootMarkdowns()) {
- sources = sources.concat(MarkdownEngine$1.listRootMarkdowns());
- }
- if (Configuration$1.mainData.includes !== '') {
- sources = sources.concat(Configuration$1.mainData.includes);
- }
- // Check all elements of sources list exist
- sources = cleanSourcesForWatch(sources);
- var watcher = chokidar.watch(sources, {
- awaitWriteFinish: true,
- ignoreInitial: true,
- ignored: /(spec|\.d)\.ts/
- });
- var timerAddAndRemoveRef;
- var timerChangeRef;
- var runnerAddAndRemove = function () {
- startTime = new Date();
- _this.generate();
- };
- var waiterAddAndRemove = function () {
- clearTimeout(timerAddAndRemoveRef);
- timerAddAndRemoveRef = setTimeout(runnerAddAndRemove, 1000);
- };
- var runnerChange = function () {
- startTime = new Date();
- _this.setUpdatedFiles(_this.watchChangedFiles);
- if (_this.hasWatchedFilesTSFiles()) {
- _this.getMicroDependenciesData();
- }
- else if (_this.hasWatchedFilesRootMarkdownFiles()) {
- _this.rebuildRootMarkdowns();
- }
- else {
- _this.rebuildExternalDocumentation();
- }
- };
- var waiterChange = function () {
- clearTimeout(timerChangeRef);
- timerChangeRef = setTimeout(runnerChange, 1000);
- };
- watcher.on('ready', function () {
- if (!watcherReady) {
- watcherReady = true;
- watcher
- .on('add', function (file) {
- logger.debug("File ".concat(file, " has been added"));
- // Test extension, if ts
- // rescan everything
- if (path__namespace.extname(file) === '.ts') {
- waiterAddAndRemove();
- }
- })
- .on('change', function (file) {
- logger.debug("File ".concat(file, " has been changed"));
- // Test extension, if ts
- // rescan only file
- if (path__namespace.extname(file) === '.ts' ||
- path__namespace.extname(file) === '.md' ||
- path__namespace.extname(file) === '.json') {
- _this.watchChangedFiles.push(path__namespace.join(cwd$1 + path__namespace.sep + file));
- waiterChange();
- }
- })
- .on('unlink', function (file) {
- logger.debug("File ".concat(file, " has been removed"));
- // Test extension, if ts
- // rescan everything
- if (path__namespace.extname(file) === '.ts') {
- waiterAddAndRemove();
- }
- });
- }
- });
- };
- Object.defineProperty(Application.prototype, "application", {
- /**
- * Return the application / root component instance.
- */
- get: function () {
- return this;
- },
- enumerable: false,
- configurable: true
- });
- Object.defineProperty(Application.prototype, "isCLI", {
- get: function () {
- return false;
- },
- enumerable: false,
- configurable: true
- });
- return Application;
- }());
- var fg = require('fast-glob');
- var os = require('os');
- var osName = require('os-name');
- var pkg = require('../package.json');
- var program = require('commander').program;
- var cosmiconfigModuleName = 'compodoc';
- var scannedFiles = [];
- var excludeFiles = EXCLUDE_PATTERNS;
- var includeFiles = [];
- var cwd = process.cwd();
- process.setMaxListeners(0);
- var CliApplication = /** @class */ (function (_super) {
- __extends(CliApplication, _super);
- function CliApplication() {
- return _super !== null && _super.apply(this, arguments) || this;
- }
- /**
- * Run compodoc from the command line.
- */
- CliApplication.prototype.start = function () {
- var _this = this;
- function list(val) {
- return val.split(',');
- }
- program
- .version(pkg.version)
- .usage('<src> [options]')
- .option('-c, --config [config]', 'A configuration file : .compodocrc, .compodocrc.json, .compodocrc.yaml or compodoc property in package.json')
- .option('-p, --tsconfig [config]', 'A tsconfig.json file')
- .option('-d, --output [folder]', 'Where to store the generated documentation', COMPODOC_DEFAULTS.folder)
- .option('-y, --extTheme [file]', 'External styling theme file')
- .option('-n, --name [name]', 'Title documentation', COMPODOC_DEFAULTS.title)
- .option('-a, --assetsFolder [folder]', 'External assets folder to copy in generated documentation folder')
- .option('-o, --open [value]', 'Open the generated documentation')
- .option('-t, --silent', "In silent mode, log messages aren't logged in the console", false)
- .option('-s, --serve', 'Serve generated documentation (default http://localhost:8080/)', false)
- .option('--host [host]', 'Change default host address')
- .option('-r, --port [port]', 'Change default serving port', COMPODOC_DEFAULTS.port)
- .option('-w, --watch', 'Watch source files after serve and force documentation rebuild', false)
- .option('-e, --exportFormat [format]', 'Export in specified format (json, html)', COMPODOC_DEFAULTS.exportFormat)
- .option('--files [files]', 'Files provided by external tool, used for coverage test')
- .option('--language [language]', 'Language used for the generated documentation (bg-BG, de-DE, en-US, es-ES, fr-FR, hu-HU, it-IT, ja-JP, ka-GE, ko-KR, nl-NL, pl-PL, pt-BR, ru-RU, sk-SK, zh-CN, zh-TW)', COMPODOC_DEFAULTS.language)
- .option('--theme [theme]', "Choose one of available themes, default is 'gitbook' (laravel, original, material, postmark, readthedocs, stripe, vagrant)")
- .option('--hideGenerator', 'Do not print the Compodoc link at the bottom of the page', false)
- .option('--hideDarkModeToggle', 'Do not show dark mode toggle button at the top right position of the page', false)
- .option('--toggleMenuItems <items>', "Close by default items in the menu values : ['all'] or one of these ['modules','components','directives','controllers','entities','classes','injectables','guards','interfaces','interceptors','pipes','miscellaneous','additionalPages']", list, COMPODOC_DEFAULTS.toggleMenuItems)
- .option('--navTabConfig <tab configs>', "List navigation tab objects in the desired order with two string properties (\"id\" and \"label\"). Double-quotes must be escaped with '\\'. Available tab IDs are \"info\", \"readme\", \"source\", \"templateData\", \"styleData\", \"tree\", and \"example\". Note: Certain tabs will only be shown if applicable to a given dependency", list, JSON.stringify(COMPODOC_DEFAULTS.navTabConfig))
- .option('--templates [folder]', 'Path to directory of Handlebars templates to override built-in templates')
- .option('--includes [path]', 'Path of external markdown files to include')
- .option('--includesName [name]', 'Name of item menu of externals markdown files', COMPODOC_DEFAULTS.additionalEntryName)
- .option('--coverageTest [threshold]', 'Test command of documentation coverage with a threshold (default 70)')
- .option('--coverageMinimumPerFile [minimum]', 'Test command of documentation coverage per file with a minimum (default 0)')
- .option('--coverageTestThresholdFail [true|false]', 'Test command of documentation coverage (global or per file) will fail with error or just warn user (true: error, false: warn)', COMPODOC_DEFAULTS.coverageTestThresholdFail)
- .option('--coverageTestShowOnlyFailed', 'Display only failed files for a coverage test')
- .option('--unitTestCoverage [json-summary]', 'To include unit test coverage, specify istanbul JSON coverage summary file')
- .option('--disableSourceCode', 'Do not add source code tab and links to source code', false)
- .option('--disableDomTree', 'Do not add dom tree tab', false)
- .option('--disableTemplateTab', 'Do not add template tab', false)
- .option('--disableStyleTab', 'Do not add style tab', false)
- .option('--disableGraph', 'Do not add the dependency graph', false)
- .option('--disableCoverage', 'Do not add the documentation coverage report', false)
- .option('--disablePrivate', 'Do not show private in generated documentation', false)
- .option('--disableProtected', 'Do not show protected in generated documentation', false)
- .option('--disableInternal', 'Do not show @internal in generated documentation', false)
- .option('--disableLifeCycleHooks', 'Do not show Angular lifecycle hooks in generated documentation', false)
- .option('--disableConstructors', 'Do not show constructors in generated documentation', false)
- .option('--disableRoutesGraph', 'Do not add the routes graph', COMPODOC_DEFAULTS.disableRoutesGraph)
- .option('--disableSearch', 'Do not add the search input', false)
- .option('--disableDependencies', 'Do not add the dependencies list', COMPODOC_DEFAULTS.disableDependencies)
- .option('--disableProperties', 'Do not add the properties list', COMPODOC_DEFAULTS.disableProperties)
- .option('--minimal', 'Minimal mode with only documentation. No search, no graph, no coverage.', false)
- .option('--customFavicon [path]', 'Use a custom favicon')
- .option('--customLogo [path]', 'Use a custom logo')
- .option('--gaID [id]', 'Google Analytics tracking ID')
- .option('--gaSite [site]', 'Google Analytics site name', COMPODOC_DEFAULTS.gaSite)
- .option('--maxSearchResults [maxSearchResults]', 'Max search results on the results page. To show all results, set to 0', COMPODOC_DEFAULTS.maxSearchResults)
- .parse(process.argv);
- var outputHelp = function () {
- program.outputHelp();
- process.exit(1);
- };
- var configExplorer = cosmiconfig.cosmiconfigSync(cosmiconfigModuleName);
- var configExplorerResult;
- var configFile = {};
- var programOptions = program.opts();
- if (programOptions.config) {
- var configFilePath = programOptions.config;
- var testConfigFilePath = configFilePath.match(process.cwd());
- if (testConfigFilePath && testConfigFilePath.length > 0) {
- configFilePath = configFilePath.replace(process.cwd() + path__namespace.sep, '');
- }
- configExplorerResult = configExplorer.load(path__namespace.resolve(configFilePath));
- }
- else {
- configExplorerResult = configExplorer.search();
- }
- if (configExplorerResult) {
- if (typeof configExplorerResult.config !== 'undefined') {
- configFile = configExplorerResult.config;
- }
- }
- if (configFile.output) {
- Configuration$1.mainData.output = configFile.output;
- }
- if (programOptions.output && programOptions.output !== COMPODOC_DEFAULTS.folder) {
- Configuration$1.mainData.output = programOptions.output;
- }
- if (configFile.extTheme) {
- Configuration$1.mainData.extTheme = configFile.extTheme;
- }
- if (programOptions.extTheme) {
- Configuration$1.mainData.extTheme = programOptions.extTheme;
- }
- if (configFile.language) {
- Configuration$1.mainData.language = configFile.language;
- }
- if (programOptions.language) {
- Configuration$1.mainData.language = programOptions.language;
- }
- if (configFile.theme) {
- Configuration$1.mainData.theme = configFile.theme;
- }
- if (programOptions.theme) {
- Configuration$1.mainData.theme = programOptions.theme;
- }
- if (configFile.name) {
- Configuration$1.mainData.documentationMainName = configFile.name;
- }
- if (programOptions.name && programOptions.name !== COMPODOC_DEFAULTS.title) {
- Configuration$1.mainData.documentationMainName = programOptions.name;
- }
- if (configFile.assetsFolder) {
- Configuration$1.mainData.assetsFolder = configFile.assetsFolder;
- }
- if (programOptions.assetsFolder) {
- Configuration$1.mainData.assetsFolder = programOptions.assetsFolder;
- }
- if (configFile.open) {
- Configuration$1.mainData.open = configFile.open;
- }
- if (programOptions.open) {
- Configuration$1.mainData.open = programOptions.open;
- }
- if (configFile.toggleMenuItems) {
- Configuration$1.mainData.toggleMenuItems = configFile.toggleMenuItems;
- }
- if (programOptions.toggleMenuItems &&
- programOptions.toggleMenuItems !== COMPODOC_DEFAULTS.toggleMenuItems) {
- Configuration$1.mainData.toggleMenuItems = programOptions.toggleMenuItems;
- }
- if (configFile.templates) {
- Configuration$1.mainData.templates = configFile.templates;
- }
- if (programOptions.templates) {
- Configuration$1.mainData.templates = programOptions.templates;
- }
- if (configFile.navTabConfig) {
- Configuration$1.mainData.navTabConfig = configFile.navTabConfig;
- }
- if (programOptions.navTabConfig &&
- JSON.parse(programOptions.navTabConfig).length !== COMPODOC_DEFAULTS.navTabConfig.length) {
- Configuration$1.mainData.navTabConfig = JSON.parse(programOptions.navTabConfig);
- }
- if (configFile.includes) {
- Configuration$1.mainData.includes = configFile.includes;
- }
- if (programOptions.includes) {
- Configuration$1.mainData.includes = programOptions.includes;
- }
- if (configFile.includesName) {
- Configuration$1.mainData.includesName = configFile.includesName;
- }
- if (programOptions.includesName &&
- programOptions.includesName !== COMPODOC_DEFAULTS.additionalEntryName) {
- Configuration$1.mainData.includesName = programOptions.includesName;
- }
- if (configFile.silent) {
- logger.silent = false;
- }
- if (programOptions.silent) {
- logger.silent = false;
- }
- if (configFile.serve) {
- Configuration$1.mainData.serve = configFile.serve;
- }
- if (programOptions.serve) {
- Configuration$1.mainData.serve = programOptions.serve;
- }
- if (configFile.host) {
- Configuration$1.mainData.host = configFile.host;
- Configuration$1.mainData.hostname = configFile.host;
- }
- if (programOptions.host) {
- Configuration$1.mainData.host = programOptions.host;
- Configuration$1.mainData.hostname = programOptions.host;
- }
- if (configFile.port) {
- Configuration$1.mainData.port = configFile.port;
- }
- if (programOptions.port && programOptions.port !== COMPODOC_DEFAULTS.port) {
- Configuration$1.mainData.port = programOptions.port;
- }
- if (configFile.watch) {
- Configuration$1.mainData.watch = configFile.watch;
- }
- if (programOptions.watch) {
- Configuration$1.mainData.watch = programOptions.watch;
- }
- if (configFile.exportFormat) {
- Configuration$1.mainData.exportFormat = configFile.exportFormat;
- }
- if (programOptions.exportFormat &&
- programOptions.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
- Configuration$1.mainData.exportFormat = programOptions.exportFormat;
- }
- if (configFile.hideGenerator) {
- Configuration$1.mainData.hideGenerator = configFile.hideGenerator;
- }
- if (programOptions.hideGenerator) {
- Configuration$1.mainData.hideGenerator = programOptions.hideGenerator;
- }
- if (configFile.hideDarkModeToggle) {
- Configuration$1.mainData.hideDarkModeToggle = configFile.hideDarkModeToggle;
- }
- if (programOptions.hideDarkModeToggle) {
- Configuration$1.mainData.hideDarkModeToggle = programOptions.hideDarkModeToggle;
- }
- if (configFile.coverageTest) {
- Configuration$1.mainData.coverageTest = true;
- Configuration$1.mainData.coverageTestThreshold =
- typeof configFile.coverageTest === 'string'
- ? parseInt(configFile.coverageTest, 10)
- : COMPODOC_DEFAULTS.defaultCoverageThreshold;
- }
- if (programOptions.coverageTest) {
- Configuration$1.mainData.coverageTest = true;
- Configuration$1.mainData.coverageTestThreshold =
- typeof programOptions.coverageTest === 'string'
- ? parseInt(programOptions.coverageTest, 10)
- : COMPODOC_DEFAULTS.defaultCoverageThreshold;
- }
- if (configFile.coverageMinimumPerFile) {
- Configuration$1.mainData.coverageTestPerFile = true;
- Configuration$1.mainData.coverageMinimumPerFile =
- typeof configFile.coverageMinimumPerFile === 'string'
- ? parseInt(configFile.coverageMinimumPerFile, 10)
- : COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
- }
- if (programOptions.coverageMinimumPerFile) {
- Configuration$1.mainData.coverageTestPerFile = true;
- Configuration$1.mainData.coverageMinimumPerFile =
- typeof programOptions.coverageMinimumPerFile === 'string'
- ? parseInt(programOptions.coverageMinimumPerFile, 10)
- : COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
- }
- if (configFile.coverageTestThresholdFail) {
- Configuration$1.mainData.coverageTestThresholdFail =
- configFile.coverageTestThresholdFail === 'false' ? false : true;
- }
- if (programOptions.coverageTestThresholdFail) {
- Configuration$1.mainData.coverageTestThresholdFail =
- programOptions.coverageTestThresholdFail === 'false' ? false : true;
- }
- if (configFile.coverageTestShowOnlyFailed) {
- Configuration$1.mainData.coverageTestShowOnlyFailed =
- configFile.coverageTestShowOnlyFailed;
- }
- if (programOptions.coverageTestShowOnlyFailed) {
- Configuration$1.mainData.coverageTestShowOnlyFailed =
- programOptions.coverageTestShowOnlyFailed;
- }
- if (configFile.unitTestCoverage) {
- Configuration$1.mainData.unitTestCoverage = configFile.unitTestCoverage;
- }
- if (programOptions.unitTestCoverage) {
- Configuration$1.mainData.unitTestCoverage = programOptions.unitTestCoverage;
- }
- if (configFile.disableSourceCode) {
- Configuration$1.mainData.disableSourceCode = configFile.disableSourceCode;
- }
- if (programOptions.disableSourceCode) {
- Configuration$1.mainData.disableSourceCode = programOptions.disableSourceCode;
- }
- if (configFile.disableDomTree) {
- Configuration$1.mainData.disableDomTree = configFile.disableDomTree;
- }
- if (programOptions.disableDomTree) {
- Configuration$1.mainData.disableDomTree = programOptions.disableDomTree;
- }
- if (configFile.disableTemplateTab) {
- Configuration$1.mainData.disableTemplateTab = configFile.disableTemplateTab;
- }
- if (programOptions.disableTemplateTab) {
- Configuration$1.mainData.disableTemplateTab = programOptions.disableTemplateTab;
- }
- if (configFile.disableStyleTab) {
- Configuration$1.mainData.disableStyleTab = configFile.disableStyleTab;
- }
- if (programOptions.disableStyleTab) {
- Configuration$1.mainData.disableStyleTab = programOptions.disableStyleTab;
- }
- if (configFile.disableGraph) {
- Configuration$1.mainData.disableGraph = configFile.disableGraph;
- }
- if (programOptions.disableGraph) {
- Configuration$1.mainData.disableGraph = programOptions.disableGraph;
- }
- if (configFile.disableCoverage) {
- Configuration$1.mainData.disableCoverage = configFile.disableCoverage;
- }
- if (programOptions.disableCoverage) {
- Configuration$1.mainData.disableCoverage = programOptions.disableCoverage;
- }
- if (configFile.disablePrivate) {
- Configuration$1.mainData.disablePrivate = configFile.disablePrivate;
- }
- if (programOptions.disablePrivate) {
- Configuration$1.mainData.disablePrivate = programOptions.disablePrivate;
- }
- if (configFile.disableProtected) {
- Configuration$1.mainData.disableProtected = configFile.disableProtected;
- }
- if (programOptions.disableProtected) {
- Configuration$1.mainData.disableProtected = programOptions.disableProtected;
- }
- if (configFile.disableInternal) {
- Configuration$1.mainData.disableInternal = configFile.disableInternal;
- }
- if (programOptions.disableInternal) {
- Configuration$1.mainData.disableInternal = programOptions.disableInternal;
- }
- if (configFile.disableLifeCycleHooks) {
- Configuration$1.mainData.disableLifeCycleHooks = configFile.disableLifeCycleHooks;
- }
- if (programOptions.disableLifeCycleHooks) {
- Configuration$1.mainData.disableLifeCycleHooks = programOptions.disableLifeCycleHooks;
- }
- if (configFile.disableConstructors) {
- Configuration$1.mainData.disableConstructors = configFile.disableConstructors;
- }
- if (programOptions.disableConstructors) {
- Configuration$1.mainData.disableConstructors = programOptions.disableConstructors;
- }
- if (configFile.disableRoutesGraph) {
- Configuration$1.mainData.disableRoutesGraph = configFile.disableRoutesGraph;
- }
- if (programOptions.disableRoutesGraph) {
- Configuration$1.mainData.disableRoutesGraph = programOptions.disableRoutesGraph;
- }
- if (configFile.disableSearch) {
- Configuration$1.mainData.disableSearch = configFile.disableSearch;
- }
- if (programOptions.disableSearch) {
- Configuration$1.mainData.disableSearch = programOptions.disableSearch;
- }
- if (configFile.disableDependencies) {
- Configuration$1.mainData.disableDependencies = configFile.disableDependencies;
- }
- if (programOptions.disableDependencies) {
- Configuration$1.mainData.disableDependencies = programOptions.disableDependencies;
- }
- if (configFile.disableProperties) {
- Configuration$1.mainData.disableProperties = configFile.disableProperties;
- }
- if (programOptions.disableProperties) {
- Configuration$1.mainData.disableProperties = programOptions.disableProperties;
- }
- if (configFile.minimal) {
- Configuration$1.mainData.disableSearch = true;
- Configuration$1.mainData.disableRoutesGraph = true;
- Configuration$1.mainData.disableGraph = true;
- Configuration$1.mainData.disableCoverage = true;
- }
- if (programOptions.minimal) {
- Configuration$1.mainData.disableSearch = true;
- Configuration$1.mainData.disableRoutesGraph = true;
- Configuration$1.mainData.disableGraph = true;
- Configuration$1.mainData.disableCoverage = true;
- }
- if (configFile.customFavicon) {
- Configuration$1.mainData.customFavicon = configFile.customFavicon;
- }
- if (programOptions.customFavicon) {
- Configuration$1.mainData.customFavicon = programOptions.customFavicon;
- }
- if (configFile.customLogo) {
- Configuration$1.mainData.customLogo = configFile.customLogo;
- }
- if (programOptions.customLogo) {
- Configuration$1.mainData.customLogo = programOptions.customLogo;
- }
- if (configFile.gaID) {
- Configuration$1.mainData.gaID = configFile.gaID;
- }
- if (programOptions.gaID) {
- Configuration$1.mainData.gaID = programOptions.gaID;
- }
- if (configFile.gaSite) {
- Configuration$1.mainData.gaSite = configFile.gaSite;
- }
- if (programOptions.gaSite && programOptions.gaSite !== COMPODOC_DEFAULTS.gaSite) {
- Configuration$1.mainData.gaSite = programOptions.gaSite;
- }
- if (!this.isWatching) {
- if (!logger.silent) {
- console.log("Compodoc v".concat(pkg.version));
- }
- else {
- console.log(fs__namespace.readFileSync(path__namespace.join(__dirname, '../src/banner')).toString());
- console.log(pkg.version);
- console.log('');
- console.log("TypeScript version used by Compodoc : ".concat(tsMorph.ts.version));
- console.log('');
- if (FileEngine$1.existsSync(cwd + path__namespace.sep + 'package.json')) {
- var packageData = FileEngine$1.getSync(cwd + path__namespace.sep + 'package.json');
- if (packageData) {
- var parsedData = JSON.parse(packageData);
- var projectDevDependencies = parsedData.devDependencies;
- if (projectDevDependencies && projectDevDependencies.typescript) {
- var tsProjectVersion = AngularVersionUtil$1.cleanVersion(projectDevDependencies.typescript);
- console.log("TypeScript version of current project : ".concat(tsProjectVersion));
- console.log('');
- }
- }
- }
- console.log("Node.js version : ".concat(process.version));
- console.log('');
- console.log("Operating system : ".concat(osName(os.platform(), os.release())));
- console.log('');
- }
- }
- if (configExplorerResult) {
- if (typeof configExplorerResult.config !== 'undefined') {
- logger.info("Using configuration file : ".concat(configExplorerResult.filepath));
- }
- }
- if (!configExplorerResult) {
- logger.warn("No configuration file found, switching to CLI flags.");
- }
- if (programOptions.language && !I18nEngine$1.supportLanguage(programOptions.language)) {
- logger.warn("The language ".concat(programOptions.language, " is not available, falling back to ").concat(I18nEngine$1.fallbackLanguage));
- }
- if (programOptions.tsconfig && typeof programOptions.tsconfig === 'boolean') {
- logger.error("Please provide a tsconfig file.");
- process.exit(1);
- }
- if (configFile.tsconfig) {
- Configuration$1.mainData.tsconfig = configFile.tsconfig;
- }
- if (programOptions.tsconfig) {
- Configuration$1.mainData.tsconfig = programOptions.tsconfig;
- }
- if (programOptions.maxSearchResults) {
- Configuration$1.mainData.maxSearchResults = programOptions.maxSearchResults;
- }
- if (configFile.files) {
- scannedFiles = configFile.files;
- }
- if (configFile.exclude) {
- excludeFiles = configFile.exclude;
- }
- if (configFile.include) {
- includeFiles = configFile.include;
- }
- /**
- * Check --files argument call
- */
- var argv = require('minimist')(process.argv.slice(2));
- if (argv && argv.files) {
- Configuration$1.mainData.hasFilesToCoverage = true;
- if (typeof argv.files === 'string') {
- _super.prototype.setFiles.call(this, [argv.files]);
- }
- else {
- _super.prototype.setFiles.call(this, argv.files);
- }
- }
- if (programOptions.serve && !Configuration$1.mainData.tsconfig && programOptions.output) {
- // if -s & -d, serve it
- if (!FileEngine$1.existsSync(Configuration$1.mainData.output)) {
- logger.error("".concat(Configuration$1.mainData.output, " folder doesn't exist"));
- process.exit(1);
- }
- else {
- logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(programOptions.port));
- _super.prototype.runWebServer.call(this, Configuration$1.mainData.output);
- }
- }
- else if (programOptions.serve &&
- !Configuration$1.mainData.tsconfig &&
- !programOptions.output) {
- // if only -s find ./documentation, if ok serve, else error provide -d
- if (!FileEngine$1.existsSync(Configuration$1.mainData.output)) {
- logger.error('Provide output generated folder with -d flag');
- process.exit(1);
- }
- else {
- logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(programOptions.port));
- _super.prototype.runWebServer.call(this, Configuration$1.mainData.output);
- }
- }
- else if (Configuration$1.mainData.hasFilesToCoverage) {
- if (programOptions.coverageMinimumPerFile) {
- logger.info('Run documentation coverage test for files');
- _super.prototype.testCoverage.call(this);
- }
- else {
- logger.error('Missing coverage configuration');
- }
- }
- else {
- if (programOptions.hideGenerator) {
- Configuration$1.mainData.hideGenerator = true;
- }
- if (Configuration$1.mainData.tsconfig) {
- /**
- * tsconfig file provided only
- */
- var testTsConfigPath = Configuration$1.mainData.tsconfig.indexOf(process.cwd());
- if (testTsConfigPath !== -1) {
- Configuration$1.mainData.tsconfig = Configuration$1.mainData.tsconfig.replace(process.cwd() + path__namespace.sep, '');
- }
- var sourceFolder = void 0;
- if (program.args.length > 0) {
- /**
- * tsconfig file provided with source folder in arg
- */
- var testTsConfigPath_1 = Configuration$1.mainData.tsconfig.indexOf(process.cwd());
- if (testTsConfigPath_1 !== -1) {
- Configuration$1.mainData.tsconfig = Configuration$1.mainData.tsconfig.replace(process.cwd() + path__namespace.sep, '');
- }
- sourceFolder = program.args[0];
- if (!FileEngine$1.existsSync(sourceFolder)) {
- logger.error("Provided source folder ".concat(sourceFolder, " was not found in the current directory"));
- process.exit(1);
- }
- else {
- logger.info('Using provided source folder');
- }
- }
- if (!FileEngine$1.existsSync(Configuration$1.mainData.tsconfig)) {
- logger.error("\"".concat(Configuration$1.mainData.tsconfig, "\" file was not found in the current directory"));
- process.exit(1);
- }
- else {
- var _file = path__namespace.join(path__namespace.join(process.cwd(), path__namespace.dirname(Configuration$1.mainData.tsconfig)), path__namespace.basename(Configuration$1.mainData.tsconfig));
- // use the current directory of tsconfig.json as a working directory
- cwd = _file.split(path__namespace.sep).slice(0, -1).join(path__namespace.sep);
- logger.info('Using tsconfig file ', _file);
- var tsConfigFile = readConfig(_file);
- if (tsConfigFile.files) {
- scannedFiles = tsConfigFile.files;
- // Normalize path of these files
- scannedFiles = scannedFiles.map(function (scannedFile) {
- return cwd + path__namespace.sep + scannedFile;
- });
- }
- // even if files are supplied with "files" attributes, enhance the array with includes
- excludeFiles = __spreadArray(__spreadArray([], __read(excludeFiles), false), __read((tsConfigFile.exclude || [])), false);
- includeFiles = __spreadArray(__spreadArray([], __read(includeFiles), false), __read((tsConfigFile.include || [])), false);
- if (scannedFiles.length > 0) {
- includeFiles = __spreadArray(__spreadArray([], __read(includeFiles), false), __read(scannedFiles), false);
- }
- if (!includeFiles.length) {
- includeFiles = INCLUDE_PATTERNS;
- }
- var stream = fg.stream(includeFiles, {
- cwd: sourceFolder || cwd,
- ignore: excludeFiles,
- absolute: true
- });
- stream.on('data', function (file) {
- if (path__namespace.extname(file) === '.ts' || path__namespace.extname(file) === '.tsx') {
- logger.debug('Including', file);
- scannedFiles.push(file);
- }
- else {
- logger.warn('Excluding', file);
- }
- });
- stream.on('end', function () {
- _super.prototype.setFiles.call(_this, scannedFiles);
- if (programOptions.coverageTest || programOptions.coverageTestPerFile) {
- logger.info('Run documentation coverage test');
- _super.prototype.testCoverage.call(_this);
- }
- else {
- _super.prototype.generate.call(_this);
- }
- });
- }
- }
- else {
- logger.error('tsconfig.json file was not found, please use -p flag');
- outputHelp();
- }
- }
- };
- return CliApplication;
- }(Application));
- exports.Application = Application;
- exports.CliApplication = CliApplication;
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXgtY2xpLUQ3ZzFfNE1NLmpzIiwic291cmNlcyI6WyIuLi9ub2RlX21vZHVsZXMvdHNsaWIvdHNsaWIuZXM2LmpzIiwiLi4vc3JjL3V0aWxzL2xvZ2dlci50cyIsIi4uL3NyYy91dGlscy9kZWZhdWx0cy50cyIsIi4uL3NyYy9hcHAvY29uZmlndXJhdGlvbi50cyIsIi4uL3NyYy91dGlscy9hbmd1bGFyLWFwaS51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL2xpbmstcGFyc2VyLnRzIiwiLi4vc3JjL3V0aWxzL2FuZ3VsYXItbGlmZWN5Y2xlcy1ob29rcy50cyIsIi4uL3NyYy91dGlscy9raW5kLXRvLXR5cGUudHMiLCIuLi9zcmMvdXRpbHMvdHMtaW50ZXJuYWwudHMiLCIuLi9zcmMvdXRpbHMvanNkb2MtcGFyc2VyLnV0aWwudHMiLCIuLi9zcmMvdXRpbHMvbWFya2VkLmFjbC50cyIsIi4uL3NyYy91dGlscy91dGlscy50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9kZXBlbmRlbmNpZXMuZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2ZpbGUuZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2V4cG9ydC1qc29uLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9leHBvcnQuZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvYnJlYWstY29tbWEuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvYnJlYWstbGluZXMuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvY2FwaXRhbGl6ZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9jbGVhbi1wYXJhZ3JhcGguaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvY29tcGFyZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9kZWJ1Zy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9lbGVtZW50LWFsb25lLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2VzY2FwZS1zaW1wbGUtcXVvdGUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvZmlsdGVyLWFuZ3VsYXIyLW1vZHVsZXMuaGVscGVyLnRzIiwiLi4vc3JjL3V0aWxzL2FuZ3VsYXItdmVyc2lvbi51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL2Jhc2ljLXR5cGUudXRpbC50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2Z1bmN0aW9uLXNpZ25hdHVyZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9oYXMtb3duLmhlbHBlci50cyIsIi4uL3NyYy9sb2NhbGVzL2RlLURFLnRzIiwiLi4vc3JjL2xvY2FsZXMvZW4tVVMudHMiLCIuLi9zcmMvbG9jYWxlcy9lcy1FUy50cyIsIi4uL3NyYy9sb2NhbGVzL2ZyLUZSLnRzIiwiLi4vc3JjL2xvY2FsZXMvaHUtSFUudHMiLCIuLi9zcmMvbG9jYWxlcy9pdC1JVC50cyIsIi4uL3NyYy9sb2NhbGVzL2phLUpQLnRzIiwiLi4vc3JjL2xvY2FsZXMva2EtR0UudHMiLCIuLi9zcmMvbG9jYWxlcy9rby1LUi50cyIsIi4uL3NyYy9sb2NhbGVzL25sLU5MLnRzIiwiLi4vc3JjL2xvY2FsZXMvcGwtUEwudHMiLCIuLi9zcmMvbG9jYWxlcy9wdC1CUi50cyIsIi4uL3NyYy9sb2NhbGVzL3J1LVJVLnRzIiwiLi4vc3JjL2xvY2FsZXMvc2stU0sudHMiLCIuLi9zcmMvbG9jYWxlcy96aC1DTi50cyIsIi4uL3NyYy9sb2NhbGVzL3poLVRXLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2kxOG4uZW5naW5lLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaTE4bi5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9pZi1zdHJpbmcuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvaW5kZXhhYmxlLXNpZ25hdHVyZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9pcy1pbml0aWFsLXRhYi5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9pcy1ub3QtdG9nZ2xlLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2lzLXRhYi1lbmFibGVkLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWNvZGUtZXhhbXBsZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1kZWZhdWx0LmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLWV4YW1wbGUuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtcGFyYW1zLXZhbGlkLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLXBhcmFtcy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1yZXR1cm5zLWNvbW1lbnQuaGVscGVyLnRzIiwiLi4vc3JjL3V0aWxzL2ltcG9ydHMudXRpbC50cyIsIi4uL3NyYy91dGlscy9yb3V0ZXItcGFyc2VyLnV0aWwudHMiLCIuLi9zcmMvdXRpbHMvaXMtbW9kdWxlLXdpdGgtcHJvdmlkZXJzLnRzIiwiLi4vc3JjL3V0aWxzL2dldC1tb2R1bGUtd2l0aC1wcm92aWRlcnMudHMiLCIuLi9zcmMvdXRpbHMvZXh0ZW5kcy1tZXJnZXIudXRpbC50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2xpbmstdHlwZS5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9tb2RpZi1pY29uLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL21vZGlmLWtpbmQtaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvb2JqZWN0LWxlbmd0aC5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9vYmplY3QuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvb25lLXBhcmFtZXRlci1oYXMuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvb3ItbGVuZ3RoLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL29yLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL3BhcnNlLWRlc2NyaXB0aW9uLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL3BhcnNlLXByb3BlcnR5LmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL3JlbGF0aXZlLXVybC5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC1lbmdpbmUtaGVscGVycy9zaG9ydC11cmwuaGVscGVyLnRzIiwiLi4vc3JjL2FwcC9lbmdpbmVzL2h0bWwtZW5naW5lLWhlbHBlcnMvc3RyaXAtdXJsLmhlbHBlci50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLWVuZ2luZS1oZWxwZXJzL2lmLWVxdWFsLXN0cmluZy5oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvaHRtbC5lbmdpbmUuaGVscGVycy50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9odG1sLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9tYXJrZG93bi5lbmdpbmUudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvbmdkLmVuZ2luZS50cyIsIi4uL3NyYy91dGlscy9jb25zdGFudHMudHMiLCIuLi9zcmMvYXBwL2VuZ2luZXMvc2VhcmNoLmVuZ2luZS50cyIsIi4uL3NyYy9hcHAvZW5naW5lcy9jb21wb25lbnRzLXRyZWUuZW5naW5lLnRzIiwiLi4vc3JjL3V0aWxzL2Fycm93LWZ1bmN0aW9uLnV0aWwudHMiLCIuLi9zcmMvdXRpbHMvb2JqZWN0LWxpdGVyYWwtZXhwcmVzc2lvbi51dGlsLnRzIiwiLi4vc3JjL3V0aWxzL25vZGUudXRpbC50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci9kZXBzL2hlbHBlcnMvY2xhc3MtaGVscGVyLnRzIiwiLi4vc3JjL3V0aWxzL3RzLXByaW50ZXIudXRpbC50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci9kZXBzL2hlbHBlcnMvc3ltYm9sLWhlbHBlci50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci9kZXBzL2hlbHBlcnMvY29tcG9uZW50LWhlbHBlci50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvZnJhbWV3b3JrLWRlcGVuZGVuY2llcy50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci9jb2RlLWdlbmVyYXRvci50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci9kZXBzL2NvbXBvbmVudC1kZXAuZmFjdG9yeS50cyIsIi4uL3NyYy9hcHAvY29tcGlsZXIvYW5ndWxhci9kZXBzL2NvbnRyb2xsZXItZGVwLmZhY3RvcnkudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9kaXJlY3RpdmUtZGVwLmZhY3RvcnkudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2pzLWRvYy1oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL21vZHVsZS1oZWxwZXIudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9tb2R1bGUtZGVwLmZhY3RvcnkudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9lbnRpdHktZGVwLmZhY3RvcnkudHMiLCIuLi9zcmMvYXBwL2NvbXBpbGVyL2FuZ3VsYXItZGVwZW5kZW5jaWVzLnRzIiwiLi4vc3JjL2FwcC9jb21waWxlci9hbmd1bGFyanMtZGVwZW5kZW5jaWVzLnRzIiwiLi4vc3JjL3V0aWxzL3Byb21pc2Utc2VxdWVudGlhbC50cyIsIi4uL3NyYy9hcHAvYXBwbGljYXRpb24udHMiLCIuLi9zcmMvaW5kZXgtY2xpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcclxuQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uXHJcblxyXG5QZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQvb3IgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGZvciBhbnlcclxucHVycG9zZSB3aXRoIG9yIHdpdGhvdXQgZmVlIGlzIGhlcmVieSBncmFudGVkLlxyXG5cclxuVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiBBTkQgVEhFIEFVVEhPUiBESVNDTEFJTVMgQUxMIFdBUlJBTlRJRVMgV0lUSFxyXG5SRUdBUkQgVE8gVEhJUyBTT0ZUV0FSRSBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFlcclxuQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULFxyXG5JTkRJUkVDVCwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIE9SIEFOWSBEQU1BR0VTIFdIQVRTT0VWRVIgUkVTVUxUSU5HIEZST01cclxuTE9TUyBPRiBVU0UsIERBVEEgT1IgUFJPRklUUywgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIE5FR0xJR0VOQ0UgT1JcclxuT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUlxyXG5QRVJGT1JNQU5DRSBPRiBUSElTIFNPRlRXQVJFLlxyXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqL1xyXG4vKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSwgU3VwcHJlc3NlZEVycm9yLCBTeW1ib2wsIEl0ZXJhdG9yICovXHJcblxyXG52YXIgZXh0ZW5kU3RhdGljcyA9IGZ1bmN0aW9uKGQsIGIpIHtcclxuICAgIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHxcclxuICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8XHJcbiAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGIsIHApKSBkW3BdID0gYltwXTsgfTtcclxuICAgIHJldHVybiBleHRlbmRTdGF0aWNzKGQsIGIpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7XHJcbiAgICBpZiAodHlwZW9mIGIgIT09IFwiZnVuY3Rpb25cIiAmJiBiICE9PSBudWxsKVxyXG4gICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJDbGFzcyBleHRlbmRzIHZhbHVlIFwiICsgU3RyaW5nKGIpICsgXCIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbFwiKTtcclxuICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7XHJcbiAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH1cclxuICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTtcclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2Fzc2lnbiA9IGZ1bmN0aW9uKCkge1xyXG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uIF9fYXNzaWduKHQpIHtcclxuICAgICAgICBmb3IgKHZhciBzLCBpID0gMSwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBuOyBpKyspIHtcclxuICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTtcclxuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKSB0W3BdID0gc1twXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIHQ7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gX19hc3NpZ24uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7XHJcbiAgICB2YXIgdCA9IHt9O1xyXG4gICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApICYmIGUuaW5kZXhPZihwKSA8IDApXHJcbiAgICAgICAgdFtwXSA9IHNbcF07XHJcbiAgICBpZiAocyAhPSBudWxsICYmIHR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzID09PSBcImZ1bmN0aW9uXCIpXHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHAgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKHMpOyBpIDwgcC5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgICBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCAmJiBPYmplY3QucHJvdG90eXBlLnByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwocywgcFtpXSkpXHJcbiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTtcclxuICAgICAgICB9XHJcbiAgICByZXR1cm4gdDtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHtcclxuICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7XHJcbiAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09IFwiZnVuY3Rpb25cIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpO1xyXG4gICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjtcclxuICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikge1xyXG4gICAgcmV0dXJuIGZ1bmN0aW9uICh0YXJnZXQsIGtleSkgeyBkZWNvcmF0b3IodGFyZ2V0LCBrZXksIHBhcmFtSW5kZXgpOyB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2VzRGVjb3JhdGUoY3RvciwgZGVzY3JpcHRvckluLCBkZWNvcmF0b3JzLCBjb250ZXh0SW4sIGluaXRpYWxpemVycywgZXh0cmFJbml0aWFsaXplcnMpIHtcclxuICAgIGZ1bmN0aW9uIGFjY2VwdChmKSB7IGlmIChmICE9PSB2b2lkIDAgJiYgdHlwZW9mIGYgIT09IFwiZnVuY3Rpb25cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkZ1bmN0aW9uIGV4cGVjdGVkXCIpOyByZXR1cm4gZjsgfVxyXG4gICAgdmFyIGtpbmQgPSBjb250ZXh0SW4ua2luZCwga2V5ID0ga2luZCA9PT0gXCJnZXR0ZXJcIiA/IFwiZ2V0XCIgOiBraW5kID09PSBcInNldHRlclwiID8gXCJzZXRcIiA6IFwidmFsdWVcIjtcclxuICAgIHZhciB0YXJnZXQgPSAhZGVzY3JpcHRvckluICYmIGN0b3IgPyBjb250ZXh0SW5bXCJzdGF0aWNcIl0gPyBjdG9yIDogY3Rvci5wcm90b3R5cGUgOiBudWxsO1xyXG4gICAgdmFyIGRlc2NyaXB0b3IgPSBkZXNjcmlwdG9ySW4gfHwgKHRhcmdldCA/IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBjb250ZXh0SW4ubmFtZSkgOiB7fSk7XHJcbiAgICB2YXIgXywgZG9uZSA9IGZhbHNlO1xyXG4gICAgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcclxuICAgICAgICB2YXIgY29udGV4dCA9IHt9O1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluKSBjb250ZXh0W3BdID0gcCA9PT0gXCJhY2Nlc3NcIiA/IHt9IDogY29udGV4dEluW3BdO1xyXG4gICAgICAgIGZvciAodmFyIHAgaW4gY29udGV4dEluLmFjY2VzcykgY29udGV4dC5hY2Nlc3NbcF0gPSBjb250ZXh0SW4uYWNjZXNzW3BdO1xyXG4gICAgICAgIGNvbnRleHQuYWRkSW5pdGlhbGl6ZXIgPSBmdW5jdGlvbiAoZikgeyBpZiAoZG9uZSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCBhZGQgaW5pdGlhbGl6ZXJzIGFmdGVyIGRlY29yYXRpb24gaGFzIGNvbXBsZXRlZFwiKTsgZXh0cmFJbml0aWFsaXplcnMucHVzaChhY2NlcHQoZiB8fCBudWxsKSk7IH07XHJcbiAgICAgICAgdmFyIHJlc3VsdCA9ICgwLCBkZWNvcmF0b3JzW2ldKShraW5kID09PSBcImFjY2Vzc29yXCIgPyB7IGdldDogZGVzY3JpcHRvci5nZXQsIHNldDogZGVzY3JpcHRvci5zZXQgfSA6IGRlc2NyaXB0b3Jba2V5XSwgY29udGV4dCk7XHJcbiAgICAgICAgaWYgKGtpbmQgPT09IFwiYWNjZXNzb3JcIikge1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB2b2lkIDApIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsIHx8IHR5cGVvZiByZXN1bHQgIT09IFwib2JqZWN0XCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWRcIik7XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5nZXQpKSBkZXNjcmlwdG9yLmdldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5zZXQpKSBkZXNjcmlwdG9yLnNldCA9IF87XHJcbiAgICAgICAgICAgIGlmIChfID0gYWNjZXB0KHJlc3VsdC5pbml0KSkgaW5pdGlhbGl6ZXJzLnVuc2hpZnQoXyk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGVsc2UgaWYgKF8gPSBhY2NlcHQocmVzdWx0KSkge1xyXG4gICAgICAgICAgICBpZiAoa2luZCA9PT0gXCJmaWVsZFwiKSBpbml0aWFsaXplcnMudW5zaGlmdChfKTtcclxuICAgICAgICAgICAgZWxzZSBkZXNjcmlwdG9yW2tleV0gPSBfO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGlmICh0YXJnZXQpIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGNvbnRleHRJbi5uYW1lLCBkZXNjcmlwdG9yKTtcclxuICAgIGRvbmUgPSB0cnVlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcnVuSW5pdGlhbGl6ZXJzKHRoaXNBcmcsIGluaXRpYWxpemVycywgdmFsdWUpIHtcclxuICAgIHZhciB1c2VWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xyXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbml0aWFsaXplcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgICB2YWx1ZSA9IHVzZVZhbHVlID8gaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZywgdmFsdWUpIDogaW5pdGlhbGl6ZXJzW2ldLmNhbGwodGhpc0FyZyk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdXNlVmFsdWUgPyB2YWx1ZSA6IHZvaWQgMDtcclxufTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3Byb3BLZXkoeCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB4ID09PSBcInN5bWJvbFwiID8geCA6IFwiXCIuY29uY2F0KHgpO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc2V0RnVuY3Rpb25OYW1lKGYsIG5hbWUsIHByZWZpeCkge1xyXG4gICAgaWYgKHR5cGVvZiBuYW1lID09PSBcInN5bWJvbFwiKSBuYW1lID0gbmFtZS5kZXNjcmlwdGlvbiA/IFwiW1wiLmNvbmNhdChuYW1lLmRlc2NyaXB0aW9uLCBcIl1cIikgOiBcIlwiO1xyXG4gICAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShmLCBcIm5hbWVcIiwgeyBjb25maWd1cmFibGU6IHRydWUsIHZhbHVlOiBwcmVmaXggPyBcIlwiLmNvbmNhdChwcmVmaXgsIFwiIFwiLCBuYW1lKSA6IG5hbWUgfSk7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19tZXRhZGF0YShtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSkge1xyXG4gICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSBcIm9iamVjdFwiICYmIHR5cGVvZiBSZWZsZWN0Lm1ldGFkYXRhID09PSBcImZ1bmN0aW9uXCIpIHJldHVybiBSZWZsZWN0Lm1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHtcclxuICAgIGZ1bmN0aW9uIGFkb3B0KHZhbHVlKSB7IHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFAgPyB2YWx1ZSA6IG5ldyBQKGZ1bmN0aW9uIChyZXNvbHZlKSB7IHJlc29sdmUodmFsdWUpOyB9KTsgfVxyXG4gICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7XHJcbiAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yW1widGhyb3dcIl0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfVxyXG4gICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogYWRvcHQocmVzdWx0LnZhbHVlKS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9XHJcbiAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpO1xyXG4gICAgfSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2dlbmVyYXRvcih0aGlzQXJnLCBib2R5KSB7XHJcbiAgICB2YXIgXyA9IHsgbGFiZWw6IDAsIHNlbnQ6IGZ1bmN0aW9uKCkgeyBpZiAodFswXSAmIDEpIHRocm93IHRbMV07IHJldHVybiB0WzFdOyB9LCB0cnlzOiBbXSwgb3BzOiBbXSB9LCBmLCB5LCB0LCBnID0gT2JqZWN0LmNyZWF0ZSgodHlwZW9mIEl0ZXJhdG9yID09PSBcImZ1bmN0aW9uXCIgPyBJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKTtcclxuICAgIHJldHVybiBnLm5leHQgPSB2ZXJiKDApLCBnW1widGhyb3dcIl0gPSB2ZXJiKDEpLCBnW1wicmV0dXJuXCJdID0gdmVyYigyKSwgdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICYmIChnW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXM7IH0pLCBnO1xyXG4gICAgZnVuY3Rpb24gdmVyYihuKSB7IHJldHVybiBmdW5jdGlvbiAodikgeyByZXR1cm4gc3RlcChbbiwgdl0pOyB9OyB9XHJcbiAgICBmdW5jdGlvbiBzdGVwKG9wKSB7XHJcbiAgICAgICAgaWYgKGYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJHZW5lcmF0b3IgaXMgYWxyZWFkeSBleGVjdXRpbmcuXCIpO1xyXG4gICAgICAgIHdoaWxlIChnICYmIChnID0gMCwgb3BbMF0gJiYgKF8gPSAwKSksIF8pIHRyeSB7XHJcbiAgICAgICAgICAgIGlmIChmID0gMSwgeSAmJiAodCA9IG9wWzBdICYgMiA/IHlbXCJyZXR1cm5cIl0gOiBvcFswXSA/IHlbXCJ0aHJvd1wiXSB8fCAoKHQgPSB5W1wicmV0dXJuXCJdKSAmJiB0LmNhbGwoeSksIDApIDogeS5uZXh0KSAmJiAhKHQgPSB0LmNhbGwoeSwgb3BbMV0pKS5kb25lKSByZXR1cm4gdDtcclxuICAgICAgICAgICAgaWYgKHkgPSAwLCB0KSBvcCA9IFtvcFswXSAmIDIsIHQudmFsdWVdO1xyXG4gICAgICAgICAgICBzd2l0Y2ggKG9wWzBdKSB7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhaztcclxuICAgICAgICAgICAgICAgIGNhc2UgNDogXy5sYWJlbCsrOyByZXR1cm4geyB2YWx1ZTogb3BbMV0sIGRvbmU6IGZhbHNlIH07XHJcbiAgICAgICAgICAgICAgICBjYXNlIDU6IF8ubGFiZWwrKzsgeSA9IG9wWzFdOyBvcCA9IFswXTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7XHJcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICAgICAgICAgIGlmICghKHQgPSBfLnRyeXMsIHQgPSB0Lmxlbmd0aCA+IDAgJiYgdFt0Lmxlbmd0aCAtIDFdKSAmJiAob3BbMF0gPT09IDYgfHwgb3BbMF0gPT09IDIpKSB7IF8gPSAwOyBjb250aW51ZTsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKG9wWzBdID09PSA2ICYmIF8ubGFiZWwgPCB0WzFdKSB7IF8ubGFiZWwgPSB0WzFdOyB0ID0gb3A7IGJyZWFrOyB9XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHQgJiYgXy5sYWJlbCA8IHRbMl0pIHsgXy5sYWJlbCA9IHRbMl07IF8ub3BzLnB1c2gob3ApOyBicmVhazsgfVxyXG4gICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTtcclxuICAgICAgICAgICAgICAgICAgICBfLnRyeXMucG9wKCk7IGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pO1xyXG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgb3AgPSBbNiwgZV07IHkgPSAwOyB9IGZpbmFsbHkgeyBmID0gdCA9IDA7IH1cclxuICAgICAgICBpZiAob3BbMF0gJiA1KSB0aHJvdyBvcFsxXTsgcmV0dXJuIHsgdmFsdWU6IG9wWzBdID8gb3BbMV0gOiB2b2lkIDAsIGRvbmU6IHRydWUgfTtcclxuICAgIH1cclxufVxyXG5cclxuZXhwb3J0IHZhciBfX2NyZWF0ZUJpbmRpbmcgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XHJcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xyXG4gICAgdmFyIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG0sIGspO1xyXG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcclxuICAgICAgICBkZXNjID0geyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbVtrXTsgfSB9O1xyXG4gICAgfVxyXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcclxufSkgOiAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcclxuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XHJcbiAgICBvW2syXSA9IG1ba107XHJcbn0pO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZXhwb3J0U3RhcihtLCBvKSB7XHJcbiAgICBmb3IgKHZhciBwIGluIG0pIGlmIChwICE9PSBcImRlZmF1bHRcIiAmJiAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG8sIHApKSBfX2NyZWF0ZUJpbmRpbmcobywgbSwgcCk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7XHJcbiAgICB2YXIgcyA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwO1xyXG4gICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7XHJcbiAgICBpZiAobyAmJiB0eXBlb2Ygby5sZW5ndGggPT09IFwibnVtYmVyXCIpIHJldHVybiB7XHJcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwO1xyXG4gICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxuICAgIHRocm93IG5ldyBUeXBlRXJyb3IocyA/IFwiT2JqZWN0IGlzIG5vdCBpdGVyYWJsZS5cIiA6IFwiU3ltYm9sLml0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fcmVhZChvLCBuKSB7XHJcbiAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiAmJiBvW1N5bWJvbC5pdGVyYXRvcl07XHJcbiAgICBpZiAoIW0pIHJldHVybiBvO1xyXG4gICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7XHJcbiAgICB0cnkge1xyXG4gICAgICAgIHdoaWxlICgobiA9PT0gdm9pZCAwIHx8IG4tLSA+IDApICYmICEociA9IGkubmV4dCgpKS5kb25lKSBhci5wdXNoKHIudmFsdWUpO1xyXG4gICAgfVxyXG4gICAgY2F0Y2ggKGVycm9yKSB7IGUgPSB7IGVycm9yOiBlcnJvciB9OyB9XHJcbiAgICBmaW5hbGx5IHtcclxuICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICBpZiAociAmJiAhci5kb25lICYmIChtID0gaVtcInJldHVyblwiXSkpIG0uY2FsbChpKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgZmluYWxseSB7IGlmIChlKSB0aHJvdyBlLmVycm9yOyB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWQoKSB7XHJcbiAgICBmb3IgKHZhciBhciA9IFtdLCBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKylcclxuICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7XHJcbiAgICByZXR1cm4gYXI7XHJcbn1cclxuXHJcbi8qKiBAZGVwcmVjYXRlZCAqL1xyXG5leHBvcnQgZnVuY3Rpb24gX19zcHJlYWRBcnJheXMoKSB7XHJcbiAgICBmb3IgKHZhciBzID0gMCwgaSA9IDAsIGlsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHMgKz0gYXJndW1lbnRzW2ldLmxlbmd0aDtcclxuICAgIGZvciAodmFyIHIgPSBBcnJheShzKSwgayA9IDAsIGkgPSAwOyBpIDwgaWw7IGkrKylcclxuICAgICAgICBmb3IgKHZhciBhID0gYXJndW1lbnRzW2ldLCBqID0gMCwgamwgPSBhLmxlbmd0aDsgaiA8IGpsOyBqKyssIGsrKylcclxuICAgICAgICAgICAgcltrXSA9IGFbal07XHJcbiAgICByZXR1cm4gcjtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fc3ByZWFkQXJyYXkodG8sIGZyb20sIHBhY2spIHtcclxuICAgIGlmIChwYWNrIHx8IGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIGZvciAodmFyIGkgPSAwLCBsID0gZnJvbS5sZW5ndGgsIGFyOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgaWYgKGFyIHx8ICEoaSBpbiBmcm9tKSkge1xyXG4gICAgICAgICAgICBpZiAoIWFyKSBhciA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGZyb20sIDAsIGkpO1xyXG4gICAgICAgICAgICBhcltpXSA9IGZyb21baV07XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRvLmNvbmNhdChhciB8fCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChmcm9tKSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2F3YWl0KHYpIHtcclxuICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHtcclxuICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJTeW1ib2wuYXN5bmNJdGVyYXRvciBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdO1xyXG4gICAgcmV0dXJuIGkgPSBPYmplY3QuY3JlYXRlKCh0eXBlb2YgQXN5bmNJdGVyYXRvciA9PT0gXCJmdW5jdGlvblwiID8gQXN5bmNJdGVyYXRvciA6IE9iamVjdCkucHJvdG90eXBlKSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiLCBhd2FpdFJldHVybiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTtcclxuICAgIGZ1bmN0aW9uIGF3YWl0UmV0dXJuKGYpIHsgcmV0dXJuIGZ1bmN0aW9uICh2KSB7IHJldHVybiBQcm9taXNlLnJlc29sdmUodikudGhlbihmLCByZWplY3QpOyB9OyB9XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKGdbbl0pIHsgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgaWYgKGYpIGlbbl0gPSBmKGlbbl0pOyB9IH1cclxuICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH1cclxuICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfVxyXG4gICAgZnVuY3Rpb24gZnVsZmlsbCh2YWx1ZSkgeyByZXN1bWUoXCJuZXh0XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gcmVqZWN0KHZhbHVlKSB7IHJlc3VtZShcInRocm93XCIsIHZhbHVlKTsgfVxyXG4gICAgZnVuY3Rpb24gc2V0dGxlKGYsIHYpIHsgaWYgKGYodiksIHEuc2hpZnQoKSwgcS5sZW5ndGgpIHJlc3VtZShxWzBdWzBdLCBxWzBdWzFdKTsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7XHJcbiAgICB2YXIgaSwgcDtcclxuICAgIHJldHVybiBpID0ge30sIHZlcmIoXCJuZXh0XCIpLCB2ZXJiKFwidGhyb3dcIiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoXCJyZXR1cm5cIiksIGlbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7XHJcbiAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaVtuXSA9IG9bbl0gPyBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBmYWxzZSB9IDogZiA/IGYodikgOiB2OyB9IDogZjsgfVxyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7XHJcbiAgICBpZiAoIVN5bWJvbC5hc3luY0l0ZXJhdG9yKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgdmFyIG0gPSBvW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSwgaTtcclxuICAgIHJldHVybiBtID8gbS5jYWxsKG8pIDogKG8gPSB0eXBlb2YgX192YWx1ZXMgPT09IFwiZnVuY3Rpb25cIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCksIGkgPSB7fSwgdmVyYihcIm5leHRcIiksIHZlcmIoXCJ0aHJvd1wiKSwgdmVyYihcInJldHVyblwiKSwgaVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpKTtcclxuICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpW25dID0gb1tuXSAmJiBmdW5jdGlvbiAodikgeyByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgeyB2ID0gb1tuXSh2KSwgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgdi5kb25lLCB2LnZhbHVlKTsgfSk7IH07IH1cclxuICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fbWFrZVRlbXBsYXRlT2JqZWN0KGNvb2tlZCwgcmF3KSB7XHJcbiAgICBpZiAoT2JqZWN0LmRlZmluZVByb3BlcnR5KSB7IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb29rZWQsIFwicmF3XCIsIHsgdmFsdWU6IHJhdyB9KTsgfSBlbHNlIHsgY29va2VkLnJhdyA9IHJhdzsgfVxyXG4gICAgcmV0dXJuIGNvb2tlZDtcclxufTtcclxuXHJcbnZhciBfX3NldE1vZHVsZURlZmF1bHQgPSBPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcclxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBcImRlZmF1bHRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCB2YWx1ZTogdiB9KTtcclxufSkgOiBmdW5jdGlvbihvLCB2KSB7XHJcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnRTdGFyKG1vZCkge1xyXG4gICAgaWYgKG1vZCAmJiBtb2QuX19lc01vZHVsZSkgcmV0dXJuIG1vZDtcclxuICAgIHZhciByZXN1bHQgPSB7fTtcclxuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcclxuICAgIF9fc2V0TW9kdWxlRGVmYXVsdChyZXN1bHQsIG1vZCk7XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gX19pbXBvcnREZWZhdWx0KG1vZCkge1xyXG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBkZWZhdWx0OiBtb2QgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRHZXQocmVjZWl2ZXIsIHN0YXRlLCBraW5kLCBmKSB7XHJcbiAgICBpZiAoa2luZCA9PT0gXCJhXCIgJiYgIWYpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcml2YXRlIGFjY2Vzc29yIHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZXR0ZXJcIik7XHJcbiAgICBpZiAodHlwZW9mIHN0YXRlID09PSBcImZ1bmN0aW9uXCIgPyByZWNlaXZlciAhPT0gc3RhdGUgfHwgIWYgOiAhc3RhdGUuaGFzKHJlY2VpdmVyKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCByZWFkIHByaXZhdGUgbWVtYmVyIGZyb20gYW4gb2JqZWN0IHdob3NlIGNsYXNzIGRpZCBub3QgZGVjbGFyZSBpdFwiKTtcclxuICAgIHJldHVybiBraW5kID09PSBcIm1cIiA/IGYgOiBraW5kID09PSBcImFcIiA/IGYuY2FsbChyZWNlaXZlcikgOiBmID8gZi52YWx1ZSA6IHN0YXRlLmdldChyZWNlaXZlcik7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBfX2NsYXNzUHJpdmF0ZUZpZWxkU2V0KHJlY2VpdmVyLCBzdGF0ZSwgdmFsdWUsIGtpbmQsIGYpIHtcclxuICAgIGlmIChraW5kID09PSBcIm1cIikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgbWV0aG9kIGlzIG5vdCB3cml0YWJsZVwiKTtcclxuICAgIGlmIChraW5kID09PSBcImFcIiAmJiAhZikgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByaXZhdGUgYWNjZXNzb3Igd2FzIGRlZmluZWQgd2l0aG91dCBhIHNldHRlclwiKTtcclxuICAgIGlmICh0eXBlb2Ygc3RhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHJlY2VpdmVyICE9PSBzdGF0ZSB8fCAhZiA6ICFzdGF0ZS5oYXMocmVjZWl2ZXIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IHdyaXRlIHByaXZhdGUgbWVtYmVyIHRvIGFuIG9iamVjdCB3aG9zZSBjbGFzcyBkaWQgbm90IGRlY2xhcmUgaXRcIik7XHJcbiAgICByZXR1cm4gKGtpbmQgPT09IFwiYVwiID8gZi5jYWxsKHJlY2VpdmVyLCB2YWx1ZSkgOiBmID8gZi52YWx1ZSA9IHZhbHVlIDogc3RhdGUuc2V0KHJlY2VpdmVyLCB2YWx1ZSkpLCB2YWx1ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fY2xhc3NQcml2YXRlRmllbGRJbihzdGF0ZSwgcmVjZWl2ZXIpIHtcclxuICAgIGlmIChyZWNlaXZlciA9PT0gbnVsbCB8fCAodHlwZW9mIHJlY2VpdmVyICE9PSBcIm9iamVjdFwiICYmIHR5cGVvZiByZWNlaXZlciAhPT0gXCJmdW5jdGlvblwiKSkgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkNhbm5vdCB1c2UgJ2luJyBvcGVyYXRvciBvbiBub24tb2JqZWN0XCIpO1xyXG4gICAgcmV0dXJuIHR5cGVvZiBzdGF0ZSA9PT0gXCJmdW5jdGlvblwiID8gcmVjZWl2ZXIgPT09IHN0YXRlIDogc3RhdGUuaGFzKHJlY2VpdmVyKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fYWRkRGlzcG9zYWJsZVJlc291cmNlKGVudiwgdmFsdWUsIGFzeW5jKSB7XHJcbiAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdmFsdWUgIT09IHZvaWQgMCkge1xyXG4gICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09IFwib2JqZWN0XCIgJiYgdHlwZW9mIHZhbHVlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3QgZXhwZWN0ZWQuXCIpO1xyXG4gICAgICAgIHZhciBkaXNwb3NlLCBpbm5lcjtcclxuICAgICAgICBpZiAoYXN5bmMpIHtcclxuICAgICAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNEaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmFzeW5jRGlzcG9zZSBpcyBub3QgZGVmaW5lZC5cIik7XHJcbiAgICAgICAgICAgIGRpc3Bvc2UgPSB2YWx1ZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKGRpc3Bvc2UgPT09IHZvaWQgMCkge1xyXG4gICAgICAgICAgICBpZiAoIVN5bWJvbC5kaXNwb3NlKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiU3ltYm9sLmRpc3Bvc2UgaXMgbm90IGRlZmluZWQuXCIpO1xyXG4gICAgICAgICAgICBkaXNwb3NlID0gdmFsdWVbU3ltYm9sLmRpc3Bvc2VdO1xyXG4gICAgICAgICAgICBpZiAoYXN5bmMpIGlubmVyID0gZGlzcG9zZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHR5cGVvZiBkaXNwb3NlICE9PSBcImZ1bmN0aW9uXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJPYmplY3Qgbm90IGRpc3Bvc2FibGUuXCIpO1xyXG4gICAgICAgIGlmIChpbm5lcikgZGlzcG9zZSA9IGZ1bmN0aW9uKCkgeyB0cnkgeyBpbm5lci5jYWxsKHRoaXMpOyB9IGNhdGNoIChlKSB7IHJldHVybiBQcm9taXNlLnJlamVjdChlKTsgfSB9O1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgdmFsdWU6IHZhbHVlLCBkaXNwb3NlOiBkaXNwb3NlLCBhc3luYzogYXN5bmMgfSk7XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmIChhc3luYykge1xyXG4gICAgICAgIGVudi5zdGFjay5wdXNoKHsgYXN5bmM6IHRydWUgfSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcblxyXG59XHJcblxyXG52YXIgX1N1cHByZXNzZWRFcnJvciA9IHR5cGVvZiBTdXBwcmVzc2VkRXJyb3IgPT09IFwiZnVuY3Rpb25cIiA/IFN1cHByZXNzZWRFcnJvciA6IGZ1bmN0aW9uIChlcnJvciwgc3VwcHJlc3NlZCwgbWVzc2FnZSkge1xyXG4gICAgdmFyIGUgPSBuZXcgRXJyb3IobWVzc2FnZSk7XHJcbiAgICByZXR1cm4gZS5uYW1lID0gXCJTdXBwcmVzc2VkRXJyb3JcIiwgZS5lcnJvciA9IGVycm9yLCBlLnN1cHByZXNzZWQgPSBzdXBwcmVzc2VkLCBlO1xyXG59O1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIF9fZGlzcG9zZVJlc291cmNlcyhlbnYpIHtcclxuICAgIGZ1bmN0aW9uIGZhaWwoZSkge1xyXG4gICAgICAgIGVudi5lcnJvciA9IGVudi5oYXNFcnJvciA/IG5ldyBfU3VwcHJlc3NlZEVycm9yKGUsIGVudi5lcnJvciwgXCJBbiBlcnJvciB3YXMgc3VwcHJlc3NlZCBkdXJpbmcgZGlzcG9zYWwuXCIpIDogZTtcclxuICAgICAgICBlbnYuaGFzRXJyb3IgPSB0cnVlO1xyXG4gICAgfVxyXG4gICAgdmFyIHIsIHMgPSAwO1xyXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcclxuICAgICAgICB3aGlsZSAociA9IGVudi5zdGFjay5wb3AoKSkge1xyXG4gICAgICAgICAgICB0cnkge1xyXG4gICAgICAgICAgICAgICAgaWYgKCFyLmFzeW5jICYmIHMgPT09IDEpIHJldHVybiBzID0gMCwgZW52LnN0YWNrLnB1c2gociksIFByb21pc2UucmVzb2x2ZSgpLnRoZW4obmV4dCk7XHJcbiAgICAgICAgICAgICAgICBpZiAoci5kaXNwb3NlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHIuZGlzcG9zZS5jYWxsKHIudmFsdWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChyLmFzeW5jKSByZXR1cm4gcyB8PSAyLCBQcm9taXNlLnJlc29sdmUocmVzdWx0KS50aGVuKG5leHQsIGZ1bmN0aW9uKGUpIHsgZmFpbChlKTsgcmV0dXJuIG5leHQoKTsgfSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBlbHNlIHMgfD0gMTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXRjaCAoZSkge1xyXG4gICAgICAgICAgICAgICAgZmFpbChlKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAocyA9PT0gMSkgcmV0dXJuIGVudi5oYXNFcnJvciA/IFByb21pc2UucmVqZWN0KGVudi5lcnJvcikgOiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICBpZiAoZW52Lmhhc0Vycm9yKSB0aHJvdyBlbnYuZXJyb3I7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gbmV4dCgpO1xyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCB7XHJcbiAgICBfX2V4dGVuZHM6IF9fZXh0ZW5kcyxcclxuICAgIF9fYXNzaWduOiBfX2Fzc2lnbixcclxuICAgIF9fcmVzdDogX19yZXN0LFxyXG4gICAgX19kZWNvcmF0ZTogX19kZWNvcmF0ZSxcclxuICAgIF9fcGFyYW06IF9fcGFyYW0sXHJcbiAgICBfX21ldGFkYXRhOiBfX21ldGFkYXRhLFxyXG4gICAgX19hd2FpdGVyOiBfX2F3YWl0ZXIsXHJcbiAgICBfX2dlbmVyYXRvcjogX19nZW5lcmF0b3IsXHJcbiAgICBfX2NyZWF0ZUJpbmRpbmc6IF9fY3JlYXRlQmluZGluZyxcclxuICAgIF9fZXhwb3J0U3RhcjogX19leHBvcnRTdGFyLFxyXG4gICAgX192YWx1ZXM6IF9fdmFsdWVzLFxyXG4gICAgX19yZWFkOiBfX3JlYWQsXHJcbiAgICBfX3NwcmVhZDogX19zcHJlYWQsXHJcbiAgICBfX3NwcmVhZEFycmF5czogX19zcHJlYWRBcnJheXMsXHJcbiAgICBfX3NwcmVhZEFycmF5OiBfX3NwcmVhZEFycmF5LFxyXG4gICAgX19hd2FpdDogX19hd2FpdCxcclxuICAgIF9fYXN5bmNHZW5lcmF0b3I6IF9fYXN5bmNHZW5lcmF0b3IsXHJcbiAgICBfX2FzeW5jRGVsZWdhdG9yOiBfX2FzeW5jRGVsZWdhdG9yLFxyXG4gICAgX19hc3luY1ZhbHVlczogX19hc3luY1ZhbHVlcyxcclxuICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0OiBfX21ha2VUZW1wbGF0ZU9iamVjdCxcclxuICAgIF9faW1wb3J0U3RhcjogX19pbXBvcnRTdGFyLFxyXG4gICAgX19pbXBvcnREZWZhdWx0OiBfX2ltcG9ydERlZmF1bHQsXHJcbiAgICBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0OiBfX2NsYXNzUHJpdmF0ZUZpZWxkR2V0LFxyXG4gICAgX19jbGFzc1ByaXZhdGVGaWVsZFNldDogX19jbGFzc1ByaXZhdGVGaWVsZFNldCxcclxuICAgIF9fY2xhc3NQcml2YXRlRmllbGRJbjogX19jbGFzc1ByaXZhdGVGaWVsZEluLFxyXG4gICAgX19hZGREaXNwb3NhYmxlUmVzb3VyY2U6IF9fYWRkRGlzcG9zYWJsZVJlc291cmNlLFxyXG4gICAgX19kaXNwb3NlUmVzb3VyY2VzOiBfX2Rpc3Bvc2VSZXNvdXJjZXMsXHJcbn07XHJcbiIsImxldCBsb2cgPSByZXF1aXJlKCdmYW5jeS1sb2cnKTtcbmxldCBjID0gcmVxdWlyZSgncGljb2NvbG9ycycpO1xuXG5lbnVtIExFVkVMIHtcbiAgICBJTkZPLFxuICAgIERFQlVHLFxuICAgIEVSUk9SLFxuICAgIFdBUk5cbn1cblxuY2xhc3MgTG9nZ2VyIHtcbiAgICBwdWJsaWMgbG9nZ2VyO1xuICAgIHB1YmxpYyBzaWxlbnQ7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2c7XG4gICAgICAgIHRoaXMuc2lsZW50ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaW5mbyguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5zaWxlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlcih0aGlzLmZvcm1hdChMRVZFTC5JTkZPLCAuLi5hcmdzKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGVycm9yKC4uLmFyZ3MpIHtcbiAgICAgICAgdGhpcy5sb2dnZXIodGhpcy5mb3JtYXQoTEVWRUwuRVJST1IsIC4uLmFyZ3MpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd2FybiguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5zaWxlbnQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvZ2dlcih0aGlzLmZvcm1hdChMRVZFTC5XQVJOLCAuLi5hcmdzKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlYnVnKC4uLmFyZ3MpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNpbGVudCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9nZ2VyKHRoaXMuZm9ybWF0KExFVkVMLkRFQlVHLCAuLi5hcmdzKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb3JtYXQobGV2ZWwsIC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHBhZCA9IChzLCBsLCB6ID0gJycpID0+IHtcbiAgICAgICAgICAgIHJldHVybiBzICsgQXJyYXkoTWF0aC5tYXgoMCwgbCAtIHMubGVuZ3RoICsgMSkpLmpvaW4oeik7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IG1zZyA9IGFyZ3Muam9pbignICcpO1xuICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBtc2cgPSBgJHtwYWQoYXJncy5zaGlmdCgpLCAxNSwgJyAnKX06ICR7YXJncy5qb2luKCcgJyl9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobGV2ZWwpIHtcbiAgICAgICAgICAgIGNhc2UgTEVWRUwuSU5GTzpcbiAgICAgICAgICAgICAgICBtc2cgPSBjLmdyZWVuKG1zZyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgTEVWRUwuREVCVUc6XG4gICAgICAgICAgICAgICAgbXNnID0gYy5jeWFuKG1zZyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgTEVWRUwuV0FSTjpcbiAgICAgICAgICAgICAgICBtc2cgPSBjLnllbGxvdyhtc2cpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlIExFVkVMLkVSUk9SOlxuICAgICAgICAgICAgICAgIG1zZyA9IGMucmVkKG1zZyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW21zZ10uam9pbignJyk7XG4gICAgfVxufVxuXG5leHBvcnQgbGV0IGxvZ2dlciA9IG5ldyBMb2dnZXIoKTtcbiIsImV4cG9ydCBjb25zdCBDT01QT0RPQ19ERUZBVUxUUyA9IHtcbiAgICB0aXRsZTogJ0FwcGxpY2F0aW9uIGRvY3VtZW50YXRpb24nLFxuICAgIGFkZGl0aW9uYWxFbnRyeU5hbWU6ICdBZGRpdGlvbmFsIGRvY3VtZW50YXRpb24nLFxuICAgIGFkZGl0aW9uYWxFbnRyeVBhdGg6ICdhZGRpdGlvbmFsLWRvY3VtZW50YXRpb24nLFxuICAgIGZvbGRlcjogJy4vZG9jdW1lbnRhdGlvbi8nLFxuICAgIGhvc3RuYW1lOiAnMTI3LjAuMC4xJyxcbiAgICBwb3J0OiA4MDgwLFxuICAgIHRoZW1lOiAnZ2l0Ym9vaycsXG4gICAgZXhwb3J0Rm9ybWF0OiAnaHRtbCcsXG4gICAgZXhwb3J0Rm9ybWF0c1N1cHBvcnRlZDogWydodG1sJywgJ2pzb24nXSxcbiAgICBiYXNlOiAnLycsXG4gICAgZGVmYXVsdENvdmVyYWdlVGhyZXNob2xkOiA3MCxcbiAgICBkZWZhdWx0Q292ZXJhZ2VNaW5pbXVtUGVyRmlsZTogMCxcbiAgICBjb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsOiB0cnVlLFxuICAgIHRvZ2dsZU1lbnVJdGVtczogWydhbGwnXSxcbiAgICBuYXZUYWJDb25maWc6IFtdLFxuICAgIGRpc2FibGVTb3VyY2VDb2RlOiBmYWxzZSxcbiAgICBkaXNhYmxlRG9tVHJlZTogZmFsc2UsXG4gICAgZGlzYWJsZVRlbXBsYXRlVGFiOiBmYWxzZSxcbiAgICBkaXNhYmxlU3R5bGVUYWI6IGZhbHNlLFxuICAgIGRpc2FibGVHcmFwaDogZmFsc2UsXG4gICAgZGlzYWJsZU1haW5HcmFwaDogZmFsc2UsXG4gICAgZGlzYWJsZUNvdmVyYWdlOiBmYWxzZSxcbiAgICBkaXNhYmxlUHJpdmF0ZTogZmFsc2UsXG4gICAgZGlzYWJsZVByb3RlY3RlZDogZmFsc2UsXG4gICAgZGlzYWJsZUludGVybmFsOiBmYWxzZSxcbiAgICBkaXNhYmxlTGlmZUN5Y2xlSG9va3M6IGZhbHNlLFxuICAgIGRpc2FibGVDb25zdHJ1Y3RvcnM6IGZhbHNlLFxuICAgIGRpc2FibGVSb3V0ZXNHcmFwaDogZmFsc2UsXG4gICAgZGlzYWJsZURlcGVuZGVuY2llczogZmFsc2UsXG4gICAgZGlzYWJsZVByb3BlcnRpZXM6IGZhbHNlLFxuICAgIFBBR0VfVFlQRVM6IHtcbiAgICAgICAgUk9PVDogJ3Jvb3QnLFxuICAgICAgICBJTlRFUk5BTDogJ2ludGVybmFsJ1xuICAgIH0sXG4gICAgZ2FTaXRlOiAnYXV0bycsXG4gICAgY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQ6IGZhbHNlLFxuICAgIGxhbmd1YWdlOiAnZW4tVVMnLFxuICAgIG1heFNlYXJjaFJlc3VsdHM6IDE1XG59O1xuIiwiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBDT01QT0RPQ19ERUZBVUxUUyB9IGZyb20gJy4uL3V0aWxzL2RlZmF1bHRzJztcblxuaW1wb3J0IHsgQ29uZmlndXJhdGlvbkludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLmludGVyZmFjZSc7XG5pbXBvcnQgeyBDb3ZlcmFnZURhdGEgfSBmcm9tICcuL2ludGVyZmFjZXMvY292ZXJhZ2VEYXRhLmludGVyZmFjZSc7XG5pbXBvcnQgeyBNYWluRGF0YUludGVyZmFjZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9tYWluLWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IFBhZ2VJbnRlcmZhY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvcGFnZS5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgQ29uZmlndXJhdGlvbiBpbXBsZW1lbnRzIENvbmZpZ3VyYXRpb25JbnRlcmZhY2Uge1xuICAgIHByaXZhdGUgX3BhZ2VzOiBQYWdlSW50ZXJmYWNlW10gPSBbXTtcbiAgICBwcml2YXRlIF9tYWluRGF0YTogTWFpbkRhdGFJbnRlcmZhY2UgPSB7XG4gICAgICAgIG91dHB1dDogQ09NUE9ET0NfREVGQVVMVFMuZm9sZGVyLFxuICAgICAgICB0aGVtZTogQ09NUE9ET0NfREVGQVVMVFMudGhlbWUsXG4gICAgICAgIGV4dFRoZW1lOiAnJyxcbiAgICAgICAgc2VydmU6IGZhbHNlLFxuICAgICAgICBob3N0bmFtZTogQ09NUE9ET0NfREVGQVVMVFMuaG9zdG5hbWUsXG4gICAgICAgIGhvc3Q6ICcnLFxuICAgICAgICBwb3J0OiBDT01QT0RPQ19ERUZBVUxUUy5wb3J0LFxuICAgICAgICBvcGVuOiBmYWxzZSxcbiAgICAgICAgYXNzZXRzRm9sZGVyOiAnJyxcbiAgICAgICAgZG9jdW1lbnRhdGlvbk1haW5OYW1lOiBDT01QT0RPQ19ERUZBVUxUUy50aXRsZSxcbiAgICAgICAgZG9jdW1lbnRhdGlvbk1haW5EZXNjcmlwdGlvbjogJycsXG4gICAgICAgIGJhc2U6IENPTVBPRE9DX0RFRkFVTFRTLmJhc2UsXG4gICAgICAgIGhpZGVHZW5lcmF0b3I6IGZhbHNlLFxuICAgICAgICBoaWRlRGFya01vZGVUb2dnbGU6IGZhbHNlLFxuICAgICAgICBoYXNGaWxlc1RvQ292ZXJhZ2U6IGZhbHNlLFxuICAgICAgICBtb2R1bGVzOiBbXSxcbiAgICAgICAgcmVhZG1lOiBmYWxzZSxcbiAgICAgICAgY2hhbmdlbG9nOiAnJyxcbiAgICAgICAgY29udHJpYnV0aW5nOiAnJyxcbiAgICAgICAgbGljZW5zZTogJycsXG4gICAgICAgIHRvZG86ICcnLFxuICAgICAgICBtYXJrZG93bnM6IFtdLFxuICAgICAgICBhZGRpdGlvbmFsUGFnZXM6IFtdLFxuICAgICAgICBwaXBlczogW10sXG4gICAgICAgIGNsYXNzZXM6IFtdLFxuICAgICAgICBpbnRlcmZhY2VzOiBbXSxcbiAgICAgICAgY29tcG9uZW50czogW10sXG4gICAgICAgIGNvbnRyb2xsZXJzOiBbXSxcbiAgICAgICAgZW50aXRpZXM6IFtdLFxuICAgICAgICBkaXJlY3RpdmVzOiBbXSxcbiAgICAgICAgaW5qZWN0YWJsZXM6IFtdLFxuICAgICAgICBpbnRlcmNlcHRvcnM6IFtdLFxuICAgICAgICBndWFyZHM6IFtdLFxuICAgICAgICBtaXNjZWxsYW5lb3VzOiBbXSxcbiAgICAgICAgcm91dGVzOiBbXSxcbiAgICAgICAgdHNjb25maWc6ICcnLFxuICAgICAgICB0b2dnbGVNZW51SXRlbXM6IENPTVBPRE9DX0RFRkFVTFRTLnRvZ2dsZU1lbnVJdGVtcyxcbiAgICAgICAgbmF2VGFiQ29uZmlnOiBbXSxcbiAgICAgICAgdGVtcGxhdGVzOiAnJyxcbiAgICAgICAgaW5jbHVkZXM6ICcnLFxuICAgICAgICBpbmNsdWRlc05hbWU6IENPTVBPRE9DX0RFRkFVTFRTLmFkZGl0aW9uYWxFbnRyeU5hbWUsXG4gICAgICAgIGluY2x1ZGVzRm9sZGVyOiBDT01QT0RPQ19ERUZBVUxUUy5hZGRpdGlvbmFsRW50cnlQYXRoLFxuICAgICAgICBkaXNhYmxlU291cmNlQ29kZTogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVNvdXJjZUNvZGUsXG4gICAgICAgIGRpc2FibGVEb21UcmVlOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlRG9tVHJlZSxcbiAgICAgICAgZGlzYWJsZVRlbXBsYXRlVGFiOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlVGVtcGxhdGVUYWIsXG4gICAgICAgIGRpc2FibGVTdHlsZVRhYjogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZVN0eWxlVGFiLFxuICAgICAgICBkaXNhYmxlR3JhcGg6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVHcmFwaCxcbiAgICAgICAgZGlzYWJsZU1haW5HcmFwaDogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZU1haW5HcmFwaCxcbiAgICAgICAgZGlzYWJsZUNvdmVyYWdlOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlQ292ZXJhZ2UsXG4gICAgICAgIGRpc2FibGVQcml2YXRlOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlUHJpdmF0ZSxcbiAgICAgICAgZGlzYWJsZUludGVybmFsOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlSW50ZXJuYWwsXG4gICAgICAgIGRpc2FibGVQcm90ZWN0ZWQ6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVQcm90ZWN0ZWQsXG4gICAgICAgIGRpc2FibGVMaWZlQ3ljbGVIb29rczogQ09NUE9ET0NfREVGQVVMVFMuZGlzYWJsZUxpZmVDeWNsZUhvb2tzLFxuICAgICAgICBkaXNhYmxlQ29uc3RydWN0b3JzOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlQ29uc3RydWN0b3JzLFxuICAgICAgICBkaXNhYmxlUm91dGVzR3JhcGg6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVSb3V0ZXNHcmFwaCxcbiAgICAgICAgZGlzYWJsZVNlYXJjaDogZmFsc2UsXG4gICAgICAgIGRpc2FibGVEZXBlbmRlbmNpZXM6IENPTVBPRE9DX0RFRkFVTFRTLmRpc2FibGVEZXBlbmRlbmNpZXMsXG4gICAgICAgIGRpc2FibGVQcm9wZXJ0aWVzOiBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlUHJvcGVydGllcyxcbiAgICAgICAgd2F0Y2g6IGZhbHNlLFxuICAgICAgICBtYWluR3JhcGg6ICcnLFxuICAgICAgICBjb3ZlcmFnZVRlc3Q6IGZhbHNlLFxuICAgICAgICBjb3ZlcmFnZVRlc3RUaHJlc2hvbGQ6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZVRocmVzaG9sZCxcbiAgICAgICAgY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbDogQ09NUE9ET0NfREVGQVVMVFMuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCxcbiAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZTogZmFsc2UsXG4gICAgICAgIGNvdmVyYWdlTWluaW11bVBlckZpbGU6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZU1pbmltdW1QZXJGaWxlLFxuICAgICAgICB1bml0VGVzdENvdmVyYWdlOiAnJyxcbiAgICAgICAgdW5pdFRlc3REYXRhOiB1bmRlZmluZWQsXG4gICAgICAgIGNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkOiBDT01QT0RPQ19ERUZBVUxUUy5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCxcbiAgICAgICAgcm91dGVzTGVuZ3RoOiAwLFxuICAgICAgICBhbmd1bGFyVmVyc2lvbjogJycsXG4gICAgICAgIGV4cG9ydEZvcm1hdDogQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0LFxuICAgICAgICBjb3ZlcmFnZURhdGE6IHt9IGFzIENvdmVyYWdlRGF0YSxcbiAgICAgICAgY3VzdG9tRmF2aWNvbjogJycsXG4gICAgICAgIGN1c3RvbUxvZ286ICcnLFxuICAgICAgICBwYWNrYWdlRGVwZW5kZW5jaWVzOiBbXSxcbiAgICAgICAgcGFja2FnZVBlZXJEZXBlbmRlbmNpZXM6IFtdLFxuICAgICAgICBwYWNrYWdlUHJvcGVydGllczoge30sXG4gICAgICAgIGdhSUQ6ICcnLFxuICAgICAgICBnYVNpdGU6ICcnLFxuICAgICAgICBhbmd1bGFyUHJvamVjdDogZmFsc2UsXG4gICAgICAgIGFuZ3VsYXJKU1Byb2plY3Q6IGZhbHNlLFxuICAgICAgICBsYW5ndWFnZTogQ09NUE9ET0NfREVGQVVMVFMubGFuZ3VhZ2UsXG4gICAgICAgIG1heFNlYXJjaFJlc3VsdHM6IDE1XG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBDb25maWd1cmF0aW9uO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5pbnN0YW5jZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5pbnN0YW5jZSA9IG5ldyBDb25maWd1cmF0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIENvbmZpZ3VyYXRpb24uaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZFBhZ2UocGFnZTogUGFnZUludGVyZmFjZSkge1xuICAgICAgICBsZXQgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogcGFnZS5uYW1lIH0pO1xuICAgICAgICBpZiAoaW5kZXhQYWdlID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5fcGFnZXMucHVzaChwYWdlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBoYXNQYWdlKG5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogbmFtZSB9KTtcbiAgICAgICAgcmV0dXJuIGluZGV4UGFnZSAhPT0gLTE7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZEFkZGl0aW9uYWxQYWdlKHBhZ2U6IFBhZ2VJbnRlcmZhY2UpIHtcbiAgICAgICAgdGhpcy5fbWFpbkRhdGEuYWRkaXRpb25hbFBhZ2VzLnB1c2gocGFnZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEFkZGl0aW9uYWxQYWdlQnlJZChpZCk6IFBhZ2VJbnRlcmZhY2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5fbWFpbkRhdGEuYWRkaXRpb25hbFBhZ2VzLmZpbmQocGFnZSA9PiBwYWdlLmlkID09PSBpZCk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0UGFnZXMoKSB7XG4gICAgICAgIHRoaXMuX3BhZ2VzID0gW107XG4gICAgfVxuXG4gICAgcHVibGljIHJlc2V0QWRkaXRpb25hbFBhZ2VzKCkge1xuICAgICAgICB0aGlzLl9tYWluRGF0YS5hZGRpdGlvbmFsUGFnZXMgPSBbXTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzZXRSb290TWFya2Rvd25QYWdlcygpIHtcbiAgICAgICAgbGV0IGluZGV4UGFnZSA9IF8uZmluZEluZGV4KHRoaXMuX3BhZ2VzLCB7IG5hbWU6ICdpbmRleCcgfSk7XG4gICAgICAgIHRoaXMuX3BhZ2VzLnNwbGljZShpbmRleFBhZ2UsIDEpO1xuICAgICAgICBpbmRleFBhZ2UgPSBfLmZpbmRJbmRleCh0aGlzLl9wYWdlcywgeyBuYW1lOiAnY2hhbmdlbG9nJyB9KTtcbiAgICAgICAgdGhpcy5fcGFnZXMuc3BsaWNlKGluZGV4UGFnZSwgMSk7XG4gICAgICAgIGluZGV4UGFnZSA9IF8uZmluZEluZGV4KHRoaXMuX3BhZ2VzLCB7IG5hbWU6ICdjb250cmlidXRpbmcnIH0pO1xuICAgICAgICB0aGlzLl9wYWdlcy5zcGxpY2UoaW5kZXhQYWdlLCAxKTtcbiAgICAgICAgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogJ2xpY2Vuc2UnIH0pO1xuICAgICAgICB0aGlzLl9wYWdlcy5zcGxpY2UoaW5kZXhQYWdlLCAxKTtcbiAgICAgICAgaW5kZXhQYWdlID0gXy5maW5kSW5kZXgodGhpcy5fcGFnZXMsIHsgbmFtZTogJ3RvZG8nIH0pO1xuICAgICAgICB0aGlzLl9wYWdlcy5zcGxpY2UoaW5kZXhQYWdlLCAxKTtcbiAgICAgICAgdGhpcy5fbWFpbkRhdGEubWFya2Rvd25zID0gW107XG4gICAgfVxuXG4gICAgZ2V0IHBhZ2VzKCk6IFBhZ2VJbnRlcmZhY2VbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYWdlcztcbiAgICB9XG4gICAgc2V0IHBhZ2VzKHBhZ2VzOiBQYWdlSW50ZXJmYWNlW10pIHtcbiAgICAgICAgdGhpcy5fcGFnZXMgPSBbXTtcbiAgICB9XG5cbiAgICBnZXQgbWFya0Rvd25QYWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhZ2VzLmZpbHRlcihwYWdlID0+IHBhZ2UubWFya2Rvd24pO1xuICAgIH1cblxuICAgIGdldCBtYWluRGF0YSgpOiBNYWluRGF0YUludGVyZmFjZSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYWluRGF0YTtcbiAgICB9XG4gICAgc2V0IG1haW5EYXRhKGRhdGE6IE1haW5EYXRhSW50ZXJmYWNlKSB7XG4gICAgICAgIChPYmplY3QgYXMgYW55KS5hc3NpZ24odGhpcy5fbWFpbkRhdGEsIGRhdGEpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29uZmlndXJhdGlvbi5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgSUFwaVNvdXJjZVJlc3VsdCB9IGZyb20gJy4vYXBpLXNvdXJjZS1yZXN1bHQuaW50ZXJmYWNlJztcblxuY29uc3QgQW5ndWxhckFQSXM6IEFycmF5PElBbmd1bGFyTWFpbkFwaT4gPSByZXF1aXJlKCcuLi9zcmMvZGF0YS9hcGktbGlzdC5qc29uJyk7XG5cbmV4cG9ydCBjbGFzcyBBbmd1bGFyQXBpVXRpbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEFuZ3VsYXJBcGlVdGlsO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7fVxuICAgIHB1YmxpYyBzdGF0aWMgZ2V0SW5zdGFuY2UoKSB7XG4gICAgICAgIGlmICghQW5ndWxhckFwaVV0aWwuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEFuZ3VsYXJBcGlVdGlsLmluc3RhbmNlID0gbmV3IEFuZ3VsYXJBcGlVdGlsKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIEFuZ3VsYXJBcGlVdGlsLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kQXBpKHR5cGU6IHN0cmluZyk6IElBcGlTb3VyY2VSZXN1bHQ8SUFuZ3VsYXJNYWluQXBpPiB7XG4gICAgICAgIGxldCBmb3VuZGVkQXBpO1xuICAgICAgICBfLmZvckVhY2goQW5ndWxhckFQSXMsIG1haW5BcGkgPT4ge1xuICAgICAgICAgICAgXy5mb3JFYWNoKG1haW5BcGkuaXRlbXMsIGFwaSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFwaS50aXRsZSA9PT0gdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZGVkQXBpID0gYXBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHNvdXJjZTogJ2V4dGVybmFsJyxcbiAgICAgICAgICAgIGRhdGE6IGZvdW5kZWRBcGlcbiAgICAgICAgfTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEFuZ3VsYXJBcGlVdGlsLmdldEluc3RhbmNlKCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUFuZ3VsYXJNYWluQXBpIHtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBpdGVtczogSUFuZ3VsYXJBcGlbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQW5ndWxhckFwaSB7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgZG9jVHlwZTogc3RyaW5nO1xuICAgIHN0YWJpbGl0eTogc3RyaW5nO1xuICAgIHNlY3VyZTogc3RyaW5nO1xuICAgIGJhcnJlbDogc3RyaW5nO1xufVxuIiwiZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RMZWFkaW5nVGV4dChzdHJpbmcsIGNvbXBsZXRlVGFnKSB7XG4gICAgbGV0IHRhZ0luZGV4ID0gc3RyaW5nLmluZGV4T2YoY29tcGxldGVUYWcpO1xuICAgIGxldCBsZWFkaW5nVGV4dCA9IHVuZGVmaW5lZDtcbiAgICBsZXQgbGVhZGluZ1RleHRSZWdFeHAgPSAvXFxbKC4rPylcXF0vZztcbiAgICBsZXQgbGVhZGluZ1RleHRJbmZvID0gbGVhZGluZ1RleHRSZWdFeHAuZXhlYyhzdHJpbmcpO1xuXG4gICAgLy8gZGlkIHdlIGZpbmQgbGVhZGluZyB0ZXh0LCBhbmQgaWYgc28sIGRvZXMgaXQgaW1tZWRpYXRlbHkgcHJlY2VkZSB0aGUgdGFnP1xuICAgIHdoaWxlIChsZWFkaW5nVGV4dEluZm8gJiYgbGVhZGluZ1RleHRJbmZvLmxlbmd0aCkge1xuICAgICAgICBpZiAobGVhZGluZ1RleHRJbmZvLmluZGV4ICsgbGVhZGluZ1RleHRJbmZvWzBdLmxlbmd0aCA9PT0gdGFnSW5kZXgpIHtcbiAgICAgICAgICAgIHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKGxlYWRpbmdUZXh0SW5mb1swXSwgJycpO1xuICAgICAgICAgICAgbGVhZGluZ1RleHQgPSBsZWFkaW5nVGV4dEluZm9bMV07XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlYWRpbmdUZXh0SW5mbyA9IGxlYWRpbmdUZXh0UmVnRXhwLmV4ZWMoc3RyaW5nKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBsZWFkaW5nVGV4dDogbGVhZGluZ1RleHQsXG4gICAgICAgIHN0cmluZzogc3RyaW5nXG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0TGlua1RleHQodGV4dCkge1xuICAgIGxldCBsaW5rVGV4dDtcbiAgICBsZXQgdGFyZ2V0O1xuICAgIGxldCBzcGxpdEluZGV4O1xuXG4gICAgLy8gaWYgYSBwaXBlIGlzIG5vdCBwcmVzZW50LCB3ZSBzcGxpdCBvbiB0aGUgZmlyc3Qgc3BhY2VcbiAgICBzcGxpdEluZGV4ID0gdGV4dC5pbmRleE9mKCd8Jyk7XG4gICAgaWYgKHNwbGl0SW5kZXggPT09IC0xKSB7XG4gICAgICAgIHNwbGl0SW5kZXggPSB0ZXh0LnNlYXJjaCgvXFxzLyk7XG4gICAgfVxuXG4gICAgaWYgKHNwbGl0SW5kZXggIT09IC0xKSB7XG4gICAgICAgIGxpbmtUZXh0ID0gdGV4dC5zdWJzdHIoc3BsaXRJbmRleCArIDEpO1xuICAgICAgICAvLyBOb3JtYWxpemUgc3Vic2VxdWVudCBuZXdsaW5lcyB0byBhIHNpbmdsZSBzcGFjZS5cbiAgICAgICAgbGlua1RleHQgPSBsaW5rVGV4dC5yZXBsYWNlKC9cXG4rLywgJyAnKTtcbiAgICAgICAgdGFyZ2V0ID0gdGV4dC5zdWJzdHIoMCwgc3BsaXRJbmRleCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgbGlua1RleHQ6IGxpbmtUZXh0LFxuICAgICAgICB0YXJnZXQ6IHRhcmdldCB8fCB0ZXh0XG4gICAgfTtcbn1cblxuZXhwb3J0IGxldCBMaW5rUGFyc2VyID0gKGZ1bmN0aW9uKCkge1xuICAgIGxldCBwcm9jZXNzVGhlTGluayA9IGZ1bmN0aW9uKHN0cmluZywgdGFnSW5mbywgbGVhZGluZ1RleHQpIHtcbiAgICAgICAgbGV0IGxlYWRpbmcgPSBleHRyYWN0TGVhZGluZ1RleHQoc3RyaW5nLCB0YWdJbmZvLmNvbXBsZXRlVGFnKSxcbiAgICAgICAgICAgIGxpbmtUZXh0LFxuICAgICAgICAgICAgc3BsaXQsXG4gICAgICAgICAgICB0YXJnZXQsXG4gICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2U7XG5cbiAgICAgICAgbGlua1RleHQgPSBsZWFkaW5nVGV4dCA/IGxlYWRpbmdUZXh0IDogbGVhZGluZy5sZWFkaW5nVGV4dCB8fCAnJztcblxuICAgICAgICBzcGxpdCA9IHNwbGl0TGlua1RleHQodGFnSW5mby50ZXh0KTtcbiAgICAgICAgdGFyZ2V0ID0gc3BsaXQudGFyZ2V0O1xuXG4gICAgICAgIGlmIChsZWFkaW5nLmxlYWRpbmdUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmcubGVhZGluZ1RleHQgKyAnXScgKyB0YWdJbmZvLmNvbXBsZXRlVGFnO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9IHRhZ0luZm8uY29tcGxldGVUYWc7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IHNwbGl0LmxpbmtUZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChsaW5rVGV4dCA9PT0gJycgfHwgbGlua1RleHQgPT0gbnVsbCB8fCB0YXJnZXQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHJpbmcucmVwbGFjZShzdHJpbmd0b1JlcGxhY2UsICdbJyArIGxpbmtUZXh0ICsgJ10oJyArIHRhcmdldCArICcpJyk7XG4gICAgfTtcblxuICAgIC8qKlxuICAgICAqIENvbnZlcnRcbiAgICAgKiB7QGxpbmsgaHR0cDovL3d3dy5nb29nbGUuY29tfEdvb2dsZX0gb3Ige0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbSBHaXRIdWJ9IG9yIFtHaXRodWJde0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbX0gdG8gW0dpdGh1Yl0oaHR0cHM6Ly9naXRodWIuY29tKVxuICAgICAqL1xuXG4gICAgbGV0IHJlcGxhY2VMaW5rVGFnID0gZnVuY3Rpb24oc3RyOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBzdHIgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIG5ld1N0cmluZzogJydcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBuZXcgUmVnRXhwKCdcXFxcWygoPzoufFxcbikrPyldXFxcXHtAbGlua1xcXFxzKygoPzoufFxcbikrPylcXFxcfScsICdpJykuZXhlYygnZWUgW1RPIERPXXtAbGluayBUb2RvfSBmbycpIC0+IFwiW1RPIERPXXtAbGluayBUb2RvfVwiLCBcIlRPIERPXCIsIFwiVG9kb1wiXG4gICAgICAgIC8vIG5ldyBSZWdFeHAoJ1xcXFx7QGxpbmtcXFxccysoKD86LnxcXG4pKz8pXFxcXH0nLCAnaScpLmV4ZWMoJ2VlIFtUT0RPXXtAbGluayBUb2RvfSBmbycpIC0+IFwie0BsaW5rIFRvZG99XCIsIFwiVG9kb1wiXG5cbiAgICAgICAgbGV0IHRhZ1JlZ0V4cExpZ2h0ID0gbmV3IFJlZ0V4cCgnXFxcXHtAbGlua1xcXFxzKygoPzoufFxcbikrPylcXFxcfScsICdpJyksXG4gICAgICAgICAgICB0YWdSZWdFeHBGdWxsID0gbmV3IFJlZ0V4cCgnXFxcXHtAbGlua1xcXFxzKygoPzoufFxcbikrPylcXFxcfScsICdpJyksXG4gICAgICAgICAgICB0YWdSZWdFeHAsXG4gICAgICAgICAgICBtYXRjaGVzLFxuICAgICAgICAgICAgcHJldmlvdXNTdHJpbmcsXG4gICAgICAgICAgICB0YWdJbmZvID0gW107XG5cbiAgICAgICAgdGFnUmVnRXhwID0gc3RyLmluZGV4T2YoJ117JykgIT09IC0xID8gdGFnUmVnRXhwRnVsbCA6IHRhZ1JlZ0V4cExpZ2h0O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VNYXRjaChyZXBsYWNlciwgdGFnLCBtYXRjaCwgdGV4dCwgbGlua1RleHQ/KSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2hlZFRhZyA9IHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZVRhZzogbWF0Y2gsXG4gICAgICAgICAgICAgICAgdGFnOiB0YWcsXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRhZ0luZm8ucHVzaChtYXRjaGVkVGFnKTtcbiAgICAgICAgICAgIGlmIChsaW5rVGV4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlcihzdHIsIG1hdGNoZWRUYWcsIGxpbmtUZXh0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyKHN0ciwgbWF0Y2hlZFRhZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBtYXRjaGVzID0gdGFnUmVnRXhwLmV4ZWMoc3RyKTtcbiAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdHJpbmcgPSBzdHI7XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHJlcGxhY2VNYXRjaChwcm9jZXNzVGhlTGluaywgJ2xpbmsnLCBtYXRjaGVzWzBdLCBtYXRjaGVzWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0ciA9IHJlcGxhY2VNYXRjaChwcm9jZXNzVGhlTGluaywgJ2xpbmsnLCBtYXRjaGVzWzBdLCBtYXRjaGVzWzJdLCBtYXRjaGVzWzFdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKG1hdGNoZXMgJiYgcHJldmlvdXNTdHJpbmcgIT09IHN0cik7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5ld1N0cmluZzogc3RyXG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIGxldCBfcmVzb2x2ZUxpbmtzID0gZnVuY3Rpb24oc3RyOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHJlcGxhY2VMaW5rVGFnKHN0cikubmV3U3RyaW5nO1xuICAgIH07XG5cbiAgICByZXR1cm4ge1xuICAgICAgICByZXNvbHZlTGlua3M6IF9yZXNvbHZlTGlua3NcbiAgICB9O1xufSkoKTtcbiIsImV4cG9ydCBlbnVtIEFuZ3VsYXJMaWZlY3ljbGVIb29rcyB7XG4gICAgbmdPbkNoYW5nZXMsXG4gICAgbmdPbkluaXQsXG4gICAgbmdEb0NoZWNrLFxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCxcbiAgICBuZ0FmdGVyQ29udGVudENoZWNrZWQsXG4gICAgbmdBZnRlclZpZXdJbml0LFxuICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCxcbiAgICBuZ09uRGVzdHJveVxufVxuIiwiaW1wb3J0IHsgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGVudW0gS2luZFR5cGUge1xuICAgIFVOS05PV04gPSAnJyxcbiAgICBTVFJJTkcgPSAnc3RyaW5nJyxcbiAgICBOVU1CRVIgPSAnbnVtYmVyJyxcbiAgICBBUlJBWSA9ICdbXScsXG4gICAgVk9JRCA9ICd2b2lkJyxcbiAgICBGVU5DVElPTiA9ICdmdW5jdGlvbicsXG4gICAgVEVNUExBVEVfTElURVJBTCA9ICd0ZW1wbGF0ZSBsaXRlcmFsIHR5cGUnLFxuICAgIExJVEVSQUwgPSAnbGl0ZXJhbCB0eXBlJyxcbiAgICBCT09MRUFOID0gJ2Jvb2xlYW4nLFxuICAgIEFOWSA9ICdhbnknLFxuICAgIE5VTEwgPSAnbnVsbCcsXG4gICAgU1lNQk9MID0gJ3N5bWJvbCcsXG4gICAgTkVWRVIgPSAnbmV2ZXInLFxuICAgIFVOREVGSU5FRCA9ICd1bmRlZmluZWQnLFxuICAgIE9CSkVDVCA9ICdvYmplY3QnXG59XG5cbmV4cG9ydCB0eXBlIElzS2luZFR5cGVNZXRob2RzID0ge1xuICAgIFtrZXkgaW4ga2V5b2YgdHlwZW9mIEtpbmRUeXBlXTogKGtpbmQ6IG51bWJlcikgPT4gYm9vbGVhbjtcbn07XG5cbmV4cG9ydCBjb25zdCBJc0tpbmRUeXBlOiBJc0tpbmRUeXBlTWV0aG9kcyA9IHtcbiAgICBBTlkoa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5BTlk7XG4gICAgfSxcbiAgICBBUlJBWShraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLkFSUkFZO1xuICAgIH0sXG4gICAgQk9PTEVBTihraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLkJPT0xFQU47XG4gICAgfSxcbiAgICBGVU5DVElPTihraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLkZVTkNUSU9OO1xuICAgIH0sXG4gICAgTElURVJBTChraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLkxJVEVSQUw7XG4gICAgfSxcbiAgICBORVZFUihraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLk5FVkVSO1xuICAgIH0sXG4gICAgTlVMTChraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLk5VTEw7XG4gICAgfSxcbiAgICBOVU1CRVIoa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5OVU1CRVI7XG4gICAgfSxcbiAgICBPQkpFQ1Qoa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5PQkpFQ1Q7XG4gICAgfSxcbiAgICBTVFJJTkcoa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5TVFJJTkc7XG4gICAgfSxcbiAgICBTWU1CT0woa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5TWU1CT0w7XG4gICAgfSxcbiAgICBURU1QTEFURV9MSVRFUkFMKGtpbmQ6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ga2luZFRvVHlwZShraW5kKSA9PT0gS2luZFR5cGUuVEVNUExBVEVfTElURVJBTDtcbiAgICB9LFxuICAgIFVOREVGSU5FRChraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLlVOREVGSU5FRDtcbiAgICB9LFxuICAgIFVOS05PV04oa2luZDogbnVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBraW5kVG9UeXBlKGtpbmQpID09PSBLaW5kVHlwZS5VTktOT1dOO1xuICAgIH0sXG4gICAgVk9JRChraW5kOiBudW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIGtpbmRUb1R5cGUoa2luZCkgPT09IEtpbmRUeXBlLlZPSUQ7XG4gICAgfVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGtpbmRUb1R5cGUoa2luZDogbnVtYmVyKTogS2luZFR5cGUge1xuICAgIGxldCBfdHlwZSA9IEtpbmRUeXBlLlVOS05PV047XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkOlxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbDpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuU1RSSU5HO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkOlxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuTnVtZXJpY0xpdGVyYWw6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLk5VTUJFUjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQXJyYXlUeXBlOlxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbjpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuQVJSQVk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlZvaWRLZXl3b3JkOlxuICAgICAgICAgICAgX3R5cGUgPSBLaW5kVHlwZS5WT0lEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5GdW5jdGlvblR5cGU6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLkZVTkNUSU9OO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5UZW1wbGF0ZUxpdGVyYWxUeXBlOlxuICAgICAgICAgICAgX3R5cGUgPSBLaW5kVHlwZS5URU1QTEFURV9MSVRFUkFMO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5UeXBlTGl0ZXJhbDpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuTElURVJBTDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuQm9vbGVhbktleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLkJPT0xFQU47XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLkFueUtleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLkFOWTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuTnVsbEtleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLk5VTEw7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBTeW50YXhLaW5kLlN5bWJvbEtleXdvcmQ6XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLlNZTUJPTDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuTmV2ZXJLZXl3b3JkOlxuICAgICAgICAgICAgX3R5cGUgPSBLaW5kVHlwZS5ORVZFUjtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFN5bnRheEtpbmQuVW5kZWZpbmVkS2V5d29yZDpcbiAgICAgICAgICAgIF90eXBlID0gS2luZFR5cGUuVU5ERUZJTkVEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgU3ludGF4S2luZC5PYmplY3RLZXl3b3JkOlxuICAgICAgICBjYXNlIFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb246XG4gICAgICAgICAgICBfdHlwZSA9IEtpbmRUeXBlLk9CSkVDVDtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gX3R5cGU7XG59XG4iLCJpbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmNvbnN0IHRzYW55ID0gdHMgYXMgYW55O1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvYmxvYi92Mi4xLjQvc3JjL2NvbXBpbGVyL3V0aWxpdGllcy50cyNMMTUyXG5leHBvcnQgZnVuY3Rpb24gZ2V0U291cmNlRmlsZU9mTm9kZShub2RlOiB0cy5Ob2RlKTogdHMuU291cmNlRmlsZSB7XG4gICAgcmV0dXJuIHRzYW55LmdldFNvdXJjZUZpbGVPZk5vZGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbn1cblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2Jsb2IvdjIuMS40L3NyYy9jb21waWxlci91dGlsaXRpZXMudHMjTDE0MjNcbmV4cG9ydCBmdW5jdGlvbiBnZXRKU0RvY0NvbW1lbnRSYW5nZXMobm9kZTogdHMuTm9kZSwgdGV4dDogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRzYW55LmdldEpTRG9jQ29tbWVudFJhbmdlcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xufVxuIiwiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgdHMsIFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCAqIGFzIF90cyBmcm9tICcuL3RzLWludGVybmFsJztcblxuaW1wb3J0IHsgSlNEb2NQYXJhbWV0ZXJUYWdFeHQgfSBmcm9tICcuLi9hcHAvbm9kZXMvanNkb2MtcGFyYW1ldGVyLXRhZy5ub2RlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jUGFyc2VyVXRpbCB7XG4gICAgcHVibGljIGlzVmFyaWFibGVMaWtlKG5vZGU6IHRzLk5vZGUpOiBub2RlIGlzIHRzLlZhcmlhYmxlTGlrZURlY2xhcmF0aW9uIHtcbiAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgIHN3aXRjaCAobm9kZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLkJpbmRpbmdFbGVtZW50OlxuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5FbnVtTWVtYmVyOlxuICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5QYXJhbWV0ZXI6XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3BlcnR5QXNzaWdubWVudDpcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuUHJvcGVydHlEZWNsYXJhdGlvbjpcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuUHJvcGVydHlTaWduYXR1cmU6XG4gICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlNob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudDpcbiAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuVmFyaWFibGVEZWNsYXJhdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlzVG9wbW9zdE1vZHVsZURlY2xhcmF0aW9uKG5vZGU6IHRzLk1vZHVsZURlY2xhcmF0aW9uKTogYm9vbGVhbiB7XG4gICAgICAgIGlmIChub2RlLm5leHRDb250YWluZXIgJiYgbm9kZS5uZXh0Q29udGFpbmVyLmtpbmQgPT09IHRzLlN5bnRheEtpbmQuTW9kdWxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgIGxldCBuZXh0ID0gPHRzLk1vZHVsZURlY2xhcmF0aW9uPm5vZGUubmV4dENvbnRhaW5lcjtcbiAgICAgICAgICAgIGlmIChub2RlLm5hbWUuZW5kICsgMSA9PT0gbmV4dC5uYW1lLnBvcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGdldFJvb3RNb2R1bGVEZWNsYXJhdGlvbihub2RlOiB0cy5Nb2R1bGVEZWNsYXJhdGlvbik6IHRzLk5vZGUge1xuICAgICAgICB3aGlsZSAobm9kZS5wYXJlbnQgJiYgbm9kZS5wYXJlbnQua2luZCA9PT0gdHMuU3ludGF4S2luZC5Nb2R1bGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgbGV0IHBhcmVudCA9IDx0cy5Nb2R1bGVEZWNsYXJhdGlvbj5ub2RlLnBhcmVudDtcbiAgICAgICAgICAgIGlmIChub2RlLm5hbWUucG9zID09PSBwYXJlbnQubmFtZS5lbmQgKyAxKSB7XG4gICAgICAgICAgICAgICAgbm9kZSA9IHBhcmVudDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9kZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TWFpbkNvbW1lbnRPZk5vZGUobm9kZTogdHMuTm9kZSwgc291cmNlRmlsZT86IHRzLlNvdXJjZUZpbGUpOiBzdHJpbmcge1xuICAgICAgICBsZXQgZGVzY3JpcHRpb246IHN0cmluZyA9ICcnO1xuXG4gICAgICAgIGlmIChub2RlLnBhcmVudCAmJiBub2RlLnBhcmVudC5raW5kID09PSB0cy5TeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KSB7XG4gICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnQucGFyZW50O1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUua2luZCA9PT0gdHMuU3ludGF4S2luZC5Nb2R1bGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmlzVG9wbW9zdE1vZHVsZURlY2xhcmF0aW9uKDx0cy5Nb2R1bGVEZWNsYXJhdGlvbj5ub2RlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBub2RlID0gdGhpcy5nZXRSb290TW9kdWxlRGVjbGFyYXRpb24oPHRzLk1vZHVsZURlY2xhcmF0aW9uPm5vZGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY29tbWVudHMgPSBfdHMuZ2V0SlNEb2NDb21tZW50UmFuZ2VzKG5vZGUsIHNvdXJjZUZpbGUudGV4dCk7XG4gICAgICAgIGlmIChjb21tZW50cyAmJiBjb21tZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCBjb21tZW50OiB0cy5Db21tZW50UmFuZ2U7XG4gICAgICAgICAgICBpZiAobm9kZS5raW5kID09PSB0cy5TeW50YXhLaW5kLlNvdXJjZUZpbGUpIHtcbiAgICAgICAgICAgICAgICBpZiAoY29tbWVudHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb21tZW50ID0gY29tbWVudHNbMF07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50c1tjb21tZW50cy5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBzb3VyY2VGaWxlLnRleHQuc3Vic3RyaW5nKGNvbW1lbnQucG9zLCBjb21tZW50LmVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZUNvbW1lbnQodGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGNvbW1lbnQgPSAnJztcbiAgICAgICAgbGV0IHNob3J0VGV4dCA9IDA7XG5cbiAgICAgICAgZnVuY3Rpb24gcmVhZEJhcmVMaW5lKGxpbmU6IHN0cmluZykge1xuICAgICAgICAgICAgY29tbWVudCArPSAnXFxuJyArIGxpbmU7XG4gICAgICAgICAgICBpZiAobGluZSA9PT0gJycgJiYgc2hvcnRUZXh0ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gSWdub3JlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGxpbmUgPT09ICcnICYmIHNob3J0VGV4dCA9PT0gMSkge1xuICAgICAgICAgICAgICAgIHNob3J0VGV4dCA9IDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChzaG9ydFRleHQgPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgY29tbWVudCArPSAoY29tbWVudCA9PT0gJycgPyAnJyA6ICdcXG4nKSArIGxpbmU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgQ09ERV9GRU5DRSA9IC9eXFxzKmBgYCg/IS4qYGBgKS87XG4gICAgICAgIGxldCBpbkNvZGUgPSBmYWxzZTtcbiAgICAgICAgbGV0IGluRXhhbXBsZSA9IGZhbHNlOyAvLyBmaXJzdCBsaW5lIHdpdGggQGV4YW1wbGUsIGVuZCBsaW5lIHdpdGggZW1wdHkgc3RyaW5nIG9yIHN0cmluZyBvciAqL1xuICAgICAgICBsZXQgbmJMaW5lcyA9IDA7XG4gICAgICAgIGZ1bmN0aW9uIHJlYWRMaW5lKGxpbmU6IHN0cmluZywgaW5kZXg6IG51bWJlcikge1xuICAgICAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZSgvXlxccypcXCo/ID8vLCAnJyk7XG4gICAgICAgICAgICBsaW5lID0gbGluZS5yZXBsYWNlKC9cXHMqJC8sICcnKTtcblxuICAgICAgICAgICAgaWYgKENPREVfRkVOQ0UudGVzdChsaW5lKSkge1xuICAgICAgICAgICAgICAgIGluQ29kZSA9ICFpbkNvZGU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsaW5lLmluZGV4T2YoJ0BleGFtcGxlJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaW5FeGFtcGxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBsaW5lID0gJ2BgYGh0bWwnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaW5FeGFtcGxlICYmIGxpbmUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgaW5FeGFtcGxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGluZSA9ICdgYGAnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWluQ29kZSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IC9eQChcXFMrKS8uZXhlYyhsaW5lKTtcbiAgICAgICAgICAgICAgICBjb25zdCBTZWVUYWcgPSAvXkBzZWUvLmV4ZWMobGluZSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoU2VlVGFnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lLnJlcGxhY2UoL15Ac2VlLywgJ1NlZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0YWcgJiYgIVNlZVRhZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZWFkQmFyZUxpbmUobGluZSk7XG4gICAgICAgIH1cblxuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9eXFxzKlxcL1xcKisvLCAnJyk7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcKitcXC9cXHMqJC8sICcnKTtcblxuICAgICAgICBuYkxpbmVzID0gdGV4dC5zcGxpdCgvXFxyXFxuP3xcXG4vKS5sZW5ndGg7XG5cbiAgICAgICAgdGV4dC5zcGxpdCgvXFxyXFxuP3xcXG4vKS5mb3JFYWNoKHJlYWRMaW5lKTtcblxuICAgICAgICByZXR1cm4gY29tbWVudDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEpTRG9jVGFncyhub2RlOiB0cy5Ob2RlLCBraW5kOiBTeW50YXhLaW5kKTogdHMuSlNEb2NUYWdbXSB7XG4gICAgICAgIGNvbnN0IGRvY3MgPSB0aGlzLmdldEpTRG9jcyhub2RlKTtcbiAgICAgICAgaWYgKGRvY3MpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogdHMuSlNEb2NUYWdbXSA9IFtdO1xuICAgICAgICAgICAgZm9yIChjb25zdCBkb2Mgb2YgZG9jcykge1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc0pTRG9jUGFyYW1ldGVyVGFnKGRvYykpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRvYy5raW5kID09PSBraW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChkb2MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cy5pc0pTRG9jKGRvYykpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goLi4uXy5maWx0ZXIoZG9jLnRhZ3MsIHRhZyA9PiB0YWcua2luZCA9PT0ga2luZCkpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5leHBlY3RlZCB0eXBlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRKU0RvY3Mobm9kZTogdHMuTm9kZSk6IFJlYWRvbmx5QXJyYXk8dHMuSlNEb2MgfCB0cy5KU0RvY1RhZz4ge1xuICAgICAgICAvLyBUT0RPOiBqc0RvY0NhY2hlIGlzIGludGVybmFsLCBzZWUgaWYgdGhlcmUncyBhIHdheSBhcm91bmQgaXRcbiAgICAgICAgbGV0IGNhY2hlOiBSZWFkb25seUFycmF5PHRzLkpTRG9jIHwgdHMuSlNEb2NUYWc+ID0gKG5vZGUgYXMgYW55KS5qc0RvY0NhY2hlO1xuICAgICAgICBpZiAoIWNhY2hlKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKG5vZGUsIFtdKS5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgICAgIChub2RlIGFzIGFueSkuanNEb2NDYWNoZSA9IGNhY2hlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjYWNoZTtcbiAgICB9XG5cbiAgICAvLyBUcnkgdG8gcmVjb2duaXplIHRoaXMgcGF0dGVybiB3aGVuIG5vZGUgaXMgaW5pdGlhbGl6ZXJcbiAgICAvLyBvZiB2YXJpYWJsZSBkZWNsYXJhdGlvbiBhbmQgSlNEb2MgY29tbWVudHMgYXJlIG9uIGNvbnRhaW5pbmcgdmFyaWFibGUgc3RhdGVtZW50LlxuICAgIC8vIC8qKlxuICAgIC8vICAgKiBAcGFyYW0ge251bWJlcn0gbmFtZVxuICAgIC8vICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgIC8vICAgKi9cbiAgICAvLyB2YXIgeCA9IGZ1bmN0aW9uKG5hbWUpIHsgcmV0dXJuIG5hbWUubGVuZ3RoOyB9XG4gICAgcHJpdmF0ZSBnZXRKU0RvY3NXb3JrZXIobm9kZTogdHMuTm9kZSwgY2FjaGUpOiBSZWFkb25seUFycmF5PGFueT4ge1xuICAgICAgICBjb25zdCBwYXJlbnQgPSBub2RlLnBhcmVudDtcbiAgICAgICAgY29uc3QgaXNJbml0aWFsaXplck9mVmFyaWFibGVEZWNsYXJhdGlvbkluU3RhdGVtZW50ID1cbiAgICAgICAgICAgIHRoaXMuaXNWYXJpYWJsZUxpa2UocGFyZW50KSAmJlxuICAgICAgICAgICAgcGFyZW50LmluaXRpYWxpemVyID09PSBub2RlICYmXG4gICAgICAgICAgICB0cy5pc1ZhcmlhYmxlU3RhdGVtZW50KHBhcmVudC5wYXJlbnQucGFyZW50KTtcbiAgICAgICAgY29uc3QgaXNWYXJpYWJsZU9mVmFyaWFibGVEZWNsYXJhdGlvblN0YXRlbWVudCA9XG4gICAgICAgICAgICB0aGlzLmlzVmFyaWFibGVMaWtlKG5vZGUpICYmIHRzLmlzVmFyaWFibGVTdGF0ZW1lbnQocGFyZW50LnBhcmVudCk7XG4gICAgICAgIGNvbnN0IHZhcmlhYmxlU3RhdGVtZW50Tm9kZSA9IGlzSW5pdGlhbGl6ZXJPZlZhcmlhYmxlRGVjbGFyYXRpb25JblN0YXRlbWVudFxuICAgICAgICAgICAgPyBwYXJlbnQucGFyZW50LnBhcmVudFxuICAgICAgICAgICAgOiBpc1ZhcmlhYmxlT2ZWYXJpYWJsZURlY2xhcmF0aW9uU3RhdGVtZW50XG4gICAgICAgICAgICA/IHBhcmVudC5wYXJlbnRcbiAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICBpZiAodmFyaWFibGVTdGF0ZW1lbnROb2RlKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHZhcmlhYmxlU3RhdGVtZW50Tm9kZSwgY2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWxzbyByZWNvZ25pemUgd2hlbiB0aGUgbm9kZSBpcyB0aGUgUkhTIG9mIGFuIGFzc2lnbm1lbnQgZXhwcmVzc2lvblxuICAgICAgICBjb25zdCBpc1NvdXJjZU9mQXNzaWdubWVudEV4cHJlc3Npb25TdGF0ZW1lbnQgPVxuICAgICAgICAgICAgcGFyZW50ICYmXG4gICAgICAgICAgICBwYXJlbnQucGFyZW50ICYmXG4gICAgICAgICAgICB0cy5pc0JpbmFyeUV4cHJlc3Npb24ocGFyZW50KSAmJlxuICAgICAgICAgICAgcGFyZW50Lm9wZXJhdG9yVG9rZW4ua2luZCA9PT0gU3ludGF4S2luZC5FcXVhbHNUb2tlbiAmJlxuICAgICAgICAgICAgdHMuaXNFeHByZXNzaW9uU3RhdGVtZW50KHBhcmVudC5wYXJlbnQpO1xuICAgICAgICBpZiAoaXNTb3VyY2VPZkFzc2lnbm1lbnRFeHByZXNzaW9uU3RhdGVtZW50KSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHBhcmVudC5wYXJlbnQsIGNhY2hlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlzTW9kdWxlRGVjbGFyYXRpb24gPVxuICAgICAgICAgICAgdHMuaXNNb2R1bGVEZWNsYXJhdGlvbihub2RlKSAmJiBwYXJlbnQgJiYgdHMuaXNNb2R1bGVEZWNsYXJhdGlvbihwYXJlbnQpO1xuICAgICAgICBjb25zdCBpc1Byb3BlcnR5QXNzaWdubWVudEV4cHJlc3Npb24gPSBwYXJlbnQgJiYgdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocGFyZW50KTtcbiAgICAgICAgaWYgKGlzTW9kdWxlRGVjbGFyYXRpb24gfHwgaXNQcm9wZXJ0eUFzc2lnbm1lbnRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICBjYWNoZSA9IHRoaXMuZ2V0SlNEb2NzV29ya2VyKHBhcmVudCwgY2FjaGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHVsbCBwYXJhbWV0ZXIgY29tbWVudHMgZnJvbSBkZWNsYXJpbmcgZnVuY3Rpb24gYXMgd2VsbFxuICAgICAgICBpZiAodHMuaXNQYXJhbWV0ZXIobm9kZSkpIHtcbiAgICAgICAgICAgIGNhY2hlID0gXy5jb25jYXQoY2FjaGUsIHRoaXMuZ2V0SlNEb2NQYXJhbWV0ZXJUYWdzKG5vZGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVmFyaWFibGVMaWtlKG5vZGUpICYmIG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgIGNhY2hlID0gXy5jb25jYXQoY2FjaGUsIG5vZGUuaW5pdGlhbGl6ZXIuanNEb2MpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FjaGUgPSBfLmNvbmNhdChjYWNoZSwgbm9kZS5qc0RvYyk7XG5cbiAgICAgICAgcmV0dXJuIGNhY2hlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SlNEb2NQYXJhbWV0ZXJUYWdzKFxuICAgICAgICBwYXJhbTogdHMuUGFyYW1ldGVyRGVjbGFyYXRpb25cbiAgICApOiBSZWFkb25seUFycmF5PHRzLkpTRG9jUGFyYW1ldGVyVGFnPiB7XG4gICAgICAgIGNvbnN0IGZ1bmMgPSBwYXJhbS5wYXJlbnQgYXMgdHMuRnVuY3Rpb25MaWtlRGVjbGFyYXRpb247XG4gICAgICAgIGNvbnN0IHRhZ3MgPSB0aGlzLmdldEpTRG9jVGFncyhcbiAgICAgICAgICAgIGZ1bmMsXG4gICAgICAgICAgICBTeW50YXhLaW5kLkpTRG9jUGFyYW1ldGVyVGFnXG4gICAgICAgICkgYXMgdHMuSlNEb2NQYXJhbWV0ZXJUYWdbXTtcblxuICAgICAgICBpZiAoIXBhcmFtLm5hbWUpIHtcbiAgICAgICAgICAgIC8vIHRoaXMgaXMgYW4gYW5vbnltb3VzIGpzZG9jIHBhcmFtIGZyb20gYSBgZnVuY3Rpb24odHlwZTEsIHR5cGUyKTogdHlwZTNgIHNwZWNpZmljYXRpb25cbiAgICAgICAgICAgIGNvbnN0IGkgPSBmdW5jLnBhcmFtZXRlcnMuaW5kZXhPZihwYXJhbSk7XG4gICAgICAgICAgICBjb25zdCBwYXJhbVRhZ3MgPSBfLmZpbHRlcih0YWdzLCB0YWcgPT4gdHMuaXNKU0RvY1BhcmFtZXRlclRhZyh0YWcpKTtcblxuICAgICAgICAgICAgaWYgKHBhcmFtVGFncyAmJiAwIDw9IGkgJiYgaSA8IHBhcmFtVGFncy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3BhcmFtVGFnc1tpXV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNJZGVudGlmaWVyKHBhcmFtLm5hbWUpKSB7XG4gICAgICAgICAgICBjb25zdCBuYW1lID0gcGFyYW0ubmFtZS50ZXh0O1xuICAgICAgICAgICAgcmV0dXJuIF8uZmlsdGVyKHRhZ3MsIHRhZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRzICYmIHRzLmlzSlNEb2NQYXJhbWV0ZXJUYWcodGFnKSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdDogSlNEb2NQYXJhbWV0ZXJUYWdFeHQgPSB0YWc7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdC5wYXJhbWV0ZXJOYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHQucGFyYW1ldGVyTmFtZS50ZXh0ID09PSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0Lm5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHQubmFtZS5lc2NhcGVkVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdC5uYW1lLmVzY2FwZWRUZXh0ID09PSBuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBUT0RPOiBpdCdzIGEgZGVzdHJ1Y3R1cmVkIHBhcmFtZXRlciwgc28gaXQgc2hvdWxkIGxvb2sgdXAgYW4gXCJvYmplY3QgdHlwZVwiIHNlcmllcyBvZiBtdWx0aXBsZSBsaW5lc1xuICAgICAgICAgICAgLy8gQnV0IG11bHRpLWxpbmUgb2JqZWN0IHR5cGVzIGFyZW4ndCBzdXBwb3J0ZWQgeWV0IGVpdGhlclxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBwYXJzZUpTRG9jTm9kZShub2RlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJhd0Rlc2NyaXB0aW9uID0gJyc7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBub2RlLmNvbW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICByYXdEZXNjcmlwdGlvbiArPSBub2RlLmNvbW1lbnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAobm9kZS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuID0gbm9kZS5jb21tZW50Lmxlbmd0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgSlNEb2NOb2RlID0gbm9kZS5jb21tZW50W2ldO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKEpTRG9jTm9kZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuSlNEb2NDb21tZW50OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd0Rlc2NyaXB0aW9uICs9IEpTRG9jTm9kZS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLkpTRG9jVGV4dDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdEZXNjcmlwdGlvbiArPSBKU0RvY05vZGUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5KU0RvY0xpbms6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKEpTRG9jTm9kZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gSlNEb2NOb2RlLm5hbWUuZXNjYXBlZFRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNEb2NOb2RlLm5hbWUubGVmdCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNEb2NOb2RlLm5hbWUucmlnaHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0RvY05vZGUubmFtZS5sZWZ0LmVzY2FwZWRUZXh0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTRG9jTm9kZS5uYW1lLnJpZ2h0LmVzY2FwZWRUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd0Rlc2NyaXB0aW9uICs9IEpTRG9jTm9kZS50ZXh0ICsgJ3tAbGluayAnICsgdGV4dCArICd9JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJhd0Rlc2NyaXB0aW9uO1xuICAgIH1cbn1cbiIsImNvbnN0IHsgbWFya2VkIH0gPSByZXF1aXJlKCdtYXJrZWQnKTtcblxubWFya2VkLnVzZSh7XG4gICAgbWFuZ2xlOiBmYWxzZSxcbiAgICBoZWFkZXJJZHM6IGZhbHNlXG59KTtcblxuZXhwb3J0IGNvbnN0IG1hcmtlZEFjbCA9IG1hcmtlZDtcbiIsImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzLWV4dHJhJztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuaW1wb3J0IHsgTGlua1BhcnNlciB9IGZyb20gJy4vbGluay1wYXJzZXInO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuL2xvZ2dlcic7XG5cbmltcG9ydCB7IEFuZ3VsYXJMaWZlY3ljbGVIb29rcyB9IGZyb20gJy4vYW5ndWxhci1saWZlY3ljbGVzLWhvb2tzJztcbmltcG9ydCB7IGtpbmRUb1R5cGUgfSBmcm9tICcuL2tpbmQtdG8tdHlwZSc7XG5pbXBvcnQgeyBKc2RvY1BhcnNlclV0aWwgfSBmcm9tICcuL2pzZG9jLXBhcnNlci51dGlsJztcbmltcG9ydCB7IG1hcmtlZEFjbCB9IGZyb20gJy4vbWFya2VkLmFjbCc7XG5pbXBvcnQgZXhwID0gcmVxdWlyZSgnbm9kZTpjb25zdGFudHMnKTtcblxuY29uc3QgZ2V0Q3VycmVudERpcmVjdG9yeSA9IHRzLnN5cy5nZXRDdXJyZW50RGlyZWN0b3J5O1xuY29uc3QgdXNlQ2FzZVNlbnNpdGl2ZUZpbGVOYW1lcyA9IHRzLnN5cy51c2VDYXNlU2Vuc2l0aXZlRmlsZU5hbWVzO1xuY29uc3QgbmV3TGluZSA9IHRzLnN5cy5uZXdMaW5lO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TmV3TGluZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBuZXdMaW5lO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5OYW1lV2l0aG91dFNwYWNlQW5kVG9Mb3dlckNhc2UobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmFtZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyAvZywgJy0nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENhbm9uaWNhbEZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiB1c2VDYXNlU2Vuc2l0aXZlRmlsZU5hbWVzID8gZmlsZU5hbWUgOiBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpO1xufVxuXG5leHBvcnQgY29uc3QgZm9ybWF0RGlhZ25vc3RpY3NIb3N0OiB0cy5Gb3JtYXREaWFnbm9zdGljc0hvc3QgPSB7XG4gICAgZ2V0Q3VycmVudERpcmVjdG9yeSxcbiAgICBnZXRDYW5vbmljYWxGaWxlTmFtZSxcbiAgICBnZXROZXdMaW5lXG59O1xuXG5leHBvcnQgZnVuY3Rpb24gbWFya2VkdGFncyh0YWdzOiBBcnJheTxhbnk+KSB7XG4gICAgY29uc3QganNkb2NQYXJzZXJVdGlsID0gbmV3IEpzZG9jUGFyc2VyVXRpbCgpO1xuICAgIGxldCBtdGFncyA9IHRhZ3M7XG4gICAgXy5mb3JFYWNoKG10YWdzLCB0YWcgPT4ge1xuICAgICAgICBjb25zdCByYXdDb21tZW50ID0ganNkb2NQYXJzZXJVdGlsLnBhcnNlSlNEb2NOb2RlKHRhZyk7XG4gICAgICAgIHRhZy5jb21tZW50ID0gbWFya2VkQWNsKExpbmtQYXJzZXIucmVzb2x2ZUxpbmtzKHJhd0NvbW1lbnQpKTtcbiAgICB9KTtcbiAgICByZXR1cm4gbXRhZ3M7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZVRhZ3NBbmRBcmdzKGFyZ3M6IEFycmF5PGFueT4sIGpzZG9jdGFncz86IEFycmF5PGFueT4pOiBBcnJheTxhbnk+IHtcbiAgICBsZXQgbWFyZ3MgPSBfLmNsb25lRGVlcChhcmdzKTtcbiAgICBfLmZvckVhY2gobWFyZ3MsIGFyZyA9PiB7XG4gICAgICAgIGFyZy50YWdOYW1lID0ge1xuICAgICAgICAgICAgdGV4dDogJ3BhcmFtJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAoanNkb2N0YWdzKSB7XG4gICAgICAgICAgICBfLmZvckVhY2goanNkb2N0YWdzLCBqc2RvY3RhZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFnLm5hbWUgJiYganNkb2N0YWcubmFtZS50ZXh0ID09PSBhcmcubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBhcmcudGFnTmFtZSA9IGpzZG9jdGFnLnRhZ05hbWU7XG4gICAgICAgICAgICAgICAgICAgIGFyZy5uYW1lID0ganNkb2N0YWcubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgYXJnLmNvbW1lbnQgPSBqc2RvY3RhZy5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICBhcmcudHlwZUV4cHJlc3Npb24gPSBqc2RvY3RhZy50eXBlRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIC8vIEFkZCBleGFtcGxlICYgcmV0dXJucyAmIHByaXZhdGVcbiAgICBpZiAoanNkb2N0YWdzKSB7XG4gICAgICAgIF8uZm9yRWFjaChqc2RvY3RhZ3MsIGpzZG9jdGFnID0+IHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBqc2RvY3RhZy50YWdOYW1lICYmXG4gICAgICAgICAgICAgICAgKGpzZG9jdGFnLnRhZ05hbWUudGV4dCA9PT0gJ2V4YW1wbGUnIHx8IGpzZG9jdGFnLnRhZ05hbWUudGV4dCA9PT0gJ3ByaXZhdGUnKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgbWFyZ3MucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIHRhZ05hbWU6IGpzZG9jdGFnLnRhZ05hbWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbW1lbnQ6IGpzZG9jdGFnLmNvbW1lbnRcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBqc2RvY3RhZy50YWdOYW1lICYmXG4gICAgICAgICAgICAgICAgKGpzZG9jdGFnLnRhZ05hbWUudGV4dCA9PT0gJ3JldHVybnMnIHx8IGpzZG9jdGFnLnRhZ05hbWUudGV4dCA9PT0gJ3JldHVybicpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsZXQgcmV0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0YWdOYW1lOiBqc2RvY3RhZy50YWdOYW1lLFxuICAgICAgICAgICAgICAgICAgICBjb21tZW50OiBqc2RvY3RhZy5jb21tZW50XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2N0YWcudHlwZUV4cHJlc3Npb24gJiYganNkb2N0YWcudHlwZUV4cHJlc3Npb24udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXQucmV0dXJuVHlwZSA9IGtpbmRUb1R5cGUoanNkb2N0YWcudHlwZUV4cHJlc3Npb24udHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbWFyZ3MucHVzaChyZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIG1hcmdzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVhZENvbmZpZyhjb25maWdGaWxlOiBzdHJpbmcpOiBhbnkge1xuICAgIGxldCByZXN1bHQgPSB0cy5yZWFkQ29uZmlnRmlsZShjb25maWdGaWxlLCB0cy5zeXMucmVhZEZpbGUpO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSB0cy5mb3JtYXREaWFnbm9zdGljcyhbcmVzdWx0LmVycm9yXSwgZm9ybWF0RGlhZ25vc3RpY3NIb3N0KTtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0LmNvbmZpZztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmlwQm9tKHNvdXJjZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc291cmNlLmNoYXJDb2RlQXQoMCkgPT09IDB4ZmVmZikge1xuICAgICAgICByZXR1cm4gc291cmNlLnNsaWNlKDEpO1xuICAgIH1cbiAgICByZXR1cm4gc291cmNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGFzQm9tKHNvdXJjZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHNvdXJjZS5jaGFyQ29kZUF0KDApID09PSAweGZlZmY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGVQYXRoKGZpbGVzOiBBcnJheTxzdHJpbmc+LCBjd2Q6IHN0cmluZyk6IEFycmF5PHN0cmluZz4ge1xuICAgIGxldCBfZmlsZXMgPSBmaWxlcztcbiAgICBsZXQgaSA9IDA7XG4gICAgbGV0IGxlbiA9IGZpbGVzLmxlbmd0aDtcblxuICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmIChmaWxlc1tpXS5pbmRleE9mKGN3ZCkgPT09IC0xKSB7XG4gICAgICAgICAgICBmaWxlc1tpXSA9IHBhdGgucmVzb2x2ZShjd2QgKyBwYXRoLnNlcCArIGZpbGVzW2ldKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBfZmlsZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMobWV0aG9kczogQXJyYXk8YW55Pik6IEFycmF5PGFueT4ge1xuICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICBpZiAodHlwZW9mIG1ldGhvZHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGxlbiA9IG1ldGhvZHMubGVuZ3RoO1xuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKCEobWV0aG9kc1tpXS5uYW1lIGluIEFuZ3VsYXJMaWZlY3ljbGVIb29rcykpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtZXRob2RzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2xlYW5Tb3VyY2VzRm9yV2F0Y2gobGlzdCkge1xuICAgIHJldHVybiBsaXN0LmZpbHRlcihlbGVtZW50ID0+IHtcbiAgICAgICAgaWYgKGZzLmV4aXN0c1N5bmMocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwICsgZWxlbWVudCkpIHtcbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXROYW1lc0NvbXBhcmVGbihuYW1lPykge1xuICAgIC8qKlxuICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAqL1xuICAgIG5hbWUgPSBuYW1lIHx8ICduYW1lJztcbiAgICBjb25zdCB0ID0gKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGFbbmFtZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBhW25hbWVdLmxvY2FsZUNvbXBhcmUoYltuYW1lXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0lnbm9yZShtZW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAobWVtYmVyLmpzRG9jKSB7XG4gICAgICAgIGZvciAoY29uc3QgZG9jIG9mIG1lbWJlci5qc0RvYykge1xuICAgICAgICAgICAgaWYgKGRvYy50YWdzKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgZG9jLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZy50YWdOYW1lLnRleHQuaW5kZXhPZignaWdub3JlJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuaW5jbHVkZXNcbmlmICghQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKSB7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KEFycmF5LnByb3RvdHlwZSwgJ2luY2x1ZGVzJywge1xuICAgICAgICB2YWx1ZTogZnVuY3Rpb24gKHNlYXJjaEVsZW1lbnQsIGZyb21JbmRleCkge1xuICAgICAgICAgICAgaWYgKHRoaXMgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widGhpc1wiIGlzIG51bGwgb3Igbm90IGRlZmluZWQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMS4gTGV0IE8gYmUgPyBUb09iamVjdCh0aGlzIHZhbHVlKS5cbiAgICAgICAgICAgIGxldCBvID0gT2JqZWN0KHRoaXMpO1xuXG4gICAgICAgICAgICAvLyAyLiBMZXQgbGVuIGJlID8gVG9MZW5ndGgoPyBHZXQoTywgXCJsZW5ndGhcIikpLlxuICAgICAgICAgICAgbGV0IGxlbiA9IG8ubGVuZ3RoID4+PiAwO1xuXG4gICAgICAgICAgICAvLyAzLiBJZiBsZW4gaXMgMCwgcmV0dXJuIGZhbHNlLlxuICAgICAgICAgICAgaWYgKGxlbiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gNC4gTGV0IG4gYmUgPyBUb0ludGVnZXIoZnJvbUluZGV4KS5cbiAgICAgICAgICAgIC8vICAgIChJZiBmcm9tSW5kZXggaXMgdW5kZWZpbmVkLCB0aGlzIHN0ZXAgcHJvZHVjZXMgdGhlIHZhbHVlIDAuKVxuICAgICAgICAgICAgbGV0IG4gPSBmcm9tSW5kZXggfCAwO1xuXG4gICAgICAgICAgICAvLyA1LiBJZiBuIOKJpSAwLCB0aGVuXG4gICAgICAgICAgICAvLyAgYS4gTGV0IGsgYmUgbi5cbiAgICAgICAgICAgIC8vIDYuIEVsc2UgbiA8IDAsXG4gICAgICAgICAgICAvLyAgYS4gTGV0IGsgYmUgbGVuICsgbi5cbiAgICAgICAgICAgIC8vICBiLiBJZiBrIDwgMCwgbGV0IGsgYmUgMC5cbiAgICAgICAgICAgIGxldCBrID0gTWF0aC5tYXgobiA+PSAwID8gbiA6IGxlbiAtIE1hdGguYWJzKG4pLCAwKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gc2FtZVZhbHVlWmVybyh4LCB5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgeCA9PT0geSB8fFxuICAgICAgICAgICAgICAgICAgICAodHlwZW9mIHggPT09ICdudW1iZXInICYmIHR5cGVvZiB5ID09PSAnbnVtYmVyJyAmJiBpc05hTih4KSAmJiBpc05hTih5KSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA3LiBSZXBlYXQsIHdoaWxlIGsgPCBsZW5cbiAgICAgICAgICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgLy8gYS4gTGV0IGVsZW1lbnRLIGJlIHRoZSByZXN1bHQgb2YgPyBHZXQoTywgISBUb1N0cmluZyhrKSkuXG4gICAgICAgICAgICAgICAgLy8gYi4gSWYgU2FtZVZhbHVlWmVybyhzZWFyY2hFbGVtZW50LCBlbGVtZW50SykgaXMgdHJ1ZSwgcmV0dXJuIHRydWUuXG4gICAgICAgICAgICAgICAgaWYgKHNhbWVWYWx1ZVplcm8ob1trXSwgc2VhcmNoRWxlbWVudCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGMuIEluY3JlYXNlIGsgYnkgMS5cbiAgICAgICAgICAgICAgICBrKys7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIDguIFJldHVybiBmYWxzZVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kTWFpblNvdXJjZUZvbGRlcihmaWxlczogc3RyaW5nW10pIHtcbiAgICBsZXQgbWFpbkZvbGRlciA9ICcnO1xuICAgIGxldCBtYWluRm9sZGVyQ291bnQgPSAwO1xuICAgIGxldCByYXdGb2xkZXJzID0gZmlsZXMubWFwKGZpbGVwYXRoID0+IHtcbiAgICAgICAgbGV0IHNob3J0UGF0aCA9IGZpbGVwYXRoLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgIHJldHVybiBwYXRoLmRpcm5hbWUoc2hvcnRQYXRoKTtcbiAgICB9KTtcbiAgICBsZXQgZm9sZGVycyA9IHt9O1xuICAgIHJhd0ZvbGRlcnMgPSBfLnVuaXEocmF3Rm9sZGVycyk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0ZvbGRlcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbGV0IHNlcCA9IHJhd0ZvbGRlcnNbaV0uc3BsaXQocGF0aC5zZXApO1xuICAgICAgICBzZXAuZm9yRWFjaChmb2xkZXIgPT4ge1xuICAgICAgICAgICAgaWYgKGZvbGRlcnNbZm9sZGVyXSkge1xuICAgICAgICAgICAgICAgIGZvbGRlcnNbZm9sZGVyXSArPSAxO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmb2xkZXJzW2ZvbGRlcl0gPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChsZXQgZiBpbiBmb2xkZXJzKSB7XG4gICAgICAgIGlmIChmb2xkZXJzW2ZdID4gbWFpbkZvbGRlckNvdW50KSB7XG4gICAgICAgICAgICBtYWluRm9sZGVyQ291bnQgPSBmb2xkZXJzW2ZdO1xuICAgICAgICAgICAgbWFpbkZvbGRlciA9IGY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG1haW5Gb2xkZXI7XG59XG5cbi8vIENyZWF0ZSBhIGNvbXBpbGVySG9zdCBvYmplY3QgdG8gYWxsb3cgdGhlIGNvbXBpbGVyIHRvIHJlYWQgYW5kIHdyaXRlIGZpbGVzXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZXJIb3N0KHRyYW5zcGlsZU9wdGlvbnM6IGFueSk6IHRzLkNvbXBpbGVySG9zdCB7XG4gICAgY29uc3QgaW5wdXRGaWxlTmFtZSA9XG4gICAgICAgIHRyYW5zcGlsZU9wdGlvbnMuZmlsZU5hbWUgfHwgKHRyYW5zcGlsZU9wdGlvbnMuanN4ID8gJ21vZHVsZS50c3gnIDogJ21vZHVsZS50cycpO1xuXG4gICAgY29uc3QgdG9SZXR1cm46IHRzLkNvbXBpbGVySG9zdCA9IHtcbiAgICAgICAgZ2V0U291cmNlRmlsZTogKGZpbGVOYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGlmIChmaWxlTmFtZS5sYXN0SW5kZXhPZignLnRzJykgIT09IC0xIHx8IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuanMnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZU5hbWUgPT09ICdsaWIuZC50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGZpbGVOYW1lLnN1YnN0cigtNSkgPT09ICcuZC50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAocGF0aC5pc0Fic29sdXRlKGZpbGVOYW1lKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUgPSBwYXRoLmpvaW4odHJhbnNwaWxlT3B0aW9ucy50c2NvbmZpZ0RpcmVjdG9yeSwgZmlsZU5hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZmlsZU5hbWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGxpYlNvdXJjZSA9ICcnO1xuXG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgbGliU291cmNlID0gZnMucmVhZEZpbGVTeW5jKGZpbGVOYW1lKS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNCb20obGliU291cmNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGliU291cmNlID0gc3RyaXBCb20obGliU291cmNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGUsIGZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHMuY3JlYXRlU291cmNlRmlsZShmaWxlTmFtZSwgbGliU291cmNlLCB0cmFuc3BpbGVPcHRpb25zLnRhcmdldCwgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfSxcbiAgICAgICAgd3JpdGVGaWxlOiAobmFtZSwgdGV4dCkgPT4ge30sXG4gICAgICAgIGdldERlZmF1bHRMaWJGaWxlTmFtZTogKCkgPT4gJ2xpYi5kLnRzJyxcbiAgICAgICAgdXNlQ2FzZVNlbnNpdGl2ZUZpbGVOYW1lczogKCkgPT4gZmFsc2UsXG4gICAgICAgIGdldENhbm9uaWNhbEZpbGVOYW1lOiBmaWxlTmFtZSA9PiBmaWxlTmFtZSxcbiAgICAgICAgZ2V0Q3VycmVudERpcmVjdG9yeTogKCkgPT4gJycsXG4gICAgICAgIGdldE5ld0xpbmU6ICgpID0+ICdcXG4nLFxuICAgICAgICBmaWxlRXhpc3RzOiAoZmlsZU5hbWUpOiBib29sZWFuID0+IGZpbGVOYW1lID09PSBpbnB1dEZpbGVOYW1lLFxuICAgICAgICByZWFkRmlsZTogKCkgPT4gJycsXG4gICAgICAgIGRpcmVjdG9yeUV4aXN0czogKCkgPT4gdHJ1ZSxcbiAgICAgICAgZ2V0RGlyZWN0b3JpZXM6ICgpID0+IFtdXG4gICAgfTtcblxuICAgIHJldHVybiB0b1JldHVybjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRldGVjdEluZGVudChzdHIsIGNvdW50KTogc3RyaW5nIHtcbiAgICBsZXQgc3RyaXBJbmRlbnQgPSAoc3RyaXBlZFN0cmluZzogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hdGNoID0gc3RyaXBlZFN0cmluZy5tYXRjaCgvXlsgXFx0XSooPz1cXFMpL2dtKTtcblxuICAgICAgICBpZiAoIW1hdGNoKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RyaXBlZFN0cmluZztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IHVzZSBzcHJlYWQgb3BlcmF0b3Igd2hlbiB0YXJnZXRpbmcgTm9kZS5qcyA2XG4gICAgICAgIGNvbnN0IGluZGVudCA9IE1hdGgubWluLmFwcGx5KFxuICAgICAgICAgICAgTWF0aCxcbiAgICAgICAgICAgIG1hdGNoLm1hcCh4ID0+IHgubGVuZ3RoKVxuICAgICAgICApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cChgXlsgXFxcXHRdeyR7aW5kZW50fX1gLCAnZ20nKTtcblxuICAgICAgICByZXR1cm4gaW5kZW50ID4gMCA/IHN0cmlwZWRTdHJpbmcucmVwbGFjZShyZSwgJycpIDogc3RyaXBlZFN0cmluZztcbiAgICB9O1xuXG4gICAgbGV0IHJlcGVhdGluZyA9IChuLCByZXBlYXRTdHJpbmcpID0+IHtcbiAgICAgICAgcmVwZWF0U3RyaW5nID0gcmVwZWF0U3RyaW5nID09PSB1bmRlZmluZWQgPyAnICcgOiByZXBlYXRTdHJpbmc7XG5cbiAgICAgICAgaWYgKHR5cGVvZiByZXBlYXRTdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBcXGBpbnB1dFxcYCB0byBiZSBhIFxcYHN0cmluZ1xcYCwgZ290IFxcYCR7dHlwZW9mIHJlcGVhdFN0cmluZ31cXGBgXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG4gPCAwKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBcXGBjb3VudFxcYCB0byBiZSBhIHBvc2l0aXZlIGZpbml0ZSBudW1iZXIsIGdvdCBcXGAke259XFxgYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmV0ID0gJyc7XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgaWYgKG4gJiAxKSB7XG4gICAgICAgICAgICAgICAgcmV0ICs9IHJlcGVhdFN0cmluZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVwZWF0U3RyaW5nICs9IHJlcGVhdFN0cmluZztcbiAgICAgICAgfSB3aGlsZSAoKG4gPj49IDEpKTtcblxuICAgICAgICByZXR1cm4gcmV0O1xuICAgIH07XG5cbiAgICBsZXQgaW5kZW50U3RyaW5nID0gKGluZGVudGVkU3RyaW5nLCBpbmRlbnRDb3VudCkgPT4ge1xuICAgICAgICBsZXQgaW5kZW50ID0gJyAnO1xuICAgICAgICBpbmRlbnRDb3VudCA9IGluZGVudENvdW50ID09PSB1bmRlZmluZWQgPyAxIDogaW5kZW50Q291bnQ7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpbmRlbnRlZFN0cmluZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYEV4cGVjdGVkIFxcYGlucHV0XFxgIHRvIGJlIGEgXFxgc3RyaW5nXFxgLCBnb3QgXFxgJHt0eXBlb2YgaW5kZW50ZWRTdHJpbmd9XFxgYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0eXBlb2YgaW5kZW50Q291bnQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgICAgIGBFeHBlY3RlZCBcXGBjb3VudFxcYCB0byBiZSBhIFxcYG51bWJlclxcYCwgZ290IFxcYCR7dHlwZW9mIGluZGVudENvdW50fVxcYGBcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIGluZGVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEV4cGVjdGVkIFxcYGluZGVudFxcYCB0byBiZSBhIFxcYHN0cmluZ1xcYCwgZ290IFxcYCR7dHlwZW9mIGluZGVudH1cXGBgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpbmRlbnRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGluZGVudGVkU3RyaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaW5kZW50ID0gaW5kZW50Q291bnQgPiAxID8gcmVwZWF0aW5nKGluZGVudENvdW50LCBpbmRlbnQpIDogaW5kZW50O1xuXG4gICAgICAgIHJldHVybiBpbmRlbnRlZFN0cmluZy5yZXBsYWNlKC9eKD8hXFxzKiQpL2dtLCBpbmRlbnQpO1xuICAgIH07XG5cbiAgICByZXR1cm4gaW5kZW50U3RyaW5nKHN0cmlwSW5kZW50KHN0ciksIGNvdW50IHx8IDApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3Vic3RyaW5nRnJvbU11bHRpbGluZVN0cmluZyhtdWx0aWxpbmVTdHJpbmc6IHN0cmluZywgc3RhcnRMaW5lOiBudW1iZXIsIHN0YXJ0Q29sdW1uOiBudW1iZXIsIGVuZExpbmU6IG51bWJlciwgZW5kQ29sdW1uOiBudW1iZXIpIHtcbiAgICAvLyBTcGxpdCB0aGUgc3RyaW5nIGludG8gbGluZXNcbiAgICBjb25zdCBsaW5lcyA9IG11bHRpbGluZVN0cmluZy5zcGxpdCgnXFxuJyk7XG5cbiAgICAvLyBTbGljZSB0aGUgbGluZXMgZnJvbSBzdGFydExpbmUgdG8gZW5kTGluZVxuICAgIGNvbnN0IHNlbGVjdGVkTGluZXMgPSBsaW5lcy5zbGljZShzdGFydExpbmUgLSAxLCBlbmRMaW5lKTtcblxuICAgIC8vIElmIHN0YXJ0TGluZSBhbmQgZW5kTGluZSBhcmUgdGhlIHNhbWUsIHNsaWNlIHRoZSBsaW5lIGZyb20gc3RhcnRDb2x1bW4gdG8gZW5kQ29sdW1uXG4gICAgaWYgKHN0YXJ0TGluZSA9PT0gZW5kTGluZSkge1xuICAgICAgICBzZWxlY3RlZExpbmVzWzBdID0gc2VsZWN0ZWRMaW5lc1swXS5zbGljZShzdGFydENvbHVtbiArIDEsIGVuZENvbHVtbiAtIDEpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE90aGVyd2lzZSwgc2xpY2UgdGhlIHN0YXJ0IGxpbmUgZnJvbSBzdGFydENvbHVtbiB0byB0aGUgZW5kXG4gICAgICAgIHNlbGVjdGVkTGluZXNbMF0gPSBzZWxlY3RlZExpbmVzWzBdLnNsaWNlKHN0YXJ0Q29sdW1uICsgMSk7XG5cbiAgICAgICAgLy8gQW5kIHNsaWNlIHRoZSBlbmQgbGluZSBmcm9tIHRoZSBzdGFydCB0byBlbmRDb2x1bW5cbiAgICAgICAgc2VsZWN0ZWRMaW5lc1tzZWxlY3RlZExpbmVzLmxlbmd0aCAtIDFdID0gc2VsZWN0ZWRMaW5lc1tzZWxlY3RlZExpbmVzLmxlbmd0aCAtIDFdLnNsaWNlKDAsIGVuZENvbHVtbiAtIDEpO1xuICAgIH1cblxuICAgIC8vIEpvaW4gdGhlIGxpbmVzIGJhY2sgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBzdHJpbmdcbiAgICByZXR1cm4gc2VsZWN0ZWRMaW5lcy5qb2luKCdcXG4nKTtcbn1cblxuZXhwb3J0IGNvbnN0IElOQ0xVREVfUEFUVEVSTlMgPSBbJyoqLyoudHMnLCAnKiovKi50c3gnXTtcblxuZXhwb3J0IGNvbnN0IEVYQ0xVREVfUEFUVEVSTlMgPSBbJyoqLy5naXQnLCAnKiovbm9kZV9tb2R1bGVzJywgJyoqLyouZC50cycsICcqKi8qLnNwZWMudHMnXTtcbiIsImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgTWlzY2VsbGFuZW91c0RhdGEgfSBmcm9tICcuLi9pbnRlcmZhY2VzL21pc2NlbGxhbmVvdXMtZGF0YS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgUGFyc2VkRGF0YSB9IGZyb20gJy4uL2ludGVyZmFjZXMvcGFyc2VkLWRhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IFJvdXRlSW50ZXJmYWNlIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9yb3V0ZXMuaW50ZXJmYWNlJztcblxuaW1wb3J0IEFuZ3VsYXJBcGlVdGlsIGZyb20gJy4uLy4uL3V0aWxzL2FuZ3VsYXItYXBpLnV0aWwnO1xuaW1wb3J0IHsgSUFwaVNvdXJjZVJlc3VsdCB9IGZyb20gJy4uLy4uL3V0aWxzL2FwaS1zb3VyY2UtcmVzdWx0LmludGVyZmFjZSc7XG5pbXBvcnQgeyBnZXROYW1lc0NvbXBhcmVGbiB9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcblxuaW1wb3J0IHtcbiAgICBJRW51bURlY0RlcCxcbiAgICBJRnVuY3Rpb25EZWNEZXAsXG4gICAgSUd1YXJkRGVwLFxuICAgIElJbmplY3RhYmxlRGVwLFxuICAgIElJbnRlcmNlcHRvckRlcCxcbiAgICBJSW50ZXJmYWNlRGVwLFxuICAgIElQaXBlRGVwLFxuICAgIElUeXBlQWxpYXNEZWNEZXBcbn0gZnJvbSAnLi4vY29tcGlsZXIvYW5ndWxhci9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5cbmltcG9ydCB7IElDb21wb25lbnREZXAgfSBmcm9tICcuLi9jb21waWxlci9hbmd1bGFyL2RlcHMvY29tcG9uZW50LWRlcC5mYWN0b3J5JztcbmltcG9ydCB7IElDb250cm9sbGVyRGVwIH0gZnJvbSAnLi4vY29tcGlsZXIvYW5ndWxhci9kZXBzL2NvbnRyb2xsZXItZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgSURpcmVjdGl2ZURlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9kaXJlY3RpdmUtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgSU1vZHVsZURlcCB9IGZyb20gJy4uL2NvbXBpbGVyL2FuZ3VsYXIvZGVwcy9tb2R1bGUtZGVwLmZhY3RvcnknO1xuXG5jb25zdCB0cmF2ZXJzZSA9IHJlcXVpcmUoJ25lb3RyYXZlcnNlL2xlZ2FjeScpO1xuXG5leHBvcnQgY2xhc3MgRGVwZW5kZW5jaWVzRW5naW5lIHtcbiAgICBwdWJsaWMgcmF3RGF0YTogUGFyc2VkRGF0YTtcbiAgICBwdWJsaWMgbW9kdWxlczogT2JqZWN0W107XG4gICAgcHVibGljIHJhd01vZHVsZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyByYXdNb2R1bGVzRm9yT3ZlcnZpZXc6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBjb21wb25lbnRzOiBPYmplY3RbXTtcbiAgICBwdWJsaWMgY29udHJvbGxlcnM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBlbnRpdGllczogT2JqZWN0W107XG4gICAgcHVibGljIGRpcmVjdGl2ZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBpbmplY3RhYmxlczogT2JqZWN0W107XG4gICAgcHVibGljIGludGVyY2VwdG9yczogT2JqZWN0W107XG4gICAgcHVibGljIGd1YXJkczogT2JqZWN0W107XG4gICAgcHVibGljIGludGVyZmFjZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyByb3V0ZXM6IFJvdXRlSW50ZXJmYWNlO1xuICAgIHB1YmxpYyBwaXBlczogT2JqZWN0W107XG4gICAgcHVibGljIGNsYXNzZXM6IE9iamVjdFtdO1xuICAgIHB1YmxpYyBtaXNjZWxsYW5lb3VzOiBNaXNjZWxsYW5lb3VzRGF0YSA9IHtcbiAgICAgICAgdmFyaWFibGVzOiBbXSxcbiAgICAgICAgZnVuY3Rpb25zOiBbXSxcbiAgICAgICAgdHlwZWFsaWFzZXM6IFtdLFxuICAgICAgICBlbnVtZXJhdGlvbnM6IFtdLFxuICAgICAgICBncm91cGVkVmFyaWFibGVzOiBbXSxcbiAgICAgICAgZ3JvdXBlZEZ1bmN0aW9uczogW10sXG4gICAgICAgIGdyb3VwZWRFbnVtZXJhdGlvbnM6IFtdLFxuICAgICAgICBncm91cGVkVHlwZUFsaWFzZXM6IFtdXG4gICAgfTtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBEZXBlbmRlbmNpZXNFbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFEZXBlbmRlbmNpZXNFbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5pbnN0YW5jZSA9IG5ldyBEZXBlbmRlbmNpZXNFbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRGVwZW5kZW5jaWVzRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlTW9kdWxlc0RlY2xhcmF0aW9uc0V4cG9ydHNUeXBlcygpIHtcbiAgICAgICAgY29uc3QgbWVyZ2VUeXBlcyA9IGVudHJ5ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZSA9IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMoXG4gICAgICAgICAgICAgICAgZW50cnkubmFtZSxcbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMsXG4gICAgICAgICAgICAgICAgZW50cnkuZmlsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZGlyZWN0aXZlLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHlwZSA9ICdkaXJlY3RpdmUnO1xuICAgICAgICAgICAgICAgIGVudHJ5LmlkID0gZGlyZWN0aXZlLmRhdGEuaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMoXG4gICAgICAgICAgICAgICAgZW50cnkubmFtZSxcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMsXG4gICAgICAgICAgICAgICAgZW50cnkuZmlsZVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHlwZSA9ICdjb21wb25lbnQnO1xuICAgICAgICAgICAgICAgIGVudHJ5LmlkID0gY29tcG9uZW50LmRhdGEuaWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBpcGUgPSB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKGVudHJ5Lm5hbWUsIHRoaXMucGlwZXMsIGVudHJ5LmZpbGUpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwaXBlLmRhdGEgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgZW50cnkudHlwZSA9ICdwaXBlJztcbiAgICAgICAgICAgICAgICBlbnRyeS5pZCA9IHBpcGUuZGF0YS5pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm1vZHVsZXMuZm9yRWFjaChtb2R1bGUgPT4ge1xuICAgICAgICAgICAgbW9kdWxlLmRlY2xhcmF0aW9ucy5mb3JFYWNoKGRlY2xhcmF0aW9uID0+IHtcbiAgICAgICAgICAgICAgICBtZXJnZVR5cGVzKGRlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbW9kdWxlLmV4cG9ydHMuZm9yRWFjaChleHB0ID0+IHtcbiAgICAgICAgICAgICAgICBtZXJnZVR5cGVzKGV4cHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtb2R1bGUuZW50cnlDb21wb25lbnRzLmZvckVhY2goZW50ID0+IHtcbiAgICAgICAgICAgICAgICBtZXJnZVR5cGVzKGVudCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQoZGF0YTogUGFyc2VkRGF0YSkge1xuICAgICAgICB0cmF2ZXJzZShkYXRhKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLnBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5wYXJlbnQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmF3RGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMubW9kdWxlcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5tb2R1bGVzLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMucmF3TW9kdWxlc0Zvck92ZXJ2aWV3ID0gXy5zb3J0QnkoZGF0YS5tb2R1bGVzRm9yR3JhcGgsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5yYXdNb2R1bGVzID0gXy5zb3J0QnkoZGF0YS5tb2R1bGVzRm9yR3JhcGgsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmNvbXBvbmVudHMsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVycyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5jb250cm9sbGVycywgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLmVudGl0aWVzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmVudGl0aWVzLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5kaXJlY3RpdmVzLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZXMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuaW5qZWN0YWJsZXMsIFtlbCA9PiBlbC5uYW1lLnRvTG93ZXJDYXNlKCldKTtcbiAgICAgICAgdGhpcy5pbnRlcmNlcHRvcnMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuaW50ZXJjZXB0b3JzLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMuZ3VhcmRzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLmd1YXJkcywgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLmludGVyZmFjZXMgPSBfLnNvcnRCeSh0aGlzLnJhd0RhdGEuaW50ZXJmYWNlcywgW2VsID0+IGVsLm5hbWUudG9Mb3dlckNhc2UoKV0pO1xuICAgICAgICB0aGlzLnBpcGVzID0gXy5zb3J0QnkodGhpcy5yYXdEYXRhLnBpcGVzLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMuY2xhc3NlcyA9IF8uc29ydEJ5KHRoaXMucmF3RGF0YS5jbGFzc2VzLCBbZWwgPT4gZWwubmFtZS50b0xvd2VyQ2FzZSgpXSk7XG4gICAgICAgIHRoaXMubWlzY2VsbGFuZW91cyA9IHRoaXMucmF3RGF0YS5taXNjZWxsYW5lb3VzO1xuICAgICAgICB0aGlzLnByZXBhcmVNaXNjZWxsYW5lb3VzKCk7XG4gICAgICAgIHRoaXMudXBkYXRlTW9kdWxlc0RlY2xhcmF0aW9uc0V4cG9ydHNUeXBlcygpO1xuICAgICAgICB0aGlzLnJvdXRlcyA9IHRoaXMucmF3RGF0YS5yb3V0ZXNUcmVlO1xuICAgICAgICB0aGlzLm1hbmFnZUR1cGxpY2F0ZXNOYW1lKCk7XG4gICAgICAgIHRoaXMuY2xlYW5SYXdNb2R1bGVzTmFtZXMoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNsZWFuUmF3TW9kdWxlc05hbWVzKCkge1xuICAgICAgICB0aGlzLnJhd01vZHVsZXNGb3JPdmVydmlldyA9IHRoaXMucmF3TW9kdWxlc0Zvck92ZXJ2aWV3Lm1hcChtb2R1bGUgPT4ge1xuICAgICAgICAgICAgbW9kdWxlLm5hbWUgPSBtb2R1bGUubmFtZS5yZXBsYWNlKCckJywgJycpO1xuICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCBkYXRhLCBmaWxlPyk6IElBcGlTb3VyY2VSZXN1bHQ8YW55PiB7XG4gICAgICAgIGxldCBfcmVzdWx0ID0ge1xuICAgICAgICAgICAgc291cmNlOiAnaW50ZXJuYWwnLFxuICAgICAgICAgICAgZGF0YTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgc2NvcmU6IDBcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IG5hbWVGb3VuZENvdW50ZXIgPSAwO1xuICAgICAgICBpZiAoZGF0YSAmJiBkYXRhLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBmaWxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPT09IGRhdGFbaV0ubmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUucmVwbGFjZSgvXFxcXC9nLCAnLycpLmluZGV4T2YoZGF0YVtpXS5maWxlKSAhPT0gLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVGb3VuZENvdW50ZXIgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEgPSBkYXRhW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuc2NvcmUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmluZGV4T2YoZGF0YVtpXS5uYW1lKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLnJlcGxhY2UoL1xcXFwvZywgJy8nKS5pbmRleE9mKGRhdGFbaV0uZmlsZSkgIT09IC0xXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lRm91bmRDb3VudGVyICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhID0gZGF0YVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LnNjb3JlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSBkYXRhW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lRm91bmRDb3VudGVyICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhID0gZGF0YVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LnNjb3JlID0gMjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobmFtZS5pbmRleE9mKGRhdGFbaV0ubmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZUZvdW5kQ291bnRlciArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YSA9IGRhdGFbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5zY29yZSA9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFByZXZlbnQgd3JvbmcgbWF0Y2hpbmcgbGlrZSBNdWx0aVNlbGVjdE9wdGlvbkRpcmVjdGl2ZSB3aXRoIFNlbGVjdE9wdGlvbkRpcmVjdGl2ZSwgb3IgUXVlcnlQYXJhbUdyb3VwU2VydmljZSB3aXRoIFF1ZXJ5UGFyYW1Hcm91cFxuICAgICAgICAgICAgaWYgKG5hbWVGb3VuZENvdW50ZXIgPiAxKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZvdW5kID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZGF0YVtpXS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhID0gZGF0YVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5zY29yZSA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gZGF0YVtpXS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhID0gZGF0YVtpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5zY29yZSA9IDI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHtcbiAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogJ2ludGVybmFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjb3JlOiAwXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFuYWdlRHVwbGljYXRlc05hbWUoKSB7XG4gICAgICAgIGNvbnN0IHByb2Nlc3NEdXBsaWNhdGVzID0gKGVsZW1lbnQsIGluZGV4LCBhcnJheSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHNXaXRoU2FtZU5hbWUgPSBfLmZpbHRlcihhcnJheSwgeyBuYW1lOiBlbGVtZW50Lm5hbWUgfSk7XG4gICAgICAgICAgICBpZiAoZWxlbWVudHNXaXRoU2FtZU5hbWUubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIC8vIEZpcnN0IGVsZW1lbnQgaXMgdGhlIHJlZmVyZW5jZSBmb3IgZHVwbGljYXRlc1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgZWxlbWVudHNXaXRoU2FtZU5hbWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRUb0VkaXQgPSBlbGVtZW50c1dpdGhTYW1lTmFtZVtpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50VG9FZGl0LmlzRHVwbGljYXRlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvRWRpdC5pc0R1cGxpY2F0ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VG9FZGl0LmR1cGxpY2F0ZUlkID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0VkaXQuZHVwbGljYXRlTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFRvRWRpdC5uYW1lICsgJy0nICsgZWxlbWVudFRvRWRpdC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUb0VkaXQuaWQgPSBlbGVtZW50VG9FZGl0LmlkICsgJy0nICsgZWxlbWVudFRvRWRpdC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLmNsYXNzZXMgPSB0aGlzLmNsYXNzZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5pbnRlcmZhY2VzID0gdGhpcy5pbnRlcmZhY2VzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZXMgPSB0aGlzLmluamVjdGFibGVzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMucGlwZXMgPSB0aGlzLnBpcGVzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzID0gdGhpcy5pbnRlcmNlcHRvcnMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5ndWFyZHMgPSB0aGlzLmd1YXJkcy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgICAgICB0aGlzLm1vZHVsZXMgPSB0aGlzLm1vZHVsZXMubWFwKHByb2Nlc3NEdXBsaWNhdGVzKTtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gdGhpcy5jb21wb25lbnRzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuY29udHJvbGxlcnMgPSB0aGlzLmNvbnRyb2xsZXJzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuZW50aXRpZXMgPSB0aGlzLmVudGl0aWVzLm1hcChwcm9jZXNzRHVwbGljYXRlcyk7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcyA9IHRoaXMuZGlyZWN0aXZlcy5tYXAocHJvY2Vzc0R1cGxpY2F0ZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBmaW5kKG5hbWU6IHN0cmluZyk6IElBcGlTb3VyY2VSZXN1bHQ8YW55PiB8IHVuZGVmaW5lZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaEZ1bmN0aW9uczogQXJyYXk8KCkgPT4gSUFwaVNvdXJjZVJlc3VsdDxhbnk+PiA9IFtcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5tb2R1bGVzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5pbmplY3RhYmxlcyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuaW50ZXJjZXB0b3JzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5ndWFyZHMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmludGVyZmFjZXMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmNsYXNzZXMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmNvbXBvbmVudHMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLmNvbnRyb2xsZXJzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5lbnRpdGllcyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMuZGlyZWN0aXZlcyksXG4gICAgICAgICAgICAoKSA9PiB0aGlzLmZpbmRJbkNvbXBvZG9jRGVwZW5kZW5jaWVzKG5hbWUsIHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMpLFxuICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5kSW5Db21wb2RvY0RlcGVuZGVuY2llcyhuYW1lLCB0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzKSxcbiAgICAgICAgICAgICgpID0+IHRoaXMuZmluZEluQ29tcG9kb2NEZXBlbmRlbmNpZXMobmFtZSwgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucyksXG4gICAgICAgICAgICAoKSA9PiBBbmd1bGFyQXBpVXRpbC5maW5kQXBpKG5hbWUpXG4gICAgICAgIF07XG5cbiAgICAgICAgbGV0IGJlc3RTY29yZSA9IDA7XG4gICAgICAgIGxldCBiZXN0UmVzdWx0ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGZvciAobGV0IHNlYXJjaEZ1bmN0aW9uIG9mIHNlYXJjaEZ1bmN0aW9ucykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gc2VhcmNoRnVuY3Rpb24oKTtcblxuICAgICAgICAgICAgaWYgKHJlc3VsdC5kYXRhICYmIHJlc3VsdC5zY29yZSA+IGJlc3RTY29yZSkge1xuICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHJlc3VsdC5zY29yZTtcbiAgICAgICAgICAgICAgICBiZXN0UmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGJlc3RSZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZSh1cGRhdGVkRGF0YSk6IHZvaWQge1xuICAgICAgICBpZiAodXBkYXRlZERhdGEubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEubW9kdWxlcywgKG1vZHVsZTogSU1vZHVsZURlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMubW9kdWxlcywgeyBuYW1lOiBtb2R1bGUubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZHVsZXNbX2luZGV4XSA9IG1vZHVsZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5jb21wb25lbnRzLCAoY29tcG9uZW50OiBJQ29tcG9uZW50RGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5jb21wb25lbnRzLCB7IG5hbWU6IGNvbXBvbmVudC5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c1tfaW5kZXhdID0gY29tcG9uZW50O1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLmNvbnRyb2xsZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5jb250cm9sbGVycywgKGNvbnRyb2xsZXI6IElDb250cm9sbGVyRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5jb250cm9sbGVycywgeyBuYW1lOiBjb250cm9sbGVyLm5hbWUgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250cm9sbGVyc1tfaW5kZXhdID0gY29udHJvbGxlcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5lbnRpdGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuZW50aXRpZXMsIChlbnRpdHk6IElDb250cm9sbGVyRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5lbnRpdGllcywgeyBuYW1lOiBlbnRpdHkubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmVudGl0aWVzW19pbmRleF0gPSBlbnRpdHk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuZGlyZWN0aXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuZGlyZWN0aXZlcywgKGRpcmVjdGl2ZTogSURpcmVjdGl2ZURlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuZGlyZWN0aXZlcywgeyBuYW1lOiBkaXJlY3RpdmUubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXNbX2luZGV4XSA9IGRpcmVjdGl2ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5pbmplY3RhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuaW5qZWN0YWJsZXMsIChpbmplY3RhYmxlOiBJSW5qZWN0YWJsZURlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuaW5qZWN0YWJsZXMsIHsgbmFtZTogaW5qZWN0YWJsZS5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5qZWN0YWJsZXNbX2luZGV4XSA9IGluamVjdGFibGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuaW50ZXJjZXB0b3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5pbnRlcmNlcHRvcnMsIChpbnRlcmNlcHRvcjogSUludGVyY2VwdG9yRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5pbnRlcmNlcHRvcnMsIHsgbmFtZTogaW50ZXJjZXB0b3IubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmludGVyY2VwdG9yc1tfaW5kZXhdID0gaW50ZXJjZXB0b3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5ndWFyZHMsIChndWFyZDogSUd1YXJkRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5ndWFyZHMsIHsgbmFtZTogZ3VhcmQubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmd1YXJkc1tfaW5kZXhdID0gZ3VhcmQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuaW50ZXJmYWNlcywgKGludDogSUludGVyZmFjZURlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMuaW50ZXJmYWNlcywgeyBuYW1lOiBpbnQubmFtZSB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLmludGVyZmFjZXNbX2luZGV4XSA9IGludDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh1cGRhdGVkRGF0YS5waXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEucGlwZXMsIChwaXBlOiBJUGlwZURlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMucGlwZXMsIHsgbmFtZTogcGlwZS5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucGlwZXNbX2luZGV4XSA9IHBpcGU7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godXBkYXRlZERhdGEuY2xhc3NlcywgKGNsYXNzZTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5jbGFzc2VzLCB7IG5hbWU6IGNsYXNzZS5uYW1lIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuY2xhc3Nlc1tfaW5kZXhdID0gY2xhc3NlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLyoqXG4gICAgICAgICAqIE1pc2NlbGxhbmVvdXMgdXBkYXRlXG4gICAgICAgICAqL1xuICAgICAgICBpZiAodXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy52YXJpYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLCAodmFyaWFibGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdmFyaWFibGUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogdmFyaWFibGUuZmlsZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXNbX2luZGV4XSA9IHZhcmlhYmxlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh1cGRhdGVkRGF0YS5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucywgKGZ1bmM6IElGdW5jdGlvbkRlY0RlcCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9pbmRleCA9IF8uZmluZEluZGV4KHRoaXMubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogZnVuYy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWxlOiBmdW5jLmZpbGVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zW19pbmRleF0gPSBmdW5jO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHVwZGF0ZWREYXRhLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMsICh0eXBlYWxpYXM6IElUeXBlQWxpYXNEZWNEZXApID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBfaW5kZXggPSBfLmZpbmRJbmRleCh0aGlzLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMsIHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogdHlwZWFsaWFzLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGZpbGU6IHR5cGVhbGlhcy5maWxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzW19pbmRleF0gPSB0eXBlYWxpYXM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodXBkYXRlZERhdGEubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKHVwZGF0ZWREYXRhLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLCAoZW51bWVyYXRpb246IElFbnVtRGVjRGVwKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2luZGV4ID0gXy5maW5kSW5kZXgodGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucywge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbnVtZXJhdGlvbi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICBmaWxlOiBlbnVtZXJhdGlvbi5maWxlXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9uc1tfaW5kZXhdID0gZW51bWVyYXRpb247XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXBhcmVNaXNjZWxsYW5lb3VzKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGZpbmRJbkNvbXBvZG9jKG5hbWU6IHN0cmluZykge1xuICAgICAgICBjb25zdCBtZXJnZWREYXRhID0gXy5jb25jYXQoXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHRoaXMubW9kdWxlcyxcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyxcbiAgICAgICAgICAgIHRoaXMuY29udHJvbGxlcnMsXG4gICAgICAgICAgICB0aGlzLmVudGl0aWVzLFxuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLFxuICAgICAgICAgICAgdGhpcy5pbmplY3RhYmxlcyxcbiAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0b3JzLFxuICAgICAgICAgICAgdGhpcy5ndWFyZHMsXG4gICAgICAgICAgICB0aGlzLmludGVyZmFjZXMsXG4gICAgICAgICAgICB0aGlzLnBpcGVzLFxuICAgICAgICAgICAgdGhpcy5jbGFzc2VzLFxuICAgICAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmVudW1lcmF0aW9ucyxcbiAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcyxcbiAgICAgICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMsXG4gICAgICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IF8uZmluZChtZXJnZWREYXRhLCB7IG5hbWU6IG5hbWUgfSBhcyBhbnkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0IHx8IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZU1pc2NlbGxhbmVvdXMoKSB7XG4gICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgdGhpcy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIHRoaXMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICAvLyBncm91cCBlYWNoIHN1YmdvdXAgYnkgZmlsZVxuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMuZ3JvdXBlZFZhcmlhYmxlcyA9IF8uZ3JvdXBCeSh0aGlzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLCAnZmlsZScpO1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMuZ3JvdXBlZEZ1bmN0aW9ucyA9IF8uZ3JvdXBCeSh0aGlzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLCAnZmlsZScpO1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMuZ3JvdXBlZEVudW1lcmF0aW9ucyA9IF8uZ3JvdXBCeSh0aGlzLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLCAnZmlsZScpO1xuICAgICAgICB0aGlzLm1pc2NlbGxhbmVvdXMuZ3JvdXBlZFR5cGVBbGlhc2VzID0gXy5ncm91cEJ5KHRoaXMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcywgJ2ZpbGUnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlKG5hbWU6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gXy5maW5kKHRoaXMubW9kdWxlcywgWyduYW1lJywgbmFtZV0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSYXdNb2R1bGUobmFtZTogc3RyaW5nKTogYW55IHtcbiAgICAgICAgcmV0dXJuIF8uZmluZCh0aGlzLnJhd01vZHVsZXMsIFsnbmFtZScsIG5hbWVdKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kdWxlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcG9uZW50cztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29udHJvbGxlcnMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xsZXJzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRFbnRpdGllcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZW50aXRpZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERpcmVjdGl2ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmRpcmVjdGl2ZXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEluamVjdGFibGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbmplY3RhYmxlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0SW50ZXJjZXB0b3JzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmNlcHRvcnM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldEd1YXJkcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ3VhcmRzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRJbnRlcmZhY2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcmZhY2VzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRSb3V0ZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnJvdXRlcztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0UGlwZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBpcGVzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDbGFzc2VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbGFzc2VzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNaXNjZWxsYW5lb3VzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5taXNjZWxsYW5lb3VzO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRGVwZW5kZW5jaWVzRW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5leHBvcnQgY2xhc3MgRmlsZUVuZ2luZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEZpbGVFbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFGaWxlRW5naW5lLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBGaWxlRW5naW5lLmluc3RhbmNlID0gbmV3IEZpbGVFbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0KGZpbGVwYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZnMucmVhZEZpbGUocGF0aC5yZXNvbHZlKGZpbGVwYXRoKSwgJ3V0ZjgnLCAoZXJyLCBkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoJ0Vycm9yIGR1cmluZyAnICsgZmlsZXBhdGggKyAnIHJlYWQnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgd3JpdGUoZmlsZXBhdGg6IHN0cmluZywgY29udGVudHM6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgZnMub3V0cHV0RmlsZShwYXRoLnJlc29sdmUoZmlsZXBhdGgpLCBjb250ZW50cywgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHdyaXRlU3luYyhmaWxlcGF0aDogc3RyaW5nLCBjb250ZW50czogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGZzLm91dHB1dEZpbGVTeW5jKGZpbGVwYXRoLCBjb250ZW50cyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFN5bmMoZmlsZXBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocGF0aC5yZXNvbHZlKGZpbGVwYXRoKSwgJ3V0ZjgnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0gZmlsZSBUaGUgZmlsZSB0byBjaGVja1xuICAgICAqL1xuICAgIHB1YmxpYyBleGlzdHNTeW5jKGZpbGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gZnMuZXhpc3RzU3luYyhmaWxlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEZpbGVFbmdpbmUuZ2V0SW5zdGFuY2UoKTtcbiIsImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5pbXBvcnQgeyBsb2dnZXIgfSBmcm9tICcuLi8uLi91dGlscy9sb2dnZXInO1xuaW1wb3J0IERlcGVuZGVuY2llc0VuZ2luZSBmcm9tICcuL2RlcGVuZGVuY2llcy5lbmdpbmUnO1xuXG5pbXBvcnQgeyBFeHBvcnREYXRhIH0gZnJvbSAnLi4vaW50ZXJmYWNlcy9leHBvcnQtZGF0YS5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyBBbmd1bGFyTmdNb2R1bGVOb2RlIH0gZnJvbSAnLi4vbm9kZXMvYW5ndWxhci1uZ21vZHVsZS1ub2RlJztcbmltcG9ydCBGaWxlRW5naW5lIGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuXG5jb25zdCB0cmF2ZXJzZSA9IHJlcXVpcmUoJ25lb3RyYXZlcnNlL2xlZ2FjeScpO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0SnNvbkVuZ2luZSB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEV4cG9ydEpzb25FbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFFeHBvcnRKc29uRW5naW5lLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBFeHBvcnRKc29uRW5naW5lLmluc3RhbmNlID0gbmV3IEV4cG9ydEpzb25FbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXhwb3J0SnNvbkVuZ2luZS5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhwb3J0KG91dHB1dEZvbGRlciwgZGF0YSkge1xuICAgICAgICBsZXQgZXhwb3J0RGF0YTogRXhwb3J0RGF0YSA9IHt9O1xuXG4gICAgICAgIHRyYXZlcnNlKGRhdGEpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgICAgICAgIGlmIChub2RlKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLnBhcmVudDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLnNvdXJjZUNvZGU7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBub2RlLnRlbXBsYXRlRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUuc3R5bGVVcmxzRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUuc3R5bGVzRGF0YTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGV4cG9ydERhdGEucGlwZXMgPSBkYXRhLnBpcGVzO1xuICAgICAgICBleHBvcnREYXRhLmludGVyZmFjZXMgPSBkYXRhLmludGVyZmFjZXM7XG4gICAgICAgIGV4cG9ydERhdGEuaW5qZWN0YWJsZXMgPSBkYXRhLmluamVjdGFibGVzO1xuICAgICAgICBleHBvcnREYXRhLmd1YXJkcyA9IGRhdGEuZ3VhcmRzO1xuICAgICAgICBleHBvcnREYXRhLmludGVyY2VwdG9ycyA9IGRhdGEuaW50ZXJjZXB0b3JzO1xuICAgICAgICBleHBvcnREYXRhLmNsYXNzZXMgPSBkYXRhLmNsYXNzZXM7XG4gICAgICAgIGV4cG9ydERhdGEuZGlyZWN0aXZlcyA9IGRhdGEuZGlyZWN0aXZlcztcbiAgICAgICAgZXhwb3J0RGF0YS5jb21wb25lbnRzID0gZGF0YS5jb21wb25lbnRzO1xuICAgICAgICBleHBvcnREYXRhLm1vZHVsZXMgPSB0aGlzLnByb2Nlc3NNb2R1bGVzKCk7XG4gICAgICAgIGV4cG9ydERhdGEubWlzY2VsbGFuZW91cyA9IGRhdGEubWlzY2VsbGFuZW91cztcbiAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgZXhwb3J0RGF0YS5yb3V0ZXMgPSBkYXRhLnJvdXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvdmVyYWdlKSB7XG4gICAgICAgICAgICBleHBvcnREYXRhLmNvdmVyYWdlID0gZGF0YS5jb3ZlcmFnZURhdGE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS53cml0ZShcbiAgICAgICAgICAgIG91dHB1dEZvbGRlciArIHBhdGguc2VwICsgJy9kb2N1bWVudGF0aW9uLmpzb24nLFxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXhwb3J0RGF0YSwgdW5kZWZpbmVkLCA0KVxuICAgICAgICApLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBleHBvcnQgZmlsZSBnZW5lcmF0aW9uICcsIGVycik7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NNb2R1bGVzKCkge1xuICAgICAgICBjb25zdCBtb2R1bGVzOiBBbmd1bGFyTmdNb2R1bGVOb2RlW10gPSBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0TW9kdWxlcygpO1xuXG4gICAgICAgIGxldCBfcmVzdWx0ZWRNb2R1bGVzID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgbW9kdWxlTnIgPSAwOyBtb2R1bGVOciA8IG1vZHVsZXMubGVuZ3RoOyBtb2R1bGVOcisrKSB7XG4gICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBtb2R1bGVzW21vZHVsZU5yXTtcbiAgICAgICAgICAgIGNvbnN0IG1vZHVsZUVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogbW9kdWxlLm5hbWUsXG4gICAgICAgICAgICAgICAgaWQ6IG1vZHVsZS5pZCxcbiAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogbW9kdWxlLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgIHJhd0Rlc2NyaXB0aW9uOiBtb2R1bGUucmF3RGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiBtb2R1bGUuZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IG1vZHVsZS5kZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgIGZpbGU6IG1vZHVsZS5maWxlLFxuICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1vZHVsZS5tZXRob2RzLFxuICAgICAgICAgICAgICAgIHNvdXJjZUNvZGU6IG1vZHVsZS5zb3VyY2VDb2RlLFxuICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdwcm92aWRlcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdkZWNsYXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbXBvcnRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZXhwb3J0cycsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogW11cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2Jvb3RzdHJhcCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50czogW11cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2NsYXNzZXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHM6IFtdXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1vZHVsZS5wcm92aWRlcnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm92aWRlckVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZS5wcm92aWRlcnNba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlblswXS5lbGVtZW50cy5wdXNoKHByb3ZpZGVyRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1vZHVsZS5kZWNsYXJhdGlvbnMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZS5kZWNsYXJhdGlvbnNba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlblsxXS5lbGVtZW50cy5wdXNoKGRlY2xhcmF0aW9uRWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1vZHVsZS5pbXBvcnRzLmxlbmd0aDsgaysrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW1wb3J0RWxlbWVudCA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbW9kdWxlLmltcG9ydHNba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlblsyXS5lbGVtZW50cy5wdXNoKGltcG9ydEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBtb2R1bGUuZXhwb3J0cy5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV4cG9ydEVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZS5leHBvcnRzW2tdLm5hbWVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1vZHVsZUVsZW1lbnQuY2hpbGRyZW5bM10uZWxlbWVudHMucHVzaChleHBvcnRFbGVtZW50KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgbW9kdWxlLmJvb3RzdHJhcC5sZW5ndGg7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJvb3RzdHJhcEVsZW1lbnQgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG1vZHVsZS5ib290c3RyYXBba10ubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbW9kdWxlRWxlbWVudC5jaGlsZHJlbls0XS5lbGVtZW50cy5wdXNoKGJvb3RzdHJhcEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBfcmVzdWx0ZWRNb2R1bGVzLnB1c2gobW9kdWxlRWxlbWVudCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gX3Jlc3VsdGVkTW9kdWxlcztcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEV4cG9ydEpzb25FbmdpbmUuZ2V0SW5zdGFuY2UoKTtcbiIsImltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5pbXBvcnQgRXhwb3J0SnNvbkVuZ2luZSBmcm9tICcuL2V4cG9ydC1qc29uLmVuZ2luZSc7XG5pbXBvcnQgRXhwb3J0UGRmRW5naW5lIGZyb20gJy4vcGRmLWVuZ2luZS9leHBvcnQtcGRmLmVuZ2luZSc7XG5cbmV4cG9ydCBjbGFzcyBFeHBvcnRFbmdpbmUge1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBFeHBvcnRFbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFFeHBvcnRFbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEV4cG9ydEVuZ2luZS5pbnN0YW5jZSA9IG5ldyBFeHBvcnRFbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gRXhwb3J0RW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBleHBvcnQob3V0cHV0Rm9sZGVyLCBkYXRhKSB7XG4gICAgICAgIHN3aXRjaCAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIGNhc2UgJ2pzb24nOlxuICAgICAgICAgICAgICAgIHJldHVybiBFeHBvcnRKc29uRW5naW5lLmV4cG9ydChvdXRwdXRGb2xkZXIsIGRhdGEpO1xuICAgICAgICAgICAgLypjYXNlICdwZGYnOlxuICAgICAgICAgICAgICAgIHJldHVybiBFeHBvcnRQZGZFbmdpbmUuZXhwb3J0KG91dHB1dEZvbGRlcik7Ki9cbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXhwb3J0RW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5jb25zdCBIYW5kbGViYXJzID0gcmVxdWlyZSgnaGFuZGxlYmFycycpO1xuXG5leHBvcnQgY2xhc3MgQnJlYWtDb21tYUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGJhcnMpIHt9XG5cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRleHQ6IHN0cmluZykge1xuICAgICAgICB0ZXh0ID0gdGhpcy5iYXJzLlV0aWxzLmVzY2FwZUV4cHJlc3Npb24odGV4dCk7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLywvZywgJyw8YnI+Jyk7XG4gICAgICAgIHJldHVybiBuZXcgSGFuZGxlYmFycy5TYWZlU3RyaW5nKHRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmNvbnN0IEhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5kbGViYXJzJyk7XG5cbmV4cG9ydCBjbGFzcyBCcmVha0xpbmVzSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYmFycykge31cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRleHQgPSB0aGlzLmJhcnMuVXRpbHMuZXNjYXBlRXhwcmVzc2lvbih0ZXh0KTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nbSwgJzxicj4nKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvIC9nbSwgJyZuYnNwOycpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cdC9nbSwgJyZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOycpO1xuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyh0ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5jb25zdCBIYW5kbGViYXJzID0gcmVxdWlyZSgnaGFuZGxlYmFycycpO1xuXG5leHBvcnQgY2xhc3MgQ2FwaXRhbGl6ZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRleHQ6IHN0cmluZykge1xuICAgICAgICByZXR1cm4gdGV4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleHQuc2xpY2UoMSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcblxuZXhwb3J0IGNsYXNzIENsZWFuUGFyYWdyYXBoSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzxwPi9nbSwgJycpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88XFwvcD4vZ20sICcnKTtcbiAgICAgICAgcmV0dXJuIG5ldyBIYW5kbGViYXJzLlNhZmVTdHJpbmcodGV4dCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBDb21wYXJlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKFxuICAgICAgICBjb250ZXh0OiBhbnksXG4gICAgICAgIGE6IGFueSxcbiAgICAgICAgb3BlcmF0b3I6IHN0cmluZyxcbiAgICAgICAgYjogYW55LFxuICAgICAgICBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnNcbiAgICApOiBzdHJpbmcge1xuICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGFuZGxlYmFycyBIZWxwZXIge3tjb21wYXJlfX0gZXhwZWN0cyA0IGFyZ3VtZW50cycpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgc3dpdGNoIChvcGVyYXRvcikge1xuICAgICAgICAgICAgY2FzZSAnaW5kZXhvZic6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYi5pbmRleE9mKGEpICE9PSAtMTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJz09PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYSA9PT0gYjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYSAhPT0gYjtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IGEgPiBiO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignaGVscGVyIHt7Y29tcGFyZX19OiBpbnZhbGlkIG9wZXJhdG9yOiBgJyArIG9wZXJhdG9yICsgJ2AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIERlYnVnSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgb3B0aW9uYWxWYWx1ZTogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnNvbGUubG9nKCdDdXJyZW50IENvbnRleHQnKTtcbiAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09Jyk7XG4gICAgICAgIGNvbnNvbGUubG9nKGNvbnRleHQpO1xuXG4gICAgICAgIGlmIChvcHRpb25hbFZhbHVlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnT3B0aW9uYWxWYWx1ZScpO1xuICAgICAgICAgICAgY29uc29sZS5sb2coJz09PT09PT09PT09PT09PT09PT09Jyk7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhvcHRpb25hbFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IERlcGVuZGVuY2llc0VuZ2luZSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcblxuZXhwb3J0IGNsYXNzIEVsZW1lbnRBbG9uZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGVsZW1lbnRzLCBlbGVtZW50VHlwZTogc3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgbGV0IGFsb25lcyA9IFtdO1xuICAgICAgICBsZXQgbW9kdWxlcyA9IERlcGVuZGVuY2llc0VuZ2luZS5tb2R1bGVzO1xuXG4gICAgICAgIGVsZW1lbnRzLmZvckVhY2goZWxlbWVudCA9PiB7XG4gICAgICAgICAgICBsZXQgZm91bmRJbk9uZU1vZHVsZSA9IGZhbHNlO1xuICAgICAgICAgICAgbW9kdWxlcy5mb3JFYWNoKG1vZHVsZSA9PiB7XG4gICAgICAgICAgICAgICAgbW9kdWxlLmRlY2xhcmF0aW9ucy5mb3JFYWNoKGRlY2xhcmF0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uLmlkID09PSBlbGVtZW50LmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uZmlsZSA9PT0gZWxlbWVudC5maWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZEluT25lTW9kdWxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG1vZHVsZS5ib290c3RyYXAuZm9yRWFjaChib29zdHJhcGVkRWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChib29zdHJhcGVkRWxlbWVudC5pZCA9PT0gZWxlbWVudC5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJbk9uZU1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJvb3N0cmFwZWRFbGVtZW50LmZpbGUgPT09IGVsZW1lbnQuZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJbk9uZU1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBtb2R1bGUuY29udHJvbGxlcnMuZm9yRWFjaChjb250cm9sbGVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIuaWQgPT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLmZpbGUgPT09IGVsZW1lbnQuZmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJbk9uZU1vZHVsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBtb2R1bGUucHJvdmlkZXJzLmZvckVhY2gocHJvdmlkZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIuaWQgPT09IGVsZW1lbnQuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlci5maWxlID09PSBlbGVtZW50LmZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kSW5PbmVNb2R1bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghZm91bmRJbk9uZU1vZHVsZSkge1xuICAgICAgICAgICAgICAgIGFsb25lcy5wdXNoKGVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoYWxvbmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHN3aXRjaCAoZWxlbWVudFR5cGUpIHtcbiAgICAgICAgICAgICAgICBjYXNlICdjb21wb25lbnQnOlxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmNvbXBvbmVudHMgPSBhbG9uZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2RpcmVjdGl2ZSc6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGlyZWN0aXZlcyA9IGFsb25lcztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSAnY29udHJvbGxlcic6XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuY29udHJvbGxlcnMgPSBhbG9uZXM7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2luamVjdGFibGUnOlxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmluamVjdGFibGVzID0gYWxvbmVzO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICdwaXBlJzpcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5waXBlcyA9IGFsb25lcztcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEVzY2FwZVNpbXBsZVF1b3RlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGlmICghdGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKTtcbiAgICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFxcclxcbnxcXG58XFxyKS9nbSwgJycpO1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlckFuZ3VsYXIyTW9kdWxlc0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRleHQ6IHN0cmluZywgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIGNvbnN0IE5HMl9NT0RVTEVTOiBzdHJpbmdbXSA9IFtcbiAgICAgICAgICAgICdCcm93c2VyTW9kdWxlJyxcbiAgICAgICAgICAgICdGb3Jtc01vZHVsZScsXG4gICAgICAgICAgICAnSHR0cE1vZHVsZScsXG4gICAgICAgICAgICAnUm91dGVyTW9kdWxlJ1xuICAgICAgICBdO1xuICAgICAgICBsZXQgbGVuID0gTkcyX01PRFVMRVMubGVuZ3RoO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0ZXh0LmluZGV4T2YoTkcyX01PRFVMRVNbaV0pID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgSUFuZ3VsYXJBcGkgfSBmcm9tICcuL2FuZ3VsYXItYXBpLnV0aWwnO1xuXG5leHBvcnQgY2xhc3MgQW5ndWxhclZlcnNpb25VdGlsIHtcbiAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBDb3JlUGFja2FnZSA9ICdAYW5ndWxhci9jb3JlJztcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBBbmd1bGFyVmVyc2lvblV0aWw7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFBbmd1bGFyVmVyc2lvblV0aWwuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEFuZ3VsYXJWZXJzaW9uVXRpbC5pbnN0YW5jZSA9IG5ldyBBbmd1bGFyVmVyc2lvblV0aWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQW5ndWxhclZlcnNpb25VdGlsLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhblZlcnNpb24odmVyc2lvbjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHZlcnNpb25cbiAgICAgICAgICAgIC5yZXBsYWNlKCd+JywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgnXicsICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UoJz0nLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKCc8JywgJycpXG4gICAgICAgICAgICAucmVwbGFjZSgnPicsICcnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QW5ndWxhclZlcnNpb25PZlByb2plY3QocGFja2FnZURhdGEpOiBzdHJpbmcge1xuICAgICAgICBsZXQgX3Jlc3VsdCA9ICcnO1xuXG4gICAgICAgIGlmIChwYWNrYWdlRGF0YS5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIGxldCBhbmd1bGFyQ29yZSA9IHBhY2thZ2VEYXRhLmRlcGVuZGVuY2llc1tBbmd1bGFyVmVyc2lvblV0aWwuQ29yZVBhY2thZ2VdO1xuICAgICAgICAgICAgaWYgKGFuZ3VsYXJDb3JlKSB7XG4gICAgICAgICAgICAgICAgX3Jlc3VsdCA9IHRoaXMuY2xlYW5WZXJzaW9uKGFuZ3VsYXJDb3JlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBfcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNBbmd1bGFyVmVyc2lvbkFyY2hpdmVkKHZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0O1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXN1bHQgPSBzZW12ZXIuY29tcGFyZSh2ZXJzaW9uLCAnMi40LjEwJykgPD0gMDtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVmaXhPZmZpY2lhbERvYyh2ZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0FuZ3VsYXJWZXJzaW9uQXJjaGl2ZWQodmVyc2lvbikgPyAndjIuJyA6ICcnO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRBcGlMaW5rKGFwaTogSUFuZ3VsYXJBcGksIGFuZ3VsYXJWZXJzaW9uOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgYW5ndWxhckRvY1ByZWZpeCA9IHRoaXMucHJlZml4T2ZmaWNpYWxEb2MoYW5ndWxhclZlcnNpb24pO1xuICAgICAgICByZXR1cm4gYGh0dHBzOi8vJHthbmd1bGFyRG9jUHJlZml4fWFuZ3VsYXIuaW8vJHthcGkucGF0aH1gO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQW5ndWxhclZlcnNpb25VdGlsLmdldEluc3RhbmNlKCk7XG4iLCJlbnVtIEJhc2ljVHlwZXMge1xuICAgIG51bWJlcixcbiAgICBib29sZWFuLFxuICAgIHN0cmluZyxcbiAgICBvYmplY3QsXG4gICAgZGF0ZSxcbiAgICBmdW5jdGlvblxufVxuXG5lbnVtIEJhc2ljVHlwZVNjcmlwdFR5cGVzIHtcbiAgICBhbnksXG4gICAgdm9pZFxufVxuXG5leHBvcnQgY2xhc3MgQmFzaWNUeXBlVXRpbCB7XG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IEJhc2ljVHlwZVV0aWw7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFCYXNpY1R5cGVVdGlsLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBCYXNpY1R5cGVVdGlsLmluc3RhbmNlID0gbmV3IEJhc2ljVHlwZVV0aWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQmFzaWNUeXBlVXRpbC5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiB0eXBlcyBpcyBhIGJhc2ljIGphdmFzY3JpcHQgdHlwZVxuICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNKYXZhc2NyaXB0VHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlLnRvTG93ZXJDYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpIGluIEJhc2ljVHlwZXM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYSBnaXZlbiB0eXBlIGlzIGEgdHlwZXNjcmlwdCB0eXBlIChUaGF0IGlzIG5vdCBhIGphdmFzY3JpcHQgdHlwZSlcbiAgICAgKiBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9iYXNpYy10eXBlcy5odG1sXG4gICAgICogQHBhcmFtIHR5cGUgVGhlIHR5cGUgdG8gY2hlY2tcbiAgICAgKi9cbiAgICBwdWJsaWMgaXNUeXBlU2NyaXB0VHlwZSh0eXBlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0eXBlICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlLnRvTG93ZXJDYXNlKSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZS50b0xvd2VyQ2FzZSgpIGluIEJhc2ljVHlwZVNjcmlwdFR5cGVzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2hlY2sgaWYgdGhlIHR5cGUgaXMgYSB0eXBlc2NyaXB0IG9yIGphdmFzY3JpcHQgdHlwZVxuICAgICAqIEBwYXJhbSB0eXBlIFRoZSB0eXBlIHRvIGNoZWNrXG4gICAgICovXG4gICAgcHVibGljIGlzS25vd25UeXBlKHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0phdmFzY3JpcHRUeXBlKHR5cGUpIHx8IHRoaXMuaXNUeXBlU2NyaXB0VHlwZSh0eXBlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIGEgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBsaW5rIHRvIGVpdGhlciB0aGUgamF2YXNjcmlwdCBvciB0eXBlc2NyaXB0IHR5cGVcbiAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSB0byBjaGVja1xuICAgICAqIEByZXR1cm5zIFRoZSBkb2N1bWVudGF0aW9uIGxpbmsgb3IgdW5kZWZpbmVkIGlmIHR5cGUgbm90IGZvdW5kXG4gICAgICovXG4gICAgcHVibGljIGdldFR5cGVVcmwodHlwZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNKYXZhc2NyaXB0VHlwZSh0eXBlKSkge1xuICAgICAgICAgICAgcmV0dXJuIGBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy8ke3R5cGV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmlzVHlwZVNjcmlwdFR5cGUodHlwZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBgaHR0cHM6Ly93d3cudHlwZXNjcmlwdGxhbmcub3JnL2RvY3MvaGFuZGJvb2svYmFzaWMtdHlwZXMuaHRtbGA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQmFzaWNUeXBlVXRpbC5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcblxuaW1wb3J0IERlcGVuZGVuY2llc0VuZ2luZSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcbmltcG9ydCBBbmd1bGFyVmVyc2lvblV0aWwgZnJvbSAnLi4vLi4vLi4vdXRpbHMvYW5ndWxhci12ZXJzaW9uLnV0aWwnO1xuaW1wb3J0IEJhc2ljVHlwZVV0aWwgZnJvbSAnLi4vLi4vLi4vdXRpbHMvYmFzaWMtdHlwZS51dGlsJztcbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgRnVuY3Rpb25TaWduYXR1cmVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVGdW5jdGlvbihhcmcpOiBzdHJpbmcge1xuICAgICAgICBpZiAoYXJnLmZ1bmN0aW9uLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogKCkgPT4gdm9pZGA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBhcmd1bXMgPSBhcmcuZnVuY3Rpb24ubWFwKGFyZ3UgPT4ge1xuICAgICAgICAgICAgY29uc3QgX3Jlc3VsdCA9IERlcGVuZGVuY2llc0VuZ2luZS5maW5kKGFyZ3UudHlwZSk7XG4gICAgICAgICAgICBpZiAoX3Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LnNvdXJjZSA9PT0gJ2ludGVybmFsJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IF9yZXN1bHQuZGF0YS50eXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5kYXRhLnR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAnY2xhc3NlJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogPGEgaHJlZj1cIi4uLyR7cGF0aH1zLyR7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEubmFtZVxuICAgICAgICAgICAgICAgICAgICB9Lmh0bWxcIj4ke2FyZ3UudHlwZX08L2E+YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRoID0gQW5ndWxhclZlcnNpb25VdGlsLmdldEFwaUxpbmsoXG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJWZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJndS50eXBlfTwvYT5gO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoQmFzaWNUeXBlVXRpbC5pc0tub3duVHlwZShhcmd1LnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGF0aCA9IEJhc2ljVHlwZVV0aWwuZ2V0VHlwZVVybChhcmd1LnR5cGUpO1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmd1Lm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgICAgICApfTogPGEgaHJlZj1cIiR7cGF0aH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2FyZ3UudHlwZX08L2E+YDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGFyZ3UubmFtZSAmJiBhcmd1LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZ3UubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06ICR7YXJndS50eXBlfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3UubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZ3UubmFtZS50ZXh0fWA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKGFyZyl9OiAoJHthcmd1bXN9KSA9PiB2b2lkYDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE9wdGlvbmFsU3RyaW5nKGFyZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBhcmcub3B0aW9uYWwgPyAnPycgOiAnJztcbiAgICB9XG5cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIG1ldGhvZCkge1xuICAgICAgICBsZXQgYXJncyA9ICcnO1xuXG4gICAgICAgIGxldCBhcmdEZXN0cnVjdHVyZWRDb3VudGVySW5pdGlhbCA9IDA7XG4gICAgICAgIGxldCBhcmdEZXN0cnVjdHVyZWRDb3VudGVyUmVhbCA9IDA7XG5cbiAgICAgICAgaWYgKG1ldGhvZC5hcmdzKSB7XG4gICAgICAgICAgICBtZXRob2QuYXJncy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGFyZy5kZXN0cnVjdHVyZWRQYXJhbWV0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJnRGVzdHJ1Y3R1cmVkQ291bnRlckluaXRpYWwgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgbWV0aG9kLmFyZ3MuZm9yRWFjaCgoYXJnLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9yZXN1bHQgPSBEZXBlbmRlbmNpZXNFbmdpbmUuZmluZChhcmcudHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKGFyZy5kZXN0cnVjdHVyZWRQYXJhbWV0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ0Rlc3RydWN0dXJlZENvdW50ZXJSZWFsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzICs9ICdfX25hbWVkUGFyYW1ldGVyczogeyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgYXJnRGVzdHJ1Y3R1cmVkQ291bnRlclJlYWwgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQuc291cmNlID09PSAnaW50ZXJuYWwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IF9yZXN1bHQuZGF0YS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQuZGF0YS50eXBlID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICdjbGFzc2UnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyArPSBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06IDxhIGhyZWY9XCIuLi8ke3BhdGh9cy8ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICB9Lmh0bWxcIiB0YXJnZXQ9XCJfc2VsZlwiPiR7SGFuZGxlYmFycy5lc2NhcGVFeHByZXNzaW9uKGFyZy50eXBlKX08L2E+YDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXRoID0gQW5ndWxhclZlcnNpb25VdGlsLmdldEFwaUxpbmsoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhclZlcnNpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzICs9IGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7SGFuZGxlYmFycy5lc2NhcGVFeHByZXNzaW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy50eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICApfTwvYT5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZG90RG90RG90VG9rZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncyArPSBgLi4uJHthcmcubmFtZX06ICR7YXJnLnR5cGV9YDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5mdW5jdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBhcmdzICs9IHRoaXMuaGFuZGxlRnVuY3Rpb24oYXJnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJhc2ljVHlwZVV0aWwuaXNLbm93blR5cGUoYXJnLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBCYXNpY1R5cGVVdGlsLmdldFR5cGVVcmwoYXJnLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBhcmdzICs9IGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICAgICApfTogPGEgaHJlZj1cIiR7cGF0aH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke0hhbmRsZWJhcnMuZXNjYXBlRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZy50eXBlXG4gICAgICAgICAgICAgICAgICAgICl9PC9hPmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmdzICs9IGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogJHthcmcudHlwZX1gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYXJncyArPSBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChhcmcuZGVzdHJ1Y3R1cmVkUGFyYW1ldGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmdEZXN0cnVjdHVyZWRDb3VudGVyUmVhbCA9PT0gYXJnRGVzdHJ1Y3R1cmVkQ291bnRlckluaXRpYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MgKz0gJ30nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IG1ldGhvZC5hcmdzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJncyArPSAnLCAnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZC5uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7bWV0aG9kLm5hbWV9KCR7YXJnc30pYDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBgKCR7YXJnc30pYDtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSGFzT3duSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgZW50aXR5LCBrZXk6IGFueSwgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKE9iamVjdC5oYXNPd25Qcm9wZXJ0eS5jYWxsKGVudGl0eSwga2V5KSkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX0RFX0RFID0ge1xuICAgIGFjY2Vzc29yczogJ0FjY2Vzc29ycycsXG4gICAgYXJndW1lbnRzOiAnQXJndW1lbnRlJyxcbiAgICBib290c3RyYXA6ICdCb290c3RyYXAnLFxuICAgIGJyYW5jaGVzOiAnQnJhbmNoZXMnLFxuICAgIGJyb3dzZTogJ0R1cmNoc3VjaGUnLFxuICAgIGNsYXNzZTogJ0tsYXNzZScsXG4gICAgY2xhc3NlczogJ0tsYXNzZW4nLFxuICAgIGNvbXBvbmVudDogJ0tvbXBvbmVudGUnLFxuICAgIGNvbXBvbmVudHM6ICdLb21wb25lbnRlbicsXG4gICAgY29uc3RydWN0b3I6ICdLb25zdHJ1a3RvcicsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sbGVycycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyb2xsZXInLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0Rva3VtZW50YXRpb24gQWJkZWNrdW5nJyxcbiAgICBkZWNsYXJhdGlvbnM6ICdEZWNsYXJhdGlvbnMnLFxuICAgIGRlY29yYXRvcnM6ICdEZWNvcmF0b3JzJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICdTdGFuZGFyZHdlcnQnLFxuICAgICdkZWZpbmVkLWluJzogJ0RlZmluaWVydCBpbicsXG4gICAgZGVwZW5kZW5jaWVzOiAnQWJow6RuZ2lna2VpdGVuJyxcbiAgICBkZXByZWNhdGVkOiAnVmVyYWx0ZXQnLFxuICAgIGRlc2NyaXB0aW9uOiAnQmVzY2hyZWlidW5nJyxcbiAgICBkaXJlY3RpdmU6ICdEaXJla3RpdmUnLFxuICAgIGRpcmVjdGl2ZXM6ICdEaXJla3RpdmVuJyxcbiAgICAnZG9tIHRyZWUnOiAnRE9NIGJhdW0nLFxuICAgIGVudGl0aWVzOiAnRW50aXRpZXMnLFxuICAgIGVudGl0eTogJ0VudGl0eScsXG4gICAgZW50cnljb21wb25lbnRzOiAnRW50cnlDb21wb25lbnRzJyxcbiAgICBlbnVtZXJhdGlvbnM6ICdFbnVtZXJhdGlvbnMnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICdCZWlzcGllbCcsXG4gICAgZXhhbXBsZXM6ICdCZWlzcGllbGUnLFxuICAgIGV4cG9ydHM6ICdFeHBvcnRpZXJ0JyxcbiAgICBleHRlbmRzOiAnRXJ3ZWl0ZXJ0JyxcbiAgICBmaWxlOiAnRGF0ZWknLFxuICAgIGZ1bmN0aW9uczogJ0Z1bmt0aW9uZW4nLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9rdW1lbnRhdGlvbiBnZW5lcmllcnQgbWl0JyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogXCJMb3MgZ2VodCdzXCIsXG4gICAgZ3VhcmQ6ICdHdWFyZCcsXG4gICAgZ3VhcmRzOiAnR3VhcmRzJyxcbiAgICBob3N0YmluZGluZ3M6ICdIb3N0QmluZGluZ3MnLFxuICAgIGhvc3RkaXJlY3RpdmVzOiAnSG9zdERpcmVjdGl2ZXMnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0TGlzdGVuZXJzJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0h0bWwgRWxlbWVudCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdIdG1sLUVsZW1lbnQgbWl0IERpcmVrdGl2ZScsXG4gICAgaWRlbnRpZmllcjogJ0tlbm51bmcnLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnRpZXJ0JyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0aWVydCcsXG4gICAgaW5kZXg6ICdJbmRleCcsXG4gICAgaW5kZXhhYmxlOiAnSW5kaXppZXJiYXInLFxuICAgIGluZm86ICdJbmZvcm1hdGlvbicsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ0dlZXJidCB2b24nLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdJbnB1dHMnLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9ycycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmYWNlcycsXG4gICAgbGVnZW5kOiAnTGVnZW5kZScsXG4gICAgbGljZW5zZTogJ0xpemVueicsXG4gICAgbGluZXM6ICdMaW5pZW4nLFxuICAgIG1ldGFkYXRhOiAnTWV0YWRhdGEnLFxuICAgIG1ldGhvZHM6ICdNZXRob2RlbicsXG4gICAgbWlzY2VsbGFuZW91czogJ1ZlcnNjaGllZGVuZXMnLFxuICAgIG1vZHVsZTogJ01vZHVsJyxcbiAgICBtb2R1bGVzOiAnTW9kdWxlJyxcbiAgICBuYW1lOiAnTmFtZScsXG4gICAgbm86ICdOZWluJyxcbiAgICAnbm8tZ3JhcGgnOiAnS2VpbiBHcmFwaCB2ZXJmw7xnYmFyLicsXG4gICAgJ25vLWlmcmFtZSc6ICdEZWluIEJyb3dzZXIgdW50ZXJzdMO8dHp0IGtlaW5lIGlmcmFtZXMuJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ0tlaW4gcGFzc2VuZGVzIEVyZ2VibmlzJyxcbiAgICAnbm8tc3ZnJzogJ0RlaW4gQnJvd3NlciB1bnRlcnN0w7x0enQga2VpbiBTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3B0aW9uYWwnLFxuICAgIG91dHB1dHM6ICdBdXNnYWJlbicsXG4gICAgb3ZlcnZpZXc6ICfDnGJlcnNpY2h0JyxcbiAgICBwYXJhbWV0ZXJzOiAnUGFyYW1ldGVyJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnUGVlci1BYmjDpG5naWdrZWl0ZW4nLFxuICAgIHBpcGU6ICdQaXBlJyxcbiAgICBwaXBlczogJ1BpcGVzJyxcbiAgICBwcmVmaXg6ICdQcsOkZml4JyxcbiAgICBwcm9wZXJ0aWVzOiAnRWlnZW5zY2hhZnRlbicsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmlkZXJzJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXF1aXJlZDogJ0VyZm9yZGVybGljaCcsXG4gICAgcmVzZXQ6ICdadXLDvGNrc2V0emVuJyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICfDvGJlcmVpbnN0aW1tZW5kZSBFcmdlYm5pc3NlJyxcbiAgICByZXR1cm5zOiAnUmV0dXJucycsXG4gICAgcm91dGU6ICdSb3V0ZScsXG4gICAgcm91dGVzOiAnUm91dGVuJyxcbiAgICBzY2hlbWFzOiAnU2NoZW1hdGEnLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAnRWluZ2ViZW4genVyIFN1Y2hlJyxcbiAgICBzZWxlY3RvcjogJ1NlbGVrdG9yJyxcbiAgICBzaWduYXR1cmU6ICdVbnRlcnNjaHJpZnQnLFxuICAgIHNvdXJjZTogJ1F1ZWxsZScsXG4gICAgc3RhbmRhbG9uZTogJ1N0YW5kYWxvbmUnLFxuICAgIHN0YXRlbWVudHM6ICdTdGF0ZW1lbnRzJyxcbiAgICBzdHlsZXM6ICdTdGlsZScsXG4gICAgdGVtcGxhdGU6ICdWb3JsYWdlJyxcbiAgICB0eXBlOiAnVHlwJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ1R5cCBBbGlhc2UnLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAnVHlwIFBhcmFtZXRlcicsXG4gICAgdHlwZXM6ICdUeXBlbicsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICdVbmJlbmFubnRlIEVpZ2Vuc2NoYWZ0JyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ1VuaXQtVGVzdC1BYmRlY2t1bmcnLFxuICAgIHZhbHVlOiAnV2VydCcsXG4gICAgdmFyaWFibGVzOiAnVmFyaWFibGVuJyxcbiAgICB5ZXM6ICdKYScsXG4gICAgem9vbWluOiAnVmVyZ3LDtsOfZXJuJyxcbiAgICB6b29tb3V0OiAnVmVya2xlaW5lcm4nXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX0VOX1VTID0ge1xuICAgIGFjY2Vzc29yczogJ0FjY2Vzc29ycycsXG4gICAgYXJndW1lbnRzOiAnQXJndW1lbnRzJyxcbiAgICBib290c3RyYXA6ICdCb290c3RyYXAnLFxuICAgIGJyYW5jaGVzOiAnQnJhbmNoZXMnLFxuICAgIGJyb3dzZTogJ0Jyb3dzZScsXG4gICAgY2xhc3NlOiAnQ2xhc3MnLFxuICAgIGNsYXNzZXM6ICdDbGFzc2VzJyxcbiAgICBjb21wb25lbnQ6ICdDb21wb25lbnQnLFxuICAgIGNvbXBvbmVudHM6ICdDb21wb25lbnRzJyxcbiAgICBjb25zdHJ1Y3RvcjogJ0NvbnN0cnVjdG9yJyxcbiAgICBjb250cm9sbGVyczogJ0NvbnRyb2xsZXJzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHJvbGxlcicsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAnRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZScsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVjbGFyYXRpb25zJyxcbiAgICBkZWNvcmF0b3JzOiAnRGVjb3JhdG9ycycsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnRGVmYXVsdCB2YWx1ZScsXG4gICAgJ2RlZmluZWQtaW4nOiAnRGVmaW5lZCBpbicsXG4gICAgZGVwZW5kZW5jaWVzOiAnRGVwZW5kZW5jaWVzJyxcbiAgICBkZXByZWNhdGVkOiAnRGVwcmVjYXRlZCcsXG4gICAgZGVzY3JpcHRpb246ICdEZXNjcmlwdGlvbicsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWN0aXZlJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWN0aXZlcycsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTSB0cmVlJyxcbiAgICBlbnRpdGllczogJ0VudGl0aWVzJyxcbiAgICBlbnRpdHk6ICdFbnRpdHknLFxuICAgIGVudHJ5Y29tcG9uZW50czogJ0VudHJ5Q29tcG9uZW50cycsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bWVyYXRpb25zJyxcbiAgICBlbnVtczogJ0VudW1zJyxcbiAgICBleGFtcGxlOiAnRXhhbXBsZScsXG4gICAgZXhhbXBsZXM6ICdFeGFtcGxlcycsXG4gICAgZXhwb3J0czogJ0V4cG9ydHMnLFxuICAgIGV4dGVuZHM6ICdFeHRlbmRzJyxcbiAgICBmaWxlOiAnRmlsZScsXG4gICAgZnVuY3Rpb25zOiAnRnVuY3Rpb25zJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0RvY3VtZW50YXRpb24gZ2VuZXJhdGVkIHVzaW5nJyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ0dldHRpbmcgc3RhcnRlZCcsXG4gICAgZ3VhcmQ6ICdHdWFyZCcsXG4gICAgZ3VhcmRzOiAnR3VhcmRzJyxcbiAgICBob3N0YmluZGluZ3M6ICdIb3N0QmluZGluZ3MnLFxuICAgIGhvc3RkaXJlY3RpdmVzOiAnSG9zdERpcmVjdGl2ZXMnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0TGlzdGVuZXJzJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0h0bWwgZWxlbWVudCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdIdG1sIGVsZW1lbnQgd2l0aCBkaXJlY3RpdmUnLFxuICAgIGlkZW50aWZpZXI6ICdJZGVudGlmaWVyJyxcbiAgICBpbXBsZW1lbnRzOiAnSW1wbGVtZW50cycsXG4gICAgaW1wb3J0czogJ0ltcG9ydHMnLFxuICAgIGluZGV4OiAnSW5kZXgnLFxuICAgIGluZGV4YWJsZTogJ0luZGV4YWJsZScsXG4gICAgaW5mbzogJ0luZm9ybWF0aW9uJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnSW5oZXJpdGVkIGZyb20nLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdJbnB1dHMnLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9ycycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmYWNlcycsXG4gICAgbGVnZW5kOiAnTGVnZW5kJyxcbiAgICBsaWNlbnNlOiAnTGljZW5zZScsXG4gICAgbGluZXM6ICdMaW5lcycsXG4gICAgbWV0YWRhdGE6ICdNZXRhZGF0YScsXG4gICAgbWV0aG9kczogJ01ldGhvZHMnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdNaXNjZWxsYW5lb3VzJyxcbiAgICBtb2R1bGU6ICdNb2R1bGUnLFxuICAgIG1vZHVsZXM6ICdNb2R1bGVzJyxcbiAgICBuYW1lOiAnTmFtZScsXG4gICAgbm86ICdObycsXG4gICAgJ25vLWdyYXBoJzogJ05vIGdyYXBoIGF2YWlsYWJsZS4nLFxuICAgICduby1pZnJhbWUnOiAnWW91ciBicm93c2VyIGRvZXMgbm90IHN1cHBvcnQgaWZyYW1lcy4nLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnTm8gcmVzdWx0cyBtYXRjaGluZycsXG4gICAgJ25vLXN2Zyc6ICdZb3VyIGJyb3dzZXIgZG9lcyBub3Qgc3VwcG9ydCBTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3B0aW9uYWwnLFxuICAgIG91dHB1dHM6ICdPdXRwdXRzJyxcbiAgICBvdmVydmlldzogJ092ZXJ2aWV3JyxcbiAgICBwYXJhbWV0ZXJzOiAnUGFyYW1ldGVycycsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXIgZGVwZW5kZW5jaWVzJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHJlZml4JyxcbiAgICBwcm9wZXJ0aWVzOiAnUHJvcGVydGllcycsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmlkZXJzJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXF1aXJlZDogJ1JlcXVpcmVkJyxcbiAgICByZXNldDogJ1Jlc2V0JyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICdyZXN1bHRzIG1hdGNoaW5nJyxcbiAgICByZXR1cm5zOiAnUmV0dXJucycsXG4gICAgcm91dGU6ICdSb3V0ZScsXG4gICAgcm91dGVzOiAnUm91dGVzJyxcbiAgICBzY2hlbWFzOiAnU2NoZW1hcycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdUeXBlIHRvIHNlYXJjaCcsXG4gICAgc2VsZWN0b3I6ICdTZWxlY3RvcicsXG4gICAgc2lnbmF0dXJlOiAnU2lnbmF0dXJlJyxcbiAgICBzb3VyY2U6ICdTb3VyY2UnLFxuICAgIHN0YW5kYWxvbmU6ICdTdGFuZGFsb25lJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgc3R5bGVzOiAnU3R5bGVzJyxcbiAgICB0ZW1wbGF0ZTogJ1RlbXBsYXRlJyxcbiAgICB0eXBlOiAnVHlwZScsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICdUeXBlIGFsaWFzZXMnLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAnVHlwZSBwYXJhbWV0ZXJzJyxcbiAgICB0eXBlczogJ1R5cGVzJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ1VuYW1lZCBwcm9wZXJ0eScsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICdVbml0IHRlc3QgY292ZXJhZ2UnLFxuICAgIHZhbHVlOiAnVmFsdWUnLFxuICAgIHZhcmlhYmxlczogJ1ZhcmlhYmxlcycsXG4gICAgeWVzOiAnWWVzJyxcbiAgICB6b29taW46ICdab29tIGluJyxcbiAgICB6b29tb3V0OiAnWm9vbSBvdXQnXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX0VTX0VTID0ge1xuICAgIGFjY2Vzc29yczogJ0FjY2Vzb3Jpb3MnLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50b3MnLFxuICAgIGJvb3RzdHJhcDogJ0FycmFucXVlJyxcbiAgICBicmFuY2hlczogJ1JhbWFzJyxcbiAgICBicm93c2U6ICdOYXZlZ2FyJyxcbiAgICBjbGFzc2U6ICdDbGFzZScsXG4gICAgY2xhc3NlczogJ0NsYXNlcycsXG4gICAgY29tcG9uZW50OiAnQ29tcG9uZW50ZScsXG4gICAgY29tcG9uZW50czogJ0NvbXBvbmVudGVzJyxcbiAgICBjb25zdHJ1Y3RvcjogJ0NvbnN0cnVjdG9yJyxcbiAgICBjb250cm9sbGVyczogJ0NvbnRyb2xhZG9yZXMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250cm9sYWRvcicsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAnQ29iZXJ0dXJhIGRlIGxhIGRvY3VtZW50YWNpw7NuJyxcbiAgICBkZWNsYXJhdGlvbnM6ICdEZWNsYXJhY2lvbmVzJyxcbiAgICBkZWNvcmF0b3JzOiAnRGVjb3JhZG9yZXMnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ1ZhbG9yIHBvciBkZWZlY3RvJyxcbiAgICAnZGVmaW5lZC1pbic6ICdEZWZpbmlkbyBlbicsXG4gICAgZGVwZW5kZW5jaWVzOiAnRGVwZW5kZW5jaWFzJyxcbiAgICBkZXByZWNhdGVkOiAnT2Jzb2xldGEnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpcGNpw7NuJyxcbiAgICBkaXJlY3RpdmU6ICdEaXJlY3RpdmEnLFxuICAgIGRpcmVjdGl2ZXM6ICdEaXJlY3RpdmFzJyxcbiAgICAnZG9tIHRyZWUnOiAnRE9NIGFyYm9sJyxcbiAgICBlbnRpdGllczogJ0VudGlkYWRlcycsXG4gICAgZW50aXR5OiAnRW50aWRhZCcsXG4gICAgZW50cnljb21wb25lbnRzOiAnQ29tcG9uZW50ZXMgZGUgZW50cmFkYScsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bWVyYWNpb25lcycsXG4gICAgZW51bXM6ICdFbnVtcycsXG4gICAgZXhhbXBsZTogJ0VqZW1wbG8nLFxuICAgIGV4YW1wbGVzOiAnRWplbXBsb3MnLFxuICAgIGV4cG9ydHM6ICdFeHBvcnRhJyxcbiAgICBleHRlbmRzOiAnRXh0aWVuZGUnLFxuICAgIGZpbGU6ICdGaWNoZXJvJyxcbiAgICBmdW5jdGlvbnM6ICdGdW5jaW9uZXMnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhY2nDs24gZ2VuZXJhZGEgdXRpbGl6YW5kbycsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICdDb21lbnphbmRvJyxcbiAgICBndWFyZDogJ0d1YXJkaWEnLFxuICAgIGd1YXJkczogJ0d1YXJkaWFzJyxcbiAgICBob3N0YmluZGluZ3M6ICdGaWphY2lvbmVzIGRlIEhvc3QnLFxuICAgIGhvc3RkaXJlY3RpdmVzOiAnSG9zdERpcmVjdGl2ZXMnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdFc2N1Y2hhZG9yZXMgZGUgSG9zdCcsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdFbGVtZW50byBIdG1sJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0VsZW1lbnRvIEh0bWwgY29uIGRpcmVjdGl2YScsXG4gICAgaWRlbnRpZmllcjogJ0lkZW50aWZpY2Fkb3InLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnRhJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0YScsXG4gICAgaW5kZXg6ICfDjW5kaWNlJyxcbiAgICBpbmRleGFibGU6ICdJbmRleGFibGUnLFxuICAgIGluZm86ICdJbmZvcm1hY2nDs24nLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICdIZXJlZGFkbyBkZXNkZScsXG4gICAgaW5qZWN0YWJsZTogJ0lueWVjdGFibGUnLFxuICAgIGluamVjdGFibGVzOiAnSW55ZWN0YWJsZXMnLFxuICAgIGlucHV0czogJ0VudHJhZGFzJyxcbiAgICBpbnRlcmNlcHRvcnM6ICdJbnRlcmNlcHRvcmVzJyxcbiAgICBpbnRlcmZhY2U6ICdJbnRlcmZheicsXG4gICAgaW50ZXJmYWNlczogJ0ludGVyZmFjZXMnLFxuICAgIGxlZ2VuZDogJ0xleWVuZGEnLFxuICAgIGxpY2Vuc2U6ICdMaWNlbmNpYScsXG4gICAgbGluZXM6ICdMw61uZWFzJyxcbiAgICBtZXRhZGF0YTogJ01ldGEgZGF0b3MnLFxuICAgIG1ldGhvZHM6ICdNw6l0b2RvcycsXG4gICAgbWlzY2VsbGFuZW91czogJ01pc2NlbMOhbmVhJyxcbiAgICBtb2R1bGU6ICdNw7NkdWxvJyxcbiAgICBtb2R1bGVzOiAnTcOzZHVsb3MnLFxuICAgIG5hbWU6ICdOb21icmUnLFxuICAgIG5vOiAnTm8nLFxuICAgICduby1ncmFwaCc6ICdObyBoYXkgZ3LDoWZpY2EgZGlzcG9uaWJsZS4nLFxuICAgICduby1pZnJhbWUnOiAnVHUgbmF2ZWdhZG9yIG5vIHNvcG9ydGEgaWZyYW1lcy4nLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnTm8gaGF5IHJlc3VsdGFkb3MgcXVlIGNvaW5jaWRhbicsXG4gICAgJ25vLXN2Zyc6ICdUdSBuYXZlZ2Fkb3Igbm8gc29wb3J0YSBTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3BjaW9uYWwnLFxuICAgIG91dHB1dHM6ICdTYWxpZGFzJyxcbiAgICBvdmVydmlldzogJ0Rlc2NyaXBjacOzbiBnZW5lcmFsJyxcbiAgICBwYXJhbWV0ZXJzOiAnUGFyw6FtZXRyb3MnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdEZXBlbmRlbmNpYXMgZW50cmUgcGFyZXMnLFxuICAgIHBpcGU6ICdUdWJlcsOtYScsXG4gICAgcGlwZXM6ICdUdWJlcsOtYXMnLFxuICAgIHByZWZpeDogJ1ByZWZpam8nLFxuICAgIHByb3BlcnRpZXM6ICdQcm9waWVkYWRlcycsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmVlZG9yZXMnLFxuICAgIHB1cmU6ICdQdXJvJyxcbiAgICByZWFkbWU6ICdMw6llbWUnLFxuICAgIHJlcXVpcmVkOiAnUmVxdWVyaWRvJyxcbiAgICByZXNldDogJ1Jlc3RhYmxlY2VyJyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICdjb21wYXJhY2nDs24gZGUgcmVzdWx0YWRvcycsXG4gICAgcmV0dXJuczogJ0RldnVlbHZlJyxcbiAgICByb3V0ZTogJ1J1dGEnLFxuICAgIHJvdXRlczogJ1J1dGFzJyxcbiAgICBzY2hlbWFzOiAnRXNxdWVtYXMnLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAnRXNjcmliZSBwYXJhIGJ1c2NhcicsXG4gICAgc2VsZWN0b3I6ICdTZWxlY3RvcicsXG4gICAgc2lnbmF0dXJlOiAnRmlybWEnLFxuICAgIHNvdXJjZTogJ0Z1ZW50ZScsXG4gICAgc3RhbmRhbG9uZTogJ1N0YW5kYWxvbmUnLFxuICAgIHN0YXRlbWVudHM6ICdEZWNsYXJhY2lvbmVzJyxcbiAgICBzdHlsZXM6ICdFc3RpbG9zJyxcbiAgICB0ZW1wbGF0ZTogJ1BsYW50aWxsYScsXG4gICAgdHlwZTogJ1RpcG8nLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnQWxpYXMgZGUgdGlwbycsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdQYXLDoW1ldHJvcyBkZSB0aXBvJyxcbiAgICB0eXBlczogJ1RpcG9zJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ1Byb3BpZWRhZCBzaW4gbm9tYnJlJyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ0NvYmVydHVyYSBkZSBsYXMgcHJ1ZWJhcyB1bml0YXJpYXMnLFxuICAgIHZhbHVlOiAnVmFsb3InLFxuICAgIHZhcmlhYmxlczogJ1ZhcmlhYmxlcycsXG4gICAgeWVzOiAnU2knLFxuICAgIHpvb21pbjogJ0FtcGxpYXInLFxuICAgIHpvb21vdXQ6ICdBbGVqYXInXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX0ZSX0ZSID0ge1xuICAgIGFjY2Vzc29yczogJ0FjY2Vzc2V1cnMnLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50cycsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ0JyYW5jaGVzJyxcbiAgICBicm93c2U6ICdQYXJjb3VyaXInLFxuICAgIGNsYXNzZTogJ0NsYXNzJyxcbiAgICBjbGFzc2VzOiAnQ2xhc3NlcycsXG4gICAgY29tcG9uZW50OiAnQ29tcG9zYW50JyxcbiAgICBjb21wb25lbnRzOiAnQ29tcG9zYW50cycsXG4gICAgY29uc3RydWN0b3I6ICdDb25zdHJ1Y3RldXInLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHLDtGxldXJzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHLDtGxldXInLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0NvdXZlcnR1cmUgZGUgZG9jdW1lbnRhdGlvbicsXG4gICAgZGVjbGFyYXRpb25zOiAnRMOpY2xhcmF0aW9ucycsXG4gICAgZGVjb3JhdG9yczogJ0TDqWNvcmF0ZXVycycsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnVmFsZXVyIHBhciBkw6lmYXV0JyxcbiAgICAnZGVmaW5lZC1pbic6ICdEw6lmaW5pIGRhbnMnLFxuICAgIGRlcGVuZGVuY2llczogJ0TDqXBlbmRhbmNlcycsXG4gICAgZGVwcmVjYXRlZDogJ09ic29sw6h0ZScsXG4gICAgZGVzY3JpcHRpb246ICdEZXNjcmlwdGlvbicsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWN0aXZlJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWN0aXZlcycsXG4gICAgJ2RvbSB0cmVlJzogJ0FyYnJlIERPTScsXG4gICAgZW50aXRpZXM6ICdFbnRpdMOpcycsXG4gICAgZW50aXR5OiAnRW50aXTDqScsXG4gICAgZW50cnljb21wb25lbnRzOiBcIkNvbXBvc2FudHMgZCdlbnRyw6llXCIsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bcOpcmF0aW9ucycsXG4gICAgZW51bXM6ICdFbnVtw6lyYXRpb25zJyxcbiAgICBleGFtcGxlOiAnRXhhbXBsZScsXG4gICAgZXhhbXBsZXM6ICdFeGFtcGxlcycsXG4gICAgZXhwb3J0czogJ0V4cG9ydHMnLFxuICAgIGV4dGVuZHM6ICdFdGVuZCcsXG4gICAgZmlsZTogJ0ZpY2hpZXInLFxuICAgIGZ1bmN0aW9uczogJ0ZvbmN0aW9ucycsXG4gICAgJ2dlbmVyYXRlZC11c2luZyc6ICdEb2N1bWVudGF0aW9uIGfDqW7DqXLDqWUgYXZlYycsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICdEw6ltYXJyYWdlJyxcbiAgICBndWFyZDogJ0dhcmRlJyxcbiAgICBndWFyZHM6ICdHYXJkZXMnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5ncycsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICdIb3N0RGlyZWN0aXZlcycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnMnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnRWzDqW1lbnQgSHRtbCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdFbMOpbWVudCBIdG1sIGF2ZWMgdW5lIGRpcmVjdGl2ZScsXG4gICAgaWRlbnRpZmllcjogJ0lkZW50aWZpYW50JyxcbiAgICBpbXBsZW1lbnRzOiAnSW1wbMOpbWVudGUnLFxuICAgIGltcG9ydHM6ICdJbXBvcnRzJyxcbiAgICBpbmRleDogJ0luZGV4JyxcbiAgICBpbmRleGFibGU6ICdJbmRleGFibGUnLFxuICAgIGluZm86ICdJbmZvcm1hdGlvbicsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ0jDqXJpdMOpIGRlJyxcbiAgICBpbmplY3RhYmxlOiAnSW5qZWN0YWJsZScsXG4gICAgaW5qZWN0YWJsZXM6ICdJbmplY3RhYmxlcycsXG4gICAgaW5wdXRzOiAnRW50csOpZXMnLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdGV1cnMnLFxuICAgIGludGVyZmFjZTogJ0ludGVyZmFjZScsXG4gICAgaW50ZXJmYWNlczogJ0ludGVyZmFjZXMnLFxuICAgIGxlZ2VuZDogJ0zDqWdlbmRlJyxcbiAgICBsaWNlbnNlOiAnTGljZW5zZScsXG4gICAgbGluZXM6ICdMaWduZXMnLFxuICAgIG1ldGFkYXRhOiAnTcOpdGFkb25uw6llcycsXG4gICAgbWV0aG9kczogJ03DqXRob2RlcycsXG4gICAgbWlzY2VsbGFuZW91czogJ0RpdmVycycsXG4gICAgbW9kdWxlOiAnTW9kdWxlJyxcbiAgICBtb2R1bGVzOiAnTW9kdWxlcycsXG4gICAgbmFtZTogJ05vbScsXG4gICAgbm86ICdOb24nLFxuICAgICduby1ncmFwaCc6ICdBdWN1biBncmFwaGlxdWUgZGlzcG9uaWJsZS4nLFxuICAgICduby1pZnJhbWUnOiAnVm90cmUgbmF2aWdhdGV1ciBuZSBzdXBwb3J0ZSBwYXMgbGVzIGlmcmFtZXMuJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ0F1Y3VuIHLDqXN1bHRhdCBtYXRjaGFudCcsXG4gICAgJ25vLXN2Zyc6ICdWb3RyZSBuYXZpZ2F0ZXVyIG5lIHN1cHBvcnRlIHBhcyBsZSBTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3B0aW9ubmVsJyxcbiAgICBvdXRwdXRzOiAnU29ydGllcycsXG4gICAgb3ZlcnZpZXc6IFwiVnVlIGQnZW5zZW1ibGVcIixcbiAgICBwYXJhbWV0ZXJzOiAnUGFyYW3DqHRyZXMnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdEw6lwZW5kYW5jZXMgZGUgcGFpcicsXG4gICAgcGlwZTogJ1BpcGUnLFxuICAgIHBpcGVzOiAnUGlwZXMnLFxuICAgIHByZWZpeDogJ1Byw6lmaXhlJyxcbiAgICBwcm9wZXJ0aWVzOiAnUHJvcHJpw6l0w6lzJyxcbiAgICBwcm92aWRlcnM6ICdQcm92aWRlcnMnLFxuICAgIHB1cmU6ICdQdXJlJyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlcXVpcmVkOiAnUmVxdWlzJyxcbiAgICByZXNldDogJ1JlbWlzZSDDoCB6w6lybycsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAncsOpc3VsdGF0cyBtYXRjaGFudCcsXG4gICAgcmV0dXJuczogJ1JlbnZvaWUnLFxuICAgIHJvdXRlOiAnUm91dGUnLFxuICAgIHJvdXRlczogJ1JvdXRlcycsXG4gICAgc2NoZW1hczogJ1NjaMOpbWFzJyxcbiAgICAnc2VhcmNoLXBsYWNlaG9sZGVyJzogJ1NhaXNpc3NleiB1biB0ZXh0ZScsXG4gICAgc2VsZWN0b3I6ICdTw6lsZWN0ZXVyJyxcbiAgICBzaWduYXR1cmU6ICdTaWduYXR1cmUnLFxuICAgIHNvdXJjZTogJ1NvdXJjZScsXG4gICAgc3RhbmRhbG9uZTogJ1N0YW5kYWxvbmUnLFxuICAgIHN0YXRlbWVudHM6ICdEw6ljbGFyYXRpb25zJyxcbiAgICBzdHlsZXM6ICdTdHlsZXMnLFxuICAgIHRlbXBsYXRlOiAnVGVtcGxhdGUnLFxuICAgICd0YWJsZS1vZi1jb250ZW50cyc6ICdUYWJsZSBkZXMgbWF0acOocmVzJyxcbiAgICB0eXBlOiAnVHlwZScsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICdBbGlhcyBkZSB0eXBlJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1BhcmFtw6h0cmVzIGRlIHR5cGUnLFxuICAgIHR5cGVzOiAnVHlwZXMnLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAnUHJvcHJpw6l0w6kgbm9uIG5vbW3DqWUnLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAnQ291dmVydHVyZSBkZSB0ZXN0IHVuaXRhaXJlJyxcbiAgICB2YWx1ZTogJ1ZhbGV1cicsXG4gICAgdmFyaWFibGVzOiAnVmFyaWFibGVzJyxcbiAgICB5ZXM6ICdPdWknLFxuICAgIHpvb21pbjogJ1pvb20gYXZhbnQnLFxuICAgIHpvb21vdXQ6ICdab29tIGFycmnDqHJlJ1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9IVV9IVSA9IHtcbiAgICBhY2Nlc3NvcnM6ICdHZXR0ZXIvc2V0dGVyIG1ldMOzZHVzb2snLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50dW1vaycsXG4gICAgYm9vdHN0cmFwOiAnQmV0w7ZsdMOpcycsXG4gICAgYnJhbmNoZXM6ICdCcmFuY2hlaycsXG4gICAgYnJvd3NlOiAnQsO2bmfDqXN6w6lzJyxcbiAgICBjbGFzc2U6ICdPc3p0w6FseScsXG4gICAgY2xhc3NlczogJ09zenTDoWx5b2snLFxuICAgIGNvbXBvbmVudDogJ0tvbXBvbmVucycsXG4gICAgY29tcG9uZW50czogJ0tvbXBvbmVuc2VrJyxcbiAgICBjb25zdHJ1Y3RvcjogJ0tvbnN0cnVrdG9yJyxcbiAgICBjb250cm9sbGVyczogJ0tvbnRyb2xsZXJlaycsXG4gICAgY29udHJvbGxlcjogJ0tvbnRyb2xsZXInLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0Rva3VtZW50w6FjacOzIGxlZmVkZXR0c8OpZycsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVrbGFyw6FjacOzaycsXG4gICAgZGVjb3JhdG9yczogJ0Rla29yw6F0b3JvaycsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnQWxhcMOpcnRlbG1lemV0dCDDqXJ0w6lrJyxcbiAgICAnZGVmaW5lZC1pbic6ICdEZWZpbsOtY2nDsyBoZWx5ZTonLFxuICAgIGRlcGVuZGVuY2llczogJ0bDvGdnxZFzw6lnZWsnLFxuICAgIGRlcHJlY2F0ZWQ6ICdFbGF2dWx0JyxcbiAgICBkZXNjcmlwdGlvbjogJ0xlw61yw6FzJyxcbiAgICBkaXJlY3RpdmU6ICdEaXJla3TDrXZhJyxcbiAgICBkaXJlY3RpdmVzOiAnRGlyZWt0w612w6FrJyxcbiAgICAnZG9tIHRyZWUnOiAnRE9NIGZhJyxcbiAgICBlbnRpdGllczogJ0VudGl0w6Fzb2snLFxuICAgIGVudGl0eTogJ0VudGl0w6FzJyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeSBrb21wb25lbnNlaycsXG4gICAgZW51bWVyYXRpb25zOiAnRW51bWVyw6FjacOzaycsXG4gICAgZW51bXM6ICdFbnVtb2snLFxuICAgIGV4YW1wbGU6ICdQw6lsZGEnLFxuICAgIGV4YW1wbGVzOiAnUMOpbGTDoWsnLFxuICAgIGV4cG9ydHM6ICdFeHBvcnRvaycsXG4gICAgZXh0ZW5kczogJ8WQc29zenTDoWx5JyxcbiAgICBmaWxlOiAnRmlsZScsXG4gICAgZnVuY3Rpb25zOiAnRsO8Z2d2w6lueWVrJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0EgZG9rdW1lbnTDoWNpw7N0IGdlbmVyw6FsdGE6JyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ0JldmV6ZXTFkScsXG4gICAgZ3VhcmQ6ICdHdWFyZCcsXG4gICAgZ3VhcmRzOiAnR3VhcmRvaycsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdEJpbmRpbmdvaycsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICdIb3N0RGlyZWN0aXZlcycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcmVrJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0h0bWwgZWxlbScsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdIdG1sIGVsZW0gZGlyZWt0w612w6F2YWwnLFxuICAgIGlkZW50aWZpZXI6ICdBem9ub3PDrXTDsycsXG4gICAgaW1wbGVtZW50czogJ0ltcGxlbWVudMOhbHQgaW50ZXJmw6lzemVrJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0b2snLFxuICAgIGluZGV4OiAnVGFydGFsb21qZWd5esOpaycsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhlbGhldMWRJyxcbiAgICBpbmZvOiAnSW5mb3Jtw6FjacOzJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnw5Zyw7Zrw7ZsdmUgaW5uZW46JyxcbiAgICBpbmplY3RhYmxlOiAnSW5qZWt0w6FsaGF0w7MnLFxuICAgIGluamVjdGFibGVzOiAnSW5qZWt0w6FsaGF0w7NrJyxcbiAgICBpbnB1dHM6ICdCZW1lbmV0ZWsnLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9yb2snLFxuICAgIGludGVyZmFjZTogJ0ludGVyZsOpc3onLFxuICAgIGludGVyZmFjZXM6ICdJbnRlcmbDqXN6ZWsnLFxuICAgIGxlZ2VuZDogJ0plbG1hZ3lhcsOhemF0JyxcbiAgICBsaWNlbnNlOiAnTGljZW5jJyxcbiAgICBsaW5lczogJ1Nvcm9rJyxcbiAgICBtZXRhZGF0YTogJ01ldGFhZGF0b2snLFxuICAgIG1ldGhvZHM6ICdNZXTDs2R1c29rJyxcbiAgICBtaXNjZWxsYW5lb3VzOiAnRWd5w6liJyxcbiAgICBtb2R1bGU6ICdNb2R1bCcsXG4gICAgbW9kdWxlczogJ01vZHVsb2snLFxuICAgIG5hbWU6ICdOw6l2JyxcbiAgICBubzogJ05lbScsXG4gICAgJ25vLWdyYXBoJzogJ0dyYWZpa29uIG5lbSBlbMOpcmhldMWRLicsXG4gICAgJ25vLWlmcmFtZSc6ICdBIGLDtm5nw6lzesWRamUgbmVtIHTDoW1vZ2F0amEgYXogaWZyYW1lLWVrZXQuJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ05pbmNzIHRhbMOhbGF0JyxcbiAgICAnbm8tc3ZnJzogJ0EgYsO2bmfDqXN6xZFqZSBuZW0gdMOhbW9nYXRqYSBheiBTVkcgZm9ybcOhdHVtb3QuJyxcbiAgICBvcHRpb25hbDogJ09wY2lvbsOhbGlzJyxcbiAgICBvdXRwdXRzOiAnS2ltZW5ldGVrJyxcbiAgICBvdmVydmlldzogJ8OBdHRla2ludMOpcycsXG4gICAgcGFyYW1ldGVyczogJ1BhcmFtw6l0ZXJlaycsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXIgZsO8Z2fFkXPDqWdlaycsXG4gICAgcGlwZTogJ1BpcGUnLFxuICAgIHBpcGVzOiAnUGlwZS1vaycsXG4gICAgcHJlZml4OiAnRWzFkXRhZycsXG4gICAgcHJvcGVydGllczogJ1RhZ3bDoWx0b3rDs2snLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZpZGVyZWsnLFxuICAgIHB1cmU6ICdQdXJlJyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlcXVpcmVkOiAnS8OtdsOhbnQnLFxuICAgIHJlc2V0OiAnVmlzc3phw6FsbMOtdCcsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAndGFsw6FsYXQnLFxuICAgIHJldHVybnM6ICdWaXNzemF0w6lyw6lzaSDDqXJ0w6lrJyxcbiAgICByb3V0ZTogJ8OadHZvbmFsJyxcbiAgICByb3V0ZXM6ICfDmnR2b25hbGFrJyxcbiAgICBzY2hlbWFzOiAnU8OpbcOhaycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdLZXJlc2VuZMWRIGtpZmVqZXrDqXMnLFxuICAgIHNlbGVjdG9yOiAnU3plbGVrdG9yJyxcbiAgICBzaWduYXR1cmU6ICdBbMOhw61yw6FzJyxcbiAgICBzb3VyY2U6ICdGb3Jyw6FzJyxcbiAgICBzdGFuZGFsb25lOiAnU3RhbmRhbG9uZScsXG4gICAgc3RhdGVtZW50czogJ1V0YXPDrXTDoXNvaycsXG4gICAgc3R5bGVzOiAnU3TDrWx1c29rJyxcbiAgICB0ZW1wbGF0ZTogJ1NhYmxvbicsXG4gICAgdHlwZTogJ1TDrXB1cycsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICdUw61wdXMgw6FsbsOpdicsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdUw61wdXMgcGFyYW3DqXRlcmVrJyxcbiAgICB0eXBlczogJ1TDrXB1c29rJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ07DqXZ0ZWxlbiBwcm9wZXJ0eScsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICdVbml0IHRlc3p0IGxlZmVkZXR0c8OpZycsXG4gICAgdmFsdWU6ICfDiXJ0w6lrJyxcbiAgICB2YXJpYWJsZXM6ICdWw6FsdG96w7NrJyxcbiAgICB5ZXM6ICdJZ2VuJyxcbiAgICB6b29taW46ICdOYWd5w610w6FzJyxcbiAgICB6b29tb3V0OiAnS2ljc2luecOtdMOpcydcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fSVRfSVQgPSB7XG4gICAgYWNjZXNzb3JzOiAnQWNjZXNzb3JpJyxcbiAgICBhcmd1bWVudHM6ICdBcmdvbWVudGknLFxuICAgIGJvb3RzdHJhcDogJ0Jvb3RzdHJhcCcsXG4gICAgYnJhbmNoZXM6ICdSYW1pJyxcbiAgICBicm93c2U6ICdDZXJjYScsXG4gICAgY2xhc3NlOiAnQ2xhc3NlJyxcbiAgICBjbGFzc2VzOiAnQ2xhc3NpJyxcbiAgICBjb21wb25lbnQ6ICdDb21wb25lbnRlJyxcbiAgICBjb21wb25lbnRzOiAnQ29tcG9uZW50aScsXG4gICAgY29uc3RydWN0b3I6ICdDb3N0cnV0dG9yZScsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sbGVycycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyb2xsZXInLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ0NvcGVydHVyYSBjb2RpY2UnLFxuICAgIGRlY2xhcmF0aW9uczogJ0RpY2hpYXJhemlvbmknLFxuICAgIGRlY29yYXRvcnM6ICdEZWNvcmF0b3JzJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICdWYWxvcmUgcHJlZGVmaW5pdG8nLFxuICAgICdkZWZpbmVkLWluJzogJ0RlZmluaXRvIGluJyxcbiAgICBkZXBlbmRlbmNpZXM6ICdEZXBlbmRlbmNpZXMnLFxuICAgIGRlcHJlY2F0ZWQ6ICdEZXByZWNhdGEnLFxuICAgIGRlc2NyaXB0aW9uOiAnRGVzY3JpemlvbmUnLFxuICAgIGRpcmVjdGl2ZTogJ0RpcmV0dGl2YScsXG4gICAgZGlyZWN0aXZlczogJ0RpcmV0dGl2ZScsXG4gICAgJ2RvbSB0cmVlJzogJ0FsYmVybyBET00nLFxuICAgIGVudGl0aWVzOiAnRW50aXTDoCcsXG4gICAgZW50aXR5OiAnRW50aXTDoCcsXG4gICAgZW50cnljb21wb25lbnRzOiAnRW50cnlDb21wb25lbnRzJyxcbiAgICBlbnVtZXJhdGlvbnM6ICdFbnVtZXJhdGlvbnMnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICdFc2VtcGlvJyxcbiAgICBleGFtcGxlczogJ0VzZW1waScsXG4gICAgZXhwb3J0czogJ0V4cG9ydHMnLFxuICAgIGV4dGVuZHM6ICdFeHRlbmRzJyxcbiAgICBmaWxlOiAnRmlsZScsXG4gICAgZnVuY3Rpb25zOiAnRnVuemlvbmknLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAnRG9jdW1lbnRhemlvbmUgZ2VuZXJhdGEgdXNhbmRvJyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ0luaXppYW1vJyxcbiAgICBndWFyZDogJ0d1YXJkaWEnLFxuICAgIGd1YXJkczogJ0d1YXJkaWUnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5ncycsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICdIb3N0RGlyZWN0aXZlcycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnMnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnRWxlbWVudG8gSHRtbCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdFbGVtZW50byBodG1sIGNvbiBkaXJldHRpdmUnLFxuICAgIGlkZW50aWZpZXI6ICdJZGVudGlmaWNhdG9yZScsXG4gICAgaW1wbGVtZW50czogJ0ltcGxlbWVudGEnLFxuICAgIGltcG9ydHM6ICdJbXBvcnRhJyxcbiAgICBpbmRleDogJ0luZGljZScsXG4gICAgaW5kZXhhYmxlOiAnSW5kaWNpenphYmlsZScsXG4gICAgaW5mbzogJ0luZm9ybWF6aW9uZScsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ2VyZWRpdGF0byBkYScsXG4gICAgaW5qZWN0YWJsZTogJ0luamVjdGFibGUnLFxuICAgIGluamVjdGFibGVzOiAnSW5qZWN0YWJsZXMnLFxuICAgIGlucHV0czogJ0lucHV0JyxcbiAgICBpbnRlcmNlcHRvcnM6ICdJbnRlcmNlcHRvcnMnLFxuICAgIGludGVyZmFjZTogJ0ludGVyZmFjY2lhJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmYWNjZScsXG4gICAgbGVnZW5kOiAnTGVnZW5kYScsXG4gICAgbGljZW5zZTogJ0xpY2VuemEnLFxuICAgIGxpbmVzOiAnTGluZWUnLFxuICAgIG1ldGFkYXRhOiAnTWV0YWRhdGknLFxuICAgIG1ldGhvZHM6ICdNZXRvZGknLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdWYXJpZScsXG4gICAgbW9kdWxlOiAnTW9kdWxvJyxcbiAgICBtb2R1bGVzOiAnTW9kdWxpJyxcbiAgICBuYW1lOiAnTm9tZScsXG4gICAgbm86ICdObycsXG4gICAgJ25vLWdyYXBoJzogJ0dyYWZpY28gbm9uIGRpc3BvbmliaWxlLicsXG4gICAgJ25vLWlmcmFtZSc6ICdJbCB0dW8gYnJvd3NlciBub24gc3VwcG9ydGEgaWZyYW1lLicsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICdOZXNzdW4gcmlzdWx0YXRvIGNvcnJpc3BvbmRlbnRlJyxcbiAgICAnbm8tc3ZnJzogJ0lsIHR1byBicm93c2VyIG5vbiBzdXBwb3J0YSBTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3B6aW9uYWxlJyxcbiAgICBvdXRwdXRzOiAnT3V0cHV0JyxcbiAgICBvdmVydmlldzogJ1NvbW1hcmlvJyxcbiAgICBwYXJhbWV0ZXJzOiAnUGFyYW1ldHJpJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnUGVlciBkZXBlbmRlbmNpZXMnLFxuICAgIHBpcGU6ICdQaXBlJyxcbiAgICBwaXBlczogJ1BpcGVzJyxcbiAgICBwcmVmaXg6ICdQcmVmaXNzbycsXG4gICAgcHJvcGVydGllczogJ1Byb3ByaWV0w6AnLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZpZGVycycsXG4gICAgcHVyZTogJ1B1cmUnLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVxdWlyZWQ6ICdOZWNlc3NhcmlvJyxcbiAgICByZXNldDogJ1Jlc2V0JyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICdjb3JyaXNwb25kZW56YScsXG4gICAgcmV0dXJuczogJ1JldHVybnMnLFxuICAgIHJvdXRlOiAnUm91dGUnLFxuICAgIHJvdXRlczogJ1JvdXRlcycsXG4gICAgc2NoZW1hczogJ1NjaGVtYXMnLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAnRGlnaXRhIHBlciBhdnZpYXJlIGxhIHJpY2VyY2EnLFxuICAgIHNlbGVjdG9yOiAnU2VsZWN0b3InLFxuICAgIHNpZ25hdHVyZTogJ1NpZ25hdHVyZScsXG4gICAgc291cmNlOiAnRm9udGUnLFxuICAgIHN0YW5kYWxvbmU6ICdTdGFuZGFsb25lJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgc3R5bGVzOiAnU3RpbGknLFxuICAgIHRlbXBsYXRlOiAnTW9kZWxsbycsXG4gICAgdHlwZTogJ1RpcG8nLFxuICAgICd0eXBlLWFsaWFzZXMnOiAnVHlwZSBhbGlhc2VzJyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1R5cGUgcGFyYW1ldGVycycsXG4gICAgdHlwZXM6ICdUaXBpJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ1Byb3ByaWV0w6Agc2VuemEgbm9tZScsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICdDb3BlcnR1cmEgdW5pdCB0ZXN0JyxcbiAgICB2YWx1ZTogJ1ZhbG9yaScsXG4gICAgdmFyaWFibGVzOiAnVmFyaWFiaWxpJyxcbiAgICB5ZXM6ICdTaScsXG4gICAgem9vbWluOiAnSW5ncmFuZGlzY2knLFxuICAgIHpvb21vdXQ6ICdSaW1wb2NjaW9saXNjaSdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fSkFfSlAgPSB7XG4gICAgYWNjZXNzb3JzOiAn44Ki44Kv44K744K1JyxcbiAgICBhcmd1bWVudHM6ICflvJXmlbAnLFxuICAgIGJvb3RzdHJhcDogJ+ODluODvOODiOOCueODiOODqeODg+ODlycsXG4gICAgYnJhbmNoZXM6ICfjg5bjg6njg7Pjg4EnLFxuICAgIGJyb3dzZTogJ+ODluODqeOCpuOCuicsXG4gICAgY2xhc3NlOiAn44Kv44Op44K5JyxcbiAgICBjbGFzc2VzOiAn44Kv44Op44K5JyxcbiAgICBjb21wb25lbnQ6ICfjgrPjg7Pjg53jg7zjg43jg7Pjg4gnLFxuICAgIGNvbXBvbmVudHM6ICfjgrPjg7Pjg53jg7zjg43jg7Pjg4gnLFxuICAgIGNvbnN0cnVjdG9yOiAn44Kz44Oz44K544OI44Op44Kv44K/JyxcbiAgICBjb250cm9sbGVyczogJ+OCs+ODs+ODiOODreODvOODqeODvCcsXG4gICAgY29udHJvbGxlcjogJ+OCs+ODs+ODiOODreODvOODqeODvCcsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAn44Kr44OQ44Os44OD44K4JyxcbiAgICBkZWNsYXJhdGlvbnM6ICflrqPoqIAnLFxuICAgIGRlY29yYXRvcnM6ICfjg4fjgrPjg6zjg7zjgr/jg7wnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ+WIneacn+WApCcsXG4gICAgJ2RlZmluZWQtaW4nOiAnRGVmaW5lZCBpbicsXG4gICAgZGVwZW5kZW5jaWVzOiAn5L6d5a2Y6Zai5L+CJyxcbiAgICBkZXByZWNhdGVkOiAn6Z2e5o6o5aWoJyxcbiAgICBkZXNjcmlwdGlvbjogJ+iqrOaYjicsXG4gICAgZGlyZWN0aXZlOiAn44OH44Kj44Os44Kv44OG44Kj44OWJyxcbiAgICBkaXJlY3RpdmVzOiAn44OH44Kj44Os44Kv44OG44Kj44OWJyxcbiAgICAnZG9tIHRyZWUnOiAnRE9NIOODhOODquODvCcsXG4gICAgZW50aXRpZXM6ICfjgqjjg7Pjg4bjgqPjg4bjgqMnLFxuICAgIGVudGl0eTogJ+Wun+WcqOeJqScsXG4gICAgZW50cnljb21wb25lbnRzOiAn44Ko44Oz44OI44Oq44O844Kz44Oz44Od44O844ON44Oz44OIJyxcbiAgICBlbnVtZXJhdGlvbnM6ICfliJfmjJnlnosnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICfkvosnLFxuICAgIGV4YW1wbGVzOiAn5L6LJyxcbiAgICBleHBvcnRzOiAn44Ko44Kv44K544Od44O844OIJyxcbiAgICBleHRlbmRzOiAn57aZ5om/JyxcbiAgICBmaWxlOiAn44OV44Kh44Kk44OrJyxcbiAgICBmdW5jdGlvbnM6ICfplqLmlbAnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAn44GT44Gu44OJ44Kt44Ol44Oh44Oz44OI44Gv5Lul5LiL44KS5L2/55So44GX44Gm55Sf5oiQ44GV44KM44Gm44GE44G+44GZJyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ+OBr+OBmOOCgeOBqycsXG4gICAgZ3VhcmQ6ICfjgqzjg7zjg4knLFxuICAgIGd1YXJkczogJ+OCrOODvOODiScsXG4gICAgaG9zdGJpbmRpbmdzOiAn44Ob44K544OI44OQ44Kk44Oz44OH44Kj44Oz44KwJyxcbiAgICBob3N0ZGlyZWN0aXZlczogJ0hvc3REaXJlY3RpdmVzJyxcbiAgICBob3N0bGlzdGVuZXJzOiAn44Ob44K544OI44Oq44K544OK44O8JyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0h0bWzopoHntKAnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAn44OH44Kj44Os44Kv44OG44Kj44OWSHRtbOimgee0oCcsXG4gICAgaWRlbnRpZmllcjogJ+itmOWIpeWtkCcsXG4gICAgaW1wbGVtZW50czogJ+Wun+ijhScsXG4gICAgaW1wb3J0czogJ+OCpOODs+ODneODvOODiCcsXG4gICAgaW5kZXg6ICfntKLlvJUnLFxuICAgIGluZGV4YWJsZTogJ+OCpOODs+ODh+OCr+OCteODluODqycsXG4gICAgaW5mbzogJ+aDheWgsScsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ0luaGVyaXRlZCBmcm9tJyxcbiAgICBpbmplY3RhYmxlOiAn44Kk44Oz44K444Kn44Kv44K/44OW44OrJyxcbiAgICBpbmplY3RhYmxlczogJ+OCpOODs+OCuOOCp+OCr+OCv+ODluODqycsXG4gICAgaW5wdXRzOiAn5YWl5YqbJyxcbiAgICBpbnRlcmNlcHRvcnM6ICfjgqTjg7Pjgr/jg7zjgrvjg5fjgr/jg7wnLFxuICAgIGludGVyZmFjZTogJ+OCpOODs+OCv+ODvOODleOCp+OCpOOCuScsXG4gICAgaW50ZXJmYWNlczogJ+OCpOODs+OCv+ODvOODleOCp+OCpOOCuScsXG4gICAgbGVnZW5kOiAn5Yeh5L6LJyxcbiAgICBsaWNlbnNlOiAn44Op44Kk44K744Oz44K5JyxcbiAgICBsaW5lczogJ+ihjOaVsCcsXG4gICAgbWV0YWRhdGE6ICfjg6Hjgr/jg4fjg7zjgr8nLFxuICAgIG1ldGhvZHM6ICfjg6Hjgr3jg4Pjg4knLFxuICAgIG1pc2NlbGxhbmVvdXM6ICfjgZ3jga7ku5YnLFxuICAgIG1vZHVsZTogJ+ODouOCuOODpeODvOODqycsXG4gICAgbW9kdWxlczogJ+ODouOCuOODpeODvOODqycsXG4gICAgbmFtZTogJ+WQjeWJjScsXG4gICAgbm86ICfjgYTjgYTjgYgnLFxuICAgICduby1ncmFwaCc6ICfkvb/nlKjjgafjgY3jgovjgrDjg6njg5XjgYzjgYLjgorjgb7jgZvjgpMnLFxuICAgICduby1pZnJhbWUnOiAn44OW44Op44Km44K244GMaWZyYW1l44KS5a++5b+c44GX44Gm44GE44G+44Gb44KTJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ+imi+OBpOOBi+OCiuOBvuOBm+OCk+OBp+OBl+OBnycsXG4gICAgJ25vLXN2Zyc6ICfjg5bjg6njgqbjgrbjgYxTVkfjgavlr77lv5zjgZfjgabjgb7jgZvjgpMnLFxuICAgIG9wdGlvbmFsOiAn44Kq44OX44K344On44OzJyxcbiAgICBvdXRwdXRzOiAn5Ye65YqbJyxcbiAgICBvdmVydmlldzogJ+amguimgScsXG4gICAgcGFyYW1ldGVyczogJ+ODkeODqeODoeODvOOCvycsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXIgZGVwZW5kZW5jaWVzJyxcbiAgICBwaXBlOiAn44OR44Kk44OXJyxcbiAgICBwaXBlczogJ+ODkeOCpOODlycsXG4gICAgcHJlZml4OiAn5o6l6aCt6L6eJyxcbiAgICBwcm9wZXJ0aWVzOiAn44OX44Ot44OR44OG44KjJyxcbiAgICBwcm92aWRlcnM6ICfjg5fjg63jg5DjgqTjg4Djg7wnLFxuICAgIHB1cmU6ICdQdXJlJyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlcXVpcmVkOiAn5b+F6KaBJyxcbiAgICByZXNldDogJ+ODquOCu+ODg+ODiCcsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAn5Lu244Gu57WQ5p6c44GM5LiA6Ie044GX44G+44GX44GfJyxcbiAgICByZXR1cm5zOiAn5oi744KK5YCkJyxcbiAgICByb3V0ZTogJ+ODq+ODvOODiCcsXG4gICAgcm91dGVzOiAn44Or44O844OIJyxcbiAgICBzY2hlbWFzOiAn44K544Kt44O844OeJyxcbiAgICAnc2VhcmNoLXBsYWNlaG9sZGVyJzogJ+WFpeWKm+OBl+OBpuaknOe0oicsXG4gICAgc2VsZWN0b3I6ICfjgrvjg6zjgq/jgr8nLFxuICAgIHNpZ25hdHVyZTogJ+OCt+OCsOODjeODgeODoycsXG4gICAgc291cmNlOiAn44K944O844K5JyxcbiAgICBzdGFuZGFsb25lOiAnU3RhbmRhbG9uZScsXG4gICAgc3RhdGVtZW50czogJ+aWhycsXG4gICAgc3R5bGVzOiAn44K544K/44Kk44OrJyxcbiAgICB0ZW1wbGF0ZTogJ+ODhuODs+ODl+ODrOODvOODiCcsXG4gICAgdHlwZTogJ+WeiycsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICfjgr/jgqTjg5fjgqjjgqTjg6rjgqLjgrknLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAn5Z6L44OR44Op44Oh44O844K/44O8JyxcbiAgICB0eXBlczogJ+WeiycsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICfljL/lkI3jg5fjg63jg5Hjg4bjgqMnLFxuICAgICd1bml0LXRlc3QtY292ZXJhZ2UnOiAn44Om44OL44OD44OI44OG44K544OI44Kr44OQ44Os44OD44K4JyxcbiAgICB2YWx1ZTogJ+WApCcsXG4gICAgdmFyaWFibGVzOiAn5aSJ5pWwJyxcbiAgICB5ZXM6ICfjga/jgYQnLFxuICAgIHpvb21pbjogJ+aLoeWkpycsXG4gICAgem9vbW91dDogJ+e4ruWwjydcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fS0FfR0UgPSB7XG4gIGFjY2Vzc29yczogJ+GDkOGDpeGDoeGDlOGDoeGDneGDoOGDmCcsXG4gIGFyZ3VtZW50czogJ+GDkOGDoOGDkuGDo+GDm+GDlOGDnOGDouGDlOGDkeGDmCcsXG4gIGJvb3RzdHJhcDogJ+GDqeGDkOGDm+GDouGDleGDmOGDoOGDl+GDkOGDleGDmCcsXG4gIGJyYW5jaGVzOiAn4YOi4YOd4YOi4YOU4YOR4YOYJyxcbiAgYnJvd3NlOiAn4YOT4YOQ4YOQ4YOX4YOV4YOQ4YOa4YOY4YOU4YOg4YOUJyxcbiAgY2xhc3NlOiAn4YOZ4YOa4YOQ4YOh4YOYJyxcbiAgY2xhc3NlczogJ+GDmeGDmuGDkOGDoeGDlOGDkeGDmCcsXG4gIGNvbXBvbmVudDogJ+GDmeGDneGDm+GDnuGDneGDnOGDlOGDnOGDouGDmCcsXG4gIGNvbXBvbmVudHM6ICfhg5nhg53hg5vhg57hg53hg5zhg5Thg5zhg6Lhg5Thg5Hhg5gnLFxuICBjb25zdHJ1Y3RvcjogJ+GDmeGDneGDnOGDoeGDouGDoOGDo+GDpeGDouGDneGDoOGDmCcsXG4gIGNvbnRyb2xsZXJzOiAn4YOZ4YOd4YOc4YOi4YOg4YOd4YOa4YOU4YOg4YOU4YOR4YOYJyxcbiAgY29udHJvbGxlcjogJ+GDmeGDneGDnOGDouGDoOGDneGDmuGDlOGDoOGDmCcsXG4gICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ+GDk+GDneGDmeGDo+GDm+GDlOGDnOGDouGDkOGDquGDmOGDmOGDoSDhg5Lhg5Dhg6jhg6Phg6Xhg5Thg5Hhg5AnLFxuICBkZWNsYXJhdGlvbnM6ICfhg5Phg5Thg5nhg5rhg5Dhg6Dhg5Dhg6rhg5jhg5Thg5Hhg5gnLFxuICBkZWNvcmF0b3JzOiAn4YOT4YOU4YOZ4YOd4YOg4YOQ4YOi4YOd4YOg4YOU4YOR4YOYJyxcbiAgJ2RlZmF1bHQtdmFsdWUnOiAn4YOc4YOQ4YOS4YOj4YOa4YOY4YOh4YOu4YOb4YOU4YOV4YOYIOGDm+GDnOGDmOGDqOGDleGDnOGDlOGDmuGDneGDkeGDkCcsXG4gICdkZWZpbmVkLWluJzogJ+GDkOGDpuGDrOGDlOGDoOGDmOGDmuGDmOGDkCcsXG4gIGRlcGVuZGVuY2llczogJ+GDk+GDkOGDm+GDneGDmeGDmOGDk+GDlOGDkeGDo+GDmuGDlOGDkeGDlOGDkeGDmCcsXG4gIGRlcHJlY2F0ZWQ6ICfhg5vhg53hg6vhg5Xhg5Thg5rhg5Thg5Hhg6Phg5rhg5jhg5AnLFxuICBkZXNjcmlwdGlvbjogJ+GDkOGDpuGDrOGDlOGDoOGDkCcsXG4gIGRpcmVjdGl2ZTogJ+GDk+GDmOGDoOGDlOGDpeGDouGDmOGDleGDkCcsXG4gIGRpcmVjdGl2ZXM6ICfhg5Phg5jhg6Dhg5Thg6Xhg6Lhg5jhg5Xhg5Thg5Hhg5gnLFxuICAnZG9tIHRyZWUnOiAnRE9NIOGDruGDlCcsXG4gIGVudGl0aWVzOiAn4YOh4YOj4YOR4YOY4YOU4YOl4YOi4YOU4YOR4YOYJyxcbiAgZW50aXR5OiAn4YOh4YOj4YOR4YOY4YOU4YOl4YOi4YOYJyxcbiAgZW50cnljb21wb25lbnRzOiAn4YOo4YOU4YOh4YOV4YOa4YOY4YOhIOGDmeGDneGDm+GDnuGDneGDnOGDlOGDnOGDouGDlOGDkeGDmCcsXG4gIGVudW1lcmF0aW9uczogJ+GDqeGDkOGDm+GDneGDl+GDleGDmuGDlOGDkeGDmCcsXG4gIGVudW1zOiAn4YOU4YOc4YOQ4YOb4YOU4YOR4YOYJyxcbiAgZXhhbXBsZTogJ+GDm+GDkOGDkuGDkOGDmuGDmOGDl+GDmCcsXG4gIGV4YW1wbGVzOiAn4YOb4YOQ4YOS4YOQ4YOa4YOY4YOX4YOU4YOR4YOYJyxcbiAgZXhwb3J0czogJ+GDlOGDpeGDoeGDnuGDneGDoOGDouGDmCcsXG4gIGV4dGVuZHM6ICfhg5Dhg5Lhg6Dhg6vhg5Thg5rhg5Thg5Hhg6EnLFxuICBmaWxlOiAn4YOk4YOQ4YOY4YOa4YOYJyxcbiAgZnVuY3Rpb25zOiAn4YOk4YOj4YOc4YOl4YOq4YOY4YOU4YOR4YOYJyxcbiAgJ2dlbmVyYXRlZC11c2luZyc6ICfhg5Phg53hg5nhg6Phg5vhg5Thg5zhg6Lhg5Dhg6rhg5jhg5Ag4YOT4YOQ4YOS4YOU4YOc4YOU4YOg4YOY4YOg4YOT4YOQIOGDkuGDkOGDm+GDneGDp+GDlOGDnOGDlOGDkeGDmOGDlycsXG4gICdnZXR0aW5nLXN0YXJ0ZWQnOiAn4YOV4YOY4YOs4YOn4YOU4YOR4YOXJyxcbiAgZ3VhcmQ6ICfhg5vhg6rhg5Xhg5Thg5rhg5gnLFxuICBndWFyZHM6ICfhg5vhg6rhg5Xhg5Thg5rhg5Thg5Hhg5gnLFxuICBob3N0YmluZGluZ3M6ICfhg7Dhg53hg6Hhg6Lhg5jhg6Eg4YOT4YOQ4YOb4YOQ4YOZ4YOQ4YOV4YOo4YOY4YOg4YOU4YOR4YOa4YOU4YOR4YOYJyxcbiAgaG9zdGRpcmVjdGl2ZXM6ICfhg7Dhg53hg6Hhg6Lhg5jhg6Eg4YOT4YOY4YOg4YOU4YOl4YOi4YOY4YOV4YOU4YOR4YOYJyxcbiAgaG9zdGxpc3RlbmVyczogJ+GDsOGDneGDoeGDouGDmOGDoSDhg5vhg6Hhg5vhg5Thg5zhg5Thg5rhg5Thg5Hhg5gnLFxuICAnaHRtbC1lbGVtZW50JzogJ0h0bWwg4YOU4YOa4YOU4YOb4YOU4YOc4YOi4YOYJyxcbiAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdIdG1sIOGDlOGDmuGDlOGDm+GDlOGDnOGDouGDmCDhg5Phg5jhg6Dhg5Thg6Xhg6Lhg5jhg5Xhg5jhg5cnLFxuICBpZGVudGlmaWVyOiAn4YOY4YOT4YOU4YOc4YOi4YOY4YOk4YOY4YOZ4YOQ4YOi4YOd4YOg4YOYJyxcbiAgaW1wbGVtZW50czogJ+GDkOGDruGDneGDoOGDquGDmOGDlOGDmuGDlOGDkeGDoScsXG4gIGltcG9ydHM6ICfhg5jhg5vhg57hg53hg6Dhg6Lhg5gnLFxuICBpbmRleDogJ+GDmOGDnOGDk+GDlOGDpeGDoeGDmCcsXG4gIGluZGV4YWJsZTogJ+GDmOGDnOGDk+GDlOGDpeGDoeGDmOGDoOGDlOGDkeGDkOGDk+GDmCcsXG4gIGluZm86ICfhg5jhg5zhg6Thg53hg6Dhg5vhg5Dhg6rhg5jhg5AnLFxuICAnaW5oZXJpdGVkLWZyb20nOiAn4YOb4YOU4YOb4YOZ4YOV4YOY4YOT4YOg4YOU4YOd4YOR4YOY4YOXIOGDm+GDmOGDmOGDpuGDnScsXG4gIGluamVjdGFibGU6ICfhg5jhg5zhg5Thg6Xhg6rhg5jhg5AnLFxuICBpbmplY3RhYmxlczogJ+GDoeGDkOGDmOGDnOGDlOGDpeGDquGDmOGDnSDhg6Hhg5Dhg6jhg6Phg5Dhg5rhg5Thg5Hhg5Thg5Hhg5gnLFxuICBpbnB1dHM6ICfhg6jhg5Thg6fhg5Xhg5Dhg5zhg5Thg5Hhg5gnLFxuICBpbnRlcmNlcHRvcnM6ICfhg6nhg5Dhg5vhg63hg6Dhg5Thg5rhg5Thg5Hhg5gnLFxuICBpbnRlcmZhY2U6ICfhg5jhg5zhg6Lhg5Thg6Dhg6Thg5Thg5jhg6Hhg5gnLFxuICBpbnRlcmZhY2VzOiAn4YOY4YOc4YOi4YOU4YOg4YOk4YOU4YOY4YOh4YOU4YOR4YOYJyxcbiAgbGVnZW5kOiAn4YOa4YOU4YOS4YOU4YOc4YOT4YOQJyxcbiAgbGljZW5zZTogJ+GDmuGDmOGDquGDlOGDnOGDluGDmOGDkCcsXG4gIGxpbmVzOiAn4YOu4YOQ4YOW4YOU4YOR4YOYJyxcbiAgbWV0YWRhdGE6ICfhg5vhg5Thg6Lhg5Dhg5vhg53hg5zhg5Dhg6rhg5Thg5vhg5Thg5Hhg5gnLFxuICBtZXRob2RzOiAn4YOb4YOU4YOX4YOd4YOT4YOU4YOR4YOYJyxcbiAgbWlzY2VsbGFuZW91czogJ+GDoeGDruGDleGDkOGDk+GDkOGDoeGDruGDleGDkCcsXG4gIG1vZHVsZTogJ+GDm+GDneGDk+GDo+GDmuGDmCcsXG4gIG1vZHVsZXM6ICfhg5vhg53hg5Phg6Phg5rhg5Thg5Hhg5gnLFxuICBuYW1lOiAn4YOh4YOQ4YOu4YOU4YOa4YOU4YOR4YOYJyxcbiAgbm86ICfhg5Dhg6Dhg5AnLFxuICAnbm8tZ3JhcGgnOiAn4YOS4YOg4YOQ4YOk4YOYIOGDkOGDoCDhg5Dhg6Dhg5jhg6Eg4YOu4YOU4YOa4YOb4YOY4YOh4YOQ4YOs4YOV4YOT4YOd4YOb4YOYLicsXG4gICduby1pZnJhbWUnOiAn4YOX4YOl4YOV4YOU4YOc4YOhIOGDkeGDoOGDkOGDo+GDluGDlOGDoOGDoSDhg5Dhg6Ag4YOQ4YOl4YOV4YOhIGlmcmFtZXMt4YOY4YOhIOGDm+GDruGDkOGDoOGDk+GDkOGDreGDlOGDoOGDkC4nLFxuICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ+GDkOGDoCDhg5Dhg6Dhg5jhg6Eg4YOo4YOU4YOh4YOQ4YOR4YOQ4YOb4YOY4YOh4YOYIOGDqOGDlOGDk+GDlOGDkuGDlOGDkeGDmCcsXG4gICduby1zdmcnOiAn4YOX4YOl4YOV4YOU4YOc4YOhIOGDkeGDoOGDkOGDo+GDluGDlOGDoOGDoSDhg5Dhg6Ag4YOQ4YOl4YOV4YOhIFNWRyDhg5vhg67hg5Dhg6Dhg5Phg5Dhg63hg5Thg6Dhg5AnLFxuICBvcHRpb25hbDogJ+GDoeGDo+GDoOGDleGDmOGDmuGDmOGDoeGDkOGDm+GDlOGDkeGDoCcsXG4gIG91dHB1dHM6ICfhg6jhg5Thg5Phg5Thg5Lhg5Thg5Hhg5gnLFxuICBvdmVydmlldzogJ+GDm+GDmOGDm+GDneGDruGDmOGDmuGDleGDkCcsXG4gIHBhcmFtZXRlcnM6ICfhg57hg5Dhg6Dhg5Dhg5vhg5Thg6Lhg6Dhg5Thg5Hhg5gnLFxuICAncGVlci1kZXBlbmRlbmNpZXMnOiAn4YOX4YOQ4YOc4YOQ4YOi4YOd4YOa4YOU4YOR4YOX4YOQ4YOcIOGDk+GDkOGDm+GDneGDmeGDmOGDk+GDlOGDkeGDo+GDmuGDlOGDkeGDlOGDkeGDmCcsXG4gIHBpcGU6ICfhg5vhg5jhg5rhg5gnLFxuICBwaXBlczogJ+GDm+GDmOGDmuGDlOGDkeGDmCcsXG4gIHByZWZpeDogJ+GDnuGDoOGDlOGDpOGDmOGDpeGDoeGDmCcsXG4gIHByb3BlcnRpZXM6ICfhg5fhg5Xhg5jhg6Hhg5Thg5Hhg5AnLFxuICBwcm92aWRlcnM6ICfhg57hg6Dhg53hg5Xhg5Dhg5jhg5Phg5Thg6Dhg5gnLFxuICBwdXJlOiAn4YOs4YOb4YOY4YOc4YOT4YOQJyxcbiAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgcmVxdWlyZWQ6ICfhg5Dhg6Phg6rhg5jhg5rhg5Thg5Hhg5Thg5rhg5gnLFxuICByZXNldDogJ+GDkuGDkOGDk+GDkOGDouGDleGDmOGDoOGDl+GDleGDkCcsXG4gICdyZXN1bHRzLW1hdGNoaW5nJzogJ+GDqOGDlOGDk+GDlOGDkuGDlOGDkeGDmCDhg5Thg5vhg5fhg67hg5Xhg5Thg5Xhg5AnLFxuICByZXR1cm5zOiAn4YOR4YOg4YOj4YOc4YOT4YOU4YOR4YOQJyxcbiAgcm91dGU6ICfhg5vhg5Dhg6Dhg6jhg6Dhg6Phg6Lhg5gnLFxuICByb3V0ZXM6ICfhg5vhg5Dhg6Dhg6jhg6Dhg6Phg6Lhg5Thg5Hhg5gnLFxuICBzY2hlbWFzOiAn4YOh4YOl4YOU4YOb4YOU4YOR4YOYJyxcbiAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICfhg5Phg5Dhg6zhg5Thg6Dhg5Qg4YOb4YOd4YOh4YOQ4YOr4YOU4YOR4YOc4YOQ4YOTJyxcbiAgc2VsZWN0b3I6ICfhg6Hhg5Thg5rhg5Thg6Xhg6Lhg53hg6Dhg5gnLFxuICBzaWduYXR1cmU6ICfhg67hg5Thg5rhg5vhg53hg6zhg5Thg6Dhg5AnLFxuICBzb3VyY2U6ICfhg6zhg6fhg5Dhg6Dhg50nLFxuICBzdGFuZGFsb25lOiAn4YOT4YOQ4YOb4YOd4YOj4YOZ4YOY4YOT4YOU4YOR4YOU4YOa4YOYJyxcbiAgc3RhdGVtZW50czogJ+GDkuGDkOGDnOGDquGDruGDkOGDk+GDlOGDkeGDlOGDkeGDmCcsXG4gIHN0eWxlczogJ+GDoeGDouGDmOGDmuGDlOGDkeGDmCcsXG4gIHRlbXBsYXRlOiAn4YOo4YOQ4YOR4YOa4YOd4YOc4YOYJyxcbiAgdHlwZTogJ+GDouGDmOGDnuGDmCcsXG4gICd0eXBlLWFsaWFzZXMnOiAn4YOb4YOU4YOi4YOh4YOQ4YOu4YOU4YOa4YOY4YOhIOGDouGDmOGDnuGDmCcsXG4gICd0eXBlLXBhcmFtZXRlcnMnOiAn4YOe4YOQ4YOg4YOQ4YOb4YOU4YOi4YOg4YOU4YOR4YOY4YOhIOGDouGDmOGDnuGDmCcsXG4gIHR5cGVzOiAn4YOi4YOY4YOe4YOU4YOR4YOYJyxcbiAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICfhg6Phg6Hhg5Dhg67hg5Thg5rhg50g4YOX4YOV4YOY4YOh4YOU4YOR4YOQJyxcbiAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICfhg5Thg6Dhg5fhg5Thg6Phg5rhg5gg4YOi4YOU4YOh4YOi4YOY4YOhIOGDkuGDkOGDqOGDo+GDpeGDlOGDkeGDkCcsXG4gIHZhbHVlOiAn4YOb4YOc4YOY4YOo4YOV4YOc4YOU4YOa4YOd4YOR4YOQJyxcbiAgdmFyaWFibGVzOiAn4YOq4YOV4YOa4YOQ4YOT4YOU4YOR4YOYJyxcbiAgeWVzOiAn4YOZ4YOYJyxcbiAgem9vbWluOiAn4YOb4YOY4YOQ4YOu4YOa4YOd4YOV4YOU4YOR4YOQJyxcbiAgem9vbW91dDogJ+GDm+GDkOGDoeGDqOGDouGDkOGDkeGDmOGDoOGDlOGDkeGDkCdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fS09fS1IgPSB7XG4gICAgYWNjZXNzb3JzOiAn7KCR6re87J6QJyxcbiAgICBhcmd1bWVudHM6ICfsnbjsiJgnLFxuICAgIGJvb3RzdHJhcDogJ0Jvb3RzdHJhcCcsXG4gICAgYnJhbmNoZXM6ICfruIzrnpzsuZgnLFxuICAgIGJyb3dzZTogJ+2DkOyDiScsXG4gICAgY2xhc3NlOiAn7YG0656Y7IqkJyxcbiAgICBjbGFzc2VzOiAn7YG0656Y7IqkJyxcbiAgICBjb21wb25lbnQ6ICfsu7Ttj6zrhIztirgnLFxuICAgIGNvbXBvbmVudHM6ICfsu7Ttj6zrhIztirgnLFxuICAgIGNvbnN0cnVjdG9yOiAn7IOd7ISx7J6QJyxcbiAgICBjb250cm9sbGVyczogJ+y7qO2KuOuhpOufrCcsXG4gICAgY29udHJvbGxlcjogJ+y7qO2KuOuhpOufrCcsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAn66y47IScIOy7pOuyhOumrOyngCcsXG4gICAgZGVjbGFyYXRpb25zOiAn7ISg7Ja4JyxcbiAgICBkZWNvcmF0b3JzOiAn642w7L2U66CI7J207YSwJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICfquLDrs7gg6rCSJyxcbiAgICAnZGVmaW5lZC1pbic6ICfri6TsnYzsl5Ag7KCV7J2Y65CoJyxcbiAgICBkZXBlbmRlbmNpZXM6ICfsnZjsobTshLEnLFxuICAgIGRlcHJlY2F0ZWQ6ICfruYTstpTsspwnLFxuICAgIGRlc2NyaXB0aW9uOiAn7ISk66qFJyxcbiAgICBkaXJlY3RpdmU6ICdEaXJlY3RpdmUnLFxuICAgIGRpcmVjdGl2ZXM6ICdEaXJlY3RpdmVzJyxcbiAgICAnZG9tIHRyZWUnOiAn64+UIO2KuOumrCcsXG4gICAgZW50aXRpZXM6ICfsl5Tti7Dti7AnLFxuICAgIGVudGl0eTogJ+yLpOyerCcsXG4gICAgZW50cnljb21wb25lbnRzOiAnRW50cnlDb21wb25lbnRzJyxcbiAgICBlbnVtZXJhdGlvbnM6ICfsl7TqsbAnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICfsmIjsi5wnLFxuICAgIGV4YW1wbGVzOiAn7JiIJyxcbiAgICBleHBvcnRzOiAn64K067O064K06riwJyxcbiAgICBleHRlbmRzOiAnRXh0ZW5kcycsXG4gICAgZmlsZTogJ+2MjOydvCcsXG4gICAgZnVuY3Rpb25zOiAn7ZWo7IiYJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ+ydtCDrrLjshJzripQg64uk7J2M7J2EIOydtOyaqe2VmOyXrCDsg53shLHrkJjsl4jsirXri4jri6QnLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAn7Iuc7J6R7ZWY6riwJyxcbiAgICBndWFyZDogJ+qwgOuTnCcsXG4gICAgZ3VhcmRzOiAn6rCA65OcJyxcbiAgICBob3N0YmluZGluZ3M6ICdIb3N0QmluZGluZ3MnLFxuICAgIGhvc3RkaXJlY3RpdmVzOiAnSG9zdERpcmVjdGl2ZXMnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0TGlzdGVuZXJzJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0hUTUwg7JqU7IaMJyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ+yngOyLnOyWtOqwgCDsnojripQgSFRNTCDsmpTshownLFxuICAgIGlkZW50aWZpZXI6ICfsi53rs4TsnpAnLFxuICAgIGltcGxlbWVudHM6ICfqtaztmIQnLFxuICAgIGltcG9ydHM6ICfqsIDsoLjsmKTquLAnLFxuICAgIGluZGV4OiAn7IOJ7J24JyxcbiAgICBpbmRleGFibGU6ICdJbmRleGFibGUnLFxuICAgIGluZm86ICfsoJXrs7QnLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICfri6TsnYzsl5DshJwg7IOB7IaN65CoJyxcbiAgICBpbmplY3RhYmxlOiAnSW5qZWN0YWJsZScsXG4gICAgaW5qZWN0YWJsZXM6ICdJbmplY3RhYmxlcycsXG4gICAgaW5wdXRzOiAn7J6F66ClJyxcbiAgICBpbnRlcmNlcHRvcnM6ICdJbnRlcmNlcHRvcnMnLFxuICAgIGludGVyZmFjZTogJ+yduO2EsO2OmOydtOyKpCcsXG4gICAgaW50ZXJmYWNlczogJ+yduO2EsO2OmOydtOyKpCcsXG4gICAgbGVnZW5kOiAn67KU66GAJyxcbiAgICBsaWNlbnNlOiAn65287J207ISg7IqkJyxcbiAgICBsaW5lczogJ+ykhCcsXG4gICAgbWV0YWRhdGE6ICfrqZTtg4DrjbDsnbTthLAnLFxuICAgIG1ldGhvZHM6ICfrqZTshozrk5wnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICfquLDtg4AnLFxuICAgIG1vZHVsZTogJ+uqqOuTiCcsXG4gICAgbW9kdWxlczogJ+uqqOuTiCcsXG4gICAgbmFtZTogJ+ydtOumhCcsXG4gICAgbm86ICfslYTri4jsmKQnLFxuICAgICduby1ncmFwaCc6ICfsgqzsmqntlaAg7IiYIOyeiOuKlCDqt7jrnpjtlITqsIAg7JeG7Iq164uI64ukLicsXG4gICAgJ25vLWlmcmFtZSc6ICfsgqzsmqnspJHsnbgg67iM65287Jqw7KCA6rCAIGlmcmFtZeydhCDsp4Dsm5DtlZjsp4Ag7JWK7Iq164uI64ukJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ+qygOyDiSDqsrDqs7zqsIAg7JeG7Iq164uI64ukJyxcbiAgICAnbm8tc3ZnJzogJ+u4jOudvOyasOyggOqwgCBTVkfrpbwg7KeA7JuQ7ZWY7KeAIOyViuyKteuLiOuLpCcsXG4gICAgb3B0aW9uYWw6ICfshKDtg53soIEnLFxuICAgIG91dHB1dHM6ICfqsrDqs7zrrLwnLFxuICAgIG92ZXJ2aWV3OiAn6rCc7JqUJyxcbiAgICBwYXJhbWV0ZXJzOiAn66ek6rCc67OA7IiYJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAn7IOB7Zi4IOydmOyhtOyEsScsXG4gICAgcGlwZTogJ+2MjOydtO2UhCcsXG4gICAgcGlwZXM6ICftjIzsnbTtlIQnLFxuICAgIHByZWZpeDogJ+ygkeuRkOyWtCcsXG4gICAgcHJvcGVydGllczogJ+yGjeyEsScsXG4gICAgcHJvdmlkZXJzOiAn7KCc6rO17J6QJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXF1aXJlZDogJ+2VhOyImOydmCcsXG4gICAgcmVzZXQ6ICfstIjquLDtmZQnLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ+qwnOydmCDqsrDqs7zqsIAg7J287LmY7ZaI7Iq164uI64ukJyxcbiAgICByZXR1cm5zOiAn67CY7ZmYJyxcbiAgICByb3V0ZTogJ1JvdXRlJyxcbiAgICByb3V0ZXM6ICdSb3V0ZXMnLFxuICAgIHNjaGVtYXM6ICfsiqTtgqTrp4gnLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAn6rKA7IOJ7Ja0IOyeheugpScsXG4gICAgc2VsZWN0b3I6ICfshKDtg53snpAnLFxuICAgIHNpZ25hdHVyZTogJ1NpZ25hdHVyZScsXG4gICAgc291cmNlOiAn7Lac7LKYJyxcbiAgICBzdGFuZGFsb25lOiAnU3RhbmRhbG9uZScsXG4gICAgc3RhdGVtZW50czogJ1N0YXRlbWVudHMnLFxuICAgIHN0eWxlczogJ+yKpO2DgOydvCcsXG4gICAgdGVtcGxhdGU6ICfso7ztmJUnLFxuICAgIHR5cGU6ICftg4DsnoUnLFxuICAgICd0eXBlLWFsaWFzZXMnOiAn7YOA7J6FIOuzhOy5rScsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICftg4DsnoUg66ek6rCcIOuzgOyImCcsXG4gICAgdHlwZXM6ICftg4DsnoUnLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAn7J2166qFIOyGjeyEsScsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICfri6jsnIQg7YWM7Iqk7Yq4IOy7pOuyhOumrOyngCcsXG4gICAgdmFsdWU6ICfqsJInLFxuICAgIHZhcmlhYmxlczogJ+uzgOyImCcsXG4gICAgeWVzOiAn64SkJyxcbiAgICB6b29taW46ICftmZXrjIAnLFxuICAgIHpvb21vdXQ6ICfstpXshownXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX05MX05MID0ge1xuICAgIGFjY2Vzc29yczogJ0FjY2Vzc29ycycsXG4gICAgYXJndW1lbnRzOiAnQXJndW1lbnRlbicsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ0JyYW5jaGVzJyxcbiAgICBicm93c2U6ICdCcm93c2UnLFxuICAgIGNsYXNzZTogJ0tsYXNzZScsXG4gICAgY2xhc3NlczogJ0tsYXNzZW4nLFxuICAgIGNvbXBvbmVudDogJ0NvbXBvbmVudCcsXG4gICAgY29tcG9uZW50czogJ0NvbXBvbmVudGVuJyxcbiAgICBjb25zdHJ1Y3RvcjogJ0NvbnN0cnVjdG9yJyxcbiAgICBjb250cm9sbGVyczogJ0NvbnRyb2xsZXJzJyxcbiAgICBjb250cm9sbGVyOiAnQ29udHJvbGxlcicsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAnRG9jdW1lbnRhdGllIGNvdmVyYWdlJyxcbiAgICBkZWNsYXJhdGlvbnM6ICdEZWNsYXJhdGllcycsXG4gICAgZGVjb3JhdG9yczogJ0RlY29yYXRvcnMnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ0RlZmF1bHQgd2FhcmRlJyxcbiAgICAnZGVmaW5lZC1pbic6ICdHZWRlZmluaWVlcmQgaW4nLFxuICAgIGRlcGVuZGVuY2llczogJ0RlcGVuZGVuY2llcycsXG4gICAgZGVwcmVjYXRlZDogJ1Zlcm91ZGVyZCcsXG4gICAgZGVzY3JpcHRpb246ICdPbXNjaHJpanZpbmcnLFxuICAgIGRpcmVjdGl2ZTogJ0RpcmVjdGl2ZScsXG4gICAgZGlyZWN0aXZlczogJ0RpcmVjdGl2ZXMnLFxuICAgICdkb20gdHJlZSc6ICdET00gYm9vbScsXG4gICAgZW50aXRpZXM6ICdFbnRpdGVpdGVuJyxcbiAgICBlbnRpdHk6ICdFbnRpdGVpdCcsXG4gICAgZW50cnljb21wb25lbnRzOiAnRW50cnlDb21wb25lbnRzJyxcbiAgICBlbnVtZXJhdGlvbnM6ICdFbnVtZXJhdGlvbnMnLFxuICAgIGVudW1zOiAnRW51bXMnLFxuICAgIGV4YW1wbGU6ICdWb29yYmVlbGQnLFxuICAgIGV4YW1wbGVzOiAnVm9vcmJlZWxkZW4nLFxuICAgIGV4cG9ydHM6ICdFeHBvcnRzJyxcbiAgICBleHRlbmRzOiAnRXh0ZW5kcycsXG4gICAgZmlsZTogJ0Jlc3RhbmQnLFxuICAgIGZ1bmN0aW9uczogJ0Z1bmN0aWVzJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0RvY3VtZW50YXRpZSBnZWdlbmVyZWVkIG1ldCcsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICdBYW4gZGUgc2xhZycsXG4gICAgZ3VhcmQ6ICdHdWFyZCcsXG4gICAgZ3VhcmRzOiAnR3VhcmRzJyxcbiAgICBob3N0YmluZGluZ3M6ICdIb3N0QmluZGluZ3MnLFxuICAgIGhvc3RkaXJlY3RpdmVzOiAnSG9zdERpcmVjdGl2ZXMnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0TGlzdGVuZXJzJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0h0bWwgZWxlbWVudCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdIdG1sIGVsZW1lbnQgbWV0IGRpcmVjdGl2ZScsXG4gICAgaWRlbnRpZmllcjogJ0lkZW50aWZpZXInLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnRlZXJ0JyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0cycsXG4gICAgaW5kZXg6ICdJbmRleCcsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXhlZXJiYWFyJyxcbiAgICBpbmZvOiAnSW5mb3JtYXRpZScsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ0luaGVyaXRlZCB2YW4nLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdJbnB1dHMnLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9ycycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmYWNlcycsXG4gICAgbGVnZW5kOiAnTGVnZW5kYScsXG4gICAgbGljZW5zZTogJ0xpY2VudGllJyxcbiAgICBsaW5lczogJ1JlZ2VscycsXG4gICAgbWV0YWRhdGE6ICdNZXRhZGF0YScsXG4gICAgbWV0aG9kczogJ01ldGhvZHMnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdEaXZlcnNlbicsXG4gICAgbW9kdWxlOiAnTW9kdWxlJyxcbiAgICBtb2R1bGVzOiAnTW9kdWxlcycsXG4gICAgbmFtZTogJ05hYW0nLFxuICAgIG5vOiAnTmVlJyxcbiAgICAnbm8tZ3JhcGgnOiAnR2VlbiBkaWFncmFtIGJlc2NoaWtiYWFyLicsXG4gICAgJ25vLWlmcmFtZSc6ICdVdyBicm93c2VyIG9uZGVyc3RldW5kIGdlZW4gaWZyYW1lcy4nLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnR2VlbiBvdmVyZWVua29tZW5kZSByZXN1bHRhdGVuJyxcbiAgICAnbm8tc3ZnJzogJ1V3IGJyb3dzZXIgb25kZXJzdGV1bmQgZ2VlbiBTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3B0aW9uZWVsJyxcbiAgICBvdXRwdXRzOiAnT3V0cHV0cycsXG4gICAgb3ZlcnZpZXc6ICdPdmVyemljaHQnLFxuICAgIHBhcmFtZXRlcnM6ICdQYXJhbWV0ZXJzJyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnUGVlciBkZXBlbmRlbmNpZXMnLFxuICAgIHBpcGU6ICdQaXBlJyxcbiAgICBwaXBlczogJ1BpcGVzJyxcbiAgICBwcmVmaXg6ICdWb29ydm9lZ3NlbCcsXG4gICAgcHJvcGVydGllczogJ1Byb3BlcnRpZXMnLFxuICAgIHByb3ZpZGVyczogJ1Byb3ZpZGVycycsXG4gICAgcHVyZTogJ1B1dXInLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVxdWlyZWQ6ICdWZXJlaXN0JyxcbiAgICByZXNldDogJ1Jlc2V0JyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICdvdmVyZWVua29tZW5kZSByZXN1bHRhdGVuJyxcbiAgICByZXR1cm5zOiAnUmV0dXJucycsXG4gICAgcm91dGU6ICdSb3V0ZScsXG4gICAgcm91dGVzOiAnUm91dGVzJyxcbiAgICBzY2hlbWFzOiBcIlNjaGVtYSdzXCIsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdUeXBlIG9tIHRlIHpvZWtlbicsXG4gICAgc2VsZWN0b3I6ICdTZWxlY3RvcicsXG4gICAgc2lnbmF0dXJlOiAnSGFuZHRla2VuaW5nJyxcbiAgICBzb3VyY2U6ICdCcm9uJyxcbiAgICBzdGFuZGFsb25lOiAnU3RhbmRhbG9uZScsXG4gICAgc3RhdGVtZW50czogJ1N0YXRlbWVudHMnLFxuICAgIHN0eWxlczogJ1N0aWpsZW4nLFxuICAgIHRlbXBsYXRlOiAnU2phYmxvb24nLFxuICAgIHR5cGU6ICdUeXBlJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ1R5cGUgYWxpYXNzZW4nLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAnVHlwZSBwYXJhbWV0ZXJzJyxcbiAgICB0eXBlczogJ1R5cGVzJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ05hYW1sb3plIHByb3BlcnR5JyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ1VuaXQgdGVzdCBjb3ZlcmFnZScsXG4gICAgdmFsdWU6ICdXYWFyZGUnLFxuICAgIHZhcmlhYmxlczogJ1ZhcmlhYmVsZW4nLFxuICAgIHllczogJ0phJyxcbiAgICB6b29taW46ICdab29tIGluJyxcbiAgICB6b29tb3V0OiAnWm9vbSB1aXQnXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX1BMX1BMID0ge1xuICAgIGFjY2Vzc29yczogJ0FrY2Vzb3InLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50eScsXG4gICAgYm9vdHN0cmFwOiAnVXJ1Y2hvbWllbmllJyxcbiAgICBicmFuY2hlczogJ0dhxYLEmXppZScsXG4gICAgYnJvd3NlOiAnUHJ6ZWdsxIVkYWonLFxuICAgIGNsYXNzZTogJ0tsYXNhJyxcbiAgICBjbGFzc2VzOiAnS2xhc3knLFxuICAgIGNvbXBvbmVudDogJ0tvbXBvbmVudCcsXG4gICAgY29tcG9uZW50czogJ0tvbXBvbmVudHknLFxuICAgIGNvbnN0cnVjdG9yOiAnS29uc3RydWt0b3InLFxuICAgIGNvbnRyb2xsZXJzOiAnS29udHJvbGVyeScsXG4gICAgY29udHJvbGxlcjogJ0tvbnRyb2xlcicsXG4gICAgJ2NvdmVyYWdlLXBhZ2UtdGl0bGUnOiAnUG9rcnljaWUgZG9rdW1lbnRhY2rEhScsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVrbGFyYWNqZScsXG4gICAgZGVjb3JhdG9yczogJ0Rla29yYXRvcnknLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ0RvbXnFm2xuYSB3YXJ0b8WbxIcnLFxuICAgICdkZWZpbmVkLWluJzogJ1pkZWZpbmlvd2FuZSB3JyxcbiAgICBkZXBlbmRlbmNpZXM6ICdCaWJsaW90ZWtpJyxcbiAgICBkZXByZWNhdGVkOiAnUHJ6ZXN0YXJ6YcWCZScsXG4gICAgZGVzY3JpcHRpb246ICdPcGlzJyxcbiAgICBkaXJlY3RpdmU6ICdEeXJla3R5d2EnLFxuICAgIGRpcmVjdGl2ZXM6ICdEeXJla3R5d3knLFxuICAgICdkb20gdHJlZSc6ICdET00gZHJ6ZXdvJyxcbiAgICBlbnRpdGllczogJ1BvZG1pb3R5JyxcbiAgICBlbnRpdHk6ICdQb2RtaW90JyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeUNvbXBvbmVudHMnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcmFjamUnLFxuICAgIGVudW1zOiAnRW51bXknLFxuICAgIGV4YW1wbGU6ICdQcnp5a8WCYWQnLFxuICAgIGV4YW1wbGVzOiAnUHJ6eWvFgmFkeScsXG4gICAgZXhwb3J0czogJ0V4cG9ydHknLFxuICAgIGV4dGVuZHM6ICdSb3pzemVyemEnLFxuICAgIGZpbGU6ICdQbGlrJyxcbiAgICBmdW5jdGlvbnM6ICdGdW5rY2plJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0Rva3VtZW50YWNqYSB3eWdlbmVyb3dhbmEgcHJ6eSB1xbx5Y2l1JyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ1N0YXJ0JyxcbiAgICBndWFyZDogJ0d1YXJkJyxcbiAgICBndWFyZHM6IFwiR3VhcmQneVwiLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5naScsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICdIb3N0RGlyZWN0aXZlcycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnknLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSHRtbCBlbGVtZW50JyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0h0bWwgZWxlbWVudCB6IGR5cmVrdHl3xIUnLFxuICAgIGlkZW50aWZpZXI6ICdJZGVudHlmaWthdG9yJyxcbiAgICBpbXBsZW1lbnRzOiAnSW1wbGVtZW50dWplJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0dWplJyxcbiAgICBpbmRleDogJ0luZGVrcycsXG4gICAgaW5kZXhhYmxlOiAnSW5kZWtzb3dhbnknLFxuICAgIGluZm86ICdJbmZvcm1hdGllJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnRHppZWR6aWN6eSB6JyxcbiAgICBpbmplY3RhYmxlOiAnSW5qZWN0YWJsZScsXG4gICAgaW5qZWN0YWJsZXM6ICdJbmplY3RhYmxlcycsXG4gICAgaW5wdXRzOiAnSW5wdXR5JyxcbiAgICBpbnRlcmNlcHRvcnM6ICdJbnRlcmNlcHRvcnknLFxuICAgIGludGVyZmFjZTogJ0ludGVyZmVqcycsXG4gICAgaW50ZXJmYWNlczogJ0ludGVyZmVqc3knLFxuICAgIGxlZ2VuZDogJ0xlZ2VuZGEnLFxuICAgIGxpY2Vuc2U6ICdMaWNlbmNqYScsXG4gICAgbGluZXM6ICdMaW5pZScsXG4gICAgbWV0YWRhdGE6ICdNZXRhZGFuZScsXG4gICAgbWV0aG9kczogJ01ldG9keScsXG4gICAgbWlzY2VsbGFuZW91czogJ1LDs8W8bmUnLFxuICAgIG1vZHVsZTogJ01vZHXFgicsXG4gICAgbW9kdWxlczogJ01vZHXFgnknLFxuICAgIG5hbWU6ICdOYXp3YScsXG4gICAgbm86ICdOaWUnLFxuICAgICduby1ncmFwaCc6ICdHcmFmIG5pZWRvc3TEmXBueS4nLFxuICAgICduby1pZnJhbWUnOiBcIlR3b2phIHByemVnbMSFZGFya2EgbmllIHdzcGllcmEgaWZyYW1lJ8Ozdy5cIixcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ0JyYWsgcGFzdWrEhWN5Y2ggd3luaWvDs3cnLFxuICAgICduby1zdmcnOiAnVHdvamEgcHJ6ZWdsxIVkYXJrYSBuaWUgd3NwaWVyYSBTVkcnLFxuICAgIG9wdGlvbmFsOiAnT3Bjam9uYWxuZScsXG4gICAgb3V0cHV0czogJ091dHB1dHknLFxuICAgIG92ZXJ2aWV3OiAnUHJ6ZWdsxIVkJyxcbiAgICBwYXJhbWV0ZXJzOiAnUGFyYW1ldHJ5JyxcbiAgICAncGVlci1kZXBlbmRlbmNpZXMnOiAnQmlibGlvdGVraSB6YWxlxbxuZScsXG4gICAgcGlwZTogJ1BpcGUnLFxuICAgIHBpcGVzOiBcIlBpcGUneVwiLFxuICAgIHByZWZpeDogJ1ByZWZpa3MnLFxuICAgIHByb3BlcnRpZXM6ICdXxYLEhcWbY2l3b8WbY2knLFxuICAgIHByb3ZpZGVyczogJ0Rvc3RhcmN6eWNpZWxlJyxcbiAgICBwdXJlOiAnQ3p5c3R5JyxcbiAgICByZWFkbWU6ICdSRUFETUUnLFxuICAgIHJlcXVpcmVkOiAnV3ltYWdhbnknLFxuICAgIHJlc2V0OiAnUmVzZXQnLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ3Bhc3VqxIVjeWNoIHd5bmlrw7N3JyxcbiAgICByZXR1cm5zOiAnWndyYWNhJyxcbiAgICByb3V0ZTogJ1JvdXRlJyxcbiAgICByb3V0ZXM6IFwiUm91dGUneVwiLFxuICAgIHNjaGVtYXM6ICdTY2hlbWF0eScsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdXcHJvd2FkxbogdGVrc3Qgd3lzenVraXdhbmlhJyxcbiAgICBzZWxlY3RvcjogJ1NlbGVrdG9yJyxcbiAgICBzaWduYXR1cmU6ICdQb2RwaXMnLFxuICAgIHNvdXJjZTogJ1NvdXJjZScsXG4gICAgc3RhbmRhbG9uZTogJ1N0YW5kYWxvbmUnLFxuICAgIHN0YXRlbWVudHM6ICdJbnN0cnVrY2plJyxcbiAgICBzdHlsZXM6ICdFc3RpbG9zJyxcbiAgICB0ZW1wbGF0ZTogJ01vZGVsbycsXG4gICAgdHlwZTogJ1R5cCcsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICdBbGlhc3kgdHlww7N3JyxcbiAgICAndHlwZS1wYXJhbWV0ZXJzJzogJ1BhcmFtZXRyeSB0eXDDs3cnLFxuICAgIHR5cGVzOiAnVHlweScsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICdOaWVuYXp3YW5hIHfFgmHFm25vxZvEhycsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICdQb2tyeWNpZSB0ZXN0YW1pIGplZG5vc3Rrb3d5bWknLFxuICAgIHZhbHVlOiAnV2FydG/Fm8SHJyxcbiAgICB2YXJpYWJsZXM6ICdabWllbm5lJyxcbiAgICB5ZXM6ICdUYWsnLFxuICAgIHpvb21pbjogJ1ByenlibGnFvCcsXG4gICAgem9vbW91dDogJ09kZGFsJ1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9QVF9CUiA9IHtcbiAgICBhY2Nlc3NvcnM6ICdBY2Vzc29yZXMnLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50b3MnLFxuICAgIGJvb3RzdHJhcDogJ0Jvb3RzdHJhcCcsXG4gICAgYnJhbmNoZXM6ICdCcmFuY2hlcycsXG4gICAgYnJvd3NlOiAnTmF2ZWdhcicsXG4gICAgY2xhc3NlOiAnQ2xhc3NlJyxcbiAgICBjbGFzc2VzOiAnQ2xhc3NlcycsXG4gICAgY29tcG9uZW50OiAnQ29tcG9uZW50ZScsXG4gICAgY29tcG9uZW50czogJ0NvbXBvbmVudGVzJyxcbiAgICBjb25zdHJ1Y3RvcjogJ0NvbnN0cnV0b3InLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHJvbGFkb3JlcycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyb2xhZG9yJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdDb2JlcnR1cmEgZGEgZG9jdW1lbnRhw6fDo28nLFxuICAgIGRlY2xhcmF0aW9uczogJ0RlY2xhcmHDp8O1ZXMnLFxuICAgIGRlY29yYXRvcnM6ICdEZWNvcmFkb3JlcycsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnVmFsb3IgcGFkcsOjbycsXG4gICAgJ2RlZmluZWQtaW4nOiAnRGVmaW5pZG8gZW0nLFxuICAgIGRlcGVuZGVuY2llczogJ0RlcGVuZMOqbmNpYXMnLFxuICAgIGRlcHJlY2F0ZWQ6ICdEZXNjb250aW51YWRhJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Rlc2NyacOnw6NvJyxcbiAgICBkaXJlY3RpdmU6ICdEaXJldGl2YScsXG4gICAgZGlyZWN0aXZlczogJ0RpcmV0aXZhcycsXG4gICAgJ2RvbSB0cmVlJzogJ0Fydm9yZSBET00nLFxuICAgIGVudGl0aWVzOiAnRW50aWRhZGVzJyxcbiAgICBlbnRpdHk6ICdFbnRpZGFkZScsXG4gICAgZW50cnljb21wb25lbnRzOiAnRW50cnlDb21wb25lbnRzJyxcbiAgICBlbnVtZXJhdGlvbnM6ICdFbnVtZXJhw6fDtWVzJyxcbiAgICBlbnVtczogJ0VudW1zJyxcbiAgICBleGFtcGxlOiAnRXhlbXBsbycsXG4gICAgZXhhbXBsZXM6ICdFeGVtcGxvcycsXG4gICAgZXhwb3J0czogJ0V4cG9ydHMnLFxuICAgIGV4dGVuZHM6ICdFeHRlbmRlJyxcbiAgICBmaWxlOiAnQXJxdWl2bycsXG4gICAgZnVuY3Rpb25zOiAnRnVuw6fDtWVzJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ0RvY3VtZW50YcOnw6NvIGdlcmFkYSB1c2FuZG8nLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAnQ29tZcOnYW5kbycsXG4gICAgZ3VhcmQ6ICdHdWFyZGEnLFxuICAgIGd1YXJkczogJ0d1YXJkYXMnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5ncycsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICdIb3N0RGlyZWN0aXZlcycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnMnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnRWxlbWVudG8gSFRNTCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICdFbGVtZW50byBIVE1MIGNvbSBkaXJldGl2YScsXG4gICAgaWRlbnRpZmllcjogJ0lkZW50aWZpY2Fkb3InLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnRhJyxcbiAgICBpbXBvcnRzOiAnSW1wb3J0cycsXG4gICAgaW5kZXg6ICdJbmRleCcsXG4gICAgaW5kZXhhYmxlOiAnSW5kZXjDoXZlbCcsXG4gICAgaW5mbzogJ0luZm9ybWHDp8OjbycsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ0hlcmRhZG8gZGUnLFxuICAgIGluamVjdGFibGU6ICdJbmpldMOhdmVsJyxcbiAgICBpbmplY3RhYmxlczogJ0luamV0w6F2ZWlzJyxcbiAgICBpbnB1dHM6ICdJbnB1dHMnLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9ycycsXG4gICAgaW50ZXJmYWNlOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VzOiAnSW50ZXJmYWNlcycsXG4gICAgbGVnZW5kOiAnTGVnZW5kJyxcbiAgICBsaWNlbnNlOiAnTGljZW7Dp2EnLFxuICAgIGxpbmVzOiAnTGluaGFzJyxcbiAgICBtZXRhZGF0YTogJ01ldGFkYXRhJyxcbiAgICBtZXRob2RzOiAnTcOpdG9kb3MnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdNaXNjZWzDom5lYScsXG4gICAgbW9kdWxlOiAnTcOzZHVsbycsXG4gICAgbW9kdWxlczogJ03Ds2R1bG9zJyxcbiAgICBuYW1lOiAnTm9tZScsXG4gICAgbm86ICdOw6NvJyxcbiAgICAnbm8tZ3JhcGgnOiAnU2VtIGdyw6FmaWNvIGRpc3BvbsOtdmVsLicsXG4gICAgJ25vLWlmcmFtZSc6ICdTZXUgYnJvd3NlciBuw6NvIHRlbSBzdXBvcnRlIGEgaWZyYW1lcy4nLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAnTmVuaHVtIHJlc3VsdGFkbyBjb3JyZXNwb25kZW50ZScsXG4gICAgJ25vLXN2Zyc6ICdTZXUgYnJvd3NlciBuw6NvIHRlbSBzdXBvcnRlIGEgU1ZHJyxcbiAgICBvcHRpb25hbDogJ09wY2lvbmFsJyxcbiAgICBvdXRwdXRzOiAnT3V0cHV0cycsXG4gICAgb3ZlcnZpZXc6ICdWaXPDo28gZ2VyYWwnLFxuICAgIHBhcmFtZXRlcnM6ICdQYXLDom1ldHJvcycsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXIgZGVwZW5kZW5jaWVzJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHJlZml4bycsXG4gICAgcHJvcGVydGllczogJ1Byb3ByaWVkYWRlcycsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmlkZXJzJyxcbiAgICBwdXJlOiAnUHVybycsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXF1aXJlZDogJ09icmlnYXTDs3JpbycsXG4gICAgcmVzZXQ6ICdSZXNldGFyJyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICdyZXN1bHRhZG9zIGNvcnJlc3BvbmRlbnRlcycsXG4gICAgcmV0dXJuczogJ1JldG9ybmEnLFxuICAgIHJvdXRlOiAnUm90YScsXG4gICAgcm91dGVzOiAnUm90YXMnLFxuICAgIHNjaGVtYXM6ICdFc3F1ZW1hcycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICdEaWdpdGUgcGFyYSBwZXNxdWlzYXInLFxuICAgIHNlbGVjdG9yOiAnU2VsZXRvcicsXG4gICAgc2lnbmF0dXJlOiAnQXNzaW5hdHVyYScsXG4gICAgc291cmNlOiAnRm9udGUnLFxuICAgIHN0YW5kYWxvbmU6ICdTdGFuZGFsb25lJyxcbiAgICBzdGF0ZW1lbnRzOiAnU3RhdGVtZW50cycsXG4gICAgc3R5bGVzOiAnRXN0aWxvcycsXG4gICAgdGVtcGxhdGU6ICdNb2RlbG8nLFxuICAgIHR5cGU6ICdUaXBvJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ0FsaWFzZXMgZGUgdGlwbycsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICdQYXLDom1ldHJvcyBkZSB0aXBvJyxcbiAgICB0eXBlczogJ1RpcG9zJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ1Byb3ByaWVkYWRlIG7Do28tbm9tZWFkYScsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICdDb2JlcnR1cmEgZGUgdGVzdGUgdW5pdMOhcmlvJyxcbiAgICB2YWx1ZTogJ1ZhbG9yJyxcbiAgICB2YXJpYWJsZXM6ICdWYXJpw6F2ZWlzJyxcbiAgICB5ZXM6ICdTaW0nLFxuICAgIHpvb21pbjogJ1pvb20gaW4nLFxuICAgIHpvb21vdXQ6ICdab29tIG91dCdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fUlVfUlUgPSB7XG4gICAgYWNjZXNzb3JzOiAn0JDQutGB0LXRgdGB0L7RgCcsXG4gICAgYXJndW1lbnRzOiAn0JDRgNCz0YPQvNC10L3RgtGLJyxcbiAgICBib290c3RyYXA6ICfQl9Cw0LPRgNGD0LfRh9C40LonLFxuICAgIGJyYW5jaGVzOiAn0JLQtdGC0LrQuCcsXG4gICAgYnJvd3NlOiAn0J7QsdC30L7RgCcsXG4gICAgY2xhc3NlOiAn0JrQu9Cw0YHRgScsXG4gICAgY2xhc3NlczogJ9Ca0LvQsNGB0YHRiycsXG4gICAgY29tcG9uZW50OiAn0JrQvtC80L/QvtC90LXQvdGCJyxcbiAgICBjb21wb25lbnRzOiAn0JrQvtC80L/QvtC90LXQvdGC0YsnLFxuICAgIGNvbnN0cnVjdG9yOiAn0JrQvtC90YHRgtGA0YPQutGC0L7RgCcsXG4gICAgY29udHJvbGxlcnM6ICfQmtC+0L3RgtGA0L7Qu9C70LXRgNGLJyxcbiAgICBjb250cm9sbGVyOiAn0JrQvtC90YLRgNC+0LvQu9C10YAnLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ9Cf0L7QutGA0YvRgtC40LUg0LTQvtC60YPQvNC10L3RgtCw0YbQuNC10LknLFxuICAgIGRlY2xhcmF0aW9uczogJ9CU0LXQutC70LDRgNCw0YbQuNC4JyxcbiAgICBkZWNvcmF0b3JzOiAn0JTQtdC60L7RgNCw0YLQvtGA0YsnLFxuICAgICdkZWZhdWx0LXZhbHVlJzogJ9CX0L3QsNGH0LXQvdC40LUg0L/QviDRg9C80L7Qu9GH0LDQvdC40Y4nLFxuICAgICdkZWZpbmVkLWluJzogJ9Ce0L/RgNC10LTQtdC70LXQvSDQsicsXG4gICAgZGVwZW5kZW5jaWVzOiAn0JfQsNCy0LjRgdC40LzQvtGB0YLQuCcsXG4gICAgZGVwcmVjYXRlZDogJ9Cj0YHRgtCw0YDQtdCy0YjQsNGPJyxcbiAgICBkZXNjcmlwdGlvbjogJ9Ce0L/QuNGB0LDQvdC40LUnLFxuICAgIGRpcmVjdGl2ZTogJ9CU0LjRgNC10LrRgtC40LLQsCcsXG4gICAgZGlyZWN0aXZlczogJ9CU0LjRgNC10LrRgtC40LLRiycsXG4gICAgJ2RvbSB0cmVlJzogJ0RPTS3QtNC10YDQtdCy0L4nLFxuICAgIGVudGl0aWVzOiAn0KHRg9GJ0L3QvtGB0YLQuCcsXG4gICAgZW50aXR5OiAn0KHRg9GJ0L3QvtGB0YLRjCcsXG4gICAgZW50cnljb21wb25lbnRzOiAn0JLRhdC+0LTQvdGL0LUg0LrQvtC80L/QvtC90LXQvdGC0YsnLFxuICAgIGVudW1lcmF0aW9uczogJ9Cf0LXRgNC10YfQuNGB0LvQtdC90LjRjycsXG4gICAgZW51bXM6ICfQn9C10YDQtdGH0LjRgdC70LXQvdC40Y8nLFxuICAgIGV4YW1wbGU6ICfQn9GA0LjQvNC10YAnLFxuICAgIGV4YW1wbGVzOiAn0J/RgNC40LzQtdGA0YsnLFxuICAgIGV4cG9ydHM6ICfQrdC60YHQv9C+0YDRgicsXG4gICAgZXh0ZW5kczogJ9Cg0LDRgdGI0LjRgNGP0LXRgicsXG4gICAgZmlsZTogJ9Ck0LDQudC7JyxcbiAgICBmdW5jdGlvbnM6ICfQpNGD0L3QutGG0LjQuCcsXG4gICAgJ2dlbmVyYXRlZC11c2luZyc6ICfQlNC+0LrRg9C80LXQvdGC0LDRhtC40Y8g0YHQvtC30LTQsNC90LAg0YEg0L/QvtC80L7RidGM0Y4nLFxuICAgICdnZXR0aW5nLXN0YXJ0ZWQnOiAn0J3QsNGH0LDQu9C+INGA0LDQsdC+0YLRiycsXG4gICAgZ3VhcmQ6ICfQl9Cw0YnQuNGC0L3QuNC6JyxcbiAgICBndWFyZHM6ICfQl9Cw0YnQuNGC0L3QuNC60LgnLFxuICAgIGhvc3RiaW5kaW5nczogJ9Cf0YDQuNCy0Y/Qt9C60Lgg0YXQvtGB0YLQsCcsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICfQlNC40YDQtdC60YLQuNCy0Ysg0YXQvtGB0YLQsCcsXG4gICAgaG9zdGxpc3RlbmVyczogJ9Ch0LvRg9GI0LDRgtC10LvQuCDRhdC+0YHRgtCwJyxcbiAgICAnaHRtbC1lbGVtZW50JzogJ0h0bWwt0Y3Qu9C10LzQtdC90YInLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAnSHRtbC3RjdC70LXQvNC10L3RgiDRgSDQtNC40YDQtdC60YLQuNCy0L7QuScsXG4gICAgaWRlbnRpZmllcjogJ9CY0LTQtdC90YLQuNGE0LjQutCw0YLQvtGAJyxcbiAgICBpbXBsZW1lbnRzOiAn0KDQtdCw0LvQuNC30YPQtdGCJyxcbiAgICBpbXBvcnRzOiAn0JjQvNC/0L7RgNGCJyxcbiAgICBpbmRleDogJ9CY0L3QtNC10LrRgScsXG4gICAgaW5kZXhhYmxlOiAn0JjQvdC00LXQutGB0LjRgNGD0LXQvNGL0LknLFxuICAgIGluZm86ICfQmNC90YTQvtGA0LzQsNGG0LjRjycsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ9Cd0LDRgdC70LXQtNGD0LXQvNGL0Lkg0LjQtycsXG4gICAgaW5qZWN0YWJsZTogJ9CS0L3QtdC00YDQtdC90LjQtScsXG4gICAgaW5qZWN0YWJsZXM6ICfQktC90LXQtNGA0LXQvdC40Y8nLFxuICAgIGlucHV0czogJ9CS0YXQvtC00L3Ri9C1INC00LDQvdC90YvQtScsXG4gICAgaW50ZXJjZXB0b3JzOiAn0J/QtdGA0LXRhdCy0LDRgtGH0LjQutC4JyxcbiAgICBpbnRlcmZhY2U6ICfQmNC90YLQtdGA0YTQtdC50YEnLFxuICAgIGludGVyZmFjZXM6ICfQmNC90YLQtdGA0YTQtdC50YHRiycsXG4gICAgbGVnZW5kOiAn0JvQtdCz0LXQvdC00LAnLFxuICAgIGxpY2Vuc2U6ICfQm9C40YbQtdC90LfQuNGPJyxcbiAgICBsaW5lczogJ9Ch0YLRgNC+0LrQuCcsXG4gICAgbWV0YWRhdGE6ICfQnNC10YLQsNC00LDQvdC90YvQtScsXG4gICAgbWV0aG9kczogJ9Cc0LXRgtC+0LTRiycsXG4gICAgbWlzY2VsbGFuZW91czogJ9Cg0LDQt9C90L7QtScsXG4gICAgbW9kdWxlOiAn0JzQvtC00YPQu9GMJyxcbiAgICBtb2R1bGVzOiAn0JzQvtC00YPQu9C4JyxcbiAgICBuYW1lOiAn0JjQvNGPJyxcbiAgICBubzogJ9Cd0LXRgicsXG4gICAgJ25vLWdyYXBoJzogJ9CU0LjQsNCz0YDQsNC80LzQsCDQvdC10LTQvtGB0YLRg9C/0L3QsC4nLFxuICAgICduby1pZnJhbWUnOiAn0JHRgNCw0YPQt9C10YAg0L3QtSDQv9C+0LTQtNC10YDQttC40LLQsNC10YIgaWZyYW1lcy4nLFxuICAgICduby1yZXN1bHQtbWF0Y2hpbmcnOiAn0KDQtdC30YPQu9GM0YLQsNGC0Ysg0L3QtSDQvdCw0LnQtNC10L3RiycsXG4gICAgJ25vLXN2Zyc6ICfQkdGA0LDRg9C30LXRgCDQvdC1INC/0L7QtNC00LXRgNC20LjQstCw0LXRgiBTVkcnLFxuICAgIG9wdGlvbmFsOiAn0J7Qv9GG0LjQvtC90LDQu9GM0L3Ri9C5JyxcbiAgICBvdXRwdXRzOiAn0JLRi9GF0L7QtNC90YvQtSDQtNCw0L3QvdGL0LUnLFxuICAgIG92ZXJ2aWV3OiAn0J7QsdC30L7RgCcsXG4gICAgcGFyYW1ldGVyczogJ9Cf0LDRgNCw0LzQtdGC0YDRiycsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ9Ce0LTQvdC+0YDQsNC90LPQvtCy0YvQtSDQt9Cw0LLQuNGB0LjQvNC+0YHRgtC4JyxcbiAgICBwaXBlOiAn0JrQvtC90LLQtdC50LXRgCcsXG4gICAgcGlwZXM6ICfQmtC+0L3QstC10LnQtdGA0YsnLFxuICAgIHByZWZpeDogJ9Cf0YDQtdGE0LjQutGBJyxcbiAgICBwcm9wZXJ0aWVzOiAn0KHQstC+0LnRgdGC0LLQsCcsXG4gICAgcHJvdmlkZXJzOiAn0J/RgNC+0LLQsNC50LTQtdGA0YsnLFxuICAgIHB1cmU6ICfQp9C40YHRgtGL0LknLFxuICAgIHJlYWRtZTogJ1JFQURNRScsXG4gICAgcmVxdWlyZWQ6ICfQotGA0LXQsdGD0LXQvNGL0LknLFxuICAgIHJlc2V0OiAn0KHQsdGA0L7RgScsXG4gICAgJ3Jlc3VsdHMtbWF0Y2hpbmcnOiAn0YDQtdC30YPQu9GM0YLQsNGC0L7QsiDQvdCw0LnQtNC10L3QvicsXG4gICAgcmV0dXJuczogJ9Ci0LjQvyDQstC+0LfQstGA0LDRidCw0LXQvNC+0LPQviDQt9C90LDRh9C10L3QuNGPJyxcbiAgICByb3V0ZTogJ9Cc0LDRgNGI0YDRg9GCJyxcbiAgICByb3V0ZXM6ICfQnNCw0YDRiNGA0YPRgtGLJyxcbiAgICBzY2hlbWFzOiAn0KHRhdC10LzRiycsXG4gICAgJ3NlYXJjaC1wbGFjZWhvbGRlcic6ICfQktCy0LXQtNC40YLQtSDQtNC70Y8g0L/QvtC40YHQutCwJyxcbiAgICBzZWxlY3RvcjogJ9Ch0LXQu9C10LrRgtC+0YAnLFxuICAgIHNpZ25hdHVyZTogJ9Ch0LjQs9C90LDRgtGD0YDQsCcsXG4gICAgc291cmNlOiAn0JjRgdGC0L7Rh9C90LjQuicsXG4gICAgc3RhbmRhbG9uZTogJ9CQ0LLRgtC+0L3QvtC80L3Ri9C5JyxcbiAgICBzdGF0ZW1lbnRzOiAn0KPRgtCy0LXRgNC20LTQtdC90LjRjycsXG4gICAgc3R5bGVzOiAn0KHRgtC40LvQuCcsXG4gICAgdGVtcGxhdGU6ICfQqNCw0LHQu9C+0L0nLFxuICAgIHR5cGU6ICfQotC40L8nLFxuICAgICd0eXBlLWFsaWFzZXMnOiAn0J/RgdC10LLQtNC+0L3QuNC80Ysg0YLQuNC/0L7QsicsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICfQotC40L/RiyDQv9Cw0YDQsNC80LXRgtGA0L7QsicsXG4gICAgdHlwZXM6ICfQotC40L/RiycsXG4gICAgJ3VuYW1lZC1wcm9wZXJ0eSc6ICfQkdC10LfRi9C80Y/QvdC90L7QtSDRgdCy0L7QudGB0YLQstC+JyxcbiAgICAndW5pdC10ZXN0LWNvdmVyYWdlJzogJ9Cf0L7QutGA0YvRgtC40LUg0LzQvtC00YPQu9GM0L3Ri9C80Lgg0YLQtdGB0YLQsNC80LgnLFxuICAgIHZhbHVlOiAn0JfQvdCw0YfQtdC90LjQtScsXG4gICAgdmFyaWFibGVzOiAn0J/QtdGA0LXQvNC10L3QvdGL0LUnLFxuICAgIHllczogJ9CU0LAnLFxuICAgIHpvb21pbjogJ9Cf0YDQuNCx0LvQuNC30LjRgtGMJyxcbiAgICB6b29tb3V0OiAn0J7RgtC00LDQu9C40YLRjCdcbn07XG4iLCJleHBvcnQgY29uc3QgVFJBTlNMQVRJT05fU0tfU0sgPSB7XG4gICAgYWNjZXNzb3JzOiAnTW9kaWZpa8OhdG9yeSBwcsOtc3R1cHUnLFxuICAgIGFyZ3VtZW50czogJ0FyZ3VtZW50eScsXG4gICAgYm9vdHN0cmFwOiAnQm9vdHN0cmFwJyxcbiAgICBicmFuY2hlczogJ1ZldHZ5JyxcbiAgICBicm93c2U6ICdQcmV6ZXJhxaUnLFxuICAgIGNsYXNzZTogJ1RyaWVkYScsXG4gICAgY2xhc3NlczogJ1RyaWVkeScsXG4gICAgY29tcG9uZW50OiAnS29tcG9uZW50JyxcbiAgICBjb21wb25lbnRzOiAnS29tcG9uZW50eScsXG4gICAgY29uc3RydWN0b3I6ICdLb27FoXRydWt0b3InLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHJvbGxlcnMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250cm9sbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICdQb2tyeXRpZSBkb2t1bWVudMOhY2lvdScsXG4gICAgZGVjbGFyYXRpb25zOiAnRGVrbGFyw6FjaWUnLFxuICAgIGRlY29yYXRvcnM6ICdEZWtvcsOhdG9yeScsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAnUHJlZHZvbGVuw6EgaG9kbm90YScsXG4gICAgJ2RlZmluZWQtaW4nOiAnRGVmaW5vdmFuw6kgdicsXG4gICAgZGVwZW5kZW5jaWVzOiAnWsOhdmlzbG9zdGknLFxuICAgIGRlcHJlY2F0ZWQ6ICdaYXN0YXJlbCcsXG4gICAgZGVzY3JpcHRpb246ICdQb3BpcycsXG4gICAgZGlyZWN0aXZlOiAnRGlyZWt0w612YScsXG4gICAgZGlyZWN0aXZlczogJ0RpcmVrdMOtdnknLFxuICAgICdkb20gdHJlZSc6ICdET00gc3Ryb20nLFxuICAgIGVudGl0aWVzOiAnU3ViamVrdG92JyxcbiAgICBlbnRpdHk6ICdTdWJqZWt0JyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeUNvbXBvbmVudHMnLFxuICAgIGVudW1lcmF0aW9uczogJ0VudW1lcsOhdG9yeScsXG4gICAgZW51bXM6ICdFbnVtZXLDoXRvcnknLFxuICAgIGV4YW1wbGU6ICdQcsOta2xhZCcsXG4gICAgZXhhbXBsZXM6ICdQcsOta2xhZHknLFxuICAgIGV4cG9ydHM6ICdFeHBvcnR5JyxcbiAgICBleHRlbmRzOiAnUm96xaFpcnVqZScsXG4gICAgZmlsZTogJ1PDumJvcicsXG4gICAgZnVuY3Rpb25zOiAnRnVua2NpZScsXG4gICAgJ2dlbmVyYXRlZC11c2luZyc6ICdEb2t1bWVudMOhY2lhIHZ5dHZvcmVuw6EgcG9tb2NvdScsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICdaYcSNw61uYW1lJyxcbiAgICBndWFyZDogJ0d1YXJkJyxcbiAgICBndWFyZHM6ICdHdWFyZHMnLFxuICAgIGhvc3RiaW5kaW5nczogJ0hvc3RCaW5kaW5ncycsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICdIb3N0RGlyZWN0aXZlcycsXG4gICAgaG9zdGxpc3RlbmVyczogJ0hvc3RMaXN0ZW5lcnMnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSFRNTCBlbGVtZW50JyxcbiAgICAnaHRtbC1lbGVtZW50LXdpdGgtZGlyZWN0aXZlJzogJ0hUTUwgZWxlbWVudCBzIGRpcmVrdMOtdm91JyxcbiAgICBpZGVudGlmaWVyOiAnSWRlbnRpZmlrw6F0b3InLFxuICAgIGltcGxlbWVudHM6ICdJbXBsZW1lbnR1amUnLFxuICAgIGltcG9ydHM6ICdJbXBvcnR1amUnLFxuICAgIGluZGV4OiAnSW5kZXgnLFxuICAgIGluZGV4YWJsZTogJ0luZGV4b3ZhdGXEvm7DvScsXG4gICAgaW5mbzogJ0luZm9ybcOhY2llJyxcbiAgICAnaW5oZXJpdGVkLWZyb20nOiAnWmRlZGVuw6kgb2QnLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICdWc3R1cHknLFxuICAgIGludGVyY2VwdG9yczogJ0ludGVyY2VwdG9ycycsXG4gICAgaW50ZXJmYWNlOiAnUm96aHJhbmllJyxcbiAgICBpbnRlcmZhY2VzOiAnUm96aHJhbmlhJyxcbiAgICBsZWdlbmQ6ICdMZWdlbmRhJyxcbiAgICBsaWNlbnNlOiAnTGljZW5jaWEnLFxuICAgIGxpbmVzOiAnUmlhZGt5JyxcbiAgICBtZXRhZGF0YTogJ01ldGFkw6F0YScsXG4gICAgbWV0aG9kczogJ01ldMOzZHknLFxuICAgIG1pc2NlbGxhbmVvdXM6ICdSw7R6bmUnLFxuICAgIG1vZHVsZTogJ01vZHVsJyxcbiAgICBtb2R1bGVzOiAnTW9kdWx5JyxcbiAgICBuYW1lOiAnTsOhem92JyxcbiAgICBubzogJ05pZScsXG4gICAgJ25vLWdyYXBoJzogJ05pZSBqZSBrIGRpc3BvesOtY2lpIMW+aWFkbnkgZ3JhZi4nLFxuICAgICduby1pZnJhbWUnOiAnVsOhxaEgcHJlaGxpYWRhxI0gbmVwb2Rwb3J1amUgaWZyYW1lJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ05lbsOhamRlbsOpIMW+aWFkbmUgdsO9c2xlZGt5IHByZScsXG4gICAgJ25vLXN2Zyc6ICdWw6HFoSBwcmVobGlhZGHEjSBuZXBvZHBvcnVqZSBTVkcnLFxuICAgIG9wdGlvbmFsOiAnVm9saXRlxL5uw70nLFxuICAgIG91dHB1dHM6ICdWw71zdHVweScsXG4gICAgb3ZlcnZpZXc6ICdQcmVoxL5hZCcsXG4gICAgcGFyYW1ldGVyczogJ1BhcmFtZXRyZScsXG4gICAgJ3BlZXItZGVwZW5kZW5jaWVzJzogJ1BlZXIgZGVwZW5kZW5jaWVzJyxcbiAgICBwaXBlOiAnUGlwZScsXG4gICAgcGlwZXM6ICdQaXBlcycsXG4gICAgcHJlZml4OiAnUHJlZml4JyxcbiAgICBwcm9wZXJ0aWVzOiAnVmxhc3Rub3N0aScsXG4gICAgcHJvdmlkZXJzOiAnUHJvdmlkZXJzJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXF1aXJlZDogJ1Bvxb5hZG92YW7DvScsXG4gICAgcmVzZXQ6ICdSZXNldG92YcWlJyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICd2w71zbGVka292IHByZScsXG4gICAgcmV0dXJuczogJ07DoXZyYXRvdsOhIGhvZG5vdGEnLFxuICAgIHJvdXRlOiAnUm91dGUnLFxuICAgIHJvdXRlczogJ1JvdXRlcycsXG4gICAgc2NoZW1hczogJ1NjaMOpbXknLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAnWmFkYWp0ZSBoxL5hZGFuw70gdGV4dCcsXG4gICAgc2VsZWN0b3I6ICdTZWxla3RvcicsXG4gICAgc2lnbmF0dXJlOiAnUG9kcGlzJyxcbiAgICBzb3VyY2U6ICdaZHJvaicsXG4gICAgc3RhbmRhbG9uZTogJ1N0YW5kYWxvbmUnLFxuICAgIHN0YXRlbWVudHM6ICdTdGF0ZW1lbnRzJyxcbiAgICBzdHlsZXM6ICfFoHTDvWx5JyxcbiAgICB0ZW1wbGF0ZTogJ8WgYWJsw7NuYScsXG4gICAgdHlwZTogJ1R5cCcsXG4gICAgJ3R5cGUtYWxpYXNlcyc6ICdUeXBlIGFsaWFzZXMnLFxuICAgICd0eXBlLXBhcmFtZXRlcnMnOiAnVHlwZSBwYXJhbWV0ZXJzJyxcbiAgICB0eXBlczogJ1R5cHknLFxuICAgICd1bmFtZWQtcHJvcGVydHknOiAnTmVwb21lbm92YW7DvSBhdHJpYsO6dCcsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICdQb2tyeXRpZSB1bml0IHRlc3RhbWknLFxuICAgIHZhbHVlOiAnSG9kbm90YScsXG4gICAgdmFyaWFibGVzOiAnUHJlbWVubsOpJyxcbiAgICB5ZXM6ICfDgW5vJyxcbiAgICB6b29taW46ICdQcmlibMOtxb5pxaUnLFxuICAgIHpvb21vdXQ6ICdPZGRpYWxpxaUnXG59O1xuIiwiZXhwb3J0IGNvbnN0IFRSQU5TTEFUSU9OX1pIX0NOID0ge1xuICAgIGFjY2Vzc29yczogJ+WtmOWPluWZqCcsXG4gICAgYXJndW1lbnRzOiAnQXJndW1lbnRzJyxcbiAgICBib290c3RyYXA6ICfmoLnnu4Tku7YnLFxuICAgIGJyYW5jaGVzOiAn5YiG5pSvJyxcbiAgICBicm93c2U6ICfmn6XnnIsnLFxuICAgIGNsYXNzZTogJ+exuycsXG4gICAgY2xhc3NlczogJ+exu+WIl+ihqCcsXG4gICAgY29tcG9uZW50OiAn57uE5Lu2JyxcbiAgICBjb21wb25lbnRzOiAn57uE5Lu25YiX6KGoJyxcbiAgICBjb25zdHJ1Y3RvcjogJ+aehOmAoOaWueazlScsXG4gICAgY29udHJvbGxlcnM6ICdDb250cm9sbGVycycsXG4gICAgY29udHJvbGxlcjogJ0NvbnRyb2xsZXInLFxuICAgICdjb3ZlcmFnZS1wYWdlLXRpdGxlJzogJ+aWh+aho+amguiniCcsXG4gICAgZGVjbGFyYXRpb25zOiAn5Y+v5aOw5piO5a+56LGh5YiX6KGoJyxcbiAgICBkZWNvcmF0b3JzOiAn6KOF6aWw5Zmo5YiX6KGoJyxcbiAgICAnZGVmYXVsdC12YWx1ZSc6ICfnvLrnnIHlgLwnLFxuICAgICdkZWZpbmVkLWluJzogJ+iiq+WumuS5ieWcqCcsXG4gICAgZGVwZW5kZW5jaWVzOiAn5L6d6LWW6aG5JyxcbiAgICBkZXByZWNhdGVkOiAn5bey5byD55SoJyxcbiAgICBkZXNjcmlwdGlvbjogJ+aPj+i/sCcsXG4gICAgZGlyZWN0aXZlOiAn5oyH5LukJyxcbiAgICBkaXJlY3RpdmVzOiAn5oyH5Luk5YiX6KGoJyxcbiAgICAnZG9tIHRyZWUnOiAnRE9NIOagkScsXG4gICAgZW50aXRpZXM6ICflrp7kvZMnLFxuICAgIGVudGl0eTogJ+WunuS9kycsXG4gICAgZW50cnljb21wb25lbnRzOiAn5YWl5Y+j57uE5Lu25YiX6KGoJyxcbiAgICBlbnVtZXJhdGlvbnM6ICfliJfkuL4nLFxuICAgIGVudW1zOiAn5p6a5Li+5YiX6KGoJyxcbiAgICBleGFtcGxlOiAn5L6L5a2QJyxcbiAgICBleGFtcGxlczogJ+S+i+WtkCcsXG4gICAgZXhwb3J0czogJ+WvvOWHuicsXG4gICAgZXh0ZW5kczogJ+e7p+aJvycsXG4gICAgZmlsZTogJ+aWh+S7ticsXG4gICAgZnVuY3Rpb25zOiAn5Ye95pWwJyxcbiAgICAnZ2VuZXJhdGVkLXVzaW5nJzogJ+aWh+aho+eUn+aIkOS9v+eUqCcsXG4gICAgJ2dldHRpbmctc3RhcnRlZCc6ICflhaXpl6jmjIfljZcnLFxuICAgIGd1YXJkOiAn6Lev55Sx5a6I5Y2rJyxcbiAgICBndWFyZHM6ICfot6/nlLHlrojljavliJfooagnLFxuICAgIGhvc3RiaW5kaW5nczogJ+Wuv+S4u+e7keWumicsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICdIb3N0IERpcmVjdGl2ZXMnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICflrr/kuLvnm5HlkKwnLFxuICAgICdodG1sLWVsZW1lbnQnOiAnSHRtbCDlhYPntKAnLFxuICAgICdodG1sLWVsZW1lbnQtd2l0aC1kaXJlY3RpdmUnOiAn5bim5oyH5Luk55qESHRtbOWFg+e0oCcsXG4gICAgaWRlbnRpZmllcjogJ+agh+ivhuespicsXG4gICAgaW1wbGVtZW50czogJ+WunueOsCcsXG4gICAgaW1wb3J0czogJ+W8leWFpScsXG4gICAgaW5kZXg6ICfntKLlvJUnLFxuICAgIGluZGV4YWJsZTogJ0luZGV4YWJsZScsXG4gICAgaW5mbzogJ+S/oeaBrycsXG4gICAgJ2luaGVyaXRlZC1mcm9tJzogJ+e7p+aJv+iHqicsXG4gICAgaW5qZWN0YWJsZTogJ+WPr+azqOWFpeeahCcsXG4gICAgaW5qZWN0YWJsZXM6ICflj6/ms6jlhaXnmoQnLFxuICAgIGlucHV0czogJ+i+k+WFpeWxnuaApycsXG4gICAgaW50ZXJjZXB0b3JzOiAn5oum5oiq5ZmoJyxcbiAgICBpbnRlcmZhY2U6ICfmjqXlj6MnLFxuICAgIGludGVyZmFjZXM6ICfmjqXlj6MnLFxuICAgIGxlZ2VuZDogJ+WbvuS+iycsXG4gICAgbGljZW5zZTogJ+iuuOWPr+WNj+iuricsXG4gICAgbGluZXM6ICdMaW5lcycsXG4gICAgbWV0YWRhdGE6ICflhYPmlbDmja4nLFxuICAgIG1ldGhvZHM6ICfmlrnms5UnLFxuICAgIG1pc2NlbGxhbmVvdXM6ICflhbbku5YnLFxuICAgIG1vZHVsZTogJ+aooeWdlycsXG4gICAgbW9kdWxlczogJ+aooeWdl+WIl+ihqCcsXG4gICAgbmFtZTogJ+WQjeensCcsXG4gICAgbm86ICflkKYnLFxuICAgICduby1ncmFwaCc6ICfml6DmlbDmja7mmL7npLonLFxuICAgICduby1pZnJhbWUnOiAn5L2g55qE5rWP6KeI5Zmo5LiN5pSv5oyBaWZyYW1lcycsXG4gICAgJ25vLXJlc3VsdC1tYXRjaGluZyc6ICfml6DljLnphY3nmoTnu5PmnpwnLFxuICAgICduby1zdmcnOiAn5L2g55qE5rWP6KeI5Zmo5LiN5pSv5oyBU1ZHJyxcbiAgICBvcHRpb25hbDogJ+WPr+mAieeahCcsXG4gICAgb3V0cHV0czogJ+i+k+WHuuWxnuaApycsXG4gICAgb3ZlcnZpZXc6ICfmpoLov7AnLFxuICAgIHBhcmFtZXRlcnM6ICflj4LmlbDliJfooagnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICflkIznuqfkvp3otZYnLFxuICAgIHBpcGU6ICfnrqHpgZMnLFxuICAgIHBpcGVzOiAn566h6YGT5YiX6KGoJyxcbiAgICBwcmVmaXg6ICflrZfpppYnLFxuICAgIHByb3BlcnRpZXM6ICflsZ7mgKfliJfooagnLFxuICAgIHByb3ZpZGVyczogJ+aPkOS+m+WVhuWIl+ihqCcsXG4gICAgcHVyZTogJ1B1cmUnLFxuICAgIHJlYWRtZTogJ+aJi+WGjCcsXG4gICAgcmVxdWlyZWQ6ICflv4XpnIDnmoQnLFxuICAgIHJlc2V0OiAn6YeN572uJyxcbiAgICAncmVzdWx0cy1tYXRjaGluZyc6ICfljLnphY3nmoTnu5PmnpwnLFxuICAgIHJldHVybnM6ICfov5Tlm54nLFxuICAgIHJvdXRlOiAn6Lev55SxJyxcbiAgICByb3V0ZXM6ICfot6/nlLHliJfooagnLFxuICAgIHNjaGVtYXM6ICfmqKHlvI8nLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAn6K+36L6T5YWl5p+l6K+i5YWz6ZSu5a2XJyxcbiAgICBzZWxlY3RvcjogJ+mAieaLqeWZqCcsXG4gICAgc2lnbmF0dXJlOiAn562+5ZCNJyxcbiAgICBzb3VyY2U6ICfmnaXmupAnLFxuICAgIHN0YW5kYWxvbmU6ICdTdGFuZGFsb25lJyxcbiAgICBzdGF0ZW1lbnRzOiAn5rOo6YeKJyxcbiAgICBzdHlsZXM6ICfmoLflvI8nLFxuICAgIHRlbXBsYXRlOiAn5qih5p2/JyxcbiAgICB0eXBlOiAn57G75Z6LJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ+exu+Wei+WIq+WQjScsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICfnsbvlnovlj4LmlbAnLFxuICAgIHR5cGVzOiAn57G75Z6LJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ+acquWRveWQjeWxnuaApycsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICfljZXlhYPmtYvor5XmpoLop4gnLFxuICAgIHZhbHVlOiAn5YC8JyxcbiAgICB2YXJpYWJsZXM6ICflj5jph48nLFxuICAgIHllczogJ+aYrycsXG4gICAgem9vbWluOiAn5pS+5aSnJyxcbiAgICB6b29tb3V0OiAn57yp5bCPJ1xufTtcbiIsImV4cG9ydCBjb25zdCBUUkFOU0xBVElPTl9aSF9UVyA9IHtcbiAgICBhY2Nlc3NvcnM6ICflrZjlj5blmagnLFxuICAgIGFyZ3VtZW50czogJ+WPg+aVuCcsXG4gICAgYm9vdHN0cmFwOiAn5qC55YWD5Lu2JyxcbiAgICBicmFuY2hlczogJ+WIhuaUrycsXG4gICAgYnJvd3NlOiAn54CP6Ka9JyxcbiAgICBjbGFzc2U6ICfpoZ7liKUnLFxuICAgIGNsYXNzZXM6ICfpoZ7liKUnLFxuICAgIGNvbXBvbmVudDogJ+WFg+S7ticsXG4gICAgY29tcG9uZW50czogJ+WFg+S7tuWIl+ihqCcsXG4gICAgY29uc3RydWN0b3I6ICflu7rmp4vlvI/mlrnms5UnLFxuICAgIGNvbnRyb2xsZXJzOiAnQ29udHJvbGxlcnMnLFxuICAgIGNvbnRyb2xsZXI6ICdDb250cm9sbGVyJyxcbiAgICAnY292ZXJhZ2UtcGFnZS10aXRsZSc6ICfopobok4vnjofpoIHpnaLmqJnpoYwnLFxuICAgIGRlY2xhcmF0aW9uczogJ0RlY2xhcmF0aW9ucycsXG4gICAgZGVjb3JhdG9yczogJ+ijnemjvuWZqOWIl+ihqCcsXG4gICAgJ2RlZmF1bHQtdmFsdWUnOiAn6aCQ6Kit5YC8JyxcbiAgICAnZGVmaW5lZC1pbic6ICfooqvlrprnvqnlnKgnLFxuICAgIGRlcGVuZGVuY2llczogJ+S+neiztOmghScsXG4gICAgZGVwcmVjYXRlZDogJ+W3suajhOeUqCcsXG4gICAgZGVzY3JpcHRpb246ICfmj4/ov7AnLFxuICAgIGRpcmVjdGl2ZTogJ+aMh+S7pCAoRGlyZWN0aXZlKScsXG4gICAgZGlyZWN0aXZlczogJ+aMh+S7pCAoRGlyZWN0aXZlcyknLFxuICAgICdkb20gdHJlZSc6ICdET00g5qi5JyxcbiAgICBlbnRpdGllczogJ+WvpumrlCcsXG4gICAgZW50aXR5OiAn5a+m6auUJyxcbiAgICBlbnRyeWNvbXBvbmVudHM6ICdFbnRyeWNvbXBvbmVudHMnLFxuICAgIGVudW1lcmF0aW9uczogJ+WIl+iIiScsXG4gICAgZW51bXM6ICfmnproiInliJfooagnLFxuICAgIGV4YW1wbGU6ICfnr4TkvosnLFxuICAgIGV4YW1wbGVzOiAn56+E5L6LJyxcbiAgICBleHBvcnRzOiAn5Yyv5Ye6JyxcbiAgICBleHRlbmRzOiAn57m85om/JyxcbiAgICBmaWxlOiAn5qqU5qGIJyxcbiAgICBmdW5jdGlvbnM6ICflh73mlbgnLFxuICAgICdnZW5lcmF0ZWQtdXNpbmcnOiAn55Si55Sf5paH5Lu25L2/55SoJyxcbiAgICAnZ2V0dGluZy1zdGFydGVkJzogJ+W/q+mAn+S4iuaJiycsXG4gICAgZ3VhcmQ6ICfot6/nlLHlrojooZsnLFxuICAgIGd1YXJkczogJ+i3r+eUseWuiOihm+WIl+ihqCcsXG4gICAgaG9zdGJpbmRpbmdzOiAnSG9zdCBCaW5kaW5ncycsXG4gICAgaG9zdGRpcmVjdGl2ZXM6ICdIb3N0IERpcmVjdGl2ZXMnLFxuICAgIGhvc3RsaXN0ZW5lcnM6ICdIb3N0IExpc3RlbmVycycsXG4gICAgJ2h0bWwtZWxlbWVudCc6ICdIVE1MIOWFg+e0oCcsXG4gICAgJ2h0bWwtZWxlbWVudC13aXRoLWRpcmVjdGl2ZSc6ICfluLbmjIfku6TnmoQgSFRNTCDlhYPntKAnLFxuICAgIGlkZW50aWZpZXI6ICforZjliKXnrKbomZ8nLFxuICAgIGltcGxlbWVudHM6ICflr6bkvZwnLFxuICAgIGltcG9ydHM6ICfljK/lhaUnLFxuICAgIGluZGV4OiAn57Si5byVJyxcbiAgICBpbmRleGFibGU6ICdJbmRleGFibGUnLFxuICAgIGluZm86ICfos4foqIonLFxuICAgICdpbmhlcml0ZWQtZnJvbSc6ICfnubzmib/oh6onLFxuICAgIGluamVjdGFibGU6ICdJbmplY3RhYmxlJyxcbiAgICBpbmplY3RhYmxlczogJ0luamVjdGFibGVzJyxcbiAgICBpbnB1dHM6ICfovLjlhaXlsazmgKcnLFxuICAgIGludGVyY2VwdG9yczogJ+aUlOaIquWZqCcsXG4gICAgaW50ZXJmYWNlOiAn5LuL6Z2iJyxcbiAgICBpbnRlcmZhY2VzOiAn5LuL6Z2iJyxcbiAgICBsZWdlbmQ6ICflnJbkvosnLFxuICAgIGxpY2Vuc2U6ICfmjojmrIrljZTorbAnLFxuICAgIGxpbmVzOiAnTGluZXMnLFxuICAgIG1ldGFkYXRhOiAn5YWD5pW45pOaJyxcbiAgICBtZXRob2RzOiAn5pa55rOVJyxcbiAgICBtaXNjZWxsYW5lb3VzOiAn5YW25LuWJyxcbiAgICBtb2R1bGU6ICfmqKHntYQnLFxuICAgIG1vZHVsZXM6ICfmqKHntYTliJfooagnLFxuICAgIG5hbWU6ICflkI3nqLEnLFxuICAgIG5vOiAn5ZCmJyxcbiAgICAnbm8tZ3JhcGgnOiAn54Sh5pW45pOa6aGv56S6JyxcbiAgICAnbm8taWZyYW1lJzogJ+S9oOeahOeAj+imveWZqOS4jeaUr+aPtCBpZnJhbWVzJyxcbiAgICAnbm8tcmVzdWx0LW1hdGNoaW5nJzogJ+eEoeWMuemFjeeahOe1kOaenCcsXG4gICAgJ25vLXN2Zyc6ICfkvaDnmoTngI/opr3lmajkuI3mlK/mj7QgU1ZHJyxcbiAgICBvcHRpb25hbDogJ+WPr+mBuOeahCcsXG4gICAgb3V0cHV0czogJ+i8uOWHuuWxrOaApycsXG4gICAgb3ZlcnZpZXc6ICfmpoLov7AnLFxuICAgIHBhcmFtZXRlcnM6ICflj4PmlbjliJfooagnLFxuICAgICdwZWVyLWRlcGVuZGVuY2llcyc6ICdQZWVyIERlcGVuZGVuY2llcycsXG4gICAgcGlwZTogJ+euoemBkycsXG4gICAgcGlwZXM6ICfnrqHpgZPliJfooagnLFxuICAgIHByZWZpeDogJ+WJjee9ruipnicsXG4gICAgcHJvcGVydGllczogJ+WxrOaAp+WIl+ihqCcsXG4gICAgcHJvdmlkZXJzOiAn5o+Q5L6b6ICF5YiX6KGoJyxcbiAgICBwdXJlOiAnUHVyZScsXG4gICAgcmVhZG1lOiAnUkVBRE1FJyxcbiAgICByZXF1aXJlZDogJ+W/hemcgOeahCcsXG4gICAgcmVzZXQ6ICfph43oqK0nLFxuICAgICdyZXN1bHRzLW1hdGNoaW5nJzogJ+WMuemFjeeahOe1kOaenCcsXG4gICAgcmV0dXJuczogJ+WbnuWCs+WAvCcsXG4gICAgcm91dGU6ICfot6/nlLEnLFxuICAgIHJvdXRlczogJ+i3r+eUseWIl+ihqCcsXG4gICAgc2NoZW1hczogJ1NjaGVtYXMnLFxuICAgICdzZWFyY2gtcGxhY2Vob2xkZXInOiAn6KuL6Ly45YWl5p+l6Kmi6Zec6Y215a2XJyxcbiAgICBzZWxlY3RvcjogJ+mBuOaTh+WZqCcsXG4gICAgc2lnbmF0dXJlOiAn57C95ZCNJyxcbiAgICBzb3VyY2U6ICfkvobmupAnLFxuICAgIHN0YW5kYWxvbmU6ICdTdGFuZGFsb25lJyxcbiAgICBzdGF0ZW1lbnRzOiAn6Zmz6L+w5byPJyxcbiAgICBzdHlsZXM6ICfmqKPlvI8nLFxuICAgIHRlbXBsYXRlOiAn56+E5pysJyxcbiAgICB0eXBlOiAn5Z6L5YilJyxcbiAgICAndHlwZS1hbGlhc2VzJzogJ+Wei+WIpeWIpeWQjScsXG4gICAgJ3R5cGUtcGFyYW1ldGVycyc6ICflnovliKXlj4PmlbgnLFxuICAgIHR5cGVzOiAn5Z6L5YilJyxcbiAgICAndW5hbWVkLXByb3BlcnR5JzogJ+acquWRveWQjeWxrOaApycsXG4gICAgJ3VuaXQtdGVzdC1jb3ZlcmFnZSc6ICfllq7lhYPmuKzoqabopobok4vnjocnLFxuICAgIHZhbHVlOiAn5YC8JyxcbiAgICB2YXJpYWJsZXM6ICforormlbgnLFxuICAgIHllczogJ+aYrycsXG4gICAgem9vbWluOiAn5pS+5aSnJyxcbiAgICB6b29tb3V0OiAn57iu5bCPJ1xufTtcbiIsImltcG9ydCBpMThuZXh0IGZyb20gJ2kxOG5leHQnO1xuXG5pbXBvcnQge1xuICAgIFRSQU5TTEFUSU9OX0JHX0JHLFxuICAgIFRSQU5TTEFUSU9OX0RFX0RFLFxuICAgIFRSQU5TTEFUSU9OX0VOX1VTLFxuICAgIFRSQU5TTEFUSU9OX0VTX0VTLFxuICAgIFRSQU5TTEFUSU9OX0ZSX0ZSLFxuICAgIFRSQU5TTEFUSU9OX0hVX0hVLFxuICAgIFRSQU5TTEFUSU9OX0lUX0lULFxuICAgIFRSQU5TTEFUSU9OX0pBX0pQLFxuICAgIFRSQU5TTEFUSU9OX0tPX0tSLFxuICAgIFRSQU5TTEFUSU9OX05MX05MLFxuICAgIFRSQU5TTEFUSU9OX1BMX1BMLFxuICAgIFRSQU5TTEFUSU9OX1BUX0JSLFxuICAgIFRSQU5TTEFUSU9OX1JVX1JVLFxuICAgIFRSQU5TTEFUSU9OX1NLX1NLLFxuICAgIFRSQU5TTEFUSU9OX1pIX0NOLFxuICAgIFRSQU5TTEFUSU9OX1pIX1RXLFxuICAgIFRSQU5TTEFUSU9OX0tBX0dFXG59IGZyb20gJy4uLy4uL2xvY2FsZXMnO1xuXG5jbGFzcyBJMThuRW5naW5lIHtcbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogSTE4bkVuZ2luZTtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUkxOG5FbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEkxOG5FbmdpbmUuaW5zdGFuY2UgPSBuZXcgSTE4bkVuZ2luZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBJMThuRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXZhaWxhYmxlc0xhbmd1YWdlcyA9IHtcbiAgICAgICAgJ2JnLUJHJzogJ2JnLUJHJyxcbiAgICAgICAgJ2RlLURFJzogJ2RlLURFJyxcbiAgICAgICAgJ2VuLVVTJzogJ2VuLVVTJyxcbiAgICAgICAgJ2VzLUVTJzogJ2VzLUVTJyxcbiAgICAgICAgJ2ZyLUZSJzogJ2ZyLUZSJyxcbiAgICAgICAgJ2h1LUhVJzogJ2h1LUhVJyxcbiAgICAgICAgJ2l0LUlUJzogJ2l0LUlUJyxcbiAgICAgICAgJ2phLUpQJzogJ2phLUpQJyxcbiAgICAgICAgJ2thLUdFJzogJ2thLUdFJyxcbiAgICAgICAgJ2tvLUtSJzogJ2tvLUtSJyxcbiAgICAgICAgJ25sLU5MJzogJ25sLU5MJyxcbiAgICAgICAgJ3BsLVBMJzogJ3BsLVBMJyxcbiAgICAgICAgJ3B0LUJSJzogJ3B0LUJSJyxcbiAgICAgICAgJ3J1LVJVJzogJ3J1LVJVJyxcbiAgICAgICAgJ3NrLVNLJzogJ3NrLVNLJyxcbiAgICAgICAgJ3poLUNOJzogJ3poLUNOJyxcbiAgICAgICAgJ3poLVRXJzogJ3poLVRXJ1xuICAgIH07XG5cbiAgICBwdWJsaWMgZmFsbGJhY2tMYW5ndWFnZSA9ICdlbi1VUyc7XG5cbiAgICBwdWJsaWMgaW5pdChsYW5ndWFnZTogc3RyaW5nKSB7XG4gICAgICAgIGkxOG5leHQuaW5pdCh7XG4gICAgICAgICAgICBsbmc6IGxhbmd1YWdlLFxuICAgICAgICAgICAgZmFsbGJhY2tMbmc6IHRoaXMuZmFsbGJhY2tMYW5ndWFnZSxcbiAgICAgICAgICAgIGludGVycG9sYXRpb246IHtcbiAgICAgICAgICAgICAgICBza2lwT25WYXJpYWJsZXM6IGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnZGUtREUnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9ERV9ERSk7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdlbi1VUycsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX0VOX1VTKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ2VzLUVTJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fRVNfRVMpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnZnItRlInLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9GUl9GUik7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdodS1IVScsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX0hVX0hVKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ2l0LUlUJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fSVRfSVQpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnamEtSlAnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9KQV9KUCk7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdrYS1HRScsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX0tBX0dFKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ2tvLUtSJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fS09fS1IpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnbmwtTkwnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9OTF9OTCk7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdwbC1QTCcsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX1BMX1BMKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ3B0LUJSJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fUFRfQlIpO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygncnUtUlUnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9SVV9SVSk7XG4gICAgICAgIGkxOG5leHQuYWRkUmVzb3VyY2VzKCdzay1TSycsICd0cmFuc2xhdGlvbicsIFRSQU5TTEFUSU9OX1NLX1NLKTtcbiAgICAgICAgaTE4bmV4dC5hZGRSZXNvdXJjZXMoJ3poLUNOJywgJ3RyYW5zbGF0aW9uJywgVFJBTlNMQVRJT05fWkhfQ04pO1xuICAgICAgICBpMThuZXh0LmFkZFJlc291cmNlcygnemgtVFcnLCAndHJhbnNsYXRpb24nLCBUUkFOU0xBVElPTl9aSF9UVyk7XG4gICAgfVxuXG4gICAgcHVibGljIHRyYW5zbGF0ZShrZXk6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBpMThuZXh0LnQoa2V5KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZXhpc3RzKGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBpMThuZXh0LmV4aXN0cyhrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzdXBwb3J0TGFuZ3VhZ2UobGFuZ3VhZ2U6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHRoaXMuYXZhaWxhYmxlc0xhbmd1YWdlc1tsYW5ndWFnZV0gIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgSTE4bkVuZ2luZS5nZXRJbnN0YW5jZSgpO1xuIiwiY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcblxuaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmltcG9ydCBJMThuRW5naW5lIGZyb20gJy4uL2kxOG4uZW5naW5lJztcblxuZXhwb3J0IGNsYXNzIEkxOG5IZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBpMThuX2tleTogc3RyaW5nKSB7XG4gICAgICAgIGlmIChJMThuRW5naW5lLmV4aXN0cyhpMThuX2tleSkpIHtcbiAgICAgICAgICAgIHJldHVybiBJMThuRW5naW5lLnRyYW5zbGF0ZShpMThuX2tleS50b0xvd2VyQ2FzZSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBpMThuX2tleTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSWZTdHJpbmdIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBhOiBhbnksIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5kZXhhYmxlU2lnbmF0dXJlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgbWV0aG9kKSB7XG4gICAgICAgIGNvbnN0IGFyZ3MgPSBtZXRob2QuYXJncy5tYXAoYXJnID0+IGAke2FyZy5uYW1lfTogJHthcmcudHlwZX1gKS5qb2luKCcsICcpO1xuICAgICAgICBpZiAobWV0aG9kLm5hbWUpIHtcbiAgICAgICAgICAgIHJldHVybiBgJHttZXRob2QubmFtZX1bJHthcmdzfV1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGBbJHthcmdzfV1gO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBJc0luaXRpYWxUYWJIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0YWJzOiBBcnJheTxhbnk+LCB0YWJJZDogU3RyaW5nLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRhYnNbMF0uaWQgPT09IHRhYklkID8gb3B0aW9ucy5mbihjb250ZXh0KSA6IG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi8uLi9jb25maWd1cmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIElzTm90VG9nZ2xlSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdHlwZSwgb3B0aW9ucykge1xuICAgICAgICBsZXQgcmVzdWx0ID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS50b2dnbGVNZW51SXRlbXMuaW5kZXhPZih0eXBlKTtcblxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS50b2dnbGVNZW51SXRlbXMuaW5kZXhPZignYWxsJykgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPT0gLTEpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuXG5leHBvcnQgY2xhc3MgSXNUYWJFbmFibGVkSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGFiczogQXJyYXk8YW55PiwgdGFiSWQ6IFN0cmluZywgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIGxldCBpc1RhYkVuYWJsZWQgPSAtMSAhPT0gXy5maW5kSW5kZXgodGFicywgeyBpZDogdGFiSWQgfSk7XG4gICAgICAgIHJldHVybiBpc1RhYkVuYWJsZWQgPyBvcHRpb25zLmZuKGNvbnRleHQpIDogb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSnNkb2NDb2RlRXhhbXBsZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwcml2YXRlIGNsZWFuVGFnKGNvbW1lbnQ6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGlmIChjb21tZW50LmNoYXJBdCgwKSA9PT0gJyonKSB7XG4gICAgICAgICAgICBjb21tZW50ID0gY29tbWVudC5zdWJzdHJpbmcoMSwgY29tbWVudC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50LmNoYXJBdCgwKSA9PT0gJyAnKSB7XG4gICAgICAgICAgICBjb21tZW50ID0gY29tbWVudC5zdWJzdHJpbmcoMSwgY29tbWVudC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50LmluZGV4T2YoJzxwPicpID09PSAwKSB7XG4gICAgICAgICAgICBjb21tZW50ID0gY29tbWVudC5zdWJzdHJpbmcoMywgY29tbWVudC5sZW5ndGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21tZW50LnN1YnN0cigtMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBjb21tZW50ID0gY29tbWVudC5zdWJzdHJpbmcoMCwgY29tbWVudC5sZW5ndGggLSAxKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tbWVudC5zdWJzdHIoLTQpID09PSAnPC9wPicpIHtcbiAgICAgICAgICAgIGNvbW1lbnQgPSBjb21tZW50LnN1YnN0cmluZygwLCBjb21tZW50Lmxlbmd0aCAtIDQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21tZW50O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SHRtbEVudGl0aWVzKHN0cik6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBTdHJpbmcoc3RyKVxuICAgICAgICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEpzZG9jVGFnSW50ZXJmYWNlW10sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgdGFncyA9IFtdO1xuICAgICAgICBsZXQgdHlwZSA9ICdodG1sJztcblxuICAgICAgICBpZiAob3B0aW9ucy5oYXNoLnR5cGUpIHtcbiAgICAgICAgICAgIHR5cGUgPSBvcHRpb25zLmhhc2gudHlwZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ2V4YW1wbGUnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWcgPSB7fSBhcyBKc2RvY1RhZ0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLmNvbW1lbnQuaW5kZXhPZignPGNhcHRpb24+JykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmNvbW1lbnQgPSBqc2RvY1RhZ3NbaV0uY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvPGNhcHRpb24+L2csICc8Yj48aT4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwvY2FwdGlvbj4vZywgJy9iPjwvaT4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLmNvbW1lbnQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPHByZSBjbGFzcz1cImxpbmUtbnVtYmVyc1wiPjxjb2RlIGNsYXNzPVwibGFuZ3VhZ2UtJHt0eXBlfVwiPmAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEh0bWxFbnRpdGllcyh0aGlzLmNsZWFuVGFnKGpzZG9jVGFnc1tpXS5jb21tZW50KSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgPC9jb2RlPjwvcHJlPmA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWdzLnB1c2godGFnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbnRleHQudGFncyA9IHRhZ3M7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSnNkb2NEZWZhdWx0SGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwganNkb2NUYWdzOiBKc2RvY1RhZ0ludGVyZmFjZVtdLCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpIHtcbiAgICAgICAgaWYgKGpzZG9jVGFncykge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IGpzZG9jVGFncy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgdGFnID0ge30gYXMgSnNkb2NUYWdJbnRlcmZhY2U7XG4gICAgICAgICAgICBsZXQgZGVmYXVsdFZhbHVlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZS50ZXh0ID09PSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLnR5cGVFeHByZXNzaW9uICYmIGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbi50eXBlLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcudHlwZSA9IGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbi50eXBlLm5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0uY29tbWVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5jb21tZW50ID0ganNkb2NUYWdzW2ldLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcubmFtZSA9IGpzZG9jVGFnc1tpXS5uYW1lLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC50YWcgPSB0YWc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBKc2RvY1RhZ0ludGVyZmFjZSB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvanNkb2MtdGFnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jRXhhbXBsZUhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGpzZG9jVGFnczogSnNkb2NUYWdJbnRlcmZhY2VbXSwgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGxlbiA9IGpzZG9jVGFncy5sZW5ndGg7XG4gICAgICAgIGxldCB0YWdzID0gW107XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZS50ZXh0ID09PSAnZXhhbXBsZScpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZyA9IHt9IGFzIEpzZG9jVGFnSW50ZXJmYWNlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLmNvbW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5jb21tZW50ID0ganNkb2NUYWdzW2ldLmNvbW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvPGNhcHRpb24+L2csICc8Yj48aT4nKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXC9jYXB0aW9uPi9nLCAnL2I+PC9pPicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRhZ3MucHVzaCh0YWcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhZ3MgPSB0YWdzO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IEpzZG9jVGFnSW50ZXJmYWNlIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9qc2RvYy10YWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jUGFyYW1zVmFsaWRIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEpzZG9jVGFnSW50ZXJmYWNlW10sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgdGFncyA9IFtdO1xuICAgICAgICBsZXQgdmFsaWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lLnRleHQgPT09ICdwYXJhbScpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSnNkb2NUYWdJbnRlcmZhY2UgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2pzZG9jLXRhZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsga2luZFRvVHlwZSB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2tpbmQtdG8tdHlwZSc7XG5cbmV4cG9ydCBjbGFzcyBKc2RvY1BhcmFtc0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhcbiAgICAgICAgY29udGV4dDogYW55LFxuICAgICAgICBqc2RvY1RhZ3M6IEFycmF5PEpzZG9jVGFnSW50ZXJmYWNlIHwgYW55PixcbiAgICAgICAgb3B0aW9uczogSUhhbmRsZWJhcnNPcHRpb25zXG4gICAgKSB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgbGV0IGxlbiA9IGpzZG9jVGFncy5sZW5ndGg7XG4gICAgICAgIGxldCB0YWdzID0gW107XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZSkge1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0udGFnTmFtZS50ZXh0ID09PSAncGFyYW0nKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YWcgPSB7fSBhcyBKc2RvY1RhZ0ludGVyZmFjZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbiAmJiBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcudHlwZSA9IGtpbmRUb1R5cGUoanNkb2NUYWdzW2ldLnR5cGVFeHByZXNzaW9uLnR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbiAmJiBqc2RvY1RhZ3NbaV0udHlwZUV4cHJlc3Npb24udHlwZS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcudHlwZSA9IGpzZG9jVGFnc1tpXS50eXBlRXhwcmVzc2lvbi50eXBlLm5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhZy50eXBlID0ganNkb2NUYWdzW2ldLnR5cGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS5jb21tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcuY29tbWVudCA9IGpzZG9jVGFnc1tpXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0uZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YWcuZGVmYXVsdFZhbHVlID0ganNkb2NUYWdzW2ldLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoanNkb2NUYWdzW2ldLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0ubmFtZS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUgPSBqc2RvY1RhZ3NbaV0ubmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcubmFtZSA9IGpzZG9jVGFnc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChqc2RvY1RhZ3NbaV0ub3B0aW9uYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICh0YWcgYXMgYW55KS5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGFncy5wdXNoKHRhZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0YWdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICBjb250ZXh0LnRhZ3MgPSB0YWdzO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIEpzZG9jUmV0dXJuc0NvbW1lbnRIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBqc2RvY1RhZ3M6IEFycmF5PGFueT4sIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBqc2RvY1RhZ3MubGVuZ3RoO1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgaWYgKGpzZG9jVGFnc1tpXS50YWdOYW1lKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBqc2RvY1RhZ3NbaV0udGFnTmFtZS50ZXh0ID09PSAncmV0dXJucycgfHxcbiAgICAgICAgICAgICAgICAgICAganNkb2NUYWdzW2ldLnRhZ05hbWUudGV4dCA9PT0gJ3JldHVybidcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0ganNkb2NUYWdzW2ldLmNvbW1lbnQ7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IFByb2plY3QsIHRzLCBQcm9wZXJ0eURlY2xhcmF0aW9uLCBTeW50YXhLaW5kLCBWYXJpYWJsZURlY2xhcmF0aW9uIH0gZnJvbSAndHMtbW9ycGgnO1xuaW1wb3J0IEZpbGVFbmdpbmUgZnJvbSAnLi4vYXBwL2VuZ2luZXMvZmlsZS5lbmdpbmUnO1xuXG5jb25zdCBhc3QgPSBuZXcgUHJvamVjdCgpO1xuXG5leHBvcnQgY2xhc3MgSW1wb3J0c1V0aWwge1xuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBJbXBvcnRzVXRpbDtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUltcG9ydHNVdGlsLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBJbXBvcnRzVXRpbC5pbnN0YW5jZSA9IG5ldyBJbXBvcnRzVXRpbCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBJbXBvcnRzVXRpbC5pbnN0YW5jZTtcbiAgICB9XG4gICAgLyoqXG4gICAgICogRmluZCBmb3IgYSBzb3VyY2VGaWxlIGEgdmFyaWFibGUgdmFsdWUgaW4gYSBsb2NhbCBlbnVtXG4gICAgICogQHBhcmFtIHNyY0ZpbGVcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVOYW1lXG4gICAgICogQHBhcmFtIHZhcmlhYmxlVmFsdWVcbiAgICAgKi9cbiAgICBwcml2YXRlIGZpbmRJbkVudW1zKHNyY0ZpbGUsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHJlcyA9ICcnO1xuICAgICAgICBzcmNGaWxlLmdldEVudW0oZSA9PiB7XG4gICAgICAgICAgICBpZiAoZS5nZXROYW1lKCkgPT09IHZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgIGUuZ2V0TWVtYmVyKG0gPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobS5nZXROYW1lKCkgPT09IHZhcmlhYmxlVmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IG0uZ2V0VmFsdWUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBGaW5kIGZvciBhIHNvdXJjZUZpbGUgYSB2YXJpYWJsZSB2YWx1ZSBpbiBhIGxvY2FsIHN0YXRpYyBjbGFzc1xuICAgICAqIEBwYXJhbSBzcmNGaWxlXG4gICAgICogQHBhcmFtIHZhcmlhYmxlTmFtZVxuICAgICAqIEBwYXJhbSB2YXJpYWJsZVZhbHVlXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kSW5DbGFzc2VzKHNyY0ZpbGUsIHZhcmlhYmxlTmFtZTogc3RyaW5nLCB2YXJpYWJsZVZhbHVlOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHJlcyA9ICcnO1xuICAgICAgICBzcmNGaWxlLmdldENsYXNzKGMgPT4ge1xuICAgICAgICAgICAgbGV0IHN0YXRpY1Byb3BlcnR5OiBQcm9wZXJ0eURlY2xhcmF0aW9uID0gYy5nZXRTdGF0aWNQcm9wZXJ0eSh2YXJpYWJsZVZhbHVlKTtcbiAgICAgICAgICAgIGlmIChzdGF0aWNQcm9wZXJ0eSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0aWNQcm9wZXJ0eS5nZXRJbml0aWFsaXplcigpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcyA9IHN0YXRpY1Byb3BlcnR5LmdldEluaXRpYWxpemVyKCkuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiByZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBhIHZhbHVlIGluIGEgbG9jYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gbGlrZSBhbiBvYmplY3RcbiAgICAgKiBAcGFyYW0gdmFyaWFibGVEZWNsYXJhdGlvblxuICAgICAqIEBwYXJhbSB2YXJpYWJsZXNBdHRyaWJ1dGVzXG4gICAgICovXG4gICAgcHJpdmF0ZSBmaW5kSW5PYmplY3RWYXJpYWJsZURlY2xhcmF0aW9uKHZhcmlhYmxlRGVjbGFyYXRpb24sIHZhcmlhYmxlc0F0dHJpYnV0ZXMpIHtcbiAgICAgICAgbGV0IHZhcmlhYmxlS2luZCA9IHZhcmlhYmxlRGVjbGFyYXRpb24uZ2V0S2luZCgpO1xuICAgICAgICBpZiAodmFyaWFibGVLaW5kICYmIHZhcmlhYmxlS2luZCA9PT0gU3ludGF4S2luZC5WYXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXIgPSB2YXJpYWJsZURlY2xhcmF0aW9uLmdldEluaXRpYWxpemVyKCk7XG4gICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXJLaW5kID0gaW5pdGlhbGl6ZXIuZ2V0S2luZCgpO1xuICAgICAgICAgICAgICAgIGlmIChpbml0aWFsaXplcktpbmQgJiYgaW5pdGlhbGl6ZXJLaW5kID09PSBTeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb21waWxlck5vZGUgPSBpbml0aWFsaXplci5jb21waWxlck5vZGUgYXMgdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFZhbHVlID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlc3RyaW5nIGZyb20gQVZBUi5CVkFSLnRoZXN0cmluZyBpbnNpZGUgcHJvcGVydGllc1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGVwdGggPSAwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbG9vcFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcC5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZXNBdHRyaWJ1dGVzW2RlcHRoICsgMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLm5hbWUuZ2V0VGV4dCgpID09PSB2YXJpYWJsZXNBdHRyaWJ1dGVzW2RlcHRoICsgMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcC5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcC5pbml0aWFsaXplci5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcFByb3BlcnRpZXMocHJvcC5pbml0aWFsaXplci5wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsVmFsdWUgPSBwcm9wLmluaXRpYWxpemVyLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFZhbHVlID0gcHJvcC5pbml0aWFsaXplci50ZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBsb29wUHJvcGVydGllcyhjb21waWxlck5vZGUucHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbFZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZpbmQgaW4gaW1wb3J0cyBzb21ldGhpbmcgbGlrZSBteXZhclxuICAgICAqIEBwYXJhbSAge3N0cmluZ30gaW5wdXRWYXJpYWJsZU5hbWUgICAgICAgICAgICAgIGxpa2UgbXl2YXJcbiAgICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteXZhciB2YWx1ZVxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kVmFsdWVJbkltcG9ydE9yTG9jYWxWYXJpYWJsZXMoXG4gICAgICAgIGlucHV0VmFyaWFibGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIGRlY29yYXRvclR5cGU/OiBzdHJpbmdcbiAgICApIHtcbiAgICAgICAgbGV0IG1ldGFkYXRhVmFyaWFibGVOYW1lID0gaW5wdXRWYXJpYWJsZU5hbWUsXG4gICAgICAgICAgICBzZWFyY2hlZEltcG9ydCxcbiAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gJycsXG4gICAgICAgICAgICBmb3VuZFdpdGhOYW1lZEltcG9ydCA9IGZhbHNlLFxuICAgICAgICAgICAgZm91bmRXaXRoRGVmYXVsdEltcG9ydCA9IGZhbHNlLFxuICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBmaWxlID1cbiAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlLmZpbGVOYW1lKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aElmRXhpc3RzKHNvdXJjZUZpbGUuZmlsZU5hbWUpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSBmaWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBMb29wIHRocm91Z2ggYWxsIGltcG9ydHMsIGFuZCBmaW5kIG9uZSBtYXRjaGluZyBpbnB1dFZhcmlhYmxlTmFtZVxuICAgICAgICAgKi9cbiAgICAgICAgaW1wb3J0cy5mb3JFYWNoKGkgPT4ge1xuICAgICAgICAgICAgbGV0IG5hbWVkSW1wb3J0cyA9IGkuZ2V0TmFtZWRJbXBvcnRzKCksXG4gICAgICAgICAgICAgICAgbmFtZWRJbXBvcnRzTGVuZ3RoID0gbmFtZWRJbXBvcnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICBqID0gMDtcblxuICAgICAgICAgICAgaWYgKG5hbWVkSW1wb3J0c0xlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBmb3IgKGo7IGogPCBuYW1lZEltcG9ydHNMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW1wb3J0TmFtZSA9IG5hbWVkSW1wb3J0c1tqXS5nZXROYW1lTm9kZSgpLmdldFRleHQoKSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRBbGlhcztcblxuICAgICAgICAgICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRBbGlhcyA9IG5hbWVkSW1wb3J0c1tqXS5nZXRBbGlhc05vZGUoKS5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydE5hbWUgPT09IG1ldGFkYXRhVmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhOYW1lZEltcG9ydCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0QWxpYXMgPT09IG1ldGFkYXRhVmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhOYW1lZEltcG9ydCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9IGltcG9ydE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZUltcG9ydCA9IGkuZ2V0TmFtZXNwYWNlSW1wb3J0KCk7XG4gICAgICAgICAgICBpZiAobmFtZXNwYWNlSW1wb3J0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlSW1wb3J0TG9jYWxOYW1lID0gbmFtZXNwYWNlSW1wb3J0LmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlSW1wb3J0TG9jYWxOYW1lID09PSBtZXRhZGF0YVZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWZvdW5kV2l0aE5hbWVkSW1wb3J0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGVmYXVsdEltcG9ydCA9IGkuZ2V0RGVmYXVsdEltcG9ydCgpO1xuICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0SW1wb3J0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRJbXBvcnRUZXh0ID0gZGVmYXVsdEltcG9ydC5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0SW1wb3J0VGV4dCA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aERlZmF1bHRJbXBvcnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBmdW5jdGlvbiBoYXNGb3VuZFZhbHVlcyh2YXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICBsZXQgdmFyaWFibGVLaW5kID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRLaW5kKCk7XG5cbiAgICAgICAgICAgIGlmICh2YXJpYWJsZUtpbmQgJiYgdmFyaWFibGVLaW5kID09PSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5pdGlhbGl6ZXIgPSB2YXJpYWJsZURlY2xhcmF0aW9uLmdldEluaXRpYWxpemVyKCk7XG4gICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplcktpbmQgPSBpbml0aWFsaXplci5nZXRLaW5kKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbml0aWFsaXplcktpbmQgJiYgaW5pdGlhbGl6ZXJLaW5kID09PSBTeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcGlsZXJOb2RlID0gaW5pdGlhbGl6ZXIuY29tcGlsZXJOb2RlIGFzIHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVyTm9kZS5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBzZWFyY2hlZEltcG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxldCBpbXBvcnRQYXRoUmVmZXJlbmNlID0gc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyU291cmNlRmlsZSgpO1xuICAgICAgICAgICAgbGV0IGltcG9ydFBhdGg7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGltcG9ydFBhdGhSZWZlcmVuY2UgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgaW1wb3J0UGF0aCA9IGltcG9ydFBhdGhSZWZlcmVuY2UuY29tcGlsZXJOb2RlLmZpbGVOYW1lO1xuXG4gICAgICAgICAgICAgICAgY29uc3Qgc291cmNlRmlsZUltcG9ydCA9XG4gICAgICAgICAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShpbXBvcnRQYXRoKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoaW1wb3J0UGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogYXN0LmFkZFNvdXJjZUZpbGVBdFBhdGhJZkV4aXN0cyhpbXBvcnRQYXRoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuXG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhcmlhYmxlTmFtZSA9IGZvdW5kV2l0aEFsaWFzID8gYWxpYXNPcmlnaW5hbE5hbWUgOiBtZXRhZGF0YVZhcmlhYmxlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhcmlhYmxlRGVjbGFyYXRpb24gPSBzb3VyY2VGaWxlSW1wb3J0LmdldFZhcmlhYmxlRGVjbGFyYXRpb24odmFyaWFibGVOYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc0ZvdW5kVmFsdWVzKHZhcmlhYmxlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJ5IHdpdGggZXhwb3J0c1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhwb3J0RGVjbGFyYXRpb25zID0gc291cmNlRmlsZUltcG9ydC5nZXRFeHBvcnRlZERlY2xhcmF0aW9ucygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhwb3J0RGVjbGFyYXRpb25zICYmIGV4cG9ydERlY2xhcmF0aW9ucy5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvbktleSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb25WYWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdIG9mIGV4cG9ydERlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnREZWNsYXJhdGlvblZhbHVlcy5mb3JFYWNoKGV4cG9ydERlY2xhcmF0aW9uVmFsdWUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydERlY2xhcmF0aW9uVmFsdWUgaW5zdGFuY2VvZiBWYXJpYWJsZURlY2xhcmF0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwb3J0RGVjbGFyYXRpb25WYWx1ZS5nZXROYW1lKCkgPT09IHZhcmlhYmxlTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc0ZvdW5kVmFsdWVzKGV4cG9ydERlY2xhcmF0aW9uVmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIWltcG9ydFBhdGhSZWZlcmVuY2UgJiZcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JUeXBlID09PSAndGVtcGxhdGUnICYmXG4gICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKS5pbmRleE9mKCcuaHRtbCcpICE9PSAtMVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxTb3VyY2VGaWxlUGF0aCA9IHNvdXJjZUZpbGUucGF0aDtcbiAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbFNvdXJjZUZpbGVQYXRoRm9sZGVyID0gb3JpZ2luYWxTb3VyY2VGaWxlUGF0aC5zdWJzdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU291cmNlRmlsZVBhdGgubGFzdEluZGV4T2YoJy8nKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgY29uc3QgZmluYWxJbXBvcnRlZFBhdGggPVxuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbFNvdXJjZUZpbGVQYXRoRm9sZGVyICsgJy8nICsgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbEltcG9ydGVkUGF0aERhdGEgPSBGaWxlRW5naW5lLmdldFN5bmMoZmluYWxJbXBvcnRlZFBhdGgpO1xuICAgICAgICAgICAgICAgIHJldHVybiBmaW5hbEltcG9ydGVkUGF0aERhdGE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBGaW5kIGluIGxvY2FsIHZhcmlhYmxlcyBvZiB0aGUgZmlsZVxuICAgICAgICAgICAgY29uc3QgdmFyaWFibGVEZWNsYXJhdGlvbiA9IGZpbGUuZ2V0VmFyaWFibGVEZWNsYXJhdGlvbihtZXRhZGF0YVZhcmlhYmxlTmFtZSk7XG4gICAgICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbikge1xuICAgICAgICAgICAgICAgIGxldCB2YXJpYWJsZUtpbmQgPSB2YXJpYWJsZURlY2xhcmF0aW9uLmdldEtpbmQoKTtcblxuICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZUtpbmQgJiYgdmFyaWFibGVLaW5kID09PSBTeW50YXhLaW5kLlZhcmlhYmxlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluaXRpYWxpemVyID0gdmFyaWFibGVEZWNsYXJhdGlvbi5nZXRJbml0aWFsaXplcigpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbml0aWFsaXplcktpbmQgPSBpbml0aWFsaXplci5nZXRLaW5kKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJLaW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJLaW5kID09PSBTeW50YXhLaW5kLk9iamVjdExpdGVyYWxFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tcGlsZXJOb2RlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXIuY29tcGlsZXJOb2RlIGFzIHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21waWxlck5vZGUucHJvcGVydGllcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbGl6ZXJLaW5kICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGluaXRpYWxpemVyS2luZCA9PT0gU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemVyS2luZCA9PT0gU3ludGF4S2luZC5Ob1N1YnN0aXR1dGlvblRlbXBsYXRlTGl0ZXJhbClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3JUeXBlID09PSAndGVtcGxhdGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbml0aWFsaXplci5nZXRUZXh0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRpb24uY29tcGlsZXJOb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5pdGlhbGl6ZXJLaW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhcmlhYmxlRGVjbGFyYXRpb24uY29tcGlsZXJOb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRGaWxlTmFtZU9mSW1wb3J0KHZhcmlhYmxlTmFtZTogc3RyaW5nLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPVxuICAgICAgICAgICAgdHlwZW9mIGFzdC5nZXRTb3VyY2VGaWxlKHNvdXJjZUZpbGUuZmlsZU5hbWUpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZS5maWxlTmFtZSlcbiAgICAgICAgICAgICAgICA6IGFzdC5hZGRTb3VyY2VGaWxlQXRQYXRoKHNvdXJjZUZpbGUuZmlsZU5hbWUpOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgIGNvbnN0IGltcG9ydHMgPSBmaWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpO1xuICAgICAgICBsZXQgc2VhcmNoZWRJbXBvcnQsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZmluYWxQYXRoID0gJycsXG4gICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IGZhbHNlO1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gdmFyaWFibGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCA9IGk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0QWxpYXMgPT09IHZhcmlhYmxlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSBpbXBvcnROYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgbGV0IGltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgcGF0aC5kaXJuYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpICtcbiAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArXG4gICAgICAgICAgICAgICAgICAgICcudHMnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgbGV0IGNsZWFuZXIgPSAocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgICAgICBmaW5hbFBhdGggPSBpbXBvcnRQYXRoLnJlcGxhY2UoY2xlYW5lciwgJycpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbFBhdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgZmlsZSBwYXRoIG9mIGltcG9ydGVkIHZhcmlhYmxlXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBpbnB1dFZhcmlhYmxlTmFtZSAgbGlrZSB0aGVzdHJpbmdcbiAgICAgKiBAcmV0dXJuIHtbdHlwZV19ICAgICAgICAgICAgICAgICAgICB0aGVzdHJpbmcgZGVzdGluYXRpb24gcGF0aFxuICAgICAqL1xuICAgIHB1YmxpYyBmaW5kRmlsZVBhdGhPZkltcG9ydGVkVmFyaWFibGUoaW5wdXRWYXJpYWJsZU5hbWUsIHNvdXJjZUZpbGVQYXRoOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IHNlYXJjaGVkSW1wb3J0LFxuICAgICAgICAgICAgZmluYWxQYXRoID0gJycsXG4gICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcbiAgICAgICAgY29uc3QgZmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZVBhdGgpICE9PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZVBhdGgpXG4gICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aChzb3VyY2VGaWxlUGF0aCk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvb3AgdGhyb3VnaCBhbGwgaW1wb3J0cywgYW5kIGZpbmQgb25lIG1hdGNoaW5nIGlucHV0VmFyaWFibGVOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gaW5wdXRWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRBbGlhcyA9PT0gaW5wdXRWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gaW1wb3J0TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHR5cGVvZiBzZWFyY2hlZEltcG9ydCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUoc291cmNlRmlsZVBhdGgpICtcbiAgICAgICAgICAgICAgICAgICAgJy8nICtcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQuZ2V0TW9kdWxlU3BlY2lmaWVyVmFsdWUoKSArXG4gICAgICAgICAgICAgICAgICAgICcudHMnXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaW5hbFBhdGg7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRmluZCBpbiBpbXBvcnRzIHNvbWV0aGluZyBsaWtlIFZBUi5BVkFSLkJWQVIudGhlc3RyaW5nXG4gICAgICogQHBhcmFtICB7c3RyaW5nfSBpbnB1dFZhcmlhYmxlTmFtZSAgICAgICAgICAgICAgICAgICBsaWtlIFZBUi5BVkFSLkJWQVIudGhlc3RyaW5nXG4gICAgICogQHJldHVybiB7W3R5cGVdfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlc3RyaW5nIHZhbHVlXG4gICAgICovXG4gICAgcHVibGljIGZpbmRQcm9wZXJ0eVZhbHVlSW5JbXBvcnRPckxvY2FsVmFyaWFibGVzKGlucHV0VmFyaWFibGVOYW1lLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSB7XG4gICAgICAgIGxldCB2YXJpYWJsZXNBdHRyaWJ1dGVzID0gaW5wdXRWYXJpYWJsZU5hbWUuc3BsaXQoJy4nKSxcbiAgICAgICAgICAgIG1ldGFkYXRhVmFyaWFibGVOYW1lID0gdmFyaWFibGVzQXR0cmlidXRlc1swXSxcbiAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0LFxuICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSAnJyxcbiAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gZmFsc2U7XG5cbiAgICAgICAgY29uc3QgZmlsZSA9XG4gICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoc291cmNlRmlsZS5maWxlTmFtZSkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyBhc3QuZ2V0U291cmNlRmlsZShzb3VyY2VGaWxlLmZpbGVOYW1lKVxuICAgICAgICAgICAgICAgIDogYXN0LmFkZFNvdXJjZUZpbGVBdFBhdGgoc291cmNlRmlsZS5maWxlTmFtZSk7IC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExvb3AgdGhyb3VnaCBhbGwgaW1wb3J0cywgYW5kIGZpbmQgb25lIG1hdGNoaW5nIGlucHV0VmFyaWFibGVOYW1lXG4gICAgICAgICAqL1xuICAgICAgICBpbXBvcnRzLmZvckVhY2goaSA9PiB7XG4gICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICBuYW1lZEltcG9ydHNMZW5ndGggPSBuYW1lZEltcG9ydHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIGogPSAwO1xuXG4gICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IG5hbWVkSW1wb3J0c0xlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbXBvcnROYW1lID0gbmFtZWRJbXBvcnRzW2pdLmdldE5hbWVOb2RlKCkuZ2V0VGV4dCgpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzID0gbmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbXBvcnRBbGlhcyA9PT0gbWV0YWRhdGFWYXJpYWJsZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWFzT3JpZ2luYWxOYW1lID0gaW1wb3J0TmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgZmlsZVRvU2VhcmNoSW4sIHZhcmlhYmxlRGVjbGFyYXRpb247XG4gICAgICAgIGlmICh0eXBlb2Ygc2VhcmNoZWRJbXBvcnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICBsZXQgaW1wb3J0UGF0aCA9IHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUoc291cmNlRmlsZS5maWxlTmFtZSkgK1xuICAgICAgICAgICAgICAgICAgICAnLycgK1xuICAgICAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydC5nZXRNb2R1bGVTcGVjaWZpZXJWYWx1ZSgpICtcbiAgICAgICAgICAgICAgICAgICAgJy50cydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlSW1wb3J0ID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgYXN0LmdldFNvdXJjZUZpbGUoaW1wb3J0UGF0aCkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgICAgID8gYXN0LmdldFNvdXJjZUZpbGUoaW1wb3J0UGF0aClcbiAgICAgICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aChpbXBvcnRQYXRoKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICBmaWxlVG9TZWFyY2hJbiA9IHNvdXJjZUZpbGVJbXBvcnQ7XG4gICAgICAgICAgICAgICAgbGV0IHZhcmlhYmxlTmFtZSA9IGZvdW5kV2l0aEFsaWFzID8gYWxpYXNPcmlnaW5hbE5hbWUgOiBtZXRhZGF0YVZhcmlhYmxlTmFtZTtcbiAgICAgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uID0gZmlsZVRvU2VhcmNoSW4uZ2V0VmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmlsZVRvU2VhcmNoSW4gPSBmaWxlO1xuICAgICAgICAgICAgLy8gRmluZCBpbiBsb2NhbCB2YXJpYWJsZXMgb2YgdGhlIGZpbGVcbiAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb24gPSBmaWxlVG9TZWFyY2hJbi5nZXRWYXJpYWJsZURlY2xhcmF0aW9uKG1ldGFkYXRhVmFyaWFibGVOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh2YXJpYWJsZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kSW5PYmplY3RWYXJpYWJsZURlY2xhcmF0aW9uKHZhcmlhYmxlRGVjbGFyYXRpb24sIHZhcmlhYmxlc0F0dHJpYnV0ZXMpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRyeSBmaW5kIGl0IGluIGVudW1zXG4gICAgICAgIGlmICh2YXJpYWJsZXNBdHRyaWJ1dGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsZVRvU2VhcmNoSW4gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IHRoaXMuZmluZEluRW51bXMoXG4gICAgICAgICAgICAgICAgICAgIGZpbGVUb1NlYXJjaEluLFxuICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YVZhcmlhYmxlTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzQXR0cmlidXRlc1sxXVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFsID0gdGhpcy5maW5kSW5DbGFzc2VzKFxuICAgICAgICAgICAgICAgICAgICBmaWxlVG9TZWFyY2hJbixcbiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFWYXJpYWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlc0F0dHJpYnV0ZXNbMV1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgIT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBJbXBvcnRzVXRpbC5nZXRJbnN0YW5jZSgpO1xuIiwiY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcbmltcG9ydCAqIGFzIEpTT041IGZyb20gJ2pzb241JztcbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBQcm9qZWN0LCB0cywgU291cmNlRmlsZSwgU3ludGF4S2luZCwgTm9kZSB9IGZyb20gJ3RzLW1vcnBoJztcblxuaW1wb3J0IEZpbGVFbmdpbmUgZnJvbSAnLi4vYXBwL2VuZ2luZXMvZmlsZS5lbmdpbmUnO1xuaW1wb3J0IHsgUm91dGluZ0dyYXBoTm9kZSB9IGZyb20gJy4uL2FwcC9ub2Rlcy9yb3V0aW5nLWdyYXBoLW5vZGUnO1xuXG5pbXBvcnQgSW1wb3J0c1V0aWwgZnJvbSAnLi9pbXBvcnRzLnV0aWwnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXInO1xuXG5jb25zdCB0cmF2ZXJzZSA9IHJlcXVpcmUoJ25lb3RyYXZlcnNlL2xlZ2FjeScpO1xuXG5jb25zdCBhc3QgPSBuZXcgUHJvamVjdCgpO1xuXG5leHBvcnQgY2xhc3MgUm91dGVyUGFyc2VyVXRpbCB7XG4gICAgcHVibGljIHNjYW5uZWRGaWxlczogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIHJvdXRlczogYW55W10gPSBbXTtcbiAgICBwcml2YXRlIGluY29tcGxldGVSb3V0ZXMgPSBbXTtcbiAgICBwcml2YXRlIG1vZHVsZXMgPSBbXTtcbiAgICBwcml2YXRlIG1vZHVsZXNUcmVlO1xuICAgIHByaXZhdGUgcm9vdE1vZHVsZTogc3RyaW5nO1xuICAgIHByaXZhdGUgY2xlYW5Nb2R1bGVzVHJlZTtcbiAgICBwcml2YXRlIG1vZHVsZXNXaXRoUm91dGVzID0gW107XG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1Bbmd1bGFyOEltcG9ydFN5bnRheCA9XG4gICAgICAgIC8oWydcIl1sb2FkQ2hpbGRyZW5bJ1wiXTopXFwoXFwpKDpbXildKz8pPz0+XCJpbXBvcnRcXCgoXFxcXCd8J3xcInxgKShbXidcIl0rPykoXFxcXCd8J3xcInxgKVxcKVxcLnRoZW5cXChcXCg/XFx3Kz9cXCk/PT5cXFMrP1xcLihbXildKz8pXFwpKFxcXFwnfCd8XCIpL2c7XG4gICAgcHJpdmF0ZSB0cmFuc2Zvcm1Bbmd1bGFyOEltcG9ydFN5bnRheENvbXBvbmVudCA9XG4gICAgICAgIC8oWydcIl1sb2FkQ29tcG9uZW50WydcIl06KVxcKFxcKSg6W14pXSs/KT89PlwiaW1wb3J0XFwoKFxcXFwnfCd8XCJ8YCkoW14nXCJdKz8pKFxcXFwnfCd8XCJ8YClcXClcXC50aGVuXFwoXFwoP1xcdys/XFwpPz0+XFxTKz9cXC4oW14pXSs/KVxcKShcXFxcJ3wnfFwiKS9nO1xuICAgIHByaXZhdGUgdHJhbnNmb3JtQW5ndWxhcjhJbXBvcnRTeW50YXhBc3luY0F3YWl0ID1cbiAgICAgICAgLyhbJ1wiXWxvYWRDaGlsZHJlblsnXCJdOilcXChcXCkoOlteKV0rPyk/PT5cXChcImltcG9ydFxcKChcXFxcJ3wnfFwifGApKFteJ1wiXSs/KShcXFxcJ3wnfFwifGApXFwpXCJcXClcXC5bJ1wiXShbXildKz8pWydcIl0vZztcbiAgICBwcml2YXRlIHRyYW5zZm9ybUFuZ3VsYXI4SW1wb3J0U3ludGF4Q29tcG9uZW50QXN5bmNBd2FpdCA9XG4gICAgICAgIC8oWydcIl1sb2FkQ29tcG9uZW50WydcIl06KVxcKFxcKSg6W14pXSs/KT89PlxcKFwiaW1wb3J0XFwoKFxcXFwnfCd8XCJ8YCkoW14nXCJdKz8pKFxcXFwnfCd8XCJ8YClcXClcIlxcKVxcLlsnXCJdKFteKV0rPylbJ1wiXS9nO1xuICAgIHByaXZhdGUgdHJhaWxpbmdDb21tYSA9IC8sXFxzKihbXFxdfSldKS9nO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFJvdXRlclBhcnNlclV0aWw7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFSb3V0ZXJQYXJzZXJVdGlsLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsLmluc3RhbmNlID0gbmV3IFJvdXRlclBhcnNlclV0aWwoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUm91dGVyUGFyc2VyVXRpbC5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkUm91dGUocm91dGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5yb3V0ZXMucHVzaChyb3V0ZSk7XG4gICAgICAgIHRoaXMucm91dGVzID0gXy5zb3J0QnkoXy51bmlxV2l0aCh0aGlzLnJvdXRlcywgXy5pc0VxdWFsKSwgWyduYW1lJ10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRJbmNvbXBsZXRlUm91dGUocm91dGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pbmNvbXBsZXRlUm91dGVzLnB1c2gocm91dGUpO1xuICAgICAgICB0aGlzLmluY29tcGxldGVSb3V0ZXMgPSBfLnNvcnRCeShfLnVuaXFXaXRoKHRoaXMuaW5jb21wbGV0ZVJvdXRlcywgXy5pc0VxdWFsKSwgWyduYW1lJ10pO1xuICAgIH1cblxuICAgIHB1YmxpYyBhZGRNb2R1bGVXaXRoUm91dGVzKG1vZHVsZU5hbWUsIG1vZHVsZUltcG9ydHMsIGZpbGVuYW1lKTogdm9pZCB7XG4gICAgICAgIHRoaXMubW9kdWxlc1dpdGhSb3V0ZXMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBtb2R1bGVOYW1lLFxuICAgICAgICAgICAgaW1wb3J0c05vZGU6IG1vZHVsZUltcG9ydHMsXG4gICAgICAgICAgICBmaWxlbmFtZTogZmlsZW5hbWVcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kdWxlc1dpdGhSb3V0ZXMgPSBfLnNvcnRCeShfLnVuaXFXaXRoKHRoaXMubW9kdWxlc1dpdGhSb3V0ZXMsIF8uaXNFcXVhbCksIFsnbmFtZSddKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYWRkTW9kdWxlKG1vZHVsZU5hbWU6IHN0cmluZywgbW9kdWxlSW1wb3J0cyk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZHVsZXMucHVzaCh7XG4gICAgICAgICAgICBuYW1lOiBtb2R1bGVOYW1lLFxuICAgICAgICAgICAgaW1wb3J0c05vZGU6IG1vZHVsZUltcG9ydHNcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kdWxlcyA9IF8uc29ydEJ5KF8udW5pcVdpdGgodGhpcy5tb2R1bGVzLCBfLmlzRXF1YWwpLCBbJ25hbWUnXSk7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFuUmF3Um91dGVQYXJzZWQocm91dGU6IHN0cmluZyk6IG9iamVjdCB7XG4gICAgICAgIHJldHVybiBKU09ONS5wYXJzZSh0aGlzLmNsZWFuUmF3Um91dGUocm91dGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYW5SYXdSb3V0ZShyb3V0ZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHJvdXRlXG4gICAgICAgICAgICAucmVwbGFjZSgvXFxzL2csICcnKVxuICAgICAgICAgICAgLnJlcGxhY2UodGhpcy50cmFpbGluZ0NvbW1hLCAnJDEnKVxuICAgICAgICAgICAgLnJlcGxhY2UodGhpcy50cmFuc2Zvcm1Bbmd1bGFyOEltcG9ydFN5bnRheCwgJyQxXCIkNCMkNlwiJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHRoaXMudHJhbnNmb3JtQW5ndWxhcjhJbXBvcnRTeW50YXhBc3luY0F3YWl0LCAnJDFcIiQ0IyQ2XCInKVxuICAgICAgICAgICAgLnJlcGxhY2UodGhpcy50cmFuc2Zvcm1Bbmd1bGFyOEltcG9ydFN5bnRheENvbXBvbmVudCwgJyQxXCIkNCMkNlwiJylcbiAgICAgICAgICAgIC5yZXBsYWNlKHRoaXMudHJhbnNmb3JtQW5ndWxhcjhJbXBvcnRTeW50YXhDb21wb25lbnRBc3luY0F3YWl0LCAnJDFcIiQ0IyQ2XCInKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgc2V0Um9vdE1vZHVsZShtb2R1bGU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLnJvb3RNb2R1bGUgPSBtb2R1bGU7XG4gICAgfVxuXG4gICAgcHVibGljIGhhc1JvdXRlck1vZHVsZUluSW1wb3J0cyhpbXBvcnRzOiBBcnJheTxhbnk+KTogYm9vbGVhbiB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW1wb3J0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGltcG9ydHNbaV0ubmFtZS5pbmRleE9mKCdSb3V0ZXJNb2R1bGUuZm9yQ2hpbGQnKSAhPT0gLTEgfHxcbiAgICAgICAgICAgICAgICBpbXBvcnRzW2ldLm5hbWUuaW5kZXhPZignUm91dGVyTW9kdWxlLmZvclJvb3QnKSAhPT0gLTEgfHxcbiAgICAgICAgICAgICAgICBpbXBvcnRzW2ldLm5hbWUuaW5kZXhPZignUm91dGVyTW9kdWxlJykgIT09IC0xXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZml4SW5jb21wbGV0ZVJvdXRlcyhtaXNjZWxsYW5lb3VzVmFyaWFibGVzOiBBcnJheTxhbnk+KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IG1hdGNoaW5nVmFyaWFibGVzID0gW107XG4gICAgICAgIC8vIEZvciBlYWNoIGluY29tcGxldGVSb3V0ZSwgc2NhbiBpZiBvbmUgbWlzYyB2YXJpYWJsZSBpcyBpbiBjb2RlXG4gICAgICAgIC8vIGlmIG9rLCB0cnkgcmVjcmVhdGluZyBjb21wbGV0ZSByb3V0ZVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5jb21wbGV0ZVJvdXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBtaXNjZWxsYW5lb3VzVmFyaWFibGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5jb21wbGV0ZVJvdXRlc1tpXS5kYXRhLmluZGV4T2YobWlzY2VsbGFuZW91c1ZhcmlhYmxlc1tqXS5uYW1lKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2ZvdW5kIG9uZSBtaXNjIHZhciBpbnNpZGUgaW5jb21wbGV0ZVJvdXRlJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKG1pc2NlbGxhbmVvdXNWYXJpYWJsZXNbal0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nVmFyaWFibGVzLnB1c2gobWlzY2VsbGFuZW91c1ZhcmlhYmxlc1tqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQ2xlYW4gaW5jb21wbGV0ZVJvdXRlXG4gICAgICAgICAgICB0aGlzLmluY29tcGxldGVSb3V0ZXNbaV0uZGF0YSA9IHRoaXMuaW5jb21wbGV0ZVJvdXRlc1tpXS5kYXRhLnJlcGxhY2UoJ1snLCAnJyk7XG4gICAgICAgICAgICB0aGlzLmluY29tcGxldGVSb3V0ZXNbaV0uZGF0YSA9IHRoaXMuaW5jb21wbGV0ZVJvdXRlc1tpXS5kYXRhLnJlcGxhY2UoJ10nLCAnJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgbGlua01vZHVsZXNBbmRSb3V0ZXMoKTogdm9pZCB7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgY29uc3QgbGVuID0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlcy5sZW5ndGg7XG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5pbXBvcnRzTm9kZSwgKG5vZGU6IHRzLlByb3BlcnR5RGVjbGFyYXRpb24pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsaXplciA9IG5vZGUuaW5pdGlhbGl6ZXIgYXMgdHMuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbjtcbiAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXRpYWxpemVyLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goaW5pdGlhbGl6ZXIuZWxlbWVudHMsIChlbGVtZW50OiB0cy5DYWxsRXhwcmVzc2lvbikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgZWxlbWVudCB3aXRoIGFyZ3VtZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5hcmd1bWVudHMsIChhcmd1bWVudDogdHMuSWRlbnRpZmllcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMucm91dGVzLCByb3V0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm5hbWUgPT09IGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuZmlsZW5hbWUgPT09IHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0uZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubW9kdWxlID0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubmFtZSA9PT0gYXJndW1lbnQudGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5maWxlbmFtZSAhPT0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5maWxlbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXJndW1lbnRJbXBvcnRQYXRoID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydHNVdGlsLmZpbmRGaWxlUGF0aE9mSW1wb3J0ZWRWYXJpYWJsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kdWxlc1dpdGhSb3V0ZXNbaV0uZmlsZW5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRJbXBvcnRQYXRoID0gYXJndW1lbnRJbXBvcnRQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5uYW1lID09PSBhcmd1bWVudC50ZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5maWxlbmFtZSA9PT0gYXJndW1lbnRJbXBvcnRQYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubW9kdWxlID0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICAgICAqIGRpcmVjdCBzdXBwb3J0IG9mIGZvciBleGFtcGxlXG4gICAgICAgICAgICAgICAgICogZXhwb3J0IGNvbnN0IEhvbWVSb3V0aW5nTW9kdWxlOiBNb2R1bGVXaXRoUHJvdmlkZXJzID0gUm91dGVyTW9kdWxlLmZvckNoaWxkKEhPTUVfUk9VVEVTKTtcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBpZiAodHMuaXNDYWxsRXhwcmVzc2lvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5hcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChub2RlLmFyZ3VtZW50cywgKGFyZ3VtZW50OiB0cy5JZGVudGlmaWVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKHRoaXMucm91dGVzLCByb3V0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm5hbWUgPT09IGFyZ3VtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmZpbGVuYW1lID09PSB0aGlzLm1vZHVsZXNXaXRoUm91dGVzW2ldLmZpbGVuYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubW9kdWxlID0gdGhpcy5tb2R1bGVzV2l0aFJvdXRlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIGZvdW5kUm91dGVXaXRoTW9kdWxlTmFtZShtb2R1bGVOYW1lOiBzdHJpbmcpOiBhbnkge1xuICAgICAgICByZXR1cm4gXy5maW5kKHRoaXMucm91dGVzLCB7IG1vZHVsZTogbW9kdWxlTmFtZSB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm91bmRMYXp5TW9kdWxlV2l0aFBhdGgobW9kdWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLy8gcGF0aCBpcyBsaWtlIGFwcC9jdXN0b21lcnMvY3VzdG9tZXJzLm1vZHVsZSNDdXN0b21lcnNNb2R1bGVcbiAgICAgICAgY29uc3Qgc3BsaXQgPSBtb2R1bGVQYXRoLnNwbGl0KCcjJyk7XG4gICAgICAgIGNvbnN0IGxhenlNb2R1bGVOYW1lID0gc3BsaXRbMV07XG4gICAgICAgIHJldHVybiBsYXp5TW9kdWxlTmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZm91bmRMYXp5Q29tcG9uZW50V2l0aFBhdGgoY29tcG9uZW50UGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgLy8gcGF0aCBpcyBsaWtlIGFwcC9jdXN0b21lcnMvY3VzdG9tZXJzLmNvbXBvbmVudCNDdXN0b21lcnNDb21wb25lbnRcbiAgICAgICAgY29uc3Qgc3BsaXQgPSBjb21wb25lbnRQYXRoLnNwbGl0KCcjJyk7XG4gICAgICAgIGNvbnN0IGxhenlDb21wb25lbnROYW1lID0gc3BsaXRbMV07XG4gICAgICAgIHJldHVybiBsYXp5Q29tcG9uZW50TmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29uc3RydWN0Um91dGVzVHJlZSgpIHtcbiAgICAgICAgLy8gcm91dGVzW10gY29udGFpbnMgcm91dGVzIHdpdGggbW9kdWxlIGxpbmtcbiAgICAgICAgLy8gbW9kdWxlc1RyZWUgY29udGFpbnMgbW9kdWxlcyB0cmVlXG4gICAgICAgIC8vIG1ha2UgYSBmaW5hbCByb3V0ZXMgdHJlZSB3aXRoIHRoYXRcbiAgICAgICAgdHJhdmVyc2UodGhpcy5tb2R1bGVzVHJlZSkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUucGFyZW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAobm9kZS5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbm9kZS5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuaW1wb3J0c05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG5vZGUuaW1wb3J0c05vZGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmNsZWFuTW9kdWxlc1RyZWUgPSBfLmNsb25lRGVlcCh0aGlzLm1vZHVsZXNUcmVlKTtcblxuICAgICAgICBjb25zdCByb3V0ZXNUcmVlID0ge1xuICAgICAgICAgICAgbmFtZTogJzxyb290PicsXG4gICAgICAgICAgICBraW5kOiAnbW9kdWxlJyxcbiAgICAgICAgICAgIGNsYXNzTmFtZTogdGhpcy5yb290TW9kdWxlLFxuICAgICAgICAgICAgY2hpbGRyZW46IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbG9vcE1vZHVsZXNQYXJzZXIgPSBub2RlID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuICYmIG5vZGUuY2hpbGRyZW4ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIElmIG1vZHVsZSBoYXMgY2hpbGQgbW9kdWxlc1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBub2RlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5mb3VuZFJvdXRlV2l0aE1vZHVsZU5hbWUobm9kZS5jaGlsZHJlbltpXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlICYmIHJvdXRlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW4gPSBKU09ONS5wYXJzZShyb3V0ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiBvZiByb3V0ZXMgSlNPTiBmaWxlLCBtYXliZSBhIHRyYWlsaW5nIGNvbW1hIG9yIGFuIGV4dGVybmFsIHZhcmlhYmxlIGluc2lkZSBvbmUgcm91dGUuJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgcm91dGUuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmtpbmQgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlc1RyZWUuY2hpbGRyZW4ucHVzaChyb3V0ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW5baV0uY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3BNb2R1bGVzUGFyc2VyKG5vZGUuY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBlbHNlIHJvdXRlcyBhcmUgZGlyZWN0bHkgaW5zaWRlIHRoZSBtb2R1bGVcbiAgICAgICAgICAgICAgICBjb25zdCByYXdSb3V0ZXMgPSB0aGlzLmZvdW5kUm91dGVXaXRoTW9kdWxlTmFtZShub2RlLm5hbWUpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHJhd1JvdXRlcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZXMgPSBKU09ONS5wYXJzZShyYXdSb3V0ZXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlbiA9IHJvdXRlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm91dGVBZGRlZE9uY2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGUgPSByb3V0ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlc1tpXS5jb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVBZGRlZE9uY2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXNUcmVlLmNoaWxkcmVuLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2luZDogJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IHJvdXRlc1tpXS5jb21wb25lbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiByb3V0ZXNbaV0ucGF0aFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJvdXRlQWRkZWRPbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzVHJlZS5jaGlsZHJlbiA9IFsuLi5yb3V0ZXNUcmVlLmNoaWxkcmVuLCAuLi5yb3V0ZXNdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHN0YXJ0TW9kdWxlID0gXy5maW5kKHRoaXMuY2xlYW5Nb2R1bGVzVHJlZSwgeyBuYW1lOiB0aGlzLnJvb3RNb2R1bGUgfSk7XG5cbiAgICAgICAgaWYgKHN0YXJ0TW9kdWxlKSB7XG4gICAgICAgICAgICBsb29wTW9kdWxlc1BhcnNlcihzdGFydE1vZHVsZSk7XG4gICAgICAgICAgICAvLyBMb29wIHR3aWNlIGZvciByb3V0ZXMgd2l0aCBsYXp5IGxvYWRpbmdcbiAgICAgICAgICAgIC8vIGxvb3BNb2R1bGVzUGFyc2VyKHJvdXRlc1RyZWUpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNsZWFuZWRSb3V0ZXNUcmVlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IGNsZWFuUm91dGVzVHJlZSA9IHJvdXRlID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiByb3V0ZS5jaGlsZHJlbikge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlcyA9IHJvdXRlLmNoaWxkcmVuW2ldLnJvdXRlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByb3V0ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjbGVhbmVkUm91dGVzVHJlZSA9IGNsZWFuUm91dGVzVHJlZShyb3V0ZXNUcmVlKTtcblxuICAgICAgICAvLyBUcnkgdXBkYXRpbmcgcm91dGVzIHdpdGggbGF6eSBsb2FkaW5nXG5cbiAgICAgICAgY29uc3QgbG9vcEluc2lkZU1vZHVsZSA9IChtb2QsIF9yYXdNb2R1bGUpID0+IHtcbiAgICAgICAgICAgIGlmIChtb2QuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHogaW4gbW9kLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlID0gdGhpcy5mb3VuZFJvdXRlV2l0aE1vZHVsZU5hbWUobW9kLmNoaWxkcmVuW3pdLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlLmRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5jaGlsZHJlbiA9IEpTT041LnBhcnNlKHJvdXRlLmRhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByb3V0ZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmtpbmQgPSAnbW9kdWxlJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLmNoaWxkcmVuLnB1c2gocm91dGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZSA9IHRoaXMuZm91bmRSb3V0ZVdpdGhNb2R1bGVOYW1lKG1vZC5uYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJvdXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUuZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW4gPSBKU09ONS5wYXJzZShyb3V0ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSByb3V0ZS5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUua2luZCA9ICdtb2R1bGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5jaGlsZHJlbi5wdXNoKHJvdXRlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBsb29wUm91dGVzUGFyc2VyID0gcm91dGUgPT4ge1xuICAgICAgICAgICAgaWYgKHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpIGluIHJvdXRlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbltpXS5sb2FkQ2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gdGhpcy5mb3VuZExhenlNb2R1bGVXaXRoUGF0aChyb3V0ZS5jaGlsZHJlbltpXS5sb2FkQ2hpbGRyZW4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kdWxlOiBSb3V0aW5nR3JhcGhOb2RlID0gXy5maW5kKHRoaXMuY2xlYW5Nb2R1bGVzVHJlZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNoaWxkXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtb2R1bGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfcmF3TW9kdWxlOiBSb3V0aW5nR3JhcGhOb2RlID0ge307XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5raW5kID0gJ21vZHVsZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5jaGlsZHJlbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdNb2R1bGUubW9kdWxlID0gbW9kdWxlLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcEluc2lkZU1vZHVsZShtb2R1bGUsIF9yYXdNb2R1bGUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW5baV0uY2hpbGRyZW4gPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5jaGlsZHJlbltpXS5jaGlsZHJlbi5wdXNoKF9yYXdNb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5jaGlsZHJlbltpXS5sb2FkQ29tcG9uZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IHRoaXMuZm91bmRMYXp5Q29tcG9uZW50V2l0aFBhdGgoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUuY2hpbGRyZW5baV0ubG9hZENvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLmNoaWxkcmVuW2ldLmNvbXBvbmVudCA9IGNoaWxkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxvb3BSb3V0ZXNQYXJzZXIocm91dGUuY2hpbGRyZW5baV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbG9vcFJvdXRlc1BhcnNlcihjbGVhbmVkUm91dGVzVHJlZSk7XG5cbiAgICAgICAgcmV0dXJuIGNsZWFuZWRSb3V0ZXNUcmVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjb25zdHJ1Y3RNb2R1bGVzVHJlZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZ2V0TmVzdGVkQ2hpbGRyZW4gPSAoYXJyLCBwYXJlbnQ/KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBvdXQgPSBbXTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgaSBpbiBhcnIpIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJyW2ldLnBhcmVudCA9PT0gcGFyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkcmVuID0gZ2V0TmVzdGVkQ2hpbGRyZW4oYXJyLCBhcnJbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZHJlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycltpXS5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG91dC5wdXNoKGFycltpXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG91dDtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBTY2FuIGVhY2ggbW9kdWxlIGFuZCBhZGQgcGFyZW50IHByb3BlcnR5XG4gICAgICAgIF8uZm9yRWFjaCh0aGlzLm1vZHVsZXMsIGZpcnN0TG9vcE1vZHVsZSA9PiB7XG4gICAgICAgICAgICBfLmZvckVhY2goZmlyc3RMb29wTW9kdWxlLmltcG9ydHNOb2RlLCBpbXBvcnROb2RlID0+IHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy5tb2R1bGVzLCBtb2R1bGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobW9kdWxlLm5hbWUgPT09IGltcG9ydE5vZGUubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLnBhcmVudCA9IGZpcnN0TG9vcE1vZHVsZS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMubW9kdWxlc1RyZWUgPSBnZXROZXN0ZWRDaGlsZHJlbih0aGlzLm1vZHVsZXMpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZW5lcmF0ZVJvdXRlc0luZGV4KG91dHB1dEZvbGRlcjogc3RyaW5nLCByb3V0ZXM6IEFycmF5PGFueT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuZ2V0KF9fZGlybmFtZSArICcvLi4vc3JjL3RlbXBsYXRlcy9wYXJ0aWFscy9yb3V0ZXMtaW5kZXguaGJzJykudGhlbihcbiAgICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlOiBhbnkgPSBIYW5kbGViYXJzLmNvbXBpbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGVtcGxhdGUoe1xuICAgICAgICAgICAgICAgICAgICByb3V0ZXM6IEpTT04uc3RyaW5naWZ5KHJvdXRlcylcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0T3V0cHV0RGlyID0gb3V0cHV0Rm9sZGVyLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRlc3RPdXRwdXREaXIgJiYgdGVzdE91dHB1dERpci5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlciA9IG91dHB1dEZvbGRlci5yZXBsYWNlKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCwgJycpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBGaWxlRW5naW5lLndyaXRlKFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb2xkZXIgKyBwYXRoLnNlcCArICcvanMvcm91dGVzL3JvdXRlc19pbmRleC5qcycsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyID0+IFByb21pc2UucmVqZWN0KCdFcnJvciBkdXJpbmcgcm91dGVzIGluZGV4IGdlbmVyYXRpb24nKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHB1YmxpYyByb3V0ZXNMZW5ndGgoKTogbnVtYmVyIHtcbiAgICAgICAgbGV0IF9uID0gMDtcbiAgICAgICAgY29uc3Qgcm91dGVzUGFyc2VyID0gcm91dGUgPT4ge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByb3V0ZS5wYXRoICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIF9uICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGogaW4gcm91dGUuY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcm91dGVzUGFyc2VyKHJvdXRlLmNoaWxkcmVuW2pdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgZm9yIChjb25zdCBpIGluIHRoaXMucm91dGVzKSB7XG4gICAgICAgICAgICByb3V0ZXNQYXJzZXIodGhpcy5yb3V0ZXNbaV0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9uO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmludFJvdXRlcygpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBjb25zb2xlLmxvZygncHJpbnRSb3V0ZXM6ICcpO1xuICAgICAgICBjb25zb2xlLmxvZyh0aGlzLnJvdXRlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIHByaW50TW9kdWxlc1JvdXRlcygpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICBjb25zb2xlLmxvZygncHJpbnRNb2R1bGVzUm91dGVzOiAnKTtcbiAgICAgICAgY29uc29sZS5sb2codGhpcy5tb2R1bGVzV2l0aFJvdXRlcyk7XG4gICAgfVxuXG4gICAgcHVibGljIGlzVmFyaWFibGVSb3V0ZXMobm9kZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdCAmJiBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0udHlwZS50eXBlTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLnR5cGUudHlwZU5hbWUudGV4dCA9PT0gJ1JvdXRlcydcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGNsZWFuRmlsZUlkZW50aWZpZXJzKHNvdXJjZUZpbGU6IFNvdXJjZUZpbGUpOiBTb3VyY2VGaWxlIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHNvdXJjZUZpbGU7XG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXJzID0gZmlsZS5nZXREZXNjZW5kYW50c09mS2luZChTeW50YXhLaW5kLklkZW50aWZpZXIpLmZpbHRlcihwID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgTm9kZS5pc0FycmF5TGl0ZXJhbEV4cHJlc3Npb24ocC5nZXRQYXJlbnRPclRocm93KCkpIHx8XG4gICAgICAgICAgICAgICAgTm9kZS5pc1Byb3BlcnR5QXNzaWdubWVudChwLmdldFBhcmVudE9yVGhyb3coKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGlkZW50aWZpZXJzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudCA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3QgaWRlbnRpZmllciBvZiBpZGVudGlmaWVycykge1xuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZWlyIHBhcmVudHMgbm9kZXMsIGFuZCBpZiBvbmUgaXMgYSB2YXJpYWJsZVN0YXRlbWVudCBhbmQgPT09ICdyb3V0ZXMnXG4gICAgICAgICAgICBsZXQgZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gaWRlbnRpZmllci5nZXRQYXJlbnRXaGlsZShuID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobi5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYXJpYWJsZVJvdXRlcyhuLmNvbXBpbGVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgIGlkZW50aWZpZXJzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudC5wdXNoKGlkZW50aWZpZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5saW5lIHRoZSBwcm9wZXJ0eSBhY2Nlc3MgZXhwcmVzc2lvbnNcbiAgICAgICAgZm9yIChjb25zdCBpZGVudGlmaWVyIG9mIGlkZW50aWZpZXJzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgaWRlbnRpZmllckRlY2xhcmF0aW9uID0gaWRlbnRpZmllclxuICAgICAgICAgICAgICAgIC5nZXRTeW1ib2xPclRocm93KClcbiAgICAgICAgICAgICAgICAuZ2V0VmFsdWVEZWNsYXJhdGlvbk9yVGhyb3coKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhTm9kZS5pc1Byb3BlcnR5QXNzaWdubWVudChpZGVudGlmaWVyRGVjbGFyYXRpb24pICYmXG4gICAgICAgICAgICAgICAgTm9kZS5pc1ZhcmlhYmxlRGVjbGFyYXRpb24oaWRlbnRpZmllckRlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgIE5vZGUuaXNQcm9wZXJ0eUFzc2lnbm1lbnQoaWRlbnRpZmllckRlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgICFOb2RlLmlzVmFyaWFibGVEZWNsYXJhdGlvbihpZGVudGlmaWVyRGVjbGFyYXRpb24pXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAgIGBOb3QgaW1wbGVtZW50ZWQgcmVmZXJlbmNlZCBkZWNsYXJhdGlvbiBraW5kOiAke2lkZW50aWZpZXJEZWNsYXJhdGlvbi5nZXRLaW5kTmFtZSgpfWBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKE5vZGUuaXNWYXJpYWJsZURlY2xhcmF0aW9uKGlkZW50aWZpZXJEZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyLnJlcGxhY2VXaXRoVGV4dChpZGVudGlmaWVyRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXJPclRocm93KCkuZ2V0VGV4dCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbkZpbGVTcHJlYWRzKHNvdXJjZUZpbGU6IFNvdXJjZUZpbGUpOiBTb3VyY2VGaWxlIHtcbiAgICAgICAgY29uc3QgZmlsZSA9IHNvdXJjZUZpbGU7XG4gICAgICAgIGNvbnN0IHNwcmVhZEVsZW1lbnRzID0gZmlsZVxuICAgICAgICAgICAgLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuU3ByZWFkRWxlbWVudClcbiAgICAgICAgICAgIC5maWx0ZXIocCA9PiBOb2RlLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihwLmdldFBhcmVudE9yVGhyb3coKSkpO1xuXG4gICAgICAgIGNvbnN0IHNwcmVhZEVsZW1lbnRzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudCA9IFtdO1xuXG4gICAgICAgIGZvciAoY29uc3Qgc3ByZWFkRWxlbWVudCBvZiBzcHJlYWRFbGVtZW50cykge1xuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIHRoZWlyIHBhcmVudHMgbm9kZXMsIGFuZCBpZiBvbmUgaXMgYSB2YXJpYWJsZVN0YXRlbWVudCBhbmQgPT09ICdyb3V0ZXMnXG4gICAgICAgICAgICBsZXQgZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCA9IGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gc3ByZWFkRWxlbWVudC5nZXRQYXJlbnRXaGlsZShuID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobi5nZXRLaW5kKCkgPT09IFN5bnRheEtpbmQuVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNWYXJpYWJsZVJvdXRlcyhuLmNvbXBpbGVyTm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZm91bmRQYXJlbnRWYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgICAgIHNwcmVhZEVsZW1lbnRzSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudC5wdXNoKHNwcmVhZEVsZW1lbnQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gaW5saW5lIHRoZSBBcnJheUxpdGVyYWxFeHByZXNzaW9uIFNwcmVhZEVsZW1lbnRzXG4gICAgICAgIGZvciAoY29uc3Qgc3ByZWFkRWxlbWVudCBvZiBzcHJlYWRFbGVtZW50c0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgIGxldCBzcHJlYWRFbGVtZW50SWRlbnRpZmllciA9IHNwcmVhZEVsZW1lbnQuZ2V0RXhwcmVzc2lvbigpLmdldFRleHQoKSxcbiAgICAgICAgICAgICAgICBzZWFyY2hlZEltcG9ydCxcbiAgICAgICAgICAgICAgICBhbGlhc09yaWdpbmFsTmFtZSA9ICcnLFxuICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzSW5JbXBvcnRzID0gZmFsc2UsXG4gICAgICAgICAgICAgICAgZm91bmRXaXRoQWxpYXMgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gVHJ5IHRvIGZpbmQgaXQgaW4gaW1wb3J0c1xuICAgICAgICAgICAgY29uc3QgaW1wb3J0cyA9IGZpbGUuZ2V0SW1wb3J0RGVjbGFyYXRpb25zKCk7XG5cbiAgICAgICAgICAgIGltcG9ydHMuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmFtZWRJbXBvcnRzID0gaS5nZXROYW1lZEltcG9ydHMoKSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZWRJbXBvcnRzTGVuZ3RoID0gbmFtZWRJbXBvcnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgaiA9IDA7XG5cbiAgICAgICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzTGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGo7IGogPCBuYW1lZEltcG9ydHNMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydE5hbWUgPSBuYW1lZEltcG9ydHNbal0uZ2V0TmFtZU5vZGUoKS5nZXRUZXh0KCkgYXMgc3RyaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydEFsaWFzO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZWRJbXBvcnRzW2pdLmdldEFsaWFzTm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0QWxpYXMgPSBuYW1lZEltcG9ydHNbal0uZ2V0QWxpYXNOb2RlKCkuZ2V0VGV4dCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0TmFtZSA9PT0gc3ByZWFkRWxlbWVudElkZW50aWZpZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhc0luSW1wb3J0cyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoZWRJbXBvcnQgPSBpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGltcG9ydEFsaWFzID09PSBzcHJlYWRFbGVtZW50SWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kV2l0aEFsaWFzSW5JbXBvcnRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFdpdGhBbGlhcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxpYXNPcmlnaW5hbE5hbWUgPSBpbXBvcnROYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGVkSW1wb3J0ID0gaTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBsZXQgcmVmZXJlbmNlZERlY2xhcmF0aW9uO1xuXG4gICAgICAgICAgICBpZiAoZm91bmRXaXRoQWxpYXNJbkltcG9ydHMpIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlYXJjaGVkSW1wb3J0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByb3V0ZVBhdGhJc0JhZCA9IHBhdGggPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5zY2FubmVkRmlsZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FubmVkRmlsZSA9PiBwYXRoID09PSBzY2FubmVkRmlsZS5wYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFyZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2V0SW5kaWNlc09mID0gKHNlYXJjaFN0ciwgc3RyLCBjYXNlU2Vuc2l0aXZlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZWFyY2hTdHJMZW4gPSBzZWFyY2hTdHIubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlYXJjaFN0ckxlbiA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0SW5kZXggPSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGljZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FzZVNlbnNpdGl2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IHN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFN0ciA9IHNlYXJjaFN0ci50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChpbmRleCA9IHN0ci5pbmRleE9mKHNlYXJjaFN0ciwgc3RhcnRJbmRleCkpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnB1c2goaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleCArIHNlYXJjaFN0ckxlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmRpY2VzO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpck5hbWVQYXRoID0gcGF0aC5kaXJuYW1lKGZpbGUuZ2V0RmlsZVBhdGgoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlYXJjaGVkSW1wb3J0UGF0aCA9IHNlYXJjaGVkSW1wb3J0LmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlYWRpbmdGaWxlUGF0aCA9IHNlYXJjaGVkSW1wb3J0UGF0aC5zcGxpdCgnLycpLnNoaWZ0KCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGltcG9ydFBhdGggPSBwYXRoLnJlc29sdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJOYW1lUGF0aCArICcvJyArIHNlYXJjaGVkSW1wb3J0LmdldE1vZHVsZVNwZWNpZmllclZhbHVlKCkgKyAnLnRzJ1xuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZVBhdGhJc0JhZChpbXBvcnRQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGVhZGluZ0luZGljZXMgPSBnZXRJbmRpY2VzT2YobGVhZGluZ0ZpbGVQYXRoLCBpbXBvcnRQYXRoLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsZWFkaW5nSW5kaWNlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVzdGVkIHJvdXRlIGZpeGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IGxlYWRpbmdJbmRpY2VzWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZEluZGV4ID0gbGVhZGluZ0luZGljZXNbbGVhZGluZ0luZGljZXMubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0UGF0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydFBhdGguc2xpY2UoMCwgc3RhcnRJbmRleCkgKyBpbXBvcnRQYXRoLnNsaWNlKGVuZEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVG9wIGxldmVsIHJvdXRlIGZpeGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0UGF0aCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZGlybmFtZShkaXJOYW1lUGF0aCkgKyAnLycgKyBzZWFyY2hlZEltcG9ydFBhdGggKyAnLnRzJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlSW1wb3J0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBhc3QuZ2V0U291cmNlRmlsZShpbXBvcnRQYXRoKSAhPT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFzdC5nZXRTb3VyY2VGaWxlKGltcG9ydFBhdGgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBhc3QuYWRkU291cmNlRmlsZUF0UGF0aChpbXBvcnRQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUZpbGVJbXBvcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlTmFtZSA9IGZvdW5kV2l0aEFsaWFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBhbGlhc09yaWdpbmFsTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogc3ByZWFkRWxlbWVudElkZW50aWZpZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkRGVjbGFyYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVJbXBvcnQuZ2V0VmFyaWFibGVEZWNsYXJhdGlvbih2YXJpYWJsZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBpZiBub3QsIHRyeSBkaXJlY3RseSBpbiBmaWxlXG4gICAgICAgICAgICAgICAgcmVmZXJlbmNlZERlY2xhcmF0aW9uID0gc3ByZWFkRWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAuZ2V0RXhwcmVzc2lvbigpXG4gICAgICAgICAgICAgICAgICAgIC5nZXRTeW1ib2xPclRocm93KClcbiAgICAgICAgICAgICAgICAgICAgLmdldFZhbHVlRGVjbGFyYXRpb25PclRocm93KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghTm9kZS5pc1ZhcmlhYmxlRGVjbGFyYXRpb24ocmVmZXJlbmNlZERlY2xhcmF0aW9uKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYE5vdCBpbXBsZW1lbnRlZCByZWZlcmVuY2VkIGRlY2xhcmF0aW9uIGtpbmQ6ICR7cmVmZXJlbmNlZERlY2xhcmF0aW9uLmdldEtpbmROYW1lKCl9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHJlZmVyZW5jZWRBcnJheSA9IHJlZmVyZW5jZWREZWNsYXJhdGlvbi5nZXRJbml0aWFsaXplcklmS2luZE9yVGhyb3coXG4gICAgICAgICAgICAgICAgU3ludGF4S2luZC5BcnJheUxpdGVyYWxFeHByZXNzaW9uXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgY29uc3Qgc3ByZWFkRWxlbWVudEFycmF5ID0gc3ByZWFkRWxlbWVudC5nZXRQYXJlbnRJZktpbmRPclRocm93KFxuICAgICAgICAgICAgICAgIFN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvblxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbnN0IGluc2VydEluZGV4ID0gc3ByZWFkRWxlbWVudEFycmF5LmdldEVsZW1lbnRzKCkuaW5kZXhPZihzcHJlYWRFbGVtZW50KTtcbiAgICAgICAgICAgIHNwcmVhZEVsZW1lbnRBcnJheS5yZW1vdmVFbGVtZW50KHNwcmVhZEVsZW1lbnQpO1xuICAgICAgICAgICAgc3ByZWFkRWxlbWVudEFycmF5Lmluc2VydEVsZW1lbnRzKFxuICAgICAgICAgICAgICAgIGluc2VydEluZGV4LFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZWRBcnJheS5nZXRFbGVtZW50cygpLm1hcChlID0+IGUuZ2V0VGV4dCgpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cblxuICAgIHB1YmxpYyBjbGVhbkZpbGVEeW5hbWljcyhzb3VyY2VGaWxlOiBTb3VyY2VGaWxlKTogU291cmNlRmlsZSB7XG4gICAgICAgIGNvbnN0IGZpbGUgPSBzb3VyY2VGaWxlO1xuICAgICAgICBjb25zdCBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25zID0gZmlsZVxuICAgICAgICAgICAgLmdldERlc2NlbmRhbnRzT2ZLaW5kKFN5bnRheEtpbmQuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKVxuICAgICAgICAgICAgLmZpbHRlcihwID0+ICFOb2RlLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKHAuZ2V0UGFyZW50T3JUaHJvdygpKSk7XG5cbiAgICAgICAgY29uc3QgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uc0luUm91dGVzVmFyaWFibGVTdGF0ZW1lbnQgPSBbXTtcblxuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbiBvZiBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25zKSB7XG4gICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlaXIgcGFyZW50cyBub2RlcywgYW5kIGlmIG9uZSBpcyBhIHZhcmlhYmxlU3RhdGVtZW50IGFuZCA9PT0gJ3JvdXRlcydcbiAgICAgICAgICAgIGxldCBmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uZ2V0UGFyZW50V2hpbGUobiA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG4uZ2V0S2luZCgpID09PSBTeW50YXhLaW5kLlZhcmlhYmxlU3RhdGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFyaWFibGVSb3V0ZXMobi5jb21waWxlck5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3VuZFBhcmVudFZhcmlhYmxlU3RhdGVtZW50ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKGZvdW5kUGFyZW50VmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25zSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudC5wdXNoKHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpbmxpbmUgdGhlIHByb3BlcnR5IGFjY2VzcyBleHByZXNzaW9uc1xuICAgICAgICBmb3IgKGNvbnN0IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbiBvZiBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25zSW5Sb3V0ZXNWYXJpYWJsZVN0YXRlbWVudCkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uTm9kZU5hbWUgPSBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24uZ2V0TmFtZU5vZGUoKTtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25Ob2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbk5vZGVOYW1lU3ltYm9sID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbk5vZGVOYW1lLmdldFN5bWJvbE9yVGhyb3coKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbk5vZGVOYW1lU3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWZlcmVuY2VkRGVjbGFyYXRpb24gPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5QWNjZXNzRXhwcmVzc2lvbk5vZGVOYW1lU3ltYm9sLmdldFZhbHVlRGVjbGFyYXRpb25PclRocm93KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIU5vZGUuaXNQcm9wZXJ0eUFzc2lnbm1lbnQocmVmZXJlbmNlZERlY2xhcmF0aW9uKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUuaXNFbnVtTWVtYmVyKHJlZmVyZW5jZWREZWNsYXJhdGlvbikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlLmlzUHJvcGVydHlBc3NpZ25tZW50KHJlZmVyZW5jZWREZWNsYXJhdGlvbikgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAhTm9kZS5pc0VudW1NZW1iZXIocmVmZXJlbmNlZERlY2xhcmF0aW9uKVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgTm90IGltcGxlbWVudGVkIHJlZmVyZW5jZWQgZGVjbGFyYXRpb24ga2luZDogJHtyZWZlcmVuY2VkRGVjbGFyYXRpb24uZ2V0S2luZE5hbWUoKX1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcmVmZXJlbmNlZERlY2xhcmF0aW9uLmdldEluaXRpYWxpemVyT3JUaHJvdyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24ucmVwbGFjZVdpdGhUZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZlcmVuY2VkRGVjbGFyYXRpb24uZ2V0SW5pdGlhbGl6ZXJPclRocm93KCkuZ2V0VGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZmlsZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiByZXBsYWNlIGNhbGxleHByZXNzaW9ucyB3aXRoIHN0cmluZyA6IHV0aWxzLmRvV29yaygpIC0+ICd1dGlscy5kb1dvcmsoKScgZG9Xb3JrKCkgLT4gJ2RvV29yaygpJ1xuICAgICAqIEBwYXJhbSBzb3VyY2VGaWxlIHRzLlNvdXJjZUZpbGVcbiAgICAgKi9cbiAgICBwdWJsaWMgY2xlYW5DYWxsRXhwcmVzc2lvbnMoc291cmNlRmlsZTogU291cmNlRmlsZSk6IFNvdXJjZUZpbGUge1xuICAgICAgICBjb25zdCBmaWxlID0gc291cmNlRmlsZTtcblxuICAgICAgICBjb25zdCB2YXJpYWJsZVN0YXRlbWVudHMgPSBzb3VyY2VGaWxlLmdldFZhcmlhYmxlRGVjbGFyYXRpb24odiA9PiB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCB0eXBlID0gdi5jb21waWxlck5vZGUudHlwZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHR5cGUudHlwZU5hbWUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHlwZS50eXBlTmFtZS50ZXh0ID09PSAnUm91dGVzJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGluaXRpYWxpemVyID0gdmFyaWFibGVTdGF0ZW1lbnRzLmdldEluaXRpYWxpemVyKCk7XG5cbiAgICAgICAgZm9yIChjb25zdCBjYWxsRXhwciBvZiBpbml0aWFsaXplci5nZXREZXNjZW5kYW50c09mS2luZChTeW50YXhLaW5kLkNhbGxFeHByZXNzaW9uKSkge1xuICAgICAgICAgICAgaWYgKGNhbGxFeHByLndhc0ZvcmdvdHRlbigpKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYWxsRXhwci5yZXBsYWNlV2l0aFRleHQod3JpdGVyID0+IHdyaXRlci5xdW90ZShjYWxsRXhwci5nZXRUZXh0KCkpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmaWxlO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENsZWFuIHJvdXRlcyBkZWZpbml0aW9uIHdpdGggaW1wb3J0ZWQgZGF0YSwgZm9yIGV4YW1wbGUgcGF0aCwgY2hpbGRyZW4sIG9yIGR5bmFtaWMgc3R1ZmYgaW5zaWRlIGRhdGFcbiAgICAgKlxuICAgICAqIGNvbnN0IE1ZX1JPVVRFUzogUm91dGVzID0gW1xuICAgICAqICAgICB7XG4gICAgICogICAgICAgICBwYXRoOiAnaG9tZScsXG4gICAgICogICAgICAgICBjb21wb25lbnQ6IEhvbWVDb21wb25lbnRcbiAgICAgKiAgICAgfSxcbiAgICAgKiAgICAge1xuICAgICAqICAgICAgICAgcGF0aDogUEFUSFMuaG9tZSxcbiAgICAgKiAgICAgICAgIGNvbXBvbmVudDogSG9tZUNvbXBvbmVudFxuICAgICAqICAgICB9XG4gICAgICogXTtcbiAgICAgKlxuICAgICAqIFRoZSBpbml0aWFsaXplciBpcyBhbiBhcnJheSAoQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiAtIDE3NyApLCBpdCBoYXMgZWxlbWVudHMsIG9iamVjdHMgKE9iamVjdExpdGVyYWxFeHByZXNzaW9uIC0gMTc4KVxuICAgICAqIHdpdGggcHJvcGVydGllcyAoUHJvcGVydHlBc3NpZ25tZW50IC0gMjYxKVxuICAgICAqXG4gICAgICogRm9yIGVhY2gga25vdyBwcm9wZXJ0eSAoaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9yb3V0ZXIvUm91dGVzI2Rlc2NyaXB0aW9uKSwgd2UgdHJ5IHRvIHNlZSBpZiB3ZSBoYXZlIHdoYXQgd2Ugd2FudFxuICAgICAqXG4gICAgICogRXg6IHBhdGggYW5kIHBhdGhNYXRjaCB3YW50IGEgc3RyaW5nLCBjb21wb25lbnQgYSBjb21wb25lbnQgcmVmZXJlbmNlLlxuICAgICAqXG4gICAgICogSXQgaXMgYW4gaW1wZXJhdGl2ZSBhcHByb2FjaCwgbm90IGEgZ2VuZXJpYyB3YXksIHBhcnNpbmcgYWxsIHRoZSB0cmVlXG4gICAgICogYW5kIGZpbmQgc29tZXRoaW5nIGxpa2UgdGhpcyB3aGljaCB3aWxsbCBicmVhayBKU09OLnN0cmluZ2lmeSA6IE1ZSU1QT1JULnBhdGhcbiAgICAgKlxuICAgICAqIEBwYXJhbSAge3RzLk5vZGV9IGluaXRpYWxpemVyIFRoZSBub2RlIG9mIHJvdXRlcyBkZWZpbml0aW9uXG4gICAgICogQHJldHVybiB7dHMuTm9kZX0gICAgICAgICAgICAgVGhlIGVkaXRlZCBub2RlXG4gICAgICovXG4gICAgcHVibGljIGNsZWFuUm91dGVzRGVmaW5pdGlvbldpdGhJbXBvcnQoXG4gICAgICAgIGluaXRpYWxpemVyOiB0cy5BcnJheUxpdGVyYWxFeHByZXNzaW9uLFxuICAgICAgICBub2RlOiB0cy5Ob2RlLFxuICAgICAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogdHMuTm9kZSB7XG4gICAgICAgIGluaXRpYWxpemVyLmVsZW1lbnRzLmZvckVhY2goKGVsZW1lbnQ6IHRzLk9iamVjdExpdGVyYWxFeHByZXNzaW9uKSA9PiB7XG4gICAgICAgICAgICBlbGVtZW50LnByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHk6IHRzLlByb3BlcnR5QXNzaWdubWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IHByb3BlcnR5Lm5hbWUuZ2V0VGV4dCgpLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUluaXRpYWxpemVyID0gcHJvcGVydHkuaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChwcm9wZXJ0eU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncGF0aCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3JlZGlyZWN0VG8nOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdvdXRsZXQnOlxuICAgICAgICAgICAgICAgICAgICBjYXNlICdwYXRoTWF0Y2gnOlxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5SW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHlJbml0aWFsaXplci5raW5kICE9PSBTeW50YXhLaW5kLlN0cmluZ0xpdGVyYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZmllcig3MSkgd29uJ3QgYnJlYWsgcGFyc2luZywgYnV0IGl0IHdpbGwgYmUgYmV0dGVyIHRvIHJldHJpdmUgdGhlbVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24oMTc5KSBleDogTVlJTVBPUlQucGF0aCB3aWxsIGJyZWFrIGl0LCBmaW5kIGl0IGluIGltcG9ydFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eUluaXRpYWxpemVyLmtpbmQgPT09IFN5bnRheEtpbmQuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RPYmplY3RMaXRlcmFsQXR0cmlidXRlTmFtZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5SW5pdGlhbGl6ZXIubmFtZS5nZXRUZXh0KCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RPYmplY3RMaXRlcmFsQXR0cmlidXRlTmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eUluaXRpYWxpemVyLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbml0aWFsaXplci5leHByZXNzaW9uLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRzVXRpbC5maW5kUHJvcGVydHlWYWx1ZUluSW1wb3J0T3JMb2NhbFZhcmlhYmxlcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0T2JqZWN0TGl0ZXJhbEF0dHJpYnV0ZU5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdE9iamVjdExpdGVyYWxBdHRyaWJ1dGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbml0aWFsaXplci5raW5kID0gOTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlJbml0aWFsaXplci50ZXh0ID0gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGluaXRpYWxpemVyO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUm91dGVyUGFyc2VyVXRpbC5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpc01vZHVsZVdpdGhQcm92aWRlcnMobm9kZTogdHMuVmFyaWFibGVTdGF0ZW1lbnQpOiBib29sZWFuIHtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0KSB7XG4gICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMgJiYgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBpID0gMCxcbiAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnMgPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnMsXG4gICAgICAgICAgICAgICAgbGVuID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aDtcblxuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVjbGFyYXRpb24gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV07XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZTogdHMuVHlwZVJlZmVyZW5jZU5vZGUgPSBkZWNsYXJhdGlvbi50eXBlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSB0eXBlLnR5cGVOYW1lLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09PSAnTW9kdWxlV2l0aFByb3ZpZGVycycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJpbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZHVsZVdpdGhQcm92aWRlcnMobm9kZTogdHMuVmFyaWFibGVTdGF0ZW1lbnQpIHtcbiAgICBsZXQgcmVzdWx0O1xuICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdCkge1xuICAgICAgICBpZiAobm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zICYmIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICAgICAgbGVuID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aDtcblxuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZGVjbGFyYXRpb24gPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV07XG5cbiAgICAgICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZTogdHMuVHlwZVJlZmVyZW5jZU5vZGUgPSBkZWNsYXJhdGlvbi50eXBlIGFzIHRzLlR5cGVSZWZlcmVuY2VOb2RlO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSB0eXBlLnR5cGVOYW1lLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09PSAnTW9kdWxlV2l0aFByb3ZpZGVycycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBkZWNsYXJhdGlvbi5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwiaW1wb3J0IHsgY2xvbmVEZWVwLCBjb25jYXQsIGZpbmQgfSBmcm9tICdsb2Rhc2gnO1xuXG5pbXBvcnQgeyBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMgfSBmcm9tICcuJztcbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uL2FwcC9jb25maWd1cmF0aW9uJztcblxuZXhwb3J0IGNsYXNzIEV4dGVuZHNNZXJnZXIge1xuICAgIHByaXZhdGUgY29tcG9uZW50cztcbiAgICBwcml2YXRlIGNsYXNzZXM7XG4gICAgcHJpdmF0ZSBpbmplY3RhYmxlcztcbiAgICBwcml2YXRlIGRpcmVjdGl2ZXM7XG4gICAgcHJpdmF0ZSBjb250cm9sbGVycztcbiAgICBwcml2YXRlIGFsaWFzZXM7XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogRXh0ZW5kc01lcmdlcjtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUV4dGVuZHNNZXJnZXIuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEV4dGVuZHNNZXJnZXIuaW5zdGFuY2UgPSBuZXcgRXh0ZW5kc01lcmdlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBFeHRlbmRzTWVyZ2VyLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBtZXJnZShkZXBzKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50cyA9IGRlcHMuY29tcG9uZW50cztcbiAgICAgICAgdGhpcy5jbGFzc2VzID0gZGVwcy5jbGFzc2VzO1xuICAgICAgICB0aGlzLmluamVjdGFibGVzID0gZGVwcy5pbmplY3RhYmxlcztcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzID0gZGVwcy5kaXJlY3RpdmVzO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzID0gZGVwcy5jb250cm9sbGVycztcbiAgICAgICAgdGhpcy5hbGlhc2VzID0gZGVwcy5hbGlhc2VzO1xuXG4gICAgICAgIGNvbnN0IG1lcmdlRXh0ZW5kZWRQcm9wZXJ0aWVzID0gY29tcG9uZW50ID0+IHtcbiAgICAgICAgICAgIGxldCBleHQ7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5leHRlbmRzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGV4dCA9IHRoaXMuZmluZEluRGVwZW5kZW5jaWVzKGNvbXBvbmVudC5leHRlbmRzWzBdKTtcblxuICAgICAgICAgICAgICAgIGlmIChleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdXJzaXZlU2NhbldpdGhJbmhlcml0YW5jZSA9IGNscyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIGNsYXNzIHRvIGNvbXBvbmVudFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjbHMubWV0aG9kcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY2xzLm1ldGhvZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdNZXRob2RzID0gY2xvbmVEZWVwKGNscy5tZXRob2RzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNZXRob2RzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3TWV0aG9kcywgY2xzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbXBvbmVudC5tZXRob2RzQ2xhc3MgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VJbmhlcml0YW5jZShjb21wb25lbnQsICdtZXRob2RzQ2xhc3MnLCBuZXdNZXRob2RzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNscy5wcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJyAmJiBjbHMucHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1Byb3BlcnRpZXMgPSBjbG9uZURlZXAoY2xzLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdQcm9wZXJ0aWVzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnByb3BlcnRpZXNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ3Byb3BlcnRpZXNDbGFzcycsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZyb20gY29tcG9uZW50IHRvIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgdG8gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNscy5pbnB1dHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY2xzLmlucHV0c0NsYXNzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SW5wdXRzID0gY2xvbmVEZWVwKGNscy5pbnB1dHNDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SW5wdXRzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3SW5wdXRzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LmlucHV0c0NsYXNzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1lcmdlSW5oZXJpdGFuY2UoY29tcG9uZW50LCAnaW5wdXRzQ2xhc3MnLCBuZXdJbnB1dHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2xzLm91dHB1dHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMub3V0cHV0c0NsYXNzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdPdXRwdXRzID0gY2xvbmVEZWVwKGNscy5vdXRwdXRzQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld091dHB1dHMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdPdXRwdXRzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Lm91dHB1dHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ291dHB1dHNDbGFzcycsIG5ld091dHB1dHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2xzLm1ldGhvZHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMubWV0aG9kc0NsYXNzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdNZXRob2RzID0gY2xvbmVEZWVwKGNscy5tZXRob2RzQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld01ldGhvZHMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdNZXRob2RzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Lm1ldGhvZHNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ21ldGhvZHNDbGFzcycsIG5ld01ldGhvZHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2xzLnByb3BlcnRpZXNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMucHJvcGVydGllc0NsYXNzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdQcm9wZXJ0aWVzID0gY2xvbmVEZWVwKGNscy5wcm9wZXJ0aWVzQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdQcm9wZXJ0aWVzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnByb3BlcnRpZXNDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ3Byb3BlcnRpZXNDbGFzcycsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgY2xzLmhvc3RCaW5kaW5ncyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuaG9zdEJpbmRpbmdzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdIb3N0QmluZGluZ3MgPSBjbG9uZURlZXAoY2xzLmhvc3RCaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SG9zdEJpbmRpbmdzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3SG9zdEJpbmRpbmdzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50Lmhvc3RCaW5kaW5ncyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ2hvc3RCaW5kaW5ncycsIG5ld0hvc3RCaW5kaW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBjbHMuaG9zdExpc3RlbmVycyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbHMuaG9zdExpc3RlbmVycy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3SG9zdExpc3RlbmVycyA9IGNsb25lRGVlcChjbHMuaG9zdExpc3RlbmVycyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3SG9zdExpc3RlbmVycyA9IHRoaXMubWFya0luaGVyaXRhbmNlKG5ld0hvc3RMaXN0ZW5lcnMsIGNscyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wb25lbnQuaG9zdExpc3RlbmVycyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGNvbXBvbmVudCwgJ2hvc3RMaXN0ZW5lcnMnLCBuZXdIb3N0TGlzdGVuZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQubWV0aG9kc0NsYXNzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQubWV0aG9kc0NsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbHMuZXh0ZW5kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5XaXRoSW5oZXJpdGFuY2UodGhpcy5maW5kSW5EZXBlbmRlbmNpZXMoY2xzLmV4dGVuZHNbMF0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRnJvbSBjbGFzcyB0byBjbGFzc1xuICAgICAgICAgICAgICAgICAgICByZWN1cnNpdmVTY2FuV2l0aEluaGVyaXRhbmNlKGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50cy5mb3JFYWNoKG1lcmdlRXh0ZW5kZWRQcm9wZXJ0aWVzKTtcbiAgICAgICAgdGhpcy5kaXJlY3RpdmVzLmZvckVhY2gobWVyZ2VFeHRlbmRlZFByb3BlcnRpZXMpO1xuICAgICAgICB0aGlzLmNvbnRyb2xsZXJzLmZvckVhY2gobWVyZ2VFeHRlbmRlZFByb3BlcnRpZXMpO1xuXG4gICAgICAgIGNvbnN0IG1lcmdlRXh0ZW5kZWRDbGFzc2VzID0gZWwgPT4ge1xuICAgICAgICAgICAgbGV0IGV4dDtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZWwuZXh0ZW5kcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBleHQgPSB0aGlzLmZpbmRJbkRlcGVuZGVuY2llcyhlbC5leHRlbmRzWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAoZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY3Vyc2l2ZVNjYW5XaXRoSW5oZXJpdGFuY2UgPSBjbHMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjbHMubWV0aG9kcyAhPT0gJ3VuZGVmaW5lZCcgJiYgY2xzLm1ldGhvZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuZXdNZXRob2RzID0gY2xvbmVEZWVwKGNscy5tZXRob2RzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNZXRob2RzID0gdGhpcy5tYXJrSW5oZXJpdGFuY2UobmV3TWV0aG9kcywgY2xzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsLm1ldGhvZHMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VJbmhlcml0YW5jZShlbCwgJ21ldGhvZHMnLCBuZXdNZXRob2RzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNscy5wcm9wZXJ0aWVzICE9PSAndW5kZWZpbmVkJyAmJiBjbHMucHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG5ld1Byb3BlcnRpZXMgPSBjbG9uZURlZXAoY2xzLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Byb3BlcnRpZXMgPSB0aGlzLm1hcmtJbmhlcml0YW5jZShuZXdQcm9wZXJ0aWVzLCBjbHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZWwucHJvcGVydGllcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXJnZUluaGVyaXRhbmNlKGVsLCAncHJvcGVydGllcycsIG5ld1Byb3BlcnRpZXMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbHMuZXh0ZW5kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY3Vyc2l2ZVNjYW5XaXRoSW5oZXJpdGFuY2UodGhpcy5maW5kSW5EZXBlbmRlbmNpZXMoY2xzLmV4dGVuZHNbMF0pKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgLy8gRnJvbSBlbHNzIHRvIGVsc3NcbiAgICAgICAgICAgICAgICAgICAgcmVjdXJzaXZlU2NhbldpdGhJbmhlcml0YW5jZShleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmNsYXNzZXMuZm9yRWFjaChtZXJnZUV4dGVuZGVkQ2xhc3Nlcyk7XG4gICAgICAgIHRoaXMuaW5qZWN0YWJsZXMuZm9yRWFjaChtZXJnZUV4dGVuZGVkQ2xhc3Nlcyk7XG4gICAgICAgIHRoaXMuZGlyZWN0aXZlcy5mb3JFYWNoKG1lcmdlRXh0ZW5kZWRDbGFzc2VzKTtcbiAgICAgICAgdGhpcy5jb250cm9sbGVycy5mb3JFYWNoKG1lcmdlRXh0ZW5kZWRDbGFzc2VzKTtcblxuICAgICAgICByZXR1cm4gZGVwcztcbiAgICB9XG5cbiAgICBwcml2YXRlIG1hcmtJbmhlcml0YW5jZShkYXRhLCBvcmlnaW5hbG91cmNlKSB7XG4gICAgICAgIHJldHVybiBkYXRhLm1hcChlbCA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdFbGVtZW50ID0gZWw7XG4gICAgICAgICAgICBuZXdFbGVtZW50LmluaGVyaXRhbmNlID0ge1xuICAgICAgICAgICAgICAgIGZpbGU6IG9yaWdpbmFsb3VyY2UubmFtZVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiBuZXdFbGVtZW50O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG1lcmdlSW5oZXJpdGFuY2UoY29tcG9uZW50OiBhbnksIG1ldGFQcm9wZXJ0eUlkOiBzdHJpbmcsIG5ld01lbWJlcnM6IGFueSkge1xuICAgICAgICBuZXdNZW1iZXJzLmZvckVhY2gobmV3TWVtYmVyID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRkZW5NZXRob2QgPSBjb21wb25lbnRbbWV0YVByb3BlcnR5SWRdLmZpbmQoXG4gICAgICAgICAgICAgICAgY29tcG9uZW50TWVtYmVyID0+IGNvbXBvbmVudE1lbWJlci5uYW1lID09PSBuZXdNZW1iZXIubmFtZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgaWYgKG92ZXJyaWRkZW5NZXRob2QpIHtcbiAgICAgICAgICAgICAgICBvdmVycmlkZGVuTWV0aG9kLmluaGVyaXRhbmNlID0gbmV3TWVtYmVyLmluaGVyaXRhbmNlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRbbWV0YVByb3BlcnR5SWRdLnB1c2gobmV3TWVtYmVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmaW5kSW5EZXBlbmRlbmNpZXMobmFtZTogc3RyaW5nKSB7XG4gICAgICAgIGNvbnN0IG1lcmdlZERhdGEgPSBjb25jYXQoXG4gICAgICAgICAgICBbXSxcbiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyxcbiAgICAgICAgICAgIHRoaXMuY2xhc3NlcyxcbiAgICAgICAgICAgIHRoaXMuaW5qZWN0YWJsZXMsXG4gICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMsXG4gICAgICAgICAgICB0aGlzLmNvbnRyb2xsZXJzXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IHJlc3VsdCA9IGZpbmQobWVyZ2VkRGF0YSwgeyBuYW1lOiBuYW1lIH0gYXMgYW55KTtcblxuICAgICAgICAvLyBGaW5kIGluIGFsaWFzZXMgP1xuICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgY29uc3QgYWxpYXNlcyA9IE9iamVjdC52YWx1ZXModGhpcy5hbGlhc2VzKTtcbiAgICAgICAgICAgIGNvbnN0IGlzSW5BbGlhcyA9IGFsaWFzZXMuaW5jbHVkZXMobmFtZSk7XG4gICAgICAgICAgICBpZiAoaXNJbkFsaWFzKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmluYWxPcmlnaW5hbE5hbWUgPSB0aGlzLmZpbmRJbkFsaWFzZXMobmFtZSk7XG4gICAgICAgICAgICAgICAgaWYgKGZpbmFsT3JpZ2luYWxOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbmQobWVyZ2VkRGF0YSwgeyBuYW1lOiBmaW5hbE9yaWdpbmFsTmFtZSB9IGFzIGFueSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCBmYWxzZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZmluZEluQWxpYXNlcyhuYW1lOiBzdHJpbmcpIHtcbiAgICAgICAgbGV0IGZpbmFsT3JpZ2luYWxOYW1lID0gbnVsbDtcbiAgICAgICAgZm9yIChjb25zdCBvcmlnaW5hbE5hbWUgaW4gdGhpcy5hbGlhc2VzKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hbGlhc2VzW29yaWdpbmFsTmFtZV0uaW5jbHVkZXMobmFtZSkpIHtcbiAgICAgICAgICAgICAgICBmaW5hbE9yaWdpbmFsTmFtZSA9IG9yaWdpbmFsTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmluYWxPcmlnaW5hbE5hbWU7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBFeHRlbmRzTWVyZ2VyLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuaW1wb3J0IERlcGVuZGVuY2llc0VuZ2luZSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcblxuaW1wb3J0IEFuZ3VsYXJWZXJzaW9uVXRpbCBmcm9tICcuLi8uLi8uLi91dGlscy9hbmd1bGFyLXZlcnNpb24udXRpbCc7XG5pbXBvcnQgRXh0ZW5kc01lcmdlciBmcm9tICcuLi8uLi8uLi91dGlscy9leHRlbmRzLW1lcmdlci51dGlsJztcbmltcG9ydCBCYXNpY1R5cGVVdGlsIGZyb20gJy4uLy4uLy4uL3V0aWxzL2Jhc2ljLXR5cGUudXRpbCc7XG5cbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uLy4uL2NvbmZpZ3VyYXRpb24nO1xuXG5leHBvcnQgY2xhc3MgTGlua1R5cGVIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoKSB7fVxuXG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCBuYW1lOiBzdHJpbmcsIG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucykge1xuICAgICAgICBsZXQgX3Jlc3VsdCA9IERlcGVuZGVuY2llc0VuZ2luZS5maW5kKG5hbWUpO1xuICAgICAgICAvLyBGaW5kIGluIGFsaWFzZXMgP1xuICAgICAgICBpZiAoIV9yZXN1bHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHBvdGVudGlhbEFsaWFzID0gRXh0ZW5kc01lcmdlci5maW5kSW5BbGlhc2VzKG5hbWUpO1xuICAgICAgICAgICAgaWYgKHBvdGVudGlhbEFsaWFzKSB7XG4gICAgICAgICAgICAgICAgX3Jlc3VsdCA9IERlcGVuZGVuY2llc0VuZ2luZS5maW5kKHBvdGVudGlhbEFsaWFzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGFuZ3VsYXJEb2NQcmVmaXggPSBBbmd1bGFyVmVyc2lvblV0aWwucHJlZml4T2ZmaWNpYWxEb2MoXG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJWZXJzaW9uXG4gICAgICAgICk7XG4gICAgICAgIGlmIChfcmVzdWx0KSB7XG4gICAgICAgICAgICBjb250ZXh0LnR5cGUgPSB7XG4gICAgICAgICAgICAgICAgcmF3OiBuYW1lLFxuICAgICAgICAgICAgICAgIGluZGV4S2V5OiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGlmIChfcmVzdWx0LnNvdXJjZSA9PT0gJ2ludGVybmFsJykge1xuICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LmRhdGEudHlwZSA9PT0gJ2NsYXNzJykge1xuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEudHlwZSA9ICdjbGFzc2UnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGUuaHJlZiA9ICcuLi8nICsgX3Jlc3VsdC5kYXRhLnR5cGUgKyAncy8nICsgX3Jlc3VsdC5kYXRhLm5hbWUgKyAnLmh0bWwnO1xuICAgICAgICAgICAgICAgIGlmIChjb250ZXh0LmluZGV4S2V5ICE9PSAnJyAmJiBjb250ZXh0LmluZGV4S2V5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC50eXBlLmhyZWYgKz0gJyMnICsgY29udGV4dC5pbmRleEtleTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC50eXBlLmluZGV4S2V5ID0gY29udGV4dC5pbmRleEtleTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEudHlwZSA9PT0gJ21pc2NlbGxhbmVvdXMnIHx8XG4gICAgICAgICAgICAgICAgICAgIChfcmVzdWx0LmRhdGEuY3R5cGUgJiYgX3Jlc3VsdC5kYXRhLmN0eXBlID09PSAnbWlzY2VsbGFuZW91cycpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYWlucGFnZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKF9yZXN1bHQuZGF0YS5zdWJ0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlbnVtJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucGFnZSA9ICdlbnVtZXJhdGlvbnMnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wYWdlID0gJ2Z1bmN0aW9ucyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd0eXBlYWxpYXMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5wYWdlID0gJ3R5cGVhbGlhc2VzJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ZhcmlhYmxlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWlucGFnZSA9ICd2YXJpYWJsZXMnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHlwZS5ocmVmID0gJy4uLycgKyBfcmVzdWx0LmRhdGEuY3R5cGUgKyAnLycgKyBtYWlucGFnZSArICcuaHRtbCc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LmRhdGEgJiYgX3Jlc3VsdC5kYXRhLm5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHlwZS5ocmVmICs9ICcjJyArIF9yZXN1bHQuZGF0YS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICghY29udGV4dC50eXBlLmluZGV4S2V5KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQudHlwZS5pbmRleEtleSA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb250ZXh0LnR5cGUudGFyZ2V0ID0gJ19zZWxmJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLmhyZWYgPSBgaHR0cHM6Ly8ke2FuZ3VsYXJEb2NQcmVmaXh9YW5ndWxhci5pby8ke19yZXN1bHQuZGF0YS5wYXRofWA7XG4gICAgICAgICAgICAgICAgY29udGV4dC50eXBlLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfSBlbHNlIGlmIChCYXNpY1R5cGVVdGlsLmlzS25vd25UeXBlKG5hbWUpKSB7XG4gICAgICAgICAgICBjb250ZXh0LnR5cGUgPSB7XG4gICAgICAgICAgICAgICAgcmF3OiBuYW1lLFxuICAgICAgICAgICAgICAgIGluZGV4S2V5OiAnJ1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGNvbnRleHQudHlwZS50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgIGNvbnRleHQudHlwZS5ocmVmID0gQmFzaWNUeXBlVXRpbC5nZXRUeXBlVXJsKG5hbWUpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5pbXBvcnQgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGNsYXNzIE1vZGlmSWNvbkhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGtpbmQ6IFN5bnRheEtpbmQpOiBzdHJpbmcge1xuICAgICAgICBsZXQgX2tpbmRUZXh0ID0gJyc7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdsb2NrJzsgLy8gcHJpdmF0ZVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByb3RlY3RlZEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ2xvY2snOyAvLyBwcm90ZWN0ZWRcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdyZXNldCc7IC8vIHN0YXRpY1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLkV4cG9ydEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ2V4cG9ydCc7IC8vIGV4cG9ydFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAncmVzZXQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBfa2luZFRleHQ7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcblxuaW1wb3J0IHsgdHMsIFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmV4cG9ydCBjbGFzcyBNb2RpZktpbmRIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgLyoqXG4gICAgICogVHJhbnNmb3JtIFN5bnRheEtpbmQgaW50byBzdHJpbmdcbiAgICAgKiBAcGFyYW0gIHthbnl9ICAgICAgICAgICBjb250ZXh0IEhhbmRsZWJhcnMgY29udGV4dFxuICAgICAqIEBwYXJhbSAge1N5bnRheEtpbmRbXX0ga2luZCAgU3ludGF4S2luZCBjb25jYXRlbmF0ZWRcbiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9ICAgICAgICAgICAgICAgIFBhcnNlZCBzdHJpbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGtpbmQ6IFN5bnRheEtpbmRbXSkge1xuICAgICAgICBsZXQgX2tpbmRUZXh0ID0gJyc7XG4gICAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdQcml2YXRlJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5SZWFkb25seUtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ1JlYWRvbmx5JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkOlxuICAgICAgICAgICAgICAgIF9raW5kVGV4dCA9ICdQcm90ZWN0ZWQnO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ1B1YmxpYyc7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuU3RhdGljS2V5d29yZDpcbiAgICAgICAgICAgICAgICBfa2luZFRleHQgPSAnU3RhdGljJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Bc3luY0tleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ0FzeW5jJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5BYnN0cmFjdEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgX2tpbmRUZXh0ID0gJ0Fic3RyYWN0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyhfa2luZFRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgT2JqZWN0TGVuZ3RoSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgb2JqOiBPYmplY3QsIG9wZXJhdG9yOiBzdHJpbmcsIGxlbmd0aDogbnVtYmVyKSB7XG4gICAgICAgIGxldCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMTtcbiAgICAgICAgbGV0IG9wdGlvbnM6IElIYW5kbGViYXJzT3B0aW9ucyA9IGFyZ3VtZW50c1tsZW5dO1xuXG4gICAgICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuaW52ZXJzZShjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzaXplID0gMCxcbiAgICAgICAgICAgIGtleTtcbiAgICAgICAgZm9yIChrZXkgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBzaXplKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7XG4gICAgICAgICAgICBjYXNlICc9PT0nOlxuICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNpemUgPT09IGxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJyE9PSc6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2l6ZSAhPT0gbGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnPic6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gc2l6ZSA+IGxlbmd0aDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2hlbHBlciB7e29iamVjdExlbmd0aH19OiBpbnZhbGlkIG9wZXJhdG9yOiBgJyArIG9wZXJhdG9yICsgJ2AnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmNvbnN0IEhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5kbGViYXJzJyk7XG5cbmV4cG9ydCBjbGFzcyBPYmplY3RIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB0ZXh0OiBzdHJpbmcpIHtcbiAgICAgICAgdGV4dCA9IEpTT04uc3RyaW5naWZ5KHRleHQpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC97XCIvLCAnezxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcIicpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8sXCIvLCAnLDxicj4mbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtcIicpO1xuICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC99JC8sICc8YnI+fScpO1xuICAgICAgICByZXR1cm4gbmV3IEhhbmRsZWJhcnMuU2FmZVN0cmluZyh0ZXh0KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciwgSUhhbmRsZWJhcnNPcHRpb25zIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIE9uZVBhcmFtZXRlckhhc0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIHRhZ3MsIHR5cGVUb0NoZWNrKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBsZXQgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMgPSBhcmd1bWVudHNbbGVuXTtcblxuICAgICAgICBsZXQgaSA9IDAsXG4gICAgICAgICAgICBsZW5nID0gdGFncy5sZW5ndGg7XG5cbiAgICAgICAgZm9yIChpOyBpIDwgbGVuZzsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRhZ3NbaV1bdHlwZVRvQ2hlY2tdICE9PSAndW5kZWZpbmVkJyAmJiB0YWdzW2ldW3R5cGVUb0NoZWNrXSAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJlc3VsdCkge1xuICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBPckxlbmd0aEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnkgLyogYW55LCBhbnksIC4uLiwgb3B0aW9ucyAqLykge1xuICAgICAgICBsZXQgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMgPSBhcmd1bWVudHNbbGVuXTtcblxuICAgICAgICAvLyBXZSBzdGFydCBhdCAxIGJlY2F1c2Ugb2Ygb3B0aW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoYXJndW1lbnRzW2ldKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zLmZuKGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zLmludmVyc2UoY29udGV4dCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIsIElIYW5kbGViYXJzT3B0aW9ucyB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBPckhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnkgLyogYW55LCBhbnksIC4uLiwgb3B0aW9ucyAqLykge1xuICAgICAgICBsZXQgbGVuID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7XG4gICAgICAgIGxldCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMgPSBhcmd1bWVudHNbbGVuXTtcblxuICAgICAgICAvLyBXZSBzdGFydCBhdCAxIGJlY2F1c2Ugb2Ygb3B0aW9uc1xuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuZm4oY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmltcG9ydCB7IGV4dHJhY3RMZWFkaW5nVGV4dCwgc3BsaXRMaW5rVGV4dCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL2xpbmstcGFyc2VyJztcbmltcG9ydCBEZXBlbmRlbmNpZXNFbmdpbmUgZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5cbmV4cG9ydCBjbGFzcyBQYXJzZURlc2NyaXB0aW9uSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgZGVzY3JpcHRpb246IHN0cmluZywgZGVwdGg6IG51bWJlcikge1xuICAgICAgICBsZXQgdGFnUmVnRXhwTGlnaHQgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKTtcbiAgICAgICAgbGV0IHRhZ1JlZ0V4cEZ1bGwgPSBuZXcgUmVnRXhwKCdcXFxce0BsaW5rXFxcXHMrKCg/Oi58XFxuKSs/KVxcXFx9JywgJ2knKTtcbiAgICAgICAgbGV0IHRhZ1JlZ0V4cDtcbiAgICAgICAgbGV0IG1hdGNoZXM7XG4gICAgICAgIGxldCBwcmV2aW91c1N0cmluZztcbiAgICAgICAgbGV0IHRhZ0luZm8gPSBbXTtcblxuICAgICAgICB0YWdSZWdFeHAgPSBkZXNjcmlwdGlvbi5pbmRleE9mKCddeycpICE9PSAtMSA/IHRhZ1JlZ0V4cEZ1bGwgOiB0YWdSZWdFeHBMaWdodDtcblxuICAgICAgICBjb25zdCBwcm9jZXNzVGhlTGluayA9IChvcmlnaW5hbERlc2NyaXB0aW9uLCBtYXRjaGVkVGFnLCBsZWFkaW5nVGV4dCkgPT4ge1xuICAgICAgICAgICAgbGV0IGxlYWRpbmcgPSBleHRyYWN0TGVhZGluZ1RleHQob3JpZ2luYWxEZXNjcmlwdGlvbiwgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZyk7XG4gICAgICAgICAgICBsZXQgc3BsaXQ7XG4gICAgICAgICAgICBsZXQgcmVzdWx0SW5Db21wb2RvYztcbiAgICAgICAgICAgIGxldCBuZXdMaW5rO1xuICAgICAgICAgICAgbGV0IHJvb3RQYXRoO1xuICAgICAgICAgICAgbGV0IHN0cmluZ3RvUmVwbGFjZTtcbiAgICAgICAgICAgIGxldCBhbmNob3IgPSAnJztcbiAgICAgICAgICAgIGxldCBsYWJlbDtcbiAgICAgICAgICAgIGxldCBwYWdlTmFtZTtcblxuICAgICAgICAgICAgc3BsaXQgPSBzcGxpdExpbmtUZXh0KG1hdGNoZWRUYWcudGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYyA9IERlcGVuZGVuY2llc0VuZ2luZS5maW5kSW5Db21wb2RvYyhzcGxpdC50YXJnZXQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgaW5mbyA9IG1hdGNoZWRUYWcudGV4dDtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZFRhZy50ZXh0LmluZGV4T2YoJyMnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yID0gbWF0Y2hlZFRhZy50ZXh0LnN1YnN0cihcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZWRUYWcudGV4dC5pbmRleE9mKCcjJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVkVGFnLnRleHQubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGluZm8gPSBtYXRjaGVkVGFnLnRleHQuc3Vic3RyKDAsIG1hdGNoZWRUYWcudGV4dC5pbmRleE9mKCcjJykpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHRJbkNvbXBvZG9jID0gRGVwZW5kZW5jaWVzRW5naW5lLmZpbmRJbkNvbXBvZG9jKGluZm8pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzdWx0SW5Db21wb2RvYykge1xuICAgICAgICAgICAgICAgIGxhYmVsID0gcmVzdWx0SW5Db21wb2RvYy5uYW1lO1xuICAgICAgICAgICAgICAgIHBhZ2VOYW1lID0gcmVzdWx0SW5Db21wb2RvYy5uYW1lO1xuXG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHRJbkNvbXBvZG9jLnR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID0gJ2NsYXNzZXMnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdEluQ29tcG9kb2MudHlwZSA9PT0gJ21pc2NlbGxhbmVvdXMnIHx8XG4gICAgICAgICAgICAgICAgICAgIChyZXN1bHRJbkNvbXBvZG9jLmN0eXBlICYmIHJlc3VsdEluQ29tcG9kb2MuY3R5cGUgPT09ICdtaXNjZWxsYW5lb3VzJylcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID0gJ21pc2NlbGxhbmVvdXMnOyAvLyBOb3QgYSB0eXBvLCBpdCBpcyBmb3IgbWF0Y2hpbmcgb3RoZXIgc2luZ2xlIHR5cGVzIDogY29tcG9uZW50LCBtb2R1bGUgZXRjXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gcmVzdWx0SW5Db21wb2RvYy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBhbmNob3IgPSAnIycgKyByZXN1bHRJbkNvbXBvZG9jLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHRJbkNvbXBvZG9jLnN1YnR5cGUgPT09ICdlbnVtJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWUgPSAnZW51bWVyYXRpb25zJztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXN1bHRJbkNvbXBvZG9jLnN1YnR5cGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VOYW1lID0gJ2Z1bmN0aW9ucyc7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmVzdWx0SW5Db21wb2RvYy5zdWJ0eXBlID09PSAndHlwZWFsaWFzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWUgPSAndHlwZWFsaWFzZXMnO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdEluQ29tcG9kb2Muc3VidHlwZSA9PT0gJ3ZhcmlhYmxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZU5hbWUgPSAndmFyaWFibGVzJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJvb3RQYXRoID0gJyc7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RQYXRoID0gJy4vJztcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAzOlxuICAgICAgICAgICAgICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RQYXRoID0gJy4uLycucmVwZWF0KGRlcHRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChsZWFkaW5nLmxlYWRpbmdUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBsZWFkaW5nLmxlYWRpbmdUZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNwbGl0LmxpbmtUZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IHNwbGl0LmxpbmtUZXh0O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID09PSAnbWlzY2VsbGFuZW91cycgfHxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0SW5Db21wb2RvYy50eXBlID09PSAnY2xhc3NlcydcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtyb290UGF0aH0ke3Jlc3VsdEluQ29tcG9kb2MudHlwZX0vJHtwYWdlTmFtZX0uaHRtbCR7YW5jaG9yfVwiPiR7bGFiZWx9PC9hPmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtyb290UGF0aH0ke3Jlc3VsdEluQ29tcG9kb2MudHlwZX1zLyR7cGFnZU5hbWV9Lmh0bWwke2FuY2hvcn1cIj4ke2xhYmVsfTwvYT5gO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbERlc2NyaXB0aW9uLnJlcGxhY2Uoc3RyaW5ndG9SZXBsYWNlLCBuZXdMaW5rKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoIXJlc3VsdEluQ29tcG9kb2MgJiYgdHlwZW9mIHNwbGl0LmxpbmtUZXh0ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIG5ld0xpbmsgPSBgPGEgaHJlZj1cIiR7c3BsaXQudGFyZ2V0fVwiPiR7c3BsaXQubGlua1RleHR9PC9hPmA7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzcGxpdC5saW5rVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxEZXNjcmlwdGlvbi5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgbmV3TGluayk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKCFyZXN1bHRJbkNvbXBvZG9jICYmIGxlYWRpbmcgJiYgdHlwZW9mIGxlYWRpbmcubGVhZGluZ1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtzcGxpdC50YXJnZXR9XCI+JHtsZWFkaW5nLmxlYWRpbmdUZXh0fTwvYT5gO1xuICAgICAgICAgICAgICAgIGlmIChsZWFkaW5nVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nVGV4dCArICddJyArIG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsZWFkaW5nLmxlYWRpbmdUZXh0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gJ1snICsgbGVhZGluZy5sZWFkaW5nVGV4dCArICddJyArIG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc3BsaXQubGlua1RleHQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9IG1hdGNoZWRUYWcuY29tcGxldGVUYWc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RyaW5ndG9SZXBsYWNlID0gbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRGVzY3JpcHRpb24ucmVwbGFjZShzdHJpbmd0b1JlcGxhY2UsIG5ld0xpbmspO1xuICAgICAgICAgICAgfSBlbHNlIGlmICghcmVzdWx0SW5Db21wb2RvYyAmJiB0eXBlb2Ygc3BsaXQubGlua1RleHQgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbmV3TGluayA9IGA8YSBocmVmPVwiJHtzcGxpdC50YXJnZXR9XCI+JHtzcGxpdC50YXJnZXR9PC9hPmA7XG4gICAgICAgICAgICAgICAgaWYgKGxlYWRpbmdUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0cmluZ3RvUmVwbGFjZSA9ICdbJyArIGxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGxlYWRpbmcubGVhZGluZ1RleHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSAnWycgKyBsZWFkaW5nLmxlYWRpbmdUZXh0ICsgJ10nICsgbWF0Y2hlZFRhZy5jb21wbGV0ZVRhZztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHJpbmd0b1JlcGxhY2UgPSBtYXRjaGVkVGFnLmNvbXBsZXRlVGFnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxEZXNjcmlwdGlvbi5yZXBsYWNlKHN0cmluZ3RvUmVwbGFjZSwgbmV3TGluayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbERlc2NyaXB0aW9uO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGZ1bmN0aW9uIHJlcGxhY2VNYXRjaChyZXBsYWNlciwgdGFnLCBtYXRjaCwgdGV4dCwgbGlua1RleHQ/KSB7XG4gICAgICAgICAgICBsZXQgbWF0Y2hlZFRhZyA9IHtcbiAgICAgICAgICAgICAgICBjb21wbGV0ZVRhZzogbWF0Y2gsXG4gICAgICAgICAgICAgICAgdGFnOiB0YWcsXG4gICAgICAgICAgICAgICAgdGV4dDogdGV4dFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRhZ0luZm8ucHVzaChtYXRjaGVkVGFnKTtcblxuICAgICAgICAgICAgaWYgKGxpbmtUZXh0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VyKGRlc2NyaXB0aW9uLCBtYXRjaGVkVGFnLCBsaW5rVGV4dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXBsYWNlcihkZXNjcmlwdGlvbiwgbWF0Y2hlZFRhZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhbiBkZXNjcmlwdGlvbiBmb3IgbWFya2VkIGEgdGFnIHBhcnNlZCB0b28gZWFybHlcblxuICAgICAgICBpZiAoZGVzY3JpcHRpb24uaW5kZXhPZignaHJlZj0nKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIGxldCBpbnNpZGVNYXJrZWRBVGFnUmVzdWx0cyA9IGRlc2NyaXB0aW9uLm1hdGNoKC88YSBbXj5dKz4oW148XSspPFxcL2E+L2cpO1xuXG4gICAgICAgICAgICBpZiAoaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMgJiYgaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zaWRlTWFya2VkQVRhZ1Jlc3VsdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtlZEFUYWdSZWdFeHAgPSBuZXcgUmVnRXhwKCc8YSBbXj5dKz4oW148XSspPC9hPicsICdnbScpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyc2VkQVRhZyA9IG1hcmtlZEFUYWdSZWdFeHAuZXhlYyhkZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZWRBVGFnICYmIHBhcnNlZEFUYWcubGVuZ3RoID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5zaWRlTWFya2VkQVRhZyA9IHBhcnNlZEFUYWdbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYHtAbGluayA8YSBocmVmPVwiJHtlbmNvZGVVUkkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2lkZU1hcmtlZEFUYWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfVwiPiR7aW5zaWRlTWFya2VkQVRhZ308L2E+YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBge0BsaW5rICR7aW5zaWRlTWFya2VkQVRhZ31gXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZG8ge1xuICAgICAgICAgICAgbWF0Y2hlcyA9IHRhZ1JlZ0V4cC5leGVjKGRlc2NyaXB0aW9uKTtcblxuICAgICAgICAgICAgLy8gRGlkIHdlIGhhdmUge0BsaW5rID9cbiAgICAgICAgICAgIGlmIChtYXRjaGVzKSB7XG4gICAgICAgICAgICAgICAgcHJldmlvdXNTdHJpbmcgPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSByZXBsYWNlTWF0Y2gocHJvY2Vzc1RoZUxpbmssICdsaW5rJywgbWF0Y2hlc1swXSwgbWF0Y2hlc1sxXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHJlcGxhY2VNYXRjaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NUaGVMaW5rLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2xpbmsnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1swXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXNbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGVzWzFdXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IHdoaWxlIChtYXRjaGVzICYmIHByZXZpb3VzU3RyaW5nICE9PSBkZXNjcmlwdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcbmNvbnN0IEhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5kbGViYXJzJyk7XG5cbmV4cG9ydCBjbGFzcyBQYXJzZVByb3BlcnR5SGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgIGxldCBwcm9wOiBhbnkgPSB0ZXh0O1xuXG4gICAgICAgIGlmICghIXRleHQgJiYgdGV4dC5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0ICYmIHRleHRbJ3VybCddICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHByb3AgPSB0ZXh0Wyd1cmwnXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghIXRleHQgJiYgdGV4dC5jb25zdHJ1Y3RvciA9PT0gT2JqZWN0ICYmIHRleHRbJ25hbWUnXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBwcm9wID0gdGV4dFsnbmFtZSddO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCEhdGV4dCAmJiB0ZXh0LmNvbnN0cnVjdG9yID09PSBPYmplY3QgJiYgT2JqZWN0LmtleXModGV4dCkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBwcm9wID0gJyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcCBpbnN0YW5jZW9mIFN0cmluZyAmJiBwcm9wICE9PSAnJyAmJiBwcm9wLmluZGV4T2YoJ2h0dHBzJykgIT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gYDxhIGhyZWY9XCIke3Byb3B9XCIgdGFyZ2V0PVwiX2JsYW5rXCI+JHtwcm9wfTwvYT5gO1xuICAgICAgICB9IGVsc2UgaWYgKHByb3AgIT09ICcnICYmIHByb3AgaW5zdGFuY2VvZiBBcnJheSAmJiBwcm9wLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHByb3AgPSBKU09OLnN0cmluZ2lmeShwcm9wKTtcbiAgICAgICAgICAgIHByb3AgPSBwcm9wLnJlcGxhY2UoL1wiLFwiL2csICcsICcpO1xuICAgICAgICAgICAgcHJvcCA9IHByb3AucmVwbGFjZSgvXFxbXCIvZywgJycpO1xuICAgICAgICAgICAgcHJvcCA9IHByb3AucmVwbGFjZSgvXCJdL2csICcnKTtcbiAgICAgICAgICAgIHJldHVybiBwcm9wO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHByb3A7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgeyBJSHRtbEVuZ2luZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVyLmludGVyZmFjZSc7XG5cbmV4cG9ydCBjbGFzcyBSZWxhdGl2ZVVSTEhlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGN1cnJlbnREZXB0aDogbnVtYmVyLCBvcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgc3dpdGNoIChjdXJyZW50RGVwdGgpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJy4vJztcbiAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIGNhc2UgNTpcbiAgICAgICAgICAgICAgICByZXR1cm4gJy4uLycucmVwZWF0KGN1cnJlbnREZXB0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgSUh0bWxFbmdpbmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgU2hvcnRVUkxIZWxwZXIgaW1wbGVtZW50cyBJSHRtbEVuZ2luZUhlbHBlciB7XG4gICAgcHVibGljIGhlbHBlckZ1bmMoY29udGV4dDogYW55LCB1cmw6IHN0cmluZywgb3B0aW9ucyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBuZXdVcmwgPSB1cmw7XG4gICAgICAgIGxldCBmaXJzdEluZGV4T2ZTbGFzaCA9IG5ld1VybC5pbmRleE9mKCcvJyk7XG4gICAgICAgIGxldCBsYXN0SW5kZXhPZlNsYXNoID0gbmV3VXJsLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICAgIGlmIChmaXJzdEluZGV4T2ZTbGFzaCAhPT0gLTEgfHwgbGFzdEluZGV4T2ZTbGFzaCAhPT0gLTEpIHtcbiAgICAgICAgICAgIG5ld1VybCA9XG4gICAgICAgICAgICAgICAgbmV3VXJsLnN1YnN0cigwLCBmaXJzdEluZGV4T2ZTbGFzaCArIDEpICtcbiAgICAgICAgICAgICAgICAnLi4uJyArXG4gICAgICAgICAgICAgICAgbmV3VXJsLnN1YnN0cihsYXN0SW5kZXhPZlNsYXNoLCBuZXdVcmwubGVuZ3RoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3VXJsO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXIuaW50ZXJmYWNlJztcblxuZXhwb3J0IGNsYXNzIFN0cmlwVVJMSGVscGVyIGltcGxlbWVudHMgSUh0bWxFbmdpbmVIZWxwZXIge1xuICAgIHB1YmxpYyBoZWxwZXJGdW5jKGNvbnRleHQ6IGFueSwgcHJlZml4OiBzdHJpbmcsIHVybDogc3RyaW5nLCBvcHRpb25zKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHByZWZpeCArIHVybC5zcGxpdChcIi9cIikucG9wKCk7XG4gICAgfVxufSIsImltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyLCBJSGFuZGxlYmFyc09wdGlvbnMgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuXG5leHBvcnQgY2xhc3MgSWZFcXVhbFN0cmluZ0hlbHBlciBpbXBsZW1lbnRzIElIdG1sRW5naW5lSGVscGVyIHtcbiAgICBwdWJsaWMgaGVscGVyRnVuYyhjb250ZXh0OiBhbnksIGE6IGFueSwgYjogYW55LCBvcHRpb25zOiBJSGFuZGxlYmFyc09wdGlvbnMpOiBzdHJpbmcge1xuICAgICAgICBpZiAoYSA9PSBiKSB7XG4gICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5mbihjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3B0aW9ucy5pbnZlcnNlKGNvbnRleHQpO1xuICAgIH1cbn1cbiIsImNvbnN0IEhhbmRsZWJhcnMgPSByZXF1aXJlKCdoYW5kbGViYXJzJyk7XG5cbmltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgQnJlYWtDb21tYUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1jb21tYS5oZWxwZXInO1xuaW1wb3J0IHsgQnJlYWtMaW5lc0hlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9icmVhay1saW5lcy5oZWxwZXInO1xuaW1wb3J0IHsgQ2FwaXRhbGl6ZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9jYXBpdGFsaXplLmhlbHBlcic7XG5pbXBvcnQgeyBDbGVhblBhcmFncmFwaEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9jbGVhbi1wYXJhZ3JhcGguaGVscGVyJztcbmltcG9ydCB7IENvbXBhcmVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvY29tcGFyZS5oZWxwZXInO1xuaW1wb3J0IHsgRGVidWdIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZGVidWcuaGVscGVyJztcbmltcG9ydCB7IEVsZW1lbnRBbG9uZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9lbGVtZW50LWFsb25lLmhlbHBlcic7XG5pbXBvcnQgeyBFc2NhcGVTaW1wbGVRdW90ZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9lc2NhcGUtc2ltcGxlLXF1b3RlLmhlbHBlcic7XG5pbXBvcnQgeyBGaWx0ZXJBbmd1bGFyMk1vZHVsZXNIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvZmlsdGVyLWFuZ3VsYXIyLW1vZHVsZXMuaGVscGVyJztcbmltcG9ydCB7IEZ1bmN0aW9uU2lnbmF0dXJlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2Z1bmN0aW9uLXNpZ25hdHVyZS5oZWxwZXInO1xuaW1wb3J0IHsgSGFzT3duSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2hhcy1vd24uaGVscGVyJztcbmltcG9ydCB7IElIdG1sRW5naW5lSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2h0bWwtZW5naW5lLWhlbHBlci5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSTE4bkhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pMThuLmhlbHBlcic7XG5pbXBvcnQgeyBJZlN0cmluZ0hlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pZi1zdHJpbmcuaGVscGVyJztcbmltcG9ydCB7IEluZGV4YWJsZVNpZ25hdHVyZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pbmRleGFibGUtc2lnbmF0dXJlLmhlbHBlcic7XG5pbXBvcnQgeyBJc0luaXRpYWxUYWJIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvaXMtaW5pdGlhbC10YWIuaGVscGVyJztcbmltcG9ydCB7IElzTm90VG9nZ2xlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2lzLW5vdC10b2dnbGUuaGVscGVyJztcbmltcG9ydCB7IElzVGFiRW5hYmxlZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9pcy10YWItZW5hYmxlZC5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NDb2RlRXhhbXBsZUhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1jb2RlLWV4YW1wbGUuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jRGVmYXVsdEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1kZWZhdWx0LmhlbHBlcic7XG5pbXBvcnQgeyBKc2RvY0V4YW1wbGVIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvanNkb2MtZXhhbXBsZS5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NQYXJhbXNWYWxpZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1wYXJhbXMtdmFsaWQuaGVscGVyJztcbmltcG9ydCB7IEpzZG9jUGFyYW1zSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2pzZG9jLXBhcmFtcy5oZWxwZXInO1xuaW1wb3J0IHsgSnNkb2NSZXR1cm5zQ29tbWVudEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9qc2RvYy1yZXR1cm5zLWNvbW1lbnQuaGVscGVyJztcbmltcG9ydCB7IExpbmtUeXBlSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2xpbmstdHlwZS5oZWxwZXInO1xuaW1wb3J0IHsgTW9kaWZJY29uSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL21vZGlmLWljb24uaGVscGVyJztcbmltcG9ydCB7IE1vZGlmS2luZEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9tb2RpZi1raW5kLWhlbHBlcic7XG5pbXBvcnQgeyBPYmplY3RMZW5ndGhIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvb2JqZWN0LWxlbmd0aC5oZWxwZXInO1xuaW1wb3J0IHsgT2JqZWN0SGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL29iamVjdC5oZWxwZXInO1xuaW1wb3J0IHsgT25lUGFyYW1ldGVySGFzSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL29uZS1wYXJhbWV0ZXItaGFzLmhlbHBlcic7XG5pbXBvcnQgeyBPckxlbmd0aEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9vci1sZW5ndGguaGVscGVyJztcbmltcG9ydCB7IE9ySGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL29yLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJzZURlc2NyaXB0aW9uSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL3BhcnNlLWRlc2NyaXB0aW9uLmhlbHBlcic7XG5pbXBvcnQgeyBQYXJzZVByb3BlcnR5SGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL3BhcnNlLXByb3BlcnR5LmhlbHBlcic7XG5pbXBvcnQgeyBSZWxhdGl2ZVVSTEhlbHBlciB9IGZyb20gJy4vaHRtbC1lbmdpbmUtaGVscGVycy9yZWxhdGl2ZS11cmwuaGVscGVyJztcbmltcG9ydCB7IFNob3J0VVJMSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL3Nob3J0LXVybC5oZWxwZXInO1xuaW1wb3J0IHsgU3RyaXBVUkxIZWxwZXIgfSBmcm9tICcuL2h0bWwtZW5naW5lLWhlbHBlcnMvc3RyaXAtdXJsLmhlbHBlcic7XG5pbXBvcnQgeyBJZkVxdWFsU3RyaW5nSGVscGVyIH0gZnJvbSAnLi9odG1sLWVuZ2luZS1oZWxwZXJzL2lmLWVxdWFsLXN0cmluZy5oZWxwZXInO1xuXG5leHBvcnQgY2xhc3MgSHRtbEVuZ2luZUhlbHBlcnMge1xuICAgIHB1YmxpYyByZWdpc3RlckhlbHBlcnMoYmFycyk6IHZvaWQge1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdjb21wYXJlJywgbmV3IENvbXBhcmVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ29yJywgbmV3IE9ySGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdmdW5jdGlvblNpZ25hdHVyZScsIG5ldyBGdW5jdGlvblNpZ25hdHVyZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnaXNOb3RUb2dnbGUnLCBuZXcgSXNOb3RUb2dnbGVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2lzSW5pdGlhbFRhYicsIG5ldyBJc0luaXRpYWxUYWJIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2lzVGFiRW5hYmxlZCcsIG5ldyBJc1RhYkVuYWJsZWRIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2lmU3RyaW5nJywgbmV3IElmU3RyaW5nSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdpZkVxdWFsU3RyaW5nJywgbmV3IElmRXF1YWxTdHJpbmdIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ29yTGVuZ3RoJywgbmV3IE9yTGVuZ3RoSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdmaWx0ZXJBbmd1bGFyMk1vZHVsZXMnLCBuZXcgRmlsdGVyQW5ndWxhcjJNb2R1bGVzSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdkZWJ1ZycsIG5ldyBEZWJ1Z0hlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnYnJlYWtsaW5lcycsIG5ldyBCcmVha0xpbmVzSGVscGVyKGJhcnMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnY2xlYW4tcGFyYWdyYXBoJywgbmV3IENsZWFuUGFyYWdyYXBoSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdlc2NhcGVTaW1wbGVRdW90ZScsIG5ldyBFc2NhcGVTaW1wbGVRdW90ZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnYnJlYWtDb21tYScsIG5ldyBCcmVha0NvbW1hSGVscGVyKGJhcnMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnbW9kaWZLaW5kJywgbmV3IE1vZGlmS2luZEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnbW9kaWZJY29uJywgbmV3IE1vZGlmSWNvbkhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAncmVsYXRpdmVVUkwnLCBuZXcgUmVsYXRpdmVVUkxIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2pzZG9jLXJldHVybnMtY29tbWVudCcsIG5ldyBKc2RvY1JldHVybnNDb21tZW50SGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdqc2RvYy1jb2RlLWV4YW1wbGUnLCBuZXcgSnNkb2NDb2RlRXhhbXBsZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtZXhhbXBsZScsIG5ldyBKc2RvY0V4YW1wbGVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2pzZG9jLXBhcmFtcycsIG5ldyBKc2RvY1BhcmFtc0hlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnanNkb2MtcGFyYW1zLXZhbGlkJywgbmV3IEpzZG9jUGFyYW1zVmFsaWRIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2pzZG9jLWRlZmF1bHQnLCBuZXcgSnNkb2NEZWZhdWx0SGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdsaW5rVHlwZScsIG5ldyBMaW5rVHlwZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnaW5kZXhhYmxlU2lnbmF0dXJlJywgbmV3IEluZGV4YWJsZVNpZ25hdHVyZUhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnb2JqZWN0JywgbmV3IE9iamVjdEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAnb2JqZWN0TGVuZ3RoJywgbmV3IE9iamVjdExlbmd0aEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAncGFyc2VEZXNjcmlwdGlvbicsIG5ldyBQYXJzZURlc2NyaXB0aW9uSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdvbmUtcGFyYW1ldGVyLWhhcycsIG5ldyBPbmVQYXJhbWV0ZXJIYXNIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ2VsZW1lbnQtYWxvbmUnLCBuZXcgRWxlbWVudEFsb25lSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdoYXNPd24nLCBuZXcgSGFzT3duSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdzaG9ydC11cmwnLCBuZXcgU2hvcnRVUkxIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ3N0cmlwLXVybCcsIG5ldyBTdHJpcFVSTEhlbHBlcigpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckhlbHBlcihiYXJzLCAndCcsIG5ldyBJMThuSGVscGVyKCkpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVySGVscGVyKGJhcnMsICdjYXBpdGFsaXplJywgbmV3IENhcGl0YWxpemVIZWxwZXIoKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJIZWxwZXIoYmFycywgJ3BhcnNlLXByb3BlcnR5JywgbmV3IFBhcnNlUHJvcGVydHlIZWxwZXIoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSByZWdpc3RlckhlbHBlcihiYXJzLCBrZXk6IHN0cmluZywgaGVscGVyOiBJSHRtbEVuZ2luZUhlbHBlcikge1xuICAgICAgICBIYW5kbGViYXJzLnJlZ2lzdGVySGVscGVyKGtleSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWludmFsaWQtdGhpc1xuICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5oZWxwZXJGdW5jLmFwcGx5KGhlbHBlciwgW3RoaXMsIC4uLl8uc2xpY2UoYXJndW1lbnRzIGFzIGFueSldKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiY29uc3QgSGFuZGxlYmFycyA9IHJlcXVpcmUoJ2hhbmRsZWJhcnMnKTtcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcbmltcG9ydCB7IEh0bWxFbmdpbmVIZWxwZXJzIH0gZnJvbSAnLi9odG1sLmVuZ2luZS5oZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEh0bWxFbmdpbmUge1xuICAgIHByaXZhdGUgY2FjaGU6IHsgcGFnZTogc3RyaW5nIH0gPSB7fSBhcyBhbnk7XG4gICAgcHJpdmF0ZSBjb21waWxlZFBhZ2U7XG5cbiAgICBwcml2YXRlIHByZWNvbXBpbGVkTWVudTtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBIdG1sRW5naW5lO1xuICAgIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGNvbnN0IGhlbHBlciA9IG5ldyBIdG1sRW5naW5lSGVscGVycygpO1xuICAgICAgICBoZWxwZXIucmVnaXN0ZXJIZWxwZXJzKEhhbmRsZWJhcnMpO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIUh0bWxFbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIEh0bWxFbmdpbmUuaW5zdGFuY2UgPSBuZXcgSHRtbEVuZ2luZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBIdG1sRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbml0KHRlbXBsYXRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHBhcnRpYWxzID0gW1xuICAgICAgICAgICAgJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICdtYXJrZG93bicsXG4gICAgICAgICAgICAnbW9kdWxlcycsXG4gICAgICAgICAgICAnbW9kdWxlJyxcbiAgICAgICAgICAgICdjb21wb25lbnQnLFxuICAgICAgICAgICAgJ2NvbnRyb2xsZXInLFxuICAgICAgICAgICAgJ2VudGl0eScsXG4gICAgICAgICAgICAnY29tcG9uZW50LWRldGFpbCcsXG4gICAgICAgICAgICAnZGlyZWN0aXZlJyxcbiAgICAgICAgICAgICdpbmplY3RhYmxlJyxcbiAgICAgICAgICAgICdpbnRlcmNlcHRvcicsXG4gICAgICAgICAgICAnZ3VhcmQnLFxuICAgICAgICAgICAgJ3BpcGUnLFxuICAgICAgICAgICAgJ2NsYXNzJyxcbiAgICAgICAgICAgICdpbnRlcmZhY2UnLFxuICAgICAgICAgICAgJ3JvdXRlcycsXG4gICAgICAgICAgICAnaW5kZXgnLFxuICAgICAgICAgICAgJ2luZGV4LW1pc2MnLFxuICAgICAgICAgICAgJ3NlYXJjaC1yZXN1bHRzJyxcbiAgICAgICAgICAgICdzZWFyY2gtaW5wdXQnLFxuICAgICAgICAgICAgJ2xpbmstdHlwZScsXG4gICAgICAgICAgICAnYmxvY2stbWV0aG9kJyxcbiAgICAgICAgICAgICdibG9jay1ob3N0LWxpc3RlbmVyJyxcbiAgICAgICAgICAgICdibG9jay1lbnVtJyxcbiAgICAgICAgICAgICdibG9jay1wcm9wZXJ0eScsXG4gICAgICAgICAgICAnYmxvY2staW5kZXgnLFxuICAgICAgICAgICAgJ2Jsb2NrLWNvbnN0cnVjdG9yJyxcbiAgICAgICAgICAgICdibG9jay10eXBlYWxpYXMnLFxuICAgICAgICAgICAgJ2Jsb2NrLWFjY2Vzc29ycycsXG4gICAgICAgICAgICAnYmxvY2staW5wdXQnLFxuICAgICAgICAgICAgJ2Jsb2NrLW91dHB1dCcsXG4gICAgICAgICAgICAnY292ZXJhZ2UtcmVwb3J0JyxcbiAgICAgICAgICAgICd1bml0LXRlc3QtcmVwb3J0JyxcbiAgICAgICAgICAgICdtaXNjZWxsYW5lb3VzLWZ1bmN0aW9ucycsXG4gICAgICAgICAgICAnbWlzY2VsbGFuZW91cy12YXJpYWJsZXMnLFxuICAgICAgICAgICAgJ21pc2NlbGxhbmVvdXMtdHlwZWFsaWFzZXMnLFxuICAgICAgICAgICAgJ21pc2NlbGxhbmVvdXMtZW51bWVyYXRpb25zJyxcbiAgICAgICAgICAgICdhZGRpdGlvbmFsLXBhZ2UnLFxuICAgICAgICAgICAgJ3BhY2thZ2UtZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICdwYWNrYWdlLXByb3BlcnRpZXMnXG4gICAgICAgIF07XG4gICAgICAgIGlmICh0ZW1wbGF0ZVBhdGgpIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBGaWxlRW5naW5lLmV4aXN0c1N5bmMocGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIHRlbXBsYXRlUGF0aCkpID09PVxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICAgICAgJ1RlbXBsYXRlIHBhdGggc3BlY2lmaWNlZCBidXQgZG9lcyBub3QgZXhpc3QuLi51c2luZyBkZWZhdWx0IHRlbXBsYXRlcydcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgICAgICAgICAgcGFydGlhbHMubWFwKHBhcnRpYWwgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRpYWxQYXRoID0gdGhpcy5kZXRlcm1pbmVUZW1wbGF0ZVBhdGgoXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlUGF0aCxcbiAgICAgICAgICAgICAgICAgICAgJ3BhcnRpYWxzLycgKyBwYXJ0aWFsICsgJy5oYnMnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQocGFydGlhbFBhdGgpLnRoZW4oZGF0YSA9PlxuICAgICAgICAgICAgICAgICAgICBIYW5kbGViYXJzLnJlZ2lzdGVyUGFydGlhbChwYXJ0aWFsLCBkYXRhKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGFnZVBhdGggPSB0aGlzLmRldGVybWluZVRlbXBsYXRlUGF0aCh0ZW1wbGF0ZVBhdGgsICdwYWdlLmhicycpO1xuICAgICAgICAgICAgICAgIHJldHVybiBGaWxlRW5naW5lLmdldChwYWdlUGF0aCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZS5wYWdlID0gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21waWxlZFBhZ2UgPSBIYW5kbGViYXJzLmNvbXBpbGUodGhpcy5jYWNoZS5wYWdlLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50SW5kZW50OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0OiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZW51UGF0aCA9IHRoaXMuZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKHRlbXBsYXRlUGF0aCwgJ3BhcnRpYWxzL21lbnUuaGJzJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuZ2V0KG1lbnVQYXRoKS50aGVuKG1lbnVUZW1wbGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJlY29tcGlsZWRNZW51ID0gSGFuZGxlYmFycy5jb21waWxlKG1lbnVUZW1wbGF0ZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJldmVudEluZGVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdDogdHJ1ZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXJNZW51KHRlbXBsYXRlUGF0aCwgZGF0YSkge1xuICAgICAgICBjb25zdCBtZW51UGF0aCA9IHRoaXMuZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKHRlbXBsYXRlUGF0aCwgJ3BhcnRpYWxzL21lbnUuaGJzJyk7XG4gICAgICAgIHJldHVybiBGaWxlRW5naW5lLmdldChtZW51UGF0aCkudGhlbihtZW51VGVtcGxhdGUgPT4ge1xuICAgICAgICAgICAgZGF0YS5tZW51ID0gJ25vcm1hbCc7XG4gICAgICAgICAgICByZXR1cm4gSGFuZGxlYmFycy5jb21waWxlKG1lbnVUZW1wbGF0ZSwge1xuICAgICAgICAgICAgICAgIHByZXZlbnRJbmRlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgc3RyaWN0OiB0cnVlXG4gICAgICAgICAgICB9KSh7IC4uLmRhdGEgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyByZW5kZXIobWFpbkRhdGE6IGFueSwgcGFnZTogYW55KTogc3RyaW5nIHtcbiAgICAgICAgY29uc3QgbyA9IG1haW5EYXRhO1xuICAgICAgICAoT2JqZWN0IGFzIGFueSkuYXNzaWduKG8sIHBhZ2UpO1xuXG4gICAgICAgIC8vIGxldCBtZW0gPSBwcm9jZXNzLm1lbW9yeVVzYWdlKCk7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKGBoZWFwVG90YWw6ICR7bWVtLmhlYXBUb3RhbH0gfCBoZWFwVXNlZDogJHttZW0uaGVhcFVzZWR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGlsZWRQYWdlKHtcbiAgICAgICAgICAgIGRhdGE6IG9cbiAgICAgICAgfSk7XG4gICAgfVxuICAgIHByaXZhdGUgZGV0ZXJtaW5lVGVtcGxhdGVQYXRoKHRlbXBsYXRlUGF0aDogc3RyaW5nLCBmaWxlUGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IG91dFBhdGggPSBwYXRoLnJlc29sdmUoX19kaXJuYW1lICsgJy8uLi9zcmMvdGVtcGxhdGVzLycgKyBmaWxlUGF0aCk7XG4gICAgICAgIGlmICh0ZW1wbGF0ZVBhdGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHRlc3RQYXRoID0gcGF0aC5yZXNvbHZlKFxuICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIHRlbXBsYXRlUGF0aCArIHBhdGguc2VwICsgZmlsZVBhdGhcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBvdXRQYXRoID0gRmlsZUVuZ2luZS5leGlzdHNTeW5jKHRlc3RQYXRoKSA/IHRlc3RQYXRoIDogb3V0UGF0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0UGF0aDtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVDb3ZlcmFnZUJhZGdlKG91dHB1dEZvbGRlciwgbGFiZWwsIGNvdmVyYWdlRGF0YSkge1xuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQoXG4gICAgICAgICAgICBwYXRoLnJlc29sdmUoX19kaXJuYW1lICsgJy8uLi9zcmMvdGVtcGxhdGVzL3BhcnRpYWxzL2NvdmVyYWdlLWJhZGdlLmhicycpXG4gICAgICAgICkudGhlbihcbiAgICAgICAgICAgIGRhdGEgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlOiBhbnkgPSBIYW5kbGViYXJzLmNvbXBpbGUoZGF0YSk7XG4gICAgICAgICAgICAgICAgY292ZXJhZ2VEYXRhLmxhYmVsID0gbGFiZWw7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGVtcGxhdGUoe1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBjb3ZlcmFnZURhdGFcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0T3V0cHV0RGlyID0gb3V0cHV0Rm9sZGVyLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0ZXN0T3V0cHV0RGlyICYmIHRlc3RPdXRwdXREaXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb2xkZXIgPSBvdXRwdXRGb2xkZXIucmVwbGFjZShwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS53cml0ZShcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyICsgcGF0aC5zZXAgKyAnL2ltYWdlcy9jb3ZlcmFnZS1iYWRnZS0nICsgbGFiZWwgKyAnLnN2ZycsXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdFxuICAgICAgICAgICAgICAgICkuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgY292ZXJhZ2UgYmFkZ2UgJyArIGxhYmVsICsgJyBmaWxlIGdlbmVyYXRpb24gJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGVycik7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyID0+IFByb21pc2UucmVqZWN0KCdFcnJvciBkdXJpbmcgY292ZXJhZ2UgYmFkZ2UgZ2VuZXJhdGlvbicpXG4gICAgICAgICk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBIdG1sRW5naW5lLmdldEluc3RhbmNlKCk7XG4iLCJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgRmlsZUVuZ2luZSBmcm9tICcuL2ZpbGUuZW5naW5lJztcbmltcG9ydCBJMThuRW5naW5lIGZyb20gJy4vaTE4bi5lbmdpbmUnO1xuaW1wb3J0IHsgbWFya2VkQWNsIH0gZnJvbSAnLi4vLi4vdXRpbHMvbWFya2VkLmFjbCc7XG5cbmNvbnN0IGRlY2FjaGUgPSByZXF1aXJlKCdkZWNhY2hlJyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgbWFya2Rvd25SZWFkZWREYXRhcyB7XG4gICAgbWFya2Rvd246IHN0cmluZztcbiAgICByYXdEYXRhOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXJrZG93bkVuZ2luZSB7XG4gICAgLyoqXG4gICAgICogTGlzdCBvZiBtYXJrZG93biBmaWxlcyB3aXRob3V0IC5tZCBleHRlbnNpb25cbiAgICAgKi9cbiAgICBwcml2YXRlIHJlYWRvbmx5IG1hcmtkb3duRmlsZXMgPSBbJ1JFQURNRScsICdDSEFOR0VMT0cnLCAnTElDRU5TRScsICdDT05UUklCVVRJTkcnLCAnVE9ETyddO1xuXG4gICAgcHJpdmF0ZSBtYXJrZWRJbnN0YW5jZTtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBNYXJrZG93bkVuZ2luZTtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBkZWNhY2hlKCdtYXJrZWQnKTtcbiAgICAgICAgdGhpcy5tYXJrZWRJbnN0YW5jZSA9IG1hcmtlZEFjbDtcblxuICAgICAgICBjb25zdCByZW5kZXJlciA9IG5ldyB0aGlzLm1hcmtlZEluc3RhbmNlLlJlbmRlcmVyKCk7XG4gICAgICAgIHJlbmRlcmVyLmNvZGUgPSAoY29kZSwgbGFuZ3VhZ2UpID0+IHtcbiAgICAgICAgICAgIGxldCBoaWdobGlnaHRlZCA9IGNvZGU7XG4gICAgICAgICAgICBpZiAoIWxhbmd1YWdlKSB7XG4gICAgICAgICAgICAgICAgbGFuZ3VhZ2UgPSAnbm9uZSc7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGhpZ2hsaWdodGVkID0gdGhpcy5lc2NhcGUoY29kZSk7XG4gICAgICAgICAgICByZXR1cm4gYDxiPiR7STE4bkVuZ2luZS50cmFuc2xhdGUoXG4gICAgICAgICAgICAgICAgJ2V4YW1wbGUnXG4gICAgICAgICAgICApfSA6PC9iPjxkaXY+PHByZSBjbGFzcz1cImxpbmUtbnVtYmVyc1wiPjxjb2RlIGNsYXNzPVwibGFuZ3VhZ2UtJHtsYW5ndWFnZX1cIj4ke2hpZ2hsaWdodGVkfTwvY29kZT48L3ByZT48L2Rpdj5gO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlbmRlcmVyLnRhYmxlID0gKGhlYWRlciwgYm9keSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAnPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgY29tcG9kb2MtdGFibGVcIj5cXG4nICtcbiAgICAgICAgICAgICAgICAnPHRoZWFkPlxcbicgK1xuICAgICAgICAgICAgICAgIGhlYWRlciArXG4gICAgICAgICAgICAgICAgJzwvdGhlYWQ+XFxuJyArXG4gICAgICAgICAgICAgICAgJzx0Ym9keT5cXG4nICtcbiAgICAgICAgICAgICAgICBib2R5ICtcbiAgICAgICAgICAgICAgICAnPC90Ym9keT5cXG4nICtcbiAgICAgICAgICAgICAgICAnPC90YWJsZT5cXG4nXG4gICAgICAgICAgICApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJlbmRlcmVyLmltYWdlID0gZnVuY3Rpb24gKGhyZWY6IHN0cmluZywgdGl0bGU6IHN0cmluZywgdGV4dDogc3RyaW5nKSB7XG4gICAgICAgICAgICBsZXQgb3V0ID0gJzxpbWcgc3JjPVwiJyArIGhyZWYgKyAnXCIgYWx0PVwiJyArIHRleHQgKyAnXCIgY2xhc3M9XCJpbWctcmVzcG9uc2l2ZVwiJztcbiAgICAgICAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICAgICAgICAgIG91dCArPSAnIHRpdGxlPVwiJyArIHRpdGxlICsgJ1wiJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dCArPSAnPic7XG4gICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubWFya2VkSW5zdGFuY2Uuc2V0T3B0aW9ucyh7XG4gICAgICAgICAgICByZW5kZXJlcjogcmVuZGVyZXIsXG4gICAgICAgICAgICBnZm06IHRydWUsXG4gICAgICAgICAgICBicmVha3M6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIU1hcmtkb3duRW5naW5lLmluc3RhbmNlKSB7XG4gICAgICAgICAgICBNYXJrZG93bkVuZ2luZS5pbnN0YW5jZSA9IG5ldyBNYXJrZG93bkVuZ2luZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBNYXJrZG93bkVuZ2luZS5pbnN0YW5jZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0VHJhZGl0aW9uYWxNYXJrZG93bihmaWxlcGF0aDogc3RyaW5nKTogUHJvbWlzZTxtYXJrZG93blJlYWRlZERhdGFzPiB7XG4gICAgICAgIHJldHVybiBGaWxlRW5naW5lLmdldChwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyBmaWxlcGF0aCArICcubWQnKVxuICAgICAgICAgICAgLmNhdGNoKGVyciA9PiBGaWxlRW5naW5lLmdldChwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyBmaWxlcGF0aCkudGhlbigpKVxuICAgICAgICAgICAgLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmV0dXJuZWREYXRhOiBtYXJrZG93blJlYWRlZERhdGFzID0ge1xuICAgICAgICAgICAgICAgICAgICBtYXJrZG93bjogdGhpcy5tYXJrZWRJbnN0YW5jZShkYXRhKSxcbiAgICAgICAgICAgICAgICAgICAgcmF3RGF0YTogZGF0YVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJldHVybmVkRGF0YTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRUcmFkaXRpb25hbE1hcmtkb3duU3luYyhmaWxlcGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFya2VkSW5zdGFuY2UoRmlsZUVuZ2luZS5nZXRTeW5jKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIGZpbGVwYXRoKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRSZWFkbWVGaWxlKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBGaWxlRW5naW5lLmdldChwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyAnUkVBRE1FLm1kJykudGhlbihkYXRhID0+XG4gICAgICAgICAgICB0aGlzLm1hcmtlZEluc3RhbmNlKGRhdGEpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGZpbGU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGZpbGUpO1xuICAgICAgICBsZXQgcmVhZG1lRmlsZSA9IGRpcm5hbWUgKyBwYXRoLnNlcCArIHBhdGguYmFzZW5hbWUoZmlsZSwgJy50cycpICsgJy5tZCc7XG4gICAgICAgIHJldHVybiBmcy5yZWFkRmlsZVN5bmMocmVhZG1lRmlsZSwgJ3V0ZjgnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShmaWxlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgbGV0IGRpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZSk7XG4gICAgICAgIGxldCByZWFkbWVGaWxlID0gZGlybmFtZSArIHBhdGguc2VwICsgcGF0aC5iYXNlbmFtZShmaWxlLCAnLnRzJykgKyAnLm1kJztcbiAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuZXhpc3RzU3luYyhyZWFkbWVGaWxlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGNvbXBvbmVudFJlYWRtZUZpbGUoZmlsZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGRpcm5hbWUgPSBwYXRoLmRpcm5hbWUoZmlsZSk7XG4gICAgICAgIGxldCByZWFkbWVGaWxlID0gZGlybmFtZSArIHBhdGguc2VwICsgJ1JFQURNRS5tZCc7XG4gICAgICAgIGxldCByZWFkbWVBbHRlcm5hdGl2ZUZpbGUgPSBkaXJuYW1lICsgcGF0aC5zZXAgKyBwYXRoLmJhc2VuYW1lKGZpbGUsICcudHMnKSArICcubWQnO1xuICAgICAgICBsZXQgZmluYWxQYXRoID0gJyc7XG4gICAgICAgIGlmIChGaWxlRW5naW5lLmV4aXN0c1N5bmMocmVhZG1lRmlsZSkpIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCA9IHJlYWRtZUZpbGU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5hbFBhdGggPSByZWFkbWVBbHRlcm5hdGl2ZUZpbGU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZpbmFsUGF0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgYW55IG9mIHRoZSBtYXJrZG93biBmaWxlcyBpcyBleGlzdHMgd2l0aCBvciB3aXRob3V0IGVuZGluZ3NcbiAgICAgKi9cbiAgICBwdWJsaWMgaGFzUm9vdE1hcmtkb3ducygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRW5kaW5ncyh0aGlzLm1hcmtkb3duRmlsZXMpLnNvbWUoeCA9PlxuICAgICAgICAgICAgRmlsZUVuZ2luZS5leGlzdHNTeW5jKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIHgpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGxpc3RSb290TWFya2Rvd25zKCk6IHN0cmluZ1tdIHtcbiAgICAgICAgbGV0IGZvdW5kRmlsZXMgPSB0aGlzLm1hcmtkb3duRmlsZXMuZmlsdGVyKFxuICAgICAgICAgICAgeCA9PlxuICAgICAgICAgICAgICAgIEZpbGVFbmdpbmUuZXhpc3RzU3luYyhwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAgKyB4ICsgJy5tZCcpIHx8XG4gICAgICAgICAgICAgICAgRmlsZUVuZ2luZS5leGlzdHNTeW5jKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCArIHgpXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuYWRkRW5kaW5ncyhmb3VuZEZpbGVzKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGVzY2FwZShodG1sOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gaHRtbFxuICAgICAgICAgICAgLnJlcGxhY2UoLyYvZywgJyZhbXA7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8+L2csICcmZ3Q7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7JylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csICcmIzM5OycpXG4gICAgICAgICAgICAucmVwbGFjZSgvQC9nLCAnJiM2NDsnKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBbJ1JFQURNRSddID0+IFsnUkVBRE1FJywgJ1JFQURNRS5tZCddXG4gICAgICovXG4gICAgcHJpdmF0ZSBhZGRFbmRpbmdzKGZpbGVzOiBBcnJheTxzdHJpbmc+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiBfLmZsYXRNYXAoZmlsZXMsIHggPT4gW3gsIHggKyAnLm1kJ10pO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFya2Rvd25FbmdpbmUuZ2V0SW5zdGFuY2UoKTtcbiIsImltcG9ydCBEZXBlbmRlbmNpZXNFbmdpbmUgZnJvbSAnLi9kZXBlbmRlbmNpZXMuZW5naW5lJztcbmltcG9ydCBGaWxlRW5naW5lIGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuXG5jb25zdCBuZ2RUID0gcmVxdWlyZSgnQGNvbXBvZG9jL25nZC10cmFuc2Zvcm1lcicpO1xuXG5leHBvcnQgY2xhc3MgTmdkRW5naW5lIHtcbiAgICBwdWJsaWMgZW5naW5lO1xuXG4gICAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE5nZEVuZ2luZTtcbiAgICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbiAgICBwdWJsaWMgc3RhdGljIGdldEluc3RhbmNlKCkge1xuICAgICAgICBpZiAoIU5nZEVuZ2luZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgTmdkRW5naW5lLmluc3RhbmNlID0gbmV3IE5nZEVuZ2luZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBOZ2RFbmdpbmUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGluaXQob3V0cHV0cGF0aDogc3RyaW5nKSB7XG4gICAgICAgIHRoaXMuZW5naW5lID0gbmV3IG5nZFQuRG90RW5naW5lKHtcbiAgICAgICAgICAgIG91dHB1dDogb3V0cHV0cGF0aCxcbiAgICAgICAgICAgIGRpc3BsYXlMZWdlbmQ6IHRydWUsXG4gICAgICAgICAgICBvdXRwdXRGb3JtYXRzOiAnc3ZnJyxcbiAgICAgICAgICAgIHNpbGVudDogdHJ1ZVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVuZGVyR3JhcGgoZmlsZXBhdGg6IHN0cmluZywgb3V0cHV0cGF0aDogc3RyaW5nLCB0eXBlOiBzdHJpbmcsIG5hbWU/OiBzdHJpbmcpIHtcbiAgICAgICAgdGhpcy5lbmdpbmUudXBkYXRlT3V0cHV0KG91dHB1dHBhdGgpO1xuXG4gICAgICAgIGlmICh0eXBlID09PSAnZicpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS5nZW5lcmF0ZUdyYXBoKFtEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0UmF3TW9kdWxlKG5hbWUpXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUuZ2VuZXJhdGVHcmFwaChEZXBlbmRlbmNpZXNFbmdpbmUucmF3TW9kdWxlc0Zvck92ZXJ2aWV3KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyByZWFkR3JhcGgoZmlsZXBhdGg6IHN0cmluZywgbmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUuZ2V0KGZpbGVwYXRoKS5jYXRjaChlcnIgPT5cbiAgICAgICAgICAgIFByb21pc2UucmVqZWN0KCdFcnJvciBkdXJpbmcgZ3JhcGggcmVhZCAnICsgbmFtZSlcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IE5nZEVuZ2luZS5nZXRJbnN0YW5jZSgpO1xuIiwiZXhwb3J0IGNvbnN0IENPTVBPRE9DX0NPTlNUQU5UUyA9IHtcbiAgICBuYXZUYWJEZWZpbml0aW9uczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBpZDogJ2luZm8nLFxuICAgICAgICAgICAgaHJlZjogJyNpbmZvJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAnaW5mbycsXG4gICAgICAgICAgICBsYWJlbDogJ0luZm8nLFxuICAgICAgICAgICAgZGVwVHlwZXM6IFsnYWxsJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdyZWFkbWUnLFxuICAgICAgICAgICAgaHJlZjogJyNyZWFkbWUnLFxuICAgICAgICAgICAgJ2RhdGEtbGluayc6ICdyZWFkbWUnLFxuICAgICAgICAgICAgbGFiZWw6ICdSRUFETUUnLFxuICAgICAgICAgICAgZGVwVHlwZXM6IFsnYWxsJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdzb3VyY2UnLFxuICAgICAgICAgICAgaHJlZjogJyNzb3VyY2UnLFxuICAgICAgICAgICAgJ2RhdGEtbGluayc6ICdzb3VyY2UnLFxuICAgICAgICAgICAgbGFiZWw6ICdTb3VyY2UnLFxuICAgICAgICAgICAgZGVwVHlwZXM6IFsnYWxsJ11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICd0ZW1wbGF0ZURhdGEnLFxuICAgICAgICAgICAgaHJlZjogJyN0ZW1wbGF0ZURhdGEnLFxuICAgICAgICAgICAgJ2RhdGEtbGluayc6ICd0ZW1wbGF0ZScsXG4gICAgICAgICAgICBsYWJlbDogJ1RlbXBsYXRlJyxcbiAgICAgICAgICAgIGRlcFR5cGVzOiBbJ2NvbXBvbmVudCddXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIGlkOiAnc3R5bGVEYXRhJyxcbiAgICAgICAgICAgIGhyZWY6ICcjc3R5bGVEYXRhJyxcbiAgICAgICAgICAgICdkYXRhLWxpbmsnOiAnc3R5bGUnLFxuICAgICAgICAgICAgbGFiZWw6ICdTdHlsZXMnLFxuICAgICAgICAgICAgZGVwVHlwZXM6IFsnY29tcG9uZW50J11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICd0cmVlJyxcbiAgICAgICAgICAgIGhyZWY6ICcjdHJlZScsXG4gICAgICAgICAgICAnZGF0YS1saW5rJzogJ2RvbS10cmVlJyxcbiAgICAgICAgICAgIGxhYmVsOiAnRE9NIFRyZWUnLFxuICAgICAgICAgICAgZGVwVHlwZXM6IFsnY29tcG9uZW50J11cbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgaWQ6ICdleGFtcGxlJyxcbiAgICAgICAgICAgIGhyZWY6ICcjZXhhbXBsZScsXG4gICAgICAgICAgICAnZGF0YS1saW5rJzogJ2V4YW1wbGUnLFxuICAgICAgICAgICAgbGFiZWw6ICdFeGFtcGxlcycsXG4gICAgICAgICAgICBkZXBUeXBlczogWydjb21wb25lbnQnLCAnZGlyZWN0aXZlJywgJ2luamVjdGFibGUnLCAncGlwZSddXG4gICAgICAgIH1cbiAgICBdXG59O1xuXG4vKipcbiAqIE1heCBsZW5ndGggZm9yIHRoZSBzdHJpbmcgb2YgYSBmaWxlIGR1cmluZyBMdW5yIHNlYXJjaCBlbmdpbmUgaW5kZXhpbmcuXG4gKiBQcmV2ZW50IHN0YWNrIHNpemUgZXhjZWVkZWRcbiAqL1xuZXhwb3J0IGNvbnN0IE1BWF9TSVpFX0ZJTEVfU0VBUkNIX0lOREVYID0gNTAwMDA7XG5cbi8qKlxuICogTWF4IGxlbmd0aCBmb3IgdGhlIHN0cmluZyBvZiBhIGZpbGUgZHVyaW5nIGNoZWVyaW8gcGFyc2luZy5cbiAqIFByZXZlbnQgc3RhY2sgc2l6ZSBleGNlZWRlZFxuICovXG5leHBvcnQgY29uc3QgTUFYX1NJWkVfRklMRV9DSEVFUklPX1BBUlNJTkcgPSA0MDAwMDAwMDA7XG4iLCJjb25zdCBIYW5kbGViYXJzID0gcmVxdWlyZSgnaGFuZGxlYmFycycpO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSAnaHRtbC1lbnRpdGllcyc7XG5cbmltcG9ydCB7IE1BWF9TSVpFX0ZJTEVfQ0hFRVJJT19QQVJTSU5HLCBNQVhfU0laRV9GSUxFX1NFQVJDSF9JTkRFWCB9IGZyb20gJy4uLy4uL3V0aWxzL2NvbnN0YW50cyc7XG5cbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gJy4uLy4uL3V0aWxzL2xvZ2dlcic7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCBGaWxlRW5naW5lIGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuXG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuXG5jb25zdCBsdW5yOiBhbnkgPSByZXF1aXJlKCdsdW5yJyk7XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hFbmdpbmUge1xuICAgIHB1YmxpYyBzZWFyY2hJbmRleDogYW55O1xuICAgIHByaXZhdGUgc2VhcmNoRG9jdW1lbnRzID0gW107XG4gICAgcHVibGljIGRvY3VtZW50c1N0b3JlOiBPYmplY3QgPSB7fTtcbiAgICBwdWJsaWMgaW5kZXhTaXplOiBudW1iZXI7XG4gICAgcHVibGljIGFtb3VudE9mTWVtb3J5ID0gMDtcblxuICAgIHByaXZhdGUgc3RhdGljIGluc3RhbmNlOiBTZWFyY2hFbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFTZWFyY2hFbmdpbmUuaW5zdGFuY2UpIHtcbiAgICAgICAgICAgIFNlYXJjaEVuZ2luZS5pbnN0YW5jZSA9IG5ldyBTZWFyY2hFbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gU2VhcmNoRW5naW5lLmluc3RhbmNlO1xuICAgIH1cblxuICAgIHB1YmxpYyBpbmRleFBhZ2UocGFnZSkge1xuICAgICAgICBsZXQgdGV4dDtcbiAgICAgICAgdGhpcy5hbW91bnRPZk1lbW9yeSArPSBwYWdlLnJhd0RhdGEubGVuZ3RoO1xuICAgICAgICBpZiAodGhpcy5hbW91bnRPZk1lbW9yeSA8IE1BWF9TSVpFX0ZJTEVfQ0hFRVJJT19QQVJTSU5HKSB7XG4gICAgICAgICAgICBsZXQgaW5kZXhTdGFydENvbnRlbnQgPSBwYWdlLnJhd0RhdGEuaW5kZXhPZignPCEtLSBTVEFSVCBDT05URU5UIC0tPicpO1xuICAgICAgICAgICAgbGV0IGluZGV4RW5kQ29udGVudCA9IHBhZ2UucmF3RGF0YS5pbmRleE9mKCc8IS0tIEVORCBDT05URU5UIC0tPicpO1xuXG4gICAgICAgICAgICBsZXQgJCA9IGNoZWVyaW8ubG9hZChwYWdlLnJhd0RhdGEuc3Vic3RyaW5nKGluZGV4U3RhcnRDb250ZW50ICsgMSwgaW5kZXhFbmRDb250ZW50KSk7XG5cbiAgICAgICAgICAgIHRleHQgPSAkKCcuY29udGVudCcpLmh0bWwoKTtcbiAgICAgICAgICAgIHRleHQgPSBkZWNvZGUodGV4dCk7XG4gICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oPChbXj5dKyk+KS9naSwgJycpO1xuXG4gICAgICAgICAgICBwYWdlLnVybCA9IHBhZ2UudXJsLnJlcGxhY2UoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQsICcnKTtcblxuICAgICAgICAgICAgbGV0IGRvYyA9IHtcbiAgICAgICAgICAgICAgICB1cmw6IHBhZ2UudXJsLFxuICAgICAgICAgICAgICAgIHRpdGxlOiBwYWdlLmluZm9zLmNvbnRleHQgKyAnIC0gJyArIHBhZ2UuaW5mb3MubmFtZSxcbiAgICAgICAgICAgICAgICBib2R5OiB0ZXh0XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgIXRoaXMuZG9jdW1lbnRzU3RvcmUuaGFzT3duUHJvcGVydHkoZG9jLnVybCkgJiZcbiAgICAgICAgICAgICAgICBkb2MuYm9keS5sZW5ndGggPCBNQVhfU0laRV9GSUxFX1NFQVJDSF9JTkRFWFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudHNTdG9yZVtkb2MudXJsXSA9IGRvYztcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaERvY3VtZW50cy5wdXNoKGRvYyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgZ2VuZXJhdGVTZWFyY2hJbmRleEpzb24ob3V0cHV0Rm9sZGVyOiBzdHJpbmcpOiBQcm9taXNlIHtcbiAgICAgICAgbGV0IHRoYXQgPSB0aGlzO1xuICAgICAgICBsZXQgc2VhcmNoSW5kZXggPSBsdW5yKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlOm5vLWludmFsaWQtdGhpcyAqL1xuICAgICAgICAgICAgdGhpcy5yZWYoJ3VybCcpO1xuICAgICAgICAgICAgdGhpcy5maWVsZCgndGl0bGUnKTtcbiAgICAgICAgICAgIHRoaXMuZmllbGQoJ2JvZHknKTtcbiAgICAgICAgICAgIHRoaXMucGlwZWxpbmUucmVtb3ZlKGx1bnIuc3RlbW1lcik7XG5cbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSB0aGF0LnNlYXJjaERvY3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoYXQuc2VhcmNoRG9jdW1lbnRzW2ldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBGaWxlRW5naW5lLmdldChfX2Rpcm5hbWUgKyAnLy4uL3NyYy90ZW1wbGF0ZXMvcGFydGlhbHMvc2VhcmNoLWluZGV4LmhicycpLnRoZW4oXG4gICAgICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdGVtcGxhdGU6IGFueSA9IEhhbmRsZWJhcnMuY29tcGlsZShkYXRhKTtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGVtcGxhdGUoe1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogSlNPTi5zdHJpbmdpZnkoc2VhcmNoSW5kZXgpLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogSlNPTi5zdHJpbmdpZnkodGhpcy5kb2N1bWVudHNTdG9yZSlcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgdGVzdE91dHB1dERpciA9IG91dHB1dEZvbGRlci5tYXRjaChwcm9jZXNzLmN3ZCgpKTtcbiAgICAgICAgICAgICAgICBpZiAodGVzdE91dHB1dERpciAmJiB0ZXN0T3V0cHV0RGlyLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0Rm9sZGVyID0gb3V0cHV0Rm9sZGVyLnJlcGxhY2UocHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIEZpbGVFbmdpbmUud3JpdGUoXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dEZvbGRlciArIHBhdGguc2VwICsgJy9qcy9zZWFyY2gvc2VhcmNoX2luZGV4LmpzJyxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0XG4gICAgICAgICAgICAgICAgKS5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyBzZWFyY2ggaW5kZXggZmlsZSBnZW5lcmF0aW9uICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVyciA9PiBQcm9taXNlLnJlamVjdCgnRXJyb3IgZHVyaW5nIHNlYXJjaCBpbmRleCBnZW5lcmF0aW9uJylcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFNlYXJjaEVuZ2luZS5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCBGaWxlRW5naW5lIGZyb20gJy4vZmlsZS5lbmdpbmUnO1xuXG5pbXBvcnQgKiBhcyBjaGVlcmlvIGZyb20gJ2NoZWVyaW8nO1xuXG5jbGFzcyBDb21wb25lbnRzVHJlZUVuZ2luZSB7XG4gICAgcHJpdmF0ZSBjb21wb25lbnRzOiBhbnlbXSA9IFtdO1xuICAgIHByaXZhdGUgY29tcG9uZW50c0ZvclRyZWU6IGFueVtdID0gW107XG5cbiAgICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZTogQ29tcG9uZW50c1RyZWVFbmdpbmU7XG4gICAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHt9XG4gICAgcHVibGljIHN0YXRpYyBnZXRJbnN0YW5jZSgpIHtcbiAgICAgICAgaWYgKCFDb21wb25lbnRzVHJlZUVuZ2luZS5pbnN0YW5jZSkge1xuICAgICAgICAgICAgQ29tcG9uZW50c1RyZWVFbmdpbmUuaW5zdGFuY2UgPSBuZXcgQ29tcG9uZW50c1RyZWVFbmdpbmUoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gQ29tcG9uZW50c1RyZWVFbmdpbmUuaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgcHVibGljIGFkZENvbXBvbmVudChjb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYWRUZW1wbGF0ZXMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gdGhpcy5jb21wb25lbnRzRm9yVHJlZS5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8PSBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXBvbmVudHNGb3JUcmVlW2ldLnRlbXBsYXRlVXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZVBhdGggPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuY3dkKCkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguc2VwICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmRpcm5hbWUodGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS5maWxlKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5zZXAgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50c0ZvclRyZWVbaV0udGVtcGxhdGVVcmw7XG4gICAgICAgICAgICAgICAgICAgICAgICBGaWxlRW5naW5lLmdldChmaWxlUGF0aCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZURhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHNGb3JUcmVlW2ldLnRlbXBsYXRlRGF0YSA9IHRlbXBsYXRlRGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzRm9yVHJlZVtpXS50ZW1wbGF0ZURhdGEgPSB0aGlzLmNvbXBvbmVudHNGb3JUcmVlW2ldLnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZENoaWxkcmVuQW5kUGFyZW50cygpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIF8uZm9yRWFjaCh0aGlzLmNvbXBvbmVudHNGb3JUcmVlLCBjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCAkY29tcG9uZW50ID0gY2hlZXJpbyhjb21wb25lbnQudGVtcGxhdGVEYXRhKTtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb21wb25lbnRzRm9yVHJlZSwgY29tcG9uZW50VG9GaW5kID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRjb21wb25lbnQuZmluZChjb21wb25lbnRUb0ZpbmQuc2VsZWN0b3IpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGNvbXBvbmVudFRvRmluZC5uYW1lICsgJyBmb3VuZCBpbiAnICsgY29tcG9uZW50Lm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LmNoaWxkcmVuLnB1c2goY29tcG9uZW50VG9GaW5kLm5hbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVUcmVlc0ZvckNvbXBvbmVudHMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBfLmZvckVhY2godGhpcy5jb21wb25lbnRzLCBjb21wb25lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBfY29tcG9uZW50ID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBjb21wb25lbnQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgZmlsZTogY29tcG9uZW50LmZpbGUsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiBjb21wb25lbnQuc2VsZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6ICcnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcG9uZW50LnRlbXBsYXRlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBfY29tcG9uZW50LnRlbXBsYXRlID0gY29tcG9uZW50LnRlbXBsYXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnRlbXBsYXRlVXJsLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgX2NvbXBvbmVudC50ZW1wbGF0ZVVybCA9IGNvbXBvbmVudC50ZW1wbGF0ZVVybFswXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzRm9yVHJlZS5wdXNoKF9jb21wb25lbnQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnJlYWRUZW1wbGF0ZXMoKS50aGVuKFxuICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5kQ2hpbGRyZW5BbmRQYXJlbnRzKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygndGhpcy5jb21wb25lbnRzRm9yVHJlZTogJywgdGhpcy5jb21wb25lbnRzRm9yVHJlZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBDb21wb25lbnRzVHJlZUVuZ2luZS5nZXRJbnN0YW5jZSgpO1xuIiwiaW1wb3J0IHsgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGZ1bmN0aW9uIFN0cmluZ2lmeUFycm93RnVuY3Rpb24oYWYpIHtcbiAgICBsZXQgaSA9IDAsXG4gICAgICAgIHJlc3VsdCA9ICcoJztcbiAgICBjb25zdCBsZW4gPSBhZi5wYXJhbWV0ZXJzLmxlbmd0aDtcbiAgICBpZiAobGVuID09PSAxKSB7XG4gICAgICAgIHJlc3VsdCA9ICcnO1xuICAgIH1cbiAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoYWYucGFyYW1ldGVyc1tpXS5uYW1lICYmIGFmLnBhcmFtZXRlcnNbaV0ubmFtZS5lc2NhcGVkVGV4dCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGFmLnBhcmFtZXRlcnNbaV0ubmFtZS5lc2NhcGVkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoaSA8IGxlbiAtIDEpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSAnLCAnO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChsZW4gPiAxIHx8IGxlbiA9PT0gMCkge1xuICAgICAgICByZXN1bHQgKz0gJyknO1xuICAgIH1cbiAgICAvLyBib2R5XG4gICAgcmVzdWx0ICs9ICcgPT4gJztcbiAgICBpZiAoYWYuYm9keSkge1xuICAgICAgICBpZiAoYWYuYm9keS5raW5kID09PSBTeW50YXhLaW5kLklkZW50aWZpZXIgJiYgYWYuYm9keS5lc2NhcGVkVGV4dCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGFmLmJvZHkuZXNjYXBlZFRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICBhZi5ib2R5LmtpbmQgPT09IFN5bnRheEtpbmQuUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uICYmXG4gICAgICAgICAgICBhZi5ib2R5LmV4cHJlc3Npb24gJiZcbiAgICAgICAgICAgIGFmLmJvZHkubmFtZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSBhZi5ib2R5LmV4cHJlc3Npb24uZXNjYXBlZFRleHQ7XG4gICAgICAgICAgICByZXN1bHQgKz0gJy4nICsgYWYuYm9keS5uYW1lLmVzY2FwZWRUZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKGFmLmJvZHkua2luZCA9PT0gU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsICYmIGFmLmJvZHkudGV4dCkge1xuICAgICAgICAgICAgcmVzdWx0ICs9IGFmLmJvZHkudGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuIiwiaW1wb3J0IHsgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcbmltcG9ydCB7IFN0cmluZ2lmeUFycm93RnVuY3Rpb24gfSBmcm9tICcuL2Fycm93LWZ1bmN0aW9uLnV0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gU3RyaW5naWZ5T2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24ob2xlKSB7XG4gICAgbGV0IHJldHVybmVkU3RyaW5nID0gJ3snO1xuXG4gICAgaWYgKG9sZS5wcm9wZXJ0aWVzICYmIG9sZS5wcm9wZXJ0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgb2xlLnByb3BlcnRpZXMuZm9yRWFjaCgocHJvcGVydHksIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHkubmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybmVkU3RyaW5nICs9IHByb3BlcnR5Lm5hbWUudGV4dCArICc6ICc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIua2luZCA9PT0gU3ludGF4S2luZC5TdHJpbmdMaXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybmVkU3RyaW5nICs9IGAnYCArIHByb3BlcnR5LmluaXRpYWxpemVyLnRleHQgKyBgJ2A7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5pbml0aWFsaXplci5raW5kID09PSBTeW50YXhLaW5kLlRydWVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybmVkU3RyaW5nICs9IGB0cnVlYDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5LmluaXRpYWxpemVyLmtpbmQgPT09IFN5bnRheEtpbmQuRmFsc2VLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybmVkU3RyaW5nICs9IGBmYWxzZWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eS5pbml0aWFsaXplci5raW5kID09PSBTeW50YXhLaW5kLkFycm93RnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWRTdHJpbmcgKz0gU3RyaW5naWZ5QXJyb3dGdW5jdGlvbihwcm9wZXJ0eS5pbml0aWFsaXplcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuZWRTdHJpbmcgKz0gcHJvcGVydHkuaW5pdGlhbGl6ZXIudGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaW5kZXggPCBvbGUucHJvcGVydGllcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuZWRTdHJpbmcgKz0gJywgJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuZWRTdHJpbmcgKz0gJ30nO1xuXG4gICAgcmV0dXJuIHJldHVybmVkU3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBub2RlSGFzRGVjb3JhdG9yKG5vZGU6IHRzLk5vZGUpIHtcbiAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICBjb25zdCBub2RlTW9kaWZpZXJzID0gbm9kZS5tb2RpZmllcnM7IC8vIHRzLmdldE1vZGlmaWVycyhub2RlKTtcblxuICAgIGlmIChub2RlTW9kaWZpZXJzICYmIG5vZGVNb2RpZmllcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBub2RlTW9kaWZpZXJzLmZvckVhY2gobm9kZU1vZGlmaWVyID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlTW9kaWZpZXIua2luZCA9PT0gdHMuU3ludGF4S2luZC5EZWNvcmF0b3IpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Tm9kZURlY29yYXRvcnMobm9kZTogdHMuTm9kZSkge1xuICAgIGxldCByZXN1bHQgPSBbXTtcblxuICAgIGNvbnN0IG5vZGVNb2RpZmllcnMgPSBub2RlLm1vZGlmaWVyczsgLy8gdHMuZ2V0TW9kaWZpZXJzKG5vZGUpO1xuXG4gICAgaWYgKG5vZGVNb2RpZmllcnMgJiYgbm9kZU1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIG5vZGVNb2RpZmllcnMuZm9yRWFjaChub2RlTW9kaWZpZXIgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGVNb2RpZmllci5raW5kID09PSB0cy5TeW50YXhLaW5kLkRlY29yYXRvcikge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG5vZGVNb2RpZmllcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG59XG4iLCJpbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5cbmltcG9ydCB7IHRzLCBTeW50YXhLaW5kIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5pbXBvcnQgeyBnZXROYW1lc0NvbXBhcmVGbiwgbWVyZ2VUYWdzQW5kQXJncywgbWFya2VkdGFncyB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCB7IGtpbmRUb1R5cGUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9raW5kLXRvLXR5cGUnO1xuaW1wb3J0IHsgSnNkb2NQYXJzZXJVdGlsIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvanNkb2MtcGFyc2VyLnV0aWwnO1xuaW1wb3J0IHsgaXNJZ25vcmUgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscyc7XG5pbXBvcnQgQW5ndWxhclZlcnNpb25VdGlsIGZyb20gJy4uLy4uLy4uLy4uLy4uLy91dGlscy9hbmd1bGFyLXZlcnNpb24udXRpbCc7XG5pbXBvcnQgQmFzaWNUeXBlVXRpbCBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9iYXNpYy10eXBlLnV0aWwnO1xuaW1wb3J0IHsgU3RyaW5naWZ5T2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9vYmplY3QtbGl0ZXJhbC1leHByZXNzaW9uLnV0aWwnO1xuXG5pbXBvcnQgRGVwZW5kZW5jaWVzRW5naW5lIGZyb20gJy4uLy4uLy4uLy4uL2VuZ2luZXMvZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi8uLi8uLi8uLi9jb25maWd1cmF0aW9uJztcbmltcG9ydCB7IFN0cmluZ2lmeUFycm93RnVuY3Rpb24gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy9hcnJvdy1mdW5jdGlvbi51dGlsJztcbmltcG9ydCB7IGdldE5vZGVEZWNvcmF0b3JzLCBub2RlSGFzRGVjb3JhdG9yIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvbm9kZS51dGlsJztcbmltcG9ydCB7IG1hcmtlZEFjbCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL3V0aWxzL21hcmtlZC5hY2wnO1xuXG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcblxuZXhwb3J0IGNsYXNzIENsYXNzSGVscGVyIHtcbiAgICBwcml2YXRlIGpzZG9jUGFyc2VyVXRpbCA9IG5ldyBKc2RvY1BhcnNlclV0aWwoKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgdHlwZUNoZWNrZXI6IHRzLlR5cGVDaGVja2VyKSB7fVxuXG4gICAgLyoqXG4gICAgICogSEVMUEVSU1xuICAgICAqL1xuXG4gICAgcHVibGljIHN0cmluZ2lmeURlZmF1bHRWYWx1ZShub2RlOiB0cy5Ob2RlKTogc3RyaW5nIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKG5vZGUuZ2V0VGV4dCgpKSB7XG4gICAgICAgICAgICByZXR1cm4gbm9kZS5nZXRUZXh0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09PSBTeW50YXhLaW5kLkZhbHNlS2V5d29yZCkge1xuICAgICAgICAgICAgcmV0dXJuICdmYWxzZSc7XG4gICAgICAgIH0gZWxzZSBpZiAobm9kZS5raW5kID09PSBTeW50YXhLaW5kLlRydWVLZXl3b3JkKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3RydWUnO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0ZvckRlcHJlY2F0aW9uKHRhZ3M6IGFueVtdLCByZXN1bHQ6IHsgW2tleSBpbiBzdHJpbmcgfCBudW1iZXJdOiBhbnkgfSkge1xuICAgICAgICBfLmZvckVhY2godGFncywgdGFnID0+IHtcbiAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZSAmJiB0YWcudGFnTmFtZS50ZXh0ICYmIHRhZy50YWdOYW1lLnRleHQuaW5kZXhPZignZGVwcmVjYXRlZCcpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZGVwcmVjYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlcHJlY2F0aW9uTWVzc2FnZSA9IHRhZy5jb21tZW50IHx8ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERlY29yYXRvck9mVHlwZShub2RlLCBkZWNvcmF0b3JUeXBlKSB7XG4gICAgICAgIGxldCBkZWNvcmF0b3JzID0gZ2V0Tm9kZURlY29yYXRvcnMobm9kZSkgfHwgW107XG4gICAgICAgIGxldCByZXN1bHQgPSBbXTtcbiAgICAgICAgY29uc3QgbGVuID0gZGVjb3JhdG9ycy5sZW5ndGg7XG5cbiAgICAgICAgaWYgKGxlbiA+IDEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVjb3JhdG9ycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3JzW2ldLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yc1tpXS5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gZGVjb3JhdG9yVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goZGVjb3JhdG9yc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKGxlbiA9PT0gMSAmJiBkZWNvcmF0b3JzWzBdLmV4cHJlc3Npb24gJiYgZGVjb3JhdG9yc1swXS5leHByZXNzaW9uLmV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yc1swXS5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gZGVjb3JhdG9yVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChkZWNvcmF0b3JzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0RGVjb3JhdG9ycyhkZWNvcmF0b3JzKSB7XG4gICAgICAgIGxldCBfZGVjb3JhdG9ycyA9IFtdO1xuXG4gICAgICAgIF8uZm9yRWFjaChkZWNvcmF0b3JzLCAoZGVjb3JhdG9yOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbi50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIF9kZWNvcmF0b3JzLnB1c2goeyBuYW1lOiBkZWNvcmF0b3IuZXhwcmVzc2lvbi50ZXh0IH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5mbzogYW55ID0geyBuYW1lOiBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29yYXRvci5leHByZXNzaW9uLmFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5mby5zdHJpbmdpZmllZEFyZ3VtZW50cyA9IHRoaXMuc3RyaW5naWZ5QXJndW1lbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29yYXRvci5leHByZXNzaW9uLmFyZ3VtZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfZGVjb3JhdG9ycy5wdXNoKGluZm8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIF9kZWNvcmF0b3JzO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlRnVuY3Rpb24oYXJnKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKGFyZy5mdW5jdGlvbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06ICgpID0+IHZvaWRgO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGFyZ3VtcyA9IGFyZy5mdW5jdGlvbi5tYXAoYXJndSA9PiB7XG4gICAgICAgICAgICBsZXQgX3Jlc3VsdCA9IERlcGVuZGVuY2llc0VuZ2luZS5maW5kKGFyZ3UudHlwZSk7XG4gICAgICAgICAgICBpZiAoX3Jlc3VsdCkge1xuICAgICAgICAgICAgICAgIGlmIChfcmVzdWx0LnNvdXJjZSA9PT0gJ2ludGVybmFsJykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IF9yZXN1bHQuZGF0YS50eXBlO1xuICAgICAgICAgICAgICAgICAgICBpZiAoX3Jlc3VsdC5kYXRhLnR5cGUgPT09ICdjbGFzcycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggPSAnY2xhc3NlJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogPGEgaHJlZj1cIi4uLyR7cGF0aH1zLyR7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0LmRhdGEubmFtZVxuICAgICAgICAgICAgICAgICAgICB9Lmh0bWxcIj4ke2FyZ3UudHlwZX08L2E+YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IEFuZ3VsYXJWZXJzaW9uVXRpbC5nZXRBcGlMaW5rKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyVmVyc2lvblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICAgICApfTogPGEgaHJlZj1cIiR7cGF0aH1cIiB0YXJnZXQ9XCJfYmxhbmtcIj4ke2FyZ3UudHlwZX08L2E+YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKEJhc2ljVHlwZVV0aWwuaXNLbm93blR5cGUoYXJndS50eXBlKSkge1xuICAgICAgICAgICAgICAgIGxldCBwYXRoID0gQmFzaWNUeXBlVXRpbC5nZXRUeXBlVXJsKGFyZ3UudHlwZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZ3UubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIGFyZ1xuICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJndS50eXBlfTwvYT5gO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAoYXJndS5uYW1lICYmIGFyZ3UudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogJHthcmd1LnR5cGV9YDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAoYXJndS5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJndS5uYW1lLnRleHR9YDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX06ICgke2FyZ3Vtc30pID0+IHZvaWRgO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIGFyZy5vcHRpb25hbCA/ICc/JyA6ICcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgc3RyaW5naWZ5QXJndW1lbnRzKGFyZ3MpIHtcbiAgICAgICAgbGV0IHN0cmluZ2lmeUFyZ3MgPSBbXTtcblxuICAgICAgICBzdHJpbmdpZnlBcmdzID0gYXJnc1xuICAgICAgICAgICAgLm1hcChhcmcgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IF9yZXN1bHQgPSBEZXBlbmRlbmNpZXNFbmdpbmUuZmluZChhcmcudHlwZSk7XG4gICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQuc291cmNlID09PSAnaW50ZXJuYWwnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IF9yZXN1bHQuZGF0YS50eXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKF9yZXN1bHQuZGF0YS50eXBlID09PSAnY2xhc3MnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCA9ICdjbGFzc2UnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhhcmcpfTogPGEgaHJlZj1cIi4uLyR7cGF0aH1zLyR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3Jlc3VsdC5kYXRhLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0uaHRtbFwiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IEFuZ3VsYXJWZXJzaW9uVXRpbC5nZXRBcGlMaW5rKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJWZXJzaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke2FyZy5uYW1lfSR7dGhpcy5nZXRPcHRpb25hbFN0cmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdcbiAgICAgICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5kb3REb3REb3RUb2tlbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYC4uLiR7YXJnLm5hbWV9OiAke2FyZy50eXBlfWA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcuZnVuY3Rpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFuZGxlRnVuY3Rpb24oYXJnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5leHByZXNzaW9uICYmIGFyZy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBhcmcuZXhwcmVzc2lvbi50ZXh0ICsgJy4nICsgYXJnLm5hbWUudGV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy5leHByZXNzaW9uICYmIGFyZy5raW5kID09PSBTeW50YXhLaW5kLk5ld0V4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICduZXcgJyArIGFyZy5leHByZXNzaW9uLnRleHQgKyAnKCknO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnLmtpbmQgJiYgYXJnLmtpbmQgPT09IFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCdgICsgYXJnLnRleHQgKyBgJ2A7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgYXJnLmtpbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgYXJnLmtpbmQgPT09IFN5bnRheEtpbmQuQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICBhcmcuZWxlbWVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgYXJnLmVsZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gYXJnLmVsZW1lbnRzLmxlbmd0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9ICdbJztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBgJ2AgKyBhcmcuZWxlbWVudHNbaV0udGV4dCArIGAnYDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnLCAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnXSc7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgYXJnLmtpbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgYXJnLmtpbmQgPT09IFN5bnRheEtpbmQuQXJyb3dGdW5jdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICBhcmcucGFyYW1ldGVycyAmJlxuICAgICAgICAgICAgICAgICAgICBhcmcucGFyYW1ldGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmdpZnlBcnJvd0Z1bmN0aW9uKGFyZyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhcmcua2luZCAmJiBhcmcua2luZCA9PT0gU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5naWZ5T2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24oYXJnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKEJhc2ljVHlwZVV0aWwuaXNLbm93blR5cGUoYXJnLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBCYXNpY1R5cGVVdGlsLmdldFR5cGVVcmwoYXJnLnR5cGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJnLm5hbWV9JHt0aGlzLmdldE9wdGlvbmFsU3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgYXJnXG4gICAgICAgICAgICAgICAgICAgICl9OiA8YSBocmVmPVwiJHtwYXRofVwiIHRhcmdldD1cIl9ibGFua1wiPiR7YXJnLnR5cGV9PC9hPmA7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmluYWxTdHJpbmdpZmllZEFyZ3VtZW50ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VwYXJhdG9yID0gJzonO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZy5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxTdHJpbmdpZmllZEFyZ3VtZW50ICs9IGFyZy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5raW5kID09PSBTeW50YXhLaW5kLkFzRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZy5leHByZXNzaW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnLmV4cHJlc3Npb24udGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxTdHJpbmdpZmllZEFyZ3VtZW50ICs9IGFyZy5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yID0gJyBhcyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxTdHJpbmdpZmllZEFyZ3VtZW50ICs9IHRoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhcmcudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsU3RyaW5naWZpZWRBcmd1bWVudCArPSBzZXBhcmF0b3IgKyAnICcgKyB0aGlzLnZpc2l0VHlwZShhcmcudHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmluYWxTdHJpbmdpZmllZEFyZ3VtZW50O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGFyZy50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7YXJnLnRleHR9YDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHthcmcubmFtZX0ke3RoaXMuZ2V0T3B0aW9uYWxTdHJpbmcoYXJnKX1gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5qb2luKCcsICcpO1xuXG4gICAgICAgIHJldHVybiBzdHJpbmdpZnlBcmdzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0UG9zaXRpb24obm9kZTogdHMuTm9kZSwgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSk6IHRzLkxpbmVBbmRDaGFyYWN0ZXIge1xuICAgICAgICBsZXQgcG9zaXRpb246IHRzLkxpbmVBbmRDaGFyYWN0ZXI7XG4gICAgICAgIGlmIChub2RlLm5hbWUgJiYgbm9kZS5uYW1lLmVuZCkge1xuICAgICAgICAgICAgcG9zaXRpb24gPSB0cy5nZXRMaW5lQW5kQ2hhcmFjdGVyT2ZQb3NpdGlvbihzb3VyY2VGaWxlLCBub2RlLm5hbWUuZW5kKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gdHMuZ2V0TGluZUFuZENoYXJhY3Rlck9mUG9zaXRpb24oc291cmNlRmlsZSwgbm9kZS5wb3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEFjY2Vzc29yKGFjY2Vzc29ycywgbm9kZUFjY2Vzc29yLCBzb3VyY2VGaWxlKSB7XG4gICAgICAgIGxldCBub2RlTmFtZSA9ICcnO1xuICAgICAgICBpZiAobm9kZUFjY2Vzc29yLm5hbWUpIHtcbiAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZUFjY2Vzc29yLm5hbWUudGV4dDtcbiAgICAgICAgICAgIGxldCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Mobm9kZUFjY2Vzc29yKTtcblxuICAgICAgICAgICAgaWYgKCFhY2Nlc3NvcnNbbm9kZU5hbWVdKSB7XG4gICAgICAgICAgICAgICAgYWNjZXNzb3JzW25vZGVOYW1lXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZTogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBnZXRTaWduYXR1cmU6IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChub2RlQWNjZXNzb3Iua2luZCA9PT0gU3ludGF4S2luZC5TZXRBY2Nlc3Nvcikge1xuICAgICAgICAgICAgICAgIGxldCBzZXRTaWduYXR1cmUgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAndm9pZCcsXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnLFxuICAgICAgICAgICAgICAgICAgICBhcmdzOiBub2RlQWNjZXNzb3IucGFyYW1ldGVycy5tYXAocGFyYW0gPT4gdGhpcy52aXNpdEFyZ3VtZW50KHBhcmFtKSksXG4gICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGU6IG5vZGVBY2Nlc3Nvci50eXBlID8gdGhpcy52aXNpdFR5cGUobm9kZUFjY2Vzc29yLnR5cGUpIDogJ3ZvaWQnLFxuICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKG5vZGVBY2Nlc3Nvciwgc291cmNlRmlsZSkubGluZSArIDFcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGVBY2Nlc3Nvci5qc0RvYyAmJiBub2RlQWNjZXNzb3IuanNEb2MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUFjY2Vzc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbmVkRGVzY3JpcHRpb24gPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5wYXJzZUNvbW1lbnQoY29tbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmUucmF3ZGVzY3JpcHRpb24gPSBjbGVhbmVkRGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmUuZGVzY3JpcHRpb24gPSBtYXJrZWRBY2woY2xlYW5lZERlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgc2V0U2lnbmF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlLmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoc2V0U2lnbmF0dXJlLmpzZG9jdGFncyAmJiBzZXRTaWduYXR1cmUuanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlLmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3MoXG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRTaWduYXR1cmUuYXJncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNpZ25hdHVyZS5qc2RvY3RhZ3NcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNldFNpZ25hdHVyZS5hcmdzICYmIHNldFNpZ25hdHVyZS5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0U2lnbmF0dXJlLmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3Moc2V0U2lnbmF0dXJlLmFyZ3MpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGFjY2Vzc29yc1tub2RlTmFtZV0uc2V0U2lnbmF0dXJlID0gc2V0U2lnbmF0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGVBY2Nlc3Nvci5raW5kID09PSBTeW50YXhLaW5kLkdldEFjY2Vzc29yKSB7XG4gICAgICAgICAgICAgICAgbGV0IGdldFNpZ25hdHVyZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG5vZGVBY2Nlc3Nvci50eXBlID8ga2luZFRvVHlwZShub2RlQWNjZXNzb3IudHlwZS5raW5kKSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlOiBub2RlQWNjZXNzb3IudHlwZSA/IHRoaXMudmlzaXRUeXBlKG5vZGVBY2Nlc3Nvci50eXBlKSA6ICcnLFxuICAgICAgICAgICAgICAgICAgICBsaW5lOiB0aGlzLmdldFBvc2l0aW9uKG5vZGVBY2Nlc3Nvciwgc291cmNlRmlsZSkubGluZSArIDFcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGVBY2Nlc3Nvci5qc0RvYyAmJiBub2RlQWNjZXNzb3IuanNEb2MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUFjY2Vzc29yLFxuICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRmlsZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNvbW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGVhbmVkRGVzY3JpcHRpb24gPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5wYXJzZUNvbW1lbnQoY29tbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTaWduYXR1cmUucmF3ZGVzY3JpcHRpb24gPSBjbGVhbmVkRGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgICAgICBnZXRTaWduYXR1cmUuZGVzY3JpcHRpb24gPSBtYXJrZWRBY2woY2xlYW5lZERlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgZ2V0U2lnbmF0dXJlKTtcbiAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbmF0dXJlLmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGFjY2Vzc29yc1tub2RlTmFtZV0uZ2V0U2lnbmF0dXJlID0gZ2V0U2lnbmF0dXJlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RpcmVjdGl2ZURlY29yYXRvcihkZWNvcmF0b3I6IHRzLkRlY29yYXRvcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgbGV0IGRlY29yYXRvcklkZW50aWZpZXJUZXh0ID0gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JJZGVudGlmaWVyVGV4dCA9PT0gJ0RpcmVjdGl2ZScgfHwgZGVjb3JhdG9ySWRlbnRpZmllclRleHQgPT09ICdDb21wb25lbnQnXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1NlcnZpY2VEZWNvcmF0b3IoZGVjb3JhdG9yKSB7XG4gICAgICAgIHJldHVybiBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uXG4gICAgICAgICAgICA/IGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gJ0luamVjdGFibGUnXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNQcml2YXRlKG1lbWJlcik6IGJvb2xlYW4ge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBpZiAobWVtYmVyLm1vZGlmaWVycykge1xuICAgICAgICAgICAgY29uc3QgaXNQcml2YXRlOiBib29sZWFuID0gbWVtYmVyLm1vZGlmaWVycy5zb21lKFxuICAgICAgICAgICAgICAgIG1vZGlmaWVyID0+IG1vZGlmaWVyLmtpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgZm9yIEVDTUFTY3JpcHQgUHJpdmF0ZSBGaWVsZHNcbiAgICAgICAgaWYgKG1lbWJlci5uYW1lICYmIG1lbWJlci5uYW1lLmVzY2FwZWRUZXh0KSB7XG4gICAgICAgICAgICBjb25zdCBpc1ByaXZhdGU6IGJvb2xlYW4gPSBtZW1iZXIubmFtZS5lc2NhcGVkVGV4dC5pbmRleE9mKCcjJykgPT09IDA7XG4gICAgICAgICAgICBpZiAoaXNQcml2YXRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIaWRkZW5NZW1iZXIobWVtYmVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzUHJvdGVjdGVkKG1lbWJlcik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAobWVtYmVyLm1vZGlmaWVycykge1xuICAgICAgICAgICAgY29uc3QgaXNQcm90ZWN0ZWQ6IGJvb2xlYW4gPSBtZW1iZXIubW9kaWZpZXJzLnNvbWUoXG4gICAgICAgICAgICAgICAgbW9kaWZpZXIgPT4gbW9kaWZpZXIua2luZCA9PT0gU3ludGF4S2luZC5Qcm90ZWN0ZWRLZXl3b3JkXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKGlzUHJvdGVjdGVkKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuaXNIaWRkZW5NZW1iZXIobWVtYmVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzSW50ZXJuYWwobWVtYmVyKTogYm9vbGVhbiB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGludGVybmFsVGFnczogc3RyaW5nW10gPSBbJ2ludGVybmFsJ107XG4gICAgICAgIGlmIChtZW1iZXIuanNEb2MpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jIG9mIG1lbWJlci5qc0RvYykge1xuICAgICAgICAgICAgICAgIGlmIChkb2MudGFncykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBkb2MudGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsVGFncy5pbmRleE9mKHRhZy50YWdOYW1lLnRleHQpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1B1YmxpYyhtZW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKG1lbWJlci5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzUHVibGljOiBib29sZWFuID0gbWVtYmVyLm1vZGlmaWVycy5zb21lKFxuICAgICAgICAgICAgICAgIG1vZGlmaWVyID0+IG1vZGlmaWVyLmtpbmQgPT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChpc1B1YmxpYykge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmlzSGlkZGVuTWVtYmVyKG1lbWJlcik7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0hpZGRlbk1lbWJlcihtZW1iZXIpOiBib29sZWFuIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgaW50ZXJuYWxUYWdzOiBzdHJpbmdbXSA9IFsnaGlkZGVuJ107XG4gICAgICAgIGlmIChtZW1iZXIuanNEb2MpIHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZG9jIG9mIG1lbWJlci5qc0RvYykge1xuICAgICAgICAgICAgICAgIGlmIChkb2MudGFncykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBkb2MudGFncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVybmFsVGFncy5pbmRleE9mKHRhZy50YWdOYW1lLnRleHQpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1BpcGVEZWNvcmF0b3IoZGVjb3JhdG9yKSB7XG4gICAgICAgIHJldHVybiBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uXG4gICAgICAgICAgICA/IGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gJ1BpcGUnXG4gICAgICAgICAgICA6IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNDb250cm9sbGVyRGVjb3JhdG9yKGRlY29yYXRvcikge1xuICAgICAgICByZXR1cm4gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvblxuICAgICAgICAgICAgPyBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgPT09ICdDb250cm9sbGVyJ1xuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzTW9kdWxlRGVjb3JhdG9yKGRlY29yYXRvcikge1xuICAgICAgICByZXR1cm4gZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvblxuICAgICAgICAgICAgPyBkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgPT09ICdOZ01vZHVsZScgfHxcbiAgICAgICAgICAgICAgICAgIGRlY29yYXRvci5leHByZXNzaW9uLmV4cHJlc3Npb24udGV4dCA9PT0gJ01vZHVsZSdcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVklTSVRFUlNcbiAgICAgKi9cblxuICAgIHB1YmxpYyB2aXNpdENsYXNzRGVjbGFyYXRpb24oXG4gICAgICAgIGZpbGVOYW1lOiBzdHJpbmcsXG4gICAgICAgIGNsYXNzRGVjbGFyYXRpb246IHRzLkNsYXNzRGVjbGFyYXRpb24gfCB0cy5JbnRlcmZhY2VEZWNsYXJhdGlvbixcbiAgICAgICAgc291cmNlRmlsZT86IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIGFzdEZpbGU/OiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogYW55IHtcbiAgICAgICAgbGV0IHN5bWJvbCA9IHRoaXMudHlwZUNoZWNrZXIuZ2V0U3ltYm9sQXRMb2NhdGlvbihjbGFzc0RlY2xhcmF0aW9uLm5hbWUpO1xuICAgICAgICBsZXQgcmF3ZGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgbGV0IGRlcHJlY2F0ZWQgPSBmYWxzZTtcbiAgICAgICAgbGV0IGRlcHJlY2F0aW9uTWVzc2FnZSA9ICcnO1xuICAgICAgICBsZXQgZGVzY3JpcHRpb24gPSAnJztcbiAgICAgICAgbGV0IGpzZG9jdGFncyA9IFtdO1xuICAgICAgICBpZiAoc3ltYm9sKSB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUoY2xhc3NEZWNsYXJhdGlvbiwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICByYXdkZXNjcmlwdGlvbiA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLnBhcnNlQ29tbWVudChjb21tZW50KTtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uID0gbWFya2VkQWNsKHJhd2Rlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgIGlmIChzeW1ib2wudmFsdWVEZWNsYXJhdGlvbiAmJiBpc0lnbm9yZShzeW1ib2wudmFsdWVEZWNsYXJhdGlvbikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW3sgaWdub3JlOiB0cnVlIH1dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHN5bWJvbC5kZWNsYXJhdGlvbnMgJiYgc3ltYm9sLmRlY2xhcmF0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRlY2xhcmF0aW9uc2pzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhzeW1ib2wuZGVjbGFyYXRpb25zWzBdKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uc2pzZG9jdGFncyAmJlxuICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnNqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiZcbiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zanNkb2N0YWdzWzBdLnRhZ3NcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRpb24gPSB7IGRlcHJlY2F0ZWQ6IGZhbHNlLCBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnIH07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihkZWNsYXJhdGlvbnNqc2RvY3RhZ3NbMF0udGFncywgZGVwcmVjYXRpb24pO1xuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkID0gZGVwcmVjYXRpb24uZGVwcmVjYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlID0gZGVwcmVjYXRpb24uZGVwcmVjYXRpb25NZXNzYWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNJZ25vcmUoc3ltYm9sLmRlY2xhcmF0aW9uc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFt7IGlnbm9yZTogdHJ1ZSB9XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pIHtcbiAgICAgICAgICAgICAgICBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3Moc3ltYm9sLnZhbHVlRGVjbGFyYXRpb24pO1xuICAgICAgICAgICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uID0geyBkZXByZWNhdGVkOiBmYWxzZSwgZGVwcmVjYXRpb25NZXNzYWdlOiAnJyB9O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIGRlcHJlY2F0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCA9IGRlcHJlY2F0aW9uLmRlcHJlY2F0ZWQ7XG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSA9IGRlcHJlY2F0aW9uLmRlcHJlY2F0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGxldCBjbGFzc05hbWUgPSBjbGFzc0RlY2xhcmF0aW9uLm5hbWUudGV4dDtcbiAgICAgICAgbGV0IG1lbWJlcnM7XG4gICAgICAgIGxldCBpbXBsZW1lbnRzRWxlbWVudHMgPSBbXTtcbiAgICAgICAgbGV0IGV4dGVuZHNFbGVtZW50cyA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdHMuZ2V0RWZmZWN0aXZlSW1wbGVtZW50c1R5cGVOb2RlcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGxldCBpbXBsZW1lbnRlZFR5cGVzID0gdHMuZ2V0RWZmZWN0aXZlSW1wbGVtZW50c1R5cGVOb2RlcyhjbGFzc0RlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIGlmIChpbXBsZW1lbnRlZFR5cGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBpbXBsZW1lbnRlZFR5cGVzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1wbGVtZW50ZWRUeXBlc1tpXS5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzRWxlbWVudHMucHVzaChpbXBsZW1lbnRlZFR5cGVzW2ldLmV4cHJlc3Npb24udGV4dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHRzLmdldENsYXNzRXh0ZW5kc0hlcml0YWdlRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmIChhc3RGaWxlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGludGVyZmFjZU9yQ2xhc3NOb2RlID0gYXN0RmlsZS5nZXRJbnRlcmZhY2UoY2xhc3NOYW1lKTtcbiAgICAgICAgICAgICAgICBpZiAoIWludGVyZmFjZU9yQ2xhc3NOb2RlKSB7XG4gICAgICAgICAgICAgICAgICAgIGludGVyZmFjZU9yQ2xhc3NOb2RlID0gYXN0RmlsZS5nZXRDbGFzcyhjbGFzc05hbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlT3JDbGFzc05vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXh0ZW5kc0xpc3RSYXcgPSBpbnRlcmZhY2VPckNsYXNzTm9kZS5nZXRFeHRlbmRzKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBleHRlbmRzTGlzdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5kc0xpc3RSYXcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4dGVuZHNMaXN0UmF3KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleHRlbmRzTGlzdFJhdy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZHNMaXN0UmF3LmZvckVhY2goZXh0ZW5kRWxlbWVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlbmRFbGVtZW50RXhwcmVzc2lvbiA9IGV4dGVuZEVsZW1lbnQuZ2V0RXhwcmVzc2lvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVuZEVsZW1lbnRFeHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGV4dGVuZEVsZW1lbnRFeHByZXNzaW9uLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzTGlzdC5wdXNoKHRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRlbmRFbGVtZW50RXhwcmVzc2lvbiA9IGV4dGVuZHNMaXN0UmF3LmdldEV4cHJlc3Npb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW5kRWxlbWVudEV4cHJlc3Npb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dCA9IGV4dGVuZEVsZW1lbnRFeHByZXNzaW9uLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZHNMaXN0LnB1c2godGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZXh0ZW5kc0VsZW1lbnRzID0gZXh0ZW5kc0xpc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1lbWJlcnMgPSB0aGlzLnZpc2l0TWVtYmVycyhjbGFzc0RlY2xhcmF0aW9uLm1lbWJlcnMsIHNvdXJjZUZpbGUpO1xuXG4gICAgICAgIGlmIChub2RlSGFzRGVjb3JhdG9yKGNsYXNzRGVjbGFyYXRpb24pKSB7XG4gICAgICAgICAgICBjb25zdCBjbGFzc0RlY29yYXRvcnMgPSBnZXROb2RlRGVjb3JhdG9ycyhjbGFzc0RlY2xhcmF0aW9uKTtcbiAgICAgICAgICAgIC8vIExvb3AgYW5kIHNlYXJjaCBmb3Igb2ZmaWNpYWwgZGVjb3JhdG9ycyBhdCB0b3AtbGV2ZWwgOlxuICAgICAgICAgICAgLy8gQW5ndWxhciA6IEBOZ01vZHVsZSwgQENvbXBvbmVudCwgQERpcmVjdGl2ZSwgQEluamVjdGFibGUsIEBQaXBlXG4gICAgICAgICAgICAvLyBOZXN0anMgOiBAQ29udHJvbGxlciwgQE1vZHVsZSwgQEluamVjdGFibGVcbiAgICAgICAgICAgIC8vIFN0ZW5jaWwgOiBAQ29tcG9uZW50XG4gICAgICAgICAgICBsZXQgaXNEaXJlY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBpc1NlcnZpY2UgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBpc1BpcGUgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBpc01vZHVsZSA9IGZhbHNlO1xuICAgICAgICAgICAgbGV0IGlzQ29udHJvbGxlciA9IGZhbHNlO1xuICAgICAgICAgICAgZm9yIChsZXQgYSA9IDA7IGEgPCBjbGFzc0RlY29yYXRvcnMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGNsYXNzRGVjbGFyYXRpb24uZGVjb3JhdG9yc1tpXS5leHByZXNzaW9uKTtcblxuICAgICAgICAgICAgICAgIC8vIFJFVFVSTiBUT08gRUFSTFkgRk9SIE1BTlkgREVDT1JBVE9SUyAhISEhXG4gICAgICAgICAgICAgICAgLy8gaXRlcmF0aW5nIHRocm91Z2ggdGhlIGRlY29yYXRvcnMgYXJyYXkgd2UgaGF2ZSB0byBrZWVwIHRoZSBmbGFncyBgdHJ1ZWAgdmFsdWVzIGZyb20gdGhlIHByZXZpb3VzIGxvb3AgaXRlcmF0aW9uXG4gICAgICAgICAgICAgICAgaXNEaXJlY3RpdmUgPSBpc0RpcmVjdGl2ZSB8fCB0aGlzLmlzRGlyZWN0aXZlRGVjb3JhdG9yKGNsYXNzRGVjb3JhdG9yc1thXSk7XG4gICAgICAgICAgICAgICAgaXNTZXJ2aWNlID0gaXNTZXJ2aWNlIHx8IHRoaXMuaXNTZXJ2aWNlRGVjb3JhdG9yKGNsYXNzRGVjb3JhdG9yc1thXSk7XG4gICAgICAgICAgICAgICAgaXNQaXBlID0gaXNQaXBlIHx8IHRoaXMuaXNQaXBlRGVjb3JhdG9yKGNsYXNzRGVjb3JhdG9yc1thXSk7XG4gICAgICAgICAgICAgICAgaXNNb2R1bGUgPSBpc01vZHVsZSB8fCB0aGlzLmlzTW9kdWxlRGVjb3JhdG9yKGNsYXNzRGVjb3JhdG9yc1thXSk7XG4gICAgICAgICAgICAgICAgaXNDb250cm9sbGVyID0gaXNDb250cm9sbGVyIHx8IHRoaXMuaXNDb250cm9sbGVyRGVjb3JhdG9yKGNsYXNzRGVjb3JhdG9yc1thXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNEaXJlY3RpdmUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogcmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogbWVtYmVycy5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IG1lbWJlcnMub3V0cHV0cyxcbiAgICAgICAgICAgICAgICAgICAgaG9zdEJpbmRpbmdzOiBtZW1iZXJzLmhvc3RCaW5kaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgaG9zdExpc3RlbmVyczogbWVtYmVycy5ob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBtZW1iZXJzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1lbWJlcnMubWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAga2luZDogbWVtYmVycy5raW5kLFxuICAgICAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcjogbWVtYmVycy5jb25zdHJ1Y3RvcixcbiAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuZHM6IGV4dGVuZHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50czogaW1wbGVtZW50c0VsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3NvcnM6IG1lbWJlcnMuYWNjZXNzb3JzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNTZXJ2aWNlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogcmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBtZW1iZXJzLm1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmRleFNpZ25hdHVyZXM6IG1lbWJlcnMuaW5kZXhTaWduYXR1cmVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogbWVtYmVycy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAga2luZDogbWVtYmVycy5raW5kLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IG1lbWJlcnMuY29uc3RydWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuZHM6IGV4dGVuZHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yczogbWVtYmVycy5hY2Nlc3NvcnNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUGlwZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IHJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBtZW1iZXJzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBtZW1iZXJzLm1ldGhvZHNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTW9kdWxlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogcmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBqc2RvY3RhZ3M6IGpzZG9jdGFncyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IG1lbWJlcnMubWV0aG9kc1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IHJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzOiBtZW1iZXJzLmluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IG1lbWJlcnMucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1lbWJlcnMua2luZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yOiBtZW1iZXJzLmNvbnN0cnVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAganNkb2N0YWdzOiBqc2RvY3RhZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBleHRlbmRzOiBleHRlbmRzRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRzOiBpbXBsZW1lbnRzRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY2Nlc3NvcnM6IG1lbWJlcnMuYWNjZXNzb3JzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IHJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICBpbnB1dHM6IG1lbWJlcnMuaW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBtZW1iZXJzLm91dHB1dHMsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RCaW5kaW5nczogbWVtYmVycy5ob3N0QmluZGluZ3MsXG4gICAgICAgICAgICAgICAgICAgIGhvc3RMaXN0ZW5lcnM6IG1lbWJlcnMuaG9zdExpc3RlbmVycyxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogbWVtYmVycy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICBpbmRleFNpZ25hdHVyZXM6IG1lbWJlcnMuaW5kZXhTaWduYXR1cmVzLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBtZW1iZXJzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1lbWJlcnMua2luZCxcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IG1lbWJlcnMuY29uc3RydWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIGpzZG9jdGFnczoganNkb2N0YWdzLFxuICAgICAgICAgICAgICAgICAgICBleHRlbmRzOiBleHRlbmRzRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzOiBtZW1iZXJzLmFjY2Vzc29yc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBtZW1iZXJzLm1ldGhvZHMsXG4gICAgICAgICAgICAgICAgICAgIGlucHV0czogbWVtYmVycy5pbnB1dHMsXG4gICAgICAgICAgICAgICAgICAgIG91dHB1dHM6IG1lbWJlcnMub3V0cHV0cyxcbiAgICAgICAgICAgICAgICAgICAgaG9zdEJpbmRpbmdzOiBtZW1iZXJzLmhvc3RCaW5kaW5ncyxcbiAgICAgICAgICAgICAgICAgICAgaG9zdExpc3RlbmVyczogbWVtYmVycy5ob3N0TGlzdGVuZXJzLFxuICAgICAgICAgICAgICAgICAgICBpbmRleFNpZ25hdHVyZXM6IG1lbWJlcnMuaW5kZXhTaWduYXR1cmVzLFxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBtZW1iZXJzLnByb3BlcnRpZXMsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6IG1lbWJlcnMua2luZCxcbiAgICAgICAgICAgICAgICAgICAgY29uc3RydWN0b3I6IG1lbWJlcnMuY29uc3RydWN0b3IsXG4gICAgICAgICAgICAgICAgICAgIGpzZG9jdGFnczoganNkb2N0YWdzLFxuICAgICAgICAgICAgICAgICAgICBleHRlbmRzOiBleHRlbmRzRWxlbWVudHMsXG4gICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHM6IGltcGxlbWVudHNFbGVtZW50cyxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzb3JzOiBtZW1iZXJzLmFjY2Vzc29yc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdE1lbWJlcnMobWVtYmVycywgc291cmNlRmlsZSkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBsZXQgaW5wdXRzID0gW107XG4gICAgICAgIGxldCBvdXRwdXRzID0gW107XG4gICAgICAgIGxldCBtZXRob2RzID0gW107XG4gICAgICAgIGxldCBwcm9wZXJ0aWVzID0gW107XG4gICAgICAgIGxldCBpbmRleFNpZ25hdHVyZXMgPSBbXTtcbiAgICAgICAgbGV0IGtpbmQ7XG4gICAgICAgIGxldCBpbnB1dERlY29yYXRvcjtcbiAgICAgICAgbGV0IGhvc3RCaW5kaW5ncyA9IFtdO1xuICAgICAgICBsZXQgaG9zdExpc3RlbmVycyA9IFtdO1xuICAgICAgICBsZXQgY29uc3RydWN0b3I7XG4gICAgICAgIGxldCBvdXRwdXREZWNvcmF0b3I7XG4gICAgICAgIGxldCBhY2Nlc3NvcnMgPSB7fTtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHt9O1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWVtYmVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgLy8gQWxsb3dzIHR5cGVzY3JpcHQgZ3Vlc3MgdHlwZSB3aGVuIHVzaW5nIHRzLmlzKlxuICAgICAgICAgICAgbGV0IG1lbWJlciA9IG1lbWJlcnNbaV07XG5cbiAgICAgICAgICAgIGlucHV0RGVjb3JhdG9yID0gdGhpcy5nZXREZWNvcmF0b3JPZlR5cGUobWVtYmVyLCAnSW5wdXQnKTtcbiAgICAgICAgICAgIG91dHB1dERlY29yYXRvciA9IHRoaXMuZ2V0RGVjb3JhdG9yT2ZUeXBlKG1lbWJlciwgJ091dHB1dCcpO1xuICAgICAgICAgICAgY29uc3QgcGFyc2VkSG9zdEJpbmRpbmdzID0gdGhpcy5nZXREZWNvcmF0b3JPZlR5cGUobWVtYmVyLCAnSG9zdEJpbmRpbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnNlZEhvc3RMaXN0ZW5lcnMgPSB0aGlzLmdldERlY29yYXRvck9mVHlwZShtZW1iZXIsICdIb3N0TGlzdGVuZXInKTtcblxuICAgICAgICAgICAga2luZCA9IG1lbWJlci5raW5kO1xuXG4gICAgICAgICAgICBpZiAoaXNJZ25vcmUobWVtYmVyKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0ludGVybmFsKG1lbWJlcikgJiYgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlSW50ZXJuYWwpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlucHV0RGVjb3JhdG9yICYmIGlucHV0RGVjb3JhdG9yLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpbnB1dHMucHVzaCh0aGlzLnZpc2l0SW5wdXRBbmRIb3N0QmluZGluZyhtZW1iZXIsIGlucHV0RGVjb3JhdG9yWzBdLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzU2V0QWNjZXNzb3JEZWNsYXJhdGlvbihtZW1iZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkQWNjZXNzb3IoYWNjZXNzb3JzLCBtZW1iZXJzW2ldLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dERlY29yYXRvciAmJiBvdXRwdXREZWNvcmF0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG91dHB1dHMucHVzaCh0aGlzLnZpc2l0T3V0cHV0KG1lbWJlciwgb3V0cHV0RGVjb3JhdG9yWzBdLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlZEhvc3RCaW5kaW5ncyAmJiBwYXJzZWRIb3N0QmluZGluZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxldCBrID0gMDtcbiAgICAgICAgICAgICAgICBjb25zdCBsZW5IQiA9IHBhcnNlZEhvc3RCaW5kaW5ncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgZm9yIChrOyBrIDwgbGVuSEI7IGsrKykge1xuICAgICAgICAgICAgICAgICAgICBob3N0QmluZGluZ3MucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlzaXRJbnB1dEFuZEhvc3RCaW5kaW5nKG1lbWJlciwgcGFyc2VkSG9zdEJpbmRpbmdzW2tdLCBzb3VyY2VGaWxlKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VkSG9zdExpc3RlbmVycyAmJiBwYXJzZWRIb3N0TGlzdGVuZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQgbCA9IDA7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuSEwgPSBwYXJzZWRIb3N0TGlzdGVuZXJzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBmb3IgKGw7IGwgPCBsZW5ITDsgbCsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGhvc3RMaXN0ZW5lcnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmlzaXRIb3N0TGlzdGVuZXIobWVtYmVyLCBwYXJzZWRIb3N0TGlzdGVuZXJzW2xdLCBzb3VyY2VGaWxlKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCF0aGlzLmlzSGlkZGVuTWVtYmVyKG1lbWJlcikpIHtcbiAgICAgICAgICAgICAgICBpZiAoISh0aGlzLmlzUHJpdmF0ZShtZW1iZXIpICYmIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByaXZhdGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHRoaXMuaXNJbnRlcm5hbChtZW1iZXIpICYmIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUludGVybmFsKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICEodGhpcy5pc1Byb3RlY3RlZChtZW1iZXIpICYmIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByb3RlY3RlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc01ldGhvZERlY2xhcmF0aW9uKG1lbWJlcikgfHwgdHMuaXNNZXRob2RTaWduYXR1cmUobWVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzLnB1c2godGhpcy52aXNpdE1ldGhvZERlY2xhcmF0aW9uKG1lbWJlciwgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmlzUHJvcGVydHlEZWNsYXJhdGlvbihtZW1iZXIpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmlzUHJvcGVydHlTaWduYXR1cmUobWVtYmVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlucHV0RGVjb3JhdG9yICYmICFvdXRwdXREZWNvcmF0b3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMucHVzaCh0aGlzLnZpc2l0UHJvcGVydHkobWVtYmVyLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uKG1lbWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKHRoaXMudmlzaXRDYWxsRGVjbGFyYXRpb24obWVtYmVyLCBzb3VyY2VGaWxlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuaXNHZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG1lbWJlcikgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuaXNTZXRBY2Nlc3NvckRlY2xhcmF0aW9uKG1lbWJlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRBY2Nlc3NvcihhY2Nlc3NvcnMsIG1lbWJlcnNbaV0sIHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNJbmRleFNpZ25hdHVyZURlY2xhcmF0aW9uKG1lbWJlcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhTaWduYXR1cmVzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0SW5kZXhEZWNsYXJhdGlvbihtZW1iZXIsIHNvdXJjZUZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cy5pc0NvbnN0cnVjdG9yRGVjbGFyYXRpb24obWVtYmVyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgX2NvbnN0cnVjdG9yUHJvcGVydGllcyA9IHRoaXMudmlzaXRDb25zdHJ1Y3RvclByb3BlcnRpZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBqID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxlbiA9IF9jb25zdHJ1Y3RvclByb3BlcnRpZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGo7IGogPCBsZW47IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKF9jb25zdHJ1Y3RvclByb3BlcnRpZXNbal0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yID0gdGhpcy52aXNpdENvbnN0cnVjdG9yRGVjbGFyYXRpb24obWVtYmVyLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpbnB1dHMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgb3V0cHV0cy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICBob3N0QmluZGluZ3Muc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgaG9zdExpc3RlbmVycy5zb3J0KGdldE5hbWVzQ29tcGFyZUZuKCkpO1xuICAgICAgICBwcm9wZXJ0aWVzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG4gICAgICAgIG1ldGhvZHMuc29ydChnZXROYW1lc0NvbXBhcmVGbigpKTtcbiAgICAgICAgaW5kZXhTaWduYXR1cmVzLnNvcnQoZ2V0TmFtZXNDb21wYXJlRm4oKSk7XG5cbiAgICAgICAgcmVzdWx0ID0ge1xuICAgICAgICAgICAgaW5wdXRzLFxuICAgICAgICAgICAgb3V0cHV0cyxcbiAgICAgICAgICAgIGhvc3RCaW5kaW5ncyxcbiAgICAgICAgICAgIGhvc3RMaXN0ZW5lcnMsXG4gICAgICAgICAgICBtZXRob2RzLFxuICAgICAgICAgICAgcHJvcGVydGllcyxcbiAgICAgICAgICAgIGluZGV4U2lnbmF0dXJlcyxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICBjb25zdHJ1Y3RvclxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhhY2Nlc3NvcnMpLmxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0WydhY2Nlc3NvcnMnXSA9IGFjY2Vzc29ycztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdFR5cGVOYW1lKHR5cGVOYW1lOiB0cy5JZGVudGlmaWVyKSB7XG4gICAgICAgIGlmICh0eXBlTmFtZS5lc2NhcGVkVGV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIHR5cGVOYW1lLmVzY2FwZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlTmFtZS50ZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gdHlwZU5hbWUudGV4dDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZU5hbWUubGVmdCAmJiB0eXBlTmFtZS5yaWdodCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUeXBlTmFtZSh0eXBlTmFtZS5sZWZ0KSArICcuJyArIHRoaXMudmlzaXRUeXBlTmFtZSh0eXBlTmFtZS5yaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHB1YmxpYyB2aXNpdFR5cGVJbmRleChub2RlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IF9yZXR1cm4gPSAnJztcblxuICAgICAgICBpZiAoIW5vZGUpIHtcbiAgICAgICAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgbm9kZS50eXBlICYmXG4gICAgICAgICAgICBub2RlLnR5cGUua2luZCA9PT0gU3ludGF4S2luZC5JbmRleGVkQWNjZXNzVHlwZSAmJlxuICAgICAgICAgICAgbm9kZS50eXBlLmluZGV4VHlwZSAmJlxuICAgICAgICAgICAgbm9kZS50eXBlLmluZGV4VHlwZS5saXRlcmFsXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRUeXBlTmFtZShub2RlLnR5cGUuaW5kZXhUeXBlLmxpdGVyYWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIF9yZXR1cm47XG4gICAgfVxuXG4gICAgcHVibGljIHZpc2l0VHlwZShub2RlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IF9yZXR1cm4gPSAndm9pZCc7XG5cbiAgICAgICAgaWYgKCFub2RlKSB7XG4gICAgICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlLnR5cGVOYW1lKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0gdGhpcy52aXNpdFR5cGVOYW1lKG5vZGUudHlwZU5hbWUpO1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5raW5kKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IGtpbmRUb1R5cGUobm9kZS50eXBlLmtpbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gPSB0aGlzLnZpc2l0VHlwZU5hbWUobm9kZS50eXBlLnR5cGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUudHlwZUFyZ3VtZW50cykge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJzwnO1xuICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVBcmd1bWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFyZ3VtZW50IG9mIG5vZGUudHlwZS50eXBlQXJndW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudHMucHVzaCh0aGlzLnZpc2l0VHlwZShhcmd1bWVudCkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHR5cGVBcmd1bWVudHMuam9pbignIHwgJyk7XG4gICAgICAgICAgICAgICAgX3JldHVybiArPSAnPic7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgX2ZpcnN0UGFydCA9IHRoaXMudmlzaXRUeXBlKG5vZGUudHlwZS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IF9maXJzdFBhcnQgKyBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS50eXBlLmVsZW1lbnRUeXBlLmtpbmQgPT09IFN5bnRheEtpbmQuUGFyZW50aGVzaXplZFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiA9ICcoJyArIF9maXJzdFBhcnQgKyAnKScgKyBraW5kVG9UeXBlKG5vZGUudHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlVHlwZXNPckVsZW1lbnRzID0gKGFyciwgc2VwYXJhdG9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBsZW4gPSBhcnIubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gYXJyW2ldO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfZmlyc3RQYXJ0ID0gdGhpcy52aXNpdFR5cGUodHlwZS5lbGVtZW50VHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5lbGVtZW50VHlwZS5raW5kID09PSBTeW50YXhLaW5kLlBhcmVudGhlc2l6ZWRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnKCcgKyBfZmlyc3RQYXJ0ICsgJyknICsga2luZFRvVHlwZSh0eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IF9maXJzdFBhcnQgKyBraW5kVG9UeXBlKHR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNMaXRlcmFsVHlwZU5vZGUodHlwZSkgJiYgdHlwZS5saXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUubGl0ZXJhbC50ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJ1wiJyArIHR5cGUubGl0ZXJhbC50ZXh0ICsgJ1wiJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IGtpbmRUb1R5cGUodHlwZS5saXRlcmFsLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdGhpcy52aXNpdFR5cGVOYW1lKHR5cGUudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUua2luZCA9PT0gU3ludGF4S2luZC5SZXN0VHlwZSAmJiB0eXBlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICcuLi4nICsgdGhpcy52aXNpdFR5cGUodHlwZS50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLnR5cGVBcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICc8JztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0eXBlQXJndW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhcmd1bWVudCBvZiB0eXBlLnR5cGVBcmd1bWVudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUFyZ3VtZW50cy5wdXNoKHRoaXMudmlzaXRUeXBlKGFyZ3VtZW50KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdHlwZUFyZ3VtZW50cy5qb2luKHNlcGFyYXRvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnPic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHNlcGFyYXRvcjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChub2RlLnR5cGUuZWxlbWVudHMgJiYgdHMuaXNUdXBsZVR5cGVOb2RlKG5vZGUudHlwZSkpIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICdbJztcbiAgICAgICAgICAgICAgICBwYXJzZVR5cGVzT3JFbGVtZW50cyhub2RlLnR5cGUuZWxlbWVudHMsICcsICcpO1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJ10nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS50eXBlcyAmJiB0cy5pc1VuaW9uVHlwZU5vZGUobm9kZS50eXBlKSkge1xuICAgICAgICAgICAgICAgIHBhcnNlVHlwZXNPckVsZW1lbnRzKG5vZGUudHlwZS50eXBlcywgJyB8ICcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vZGUudHlwZS5lbGVtZW50VHlwZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWxlbWVudFR5cGVzID0gbm9kZS50eXBlLmVsZW1lbnRUeXBlcztcbiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IGxlbiA9IGVsZW1lbnRUeXBlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGxlbiA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgX3JldHVybiA9ICdbJztcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBlbGVtZW50VHlwZXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5raW5kID09PSBTeW50YXhLaW5kLkFycmF5VHlwZSAmJiB0eXBlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUuZWxlbWVudFR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUua2luZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0ga2luZFRvVHlwZSh0eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzTGl0ZXJhbFR5cGVOb2RlKHR5cGUpICYmIHR5cGUubGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmxpdGVyYWwudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICdcIicgKyB0eXBlLmxpdGVyYWwudGV4dCArICdcIic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUubGl0ZXJhbC5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gdGhpcy52aXNpdFR5cGVOYW1lKHR5cGUudHlwZU5hbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUua2luZCA9PT0gU3ludGF4S2luZC5SZXN0VHlwZSAmJiB0eXBlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICcuLi4nICsgdGhpcy52aXNpdFR5cGUodHlwZS50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUua2luZCA9PT0gU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS50eXBlTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiB0eXBlLnR5cGVOYW1lLmVzY2FwZWRUZXh0ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUudHlwZU5hbWUuZXNjYXBlZFRleHQgPT09ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJywgJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9ICddJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgbm9kZS50eXBlICYmXG4gICAgICAgICAgICAgICAgbm9kZS50eXBlLmtpbmQgPT09IFN5bnRheEtpbmQuSW5kZXhlZEFjY2Vzc1R5cGUgJiZcbiAgICAgICAgICAgICAgICBub2RlLnR5cGUub2JqZWN0VHlwZSAmJlxuICAgICAgICAgICAgICAgIG5vZGUudHlwZS5vYmplY3RUeXBlLnR5cGVOYW1lXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuID0gdGhpcy52aXNpdFR5cGVOYW1lKG5vZGUudHlwZS5vYmplY3RUeXBlLnR5cGVOYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChub2RlLmVsZW1lbnRUeXBlKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0ga2luZFRvVHlwZShub2RlLmVsZW1lbnRUeXBlLmtpbmQpICsga2luZFRvVHlwZShub2RlLmtpbmQpO1xuICAgICAgICAgICAgaWYgKG5vZGUuZWxlbWVudFR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuID0gdGhpcy52aXNpdFR5cGVOYW1lKG5vZGUuZWxlbWVudFR5cGUudHlwZU5hbWUpICsga2luZFRvVHlwZShub2RlLmtpbmQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUudHlwZXMgJiYgdHMuaXNVbmlvblR5cGVOb2RlKG5vZGUpKSB7XG4gICAgICAgICAgICBfcmV0dXJuID0gJyc7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gbm9kZS50eXBlcy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCB0eXBlID0gbm9kZS50eXBlc1tpXTtcbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9IGtpbmRUb1R5cGUodHlwZS5raW5kKTtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNMaXRlcmFsVHlwZU5vZGUodHlwZSkgJiYgdHlwZS5saXRlcmFsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlLmxpdGVyYWwudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSAnXCInICsgdHlwZS5saXRlcmFsLnRleHQgKyAnXCInO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybiArPSBraW5kVG9UeXBlKHR5cGUubGl0ZXJhbC5raW5kKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHRoaXMudmlzaXRUeXBlTmFtZSh0eXBlLnR5cGVOYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJyB8ICc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZG90RG90RG90VG9rZW4pIHtcbiAgICAgICAgICAgIF9yZXR1cm4gPSAnYW55W10nO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3JldHVybiA9IGtpbmRUb1R5cGUobm9kZS5raW5kKTtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBfcmV0dXJuID09PSAnJyAmJlxuICAgICAgICAgICAgICAgIG5vZGUuaW5pdGlhbGl6ZXIgJiZcbiAgICAgICAgICAgICAgICBub2RlLmluaXRpYWxpemVyLmtpbmQgJiZcbiAgICAgICAgICAgICAgICAobm9kZS5raW5kID09PSBTeW50YXhLaW5kLlByb3BlcnR5RGVjbGFyYXRpb24gfHwgbm9kZS5raW5kID09PSBTeW50YXhLaW5kLlBhcmFtZXRlcilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIF9yZXR1cm4gPSBraW5kVG9UeXBlKG5vZGUuaW5pdGlhbGl6ZXIua2luZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5raW5kID09PSBTeW50YXhLaW5kLlR5cGVQYXJhbWV0ZXIpIHtcbiAgICAgICAgICAgICAgICBfcmV0dXJuID0gbm9kZS5uYW1lLnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5raW5kID09PSBTeW50YXhLaW5kLkxpdGVyYWxUeXBlKSB7XG4gICAgICAgICAgICAgICAgX3JldHVybiA9IG5vZGUubGl0ZXJhbC50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub2RlLnR5cGVBcmd1bWVudHMgJiYgbm9kZS50eXBlQXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIF9yZXR1cm4gKz0gJzwnO1xuICAgICAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgICAgIGxlbiA9IG5vZGUudHlwZUFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGxldCBhcmd1bWVudCA9IG5vZGUudHlwZUFyZ3VtZW50c1tpXTtcbiAgICAgICAgICAgICAgICBfcmV0dXJuICs9IHRoaXMudmlzaXRUeXBlKGFyZ3VtZW50KTtcbiAgICAgICAgICAgICAgICBpZiAoaSA+PSAwICYmIGkgPCBsZW4gLSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4gKz0gJywgJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBfcmV0dXJuICs9ICc+JztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0Q2FsbERlY2xhcmF0aW9uKG1ldGhvZDogdHMuQ2FsbFNpZ25hdHVyZURlY2xhcmF0aW9uLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSB7XG4gICAgICAgIGxldCBzb3VyY2VDb2RlID0gc291cmNlRmlsZS5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzb3VyY2VDb2RlKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgICBsZXQgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBpZDogJ2NhbGwtZGVjbGFyYXRpb24tJyArIGhhc2gsXG4gICAgICAgICAgICBhcmdzOiBtZXRob2QucGFyYW1ldGVycyA/IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSkgOiBbXSxcbiAgICAgICAgICAgIHJldHVyblR5cGU6IHRoaXMudmlzaXRUeXBlKG1ldGhvZC50eXBlKSxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMuZ2V0UG9zaXRpb24obWV0aG9kLCBzb3VyY2VGaWxlKS5saW5lICsgMSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiAnJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAobWV0aG9kLmpzRG9jKSB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUobWV0aG9kLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFuZWREZXNjcmlwdGlvbiA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLnBhcnNlQ29tbWVudChjb21tZW50KTtcbiAgICAgICAgICAgIHJlc3VsdC5yYXdkZXNjcmlwdGlvbiA9IGNsZWFuZWREZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IG1hcmtlZEFjbChjbGVhbmVkRGVzY3JpcHRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGxldCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MobWV0aG9kKTtcbiAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgcmVzdWx0KTtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtYXJrZWR0YWdzKGpzZG9jdGFnc1swXS50YWdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRJbmRleERlY2xhcmF0aW9uKFxuICAgICAgICBtZXRob2Q6IHRzLkluZGV4U2lnbmF0dXJlRGVjbGFyYXRpb24sXG4gICAgICAgIHNvdXJjZUZpbGU/OiB0cy5Tb3VyY2VGaWxlXG4gICAgKSB7XG4gICAgICAgIGxldCBzb3VyY2VDb2RlID0gc291cmNlRmlsZS5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzb3VyY2VDb2RlKS5kaWdlc3QoJ2hleCcpO1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgaWQ6ICdpbmRleC1kZWNsYXJhdGlvbi0nICsgaGFzaCxcbiAgICAgICAgICAgIGFyZ3M6IG1ldGhvZC5wYXJhbWV0ZXJzID8gbWV0aG9kLnBhcmFtZXRlcnMubWFwKHByb3AgPT4gdGhpcy52aXNpdEFyZ3VtZW50KHByb3ApKSA6IFtdLFxuICAgICAgICAgICAgcmV0dXJuVHlwZTogdGhpcy52aXNpdFR5cGUobWV0aG9kLnR5cGUpLFxuICAgICAgICAgICAgbGluZTogdGhpcy5nZXRQb3NpdGlvbihtZXRob2QsIHNvdXJjZUZpbGUpLmxpbmUgKyAxLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhtZXRob2QpO1xuICAgICAgICBpZiAobWV0aG9kLmpzRG9jKSB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUobWV0aG9kLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFuZWREZXNjcmlwdGlvbiA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLnBhcnNlQ29tbWVudChjb21tZW50KTtcbiAgICAgICAgICAgIHJlc3VsdC5yYXdkZXNjcmlwdGlvbiA9IGNsZWFuZWREZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IG1hcmtlZEFjbChjbGVhbmVkRGVzY3JpcHRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIGlmIChqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgcmVzdWx0KTtcbiAgICAgICAgICAgICAgICBpZiAobWV0aG9kLmpzRG9jKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtYXJrZWR0YWdzKGpzZG9jdGFnc1swXS50YWdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRDb25zdHJ1Y3RvckRlY2xhcmF0aW9uKFxuICAgICAgICBtZXRob2Q6IHRzLkNvbnN0cnVjdG9yRGVjbGFyYXRpb24sXG4gICAgICAgIHNvdXJjZUZpbGU/OiB0cy5Tb3VyY2VGaWxlXG4gICAgKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgICAgICovXG4gICAgICAgIGxldCByZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgICAgIG5hbWU6ICdjb25zdHJ1Y3RvcicsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJycsXG4gICAgICAgICAgICBhcmdzOiBtZXRob2QucGFyYW1ldGVycyA/IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSkgOiBbXSxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMuZ2V0UG9zaXRpb24obWV0aG9kLCBzb3VyY2VGaWxlKS5saW5lICsgMVxuICAgICAgICB9O1xuICAgICAgICBsZXQganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKG1ldGhvZCk7XG5cbiAgICAgICAgaWYgKG1ldGhvZC5qc0RvYykge1xuICAgICAgICAgICAgY29uc3QgY29tbWVudCA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldE1haW5Db21tZW50T2ZOb2RlKG1ldGhvZCwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICBjb25zdCBjbGVhbmVkRGVzY3JpcHRpb24gPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5wYXJzZUNvbW1lbnQoY29tbWVudCk7XG4gICAgICAgICAgICByZXN1bHQucmF3ZGVzY3JpcHRpb24gPSBjbGVhbmVkRGVzY3JpcHRpb247XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBtYXJrZWRBY2woY2xlYW5lZERlc2NyaXB0aW9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtpbmRzID0gbWV0aG9kLm1vZGlmaWVycy5tYXAobW9kaWZpZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kaWZpZXIua2luZDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKSAhPT0gLTEgJiZcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlN0YXRpY0tleXdvcmQpICE9PSAtMVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBraW5kcyA9IGtpbmRzLmZpbHRlcihraW5kID0+IGtpbmQgIT09IFN5bnRheEtpbmQuUHVibGljS2V5d29yZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJlc3VsdC5tb2RpZmllcktpbmQgPSBraW5kcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCByZXN1bHQpO1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuanNkb2N0YWdzICYmIHJlc3VsdC5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3MocmVzdWx0LmFyZ3MsIHJlc3VsdC5qc2RvY3RhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRQcm9wZXJ0eShwcm9wZXJ0eTogdHMuUHJvcGVydHlEZWNsYXJhdGlvbiwgc291cmNlRmlsZSkge1xuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgICAgIG5hbWU6IHByb3BlcnR5Lm5hbWUudGV4dCxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogcHJvcGVydHkuaW5pdGlhbGl6ZXJcbiAgICAgICAgICAgICAgICA/IHRoaXMuc3RyaW5naWZ5RGVmYXVsdFZhbHVlKHByb3BlcnR5LmluaXRpYWxpemVyKVxuICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnLFxuICAgICAgICAgICAgdHlwZTogdGhpcy52aXNpdFR5cGUocHJvcGVydHkpLFxuICAgICAgICAgICAgaW5kZXhLZXk6IHRoaXMudmlzaXRUeXBlSW5kZXgocHJvcGVydHkpLFxuICAgICAgICAgICAgb3B0aW9uYWw6IHR5cGVvZiBwcm9wZXJ0eS5xdWVzdGlvblRva2VuICE9PSAndW5kZWZpbmVkJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIGxpbmU6IHRoaXMuZ2V0UG9zaXRpb24ocHJvcGVydHksIHNvdXJjZUZpbGUpLmxpbmUgKyAxXG4gICAgICAgIH07XG4gICAgICAgIGxldCBqc2RvY3RhZ3M7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5LmluaXRpYWxpemVyICYmIHByb3BlcnR5LmluaXRpYWxpemVyLmtpbmQgPT09IFN5bnRheEtpbmQuQXJyb3dGdW5jdGlvbikge1xuICAgICAgICAgICAgcmVzdWx0LmRlZmF1bHRWYWx1ZSA9ICcoKSA9PiB7Li4ufSc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdC5uYW1lID09PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgcHJvcGVydHkubmFtZS5leHByZXNzaW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmVzdWx0Lm5hbWUgPSBwcm9wZXJ0eS5uYW1lLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgfVxuXG4gICAgICAgIGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhwcm9wZXJ0eSk7XG5cbiAgICAgICAgaWYgKHByb3BlcnR5LmpzRG9jKSB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUocHJvcGVydHksIHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgY29uc3QgY2xlYW5lZERlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgcmVzdWx0LnJhd2Rlc2NyaXB0aW9uID0gY2xlYW5lZERlc2NyaXB0aW9uO1xuICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gbWFya2VkQWNsKGNsZWFuZWREZXNjcmlwdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZUhhc0RlY29yYXRvcihwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5RGVjb3JhdG9ycyA9IGdldE5vZGVEZWNvcmF0b3JzKHByb3BlcnR5KTtcbiAgICAgICAgICAgIHJlc3VsdC5kZWNvcmF0b3JzID0gdGhpcy5mb3JtYXREZWNvcmF0b3JzKHByb3BlcnR5RGVjb3JhdG9ycyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQga2luZHMgPSBwcm9wZXJ0eS5tb2RpZmllcnMubWFwKG1vZGlmaWVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZGlmaWVyLmtpbmQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBfLmluZGV4T2Yoa2luZHMsIFN5bnRheEtpbmQuUHVibGljS2V5d29yZCkgIT09IC0xICYmXG4gICAgICAgICAgICAgICAgICAgIF8uaW5kZXhPZihraW5kcywgU3ludGF4S2luZC5TdGF0aWNLZXl3b3JkKSAhPT0gLTFcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAga2luZHMgPSBraW5kcy5maWx0ZXIoa2luZCA9PiBraW5kICE9PSBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kID0ga2luZHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gQ2hlY2sgZm9yIEVDTUFTY3JpcHQgUHJpdmF0ZSBGaWVsZHNcbiAgICAgICAgaWYgKHRoaXMuaXNQcml2YXRlKHByb3BlcnR5KSkge1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQubW9kaWZpZXJLaW5kKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Lm1vZGlmaWVyS2luZCA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGhhc0FscmVhZHlQcml2YXRlTGV5d29yZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzdWx0Lm1vZGlmaWVyS2luZC5mb3JFYWNoKG1vZGlmaWVyS2luZCA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICBoYXNBbHJlYWR5UHJpdmF0ZUxleXdvcmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFoYXNBbHJlYWR5UHJpdmF0ZUxleXdvcmQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kLnB1c2goU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgcmVzdWx0KTtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYykge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtYXJrZWR0YWdzKGpzZG9jdGFnc1swXS50YWdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdENvbnN0cnVjdG9yUHJvcGVydGllcyhjb25zdHIsIHNvdXJjZUZpbGUpIHtcbiAgICAgICAgaWYgKGNvbnN0ci5wYXJhbWV0ZXJzKSB7XG4gICAgICAgICAgICBsZXQgX3BhcmFtZXRlcnMgPSBbXTtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBjb25zdHIucGFyYW1ldGVycy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtZXRlck9mQ29uc3RydWN0b3IgPSBjb25zdHIucGFyYW1ldGVyc1tpXTtcbiAgICAgICAgICAgICAgICBpZiAoaXNJZ25vcmUocGFyYW1ldGVyT2ZDb25zdHJ1Y3RvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0ludGVybmFsKHBhcmFtZXRlck9mQ29uc3RydWN0b3IpICYmXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUludGVybmFsXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1B1YmxpYyhwYXJhbWV0ZXJPZkNvbnN0cnVjdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICBfcGFyYW1ldGVycy5wdXNoKHRoaXMudmlzaXRQcm9wZXJ0eShjb25zdHIucGFyYW1ldGVyc1tpXSwgc291cmNlRmlsZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8qKlxuICAgICAgICAgICAgICogTWVyZ2UgSlNEb2MgdGFncyBkZXNjcmlwdGlvbiBmcm9tIGNvbnN0cnVjdG9yIHdpdGggcGFyYW1ldGVyc1xuICAgICAgICAgICAgICovXG4gICAgICAgICAgICBpZiAoY29uc3RyLmpzRG9jKSB7XG4gICAgICAgICAgICAgICAgaWYgKGNvbnN0ci5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb25zdHJUYWdzID0gY29uc3RyLmpzRG9jWzBdLnRhZ3M7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjb25zdHJUYWdzICYmIGNvbnN0clRhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RyVGFncy5mb3JFYWNoKHRhZyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BhcmFtZXRlcnMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy50YWdOYW1lICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcudGFnTmFtZS5lc2NhcGVkVGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLnRhZ05hbWUuZXNjYXBlZFRleHQgPT09ICdwYXJhbSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLm5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcubmFtZS5lc2NhcGVkVGV4dCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZy5uYW1lLmVzY2FwZWRUZXh0ID09PSBwYXJhbS5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5kZXNjcmlwdGlvbiA9IHRhZy5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBfcGFyYW1ldGVycztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRNZXRob2REZWNsYXJhdGlvbihtZXRob2Q6IHRzLk1ldGhvZERlY2xhcmF0aW9uLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKSB7XG4gICAgICAgIGxldCByZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgICAgIG5hbWU6IG1ldGhvZC5uYW1lLnRleHQsXG4gICAgICAgICAgICBhcmdzOiBtZXRob2QucGFyYW1ldGVycyA/IG1ldGhvZC5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSkgOiBbXSxcbiAgICAgICAgICAgIG9wdGlvbmFsOiB0eXBlb2YgbWV0aG9kLnF1ZXN0aW9uVG9rZW4gIT09ICd1bmRlZmluZWQnLFxuICAgICAgICAgICAgcmV0dXJuVHlwZTogdGhpcy52aXNpdFR5cGUobWV0aG9kLnR5cGUpLFxuICAgICAgICAgICAgdHlwZVBhcmFtZXRlcnM6IFtdLFxuICAgICAgICAgICAgbGluZTogdGhpcy5nZXRQb3NpdGlvbihtZXRob2QsIHNvdXJjZUZpbGUpLmxpbmUgKyAxLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnXG4gICAgICAgIH07XG4gICAgICAgIGxldCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MobWV0aG9kKTtcblxuICAgICAgICBpZiAodHlwZW9mIG1ldGhvZC50eXBlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIGdldCBpbmZlcnJlZCB0eXBlXG4gICAgICAgICAgICBpZiAobWV0aG9kLnN5bWJvbCkge1xuICAgICAgICAgICAgICAgIGxldCBzeW1ib2w6IHRzLlN5bWJvbCA9IG1ldGhvZC5zeW1ib2w7XG4gICAgICAgICAgICAgICAgaWYgKHN5bWJvbC52YWx1ZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzeW1ib2xUeXBlID0gdGhpcy50eXBlQ2hlY2tlci5nZXRUeXBlT2ZTeW1ib2xBdExvY2F0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sLnZhbHVlRGVjbGFyYXRpb25cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHN5bWJvbFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gdGhpcy50eXBlQ2hlY2tlci5nZXRTaWduYXR1cmVGcm9tRGVjbGFyYXRpb24obWV0aG9kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXR1cm5UeXBlID0gc2lnbmF0dXJlLmdldFJldHVyblR5cGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQucmV0dXJuVHlwZSA9IHRoaXMudHlwZUNoZWNrZXIudHlwZVRvU3RyaW5nKHJldHVyblR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1lbXB0eVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHt9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWV0aG9kLnR5cGVQYXJhbWV0ZXJzICYmIG1ldGhvZC50eXBlUGFyYW1ldGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQudHlwZVBhcmFtZXRlcnMgPSBtZXRob2QudHlwZVBhcmFtZXRlcnMubWFwKHR5cGVQYXJhbWV0ZXIgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnZpc2l0VHlwZSh0eXBlUGFyYW1ldGVyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QuanNEb2MpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRNYWluQ29tbWVudE9mTm9kZShtZXRob2QsIHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgY29uc3QgY2xlYW5lZERlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgcmVzdWx0LnJhd2Rlc2NyaXB0aW9uID0gY2xlYW5lZERlc2NyaXB0aW9uO1xuICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gbWFya2VkQWNsKGNsZWFuZWREZXNjcmlwdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZUhhc0RlY29yYXRvcihtZXRob2QpKSB7XG4gICAgICAgICAgICBjb25zdCBtZXRob2REZWNvcmF0b3JzID0gZ2V0Tm9kZURlY29yYXRvcnMobWV0aG9kKTtcbiAgICAgICAgICAgIHJlc3VsdC5kZWNvcmF0b3JzID0gdGhpcy5mb3JtYXREZWNvcmF0b3JzKG1ldGhvZERlY29yYXRvcnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG1ldGhvZC5tb2RpZmllcnMpIHtcbiAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsZXQga2luZHMgPSBtZXRob2QubW9kaWZpZXJzLm1hcChtb2RpZmllciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RpZmllci5raW5kO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBfLmluZGV4T2Yoa2luZHMsIFN5bnRheEtpbmQuU3RhdGljS2V5d29yZCkgIT09IC0xXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmRzID0ga2luZHMuZmlsdGVyKGtpbmQgPT4ga2luZCAhPT0gU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0Lm1vZGlmaWVyS2luZCA9IGtpbmRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIENoZWNrIGZvciBFQ01BU2NyaXB0IFByaXZhdGUgRmllbGRzXG4gICAgICAgIGlmICh0aGlzLmlzUHJpdmF0ZShtZXRob2QpKSB7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdC5tb2RpZmllcktpbmQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kID0gW107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgaGFzQWxyZWFkeVByaXZhdGVMZXl3b3JkID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQubW9kaWZpZXJLaW5kLmZvckVhY2gobW9kaWZpZXJLaW5kID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0FscmVhZHlQcml2YXRlTGV5d29yZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWhhc0FscmVhZHlQcml2YXRlTGV5d29yZCkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5tb2RpZmllcktpbmQucHVzaChTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCByZXN1bHQpO1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuanNkb2N0YWdzICYmIHJlc3VsdC5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3MocmVzdWx0LmFyZ3MsIHJlc3VsdC5qc2RvY3RhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRPdXRwdXQoXG4gICAgICAgIHByb3BlcnR5OiB0cy5Qcm9wZXJ0eURlY2xhcmF0aW9uLFxuICAgICAgICBvdXREZWNvcmF0b3I6IHRzLkRlY29yYXRvcixcbiAgICAgICAgc291cmNlRmlsZT86IHRzLlNvdXJjZUZpbGVcbiAgICApIHtcbiAgICAgICAgbGV0IGluQXJncyA9IG91dERlY29yYXRvci5leHByZXNzaW9uLmFyZ3VtZW50cztcbiAgICAgICAgbGV0IF9yZXR1cm46IGFueSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGluQXJncy5sZW5ndGggPiAwID8gaW5BcmdzWzBdLnRleHQgOiBwcm9wZXJ0eS5uYW1lLnRleHQsXG4gICAgICAgICAgICBkZWZhdWx0VmFsdWU6IHByb3BlcnR5LmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgPyB0aGlzLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShwcm9wZXJ0eS5pbml0aWFsaXplcilcbiAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiAnJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAocHJvcGVydHkuanNEb2MpIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRNYWluQ29tbWVudE9mTm9kZShwcm9wZXJ0eSwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICBjb25zdCBqc2RvY3RhZ3MgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRKU0RvY3MocHJvcGVydHkpO1xuICAgICAgICAgICAgY29uc3QgY2xlYW5lZERlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgX3JldHVybi5yYXdkZXNjcmlwdGlvbiA9IGNsZWFuZWREZXNjcmlwdGlvbjtcbiAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWRBY2woY2xlYW5lZERlc2NyaXB0aW9uKTtcblxuICAgICAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIF9yZXR1cm4pO1xuICAgICAgICAgICAgICAgIF9yZXR1cm4uanNkb2N0YWdzID0gbWFya2VkdGFncyhqc2RvY3RhZ3NbMF0udGFncyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFfcmV0dXJuLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydHkuanNEb2MgJiYgcHJvcGVydHkuanNEb2MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3RGVzY3JpcHRpb24gPSBwcm9wZXJ0eS5qc0RvY1swXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLnJhd2Rlc2NyaXB0aW9uID0gcmF3RGVzY3JpcHRpb247XG4gICAgICAgICAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWRBY2wocmF3RGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfcmV0dXJuLmxpbmUgPSB0aGlzLmdldFBvc2l0aW9uKHByb3BlcnR5LCBzb3VyY2VGaWxlKS5saW5lICsgMTtcblxuICAgICAgICBpZiAocHJvcGVydHkudHlwZSkge1xuICAgICAgICAgICAgX3JldHVybi50eXBlID0gdGhpcy52aXNpdFR5cGUocHJvcGVydHkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaGFuZGxlIE5ld0V4cHJlc3Npb25cbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc05ld0V4cHJlc3Npb24ocHJvcGVydHkuaW5pdGlhbGl6ZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pbml0aWFsaXplci5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLnR5cGUgPSBwcm9wZXJ0eS5pbml0aWFsaXplci5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIF9yZXR1cm47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdEFyZ3VtZW50KGFyZzogdHMuUGFyYW1ldGVyRGVjbGFyYXRpb24pIHtcbiAgICAgICAgbGV0IF9yZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgICAgIG5hbWU6IGFyZy5uYW1lLnRleHQsXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnZpc2l0VHlwZShhcmcpLFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6ICcnXG4gICAgICAgIH07XG4gICAgICAgIGlmIChhcmcuZG90RG90RG90VG9rZW4pIHtcbiAgICAgICAgICAgIF9yZXN1bHQuZG90RG90RG90VG9rZW4gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhcmcucXVlc3Rpb25Ub2tlbikge1xuICAgICAgICAgICAgX3Jlc3VsdC5vcHRpb25hbCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZy50eXBlKSB7XG4gICAgICAgICAgICBpZiAoYXJnLnR5cGUua2luZCkge1xuICAgICAgICAgICAgICAgIGlmICh0cy5pc0Z1bmN0aW9uVHlwZU5vZGUoYXJnLnR5cGUpKSB7XG4gICAgICAgICAgICAgICAgICAgIF9yZXN1bHQuZnVuY3Rpb24gPSBhcmcudHlwZS5wYXJhbWV0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGFyZy50eXBlLnBhcmFtZXRlcnMubWFwKHByb3AgPT4gdGhpcy52aXNpdEFyZ3VtZW50KHByb3ApKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFyZy5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgX3Jlc3VsdC5kZWZhdWx0VmFsdWUgPSB0aGlzLnN0cmluZ2lmeURlZmF1bHRWYWx1ZShhcmcuaW5pdGlhbGl6ZXIpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhhcmcpO1xuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCBfcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3Jlc3VsdDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0SW5wdXRBbmRIb3N0QmluZGluZyhwcm9wZXJ0eSwgaW5EZWNvcmF0b3IsIHNvdXJjZUZpbGU/KSB7XG4gICAgICAgIGNvbnN0IGluQXJncyA9IGluRGVjb3JhdG9yLmV4cHJlc3Npb24uYXJndW1lbnRzO1xuXG4gICAgICAgIGxldCBfcmV0dXJuOiBhbnkgPSB7fTtcblxuICAgICAgICBsZXQgaXNJbnB1dENvbmZpZ1N0cmluZ0xpdGVyYWwgPSBmYWxzZTtcbiAgICAgICAgbGV0IGlzSW5wdXRDb25maWdPYmplY3RMaXRlcmFsRXhwcmVzc2lvbiA9IGZhbHNlO1xuICAgICAgICBsZXQgaGFzUmVxdWlyZWRGaWVsZCA9IGZhbHNlO1xuICAgICAgICBsZXQgaGFzQWxpYXMgPSBmYWxzZTtcblxuICAgICAgICBjb25zdCBnZXRSZXF1aXJlZEZpZWxkID0gKCkgPT5cbiAgICAgICAgICAgIGluQXJnc1swXS5wcm9wZXJ0aWVzLmZpbmQocHJvcGVydHkgPT4gcHJvcGVydHkubmFtZS5lc2NhcGVkVGV4dCA9PT0gJ3JlcXVpcmVkJyk7XG4gICAgICAgIGNvbnN0IGdldEFsaWFzUHJvcGVydHkgPSAoKSA9PlxuICAgICAgICAgICAgaW5BcmdzWzBdLnByb3BlcnRpZXMuZmluZChwcm9wZXJ0eSA9PiBwcm9wZXJ0eS5uYW1lLmVzY2FwZWRUZXh0ID09PSAnYWxpYXMnKTtcblxuICAgICAgICBpZiAoaW5BcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGlzSW5wdXRDb25maWdTdHJpbmdMaXRlcmFsID0gaW5BcmdzWzBdICYmIHRzLmlzU3RyaW5nTGl0ZXJhbChpbkFyZ3NbMF0pO1xuXG4gICAgICAgICAgICBpc0lucHV0Q29uZmlnT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gPVxuICAgICAgICAgICAgICAgIGluQXJnc1swXSAmJiB0cy5pc09iamVjdExpdGVyYWxFeHByZXNzaW9uKGluQXJnc1swXSk7XG5cbiAgICAgICAgICAgIGlmIChpc0lucHV0Q29uZmlnT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24gJiYgaW5BcmdzWzBdLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICBoYXNSZXF1aXJlZEZpZWxkID0gaXNJbnB1dENvbmZpZ09iamVjdExpdGVyYWxFeHByZXNzaW9uICYmICEhZ2V0UmVxdWlyZWRGaWVsZCgpO1xuICAgICAgICAgICAgICAgIGhhc0FsaWFzID0gaXNJbnB1dENvbmZpZ09iamVjdExpdGVyYWxFeHByZXNzaW9uID8gISFnZXRBbGlhc1Byb3BlcnR5KCkgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgIF9yZXR1cm4ucmVxdWlyZWQgPSAhIWdldFJlcXVpcmVkRmllbGQoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgX3JldHVybi5uYW1lID0gaXNJbnB1dENvbmZpZ1N0cmluZ0xpdGVyYWxcbiAgICAgICAgICAgICAgICA/IGluQXJnc1swXS50ZXh0XG4gICAgICAgICAgICAgICAgOiBoYXNBbGlhc1xuICAgICAgICAgICAgICAgICAgPyBnZXRBbGlhc1Byb3BlcnR5KCkuaW5pdGlhbGl6ZXIudGV4dFxuICAgICAgICAgICAgICAgICAgOiBwcm9wZXJ0eS5uYW1lLnRleHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfcmV0dXJuLm5hbWUgPSBwcm9wZXJ0eS5uYW1lLnRleHQ7XG4gICAgICAgIH1cblxuICAgICAgICBfcmV0dXJuLmRlZmF1bHRWYWx1ZSA9IHByb3BlcnR5LmluaXRpYWxpemVyXG4gICAgICAgICAgICA/IHRoaXMuc3RyaW5naWZ5RGVmYXVsdFZhbHVlKHByb3BlcnR5LmluaXRpYWxpemVyKVxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICAgIF9yZXR1cm4uZGVwcmVjYXRlZCA9IGZhbHNlO1xuICAgICAgICBfcmV0dXJuLmRlcHJlY2F0aW9uTWVzc2FnZSA9ICcnO1xuXG4gICAgICAgIGlmIChpbkFyZ3MubGVuZ3RoID4gMCAmJiBpbkFyZ3NbMF0ucHJvcGVydGllcyAmJiBoYXNSZXF1aXJlZEZpZWxkKSB7XG4gICAgICAgICAgICBfcmV0dXJuLm9wdGlvbmFsID0gZ2V0UmVxdWlyZWRGaWVsZCgpLmluaXRpYWxpemVyLmtpbmQgIT09IFN5bnRheEtpbmQuVHJ1ZUtleXdvcmQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIV9yZXR1cm4uZGVzY3JpcHRpb24pIHtcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYykge1xuICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5qc0RvYy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhwcm9wZXJ0eSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgX3JldHVybik7XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcGVydHkuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnQgPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5nZXRNYWluQ29tbWVudE9mTm9kZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xlYW5lZERlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VDb21tZW50KGNvbW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi5yYXdkZXNjcmlwdGlvbiA9IGNsZWFuZWREZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yZXR1cm4uZGVzY3JpcHRpb24gPSBtYXJrZWRBY2woY2xlYW5lZERlc2NyaXB0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBfcmV0dXJuLmxpbmUgPSB0aGlzLmdldFBvc2l0aW9uKHByb3BlcnR5LCBzb3VyY2VGaWxlKS5saW5lICsgMTtcbiAgICAgICAgaWYgKHByb3BlcnR5LnR5cGUpIHtcbiAgICAgICAgICAgIF9yZXR1cm4udHlwZSA9IHRoaXMudmlzaXRUeXBlKHByb3BlcnR5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGhhbmRsZSBOZXdFeHByZXNzaW9uXG4gICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICBpZiAodHMuaXNOZXdFeHByZXNzaW9uKHByb3BlcnR5LmluaXRpYWxpemVyKSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkuaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi50eXBlID0gcHJvcGVydHkuaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbi50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJ5IHRvIGdldCBpbmZlcnJlZCB0eXBlXG4gICAgICAgICAgICBpZiAocHJvcGVydHkuc3ltYm9sKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgc3ltYm9sOiB0cy5TeW1ib2wgPSBwcm9wZXJ0eS5zeW1ib2w7XG4gICAgICAgICAgICAgICAgaWYgKHN5bWJvbC52YWx1ZURlY2xhcmF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN5bWJvbFR5cGUgPSB0aGlzLnR5cGVDaGVja2VyLmdldFR5cGVPZlN5bWJvbEF0TG9jYXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wsXG4gICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2wudmFsdWVEZWNsYXJhdGlvblxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi50eXBlID0gdGhpcy50eXBlQ2hlY2tlci50eXBlVG9TdHJpbmcoc3ltYm9sVHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb3BlcnR5LmtpbmQgPT09IFN5bnRheEtpbmQuU2V0QWNjZXNzb3IpIHtcbiAgICAgICAgICAgIC8vIEZvciBzZXR0ZXIgYWNjZXNzb3IsIGZpbmQgdHlwZSBpbiBmaXJzdCBwYXJhbWV0ZXJcbiAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5wYXJhbWV0ZXJzICYmIHByb3BlcnR5LnBhcmFtZXRlcnMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LnBhcmFtZXRlcnNbMF0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBfcmV0dXJuLnR5cGUgPSB0aGlzLnZpc2l0VHlwZShwcm9wZXJ0eS5wYXJhbWV0ZXJzWzBdLnR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChub2RlSGFzRGVjb3JhdG9yKHByb3BlcnR5KSkge1xuICAgICAgICAgICAgY29uc3QgcHJvcGVydHlEZWNvcmF0b3JzID0gZ2V0Tm9kZURlY29yYXRvcnMocHJvcGVydHkpO1xuICAgICAgICAgICAgX3JldHVybi5kZWNvcmF0b3JzID0gdGhpcy5mb3JtYXREZWNvcmF0b3JzKHByb3BlcnR5RGVjb3JhdG9ycykuZmlsdGVyKFxuICAgICAgICAgICAgICAgIGl0ZW0gPT4gaXRlbS5uYW1lICE9PSAnSW5wdXQnICYmIGl0ZW0ubmFtZSAhPT0gJ0hvc3RCaW5kaW5nJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gX3JldHVybjtcbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0SG9zdExpc3RlbmVyKHByb3BlcnR5LCBob3N0TGlzdGVuZXJEZWNvcmF0b3IsIHNvdXJjZUZpbGU/KSB7XG4gICAgICAgIGxldCBpbkFyZ3MgPSBob3N0TGlzdGVuZXJEZWNvcmF0b3IuZXhwcmVzc2lvbi5hcmd1bWVudHM7XG4gICAgICAgIGxldCBfcmV0dXJuOiBhbnkgPSB7fTtcbiAgICAgICAgX3JldHVybi5uYW1lID0gaW5BcmdzLmxlbmd0aCA+IDAgPyBpbkFyZ3NbMF0udGV4dCA6IHByb3BlcnR5Lm5hbWUudGV4dDtcbiAgICAgICAgX3JldHVybi5hcmdzID0gcHJvcGVydHkucGFyYW1ldGVyc1xuICAgICAgICAgICAgPyBwcm9wZXJ0eS5wYXJhbWV0ZXJzLm1hcChwcm9wID0+IHRoaXMudmlzaXRBcmd1bWVudChwcm9wKSlcbiAgICAgICAgICAgIDogW107XG4gICAgICAgIF9yZXR1cm4uYXJnc0RlY29yYXRvciA9XG4gICAgICAgICAgICBpbkFyZ3MubGVuZ3RoID4gMVxuICAgICAgICAgICAgICAgID8gaW5BcmdzWzFdLmVsZW1lbnRzLm1hcChwcm9wID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvcC50ZXh0O1xuICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICA6IFtdO1xuICAgICAgICBfcmV0dXJuLmRlcHJlY2F0ZWQgPSBmYWxzZTtcbiAgICAgICAgX3JldHVybi5kZXByZWNhdGlvbk1lc3NhZ2UgPSAnJztcbiAgICAgICAgaWYgKHByb3BlcnR5LmpzRG9jKSB7XG4gICAgICAgICAgICBjb25zdCBjb21tZW50ID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0TWFpbkNvbW1lbnRPZk5vZGUocHJvcGVydHksIHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgY29uc3QganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKHByb3BlcnR5KTtcbiAgICAgICAgICAgIGNvbnN0IGNsZWFuZWREZXNjcmlwdGlvbiA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLnBhcnNlQ29tbWVudChjb21tZW50KTtcbiAgICAgICAgICAgIF9yZXR1cm4ucmF3ZGVzY3JpcHRpb24gPSBjbGVhbmVkRGVzY3JpcHRpb247XG4gICAgICAgICAgICBfcmV0dXJuLmRlc2NyaXB0aW9uID0gbWFya2VkQWNsKGNsZWFuZWREZXNjcmlwdGlvbik7XG5cbiAgICAgICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCBfcmV0dXJuKTtcbiAgICAgICAgICAgICAgICBfcmV0dXJuLmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICghX3JldHVybi5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgaWYgKHByb3BlcnR5LmpzRG9jKSB7XG4gICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5LmpzRG9jLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwcm9wZXJ0eS5qc0RvY1swXS5jb21tZW50ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3RGVzY3JpcHRpb24gPSBwcm9wZXJ0eS5qc0RvY1swXS5jb21tZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi5yYXdkZXNjcmlwdGlvbiA9IHJhd0Rlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgX3JldHVybi5kZXNjcmlwdGlvbiA9IG1hcmtlZEFjbChyYXdEZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgX3JldHVybi5saW5lID0gdGhpcy5nZXRQb3NpdGlvbihwcm9wZXJ0eSwgc291cmNlRmlsZSkubGluZSArIDE7XG4gICAgICAgIHJldHVybiBfcmV0dXJuO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5leHBvcnQgY2xhc3MgVHNQcmludGVyVXRpbCB7XG4gICAgcHJpdmF0ZSBwcmludGVyOiB0cy5QcmludGVyO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIoe1xuICAgICAgICAgICAgbmV3TGluZTogdHMuTmV3TGluZUtpbmQuTGluZUZlZWRcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByaW50KG5vZGU6IHRzLk5vZGUpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmludGVyLnByaW50Tm9kZShcbiAgICAgICAgICAgIHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLFxuICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgIHRzLmNyZWF0ZVNvdXJjZUZpbGUoJycsICcnLCB0cy5TY3JpcHRUYXJnZXQuTGF0ZXN0KVxuICAgICAgICApO1xuICAgIH1cbn1cbiIsImltcG9ydCAqIGFzIF8gZnJvbSAnbG9kYXNoJztcblxuaW1wb3J0IHsgdHMsIFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IFRzUHJpbnRlclV0aWwgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi91dGlscy90cy1wcmludGVyLnV0aWwnO1xuXG5pbXBvcnQgSW1wb3J0c1V0aWwgZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMvaW1wb3J0cy51dGlsJztcblxuZXhwb3J0IGNsYXNzIFN5bWJvbEhlbHBlciB7XG4gICAgcHJpdmF0ZSByZWFkb25seSB1bmtub3duID0gJz8/Pyc7XG5cbiAgICBwdWJsaWMgcGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZTogc3RyaW5nLCBzcmNGaWxlPzogdHMuU291cmNlRmlsZSk6IElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0IHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWU6ICcnLFxuICAgICAgICAgICAgdHlwZTogJydcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGxldCBuc01vZHVsZSA9IG5hbWUuc3BsaXQoJy4nKTtcbiAgICAgICAgbGV0IHR5cGUgPSB0aGlzLmdldFR5cGUobmFtZSk7XG5cbiAgICAgICAgaWYgKG5zTW9kdWxlLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdC5ucyA9IG5zTW9kdWxlWzBdO1xuICAgICAgICAgICAgcmVzdWx0Lm5hbWUgPSBuYW1lO1xuICAgICAgICAgICAgcmVzdWx0LnR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHNyY0ZpbGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQuZmlsZSA9IEltcG9ydHNVdGlsLmdldEZpbGVOYW1lT2ZJbXBvcnQobmFtZSwgc3JjRmlsZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmVzdWx0Lm5hbWUgPSBuYW1lO1xuICAgICAgICByZXN1bHQudHlwZSA9IHR5cGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFR5cGUobmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHR5cGU7XG4gICAgICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignY29tcG9uZW50JykgIT09IC0xKSB7XG4gICAgICAgICAgICB0eXBlID0gJ2NvbXBvbmVudCc7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ3BpcGUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHR5cGUgPSAncGlwZSc7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ2NvbnRyb2xsZXInKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnY29udHJvbGxlcic7XG4gICAgICAgIH0gZWxzZSBpZiAobmFtZS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoJ21vZHVsZScpICE9PSAtMSkge1xuICAgICAgICAgICAgdHlwZSA9ICdtb2R1bGUnO1xuICAgICAgICB9IGVsc2UgaWYgKG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdkaXJlY3RpdmUnKSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHR5cGUgPSAnZGlyZWN0aXZlJztcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIG5hbWUudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdpbmplY3RhYmxlJykgIT09IC0xIHx8XG4gICAgICAgICAgICBuYW1lLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignc2VydmljZScpICE9PSAtMVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHR5cGUgPSAnaW5qZWN0YWJsZSc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHR5cGU7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogT3V0cHV0XG4gICAgICogUm91dGVyTW9kdWxlLmZvclJvb3QgMTc5XG4gICAgICovXG4gICAgcHVibGljIGJ1aWxkSWRlbnRpZmllck5hbWUoXG4gICAgICAgIG5vZGU6IHRzLklkZW50aWZpZXIgfCB0cy5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24gfCB0cy5TcHJlYWRFbGVtZW50LFxuICAgICAgICBuYW1lXG4gICAgKSB7XG4gICAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIobm9kZSkgJiYgIXRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7bm9kZS50ZXh0fS4ke25hbWV9YDtcbiAgICAgICAgfVxuXG4gICAgICAgIG5hbWUgPSBuYW1lID8gYC4ke25hbWV9YCA6ICcnO1xuXG4gICAgICAgIGxldCBub2RlTmFtZSA9IHRoaXMudW5rbm93bjtcbiAgICAgICAgaWYgKG5vZGUubmFtZSkge1xuICAgICAgICAgICAgbm9kZU5hbWUgPSBub2RlLm5hbWUudGV4dDtcbiAgICAgICAgfSBlbHNlIGlmIChub2RlLnRleHQpIHtcbiAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS50ZXh0O1xuICAgICAgICB9IGVsc2UgaWYgKG5vZGUuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbi50ZXh0KSB7XG4gICAgICAgICAgICAgICAgbm9kZU5hbWUgPSBub2RlLmV4cHJlc3Npb24udGV4dDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5leHByZXNzaW9uLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRzLmlzQXJyYXlMaXRlcmFsRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gbm9kZS5leHByZXNzaW9uLmVsZW1lbnRzLm1hcChlbCA9PiBlbC50ZXh0KS5qb2luKCcsICcpO1xuICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSA9IGBbJHtub2RlTmFtZX1dYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHMuaXNTcHJlYWRFbGVtZW50KG5vZGUpKSB7XG4gICAgICAgICAgICByZXR1cm4gYC4uLiR7bm9kZU5hbWV9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7dGhpcy5idWlsZElkZW50aWZpZXJOYW1lKG5vZGUuZXhwcmVzc2lvbiwgbm9kZU5hbWUpfSR7bmFtZX1gO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHBhcnNlIGV4cHJlc3Npb25zIHN1Y2ggYXM6XG4gICAgICogeyBwcm92aWRlOiBBUFBfQkFTRV9IUkVGLCB1c2VWYWx1ZTogJy8nIH1cbiAgICAgKiB7IHByb3ZpZGU6ICdEYXRlJywgdXNlRmFjdG9yeTogKGQxLCBkMikgPT4gbmV3IERhdGUoKSwgZGVwczogWydkMScsICdkMiddIH1cbiAgICAgKi9cbiAgICBwdWJsaWMgcGFyc2VQcm92aWRlckNvbmZpZ3VyYXRpb24obm9kZTogdHMuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb24pOiBzdHJpbmcge1xuICAgICAgICBpZiAobm9kZS5raW5kICYmIG5vZGUua2luZCA9PT0gU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbikge1xuICAgICAgICAgICAgLy8gU2VhcmNoIGZvciBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SU1xuICAgICAgICAgICAgLy8gYW5kIGlmIHRydWUsIHJldHVybiB0eXBlOiAnaW50ZXJjZXB0b3InICsgbmFtZVxuICAgICAgICAgICAgbGV0IGludGVyY2VwdG9yTmFtZSwgaGFzSW50ZXJjZXB0b3I7XG4gICAgICAgICAgICBpZiAobm9kZS5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUucHJvcGVydGllcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChub2RlLnByb3BlcnRpZXMsIHByb3BlcnR5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5raW5kICYmIHByb3BlcnR5LmtpbmQgPT09IFN5bnRheEtpbmQuUHJvcGVydHlBc3NpZ25tZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm5hbWUudGV4dCA9PT0gJ3Byb3ZpZGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5pbml0aWFsaXplci50ZXh0ID09PSAnSFRUUF9JTlRFUkNFUFRPUlMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNJbnRlcmNlcHRvciA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5uYW1lLnRleHQgPT09ICd1c2VDbGFzcycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkubmFtZS50ZXh0ID09PSAndXNlRXhpc3RpbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyY2VwdG9yTmFtZSA9IHByb3BlcnR5LmluaXRpYWxpemVyLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaGFzSW50ZXJjZXB0b3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaW50ZXJjZXB0b3JOYW1lO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFRzUHJpbnRlclV0aWwoKS5wcmludChub2RlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgVHNQcmludGVyVXRpbCgpLnByaW50KG5vZGUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogS2luZFxuICAgICAqICAxODEgQ2FsbEV4cHJlc3Npb24gPT4gXCJSb3V0ZXJNb2R1bGUuZm9yUm9vdChhcmdzKVwiXG4gICAgICogICA3MSBJZGVudGlmaWVyICAgICA9PiBcIlJvdXRlck1vZHVsZVwiIFwiVG9kb1N0b3JlXCJcbiAgICAgKiAgICA5IFN0cmluZ0xpdGVyYWwgID0+IFwiLi9hcHAuY29tcG9uZW50LmNzc1wiIFwiLi90YWIuc2Nzc1wiXG4gICAgICovXG4gICAgcHVibGljIHBhcnNlU3ltYm9sRWxlbWVudHMoXG4gICAgICAgIG5vZGU6XG4gICAgICAgICAgICB8IHRzLkNhbGxFeHByZXNzaW9uXG4gICAgICAgICAgICB8IHRzLklkZW50aWZpZXJcbiAgICAgICAgICAgIHwgdHMuU3RyaW5nTGl0ZXJhbFxuICAgICAgICAgICAgfCB0cy5Qcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb25cbiAgICAgICAgICAgIHwgdHMuU3ByZWFkRWxlbWVudFxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIC8vIHBhcnNlIGV4cHJlc3Npb25zIHN1Y2ggYXM6IEFuZ3VsYXJGaXJlTW9kdWxlLmluaXRpYWxpemVBcHAoZmlyZWJhc2VDb25maWcpXG4gICAgICAgIC8vIGlmICh0cy5pc0NhbGxFeHByZXNzaW9uKG5vZGUpICYmIHRzLmlzUHJvcGVydHlBY2Nlc3NFeHByZXNzaW9uKG5vZGUuZXhwcmVzc2lvbikpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHRzLmlzQ2FsbEV4cHJlc3Npb24obm9kZSkgJiYgdHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24obm9kZS5leHByZXNzaW9uKSkgfHxcbiAgICAgICAgICAgICh0cy5pc05ld0V4cHJlc3Npb24obm9kZSkgJiYgdHMuaXNFbGVtZW50QWNjZXNzRXhwcmVzc2lvbihub2RlLmV4cHJlc3Npb24pKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBjbGFzc05hbWUgPSB0aGlzLmJ1aWxkSWRlbnRpZmllck5hbWUobm9kZS5leHByZXNzaW9uKTtcblxuICAgICAgICAgICAgLy8gZnVuY3Rpb24gYXJndW1lbnRzIGNvdWxkIGJlIHJlYWxseSBjb21wbGV4LiBUaGVyZSBhcmUgc29cbiAgICAgICAgICAgIC8vIG1hbnkgdXNlIGNhc2VzIHRoYXQgd2UgY2FuJ3QgaGFuZGxlLiBKdXN0IHByaW50IFwiYXJnc1wiIHRvIGluZGljYXRlXG4gICAgICAgICAgICAvLyB0aGF0IHdlIGhhdmUgYXJndW1lbnRzLlxuXG4gICAgICAgICAgICBsZXQgZnVuY3Rpb25BcmdzID0gbm9kZS5hcmd1bWVudHMubGVuZ3RoID4gMCA/ICdhcmdzJyA6ICcnO1xuICAgICAgICAgICAgbGV0IHRleHQgPSBgJHtjbGFzc05hbWV9KCR7ZnVuY3Rpb25BcmdzfSlgO1xuICAgICAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNQcm9wZXJ0eUFjY2Vzc0V4cHJlc3Npb24obm9kZSkpIHtcbiAgICAgICAgICAgIC8vIHBhcnNlIGV4cHJlc3Npb25zIHN1Y2ggYXM6IFNoYXJlZC5Nb2R1bGVcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkSWRlbnRpZmllck5hbWUobm9kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHMuaXNJZGVudGlmaWVyKG5vZGUpKSB7XG4gICAgICAgICAgICAvLyBwYXJzZSBleHByZXNzaW9ucyBzdWNoIGFzOiBNeUNvbXBvbmVudFxuICAgICAgICAgICAgaWYgKG5vZGUudGV4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9kZS5lc2NhcGVkVGV4dCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBub2RlLmVzY2FwZWRUZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHRzLmlzU3ByZWFkRWxlbWVudChub2RlKSkge1xuICAgICAgICAgICAgLy8gcGFyc2UgZXhwcmVzc2lvbnMgc3VjaCBhczogLi4uTVlBUlJBWVxuICAgICAgICAgICAgLy8gUmVzb2x2ZSBNWUFSUkFZIGluIGltcG9ydHMgb3IgbG9jYWwgZmlsZSB2YXJpYWJsZXMgYWZ0ZXIgZnVsbCBzY2FuLCBqdXN0IHJldHVybiB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGVcbiAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24gJiYgbm9kZS5leHByZXNzaW9uLnRleHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZS5leHByZXNzaW9uLnRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbm9kZS50ZXh0ID8gbm9kZS50ZXh0IDogdGhpcy5wYXJzZVByb3ZpZGVyQ29uZmlndXJhdGlvbihub2RlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBLaW5kXG4gICAgICogIDE3NyBBcnJheUxpdGVyYWxFeHByZXNzaW9uXG4gICAgICogIDEyMiBCb29sZWFuS2V5d29yZFxuICAgICAqICAgIDkgU3RyaW5nTGl0ZXJhbFxuICAgICAqL1xuICAgIHByaXZhdGUgcGFyc2VTeW1ib2xzKFxuICAgICAgICBub2RlOiB0cy5PYmplY3RMaXRlcmFsRWxlbWVudCxcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgZGVjb3JhdG9yVHlwZTogc3RyaW5nXG4gICAgKTogQXJyYXk8c3RyaW5nIHwgYm9vbGVhbj4ge1xuICAgICAgICBsZXQgbG9jYWxOb2RlID0gbm9kZTtcblxuICAgICAgICBpZiAodHMuaXNTaG9ydGhhbmRQcm9wZXJ0eUFzc2lnbm1lbnQobG9jYWxOb2RlKSAmJiBkZWNvcmF0b3JUeXBlICE9PSAndGVtcGxhdGUnKSB7XG4gICAgICAgICAgICBsb2NhbE5vZGUgPSBJbXBvcnRzVXRpbC5maW5kVmFsdWVJbkltcG9ydE9yTG9jYWxWYXJpYWJsZXMoXG4gICAgICAgICAgICAgICAgbm9kZS5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgc3JjRmlsZSxcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JUeXBlXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cy5pc1Nob3J0aGFuZFByb3BlcnR5QXNzaWdubWVudChsb2NhbE5vZGUpICYmIGRlY29yYXRvclR5cGUgPT09ICd0ZW1wbGF0ZScpIHtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBJbXBvcnRzVXRpbC5maW5kVmFsdWVJbkltcG9ydE9yTG9jYWxWYXJpYWJsZXMoXG4gICAgICAgICAgICAgICAgbm9kZS5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgc3JjRmlsZSxcbiAgICAgICAgICAgICAgICBkZWNvcmF0b3JUeXBlXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIFtkYXRhXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIgJiYgdHMuaXNBcnJheUxpdGVyYWxFeHByZXNzaW9uKGxvY2FsTm9kZS5pbml0aWFsaXplcikpIHtcbiAgICAgICAgICAgIHJldHVybiBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMubWFwKHggPT4gdGhpcy5wYXJzZVN5bWJvbEVsZW1lbnRzKHgpKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIChsb2NhbE5vZGUuaW5pdGlhbGl6ZXIgJiYgdHMuaXNTdHJpbmdMaXRlcmFsKGxvY2FsTm9kZS5pbml0aWFsaXplcikpIHx8XG4gICAgICAgICAgICAobG9jYWxOb2RlLmluaXRpYWxpemVyICYmIHRzLmlzVGVtcGxhdGVMaXRlcmFsKGxvY2FsTm9kZS5pbml0aWFsaXplcikpIHx8XG4gICAgICAgICAgICAobG9jYWxOb2RlLmluaXRpYWxpemVyICYmXG4gICAgICAgICAgICAgICAgdHMuaXNQcm9wZXJ0eUFzc2lnbm1lbnQobG9jYWxOb2RlKSAmJlxuICAgICAgICAgICAgICAgIGxvY2FsTm9kZS5pbml0aWFsaXplci50ZXh0KVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBbbG9jYWxOb2RlLmluaXRpYWxpemVyLnRleHRdO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgbG9jYWxOb2RlLmluaXRpYWxpemVyICYmXG4gICAgICAgICAgICBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIua2luZCAmJlxuICAgICAgICAgICAgKGxvY2FsTm9kZS5pbml0aWFsaXplci5raW5kID09PSBTeW50YXhLaW5kLlRydWVLZXl3b3JkIHx8XG4gICAgICAgICAgICAgICAgbG9jYWxOb2RlLmluaXRpYWxpemVyLmtpbmQgPT09IFN5bnRheEtpbmQuRmFsc2VLZXl3b3JkKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiBbbG9jYWxOb2RlLmluaXRpYWxpemVyLmtpbmQgPT09IFN5bnRheEtpbmQuVHJ1ZUtleXdvcmQgPyB0cnVlIDogZmFsc2VdO1xuICAgICAgICB9IGVsc2UgaWYgKGxvY2FsTm9kZS5pbml0aWFsaXplciAmJiB0cy5pc1Byb3BlcnR5QWNjZXNzRXhwcmVzc2lvbihsb2NhbE5vZGUuaW5pdGlhbGl6ZXIpKSB7XG4gICAgICAgICAgICBsZXQgaWRlbnRpZmllciA9IHRoaXMucGFyc2VTeW1ib2xFbGVtZW50cyhsb2NhbE5vZGUuaW5pdGlhbGl6ZXIpO1xuICAgICAgICAgICAgcmV0dXJuIFtpZGVudGlmaWVyXTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGxvY2FsTm9kZS5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgbG9jYWxOb2RlLmluaXRpYWxpemVyLmVsZW1lbnRzICYmXG4gICAgICAgICAgICBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIC8vIE5vZGUgcmVwbGFjZWQgYnkgdHMtc2ltcGxlLWFzdCAmIGtpbmQgPSAyNjVcbiAgICAgICAgICAgIHJldHVybiBsb2NhbE5vZGUuaW5pdGlhbGl6ZXIuZWxlbWVudHMubWFwKHggPT4gdGhpcy5wYXJzZVN5bWJvbEVsZW1lbnRzKHgpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTeW1ib2xEZXBzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBkZWNvcmF0b3JUeXBlOiBzdHJpbmcsXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG11bHRpTGluZT86IGJvb2xlYW5cbiAgICApOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgaWYgKHByb3BzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgbGVuID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgICAgZmlsdGVyZWRQcm9wcyA9IFtdO1xuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocHJvcHNbaV0ubmFtZSAmJiBwcm9wc1tpXS5uYW1lLnRleHQgPT09IGRlY29yYXRvclR5cGUpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFByb3BzLnB1c2gocHJvcHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZpbHRlcmVkUHJvcHMubWFwKHggPT4gdGhpcy5wYXJzZVN5bWJvbHMoeCwgc3JjRmlsZSwgZGVjb3JhdG9yVHlwZSkpLnBvcCgpIHx8IFtdO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTeW1ib2xEZXBzUmF3KFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgIG11bHRpTGluZT86IGJvb2xlYW5cbiAgICApOiBBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+IHtcbiAgICAgICAgcmV0dXJuIHByb3BzLmZpbHRlcihub2RlID0+IG5vZGUubmFtZS50ZXh0ID09PSB0eXBlKTtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQge1xuICAgIG5zPzogYW55O1xuICAgIG5hbWU6IHN0cmluZztcbiAgICBmaWxlPzogc3RyaW5nO1xuICAgIHR5cGU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cbiIsImltcG9ydCB7IFN5bnRheEtpbmQsIHRzIH0gZnJvbSAndHMtbW9ycGgnO1xuaW1wb3J0IHsgZGV0ZWN0SW5kZW50LCBnZXRTdWJzdHJpbmdGcm9tTXVsdGlsaW5lU3RyaW5nIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ2xhc3NIZWxwZXIgfSBmcm9tICcuL2NsYXNzLWhlbHBlcic7XG5pbXBvcnQgeyBJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdCwgU3ltYm9sSGVscGVyIH0gZnJvbSAnLi9zeW1ib2wtaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudEhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgY2xhc3NIZWxwZXI6IENsYXNzSGVscGVyLFxuICAgICAgICBwcml2YXRlIHN5bWJvbEhlbHBlcjogU3ltYm9sSGVscGVyID0gbmV3IFN5bWJvbEhlbHBlcigpXG4gICAgKSB7fVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudENoYW5nZURldGVjdGlvbihcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnY2hhbmdlRGV0ZWN0aW9uJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudEVuY2Fwc3VsYXRpb24oXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdlbmNhcHN1bGF0aW9uJywgc3JjRmlsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFB1cmUoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3B1cmUnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50TmFtZShcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnbmFtZScsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRFeHBvcnRBcyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnZXhwb3J0QXMnLCBzcmNGaWxlKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50SG9zdERpcmVjdGl2ZXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT5cbiAgICApOiBBcnJheTxhbnk+IHtcbiAgICAgICAgY29uc3QgaG9zdERpcmVjdGl2ZVN5bWJvbFBhcnNlZCA9IHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHNSYXcoXG4gICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICdob3N0RGlyZWN0aXZlcydcbiAgICAgICAgKTtcbiAgICAgICAgbGV0IGhvc3REaXJlY3RpdmVTeW1ib2wgPSBudWxsO1xuXG4gICAgICAgIGlmIChob3N0RGlyZWN0aXZlU3ltYm9sUGFyc2VkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGhvc3REaXJlY3RpdmVTeW1ib2wgPSBob3N0RGlyZWN0aXZlU3ltYm9sUGFyc2VkLnBvcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaG9zdERpcmVjdGl2ZVN5bWJvbCAmJlxuICAgICAgICAgICAgaG9zdERpcmVjdGl2ZVN5bWJvbC5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgaG9zdERpcmVjdGl2ZVN5bWJvbC5pbml0aWFsaXplci5lbGVtZW50cyAmJlxuICAgICAgICAgICAgaG9zdERpcmVjdGl2ZVN5bWJvbC5pbml0aWFsaXplci5lbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgaG9zdERpcmVjdGl2ZVN5bWJvbC5pbml0aWFsaXplci5lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmtpbmQgPT09IFN5bnRheEtpbmQuSWRlbnRpZmllcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50LmVzY2FwZWRUZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQua2luZCA9PT0gU3ludGF4S2luZC5PYmplY3RMaXRlcmFsRXhwcmVzc2lvbiAmJlxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnByb3BlcnRpZXMgJiZcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGlyZWN0aXZlOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0czogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eS5uYW1lLmVzY2FwZWRUZXh0ID09PSAnZGlyZWN0aXZlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZERpcmVjdGl2ZS5uYW1lID0gcHJvcGVydHkuaW5pdGlhbGl6ZXIuZXNjYXBlZFRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3BlcnR5Lm5hbWUuZXNjYXBlZFRleHQgPT09ICdpbnB1dHMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplci5lbGVtZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplci5lbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmluaXRpYWxpemVyLmVsZW1lbnRzLmZvckVhY2gocHJvcGVydHlFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZERpcmVjdGl2ZS5pbnB1dHMucHVzaChwcm9wZXJ0eUVsZW1lbnQudGV4dCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvcGVydHkubmFtZS5lc2NhcGVkVGV4dCA9PT0gJ291dHB1dHMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplci5lbGVtZW50cyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5pbml0aWFsaXplci5lbGVtZW50cy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmluaXRpYWxpemVyLmVsZW1lbnRzLmZvckVhY2gocHJvcGVydHlFbGVtZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZERpcmVjdGl2ZS5vdXRwdXRzLnB1c2gocHJvcGVydHlFbGVtZW50LnRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHBhcnNlZERpcmVjdGl2ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRIb3N0KFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+XG4gICAgKTogTWFwPHN0cmluZywgc3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldFN5bWJvbERlcHNPYmplY3QocHJvcHMsICdob3N0Jyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFRhZyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAndGFnJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudElucHV0c01ldGFkYXRhKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnaW5wdXRzJywgc3JjRmlsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldElucHV0U2lnbmFscyhwcm9wcykge1xuICAgICAgICBsZXQgaW5wdXRTaWduYWxzID0gW107XG4gICAgICAgIHByb3BzPy5mb3JFYWNoKChwcm9wLCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZWdleHBJbnB1dCA9IC9pbnB1dCg/OlxcLihyZXF1aXJlZCkpPyg/OjwoW1xcdy1dKyk+KT9cXCgoW1xcdy1dKyk/XFwpLztcbiAgICAgICAgICAgIGNvbnN0IHJlc0lucHV0ID0gcmVnZXhwSW5wdXQuZXhlYyhwcm9wLmRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICBpZiAocmVzSW5wdXQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdJbnB1dCA9IHByb3A7XG4gICAgICAgICAgICAgICAgbmV3SW5wdXQuZGVmYXVsdFZhbHVlID0gcmVzSW5wdXRbcmVzSW5wdXQubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbmV3SW5wdXQucmVxdWlyZWQgPSByZXNJbnB1dFswXT8uaW5jbHVkZXMoJy5yZXF1aXJlZCcpID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlucHV0U2lnbmFscy5wdXNoKG5ld0lucHV0KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVnZXhwTW9kZWwgPSAvbW9kZWwoPzpcXC4ocmVxdWlyZWQpKT8oPzo8KFtcXHctXSspPik/XFwoKFtcXHctXSspP1xcKS87XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzTW9kZWwgPSByZWdleHBNb2RlbC5leGVjKHByb3AuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzTW9kZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3SW5wdXQgPSBwcm9wO1xuICAgICAgICAgICAgICAgICAgICBuZXdJbnB1dC5kZWZhdWx0VmFsdWUgPSByZXNNb2RlbFtyZXNNb2RlbC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgbmV3SW5wdXQucmVxdWlyZWQgPSByZXNNb2RlbFswXT8uaW5jbHVkZXMoJy5yZXF1aXJlZCcpID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dFNpZ25hbHMucHVzaChuZXdJbnB1dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGlucHV0U2lnbmFscztcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0T3V0cHV0U2lnbmFscyhwcm9wcykge1xuICAgICAgICBsZXQgb3V0cHV0U2lnbmFscyA9IFtdO1xuICAgICAgICBwcm9wcz8uZm9yRWFjaCgocHJvcCwgaSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcmVnZXhwID0gL291dHB1dCg/OlxcLihyZXF1aXJlZCkpPyg/OjwoW1xcdy1dKyk+KT9cXCgoW1xcdy1dKyk/XFwpLztcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9IHJlZ2V4cC5leGVjKHByb3AuZGVmYXVsdFZhbHVlKTtcbiAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBuZXdPdXRwdXQgPSBwcm9wO1xuICAgICAgICAgICAgICAgIG5ld091dHB1dC5kZWZhdWx0VmFsdWUgPSByZXNbcmVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgIG5ld091dHB1dC5yZXF1aXJlZCA9IHJlc1swXT8uaW5jbHVkZXMoJy5yZXF1aXJlZCcpID8/IGZhbHNlO1xuICAgICAgICAgICAgICAgIG91dHB1dFNpZ25hbHMucHVzaChuZXdPdXRwdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIG91dHB1dFNpZ25hbHM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFN0YW5kYWxvbmUoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBib29sZWFuIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IG51bGw7XG4gICAgICAgIGNvbnN0IHBhcnNlZERhdGEgPSB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc3RhbmRhbG9uZScsIHNyY0ZpbGUpO1xuICAgICAgICBpZiAocGFyc2VkRGF0YS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IEpTT04ucGFyc2UocGFyc2VkRGF0YVswXSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRUZW1wbGF0ZShcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIGxldCB0ID0gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3RlbXBsYXRlJywgc3JjRmlsZSwgdHJ1ZSkucG9wKCk7XG4gICAgICAgIGlmICh0KSB7XG4gICAgICAgICAgICB0ID0gZGV0ZWN0SW5kZW50KHQsIDApO1xuICAgICAgICAgICAgdCA9IHQucmVwbGFjZSgvXFxuLywgJycpO1xuICAgICAgICAgICAgdCA9IHQucmVwbGFjZSgvICskL2dtLCAnJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFN0eWxlVXJscyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdzdHlsZVVybHMnLCBzcmNGaWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50U3R5bGVVcmwoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3N0eWxlVXJsJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFNoYWRvdyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc2hhZG93Jywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFNjb3BlZChcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc2NvcGVkJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudEFzc2V0c0RpcihcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnYXNzZXRzRGlyJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudEFzc2V0c0RpcnMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNhbml0aXplVXJscyh0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnYXNzZXRzRGlyJywgc3JjRmlsZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRTdHlsZXMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBzdHJpbmdbXSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnc3R5bGVzJywgc3JjRmlsZSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudE1vZHVsZUlkKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdtb2R1bGVJZCcsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRPdXRwdXRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ291dHB1dHMnLCBzcmNGaWxlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50UHJvdmlkZXJzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3Byb3ZpZGVycycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRJbXBvcnRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2ltcG9ydHMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50RW50cnlDb21wb25lbnRzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2VudHJ5Q29tcG9uZW50cycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRWaWV3UHJvdmlkZXJzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8SVBhcnNlRGVlcElkZW50aWZpZXJSZXN1bHQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyXG4gICAgICAgICAgICAuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3ZpZXdQcm92aWRlcnMnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50VGVtcGxhdGVVcmwoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICd0ZW1wbGF0ZVVybCcsIHNyY0ZpbGUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRFeGFtcGxlVXJscyh0ZXh0OiBzdHJpbmcpOiBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgbGV0IGV4YW1wbGVVcmxzTWF0Y2hlcyA9IHRleHQubWF0Y2goLzxleGFtcGxlLXVybD4oLio/KTxcXC9leGFtcGxlLXVybD4vZyk7XG4gICAgICAgIGxldCBleGFtcGxlVXJscyA9IHVuZGVmaW5lZDtcbiAgICAgICAgaWYgKGV4YW1wbGVVcmxzTWF0Y2hlcyAmJiBleGFtcGxlVXJsc01hdGNoZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICBleGFtcGxlVXJscyA9IGV4YW1wbGVVcmxzTWF0Y2hlcy5tYXAoZnVuY3Rpb24gKHZhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWwucmVwbGFjZSgvPFxcLz9leGFtcGxlLXVybD4vZywgJycpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV4YW1wbGVVcmxzO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRDb21wb25lbnRQcmVzZXJ2ZVdoaXRlc3BhY2VzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdwcmVzZXJ2ZVdoaXRlc3BhY2VzJywgc3JjRmlsZSkucG9wKCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldENvbXBvbmVudFNlbGVjdG9yKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdzZWxlY3RvcicsIHNyY0ZpbGUpLnBvcCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcGFyc2VQcm9wZXJ0aWVzKG5vZGU6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPik6IE1hcDxzdHJpbmcsIHN0cmluZz4ge1xuICAgICAgICBsZXQgb2JqID0gbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKTtcbiAgICAgICAgbGV0IHByb3BlcnRpZXMgPSBub2RlLmluaXRpYWxpemVyLnByb3BlcnRpZXMgfHwgW107XG4gICAgICAgIHByb3BlcnRpZXMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIG9iai5zZXQocHJvcC5uYW1lLnRleHQsIHByb3AuaW5pdGlhbGl6ZXIudGV4dCk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gb2JqO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRTeW1ib2xEZXBzT2JqZWN0KFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICB0eXBlOiBzdHJpbmcsXG4gICAgICAgIG11bHRpTGluZT86IGJvb2xlYW5cbiAgICApOiBNYXA8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAgICAgbGV0IGkgPSAwLFxuICAgICAgICAgICAgbGVuID0gcHJvcHMubGVuZ3RoLFxuICAgICAgICAgICAgZmlsdGVyZWRQcm9wcyA9IFtdO1xuXG4gICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICBpZiAocHJvcHNbaV0ubmFtZSAmJiBwcm9wc1tpXS5uYW1lLnRleHQgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFByb3BzLnB1c2gocHJvcHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmaWx0ZXJlZFByb3BzLm1hcCh4ID0+IHRoaXMucGFyc2VQcm9wZXJ0aWVzKHgpKS5wb3AoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0Q29tcG9uZW50SU8oXG4gICAgICAgIGZpbGVuYW1lOiBzdHJpbmcsXG4gICAgICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG5vZGU6IHRzLk5vZGUsXG4gICAgICAgIGZpbGVCb2R5LFxuICAgICAgICBhc3RGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogYW55IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgbGV0IHJlZHVjZWRTb3VyY2UgPSBmaWxlQm9keSA/IGZpbGVCb2R5LnN0YXRlbWVudHMgOiBzb3VyY2VGaWxlLnN0YXRlbWVudHM7XG4gICAgICAgIGxldCByZXMgPSByZWR1Y2VkU291cmNlLnJlZHVjZSgoZGlyZWN0aXZlLCBzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NIZWxwZXIudmlzaXRDbGFzc0RlY2xhcmF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdEZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICByZXR1cm4gcmVzWzBdIHx8IHt9O1xuICAgIH1cblxuICAgIHByaXZhdGUgc2FuaXRpemVVcmxzKHVybHM6IEFycmF5PHN0cmluZz4pOiBBcnJheTxzdHJpbmc+IHtcbiAgICAgICAgcmV0dXJuIHVybHMubWFwKHVybCA9PiB1cmwucmVwbGFjZSgnLi8nLCAnJykpO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIENvbXBvbmVudENhY2hlIHtcbiAgICBwcml2YXRlIGNhY2hlOiBNYXA8c3RyaW5nLCBhbnk+ID0gbmV3IE1hcCgpO1xuXG4gICAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IGFueSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYWNoZS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IENsYXNzSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9jbGFzcy1oZWxwZXInO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9jb21wb25lbnQtaGVscGVyJztcblxuaW1wb3J0IHsgY29tcGlsZXJIb3N0IH0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgRnJhbWV3b3JrRGVwZW5kZW5jaWVzIHtcbiAgICBwdWJsaWMgZmlsZXM6IHN0cmluZ1tdO1xuICAgIHB1YmxpYyBwcm9ncmFtOiB0cy5Qcm9ncmFtO1xuICAgIHB1YmxpYyB0eXBlQ2hlY2tlcjogdHMuVHlwZUNoZWNrZXI7XG4gICAgcHVibGljIGNsYXNzSGVscGVyOiBDbGFzc0hlbHBlcjtcbiAgICBwdWJsaWMgY29tcG9uZW50SGVscGVyOiBDb21wb25lbnRIZWxwZXI7XG4gICAgcHVibGljIHJvdXRlclBhcnNlcjtcblxuICAgIGNvbnN0cnVjdG9yKGZpbGVzOiBzdHJpbmdbXSwgb3B0aW9uczogYW55KSB7XG4gICAgICAgIHRoaXMuZmlsZXMgPSBmaWxlcztcblxuICAgICAgICBjb25zdCB0cmFuc3BpbGVPcHRpb25zID0ge1xuICAgICAgICAgICAgdGFyZ2V0OiB0cy5TY3JpcHRUYXJnZXQuRVM1LFxuICAgICAgICAgICAgbW9kdWxlOiB0cy5Nb2R1bGVLaW5kLkNvbW1vbkpTLFxuICAgICAgICAgICAgdHNjb25maWdEaXJlY3Rvcnk6IG9wdGlvbnMudHNjb25maWdEaXJlY3RvcnksXG4gICAgICAgICAgICBhbGxvd0pzOiB0cnVlXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oXG4gICAgICAgICAgICB0aGlzLmZpbGVzLFxuICAgICAgICAgICAgdHJhbnNwaWxlT3B0aW9ucyxcbiAgICAgICAgICAgIGNvbXBpbGVySG9zdCh0cmFuc3BpbGVPcHRpb25zKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnR5cGVDaGVja2VyID0gdGhpcy5wcm9ncmFtLmdldFR5cGVDaGVja2VyKCk7XG4gICAgICAgIHRoaXMuY2xhc3NIZWxwZXIgPSBuZXcgQ2xhc3NIZWxwZXIodGhpcy50eXBlQ2hlY2tlcik7XG4gICAgICAgIHRoaXMuY29tcG9uZW50SGVscGVyID0gbmV3IENvbXBvbmVudEhlbHBlcih0aGlzLmNsYXNzSGVscGVyKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0cywgU3ludGF4S2luZCB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGNsYXNzIENvZGVHZW5lcmF0b3Ige1xuICAgIHB1YmxpYyBnZW5lcmF0ZShub2RlOiB0cy5Ob2RlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlzaXRBbmRSZWNvZ25pemUobm9kZSwgW10pLmpvaW4oJycpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRBbmRSZWNvZ25pemUobm9kZTogdHMuTm9kZSwgY29kZTogQXJyYXk8c3RyaW5nPiwgZGVwdGggPSAwKTogQXJyYXk8c3RyaW5nPiB7XG4gICAgICAgIHRoaXMucmVjb2duaXplKG5vZGUsIGNvZGUpO1xuICAgICAgICBub2RlLmdldENoaWxkcmVuKCkuZm9yRWFjaChjID0+IHRoaXMudmlzaXRBbmRSZWNvZ25pemUoYywgY29kZSwgZGVwdGggKyAxKSk7XG4gICAgICAgIHJldHVybiBjb2RlO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVjb2duaXplKG5vZGU6IHRzLk5vZGUsIGNvZGU6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgY29uc3QgY29udmVyc2lvbiA9IFRzS2luZENvbnZlcnNpb24uZmluZCh4ID0+IHgua2luZHMuc29tZSh6ID0+IHogPT09IG5vZGUua2luZCkpO1xuXG4gICAgICAgIGlmIChjb252ZXJzaW9uKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb252ZXJzaW9uLm91dHB1dChub2RlKTtcbiAgICAgICAgICAgIHJlc3VsdC5mb3JFYWNoKHRleHQgPT4gdGhpcy5nZW4odGV4dCwgY29kZSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZW4odG9rZW46IHN0cmluZyB8IHVuZGVmaW5lZCwgY29kZTogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgICAgICBpZiAoIXRva2VuKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodG9rZW4gPT09ICdcXG4nKSB7XG4gICAgICAgICAgICBjb2RlLnB1c2goJycpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29kZS5wdXNoKHRva2VuKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuY2xhc3MgVHNLaW5kc1RvVGV4dCB7XG4gICAgY29uc3RydWN0b3IocHVibGljIG91dHB1dDogKG5vZGU6IHRzLk5vZGUpID0+IEFycmF5PHN0cmluZz4sIHB1YmxpYyBraW5kczogQXJyYXk8U3ludGF4S2luZD4pIHt9XG59XG5cbmNvbnN0IFRzS2luZENvbnZlcnNpb246IEFycmF5PFRzS2luZHNUb1RleHQ+ID0gW1xuICAgIG5ldyBUc0tpbmRzVG9UZXh0KFxuICAgICAgICBub2RlID0+IFsnXCInLCBub2RlLnRleHQsICdcIiddLFxuICAgICAgICBbU3ludGF4S2luZC5GaXJzdExpdGVyYWxUb2tlbiwgU3ludGF4S2luZC5JZGVudGlmaWVyXVxuICAgICksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ1wiJywgbm9kZS50ZXh0LCAnXCInXSwgW1N5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gW10sIFtTeW50YXhLaW5kLkFycmF5TGl0ZXJhbEV4cHJlc3Npb25dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnaW1wb3J0JywgJyAnXSwgW1N5bnRheEtpbmQuSW1wb3J0S2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWydmcm9tJywgJyAnXSwgW1N5bnRheEtpbmQuRnJvbUtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnXFxuJywgJ2V4cG9ydCcsICcgJ10sIFtTeW50YXhLaW5kLkV4cG9ydEtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnY2xhc3MnLCAnICddLCBbU3ludGF4S2luZC5DbGFzc0tleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsndGhpcyddLCBbU3ludGF4S2luZC5UaGlzS2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWydjb25zdHJ1Y3RvciddLCBbU3ludGF4S2luZC5Db25zdHJ1Y3RvcktleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnZmFsc2UnXSwgW1N5bnRheEtpbmQuRmFsc2VLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3RydWUnXSwgW1N5bnRheEtpbmQuVHJ1ZUtleXdvcmRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnbnVsbCddLCBbU3ludGF4S2luZC5OdWxsS2V5d29yZF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gW10sIFtTeW50YXhLaW5kLkF0VG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnKyddLCBbU3ludGF4S2luZC5QbHVzVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnID0+ICddLCBbU3ludGF4S2luZC5FcXVhbHNHcmVhdGVyVGhhblRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJygnXSwgW1N5bnRheEtpbmQuT3BlblBhcmVuVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChcbiAgICAgICAgbm9kZSA9PiBbJ3snLCAnICddLFxuICAgICAgICBbU3ludGF4S2luZC5JbXBvcnRDbGF1c2UsIFN5bnRheEtpbmQuT2JqZWN0TGl0ZXJhbEV4cHJlc3Npb25dXG4gICAgKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsneycsICdcXG4nXSwgW1N5bnRheEtpbmQuQmxvY2tdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnfSddLCBbU3ludGF4S2luZC5DbG9zZUJyYWNlVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnKSddLCBbU3ludGF4S2luZC5DbG9zZVBhcmVuVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnWyddLCBbU3ludGF4S2luZC5PcGVuQnJhY2tldFRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ10nXSwgW1N5bnRheEtpbmQuQ2xvc2VCcmFja2V0VG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnOycsICdcXG4nXSwgW1N5bnRheEtpbmQuU2VtaWNvbG9uVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnLCcsICcgJ10sIFtTeW50YXhLaW5kLkNvbW1hVG9rZW5dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnICcsICc6JywgJyAnXSwgW1N5bnRheEtpbmQuQ29sb25Ub2tlbl0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWycuJ10sIFtTeW50YXhLaW5kLkRvdFRva2VuXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbXSwgW1N5bnRheEtpbmQuRG9TdGF0ZW1lbnRdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFtdLCBbU3ludGF4S2luZC5EZWNvcmF0b3JdKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsnID0gJ10sIFtTeW50YXhLaW5kLkZpcnN0QXNzaWdubWVudF0pLFxuICAgIG5ldyBUc0tpbmRzVG9UZXh0KG5vZGUgPT4gWycgJ10sIFtTeW50YXhLaW5kLkZpcnN0UHVuY3R1YXRpb25dKSxcbiAgICBuZXcgVHNLaW5kc1RvVGV4dChub2RlID0+IFsncHJpdmF0ZScsICcgJ10sIFtTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXSksXG4gICAgbmV3IFRzS2luZHNUb1RleHQobm9kZSA9PiBbJ3B1YmxpYycsICcgJ10sIFtTeW50YXhLaW5kLlB1YmxpY0tleXdvcmRdKVxuXTtcbiIsImltcG9ydCB7IGNsZWFuTGlmZWN5Y2xlSG9va3NGcm9tTWV0aG9kcyB9IGZyb20gJy4uLy4uLy4uLy4uL3V0aWxzJztcbmltcG9ydCBDb25maWd1cmF0aW9uIGZyb20gJy4uLy4uLy4uL2NvbmZpZ3VyYXRpb24nO1xuaW1wb3J0IHsgSURlcCB9IGZyb20gJy4uL2RlcGVuZGVuY2llcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IENvbXBvbmVudEhlbHBlciB9IGZyb20gJy4vaGVscGVycy9jb21wb25lbnQtaGVscGVyJztcblxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmV4cG9ydCBjbGFzcyBDb21wb25lbnREZXBGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGhlbHBlcjogQ29tcG9uZW50SGVscGVyKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZShmaWxlOiBhbnksIHNyY0ZpbGU6IGFueSwgbmFtZTogYW55LCBwcm9wczogYW55LCBJTzogYW55KTogSUNvbXBvbmVudERlcCB7XG4gICAgICAgIC8vIGNvbnNvbGUubG9nKHV0aWwuaW5zcGVjdChwcm9wcywgeyBzaG93SGlkZGVuOiB0cnVlLCBkZXB0aDogMTAgfSkpO1xuICAgICAgICBjb25zdCBzb3VyY2VDb2RlID0gc3JjRmlsZS5nZXRUZXh0KCk7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNvdXJjZUNvZGUpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIGNvbnN0IGNvbXBvbmVudERlcDogSUNvbXBvbmVudERlcCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBpZDogJ2NvbXBvbmVudC0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgLy8gYW5pbWF0aW9ucz86IHN0cmluZ1tdOyAvLyBUT0RPXG4gICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IHRoaXMuaGVscGVyLmdldENvbXBvbmVudENoYW5nZURldGVjdGlvbihwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFbmNhcHN1bGF0aW9uKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50RW50cnlDb21wb25lbnRzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGV4cG9ydEFzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRFeHBvcnRBcyhwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICBob3N0OiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRIb3N0KHByb3BzKSxcbiAgICAgICAgICAgIGlucHV0czogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50SW5wdXRzTWV0YWRhdGEocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgLy8gaW50ZXJwb2xhdGlvbj86IHN0cmluZzsgLy8gVE9ETyB3YWl0aW5nIGRvYyBpbmZvc1xuICAgICAgICAgICAgbW9kdWxlSWQ6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudE1vZHVsZUlkKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIG91dHB1dHM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudE91dHB1dHMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcm92aWRlcnMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgLy8gcXVlcmllcz86IERlcHNbXTsgLy8gVE9ET1xuICAgICAgICAgICAgc2VsZWN0b3I6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFNlbGVjdG9yKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHN0eWxlVXJsczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U3R5bGVVcmxzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHN0eWxlczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U3R5bGVzKHByb3BzLCBzcmNGaWxlKSwgLy8gVE9ETyBmaXggYXJnc1xuICAgICAgICAgICAgdGVtcGxhdGU6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFRlbXBsYXRlKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHRlbXBsYXRlVXJsOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRUZW1wbGF0ZVVybChwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICB2aWV3UHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRWaWV3UHJvdmlkZXJzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGhvc3REaXJlY3RpdmVzOiBbLi4udGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50SG9zdERpcmVjdGl2ZXMocHJvcHMpXSxcbiAgICAgICAgICAgIGlucHV0c0NsYXNzOiBJTy5pbnB1dHMsXG4gICAgICAgICAgICBvdXRwdXRzQ2xhc3M6IElPLm91dHB1dHMsXG4gICAgICAgICAgICBwcm9wZXJ0aWVzQ2xhc3M6IElPLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBtZXRob2RzQ2xhc3M6IElPLm1ldGhvZHMsXG5cbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcblxuICAgICAgICAgICAgaG9zdEJpbmRpbmdzOiBJTy5ob3N0QmluZGluZ3MsXG4gICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBJTy5ob3N0TGlzdGVuZXJzLFxuXG4gICAgICAgICAgICBzdGFuZGFsb25lOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRTdGFuZGFsb25lKHByb3BzLCBzcmNGaWxlKSA/IHRydWUgOiBmYWxzZSxcbiAgICAgICAgICAgIGltcG9ydHM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudEltcG9ydHMocHJvcHMsIHNyY0ZpbGUpLFxuXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogSU8uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogSU8ucmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICB0eXBlOiAnY29tcG9uZW50JyxcbiAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUuZ2V0VGV4dCgpLFxuICAgICAgICAgICAgZXhhbXBsZVVybHM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudEV4YW1wbGVVcmxzKHNyY0ZpbGUuZ2V0VGV4dCgpKSxcblxuICAgICAgICAgICAgdGFnOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRUYWcocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgc3R5bGVVcmw6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudFN0eWxlVXJsKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHNoYWRvdzogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U2hhZG93KHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIHNjb3BlZDogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U2NvcGVkKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGFzc2V0c0RpcjogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50QXNzZXRzRGlyKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGFzc2V0c0RpcnM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudEFzc2V0c0RpcnMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgc3R5bGVVcmxzRGF0YTogJycsXG4gICAgICAgICAgICBzdHlsZXNEYXRhOiAnJ1xuICAgICAgICB9O1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuaGVscGVyLmdldENvbXBvbmVudFByZXNlcnZlV2hpdGVzcGFjZXMocHJvcHMsIHNyY0ZpbGUpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgY29tcG9uZW50RGVwLnByZXNlcnZlV2hpdGVzcGFjZXMgPSB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcmVzZXJ2ZVdoaXRlc3BhY2VzKFxuICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgIHNyY0ZpbGVcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUxpZmVDeWNsZUhvb2tzKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAubWV0aG9kc0NsYXNzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKGNvbXBvbmVudERlcC5tZXRob2RzQ2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5qc2RvY3RhZ3MgJiYgSU8uanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5qc2RvY3RhZ3MgPSBJTy5qc2RvY3RhZ3NbMF0udGFncztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uY29uc3RydWN0b3IgJiYgIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvbnN0cnVjdG9ycykge1xuICAgICAgICAgICAgY29tcG9uZW50RGVwLmNvbnN0cnVjdG9yT2JqID0gSU8uY29uc3RydWN0b3I7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmV4dGVuZHMpIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaW1wbGVtZW50cyAmJiBJTy5pbXBsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5pbXBsZW1lbnRzID0gSU8uaW1wbGVtZW50cztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uYWNjZXNzb3JzKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAuYWNjZXNzb3JzID0gSU8uYWNjZXNzb3JzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBjb21wb25lbnREZXAuaW5wdXRzQ2xhc3MgPSBjb21wb25lbnREZXAuaW5wdXRzQ2xhc3MuY29uY2F0KFxuICAgICAgICAgICAgICAgIHRoaXMuaGVscGVyLmdldElucHV0U2lnbmFscyhJTy5wcm9wZXJ0aWVzKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNvbXBvbmVudERlcC5vdXRwdXRzQ2xhc3MgPSBjb21wb25lbnREZXAub3V0cHV0c0NsYXNzLmNvbmNhdChcbiAgICAgICAgICAgICAgICB0aGlzLmhlbHBlci5nZXRPdXRwdXRTaWduYWxzKElPLnByb3BlcnRpZXMpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbXBvbmVudERlcDtcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUNvbXBvbmVudERlcCBleHRlbmRzIElEZXAge1xuICAgIGZpbGU6IGFueTtcbiAgICBjaGFuZ2VEZXRlY3Rpb246IGFueTtcbiAgICBlbmNhcHN1bGF0aW9uOiBhbnk7XG4gICAgZXhwb3J0QXM6IGFueTtcbiAgICBob3N0OiBhbnk7XG4gICAgaW5wdXRzOiBBcnJheTxhbnk+O1xuICAgIG91dHB1dHM6IEFycmF5PGFueT47XG4gICAgcHJvdmlkZXJzOiBBcnJheTxhbnk+O1xuICAgIG1vZHVsZUlkOiBzdHJpbmc7XG4gICAgc2VsZWN0b3I6IHN0cmluZztcbiAgICBzdHlsZVVybHM6IEFycmF5PHN0cmluZz47XG4gICAgc3R5bGVVcmxzRGF0YTogc3RyaW5nO1xuICAgIHN0eWxlczogQXJyYXk8c3RyaW5nPjtcbiAgICBzdHlsZXNEYXRhOiBzdHJpbmc7XG4gICAgdGVtcGxhdGU6IHN0cmluZztcbiAgICB0ZW1wbGF0ZVVybDogQXJyYXk8c3RyaW5nPjtcbiAgICB2aWV3UHJvdmlkZXJzOiBBcnJheTxhbnk+O1xuICAgIGlucHV0c0NsYXNzOiBBcnJheTxhbnk+O1xuICAgIG91dHB1dHNDbGFzczogQXJyYXk8YW55PjtcbiAgICBwcm9wZXJ0aWVzQ2xhc3M6IEFycmF5PGFueT47XG4gICAgbWV0aG9kc0NsYXNzOiBBcnJheTxhbnk+O1xuXG4gICAgZGVwcmVjYXRlZDogYm9vbGVhbjtcbiAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IHN0cmluZztcblxuICAgIHN0YW5kYWxvbmU6IGJvb2xlYW47XG4gICAgaW1wb3J0czogQXJyYXk8YW55PjtcblxuICAgIGVudHJ5Q29tcG9uZW50czogQXJyYXk8YW55PjtcblxuICAgIGhvc3RCaW5kaW5nczogQXJyYXk8YW55PjtcbiAgICBob3N0RGlyZWN0aXZlczogQXJyYXk8YW55PjtcbiAgICBob3N0TGlzdGVuZXJzOiBBcnJheTxhbnk+O1xuXG4gICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAgICByYXdkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHNvdXJjZUNvZGU6IHN0cmluZztcbiAgICBleGFtcGxlVXJsczogQXJyYXk8c3RyaW5nPjtcblxuICAgIGNvbnN0cnVjdG9yT2JqPzogT2JqZWN0O1xuICAgIGpzZG9jdGFncz86IEFycmF5PHN0cmluZz47XG4gICAgZXh0ZW5kcz86IGFueTtcbiAgICBpbXBsZW1lbnRzPzogYW55O1xuICAgIGFjY2Vzc29ycz86IE9iamVjdDtcblxuICAgIHRhZz86IHN0cmluZztcbiAgICBzdHlsZVVybD86IHN0cmluZztcbiAgICBzaGFkb3c/OiBzdHJpbmc7XG4gICAgc2NvcGVkPzogc3RyaW5nO1xuICAgIGFzc2V0c0Rpcj86IHN0cmluZztcbiAgICBhc3NldHNEaXJzPzogQXJyYXk8c3RyaW5nPjtcblxuICAgIHByZXNlcnZlV2hpdGVzcGFjZXM/OiBhbnk7XG59XG4iLCJpbXBvcnQgeyBJRGVwIH0gZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5leHBvcnQgY2xhc3MgQ29udHJvbGxlckRlcEZhY3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKCkge31cblxuICAgIHB1YmxpYyBjcmVhdGUoXG4gICAgICAgIGZpbGU6IGFueSxcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgbmFtZTogc3RyaW5nLFxuICAgICAgICBwcm9wZXJ0aWVzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIElPOiBhbnlcbiAgICApOiBJQ29udHJvbGxlckRlcCB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgY29uc3QgaW5mb3M6IElDb250cm9sbGVyRGVwID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGlkOiAnY29udHJvbGxlci0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgbWV0aG9kc0NsYXNzOiBJTy5tZXRob2RzLFxuICAgICAgICAgICAgdHlwZTogJ2NvbnRyb2xsZXInLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IElPLnJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS50ZXh0LFxuICAgICAgICAgICAgZGVwcmVjYXRlZDogSU8uZGVwcmVjYXRlZCxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogSU8uZGVwcmVjYXRpb25NZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmIChwcm9wZXJ0aWVzICYmIHByb3BlcnRpZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICBpZiAocHJvcGVydGllc1swXS50ZXh0KSB7XG4gICAgICAgICAgICAgICAgaW5mb3MucHJlZml4ID0gcHJvcGVydGllc1swXS50ZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5leHRlbmRzKSB7XG4gICAgICAgICAgICBpbmZvcy5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaW5mb3M7XG4gICAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIElDb250cm9sbGVyRGVwIGV4dGVuZHMgSURlcCB7XG4gICAgZmlsZTogYW55O1xuICAgIHNvdXJjZUNvZGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHJhd2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgcHJlZml4Pzogc3RyaW5nO1xuICAgIG1ldGhvZHNDbGFzczogQXJyYXk8YW55PjtcbiAgICBkZXByZWNhdGVkOiBib29sZWFuO1xuICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogc3RyaW5nO1xuICAgIGV4dGVuZHM/OiBhbnk7XG59XG4iLCJpbXBvcnQgeyBJRGVwIH0gZnJvbSAnLi4vZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgQ29tcG9uZW50SGVscGVyIH0gZnJvbSAnLi9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSAnLi4vLi4vLi4vY29uZmlndXJhdGlvbic7XG5pbXBvcnQgeyBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlscyc7XG5cbmNvbnN0IGNyeXB0byA9IHJlcXVpcmUoJ2NyeXB0bycpO1xuXG5leHBvcnQgY2xhc3MgRGlyZWN0aXZlRGVwRmFjdG9yeSB7XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBoZWxwZXI6IENvbXBvbmVudEhlbHBlcikge31cblxuICAgIHB1YmxpYyBjcmVhdGUoZmlsZTogYW55LCBzcmNGaWxlOiBhbnksIG5hbWU6IGFueSwgcHJvcHM6IGFueSwgSU86IGFueSk6IElEaXJlY3RpdmVEZXAge1xuICAgICAgICBjb25zdCBzb3VyY2VDb2RlID0gc3JjRmlsZS5nZXRUZXh0KCk7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNvdXJjZUNvZGUpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIGNvbnN0IGRpcmVjdGl2ZURlcHM6IElEaXJlY3RpdmVEZXAgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaWQ6ICdkaXJlY3RpdmUtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIHR5cGU6ICdkaXJlY3RpdmUnLFxuICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgcmF3ZGVzY3JpcHRpb246IElPLnJhd2Rlc2NyaXB0aW9uLFxuICAgICAgICAgICAgc291cmNlQ29kZTogc3JjRmlsZS5nZXRUZXh0KCksXG4gICAgICAgICAgICBzZWxlY3RvcjogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U2VsZWN0b3IocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiB0aGlzLmhlbHBlci5nZXRDb21wb25lbnRQcm92aWRlcnMocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgZXhwb3J0QXM6IHRoaXMuaGVscGVyLmdldENvbXBvbmVudEV4cG9ydEFzKHByb3BzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGhvc3REaXJlY3RpdmVzOiBbLi4udGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50SG9zdERpcmVjdGl2ZXMocHJvcHMpXSxcblxuICAgICAgICAgICAgc3RhbmRhbG9uZTogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50U3RhbmRhbG9uZShwcm9wcywgc3JjRmlsZSkgPyB0cnVlIDogZmFsc2UsXG5cbiAgICAgICAgICAgIGlucHV0c0NsYXNzOiB0aGlzLmhlbHBlci5nZXRJbnB1dFNpZ25hbHMoSU8ucHJvcGVydGllcykuY29uY2F0KElPLmlucHV0cyksXG4gICAgICAgICAgICBvdXRwdXRzQ2xhc3M6IHRoaXMuaGVscGVyLmdldElucHV0U2lnbmFscyhJTy5wcm9wZXJ0aWVzKS5jb25jYXQoSU8ub3V0cHV0cyksXG5cbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcblxuICAgICAgICAgICAgaG9zdEJpbmRpbmdzOiBJTy5ob3N0QmluZGluZ3MsXG4gICAgICAgICAgICBob3N0TGlzdGVuZXJzOiBJTy5ob3N0TGlzdGVuZXJzLFxuXG4gICAgICAgICAgICBwcm9wZXJ0aWVzQ2xhc3M6IElPLnByb3BlcnRpZXMsXG4gICAgICAgICAgICBtZXRob2RzQ2xhc3M6IElPLm1ldGhvZHMsXG4gICAgICAgICAgICBleGFtcGxlVXJsczogdGhpcy5oZWxwZXIuZ2V0Q29tcG9uZW50RXhhbXBsZVVybHMoc3JjRmlsZS5nZXRUZXh0KCkpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUxpZmVDeWNsZUhvb2tzKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVEZXBzLm1ldGhvZHNDbGFzcyA9IGNsZWFuTGlmZWN5Y2xlSG9va3NGcm9tTWV0aG9kcyhkaXJlY3RpdmVEZXBzLm1ldGhvZHNDbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmpzZG9jdGFncyAmJiBJTy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGlyZWN0aXZlRGVwcy5qc2RvY3RhZ3MgPSBJTy5qc2RvY3RhZ3NbMF0udGFncztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uZXh0ZW5kcykge1xuICAgICAgICAgICAgZGlyZWN0aXZlRGVwcy5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaW1wbGVtZW50cyAmJiBJTy5pbXBsZW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMuaW1wbGVtZW50cyA9IElPLmltcGxlbWVudHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmNvbnN0cnVjdG9yICYmICFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb25zdHJ1Y3RvcnMpIHtcbiAgICAgICAgICAgIGRpcmVjdGl2ZURlcHMuY29uc3RydWN0b3JPYmogPSBJTy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uYWNjZXNzb3JzKSB7XG4gICAgICAgICAgICBkaXJlY3RpdmVEZXBzLmFjY2Vzc29ycyA9IElPLmFjY2Vzc29ycztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGlyZWN0aXZlRGVwcztcbiAgICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSURpcmVjdGl2ZURlcCBleHRlbmRzIElEZXAge1xuICAgIGZpbGU6IGFueTtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHJhd2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgc291cmNlQ29kZTogc3RyaW5nO1xuXG4gICAgc2VsZWN0b3I6IHN0cmluZztcbiAgICBwcm92aWRlcnM6IEFycmF5PGFueT47XG4gICAgZXhwb3J0QXM6IHN0cmluZztcblxuICAgIGlucHV0c0NsYXNzOiBhbnk7XG4gICAgb3V0cHV0c0NsYXNzOiBhbnk7XG5cbiAgICBzdGFuZGFsb25lOiBib29sZWFuO1xuXG4gICAgZGVwcmVjYXRlZDogYm9vbGVhbjtcbiAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IHN0cmluZztcblxuICAgIGhvc3RCaW5kaW5nczogYW55O1xuICAgIGhvc3REaXJlY3RpdmVzOiBhbnk7XG4gICAgaG9zdExpc3RlbmVyczogYW55O1xuXG4gICAgcHJvcGVydGllc0NsYXNzOiBhbnk7XG4gICAgbWV0aG9kc0NsYXNzOiBhbnk7XG4gICAgZXhhbXBsZVVybHM6IEFycmF5PHN0cmluZz47XG5cbiAgICBjb25zdHJ1Y3Rvck9iaj86IE9iamVjdDtcbiAgICBqc2RvY3RhZ3M/OiBBcnJheTxzdHJpbmc+O1xuICAgIGltcGxlbWVudHM/OiBhbnk7XG4gICAgYWNjZXNzb3JzPzogT2JqZWN0O1xuICAgIGV4dGVuZHM/OiBhbnk7XG59XG4iLCJpbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuZXhwb3J0IGNsYXNzIEpzRG9jSGVscGVyIHtcbiAgICBwdWJsaWMgaGFzSlNEb2NJbnRlcm5hbFRhZyhcbiAgICAgICAgZmlsZW5hbWU6IHN0cmluZyxcbiAgICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSxcbiAgICAgICAgbm9kZTogdHMuTm9kZVxuICAgICk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZUZpbGUuc3RhdGVtZW50cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrU3RhdGVtZW50cyhzb3VyY2VGaWxlLnN0YXRlbWVudHMsIG5vZGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tTdGF0ZW1lbnRzKHN0YXRlbWVudHM6IFJlYWRvbmx5QXJyYXk8dHMuU3RhdGVtZW50Piwgbm9kZTogdHMuTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gc3RhdGVtZW50cy5zb21lKHggPT4gdGhpcy5jaGVja1N0YXRlbWVudCh4LCBub2RlKSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja1N0YXRlbWVudChzdGF0ZW1lbnQ6IHRzLlN0YXRlbWVudCwgbm9kZTogdHMuTm9kZSk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoc3RhdGVtZW50LnBvcyA9PT0gbm9kZS5wb3MgJiYgc3RhdGVtZW50LmVuZCA9PT0gbm9kZS5lbmQpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmpzRG9jICYmIG5vZGUuanNEb2MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrSnNEb2NzKG5vZGUuanNEb2MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tKc0RvY3MoanNEb2NzOiBSZWFkb25seUFycmF5PHRzLkpTRG9jPik6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4ganNEb2NzXG4gICAgICAgICAgICAuZmlsdGVyKHggPT4geC50YWdzICYmIHgudGFncy5sZW5ndGggPiAwKVxuICAgICAgICAgICAgLnNvbWUoeCA9PiB0aGlzLmNoZWNrSnNEb2NUYWdzKHgudGFncykpO1xuICAgIH1cblxuICAgIHByaXZhdGUgY2hlY2tKc0RvY1RhZ3ModGFnczogUmVhZG9ubHlBcnJheTx0cy5KU0RvY1RhZz4pOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRhZ3Muc29tZSh4ID0+IHgudGFnTmFtZSAmJiB4LnRhZ05hbWUudGV4dCA9PT0gJ2ludGVybmFsJyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgU3ltYm9sSGVscGVyLCBJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdCB9IGZyb20gJy4vc3ltYm9sLWhlbHBlcic7XG5pbXBvcnQgeyBDb21wb25lbnRDYWNoZSB9IGZyb20gJy4vY29tcG9uZW50LWhlbHBlcic7XG5pbXBvcnQgeyBEZXBzIH0gZnJvbSAnLi4vLi4vZGVwZW5kZW5jaWVzLmludGVyZmFjZXMnO1xuaW1wb3J0IHsgdHMgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVIZWxwZXIge1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGNhY2hlOiBDb21wb25lbnRDYWNoZSxcbiAgICAgICAgcHJpdmF0ZSBzeW1ib2xIZWxwZXI6IFN5bWJvbEhlbHBlciA9IG5ldyBTeW1ib2xIZWxwZXIoKVxuICAgICkge31cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVQcm92aWRlcnMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAncHJvdmlkZXJzJywgc3JjRmlsZSlcbiAgICAgICAgICAgIC5tYXAocHJvdmlkZXJOYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKHByb3ZpZGVyTmFtZSwgc3JjRmlsZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVDb250cm9sbGVycyhcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlclxuICAgICAgICAgICAgLmdldFN5bWJvbERlcHMocHJvcHMsICdjb250cm9sbGVycycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKHByb3ZpZGVyTmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihwcm92aWRlck5hbWUsIHNyY0ZpbGUpKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0TW9kdWxlRGVjbGFyYXRpb25zKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogRGVwc1tdIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sSGVscGVyLmdldFN5bWJvbERlcHMocHJvcHMsICdkZWNsYXJhdGlvbnMnLCBzcmNGaWxlKS5tYXAobmFtZSA9PiB7XG4gICAgICAgICAgICBsZXQgY29tcG9uZW50ID0gdGhpcy5jYWNoZS5nZXQobmFtZSk7XG5cbiAgICAgICAgICAgIGlmIChjb21wb25lbnQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSwgc3JjRmlsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVFbnRyeUNvbXBvbmVudHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBEZXBzW10ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ2VudHJ5Q29tcG9uZW50cycsIHNyY0ZpbGUpLm1hcChuYW1lID0+IHtcbiAgICAgICAgICAgIGxldCBjb21wb25lbnQgPSB0aGlzLmNhY2hlLmdldChuYW1lKTtcblxuICAgICAgICAgICAgaWYgKGNvbXBvbmVudCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lLCBzcmNGaWxlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjbGVhbkltcG9ydEZvclJvb3RGb3JDaGlsZChuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICBsZXQgbnNNb2R1bGUgPSBuYW1lLnNwbGl0KCcuJyk7XG4gICAgICAgIGlmIChuc01vZHVsZS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBuYW1lID0gbnNNb2R1bGVbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZUltcG9ydHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAnaW1wb3J0cycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5jbGVhbkltcG9ydEZvclJvb3RGb3JDaGlsZChuYW1lKSlcbiAgICAgICAgICAgIC5tYXAobmFtZSA9PiB0aGlzLnN5bWJvbEhlbHBlci5wYXJzZURlZXBJbmRlbnRpZmllcihuYW1lKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZUV4cG9ydHMoXG4gICAgICAgIHByb3BzOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4sXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBBcnJheTxJUGFyc2VEZWVwSWRlbnRpZmllclJlc3VsdD4ge1xuICAgICAgICByZXR1cm4gdGhpcy5zeW1ib2xIZWxwZXJcbiAgICAgICAgICAgIC5nZXRTeW1ib2xEZXBzKHByb3BzLCAnZXhwb3J0cycsIHNyY0ZpbGUpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy5zeW1ib2xIZWxwZXIucGFyc2VEZWVwSW5kZW50aWZpZXIobmFtZSwgc3JjRmlsZSkpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVJbXBvcnRzUmF3KFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKTogQXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzUmF3KHByb3BzLCAnaW1wb3J0cycpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVJZChcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0PiB7XG4gICAgICAgIGxldCBfaWQgPSB0aGlzLnN5bWJvbEhlbHBlci5nZXRTeW1ib2xEZXBzKHByb3BzLCAnaWQnLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGlkO1xuICAgICAgICBpZiAoX2lkLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgaWQgPSBfaWRbMF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXRNb2R1bGVTY2hlbWFzKFxuICAgICAgICBwcm9wczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlXG4gICAgKSB7XG4gICAgICAgIGxldCBzY2hlbWFzID0gdGhpcy5zeW1ib2xIZWxwZXIuZ2V0U3ltYm9sRGVwcyhwcm9wcywgJ3NjaGVtYXMnLCBzcmNGaWxlKTtcbiAgICAgICAgcmV0dXJuIHNjaGVtYXM7XG4gICAgfVxuXG4gICAgcHVibGljIGdldE1vZHVsZUJvb3RzdHJhcChcbiAgICAgICAgcHJvcHM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgc3JjRmlsZTogdHMuU291cmNlRmlsZVxuICAgICk6IEFycmF5PElQYXJzZURlZXBJZGVudGlmaWVyUmVzdWx0PiB7XG4gICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEhlbHBlclxuICAgICAgICAgICAgLmdldFN5bWJvbERlcHMocHJvcHMsICdib290c3RyYXAnLCBzcmNGaWxlKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuc3ltYm9sSGVscGVyLnBhcnNlRGVlcEluZGVudGlmaWVyKG5hbWUsIHNyY0ZpbGUpKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuaW1wb3J0IHsgSURlcCB9IGZyb20gJy4uL2RlcGVuZGVuY2llcy5pbnRlcmZhY2VzJztcbmltcG9ydCB7IE1vZHVsZUhlbHBlciB9IGZyb20gJy4vaGVscGVycy9tb2R1bGUtaGVscGVyJztcblxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmV4cG9ydCBjbGFzcyBNb2R1bGVEZXBGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG1vZHVsZUhlbHBlcjogTW9kdWxlSGVscGVyKSB7fVxuXG4gICAgcHVibGljIGNyZWF0ZShcbiAgICAgICAgZmlsZTogYW55LFxuICAgICAgICBzcmNGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgICAgICBuYW1lOiBzdHJpbmcsXG4gICAgICAgIHByb3BlcnRpZXM6IFJlYWRvbmx5QXJyYXk8dHMuT2JqZWN0TGl0ZXJhbEVsZW1lbnRMaWtlPixcbiAgICAgICAgSU86IGFueVxuICAgICk6IElNb2R1bGVEZXAge1xuICAgICAgICBjb25zdCBzb3VyY2VDb2RlID0gc3JjRmlsZS5nZXRUZXh0KCk7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBjcnlwdG8uY3JlYXRlSGFzaCgnc2hhNTEyJykudXBkYXRlKHNvdXJjZUNvZGUpLmRpZ2VzdCgnaGV4Jyk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaWQ6ICdtb2R1bGUtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIG5naWQ6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZUlkKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgcHJvdmlkZXJzOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVQcm92aWRlcnMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBkZWNsYXJhdGlvbnM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZURlY2xhcmF0aW9ucyhwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGNvbnRyb2xsZXJzOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVDb250cm9sbGVycyhwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlRW50cnlDb21wb25lbnRzKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgaW1wb3J0czogdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlSW1wb3J0cyhwcm9wZXJ0aWVzLCBzcmNGaWxlKSxcbiAgICAgICAgICAgIGV4cG9ydHM6IHRoaXMubW9kdWxlSGVscGVyLmdldE1vZHVsZUV4cG9ydHMocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICBzY2hlbWFzOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVTY2hlbWFzKHByb3BlcnRpZXMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgYm9vdHN0cmFwOiB0aGlzLm1vZHVsZUhlbHBlci5nZXRNb2R1bGVCb290c3RyYXAocHJvcGVydGllcywgc3JjRmlsZSksXG4gICAgICAgICAgICB0eXBlOiAnbW9kdWxlJyxcbiAgICAgICAgICAgIHJhd2Rlc2NyaXB0aW9uOiBJTy5yYXdkZXNjcmlwdGlvbixcbiAgICAgICAgICAgIG1ldGhvZHM6IElPLm1ldGhvZHMsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogSU8uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLnRleHQsXG4gICAgICAgICAgICBkZXByZWNhdGVkOiBJTy5kZXByZWNhdGVkLFxuICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiBJTy5kZXByZWNhdGlvbk1lc3NhZ2VcbiAgICAgICAgfSBhcyBJTW9kdWxlRGVwO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJTW9kdWxlRGVwIGV4dGVuZHMgSURlcCB7XG4gICAgZmlsZTogYW55O1xuICAgIHByb3ZpZGVyczogQXJyYXk8YW55PjtcbiAgICBkZWNsYXJhdGlvbnM6IEFycmF5PGFueT47XG4gICAgY29udHJvbGxlcnM6IEFycmF5PGFueT47XG4gICAgZW50cnlDb21wb25lbnRzOiBBcnJheTxhbnk+O1xuICAgIGltcG9ydHM6IEFycmF5PGFueT47XG4gICAgZXhwb3J0czogQXJyYXk8YW55PjtcbiAgICBib290c3RyYXA6IGFueTtcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHJhd2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgc291cmNlQ29kZTogc3RyaW5nO1xuICAgIG1ldGhvZHM6IGFueTtcbn1cbiIsImltcG9ydCB7IElEZXAgfSBmcm9tICcuLi9kZXBlbmRlbmNpZXMuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5cbmV4cG9ydCBjbGFzcyBFbnRpdHlEZXBGYWN0b3J5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHt9XG5cbiAgICBwdWJsaWMgY3JlYXRlKFxuICAgICAgICBmaWxlOiBhbnksXG4gICAgICAgIHNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsXG4gICAgICAgIG5hbWU6IHN0cmluZyxcbiAgICAgICAgcHJvcGVydGllczogUmVhZG9ubHlBcnJheTx0cy5PYmplY3RMaXRlcmFsRWxlbWVudExpa2U+LFxuICAgICAgICBJTzogYW55XG4gICAgKTogSUVudGl0eURlcCB7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgY29uc3QgaW5mb3M6IElFbnRpdHlEZXAgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgaWQ6ICdjb250cm9sbGVyLScgKyBuYW1lICsgJy0nICsgaGFzaCxcbiAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICB0eXBlOiAnZW50aXR5JyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBJTy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHJhd2Rlc2NyaXB0aW9uOiBJTy5yYXdkZXNjcmlwdGlvbixcbiAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUudGV4dCxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgIHByb3BlcnRpZXM6IElPLnByb3BlcnRpZXNcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGluZm9zO1xuICAgIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBJRW50aXR5RGVwIGV4dGVuZHMgSURlcCB7XG4gICAgZmlsZTogYW55O1xuICAgIHNvdXJjZUNvZGU6IHN0cmluZztcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nO1xuICAgIHJhd2Rlc2NyaXB0aW9uOiBzdHJpbmc7XG4gICAgZGVwcmVjYXRlZDogYm9vbGVhbjtcbiAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IHN0cmluZztcbiAgICBwcm9wZXJ0aWVzOiBBcnJheTxhbnk+O1xufVxuIiwiaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcblxuaW1wb3J0ICogYXMgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IHsgUHJvamVjdCwgdHMsIFN5bnRheEtpbmQgfSBmcm9tICd0cy1tb3JwaCc7XG5cbmltcG9ydCB7IElzS2luZFR5cGUsIGtpbmRUb1R5cGUgfSBmcm9tICcuLi8uLi91dGlscy9raW5kLXRvLXR5cGUnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vLi4vdXRpbHMvbG9nZ2VyJztcbmltcG9ydCB7IGNsZWFuTGlmZWN5Y2xlSG9va3NGcm9tTWV0aG9kcywgbWFya2VkdGFncywgbWVyZ2VUYWdzQW5kQXJncyB9IGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBDb21wb25lbnRzVHJlZUVuZ2luZSBmcm9tICcuLi9lbmdpbmVzL2NvbXBvbmVudHMtdHJlZS5lbmdpbmUnO1xuXG5pbXBvcnQgeyBGcmFtZXdvcmtEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2ZyYW1ld29yay1kZXBlbmRlbmNpZXMnO1xuXG5pbXBvcnQgSW1wb3J0c1V0aWwgZnJvbSAnLi4vLi4vdXRpbHMvaW1wb3J0cy51dGlsJztcblxuaW1wb3J0IHtcbiAgICBnZXRNb2R1bGVXaXRoUHJvdmlkZXJzLFxuICAgIGlzSWdub3JlLFxuICAgIGlzTW9kdWxlV2l0aFByb3ZpZGVycyxcbiAgICBKc2RvY1BhcnNlclV0aWxcbn0gZnJvbSAnLi4vLi4vdXRpbHMnO1xuXG5pbXBvcnQgRXh0ZW5kc01lcmdlciBmcm9tICcuLi8uLi91dGlscy9leHRlbmRzLW1lcmdlci51dGlsJztcblxuaW1wb3J0IFJvdXRlclBhcnNlclV0aWwgZnJvbSAnLi4vLi4vdXRpbHMvcm91dGVyLXBhcnNlci51dGlsJztcblxuaW1wb3J0IHsgQ29kZUdlbmVyYXRvciB9IGZyb20gJy4vYW5ndWxhci9jb2RlLWdlbmVyYXRvcic7XG5cbmltcG9ydCB7IENvbXBvbmVudERlcEZhY3RvcnkgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9jb21wb25lbnQtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgQ29udHJvbGxlckRlcEZhY3RvcnkgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9jb250cm9sbGVyLWRlcC5mYWN0b3J5JztcbmltcG9ydCB7IERpcmVjdGl2ZURlcEZhY3RvcnkgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9kaXJlY3RpdmUtZGVwLmZhY3RvcnknO1xuaW1wb3J0IHsgQ29tcG9uZW50Q2FjaGUgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgSnNEb2NIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2pzLWRvYy1oZWxwZXInO1xuaW1wb3J0IHsgTW9kdWxlSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9tb2R1bGUtaGVscGVyJztcbmltcG9ydCB7IFN5bWJvbEhlbHBlciB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvc3ltYm9sLWhlbHBlcic7XG5pbXBvcnQgeyBNb2R1bGVEZXBGYWN0b3J5IH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvbW9kdWxlLWRlcC5mYWN0b3J5JztcbmltcG9ydCB7IEVudGl0eURlcEZhY3RvcnkgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9lbnRpdHktZGVwLmZhY3RvcnknO1xuXG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuLi9jb25maWd1cmF0aW9uJztcblxuaW1wb3J0IHtcbiAgICBJRGVwLFxuICAgIElFbnVtRGVjRGVwLFxuICAgIElGdW5jdGlvbkRlY0RlcCxcbiAgICBJSW5qZWN0YWJsZURlcCxcbiAgICBJSW50ZXJmYWNlRGVwLFxuICAgIElQaXBlRGVwLFxuICAgIElUeXBlQWxpYXNEZWNEZXBcbn0gZnJvbSAnLi9hbmd1bGFyL2RlcGVuZGVuY2llcy5pbnRlcmZhY2VzJztcblxuaW1wb3J0IHsgdjQgYXMgdXVpZHY0IH0gZnJvbSAndXVpZCc7XG5pbXBvcnQgeyBnZXROb2RlRGVjb3JhdG9ycywgbm9kZUhhc0RlY29yYXRvciB9IGZyb20gJy4uLy4uL3V0aWxzL25vZGUudXRpbCc7XG5pbXBvcnQgeyBtYXJrZWRBY2wgfSBmcm9tICcuLi8uLi91dGlscy9tYXJrZWQuYWNsJztcblxuY29uc3QgY3J5cHRvID0gcmVxdWlyZSgnY3J5cHRvJyk7XG5jb25zdCBwcm9qZWN0ID0gbmV3IFByb2plY3QoKTtcblxuLy8gVHlwZVNjcmlwdCByZWZlcmVuY2UgOiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvYmxvYi9tYXN0ZXIvbGliL3R5cGVzY3JpcHQuZC50c1xuXG5leHBvcnQgY2xhc3MgQW5ndWxhckRlcGVuZGVuY2llcyBleHRlbmRzIEZyYW1ld29ya0RlcGVuZGVuY2llcyB7XG4gICAgcHJpdmF0ZSBlbmdpbmU6IGFueTtcbiAgICBwcml2YXRlIGNhY2hlOiBDb21wb25lbnRDYWNoZSA9IG5ldyBDb21wb25lbnRDYWNoZSgpO1xuICAgIHByaXZhdGUgbW9kdWxlSGVscGVyID0gbmV3IE1vZHVsZUhlbHBlcih0aGlzLmNhY2hlKTtcbiAgICBwcml2YXRlIGpzRG9jSGVscGVyID0gbmV3IEpzRG9jSGVscGVyKCk7XG4gICAgcHJpdmF0ZSBzeW1ib2xIZWxwZXIgPSBuZXcgU3ltYm9sSGVscGVyKCk7XG4gICAgcHJpdmF0ZSBqc2RvY1BhcnNlclV0aWwgPSBuZXcgSnNkb2NQYXJzZXJVdGlsKCk7XG5cbiAgICBjb25zdHJ1Y3RvcihmaWxlczogc3RyaW5nW10sIG9wdGlvbnM6IGFueSkge1xuICAgICAgICBzdXBlcihmaWxlcywgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldERlcGVuZGVuY2llcygpIHtcbiAgICAgICAgbGV0IGRlcHMgPSB7XG4gICAgICAgICAgICBhbGlhc2VzOiB7fSxcbiAgICAgICAgICAgIG1vZHVsZXM6IFtdLFxuICAgICAgICAgICAgbW9kdWxlc0ZvckdyYXBoOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgICAgICAgY29udHJvbGxlcnM6IFtdLFxuICAgICAgICAgICAgZW50aXRpZXM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtdLFxuICAgICAgICAgICAgaW50ZXJjZXB0b3JzOiBbXSxcbiAgICAgICAgICAgIGd1YXJkczogW10sXG4gICAgICAgICAgICBwaXBlczogW10sXG4gICAgICAgICAgICBkaXJlY3RpdmVzOiBbXSxcbiAgICAgICAgICAgIHJvdXRlczogW10sXG4gICAgICAgICAgICBjbGFzc2VzOiBbXSxcbiAgICAgICAgICAgIGludGVyZmFjZXM6IFtdLFxuICAgICAgICAgICAgdHlwZXNjcmlwdEltcG9ydHM6IFtdLFxuICAgICAgICAgICAgbWlzY2VsbGFuZW91czoge1xuICAgICAgICAgICAgICAgIHZhcmlhYmxlczogW10sXG4gICAgICAgICAgICAgICAgZnVuY3Rpb25zOiBbXSxcbiAgICAgICAgICAgICAgICB0eXBlYWxpYXNlczogW10sXG4gICAgICAgICAgICAgICAgZW51bWVyYXRpb25zOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJvdXRlc1RyZWU6IHVuZGVmaW5lZFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHNvdXJjZUZpbGVzID0gdGhpcy5wcm9ncmFtLmdldFNvdXJjZUZpbGVzKCkgfHwgW107XG5cbiAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5zY2FubmVkRmlsZXMgPSBzb3VyY2VGaWxlcztcblxuICAgICAgICBzb3VyY2VGaWxlcy5tYXAoKGZpbGU6IHRzLlNvdXJjZUZpbGUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gZmlsZS5maWxlTmFtZTtcblxuICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPT09ICcudHMnIHx8IHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPT09ICcudHN4Jykge1xuICAgICAgICAgICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFySlNQcm9qZWN0ICYmIHBhdGguZXh0bmFtZShmaWxlUGF0aCkgPT09ICcuanMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdwYXJzaW5nJywgZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNvdXJjZUZpbGVEZWNvcmF0b3JzKGZpbGUsIGRlcHMpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoLmxhc3RJbmRleE9mKCcuZC50cycpID09PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGgubGFzdEluZGV4T2YoJ3NwZWMudHMnKSA9PT0gLTFcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygncGFyc2luZycsIGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VHlwZXNjcmlwdEV4cG9ydHNBbGlhc2VzKGZpbGUsIGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRUeXBlc2NyaXB0SW1wb3J0c0FsaWFzZXMoZmlsZSwgZGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFNvdXJjZUZpbGVEZWNvcmF0b3JzKGZpbGUsIGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZGVwcztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW5kIG9mIGZpbGUgc2Nhbm5pbmdcbiAgICAgICAgLy8gVHJ5IG1lcmdpbmcgaW5zaWRlIHRoZSBzYW1lIGZpbGUgZGVjbGFyYXRlZCB2YXJpYWJsZXMgJiBtb2R1bGVzIHdpdGggaW1wb3J0cyB8IGV4cG9ydHMgfCBkZWNsYXJhdGlvbnMgfCBwcm92aWRlcnNcblxuICAgICAgICBpZiAoZGVwcy5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBkZXBzLm1pc2NlbGxhbmVvdXMudmFyaWFibGVzLmZvckVhY2goX3ZhcmlhYmxlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgbmV3VmFyID0gW107XG5cbiAgICAgICAgICAgICAgICAvLyBsaW5rIC4uLlZBUiB0byBWQVIgdmFsdWVzLCByZWN1cnNpdmVseVxuICAgICAgICAgICAgICAgICgoX3ZhciwgX25ld1ZhcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXRUeXBlIHByIHJlY29uc3RydWlyZS4uLi5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudHNNYXRjaGVyID0gdmFyaWFiZWxUb1JlcGxhY2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmVsVG9SZXBsYWNlLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhYmVsVG9SZXBsYWNlLmluaXRpYWxpemVyLmVsZW1lbnRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YXJpYWJlbFRvUmVwbGFjZS5pbml0aWFsaXplci5lbGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJlbFRvUmVwbGFjZS5pbml0aWFsaXplci5lbGVtZW50cy5mb3JFYWNoKGVsZW1lbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpcmVjdCB2YWx1ZSAtPiBLaW5kIDc5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5raW5kID09PSBTeW50YXhLaW5kLklkZW50aWZpZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3VmFyLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZWxlbWVudC50ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy5zeW1ib2xIZWxwZXIuZ2V0VHlwZShlbGVtZW50LnRleHQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBfdmFyaWFibGUgaXMgQXJyYXlMaXRlcmFsRXhwcmVzc2lvbiAyMDNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaGFzIFNwcmVhZEVsZW1lbnRzIGluIGhpcyBlbGVtZW50c1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIHRoZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQua2luZCA9PT0gU3ludGF4S2luZC5TcHJlYWRFbGVtZW50ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZXhwcmVzc2lvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IGRlcHMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMuZmluZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGUubmFtZSA9PT0gZWxlbWVudC5leHByZXNzaW9uLnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50c01hdGNoZXIoZWwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzTWF0Y2hlcihfdmFyKTtcbiAgICAgICAgICAgICAgICB9KShfdmFyaWFibGUsIG5ld1Zhcik7XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvbkxpbmsgPSBtb2QgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzID0gKGluaXRpYWxBcnJheSwgX3ZhcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4VG9DbGVhbiA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbmRWYXJpYWJsZUluQXJyYXkgPSAoZWwsIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsLm5hbWUgPT09IF92YXIubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleFRvQ2xlYW4gPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQXJyYXkuZm9yRWFjaChmaW5kVmFyaWFibGVJbkFycmF5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFuIGluZGV4ZXMgdG8gcmVwbGFjZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdGlhbEFycmF5LnNwbGljZShpbmRleFRvQ2xlYW4sIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB2YXJpYWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Zhci5mb3JFYWNoKG5ld0VsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBfLmZpbmQoaW5pdGlhbEFycmF5LCB7IG5hbWU6IG5ld0VsZS5uYW1lIH0pID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsQXJyYXkucHVzaChuZXdFbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLmltcG9ydHMsIF92YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLmV4cG9ydHMsIF92YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLmNvbnRyb2xsZXJzLCBfdmFyaWFibGUpO1xuICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKG1vZC5kZWNsYXJhdGlvbnMsIF92YXJpYWJsZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MobW9kLnByb3ZpZGVycywgX3ZhcmlhYmxlKTtcbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgZGVwcy5tb2R1bGVzLmZvckVhY2gob25MaW5rKTtcbiAgICAgICAgICAgICAgICBkZXBzLm1vZHVsZXNGb3JHcmFwaC5mb3JFYWNoKG9uTGluayk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiBvbmUgdGhpbmcgZXh0ZW5kcyBhbm90aGVyLCBtZXJnZSB0aGVtLCBvbmx5IGZvciBpbnRlcm5hbCBzb3VyY2VzXG4gICAgICAgICAqIC0gY2xhc3Nlc1xuICAgICAgICAgKiAtIGNvbXBvbmVudHNcbiAgICAgICAgICogLSBpbmplY3RhYmxlc1xuICAgICAgICAgKiAtIGRpcmVjdGl2ZXNcbiAgICAgICAgICogZm9yXG4gICAgICAgICAqIC0gaW5wdXRzXG4gICAgICAgICAqIC0gb3V0cHV0c1xuICAgICAgICAgKiAtIHByb3BlcnRpZXNcbiAgICAgICAgICogLSBtZXRob2RzXG4gICAgICAgICAqL1xuICAgICAgICBkZXBzID0gRXh0ZW5kc01lcmdlci5tZXJnZShkZXBzKTtcblxuICAgICAgICAvLyBSb3V0ZXJQYXJzZXJVdGlsLnByaW50TW9kdWxlc1JvdXRlcygpO1xuICAgICAgICAvLyBSb3V0ZXJQYXJzZXJVdGlsLnByaW50Um91dGVzKCk7XG5cbiAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5saW5rTW9kdWxlc0FuZFJvdXRlcygpO1xuICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5jb25zdHJ1Y3RNb2R1bGVzVHJlZSgpO1xuXG4gICAgICAgICAgICBkZXBzLnJvdXRlc1RyZWUgPSBSb3V0ZXJQYXJzZXJVdGlsLmNvbnN0cnVjdFJvdXRlc1RyZWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkZXBzO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc0NsYXNzKG5vZGUsIGZpbGUsIHNyY0ZpbGUsIG91dHB1dFN5bWJvbHMsIGZpbGVCb2R5LCBhc3RGaWxlKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldFN5bWJvbGVOYW1lKG5vZGUpO1xuICAgICAgICBjb25zdCBJTyA9IHRoaXMuZ2V0Q2xhc3NJTyhmaWxlLCBzcmNGaWxlLCBub2RlLCBmaWxlQm9keSwgYXN0RmlsZSk7XG4gICAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgY29uc3QgaGFzaCA9IGNyeXB0by5jcmVhdGVIYXNoKCdzaGE1MTInKS51cGRhdGUoc291cmNlQ29kZSkuZGlnZXN0KCdoZXgnKTtcbiAgICAgICAgY29uc3QgZGVwczogYW55ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGlkOiAnY2xhc3MtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgIHR5cGU6ICdjbGFzcycsXG4gICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLmdldFRleHQoKVxuICAgICAgICB9O1xuICAgICAgICBsZXQgZXhjbHVkZUZyb21DbGFzc0FycmF5ID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKElPLmNvbnN0cnVjdG9yICYmICFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb25zdHJ1Y3RvcnMpIHtcbiAgICAgICAgICAgIGRlcHMuY29uc3RydWN0b3JPYmogPSBJTy5jb25zdHJ1Y3RvcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaW5wdXRzKSB7XG4gICAgICAgICAgICBkZXBzLmlucHV0c0NsYXNzID0gSU8uaW5wdXRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5vdXRwdXRzKSB7XG4gICAgICAgICAgICBkZXBzLm91dHB1dHNDbGFzcyA9IElPLm91dHB1dHM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgIGRlcHMucHJvcGVydGllcyA9IElPLnByb3BlcnRpZXM7XG4gICAgICAgICAgICBkZXBzLmlucHV0c0NsYXNzID0gZGVwcy5pbnB1dHNDbGFzc1xuICAgICAgICAgICAgICAgID8gZGVwcy5pbnB1dHNDbGFzcy5jb25jYXQodGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0SW5wdXRTaWduYWxzKElPLnByb3BlcnRpZXMpKVxuICAgICAgICAgICAgICAgIDogdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0SW5wdXRTaWduYWxzKElPLnByb3BlcnRpZXMpO1xuICAgICAgICAgICAgZGVwcy5vdXRwdXRzQ2xhc3MgPSBkZXBzLm91dHB1dHNDbGFzc1xuICAgICAgICAgICAgICAgID8gZGVwcy5vdXRwdXRzQ2xhc3MuY29uY2F0KHRoaXMuY29tcG9uZW50SGVscGVyLmdldE91dHB1dFNpZ25hbHMoSU8ucHJvcGVydGllcykpXG4gICAgICAgICAgICAgICAgOiB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRPdXRwdXRTaWduYWxzKElPLnByb3BlcnRpZXMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgZGVwcy5kZXNjcmlwdGlvbiA9IElPLmRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5yYXdkZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgZGVwcy5yYXdkZXNjcmlwdGlvbiA9IElPLnJhd2Rlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5tZXRob2RzKSB7XG4gICAgICAgICAgICBkZXBzLm1ldGhvZHMgPSBJTy5tZXRob2RzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5pbmRleFNpZ25hdHVyZXMpIHtcbiAgICAgICAgICAgIGRlcHMuaW5kZXhTaWduYXR1cmVzID0gSU8uaW5kZXhTaWduYXR1cmVzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5leHRlbmRzKSB7XG4gICAgICAgICAgICBkZXBzLmV4dGVuZHMgPSBJTy5leHRlbmRzO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5qc2RvY3RhZ3MgJiYgSU8uanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGRlcHMuanNkb2N0YWdzID0gSU8uanNkb2N0YWdzWzBdLnRhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElPLmFjY2Vzc29ycykge1xuICAgICAgICAgICAgZGVwcy5hY2Nlc3NvcnMgPSBJTy5hY2Nlc3NvcnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoSU8uaG9zdEJpbmRpbmdzKSB7XG4gICAgICAgICAgICBkZXBzLmhvc3RCaW5kaW5ncyA9IElPLmhvc3RCaW5kaW5ncztcbiAgICAgICAgfVxuICAgICAgICBpZiAoSU8uaG9zdExpc3RlbmVycykge1xuICAgICAgICAgICAgZGVwcy5ob3N0TGlzdGVuZXJzID0gSU8uaG9zdExpc3RlbmVycztcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgIGRlcHMubWV0aG9kcyA9IGNsZWFuTGlmZWN5Y2xlSG9va3NGcm9tTWV0aG9kcyhkZXBzLm1ldGhvZHMpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJTy5pbXBsZW1lbnRzICYmIElPLmltcGxlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZGVwcy5pbXBsZW1lbnRzID0gSU8uaW1wbGVtZW50cztcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNHdWFyZChJTy5pbXBsZW1lbnRzKSkge1xuICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdGhlIEd1YXJkIHRvIHNob3cgdXAgaW4gdGhlIENsYXNzZXMgbWVudVxuICAgICAgICAgICAgICAgIGV4Y2x1ZGVGcm9tQ2xhc3NBcnJheSA9IHRydWU7XG4gICAgICAgICAgICAgICAgZGVwcy50eXBlID0gJ2d1YXJkJztcblxuICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuZ3VhcmRzLnB1c2goZGVwcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICB0aGlzLmRlYnVnKGRlcHMpO1xuXG4gICAgICAgICAgICBpZiAoIWV4Y2x1ZGVGcm9tQ2xhc3NBcnJheSkge1xuICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuY2xhc3Nlcy5wdXNoKGRlcHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pZ25vcmUoZGVwcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFR5cGVzY3JpcHRJbXBvcnRzQWxpYXNlcyhpbml0aWFsU3JjRmlsZTogdHMuU291cmNlRmlsZSwgb3V0cHV0U3ltYm9sczogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFzdEZpbGUgPVxuICAgICAgICAgICAgdHlwZW9mIHByb2plY3QuZ2V0U291cmNlRmlsZShpbml0aWFsU3JjRmlsZS5maWxlTmFtZSkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyBwcm9qZWN0LmdldFNvdXJjZUZpbGUoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBwcm9qZWN0LmFkZFNvdXJjZUZpbGVBdFBhdGgoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpO1xuXG4gICAgICAgIGlmIChhc3RGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBpbXBvcnREZWNsYXJhdGlvbnMgPSBhc3RGaWxlLmdldEltcG9ydERlY2xhcmF0aW9ucygpO1xuICAgICAgICAgICAgaWYgKGltcG9ydERlY2xhcmF0aW9ucyAmJiBpbXBvcnREZWNsYXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGltcG9ydERlY2xhcmF0aW9ucy5mb3JFYWNoKGltcG9ydERlY2xhcmF0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZWRJbXBvcnRzID0gaW1wb3J0RGVjbGFyYXRpb24uZ2V0TmFtZWRJbXBvcnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChuYW1lZEltcG9ydHMgJiYgbmFtZWRJbXBvcnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSW1wb3J0cy5mb3JFYWNoKG5hbWVkSW1wb3J0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobmFtZWRJbXBvcnQuZ2V0QWxpYXNOb2RlKCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dFN5bWJvbHMuYWxpYXNlcy5oYXNPd25Qcm9wZXJ0eShuYW1lZEltcG9ydC5nZXROYW1lKCkpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmFsaWFzZXNbbmFtZWRJbXBvcnQuZ2V0TmFtZSgpXS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSW1wb3J0LmdldEFsaWFzTm9kZSgpLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuYWxpYXNlc1tuYW1lZEltcG9ydC5nZXROYW1lKCldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkSW1wb3J0LmdldEFsaWFzTm9kZSgpLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFR5cGVzY3JpcHRFeHBvcnRzQWxpYXNlcyhpbml0aWFsU3JjRmlsZTogdHMuU291cmNlRmlsZSwgb3V0cHV0U3ltYm9sczogYW55KTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGFzdEZpbGUgPVxuICAgICAgICAgICAgdHlwZW9mIHByb2plY3QuZ2V0U291cmNlRmlsZShpbml0aWFsU3JjRmlsZS5maWxlTmFtZSkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyBwcm9qZWN0LmdldFNvdXJjZUZpbGUoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBwcm9qZWN0LmFkZFNvdXJjZUZpbGVBdFBhdGgoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpO1xuXG4gICAgICAgIGlmIChhc3RGaWxlKSB7XG4gICAgICAgICAgICBjb25zdCBleHBvcnREZWNsYXJhdGlvbnMgPSBhc3RGaWxlLmdldEV4cG9ydERlY2xhcmF0aW9ucygpO1xuICAgICAgICAgICAgaWYgKGV4cG9ydERlY2xhcmF0aW9ucyAmJiBleHBvcnREZWNsYXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGV4cG9ydERlY2xhcmF0aW9ucy5mb3JFYWNoKGV4cG9ydERlY2xhcmF0aW9uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzTmFtZWRFeHBvcnRzID0gZXhwb3J0RGVjbGFyYXRpb24uaGFzTmFtZWRFeHBvcnRzKCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNOYW1lZEV4cG9ydHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVkRXhwb3J0cyA9IGV4cG9ydERlY2xhcmF0aW9uLmdldE5hbWVkRXhwb3J0cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVkRXhwb3J0cyAmJiBuYW1lZEV4cG9ydHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkRXhwb3J0cy5mb3JFYWNoKG5hbWVkRXhwb3J0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVkRXhwb3J0LmdldEFsaWFzTm9kZSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5hbGlhc2VzLmhhc093blByb3BlcnR5KG5hbWVkRXhwb3J0LmdldE5hbWUoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuYWxpYXNlc1tuYW1lZEV4cG9ydC5nZXROYW1lKCldLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVkRXhwb3J0LmdldEFsaWFzTm9kZSgpLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuYWxpYXNlc1tuYW1lZEV4cG9ydC5nZXROYW1lKCldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lZEV4cG9ydC5nZXRBbGlhc05vZGUoKS5nZXRUZXh0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0U291cmNlRmlsZURlY29yYXRvcnMoaW5pdGlhbFNyY0ZpbGU6IHRzLlNvdXJjZUZpbGUsIG91dHB1dFN5bWJvbHM6IGFueSk6IHZvaWQge1xuICAgICAgICBjb25zdCBjbGVhbmVyID0gKHByb2Nlc3MuY3dkKCkgKyBwYXRoLnNlcCkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICBjb25zdCBmaWxlTmFtZSA9IGluaXRpYWxTcmNGaWxlLmZpbGVOYW1lLnJlcGxhY2UoY2xlYW5lciwgJycpO1xuICAgICAgICBsZXQgc2Nhbm5lZEZpbGUgPSBpbml0aWFsU3JjRmlsZTtcblxuICAgICAgICAvLyBTZWFyY2ggaW4gZmlsZSBmb3IgdmFyaWFibGUgc3RhdGVtZW50IGFzIHJvdXRlcyBkZWZpbml0aW9uc1xuXG4gICAgICAgIGNvbnN0IGFzdEZpbGUgPVxuICAgICAgICAgICAgdHlwZW9mIHByb2plY3QuZ2V0U291cmNlRmlsZShpbml0aWFsU3JjRmlsZS5maWxlTmFtZSkgIT09ICd1bmRlZmluZWQnXG4gICAgICAgICAgICAgICAgPyBwcm9qZWN0LmdldFNvdXJjZUZpbGUoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpXG4gICAgICAgICAgICAgICAgOiBwcm9qZWN0LmFkZFNvdXJjZUZpbGVBdFBhdGgoaW5pdGlhbFNyY0ZpbGUuZmlsZU5hbWUpO1xuXG4gICAgICAgIGNvbnN0IHZhcmlhYmxlUm91dGVzU3RhdGVtZW50cyA9IGFzdEZpbGUuZ2V0VmFyaWFibGVTdGF0ZW1lbnRzKCk7XG4gICAgICAgIGxldCBoYXNSb3V0ZXNTdGF0ZW1lbnRzID0gZmFsc2U7XG5cbiAgICAgICAgaWYgKHZhcmlhYmxlUm91dGVzU3RhdGVtZW50cy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBDbGVhbiBmaWxlIGZvciBzcHJlYWQgYW5kIGR5bmFtaWNzIGluc2lkZSByb3V0ZXMgZGVmaW5pdGlvbnNcbiAgICAgICAgICAgIHZhcmlhYmxlUm91dGVzU3RhdGVtZW50cy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHZhcmlhYmxlRGVjbGFyYXRpb25zID0gcy5nZXREZWNsYXJhdGlvbnMoKTtcbiAgICAgICAgICAgICAgICBsZXQgbGVuID0gdmFyaWFibGVEZWNsYXJhdGlvbnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFyaWFibGVEZWNsYXJhdGlvbnNbaV0uY29tcGlsZXJOb2RlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZURlY2xhcmF0aW9uc1tpXS5jb21waWxlck5vZGUudHlwZS50eXBlTmFtZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlRGVjbGFyYXRpb25zW2ldLmNvbXBpbGVyTm9kZS50eXBlLnR5cGVOYW1lLnRleHQgPT09ICdSb3V0ZXMnXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNSb3V0ZXNTdGF0ZW1lbnRzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc1JvdXRlc1N0YXRlbWVudHMgJiYgIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVJvdXRlc0dyYXBoKSB7XG4gICAgICAgICAgICAvLyBDbGVhbiBmaWxlIGZvciBzcHJlYWQgYW5kIGR5bmFtaWNzIGluc2lkZSByb3V0ZXMgZGVmaW5pdGlvbnNcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdBbmFseXNpbmcgcm91dGVzIGRlZmluaXRpb25zIGFuZCBjbGVhbiB0aGVtIGlmIG5lY2Vzc2FyeScpO1xuXG4gICAgICAgICAgICAvLyBzY2FubmVkRmlsZSA9IFJvdXRlclBhcnNlclV0aWwuY2xlYW5GaWxlSWRlbnRpZmllcnMoYXN0RmlsZSkuY29tcGlsZXJOb2RlO1xuICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5jbGVhbkZpbGVTcHJlYWRzKGFzdEZpbGUpO1xuXG4gICAgICAgICAgICBzY2FubmVkRmlsZSA9IFJvdXRlclBhcnNlclV0aWwuY2xlYW5DYWxsRXhwcmVzc2lvbnMoYXN0RmlsZSkuY29tcGlsZXJOb2RlO1xuICAgICAgICAgICAgc2Nhbm5lZEZpbGUgPSBSb3V0ZXJQYXJzZXJVdGlsLmNsZWFuRmlsZUR5bmFtaWNzKGFzdEZpbGUpLmNvbXBpbGVyTm9kZTtcblxuICAgICAgICAgICAgc2Nhbm5lZEZpbGUua2luZCA9IFN5bnRheEtpbmQuU291cmNlRmlsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRzLmZvckVhY2hDaGlsZChzY2FubmVkRmlsZSwgKGluaXRpYWxOb2RlOiB0cy5Ob2RlKSA9PiB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgdGhpcy5qc0RvY0hlbHBlci5oYXNKU0RvY0ludGVybmFsVGFnKGZpbGVOYW1lLCBzY2FubmVkRmlsZSwgaW5pdGlhbE5vZGUpICYmXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlSW50ZXJuYWxcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHBhcnNlTm9kZSA9IChmaWxlLCBzcmNGaWxlLCBub2RlLCBmaWxlQm9keSwgYXN0RmlsZSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IHNvdXJjZUNvZGUgPSBzcmNGaWxlLmdldFRleHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCBoYXNoID0gY3J5cHRvLmNyZWF0ZUhhc2goJ3NoYTUxMicpLnVwZGF0ZShzb3VyY2VDb2RlKS5kaWdlc3QoJ2hleCcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKG5vZGVIYXNEZWNvcmF0b3Iobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsYXNzV2l0aEN1c3RvbURlY29yYXRvciA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlRGVjb3JhdG9ycyA9IGdldE5vZGVEZWNvcmF0b3JzKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXNpdERlY29yYXRvciA9ICh2aXNpdGVkRGVjb3JhdG9yLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRlcHM6IElEZXA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldFN5bWJvbGVOYW1lKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLmZpbmRQcm9wZXJ0aWVzKHZpc2l0ZWREZWNvcmF0b3IsIHNyY0ZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU8gPSB0aGlzLmNvbXBvbmVudEhlbHBlci5nZXRDb21wb25lbnRJTyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlQm9keSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3RGaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vZHVsZSh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1vZHVsZURlcCA9IG5ldyBNb2R1bGVEZXBGYWN0b3J5KHRoaXMubW9kdWxlSGVscGVyKS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFJvdXRlclBhcnNlclV0aWwuaGFzUm91dGVyTW9kdWxlSW5JbXBvcnRzKG1vZHVsZURlcC5pbXBvcnRzKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsLmFkZE1vZHVsZVdpdGhSb3V0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2R1bGVIZWxwZXIuZ2V0TW9kdWxlSW1wb3J0c1Jhdyhwcm9wcywgc3JjRmlsZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMgPSBtb2R1bGVEZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlclBhcnNlclV0aWwuYWRkTW9kdWxlKG5hbWUsIG1vZHVsZURlcC5pbXBvcnRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5tb2R1bGVzLnB1c2gobW9kdWxlRGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5tb2R1bGVzRm9yR3JhcGgucHVzaChtb2R1bGVEZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbXBvbmVudCh2aXNpdGVkRGVjb3JhdG9yKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnREZXAgPSBuZXcgQ29tcG9uZW50RGVwRmFjdG9yeShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRIZWxwZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLmNyZWF0ZShmaWxlLCBzcmNGaWxlLCBuYW1lLCBwcm9wcywgSU8pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMgPSBjb21wb25lbnREZXA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudHNUcmVlRW5naW5lLmFkZENvbXBvbmVudChjb21wb25lbnREZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmNvbXBvbmVudHMucHVzaChjb21wb25lbnREZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc0NvbnRyb2xsZXIodmlzaXRlZERlY29yYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sbGVyRGVwID0gbmV3IENvbnRyb2xsZXJEZXBGYWN0b3J5KCkuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMgPSBjb250cm9sbGVyRGVwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmNvbnRyb2xsZXJzLnB1c2goY29udHJvbGxlckRlcCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRW50aXR5KHZpc2l0ZWREZWNvcmF0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50aXR5RGVwID0gbmV3IEVudGl0eURlcEZhY3RvcnkoKS5jcmVhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0ZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJT1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IGVudGl0eURlcDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmVudGl0aWVzLnB1c2goZW50aXR5RGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNJbmplY3RhYmxlKHZpc2l0ZWREZWNvcmF0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5qZWN0YWJsZURlcHM6IElJbmplY3RhYmxlRGVwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2luamVjdGFibGUtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiBJTy5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiBJTy5tZXRob2RzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBJTy5kZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2U6IElPLmRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IElPLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdkZXNjcmlwdGlvbjogSU8ucmF3ZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUuZ2V0VGV4dCgpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGFtcGxlVXJsczogdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50RXhhbXBsZVVybHMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNGaWxlLmdldFRleHQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8uY29uc3RydWN0b3IgJiYgIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvbnN0cnVjdG9ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy5jb25zdHJ1Y3Rvck9iaiA9IElPLmNvbnN0cnVjdG9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8uanNkb2N0YWdzICYmIElPLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLmpzZG9jdGFncyA9IElPLmpzZG9jdGFnc1swXS50YWdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoSU8uYWNjZXNzb3JzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLmFjY2Vzc29ycyA9IElPLmFjY2Vzc29ycztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmV4dGVuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZURlcHMuZXh0ZW5kcyA9IElPLmV4dGVuZHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVMaWZlQ3ljbGVIb29rcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy5tZXRob2RzID0gY2xlYW5MaWZlY3ljbGVIb29rc0Zyb21NZXRob2RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZURlcHMubWV0aG9kc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzID0gaW5qZWN0YWJsZURlcHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBJTy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfLmluY2x1ZGVzKElPLmltcGxlbWVudHMsICdIdHRwSW50ZXJjZXB0b3InKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZURlcHMudHlwZSA9ICdpbnRlcmNlcHRvcic7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLmludGVyY2VwdG9ycy5wdXNoKGluamVjdGFibGVEZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzR3VhcmQoSU8uaW1wbGVtZW50cykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLnR5cGUgPSAnZ3VhcmQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5ndWFyZHMucHVzaChpbmplY3RhYmxlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVwcy50eXBlID0gJ2luamVjdGFibGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGROZXdFbnRpdHlJblN0b3JlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGVEZXBzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMuaW5qZWN0YWJsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNQaXBlKHZpc2l0ZWREZWNvcmF0b3IpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGlwZURlcHM6IElQaXBlRGVwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ3BpcGUtJyArIG5hbWUgKyAnLScgKyBoYXNoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncGlwZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IElPLmRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogSU8uZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjogSU8uZGVzY3JpcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd2Rlc2NyaXB0aW9uOiBJTy5yYXdkZXNjcmlwdGlvbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogSU8ucHJvcGVydGllcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczogSU8ubWV0aG9kcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhbG9uZTogdGhpcy5jb21wb25lbnRIZWxwZXIuZ2V0Q29tcG9uZW50U3RhbmRhbG9uZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1cmU6IHRoaXMuY29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudFB1cmUocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ25hbWU6IHRoaXMuY29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudE5hbWUocHJvcHMsIHNyY0ZpbGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VDb2RlOiBzcmNGaWxlLmdldFRleHQoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhhbXBsZVVybHM6IHRoaXMuY29tcG9uZW50SGVscGVyLmdldENvbXBvbmVudEV4YW1wbGVVcmxzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjRmlsZS5nZXRUZXh0KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUxpZmVDeWNsZUhvb2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpcGVEZXBzLm1ldGhvZHMgPSBjbGVhbkxpZmVjeWNsZUhvb2tzRnJvbU1ldGhvZHMocGlwZURlcHMubWV0aG9kcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5qc2RvY3RhZ3MgJiYgSU8uanNkb2N0YWdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlwZURlcHMuanNkb2N0YWdzID0gSU8uanNkb2N0YWdzWzBdLnRhZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMgPSBwaXBlRGVwcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5waXBlcy5wdXNoKHBpcGVEZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNEaXJlY3RpdmUodmlzaXRlZERlY29yYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RpdmVEZXBzID0gbmV3IERpcmVjdGl2ZURlcEZhY3RvcnkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY29tcG9uZW50SGVscGVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5jcmVhdGUoZmlsZSwgc3JjRmlsZSwgbmFtZSwgcHJvcHMsIElPKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzID0gZGlyZWN0aXZlRGVwcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIElPLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5kaXJlY3RpdmVzLnB1c2goZGlyZWN0aXZlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXNNdWx0aXBsZURlY29yYXRvcnNXaXRoSW50ZXJuYWxPbmUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc0ludGVybmFsRGVjb3JhdG9yKG5vZGVEZWNvcmF0b3JzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IGEgY2xhc3NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFjbGFzc1dpdGhDdXN0b21EZWNvcmF0b3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc011bHRpcGxlRGVjb3JhdG9yc1dpdGhJbnRlcm5hbE9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc1dpdGhDdXN0b21EZWNvcmF0b3IgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDbGFzcyhub2RlLCBmaWxlLCBzcmNGaWxlLCBvdXRwdXRTeW1ib2xzLCBmaWxlQm9keSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWNoZS5zZXQobmFtZSwgZGVwcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoZGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlckJ5RGVjb3JhdG9ycyA9IGZpbHRlcmVkTm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyZWROb2RlLmV4cHJlc3Npb24gJiYgZmlsdGVyZWROb2RlLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfdGVzdCA9IC8oTmdNb2R1bGV8Q29tcG9uZW50fEluamVjdGFibGV8UGlwZXxEaXJlY3RpdmUpLy50ZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZE5vZGUuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghX3Rlc3QgJiYgdHMuaXNDbGFzc0RlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF90ZXN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90ZXN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzQ2xhc3NEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIG5vZGVEZWNvcmF0b3JzLmZpbHRlcihmaWx0ZXJCeURlY29yYXRvcnMpLmZvckVhY2godmlzaXREZWNvcmF0b3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobm9kZS5zeW1ib2wpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuc3ltYm9sLmZsYWdzID09PSB0cy5TeW1ib2xGbGFncy5DbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzQ2xhc3Mobm9kZSwgZmlsZSwgc3JjRmlsZSwgb3V0cHV0U3ltYm9scywgZmlsZUJvZHksIGFzdEZpbGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG5vZGUuc3ltYm9sLmZsYWdzID09PSB0cy5TeW1ib2xGbGFncy5JbnRlcmZhY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldFN5bWJvbGVOYW1lKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSU8gPSB0aGlzLmdldEludGVyZmFjZUlPKGZpbGUsIHNyY0ZpbGUsIG5vZGUsIGZpbGVCb2R5LCBhc3RGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVyZmFjZURlcHM6IElJbnRlcmZhY2VEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2ludGVyZmFjZS0nICsgbmFtZSArICctJyArIGhhc2gsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBJTy5kZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogSU8uZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdpbnRlcmZhY2UnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUNvZGU6IHNyY0ZpbGUuZ2V0VGV4dCgpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLnByb3BlcnRpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VEZXBzLnByb3BlcnRpZXMgPSBJTy5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmluZGV4U2lnbmF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZURlcHMuaW5kZXhTaWduYXR1cmVzID0gSU8uaW5kZXhTaWduYXR1cmVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmtpbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VEZXBzLmtpbmQgPSBJTy5raW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKElPLmRlc2NyaXB0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5kZXNjcmlwdGlvbiA9IElPLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZURlcHMucmF3ZGVzY3JpcHRpb24gPSBJTy5yYXdkZXNjcmlwdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5tZXRob2RzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5tZXRob2RzID0gSU8ubWV0aG9kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChJTy5leHRlbmRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlRGVwcy5leHRlbmRzID0gSU8uZXh0ZW5kcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgSU8uaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoaW50ZXJmYWNlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5pbnRlcmZhY2VzLnB1c2goaW50ZXJmYWNlRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWdub3JlKGludGVyZmFjZURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzRnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mb3MgPSB0aGlzLnZpc2l0RnVuY3Rpb25EZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlZCA9IGluZm9zLmRlcHJlY2F0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGlvbk1lc3NhZ2UgPSBpbmZvcy5kZXByZWNhdGlvbk1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmdW5jdGlvbkRlcDogSUZ1bmN0aW9uRGVjRGVwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICdmdW5jdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMudmlzaXRFbnVtVHlwZUFsaWFzRnVuY3Rpb25EZWNsYXJhdGlvbkRlc2NyaXB0aW9uKG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmFyZ3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkRlcC5hcmdzID0gaW5mb3MuYXJncztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvcy5yZXR1cm5UeXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25EZXAucmV0dXJuVHlwZSA9IGluZm9zLnJldHVyblR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuanNkb2N0YWdzICYmIGluZm9zLmpzZG9jdGFncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25EZXAuanNkb2N0YWdzID0gaW5mb3MuanNkb2N0YWdzO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbmZvcy5pZ25vcmUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNQcml2YXRlSlNEb2NUYWcoZnVuY3Rpb25EZXAuanNkb2N0YWdzKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJpdmF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoZnVuY3Rpb25EZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRTeW1ib2xzLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLnB1c2goZnVuY3Rpb25EZXApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0cy5pc0VudW1EZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mb3MgPSB0aGlzLnZpc2l0RW51bURlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGluZm9zLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkID0gaW5mb3MuZGVwcmVjYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTWVzc2FnZSA9IGluZm9zLmRlcHJlY2F0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudW1EZXBzOiBJRW51bURlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkczogaW5mb3MubWVtYmVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICdlbnVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpdEVudW1UeXBlQWxpYXNGdW5jdGlvbkRlY2xhcmF0aW9uRGVzY3JpcHRpb24obm9kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTogZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0lnbm9yZShub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoZW51bURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMucHVzaChlbnVtRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHMuaXNUeXBlQWxpYXNEZWNsYXJhdGlvbihub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mb3MgPSB0aGlzLnZpc2l0VHlwZURlY2xhcmF0aW9uKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGluZm9zLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkID0gaW5mb3MuZGVwcmVjYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0aW9uTWVzc2FnZSA9IGluZm9zLmRlcHJlY2F0aW9uTWVzc2FnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVBbGlhc0RlcHM6IElUeXBlQWxpYXNEZWNEZXAgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZTogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICd0eXBlYWxpYXMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd3R5cGU6IHRoaXMuY2xhc3NIZWxwZXIudmlzaXRUeXBlKG5vZGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGlvbk1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IHRoaXMudmlzaXRFbnVtVHlwZUFsaWFzRnVuY3Rpb25EZWNsYXJhdGlvbkRlc2NyaXB0aW9uKG5vZGUpXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBbGlhc0RlcHMua2luZCA9IG5vZGUudHlwZS5raW5kO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlQWxpYXNEZXBzLnJhd3R5cGUgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBbGlhc0RlcHMucmF3dHlwZSA9IHRoaXMuY2xhc3NIZWxwZXIudmlzaXRUeXBlKG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBbGlhc0RlcHMua2luZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBbGlhc0RlcHMua2luZCA9PT0gU3ludGF4S2luZC5UZW1wbGF0ZUxpdGVyYWxUeXBlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlQWxpYXNEZXBzLnJhd3R5cGUgPSBzcmNGaWxlLnRleHQuc3Vic3RyaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnR5cGUucG9zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLnR5cGUuZW5kXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0lnbm9yZShub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5wdXNoKHR5cGVBbGlhc0RlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluZm9zLmlnbm9yZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKHR5cGVBbGlhc0RlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRzLmlzTW9kdWxlRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLmJvZHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5ib2R5LnN0YXRlbWVudHMgJiYgbm9kZS5ib2R5LnN0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmJvZHkuc3RhdGVtZW50cy5mb3JFYWNoKHN0YXRlbWVudCA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VOb2RlKGZpbGUsIHNyY0ZpbGUsIHN0YXRlbWVudCwgbm9kZS5ib2R5LCBhc3RGaWxlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IElPID0gdGhpcy5nZXRSb3V0ZUlPKGZpbGUsIHNyY0ZpbGUsIG5vZGUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoSU8ucm91dGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmV3Um91dGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZXMgPSBSb3V0ZXJQYXJzZXJVdGlsLmNsZWFuUmF3Um91dGVQYXJzZWQoSU8ucm91dGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUm91dGVzIHBhcnNpbmcgZXJyb3IsIG1heWJlIGEgdHJhaWxpbmcgY29tbWEgb3IgYW4gZXh0ZXJuYWwgdmFyaWFibGUsIHRyeWluZyB0byBmaXggdGhhdCBsYXRlciBhZnRlciBzb3VyY2VzIHNjYW5uaW5nLidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlcyA9IElPLnJvdXRlcy5yZXBsYWNlKC8gL2dtLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5hZGRJbmNvbXBsZXRlUm91dGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBuZXdSb3V0ZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMucm91dGVzID0gWy4uLm91dHB1dFN5bWJvbHMucm91dGVzLCAuLi5uZXdSb3V0ZXNdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NsYXNzKG5vZGUsIGZpbGUsIHNyY0ZpbGUsIG91dHB1dFN5bWJvbHMsIGZpbGVCb2R5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHMuaXNFeHByZXNzaW9uU3RhdGVtZW50KG5vZGUpIHx8IHRzLmlzSWZTdGF0ZW1lbnQobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb3RzdHJhcE1vZHVsZVJlZmVyZW5jZSA9ICdib290c3RyYXBNb2R1bGUnO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmluZCB0aGUgcm9vdCBtb2R1bGUgd2l0aCBib290c3RyYXBNb2R1bGUgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gZmluZCBhIHNpbXBsZSBjYWxsIDogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gb3IgaW5zaWRlIGEgY2FsbCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAzLiB3aXRoIGEgY2F0Y2ggOiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSkuY2F0Y2goZXJyb3IgPT4gY29uc29sZS5lcnJvcihlcnJvcikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gNC4gd2l0aCBwYXJhbWV0ZXJzIDogcGxhdGZvcm1Ccm93c2VyRHluYW1pYygpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUsIHt9KS5jYXRjaChlcnJvciA9PiBjb25zb2xlLmVycm9yKGVycm9yKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHJlY3VzaXZlbHkgaW4gZXhwcmVzc2lvbiBub2RlcyBvbmUgd2l0aCBuYW1lICdib290c3RyYXBNb2R1bGUnXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcm9vdE1vZHVsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHROb2RlO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNyY0ZpbGUudGV4dC5pbmRleE9mKGJvb3RzdHJhcE1vZHVsZVJlZmVyZW5jZSkgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHROb2RlID0gdGhpcy5maW5kRXhwcmVzc2lvbkJ5TmFtZUluRXhwcmVzc2lvbnMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmV4cHJlc3Npb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9vdHN0cmFwTW9kdWxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUudGhlblN0YXRlbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS50aGVuU3RhdGVtZW50LnN0YXRlbWVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudGhlblN0YXRlbWVudC5zdGF0ZW1lbnRzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlyc3RTdGF0ZW1lbnQgPSBub2RlLnRoZW5TdGF0ZW1lbnQuc3RhdGVtZW50c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE5vZGUgPSB0aGlzLmZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9ucyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFN0YXRlbWVudC5leHByZXNzaW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib290c3RyYXBNb2R1bGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Tm9kZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmV4cHJlc3Npb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdE5vZGUgPSB0aGlzLmZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9uQXJndW1lbnRzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Jvb3RzdHJhcE1vZHVsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdE5vZGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdE5vZGUuYXJndW1lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChyZXN1bHROb2RlLmFyZ3VtZW50cywgKGFyZ3VtZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnQudGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290TW9kdWxlID0gYXJndW1lbnQudGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm9vdE1vZHVsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5zZXRSb290TW9kdWxlKHJvb3RNb2R1bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc1ZhcmlhYmxlU3RhdGVtZW50KG5vZGUpICYmICFSb3V0ZXJQYXJzZXJVdGlsLmlzVmFyaWFibGVSb3V0ZXMobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpc0Rlc3RydWN0dXJlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGRlc3RydWN0dXJpbmcgYXJyYXlcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVWYXJpYWJsZURlY2xhcmF0aW9ucyA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFyaWFibGVEZWNsYXJhdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhcmlhYmxlRGVjbGFyYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVZhcmlhYmxlRGVjbGFyYXRpb25zWzBdLm5hbWUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYXJpYWJsZURlY2xhcmF0aW9uc1swXS5uYW1lLmtpbmQgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ludGF4S2luZC5BcnJheUJpbmRpbmdQYXR0ZXJuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNEZXN0cnVjdHVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2aXNpdFZhcmlhYmxlTm9kZSA9IHZhcmlhYmxlTm9kZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mb3M6IGFueSA9IHRoaXMudmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKHZhcmlhYmxlTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGVkID0gaW5mb3MuZGVwcmVjYXRlZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRpb25NZXNzYWdlID0gaW5mb3MuZGVwcmVjYXRpb25NZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXBzOiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGU6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnR5cGU6ICd2YXJpYWJsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLnR5cGUgPSBpbmZvcy50eXBlID8gaW5mb3MudHlwZSA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuZGVmYXVsdFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmRlZmF1bHRWYWx1ZSA9IGluZm9zLmRlZmF1bHRWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMuaW5pdGlhbGl6ZXIgPSBpbmZvcy5pbml0aWFsaXplcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5vZGUuanNEb2MgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlTm9kZS5qc0RvYy5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZU5vZGUuanNEb2NbMF0uY29tbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJhd0Rlc2NyaXB0aW9uID0gdGhpcy5qc2RvY1BhcnNlclV0aWwucGFyc2VKU0RvY05vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVOb2RlLmpzRG9jWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5yYXdkZXNjcmlwdGlvbiA9IHJhd0Rlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5kZXNjcmlwdGlvbiA9IG1hcmtlZEFjbChyYXdEZXNjcmlwdGlvbik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTW9kdWxlV2l0aFByb3ZpZGVycyh2YXJpYWJsZU5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByb3V0aW5nSW5pdGlhbGl6ZXIgPSBnZXRNb2R1bGVXaXRoUHJvdmlkZXJzKHZhcmlhYmxlTm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsLmFkZE1vZHVsZVdpdGhSb3V0ZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcm91dGluZ0luaXRpYWxpemVyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVyUGFyc2VyVXRpbC5hZGRNb2R1bGUobmFtZSwgW3JvdXRpbmdJbml0aWFsaXplcl0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNJZ25vcmUodmFyaWFibGVOb2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1ZyhkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMucHVzaChkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0Rlc3RydWN0dXJlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlVmFyaWFibGVEZWNsYXJhdGlvbnNbMF0ubmFtZS5lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0cnVjdHVyZWRWYXJpYWJsZXMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZVZhcmlhYmxlRGVjbGFyYXRpb25zWzBdLm5hbWUuZWxlbWVudHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXN0cnVjdHVyZWRWYXJpYWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlc3RydWN0dXJlZFZhcmlhYmxlID0gZGVzdHJ1Y3R1cmVkVmFyaWFibGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGRlc3RydWN0dXJlZFZhcmlhYmxlLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGRlc3RydWN0dXJlZFZhcmlhYmxlLm5hbWUuZXNjYXBlZFRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwczogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGU6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAndmFyaWFibGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6IGZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZVZhcmlhYmxlRGVjbGFyYXRpb25zWzBdLmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVWYXJpYWJsZURlY2xhcmF0aW9uc1swXS5pbml0aWFsaXplci5lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmluaXRpYWxpemVyID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVWYXJpYWJsZURlY2xhcmF0aW9uc1swXS5pbml0aWFsaXplci5lbGVtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5kZWZhdWx0VmFsdWUgPSBkZXBzLmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5jbGFzc0hlbHBlci5zdHJpbmdpZnlEZWZhdWx0VmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHMuaW5pdGlhbGl6ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzSWdub3JlKGRlc3RydWN0dXJlZFZhcmlhYmxlc1tpXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy52YXJpYWJsZXMucHVzaChkZXBzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlzaXRWYXJpYWJsZU5vZGUobm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzVHlwZUFsaWFzRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZm9zID0gdGhpcy52aXNpdFR5cGVEZWNsYXJhdGlvbihub2RlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpbmZvcy5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRlZCA9IGluZm9zLmRlcHJlY2F0ZWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXByZWNhdGlvbk1lc3NhZ2UgPSBpbmZvcy5kZXByZWNhdGlvbk1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXBzOiBJVHlwZUFsaWFzRGVjRGVwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGU6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJ0eXBlOiAndHlwZWFsaWFzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXd0eXBlOiB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShub2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmtpbmQgPSBub2RlLnR5cGUua2luZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmtpbmQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzLmtpbmQgPT09IFN5bnRheEtpbmQuVGVtcGxhdGVMaXRlcmFsVHlwZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUudHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcy5yYXd0eXBlID0gc3JjRmlsZS50ZXh0LnN1YnN0cmluZyhub2RlLnR5cGUucG9zLCBub2RlLnR5cGUuZW5kKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNJZ25vcmUobm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5wdXNoKGRlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cy5pc0Z1bmN0aW9uRGVjbGFyYXRpb24obm9kZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZm9zID0gdGhpcy52aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaW5mb3MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0ZWQgPSBpbmZvcy5kZXByZWNhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRpb25NZXNzYWdlID0gaW5mb3MuZGVwcmVjYXRpb25NZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25EZXA6IElGdW5jdGlvbkRlY0RlcCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZTogJ2Z1bmN0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLnZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihub2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvcy5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25EZXAuYXJncyA9IGluZm9zLmFyZ3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mb3MucmV0dXJuVHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLnJldHVyblR5cGUgPSBpbmZvcy5yZXR1cm5UeXBlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm9zLmpzZG9jdGFncyAmJiBpbmZvcy5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uRGVwLmpzZG9jdGFncyA9IGluZm9zLmpzZG9jdGFncztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5mb3MuaWdub3JlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzUHJpdmF0ZUpTRG9jVGFnKGZ1bmN0aW9uRGVwLmpzZG9jdGFncykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByaXZhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnKGZ1bmN0aW9uRGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3ltYm9scy5taXNjZWxsYW5lb3VzLmZ1bmN0aW9ucy5wdXNoKGZ1bmN0aW9uRGVwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRzLmlzRW51bURlY2xhcmF0aW9uKG5vZGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmZvcyA9IHRoaXMudmlzaXRFbnVtRGVjbGFyYXRpb24obm9kZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaW5mb3MubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlcHJlY2F0ZWQgPSBpbmZvcy5kZXByZWNhdGVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVwcmVjYXRpb25NZXNzYWdlID0gaW5mb3MuZGVwcmVjYXRpb25NZXNzYWdlO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW51bURlcHM6IElFbnVtRGVjRGVwID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRzOiBpbmZvcy5tZW1iZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VidHlwZTogJ2VudW0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihub2RlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOiBmaWxlXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0lnbm9yZShub2RlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVidWcoZW51bURlcHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN5bWJvbHMubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMucHVzaChlbnVtRGVwcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBwYXJzZU5vZGUoZmlsZU5hbWUsIHNjYW5uZWRGaWxlLCBpbml0aWFsTm9kZSwgbnVsbCwgYXN0RmlsZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEZ1bmN0aW9uIHRvIGluIGEgc3BlY2lmaWMgc3RvcmUgYW4gZW50aXR5LCBhbmQgY2hlY2sgYmVmb3JlIGlzIHRoZXJlIGlzIG5vdCB0aGUgc2FtZSBvbmVcbiAgICAgKiBpbiB0aGF0IHN0b3JlIDogc2FtZSBuYW1lLCBpZCBhbmQgZmlsZVxuICAgICAqIEBwYXJhbSBlbnRpdHkgRW50aXR5IHRvIHN0b3JlXG4gICAgICogQHBhcmFtIHN0b3JlIFN0b3JlXG4gICAgICovXG4gICAgcHJpdmF0ZSBhZGROZXdFbnRpdHlJblN0b3JlKGVudGl0eSwgc3RvcmUpIHtcbiAgICAgICAgY29uc3QgZmluZFNhbWVFbnRpdHlJblN0b3JlID0gXy5maWx0ZXIoc3RvcmUsIHtcbiAgICAgICAgICAgIG5hbWU6IGVudGl0eS5uYW1lLFxuICAgICAgICAgICAgaWQ6IGVudGl0eS5pZCxcbiAgICAgICAgICAgIGZpbGU6IGVudGl0eS5maWxlXG4gICAgICAgIH0pO1xuICAgICAgICBpZiAoZmluZFNhbWVFbnRpdHlJblN0b3JlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgc3RvcmUucHVzaChlbnRpdHkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZWJ1ZyhkZXBzOiBJRGVwKSB7XG4gICAgICAgIGlmIChkZXBzKSB7XG4gICAgICAgICAgICBsb2dnZXIuZGVidWcoJ2ZvdW5kJywgYCR7ZGVwcy5uYW1lfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIFsnaW1wb3J0cycsICdleHBvcnRzJywgJ2RlY2xhcmF0aW9ucycsICdwcm92aWRlcnMnLCAnYm9vdHN0cmFwJ10uZm9yRWFjaChzeW1ib2xzID0+IHtcbiAgICAgICAgICAgIGlmIChkZXBzW3N5bWJvbHNdICYmIGRlcHNbc3ltYm9sc10ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygnJywgYC0gJHtzeW1ib2xzfTpgKTtcbiAgICAgICAgICAgICAgICBkZXBzW3N5bWJvbHNdXG4gICAgICAgICAgICAgICAgICAgIC5tYXAoaSA9PiBpLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgIC5mb3JFYWNoKGQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCcnLCBgXFx0LSAke2R9YCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlnbm9yZShkZXBzOiBJRGVwKSB7XG4gICAgICAgIGlmIChkZXBzKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybignaWdub3JlJywgYCR7ZGVwcy5uYW1lfWApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjaGVja0ZvckRlcHJlY2F0aW9uKHRhZ3M6IGFueVtdLCByZXN1bHQ6IHsgW2tleSBpbiBzdHJpbmcgfCBudW1iZXJdOiBhbnkgfSkge1xuICAgICAgICBfLmZvckVhY2godGFncywgdGFnID0+IHtcbiAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZSAmJiB0YWcudGFnTmFtZS50ZXh0ICYmIHRhZy50YWdOYW1lLnRleHQuaW5kZXhPZignZGVwcmVjYXRlZCcpID4gLTEpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZGVwcmVjYXRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzdWx0LmRlcHJlY2F0aW9uTWVzc2FnZSA9IHRhZy5jb21tZW50IHx8ICcnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGZpbmRFeHByZXNzaW9uQnlOYW1lSW5FeHByZXNzaW9ucyhlbnRyeU5vZGUsIG5hbWUpIHtcbiAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgY29uc3QgbG9vcCA9IGZ1bmN0aW9uIChub2RlLCB6KSB7XG4gICAgICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgICAgICAgIGlmIChub2RlLmV4cHJlc3Npb24gJiYgIW5vZGUuZXhwcmVzc2lvbi5uYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvb3Aobm9kZS5leHByZXNzaW9uLCB6KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZXhwcmVzc2lvbiAmJiBub2RlLmV4cHJlc3Npb24ubmFtZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAobm9kZS5leHByZXNzaW9uLm5hbWUudGV4dCA9PT0geikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbm9kZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3Aobm9kZS5leHByZXNzaW9uLCB6KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbG9vcChlbnRyeU5vZGUsIG5hbWUpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZEV4cHJlc3Npb25CeU5hbWVJbkV4cHJlc3Npb25Bcmd1bWVudHMoYXJnLCBuYW1lKSB7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGNvbnN0IHRoYXQgPSB0aGlzO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBsZW4gPSBhcmcubGVuZ3RoO1xuICAgICAgICBjb25zdCBsb29wID0gZnVuY3Rpb24gKG5vZGUsIHopIHtcbiAgICAgICAgICAgIGlmIChub2RlLmJvZHkpIHtcbiAgICAgICAgICAgICAgICBpZiAobm9kZS5ib2R5LnN0YXRlbWVudHMgJiYgbm9kZS5ib2R5LnN0YXRlbWVudHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaiA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlbmcgPSBub2RlLmJvZHkuc3RhdGVtZW50cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoajsgaiA8IGxlbmc7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhhdC5maW5kRXhwcmVzc2lvbkJ5TmFtZUluRXhwcmVzc2lvbnMobm9kZS5ib2R5LnN0YXRlbWVudHNbal0sIHopO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgbG9vcChhcmdbaV0sIG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZURlY29yYXRvcnMoZGVjb3JhdG9ycywgdHlwZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKGRlY29yYXRvcnMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgXy5mb3JFYWNoKGRlY29yYXRvcnMsIGZ1bmN0aW9uIChkZWNvcmF0b3I6IGFueSkge1xuICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uLnRleHQgPT09IHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkZWNvcmF0b3JzWzBdLmV4cHJlc3Npb24uZXhwcmVzc2lvbikge1xuICAgICAgICAgICAgICAgIGlmIChkZWNvcmF0b3JzWzBdLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwYXJzZURlY29yYXRvcihkZWNvcmF0b3IsIHR5cGU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgIGlmIChkZWNvcmF0b3IuZXhwcmVzc2lvbi5leHByZXNzaW9uKSB7XG4gICAgICAgICAgICBpZiAoZGVjb3JhdG9yLmV4cHJlc3Npb24uZXhwcmVzc2lvbi50ZXh0ID09PSB0eXBlKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNDb250cm9sbGVyKG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnQ29udHJvbGxlcicpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNFbnRpdHkobWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdFbnRpdHknKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGlzQ29tcG9uZW50KG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnQ29tcG9uZW50Jyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1BpcGUobWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdQaXBlJyk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc0RpcmVjdGl2ZShtZXRhZGF0YSkge1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURlY29yYXRvcihtZXRhZGF0YSwgJ0RpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNJbmplY3RhYmxlKG1ldGFkYXRhKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGVjb3JhdG9yKG1ldGFkYXRhLCAnSW5qZWN0YWJsZScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNNb2R1bGUobWV0YWRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdOZ01vZHVsZScpIHx8IHRoaXMucGFyc2VEZWNvcmF0b3IobWV0YWRhdGEsICdNb2R1bGUnKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc0ludGVybmFsRGVjb3JhdG9yKG1ldGFkYXRhcykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnQ29udHJvbGxlcicpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdDb21wb25lbnQnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnUGlwZScpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdEaXJlY3RpdmUnKSB8fFxuICAgICAgICAgICAgdGhpcy5wYXJzZURlY29yYXRvcnMobWV0YWRhdGFzLCAnSW5qZWN0YWJsZScpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdOZ01vZHVsZScpIHx8XG4gICAgICAgICAgICB0aGlzLnBhcnNlRGVjb3JhdG9ycyhtZXRhZGF0YXMsICdNb2R1bGUnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNHdWFyZChpb0ltcGxlbWVudHM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBfLmluY2x1ZGVzKGlvSW1wbGVtZW50cywgJ0NhbkFjdGl2YXRlJykgfHxcbiAgICAgICAgICAgIF8uaW5jbHVkZXMoaW9JbXBsZW1lbnRzLCAnQ2FuQWN0aXZhdGVDaGlsZCcpIHx8XG4gICAgICAgICAgICBfLmluY2x1ZGVzKGlvSW1wbGVtZW50cywgJ0NhbkRlYWN0aXZhdGUnKSB8fFxuICAgICAgICAgICAgXy5pbmNsdWRlcyhpb0ltcGxlbWVudHMsICdSZXNvbHZlJykgfHxcbiAgICAgICAgICAgIF8uaW5jbHVkZXMoaW9JbXBsZW1lbnRzLCAnQ2FuTG9hZCcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRTeW1ib2xlTmFtZShub2RlKTogc3RyaW5nIHtcbiAgICAgICAgcmV0dXJuIG5vZGUubmFtZS50ZXh0O1xuICAgIH1cblxuICAgIHByaXZhdGUgZmluZFByb3BlcnRpZXMoXG4gICAgICAgIHZpc2l0ZWROb2RlOiB0cy5EZWNvcmF0b3IsXG4gICAgICAgIHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGVcbiAgICApOiBSZWFkb25seUFycmF5PHRzLk9iamVjdExpdGVyYWxFbGVtZW50TGlrZT4ge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB2aXNpdGVkTm9kZS5leHByZXNzaW9uICYmXG4gICAgICAgICAgICB2aXNpdGVkTm9kZS5leHByZXNzaW9uLmFyZ3VtZW50cyAmJlxuICAgICAgICAgICAgdmlzaXRlZE5vZGUuZXhwcmVzc2lvbi5hcmd1bWVudHMubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGNvbnN0IHBvcCA9IHZpc2l0ZWROb2RlLmV4cHJlc3Npb24uYXJndW1lbnRzWzBdO1xuXG4gICAgICAgICAgICBpZiAocG9wICYmIHBvcC5wcm9wZXJ0aWVzICYmIHBvcC5wcm9wZXJ0aWVzLmxlbmd0aCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHBvcC5wcm9wZXJ0aWVzO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChwb3AgJiYgcG9wLmtpbmQgJiYgcG9wLmtpbmQgPT09IFN5bnRheEtpbmQuU3RyaW5nTGl0ZXJhbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbcG9wXTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ0VtcHR5IG1ldGFkYXRhcywgdHJ5aW5nIHRvIGZpbmQgaXQgd2l0aCBpbXBvcnRzLicpO1xuICAgICAgICAgICAgICAgIHJldHVybiBJbXBvcnRzVXRpbC5maW5kVmFsdWVJbkltcG9ydE9yTG9jYWxWYXJpYWJsZXMocG9wLnRleHQsIHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgaXNBbmd1bGFyTGlmZWN5Y2xlSG9vayhtZXRob2ROYW1lKSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDb3B5cmlnaHQgaHR0cHM6Ly9naXRodWIuY29tL25nLWJvb3RzdHJhcC9uZy1ib290c3RyYXBcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IEFOR1VMQVJfTElGRUNZQ0xFX01FVEhPRFMgPSBbXG4gICAgICAgICAgICAnbmdPbkluaXQnLFxuICAgICAgICAgICAgJ25nT25DaGFuZ2VzJyxcbiAgICAgICAgICAgICduZ0RvQ2hlY2snLFxuICAgICAgICAgICAgJ25nT25EZXN0cm95JyxcbiAgICAgICAgICAgICduZ0FmdGVyQ29udGVudEluaXQnLFxuICAgICAgICAgICAgJ25nQWZ0ZXJDb250ZW50Q2hlY2tlZCcsXG4gICAgICAgICAgICAnbmdBZnRlclZpZXdJbml0JyxcbiAgICAgICAgICAgICduZ0FmdGVyVmlld0NoZWNrZWQnLFxuICAgICAgICAgICAgJ3dyaXRlVmFsdWUnLFxuICAgICAgICAgICAgJ3JlZ2lzdGVyT25DaGFuZ2UnLFxuICAgICAgICAgICAgJ3JlZ2lzdGVyT25Ub3VjaGVkJyxcbiAgICAgICAgICAgICdzZXREaXNhYmxlZFN0YXRlJ1xuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gQU5HVUxBUl9MSUZFQ1lDTEVfTUVUSE9EUy5pbmRleE9mKG1ldGhvZE5hbWUpID49IDA7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdFR5cGVEZWNsYXJhdGlvbihub2RlOiB0cy5UeXBlQWxpYXNEZWNsYXJhdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiAnJyxcbiAgICAgICAgICAgIG5hbWU6IG5vZGUubmFtZS50ZXh0LFxuICAgICAgICAgICAga2luZDogbm9kZS5raW5kXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhub2RlKTtcblxuICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCByZXN1bHQpO1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1hcmtlZHRhZ3MoanNkb2N0YWdzWzBdLnRhZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdEFyZ3VtZW50KGFyZykge1xuICAgICAgICBpZiAoYXJnLm5hbWUgJiYgYXJnLm5hbWUua2luZCA9PSBTeW50YXhLaW5kLk9iamVjdEJpbmRpbmdQYXR0ZXJuKSB7XG4gICAgICAgICAgICBsZXQgcmVzdWx0cyA9IFtdO1xuXG4gICAgICAgICAgICBjb25zdCBkZXN0cnVjdXJlZEdyb3VwSWQgPSB1dWlkdjQoKTtcblxuICAgICAgICAgICAgcmVzdWx0cyA9IGFyZy5uYW1lLmVsZW1lbnRzLm1hcChlbGVtZW50ID0+IHRoaXMudmlzaXRBcmd1bWVudChlbGVtZW50KSk7XG5cbiAgICAgICAgICAgIHJlc3VsdHMgPSByZXN1bHRzLm1hcChyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIHJlc3VsdC5kZXN0cnVjdXJlZEdyb3VwSWQgPSBkZXN0cnVjdXJlZEdyb3VwSWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZiAoYXJnLm5hbWUuZWxlbWVudHMgJiYgYXJnLnR5cGUgJiYgYXJnLnR5cGUubWVtYmVycykge1xuICAgICAgICAgICAgICAgIGlmIChhcmcubmFtZS5lbGVtZW50cy5sZW5ndGggPT09IGFyZy50eXBlLm1lbWJlcnMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJnLm5hbWUuZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHNbaV0udHlwZSA9IHRoaXMuY2xhc3NIZWxwZXIudmlzaXRUeXBlKGFyZy50eXBlLm1lbWJlcnNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoYXJnLm5hbWUuZWxlbWVudHMgJiYgYXJnLnR5cGUgJiYgYXJnLnR5cGUudHlwZU5hbWUpIHtcbiAgICAgICAgICAgICAgICByZXN1bHRzWzBdLnR5cGUgPSB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShhcmcudHlwZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgbmFtZTogYXJnLm5hbWUudGV4dCxcbiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLmNsYXNzSGVscGVyLnZpc2l0VHlwZShhcmcpLFxuICAgICAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJydcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmIChhcmcuZG90RG90RG90VG9rZW4pIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZG90RG90RG90VG9rZW4gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGFyZy5xdWVzdGlvblRva2VuKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbmFsID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcmcuaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQuZGVmYXVsdFZhbHVlID0gYXJnLmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5jbGFzc0hlbHBlci5zdHJpbmdpZnlEZWZhdWx0VmFsdWUoYXJnLmluaXRpYWxpemVyKVxuICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChhcmcudHlwZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50eXBlID0gdGhpcy5tYXBUeXBlKGFyZy50eXBlLmtpbmQpO1xuICAgICAgICAgICAgICAgIGlmIChhcmcudHlwZS5raW5kID09PSBTeW50YXhLaW5kLlR5cGVSZWZlcmVuY2UpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdHJ5IHJlcGxhY2UgVHlwZVJlZmVyZW5jZSB3aXRoIHR5cGVOYW1lXG4gICAgICAgICAgICAgICAgICAgIGlmIChhcmcudHlwZS50eXBlTmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnR5cGUgPSBhcmcudHlwZS50eXBlTmFtZS50ZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QganNkb2N0YWdzID0gdGhpcy5qc2RvY1BhcnNlclV0aWwuZ2V0SlNEb2NzKGFyZyk7XG5cbiAgICAgICAgICAgIGlmIChqc2RvY3RhZ3MgJiYganNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIGpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ZvckRlcHJlY2F0aW9uKGpzZG9jdGFnc1swXS50YWdzLCByZXN1bHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgbWFwVHlwZSh0eXBlKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFN5bnRheEtpbmQuTnVsbEtleXdvcmQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5BbnlLZXl3b3JkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnYW55JztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5Cb29sZWFuS2V5d29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nO1xuICAgICAgICAgICAgY2FzZSBTeW50YXhLaW5kLk5ldmVyS2V5d29yZDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25ldmVyJztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5OdW1iZXJLZXl3b3JkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5TdHJpbmdLZXl3b3JkOlxuICAgICAgICAgICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5VbmRlZmluZWRLZXl3b3JkOlxuICAgICAgICAgICAgICAgIHJldHVybiAndW5kZWZpbmVkJztcbiAgICAgICAgICAgIGNhc2UgU3ludGF4S2luZC5UeXBlUmVmZXJlbmNlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndHlwZVJlZmVyZW5jZSc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGhhc1ByaXZhdGVKU0RvY1RhZyh0YWdzKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRhZ3MpIHtcbiAgICAgICAgICAgIHRhZ3MuZm9yRWFjaCh0YWcgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZSAmJiB0YWcudGFnTmFtZS50ZXh0ICYmIHRhZy50YWdOYW1lLnRleHQgPT09ICdwcml2YXRlJykge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdEZ1bmN0aW9uRGVjbGFyYXRpb24obWV0aG9kOiB0cy5GdW5jdGlvbkRlY2xhcmF0aW9uKSB7XG4gICAgICAgIGNvbnN0IG1ldGhvZE5hbWUgPSBtZXRob2QubmFtZSA/IG1ldGhvZC5uYW1lLnRleHQgOiAnVW5uYW1lZCBmdW5jdGlvbic7XG4gICAgICAgIGNvbnN0IHJlc3VsdEFyZ3VtZW50cyA9IFtdO1xuICAgICAgICBjb25zdCByZXN1bHQ6IGFueSA9IHtcbiAgICAgICAgICAgIGRlcHJlY2F0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiAnJyxcbiAgICAgICAgICAgIG5hbWU6IG1ldGhvZE5hbWVcbiAgICAgICAgfTtcblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1ldGhvZC5wYXJhbWV0ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhcmd1bWVudCA9IG1ldGhvZC5wYXJhbWV0ZXJzW2ldO1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYXJndW1lbnRQYXJzZWQgPSB0aGlzLnZpc2l0QXJndW1lbnQoYXJndW1lbnQpO1xuICAgICAgICAgICAgICAgIGlmIChhcmd1bWVudFBhcnNlZC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgYXJndW1lbnRQYXJzZWQubGVuZ3RoOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFyZ3VtZW50UGFyc2VkSW5zaWRlID0gYXJndW1lbnRQYXJzZWRbal07XG4gICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudFBhcnNlZEluc2lkZS5kZXN0cnVjdHVyZWRQYXJhbWV0ZXIgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0QXJndW1lbnRzLnB1c2goYXJndW1lbnRQYXJzZWRJbnNpZGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0QXJndW1lbnRzLnB1c2goYXJndW1lbnRQYXJzZWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJlc3VsdC5hcmdzID0gcmVzdWx0QXJndW1lbnRzO1xuXG4gICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhtZXRob2QpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgbWV0aG9kLnR5cGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICByZXN1bHQucmV0dXJuVHlwZSA9IHRoaXMuY2xhc3NIZWxwZXIudmlzaXRUeXBlKG1ldGhvZC50eXBlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJzKSB7XG4gICAgICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGV0IGtpbmRzID0gbWV0aG9kLm1vZGlmaWVyc1xuICAgICAgICAgICAgICAgICAgICAubWFwKG1vZGlmaWVyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2RpZmllci5raW5kO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAucmV2ZXJzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgXy5pbmRleE9mKGtpbmRzLCBTeW50YXhLaW5kLlB1YmxpY0tleXdvcmQpICE9PSAtMSAmJlxuICAgICAgICAgICAgICAgICAgICBfLmluZGV4T2Yoa2luZHMsIFN5bnRheEtpbmQuU3RhdGljS2V5d29yZCkgIT09IC0xXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGtpbmRzID0ga2luZHMuZmlsdGVyKGtpbmQgPT4ga2luZCAhPT0gU3ludGF4S2luZC5QdWJsaWNLZXl3b3JkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgcmVzdWx0KTtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtYXJrZWR0YWdzKGpzZG9jdGFnc1swXS50YWdzKTtcbiAgICAgICAgICAgIF8uZm9yRWFjaChqc2RvY3RhZ3NbMF0udGFncywgdGFnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGFnLnRhZ05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZy50YWdOYW1lLnRleHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YWcudGFnTmFtZS50ZXh0LmluZGV4T2YoJ2lnbm9yZScpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuaWdub3JlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQuanNkb2N0YWdzICYmIHJlc3VsdC5qc2RvY3RhZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmpzZG9jdGFncyA9IG1lcmdlVGFnc0FuZEFyZ3MocmVzdWx0LmFyZ3MsIHJlc3VsdC5qc2RvY3RhZ3MpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3VsdC5hcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5qc2RvY3RhZ3MgPSBtZXJnZVRhZ3NBbmRBcmdzKHJlc3VsdC5hcmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0ICYmIG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAoaTsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5uYW1lLnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhc3NIZWxwZXIuc3RyaW5naWZ5RGVmYXVsdFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLmluaXRpYWxpemVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRpb25NZXNzYWdlOiAnJ1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9uc1tpXS5pbml0aWFsaXplcikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQuaW5pdGlhbGl6ZXIgPSBub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0uaW5pdGlhbGl6ZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uTGlzdC5kZWNsYXJhdGlvbnNbaV0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQudHlwZSA9IHRoaXMuY2xhc3NIZWxwZXIudmlzaXRUeXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQudHlwZSA9PT0gJ3VuZGVmaW5lZCcgJiYgcmVzdWx0LmluaXRpYWxpemVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50eXBlID0ga2luZFRvVHlwZShyZXN1bHQuaW5pdGlhbGl6ZXIua2luZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoanNkb2N0YWdzICYmIGpzZG9jdGFncy5sZW5ndGggPj0gMSAmJiBqc2RvY3RhZ3NbMF0udGFncykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrRm9yRGVwcmVjYXRpb24oanNkb2N0YWdzWzBdLnRhZ3MsIHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHZpc2l0RW51bVR5cGVBbGlhc0Z1bmN0aW9uRGVjbGFyYXRpb25EZXNjcmlwdGlvbihub2RlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IGRlc2NyaXB0aW9uOiBzdHJpbmcgPSAnJztcbiAgICAgICAgaWYgKG5vZGUuanNEb2MpIHtcbiAgICAgICAgICAgIGlmIChub2RlLmpzRG9jLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG5vZGUuanNEb2NbMF0uY29tbWVudCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmF3RGVzY3JpcHRpb24gPSB0aGlzLmpzZG9jUGFyc2VyVXRpbC5wYXJzZUpTRG9jTm9kZShub2RlLmpzRG9jWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBtYXJrZWRBY2wocmF3RGVzY3JpcHRpb24pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGVzY3JpcHRpb247XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB2aXNpdEVudW1EZWNsYXJhdGlvbihub2RlOiB0cy5FbnVtRGVjbGFyYXRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0OiBhbnkgPSB7XG4gICAgICAgICAgICBkZXByZWNhdGVkOiBmYWxzZSxcbiAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJycsXG4gICAgICAgICAgICBuYW1lOiBub2RlLm5hbWUudGV4dCxcbiAgICAgICAgICAgIG1lbWJlcnM6IFtdXG4gICAgICAgIH07XG4gICAgICAgIGlmIChub2RlLm1lbWJlcnMpIHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBub2RlLm1lbWJlcnMubGVuZ3RoO1xuICAgICAgICAgICAgbGV0IG1lbWJlcmpzZG9jdGFncyA9IFtdO1xuICAgICAgICAgICAgZm9yIChpOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgICAgICBjb25zdCBtZW1iZXI6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZS5tZW1iZXJzW2ldLm5hbWUudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGRlcHJlY2F0aW9uTWVzc2FnZTogJydcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChub2RlLm1lbWJlcnNbaV0uaW5pdGlhbGl6ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGluaXRpYWxpemVyIGtpbmQgaXMgYSBudW1iZXIgZG8gY2FzdCB0byB0aGUgbnVtYmVyIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgbWVtYmVyLnZhbHVlID0gSXNLaW5kVHlwZS5OVU1CRVIobm9kZS5tZW1iZXJzW2ldLmluaXRpYWxpemVyLmtpbmQpXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE51bWJlcihub2RlLm1lbWJlcnNbaV0uaW5pdGlhbGl6ZXIudGV4dClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogbm9kZS5tZW1iZXJzW2ldLmluaXRpYWxpemVyLnRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG1lbWJlcmpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhub2RlLm1lbWJlcnNbaV0pO1xuICAgICAgICAgICAgICAgIGlmIChtZW1iZXJqc2RvY3RhZ3MgJiYgbWVtYmVyanNkb2N0YWdzLmxlbmd0aCA+PSAxICYmIG1lbWJlcmpzZG9jdGFnc1swXS50YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihtZW1iZXJqc2RvY3RhZ3NbMF0udGFncywgbWVtYmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzdWx0Lm1lbWJlcnMucHVzaChtZW1iZXIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGpzZG9jdGFncyA9IHRoaXMuanNkb2NQYXJzZXJVdGlsLmdldEpTRG9jcyhub2RlKTtcbiAgICAgICAgaWYgKGpzZG9jdGFncyAmJiBqc2RvY3RhZ3MubGVuZ3RoID49IDEgJiYganNkb2N0YWdzWzBdLnRhZ3MpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tGb3JEZXByZWNhdGlvbihqc2RvY3RhZ3NbMF0udGFncywgcmVzdWx0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIHByaXZhdGUgdmlzaXRFbnVtRGVjbGFyYXRpb25Gb3JSb3V0ZXMoZmlsZU5hbWUsIG5vZGUpIHtcbiAgICAgICAgaWYgKG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IG5vZGUuZGVjbGFyYXRpb25MaXN0LmRlY2xhcmF0aW9ucy5sZW5ndGg7XG4gICAgICAgICAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlc0luaXRpYWxpemVyID0gbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLmluaXRpYWxpemVyO1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBuZXcgQ29kZUdlbmVyYXRvcigpLmdlbmVyYXRlKHJvdXRlc0luaXRpYWxpemVyKTtcbiAgICAgICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsLmFkZFJvdXRlKHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbm9kZS5kZWNsYXJhdGlvbkxpc3QuZGVjbGFyYXRpb25zW2ldLm5hbWUudGV4dCxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogUm91dGVyUGFyc2VyVXRpbC5jbGVhblJhd1JvdXRlKGRhdGEpLFxuICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZTogZmlsZU5hbWVcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZXM6IGRhdGFcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0Um91dGVJTyhmaWxlbmFtZTogc3RyaW5nLCBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLCBub2RlOiB0cy5Ob2RlKSB7XG4gICAgICAgIGxldCByZXM7XG4gICAgICAgIGlmIChzb3VyY2VGaWxlLnN0YXRlbWVudHMpIHtcbiAgICAgICAgICAgIHJlcyA9IHNvdXJjZUZpbGUuc3RhdGVtZW50cy5yZWR1Y2UoKGRpcmVjdGl2ZSwgc3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKFJvdXRlclBhcnNlclV0aWwuaXNWYXJpYWJsZVJvdXRlcyhzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZS5jb25jYXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aXNpdEVudW1EZWNsYXJhdGlvbkZvclJvdXRlcyhmaWxlbmFtZSwgc3RhdGVtZW50KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgICAgICAgICB9LCBbXSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzWzBdIHx8IHt9O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRDbGFzc0lPKFxuICAgICAgICBmaWxlbmFtZTogc3RyaW5nLFxuICAgICAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLFxuICAgICAgICBub2RlOiB0cy5Ob2RlLFxuICAgICAgICBmaWxlQm9keSxcbiAgICAgICAgYXN0RmlsZVxuICAgICkge1xuICAgICAgICAvKipcbiAgICAgICAgICogQ29weXJpZ2h0IGh0dHBzOi8vZ2l0aHViLmNvbS9uZy1ib290c3RyYXAvbmctYm9vdHN0cmFwXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCByZWR1Y2VkU291cmNlID0gZmlsZUJvZHkgPyBmaWxlQm9keS5zdGF0ZW1lbnRzIDogc291cmNlRmlsZS5zdGF0ZW1lbnRzO1xuICAgICAgICBjb25zdCByZXMgPSByZWR1Y2VkU291cmNlLnJlZHVjZSgoZGlyZWN0aXZlLCBzdGF0ZW1lbnQpID0+IHtcbiAgICAgICAgICAgIGlmICh0cy5pc0NsYXNzRGVjbGFyYXRpb24oc3RhdGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZW1lbnQucG9zID09PSBub2RlLnBvcyAmJiBzdGF0ZW1lbnQuZW5kID09PSBub2RlLmVuZCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGlyZWN0aXZlLmNvbmNhdChcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2xhc3NIZWxwZXIudmlzaXRDbGFzc0RlY2xhcmF0aW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VGaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzdEZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmU7XG4gICAgICAgIH0sIFtdKTtcblxuICAgICAgICByZXR1cm4gcmVzWzBdIHx8IHt9O1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SW50ZXJmYWNlSU8oZmlsZW5hbWU6IHN0cmluZywgc291cmNlRmlsZSwgbm9kZSwgZmlsZUJvZHksIGFzdEZpbGUpIHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIENvcHlyaWdodCBodHRwczovL2dpdGh1Yi5jb20vbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcFxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgcmVkdWNlZFNvdXJjZSA9IGZpbGVCb2R5ID8gZmlsZUJvZHkuc3RhdGVtZW50cyA6IHNvdXJjZUZpbGUuc3RhdGVtZW50cztcbiAgICAgICAgY29uc3QgcmVzID0gcmVkdWNlZFNvdXJjZS5yZWR1Y2UoKGRpcmVjdGl2ZSwgc3RhdGVtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAodHMuaXNJbnRlcmZhY2VEZWNsYXJhdGlvbihzdGF0ZW1lbnQpKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlbWVudC5wb3MgPT09IG5vZGUucG9zICYmIHN0YXRlbWVudC5lbmQgPT09IG5vZGUuZW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmUuY29uY2F0KFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGFzc0hlbHBlci52aXNpdENsYXNzRGVjbGFyYXRpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXN0RmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGRpcmVjdGl2ZTtcbiAgICAgICAgfSwgW10pO1xuXG4gICAgICAgIHJldHVybiByZXNbMF0gfHwge307XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgQ29tcG9uZW50Q2FjaGUgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2NvbXBvbmVudC1oZWxwZXInO1xuaW1wb3J0IHsgSnNEb2NIZWxwZXIgfSBmcm9tICcuL2FuZ3VsYXIvZGVwcy9oZWxwZXJzL2pzLWRvYy1oZWxwZXInO1xuaW1wb3J0IHsgTW9kdWxlSGVscGVyIH0gZnJvbSAnLi9hbmd1bGFyL2RlcHMvaGVscGVycy9tb2R1bGUtaGVscGVyJztcbmltcG9ydCB7IFN5bWJvbEhlbHBlciB9IGZyb20gJy4vYW5ndWxhci9kZXBzL2hlbHBlcnMvc3ltYm9sLWhlbHBlcic7XG5pbXBvcnQgeyBGcmFtZXdvcmtEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2ZyYW1ld29yay1kZXBlbmRlbmNpZXMnO1xuXG5leHBvcnQgY2xhc3MgQW5ndWxhckpTRGVwZW5kZW5jaWVzIGV4dGVuZHMgRnJhbWV3b3JrRGVwZW5kZW5jaWVzIHtcbiAgICBwcml2YXRlIGVuZ2luZTogYW55O1xuICAgIHByaXZhdGUgY2FjaGU6IENvbXBvbmVudENhY2hlID0gbmV3IENvbXBvbmVudENhY2hlKCk7XG4gICAgcHJpdmF0ZSBtb2R1bGVIZWxwZXIgPSBuZXcgTW9kdWxlSGVscGVyKHRoaXMuY2FjaGUpO1xuICAgIHByaXZhdGUganNEb2NIZWxwZXIgPSBuZXcgSnNEb2NIZWxwZXIoKTtcbiAgICBwcml2YXRlIHN5bWJvbEhlbHBlciA9IG5ldyBTeW1ib2xIZWxwZXIoKTtcblxuICAgIGNvbnN0cnVjdG9yKGZpbGVzOiBzdHJpbmdbXSwgb3B0aW9uczogYW55KSB7XG4gICAgICAgIHN1cGVyKGZpbGVzLCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0RGVwZW5kZW5jaWVzKCkge1xuICAgICAgICBsZXQgZGVwcyA9IHtcbiAgICAgICAgICAgIG1vZHVsZXM6IFtdLFxuICAgICAgICAgICAgbW9kdWxlc0ZvckdyYXBoOiBbXSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgICAgICAgaW5qZWN0YWJsZXM6IFtdLFxuICAgICAgICAgICAgaW50ZXJjZXB0b3JzOiBbXSxcbiAgICAgICAgICAgIHBpcGVzOiBbXSxcbiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtdLFxuICAgICAgICAgICAgcm91dGVzOiBbXSxcbiAgICAgICAgICAgIGNsYXNzZXM6IFtdLFxuICAgICAgICAgICAgaW50ZXJmYWNlczogW10sXG4gICAgICAgICAgICBtaXNjZWxsYW5lb3VzOiB7XG4gICAgICAgICAgICAgICAgdmFyaWFibGVzOiBbXSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbnM6IFtdLFxuICAgICAgICAgICAgICAgIHR5cGVhbGlhc2VzOiBbXSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhdGlvbnM6IFtdXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgcm91dGVzVHJlZTogdW5kZWZpbmVkXG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBkZXBzO1xuICAgIH1cbn1cbiIsImV4cG9ydCBmdW5jdGlvbiBwcm9taXNlU2VxdWVudGlhbChwcm9taXNlcykge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShwcm9taXNlcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGaXJzdCBhcmd1bWVudCBuZWVkIHRvIGJlIGFuIGFycmF5IG9mIFByb21pc2VzJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgbGV0IGNvdW50ID0gMDtcbiAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTtcblxuICAgICAgICBjb25zdCBpdGVyYXRlZUZ1bmMgPSAocHJldmlvdXNQcm9taXNlLCBjdXJyZW50UHJvbWlzZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHByZXZpb3VzUHJvbWlzZVxuICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY291bnQrKyAhPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cyA9IHJlc3VsdHMuY29uY2F0KHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQcm9taXNlKHJlc3VsdCwgcmVzdWx0cywgY291bnQpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmNhdGNoKGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBwcm9taXNlcyA9IHByb21pc2VzLmNvbmNhdCgoKSA9PiBQcm9taXNlLnJlc29sdmUoKSk7XG5cbiAgICAgICAgcHJvbWlzZXMucmVkdWNlKGl0ZXJhdGVlRnVuYywgUHJvbWlzZS5yZXNvbHZlKGZhbHNlKSkudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZShyZXN1bHRzKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG59XG4iLCJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBMaXZlU2VydmVyIGZyb20gJ0Bjb21wb2RvYy9saXZlLXNlcnZlcic7XG5pbXBvcnQgKiBhcyBfIGZyb20gJ2xvZGFzaCc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBTeW50YXhLaW5kIH0gZnJvbSAndHMtbW9ycGgnO1xuXG5jb25zdCBjaG9raWRhciA9IHJlcXVpcmUoJ2Nob2tpZGFyJyk7XG5cbmNvbnN0IHRyYXZlcnNlID0gcmVxdWlyZSgnbmVvdHJhdmVyc2UvbGVnYWN5Jyk7XG5jb25zdCBjcnlwdG8gPSByZXF1aXJlKCdjcnlwdG8nKTtcbmNvbnN0IGJhYmVsID0gcmVxdWlyZSgnQGJhYmVsL2NvcmUnKTtcblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi4vdXRpbHMvbG9nZ2VyJztcblxuaW1wb3J0IENvbmZpZ3VyYXRpb24gZnJvbSAnLi9jb25maWd1cmF0aW9uJztcblxuaW1wb3J0IERlcGVuZGVuY2llc0VuZ2luZSBmcm9tICcuL2VuZ2luZXMvZGVwZW5kZW5jaWVzLmVuZ2luZSc7XG5pbXBvcnQgRXhwb3J0RW5naW5lIGZyb20gJy4vZW5naW5lcy9leHBvcnQuZW5naW5lJztcbmltcG9ydCBGaWxlRW5naW5lIGZyb20gJy4vZW5naW5lcy9maWxlLmVuZ2luZSc7XG5pbXBvcnQgSHRtbEVuZ2luZSBmcm9tICcuL2VuZ2luZXMvaHRtbC5lbmdpbmUnO1xuaW1wb3J0IEkxOG5FbmdpbmUgZnJvbSAnLi9lbmdpbmVzL2kxOG4uZW5naW5lJztcbmltcG9ydCBNYXJrZG93bkVuZ2luZSwgeyBtYXJrZG93blJlYWRlZERhdGFzIH0gZnJvbSAnLi9lbmdpbmVzL21hcmtkb3duLmVuZ2luZSc7XG5pbXBvcnQgTmdkRW5naW5lIGZyb20gJy4vZW5naW5lcy9uZ2QuZW5naW5lJztcbmltcG9ydCBTZWFyY2hFbmdpbmUgZnJvbSAnLi9lbmdpbmVzL3NlYXJjaC5lbmdpbmUnO1xuXG5pbXBvcnQgeyBBbmd1bGFyRGVwZW5kZW5jaWVzIH0gZnJvbSAnLi9jb21waWxlci9hbmd1bGFyLWRlcGVuZGVuY2llcyc7XG5pbXBvcnQgeyBBbmd1bGFySlNEZXBlbmRlbmNpZXMgfSBmcm9tICcuL2NvbXBpbGVyL2FuZ3VsYXJqcy1kZXBlbmRlbmNpZXMnO1xuXG5pbXBvcnQgQW5ndWxhclZlcnNpb25VdGlsIGZyb20gJy4uL3V0aWxzL2FuZ3VsYXItdmVyc2lvbi51dGlsJztcbmltcG9ydCB7IENPTVBPRE9DX0NPTlNUQU5UUyB9IGZyb20gJy4uL3V0aWxzL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBDT01QT0RPQ19ERUZBVUxUUyB9IGZyb20gJy4uL3V0aWxzL2RlZmF1bHRzJztcbmltcG9ydCB7IHByb21pc2VTZXF1ZW50aWFsIH0gZnJvbSAnLi4vdXRpbHMvcHJvbWlzZS1zZXF1ZW50aWFsJztcbmltcG9ydCBSb3V0ZXJQYXJzZXJVdGlsIGZyb20gJy4uL3V0aWxzL3JvdXRlci1wYXJzZXIudXRpbCc7XG5cbmltcG9ydCB7XG4gICAgY2xlYW5OYW1lV2l0aG91dFNwYWNlQW5kVG9Mb3dlckNhc2UsXG4gICAgY2xlYW5Tb3VyY2VzRm9yV2F0Y2gsXG4gICAgZmluZE1haW5Tb3VyY2VGb2xkZXJcbn0gZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuXG5pbXBvcnQgeyBBZGRpdGlvbmFsTm9kZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9hZGRpdGlvbmFsLW5vZGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IENvdmVyYWdlRGF0YSB9IGZyb20gJy4vaW50ZXJmYWNlcy9jb3ZlcmFnZURhdGEuaW50ZXJmYWNlJztcbmltcG9ydCB7IExpdmVTZXJ2ZXJDb25maWd1cmF0aW9uIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2xpdmUtc2VydmVyLWNvbmZpZ3VyYXRpb24uaW50ZXJmYWNlJztcbmltcG9ydCB7IG1hcmtlZEFjbCB9IGZyb20gJy4uL3V0aWxzL21hcmtlZC5hY2wnO1xuaW1wb3J0IHsgSUNvbXBvbmVudERlcCB9IGZyb20gJy4vY29tcGlsZXIvYW5ndWxhci9kZXBzL2NvbXBvbmVudC1kZXAuZmFjdG9yeSc7XG5cbmNvbnN0IGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG5sZXQgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcbmxldCBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmU7XG5sZXQgZ2VuZXJhdGlvblByb21pc2VSZWplY3Q7XG5jb25zdCBnZW5lcmF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUgPSByZXNvbHZlO1xuICAgIGdlbmVyYXRpb25Qcm9taXNlUmVqZWN0ID0gcmVqZWN0O1xufSk7XG5cbmV4cG9ydCBjbGFzcyBBcHBsaWNhdGlvbiB7XG4gICAgLyoqXG4gICAgICogRmlsZXMgcHJvY2Vzc2VkIGR1cmluZyBpbml0aWFsIHNjYW5uaW5nXG4gICAgICovXG4gICAgcHVibGljIGZpbGVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEZpbGVzIHByb2Nlc3NlZCBkdXJpbmcgd2F0Y2ggc2Nhbm5pbmdcbiAgICAgKi9cbiAgICBwdWJsaWMgdXBkYXRlZEZpbGVzOiBBcnJheTxzdHJpbmc+O1xuICAgIC8qKlxuICAgICAqIEZpbGVzIGNoYW5nZWQgZHVyaW5nIHdhdGNoIHNjYW5uaW5nXG4gICAgICovXG4gICAgcHVibGljIHdhdGNoQ2hhbmdlZEZpbGVzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgLyoqXG4gICAgICogQm9vbGVhbiBmb3Igd2F0Y2hpbmcgc3RhdHVzXG4gICAgICogQHR5cGUge2Jvb2xlYW59XG4gICAgICovXG4gICAgcHVibGljIGlzV2F0Y2hpbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIC8qKlxuICAgICAqIFN0b3JlIHBhY2thZ2UuanNvbiBkYXRhXG4gICAgICovXG4gICAgcHJpdmF0ZSBwYWNrYWdlSnNvbkRhdGEgPSB7fTtcblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyBjb21wb2RvYyBhcHBsaWNhdGlvbiBpbnN0YW5jZS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBvcHRpb25zIEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBvcHRpb25zIHRoYXQgc2hvdWxkIGJlIHVzZWQuXG4gICAgICovXG4gICAgY29uc3RydWN0b3Iob3B0aW9ucz86IE9iamVjdCkge1xuICAgICAgICBmb3IgKGxldCBvcHRpb24gaW4gb3B0aW9ucykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBDb25maWd1cmF0aW9uLm1haW5EYXRhW29wdGlvbl0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YVtvcHRpb25dID0gb3B0aW9uc1tvcHRpb25dO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gRm9yIGRvY3VtZW50YXRpb25NYWluTmFtZSwgcHJvY2VzcyBpdCBvdXRzaWRlIHRoZSBsb29wLCBmb3IgaGFuZGxpbmcgY29uZmxpY3Qgd2l0aCBwYWdlcyBuYW1lXG4gICAgICAgICAgICBpZiAob3B0aW9uID09PSAnbmFtZScpIHtcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRvY3VtZW50YXRpb25NYWluTmFtZSA9IG9wdGlvbnNbb3B0aW9uXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEZvciBkb2N1bWVudGF0aW9uTWFpbk5hbWUsIHByb2Nlc3MgaXQgb3V0c2lkZSB0aGUgbG9vcCwgZm9yIGhhbmRsaW5nIGNvbmZsaWN0IHdpdGggcGFnZXMgbmFtZVxuICAgICAgICAgICAgaWYgKG9wdGlvbiA9PT0gJ3NpbGVudCcpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuc2lsZW50ID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBTdGFydCBjb21wb2RvYyBwcm9jZXNzXG4gICAgICovXG4gICAgcHJvdGVjdGVkIGdlbmVyYXRlKCk6IFByb21pc2U8e30+IHtcbiAgICAgICAgcHJvY2Vzcy5vbigndW5oYW5kbGVkUmVqZWN0aW9uJywgdGhpcy51bmhhbmRsZWRSZWplY3Rpb25MaXN0ZW5lcik7XG4gICAgICAgIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgdGhpcy51bmNhdWdodEV4Y2VwdGlvbkxpc3RlbmVyKTtcblxuICAgICAgICBJMThuRW5naW5lLmluaXQoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5sYW5ndWFnZSk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQuY2hhckF0KENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lmxlbmd0aCAtIDEpICE9PSAnLydcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCArPSAnLyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFja2FnZUpzb24oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIEh0bWxFbmdpbmUuaW5pdChDb25maWd1cmF0aW9uLm1haW5EYXRhLnRlbXBsYXRlcykudGhlbigoKSA9PiB0aGlzLnByb2Nlc3NQYWNrYWdlSnNvbigpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZ2VuZXJhdGlvblByb21pc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBlbmRDYWxsYmFjaygpIHtcbiAgICAgICAgcHJvY2Vzcy5yZW1vdmVMaXN0ZW5lcigndW5oYW5kbGVkUmVqZWN0aW9uJywgdGhpcy51bmhhbmRsZWRSZWplY3Rpb25MaXN0ZW5lcik7XG4gICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoJ3VuY2F1Z2h0RXhjZXB0aW9uJywgdGhpcy51bmNhdWdodEV4Y2VwdGlvbkxpc3RlbmVyKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVuaGFuZGxlZFJlamVjdGlvbkxpc3RlbmVyKGVyciwgcCkge1xuICAgICAgICBjb25zb2xlLmxvZygnVW5oYW5kbGVkIFJlamVjdGlvbiBhdDonLCBwLCAncmVhc29uOicsIGVycik7XG4gICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICdTb3JyeSwgYnV0IHRoZXJlIHdhcyBhIHByb2JsZW0gZHVyaW5nIHBhcnNpbmcgb3IgZ2VuZXJhdGlvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbi4gUGxlYXNlIGZpbGwgYW4gaXNzdWUgb24gZ2l0aHViLiAoaHR0cHM6Ly9naXRodWIuY29tL2NvbXBvZG9jL2NvbXBvZG9jL2lzc3Vlcy9uZXcpJ1xuICAgICAgICApOyAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVuY2F1Z2h0RXhjZXB0aW9uTGlzdGVuZXIoZXJyKSB7XG4gICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAnU29ycnksIGJ1dCB0aGVyZSB3YXMgYSBwcm9ibGVtIGR1cmluZyBwYXJzaW5nIG9yIGdlbmVyYXRpb24gb2YgdGhlIGRvY3VtZW50YXRpb24uIFBsZWFzZSBmaWxsIGFuIGlzc3VlIG9uIGdpdGh1Yi4gKGh0dHBzOi8vZ2l0aHViLmNvbS9jb21wb2RvYy9jb21wb2RvYy9pc3N1ZXMvbmV3KSdcbiAgICAgICAgKTsgLy8gdHNsaW50OmRpc2FibGUtbGluZVxuICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RhcnQgY29tcG9kb2MgZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCB0ZXN0Q292ZXJhZ2UoKSB7XG4gICAgICAgIHRoaXMuZ2V0RGVwZW5kZW5jaWVzRGF0YSgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0b3JlIGZpbGVzIGZvciBpbml0aWFsIHByb2Nlc3NpbmdcbiAgICAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSBmaWxlcyBGaWxlcyBmb3VuZCBkdXJpbmcgc291cmNlIGZvbGRlciBhbmQgdHNjb25maWcgc2NhblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRGaWxlcyhmaWxlczogQXJyYXk8c3RyaW5nPikge1xuICAgICAgICB0aGlzLmZpbGVzID0gZmlsZXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcmUgZmlsZXMgZm9yIHdhdGNoIHByb2Nlc3NpbmdcbiAgICAgKiBAcGFyYW0gIHtBcnJheTxzdHJpbmc+fSBmaWxlcyBGaWxlcyBmb3VuZCBkdXJpbmcgc291cmNlIGZvbGRlciBhbmQgdHNjb25maWcgc2NhblxuICAgICAqL1xuICAgIHB1YmxpYyBzZXRVcGRhdGVkRmlsZXMoZmlsZXM6IEFycmF5PHN0cmluZz4pIHtcbiAgICAgICAgdGhpcy51cGRhdGVkRmlsZXMgPSBmaWxlcztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBib29sZWFuIGluZGljYXRpbmcgcHJlc2VuY2Ugb2Ygb25lIFR5cGVTY3JpcHQgZmlsZSBpbiB1cGRhdGVkRmlsZXMgbGlzdFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJlc3VsdCBvZiBzY2FuXG4gICAgICovXG4gICAgcHVibGljIGhhc1dhdGNoZWRGaWxlc1RTRmlsZXMoKTogYm9vbGVhbiB7XG4gICAgICAgIGxldCByZXN1bHQgPSBmYWxzZTtcblxuICAgICAgICBfLmZvckVhY2godGhpcy51cGRhdGVkRmlsZXMsIGZpbGUgPT4ge1xuICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIGJvb2xlYW4gaW5kaWNhdGluZyBwcmVzZW5jZSBvZiBvbmUgcm9vdCBtYXJrZG93biBmaWxlcyBpbiB1cGRhdGVkRmlsZXMgbGlzdFxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJlc3VsdCBvZiBzY2FuXG4gICAgICovXG4gICAgcHVibGljIGhhc1dhdGNoZWRGaWxlc1Jvb3RNYXJrZG93bkZpbGVzKCk6IGJvb2xlYW4ge1xuICAgICAgICBsZXQgcmVzdWx0ID0gZmFsc2U7XG5cbiAgICAgICAgXy5mb3JFYWNoKHRoaXMudXBkYXRlZEZpbGVzLCBmaWxlID0+IHtcbiAgICAgICAgICAgIGlmIChwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcubWQnICYmIHBhdGguZGlybmFtZShmaWxlKSA9PT0gY3dkKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDbGVhciBmaWxlcyBmb3Igd2F0Y2ggcHJvY2Vzc2luZ1xuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhclVwZGF0ZWRGaWxlcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy51cGRhdGVkRmlsZXMgPSBbXTtcbiAgICAgICAgdGhpcy53YXRjaENoYW5nZWRGaWxlcyA9IFtdO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1BhY2thZ2VKc29uKCk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuaW5mbygnU2VhcmNoaW5nIHBhY2thZ2UuanNvbiBmaWxlJyk7XG4gICAgICAgIEZpbGVFbmdpbmUuZ2V0KGN3ZCArIHBhdGguc2VwICsgJ3BhY2thZ2UuanNvbicpLnRoZW4oXG4gICAgICAgICAgICBwYWNrYWdlRGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKHBhY2thZ2VEYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLnBhY2thZ2VKc29uRGF0YSA9IHBhcnNlZERhdGE7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICB0eXBlb2YgcGFyc2VkRGF0YS5uYW1lICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRvY3VtZW50YXRpb25NYWluTmFtZSA9PT0gQ09NUE9ET0NfREVGQVVMVFMudGl0bGVcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkRGF0YS5uYW1lICsgJyBkb2N1bWVudGF0aW9uJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWREYXRhLmRlc2NyaXB0aW9uICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRvY3VtZW50YXRpb25NYWluRGVzY3JpcHRpb24gPSBwYXJzZWREYXRhLmRlc2NyaXB0aW9uO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJWZXJzaW9uID1cbiAgICAgICAgICAgICAgICAgICAgQW5ndWxhclZlcnNpb25VdGlsLmdldEFuZ3VsYXJWZXJzaW9uT2ZQcm9qZWN0KHBhcnNlZERhdGEpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdwYWNrYWdlLmpzb24gZmlsZSBmb3VuZCcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJzZWREYXRhLmRlcGVuZGVuY2llcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhY2thZ2VEZXBlbmRlbmNpZXMocGFyc2VkRGF0YS5kZXBlbmRlbmNpZXMpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyc2VkRGF0YS5wZWVyRGVwZW5kZW5jaWVzICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFja2FnZVBlZXJEZXBlbmRlbmNpZXMocGFyc2VkRGF0YS5wZWVyRGVwZW5kZW5jaWVzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzVG9DaGVjayA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJzaW9uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdkZXNjcmlwdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAna2V5d29yZHMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2hvbWVwYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdidWdzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdsaWNlbnNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdyZXBvc2l0b3J5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhdXRob3InXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICAgICAgICAgIGxldCBoYXNPbmVPZkNoZWNrZWRQcm9wZXJ0aWVzID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXNUb0NoZWNrLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCBpbiBwYXJzZWREYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzT25lT2ZDaGVja2VkUHJvcGVydGllcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wYWNrYWdlUHJvcGVydGllc1twcm9wXSA9IHBhcnNlZERhdGFbcHJvcF07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFzT25lT2ZDaGVja2VkUHJvcGVydGllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvcGVydGllcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICdwYWNrYWdlUHJvcGVydGllcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ3BhY2thZ2UtcHJvcGVydGllcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NNYXJrZG93bnMoKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldERlcGVuZGVuY2llc0RhdGEoKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignQ29udGludWluZyB3aXRob3V0IHBhY2thZ2UuanNvbiBmaWxlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzTWFya2Rvd25zKCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXREZXBlbmRlbmNpZXNEYXRhKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGVycm9yTWVzc2FnZTEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycm9yTWVzc2FnZTEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NQYWNrYWdlUGVlckRlcGVuZGVuY2llcyhkZXBlbmRlbmNpZXMpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3NpbmcgcGFja2FnZS5qc29uIHBlZXJEZXBlbmRlbmNpZXMnKTtcbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wYWNrYWdlUGVlckRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcztcbiAgICAgICAgaWYgKCFDb25maWd1cmF0aW9uLmhhc1BhZ2UoJ2RlcGVuZGVuY2llcycpKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdkZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgICAgIGlkOiAncGFja2FnZURlcGVuZGVuY2llcycsXG4gICAgICAgICAgICAgICAgY29udGV4dDogJ3BhY2thZ2UtZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1BhY2thZ2VEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzaW5nIHBhY2thZ2UuanNvbiBkZXBlbmRlbmNpZXMnKTtcbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wYWNrYWdlRGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzO1xuICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgbmFtZTogJ2RlcGVuZGVuY2llcycsXG4gICAgICAgICAgICBpZDogJ3BhY2thZ2VEZXBlbmRlbmNpZXMnLFxuICAgICAgICAgICAgY29udGV4dDogJ3BhY2thZ2UtZGVwZW5kZW5jaWVzJyxcbiAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NNYXJrZG93bnMoKTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAnU2VhcmNoaW5nIFJFQURNRS5tZCwgQ0hBTkdFTE9HLm1kLCBDT05UUklCVVRJTkcubWQsIExJQ0VOU0UubWQsIFRPRE8ubWQgZmlsZXMnXG4gICAgICAgICk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IG1hcmtkb3ducyA9IFsncmVhZG1lJywgJ2NoYW5nZWxvZycsICdjb250cmlidXRpbmcnLCAnbGljZW5zZScsICd0b2RvJ107XG4gICAgICAgICAgICBjb25zdCBudW1iZXJPZk1hcmtkb3ducyA9IDU7XG4gICAgICAgICAgICBjb25zdCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbnVtYmVyT2ZNYXJrZG93bnMpIHtcbiAgICAgICAgICAgICAgICAgICAgTWFya2Rvd25FbmdpbmUuZ2V0VHJhZGl0aW9uYWxNYXJrZG93bihtYXJrZG93bnNbaV0udG9VcHBlckNhc2UoKSkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkbWVEYXRhOiBtYXJrZG93blJlYWRlZERhdGFzKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbWFya2Rvd25zW2ldID09PSAncmVhZG1lJyA/ICdpbmRleCcgOiBtYXJrZG93bnNbaV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdnZXR0aW5nLXN0YXJ0ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2dldHRpbmctc3RhcnRlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtkb3duOiByZWFkbWVEYXRhLm1hcmtkb3duLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiByZWFkbWVEYXRhLnJhd0RhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtkb3duc1tpXSA9PT0gJ3JlYWRtZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5yZWFkbWUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiAnb3ZlcnZpZXcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ292ZXJ2aWV3JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuUk9PVFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1hcmtkb3ducy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG1hcmtkb3duc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVybmFtZTogbWFya2Rvd25zW2ldLnRvVXBwZXJDYXNlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAke21hcmtkb3duc1tpXS50b1VwcGVyQ2FzZSgpfS5tZCBmaWxlIGZvdW5kYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGVycm9yTWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYENvbnRpbnVpbmcgd2l0aG91dCAke21hcmtkb3duc1tpXS50b1VwcGVyQ2FzZSgpfS5tZCBmaWxlYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcmtkb3duc1tpXSA9PT0gJ3JlYWRtZScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6ICdpbmRleCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogJ2luZGV4JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdvdmVydmlldycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLlJPT1RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlYnVpbGRSb290TWFya2Rvd25zKCk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICdSZWdlbmVyYXRpbmcgUkVBRE1FLm1kLCBDSEFOR0VMT0cubWQsIENPTlRSSUJVVElORy5tZCwgTElDRU5TRS5tZCwgVE9ETy5tZCBwYWdlcydcbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgYWN0aW9ucyA9IFtdO1xuXG4gICAgICAgIENvbmZpZ3VyYXRpb24ucmVzZXRSb290TWFya2Rvd25QYWdlcygpO1xuXG4gICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTWFya2Rvd25zKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHByb21pc2VTZXF1ZW50aWFsKGFjdGlvbnMpXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhZ2VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclVwZGF0ZWRGaWxlcygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IGRlcGVuZGVuY3kgZGF0YSBmb3Igc21hbGwgZ3JvdXAgb2YgdXBkYXRlZCBmaWxlcyBkdXJpbmcgd2F0Y2ggcHJvY2Vzc1xuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0TWljcm9EZXBlbmRlbmNpZXNEYXRhKCk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuaW5mbygnR2V0IGRpZmYgZGVwZW5kZW5jaWVzIGRhdGEnKTtcblxuICAgICAgICBsZXQgZGVwZW5kZW5jaWVzQ2xhc3M6IEFuZ3VsYXJEZXBlbmRlbmNpZXMgfCBBbmd1bGFySlNEZXBlbmRlbmNpZXMgPSBBbmd1bGFyRGVwZW5kZW5jaWVzO1xuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJQcm9qZWN0ID0gdHJ1ZTtcblxuICAgICAgICBpZiAodGhpcy5kZXRlY3RBbmd1bGFySlNQcm9qZWN0cygpKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnQW5ndWxhckpTIHByb2plY3QgZGV0ZWN0ZWQnKTtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhclByb2plY3QgPSBmYWxzZTtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYW5ndWxhckpTUHJvamVjdCA9IHRydWU7XG4gICAgICAgICAgICBkZXBlbmRlbmNpZXNDbGFzcyA9IEFuZ3VsYXJKU0RlcGVuZGVuY2llcztcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjcmF3bGVyID0gbmV3IGRlcGVuZGVuY2llc0NsYXNzKFxuICAgICAgICAgICAgdGhpcy51cGRhdGVkRmlsZXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHNjb25maWdEaXJlY3Rvcnk6IHBhdGguZGlybmFtZShDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGRlcGVuZGVuY2llc0RhdGEgPSBjcmF3bGVyLmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS51cGRhdGUoZGVwZW5kZW5jaWVzRGF0YSk7XG5cbiAgICAgICAgdGhpcy5wcmVwYXJlSnVzdEFGZXdUaGluZ3MoZGVwZW5kZW5jaWVzRGF0YSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVidWlsZCBleHRlcm5hbCBkb2N1bWVudGF0aW9uIGR1cmluZyB3YXRjaCBwcm9jZXNzXG4gICAgICovXG4gICAgcHJpdmF0ZSByZWJ1aWxkRXh0ZXJuYWxEb2N1bWVudGF0aW9uKCk6IHZvaWQge1xuICAgICAgICBsb2dnZXIuaW5mbygnUmVidWlsZCBleHRlcm5hbCBkb2N1bWVudGF0aW9uJyk7XG5cbiAgICAgICAgbGV0IGFjdGlvbnMgPSBbXTtcblxuICAgICAgICBDb25maWd1cmF0aW9uLnJlc2V0QWRkaXRpb25hbFBhZ2VzKCk7XG5cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5jbHVkZXMgIT09ICcnKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVFeHRlcm5hbEluY2x1ZGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb21pc2VTZXF1ZW50aWFsKGFjdGlvbnMpXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhZ2VzKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhclVwZGF0ZWRGaWxlcygpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBkZXRlY3RBbmd1bGFySlNQcm9qZWN0cygpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMucGFja2FnZUpzb25EYXRhLmRlcGVuZGVuY2llcyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5wYWNrYWdlSnNvbkRhdGEuZGVwZW5kZW5jaWVzLmFuZ3VsYXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IGNvdW50SlNGaWxlcyA9IDA7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlcy5mb3JFYWNoKGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocGF0aC5leHRuYW1lKGZpbGUpID09PSAnLmpzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRKU0ZpbGVzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBsZXQgcGVyY2VudE9mSlNGaWxlcyA9IChjb3VudEpTRmlsZXMgKiAxMDApIC8gdGhpcy5maWxlcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKHBlcmNlbnRPZkpTRmlsZXMgPj0gNzUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGVwZW5kZW5jaWVzRGF0YSgpOiB2b2lkIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0dldCBkZXBlbmRlbmNpZXMgZGF0YScpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBBbmd1bGFySlMgZGV0ZWN0aW9uIHN0cmF0ZWd5IDpcbiAgICAgICAgICogLSBpZiBpbiBwYWNrYWdlLmpzb25cbiAgICAgICAgICogLSBpZiA3NSUgb2Ygc2Nhbm5lZCBmaWxlcyBhcmUgKi5qcyBmaWxlc1xuICAgICAgICAgKi9cbiAgICAgICAgbGV0IGRlcGVuZGVuY2llc0NsYXNzOiBBbmd1bGFyRGVwZW5kZW5jaWVzIHwgQW5ndWxhckpTRGVwZW5kZW5jaWVzID0gQW5ndWxhckRlcGVuZGVuY2llcztcbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5hbmd1bGFyUHJvamVjdCA9IHRydWU7XG5cbiAgICAgICAgaWYgKHRoaXMuZGV0ZWN0QW5ndWxhckpTUHJvamVjdHMoKSkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0FuZ3VsYXJKUyBwcm9qZWN0IGRldGVjdGVkJyk7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJQcm9qZWN0ID0gZmFsc2U7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFuZ3VsYXJKU1Byb2plY3QgPSB0cnVlO1xuICAgICAgICAgICAgZGVwZW5kZW5jaWVzQ2xhc3MgPSBBbmd1bGFySlNEZXBlbmRlbmNpZXM7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY3Jhd2xlciA9IG5ldyBkZXBlbmRlbmNpZXNDbGFzcyhcbiAgICAgICAgICAgIHRoaXMuZmlsZXMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdHNjb25maWdEaXJlY3Rvcnk6IHBhdGguZGlybmFtZShDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24sXG4gICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsXG4gICAgICAgICk7XG5cbiAgICAgICAgbGV0IGRlcGVuZGVuY2llc0RhdGEgPSBjcmF3bGVyLmdldERlcGVuZGVuY2llcygpO1xuXG4gICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5pbml0KGRlcGVuZGVuY2llc0RhdGEpO1xuXG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucm91dGVzTGVuZ3RoID0gUm91dGVyUGFyc2VyVXRpbC5yb3V0ZXNMZW5ndGgoKTtcblxuICAgICAgICB0aGlzLnByaW50U3RhdGlzdGljcygpO1xuXG4gICAgICAgIHRoaXMucHJlcGFyZUV2ZXJ5dGhpbmcoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByZXBhcmVKdXN0QUZld1RoaW5ncyhkaWZmQ3Jhd2xlZERhdGEpOiB2b2lkIHtcbiAgICAgICAgbGV0IGFjdGlvbnMgPSBbXTtcblxuICAgICAgICBDb25maWd1cmF0aW9uLnJlc2V0UGFnZXMoKTtcblxuICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVJvdXRlc0dyYXBoKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlUm91dGVzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZmZDcmF3bGVkRGF0YS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVDb21wb25lbnRzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuY29udHJvbGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUNvbnRyb2xsZXJzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuZW50aXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUVudGl0aWVzKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEubW9kdWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlTW9kdWxlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuZGlyZWN0aXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlRGlyZWN0aXZlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuaW5qZWN0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUluamVjdGFibGVzKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGRpZmZDcmF3bGVkRGF0YS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHRoaXMucHJlcGFyZUludGVyY2VwdG9ycygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVHdWFyZHMoKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZGlmZkNyYXdsZWREYXRhLnBpcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVQaXBlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlQ2xhc3NlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkaWZmQ3Jhd2xlZERhdGEuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlSW50ZXJmYWNlcygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGRpZmZDcmF3bGVkRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICBkaWZmQ3Jhd2xlZERhdGEubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgZGlmZkNyYXdsZWREYXRhLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgZGlmZkNyYXdsZWREYXRhLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4gdGhpcy5wcmVwYXJlTWlzY2VsbGFuZW91cygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB0aGlzLnByZXBhcmVDb3ZlcmFnZSgpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHByb21pc2VTZXF1ZW50aWFsKGFjdGlvbnMpXG4gICAgICAgICAgICAudGhlbihyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdCAhPT0gQ09NUE9ET0NfREVGQVVMVFMuZXhwb3J0Rm9ybWF0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdHNTdXBwb3J0ZWQuaW5kZXhPZihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4cG9ydEZvcm1hdFxuICAgICAgICAgICAgICAgICAgICAgICAgKSA+IC0xXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdlbmVyYXRpbmcgZG9jdW1lbnRhdGlvbiBpbiBleHBvcnQgZm9ybWF0ICR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXR9YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9ydEVuZ2luZS5leHBvcnQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRDYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRG9jdW1lbnRhdGlvbiBnZW5lcmF0ZWQgaW4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGluICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRFbGFwc2VkVGltZSgpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgc2Vjb25kcydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnNlcnZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYFNlcnZpbmcgZG9jdW1lbnRhdGlvbiBmcm9tICR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXR9IGF0IGh0dHA6Ly8ke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaG9zdG5hbWV9OiR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5wb3J0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5XZWJTZXJ2ZXIoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oYEV4cG9ydGVkIGZvcm1hdCBub3Qgc3VwcG9ydGVkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NHcmFwaHMoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhclVwZGF0ZWRGaWxlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZXJyb3JNZXNzYWdlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJpbnRTdGF0aXN0aWNzKCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvamVjdCBzdGF0aXN0aWNzICcpO1xuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLm1vZHVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gZmlsZXMgICAgICAgIDogJHt0aGlzLmZpbGVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLm1vZHVsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gbW9kdWxlICAgICAgIDogJHtEZXBlbmRlbmNpZXNFbmdpbmUubW9kdWxlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5jb21wb25lbnRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGNvbXBvbmVudCAgICA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmNvbXBvbmVudHMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuY29udHJvbGxlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gY29udHJvbGxlciAgIDogJHtEZXBlbmRlbmNpZXNFbmdpbmUuY29udHJvbGxlcnMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuZW50aXRpZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oYC0gZW50aXR5ICAgICAgIDogJHtEZXBlbmRlbmNpZXNFbmdpbmUuZW50aXRpZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuZGlyZWN0aXZlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBkaXJlY3RpdmUgICAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5kaXJlY3RpdmVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmluamVjdGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGluamVjdGFibGUgICA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmluamVjdGFibGVzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmludGVyY2VwdG9ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBpbmplY3RvciAgICAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5pbnRlcmNlcHRvcnMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGd1YXJkICAgICAgICA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmd1YXJkcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5waXBlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBwaXBlICAgICAgICAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5waXBlcy5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5jbGFzc2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAtIGNsYXNzICAgICAgICA6ICR7RGVwZW5kZW5jaWVzRW5naW5lLmNsYXNzZXMubGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSBpbnRlcmZhY2UgICAgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5pbnRlcmZhY2VzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5yb3V0ZXNMZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSByb3V0ZSAgICAgICAgOiAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEucm91dGVzTGVuZ3RofWApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbyhgLSB0eXBlIGFsaWFzZXMgOiAke0RlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLnR5cGVhbGlhc2VzLmxlbmd0aH1gKTtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuaW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZUV2ZXJ5dGhpbmcoKSB7XG4gICAgICAgIGxldCBhY3Rpb25zID0gW107XG5cbiAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDb21wb25lbnRzKCk7XG4gICAgICAgIH0pO1xuICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZU1vZHVsZXMoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5kaXJlY3RpdmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZURpcmVjdGl2ZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5jb250cm9sbGVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDb250cm9sbGVycygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLmVudGl0aWVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUVudGl0aWVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuaW5qZWN0YWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlSW5qZWN0YWJsZXMoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKERlcGVuZGVuY2llc0VuZ2luZS5pbnRlcmNlcHRvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlSW50ZXJjZXB0b3JzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuZ3VhcmRzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUd1YXJkcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUucm91dGVzICYmXG4gICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUucm91dGVzLmNoaWxkcmVuLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgICFDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVSb3V0ZXNHcmFwaFxuICAgICAgICApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVJvdXRlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoRGVwZW5kZW5jaWVzRW5naW5lLnBpcGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVBpcGVzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuY2xhc3Nlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVDbGFzc2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChEZXBlbmRlbmNpZXNFbmdpbmUuaW50ZXJmYWNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVJbnRlcmZhY2VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgRGVwZW5kZW5jaWVzRW5naW5lLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgRGVwZW5kZW5jaWVzRW5naW5lLm1pc2NlbGxhbmVvdXMuZW51bWVyYXRpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVNaXNjZWxsYW5lb3VzKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UpIHtcbiAgICAgICAgICAgIGFjdGlvbnMucHVzaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZUNvdmVyYWdlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnVuaXRUZXN0Q292ZXJhZ2UgIT09ICcnKSB7XG4gICAgICAgICAgICBhY3Rpb25zLnB1c2goKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByZXBhcmVVbml0VGVzdENvdmVyYWdlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzICE9PSAnJykge1xuICAgICAgICAgICAgYWN0aW9ucy5wdXNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcmVwYXJlRXh0ZXJuYWxJbmNsdWRlcygpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBwcm9taXNlU2VxdWVudGlhbChhY3Rpb25zKVxuICAgICAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXRzU3VwcG9ydGVkLmluZGV4T2YoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgICAgICkgPiAtMVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBHZW5lcmF0aW5nIGRvY3VtZW50YXRpb24gaW4gZXhwb3J0IGZvcm1hdCAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0fWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFeHBvcnRFbmdpbmUuZXhwb3J0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgICkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvblByb21pc2VSZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW5kQ2FsbGJhY2soKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0RvY3VtZW50YXRpb24gZ2VuZXJhdGVkIGluICcgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0RWxhcHNlZFRpbWUoKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIHNlY29uZHMnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5zZXJ2ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBTZXJ2aW5nIGRvY3VtZW50YXRpb24gZnJvbSAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0fSBhdCBodHRwOi8vJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmhvc3RuYW1lfToke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEucG9ydH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucnVuV2ViU2VydmVyKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKGBFeHBvcnRlZCBmb3JtYXQgbm90IHN1cHBvcnRlZGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzR3JhcGhzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnJvck1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SW5jbHVkZWRQYXRoRm9yRmlsZShmaWxlKSB7XG4gICAgICAgIHJldHVybiBwYXRoLmpvaW4oQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlcywgZmlsZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBwcmVwYXJlRXh0ZXJuYWxJbmNsdWRlcygpIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ0FkZGluZyBleHRlcm5hbCBtYXJrZG93biBmaWxlcycpO1xuICAgICAgICAvLyBTY2FuIGluY2x1ZGUgZm9sZGVyIGZvciBmaWxlcyBkZXRhaWxlZCBpbiBzdW1tYXJ5Lmpzb25cbiAgICAgICAgLy8gRm9yIGVhY2ggZmlsZSwgYWRkIHRvIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYWRkaXRpb25hbFBhZ2VzXG4gICAgICAgIC8vIEVhY2ggZmlsZSB3aWxsIGJlIGNvbnZlcnRlZCB0byBodG1sIHBhZ2UsIGluc2lkZSBDT01QT0RPQ19ERUZBVUxUUy5hZGRpdGlvbmFsRW50cnlQYXRoXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBGaWxlRW5naW5lLmdldCh0aGlzLmdldEluY2x1ZGVkUGF0aEZvckZpbGUoJ3N1bW1hcnkuanNvbicpKS50aGVuKFxuICAgICAgICAgICAgICAgIHN1bW1hcnlEYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0FkZGl0aW9uYWwgZG9jdW1lbnRhdGlvbjogc3VtbWFyeS5qc29uIGZpbGUgZm91bmQnKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRTdW1tYXJ5RGF0YSA9IEpTT04ucGFyc2Uoc3VtbWFyeURhdGEpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB0aGF0ID0gdGhpcztcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhc3RMZXZlbE9uZVBhZ2UgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJhdmVyc2UocGFyc2VkU3VtbWFyeURhdGEpLmZvckVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWludmFsaWQtdGhpc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubm90Um9vdCAmJiB0eXBlb2YgdGhpcy5ub2RlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1pbnZhbGlkLXRoaXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmF3UGF0aCA9IHRoaXMucGF0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW52YWxpZC10aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkZGl0aW9uYWxOb2RlOiBBZGRpdGlvbmFsTm9kZSA9IHRoaXMubm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsZSA9IGFkZGl0aW9uYWxOb2RlLmZpbGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRpdGxlID0gYWRkaXRpb25hbE5vZGUudGl0bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbmFsUGF0aCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5jbHVkZXNGb2xkZXI7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmluYWxEZXB0aCA9IHJhd1BhdGguZmlsdGVyKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFpc05hTihwYXJzZUludChlbCwgMTApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmlsZSAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIHRpdGxlICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBjbGVhbk5hbWVXaXRob3V0U3BhY2VBbmRUb0xvd2VyQ2FzZSh0aXRsZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIElkIGNyZWF0ZWQgd2l0aCB0aXRsZSArIGZpbGUgcGF0aCBoYXNoLCBzZWVtcyB0byBiZSBoeXBvdGhldGljYWxseSB1bmlxdWUgaGVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBjcnlwdG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jcmVhdGVIYXNoKCdzaGE1MTInKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnVwZGF0ZSh0aXRsZSArIGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZGlnZXN0KCdoZXgnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taW52YWxpZC10aGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9kZS5pZCA9IGlkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsYXN0RWxlbWVudFJvb3RUcmVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbERlcHRoLmZvckVhY2goZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRUcmVlID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlb2YgbGFzdEVsZW1lbnRSb290VHJlZSA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBwYXJzZWRTdW1tYXJ5RGF0YVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxhc3RFbGVtZW50Um9vdFRyZWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnRUcmVlLmNoaWxkcmVuICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRUcmVlID0gZWxlbWVudFRyZWUuY2hpbGRyZW5bZWxdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50VHJlZSA9IGVsZW1lbnRUcmVlW2VsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsUGF0aCArPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5OYW1lV2l0aG91dFNwYWNlQW5kVG9Mb3dlckNhc2UoZWxlbWVudFRyZWUudGl0bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVsZW1lbnRSb290VHJlZSA9IGVsZW1lbnRUcmVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFBhdGggPSBmaW5hbFBhdGgucmVwbGFjZSgnLycgKyB1cmwsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtkb3duRmlsZSA9IE1hcmtkb3duRW5naW5lLmdldFRyYWRpdGlvbmFsTWFya2Rvd25TeW5jKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdC5nZXRJbmNsdWRlZFBhdGhGb3JGaWxlKGZpbGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmFsRGVwdGgubGVuZ3RoID4gNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdPbmx5IDUgbGV2ZWxzIG9mIGRlcHRoIGFyZSBzdXBwb3J0ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aXRsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWU6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnYWRkaXRpb25hbC1wYWdlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiBmaW5hbFBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25hbFBhZ2U6IG1hcmtkb3duRmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogZmluYWxEZXB0aC5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRyZW5MZW5ndGg6IGFkZGl0aW9uYWxOb2RlLmNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYWRkaXRpb25hbE5vZGUuY2hpbGRyZW4ubGVuZ3RoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbjogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdENoaWxkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbERlcHRoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RMZXZlbE9uZVBhZ2UgPSBfcGFnZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5hbERlcHRoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZSBhbGwgY2hpbGQgcGFnZXMgb2YgdGhlIGxhc3Qgcm9vdCBsZXZlbCAxIHBhZ2UgaW5zaWRlIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdExldmVsT25lUGFnZS5jaGlsZHJlbi5wdXNoKF9wYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRBZGRpdGlvbmFsUGFnZShfcGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCdFcnJvciBkdXJpbmcgQWRkaXRpb25hbCBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZU1vZHVsZXMoc29tZU1vZHVsZXM/KTogUHJvbWlzZTxhbnk+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgbW9kdWxlcycpO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIGxldCBfbW9kdWxlcyA9IHNvbWVNb2R1bGVzID8gc29tZU1vZHVsZXMgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0TW9kdWxlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXMgPSBfbW9kdWxlcy5tYXAobmdNb2R1bGUgPT4ge1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MgPSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyczogW10sXG4gICAgICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlczogW10sXG4gICAgICAgICAgICAgICAgICAgIHBpcGVzOiBbXVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgWydkZWNsYXJhdGlvbnMnLCAnYm9vdHN0cmFwJywgJ2ltcG9ydHMnLCAnZXhwb3J0cycsICdjb250cm9sbGVycyddLmZvckVhY2goXG4gICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhVHlwZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZVttZXRhZGF0YVR5cGVdID0gbmdNb2R1bGVbbWV0YWRhdGFUeXBlXS5maWx0ZXIobWV0YURhdGFJdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG1ldGFEYXRhSXRlbS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2RpcmVjdGl2ZSc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVwZW5kZW5jaWVzRW5naW5lLmdldERpcmVjdGl2ZXMoKS5zb21lKGRpcmVjdGl2ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkRGlyZWN0aXZlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbWV0YURhdGFJdGVtLmlkICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERpcmVjdGl2ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aXZlIGFzIGFueSkuaWQgPT09IG1ldGFEYXRhSXRlbS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERpcmVjdGl2ZSA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aXZlIGFzIGFueSkubmFtZSA9PT0gbWV0YURhdGFJdGVtLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREaXJlY3RpdmUgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5nTW9kdWxlLmNvbXBvZG9jTGlua3MuZGlyZWN0aXZlcy5pbmNsdWRlcyhkaXJlY3RpdmUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuZGlyZWN0aXZlcy5wdXNoKGRpcmVjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZERpcmVjdGl2ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbXBvbmVudCc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGVwZW5kZW5jaWVzRW5naW5lLmdldENvbXBvbmVudHMoKS5zb21lKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wb25lbnQ6IElDb21wb25lbnREZXApID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkQ29tcG9uZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1ldGFEYXRhSXRlbS5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29tcG9uZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkuaWQgPT09IG1ldGFEYXRhSXRlbS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkQ29tcG9uZW50ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcG9uZW50IGFzIGFueSkubmFtZSA9PT0gbWV0YURhdGFJdGVtLm5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb21wb25lbnQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbXBvbmVudHMuaW5jbHVkZXMoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb21wb25lbnQuc3RhbmRhbG9uZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29tcG9uZW50cy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZENvbXBvbmVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2NvbnRyb2xsZXInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIERlcGVuZGVuY2llc0VuZ2luZS5nZXRDb250cm9sbGVycygpLnNvbWUoY29udHJvbGxlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkQ29udHJvbGxlcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG1ldGFEYXRhSXRlbS5pZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDb250cm9sbGVyID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb250cm9sbGVyIGFzIGFueSkuaWQgPT09IG1ldGFEYXRhSXRlbS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbnRyb2xsZXIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnRyb2xsZXIgYXMgYW55KS5uYW1lID09PSBtZXRhRGF0YUl0ZW0ubmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZENvbnRyb2xsZXIgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29udHJvbGxlcnMuaW5jbHVkZXMoY29udHJvbGxlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5jb250cm9sbGVycy5wdXNoKGNvbnRyb2xsZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRDb250cm9sbGVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnbW9kdWxlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0TW9kdWxlcygpLnNvbWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlID0+IChtb2R1bGUgYXMgYW55KS5uYW1lID09PSBtZXRhRGF0YUl0ZW0ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdwaXBlJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0UGlwZXMoKS5zb21lKHBpcGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFBpcGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRhRGF0YUl0ZW0uaWQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGlwZSA9IChwaXBlIGFzIGFueSkuaWQgPT09IG1ldGFEYXRhSXRlbS5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFBpcGUgPSAocGlwZSBhcyBhbnkpLm5hbWUgPT09IG1ldGFEYXRhSXRlbS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUGlwZSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5waXBlcy5pbmNsdWRlcyhwaXBlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLnBpcGVzLnB1c2gocGlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFBpcGU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLnByb3ZpZGVycyA9IG5nTW9kdWxlLnByb3ZpZGVycy5maWx0ZXIocHJvdmlkZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAgICAgRGVwZW5kZW5jaWVzRW5naW5lLmdldEluamVjdGFibGVzKCkuc29tZShpbmplY3RhYmxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRJbmplY3RhYmxlID0gKGluamVjdGFibGUgYXMgYW55KS5uYW1lID09PSBwcm92aWRlci5uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJbmplY3RhYmxlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmluamVjdGFibGVzLmluY2x1ZGVzKGluamVjdGFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuaW5qZWN0YWJsZXMucHVzaChpbmplY3RhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkSW5qZWN0YWJsZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW50ZXJjZXB0b3JzKCkuc29tZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvciA9PiAoaW50ZXJjZXB0b3IgYXMgYW55KS5uYW1lID09PSBwcm92aWRlci5uYW1lXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gVHJ5IGZpeGluZyB0eXBlIHVuZGVmaW5lZCBmb3IgZWFjaCBwcm92aWRlcnNcbiAgICAgICAgICAgICAgICBfLmZvckVhY2gobmdNb2R1bGUucHJvdmlkZXJzLCBwcm92aWRlciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5nZXRJbmplY3RhYmxlcygpLmZpbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5qZWN0YWJsZSA9PiAoaW5qZWN0YWJsZSBhcyBhbnkpLm5hbWUgPT09IHByb3ZpZGVyLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci50eXBlID0gJ2luamVjdGFibGUnO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIERlcGVuZGVuY2llc0VuZ2luZS5nZXRJbnRlcmNlcHRvcnMoKS5maW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyY2VwdG9yID0+IChpbnRlcmNlcHRvciBhcyBhbnkpLm5hbWUgPT09IHByb3ZpZGVyLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci50eXBlID0gJ2ludGVyY2VwdG9yJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIE9yZGVyIHRoaW5nc1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29tcG9uZW50cyA9IF8uc29ydEJ5KG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuY29tcG9uZW50cywgW1xuICAgICAgICAgICAgICAgICAgICAnbmFtZSdcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmNvbnRyb2xsZXJzID0gXy5zb3J0QnkobmdNb2R1bGUuY29tcG9kb2NMaW5rcy5jb250cm9sbGVycywgW1xuICAgICAgICAgICAgICAgICAgICAnbmFtZSdcbiAgICAgICAgICAgICAgICBdKTtcbiAgICAgICAgICAgICAgICBuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmRpcmVjdGl2ZXMgPSBfLnNvcnRCeShuZ01vZHVsZS5jb21wb2RvY0xpbmtzLmRpcmVjdGl2ZXMsIFtcbiAgICAgICAgICAgICAgICAgICAgJ25hbWUnXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5pbmplY3RhYmxlcyA9IF8uc29ydEJ5KG5nTW9kdWxlLmNvbXBvZG9jTGlua3MuaW5qZWN0YWJsZXMsIFtcbiAgICAgICAgICAgICAgICAgICAgJ25hbWUnXG4gICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuY29tcG9kb2NMaW5rcy5waXBlcyA9IF8uc29ydEJ5KG5nTW9kdWxlLmNvbXBvZG9jTGlua3MucGlwZXMsIFsnbmFtZSddKTtcblxuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmRlY2xhcmF0aW9ucyA9IF8uc29ydEJ5KG5nTW9kdWxlLmRlY2xhcmF0aW9ucywgWyduYW1lJ10pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmVudHJ5Q29tcG9uZW50cyA9IF8uc29ydEJ5KG5nTW9kdWxlLmVudHJ5Q29tcG9uZW50cywgWyduYW1lJ10pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLnByb3ZpZGVycyA9IF8uc29ydEJ5KG5nTW9kdWxlLnByb3ZpZGVycywgWyduYW1lJ10pO1xuICAgICAgICAgICAgICAgIG5nTW9kdWxlLmltcG9ydHMgPSBfLnNvcnRCeShuZ01vZHVsZS5pbXBvcnRzLCBbJ25hbWUnXSk7XG4gICAgICAgICAgICAgICAgbmdNb2R1bGUuZXhwb3J0cyA9IF8uc29ydEJ5KG5nTW9kdWxlLmV4cG9ydHMsIFsnbmFtZSddKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBuZ01vZHVsZTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdtb2R1bGVzJyxcbiAgICAgICAgICAgICAgICBpZDogJ21vZHVsZXMnLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdtb2R1bGVzJyxcbiAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3QgbGVuID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0uZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAgJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0ubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZG1lID0gTWFya2Rvd25FbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5tb2R1bGVzW2ldLmZpbGVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0ucmVhZG1lID0gbWFya2VkQWNsKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdtb2R1bGVzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhDb25maWd1cmF0aW9uLm1haW5EYXRhLm1vZHVsZXNbaV0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ21vZHVsZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGU6IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlc1tpXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVQaXBlcyA9IChzb21lUGlwZXM/KSA9PiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIHBpcGVzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucGlwZXMgPSBzb21lUGlwZXMgPyBzb21lUGlwZXMgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0UGlwZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5waXBlcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBpcGUgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLnBpcGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShwaXBlLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7cGlwZS5uYW1lfSBoYXMgYSBSRUFETUUgZmlsZSwgaW5jbHVkZSBpdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZG1lID0gTWFya2Rvd25FbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUocGlwZS5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpcGUucmVhZG1lID0gbWFya2VkQWNsKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdwaXBlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBwaXBlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogcGlwZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhwaXBlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdwaXBlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBpcGU6IHBpcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChwaXBlLmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgcGlwZS5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHB1YmxpYyBwcmVwYXJlQ2xhc3NlcyA9IChzb21lQ2xhc3Nlcz8pID0+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgY2xhc3NlcycpO1xuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNsYXNzZXMgPSBzb21lQ2xhc3Nlc1xuICAgICAgICAgICAgPyBzb21lQ2xhc3Nlc1xuICAgICAgICAgICAgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0Q2xhc3NlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNsYXNzZXMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbGFzc2UgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNsYXNzZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXJrZG93bkVuZ2luZS5oYXNOZWlnaGJvdXJSZWFkbWVGaWxlKGNsYXNzZS5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2NsYXNzZS5uYW1lfSBoYXMgYSBSRUFETUUgZmlsZSwgaW5jbHVkZSBpdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZG1lID0gTWFya2Rvd25FbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoY2xhc3NlLmZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NlLnJlYWRtZSA9IG1hcmtlZEFjbChyZWFkbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnY2xhc3NlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBjbGFzc2UubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBjbGFzc2UuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoY2xhc3NlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdjbGFzcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogY2xhc3NlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY2xhc3NlLmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgY2xhc3NlLmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICBsb29wKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgcHVibGljIHByZXBhcmVJbnRlcmZhY2VzKHNvbWVJbnRlcmZhY2VzPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBpbnRlcmZhY2VzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJmYWNlcyA9IHNvbWVJbnRlcmZhY2VzXG4gICAgICAgICAgICA/IHNvbWVJbnRlcmZhY2VzXG4gICAgICAgICAgICA6IERlcGVuZGVuY2llc0VuZ2luZS5nZXRJbnRlcmZhY2VzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJmYWNlcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludGVyZiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJmYWNlc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hcmtkb3duRW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoaW50ZXJmLmZpbGUpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgICR7aW50ZXJmLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFkbWUgPSBNYXJrZG93bkVuZ2luZS5yZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShpbnRlcmYuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmYucmVhZG1lID0gbWFya2VkQWNsKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdpbnRlcmZhY2VzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGludGVyZi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGludGVyZi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhpbnRlcmYpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2ludGVyZmFjZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2U6IGludGVyZixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyZi5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGludGVyZi5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVNaXNjZWxsYW5lb3VzKHNvbWVNaXNjPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBtaXNjZWxsYW5lb3VzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cyA9IHNvbWVNaXNjXG4gICAgICAgICAgICA/IHNvbWVNaXNjXG4gICAgICAgICAgICA6IERlcGVuZGVuY2llc0VuZ2luZS5nZXRNaXNjZWxsYW5lb3VzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMuZnVuY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICBwYXRoOiAnbWlzY2VsbGFuZW91cycsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdmdW5jdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ21pc2NlbGxhbmVvdXMtZnVuY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ21pc2NlbGxhbmVvdXMtZnVuY3Rpb25zJyxcbiAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAndmFyaWFibGVzJyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdtaXNjZWxsYW5lb3VzLXZhcmlhYmxlcycsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdtaXNjZWxsYW5lb3VzLXZhcmlhYmxlcycsXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cy50eXBlYWxpYXNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgcGF0aDogJ21pc2NlbGxhbmVvdXMnLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAndHlwZWFsaWFzZXMnLFxuICAgICAgICAgICAgICAgICAgICBpZDogJ21pc2NlbGxhbmVvdXMtdHlwZWFsaWFzZXMnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnbWlzY2VsbGFuZW91cy10eXBlYWxpYXNlcycsXG4gICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cy5lbnVtZXJhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZSh7XG4gICAgICAgICAgICAgICAgICAgIHBhdGg6ICdtaXNjZWxsYW5lb3VzJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2VudW1lcmF0aW9ucycsXG4gICAgICAgICAgICAgICAgICAgIGlkOiAnbWlzY2VsbGFuZW91cy1lbnVtZXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnbWlzY2VsbGFuZW91cy1lbnVtZXJhdGlvbnMnLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBoYW5kbGVUZW1wbGF0ZXVybChjb21wb25lbnQpOiBQcm9taXNlPGFueT4ge1xuICAgICAgICBjb25zdCBkaXJuYW1lID0gcGF0aC5kaXJuYW1lKGNvbXBvbmVudC5maWxlKTtcbiAgICAgICAgY29uc3QgdGVtcGxhdGVQYXRoID0gcGF0aC5yZXNvbHZlKGRpcm5hbWUgKyBwYXRoLnNlcCArIGNvbXBvbmVudC50ZW1wbGF0ZVVybCk7XG5cbiAgICAgICAgaWYgKCFGaWxlRW5naW5lLmV4aXN0c1N5bmModGVtcGxhdGVQYXRoKSkge1xuICAgICAgICAgICAgY29uc3QgZXJyID0gYENhbm5vdCByZWFkIHRlbXBsYXRlIGZvciAke2NvbXBvbmVudC5uYW1lfWA7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7fSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gRmlsZUVuZ2luZS5nZXQodGVtcGxhdGVQYXRoKS50aGVuKFxuICAgICAgICAgICAgZGF0YSA9PiAoY29tcG9uZW50LnRlbXBsYXRlRGF0YSA9IGRhdGEpLFxuICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlU3R5bGVzKGNvbXBvbmVudCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IHN0eWxlcyA9IGNvbXBvbmVudC5zdHlsZXM7XG4gICAgICAgIGNvbXBvbmVudC5zdHlsZXNEYXRhID0gJyc7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZVN0eWxlcywgcmVqZWN0U3R5bGVzKSA9PiB7XG4gICAgICAgICAgICBzdHlsZXMuZm9yRWFjaChzdHlsZSA9PiB7XG4gICAgICAgICAgICAgICAgY29tcG9uZW50LnN0eWxlc0RhdGEgPSBjb21wb25lbnQuc3R5bGVzRGF0YSArIHN0eWxlICsgJ1xcbic7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJlc29sdmVTdHlsZXModHJ1ZSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgaGFuZGxlU3R5bGV1cmxzKGNvbXBvbmVudCk6IFByb21pc2U8YW55PiB7XG4gICAgICAgIGNvbnN0IGRpcm5hbWUgPSBwYXRoLmRpcm5hbWUoY29tcG9uZW50LmZpbGUpO1xuXG4gICAgICAgIGNvbnN0IHN0eWxlRGF0YVByb21pc2UgPSBjb21wb25lbnQuc3R5bGVVcmxzLm1hcChzdHlsZVVybCA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdHlsZVBhdGggPSBwYXRoLnJlc29sdmUoZGlybmFtZSArIHBhdGguc2VwICsgc3R5bGVVcmwpO1xuXG4gICAgICAgICAgICBpZiAoIUZpbGVFbmdpbmUuZXhpc3RzU3luYyhzdHlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyID0gYENhbm5vdCByZWFkIHN0eWxlIHVybCAke3N0eWxlUGF0aH0gZm9yICR7Y29tcG9uZW50Lm5hbWV9YDtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge30pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIEZpbGVFbmdpbmUuZ2V0KHN0eWxlUGF0aCkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHN0eWxlRGF0YVByb21pc2UpLnRoZW4oXG4gICAgICAgICAgICBkYXRhID0+IChjb21wb25lbnQuc3R5bGVVcmxzRGF0YSA9IGRhdGEpLFxuICAgICAgICAgICAgZXJyID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoJycpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0TmF2VGFicyhkZXBlbmRlbmN5KTogQXJyYXk8YW55PiB7XG4gICAgICAgIGxldCBuYXZUYWJDb25maWcgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm5hdlRhYkNvbmZpZztcbiAgICAgICAgY29uc3QgaGFzQ3VzdG9tTmF2VGFiQ29uZmlnID0gbmF2VGFiQ29uZmlnLmxlbmd0aCAhPT0gMDtcbiAgICAgICAgbmF2VGFiQ29uZmlnID1cbiAgICAgICAgICAgIG5hdlRhYkNvbmZpZy5sZW5ndGggPT09IDBcbiAgICAgICAgICAgICAgICA/IF8uY2xvbmVEZWVwKENPTVBPRE9DX0NPTlNUQU5UUy5uYXZUYWJEZWZpbml0aW9ucylcbiAgICAgICAgICAgICAgICA6IG5hdlRhYkNvbmZpZztcbiAgICAgICAgY29uc3QgbWF0Y2hEZXBUeXBlID0gKGRlcFR5cGU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGRlcFR5cGUgPT09ICdhbGwnIHx8IGRlcFR5cGUgPT09IGRlcGVuZGVuY3kudHlwZTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgbmF2VGFicyA9IFtdO1xuICAgICAgICBfLmZvckVhY2gobmF2VGFiQ29uZmlnLCBjdXN0b21UYWIgPT4ge1xuICAgICAgICAgICAgY29uc3QgbmF2VGFiID0gXy5maW5kKENPTVBPRE9DX0NPTlNUQU5UUy5uYXZUYWJEZWZpbml0aW9ucywgeyBpZDogY3VzdG9tVGFiLmlkIH0pO1xuICAgICAgICAgICAgaWYgKCFuYXZUYWIpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgdGFiIElEICcke2N1c3RvbVRhYi5pZH0nIHNwZWNpZmllZCBpbiB0YWIgY29uZmlndXJhdGlvbmApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBuYXZUYWIubGFiZWwgPSBjdXN0b21UYWIubGFiZWw7XG5cbiAgICAgICAgICAgIGlmIChoYXNDdXN0b21OYXZUYWJDb25maWcpIHtcbiAgICAgICAgICAgICAgICBuYXZUYWIuY3VzdG9tID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaXMgdGFiIGFwcGxpY2FibGUgdG8gdGFyZ2V0IGRlcGVuZGVuY3k/XG4gICAgICAgICAgICBpZiAoLTEgPT09IF8uZmluZEluZGV4KG5hdlRhYi5kZXBUeXBlcywgbWF0Y2hEZXBUeXBlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gZ2xvYmFsIGNvbmZpZ1xuICAgICAgICAgICAgaWYgKGN1c3RvbVRhYi5pZCA9PT0gJ3RyZWUnICYmIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZURvbVRyZWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VzdG9tVGFiLmlkID09PSAnc291cmNlJyAmJiBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGN1c3RvbVRhYi5pZCA9PT0gJ3RlbXBsYXRlRGF0YScgJiYgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlVGVtcGxhdGVUYWIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VzdG9tVGFiLmlkID09PSAnc3R5bGVEYXRhJyAmJiBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTdHlsZVRhYikge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gcGVyIGRlcGVuZGVuY3kgY29uZmlnXG4gICAgICAgICAgICBpZiAoY3VzdG9tVGFiLmlkID09PSAncmVhZG1lJyAmJiAhZGVwZW5kZW5jeS5yZWFkbWUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoY3VzdG9tVGFiLmlkID09PSAnZXhhbXBsZScgJiYgIWRlcGVuZGVuY3kuZXhhbXBsZVVybHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgY3VzdG9tVGFiLmlkID09PSAndGVtcGxhdGVEYXRhJyAmJlxuICAgICAgICAgICAgICAgICghZGVwZW5kZW5jeS50ZW1wbGF0ZVVybCB8fCBkZXBlbmRlbmN5LnRlbXBsYXRlVXJsLmxlbmd0aCA9PT0gMClcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBjdXN0b21UYWIuaWQgPT09ICdzdHlsZURhdGEnICYmXG4gICAgICAgICAgICAgICAgKCFkZXBlbmRlbmN5LnN0eWxlVXJscyB8fCBkZXBlbmRlbmN5LnN0eWxlVXJscy5sZW5ndGggPT09IDApICYmXG4gICAgICAgICAgICAgICAgKCFkZXBlbmRlbmN5LnN0eWxlcyB8fCBkZXBlbmRlbmN5LnN0eWxlcy5sZW5ndGggPT09IDApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIG5hdlRhYnMucHVzaChuYXZUYWIpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAobmF2VGFicy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gdmFsaWQgbmF2aWdhdGlvbiB0YWJzIGhhdmUgYmVlbiBkZWZpbmVkIGZvciBkZXBlbmRlbmN5IHR5cGUgJyR7ZGVwZW5kZW5jeS50eXBlfScuIFNwZWNpZnkgXFxcbmF0IGxlYXN0IG9uZSBjb25maWcgZm9yIHRoZSAnaW5mbycgb3IgJ3NvdXJjZScgdGFiIGluIC0tbmF2VGFiQ29uZmlnLmApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5hdlRhYnM7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVDb250cm9sbGVycyhzb21lQ29udHJvbGxlcnM/KSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcmVwYXJlIGNvbnRyb2xsZXJzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY29udHJvbGxlcnMgPSBzb21lQ29udHJvbGxlcnNcbiAgICAgICAgICAgID8gc29tZUNvbnRyb2xsZXJzXG4gICAgICAgICAgICA6IERlcGVuZGVuY2llc0VuZ2luZS5nZXRDb250cm9sbGVycygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBjb25zdCBsZW4gPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbnRyb2xsZXJzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udHJvbGxlciA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY29udHJvbGxlcnNbaV07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnY29udHJvbGxlcnMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogY29udHJvbGxlci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbnRyb2xsZXIuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoY29udHJvbGxlciksXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiAnY29udHJvbGxlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyOiBjb250cm9sbGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlci5pc0R1cGxpY2F0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZS5uYW1lICs9ICctJyArIGNvbnRyb2xsZXIuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlRW50aXRpZXMoc29tZUVudGl0aWVzPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBlbnRpdGllcycpO1xuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmVudGl0aWVzID0gc29tZUVudGl0aWVzXG4gICAgICAgICAgICA/IHNvbWVFbnRpdGllc1xuICAgICAgICAgICAgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0RW50aXRpZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5lbnRpdGllcy5sZW5ndGg7XG4gICAgICAgICAgICBjb25zdCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDwgbGVuKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbnRpdHkgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmVudGl0aWVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdlbnRpdGllcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbnRpdHkubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBlbnRpdHkuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoZW50aXR5KSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdlbnRpdHknLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW50aXR5OiBlbnRpdHksXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbnRpdHkuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBlbnRpdHkuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlQ29tcG9uZW50cyhzb21lQ29tcG9uZW50cz8pIHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgY29tcG9uZW50cycpO1xuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbXBvbmVudHMgPSBzb21lQ29tcG9uZW50c1xuICAgICAgICAgICAgPyBzb21lQ29tcG9uZW50c1xuICAgICAgICAgICAgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0Q29tcG9uZW50cygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgobWFpblByZXBhcmVDb21wb25lbnRSZXNvbHZlLCBtYWluUHJlcGFyZUNvbXBvbmVudFJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb21wb25lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPD0gbGVuIC0gMSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvbXBvbmVudHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChNYXJrZG93bkVuZ2luZS5oYXNOZWlnaGJvdXJSZWFkbWVGaWxlKGNvbXBvbmVudC5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2NvbXBvbmVudC5uYW1lfSBoYXMgYSBSRUFETUUgZmlsZSwgaW5jbHVkZSBpdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZG1lRmlsZSA9IE1hcmtkb3duRW5naW5lLnJlYWROZWlnaGJvdXJSZWFkbWVGaWxlKGNvbXBvbmVudC5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZWFkbWUgPSBtYXJrZWRBY2wocmVhZG1lRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdjb21wb25lbnRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGNvbXBvbmVudC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGNvbXBvbmVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdlRhYnM6IHRoaXMuZ2V0TmF2VGFicyhjb21wb25lbnQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2NvbXBvbmVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgY29tcG9uZW50LmR1cGxpY2F0ZUlkO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24uYWRkUGFnZShwYWdlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRUZW1wbGF0ZVVybFByb21pc2UgPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChjb21wb25lbnRUZW1wbGF0ZVVybFJlc29sdmUsIGNvbXBvbmVudFRlbXBsYXRlVXJsUmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudC50ZW1wbGF0ZVVybC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtjb21wb25lbnQubmFtZX0gaGFzIGEgdGVtcGxhdGVVcmwsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVUZW1wbGF0ZXVybChjb21wb25lbnQpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50VGVtcGxhdGVVcmxSZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRUZW1wbGF0ZVVybFJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRlbXBsYXRlVXJsUmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFN0eWxlVXJsc1Byb21pc2UgPSBuZXcgUHJvbWlzZShcbiAgICAgICAgICAgICAgICAgICAgICAgIChjb21wb25lbnRTdHlsZVVybHNSZXNvbHZlLCBjb21wb25lbnRTdHlsZVVybHNSZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LnN0eWxlVXJscy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtjb21wb25lbnQubmFtZX0gaGFzIHN0eWxlVXJscywgaW5jbHVkZSB0aGVtYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3R5bGV1cmxzKGNvbXBvbmVudCkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdHlsZVVybHNSZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdHlsZVVybHNSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdHlsZVVybHNSZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50U3R5bGVzUHJvbWlzZSA9IG5ldyBQcm9taXNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvbXBvbmVudFN0eWxlc1Jlc29sdmUsIGNvbXBvbmVudFN0eWxlc1JlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQuc3R5bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2NvbXBvbmVudC5uYW1lfSBoYXMgc3R5bGVzLCBpbmNsdWRlIHRoZW1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVTdHlsZXMoY29tcG9uZW50KS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlc1Jlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlc1JlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlc1Jlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKFtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFRlbXBsYXRlVXJsUHJvbWlzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudFN0eWxlVXJsc1Byb21pc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRTdHlsZXNQcm9taXNlXG4gICAgICAgICAgICAgICAgICAgIF0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBtYWluUHJlcGFyZUNvbXBvbmVudFJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVEaXJlY3RpdmVzKHNvbWVEaXJlY3RpdmVzPykge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBkaXJlY3RpdmVzJyk7XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXJlY3RpdmVzID0gc29tZURpcmVjdGl2ZXNcbiAgICAgICAgICAgID8gc29tZURpcmVjdGl2ZXNcbiAgICAgICAgICAgIDogRGVwZW5kZW5jaWVzRW5naW5lLmdldERpcmVjdGl2ZXMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgbGV0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlyZWN0aXZlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aXZlID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXJlY3RpdmVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShkaXJlY3RpdmUuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtkaXJlY3RpdmUubmFtZX0gaGFzIGEgUkVBRE1FIGZpbGUsIGluY2x1ZGUgaXRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZWFkbWUgPSBNYXJrZG93bkVuZ2luZS5yZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShkaXJlY3RpdmUuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RpdmUucmVhZG1lID0gbWFya2VkQWNsKHJlYWRtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnZGlyZWN0aXZlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBkaXJlY3RpdmUubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBkaXJlY3RpdmUuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoZGlyZWN0aXZlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdkaXJlY3RpdmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlOiBkaXJlY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXB0aDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VUeXBlOiBDT01QT0RPQ19ERUZBVUxUUy5QQUdFX1RZUEVTLklOVEVSTkFMXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3RpdmUuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBkaXJlY3RpdmUuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsb29wKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlSW5qZWN0YWJsZXMoc29tZUluamVjdGFibGVzPyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBpbmplY3RhYmxlcycpO1xuXG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5qZWN0YWJsZXMgPSBzb21lSW5qZWN0YWJsZXNcbiAgICAgICAgICAgID8gc29tZUluamVjdGFibGVzXG4gICAgICAgICAgICA6IERlcGVuZGVuY2llc0VuZ2luZS5nZXRJbmplY3RhYmxlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgICAgICBsZXQgbGVuID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmplY3RhYmxlcy5sZW5ndGg7XG4gICAgICAgICAgICBsZXQgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5qZWMgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmluamVjdGFibGVzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShpbmplYy5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2luamVjLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVhZG1lID0gTWFya2Rvd25FbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoaW5qZWMuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbmplYy5yZWFkbWUgPSBtYXJrZWRBY2wocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6ICdpbmplY3RhYmxlcycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbmplYy5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGluamVjLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGluamVjKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdpbmplY3RhYmxlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGU6IGluamVjLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5qZWMuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBpbmplYy5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZUludGVyY2VwdG9ycyhzb21lSW50ZXJjZXB0b3JzPyk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJlcGFyZSBpbnRlcmNlcHRvcnMnKTtcblxuICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmludGVyY2VwdG9ycyA9IHNvbWVJbnRlcmNlcHRvcnNcbiAgICAgICAgICAgID8gc29tZUludGVyY2VwdG9yc1xuICAgICAgICAgICAgOiBEZXBlbmRlbmNpZXNFbmdpbmUuZ2V0SW50ZXJjZXB0b3JzKCk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGNvbnN0IGxlbiA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW50ZXJjZXB0b3JzLmxlbmd0aDtcbiAgICAgICAgICAgIGNvbnN0IGxvb3AgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50ZXJjZXB0b3IgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmludGVyY2VwdG9yc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKE1hcmtkb3duRW5naW5lLmhhc05laWdoYm91clJlYWRtZUZpbGUoaW50ZXJjZXB0b3IuZmlsZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGAgJHtpbnRlcmNlcHRvci5uYW1lfSBoYXMgYSBSRUFETUUgZmlsZSwgaW5jbHVkZSBpdGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVhZG1lID0gTWFya2Rvd25FbmdpbmUucmVhZE5laWdoYm91clJlYWRtZUZpbGUoaW50ZXJjZXB0b3IuZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmNlcHRvci5yZWFkbWUgPSBtYXJrZWRBY2wocmVhZG1lKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWdlID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aDogJ2ludGVyY2VwdG9ycycsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpbnRlcmNlcHRvci5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IGludGVyY2VwdG9yLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmF2VGFiczogdGhpcy5nZXROYXZUYWJzKGludGVyY2VwdG9yKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdpbnRlcmNlcHRvcicsXG4gICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RhYmxlOiBpbnRlcmNlcHRvcixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHRoOiAxLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZVR5cGU6IENPTVBPRE9DX0RFRkFVTFRTLlBBR0VfVFlQRVMuSU5URVJOQUxcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGludGVyY2VwdG9yLmlzRHVwbGljYXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlLm5hbWUgKz0gJy0nICsgaW50ZXJjZXB0b3IuZHVwbGljYXRlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVHdWFyZHMoc29tZUd1YXJkcz8pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1ByZXBhcmUgZ3VhcmRzJyk7XG5cbiAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ndWFyZHMgPSBzb21lR3VhcmRzID8gc29tZUd1YXJkcyA6IERlcGVuZGVuY2llc0VuZ2luZS5nZXRHdWFyZHMoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICAgICAgY29uc3QgbGVuID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ndWFyZHMubGVuZ3RoO1xuICAgICAgICAgICAgY29uc3QgbG9vcCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBndWFyZCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ3VhcmRzW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAoTWFya2Rvd25FbmdpbmUuaGFzTmVpZ2hib3VyUmVhZG1lRmlsZShndWFyZC5maWxlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oYCAke2d1YXJkLm5hbWV9IGhhcyBhIFJFQURNRSBmaWxlLCBpbmNsdWRlIGl0YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWFkbWUgPSBNYXJrZG93bkVuZ2luZS5yZWFkTmVpZ2hib3VyUmVhZG1lRmlsZShndWFyZC5maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGd1YXJkLnJlYWRtZSA9IG1hcmtlZEFjbChyZWFkbWUpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhZ2UgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoOiAnZ3VhcmRzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGd1YXJkLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZDogZ3VhcmQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZUYWJzOiB0aGlzLmdldE5hdlRhYnMoZ3VhcmQpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDogJ2d1YXJkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdGFibGU6IGd1YXJkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwdGg6IDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5JTlRFUk5BTFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBpZiAoZ3VhcmQuaXNEdXBsaWNhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2UubmFtZSArPSAnLScgKyBndWFyZC5kdXBsaWNhdGVJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJlcGFyZVJvdXRlcygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3Mgcm91dGVzJyk7XG4gICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucm91dGVzID0gRGVwZW5kZW5jaWVzRW5naW5lLmdldFJvdXRlcygpO1xuXG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLmFkZFBhZ2Uoe1xuICAgICAgICAgICAgICAgIG5hbWU6ICdyb3V0ZXMnLFxuICAgICAgICAgICAgICAgIGlkOiAncm91dGVzJyxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAncm91dGVzJyxcbiAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID09PSBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBSb3V0ZXJQYXJzZXJVdGlsLmdlbmVyYXRlUm91dGVzSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0LFxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnJvdXRlc1xuICAgICAgICAgICAgICAgICkudGhlbihcbiAgICAgICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJyBSb3V0ZXMgaW5kZXggZ2VuZXJhdGVkJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcmVwYXJlQ292ZXJhZ2UoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgcmVwb3J0Jyk7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgKiBsb29wIHdpdGggY29tcG9uZW50cywgZGlyZWN0aXZlcywgY29udHJvbGxlcnMsIGVudGl0aWVzLCBjbGFzc2VzLCBpbmplY3RhYmxlcywgaW50ZXJmYWNlcywgcGlwZXMsIGd1YXJkcywgbWlzYyBmdW5jdGlvbnMgdmFyaWFibGVzXG4gICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxldCBmaWxlcyA9IFtdO1xuICAgICAgICAgICAgbGV0IHRvdGFsUHJvamVjdFN0YXRlbWVudERvY3VtZW50ZWQgPSAwO1xuICAgICAgICAgICAgY29uc3QgZ2V0U3RhdHVzID0gZnVuY3Rpb24gKHBlcmNlbnQpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3RhdHVzO1xuICAgICAgICAgICAgICAgIGlmIChwZXJjZW50IDw9IDI1KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdsb3cnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGVyY2VudCA+IDI1ICYmIHBlcmNlbnQgPD0gNTApIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ21lZGl1bSc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID4gNTAgJiYgcGVyY2VudCA8PSA3NSkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnZ29vZCc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ3ZlcnktZ29vZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY29uc3QgcHJvY2Vzc0NvbXBvbmVudHNBbmREaXJlY3RpdmVzQW5kQ29udHJvbGxlcnNBbmRFbnRpdGllcyA9IGxpc3QgPT4ge1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChsaXN0LCAoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKE9iamVjdCBhcyBhbnkpLmFzc2lnbih7fSwgZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQucHJvcGVydGllc0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnByb3BlcnRpZXNDbGFzcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5tZXRob2RzQ2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubWV0aG9kc0NsYXNzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lmhvc3RCaW5kaW5ncykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5ob3N0QmluZGluZ3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuaG9zdExpc3RlbmVycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5ob3N0TGlzdGVuZXJzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LmlucHV0c0NsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlucHV0c0NsYXNzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lm91dHB1dHNDbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5vdXRwdXRzQ2xhc3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjbDogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IGVsZW1lbnQuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGVsZW1lbnQudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0eXBlOiBlbGVtZW50LnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5wcm9wZXJ0aWVzQ2xhc3MubGVuZ3RoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQubWV0aG9kc0NsYXNzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlucHV0c0NsYXNzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lmhvc3RCaW5kaW5ncy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5ob3N0TGlzdGVuZXJzLmxlbmd0aCArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50Lm91dHB1dHNDbGFzcy5sZW5ndGggK1xuICAgICAgICAgICAgICAgICAgICAgICAgMTsgLy8gKzEgZm9yIGVsZW1lbnQgZGVjb3JhdG9yIGNvbW1lbnRcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jb25zdHJ1Y3Rvck9iaikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb25zdHJ1Y3Rvck9iaiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29uc3RydWN0b3JPYmouZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnN0cnVjdG9yT2JqLmRlc2NyaXB0aW9uICE9PSAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZGVzY3JpcHRpb24gJiYgZWxlbWVudC5kZXNjcmlwdGlvbiAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQucHJvcGVydGllc0NsYXNzLCAocHJvcGVydHk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQubWV0aG9kc0NsYXNzLCAobWV0aG9kOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5ob3N0QmluZGluZ3MsIChwcm9wZXJ0eTogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvcGVydHkubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5Lm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5ob3N0TGlzdGVuZXJzLCAobWV0aG9kOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRob2QubW9kaWZpZXJLaW5kID09PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgLT0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5pbnB1dHNDbGFzcywgKGlucHV0OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5tb2RpZmllcktpbmQgPT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IGhhbmRsZSBwcml2YXRlIGZvciBjb3ZlcmFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuZGVzY3JpcHRpb24gIT09ICcnICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQubW9kaWZpZXJLaW5kICE9PSBTeW50YXhLaW5kLlByaXZhdGVLZXl3b3JkXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIF8uZm9yRWFjaChlbGVtZW50Lm91dHB1dHNDbGFzcywgKG91dHB1dDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0Lm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjbC5jb3ZlcmFnZVBlcmNlbnQgPSBNYXRoLmZsb29yKFxuICAgICAgICAgICAgICAgICAgICAgICAgKHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCAvIHRvdGFsU3RhdGVtZW50cykgKiAxMDBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsU3RhdGVtZW50cyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2wuY292ZXJhZ2VQZXJjZW50ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjbC5jb3ZlcmFnZUNvdW50ID0gdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICsgJy8nICsgdG90YWxTdGF0ZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBjbC5zdGF0dXMgPSBnZXRTdGF0dXMoY2wuY292ZXJhZ2VQZXJjZW50KTtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCArPSBjbC5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goY2wpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzQ292ZXJhZ2VQZXJGaWxlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUnKTtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnLS0tLS0tLS0tLS0tLS0tLS0tLScpO1xuXG4gICAgICAgICAgICAgICAgbGV0IG92ZXJGaWxlcyA9IGZpbGVzLmZpbHRlcihmID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG92ZXJUZXN0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGYuY292ZXJhZ2VQZXJjZW50ID49IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJUZXN0ICYmICFDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtmLmNvdmVyYWdlUGVyY2VudH0gJSBmb3IgZmlsZSAke2YuZmlsZVBhdGh9IC0gJHtmLm5hbWV9IC0gb3ZlciBtaW5pbXVtIHBlciBmaWxlYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3ZlclRlc3Q7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgbGV0IHVuZGVyRmlsZXMgPSBmaWxlcy5maWx0ZXIoZiA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1bmRlclRlc3QgPVxuICAgICAgICAgICAgICAgICAgICAgICAgZi5jb3ZlcmFnZVBlcmNlbnQgPCBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bmRlclRlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgJHtmLmNvdmVyYWdlUGVyY2VudH0gJSBmb3IgZmlsZSAke2YuZmlsZVBhdGh9IC0gJHtmLm5hbWV9IC0gdW5kZXIgbWluaW11bSBwZXIgZmlsZWBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVyVGVzdDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCctLS0tLS0tLS0tLS0tLS0tLS0tJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlckZpbGVzOiBvdmVyRmlsZXMsXG4gICAgICAgICAgICAgICAgICAgIHVuZGVyRmlsZXM6IHVuZGVyRmlsZXNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGxldCBwcm9jZXNzRnVuY3Rpb25zQW5kVmFyaWFibGVzID0gKGlkLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGlkLCAoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2w6IGFueSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVQYXRoOiBlbC5maWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0eXBlOiBlbC50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGlua3N1YnR5cGU6IGVsLnN1YnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbC5uYW1lXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAndmFyaWFibGUnIHx8IHR5cGUgPT09ICdmdW5jdGlvbicgfHwgdHlwZSA9PT0gJ3R5cGUgYWxpYXMnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbC5saW5rdHlwZSA9ICdtaXNjZWxsYW5lb3VzJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50cyA9IDE7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsLm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gRG9lc24ndCBoYW5kbGUgcHJpdmF0ZSBmb3IgY292ZXJhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50cyAtPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBlbC5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLm1vZGlmaWVyS2luZCAhPT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZFxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2wuY292ZXJhZ2VQZXJjZW50ID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgLyB0b3RhbFN0YXRlbWVudHMpICogMTAwXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGNsLmNvdmVyYWdlQ291bnQgPSB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKyAnLycgKyB0b3RhbFN0YXRlbWVudHM7XG4gICAgICAgICAgICAgICAgICAgIGNsLnN0YXR1cyA9IGdldFN0YXR1cyhjbC5jb3ZlcmFnZVBlcmNlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFByb2plY3RTdGF0ZW1lbnREb2N1bWVudGVkICs9IGNsLmNvdmVyYWdlUGVyY2VudDtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChjbCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBsZXQgcHJvY2Vzc0NsYXNzZXMgPSAobGlzdCwgdHlwZSwgbGlua3R5cGUpID0+IHtcbiAgICAgICAgICAgICAgICBfLmZvckVhY2gobGlzdCwgKGNsOiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSAoT2JqZWN0IGFzIGFueSkuYXNzaWduKHt9LCBjbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5wcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnByb3BlcnRpZXMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQubWV0aG9kcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5tZXRob2RzID0gW107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbGV0IGNsYTogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsZVBhdGg6IGVsZW1lbnQuZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaW5rdHlwZTogbGlua3R5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBlbGVtZW50Lm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3RhbFN0YXRlbWVudHMgPSBlbGVtZW50LnByb3BlcnRpZXMubGVuZ3RoICsgZWxlbWVudC5tZXRob2RzLmxlbmd0aCArIDE7IC8vICsxIGZvciBlbGVtZW50IGl0c2VsZlxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmNvbnN0cnVjdG9yT2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudHMgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNvbnN0cnVjdG9yT2JqICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb25zdHJ1Y3Rvck9iai5kZXNjcmlwdGlvbiAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuY29uc3RydWN0b3JPYmouZGVzY3JpcHRpb24gIT09ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5kZXNjcmlwdGlvbiAmJiBlbGVtZW50LmRlc2NyaXB0aW9uICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBfLmZvckVhY2goZWxlbWVudC5wcm9wZXJ0aWVzLCAocHJvcGVydHk6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5Lm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZGVzY3JpcHRpb24gJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5kZXNjcmlwdGlvbiAhPT0gJycgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgXy5mb3JFYWNoKGVsZW1lbnQubWV0aG9kcywgKG1ldGhvZDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kLm1vZGlmaWVyS2luZCA9PT0gU3ludGF4S2luZC5Qcml2YXRlS2V5d29yZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvZXNuJ3QgaGFuZGxlIHByaXZhdGUgZm9yIGNvdmVyYWdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnRzIC09IDE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLmRlc2NyaXB0aW9uICE9PSAnJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZC5tb2RpZmllcktpbmQgIT09IFN5bnRheEtpbmQuUHJpdmF0ZUtleXdvcmRcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArPSAxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjbGEuY292ZXJhZ2VQZXJjZW50ID0gTWF0aC5mbG9vcihcbiAgICAgICAgICAgICAgICAgICAgICAgICh0b3RhbFN0YXRlbWVudERvY3VtZW50ZWQgLyB0b3RhbFN0YXRlbWVudHMpICogMTAwXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbFN0YXRlbWVudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYS5jb3ZlcmFnZVBlcmNlbnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNsYS5jb3ZlcmFnZUNvdW50ID0gdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICsgJy8nICsgdG90YWxTdGF0ZW1lbnRzO1xuICAgICAgICAgICAgICAgICAgICBjbGEuc3RhdHVzID0gZ2V0U3RhdHVzKGNsYS5jb3ZlcmFnZVBlcmNlbnQpO1xuICAgICAgICAgICAgICAgICAgICB0b3RhbFByb2plY3RTdGF0ZW1lbnREb2N1bWVudGVkICs9IGNsYS5jb3ZlcmFnZVBlcmNlbnQ7XG4gICAgICAgICAgICAgICAgICAgIGZpbGVzLnB1c2goY2xhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHByb2Nlc3NDb21wb25lbnRzQW5kRGlyZWN0aXZlc0FuZENvbnRyb2xsZXJzQW5kRW50aXRpZXMoXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb21wb25lbnRzXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvY2Vzc0NvbXBvbmVudHNBbmREaXJlY3RpdmVzQW5kQ29udHJvbGxlcnNBbmRFbnRpdGllcyhcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpcmVjdGl2ZXNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50c0FuZERpcmVjdGl2ZXNBbmRDb250cm9sbGVyc0FuZEVudGl0aWVzKFxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY29udHJvbGxlcnNcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBwcm9jZXNzQ29tcG9uZW50c0FuZERpcmVjdGl2ZXNBbmRDb250cm9sbGVyc0FuZEVudGl0aWVzKFxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZW50aXRpZXNcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHByb2Nlc3NDbGFzc2VzKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY2xhc3NlcywgJ2NsYXNzJywgJ2NsYXNzZScpO1xuICAgICAgICAgICAgcHJvY2Vzc0NsYXNzZXMoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmplY3RhYmxlcywgJ2luamVjdGFibGUnLCAnaW5qZWN0YWJsZScpO1xuICAgICAgICAgICAgcHJvY2Vzc0NsYXNzZXMoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmZhY2VzLCAnaW50ZXJmYWNlJywgJ2ludGVyZmFjZScpO1xuICAgICAgICAgICAgcHJvY2Vzc0NsYXNzZXMoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ndWFyZHMsICdndWFyZCcsICdndWFyZCcpO1xuICAgICAgICAgICAgcHJvY2Vzc0NsYXNzZXMoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbnRlcmNlcHRvcnMsICdpbnRlcmNlcHRvcicsICdpbnRlcmNlcHRvcicpO1xuXG4gICAgICAgICAgICBfLmZvckVhY2goQ29uZmlndXJhdGlvbi5tYWluRGF0YS5waXBlcywgKHBpcGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBjbDogYW55ID0ge1xuICAgICAgICAgICAgICAgICAgICBmaWxlUGF0aDogcGlwZS5maWxlLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBwaXBlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIGxpbmt0eXBlOiBwaXBlLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgIG5hbWU6IHBpcGUubmFtZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCA9IDA7XG4gICAgICAgICAgICAgICAgbGV0IHRvdGFsU3RhdGVtZW50cyA9IDE7XG4gICAgICAgICAgICAgICAgaWYgKHBpcGUuZGVzY3JpcHRpb24gJiYgcGlwZS5kZXNjcmlwdGlvbiAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgdG90YWxTdGF0ZW1lbnREb2N1bWVudGVkICs9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2wuY292ZXJhZ2VQZXJjZW50ID0gTWF0aC5mbG9vcigodG90YWxTdGF0ZW1lbnREb2N1bWVudGVkIC8gdG90YWxTdGF0ZW1lbnRzKSAqIDEwMCk7XG4gICAgICAgICAgICAgICAgY2wuY292ZXJhZ2VDb3VudCA9IHRvdGFsU3RhdGVtZW50RG9jdW1lbnRlZCArICcvJyArIHRvdGFsU3RhdGVtZW50cztcbiAgICAgICAgICAgICAgICBjbC5zdGF0dXMgPSBnZXRTdGF0dXMoY2wuY292ZXJhZ2VQZXJjZW50KTtcbiAgICAgICAgICAgICAgICB0b3RhbFByb2plY3RTdGF0ZW1lbnREb2N1bWVudGVkICs9IGNsLmNvdmVyYWdlUGVyY2VudDtcbiAgICAgICAgICAgICAgICBmaWxlcy5wdXNoKGNsKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBwcm9jZXNzRnVuY3Rpb25zQW5kVmFyaWFibGVzKFxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubWlzY2VsbGFuZW91cy5mdW5jdGlvbnMsXG4gICAgICAgICAgICAgICAgJ2Z1bmN0aW9uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHByb2Nlc3NGdW5jdGlvbnNBbmRWYXJpYWJsZXMoXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5taXNjZWxsYW5lb3VzLnZhcmlhYmxlcyxcbiAgICAgICAgICAgICAgICAndmFyaWFibGUnXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcHJvY2Vzc0Z1bmN0aW9uc0FuZFZhcmlhYmxlcyhcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1pc2NlbGxhbmVvdXMudHlwZWFsaWFzZXMsXG4gICAgICAgICAgICAgICAgJ3R5cGUgYWxpYXMnXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBmaWxlcyA9IF8uc29ydEJ5KGZpbGVzLCBbJ2ZpbGVQYXRoJ10pO1xuXG4gICAgICAgICAgICBsZXQgY292ZXJhZ2VEYXRhID0ge1xuICAgICAgICAgICAgICAgIGNvdW50OlxuICAgICAgICAgICAgICAgICAgICBmaWxlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IE1hdGguZmxvb3IodG90YWxQcm9qZWN0U3RhdGVtZW50RG9jdW1lbnRlZCAvIGZpbGVzLmxlbmd0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgICAgICBzdGF0dXM6ICcnLFxuICAgICAgICAgICAgICAgIGZpbGVzXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgY292ZXJhZ2VEYXRhLnN0YXR1cyA9IGdldFN0YXR1cyhjb3ZlcmFnZURhdGEuY291bnQpO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnY292ZXJhZ2UnLFxuICAgICAgICAgICAgICAgIGlkOiAnY292ZXJhZ2UnLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICdjb3ZlcmFnZScsXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLFxuICAgICAgICAgICAgICAgIGRhdGE6IGNvdmVyYWdlRGF0YSxcbiAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5maWxlcyA9IGZpbGVzO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZURhdGEgPSBjb3ZlcmFnZURhdGE7XG4gICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHBvcnRGb3JtYXQgPT09IENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdCkge1xuICAgICAgICAgICAgICAgIEh0bWxFbmdpbmUuZ2VuZXJhdGVDb3ZlcmFnZUJhZGdlKFxuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCxcbiAgICAgICAgICAgICAgICAgICAgJ2RvY3VtZW50YXRpb24nLFxuICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZURhdGFcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsZXMgPSBfLnNvcnRCeShmaWxlcywgWydjb3ZlcmFnZVBlcmNlbnQnXSk7XG5cbiAgICAgICAgICAgIGxldCBjb3ZlcmFnZVRlc3RQZXJGaWxlUmVzdWx0cztcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdCAmJlxuICAgICAgICAgICAgICAgICFDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFBlckZpbGVcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIC8vIEdsb2JhbCBjb3ZlcmFnZSB0ZXN0IGFuZCBub3QgcGVyIGZpbGVcbiAgICAgICAgICAgICAgICBpZiAoY292ZXJhZ2VEYXRhLmNvdW50ID49IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERvY3VtZW50YXRpb24gY292ZXJhZ2UgKCR7Y292ZXJhZ2VEYXRhLmNvdW50fSUpIGlzIG92ZXIgdGhyZXNob2xkICgke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke2NvdmVyYWdlRGF0YS5jb3VudH0lKSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGR9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0ICYmXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RQZXJGaWxlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBjb3ZlcmFnZVRlc3RQZXJGaWxlUmVzdWx0cyA9IHByb2Nlc3NDb3ZlcmFnZVBlckZpbGUoKTtcbiAgICAgICAgICAgICAgICAvLyBQZXIgZmlsZSBjb3ZlcmFnZSB0ZXN0IGFuZCBub3QgZ2xvYmFsXG4gICAgICAgICAgICAgICAgaWYgKGNvdmVyYWdlVGVzdFBlckZpbGVSZXN1bHRzLnVuZGVyRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlIGlzIG5vdCBvdmVyIHRocmVzaG9sZCAoJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGV9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICAgICAgICAgYERvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgaXMgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlfSUpYFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0ICYmXG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RQZXJGaWxlXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAvLyBQZXIgZmlsZSBjb3ZlcmFnZSB0ZXN0IGFuZCBnbG9iYWxcbiAgICAgICAgICAgICAgICBjb3ZlcmFnZVRlc3RQZXJGaWxlUmVzdWx0cyA9IHByb2Nlc3NDb3ZlcmFnZVBlckZpbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5jb3VudCA+PSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZCAmJlxuICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZVRlc3RQZXJGaWxlUmVzdWx0cy51bmRlckZpbGVzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke2NvdmVyYWdlRGF0YS5jb3VudH0lKSBpcyBvdmVyIHRocmVzaG9sZCAoJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZH0lKWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSBpcyBvdmVyIHRocmVzaG9sZCAoJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGV9JSlgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25Qcm9taXNlUmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlRGF0YS5jb3VudCA+PSBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZCAmJlxuICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZVRlc3RQZXJGaWxlUmVzdWx0cy51bmRlckZpbGVzLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgICAgICBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSAoJHtjb3ZlcmFnZURhdGEuY291bnR9JSkgaXMgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGR9JSlgXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgcGVyIGZpbGUgaXMgbm90IG92ZXIgdGhyZXNob2xkICgke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZX0lKWA7XG4gICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb25Qcm9taXNlUmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VEYXRhLmNvdW50IDwgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGQgJiZcbiAgICAgICAgICAgICAgICAgICAgY292ZXJhZ2VUZXN0UGVyRmlsZVJlc3VsdHMudW5kZXJGaWxlcy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlR2xvYmFsID0gYERvY3VtZW50YXRpb24gY292ZXJhZ2UgKCR7Y292ZXJhZ2VEYXRhLmNvdW50fSUpIGlzIG5vdCBvdmVyIHRocmVzaG9sZCAoJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZH0lKWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGVyRmlsZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlIGlzIG5vdCBvdmVyIHRocmVzaG9sZCAoJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGV9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZUdsb2JhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZVBlckZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4obWVzc2FnZUdsb2JhbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlUGVyRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBEb2N1bWVudGF0aW9uIGNvdmVyYWdlICgke2NvdmVyYWdlRGF0YS5jb3VudH0lKSBpcyBub3Qgb3ZlciB0aHJlc2hvbGQgKCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGR9JSlgLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBlckZpbGUgPSBgRG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSBwZXIgZmlsZSBpcyBvdmVyIHRocmVzaG9sZCAoJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGV9JSlgO1xuICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uUHJvbWlzZVJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhtZXNzYWdlUGVyRmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLmV4aXQoMSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybihtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKG1lc3NhZ2VQZXJGaWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByZXBhcmVVbml0VGVzdENvdmVyYWdlKCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyB1bml0IHRlc3QgY292ZXJhZ2UgcmVwb3J0Jyk7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBsZXQgY292RGF0LCBjb3ZGaWxlTmFtZXM7XG5cbiAgICAgICAgICAgIGxldCBjb3ZlcmFnZURhdGE6IENvdmVyYWdlRGF0YSA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VEYXRhO1xuXG4gICAgICAgICAgICBpZiAoIWNvdmVyYWdlRGF0YS5maWxlcykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci53YXJuKCdNaXNzaW5nIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgZGF0YScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb3ZEYXQgPSB7fTtcbiAgICAgICAgICAgICAgICBjb3ZGaWxlTmFtZXMgPSBfLm1hcChjb3ZlcmFnZURhdGEuZmlsZXMsIGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbGVOYW1lID0gcGF0aC5ub3JtYWxpemUoZWwuZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgICBjb3ZEYXRbZmlsZU5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogZWwudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0eXBlOiBlbC5saW5rdHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtzdWJ0eXBlOiBlbC5saW5rc3VidHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGVsLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gcmVhZCBjb3ZlcmFnZSBzdW1tYXJ5IGZpbGUgYW5kIGRhdGFcbiAgICAgICAgICAgIGxldCB1bml0VGVzdFN1bW1hcnkgPSB7fTtcbiAgICAgICAgICAgIGxldCBmaWxlRGF0ID0gRmlsZUVuZ2luZS5nZXRTeW5jKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3RDb3ZlcmFnZSk7XG4gICAgICAgICAgICBpZiAoZmlsZURhdCkge1xuICAgICAgICAgICAgICAgIHVuaXRUZXN0U3VtbWFyeSA9IEpTT04ucGFyc2UoZmlsZURhdCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCgnRXJyb3IgcmVhZGluZyB1bml0IHRlc3QgY292ZXJhZ2UgZmlsZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IGdldENvdlN0YXR1cyA9IGZ1bmN0aW9uIChwZXJjZW50LCB0b3RhbExpbmVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cztcbiAgICAgICAgICAgICAgICBpZiAodG90YWxMaW5lcyA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAndW5jb3ZlcmVkJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPD0gMjUpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gJ2xvdyc7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwZXJjZW50ID4gMjUgJiYgcGVyY2VudCA8PSA1MCkge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAnbWVkaXVtJztcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBlcmNlbnQgPiA1MCAmJiBwZXJjZW50IDw9IDc1KSB7XG4gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICdnb29kJztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAndmVyeS1nb29kJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1cztcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBsZXQgZ2V0Q292ZXJhZ2VEYXRhID0gZnVuY3Rpb24gKGRhdGEsIGZpbGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgbGV0IG91dCA9IHt9O1xuICAgICAgICAgICAgICAgIGlmIChmaWxlTmFtZSAhPT0gJ3RvdGFsJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY292RGF0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgYSBuYW1lIHRvIGluY2x1ZGUgaW4gb3V0cHV0IGJ1dCB0aGlzIGlzbid0IHZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9IHsgbmFtZTogZmlsZU5hbWUsIGZpbGVQYXRoOiBmaWxlTmFtZSB9O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmluZE1hdGNoID0gXy5maWx0ZXIoY292RmlsZU5hbWVzLCBlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEZpbGVuYW1lID0gcGF0aC5ub3JtYWxpemUoZmlsZU5hbWUpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwuaW5jbHVkZXMoZmlsZU5hbWUpIHx8IG5vcm1hbGl6ZWRGaWxlbmFtZS5pbmNsdWRlcyhlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kTWF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dCA9IF8uY2xvbmUoY292RGF0W2ZpbmRNYXRjaFswXV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFsnZmlsZVBhdGgnXSA9IGZpbGVOYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBrZXlzVG9HZXQgPSBbJ3N0YXRlbWVudHMnLCAnYnJhbmNoZXMnLCAnZnVuY3Rpb25zJywgJ2xpbmVzJ107XG4gICAgICAgICAgICAgICAgXy5mb3JFYWNoKGtleXNUb0dldCwga2V5ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGFba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHQgPSBkYXRhW2tleV07XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRba2V5XSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3ZlcmFnZVBlcmNlbnQ6IE1hdGgucm91bmQodC5wY3QpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdmVyYWdlQ291bnQ6ICcnICsgdC5jb3ZlcmVkICsgJy8nICsgdC50b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IGdldENvdlN0YXR1cyh0LnBjdCwgdC50b3RhbClcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgbGV0IHVuaXRUZXN0RGF0YSA9IHt9O1xuICAgICAgICAgICAgbGV0IGZpbGVzID0gW107XG4gICAgICAgICAgICBmb3IgKGxldCBmaWxlIGluIHVuaXRUZXN0U3VtbWFyeSkge1xuICAgICAgICAgICAgICAgIGxldCBkYXQgPSBnZXRDb3ZlcmFnZURhdGEodW5pdFRlc3RTdW1tYXJ5W2ZpbGVdLCBmaWxlKTtcbiAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PT0gJ3RvdGFsJykge1xuICAgICAgICAgICAgICAgICAgICB1bml0VGVzdERhdGFbJ3RvdGFsJ10gPSBkYXQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmlsZXMucHVzaChkYXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHVuaXRUZXN0RGF0YVsnZmlsZXMnXSA9IGZpbGVzO1xuICAgICAgICAgICAgdW5pdFRlc3REYXRhWydpZENvbHVtbiddID0gY292RGF0ICE9PSB1bmRlZmluZWQ7IC8vIHNob3VsZCB3ZSBpbmNsdWRlIHRoZSBpZCBjb2x1bW5cbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3REYXRhID0gdW5pdFRlc3REYXRhO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5hZGRQYWdlKHtcbiAgICAgICAgICAgICAgICBuYW1lOiAndW5pdC10ZXN0JyxcbiAgICAgICAgICAgICAgICBpZDogJ3VuaXQtdGVzdCcsXG4gICAgICAgICAgICAgICAgY29udGV4dDogJ3VuaXQtdGVzdCcsXG4gICAgICAgICAgICAgICAgZmlsZXM6IGZpbGVzLFxuICAgICAgICAgICAgICAgIGRhdGE6IHVuaXRUZXN0RGF0YSxcbiAgICAgICAgICAgICAgICBkZXB0aDogMCxcbiAgICAgICAgICAgICAgICBwYWdlVHlwZTogQ09NUE9ET0NfREVGQVVMVFMuUEFHRV9UWVBFUy5ST09UXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID09PSBDT01QT0RPQ19ERUZBVUxUUy5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBsZXQga2V5c1RvR2V0ID0gWydzdGF0ZW1lbnRzJywgJ2JyYW5jaGVzJywgJ2Z1bmN0aW9ucycsICdsaW5lcyddO1xuICAgICAgICAgICAgICAgIF8uZm9yRWFjaChrZXlzVG9HZXQsIGtleSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh1bml0VGVzdERhdGFbJ3RvdGFsJ11ba2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgSHRtbEVuZ2luZS5nZW5lcmF0ZUNvdmVyYWdlQmFkZ2UoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQsIGtleSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiB1bml0VGVzdERhdGFbJ3RvdGFsJ11ba2V5XVsnY292ZXJhZ2VQZXJjZW50J10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB1bml0VGVzdERhdGFbJ3RvdGFsJ11ba2V5XVsnc3RhdHVzJ11cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NQYWdlKHBhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3MgcGFnZScsIHBhZ2UubmFtZSk7XG5cbiAgICAgICAgbGV0IGh0bWxEYXRhID0gSHRtbEVuZ2luZS5yZW5kZXIoQ29uZmlndXJhdGlvbi5tYWluRGF0YSwgcGFnZSk7XG4gICAgICAgIGxldCBmaW5hbFBhdGggPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dDtcblxuICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQubGFzdEluZGV4T2YoJy8nKSA9PT0gLTEpIHtcbiAgICAgICAgICAgIGZpbmFsUGF0aCArPSAnLyc7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBhZ2UucGF0aCkge1xuICAgICAgICAgICAgZmluYWxQYXRoICs9IHBhZ2UucGF0aCArICcvJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwYWdlLmZpbGVuYW1lKSB7XG4gICAgICAgICAgICBmaW5hbFBhdGggKz0gcGFnZS5maWxlbmFtZSArICcuaHRtbCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmaW5hbFBhdGggKz0gcGFnZS5uYW1lICsgJy5odG1sJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU2VhcmNoKSB7XG4gICAgICAgICAgICBTZWFyY2hFbmdpbmUuaW5kZXhQYWdlKHtcbiAgICAgICAgICAgICAgICBpbmZvczogcGFnZSxcbiAgICAgICAgICAgICAgICByYXdEYXRhOiBodG1sRGF0YSxcbiAgICAgICAgICAgICAgICB1cmw6IGZpbmFsUGF0aFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBGaWxlRW5naW5lLndyaXRlU3luYyhmaW5hbFBhdGgsIGh0bWxEYXRhKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0cnVlKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcHJvY2Vzc1BhZ2VzKCkge1xuICAgICAgICBsZXQgcGFnZXMgPSBfLnNvcnRCeShDb25maWd1cmF0aW9uLnBhZ2VzLCBbJ25hbWUnXSk7XG5cbiAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3MgcGFnZXMnKTtcbiAgICAgICAgUHJvbWlzZS5hbGwocGFnZXMubWFwKHBhZ2UgPT4gdGhpcy5wcm9jZXNzUGFnZShwYWdlKSkpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGNhbGxiYWNrc0FmdGVyR2VuZXJhdGVTZWFyY2hJbmRleEpzb24gPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmFkZGl0aW9uYWxQYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBZGRpdGlvbmFsUGFnZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlciAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NBc3NldHNGb2xkZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1Jlc291cmNlcygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBpZiAoIUNvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICBTZWFyY2hFbmdpbmUuZ2VuZXJhdGVTZWFyY2hJbmRleEpzb24oQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzQWZ0ZXJHZW5lcmF0ZVNlYXJjaEluZGV4SnNvbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3NBZnRlckdlbmVyYXRlU2VhcmNoSW5kZXhKc29uKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5wcm9jZXNzTWVudShDb25maWd1cmF0aW9uLm1haW5EYXRhKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB0cmFuc3BpbGVNZW51V0NUb0VTNShlczZDb2RlKSB7XG4gICAgICAgIHJldHVybiBiYWJlbC50cmFuc2Zvcm1Bc3luYyhlczZDb2RlLCB7XG4gICAgICAgICAgICBjd2Q6IF9fZGlybmFtZSxcbiAgICAgICAgICAgIGZpbGVuYW1lOiAnbWVudS13Y19lczUuanMnLFxuICAgICAgICAgICAgcHJlc2V0czogW1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgJ0BiYWJlbC9wcmVzZXQtZW52JyxcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGllOiAnMTEnXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBdXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcGx1Z2luczogW1xuICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgJ0BiYWJlbC9wbHVnaW4tdHJhbnNmb3JtLXByaXZhdGUtbWV0aG9kcycsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvb3NlOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHByb2Nlc3NNZW51KG1haW5EYXRhKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdQcm9jZXNzIG1lbnUuLi4nKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmVQcm9jZXNzTWVudSwgcmVqZWN0UHJvY2Vzc01lbnUpID0+IHtcbiAgICAgICAgICAgIGxldCBvdXRwdXQgPSBtYWluRGF0YS5vdXRwdXQuc2xpY2UoKTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dExhc3RDaGFyYWN0ZXIgPSBvdXRwdXQubGFzdEluZGV4T2YoJy8nKTtcbiAgICAgICAgICAgIGlmIChvdXRwdXRMYXN0Q2hhcmFjdGVyICE9PSAtMSkge1xuICAgICAgICAgICAgICAgIG91dHB1dCA9IG91dHB1dC5zbGljZSgwLCAtMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBmaW5hbFBhdGhFUzYgPSBgJHtvdXRwdXR9L2pzL21lbnUtd2MuanNgO1xuICAgICAgICAgICAgY29uc3QgZmluYWxQYXRoRVM1ID0gYCR7b3V0cHV0fS9qcy9tZW51LXdjX2VzNS5qc2A7XG5cbiAgICAgICAgICAgIEh0bWxFbmdpbmUucmVuZGVyTWVudShDb25maWd1cmF0aW9uLm1haW5EYXRhLnRlbXBsYXRlcywgbWFpbkRhdGEpXG4gICAgICAgICAgICAgICAgLnRoZW4oaHRtbERhdGEgPT4ge1xuICAgICAgICAgICAgICAgICAgICBGaWxlRW5naW5lLndyaXRlKGZpbmFsUGF0aEVTNiwgaHRtbERhdGEpXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50cmFuc3BpbGVNZW51V0NUb0VTNShodG1sRGF0YSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZXM1RGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRW5naW5lLndyaXRlKGZpbmFsUGF0aEVTNSwgZXM1RGF0YS5jb2RlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb2Nlc3NNZW51KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIGR1cmluZyAnICsgZmluYWxQYXRoRVM1ICsgJyBwYWdlIGdlbmVyYXRpb24nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVqZWN0UHJvY2Vzc01lbnUoJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXJyb3IgZHVyaW5nICcgKyBmaW5hbFBhdGhFUzUgKyAnIHBhZ2UgZ2VuZXJhdGlvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3RQcm9jZXNzTWVudSgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nICcgKyBmaW5hbFBhdGhFUzYgKyAnIHBhZ2UgZ2VuZXJhdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3RQcm9jZXNzTWVudSgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaChlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoJ0Vycm9yIGR1cmluZyAnICsgZmluYWxQYXRoRVM2ICsgJyBwYWdlIGdlbmVyYXRpb24nKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGVycik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZWplY3RQcm9jZXNzTWVudSgnJyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHB1YmxpYyBwcm9jZXNzQWRkaXRpb25hbFBhZ2VzKCkge1xuICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBhZGRpdGlvbmFsIHBhZ2VzJyk7XG4gICAgICAgIGxldCBwYWdlcyA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYWRkaXRpb25hbFBhZ2VzO1xuICAgICAgICBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHBhZ2VzLm1hcChwYWdlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocGFnZS5jaGlsZHJlbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NQYWdlKHBhZ2UpLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4ucGFnZS5jaGlsZHJlbi5tYXAoY2hpbGRQYWdlID0+IHRoaXMucHJvY2Vzc1BhZ2UoY2hpbGRQYWdlKSlcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1BhZ2UocGFnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIFNlYXJjaEVuZ2luZS5nZW5lcmF0ZVNlYXJjaEluZGV4SnNvbihDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlciAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0Fzc2V0c0ZvbGRlcigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc1Jlc291cmNlcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaChlID0+IHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NBc3NldHNGb2xkZXIoKTogdm9pZCB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb3B5IGFzc2V0cyBmb2xkZXInKTtcblxuICAgICAgICBpZiAoIUZpbGVFbmdpbmUuZXhpc3RzU3luYyhDb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlcikpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICBgUHJvdmlkZWQgYXNzZXRzIGZvbGRlciAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyfSBkaWQgbm90IGV4aXN0YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBmaW5hbE91dHB1dCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuXG4gICAgICAgICAgICBsZXQgdGVzdE91dHB1dERpciA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lm1hdGNoKGN3ZCk7XG5cbiAgICAgICAgICAgIGlmICh0ZXN0T3V0cHV0RGlyICYmIHRlc3RPdXRwdXREaXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0ID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQucmVwbGFjZShjd2QgKyBwYXRoLnNlcCwgJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHBhdGguam9pbihcbiAgICAgICAgICAgICAgICBmaW5hbE91dHB1dCxcbiAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGZzLmNvcHkoXG4gICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyKSxcbiAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoZGVzdGluYXRpb24pLFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nIHJlc291cmNlcyBjb3B5ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NSZXNvdXJjZXMoKSB7XG4gICAgICAgIGxvZ2dlci5pbmZvKCdDb3B5IG1haW4gcmVzb3VyY2VzJyk7XG5cbiAgICAgICAgY29uc3Qgb25Db21wbGV0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKFxuICAgICAgICAgICAgICAgICdEb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBpbiAnICtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgK1xuICAgICAgICAgICAgICAgICAgICAnIGluICcgK1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEVsYXBzZWRUaW1lKCkgK1xuICAgICAgICAgICAgICAgICAgICAnIHNlY29uZHMgdXNpbmcgJyArXG4gICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudGhlbWUgK1xuICAgICAgICAgICAgICAgICAgICAnIHRoZW1lJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLnNlcnZlKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIGBTZXJ2aW5nIGRvY3VtZW50YXRpb24gZnJvbSAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0fSBhdCBodHRwOi8vJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmhvc3RuYW1lfToke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEucG9ydH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bldlYlNlcnZlcihDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGdlbmVyYXRpb25Qcm9taXNlUmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmVuZENhbGxiYWNrKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IGZpbmFsT3V0cHV0ID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQ7XG5cbiAgICAgICAgbGV0IHRlc3RPdXRwdXREaXIgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dC5tYXRjaChjd2QpO1xuXG4gICAgICAgIGlmICh0ZXN0T3V0cHV0RGlyICYmIHRlc3RPdXRwdXREaXIubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgZmluYWxPdXRwdXQgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dC5yZXBsYWNlKGN3ZCArIHBhdGguc2VwLCAnJyk7XG4gICAgICAgIH1cblxuICAgICAgICBmcy5jb3B5KFxuICAgICAgICAgICAgcGF0aC5yZXNvbHZlKF9fZGlybmFtZSArICcvLi4vc3JjL3Jlc291cmNlcy8nKSxcbiAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbE91dHB1dCksXG4gICAgICAgICAgICBlcnJvckNvcHkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvckNvcHkpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgcmVzb3VyY2VzIGNvcHkgJywgZXJyb3JDb3B5KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBleHRUaGVtZVByb21pc2UgPSBuZXcgUHJvbWlzZSgoZXh0VGhlbWVSZXNvbHZlLCBleHRUaGVtZVJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXh0VGhlbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcy5jb3B5KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLnJlc29sdmUoY3dkICsgcGF0aC5zZXAgKyBDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4dFRoZW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGZpbmFsT3V0cHV0ICsgJy9zdHlsZXMvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlcnJvckNvcHlUaGVtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29weVRoZW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXJyb3IgZHVyaW5nIGV4dGVybmFsIHN0eWxpbmcgdGhlbWUgY29weSAnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvcHlUaGVtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0VGhlbWVSZWplY3QoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0V4dGVybmFsIHN0eWxpbmcgdGhlbWUgY29weSBzdWNjZWVkZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRUaGVtZVJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRUaGVtZVJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUZhdmljb25Qcm9taXNlID0gbmV3IFByb21pc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAoY3VzdG9tRmF2aWNvblJlc29sdmUsIGN1c3RvbUZhdmljb25SZWplY3QpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21GYXZpY29uICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhgQ3VzdG9tIGZhdmljb24gc3VwcGxpZWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnMuY29weShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjd2QgKyBwYXRoLnNlcCArIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY3VzdG9tRmF2aWNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbE91dHB1dCArICcvaW1hZ2VzL2Zhdmljb24uaWNvJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvcHlGYXZpY29uID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yQ29weUZhdmljb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Vycm9yIGR1cmluZyByZXNvdXJjZXMgY29weSBvZiBmYXZpY29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29weUZhdmljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmF2aWNvblJlamVjdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdFeHRlcm5hbCBjdXN0b20gZmF2aWNvbiBjb3B5IHN1Y2NlZWRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21GYXZpY29uUmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tRmF2aWNvblJlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUxvZ29Qcm9taXNlID0gbmV3IFByb21pc2UoKGN1c3RvbUxvZ29SZXNvbHZlLCBjdXN0b21Mb2dvUmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21Mb2dvICE9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBDdXN0b20gbG9nbyBzdXBwbGllZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZzLmNvcHkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShjd2QgKyBwYXRoLnNlcCArIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY3VzdG9tTG9nbyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsT3V0cHV0ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnL2ltYWdlcy8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUxvZ28uc3BsaXQoJy8nKS5wb3AoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvcHlMb2dvID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLWxpbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvckNvcHlMb2dvKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRXJyb3IgZHVyaW5nIHJlc291cmNlcyBjb3B5IG9mIGxvZ28nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvcHlMb2dvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXN0b21Mb2dvUmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdFeHRlcm5hbCBjdXN0b20gbG9nbyBjb3B5IHN1Y2NlZWRlZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1c3RvbUxvZ29SZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VzdG9tTG9nb1Jlc29sdmUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKFtleHRUaGVtZVByb21pc2UsIGN1c3RvbUZhdmljb25Qcm9taXNlLCBjdXN0b21Mb2dvUHJvbWlzZV0pLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25Db21wbGV0ZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDYWxjdWxhdGVzIHRoZSBlbGFwc2VkIHRpbWUgc2luY2UgdGhlIHByb2dyYW0gd2FzIHN0YXJ0ZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfVxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0RWxhcHNlZFRpbWUoKSB7XG4gICAgICAgIHJldHVybiAobmV3IERhdGUoKS52YWx1ZU9mKCkgLSBzdGFydFRpbWUudmFsdWVPZigpKSAvIDEwMDA7XG4gICAgfVxuXG4gICAgcHVibGljIHByb2Nlc3NHcmFwaHMoKSB7XG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVHcmFwaCkge1xuICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ0dyYXBoIGdlbmVyYXRpb24gZGlzYWJsZWQnKTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc1BhZ2VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsb2dnZXIuaW5mbygnUHJvY2VzcyBtYWluIGdyYXBoJyk7XG4gICAgICAgICAgICBsZXQgbW9kdWxlcyA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEubW9kdWxlcztcbiAgICAgICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgICAgIGxldCBsZW4gPSBtb2R1bGVzLmxlbmd0aDtcbiAgICAgICAgICAgIGxldCBsb29wID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpIDw9IGxlbiAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oJ1Byb2Nlc3MgbW9kdWxlIGdyYXBoICcsIG1vZHVsZXNbaV0ubmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmaW5hbFBhdGggPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0Lmxhc3RJbmRleE9mKCcvJykgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFBhdGggKz0gJy8nO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGZpbmFsUGF0aCArPSAnbW9kdWxlcy8nICsgbW9kdWxlc1tpXS5uYW1lO1xuICAgICAgICAgICAgICAgICAgICBsZXQgX3Jhd01vZHVsZSA9IERlcGVuZGVuY2llc0VuZ2luZS5nZXRSYXdNb2R1bGUobW9kdWxlc1tpXS5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5kZWNsYXJhdGlvbnMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5ib290c3RyYXAubGVuZ3RoID4gMCB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgX3Jhd01vZHVsZS5pbXBvcnRzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIF9yYXdNb2R1bGUuZXhwb3J0cy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBfcmF3TW9kdWxlLnByb3ZpZGVycy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgTmdkRW5naW5lLnJlbmRlckdyYXBoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbaV0uZmlsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbFBhdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2YnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZXNbaV0ubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmdkRW5naW5lLnJlYWRHcmFwaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgucmVzb2x2ZShmaW5hbFBhdGggKyBwYXRoLnNlcCArICdkZXBlbmRlbmNpZXMuc3ZnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzW2ldLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS50aGVuKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlc1tpXS5ncmFwaCA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignRXJyb3IgZHVyaW5nIGdyYXBoIHJlYWQ6ICcsIGVycik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvck1lc3NhZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoZXJyb3JNZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wcm9jZXNzUGFnZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgbGV0IGZpbmFsTWFpbkdyYXBoUGF0aCA9IENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0O1xuICAgICAgICAgICAgaWYgKGZpbmFsTWFpbkdyYXBoUGF0aC5sYXN0SW5kZXhPZignLycpID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGZpbmFsTWFpbkdyYXBoUGF0aCArPSAnLyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmaW5hbE1haW5HcmFwaFBhdGggKz0gJ2dyYXBoJztcbiAgICAgICAgICAgIE5nZEVuZ2luZS5pbml0KHBhdGgucmVzb2x2ZShmaW5hbE1haW5HcmFwaFBhdGgpKTtcblxuICAgICAgICAgICAgTmdkRW5naW5lLnJlbmRlckdyYXBoKFxuICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcsXG4gICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGZpbmFsTWFpbkdyYXBoUGF0aCksXG4gICAgICAgICAgICAgICAgJ3AnXG4gICAgICAgICAgICApLnRoZW4oXG4gICAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBOZ2RFbmdpbmUucmVhZEdyYXBoKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5yZXNvbHZlKGZpbmFsTWFpbkdyYXBoUGF0aCArIHBhdGguc2VwICsgJ2RlcGVuZGVuY2llcy5zdmcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdNYWluIGdyYXBoJ1xuICAgICAgICAgICAgICAgICAgICApLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1haW5HcmFwaCA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdFcnJvciBkdXJpbmcgbWFpbiBncmFwaCByZWFkaW5nIDogJywgZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVNYWluR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvb3AoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVyciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgICAgICAgICAgICAgICAgICdPb29wcyBlcnJvciBkdXJpbmcgbWFpbiBncmFwaCBnZW5lcmF0aW9uLCBtb3Zpbmcgb24gbmV4dCBwYXJ0IHdpdGggbWFpbiBncmFwaCBkaXNhYmxlZCA6ICcsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTWFpbkdyYXBoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgbG9vcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdWJsaWMgcnVuV2ViU2VydmVyKGZvbGRlcikge1xuICAgICAgICBpZiAoIXRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgbGV0IGxpdmVTZXJ2ZXJDb25maWd1cmF0aW9uOiBMaXZlU2VydmVyQ29uZmlndXJhdGlvbiA9IHtcbiAgICAgICAgICAgICAgICByb290OiBmb2xkZXIsXG4gICAgICAgICAgICAgICAgb3BlbjogQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vcGVuLFxuICAgICAgICAgICAgICAgIHF1aWV0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGxvZ0xldmVsOiAwLFxuICAgICAgICAgICAgICAgIHdhaXQ6IDEwMDAsXG4gICAgICAgICAgICAgICAgcG9ydDogQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wb3J0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaG9zdCAhPT0gJycpIHtcbiAgICAgICAgICAgICAgICBsaXZlU2VydmVyQ29uZmlndXJhdGlvbi5ob3N0ID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTGl2ZVNlcnZlci5zdGFydChsaXZlU2VydmVyQ29uZmlndXJhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEud2F0Y2ggJiYgIXRoaXMuaXNXYXRjaGluZykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmZpbGVzID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcignTm8gc291cmNlcyBmaWxlcyBhdmFpbGFibGUsIHBsZWFzZSB1c2UgLXAgZmxhZycpO1xuICAgICAgICAgICAgICAgIGdlbmVyYXRpb25Qcm9taXNlUmVqZWN0KCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bldhdGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoQ29uZmlndXJhdGlvbi5tYWluRGF0YS53YXRjaCAmJiB0aGlzLmlzV2F0Y2hpbmcpIHtcbiAgICAgICAgICAgIGxldCBzcmNGb2xkZXIgPSBmaW5kTWFpblNvdXJjZUZvbGRlcih0aGlzLmZpbGVzKTtcbiAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBBbHJlYWR5IHdhdGNoaW5nIHNvdXJjZXMgaW4gJHtzcmNGb2xkZXJ9IGZvbGRlcmApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIHJ1bldhdGNoKCkge1xuICAgICAgICBsZXQgc291cmNlcyA9IFtmaW5kTWFpblNvdXJjZUZvbGRlcih0aGlzLmZpbGVzKV07XG4gICAgICAgIGxldCB3YXRjaGVyUmVhZHkgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLmlzV2F0Y2hpbmcgPSB0cnVlO1xuXG4gICAgICAgIGxvZ2dlci5pbmZvKGBXYXRjaGluZyBzb3VyY2VzIGluICR7ZmluZE1haW5Tb3VyY2VGb2xkZXIodGhpcy5maWxlcyl9IGZvbGRlcmApO1xuXG4gICAgICAgIGlmIChNYXJrZG93bkVuZ2luZS5oYXNSb290TWFya2Rvd25zKCkpIHtcbiAgICAgICAgICAgIHNvdXJjZXMgPSBzb3VyY2VzLmNvbmNhdChNYXJrZG93bkVuZ2luZS5saXN0Um9vdE1hcmtkb3ducygpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzICE9PSAnJykge1xuICAgICAgICAgICAgc291cmNlcyA9IHNvdXJjZXMuY29uY2F0KENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5jbHVkZXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ2hlY2sgYWxsIGVsZW1lbnRzIG9mIHNvdXJjZXMgbGlzdCBleGlzdFxuICAgICAgICBzb3VyY2VzID0gY2xlYW5Tb3VyY2VzRm9yV2F0Y2goc291cmNlcyk7XG5cbiAgICAgICAgbGV0IHdhdGNoZXIgPSBjaG9raWRhci53YXRjaChzb3VyY2VzLCB7XG4gICAgICAgICAgICBhd2FpdFdyaXRlRmluaXNoOiB0cnVlLFxuICAgICAgICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICAgICAgICAgIGlnbm9yZWQ6IC8oc3BlY3xcXC5kKVxcLnRzL1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHRpbWVyQWRkQW5kUmVtb3ZlUmVmO1xuICAgICAgICBsZXQgdGltZXJDaGFuZ2VSZWY7XG4gICAgICAgIGxldCBydW5uZXJBZGRBbmRSZW1vdmUgPSAoKSA9PiB7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZSgpO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgd2FpdGVyQWRkQW5kUmVtb3ZlID0gKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyQWRkQW5kUmVtb3ZlUmVmKTtcbiAgICAgICAgICAgIHRpbWVyQWRkQW5kUmVtb3ZlUmVmID0gc2V0VGltZW91dChydW5uZXJBZGRBbmRSZW1vdmUsIDEwMDApO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcnVubmVyQ2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgc3RhcnRUaW1lID0gbmV3IERhdGUoKTtcbiAgICAgICAgICAgIHRoaXMuc2V0VXBkYXRlZEZpbGVzKHRoaXMud2F0Y2hDaGFuZ2VkRmlsZXMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzV2F0Y2hlZEZpbGVzVFNGaWxlcygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5nZXRNaWNyb0RlcGVuZGVuY2llc0RhdGEoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5oYXNXYXRjaGVkRmlsZXNSb290TWFya2Rvd25GaWxlcygpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWJ1aWxkUm9vdE1hcmtkb3ducygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlYnVpbGRFeHRlcm5hbERvY3VtZW50YXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHdhaXRlckNoYW5nZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lckNoYW5nZVJlZik7XG4gICAgICAgICAgICB0aW1lckNoYW5nZVJlZiA9IHNldFRpbWVvdXQocnVubmVyQ2hhbmdlLCAxMDAwKTtcbiAgICAgICAgfTtcblxuICAgICAgICB3YXRjaGVyLm9uKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgICAgIGlmICghd2F0Y2hlclJlYWR5KSB7XG4gICAgICAgICAgICAgICAgd2F0Y2hlclJlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB3YXRjaGVyXG4gICAgICAgICAgICAgICAgICAgIC5vbignYWRkJywgZmlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoYEZpbGUgJHtmaWxlfSBoYXMgYmVlbiBhZGRlZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBleHRlbnNpb24sIGlmIHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNjYW4gZXZlcnl0aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0ZXJBZGRBbmRSZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLm9uKCdjaGFuZ2UnLCBmaWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZyhgRmlsZSAke2ZpbGV9IGhhcyBiZWVuIGNoYW5nZWRgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRlc3QgZXh0ZW5zaW9uLCBpZiB0c1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzY2FuIG9ubHkgZmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmV4dG5hbWUoZmlsZSkgPT09ICcubWQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5leHRuYW1lKGZpbGUpID09PSAnLmpzb24nXG4gICAgICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLndhdGNoQ2hhbmdlZEZpbGVzLnB1c2gocGF0aC5qb2luKGN3ZCArIHBhdGguc2VwICsgZmlsZSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRlckNoYW5nZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAub24oJ3VubGluaycsIGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKGBGaWxlICR7ZmlsZX0gaGFzIGJlZW4gcmVtb3ZlZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGVzdCBleHRlbnNpb24sIGlmIHRzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZXNjYW4gZXZlcnl0aGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YWl0ZXJBZGRBbmRSZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFJldHVybiB0aGUgYXBwbGljYXRpb24gLyByb290IGNvbXBvbmVudCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBnZXQgYXBwbGljYXRpb24oKTogQXBwbGljYXRpb24ge1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBnZXQgaXNDTEkoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG59XG4iLCJpbXBvcnQgKiBhcyBmcyBmcm9tICdmcy1leHRyYSc7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyB0cyB9IGZyb20gJ3RzLW1vcnBoJztcblxuaW1wb3J0IHsgQXBwbGljYXRpb24gfSBmcm9tICcuL2FwcC9hcHBsaWNhdGlvbic7XG5pbXBvcnQgQ29uZmlndXJhdGlvbiBmcm9tICcuL2FwcC9jb25maWd1cmF0aW9uJztcbmltcG9ydCBGaWxlRW5naW5lIGZyb20gJy4vYXBwL2VuZ2luZXMvZmlsZS5lbmdpbmUnO1xuaW1wb3J0IEkxOG5FbmdpbmUgZnJvbSAnLi9hcHAvZW5naW5lcy9pMThuLmVuZ2luZSc7XG5cbmltcG9ydCB7IENvbmZpZ3VyYXRpb25GaWxlSW50ZXJmYWNlIH0gZnJvbSAnLi9hcHAvaW50ZXJmYWNlcy9jb25maWd1cmF0aW9uLWZpbGUuaW50ZXJmYWNlJztcbmltcG9ydCBBbmd1bGFyVmVyc2lvblV0aWwgZnJvbSAnLi91dGlscy9hbmd1bGFyLXZlcnNpb24udXRpbCc7XG5pbXBvcnQgeyBDT01QT0RPQ19ERUZBVUxUUyB9IGZyb20gJy4vdXRpbHMvZGVmYXVsdHMnO1xuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSAnLi91dGlscy9sb2dnZXInO1xuXG5pbXBvcnQgeyByZWFkQ29uZmlnLCBFWENMVURFX1BBVFRFUk5TLCBJTkNMVURFX1BBVFRFUk5TIH0gZnJvbSAnLi91dGlscy91dGlscyc7XG5cbmltcG9ydCB7IGNvc21pY29uZmlnU3luYyB9IGZyb20gJ2Nvc21pY29uZmlnJztcblxuY29uc3QgZmcgPSByZXF1aXJlKCdmYXN0LWdsb2InKTtcbmNvbnN0IG9zID0gcmVxdWlyZSgnb3MnKTtcbmNvbnN0IG9zTmFtZSA9IHJlcXVpcmUoJ29zLW5hbWUnKTtcbmNvbnN0IHBrZyA9IHJlcXVpcmUoJy4uL3BhY2thZ2UuanNvbicpO1xuY29uc3QgeyBwcm9ncmFtIH0gPSByZXF1aXJlKCdjb21tYW5kZXInKTtcblxuY29uc3QgY29zbWljb25maWdNb2R1bGVOYW1lID0gJ2NvbXBvZG9jJztcblxubGV0IHNjYW5uZWRGaWxlcyA9IFtdO1xubGV0IGV4Y2x1ZGVGaWxlcyA9IEVYQ0xVREVfUEFUVEVSTlM7XG5sZXQgaW5jbHVkZUZpbGVzID0gW107XG5sZXQgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxucHJvY2Vzcy5zZXRNYXhMaXN0ZW5lcnMoMCk7XG5cbmV4cG9ydCBjbGFzcyBDbGlBcHBsaWNhdGlvbiBleHRlbmRzIEFwcGxpY2F0aW9uIHtcbiAgICAvKipcbiAgICAgKiBSdW4gY29tcG9kb2MgZnJvbSB0aGUgY29tbWFuZCBsaW5lLlxuICAgICAqL1xuICAgIHByb3RlY3RlZCBzdGFydCgpOiBhbnkge1xuICAgICAgICBmdW5jdGlvbiBsaXN0KHZhbCkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5zcGxpdCgnLCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbVxuICAgICAgICAgICAgLnZlcnNpb24ocGtnLnZlcnNpb24pXG4gICAgICAgICAgICAudXNhZ2UoJzxzcmM+IFtvcHRpb25zXScpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctYywgLS1jb25maWcgW2NvbmZpZ10nLFxuICAgICAgICAgICAgICAgICdBIGNvbmZpZ3VyYXRpb24gZmlsZSA6IC5jb21wb2RvY3JjLCAuY29tcG9kb2NyYy5qc29uLCAuY29tcG9kb2NyYy55YW1sIG9yIGNvbXBvZG9jIHByb3BlcnR5IGluIHBhY2thZ2UuanNvbidcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy1wLCAtLXRzY29uZmlnIFtjb25maWddJywgJ0EgdHNjb25maWcuanNvbiBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy1kLCAtLW91dHB1dCBbZm9sZGVyXScsXG4gICAgICAgICAgICAgICAgJ1doZXJlIHRvIHN0b3JlIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMuZm9sZGVyXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCcteSwgLS1leHRUaGVtZSBbZmlsZV0nLCAnRXh0ZXJuYWwgc3R5bGluZyB0aGVtZSBmaWxlJylcbiAgICAgICAgICAgIC5vcHRpb24oJy1uLCAtLW5hbWUgW25hbWVdJywgJ1RpdGxlIGRvY3VtZW50YXRpb24nLCBDT01QT0RPQ19ERUZBVUxUUy50aXRsZSlcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy1hLCAtLWFzc2V0c0ZvbGRlciBbZm9sZGVyXScsXG4gICAgICAgICAgICAgICAgJ0V4dGVybmFsIGFzc2V0cyBmb2xkZXIgdG8gY29weSBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBmb2xkZXInXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctbywgLS1vcGVuIFt2YWx1ZV0nLCAnT3BlbiB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24nKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLXQsIC0tc2lsZW50JyxcbiAgICAgICAgICAgICAgICBcIkluIHNpbGVudCBtb2RlLCBsb2cgbWVzc2FnZXMgYXJlbid0IGxvZ2dlZCBpbiB0aGUgY29uc29sZVwiLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctcywgLS1zZXJ2ZScsXG4gICAgICAgICAgICAgICAgJ1NlcnZlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIChkZWZhdWx0IGh0dHA6Ly9sb2NhbGhvc3Q6ODA4MC8pJyxcbiAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLS1ob3N0IFtob3N0XScsICdDaGFuZ2UgZGVmYXVsdCBob3N0IGFkZHJlc3MnKVxuICAgICAgICAgICAgLm9wdGlvbignLXIsIC0tcG9ydCBbcG9ydF0nLCAnQ2hhbmdlIGRlZmF1bHQgc2VydmluZyBwb3J0JywgQ09NUE9ET0NfREVGQVVMVFMucG9ydClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy13LCAtLXdhdGNoJyxcbiAgICAgICAgICAgICAgICAnV2F0Y2ggc291cmNlIGZpbGVzIGFmdGVyIHNlcnZlIGFuZCBmb3JjZSBkb2N1bWVudGF0aW9uIHJlYnVpbGQnLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctZSwgLS1leHBvcnRGb3JtYXQgW2Zvcm1hdF0nLFxuICAgICAgICAgICAgICAgICdFeHBvcnQgaW4gc3BlY2lmaWVkIGZvcm1hdCAoanNvbiwgaHRtbCknLFxuICAgICAgICAgICAgICAgIENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbignLS1maWxlcyBbZmlsZXNdJywgJ0ZpbGVzIHByb3ZpZGVkIGJ5IGV4dGVybmFsIHRvb2wsIHVzZWQgZm9yIGNvdmVyYWdlIHRlc3QnKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1sYW5ndWFnZSBbbGFuZ3VhZ2VdJyxcbiAgICAgICAgICAgICAgICAnTGFuZ3VhZ2UgdXNlZCBmb3IgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIChiZy1CRywgZGUtREUsIGVuLVVTLCBlcy1FUywgZnItRlIsIGh1LUhVLCBpdC1JVCwgamEtSlAsIGthLUdFLCBrby1LUiwgbmwtTkwsIHBsLVBMLCBwdC1CUiwgcnUtUlUsIHNrLVNLLCB6aC1DTiwgemgtVFcpJyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5sYW5ndWFnZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS10aGVtZSBbdGhlbWVdJyxcbiAgICAgICAgICAgICAgICBcIkNob29zZSBvbmUgb2YgYXZhaWxhYmxlIHRoZW1lcywgZGVmYXVsdCBpcyAnZ2l0Ym9vaycgKGxhcmF2ZWwsIG9yaWdpbmFsLCBtYXRlcmlhbCwgcG9zdG1hcmssIHJlYWR0aGVkb2NzLCBzdHJpcGUsIHZhZ3JhbnQpXCJcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0taGlkZUdlbmVyYXRvcicsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBwcmludCB0aGUgQ29tcG9kb2MgbGluayBhdCB0aGUgYm90dG9tIG9mIHRoZSBwYWdlJyxcbiAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1oaWRlRGFya01vZGVUb2dnbGUnLFxuICAgICAgICAgICAgICAgICdEbyBub3Qgc2hvdyBkYXJrIG1vZGUgdG9nZ2xlIGJ1dHRvbiBhdCB0aGUgdG9wIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBwYWdlJyxcbiAgICAgICAgICAgICAgICBmYWxzZVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS10b2dnbGVNZW51SXRlbXMgPGl0ZW1zPicsXG4gICAgICAgICAgICAgICAgXCJDbG9zZSBieSBkZWZhdWx0IGl0ZW1zIGluIHRoZSBtZW51IHZhbHVlcyA6IFsnYWxsJ10gb3Igb25lIG9mIHRoZXNlIFsnbW9kdWxlcycsJ2NvbXBvbmVudHMnLCdkaXJlY3RpdmVzJywnY29udHJvbGxlcnMnLCdlbnRpdGllcycsJ2NsYXNzZXMnLCdpbmplY3RhYmxlcycsJ2d1YXJkcycsJ2ludGVyZmFjZXMnLCdpbnRlcmNlcHRvcnMnLCdwaXBlcycsJ21pc2NlbGxhbmVvdXMnLCdhZGRpdGlvbmFsUGFnZXMnXVwiLFxuICAgICAgICAgICAgICAgIGxpc3QsXG4gICAgICAgICAgICAgICAgQ09NUE9ET0NfREVGQVVMVFMudG9nZ2xlTWVudUl0ZW1zXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLW5hdlRhYkNvbmZpZyA8dGFiIGNvbmZpZ3M+JyxcbiAgICAgICAgICAgICAgICBgTGlzdCBuYXZpZ2F0aW9uIHRhYiBvYmplY3RzIGluIHRoZSBkZXNpcmVkIG9yZGVyIHdpdGggdHdvIHN0cmluZyBwcm9wZXJ0aWVzIChcImlkXCIgYW5kIFwibGFiZWxcIikuIFxcXG5Eb3VibGUtcXVvdGVzIG11c3QgYmUgZXNjYXBlZCB3aXRoICdcXFxcJy4gXFxcbkF2YWlsYWJsZSB0YWIgSURzIGFyZSBcImluZm9cIiwgXCJyZWFkbWVcIiwgXCJzb3VyY2VcIiwgXCJ0ZW1wbGF0ZURhdGFcIiwgXCJzdHlsZURhdGFcIiwgXCJ0cmVlXCIsIGFuZCBcImV4YW1wbGVcIi4gXFxcbk5vdGU6IENlcnRhaW4gdGFicyB3aWxsIG9ubHkgYmUgc2hvd24gaWYgYXBwbGljYWJsZSB0byBhIGdpdmVuIGRlcGVuZGVuY3lgLFxuICAgICAgICAgICAgICAgIGxpc3QsXG4gICAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoQ09NUE9ET0NfREVGQVVMVFMubmF2VGFiQ29uZmlnKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS10ZW1wbGF0ZXMgW2ZvbGRlcl0nLFxuICAgICAgICAgICAgICAgICdQYXRoIHRvIGRpcmVjdG9yeSBvZiBIYW5kbGViYXJzIHRlbXBsYXRlcyB0byBvdmVycmlkZSBidWlsdC1pbiB0ZW1wbGF0ZXMnXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctLWluY2x1ZGVzIFtwYXRoXScsICdQYXRoIG9mIGV4dGVybmFsIG1hcmtkb3duIGZpbGVzIHRvIGluY2x1ZGUnKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1pbmNsdWRlc05hbWUgW25hbWVdJyxcbiAgICAgICAgICAgICAgICAnTmFtZSBvZiBpdGVtIG1lbnUgb2YgZXh0ZXJuYWxzIG1hcmtkb3duIGZpbGVzJyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5hZGRpdGlvbmFsRW50cnlOYW1lXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWNvdmVyYWdlVGVzdCBbdGhyZXNob2xkXScsXG4gICAgICAgICAgICAgICAgJ1Rlc3QgY29tbWFuZCBvZiBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHdpdGggYSB0aHJlc2hvbGQgKGRlZmF1bHQgNzApJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1jb3ZlcmFnZU1pbmltdW1QZXJGaWxlIFttaW5pbXVtXScsXG4gICAgICAgICAgICAgICAgJ1Rlc3QgY29tbWFuZCBvZiBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIHBlciBmaWxlIHdpdGggYSBtaW5pbXVtIChkZWZhdWx0IDApJ1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsIFt0cnVlfGZhbHNlXScsXG4gICAgICAgICAgICAgICAgJ1Rlc3QgY29tbWFuZCBvZiBkb2N1bWVudGF0aW9uIGNvdmVyYWdlIChnbG9iYWwgb3IgcGVyIGZpbGUpIHdpbGwgZmFpbCB3aXRoIGVycm9yIG9yIGp1c3Qgd2FybiB1c2VyICh0cnVlOiBlcnJvciwgZmFsc2U6IHdhcm4pJyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctLWNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkJywgJ0Rpc3BsYXkgb25seSBmYWlsZWQgZmlsZXMgZm9yIGEgY292ZXJhZ2UgdGVzdCcpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLXVuaXRUZXN0Q292ZXJhZ2UgW2pzb24tc3VtbWFyeV0nLFxuICAgICAgICAgICAgICAgICdUbyBpbmNsdWRlIHVuaXQgdGVzdCBjb3ZlcmFnZSwgc3BlY2lmeSBpc3RhbmJ1bCBKU09OIGNvdmVyYWdlIHN1bW1hcnkgZmlsZSdcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tZGlzYWJsZVNvdXJjZUNvZGUnLFxuICAgICAgICAgICAgICAgICdEbyBub3QgYWRkIHNvdXJjZSBjb2RlIHRhYiBhbmQgbGlua3MgdG8gc291cmNlIGNvZGUnLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVEb21UcmVlJywgJ0RvIG5vdCBhZGQgZG9tIHRyZWUgdGFiJywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVUZW1wbGF0ZVRhYicsICdEbyBub3QgYWRkIHRlbXBsYXRlIHRhYicsIGZhbHNlKVxuICAgICAgICAgICAgLm9wdGlvbignLS1kaXNhYmxlU3R5bGVUYWInLCAnRG8gbm90IGFkZCBzdHlsZSB0YWInLCBmYWxzZSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZUdyYXBoJywgJ0RvIG5vdCBhZGQgdGhlIGRlcGVuZGVuY3kgZ3JhcGgnLCBmYWxzZSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZUNvdmVyYWdlJywgJ0RvIG5vdCBhZGQgdGhlIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgcmVwb3J0JywgZmFsc2UpXG4gICAgICAgICAgICAub3B0aW9uKCctLWRpc2FibGVQcml2YXRlJywgJ0RvIG5vdCBzaG93IHByaXZhdGUgaW4gZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24nLCBmYWxzZSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZVByb3RlY3RlZCcsICdEbyBub3Qgc2hvdyBwcm90ZWN0ZWQgaW4gZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24nLCBmYWxzZSlcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZUludGVybmFsJywgJ0RvIG5vdCBzaG93IEBpbnRlcm5hbCBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsIGZhbHNlKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1kaXNhYmxlTGlmZUN5Y2xlSG9va3MnLFxuICAgICAgICAgICAgICAgICdEbyBub3Qgc2hvdyBBbmd1bGFyIGxpZmVjeWNsZSBob29rcyBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tZGlzYWJsZUNvbnN0cnVjdG9ycycsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBzaG93IGNvbnN0cnVjdG9ycyBpbiBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tZGlzYWJsZVJvdXRlc0dyYXBoJyxcbiAgICAgICAgICAgICAgICAnRG8gbm90IGFkZCB0aGUgcm91dGVzIGdyYXBoJyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlUm91dGVzR3JhcGhcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vcHRpb24oJy0tZGlzYWJsZVNlYXJjaCcsICdEbyBub3QgYWRkIHRoZSBzZWFyY2ggaW5wdXQnLCBmYWxzZSlcbiAgICAgICAgICAgIC5vcHRpb24oXG4gICAgICAgICAgICAgICAgJy0tZGlzYWJsZURlcGVuZGVuY2llcycsXG4gICAgICAgICAgICAgICAgJ0RvIG5vdCBhZGQgdGhlIGRlcGVuZGVuY2llcyBsaXN0JyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlRGVwZW5kZW5jaWVzXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLWRpc2FibGVQcm9wZXJ0aWVzJyxcbiAgICAgICAgICAgICAgICAnRG8gbm90IGFkZCB0aGUgcHJvcGVydGllcyBsaXN0JyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5kaXNhYmxlUHJvcGVydGllc1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9wdGlvbihcbiAgICAgICAgICAgICAgICAnLS1taW5pbWFsJyxcbiAgICAgICAgICAgICAgICAnTWluaW1hbCBtb2RlIHdpdGggb25seSBkb2N1bWVudGF0aW9uLiBObyBzZWFyY2gsIG5vIGdyYXBoLCBubyBjb3ZlcmFnZS4nLFxuICAgICAgICAgICAgICAgIGZhbHNlXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub3B0aW9uKCctLWN1c3RvbUZhdmljb24gW3BhdGhdJywgJ1VzZSBhIGN1c3RvbSBmYXZpY29uJylcbiAgICAgICAgICAgIC5vcHRpb24oJy0tY3VzdG9tTG9nbyBbcGF0aF0nLCAnVXNlIGEgY3VzdG9tIGxvZ28nKVxuICAgICAgICAgICAgLm9wdGlvbignLS1nYUlEIFtpZF0nLCAnR29vZ2xlIEFuYWx5dGljcyB0cmFja2luZyBJRCcpXG4gICAgICAgICAgICAub3B0aW9uKCctLWdhU2l0ZSBbc2l0ZV0nLCAnR29vZ2xlIEFuYWx5dGljcyBzaXRlIG5hbWUnLCBDT01QT0RPQ19ERUZBVUxUUy5nYVNpdGUpXG4gICAgICAgICAgICAub3B0aW9uKFxuICAgICAgICAgICAgICAgICctLW1heFNlYXJjaFJlc3VsdHMgW21heFNlYXJjaFJlc3VsdHNdJyxcbiAgICAgICAgICAgICAgICAnTWF4IHNlYXJjaCByZXN1bHRzIG9uIHRoZSByZXN1bHRzIHBhZ2UuIFRvIHNob3cgYWxsIHJlc3VsdHMsIHNldCB0byAwJyxcbiAgICAgICAgICAgICAgICBDT01QT0RPQ19ERUZBVUxUUy5tYXhTZWFyY2hSZXN1bHRzXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAucGFyc2UocHJvY2Vzcy5hcmd2KTtcblxuICAgICAgICBsZXQgb3V0cHV0SGVscCA9ICgpID0+IHtcbiAgICAgICAgICAgIHByb2dyYW0ub3V0cHV0SGVscCgpO1xuICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGNvbmZpZ0V4cGxvcmVyID0gY29zbWljb25maWdTeW5jKGNvc21pY29uZmlnTW9kdWxlTmFtZSk7XG5cbiAgICAgICAgbGV0IGNvbmZpZ0V4cGxvcmVyUmVzdWx0O1xuXG4gICAgICAgIGxldCBjb25maWdGaWxlOiBDb25maWd1cmF0aW9uRmlsZUludGVyZmFjZSA9IHt9O1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW1PcHRpb25zID0gcHJvZ3JhbS5vcHRzKCk7XG5cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvbmZpZykge1xuICAgICAgICAgICAgbGV0IGNvbmZpZ0ZpbGVQYXRoID0gcHJvZ3JhbU9wdGlvbnMuY29uZmlnO1xuICAgICAgICAgICAgbGV0IHRlc3RDb25maWdGaWxlUGF0aCA9IGNvbmZpZ0ZpbGVQYXRoLm1hdGNoKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgaWYgKHRlc3RDb25maWdGaWxlUGF0aCAmJiB0ZXN0Q29uZmlnRmlsZVBhdGgubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGVQYXRoID0gY29uZmlnRmlsZVBhdGgucmVwbGFjZShwcm9jZXNzLmN3ZCgpICsgcGF0aC5zZXAsICcnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbmZpZ0V4cGxvcmVyUmVzdWx0ID0gY29uZmlnRXhwbG9yZXIubG9hZChwYXRoLnJlc29sdmUoY29uZmlnRmlsZVBhdGgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbmZpZ0V4cGxvcmVyUmVzdWx0ID0gY29uZmlnRXhwbG9yZXIuc2VhcmNoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRXhwbG9yZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnRXhwbG9yZXJSZXN1bHQuY29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGNvbmZpZ0ZpbGUgPSBjb25maWdFeHBsb3JlclJlc3VsdC5jb25maWc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5vdXRwdXQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0ID0gY29uZmlnRmlsZS5vdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLm91dHB1dCAmJiBwcm9ncmFtT3B0aW9ucy5vdXRwdXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmZvbGRlcikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQgPSBwcm9ncmFtT3B0aW9ucy5vdXRwdXQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5leHRUaGVtZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5leHRUaGVtZSA9IGNvbmZpZ0ZpbGUuZXh0VGhlbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmV4dFRoZW1lKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmV4dFRoZW1lID0gcHJvZ3JhbU9wdGlvbnMuZXh0VGhlbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5sYW5ndWFnZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5sYW5ndWFnZSA9IGNvbmZpZ0ZpbGUubGFuZ3VhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmxhbmd1YWdlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmxhbmd1YWdlID0gcHJvZ3JhbU9wdGlvbnMubGFuZ3VhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS50aGVtZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS50aGVtZSA9IGNvbmZpZ0ZpbGUudGhlbWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLnRoZW1lKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRoZW1lID0gcHJvZ3JhbU9wdGlvbnMudGhlbWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5uYW1lKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRvY3VtZW50YXRpb25NYWluTmFtZSA9IGNvbmZpZ0ZpbGUubmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMubmFtZSAmJiBwcm9ncmFtT3B0aW9ucy5uYW1lICE9PSBDT01QT0RPQ19ERUZBVUxUUy50aXRsZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kb2N1bWVudGF0aW9uTWFpbk5hbWUgPSBwcm9ncmFtT3B0aW9ucy5uYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuYXNzZXRzRm9sZGVyKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmFzc2V0c0ZvbGRlciA9IGNvbmZpZ0ZpbGUuYXNzZXRzRm9sZGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5hc3NldHNGb2xkZXIpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuYXNzZXRzRm9sZGVyID0gcHJvZ3JhbU9wdGlvbnMuYXNzZXRzRm9sZGVyO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUub3Blbikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vcGVuID0gY29uZmlnRmlsZS5vcGVuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5vcGVuKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm9wZW4gPSBwcm9ncmFtT3B0aW9ucy5vcGVuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUudG9nZ2xlTWVudUl0ZW1zKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRvZ2dsZU1lbnVJdGVtcyA9IGNvbmZpZ0ZpbGUudG9nZ2xlTWVudUl0ZW1zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHByb2dyYW1PcHRpb25zLnRvZ2dsZU1lbnVJdGVtcyAmJlxuICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMudG9nZ2xlTWVudUl0ZW1zICE9PSBDT01QT0RPQ19ERUZBVUxUUy50b2dnbGVNZW51SXRlbXNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRvZ2dsZU1lbnVJdGVtcyA9IHByb2dyYW1PcHRpb25zLnRvZ2dsZU1lbnVJdGVtcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLnRlbXBsYXRlcykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS50ZW1wbGF0ZXMgPSBjb25maWdGaWxlLnRlbXBsYXRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMudGVtcGxhdGVzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRlbXBsYXRlcyA9IHByb2dyYW1PcHRpb25zLnRlbXBsYXRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLm5hdlRhYkNvbmZpZykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5uYXZUYWJDb25maWcgPSBjb25maWdGaWxlLm5hdlRhYkNvbmZpZztcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9ncmFtT3B0aW9ucy5uYXZUYWJDb25maWcgJiZcbiAgICAgICAgICAgIEpTT04ucGFyc2UocHJvZ3JhbU9wdGlvbnMubmF2VGFiQ29uZmlnKS5sZW5ndGggIT09IENPTVBPRE9DX0RFRkFVTFRTLm5hdlRhYkNvbmZpZy5sZW5ndGhcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm5hdlRhYkNvbmZpZyA9IEpTT04ucGFyc2UocHJvZ3JhbU9wdGlvbnMubmF2VGFiQ29uZmlnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmluY2x1ZGVzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmluY2x1ZGVzID0gY29uZmlnRmlsZS5pbmNsdWRlcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuaW5jbHVkZXMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5jbHVkZXMgPSBwcm9ncmFtT3B0aW9ucy5pbmNsdWRlcztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmluY2x1ZGVzTmFtZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5pbmNsdWRlc05hbWUgPSBjb25maWdGaWxlLmluY2x1ZGVzTmFtZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBwcm9ncmFtT3B0aW9ucy5pbmNsdWRlc05hbWUgJiZcbiAgICAgICAgICAgIHByb2dyYW1PcHRpb25zLmluY2x1ZGVzTmFtZSAhPT0gQ09NUE9ET0NfREVGQVVMVFMuYWRkaXRpb25hbEVudHJ5TmFtZVxuICAgICAgICApIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaW5jbHVkZXNOYW1lID0gcHJvZ3JhbU9wdGlvbnMuaW5jbHVkZXNOYW1lO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuc2lsZW50KSB7XG4gICAgICAgICAgICBsb2dnZXIuc2lsZW50ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLnNpbGVudCkge1xuICAgICAgICAgICAgbG9nZ2VyLnNpbGVudCA9IGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuc2VydmUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuc2VydmUgPSBjb25maWdGaWxlLnNlcnZlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5zZXJ2ZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5zZXJ2ZSA9IHByb2dyYW1PcHRpb25zLnNlcnZlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuaG9zdCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0ID0gY29uZmlnRmlsZS5ob3N0O1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0bmFtZSA9IGNvbmZpZ0ZpbGUuaG9zdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMuaG9zdCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5ob3N0ID0gcHJvZ3JhbU9wdGlvbnMuaG9zdDtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaG9zdG5hbWUgPSBwcm9ncmFtT3B0aW9ucy5ob3N0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUucG9ydCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5wb3J0ID0gY29uZmlnRmlsZS5wb3J0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5wb3J0ICYmIHByb2dyYW1PcHRpb25zLnBvcnQgIT09IENPTVBPRE9DX0RFRkFVTFRTLnBvcnQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEucG9ydCA9IHByb2dyYW1PcHRpb25zLnBvcnQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS53YXRjaCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS53YXRjaCA9IGNvbmZpZ0ZpbGUud2F0Y2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLndhdGNoKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLndhdGNoID0gcHJvZ3JhbU9wdGlvbnMud2F0Y2g7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5leHBvcnRGb3JtYXQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID0gY29uZmlnRmlsZS5leHBvcnRGb3JtYXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMuZXhwb3J0Rm9ybWF0ICYmXG4gICAgICAgICAgICBwcm9ncmFtT3B0aW9ucy5leHBvcnRGb3JtYXQgIT09IENPTVBPRE9DX0RFRkFVTFRTLmV4cG9ydEZvcm1hdFxuICAgICAgICApIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZXhwb3J0Rm9ybWF0ID0gcHJvZ3JhbU9wdGlvbnMuZXhwb3J0Rm9ybWF0O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuaGlkZUdlbmVyYXRvcikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5oaWRlR2VuZXJhdG9yID0gY29uZmlnRmlsZS5oaWRlR2VuZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5oaWRlR2VuZXJhdG9yKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmhpZGVHZW5lcmF0b3IgPSBwcm9ncmFtT3B0aW9ucy5oaWRlR2VuZXJhdG9yO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuaGlkZURhcmtNb2RlVG9nZ2xlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmhpZGVEYXJrTW9kZVRvZ2dsZSA9IGNvbmZpZ0ZpbGUuaGlkZURhcmtNb2RlVG9nZ2xlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5oaWRlRGFya01vZGVUb2dnbGUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGlkZURhcmtNb2RlVG9nZ2xlID0gcHJvZ3JhbU9wdGlvbnMuaGlkZURhcmtNb2RlVG9nZ2xlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuY292ZXJhZ2VUZXN0KSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdCA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFRocmVzaG9sZCA9XG4gICAgICAgICAgICAgICAgdHlwZW9mIGNvbmZpZ0ZpbGUuY292ZXJhZ2VUZXN0ID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KGNvbmZpZ0ZpbGUuY292ZXJhZ2VUZXN0LCAxMClcbiAgICAgICAgICAgICAgICAgICAgOiBDT01QT0RPQ19ERUZBVUxUUy5kZWZhdWx0Q292ZXJhZ2VUaHJlc2hvbGQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvdmVyYWdlVGVzdCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3QgPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGQgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9ncmFtT3B0aW9ucy5jb3ZlcmFnZVRlc3QgPT09ICdzdHJpbmcnXG4gICAgICAgICAgICAgICAgICAgID8gcGFyc2VJbnQocHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VUZXN0LCAxMClcbiAgICAgICAgICAgICAgICAgICAgOiBDT01QT0RPQ19ERUZBVUxUUy5kZWZhdWx0Q292ZXJhZ2VUaHJlc2hvbGQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFBlckZpbGUgPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlID1cbiAgICAgICAgICAgICAgICB0eXBlb2YgY29uZmlnRmlsZS5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KGNvbmZpZ0ZpbGUuY292ZXJhZ2VNaW5pbXVtUGVyRmlsZSwgMTApXG4gICAgICAgICAgICAgICAgICAgIDogQ09NUE9ET0NfREVGQVVMVFMuZGVmYXVsdENvdmVyYWdlTWluaW11bVBlckZpbGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvdmVyYWdlTWluaW11bVBlckZpbGUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0UGVyRmlsZSA9IHRydWU7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlTWluaW11bVBlckZpbGUgPVxuICAgICAgICAgICAgICAgIHR5cGVvZiBwcm9ncmFtT3B0aW9ucy5jb3ZlcmFnZU1pbmltdW1QZXJGaWxlID09PSAnc3RyaW5nJ1xuICAgICAgICAgICAgICAgICAgICA/IHBhcnNlSW50KHByb2dyYW1PcHRpb25zLmNvdmVyYWdlTWluaW11bVBlckZpbGUsIDEwKVxuICAgICAgICAgICAgICAgICAgICA6IENPTVBPRE9DX0RFRkFVTFRTLmRlZmF1bHRDb3ZlcmFnZU1pbmltdW1QZXJGaWxlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RUaHJlc2hvbGRGYWlsID1cbiAgICAgICAgICAgICAgICBjb25maWdGaWxlLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwgPT09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvdmVyYWdlVGVzdFRocmVzaG9sZEZhaWwpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCA9XG4gICAgICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VUZXN0VGhyZXNob2xkRmFpbCA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkID1cbiAgICAgICAgICAgICAgICBjb25maWdGaWxlLmNvdmVyYWdlVGVzdFNob3dPbmx5RmFpbGVkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jb3ZlcmFnZVRlc3RTaG93T25seUZhaWxlZCA9XG4gICAgICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VUZXN0U2hvd09ubHlGYWlsZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS51bml0VGVzdENvdmVyYWdlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnVuaXRUZXN0Q292ZXJhZ2UgPSBjb25maWdGaWxlLnVuaXRUZXN0Q292ZXJhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLnVuaXRUZXN0Q292ZXJhZ2UpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudW5pdFRlc3RDb3ZlcmFnZSA9IHByb2dyYW1PcHRpb25zLnVuaXRUZXN0Q292ZXJhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlU291cmNlQ29kZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU291cmNlQ29kZSA9IGNvbmZpZ0ZpbGUuZGlzYWJsZVNvdXJjZUNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVTb3VyY2VDb2RlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTb3VyY2VDb2RlID0gcHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVNvdXJjZUNvZGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlRG9tVHJlZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlRG9tVHJlZSA9IGNvbmZpZ0ZpbGUuZGlzYWJsZURvbVRyZWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVEb21UcmVlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVEb21UcmVlID0gcHJvZ3JhbU9wdGlvbnMuZGlzYWJsZURvbVRyZWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlVGVtcGxhdGVUYWIpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVRlbXBsYXRlVGFiID0gY29uZmlnRmlsZS5kaXNhYmxlVGVtcGxhdGVUYWI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVUZW1wbGF0ZVRhYikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlVGVtcGxhdGVUYWIgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlVGVtcGxhdGVUYWI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlU3R5bGVUYWIpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVN0eWxlVGFiID0gY29uZmlnRmlsZS5kaXNhYmxlU3R5bGVUYWI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVTdHlsZVRhYikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlU3R5bGVUYWIgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlU3R5bGVUYWI7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlR3JhcGgpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUdyYXBoID0gY29uZmlnRmlsZS5kaXNhYmxlR3JhcGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVHcmFwaCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlR3JhcGggPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlR3JhcGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlQ292ZXJhZ2UpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvdmVyYWdlID0gY29uZmlnRmlsZS5kaXNhYmxlQ292ZXJhZ2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVDb3ZlcmFnZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlQ292ZXJhZ2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlUHJpdmF0ZSkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJpdmF0ZSA9IGNvbmZpZ0ZpbGUuZGlzYWJsZVByaXZhdGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVQcml2YXRlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcml2YXRlID0gcHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVByaXZhdGU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlUHJvdGVjdGVkKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcm90ZWN0ZWQgPSBjb25maWdGaWxlLmRpc2FibGVQcm90ZWN0ZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVQcm90ZWN0ZWQpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVByb3RlY3RlZCA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVQcm90ZWN0ZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlSW50ZXJuYWwpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUludGVybmFsID0gY29uZmlnRmlsZS5kaXNhYmxlSW50ZXJuYWw7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVJbnRlcm5hbCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlSW50ZXJuYWwgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlSW50ZXJuYWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUxpZmVDeWNsZUhvb2tzID0gY29uZmlnRmlsZS5kaXNhYmxlTGlmZUN5Y2xlSG9va3M7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVMaWZlQ3ljbGVIb29rcykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlTGlmZUN5Y2xlSG9va3MgPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlTGlmZUN5Y2xlSG9va3M7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlQ29uc3RydWN0b3JzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVDb25zdHJ1Y3RvcnMgPSBjb25maWdGaWxlLmRpc2FibGVDb25zdHJ1Y3RvcnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVDb25zdHJ1Y3RvcnMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZUNvbnN0cnVjdG9ycyA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVDb25zdHJ1Y3RvcnM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlUm91dGVzR3JhcGgpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVJvdXRlc0dyYXBoID0gY29uZmlnRmlsZS5kaXNhYmxlUm91dGVzR3JhcGg7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVSb3V0ZXNHcmFwaCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGggPSBwcm9ncmFtT3B0aW9ucy5kaXNhYmxlUm91dGVzR3JhcGg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlU2VhcmNoKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSBjb25maWdGaWxlLmRpc2FibGVTZWFyY2g7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVTZWFyY2gpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZVNlYXJjaCA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVTZWFyY2g7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlRGVwZW5kZW5jaWVzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVEZXBlbmRlbmNpZXMgPSBjb25maWdGaWxlLmRpc2FibGVEZXBlbmRlbmNpZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVEZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZGlzYWJsZURlcGVuZGVuY2llcyA9IHByb2dyYW1PcHRpb25zLmRpc2FibGVEZXBlbmRlbmNpZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5kaXNhYmxlUHJvcGVydGllcykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUHJvcGVydGllcyA9IGNvbmZpZ0ZpbGUuZGlzYWJsZVByb3BlcnRpZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmRpc2FibGVQcm9wZXJ0aWVzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVQcm9wZXJ0aWVzID0gcHJvZ3JhbU9wdGlvbnMuZGlzYWJsZVByb3BlcnRpZXM7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRmlsZS5taW5pbWFsKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5taW5pbWFsKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmRpc2FibGVTZWFyY2ggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlUm91dGVzR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlR3JhcGggPSB0cnVlO1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5kaXNhYmxlQ292ZXJhZ2UgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuY3VzdG9tRmF2aWNvbikge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21GYXZpY29uID0gY29uZmlnRmlsZS5jdXN0b21GYXZpY29uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5jdXN0b21GYXZpY29uKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUZhdmljb24gPSBwcm9ncmFtT3B0aW9ucy5jdXN0b21GYXZpY29uO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuY3VzdG9tTG9nbykge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5jdXN0b21Mb2dvID0gY29uZmlnRmlsZS5jdXN0b21Mb2dvO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5jdXN0b21Mb2dvKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmN1c3RvbUxvZ28gPSBwcm9ncmFtT3B0aW9ucy5jdXN0b21Mb2dvO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZ2FJRCkge1xuICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5nYUlEID0gY29uZmlnRmlsZS5nYUlEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5nYUlEKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmdhSUQgPSBwcm9ncmFtT3B0aW9ucy5nYUlEO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZ2FTaXRlKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLmdhU2l0ZSA9IGNvbmZpZ0ZpbGUuZ2FTaXRlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5nYVNpdGUgJiYgcHJvZ3JhbU9wdGlvbnMuZ2FTaXRlICE9PSBDT01QT0RPQ19ERUZBVUxUUy5nYVNpdGUpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuZ2FTaXRlID0gcHJvZ3JhbU9wdGlvbnMuZ2FTaXRlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF0aGlzLmlzV2F0Y2hpbmcpIHtcbiAgICAgICAgICAgIGlmICghbG9nZ2VyLnNpbGVudCkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBDb21wb2RvYyB2JHtwa2cudmVyc2lvbn1gKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi9zcmMvYmFubmVyJykpLnRvU3RyaW5nKCkpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHBrZy52ZXJzaW9uKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFR5cGVTY3JpcHQgdmVyc2lvbiB1c2VkIGJ5IENvbXBvZG9jIDogJHt0cy52ZXJzaW9ufWApO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChGaWxlRW5naW5lLmV4aXN0c1N5bmMoY3dkICsgcGF0aC5zZXAgKyAncGFja2FnZS5qc29uJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFja2FnZURhdGEgPSBGaWxlRW5naW5lLmdldFN5bmMoY3dkICsgcGF0aC5zZXAgKyAncGFja2FnZS5qc29uJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYWNrYWdlRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyc2VkRGF0YSA9IEpTT04ucGFyc2UocGFja2FnZURhdGEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvamVjdERldkRlcGVuZGVuY2llcyA9IHBhcnNlZERhdGEuZGV2RGVwZW5kZW5jaWVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHByb2plY3REZXZEZXBlbmRlbmNpZXMgJiYgcHJvamVjdERldkRlcGVuZGVuY2llcy50eXBlc2NyaXB0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHNQcm9qZWN0VmVyc2lvbiA9IEFuZ3VsYXJWZXJzaW9uVXRpbC5jbGVhblZlcnNpb24oXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2plY3REZXZEZXBlbmRlbmNpZXMudHlwZXNjcmlwdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBUeXBlU2NyaXB0IHZlcnNpb24gb2YgY3VycmVudCBwcm9qZWN0IDogJHt0c1Byb2plY3RWZXJzaW9ufWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgTm9kZS5qcyB2ZXJzaW9uIDogJHtwcm9jZXNzLnZlcnNpb259YCk7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJycpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBPcGVyYXRpbmcgc3lzdGVtIDogJHtvc05hbWUob3MucGxhdGZvcm0oKSwgb3MucmVsZWFzZSgpKX1gKTtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnRXhwbG9yZXJSZXN1bHQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnRXhwbG9yZXJSZXN1bHQuY29uZmlnICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKGBVc2luZyBjb25maWd1cmF0aW9uIGZpbGUgOiAke2NvbmZpZ0V4cGxvcmVyUmVzdWx0LmZpbGVwYXRofWApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb25maWdFeHBsb3JlclJlc3VsdCkge1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oYE5vIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3VuZCwgc3dpdGNoaW5nIHRvIENMSSBmbGFncy5gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5sYW5ndWFnZSAmJiAhSTE4bkVuZ2luZS5zdXBwb3J0TGFuZ3VhZ2UocHJvZ3JhbU9wdGlvbnMubGFuZ3VhZ2UpKSB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihcbiAgICAgICAgICAgICAgICBgVGhlIGxhbmd1YWdlICR7cHJvZ3JhbU9wdGlvbnMubGFuZ3VhZ2V9IGlzIG5vdCBhdmFpbGFibGUsIGZhbGxpbmcgYmFjayB0byAke0kxOG5FbmdpbmUuZmFsbGJhY2tMYW5ndWFnZX1gXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLnRzY29uZmlnICYmIHR5cGVvZiBwcm9ncmFtT3B0aW9ucy50c2NvbmZpZyA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFBsZWFzZSBwcm92aWRlIGEgdHNjb25maWcgZmlsZS5gKTtcbiAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWdGaWxlLnRzY29uZmlnKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnID0gY29uZmlnRmlsZS50c2NvbmZpZztcbiAgICAgICAgfVxuICAgICAgICBpZiAocHJvZ3JhbU9wdGlvbnMudHNjb25maWcpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcgPSBwcm9ncmFtT3B0aW9ucy50c2NvbmZpZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5tYXhTZWFyY2hSZXN1bHRzKSB7XG4gICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLm1heFNlYXJjaFJlc3VsdHMgPSBwcm9ncmFtT3B0aW9ucy5tYXhTZWFyY2hSZXN1bHRzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZmlsZXMpIHtcbiAgICAgICAgICAgIHNjYW5uZWRGaWxlcyA9IGNvbmZpZ0ZpbGUuZmlsZXM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbmZpZ0ZpbGUuZXhjbHVkZSkge1xuICAgICAgICAgICAgZXhjbHVkZUZpbGVzID0gY29uZmlnRmlsZS5leGNsdWRlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb25maWdGaWxlLmluY2x1ZGUpIHtcbiAgICAgICAgICAgIGluY2x1ZGVGaWxlcyA9IGNvbmZpZ0ZpbGUuaW5jbHVkZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBDaGVjayAtLWZpbGVzIGFyZ3VtZW50IGNhbGxcbiAgICAgICAgICovXG4gICAgICAgIGNvbnN0IGFyZ3YgPSByZXF1aXJlKCdtaW5pbWlzdCcpKHByb2Nlc3MuYXJndi5zbGljZSgyKSk7XG4gICAgICAgIGlmIChhcmd2ICYmIGFyZ3YuZmlsZXMpIHtcbiAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaGFzRmlsZXNUb0NvdmVyYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndi5maWxlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBzdXBlci5zZXRGaWxlcyhbYXJndi5maWxlc10pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdXBlci5zZXRGaWxlcyhhcmd2LmZpbGVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5zZXJ2ZSAmJiAhQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZyAmJiBwcm9ncmFtT3B0aW9ucy5vdXRwdXQpIHtcbiAgICAgICAgICAgIC8vIGlmIC1zICYgLWQsIHNlcnZlIGl0XG4gICAgICAgICAgICBpZiAoIUZpbGVFbmdpbmUuZXhpc3RzU3luYyhDb25maWd1cmF0aW9uLm1haW5EYXRhLm91dHB1dCkpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYCR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXR9IGZvbGRlciBkb2Vzbid0IGV4aXN0YCk7XG4gICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbyhcbiAgICAgICAgICAgICAgICAgICAgYFNlcnZpbmcgZG9jdW1lbnRhdGlvbiBmcm9tICR7Q29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXR9IGF0IGh0dHA6Ly8ke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEuaG9zdG5hbWV9OiR7cHJvZ3JhbU9wdGlvbnMucG9ydH1gXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBzdXBlci5ydW5XZWJTZXJ2ZXIoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgcHJvZ3JhbU9wdGlvbnMuc2VydmUgJiZcbiAgICAgICAgICAgICFDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnICYmXG4gICAgICAgICAgICAhcHJvZ3JhbU9wdGlvbnMub3V0cHV0XG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gaWYgb25seSAtcyBmaW5kIC4vZG9jdW1lbnRhdGlvbiwgaWYgb2sgc2VydmUsIGVsc2UgZXJyb3IgcHJvdmlkZSAtZFxuICAgICAgICAgICAgaWYgKCFGaWxlRW5naW5lLmV4aXN0c1N5bmMoQ29uZmlndXJhdGlvbi5tYWluRGF0YS5vdXRwdXQpKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdQcm92aWRlIG91dHB1dCBnZW5lcmF0ZWQgZm9sZGVyIHdpdGggLWQgZmxhZycpO1xuICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmluZm8oXG4gICAgICAgICAgICAgICAgICAgIGBTZXJ2aW5nIGRvY3VtZW50YXRpb24gZnJvbSAke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0fSBhdCBodHRwOi8vJHtDb25maWd1cmF0aW9uLm1haW5EYXRhLmhvc3RuYW1lfToke3Byb2dyYW1PcHRpb25zLnBvcnR9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgc3VwZXIucnVuV2ViU2VydmVyKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEub3V0cHV0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChDb25maWd1cmF0aW9uLm1haW5EYXRhLmhhc0ZpbGVzVG9Db3ZlcmFnZSkge1xuICAgICAgICAgICAgaWYgKHByb2dyYW1PcHRpb25zLmNvdmVyYWdlTWluaW11bVBlckZpbGUpIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIuaW5mbygnUnVuIGRvY3VtZW50YXRpb24gY292ZXJhZ2UgdGVzdCBmb3IgZmlsZXMnKTtcbiAgICAgICAgICAgICAgICBzdXBlci50ZXN0Q292ZXJhZ2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCdNaXNzaW5nIGNvdmVyYWdlIGNvbmZpZ3VyYXRpb24nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5oaWRlR2VuZXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgQ29uZmlndXJhdGlvbi5tYWluRGF0YS5oaWRlR2VuZXJhdG9yID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpIHtcbiAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgKiB0c2NvbmZpZyBmaWxlIHByb3ZpZGVkIG9ubHlcbiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgICAgICBjb25zdCB0ZXN0VHNDb25maWdQYXRoID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZy5pbmRleE9mKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgICAgIGlmICh0ZXN0VHNDb25maWdQYXRoICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZy5yZXBsYWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc291cmNlRm9sZGVyO1xuICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtLmFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAvKipcbiAgICAgICAgICAgICAgICAgICAgICogdHNjb25maWcgZmlsZSBwcm92aWRlZCB3aXRoIHNvdXJjZSBmb2xkZXIgaW4gYXJnXG4gICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXN0VHNDb25maWdQYXRoID0gQ29uZmlndXJhdGlvbi5tYWluRGF0YS50c2NvbmZpZy5pbmRleE9mKHByb2Nlc3MuY3dkKCkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGVzdFRzQ29uZmlnUGF0aCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcgPSBDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKSArIHBhdGguc2VwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcnXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgc291cmNlRm9sZGVyID0gcHJvZ3JhbS5hcmdzWzBdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIUZpbGVFbmdpbmUuZXhpc3RzU3luYyhzb3VyY2VGb2xkZXIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYFByb3ZpZGVkIHNvdXJjZSBmb2xkZXIgJHtzb3VyY2VGb2xkZXJ9IHdhcyBub3QgZm91bmQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5YFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdVc2luZyBwcm92aWRlZCBzb3VyY2UgZm9sZGVyJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIUZpbGVFbmdpbmUuZXhpc3RzU3luYyhDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKSkge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICAgICAgICAgICAgICAgICBgXCIke0NvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWd9XCIgZmlsZSB3YXMgbm90IGZvdW5kIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeWBcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IF9maWxlID0gcGF0aC5qb2luKFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksIHBhdGguZGlybmFtZShDb25maWd1cmF0aW9uLm1haW5EYXRhLnRzY29uZmlnKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRoLmJhc2VuYW1lKENvbmZpZ3VyYXRpb24ubWFpbkRhdGEudHNjb25maWcpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb2YgdHNjb25maWcuanNvbiBhcyBhIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgICAgICAgICAgICAgIGN3ZCA9IF9maWxlLnNwbGl0KHBhdGguc2VwKS5zbGljZSgwLCAtMSkuam9pbihwYXRoLnNlcCk7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdVc2luZyB0c2NvbmZpZyBmaWxlICcsIF9maWxlKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0c0NvbmZpZ0ZpbGUgPSByZWFkQ29uZmlnKF9maWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRzQ29uZmlnRmlsZS5maWxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nhbm5lZEZpbGVzID0gdHNDb25maWdGaWxlLmZpbGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggb2YgdGhlc2UgZmlsZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcyA9IHNjYW5uZWRGaWxlcy5tYXAoc2Nhbm5lZEZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjd2QgKyBwYXRoLnNlcCArIHNjYW5uZWRGaWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBldmVuIGlmIGZpbGVzIGFyZSBzdXBwbGllZCB3aXRoIFwiZmlsZXNcIiBhdHRyaWJ1dGVzLCBlbmhhbmNlIHRoZSBhcnJheSB3aXRoIGluY2x1ZGVzXG4gICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVGaWxlcyA9IFsuLi5leGNsdWRlRmlsZXMsIC4uLih0c0NvbmZpZ0ZpbGUuZXhjbHVkZSB8fCBbXSldO1xuICAgICAgICAgICAgICAgICAgICBpbmNsdWRlRmlsZXMgPSBbLi4uaW5jbHVkZUZpbGVzLCAuLi4odHNDb25maWdGaWxlLmluY2x1ZGUgfHwgW10pXTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2Nhbm5lZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVGaWxlcyA9IFsuLi5pbmNsdWRlRmlsZXMsIC4uLnNjYW5uZWRGaWxlc107XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWluY2x1ZGVGaWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVGaWxlcyA9IElOQ0xVREVfUEFUVEVSTlM7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJlYW0gPSBmZy5zdHJlYW0oaW5jbHVkZUZpbGVzLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjd2Q6IHNvdXJjZUZvbGRlciB8fCBjd2QsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZ25vcmU6IGV4Y2x1ZGVGaWxlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFic29sdXRlOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5vbignZGF0YScsIGZpbGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGguZXh0bmFtZShmaWxlKSA9PT0gJy50cycgfHwgcGF0aC5leHRuYW1lKGZpbGUpID09PSAnLnRzeCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZGVidWcoJ0luY2x1ZGluZycsIGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5uZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIud2FybignRXhjbHVkaW5nJywgZmlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS5vbignZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIuc2V0RmlsZXMoc2Nhbm5lZEZpbGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmFtT3B0aW9ucy5jb3ZlcmFnZVRlc3QgfHwgcHJvZ3JhbU9wdGlvbnMuY292ZXJhZ2VUZXN0UGVyRmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5pbmZvKCdSdW4gZG9jdW1lbnRhdGlvbiBjb3ZlcmFnZSB0ZXN0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwZXIudGVzdENvdmVyYWdlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cGVyLmdlbmVyYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKCd0c2NvbmZpZy5qc29uIGZpbGUgd2FzIG5vdCBmb3VuZCwgcGxlYXNlIHVzZSAtcCBmbGFnJyk7XG4gICAgICAgICAgICAgICAgb3V0cHV0SGVscCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufVxuIl0sIm5hbWVzIjpbIl8iLCJTeW50YXhLaW5kIiwidHMiLCJfdHMuZ2V0SlNEb2NDb21tZW50UmFuZ2VzIiwiZnMiLCJwYXRoIiwidHJhdmVyc2UiLCJBbmd1bGFyQXBpVXRpbCIsIkNvbmZpZ3VyYXRpb24iLCJGaWxlRW5naW5lIiwiRGVwZW5kZW5jaWVzRW5naW5lIiwiRXhwb3J0SnNvbkVuZ2luZSIsIkhhbmRsZWJhcnMiLCJzZW12ZXIiLCJBbmd1bGFyVmVyc2lvblV0aWwiLCJCYXNpY1R5cGVVdGlsIiwiSTE4bkVuZ2luZSIsImFzdCIsIlByb2plY3QiLCJWYXJpYWJsZURlY2xhcmF0aW9uIiwiSlNPTjUiLCJJbXBvcnRzVXRpbCIsIk5vZGUiLCJjbG9uZURlZXAiLCJjb25jYXQiLCJmaW5kIiwiRXh0ZW5kc01lcmdlciIsImNoZWVyaW8iLCJkZWNvZGUiLCJjcnlwdG8iLCJSb3V0ZXJQYXJzZXJVdGlsIiwiQ29tcG9uZW50c1RyZWVFbmdpbmUiLCJ1dWlkdjQiLCJjd2QiLCJNYXJrZG93bkVuZ2luZSIsIkh0bWxFbmdpbmUiLCJFeHBvcnRFbmdpbmUiLCJTZWFyY2hFbmdpbmUiLCJOZ2RFbmdpbmUiLCJMaXZlU2VydmVyIiwiY29zbWljb25maWdTeW5jIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLElBQUksYUFBYSxHQUFHLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBRTtBQUNuQyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsY0FBYztB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Q0FBQztBQUNoRSxnQkFBQSxLQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNsQyxhQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkNBLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFDLFNBQXdCLEVBQUE7QUFDdkQsZ0JBQUEsSUFBTSxNQUFNLEdBQUdBLFlBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUN0RSxnQkFBQSxLQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUN4QyxhQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcENBLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxVQUFDLFVBQTBCLEVBQUE7QUFDMUQsZ0JBQUEsSUFBTSxNQUFNLEdBQUdBLFlBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUN4RSxnQkFBQSxLQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUMxQyxhQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDakNBLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFFBQVEsRUFBRSxVQUFDLE1BQXNCLEVBQUE7QUFDbkQsZ0JBQUEsSUFBTSxNQUFNLEdBQUdBLFlBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUNqRSxnQkFBQSxLQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUNuQyxhQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDbkNBLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFVBQVUsRUFBRSxVQUFDLFNBQXdCLEVBQUE7QUFDdkQsZ0JBQUEsSUFBTSxNQUFNLEdBQUdBLFlBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLFVBQVUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUN0RSxnQkFBQSxLQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQztBQUN4QyxhQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDcENBLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxVQUFDLFVBQTBCLEVBQUE7QUFDMUQsZ0JBQUEsSUFBTSxNQUFNLEdBQUdBLFlBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSSxDQUFDLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztBQUN4RSxnQkFBQSxLQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLFVBQVUsQ0FBQztBQUMxQyxhQUFDLENBQUMsQ0FBQztTQUNOO1FBQ0QsSUFBSSxXQUFXLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckNBLFlBQUMsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxVQUFDLFdBQTRCLEVBQUE7QUFDN0QsZ0JBQUEsSUFBTSxNQUFNLEdBQUdBLFlBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSSxD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VUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBb0IsQ0FBQSxNQUFBLENBQUFBLG9CQUFrQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUUsQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsSUFBSUEsb0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBb0IsQ0FBQSxNQUFBLENBQUFBLG9CQUFrQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUUsQ0FBQyxDQUFDO1NBQzVFO1FBQ0QsSUFBSUEsb0JBQWtCLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDeEMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBb0IsQ0FBQSxNQUFBLENBQUFBLG9CQUFrQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUUsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsSUFBSUEsb0JBQWtCLENBQUMsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBb0IsQ0FBQSxNQUFBLENBQUFBLG9CQUFrQixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUUsQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsSUFBSUEsb0JBQWtCLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDM0MsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBb0IsQ0FBQSxNQUFBLENBQUFBLG9CQUFrQixDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUUsQ0FBQyxDQUFDO1NBQzVFO1FBQ0QsSUFBSUEsb0JBQWtCLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQkFBb0IsQ0FBQSxNQUFBLENBQUFBLG9CQUFrQixDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUUsQ0FBQyxDQUFDO1NBQzdFO1FBQ0QsSUFBSUEsb0JBQWtCLENBQUMs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
|