index-cli-D7g1_4MM.js 2.1 MB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016301730183019302030213022302330243025302630273028302930303031303230333034303530363037303830393040304130423043304430453046304730483049305030513052305330543055305630573058305930603061306230633064306530663067306830693070307130723073307430753076307730783079308030813082308330843085308630873088308930903091309230933094309530963097309830993100310131023103310431053106310731083109311031113112311331143115311631173118311931203121312231233124312531263127312831293130313131323133313431353136313731383139314031413142314331443145314631473148314931503151315231533154315531563157315831593160316131623163316431653166316731683169317031713172317331743175317631773178317931803181318231833184318531863187318831893190319131923193319431953196319731983199320032013202320332043205320632073208320932103211321232133214321532163217321832193220322132223223322432253226322732283229323032313232323332343235323632373238323932403241324232433244324532463247324832493250325132523253325432553256325732583259326032613262326332643265326632673268326932703271327232733274327532763277327832793280328132823283328432853286328732883289329032913292329332943295329632973298329933003301330233033304330533063307330833093310331133123313331433153316331733183319332033213322332333243325332633273328332933303331333233333334333533363337333833393340334133423343334433453346334733483349335033513352335333543355335633573358335933603361336233633364336533663367336833693370337133723373337433753376337733783379338033813382338333843385338633873388338933903391339233933394339533963397339833993400340134023403340434053406340734083409341034113412341334143415341634173418341934203421342234233424342534263427342834293430343134323433343434353436343734383439344034413442344334443445344634473448344934503451345234533454345534563457345834593460346134623463346434653466346734683469347034713472347334743475347634773478347934803481348234833484348534863487348834893490349134923493349434953496349734983499350035013502350335043505350635073508350935103511351235133514351535163517351835193520352135223523352435253526352735283529353035313532353335343535353635373538353935403541354235433544354535463547354835493550355135523553355435553556355735583559356035613562356335643565356635673568356935703571357235733574357535763577357835793580358135823583358435853586358735883589359035913592359335943595359635973598359936003601360236033604360536063607360836093610361136123613361436153616361736183619362036213622362336243625362636273628362936303631363236333634363536363637363836393640364136423643364436453646364736483649365036513652365336543655365636573658365936603661366236633664366536663667366836693670367136723673367436753676367736783679368036813682368336843685368636873688368936903691369236933694369536963697369836993700370137023703370437053706370737083709371037113712371337143715371637173718371937203721372237233724372537263727372837293730373137323733373437353736373737383739374037413742374337443745374637473748374937503751375237533754375537563757375837593760376137623763376437653766376737683769377037713772377337743775377637773778377937803781378237833784378537863787378837893790379137923793379437953796379737983799380038013802380338043805380638073808380938103811381238133814381538163817381838193820382138223823382438253826382738283829383038313832383338343835383638373838383938403841384238433844384538463847384838493850385138523853385438553856385738583859386038613862386338643865386638673868386938703871387238733874387538763877387838793880388138823883388438853886388738883889389038913892389338943895389638973898389939003901390239033904390539063907390839093910391139123913391439153916391739183919392039213922392339243925392639273928392939303931393239333934393539363937393839393940394139423943394439453946394739483949395039513952395339543955395639573958395939603961396239633964396539663967396839693970397139723973397439753976397739783979398039813982398339843985398639873988398939903991399239933994399539963997399839994000400140024003400440054006400740084009401040114012401340144015401640174018401940204021402240234024402540264027402840294030403140324033403440354036403740384039404040414042404340444045404640474048404940504051405240534054405540564057405840594060406140624063406440654066406740684069407040714072407340744075407640774078407940804081408240834084408540864087408840894090409140924093409440954096409740984099410041014102410341044105410641074108410941104111411241134114411541164117411841194120412141224123412441254126412741284129413041314132413341344135413641374138413941404141414241434144414541464147414841494150415141524153415441554156415741584159416041614162416341644165416641674168416941704171417241734174417541764177417841794180418141824183418441854186418741884189419041914192419341944195419641974198419942004201420242034204420542064207420842094210421142124213421442154216421742184219422042214222422342244225422642274228422942304231423242334234423542364237423842394240424142424243424442454246424742484249425042514252425342544255425642574258425942604261426242634264426542664267426842694270427142724273427442754276427742784279428042814282428342844285428642874288428942904291429242934294429542964297429842994300430143024303430443054306430743084309431043114312431343144315431643174318431943204321432243234324432543264327432843294330433143324333433443354336433743384339434043414342434343444345434643474348434943504351435243534354435543564357435843594360436143624363436443654366436743684369437043714372437343744375437643774378437943804381438243834384438543864387438843894390439143924393439443954396439743984399440044014402440344044405440644074408440944104411441244134414441544164417441844194420442144224423442444254426442744284429443044314432443344344435443644374438443944404441444244434444444544464447444844494450445144524453445444554456445744584459446044614462446344644465446644674468446944704471447244734474447544764477447844794480448144824483448444854486448744884489449044914492449344944495449644974498449945004501450245034504450545064507450845094510451145124513451445154516451745184519452045214522452345244525452645274528452945304531453245334534453545364537453845394540454145424543454445454546454745484549455045514552455345544555455645574558455945604561456245634564456545664567456845694570457145724573457445754576457745784579458045814582458345844585458645874588458945904591459245934594459545964597459845994600460146024603460446054606460746084609461046114612461346144615461646174618461946204621462246234624462546264627462846294630463146324633463446354636463746384639464046414642464346444645464646474648464946504651465246534654465546564657465846594660466146624663466446654666466746684669467046714672467346744675467646774678467946804681468246834684468546864687468846894690469146924693469446954696469746984699470047014702470347044705470647074708470947104711471247134714471547164717471847194720472147224723472447254726472747284729473047314732473347344735473647374738473947404741474247434744474547464747474847494750475147524753475447554756475747584759476047614762476347644765476647674768476947704771477247734774477547764777477847794780478147824783478447854786478747884789479047914792479347944795479647974798479948004801480248034804480548064807480848094810481148124813481448154816481748184819482048214822482348244825482648274828482948304831483248334834483548364837483848394840484148424843484448454846484748484849485048514852485348544855485648574858485948604861486248634864486548664867486848694870487148724873487448754876487748784879488048814882488348844885488648874888488948904891489248934894489548964897489848994900490149024903490449054906490749084909491049114912491349144915491649174918491949204921492249234924492549264927492849294930493149324933493449354936493749384939494049414942494349444945494649474948494949504951495249534954495549564957495849594960496149624963496449654966496749684969497049714972497349744975497649774978497949804981498249834984498549864987498849894990499149924993499449954996499749984999500050015002500350045005500650075008500950105011501250135014501550165017501850195020502150225023502450255026502750285029503050315032503350345035503650375038503950405041504250435044504550465047504850495050505150525053505450555056505750585059506050615062506350645065506650675068506950705071507250735074507550765077507850795080508150825083508450855086508750885089509050915092509350945095509650975098509951005101510251035104510551065107510851095110511151125113511451155116511751185119512051215122512351245125512651275128512951305131513251335134513551365137513851395140514151425143514451455146514751485149515051515152515351545155515651575158515951605161516251635164516551665167516851695170517151725173517451755176517751785179518051815182518351845185518651875188518951905191519251935194519551965197519851995200520152025203520452055206520752085209521052115212521352145215521652175218521952205221522252235224522552265227522852295230523152325233523452355236523752385239524052415242524352445245524652475248524952505251525252535254525552565257525852595260526152625263526452655266526752685269527052715272527352745275527652775278527952805281528252835284528552865287528852895290529152925293529452955296529752985299530053015302530353045305530653075308530953105311531253135314531553165317531853195320532153225323532453255326532753285329533053315332533353345335533653375338533953405341534253435344534553465347534853495350535153525353535453555356535753585359536053615362536353645365536653675368536953705371537253735374537553765377537853795380538153825383538453855386538753885389539053915392539353945395539653975398539954005401540254035404540554065407540854095410541154125413541454155416541754185419542054215422542354245425542654275428542954305431543254335434543554365437543854395440544154425443544454455446544754485449545054515452545354545455545654575458545954605461546254635464546554665467546854695470547154725473547454755476547754785479548054815482548354845485548654875488548954905491549254935494549554965497549854995500550155025503550455055506550755085509551055115512551355145515551655175518551955205521552255235524552555265527552855295530553155325533553455355536553755385539554055415542554355445545554655475548554955505551555255535554555555565557555855595560556155625563556455655566556755685569557055715572557355745575557655775578557955805581558255835584558555865587558855895590559155925593559455955596559755985599560056015602560356045605560656075608560956105611561256135614561556165617561856195620562156225623562456255626562756285629563056315632563356345635563656375638563956405641564256435644564556465647564856495650565156525653565456555656565756585659566056615662566356645665566656675668566956705671567256735674567556765677567856795680568156825683568456855686568756885689569056915692569356945695569656975698569957005701570257035704570557065707570857095710571157125713571457155716571757185719572057215722572357245725572657275728572957305731573257335734573557365737573857395740574157425743574457455746574757485749575057515752575357545755575657575758575957605761576257635764576557665767576857695770577157725773577457755776577757785779578057815782578357845785578657875788578957905791579257935794579557965797579857995800580158025803580458055806580758085809581058115812581358145815581658175818581958205821582258235824582558265827582858295830583158325833583458355836583758385839584058415842584358445845584658475848584958505851585258535854585558565857585858595860586158625863586458655866586758685869587058715872587358745875587658775878587958805881588258835884588558865887588858895890589158925893589458955896589758985899590059015902590359045905590659075908590959105911591259135914591559165917591859195920592159225923592459255926592759285929593059315932593359345935593659375938593959405941594259435944594559465947594859495950595159525953595459555956595759585959596059615962596359645965596659675968596959705971597259735974597559765977597859795980598159825983598459855986598759885989599059915992599359945995599659975998599960006001600260036004600560066007600860096010601160126013601460156016601760186019602060216022602360246025602660276028602960306031603260336034603560366037603860396040604160426043604460456046604760486049605060516052605360546055605660576058605960606061606260636064606560666067606860696070607160726073607460756076607760786079608060816082608360846085608660876088608960906091609260936094609560966097609860996100610161026103610461056106610761086109611061116112611361146115611661176118611961206121612261236124612561266127612861296130613161326133613461356136613761386139614061416142614361446145614661476148614961506151615261536154615561566157615861596160616161626163616461656166616761686169617061716172617361746175617661776178617961806181618261836184618561866187618861896190619161926193619461956196619761986199620062016202620362046205620662076208620962106211621262136214621562166217621862196220622162226223622462256226622762286229623062316232623362346235623662376238623962406241624262436244624562466247624862496250625162526253625462556256625762586259626062616262626362646265626662676268626962706271627262736274627562766277627862796280628162826283628462856286628762886289629062916292629362946295629662976298629963006301630263036304630563066307630863096310631163126313631463156316631763186319632063216322632363246325632663276328632963306331633263336334633563366337633863396340634163426343634463456346634763486349635063516352635363546355635663576358635963606361636263636364636563666367636863696370637163726373637463756376637763786379638063816382638363846385638663876388638963906391639263936394639563966397639863996400640164026403640464056406640764086409641064116412641364146415641664176418641964206421642264236424642564266427642864296430643164326433643464356436643764386439644064416442644364446445644664476448644964506451645264536454645564566457645864596460646164626463646464656466646764686469647064716472647364746475647664776478647964806481648264836484648564866487648864896490649164926493649464956496649764986499650065016502650365046505650665076508650965106511651265136514651565166517651865196520652165226523652465256526652765286529653065316532653365346535653665376538653965406541654265436544654565466547654865496550655165526553655465556556655765586559656065616562656365646565656665676568656965706571657265736574657565766577657865796580658165826583658465856586658765886589659065916592659365946595659665976598659966006601660266036604660566066607660866096610661166126613661466156616661766186619662066216622662366246625662666276628662966306631663266336634663566366637663866396640664166426643664466456646664766486649665066516652665366546655665666576658665966606661666266636664666566666667666866696670667166726673667466756676667766786679668066816682668366846685668666876688668966906691669266936694669566966697669866996700670167026703670467056706670767086709671067116712671367146715671667176718671967206721672267236724672567266727672867296730673167326733673467356736673767386739674067416742674367446745674667476748674967506751675267536754675567566757675867596760676167626763676467656766676767686769677067716772677367746775677667776778677967806781678267836784678567866787678867896790679167926793679467956796679767986799680068016802680368046805680668076808680968106811681268136814681568166817681868196820682168226823682468256826682768286829683068316832683368346835683668376838683968406841684268436844684568466847684868496850685168526853685468556856685768586859686068616862686368646865686668676868686968706871687268736874687568766877687868796880688168826883688468856886688768886889689068916892689368946895689668976898689969006901690269036904690569066907690869096910691169126913691469156916691769186919692069216922692369246925692669276928692969306931693269336934693569366937693869396940694169426943694469456946694769486949695069516952695369546955695669576958695969606961696269636964696569666967696869696970697169726973697469756976697769786979698069816982698369846985698669876988698969906991699269936994699569966997699869997000700170027003700470057006700770087009701070117012701370147015701670177018701970207021702270237024702570267027702870297030703170327033703470357036703770387039704070417042704370447045704670477048704970507051705270537054705570567057705870597060706170627063706470657066706770687069707070717072707370747075707670777078707970807081708270837084708570867087708870897090709170927093709470957096709770987099710071017102710371047105710671077108710971107111711271137114711571167117711871197120712171227123712471257126712771287129713071317132713371347135713671377138713971407141714271437144714571467147714871497150715171527153715471557156715771587159716071617162716371647165716671677168716971707171717271737174717571767177717871797180718171827183718471857186718771887189719071917192719371947195719671977198719972007201720272037204720572067207720872097210721172127213721472157216721772187219722072217222722372247225722672277228722972307231723272337234723572367237723872397240724172427243724472457246724772487249725072517252725372547255725672577258725972607261726272637264726572667267726872697270727172727273727472757276727772787279728072817282728372847285728672877288728972907291729272937294729572967297729872997300730173027303730473057306730773087309731073117312731373147315731673177318731973207321732273237324732573267327732873297330733173327333733473357336733773387339734073417342734373447345734673477348734973507351735273537354735573567357735873597360736173627363736473657366736773687369737073717372737373747375737673777378737973807381738273837384738573867387738873897390739173927393739473957396739773987399740074017402740374047405740674077408740974107411741274137414741574167417741874197420742174227423742474257426742774287429743074317432743374347435743674377438743974407441744274437444744574467447744874497450745174527453745474557456745774587459746074617462746374647465746674677468746974707471747274737474747574767477747874797480748174827483748474857486748774887489749074917492749374947495749674977498749975007501750275037504750575067507750875097510751175127513751475157516751775187519752075217522752375247525752675277528752975307531753275337534753575367537753875397540754175427543754475457546754775487549755075517552755375547555755675577558755975607561756275637564756575667567756875697570757175727573757475757576757775787579758075817582758375847585758675877588758975907591759275937594759575967597759875997600760176027603760476057606760776087609761076117612761376147615761676177618761976207621762276237624762576267627762876297630763176327633763476357636763776387639764076417642764376447645764676477648764976507651765276537654765576567657765876597660766176627663766476657666766776687669767076717672767376747675767676777678767976807681768276837684768576867687768876897690769176927693769476957696769776987699770077017702770377047705770677077708770977107711771277137714771577167717771877197720772177227723772477257726772777287729773077317732773377347735773677377738773977407741774277437744774577467747774877497750775177527753775477557756775777587759776077617762776377647765776677677768776977707771777277737774777577767777777877797780778177827783778477857786778777887789779077917792779377947795779677977798779978007801780278037804780578067807780878097810781178127813781478157816781778187819782078217822782378247825782678277828782978307831783278337834783578367837783878397840784178427843784478457846784778487849785078517852785378547855785678577858785978607861786278637864786578667867786878697870787178727873787478757876787778787879788078817882788378847885788678877888788978907891789278937894789578967897789878997900790179027903790479057906790779087909791079117912791379147915791679177918791979207921792279237924792579267927792879297930793179327933793479357936793779387939794079417942794379447945794679477948794979507951795279537954795579567957795879597960796179627963796479657966796779687969797079717972797379747975797679777978797979807981798279837984798579867987798879897990799179927993799479957996799779987999800080018002800380048005800680078008800980108011801280138014801580168017801880198020802180228023802480258026802780288029803080318032803380348035803680378038803980408041804280438044804580468047804880498050805180528053805480558056805780588059806080618062806380648065806680678068806980708071807280738074807580768077807880798080808180828083808480858086808780888089809080918092809380948095809680978098809981008101810281038104810581068107810881098110811181128113811481158116811781188119812081218122812381248125812681278128812981308131813281338134813581368137813881398140814181428143814481458146814781488149815081518152815381548155815681578158815981608161816281638164816581668167816881698170817181728173817481758176817781788179818081818182818381848185818681878188818981908191819281938194819581968197819881998200820182028203820482058206820782088209821082118212821382148215821682178218821982208221822282238224822582268227822882298230823182328233823482358236823782388239824082418242824382448245824682478248824982508251825282538254825582568257825882598260826182628263826482658266826782688269827082718272827382748275827682778278827982808281828282838284828582868287828882898290829182928293829482958296829782988299830083018302830383048305830683078308830983108311831283138314831583168317831883198320832183228323832483258326832783288329833083318332833383348335833683378338833983408341834283438344834583468347834883498350835183528353835483558356835783588359836083618362836383648365836683678368836983708371837283738374837583768377837883798380838183828383838483858386838783888389839083918392839383948395839683978398839984008401840284038404840584068407840884098410841184128413841484158416841784188419842084218422842384248425842684278428842984308431843284338434843584368437843884398440844184428443844484458446844784488449845084518452845384548455845684578458845984608461846284638464846584668467846884698470847184728473847484758476847784788479848084818482848384848485848684878488848984908491849284938494849584968497849884998500850185028503850485058506850785088509851085118512851385148515851685178518851985208521852285238524852585268527852885298530853185328533853485358536853785388539854085418542854385448545854685478548854985508551855285538554855585568557855885598560856185628563856485658566856785688569857085718572857385748575857685778578857985808581858285838584858585868587858885898590859185928593859485958596859785988599860086018602860386048605860686078608860986108611861286138614861586168617861886198620862186228623862486258626862786288629863086318632863386348635863686378638863986408641864286438644864586468647864886498650865186528653865486558656865786588659866086618662866386648665866686678668866986708671867286738674867586768677867886798680868186828683868486858686868786888689869086918692869386948695869686978698869987008701870287038704870587068707870887098710871187128713871487158716871787188719872087218722872387248725872687278728872987308731873287338734873587368737873887398740874187428743874487458746874787488749875087518752875387548755875687578758875987608761876287638764876587668767876887698770877187728773877487758776877787788779878087818782878387848785878687878788878987908791879287938794879587968797879887998800880188028803880488058806880788088809881088118812881388148815881688178818881988208821882288238824882588268827882888298830883188328833883488358836883788388839884088418842884388448845884688478848884988508851885288538854885588568857885888598860886188628863886488658866886788688869887088718872887388748875887688778878887988808881888288838884888588868887888888898890889188928893889488958896889788988899890089018902890389048905890689078908890989108911891289138914891589168917891889198920892189228923892489258926892789288929893089318932893389348935893689378938893989408941894289438944894589468947894889498950895189528953895489558956895789588959896089618962896389648965896689678968896989708971897289738974897589768977897889798980898189828983898489858986898789888989899089918992899389948995899689978998899990009001900290039004900590069007900890099010901190129013901490159016901790189019902090219022902390249025902690279028902990309031903290339034903590369037903890399040904190429043904490459046904790489049905090519052905390549055905690579058905990609061906290639064906590669067906890699070907190729073907490759076907790789079908090819082908390849085908690879088908990909091909290939094909590969097909890999100910191029103910491059106910791089109911091119112911391149115911691179118911991209121912291239124912591269127912891299130913191329133913491359136913791389139914091419142914391449145914691479148914991509151915291539154915591569157915891599160916191629163916491659166916791689169917091719172917391749175917691779178917991809181918291839184918591869187918891899190919191929193919491959196919791989199920092019202920392049205920692079208920992109211921292139214921592169217921892199220922192229223922492259226922792289229923092319232923392349235923692379238923992409241924292439244924592469247924892499250925192529253925492559256925792589259926092619262926392649265926692679268926992709271927292739274927592769277927892799280928192829283928492859286928792889289929092919292929392949295929692979298929993009301930293039304930593069307930893099310931193129313931493159316931793189319932093219322932393249325932693279328932993309331933293339334933593369337933893399340934193429343934493459346934793489349935093519352935393549355935693579358935993609361936293639364936593669367936893699370937193729373937493759376937793789379938093819382938393849385938693879388938993909391939293939394939593969397939893999400940194029403940494059406940794089409941094119412941394149415941694179418941994209421942294239424942594269427942894299430943194329433943494359436943794389439944094419442944394449445944694479448944994509451945294539454945594569457945894599460946194629463946494659466946794689469947094719472947394749475947694779478947994809481948294839484948594869487948894899490949194929493949494959496949794989499950095019502950395049505950695079508950995109511951295139514951595169517951895199520952195229523952495259526952795289529953095319532953395349535953695379538953995409541954295439544954595469547954895499550955195529553955495559556955795589559956095619562956395649565956695679568956995709571957295739574957595769577957895799580958195829583958495859586958795889589959095919592959395949595959695979598959996009601960296039604960596069607960896099610961196129613961496159616961796189619962096219622962396249625962696279628962996309631963296339634963596369637963896399640964196429643964496459646964796489649965096519652965396549655965696579658965996609661966296639664966596669667966896699670967196729673967496759676967796789679968096819682968396849685968696879688968996909691969296939694969596969697969896999700970197029703970497059706970797089709971097119712971397149715971697179718971997209721972297239724972597269727972897299730973197329733973497359736973797389739974097419742974397449745974697479748974997509751975297539754975597569757975897599760976197629763976497659766976797689769977097719772977397749775977697779778977997809781978297839784978597869787978897899790979197929793979497959796979797989799980098019802980398049805980698079808980998109811981298139814981598169817981898199820982198229823982498259826982798289829983098319832983398349835983698379838983998409841984298439844984598469847984898499850985198529853985498559856985798589859986098619862986398649865986698679868986998709871987298739874987598769877987898799880988198829883988498859886988798889889989098919892989398949895989698979898989999009901990299039904990599069907990899099910991199129913991499159916991799189919992099219922992399249925992699279928992999309931993299339934993599369937993899399940994199429943994499459946994799489949995099519952995399549955995699579958995999609961996299639964996599669967996899699970997199729973997499759976997799789979998099819982998399849985998699879988998999909991999299939994999599969997999899991000010001100021000310004100051000610007100081000910010100111001210013100141001510016100171001810019100201002110022100231002410025100261002710028100291003010031100321003310034100351003610037100381003910040100411004210043100441004510046100471004810049100501005110052100531005410055100561005710058100591006010061100621006310064100651006610067100681006910070100711007210073100741007510076100771007810079100801008110082100831008410085100861008710088100891009010091100921009310094100951009610097100981009910100101011010210103101041010510106101071010810109101101011110112101131011410115101161011710118101191012010121101221012310124101251012610127101281012910130101311013210133101341013510136101371013810139101401014110142101431014410145101461014710148101491015010151101521015310154101551015610157101581015910160101611016210163101641016510166101671016810169101701017110172101731017410175101761017710178101791018010181101821018310184101851018610187101881018910190101911019210193101941019510196101971019810199102001020110202102031020410205102061020710208102091021010211102121021310214102151021610217102181021910220102211022210223102241022510226102271022810229102301023110232102331023410235102361023710238102391024010241102421024310244102451024610247102481024910250102511025210253102541025510256102571025810259102601026110262102631026410265102661026710268102691027010271102721027310274102751027610277102781027910280102811028210283102841028510286102871028810289102901029110292102931029410295102961029710298102991030010301103021030310304103051030610307103081030910310103111031210313103141031510316103171031810319103201032110322103231032410325103261032710328103291033010331103321033310334103351033610337103381033910340103411034210343103441034510346103471034810349103501035110352103531035410355103561035710358103591036010361103621036310364103651036610367103681036910370103711037210373103741037510376103771037810379103801038110382103831038410385103861038710388103891039010391103921039310394103951039610397103981039910400104011040210403104041040510406104071040810409104101041110412104131041410415104161041710418104191042010421104221042310424104251042610427104281042910430104311043210433104341043510436104371043810439104401044110442104431044410445104461044710448104491045010451104521045310454104551045610457104581045910460104611046210463104641046510466104671046810469104701047110472104731047410475104761047710478104791048010481104821048310484104851048610487104881048910490104911049210493104941049510496104971049810499105001050110502105031050410505105061050710508105091051010511105121051310514105151051610517105181051910520105211052210523105241052510526105271052810529105301053110532105331053410535105361053710538105391054010541105421054310544105451054610547105481054910550105511055210553105541055510556105571055810559105601056110562105631056410565105661056710568105691057010571105721057310574105751057610577105781057910580105811058210583105841058510586105871058810589105901059110592105931059410595105961059710598105991060010601106021060310604106051060610607106081060910610106111061210613106141061510616106171061810619106201062110622106231062410625106261062710628106291063010631106321063310634106351063610637106381063910640106411064210643106441064510646106471064810649106501065110652106531065410655106561065710658106591066010661106621066310664106651066610667106681066910670106711067210673106741067510676106771067810679106801068110682106831068410685106861068710688106891069010691106921069310694106951069610697106981069910700107011070210703107041070510706107071070810709107101071110712107131071410715107161071710718107191072010721107221072310724107251072610727107281072910730107311073210733107341073510736107371073810739107401074110742107431074410745107461074710748107491075010751107521075310754107551075610757107581075910760107611076210763107641076510766107671076810769107701077110772107731077410775107761077710778107791078010781107821078310784107851078610787107881078910790107911079210793107941079510796107971079810799108001080110802108031080410805108061080710808108091081010811108121081310814108151081610817108181081910820108211082210823108241082510826108271082810829108301083110832108331083410835108361083710838108391084010841108421084310844108451084610847108481084910850108511085210853108541085510856108571085810859108601086110862108631086410865108661086710868108691087010871108721087310874108751087610877108781087910880108811088210883108841088510886108871088810889108901089110892108931089410895108961089710898108991090010901109021090310904109051090610907109081090910910109111091210913109141091510916109171091810919109201092110922109231092410925109261092710928109291093010931109321093310934109351093610937109381093910940109411094210943109441094510946109471094810949109501095110952109531095410955109561095710958109591096010961109621096310964109651096610967109681096910970109711097210973109741097510976109771097810979109801098110982109831098410985109861098710988109891099010991109921099310994109951099610997109981099911000110011100211003110041100511006110071100811009110101101111012110131101411015110161101711018110191102011021110221102311024110251102611027110281102911030110311103211033110341103511036110371103811039110401104111042110431104411045110461104711048110491105011051110521105311054110551105611057110581105911060110611106211063110641106511066110671106811069110701107111072110731107411075110761107711078110791108011081110821108311084110851108611087110881108911090110911109211093110941109511096110971109811099111001110111102111031110411105111061110711108111091111011111111121111311114111151111611117111181111911120111211112211123111241112511126111271112811129111301113111132111331113411135111361113711138111391114011141111421114311144111451114611147111481114911150111511115211153111541115511156111571115811159111601116111162111631116411165111661116711168111691117011171111721117311174111751117611177111781117911180111811118211183111841118511186111871118811189111901119111192111931119411195111961119711198111991120011201112021120311204112051120611207112081120911210112111121211213112141121511216112171121811219112201122111222112231122411225112261122711228112291123011231112321123311234112351123611237112381123911240112411124211243112441124511246112471124811249112501125111252112531125411255112561125711258112591126011261112621126311264112651126611267112681126911270112711127211273112741127511276112771127811279112801128111282112831128411285112861128711288112891129011291112921129311294112951129611297112981129911300113011130211303113041130511306113071130811309113101131111312113131131411315113161131711318113191132011321113221132311324113251132611327113281132911330113311133211333113341133511336113371133811339113401134111342113431134411345113461134711348113491135011351113521135311354113551135611357113581135911360113611136211363113641136511366113671136811369113701137111372113731137411375113761137711378113791138011381113821138311384113851138611387113881138911390113911139211393113941139511396113971139811399114001140111402114031140411405114061140711408114091141011411114121141311414114151141611417114181141911420114211142211423114241142511426114271142811429114301143111432114331143411435114361143711438114391144011441114421144311444114451144611447114481144911450114511145211453114541145511456114571145811459114601146111462114631146411465114661146711468114691147011471114721147311474114751147611477114781147911480114811148211483114841148511486114871148811489114901149111492114931149411495114961149711498114991150011501115021150311504115051150611507115081150911510115111151211513115141151511516115171151811519115201152111522115231152411525115261152711528115291153011531115321153311534115351153611537115381153911540115411154211543115441154511546115471154811549115501155111552115531155411555115561155711558115591156011561115621156311564115651156611567115681156911570115711157211573115741157511576115771157811579115801158111582115831158411585115861158711588115891159011591115921159311594115951159611597115981159911600116011160211603116041160511606116071160811609116101161111612116131161411615116161161711618116191162011621116221162311624116251162611627116281162911630116311163211633116341163511636116371163811639116401164111642116431164411645116461164711648116491165011651116521165311654116551165611657116581165911660116611166211663116641166511666116671166811669116701167111672116731167411675116761167711678116791168011681116821168311684116851168611687116881168911690116911169211693116941169511696116971169811699117001170111702117031170411705117061170711708117091171011711117121171311714117151171611717117181171911720117211172211723117241172511726117271172811729117301173111732117331173411735117361173711738117391174011741117421174311744117451174611747117481174911750117511175211753117541175511756117571175811759117601176111762117631176411765117661176711768117691177011771117721177311774117751177611777117781177911780117811178211783117841178511786117871178811789117901179111792117931179411795117961179711798117991180011801118021180311804118051180611807118081180911810118111181211813118141181511816118171181811819118201182111822118231182411825118261182711828118291183011831118321183311834118351183611837118381183911840118411184211843118441184511846118471184811849118501185111852118531185411855118561185711858118591186011861118621186311864118651186611867118681186911870118711187211873118741187511876118771187811879118801188111882118831188411885118861188711888118891189011891118921189311894118951189611897118981189911900119011190211903119041190511906119071190811909119101191111912119131191411915119161191711918119191192011921119221192311924119251192611927119281192911930119311193211933119341193511936119371193811939119401194111942119431194411945119461194711948119491195011951119521195311954119551195611957119581195911960119611196211963119641196511966119671196811969119701197111972119731197411975119761197711978119791198011981119821198311984119851198611987119881198911990119911199211993119941199511996119971199811999120001200112002120031200412005120061200712008120091201012011120121201312014120151201612017120181201912020120211202212023120241202512026120271202812029120301203112032120331203412035120361203712038120391204012041120421204312044120451204612047120481204912050120511205212053120541205512056120571205812059120601206112062120631206412065120661206712068120691207012071120721207312074120751207612077120781207912080120811208212083120841208512086120871208812089120901209112092120931209412095120961209712098120991210012101121021210312104121051210612107121081210912110121111211212113121141211512116121171211812119121201212112122121231212412125121261212712128121291213012131121321213312134121351213612137121381213912140121411214212143121441214512146121471214812149121501215112152121531215412155121561215712158121591216012161121621216312164121651216612167121681216912170121711217212173121741217512176121771217812179121801218112182121831218412185121861218712188121891219012191121921219312194121951219612197121981219912200122011220212203122041220512206122071220812209122101221112212122131221412215122161221712218122191222012221122221222312224122251222612227122281222912230122311223212233122341223512236122371223812239122401224112242122431224412245122461224712248122491225012251122521225312254122551225612257122581225912260122611226212263122641226512266122671226812269122701227112272122731227412275122761227712278122791228012281122821228312284122851228612287122881228912290122911229212293122941229512296122971229812299123001230112302123031230412305123061230712308123091231012311123121231312314123151231612317123181231912320123211232212323123241232512326123271232812329123301233112332123331233412335123361233712338123391234012341123421234312344123451234612347123481234912350123511235212353123541235512356123571235812359123601236112362123631236412365123661236712368123691237012371123721237312374123751237612377123781237912380123811238212383123841238512386123871238812389123901239112392123931239412395123961239712398123991240012401124021240312404124051240612407124081240912410124111241212413124141241512416124171241812419124201242112422124231242412425124261242712428124291243012431124321243312434124351243612437124381243912440124411244212443124441244512446124471244812449124501245112452124531245412455124561245712458124591246012461124621246312464124651246612467124681246912470124711247212473124741247512476124771247812479124801248112482124831248412485124861248712488124891249012491124921249312494124951249612497124981249912500125011250212503125041250512506125071250812509125101251112512125131251412515125161251712518125191252012521125221252312524125251252612527125281252912530125311253212533125341253512536125371253812539125401254112542125431254412545125461254712548125491255012551125521255312554125551255612557125581255912560125611256212563125641256512566125671256812569125701257112572125731257412575125761257712578125791258012581125821258312584125851258612587125881258912590125911259212593125941259512596125971259812599126001260112602126031260412605126061260712608126091261012611126121261312614126151261612617126181261912620126211262212623126241262512626126271262812629126301263112632126331263412635126361263712638126391264012641126421264312644126451264612647126481264912650126511265212653126541265512656126571265812659126601266112662126631266412665126661266712668126691267012671126721267312674126751267612677126781267912680126811268212683126841268512686126871268812689126901269112692126931269412695126961269712698126991270012701127021270312704127051270612707127081270912710127111271212713127141271512716127171271812719127201272112722127231272412725127261272712728127291273012731127321273312734127351273612737127381273912740127411274212743127441274512746127471274812749127501275112752127531275412755127561275712758127591276012761127621276312764127651276612767127681276912770127711277212773127741277512776127771277812779127801278112782127831278412785127861278712788127891279012791127921279312794127951279612797127981279912800128011280212803128041280512806128071280812809128101281112812128131281412815128161281712818128191282012821128221282312824128251282612827128281282912830128311283212833128341283512836128371283812839128401284112842128431284412845128461284712848128491285012851128521285312854128551285612857128581285912860128611286212863128641286512866128671286812869128701287112872128731287412875128761287712878128791288012881128821288312884128851288612887128881288912890128911289212893128941289512896128971289812899129001290112902129031290412905129061290712908129091291012911129121291312914129151291612917129181291912920129211292212923129241292512926129271292812929129301293112932129331293412935129361293712938129391294012941129421294312944129451294612947129481294912950129511295212953129541295512956129571295812959129601296112962129631296412965129661296712968129691297012971129721297312974129751297612977129781297912980129811298212983129841298512986129871298812989129901299112992129931299412995129961299712998129991300013001130021300313004130051300613007130081300913010130111301213013130141301513016130171301813019130201302113022130231302413025130261302713028130291303013031130321303313034130351303613037130381303913040130411304213043130441304513046130471304813049130501305113052130531305413055130561305713058130591306013061130621306313064130651306613067130681306913070130711307213073130741307513076130771307813079130801308113082130831308413085130861308713088130891309013091130921309313094130951309613097130981309913100131011310213103131041310513106131071310813109131101311113112131131311413115131161311713118131191312013121131221312313124131251312613127131281312913130131311313213133131341313513136131371313813139131401314113142131431314413145131461314713148131491315013151131521315313154131551315613157131581315913160131611316213163131641316513166131671316813169131701317113172131731317413175131761317713178131791318013181131821318313184131851318613187131881318913190131911319213193131941319513196131971319813199132001320113202132031320413205132061320713208132091321013211132121321313214132151321613217132181321913220132211322213223132241322513226132271322813229132301323113232132331323413235132361323713238132391324013241132421324313244132451324613247132481324913250132511325213253132541325513256132571325813259132601326113262132631326413265132661326713268132691327013271132721327313274132751327613277132781327913280132811328213283132841328513286132871328813289132901329113292132931329413295132961329713298132991330013301133021330313304133051330613307133081330913310133111331213313133141331513316133171331813319133201332113322133231332413325133261332713328133291333013331133321333313334133351333613337133381333913340133411334213343133441334513346133471334813349133501335113352133531335413355133561335713358133591336013361133621336313364133651336613367133681336913370133711337213373133741337513376133771337813379133801338113382133831338413385133861338713388133891339013391133921339313394133951339613397133981339913400134011340213403134041340513406134071340813409134101341113412134131341413415134161341713418134191342013421134221342313424134251342613427134281342913430134311343213433134341343513436134371343813439134401344113442134431344413445134461344713448134491345013451134521345313454134551345613457134581345913460134611346213463134641346513466134671346813469134701347113472134731347413475134761347713478134791348013481134821348313484134851348613487134881348913490134911349213493134941349513496134971349813499135001350113502135031350413505135061350713508135091351013511135121351313514135151351613517135181351913520135211352213523135241352513526135271352813529135301353113532135331353413535135361353713538135391354013541135421354313544135451354613547135481354913550135511355213553135541355513556135571355813559135601356113562135631356413565135661356713568135691357013571135721357313574135751357613577135781357913580135811358213583135841358513586135871358813589135901359113592135931359413595135961359713598135991360013601136021360313604136051360613607136081360913610136111361213613136141361513616136171361813619136201362113622136231362413625136261362713628136291363013631136321363313634136351363613637136381363913640136411364213643136441364513646136471364813649136501365113652136531365413655136561365713658136591366013661136621366313664136651366613667136681366913670136711367213673136741367513676136771367813679136801368113682136831368413685136861368713688136891369013691136921369313694136951369613697136981369913700137011370213703137041370513706137071370813709137101371113712137131371413715137161371713718137191372013721137221372313724137251372613727137281372913730137311373213733137341373513736137371373813739137401374113742137431374413745137461374713748137491375013751137521375313754137551375613757137581375913760137611376213763137641376513766137671376813769137701377113772137731377413775137761377713778137791378013781137821378313784137851378613787137881378913790137911379213793137941379513796137971379813799138001380113802138031380413805138061380713808138091381013811138121381313814138151381613817138181381913820138211382213823138241382513826138271382813829138301383113832138331383413835138361383713838138391384013841138421384313844138451384613847138481384913850138511385213853138541385513856138571385813859138601386113862138631386413865138661386713868138691387013871138721387313874138751387613877138781387913880138811388213883138841388513886138871388813889138901389113892138931389413895138961389713898138991390013901139021390313904139051390613907139081390913910139111391213913139141391513916139171391813919139201392113922139231392413925139261392713928139291393013931139321393313934139351393613937139381393913940139411394213943139441394513946139471394813949139501395113952139531395413955139561395713958139591396013961139621396313964139651396613967139681396913970139711397213973139741397513976139771397813979139801398113982139831398413985139861398713988139891399013991139921399313994139951399613997139981399914000140011400214003140041400514006140071400814009140101401114012140131401414015140161401714018140191402014021140221402314024140251402614027140281402914030140311403214033140341403514036140371403814039140401404114042140431404414045140461404714048140491405014051140521405314054140551405614057140581405914060140611406214063140641406514066140671406814069140701407114072140731407414075140761407714078140791408014081140821408314084140851408614087140881408914090140911409214093140941409514096140971409814099141001410114102141031410414105141061410714108141091411014111141121411314114141151411614117141181411914120141211412214123141241412514126141271412814129141301413114132141331413414135141361413714138141391414014141141421414314144141451414614147141481414914150141511415214153141541415514156141571415814159141601416114162141631416414165141661416714168141691417014171141721417314174141751417614177141781417914180141811418214183
  1. 'use strict';
  2. var fs = require('fs-extra');
  3. var path = require('path');
  4. var tsMorph = require('ts-morph');
  5. var LiveServer = require('@compodoc/live-server');
  6. var _ = require('lodash');
  7. var ts = require('typescript');
  8. var semver = require('semver');
  9. var i18next = require('i18next');
  10. var JSON5 = require('json5');
  11. var htmlEntities = require('html-entities');
  12. var cheerio = require('cheerio');
  13. var uuid = require('uuid');
  14. var cosmiconfig = require('cosmiconfig');
  15. function _interopNamespaceDefault(e) {
  16. var n = Object.create(null);
  17. if (e) {
  18. Object.keys(e).forEach(function (k) {
  19. if (k !== 'default') {
  20. var d = Object.getOwnPropertyDescriptor(e, k);
  21. Object.defineProperty(n, k, d.get ? d : {
  22. enumerable: true,
  23. get: function () { return e[k]; }
  24. });
  25. }
  26. });
  27. }
  28. n.default = e;
  29. return Object.freeze(n);
  30. }
  31. var fs__namespace = /*#__PURE__*/_interopNamespaceDefault(fs);
  32. var path__namespace = /*#__PURE__*/_interopNamespaceDefault(path);
  33. var LiveServer__namespace = /*#__PURE__*/_interopNamespaceDefault(LiveServer);
  34. var ___namespace = /*#__PURE__*/_interopNamespaceDefault(_);
  35. var ts__namespace = /*#__PURE__*/_interopNamespaceDefault(ts);
  36. var semver__namespace = /*#__PURE__*/_interopNamespaceDefault(semver);
  37. var JSON5__namespace = /*#__PURE__*/_interopNamespaceDefault(JSON5);
  38. var cheerio__namespace = /*#__PURE__*/_interopNamespaceDefault(cheerio);
  39. /******************************************************************************
  40. Copyright (c) Microsoft Corporation.
  41. Permission to use, copy, modify, and/or distribute this software for any
  42. purpose with or without fee is hereby granted.
  43. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
  44. REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
  45. AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
  46. INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  47. LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
  48. OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
  49. PERFORMANCE OF THIS SOFTWARE.
  50. ***************************************************************************** */
  51. /* global Reflect, Promise, SuppressedError, Symbol, Iterator */
  52. var extendStatics = function(d, b) {
  53. extendStatics = Object.setPrototypeOf ||
  54. ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
  55. function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
  56. return extendStatics(d, b);
  57. };
  58. function __extends(d, b) {
  59. if (typeof b !== "function" && b !== null)
  60. throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
  61. extendStatics(d, b);
  62. function __() { this.constructor = d; }
  63. d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
  64. }
  65. var __assign = function() {
  66. __assign = Object.assign || function __assign(t) {
  67. for (var s, i = 1, n = arguments.length; i < n; i++) {
  68. s = arguments[i];
  69. for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
  70. }
  71. return t;
  72. };
  73. return __assign.apply(this, arguments);
  74. };
  75. function __values(o) {
  76. var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
  77. if (m) return m.call(o);
  78. if (o && typeof o.length === "number") return {
  79. next: function () {
  80. if (o && i >= o.length) o = void 0;
  81. return { value: o && o[i++], done: !o };
  82. }
  83. };
  84. throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
  85. }
  86. function __read(o, n) {
  87. var m = typeof Symbol === "function" && o[Symbol.iterator];
  88. if (!m) return o;
  89. var i = m.call(o), r, ar = [], e;
  90. try {
  91. while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
  92. }
  93. catch (error) { e = { error: error }; }
  94. finally {
  95. try {
  96. if (r && !r.done && (m = i["return"])) m.call(i);
  97. }
  98. finally { if (e) throw e.error; }
  99. }
  100. return ar;
  101. }
  102. function __spreadArray(to, from, pack) {
  103. if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
  104. if (ar || !(i in from)) {
  105. if (!ar) ar = Array.prototype.slice.call(from, 0, i);
  106. ar[i] = from[i];
  107. }
  108. }
  109. return to.concat(ar || Array.prototype.slice.call(from));
  110. }
  111. typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
  112. var e = new Error(message);
  113. return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
  114. };
  115. var log = require('fancy-log');
  116. var c = require('picocolors');
  117. var LEVEL;
  118. (function (LEVEL) {
  119. LEVEL[LEVEL["INFO"] = 0] = "INFO";
  120. LEVEL[LEVEL["DEBUG"] = 1] = "DEBUG";
  121. LEVEL[LEVEL["ERROR"] = 2] = "ERROR";
  122. LEVEL[LEVEL["WARN"] = 3] = "WARN";
  123. })(LEVEL || (LEVEL = {}));
  124. var Logger = /** @class */ (function () {
  125. function Logger() {
  126. this.logger = log;
  127. this.silent = true;
  128. }
  129. Logger.prototype.info = function () {
  130. var args = [];
  131. for (var _i = 0; _i < arguments.length; _i++) {
  132. args[_i] = arguments[_i];
  133. }
  134. if (!this.silent) {
  135. return;
  136. }
  137. this.logger(this.format.apply(this, __spreadArray([LEVEL.INFO], __read(args), false)));
  138. };
  139. Logger.prototype.error = function () {
  140. var args = [];
  141. for (var _i = 0; _i < arguments.length; _i++) {
  142. args[_i] = arguments[_i];
  143. }
  144. this.logger(this.format.apply(this, __spreadArray([LEVEL.ERROR], __read(args), false)));
  145. };
  146. Logger.prototype.warn = function () {
  147. var args = [];
  148. for (var _i = 0; _i < arguments.length; _i++) {
  149. args[_i] = arguments[_i];
  150. }
  151. if (!this.silent) {
  152. return;
  153. }
  154. this.logger(this.format.apply(this, __spreadArray([LEVEL.WARN], __read(args), false)));
  155. };
  156. Logger.prototype.debug = function () {
  157. var args = [];
  158. for (var _i = 0; _i < arguments.length; _i++) {
  159. args[_i] = arguments[_i];
  160. }
  161. if (!this.silent) {
  162. return;
  163. }
  164. this.logger(this.format.apply(this, __spreadArray([LEVEL.DEBUG], __read(args), false)));
  165. };
  166. Logger.prototype.format = function (level) {
  167. var args = [];
  168. for (var _i = 1; _i < arguments.length; _i++) {
  169. args[_i - 1] = arguments[_i];
  170. }
  171. var pad = function (s, l, z) {
  172. return s + Array(Math.max(0, l - s.length + 1)).join(z);
  173. };
  174. var msg = args.join(' ');
  175. if (args.length > 1) {
  176. msg = "".concat(pad(args.shift(), 15, ' '), ": ").concat(args.join(' '));
  177. }
  178. switch (level) {
  179. case LEVEL.INFO:
  180. msg = c.green(msg);
  181. break;
  182. case LEVEL.DEBUG:
  183. msg = c.cyan(msg);
  184. break;
  185. case LEVEL.WARN:
  186. msg = c.yellow(msg);
  187. break;
  188. case LEVEL.ERROR:
  189. msg = c.red(msg);
  190. break;
  191. }
  192. return [msg].join('');
  193. };
  194. return Logger;
  195. }());
  196. var logger = new Logger();
  197. var COMPODOC_DEFAULTS = {
  198. title: 'Application documentation',
  199. additionalEntryName: 'Additional documentation',
  200. additionalEntryPath: 'additional-documentation',
  201. folder: './documentation/',
  202. hostname: '127.0.0.1',
  203. port: 8080,
  204. theme: 'gitbook',
  205. exportFormat: 'html',
  206. exportFormatsSupported: ['html', 'json'],
  207. base: '/',
  208. defaultCoverageThreshold: 70,
  209. defaultCoverageMinimumPerFile: 0,
  210. coverageTestThresholdFail: true,
  211. toggleMenuItems: ['all'],
  212. navTabConfig: [],
  213. disableSourceCode: false,
  214. disableDomTree: false,
  215. disableTemplateTab: false,
  216. disableStyleTab: false,
  217. disableGraph: false,
  218. disableMainGraph: false,
  219. disableCoverage: false,
  220. disablePrivate: false,
  221. disableProtected: false,
  222. disableInternal: false,
  223. disableLifeCycleHooks: false,
  224. disableConstructors: false,
  225. disableRoutesGraph: false,
  226. disableDependencies: false,
  227. disableProperties: false,
  228. PAGE_TYPES: {
  229. ROOT: 'root',
  230. INTERNAL: 'internal'
  231. },
  232. gaSite: 'auto',
  233. coverageTestShowOnlyFailed: false,
  234. language: 'en-US',
  235. maxSearchResults: 15
  236. };
  237. var Configuration = /** @class */ (function () {
  238. function Configuration() {
  239. this._pages = [];
  240. this._mainData = {
  241. output: COMPODOC_DEFAULTS.folder,
  242. theme: COMPODOC_DEFAULTS.theme,
  243. extTheme: '',
  244. serve: false,
  245. hostname: COMPODOC_DEFAULTS.hostname,
  246. host: '',
  247. port: COMPODOC_DEFAULTS.port,
  248. open: false,
  249. assetsFolder: '',
  250. documentationMainName: COMPODOC_DEFAULTS.title,
  251. documentationMainDescription: '',
  252. base: COMPODOC_DEFAULTS.base,
  253. hideGenerator: false,
  254. hideDarkModeToggle: false,
  255. hasFilesToCoverage: false,
  256. modules: [],
  257. readme: false,
  258. changelog: '',
  259. contributing: '',
  260. license: '',
  261. todo: '',
  262. markdowns: [],
  263. additionalPages: [],
  264. pipes: [],
  265. classes: [],
  266. interfaces: [],
  267. components: [],
  268. controllers: [],
  269. entities: [],
  270. directives: [],
  271. injectables: [],
  272. interceptors: [],
  273. guards: [],
  274. miscellaneous: [],
  275. routes: [],
  276. tsconfig: '',
  277. toggleMenuItems: COMPODOC_DEFAULTS.toggleMenuItems,
  278. navTabConfig: [],
  279. templates: '',
  280. includes: '',
  281. includesName: COMPODOC_DEFAULTS.additionalEntryName,
  282. includesFolder: COMPODOC_DEFAULTS.additionalEntryPath,
  283. disableSourceCode: COMPODOC_DEFAULTS.disableSourceCode,
  284. disableDomTree: COMPODOC_DEFAULTS.disableDomTree,
  285. disableTemplateTab: COMPODOC_DEFAULTS.disableTemplateTab,
  286. disableStyleTab: COMPODOC_DEFAULTS.disableStyleTab,
  287. disableGraph: COMPODOC_DEFAULTS.disableGraph,
  288. disableMainGraph: COMPODOC_DEFAULTS.disableMainGraph,
  289. disableCoverage: COMPODOC_DEFAULTS.disableCoverage,
  290. disablePrivate: COMPODOC_DEFAULTS.disablePrivate,
  291. disableInternal: COMPODOC_DEFAULTS.disableInternal,
  292. disableProtected: COMPODOC_DEFAULTS.disableProtected,
  293. disableLifeCycleHooks: COMPODOC_DEFAULTS.disableLifeCycleHooks,
  294. disableConstructors: COMPODOC_DEFAULTS.disableConstructors,
  295. disableRoutesGraph: COMPODOC_DEFAULTS.disableRoutesGraph,
  296. disableSearch: false,
  297. disableDependencies: COMPODOC_DEFAULTS.disableDependencies,
  298. disableProperties: COMPODOC_DEFAULTS.disableProperties,
  299. watch: false,
  300. mainGraph: '',
  301. coverageTest: false,
  302. coverageTestThreshold: COMPODOC_DEFAULTS.defaultCoverageThreshold,
  303. coverageTestThresholdFail: COMPODOC_DEFAULTS.coverageTestThresholdFail,
  304. coverageTestPerFile: false,
  305. coverageMinimumPerFile: COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile,
  306. unitTestCoverage: '',
  307. unitTestData: undefined,
  308. coverageTestShowOnlyFailed: COMPODOC_DEFAULTS.coverageTestShowOnlyFailed,
  309. routesLength: 0,
  310. angularVersion: '',
  311. exportFormat: COMPODOC_DEFAULTS.exportFormat,
  312. coverageData: {},
  313. customFavicon: '',
  314. customLogo: '',
  315. packageDependencies: [],
  316. packagePeerDependencies: [],
  317. packageProperties: {},
  318. gaID: '',
  319. gaSite: '',
  320. angularProject: false,
  321. angularJSProject: false,
  322. language: COMPODOC_DEFAULTS.language,
  323. maxSearchResults: 15
  324. };
  325. }
  326. Configuration.getInstance = function () {
  327. if (!Configuration.instance) {
  328. Configuration.instance = new Configuration();
  329. }
  330. return Configuration.instance;
  331. };
  332. Configuration.prototype.addPage = function (page) {
  333. var indexPage = ___namespace.findIndex(this._pages, { name: page.name });
  334. if (indexPage === -1) {
  335. this._pages.push(page);
  336. }
  337. };
  338. Configuration.prototype.hasPage = function (name) {
  339. var indexPage = ___namespace.findIndex(this._pages, { name: name });
  340. return indexPage !== -1;
  341. };
  342. Configuration.prototype.addAdditionalPage = function (page) {
  343. this._mainData.additionalPages.push(page);
  344. };
  345. Configuration.prototype.getAdditionalPageById = function (id) {
  346. return this._mainData.additionalPages.find(function (page) { return page.id === id; });
  347. };
  348. Configuration.prototype.resetPages = function () {
  349. this._pages = [];
  350. };
  351. Configuration.prototype.resetAdditionalPages = function () {
  352. this._mainData.additionalPages = [];
  353. };
  354. Configuration.prototype.resetRootMarkdownPages = function () {
  355. var indexPage = ___namespace.findIndex(this._pages, { name: 'index' });
  356. this._pages.splice(indexPage, 1);
  357. indexPage = ___namespace.findIndex(this._pages, { name: 'changelog' });
  358. this._pages.splice(indexPage, 1);
  359. indexPage = ___namespace.findIndex(this._pages, { name: 'contributing' });
  360. this._pages.splice(indexPage, 1);
  361. indexPage = ___namespace.findIndex(this._pages, { name: 'license' });
  362. this._pages.splice(indexPage, 1);
  363. indexPage = ___namespace.findIndex(this._pages, { name: 'todo' });
  364. this._pages.splice(indexPage, 1);
  365. this._mainData.markdowns = [];
  366. };
  367. Object.defineProperty(Configuration.prototype, "pages", {
  368. get: function () {
  369. return this._pages;
  370. },
  371. set: function (pages) {
  372. this._pages = [];
  373. },
  374. enumerable: false,
  375. configurable: true
  376. });
  377. Object.defineProperty(Configuration.prototype, "markDownPages", {
  378. get: function () {
  379. return this._pages.filter(function (page) { return page.markdown; });
  380. },
  381. enumerable: false,
  382. configurable: true
  383. });
  384. Object.defineProperty(Configuration.prototype, "mainData", {
  385. get: function () {
  386. return this._mainData;
  387. },
  388. set: function (data) {
  389. Object.assign(this._mainData, data);
  390. },
  391. enumerable: false,
  392. configurable: true
  393. });
  394. return Configuration;
  395. }());
  396. var Configuration$1 = Configuration.getInstance();
  397. var AngularAPIs = require('../src/data/api-list.json');
  398. var AngularApiUtil = /** @class */ (function () {
  399. function AngularApiUtil() {
  400. }
  401. AngularApiUtil.getInstance = function () {
  402. if (!AngularApiUtil.instance) {
  403. AngularApiUtil.instance = new AngularApiUtil();
  404. }
  405. return AngularApiUtil.instance;
  406. };
  407. AngularApiUtil.prototype.findApi = function (type) {
  408. var foundedApi;
  409. ___namespace.forEach(AngularAPIs, function (mainApi) {
  410. ___namespace.forEach(mainApi.items, function (api) {
  411. if (api.title === type) {
  412. foundedApi = api;
  413. }
  414. });
  415. });
  416. return {
  417. source: 'external',
  418. data: foundedApi
  419. };
  420. };
  421. return AngularApiUtil;
  422. }());
  423. var AngularApiUtil$1 = AngularApiUtil.getInstance();
  424. function extractLeadingText(string, completeTag) {
  425. var tagIndex = string.indexOf(completeTag);
  426. var leadingText = undefined;
  427. var leadingTextRegExp = /\[(.+?)\]/g;
  428. var leadingTextInfo = leadingTextRegExp.exec(string);
  429. // did we find leading text, and if so, does it immediately precede the tag?
  430. while (leadingTextInfo && leadingTextInfo.length) {
  431. if (leadingTextInfo.index + leadingTextInfo[0].length === tagIndex) {
  432. string = string.replace(leadingTextInfo[0], '');
  433. leadingText = leadingTextInfo[1];
  434. break;
  435. }
  436. leadingTextInfo = leadingTextRegExp.exec(string);
  437. }
  438. return {
  439. leadingText: leadingText,
  440. string: string
  441. };
  442. }
  443. function splitLinkText(text) {
  444. var linkText;
  445. var target;
  446. var splitIndex;
  447. // if a pipe is not present, we split on the first space
  448. splitIndex = text.indexOf('|');
  449. if (splitIndex === -1) {
  450. splitIndex = text.search(/\s/);
  451. }
  452. if (splitIndex !== -1) {
  453. linkText = text.substr(splitIndex + 1);
  454. // Normalize subsequent newlines to a single space.
  455. linkText = linkText.replace(/\n+/, ' ');
  456. target = text.substr(0, splitIndex);
  457. }
  458. return {
  459. linkText: linkText,
  460. target: target || text
  461. };
  462. }
  463. var LinkParser = (function () {
  464. var processTheLink = function (string, tagInfo, leadingText) {
  465. var leading = extractLeadingText(string, tagInfo.completeTag), linkText, split, target, stringtoReplace;
  466. linkText = leadingText ? leadingText : leading.leadingText || '';
  467. split = splitLinkText(tagInfo.text);
  468. target = split.target;
  469. if (leading.leadingText !== undefined) {
  470. stringtoReplace = '[' + leading.leadingText + ']' + tagInfo.completeTag;
  471. }
  472. else if (typeof split.linkText !== 'undefined') {
  473. stringtoReplace = tagInfo.completeTag;
  474. linkText = split.linkText;
  475. }
  476. if (linkText === '' || linkText == null || target == null) {
  477. return string;
  478. }
  479. return string.replace(stringtoReplace, '[' + linkText + '](' + target + ')');
  480. };
  481. /**
  482. * Convert
  483. * {@link http://www.google.com|Google} or {@link https://github.com GitHub} or [Github]{@link https://github.com} to [Github](https://github.com)
  484. */
  485. var replaceLinkTag = function (str) {
  486. if (typeof str === 'undefined') {
  487. return {
  488. newString: ''
  489. };
  490. }
  491. // new RegExp('\\[((?:.|\n)+?)]\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TO DO]{@link Todo} fo') -> "[TO DO]{@link Todo}", "TO DO", "Todo"
  492. // new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i').exec('ee [TODO]{@link Todo} fo') -> "{@link Todo}", "Todo"
  493. var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i'), tagRegExp, matches, previousString;
  494. tagRegExp = str.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
  495. function replaceMatch(replacer, tag, match, text, linkText) {
  496. var matchedTag = {
  497. completeTag: match,
  498. tag: tag,
  499. text: text
  500. };
  501. if (linkText) {
  502. return replacer(str, matchedTag, linkText);
  503. }
  504. else {
  505. return replacer(str, matchedTag);
  506. }
  507. }
  508. do {
  509. matches = tagRegExp.exec(str);
  510. if (matches) {
  511. previousString = str;
  512. if (matches.length === 2) {
  513. str = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
  514. }
  515. if (matches.length === 3) {
  516. str = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
  517. }
  518. }
  519. } while (matches && previousString !== str);
  520. return {
  521. newString: str
  522. };
  523. };
  524. var _resolveLinks = function (str) {
  525. return replaceLinkTag(str).newString;
  526. };
  527. return {
  528. resolveLinks: _resolveLinks
  529. };
  530. })();
  531. var AngularLifecycleHooks;
  532. (function (AngularLifecycleHooks) {
  533. AngularLifecycleHooks[AngularLifecycleHooks["ngOnChanges"] = 0] = "ngOnChanges";
  534. AngularLifecycleHooks[AngularLifecycleHooks["ngOnInit"] = 1] = "ngOnInit";
  535. AngularLifecycleHooks[AngularLifecycleHooks["ngDoCheck"] = 2] = "ngDoCheck";
  536. AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentInit"] = 3] = "ngAfterContentInit";
  537. AngularLifecycleHooks[AngularLifecycleHooks["ngAfterContentChecked"] = 4] = "ngAfterContentChecked";
  538. AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewInit"] = 5] = "ngAfterViewInit";
  539. AngularLifecycleHooks[AngularLifecycleHooks["ngAfterViewChecked"] = 6] = "ngAfterViewChecked";
  540. AngularLifecycleHooks[AngularLifecycleHooks["ngOnDestroy"] = 7] = "ngOnDestroy";
  541. })(AngularLifecycleHooks || (AngularLifecycleHooks = {}));
  542. var KindType;
  543. (function (KindType) {
  544. KindType["UNKNOWN"] = "";
  545. KindType["STRING"] = "string";
  546. KindType["NUMBER"] = "number";
  547. KindType["ARRAY"] = "[]";
  548. KindType["VOID"] = "void";
  549. KindType["FUNCTION"] = "function";
  550. KindType["TEMPLATE_LITERAL"] = "template literal type";
  551. KindType["LITERAL"] = "literal type";
  552. KindType["BOOLEAN"] = "boolean";
  553. KindType["ANY"] = "any";
  554. KindType["NULL"] = "null";
  555. KindType["SYMBOL"] = "symbol";
  556. KindType["NEVER"] = "never";
  557. KindType["UNDEFINED"] = "undefined";
  558. KindType["OBJECT"] = "object";
  559. })(KindType || (KindType = {}));
  560. var IsKindType = {
  561. ANY: function (kind) {
  562. return kindToType(kind) === KindType.ANY;
  563. },
  564. ARRAY: function (kind) {
  565. return kindToType(kind) === KindType.ARRAY;
  566. },
  567. BOOLEAN: function (kind) {
  568. return kindToType(kind) === KindType.BOOLEAN;
  569. },
  570. FUNCTION: function (kind) {
  571. return kindToType(kind) === KindType.FUNCTION;
  572. },
  573. LITERAL: function (kind) {
  574. return kindToType(kind) === KindType.LITERAL;
  575. },
  576. NEVER: function (kind) {
  577. return kindToType(kind) === KindType.NEVER;
  578. },
  579. NULL: function (kind) {
  580. return kindToType(kind) === KindType.NULL;
  581. },
  582. NUMBER: function (kind) {
  583. return kindToType(kind) === KindType.NUMBER;
  584. },
  585. OBJECT: function (kind) {
  586. return kindToType(kind) === KindType.OBJECT;
  587. },
  588. STRING: function (kind) {
  589. return kindToType(kind) === KindType.STRING;
  590. },
  591. SYMBOL: function (kind) {
  592. return kindToType(kind) === KindType.SYMBOL;
  593. },
  594. TEMPLATE_LITERAL: function (kind) {
  595. return kindToType(kind) === KindType.TEMPLATE_LITERAL;
  596. },
  597. UNDEFINED: function (kind) {
  598. return kindToType(kind) === KindType.UNDEFINED;
  599. },
  600. UNKNOWN: function (kind) {
  601. return kindToType(kind) === KindType.UNKNOWN;
  602. },
  603. VOID: function (kind) {
  604. return kindToType(kind) === KindType.VOID;
  605. }
  606. };
  607. function kindToType(kind) {
  608. var _type = KindType.UNKNOWN;
  609. switch (kind) {
  610. case tsMorph.SyntaxKind.StringKeyword:
  611. case tsMorph.SyntaxKind.StringLiteral:
  612. _type = KindType.STRING;
  613. break;
  614. case tsMorph.SyntaxKind.NumberKeyword:
  615. case tsMorph.SyntaxKind.NumericLiteral:
  616. _type = KindType.NUMBER;
  617. break;
  618. case tsMorph.SyntaxKind.ArrayType:
  619. case tsMorph.SyntaxKind.ArrayLiteralExpression:
  620. _type = KindType.ARRAY;
  621. break;
  622. case tsMorph.SyntaxKind.VoidKeyword:
  623. _type = KindType.VOID;
  624. break;
  625. case tsMorph.SyntaxKind.FunctionType:
  626. _type = KindType.FUNCTION;
  627. break;
  628. case tsMorph.SyntaxKind.TemplateLiteralType:
  629. _type = KindType.TEMPLATE_LITERAL;
  630. break;
  631. case tsMorph.SyntaxKind.TypeLiteral:
  632. _type = KindType.LITERAL;
  633. break;
  634. case tsMorph.SyntaxKind.BooleanKeyword:
  635. _type = KindType.BOOLEAN;
  636. break;
  637. case tsMorph.SyntaxKind.AnyKeyword:
  638. _type = KindType.ANY;
  639. break;
  640. case tsMorph.SyntaxKind.NullKeyword:
  641. _type = KindType.NULL;
  642. break;
  643. case tsMorph.SyntaxKind.SymbolKeyword:
  644. _type = KindType.SYMBOL;
  645. break;
  646. case tsMorph.SyntaxKind.NeverKeyword:
  647. _type = KindType.NEVER;
  648. break;
  649. case tsMorph.SyntaxKind.UndefinedKeyword:
  650. _type = KindType.UNDEFINED;
  651. break;
  652. case tsMorph.SyntaxKind.ObjectKeyword:
  653. case tsMorph.SyntaxKind.ObjectLiteralExpression:
  654. _type = KindType.OBJECT;
  655. break;
  656. }
  657. return _type;
  658. }
  659. var tsany = ts__namespace;
  660. // https://github.com/Microsoft/TypeScript/blob/v2.1.4/src/compiler/utilities.ts#L1423
  661. function getJSDocCommentRanges(node, text) {
  662. return tsany.getJSDocCommentRanges.apply(this, arguments);
  663. }
  664. var JsdocParserUtil = /** @class */ (function () {
  665. function JsdocParserUtil() {
  666. }
  667. JsdocParserUtil.prototype.isVariableLike = function (node) {
  668. if (node) {
  669. switch (node.kind) {
  670. case tsMorph.SyntaxKind.BindingElement:
  671. case tsMorph.SyntaxKind.EnumMember:
  672. case tsMorph.SyntaxKind.Parameter:
  673. case tsMorph.SyntaxKind.PropertyAssignment:
  674. case tsMorph.SyntaxKind.PropertyDeclaration:
  675. case tsMorph.SyntaxKind.PropertySignature:
  676. case tsMorph.SyntaxKind.ShorthandPropertyAssignment:
  677. case tsMorph.SyntaxKind.VariableDeclaration:
  678. return true;
  679. }
  680. }
  681. return false;
  682. };
  683. JsdocParserUtil.prototype.isTopmostModuleDeclaration = function (node) {
  684. if (node.nextContainer && node.nextContainer.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
  685. var next = node.nextContainer;
  686. if (node.name.end + 1 === next.name.pos) {
  687. return false;
  688. }
  689. }
  690. return true;
  691. };
  692. JsdocParserUtil.prototype.getRootModuleDeclaration = function (node) {
  693. while (node.parent && node.parent.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
  694. var parent = node.parent;
  695. if (node.name.pos === parent.name.end + 1) {
  696. node = parent;
  697. }
  698. else {
  699. break;
  700. }
  701. }
  702. return node;
  703. };
  704. JsdocParserUtil.prototype.getMainCommentOfNode = function (node, sourceFile) {
  705. var description = '';
  706. if (node.parent && node.parent.kind === tsMorph.ts.SyntaxKind.VariableDeclarationList) {
  707. node = node.parent.parent;
  708. }
  709. else if (node.kind === tsMorph.ts.SyntaxKind.ModuleDeclaration) {
  710. if (!this.isTopmostModuleDeclaration(node)) {
  711. return null;
  712. }
  713. else {
  714. node = this.getRootModuleDeclaration(node);
  715. }
  716. }
  717. var comments = getJSDocCommentRanges(node, sourceFile.text);
  718. if (comments && comments.length) {
  719. var comment = void 0;
  720. if (node.kind === tsMorph.ts.SyntaxKind.SourceFile) {
  721. if (comments.length === 1) {
  722. return null;
  723. }
  724. comment = comments[0];
  725. }
  726. else {
  727. comment = comments[comments.length - 1];
  728. }
  729. description = sourceFile.text.substring(comment.pos, comment.end);
  730. }
  731. return description;
  732. };
  733. JsdocParserUtil.prototype.parseComment = function (text) {
  734. var comment = '';
  735. var shortText = 0;
  736. function readBareLine(line) {
  737. comment += '\n' + line;
  738. if (line === '' && shortText === 0) ;
  739. else if (line === '' && shortText === 1) {
  740. shortText = 2;
  741. }
  742. else {
  743. if (shortText === 2) {
  744. comment += (comment === '' ? '' : '\n') + line;
  745. }
  746. }
  747. }
  748. var CODE_FENCE = /^\s*```(?!.*```)/;
  749. var inCode = false;
  750. var inExample = false; // first line with @example, end line with empty string or string or */
  751. function readLine(line, index) {
  752. line = line.replace(/^\s*\*? ?/, '');
  753. line = line.replace(/\s*$/, '');
  754. if (CODE_FENCE.test(line)) {
  755. inCode = !inCode;
  756. }
  757. if (line.indexOf('@example') !== -1) {
  758. inExample = true;
  759. line = '```html';
  760. }
  761. if (inExample && line === '') {
  762. inExample = false;
  763. line = '```';
  764. }
  765. if (!inCode) {
  766. var tag = /^@(\S+)/.exec(line);
  767. var SeeTag = /^@see/.exec(line);
  768. if (SeeTag) {
  769. line = line.replace(/^@see/, 'See');
  770. }
  771. if (tag && !SeeTag) {
  772. return;
  773. }
  774. }
  775. readBareLine(line);
  776. }
  777. text = text.replace(/^\s*\/\*+/, '');
  778. text = text.replace(/\*+\/\s*$/, '');
  779. text.split(/\r\n?|\n/).length;
  780. text.split(/\r\n?|\n/).forEach(readLine);
  781. return comment;
  782. };
  783. JsdocParserUtil.prototype.getJSDocTags = function (node, kind) {
  784. var e_1, _a;
  785. var docs = this.getJSDocs(node);
  786. if (docs) {
  787. var result = [];
  788. try {
  789. for (var docs_1 = __values(docs), docs_1_1 = docs_1.next(); !docs_1_1.done; docs_1_1 = docs_1.next()) {
  790. var doc = docs_1_1.value;
  791. if (tsMorph.ts.isJSDocParameterTag(doc)) {
  792. if (doc.kind === kind) {
  793. result.push(doc);
  794. }
  795. }
  796. else if (tsMorph.ts.isJSDoc(doc)) {
  797. result.push.apply(result, __spreadArray([], __read(___namespace.filter(doc.tags, function (tag) { return tag.kind === kind; })), false));
  798. }
  799. else {
  800. throw new Error('Unexpected type');
  801. }
  802. }
  803. }
  804. catch (e_1_1) { e_1 = { error: e_1_1 }; }
  805. finally {
  806. try {
  807. if (docs_1_1 && !docs_1_1.done && (_a = docs_1.return)) _a.call(docs_1);
  808. }
  809. finally { if (e_1) throw e_1.error; }
  810. }
  811. return result;
  812. }
  813. };
  814. JsdocParserUtil.prototype.getJSDocs = function (node) {
  815. // TODO: jsDocCache is internal, see if there's a way around it
  816. var cache = node.jsDocCache;
  817. if (!cache) {
  818. cache = this.getJSDocsWorker(node, []).filter(function (x) { return x; });
  819. node.jsDocCache = cache;
  820. }
  821. return cache;
  822. };
  823. // Try to recognize this pattern when node is initializer
  824. // of variable declaration and JSDoc comments are on containing variable statement.
  825. // /**
  826. // * @param {number} name
  827. // * @returns {number}
  828. // */
  829. // var x = function(name) { return name.length; }
  830. JsdocParserUtil.prototype.getJSDocsWorker = function (node, cache) {
  831. var parent = node.parent;
  832. var isInitializerOfVariableDeclarationInStatement = this.isVariableLike(parent) &&
  833. parent.initializer === node &&
  834. tsMorph.ts.isVariableStatement(parent.parent.parent);
  835. var isVariableOfVariableDeclarationStatement = this.isVariableLike(node) && tsMorph.ts.isVariableStatement(parent.parent);
  836. var variableStatementNode = isInitializerOfVariableDeclarationInStatement
  837. ? parent.parent.parent
  838. : isVariableOfVariableDeclarationStatement
  839. ? parent.parent
  840. : undefined;
  841. if (variableStatementNode) {
  842. cache = this.getJSDocsWorker(variableStatementNode, cache);
  843. }
  844. // Also recognize when the node is the RHS of an assignment expression
  845. var isSourceOfAssignmentExpressionStatement = parent &&
  846. parent.parent &&
  847. tsMorph.ts.isBinaryExpression(parent) &&
  848. parent.operatorToken.kind === tsMorph.SyntaxKind.EqualsToken &&
  849. tsMorph.ts.isExpressionStatement(parent.parent);
  850. if (isSourceOfAssignmentExpressionStatement) {
  851. cache = this.getJSDocsWorker(parent.parent, cache);
  852. }
  853. var isModuleDeclaration = tsMorph.ts.isModuleDeclaration(node) && parent && tsMorph.ts.isModuleDeclaration(parent);
  854. var isPropertyAssignmentExpression = parent && tsMorph.ts.isPropertyAssignment(parent);
  855. if (isModuleDeclaration || isPropertyAssignmentExpression) {
  856. cache = this.getJSDocsWorker(parent, cache);
  857. }
  858. // Pull parameter comments from declaring function as well
  859. if (tsMorph.ts.isParameter(node)) {
  860. cache = ___namespace.concat(cache, this.getJSDocParameterTags(node));
  861. }
  862. if (this.isVariableLike(node) && node.initializer) {
  863. cache = ___namespace.concat(cache, node.initializer.jsDoc);
  864. }
  865. cache = ___namespace.concat(cache, node.jsDoc);
  866. return cache;
  867. };
  868. JsdocParserUtil.prototype.getJSDocParameterTags = function (param) {
  869. var func = param.parent;
  870. var tags = this.getJSDocTags(func, tsMorph.SyntaxKind.JSDocParameterTag);
  871. if (!param.name) {
  872. // this is an anonymous jsdoc param from a `function(type1, type2): type3` specification
  873. var i = func.parameters.indexOf(param);
  874. var paramTags = ___namespace.filter(tags, function (tag) { return tsMorph.ts.isJSDocParameterTag(tag); });
  875. if (paramTags && 0 <= i && i < paramTags.length) {
  876. return [paramTags[i]];
  877. }
  878. }
  879. else if (tsMorph.ts.isIdentifier(param.name)) {
  880. var name_1 = param.name.text;
  881. return ___namespace.filter(tags, function (tag) {
  882. if (tsMorph.ts && tsMorph.ts.isJSDocParameterTag(tag)) {
  883. var t = tag;
  884. if (typeof t.parameterName !== 'undefined') {
  885. return t.parameterName.text === name_1;
  886. }
  887. else if (typeof t.name !== 'undefined') {
  888. if (typeof t.name.escapedText !== 'undefined') {
  889. return t.name.escapedText === name_1;
  890. }
  891. }
  892. }
  893. });
  894. }
  895. else {
  896. // TODO: it's a destructured parameter, so it should look up an "object type" series of multiple lines
  897. // But multi-line object types aren't supported yet either
  898. return undefined;
  899. }
  900. };
  901. JsdocParserUtil.prototype.parseJSDocNode = function (node) {
  902. var rawDescription = '';
  903. if (typeof node.comment === 'string') {
  904. rawDescription += node.comment;
  905. }
  906. else {
  907. if (node.comment) {
  908. var len = node.comment.length;
  909. for (var i = 0; i < len; i++) {
  910. var JSDocNode = node.comment[i];
  911. switch (JSDocNode.kind) {
  912. case tsMorph.SyntaxKind.JSDocComment:
  913. rawDescription += JSDocNode.comment;
  914. break;
  915. case tsMorph.SyntaxKind.JSDocText:
  916. rawDescription += JSDocNode.text;
  917. break;
  918. case tsMorph.SyntaxKind.JSDocLink:
  919. if (JSDocNode.name) {
  920. var text = JSDocNode.name.escapedText;
  921. if (text === undefined &&
  922. JSDocNode.name.left &&
  923. JSDocNode.name.right) {
  924. text =
  925. JSDocNode.name.left.escapedText +
  926. '.' +
  927. JSDocNode.name.right.escapedText;
  928. }
  929. rawDescription += JSDocNode.text + '{@link ' + text + '}';
  930. }
  931. break;
  932. }
  933. }
  934. }
  935. }
  936. return rawDescription;
  937. };
  938. return JsdocParserUtil;
  939. }());
  940. var marked = require('marked').marked;
  941. marked.use({
  942. mangle: false,
  943. headerIds: false
  944. });
  945. var markedAcl = marked;
  946. var getCurrentDirectory = tsMorph.ts.sys.getCurrentDirectory;
  947. var useCaseSensitiveFileNames = tsMorph.ts.sys.useCaseSensitiveFileNames;
  948. var newLine = tsMorph.ts.sys.newLine;
  949. function getNewLine() {
  950. return newLine;
  951. }
  952. function cleanNameWithoutSpaceAndToLowerCase(name) {
  953. return name.toLowerCase().replace(/ /g, '-');
  954. }
  955. function getCanonicalFileName(fileName) {
  956. return useCaseSensitiveFileNames ? fileName : fileName.toLowerCase();
  957. }
  958. var formatDiagnosticsHost = {
  959. getCurrentDirectory: getCurrentDirectory,
  960. getCanonicalFileName: getCanonicalFileName,
  961. getNewLine: getNewLine
  962. };
  963. function markedtags(tags) {
  964. var jsdocParserUtil = new JsdocParserUtil();
  965. var mtags = tags;
  966. ___namespace.forEach(mtags, function (tag) {
  967. var rawComment = jsdocParserUtil.parseJSDocNode(tag);
  968. tag.comment = markedAcl(LinkParser.resolveLinks(rawComment));
  969. });
  970. return mtags;
  971. }
  972. function mergeTagsAndArgs(args, jsdoctags) {
  973. var margs = ___namespace.cloneDeep(args);
  974. ___namespace.forEach(margs, function (arg) {
  975. arg.tagName = {
  976. text: 'param'
  977. };
  978. if (jsdoctags) {
  979. ___namespace.forEach(jsdoctags, function (jsdoctag) {
  980. if (jsdoctag.name && jsdoctag.name.text === arg.name) {
  981. arg.tagName = jsdoctag.tagName;
  982. arg.name = jsdoctag.name;
  983. arg.comment = jsdoctag.comment;
  984. arg.typeExpression = jsdoctag.typeExpression;
  985. }
  986. });
  987. }
  988. });
  989. // Add example & returns & private
  990. if (jsdoctags) {
  991. ___namespace.forEach(jsdoctags, function (jsdoctag) {
  992. if (jsdoctag.tagName &&
  993. (jsdoctag.tagName.text === 'example' || jsdoctag.tagName.text === 'private')) {
  994. margs.push({
  995. tagName: jsdoctag.tagName,
  996. comment: jsdoctag.comment
  997. });
  998. }
  999. if (jsdoctag.tagName &&
  1000. (jsdoctag.tagName.text === 'returns' || jsdoctag.tagName.text === 'return')) {
  1001. var ret = {
  1002. tagName: jsdoctag.tagName,
  1003. comment: jsdoctag.comment
  1004. };
  1005. if (jsdoctag.typeExpression && jsdoctag.typeExpression.type) {
  1006. ret.returnType = kindToType(jsdoctag.typeExpression.type.kind);
  1007. }
  1008. margs.push(ret);
  1009. }
  1010. });
  1011. }
  1012. return margs;
  1013. }
  1014. function readConfig(configFile) {
  1015. var result = tsMorph.ts.readConfigFile(configFile, tsMorph.ts.sys.readFile);
  1016. if (result.error) {
  1017. var message = tsMorph.ts.formatDiagnostics([result.error], formatDiagnosticsHost);
  1018. throw new Error(message);
  1019. }
  1020. return result.config;
  1021. }
  1022. function stripBom(source) {
  1023. if (source.charCodeAt(0) === 0xfeff) {
  1024. return source.slice(1);
  1025. }
  1026. return source;
  1027. }
  1028. function hasBom(source) {
  1029. return source.charCodeAt(0) === 0xfeff;
  1030. }
  1031. function cleanLifecycleHooksFromMethods(methods) {
  1032. var result = [];
  1033. if (typeof methods !== 'undefined') {
  1034. var i = 0;
  1035. var len = methods.length;
  1036. for (i; i < len; i++) {
  1037. if (!(methods[i].name in AngularLifecycleHooks)) {
  1038. result.push(methods[i]);
  1039. }
  1040. }
  1041. }
  1042. return result;
  1043. }
  1044. function cleanSourcesForWatch(list) {
  1045. return list.filter(function (element) {
  1046. if (fs__namespace.existsSync(process.cwd() + path__namespace.sep + element)) {
  1047. return element;
  1048. }
  1049. });
  1050. }
  1051. function getNamesCompareFn(name) {
  1052. /**
  1053. * Copyright https://github.com/ng-bootstrap/ng-bootstrap
  1054. */
  1055. name = name || 'name';
  1056. var t = function (a, b) {
  1057. if (a[name]) {
  1058. return a[name].localeCompare(b[name]);
  1059. }
  1060. else {
  1061. return 0;
  1062. }
  1063. };
  1064. return t;
  1065. }
  1066. function isIgnore(member) {
  1067. var e_1, _a, e_2, _b;
  1068. if (member.jsDoc) {
  1069. try {
  1070. for (var _c = __values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
  1071. var doc = _d.value;
  1072. if (doc.tags) {
  1073. try {
  1074. for (var _e = (e_2 = void 0, __values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
  1075. var tag = _f.value;
  1076. if (tag.tagName.text.indexOf('ignore') > -1) {
  1077. return true;
  1078. }
  1079. }
  1080. }
  1081. catch (e_2_1) { e_2 = { error: e_2_1 }; }
  1082. finally {
  1083. try {
  1084. if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
  1085. }
  1086. finally { if (e_2) throw e_2.error; }
  1087. }
  1088. }
  1089. }
  1090. }
  1091. catch (e_1_1) { e_1 = { error: e_1_1 }; }
  1092. finally {
  1093. try {
  1094. if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
  1095. }
  1096. finally { if (e_1) throw e_1.error; }
  1097. }
  1098. }
  1099. return false;
  1100. }
  1101. // https://tc39.github.io/ecma262/#sec-array.prototype.includes
  1102. if (!Array.prototype.includes) {
  1103. Object.defineProperty(Array.prototype, 'includes', {
  1104. value: function (searchElement, fromIndex) {
  1105. if (this == null) {
  1106. throw new TypeError('"this" is null or not defined');
  1107. }
  1108. // 1. Let O be ? ToObject(this value).
  1109. var o = Object(this);
  1110. // 2. Let len be ? ToLength(? Get(O, "length")).
  1111. var len = o.length >>> 0;
  1112. // 3. If len is 0, return false.
  1113. if (len === 0) {
  1114. return false;
  1115. }
  1116. // 4. Let n be ? ToInteger(fromIndex).
  1117. // (If fromIndex is undefined, this step produces the value 0.)
  1118. var n = fromIndex | 0;
  1119. // 5. If n ≥ 0, then
  1120. // a. Let k be n.
  1121. // 6. Else n < 0,
  1122. // a. Let k be len + n.
  1123. // b. If k < 0, let k be 0.
  1124. var k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
  1125. function sameValueZero(x, y) {
  1126. return (x === y ||
  1127. (typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y)));
  1128. }
  1129. // 7. Repeat, while k < len
  1130. while (k < len) {
  1131. // a. Let elementK be the result of ? Get(O, ! ToString(k)).
  1132. // b. If SameValueZero(searchElement, elementK) is true, return true.
  1133. if (sameValueZero(o[k], searchElement)) {
  1134. return true;
  1135. }
  1136. // c. Increase k by 1.
  1137. k++;
  1138. }
  1139. // 8. Return false
  1140. return false;
  1141. }
  1142. });
  1143. }
  1144. function findMainSourceFolder(files) {
  1145. var mainFolder = '';
  1146. var mainFolderCount = 0;
  1147. var rawFolders = files.map(function (filepath) {
  1148. var shortPath = filepath.replace(process.cwd() + path__namespace.sep, '');
  1149. return path__namespace.dirname(shortPath);
  1150. });
  1151. var folders = {};
  1152. rawFolders = ___namespace.uniq(rawFolders);
  1153. for (var i = 0; i < rawFolders.length; i++) {
  1154. var sep = rawFolders[i].split(path__namespace.sep);
  1155. sep.forEach(function (folder) {
  1156. if (folders[folder]) {
  1157. folders[folder] += 1;
  1158. }
  1159. else {
  1160. folders[folder] = 1;
  1161. }
  1162. });
  1163. }
  1164. for (var f in folders) {
  1165. if (folders[f] > mainFolderCount) {
  1166. mainFolderCount = folders[f];
  1167. mainFolder = f;
  1168. }
  1169. }
  1170. return mainFolder;
  1171. }
  1172. // Create a compilerHost object to allow the compiler to read and write files
  1173. function compilerHost(transpileOptions) {
  1174. var inputFileName = transpileOptions.fileName || (transpileOptions.jsx ? 'module.tsx' : 'module.ts');
  1175. var toReturn = {
  1176. getSourceFile: function (fileName) {
  1177. if (fileName.lastIndexOf('.ts') !== -1 || fileName.lastIndexOf('.js') !== -1) {
  1178. if (fileName === 'lib.d.ts') {
  1179. return undefined;
  1180. }
  1181. if (fileName.substr(-5) === '.d.ts') {
  1182. return undefined;
  1183. }
  1184. if (path__namespace.isAbsolute(fileName) === false) {
  1185. fileName = path__namespace.join(transpileOptions.tsconfigDirectory, fileName);
  1186. }
  1187. if (!fs__namespace.existsSync(fileName)) {
  1188. return undefined;
  1189. }
  1190. var libSource = '';
  1191. try {
  1192. libSource = fs__namespace.readFileSync(fileName).toString();
  1193. if (hasBom(libSource)) {
  1194. libSource = stripBom(libSource);
  1195. }
  1196. }
  1197. catch (e) {
  1198. logger.debug(e, fileName);
  1199. }
  1200. return tsMorph.ts.createSourceFile(fileName, libSource, transpileOptions.target, false);
  1201. }
  1202. return undefined;
  1203. },
  1204. writeFile: function (name, text) { },
  1205. getDefaultLibFileName: function () { return 'lib.d.ts'; },
  1206. useCaseSensitiveFileNames: function () { return false; },
  1207. getCanonicalFileName: function (fileName) { return fileName; },
  1208. getCurrentDirectory: function () { return ''; },
  1209. getNewLine: function () { return '\n'; },
  1210. fileExists: function (fileName) { return fileName === inputFileName; },
  1211. readFile: function () { return ''; },
  1212. directoryExists: function () { return true; },
  1213. getDirectories: function () { return []; }
  1214. };
  1215. return toReturn;
  1216. }
  1217. function detectIndent(str, count) {
  1218. var stripIndent = function (stripedString) {
  1219. var match = stripedString.match(/^[ \t]*(?=\S)/gm);
  1220. if (!match) {
  1221. return stripedString;
  1222. }
  1223. // TODO: use spread operator when targeting Node.js 6
  1224. var indent = Math.min.apply(Math, match.map(function (x) { return x.length; })); // eslint-disable-line
  1225. var re = new RegExp("^[ \\t]{".concat(indent, "}"), 'gm');
  1226. return indent > 0 ? stripedString.replace(re, '') : stripedString;
  1227. };
  1228. var repeating = function (n, repeatString) {
  1229. repeatString = repeatString === undefined ? ' ' : repeatString;
  1230. if (typeof repeatString !== 'string') {
  1231. throw new TypeError("Expected `input` to be a `string`, got `".concat(typeof repeatString, "`"));
  1232. }
  1233. if (n < 0) {
  1234. throw new TypeError("Expected `count` to be a positive finite number, got `".concat(n, "`"));
  1235. }
  1236. var ret = '';
  1237. do {
  1238. if (n & 1) {
  1239. ret += repeatString;
  1240. }
  1241. repeatString += repeatString;
  1242. } while ((n >>= 1));
  1243. return ret;
  1244. };
  1245. var indentString = function (indentedString, indentCount) {
  1246. var indent = ' ';
  1247. indentCount = indentCount === undefined ? 1 : indentCount;
  1248. if (typeof indentedString !== 'string') {
  1249. throw new TypeError("Expected `input` to be a `string`, got `".concat(typeof indentedString, "`"));
  1250. }
  1251. if (typeof indentCount !== 'number') {
  1252. throw new TypeError("Expected `count` to be a `number`, got `".concat(typeof indentCount, "`"));
  1253. }
  1254. if (typeof indent !== 'string') {
  1255. throw new TypeError("Expected `indent` to be a `string`, got `".concat(typeof indent, "`"));
  1256. }
  1257. if (indentCount === 0) {
  1258. return indentedString;
  1259. }
  1260. indent = indentCount > 1 ? repeating(indentCount, indent) : indent;
  1261. return indentedString.replace(/^(?!\s*$)/gm, indent);
  1262. };
  1263. return indentString(stripIndent(str), 0);
  1264. }
  1265. var INCLUDE_PATTERNS = ['**/*.ts', '**/*.tsx'];
  1266. var EXCLUDE_PATTERNS = ['**/.git', '**/node_modules', '**/*.d.ts', '**/*.spec.ts'];
  1267. var traverse$3 = require('neotraverse/legacy');
  1268. var DependenciesEngine = /** @class */ (function () {
  1269. function DependenciesEngine() {
  1270. this.miscellaneous = {
  1271. variables: [],
  1272. functions: [],
  1273. typealiases: [],
  1274. enumerations: [],
  1275. groupedVariables: [],
  1276. groupedFunctions: [],
  1277. groupedEnumerations: [],
  1278. groupedTypeAliases: []
  1279. };
  1280. }
  1281. DependenciesEngine.getInstance = function () {
  1282. if (!DependenciesEngine.instance) {
  1283. DependenciesEngine.instance = new DependenciesEngine();
  1284. }
  1285. return DependenciesEngine.instance;
  1286. };
  1287. DependenciesEngine.prototype.updateModulesDeclarationsExportsTypes = function () {
  1288. var _this = this;
  1289. var mergeTypes = function (entry) {
  1290. var directive = _this.findInCompodocDependencies(entry.name, _this.directives, entry.file);
  1291. if (typeof directive.data !== 'undefined') {
  1292. entry.type = 'directive';
  1293. entry.id = directive.data.id;
  1294. }
  1295. var component = _this.findInCompodocDependencies(entry.name, _this.components, entry.file);
  1296. if (typeof component.data !== 'undefined') {
  1297. entry.type = 'component';
  1298. entry.id = component.data.id;
  1299. }
  1300. var pipe = _this.findInCompodocDependencies(entry.name, _this.pipes, entry.file);
  1301. if (typeof pipe.data !== 'undefined') {
  1302. entry.type = 'pipe';
  1303. entry.id = pipe.data.id;
  1304. }
  1305. };
  1306. this.modules.forEach(function (module) {
  1307. module.declarations.forEach(function (declaration) {
  1308. mergeTypes(declaration);
  1309. });
  1310. module.exports.forEach(function (expt) {
  1311. mergeTypes(expt);
  1312. });
  1313. module.entryComponents.forEach(function (ent) {
  1314. mergeTypes(ent);
  1315. });
  1316. });
  1317. };
  1318. DependenciesEngine.prototype.init = function (data) {
  1319. traverse$3(data).forEach(function (node) {
  1320. if (node) {
  1321. if (node.parent) {
  1322. delete node.parent;
  1323. }
  1324. if (node.initializer) {
  1325. delete node.initializer;
  1326. }
  1327. }
  1328. });
  1329. this.rawData = data;
  1330. this.modules = ___namespace.sortBy(this.rawData.modules, [function (el) { return el.name.toLowerCase(); }]);
  1331. this.rawModulesForOverview = ___namespace.sortBy(data.modulesForGraph, [function (el) { return el.name.toLowerCase(); }]);
  1332. this.rawModules = ___namespace.sortBy(data.modulesForGraph, [function (el) { return el.name.toLowerCase(); }]);
  1333. this.components = ___namespace.sortBy(this.rawData.components, [function (el) { return el.name.toLowerCase(); }]);
  1334. this.controllers = ___namespace.sortBy(this.rawData.controllers, [function (el) { return el.name.toLowerCase(); }]);
  1335. this.entities = ___namespace.sortBy(this.rawData.entities, [function (el) { return el.name.toLowerCase(); }]);
  1336. this.directives = ___namespace.sortBy(this.rawData.directives, [function (el) { return el.name.toLowerCase(); }]);
  1337. this.injectables = ___namespace.sortBy(this.rawData.injectables, [function (el) { return el.name.toLowerCase(); }]);
  1338. this.interceptors = ___namespace.sortBy(this.rawData.interceptors, [function (el) { return el.name.toLowerCase(); }]);
  1339. this.guards = ___namespace.sortBy(this.rawData.guards, [function (el) { return el.name.toLowerCase(); }]);
  1340. this.interfaces = ___namespace.sortBy(this.rawData.interfaces, [function (el) { return el.name.toLowerCase(); }]);
  1341. this.pipes = ___namespace.sortBy(this.rawData.pipes, [function (el) { return el.name.toLowerCase(); }]);
  1342. this.classes = ___namespace.sortBy(this.rawData.classes, [function (el) { return el.name.toLowerCase(); }]);
  1343. this.miscellaneous = this.rawData.miscellaneous;
  1344. this.prepareMiscellaneous();
  1345. this.updateModulesDeclarationsExportsTypes();
  1346. this.routes = this.rawData.routesTree;
  1347. this.manageDuplicatesName();
  1348. this.cleanRawModulesNames();
  1349. };
  1350. DependenciesEngine.prototype.cleanRawModulesNames = function () {
  1351. this.rawModulesForOverview = this.rawModulesForOverview.map(function (module) {
  1352. module.name = module.name.replace('$', '');
  1353. return module;
  1354. });
  1355. };
  1356. DependenciesEngine.prototype.findInCompodocDependencies = function (name, data, file) {
  1357. var _result = {
  1358. source: 'internal',
  1359. data: undefined,
  1360. score: 0
  1361. };
  1362. var nameFoundCounter = 0;
  1363. if (data && data.length > 0) {
  1364. for (var i = 0; i < data.length; i++) {
  1365. if (typeof name !== 'undefined') {
  1366. if (typeof file !== 'undefined') {
  1367. if (name === data[i].name &&
  1368. file.replace(/\\/g, '/').indexOf(data[i].file) !== -1) {
  1369. nameFoundCounter += 1;
  1370. _result.data = data[i];
  1371. _result.score = 2;
  1372. }
  1373. else if (name.indexOf(data[i].name) !== -1 &&
  1374. file.replace(/\\/g, '/').indexOf(data[i].file) !== -1) {
  1375. nameFoundCounter += 1;
  1376. _result.data = data[i];
  1377. _result.score = 1;
  1378. }
  1379. }
  1380. else {
  1381. if (name === data[i].name) {
  1382. nameFoundCounter += 1;
  1383. _result.data = data[i];
  1384. _result.score = 2;
  1385. }
  1386. else if (name.indexOf(data[i].name) !== -1) {
  1387. nameFoundCounter += 1;
  1388. _result.data = data[i];
  1389. _result.score = 1;
  1390. }
  1391. }
  1392. }
  1393. }
  1394. // Prevent wrong matching like MultiSelectOptionDirective with SelectOptionDirective, or QueryParamGroupService with QueryParamGroup
  1395. if (nameFoundCounter > 1) {
  1396. var found = false;
  1397. for (var i = 0; i < data.length; i++) {
  1398. if (typeof name !== 'undefined') {
  1399. if (typeof file !== 'undefined') {
  1400. if (name === data[i].name) {
  1401. found = true;
  1402. _result.data = data[i];
  1403. _result.score = 2;
  1404. }
  1405. }
  1406. else {
  1407. if (name === data[i].name) {
  1408. found = true;
  1409. _result.data = data[i];
  1410. _result.score = 2;
  1411. }
  1412. }
  1413. }
  1414. }
  1415. if (!found) {
  1416. _result = {
  1417. source: 'internal',
  1418. data: undefined,
  1419. score: 0
  1420. };
  1421. }
  1422. }
  1423. }
  1424. return _result;
  1425. };
  1426. DependenciesEngine.prototype.manageDuplicatesName = function () {
  1427. var processDuplicates = function (element, index, array) {
  1428. var elementsWithSameName = ___namespace.filter(array, { name: element.name });
  1429. if (elementsWithSameName.length > 1) {
  1430. // First element is the reference for duplicates
  1431. for (var i = 1; i < elementsWithSameName.length; i++) {
  1432. var elementToEdit = elementsWithSameName[i];
  1433. if (typeof elementToEdit.isDuplicate === 'undefined') {
  1434. elementToEdit.isDuplicate = true;
  1435. elementToEdit.duplicateId = i;
  1436. elementToEdit.duplicateName =
  1437. elementToEdit.name + '-' + elementToEdit.duplicateId;
  1438. elementToEdit.id = elementToEdit.id + '-' + elementToEdit.duplicateId;
  1439. }
  1440. }
  1441. }
  1442. return element;
  1443. };
  1444. this.classes = this.classes.map(processDuplicates);
  1445. this.interfaces = this.interfaces.map(processDuplicates);
  1446. this.injectables = this.injectables.map(processDuplicates);
  1447. this.pipes = this.pipes.map(processDuplicates);
  1448. this.interceptors = this.interceptors.map(processDuplicates);
  1449. this.guards = this.guards.map(processDuplicates);
  1450. this.modules = this.modules.map(processDuplicates);
  1451. this.components = this.components.map(processDuplicates);
  1452. this.controllers = this.controllers.map(processDuplicates);
  1453. this.entities = this.entities.map(processDuplicates);
  1454. this.directives = this.directives.map(processDuplicates);
  1455. };
  1456. DependenciesEngine.prototype.find = function (name) {
  1457. var e_1, _a;
  1458. var _this = this;
  1459. var searchFunctions = [
  1460. function () { return _this.findInCompodocDependencies(name, _this.modules); },
  1461. function () { return _this.findInCompodocDependencies(name, _this.injectables); },
  1462. function () { return _this.findInCompodocDependencies(name, _this.interceptors); },
  1463. function () { return _this.findInCompodocDependencies(name, _this.guards); },
  1464. function () { return _this.findInCompodocDependencies(name, _this.interfaces); },
  1465. function () { return _this.findInCompodocDependencies(name, _this.classes); },
  1466. function () { return _this.findInCompodocDependencies(name, _this.components); },
  1467. function () { return _this.findInCompodocDependencies(name, _this.controllers); },
  1468. function () { return _this.findInCompodocDependencies(name, _this.entities); },
  1469. function () { return _this.findInCompodocDependencies(name, _this.directives); },
  1470. function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.variables); },
  1471. function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.functions); },
  1472. function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.typealiases); },
  1473. function () { return _this.findInCompodocDependencies(name, _this.miscellaneous.enumerations); },
  1474. function () { return AngularApiUtil$1.findApi(name); }
  1475. ];
  1476. var bestScore = 0;
  1477. var bestResult = undefined;
  1478. try {
  1479. for (var searchFunctions_1 = __values(searchFunctions), searchFunctions_1_1 = searchFunctions_1.next(); !searchFunctions_1_1.done; searchFunctions_1_1 = searchFunctions_1.next()) {
  1480. var searchFunction = searchFunctions_1_1.value;
  1481. var result = searchFunction();
  1482. if (result.data && result.score > bestScore) {
  1483. bestScore = result.score;
  1484. bestResult = result;
  1485. }
  1486. }
  1487. }
  1488. catch (e_1_1) { e_1 = { error: e_1_1 }; }
  1489. finally {
  1490. try {
  1491. if (searchFunctions_1_1 && !searchFunctions_1_1.done && (_a = searchFunctions_1.return)) _a.call(searchFunctions_1);
  1492. }
  1493. finally { if (e_1) throw e_1.error; }
  1494. }
  1495. return bestResult;
  1496. };
  1497. DependenciesEngine.prototype.update = function (updatedData) {
  1498. var _this = this;
  1499. if (updatedData.modules.length > 0) {
  1500. ___namespace.forEach(updatedData.modules, function (module) {
  1501. var _index = ___namespace.findIndex(_this.modules, { name: module.name });
  1502. _this.modules[_index] = module;
  1503. });
  1504. }
  1505. if (updatedData.components.length > 0) {
  1506. ___namespace.forEach(updatedData.components, function (component) {
  1507. var _index = ___namespace.findIndex(_this.components, { name: component.name });
  1508. _this.components[_index] = component;
  1509. });
  1510. }
  1511. if (updatedData.controllers.length > 0) {
  1512. ___namespace.forEach(updatedData.controllers, function (controller) {
  1513. var _index = ___namespace.findIndex(_this.controllers, { name: controller.name });
  1514. _this.controllers[_index] = controller;
  1515. });
  1516. }
  1517. if (updatedData.entities.length > 0) {
  1518. ___namespace.forEach(updatedData.entities, function (entity) {
  1519. var _index = ___namespace.findIndex(_this.entities, { name: entity.name });
  1520. _this.entities[_index] = entity;
  1521. });
  1522. }
  1523. if (updatedData.directives.length > 0) {
  1524. ___namespace.forEach(updatedData.directives, function (directive) {
  1525. var _index = ___namespace.findIndex(_this.directives, { name: directive.name });
  1526. _this.directives[_index] = directive;
  1527. });
  1528. }
  1529. if (updatedData.injectables.length > 0) {
  1530. ___namespace.forEach(updatedData.injectables, function (injectable) {
  1531. var _index = ___namespace.findIndex(_this.injectables, { name: injectable.name });
  1532. _this.injectables[_index] = injectable;
  1533. });
  1534. }
  1535. if (updatedData.interceptors.length > 0) {
  1536. ___namespace.forEach(updatedData.interceptors, function (interceptor) {
  1537. var _index = ___namespace.findIndex(_this.interceptors, { name: interceptor.name });
  1538. _this.interceptors[_index] = interceptor;
  1539. });
  1540. }
  1541. if (updatedData.guards.length > 0) {
  1542. ___namespace.forEach(updatedData.guards, function (guard) {
  1543. var _index = ___namespace.findIndex(_this.guards, { name: guard.name });
  1544. _this.guards[_index] = guard;
  1545. });
  1546. }
  1547. if (updatedData.interfaces.length > 0) {
  1548. ___namespace.forEach(updatedData.interfaces, function (int) {
  1549. var _index = ___namespace.findIndex(_this.interfaces, { name: int.name });
  1550. _this.interfaces[_index] = int;
  1551. });
  1552. }
  1553. if (updatedData.pipes.length > 0) {
  1554. ___namespace.forEach(updatedData.pipes, function (pipe) {
  1555. var _index = ___namespace.findIndex(_this.pipes, { name: pipe.name });
  1556. _this.pipes[_index] = pipe;
  1557. });
  1558. }
  1559. if (updatedData.classes.length > 0) {
  1560. ___namespace.forEach(updatedData.classes, function (classe) {
  1561. var _index = ___namespace.findIndex(_this.classes, { name: classe.name });
  1562. _this.classes[_index] = classe;
  1563. });
  1564. }
  1565. /**
  1566. * Miscellaneous update
  1567. */
  1568. if (updatedData.miscellaneous.variables.length > 0) {
  1569. ___namespace.forEach(updatedData.miscellaneous.variables, function (variable) {
  1570. var _index = ___namespace.findIndex(_this.miscellaneous.variables, {
  1571. name: variable.name,
  1572. file: variable.file
  1573. });
  1574. _this.miscellaneous.variables[_index] = variable;
  1575. });
  1576. }
  1577. if (updatedData.miscellaneous.functions.length > 0) {
  1578. ___namespace.forEach(updatedData.miscellaneous.functions, function (func) {
  1579. var _index = ___namespace.findIndex(_this.miscellaneous.functions, {
  1580. name: func.name,
  1581. file: func.file
  1582. });
  1583. _this.miscellaneous.functions[_index] = func;
  1584. });
  1585. }
  1586. if (updatedData.miscellaneous.typealiases.length > 0) {
  1587. ___namespace.forEach(updatedData.miscellaneous.typealiases, function (typealias) {
  1588. var _index = ___namespace.findIndex(_this.miscellaneous.typealiases, {
  1589. name: typealias.name,
  1590. file: typealias.file
  1591. });
  1592. _this.miscellaneous.typealiases[_index] = typealias;
  1593. });
  1594. }
  1595. if (updatedData.miscellaneous.enumerations.length > 0) {
  1596. ___namespace.forEach(updatedData.miscellaneous.enumerations, function (enumeration) {
  1597. var _index = ___namespace.findIndex(_this.miscellaneous.enumerations, {
  1598. name: enumeration.name,
  1599. file: enumeration.file
  1600. });
  1601. _this.miscellaneous.enumerations[_index] = enumeration;
  1602. });
  1603. }
  1604. this.prepareMiscellaneous();
  1605. };
  1606. DependenciesEngine.prototype.findInCompodoc = function (name) {
  1607. 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);
  1608. var result = ___namespace.find(mergedData, { name: name });
  1609. return result || false;
  1610. };
  1611. DependenciesEngine.prototype.prepareMiscellaneous = function () {
  1612. this.miscellaneous.variables.sort(getNamesCompareFn());
  1613. this.miscellaneous.functions.sort(getNamesCompareFn());
  1614. this.miscellaneous.enumerations.sort(getNamesCompareFn());
  1615. this.miscellaneous.typealiases.sort(getNamesCompareFn());
  1616. // group each subgoup by file
  1617. this.miscellaneous.groupedVariables = ___namespace.groupBy(this.miscellaneous.variables, 'file');
  1618. this.miscellaneous.groupedFunctions = ___namespace.groupBy(this.miscellaneous.functions, 'file');
  1619. this.miscellaneous.groupedEnumerations = ___namespace.groupBy(this.miscellaneous.enumerations, 'file');
  1620. this.miscellaneous.groupedTypeAliases = ___namespace.groupBy(this.miscellaneous.typealiases, 'file');
  1621. };
  1622. DependenciesEngine.prototype.getModule = function (name) {
  1623. return ___namespace.find(this.modules, ['name', name]);
  1624. };
  1625. DependenciesEngine.prototype.getRawModule = function (name) {
  1626. return ___namespace.find(this.rawModules, ['name', name]);
  1627. };
  1628. DependenciesEngine.prototype.getModules = function () {
  1629. return this.modules;
  1630. };
  1631. DependenciesEngine.prototype.getComponents = function () {
  1632. return this.components;
  1633. };
  1634. DependenciesEngine.prototype.getControllers = function () {
  1635. return this.controllers;
  1636. };
  1637. DependenciesEngine.prototype.getEntities = function () {
  1638. return this.entities;
  1639. };
  1640. DependenciesEngine.prototype.getDirectives = function () {
  1641. return this.directives;
  1642. };
  1643. DependenciesEngine.prototype.getInjectables = function () {
  1644. return this.injectables;
  1645. };
  1646. DependenciesEngine.prototype.getInterceptors = function () {
  1647. return this.interceptors;
  1648. };
  1649. DependenciesEngine.prototype.getGuards = function () {
  1650. return this.guards;
  1651. };
  1652. DependenciesEngine.prototype.getInterfaces = function () {
  1653. return this.interfaces;
  1654. };
  1655. DependenciesEngine.prototype.getRoutes = function () {
  1656. return this.routes;
  1657. };
  1658. DependenciesEngine.prototype.getPipes = function () {
  1659. return this.pipes;
  1660. };
  1661. DependenciesEngine.prototype.getClasses = function () {
  1662. return this.classes;
  1663. };
  1664. DependenciesEngine.prototype.getMiscellaneous = function () {
  1665. return this.miscellaneous;
  1666. };
  1667. return DependenciesEngine;
  1668. }());
  1669. var DependenciesEngine$1 = DependenciesEngine.getInstance();
  1670. var FileEngine = /** @class */ (function () {
  1671. function FileEngine() {
  1672. }
  1673. FileEngine.getInstance = function () {
  1674. if (!FileEngine.instance) {
  1675. FileEngine.instance = new FileEngine();
  1676. }
  1677. return FileEngine.instance;
  1678. };
  1679. FileEngine.prototype.get = function (filepath) {
  1680. return new Promise(function (resolve, reject) {
  1681. fs__namespace.readFile(path__namespace.resolve(filepath), 'utf8', function (err, data) {
  1682. if (err) {
  1683. reject('Error during ' + filepath + ' read');
  1684. }
  1685. else {
  1686. resolve(data);
  1687. }
  1688. });
  1689. });
  1690. };
  1691. FileEngine.prototype.write = function (filepath, contents) {
  1692. return new Promise(function (resolve, reject) {
  1693. fs__namespace.outputFile(path__namespace.resolve(filepath), contents, function (err) {
  1694. if (err) {
  1695. reject(err);
  1696. }
  1697. else {
  1698. resolve();
  1699. }
  1700. });
  1701. });
  1702. };
  1703. FileEngine.prototype.writeSync = function (filepath, contents) {
  1704. fs__namespace.outputFileSync(filepath, contents);
  1705. };
  1706. FileEngine.prototype.getSync = function (filepath) {
  1707. return fs__namespace.readFileSync(path__namespace.resolve(filepath), 'utf8');
  1708. };
  1709. /**
  1710. * @param file The file to check
  1711. */
  1712. FileEngine.prototype.existsSync = function (file) {
  1713. return fs__namespace.existsSync(file);
  1714. };
  1715. return FileEngine;
  1716. }());
  1717. var FileEngine$1 = FileEngine.getInstance();
  1718. var traverse$2 = require('neotraverse/legacy');
  1719. var ExportJsonEngine = /** @class */ (function () {
  1720. function ExportJsonEngine() {
  1721. }
  1722. ExportJsonEngine.getInstance = function () {
  1723. if (!ExportJsonEngine.instance) {
  1724. ExportJsonEngine.instance = new ExportJsonEngine();
  1725. }
  1726. return ExportJsonEngine.instance;
  1727. };
  1728. ExportJsonEngine.prototype.export = function (outputFolder, data) {
  1729. var exportData = {};
  1730. traverse$2(data).forEach(function (node) {
  1731. if (node) {
  1732. if (node.parent) {
  1733. delete node.parent;
  1734. }
  1735. if (node.initializer) {
  1736. delete node.initializer;
  1737. }
  1738. if (Configuration$1.mainData.disableSourceCode) {
  1739. delete node.sourceCode;
  1740. delete node.templateData;
  1741. delete node.styleUrlsData;
  1742. delete node.stylesData;
  1743. }
  1744. }
  1745. });
  1746. exportData.pipes = data.pipes;
  1747. exportData.interfaces = data.interfaces;
  1748. exportData.injectables = data.injectables;
  1749. exportData.guards = data.guards;
  1750. exportData.interceptors = data.interceptors;
  1751. exportData.classes = data.classes;
  1752. exportData.directives = data.directives;
  1753. exportData.components = data.components;
  1754. exportData.modules = this.processModules();
  1755. exportData.miscellaneous = data.miscellaneous;
  1756. if (!Configuration$1.mainData.disableRoutesGraph) {
  1757. exportData.routes = data.routes;
  1758. }
  1759. if (!Configuration$1.mainData.disableCoverage) {
  1760. exportData.coverage = data.coverageData;
  1761. }
  1762. return FileEngine$1.write(outputFolder + path__namespace.sep + '/documentation.json', JSON.stringify(exportData, undefined, 4)).catch(function (err) {
  1763. logger.error('Error during export file generation ', err);
  1764. return Promise.reject(err);
  1765. });
  1766. };
  1767. ExportJsonEngine.prototype.processModules = function () {
  1768. var modules = DependenciesEngine$1.getModules();
  1769. var _resultedModules = [];
  1770. for (var moduleNr = 0; moduleNr < modules.length; moduleNr++) {
  1771. var module_1 = modules[moduleNr];
  1772. var moduleElement = {
  1773. name: module_1.name,
  1774. id: module_1.id,
  1775. description: module_1.description,
  1776. rawDescription: module_1.rawDescription,
  1777. deprecationMessage: module_1.deprecationMessage,
  1778. deprecated: module_1.deprecated,
  1779. file: module_1.file,
  1780. methods: module_1.methods,
  1781. sourceCode: module_1.sourceCode,
  1782. children: [
  1783. {
  1784. type: 'providers',
  1785. elements: []
  1786. },
  1787. {
  1788. type: 'declarations',
  1789. elements: []
  1790. },
  1791. {
  1792. type: 'imports',
  1793. elements: []
  1794. },
  1795. {
  1796. type: 'exports',
  1797. elements: []
  1798. },
  1799. {
  1800. type: 'bootstrap',
  1801. elements: []
  1802. },
  1803. {
  1804. type: 'classes',
  1805. elements: []
  1806. }
  1807. ]
  1808. };
  1809. for (var k = 0; k < module_1.providers.length; k++) {
  1810. var providerElement = {
  1811. name: module_1.providers[k].name
  1812. };
  1813. moduleElement.children[0].elements.push(providerElement);
  1814. }
  1815. for (var k = 0; k < module_1.declarations.length; k++) {
  1816. var declarationElement = {
  1817. name: module_1.declarations[k].name
  1818. };
  1819. moduleElement.children[1].elements.push(declarationElement);
  1820. }
  1821. for (var k = 0; k < module_1.imports.length; k++) {
  1822. var importElement = {
  1823. name: module_1.imports[k].name
  1824. };
  1825. moduleElement.children[2].elements.push(importElement);
  1826. }
  1827. for (var k = 0; k < module_1.exports.length; k++) {
  1828. var exportElement = {
  1829. name: module_1.exports[k].name
  1830. };
  1831. moduleElement.children[3].elements.push(exportElement);
  1832. }
  1833. for (var k = 0; k < module_1.bootstrap.length; k++) {
  1834. var bootstrapElement = {
  1835. name: module_1.bootstrap[k].name
  1836. };
  1837. moduleElement.children[4].elements.push(bootstrapElement);
  1838. }
  1839. _resultedModules.push(moduleElement);
  1840. }
  1841. return _resultedModules;
  1842. };
  1843. return ExportJsonEngine;
  1844. }());
  1845. var ExportJsonEngine$1 = ExportJsonEngine.getInstance();
  1846. var ExportEngine = /** @class */ (function () {
  1847. function ExportEngine() {
  1848. }
  1849. ExportEngine.getInstance = function () {
  1850. if (!ExportEngine.instance) {
  1851. ExportEngine.instance = new ExportEngine();
  1852. }
  1853. return ExportEngine.instance;
  1854. };
  1855. ExportEngine.prototype.export = function (outputFolder, data) {
  1856. switch (Configuration$1.mainData.exportFormat) {
  1857. case 'json':
  1858. return ExportJsonEngine$1.export(outputFolder, data);
  1859. /*case 'pdf':
  1860. return ExportPdfEngine.export(outputFolder);*/
  1861. }
  1862. };
  1863. return ExportEngine;
  1864. }());
  1865. var ExportEngine$1 = ExportEngine.getInstance();
  1866. var Handlebars$9 = require('handlebars');
  1867. var BreakCommaHelper = /** @class */ (function () {
  1868. function BreakCommaHelper(bars) {
  1869. this.bars = bars;
  1870. }
  1871. BreakCommaHelper.prototype.helperFunc = function (context, text) {
  1872. text = this.bars.Utils.escapeExpression(text);
  1873. text = text.replace(/,/g, ',<br>');
  1874. return new Handlebars$9.SafeString(text);
  1875. };
  1876. return BreakCommaHelper;
  1877. }());
  1878. var Handlebars$8 = require('handlebars');
  1879. var BreakLinesHelper = /** @class */ (function () {
  1880. function BreakLinesHelper(bars) {
  1881. this.bars = bars;
  1882. }
  1883. BreakLinesHelper.prototype.helperFunc = function (context, text) {
  1884. text = this.bars.Utils.escapeExpression(text);
  1885. text = text.replace(/(\r\n|\n|\r)/gm, '<br>');
  1886. text = text.replace(/ /gm, '&nbsp;');
  1887. text = text.replace(/ /gm, '&nbsp;&nbsp;&nbsp;&nbsp;');
  1888. return new Handlebars$8.SafeString(text);
  1889. };
  1890. return BreakLinesHelper;
  1891. }());
  1892. require('handlebars');
  1893. var CapitalizeHelper = /** @class */ (function () {
  1894. function CapitalizeHelper() {
  1895. }
  1896. CapitalizeHelper.prototype.helperFunc = function (context, text) {
  1897. return text.charAt(0).toUpperCase() + text.slice(1);
  1898. };
  1899. return CapitalizeHelper;
  1900. }());
  1901. var Handlebars$7 = require('handlebars');
  1902. var CleanParagraphHelper = /** @class */ (function () {
  1903. function CleanParagraphHelper() {
  1904. }
  1905. CleanParagraphHelper.prototype.helperFunc = function (context, text) {
  1906. text = text.replace(/<p>/gm, '');
  1907. text = text.replace(/<\/p>/gm, '');
  1908. return new Handlebars$7.SafeString(text);
  1909. };
  1910. return CleanParagraphHelper;
  1911. }());
  1912. var CompareHelper = /** @class */ (function () {
  1913. function CompareHelper() {
  1914. }
  1915. CompareHelper.prototype.helperFunc = function (context, a, operator, b, options) {
  1916. if (arguments.length < 4) {
  1917. throw new Error('handlebars Helper {{compare}} expects 4 arguments');
  1918. }
  1919. var result;
  1920. switch (operator) {
  1921. case 'indexof':
  1922. result = b.indexOf(a) !== -1;
  1923. break;
  1924. case '===':
  1925. result = a === b;
  1926. break;
  1927. case '!==':
  1928. result = a !== b;
  1929. break;
  1930. case '>':
  1931. result = a > b;
  1932. break;
  1933. default: {
  1934. throw new Error('helper {{compare}}: invalid operator: `' + operator + '`');
  1935. }
  1936. }
  1937. if (result === false) {
  1938. return options.inverse(context);
  1939. }
  1940. return options.fn(context);
  1941. };
  1942. return CompareHelper;
  1943. }());
  1944. var DebugHelper = /** @class */ (function () {
  1945. function DebugHelper() {
  1946. }
  1947. DebugHelper.prototype.helperFunc = function (context, optionalValue) {
  1948. console.log('Current Context');
  1949. console.log('====================');
  1950. console.log(context);
  1951. if (optionalValue) {
  1952. console.log('OptionalValue');
  1953. console.log('====================');
  1954. console.log(optionalValue);
  1955. }
  1956. };
  1957. return DebugHelper;
  1958. }());
  1959. var ElementAloneHelper = /** @class */ (function () {
  1960. function ElementAloneHelper() {
  1961. }
  1962. ElementAloneHelper.prototype.helperFunc = function (context, elements, elementType, options) {
  1963. var alones = [];
  1964. var modules = DependenciesEngine$1.modules;
  1965. elements.forEach(function (element) {
  1966. var foundInOneModule = false;
  1967. modules.forEach(function (module) {
  1968. module.declarations.forEach(function (declaration) {
  1969. if (declaration.id === element.id) {
  1970. foundInOneModule = true;
  1971. }
  1972. if (declaration.file === element.file) {
  1973. foundInOneModule = true;
  1974. }
  1975. });
  1976. module.bootstrap.forEach(function (boostrapedElement) {
  1977. if (boostrapedElement.id === element.id) {
  1978. foundInOneModule = true;
  1979. }
  1980. if (boostrapedElement.file === element.file) {
  1981. foundInOneModule = true;
  1982. }
  1983. });
  1984. module.controllers.forEach(function (controller) {
  1985. if (controller.id === element.id) {
  1986. foundInOneModule = true;
  1987. }
  1988. if (controller.file === element.file) {
  1989. foundInOneModule = true;
  1990. }
  1991. });
  1992. module.providers.forEach(function (provider) {
  1993. if (provider.id === element.id) {
  1994. foundInOneModule = true;
  1995. }
  1996. if (provider.file === element.file) {
  1997. foundInOneModule = true;
  1998. }
  1999. });
  2000. });
  2001. if (!foundInOneModule) {
  2002. alones.push(element);
  2003. }
  2004. });
  2005. if (alones.length > 0) {
  2006. switch (elementType) {
  2007. case 'component':
  2008. context.components = alones;
  2009. break;
  2010. case 'directive':
  2011. context.directives = alones;
  2012. break;
  2013. case 'controller':
  2014. context.controllers = alones;
  2015. break;
  2016. case 'injectable':
  2017. context.injectables = alones;
  2018. break;
  2019. case 'pipe':
  2020. context.pipes = alones;
  2021. break;
  2022. }
  2023. return options.fn(context);
  2024. }
  2025. };
  2026. return ElementAloneHelper;
  2027. }());
  2028. var EscapeSimpleQuoteHelper = /** @class */ (function () {
  2029. function EscapeSimpleQuoteHelper() {
  2030. }
  2031. EscapeSimpleQuoteHelper.prototype.helperFunc = function (context, text) {
  2032. if (!text) {
  2033. return;
  2034. }
  2035. text = text.replace(/'/g, "\\'");
  2036. text = text.replace(/(\r\n|\n|\r)/gm, '');
  2037. return text;
  2038. };
  2039. return EscapeSimpleQuoteHelper;
  2040. }());
  2041. var FilterAngular2ModulesHelper = /** @class */ (function () {
  2042. function FilterAngular2ModulesHelper() {
  2043. }
  2044. FilterAngular2ModulesHelper.prototype.helperFunc = function (context, text, options) {
  2045. var NG2_MODULES = [
  2046. 'BrowserModule',
  2047. 'FormsModule',
  2048. 'HttpModule',
  2049. 'RouterModule'
  2050. ];
  2051. var len = NG2_MODULES.length;
  2052. var i = 0;
  2053. var result = false;
  2054. for (i; i < len; i++) {
  2055. if (text.indexOf(NG2_MODULES[i]) > -1) {
  2056. result = true;
  2057. }
  2058. }
  2059. if (result) {
  2060. return options.fn(context);
  2061. }
  2062. else {
  2063. return options.inverse(context);
  2064. }
  2065. };
  2066. return FilterAngular2ModulesHelper;
  2067. }());
  2068. var AngularVersionUtil = /** @class */ (function () {
  2069. function AngularVersionUtil() {
  2070. }
  2071. AngularVersionUtil.getInstance = function () {
  2072. if (!AngularVersionUtil.instance) {
  2073. AngularVersionUtil.instance = new AngularVersionUtil();
  2074. }
  2075. return AngularVersionUtil.instance;
  2076. };
  2077. AngularVersionUtil.prototype.cleanVersion = function (version) {
  2078. return version
  2079. .replace('~', '')
  2080. .replace('^', '')
  2081. .replace('=', '')
  2082. .replace('<', '')
  2083. .replace('>', '');
  2084. };
  2085. AngularVersionUtil.prototype.getAngularVersionOfProject = function (packageData) {
  2086. var _result = '';
  2087. if (packageData.dependencies) {
  2088. var angularCore = packageData.dependencies[AngularVersionUtil.CorePackage];
  2089. if (angularCore) {
  2090. _result = this.cleanVersion(angularCore);
  2091. }
  2092. }
  2093. return _result;
  2094. };
  2095. AngularVersionUtil.prototype.isAngularVersionArchived = function (version) {
  2096. var result;
  2097. try {
  2098. result = semver__namespace.compare(version, '2.4.10') <= 0;
  2099. }
  2100. catch (e) { }
  2101. return result;
  2102. };
  2103. AngularVersionUtil.prototype.prefixOfficialDoc = function (version) {
  2104. return this.isAngularVersionArchived(version) ? 'v2.' : '';
  2105. };
  2106. AngularVersionUtil.prototype.getApiLink = function (api, angularVersion) {
  2107. var angularDocPrefix = this.prefixOfficialDoc(angularVersion);
  2108. return "https://".concat(angularDocPrefix, "angular.io/").concat(api.path);
  2109. };
  2110. AngularVersionUtil.CorePackage = '@angular/core';
  2111. return AngularVersionUtil;
  2112. }());
  2113. var AngularVersionUtil$1 = AngularVersionUtil.getInstance();
  2114. var BasicTypes;
  2115. (function (BasicTypes) {
  2116. BasicTypes[BasicTypes["number"] = 0] = "number";
  2117. BasicTypes[BasicTypes["boolean"] = 1] = "boolean";
  2118. BasicTypes[BasicTypes["string"] = 2] = "string";
  2119. BasicTypes[BasicTypes["object"] = 3] = "object";
  2120. BasicTypes[BasicTypes["date"] = 4] = "date";
  2121. BasicTypes[BasicTypes["function"] = 5] = "function";
  2122. })(BasicTypes || (BasicTypes = {}));
  2123. var BasicTypeScriptTypes;
  2124. (function (BasicTypeScriptTypes) {
  2125. BasicTypeScriptTypes[BasicTypeScriptTypes["any"] = 0] = "any";
  2126. BasicTypeScriptTypes[BasicTypeScriptTypes["void"] = 1] = "void";
  2127. })(BasicTypeScriptTypes || (BasicTypeScriptTypes = {}));
  2128. var BasicTypeUtil = /** @class */ (function () {
  2129. function BasicTypeUtil() {
  2130. }
  2131. BasicTypeUtil.getInstance = function () {
  2132. if (!BasicTypeUtil.instance) {
  2133. BasicTypeUtil.instance = new BasicTypeUtil();
  2134. }
  2135. return BasicTypeUtil.instance;
  2136. };
  2137. /**
  2138. * Checks if a given types is a basic javascript type
  2139. * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects
  2140. * @param type The type to check
  2141. */
  2142. BasicTypeUtil.prototype.isJavascriptType = function (type) {
  2143. if (typeof type !== 'undefined' && type.toLowerCase) {
  2144. return type.toLowerCase() in BasicTypes;
  2145. }
  2146. else {
  2147. return false;
  2148. }
  2149. };
  2150. /**
  2151. * Checks if a given type is a typescript type (That is not a javascript type)
  2152. * https://www.typescriptlang.org/docs/handbook/basic-types.html
  2153. * @param type The type to check
  2154. */
  2155. BasicTypeUtil.prototype.isTypeScriptType = function (type) {
  2156. if (typeof type !== 'undefined' && type.toLowerCase) {
  2157. return type.toLowerCase() in BasicTypeScriptTypes;
  2158. }
  2159. else {
  2160. return false;
  2161. }
  2162. };
  2163. /**
  2164. * Check if the type is a typescript or javascript type
  2165. * @param type The type to check
  2166. */
  2167. BasicTypeUtil.prototype.isKnownType = function (type) {
  2168. return this.isJavascriptType(type) || this.isTypeScriptType(type);
  2169. };
  2170. /**
  2171. * Returns a official documentation link to either the javascript or typescript type
  2172. * @param type The type to check
  2173. * @returns The documentation link or undefined if type not found
  2174. */
  2175. BasicTypeUtil.prototype.getTypeUrl = function (type) {
  2176. if (this.isJavascriptType(type)) {
  2177. return "https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/".concat(type);
  2178. }
  2179. if (this.isTypeScriptType(type)) {
  2180. return "https://www.typescriptlang.org/docs/handbook/basic-types.html";
  2181. }
  2182. return undefined;
  2183. };
  2184. return BasicTypeUtil;
  2185. }());
  2186. var BasicTypeUtil$1 = BasicTypeUtil.getInstance();
  2187. var Handlebars$6 = require('handlebars');
  2188. var FunctionSignatureHelper = /** @class */ (function () {
  2189. function FunctionSignatureHelper() {
  2190. }
  2191. FunctionSignatureHelper.prototype.handleFunction = function (arg) {
  2192. var _this = this;
  2193. if (arg.function.length === 0) {
  2194. return "".concat(arg.name).concat(this.getOptionalString(arg), ": () => void");
  2195. }
  2196. var argums = arg.function.map(function (argu) {
  2197. var _result = DependenciesEngine$1.find(argu.type);
  2198. if (_result) {
  2199. if (_result.source === 'internal') {
  2200. var path = _result.data.type;
  2201. if (_result.data.type === 'class') {
  2202. path = 'classe';
  2203. }
  2204. return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"../").concat(path, "s/").concat(_result.data.name, ".html\">").concat(argu.type, "</a>");
  2205. }
  2206. else {
  2207. var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
  2208. return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
  2209. }
  2210. }
  2211. else if (BasicTypeUtil$1.isKnownType(argu.type)) {
  2212. var path = BasicTypeUtil$1.getTypeUrl(argu.type);
  2213. return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
  2214. }
  2215. else {
  2216. if (argu.name && argu.type) {
  2217. return "".concat(argu.name).concat(_this.getOptionalString(arg), ": ").concat(argu.type);
  2218. }
  2219. else {
  2220. if (argu.name) {
  2221. return "".concat(argu.name.text);
  2222. }
  2223. else {
  2224. return '';
  2225. }
  2226. }
  2227. }
  2228. });
  2229. return "".concat(arg.name).concat(this.getOptionalString(arg), ": (").concat(argums, ") => void");
  2230. };
  2231. FunctionSignatureHelper.prototype.getOptionalString = function (arg) {
  2232. return arg.optional ? '?' : '';
  2233. };
  2234. FunctionSignatureHelper.prototype.helperFunc = function (context, method) {
  2235. var _this = this;
  2236. var args = '';
  2237. var argDestructuredCounterInitial = 0;
  2238. var argDestructuredCounterReal = 0;
  2239. if (method.args) {
  2240. method.args.forEach(function (arg) {
  2241. if (arg.destructuredParameter) {
  2242. argDestructuredCounterInitial += 1;
  2243. }
  2244. });
  2245. method.args.forEach(function (arg, index) {
  2246. var _result = DependenciesEngine$1.find(arg.type);
  2247. if (arg.destructuredParameter) {
  2248. if (argDestructuredCounterReal === 0) {
  2249. args += '__namedParameters: {';
  2250. }
  2251. argDestructuredCounterReal += 1;
  2252. }
  2253. if (_result) {
  2254. if (_result.source === 'internal') {
  2255. var path = _result.data.type;
  2256. if (_result.data.type === 'class') {
  2257. path = 'classe';
  2258. }
  2259. 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>");
  2260. }
  2261. else {
  2262. var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
  2263. args += "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(Handlebars$6.escapeExpression(arg.type), "</a>");
  2264. }
  2265. }
  2266. else if (arg.dotDotDotToken) {
  2267. args += "...".concat(arg.name, ": ").concat(arg.type);
  2268. }
  2269. else if (arg.function) {
  2270. args += _this.handleFunction(arg);
  2271. }
  2272. else if (BasicTypeUtil$1.isKnownType(arg.type)) {
  2273. var path = BasicTypeUtil$1.getTypeUrl(arg.type);
  2274. args += "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(Handlebars$6.escapeExpression(arg.type), "</a>");
  2275. }
  2276. else {
  2277. if (arg.type) {
  2278. args += "".concat(arg.name).concat(_this.getOptionalString(arg), ": ").concat(arg.type);
  2279. }
  2280. else {
  2281. args += "".concat(arg.name).concat(_this.getOptionalString(arg));
  2282. }
  2283. }
  2284. if (arg.destructuredParameter) {
  2285. if (argDestructuredCounterReal === argDestructuredCounterInitial) {
  2286. args += '}';
  2287. }
  2288. }
  2289. if (index < method.args.length - 1) {
  2290. args += ', ';
  2291. }
  2292. });
  2293. }
  2294. if (method.name) {
  2295. return "".concat(method.name, "(").concat(args, ")");
  2296. }
  2297. else {
  2298. return "(".concat(args, ")");
  2299. }
  2300. };
  2301. return FunctionSignatureHelper;
  2302. }());
  2303. var HasOwnHelper = /** @class */ (function () {
  2304. function HasOwnHelper() {
  2305. }
  2306. HasOwnHelper.prototype.helperFunc = function (context, entity, key, options) {
  2307. if (Object.hasOwnProperty.call(entity, key)) {
  2308. return options.fn(context);
  2309. }
  2310. else {
  2311. return options.inverse(context);
  2312. }
  2313. };
  2314. return HasOwnHelper;
  2315. }());
  2316. var TRANSLATION_DE_DE = {
  2317. accessors: 'Accessors',
  2318. arguments: 'Argumente',
  2319. bootstrap: 'Bootstrap',
  2320. branches: 'Branches',
  2321. browse: 'Durchsuche',
  2322. classe: 'Klasse',
  2323. classes: 'Klassen',
  2324. component: 'Komponente',
  2325. components: 'Komponenten',
  2326. constructor: 'Konstruktor',
  2327. controllers: 'Controllers',
  2328. controller: 'Controller',
  2329. 'coverage-page-title': 'Dokumentation Abdeckung',
  2330. declarations: 'Declarations',
  2331. decorators: 'Decorators',
  2332. 'default-value': 'Standardwert',
  2333. 'defined-in': 'Definiert in',
  2334. dependencies: 'Abhängigkeiten',
  2335. deprecated: 'Veraltet',
  2336. description: 'Beschreibung',
  2337. directive: 'Direktive',
  2338. directives: 'Direktiven',
  2339. 'dom tree': 'DOM baum',
  2340. entities: 'Entities',
  2341. entity: 'Entity',
  2342. entrycomponents: 'EntryComponents',
  2343. enumerations: 'Enumerations',
  2344. enums: 'Enums',
  2345. example: 'Beispiel',
  2346. examples: 'Beispiele',
  2347. exports: 'Exportiert',
  2348. extends: 'Erweitert',
  2349. file: 'Datei',
  2350. functions: 'Funktionen',
  2351. 'generated-using': 'Dokumentation generiert mit',
  2352. 'getting-started': "Los geht's",
  2353. guard: 'Guard',
  2354. guards: 'Guards',
  2355. hostbindings: 'HostBindings',
  2356. hostdirectives: 'HostDirectives',
  2357. hostlisteners: 'HostListeners',
  2358. 'html-element': 'Html Element',
  2359. 'html-element-with-directive': 'Html-Element mit Direktive',
  2360. identifier: 'Kennung',
  2361. implements: 'Implementiert',
  2362. imports: 'Importiert',
  2363. index: 'Index',
  2364. indexable: 'Indizierbar',
  2365. info: 'Information',
  2366. 'inherited-from': 'Geerbt von',
  2367. injectable: 'Injectable',
  2368. injectables: 'Injectables',
  2369. inputs: 'Inputs',
  2370. interceptors: 'Interceptors',
  2371. interface: 'Interface',
  2372. interfaces: 'Interfaces',
  2373. legend: 'Legende',
  2374. license: 'Lizenz',
  2375. lines: 'Linien',
  2376. metadata: 'Metadata',
  2377. methods: 'Methoden',
  2378. miscellaneous: 'Verschiedenes',
  2379. module: 'Modul',
  2380. modules: 'Module',
  2381. name: 'Name',
  2382. no: 'Nein',
  2383. 'no-graph': 'Kein Graph verfügbar.',
  2384. 'no-iframe': 'Dein Browser unterstützt keine iframes.',
  2385. 'no-result-matching': 'Kein passendes Ergebnis',
  2386. 'no-svg': 'Dein Browser unterstützt kein SVG',
  2387. optional: 'Optional',
  2388. outputs: 'Ausgaben',
  2389. overview: 'Übersicht',
  2390. parameters: 'Parameter',
  2391. 'peer-dependencies': 'Peer-Abhängigkeiten',
  2392. pipe: 'Pipe',
  2393. pipes: 'Pipes',
  2394. prefix: 'Präfix',
  2395. properties: 'Eigenschaften',
  2396. providers: 'Providers',
  2397. pure: 'Pure',
  2398. readme: 'README',
  2399. required: 'Erforderlich',
  2400. reset: 'Zurücksetzen',
  2401. 'results-matching': 'übereinstimmende Ergebnisse',
  2402. returns: 'Returns',
  2403. route: 'Route',
  2404. routes: 'Routen',
  2405. schemas: 'Schemata',
  2406. 'search-placeholder': 'Eingeben zur Suche',
  2407. selector: 'Selektor',
  2408. signature: 'Unterschrift',
  2409. source: 'Quelle',
  2410. standalone: 'Standalone',
  2411. statements: 'Statements',
  2412. styles: 'Stile',
  2413. template: 'Vorlage',
  2414. type: 'Typ',
  2415. 'type-aliases': 'Typ Aliase',
  2416. 'type-parameters': 'Typ Parameter',
  2417. types: 'Typen',
  2418. 'unamed-property': 'Unbenannte Eigenschaft',
  2419. 'unit-test-coverage': 'Unit-Test-Abdeckung',
  2420. value: 'Wert',
  2421. variables: 'Variablen',
  2422. yes: 'Ja',
  2423. zoomin: 'Vergrößern',
  2424. zoomout: 'Verkleinern'
  2425. };
  2426. var TRANSLATION_EN_US = {
  2427. accessors: 'Accessors',
  2428. arguments: 'Arguments',
  2429. bootstrap: 'Bootstrap',
  2430. branches: 'Branches',
  2431. browse: 'Browse',
  2432. classe: 'Class',
  2433. classes: 'Classes',
  2434. component: 'Component',
  2435. components: 'Components',
  2436. constructor: 'Constructor',
  2437. controllers: 'Controllers',
  2438. controller: 'Controller',
  2439. 'coverage-page-title': 'Documentation coverage',
  2440. declarations: 'Declarations',
  2441. decorators: 'Decorators',
  2442. 'default-value': 'Default value',
  2443. 'defined-in': 'Defined in',
  2444. dependencies: 'Dependencies',
  2445. deprecated: 'Deprecated',
  2446. description: 'Description',
  2447. directive: 'Directive',
  2448. directives: 'Directives',
  2449. 'dom tree': 'DOM tree',
  2450. entities: 'Entities',
  2451. entity: 'Entity',
  2452. entrycomponents: 'EntryComponents',
  2453. enumerations: 'Enumerations',
  2454. enums: 'Enums',
  2455. example: 'Example',
  2456. examples: 'Examples',
  2457. exports: 'Exports',
  2458. extends: 'Extends',
  2459. file: 'File',
  2460. functions: 'Functions',
  2461. 'generated-using': 'Documentation generated using',
  2462. 'getting-started': 'Getting started',
  2463. guard: 'Guard',
  2464. guards: 'Guards',
  2465. hostbindings: 'HostBindings',
  2466. hostdirectives: 'HostDirectives',
  2467. hostlisteners: 'HostListeners',
  2468. 'html-element': 'Html element',
  2469. 'html-element-with-directive': 'Html element with directive',
  2470. identifier: 'Identifier',
  2471. implements: 'Implements',
  2472. imports: 'Imports',
  2473. index: 'Index',
  2474. indexable: 'Indexable',
  2475. info: 'Information',
  2476. 'inherited-from': 'Inherited from',
  2477. injectable: 'Injectable',
  2478. injectables: 'Injectables',
  2479. inputs: 'Inputs',
  2480. interceptors: 'Interceptors',
  2481. interface: 'Interface',
  2482. interfaces: 'Interfaces',
  2483. legend: 'Legend',
  2484. license: 'License',
  2485. lines: 'Lines',
  2486. metadata: 'Metadata',
  2487. methods: 'Methods',
  2488. miscellaneous: 'Miscellaneous',
  2489. module: 'Module',
  2490. modules: 'Modules',
  2491. name: 'Name',
  2492. no: 'No',
  2493. 'no-graph': 'No graph available.',
  2494. 'no-iframe': 'Your browser does not support iframes.',
  2495. 'no-result-matching': 'No results matching',
  2496. 'no-svg': 'Your browser does not support SVG',
  2497. optional: 'Optional',
  2498. outputs: 'Outputs',
  2499. overview: 'Overview',
  2500. parameters: 'Parameters',
  2501. 'peer-dependencies': 'Peer dependencies',
  2502. pipe: 'Pipe',
  2503. pipes: 'Pipes',
  2504. prefix: 'Prefix',
  2505. properties: 'Properties',
  2506. providers: 'Providers',
  2507. pure: 'Pure',
  2508. readme: 'README',
  2509. required: 'Required',
  2510. reset: 'Reset',
  2511. 'results-matching': 'results matching',
  2512. returns: 'Returns',
  2513. route: 'Route',
  2514. routes: 'Routes',
  2515. schemas: 'Schemas',
  2516. 'search-placeholder': 'Type to search',
  2517. selector: 'Selector',
  2518. signature: 'Signature',
  2519. source: 'Source',
  2520. standalone: 'Standalone',
  2521. statements: 'Statements',
  2522. styles: 'Styles',
  2523. template: 'Template',
  2524. type: 'Type',
  2525. 'type-aliases': 'Type aliases',
  2526. 'type-parameters': 'Type parameters',
  2527. types: 'Types',
  2528. 'unamed-property': 'Unamed property',
  2529. 'unit-test-coverage': 'Unit test coverage',
  2530. value: 'Value',
  2531. variables: 'Variables',
  2532. yes: 'Yes',
  2533. zoomin: 'Zoom in',
  2534. zoomout: 'Zoom out'
  2535. };
  2536. var TRANSLATION_ES_ES = {
  2537. accessors: 'Accesorios',
  2538. arguments: 'Argumentos',
  2539. bootstrap: 'Arranque',
  2540. branches: 'Ramas',
  2541. browse: 'Navegar',
  2542. classe: 'Clase',
  2543. classes: 'Clases',
  2544. component: 'Componente',
  2545. components: 'Componentes',
  2546. constructor: 'Constructor',
  2547. controllers: 'Controladores',
  2548. controller: 'Controlador',
  2549. 'coverage-page-title': 'Cobertura de la documentación',
  2550. declarations: 'Declaraciones',
  2551. decorators: 'Decoradores',
  2552. 'default-value': 'Valor por defecto',
  2553. 'defined-in': 'Definido en',
  2554. dependencies: 'Dependencias',
  2555. deprecated: 'Obsoleta',
  2556. description: 'Descripción',
  2557. directive: 'Directiva',
  2558. directives: 'Directivas',
  2559. 'dom tree': 'DOM arbol',
  2560. entities: 'Entidades',
  2561. entity: 'Entidad',
  2562. entrycomponents: 'Componentes de entrada',
  2563. enumerations: 'Enumeraciones',
  2564. enums: 'Enums',
  2565. example: 'Ejemplo',
  2566. examples: 'Ejemplos',
  2567. exports: 'Exporta',
  2568. extends: 'Extiende',
  2569. file: 'Fichero',
  2570. functions: 'Funciones',
  2571. 'generated-using': 'Documentación generada utilizando',
  2572. 'getting-started': 'Comenzando',
  2573. guard: 'Guardia',
  2574. guards: 'Guardias',
  2575. hostbindings: 'Fijaciones de Host',
  2576. hostdirectives: 'HostDirectives',
  2577. hostlisteners: 'Escuchadores de Host',
  2578. 'html-element': 'Elemento Html',
  2579. 'html-element-with-directive': 'Elemento Html con directiva',
  2580. identifier: 'Identificador',
  2581. implements: 'Implementa',
  2582. imports: 'Importa',
  2583. index: 'Índice',
  2584. indexable: 'Indexable',
  2585. info: 'Información',
  2586. 'inherited-from': 'Heredado desde',
  2587. injectable: 'Inyectable',
  2588. injectables: 'Inyectables',
  2589. inputs: 'Entradas',
  2590. interceptors: 'Interceptores',
  2591. interface: 'Interfaz',
  2592. interfaces: 'Interfaces',
  2593. legend: 'Leyenda',
  2594. license: 'Licencia',
  2595. lines: 'Líneas',
  2596. metadata: 'Meta datos',
  2597. methods: 'Métodos',
  2598. miscellaneous: 'Miscelánea',
  2599. module: 'Módulo',
  2600. modules: 'Módulos',
  2601. name: 'Nombre',
  2602. no: 'No',
  2603. 'no-graph': 'No hay gráfica disponible.',
  2604. 'no-iframe': 'Tu navegador no soporta iframes.',
  2605. 'no-result-matching': 'No hay resultados que coincidan',
  2606. 'no-svg': 'Tu navegador no soporta SVG',
  2607. optional: 'Opcional',
  2608. outputs: 'Salidas',
  2609. overview: 'Descripción general',
  2610. parameters: 'Parámetros',
  2611. 'peer-dependencies': 'Dependencias entre pares',
  2612. pipe: 'Tubería',
  2613. pipes: 'Tuberías',
  2614. prefix: 'Prefijo',
  2615. properties: 'Propiedades',
  2616. providers: 'Proveedores',
  2617. pure: 'Puro',
  2618. readme: 'Léeme',
  2619. required: 'Requerido',
  2620. reset: 'Restablecer',
  2621. 'results-matching': 'comparación de resultados',
  2622. returns: 'Devuelve',
  2623. route: 'Ruta',
  2624. routes: 'Rutas',
  2625. schemas: 'Esquemas',
  2626. 'search-placeholder': 'Escribe para buscar',
  2627. selector: 'Selector',
  2628. signature: 'Firma',
  2629. source: 'Fuente',
  2630. standalone: 'Standalone',
  2631. statements: 'Declaraciones',
  2632. styles: 'Estilos',
  2633. template: 'Plantilla',
  2634. type: 'Tipo',
  2635. 'type-aliases': 'Alias de tipo',
  2636. 'type-parameters': 'Parámetros de tipo',
  2637. types: 'Tipos',
  2638. 'unamed-property': 'Propiedad sin nombre',
  2639. 'unit-test-coverage': 'Cobertura de las pruebas unitarias',
  2640. value: 'Valor',
  2641. variables: 'Variables',
  2642. yes: 'Si',
  2643. zoomin: 'Ampliar',
  2644. zoomout: 'Alejar'
  2645. };
  2646. var TRANSLATION_FR_FR = {
  2647. accessors: 'Accesseurs',
  2648. arguments: 'Arguments',
  2649. bootstrap: 'Bootstrap',
  2650. branches: 'Branches',
  2651. browse: 'Parcourir',
  2652. classe: 'Class',
  2653. classes: 'Classes',
  2654. component: 'Composant',
  2655. components: 'Composants',
  2656. constructor: 'Constructeur',
  2657. controllers: 'Contrôleurs',
  2658. controller: 'Contrôleur',
  2659. 'coverage-page-title': 'Couverture de documentation',
  2660. declarations: 'Déclarations',
  2661. decorators: 'Décorateurs',
  2662. 'default-value': 'Valeur par défaut',
  2663. 'defined-in': 'Défini dans',
  2664. dependencies: 'Dépendances',
  2665. deprecated: 'Obsolète',
  2666. description: 'Description',
  2667. directive: 'Directive',
  2668. directives: 'Directives',
  2669. 'dom tree': 'Arbre DOM',
  2670. entities: 'Entités',
  2671. entity: 'Entité',
  2672. entrycomponents: "Composants d'entrée",
  2673. enumerations: 'Enumérations',
  2674. enums: 'Enumérations',
  2675. example: 'Example',
  2676. examples: 'Examples',
  2677. exports: 'Exports',
  2678. extends: 'Etend',
  2679. file: 'Fichier',
  2680. functions: 'Fonctions',
  2681. 'generated-using': 'Documentation générée avec',
  2682. 'getting-started': 'Démarrage',
  2683. guard: 'Garde',
  2684. guards: 'Gardes',
  2685. hostbindings: 'HostBindings',
  2686. hostdirectives: 'HostDirectives',
  2687. hostlisteners: 'HostListeners',
  2688. 'html-element': 'Elément Html',
  2689. 'html-element-with-directive': 'Elément Html avec une directive',
  2690. identifier: 'Identifiant',
  2691. implements: 'Implémente',
  2692. imports: 'Imports',
  2693. index: 'Index',
  2694. indexable: 'Indexable',
  2695. info: 'Information',
  2696. 'inherited-from': 'Hérité de',
  2697. injectable: 'Injectable',
  2698. injectables: 'Injectables',
  2699. inputs: 'Entrées',
  2700. interceptors: 'Intercepteurs',
  2701. interface: 'Interface',
  2702. interfaces: 'Interfaces',
  2703. legend: 'Légende',
  2704. license: 'License',
  2705. lines: 'Lignes',
  2706. metadata: 'Métadonnées',
  2707. methods: 'Méthodes',
  2708. miscellaneous: 'Divers',
  2709. module: 'Module',
  2710. modules: 'Modules',
  2711. name: 'Nom',
  2712. no: 'Non',
  2713. 'no-graph': 'Aucun graphique disponible.',
  2714. 'no-iframe': 'Votre navigateur ne supporte pas les iframes.',
  2715. 'no-result-matching': 'Aucun résultat matchant',
  2716. 'no-svg': 'Votre navigateur ne supporte pas le SVG',
  2717. optional: 'Optionnel',
  2718. outputs: 'Sorties',
  2719. overview: "Vue d'ensemble",
  2720. parameters: 'Paramètres',
  2721. 'peer-dependencies': 'Dépendances de pair',
  2722. pipe: 'Pipe',
  2723. pipes: 'Pipes',
  2724. prefix: 'Préfixe',
  2725. properties: 'Propriétés',
  2726. providers: 'Providers',
  2727. pure: 'Pure',
  2728. readme: 'README',
  2729. required: 'Requis',
  2730. reset: 'Remise à zéro',
  2731. 'results-matching': 'résultats matchant',
  2732. returns: 'Renvoie',
  2733. route: 'Route',
  2734. routes: 'Routes',
  2735. schemas: 'Schémas',
  2736. 'search-placeholder': 'Saisissez un texte',
  2737. selector: 'Sélecteur',
  2738. signature: 'Signature',
  2739. source: 'Source',
  2740. standalone: 'Standalone',
  2741. statements: 'Déclarations',
  2742. styles: 'Styles',
  2743. template: 'Template',
  2744. 'table-of-contents': 'Table des matières',
  2745. type: 'Type',
  2746. 'type-aliases': 'Alias de type',
  2747. 'type-parameters': 'Paramètres de type',
  2748. types: 'Types',
  2749. 'unamed-property': 'Propriété non nommée',
  2750. 'unit-test-coverage': 'Couverture de test unitaire',
  2751. value: 'Valeur',
  2752. variables: 'Variables',
  2753. yes: 'Oui',
  2754. zoomin: 'Zoom avant',
  2755. zoomout: 'Zoom arrière'
  2756. };
  2757. var TRANSLATION_HU_HU = {
  2758. accessors: 'Getter/setter metódusok',
  2759. arguments: 'Argumentumok',
  2760. bootstrap: 'Betöltés',
  2761. branches: 'Branchek',
  2762. browse: 'Böngészés',
  2763. classe: 'Osztály',
  2764. classes: 'Osztályok',
  2765. component: 'Komponens',
  2766. components: 'Komponensek',
  2767. constructor: 'Konstruktor',
  2768. controllers: 'Kontrollerek',
  2769. controller: 'Kontroller',
  2770. 'coverage-page-title': 'Dokumentáció lefedettség',
  2771. declarations: 'Deklarációk',
  2772. decorators: 'Dekorátorok',
  2773. 'default-value': 'Alapértelmezett érték',
  2774. 'defined-in': 'Definíció helye:',
  2775. dependencies: 'Függőségek',
  2776. deprecated: 'Elavult',
  2777. description: 'Leírás',
  2778. directive: 'Direktíva',
  2779. directives: 'Direktívák',
  2780. 'dom tree': 'DOM fa',
  2781. entities: 'Entitások',
  2782. entity: 'Entitás',
  2783. entrycomponents: 'Entry komponensek',
  2784. enumerations: 'Enumerációk',
  2785. enums: 'Enumok',
  2786. example: 'Példa',
  2787. examples: 'Példák',
  2788. exports: 'Exportok',
  2789. extends: 'Ősosztály',
  2790. file: 'File',
  2791. functions: 'Függvények',
  2792. 'generated-using': 'A dokumentációt generálta:',
  2793. 'getting-started': 'Bevezető',
  2794. guard: 'Guard',
  2795. guards: 'Guardok',
  2796. hostbindings: 'HostBindingok',
  2797. hostdirectives: 'HostDirectives',
  2798. hostlisteners: 'HostListenerek',
  2799. 'html-element': 'Html elem',
  2800. 'html-element-with-directive': 'Html elem direktívával',
  2801. identifier: 'Azonosító',
  2802. implements: 'Implementált interfészek',
  2803. imports: 'Importok',
  2804. index: 'Tartalomjegyzék',
  2805. indexable: 'Indexelhető',
  2806. info: 'Információ',
  2807. 'inherited-from': 'Örökölve innen:',
  2808. injectable: 'Injektálható',
  2809. injectables: 'Injektálhatók',
  2810. inputs: 'Bemenetek',
  2811. interceptors: 'Interceptorok',
  2812. interface: 'Interfész',
  2813. interfaces: 'Interfészek',
  2814. legend: 'Jelmagyarázat',
  2815. license: 'Licenc',
  2816. lines: 'Sorok',
  2817. metadata: 'Metaadatok',
  2818. methods: 'Metódusok',
  2819. miscellaneous: 'Egyéb',
  2820. module: 'Modul',
  2821. modules: 'Modulok',
  2822. name: 'Név',
  2823. no: 'Nem',
  2824. 'no-graph': 'Grafikon nem elérhető.',
  2825. 'no-iframe': 'A böngészője nem támogatja az iframe-eket.',
  2826. 'no-result-matching': 'Nincs találat',
  2827. 'no-svg': 'A böngészője nem támogatja az SVG formátumot.',
  2828. optional: 'Opcionális',
  2829. outputs: 'Kimenetek',
  2830. overview: 'Áttekintés',
  2831. parameters: 'Paraméterek',
  2832. 'peer-dependencies': 'Peer függőségek',
  2833. pipe: 'Pipe',
  2834. pipes: 'Pipe-ok',
  2835. prefix: 'Előtag',
  2836. properties: 'Tagváltozók',
  2837. providers: 'Providerek',
  2838. pure: 'Pure',
  2839. readme: 'README',
  2840. required: 'Kívánt',
  2841. reset: 'Visszaállít',
  2842. 'results-matching': 'találat',
  2843. returns: 'Visszatérési érték',
  2844. route: 'Útvonal',
  2845. routes: 'Útvonalak',
  2846. schemas: 'Sémák',
  2847. 'search-placeholder': 'Keresendő kifejezés',
  2848. selector: 'Szelektor',
  2849. signature: 'Aláírás',
  2850. source: 'Forrás',
  2851. standalone: 'Standalone',
  2852. statements: 'Utasítások',
  2853. styles: 'Stílusok',
  2854. template: 'Sablon',
  2855. type: 'Típus',
  2856. 'type-aliases': 'Típus álnév',
  2857. 'type-parameters': 'Típus paraméterek',
  2858. types: 'Típusok',
  2859. 'unamed-property': 'Névtelen property',
  2860. 'unit-test-coverage': 'Unit teszt lefedettség',
  2861. value: 'Érték',
  2862. variables: 'Változók',
  2863. yes: 'Igen',
  2864. zoomin: 'Nagyítás',
  2865. zoomout: 'Kicsinyítés'
  2866. };
  2867. var TRANSLATION_IT_IT = {
  2868. accessors: 'Accessori',
  2869. arguments: 'Argomenti',
  2870. bootstrap: 'Bootstrap',
  2871. branches: 'Rami',
  2872. browse: 'Cerca',
  2873. classe: 'Classe',
  2874. classes: 'Classi',
  2875. component: 'Componente',
  2876. components: 'Componenti',
  2877. constructor: 'Costruttore',
  2878. controllers: 'Controllers',
  2879. controller: 'Controller',
  2880. 'coverage-page-title': 'Copertura codice',
  2881. declarations: 'Dichiarazioni',
  2882. decorators: 'Decorators',
  2883. 'default-value': 'Valore predefinito',
  2884. 'defined-in': 'Definito in',
  2885. dependencies: 'Dependencies',
  2886. deprecated: 'Deprecata',
  2887. description: 'Descrizione',
  2888. directive: 'Direttiva',
  2889. directives: 'Direttive',
  2890. 'dom tree': 'Albero DOM',
  2891. entities: 'Entità',
  2892. entity: 'Entità',
  2893. entrycomponents: 'EntryComponents',
  2894. enumerations: 'Enumerations',
  2895. enums: 'Enums',
  2896. example: 'Esempio',
  2897. examples: 'Esempi',
  2898. exports: 'Exports',
  2899. extends: 'Extends',
  2900. file: 'File',
  2901. functions: 'Funzioni',
  2902. 'generated-using': 'Documentazione generata usando',
  2903. 'getting-started': 'Iniziamo',
  2904. guard: 'Guardia',
  2905. guards: 'Guardie',
  2906. hostbindings: 'HostBindings',
  2907. hostdirectives: 'HostDirectives',
  2908. hostlisteners: 'HostListeners',
  2909. 'html-element': 'Elemento Html',
  2910. 'html-element-with-directive': 'Elemento html con direttive',
  2911. identifier: 'Identificatore',
  2912. implements: 'Implementa',
  2913. imports: 'Importa',
  2914. index: 'Indice',
  2915. indexable: 'Indicizzabile',
  2916. info: 'Informazione',
  2917. 'inherited-from': 'ereditato da',
  2918. injectable: 'Injectable',
  2919. injectables: 'Injectables',
  2920. inputs: 'Input',
  2921. interceptors: 'Interceptors',
  2922. interface: 'Interfaccia',
  2923. interfaces: 'Interfacce',
  2924. legend: 'Legenda',
  2925. license: 'Licenza',
  2926. lines: 'Linee',
  2927. metadata: 'Metadati',
  2928. methods: 'Metodi',
  2929. miscellaneous: 'Varie',
  2930. module: 'Modulo',
  2931. modules: 'Moduli',
  2932. name: 'Nome',
  2933. no: 'No',
  2934. 'no-graph': 'Grafico non disponibile.',
  2935. 'no-iframe': 'Il tuo browser non supporta iframe.',
  2936. 'no-result-matching': 'Nessun risultato corrispondente',
  2937. 'no-svg': 'Il tuo browser non supporta SVG',
  2938. optional: 'Opzionale',
  2939. outputs: 'Output',
  2940. overview: 'Sommario',
  2941. parameters: 'Parametri',
  2942. 'peer-dependencies': 'Peer dependencies',
  2943. pipe: 'Pipe',
  2944. pipes: 'Pipes',
  2945. prefix: 'Prefisso',
  2946. properties: 'Proprietà',
  2947. providers: 'Providers',
  2948. pure: 'Pure',
  2949. readme: 'README',
  2950. required: 'Necessario',
  2951. reset: 'Reset',
  2952. 'results-matching': 'corrispondenza',
  2953. returns: 'Returns',
  2954. route: 'Route',
  2955. routes: 'Routes',
  2956. schemas: 'Schemas',
  2957. 'search-placeholder': 'Digita per avviare la ricerca',
  2958. selector: 'Selector',
  2959. signature: 'Signature',
  2960. source: 'Fonte',
  2961. standalone: 'Standalone',
  2962. statements: 'Statements',
  2963. styles: 'Stili',
  2964. template: 'Modello',
  2965. type: 'Tipo',
  2966. 'type-aliases': 'Type aliases',
  2967. 'type-parameters': 'Type parameters',
  2968. types: 'Tipi',
  2969. 'unamed-property': 'Proprietà senza nome',
  2970. 'unit-test-coverage': 'Copertura unit test',
  2971. value: 'Valori',
  2972. variables: 'Variabili',
  2973. yes: 'Si',
  2974. zoomin: 'Ingrandisci',
  2975. zoomout: 'Rimpocciolisci'
  2976. };
  2977. var TRANSLATION_JA_JP = {
  2978. accessors: 'アクセサ',
  2979. arguments: '引数',
  2980. bootstrap: 'ブートストラップ',
  2981. branches: 'ブランチ',
  2982. browse: 'ブラウズ',
  2983. classe: 'クラス',
  2984. classes: 'クラス',
  2985. component: 'コンポーネント',
  2986. components: 'コンポーネント',
  2987. constructor: 'コンストラクタ',
  2988. controllers: 'コントローラー',
  2989. controller: 'コントローラー',
  2990. 'coverage-page-title': 'カバレッジ',
  2991. declarations: '宣言',
  2992. decorators: 'デコレーター',
  2993. 'default-value': '初期値',
  2994. 'defined-in': 'Defined in',
  2995. dependencies: '依存関係',
  2996. deprecated: '非推奨',
  2997. description: '説明',
  2998. directive: 'ディレクティブ',
  2999. directives: 'ディレクティブ',
  3000. 'dom tree': 'DOM ツリー',
  3001. entities: 'エンティティ',
  3002. entity: '実在物',
  3003. entrycomponents: 'エントリーコンポーネント',
  3004. enumerations: '列挙型',
  3005. enums: 'Enums',
  3006. example: '例',
  3007. examples: '例',
  3008. exports: 'エクスポート',
  3009. extends: '継承',
  3010. file: 'ファイル',
  3011. functions: '関数',
  3012. 'generated-using': 'このドキュメントは以下を使用して生成されています',
  3013. 'getting-started': 'はじめに',
  3014. guard: 'ガード',
  3015. guards: 'ガード',
  3016. hostbindings: 'ホストバインディング',
  3017. hostdirectives: 'HostDirectives',
  3018. hostlisteners: 'ホストリスナー',
  3019. 'html-element': 'Html要素',
  3020. 'html-element-with-directive': 'ディレクティブHtml要素',
  3021. identifier: '識別子',
  3022. implements: '実装',
  3023. imports: 'インポート',
  3024. index: '索引',
  3025. indexable: 'インデクサブル',
  3026. info: '情報',
  3027. 'inherited-from': 'Inherited from',
  3028. injectable: 'インジェクタブル',
  3029. injectables: 'インジェクタブル',
  3030. inputs: '入力',
  3031. interceptors: 'インターセプター',
  3032. interface: 'インターフェイス',
  3033. interfaces: 'インターフェイス',
  3034. legend: '凡例',
  3035. license: 'ライセンス',
  3036. lines: '行数',
  3037. metadata: 'メタデータ',
  3038. methods: 'メソッド',
  3039. miscellaneous: 'その他',
  3040. module: 'モジュール',
  3041. modules: 'モジュール',
  3042. name: '名前',
  3043. no: 'いいえ',
  3044. 'no-graph': '使用できるグラフがありません',
  3045. 'no-iframe': 'ブラウザがiframeを対応していません',
  3046. 'no-result-matching': '見つかりませんでした',
  3047. 'no-svg': 'ブラウザがSVGに対応してません',
  3048. optional: 'オプション',
  3049. outputs: '出力',
  3050. overview: '概要',
  3051. parameters: 'パラメータ',
  3052. 'peer-dependencies': 'Peer dependencies',
  3053. pipe: 'パイプ',
  3054. pipes: 'パイプ',
  3055. prefix: '接頭辞',
  3056. properties: 'プロパティ',
  3057. providers: 'プロバイダー',
  3058. pure: 'Pure',
  3059. readme: 'README',
  3060. required: '必要',
  3061. reset: 'リセット',
  3062. 'results-matching': '件の結果が一致しました',
  3063. returns: '戻り値',
  3064. route: 'ルート',
  3065. routes: 'ルート',
  3066. schemas: 'スキーマ',
  3067. 'search-placeholder': '入力して検索',
  3068. selector: 'セレクタ',
  3069. signature: 'シグネチャ',
  3070. source: 'ソース',
  3071. standalone: 'Standalone',
  3072. statements: '文',
  3073. styles: 'スタイル',
  3074. template: 'テンプレート',
  3075. type: '型',
  3076. 'type-aliases': 'タイプエイリアス',
  3077. 'type-parameters': '型パラメーター',
  3078. types: '型',
  3079. 'unamed-property': '匿名プロパティ',
  3080. 'unit-test-coverage': 'ユニットテストカバレッジ',
  3081. value: '値',
  3082. variables: '変数',
  3083. yes: 'はい',
  3084. zoomin: '拡大',
  3085. zoomout: '縮小'
  3086. };
  3087. var TRANSLATION_KA_GE = {
  3088. accessors: 'აქსესორი',
  3089. arguments: 'არგუმენტები',
  3090. bootstrap: 'ჩამტვირთავი',
  3091. branches: 'ტოტები',
  3092. browse: 'დაათვალიერე',
  3093. classe: 'კლასი',
  3094. classes: 'კლასები',
  3095. component: 'კომპონენტი',
  3096. components: 'კომპონენტები',
  3097. constructor: 'კონსტრუქტორი',
  3098. controllers: 'კონტროლერები',
  3099. controller: 'კონტროლერი',
  3100. 'coverage-page-title': 'დოკუმენტაციის გაშუქება',
  3101. declarations: 'დეკლარაციები',
  3102. decorators: 'დეკორატორები',
  3103. 'default-value': 'ნაგულისხმევი მნიშვნელობა',
  3104. 'defined-in': 'აღწერილია',
  3105. dependencies: 'დამოკიდებულებები',
  3106. deprecated: 'მოძველებულია',
  3107. description: 'აღწერა',
  3108. directive: 'დირექტივა',
  3109. directives: 'დირექტივები',
  3110. 'dom tree': 'DOM ხე',
  3111. entities: 'სუბიექტები',
  3112. entity: 'სუბიექტი',
  3113. entrycomponents: 'შესვლის კომპონენტები',
  3114. enumerations: 'ჩამოთვლები',
  3115. enums: 'ენამები',
  3116. example: 'მაგალითი',
  3117. examples: 'მაგალითები',
  3118. exports: 'ექსპორტი',
  3119. extends: 'აგრძელებს',
  3120. file: 'ფაილი',
  3121. functions: 'ფუნქციები',
  3122. 'generated-using': 'დოკუმენტაცია დაგენერირდა გამოყენებით',
  3123. 'getting-started': 'ვიწყებთ',
  3124. guard: 'მცველი',
  3125. guards: 'მცველები',
  3126. hostbindings: 'ჰოსტის დამაკავშირებლები',
  3127. hostdirectives: 'ჰოსტის დირექტივები',
  3128. hostlisteners: 'ჰოსტის მსმენელები',
  3129. 'html-element': 'Html ელემენტი',
  3130. 'html-element-with-directive': 'Html ელემენტი დირექტივით',
  3131. identifier: 'იდენტიფიკატორი',
  3132. implements: 'ახორციელებს',
  3133. imports: 'იმპორტი',
  3134. index: 'ინდექსი',
  3135. indexable: 'ინდექსირებადი',
  3136. info: 'ინფორმაცია',
  3137. 'inherited-from': 'მემკვიდრეობით მიიღო',
  3138. injectable: 'ინექცია',
  3139. injectables: 'საინექციო საშუალებები',
  3140. inputs: 'შეყვანები',
  3141. interceptors: 'ჩამჭრელები',
  3142. interface: 'ინტერფეისი',
  3143. interfaces: 'ინტერფეისები',
  3144. legend: 'ლეგენდა',
  3145. license: 'ლიცენზია',
  3146. lines: 'ხაზები',
  3147. metadata: 'მეტამონაცემები',
  3148. methods: 'მეთოდები',
  3149. miscellaneous: 'სხვადასხვა',
  3150. module: 'მოდული',
  3151. modules: 'მოდულები',
  3152. name: 'სახელები',
  3153. no: 'არა',
  3154. 'no-graph': 'გრაფი არ არის ხელმისაწვდომი.',
  3155. 'no-iframe': 'თქვენს ბრაუზერს არ აქვს iframes-ის მხარდაჭერა.',
  3156. 'no-result-matching': 'არ არის შესაბამისი შედეგები',
  3157. 'no-svg': 'თქვენს ბრაუზერს არ აქვს SVG მხარდაჭერა',
  3158. optional: 'სურვილისამებრ',
  3159. outputs: 'შედეგები',
  3160. overview: 'მიმოხილვა',
  3161. parameters: 'პარამეტრები',
  3162. 'peer-dependencies': 'თანატოლებთან დამოკიდებულებები',
  3163. pipe: 'მილი',
  3164. pipes: 'მილები',
  3165. prefix: 'პრეფიქსი',
  3166. properties: 'თვისება',
  3167. providers: 'პროვაიდერი',
  3168. pure: 'წმინდა',
  3169. readme: 'README',
  3170. required: 'აუცილებელი',
  3171. reset: 'გადატვირთვა',
  3172. 'results-matching': 'შედეგები ემთხვევა',
  3173. returns: 'ბრუნდება',
  3174. route: 'მარშრუტი',
  3175. routes: 'მარშრუტები',
  3176. schemas: 'სქემები',
  3177. 'search-placeholder': 'დაწერე მოსაძებნად',
  3178. selector: 'სელექტორი',
  3179. signature: 'ხელმოწერა',
  3180. source: 'წყარო',
  3181. standalone: 'დამოუკიდებელი',
  3182. statements: 'განცხადებები',
  3183. styles: 'სტილები',
  3184. template: 'შაბლონი',
  3185. type: 'ტიპი',
  3186. 'type-aliases': 'მეტსახელის ტიპი',
  3187. 'type-parameters': 'პარამეტრების ტიპი',
  3188. types: 'ტიპები',
  3189. 'unamed-property': 'უსახელო თვისება',
  3190. 'unit-test-coverage': 'ერთეული ტესტის გაშუქება',
  3191. value: 'მნიშვნელობა',
  3192. variables: 'ცვლადები',
  3193. yes: 'კი',
  3194. zoomin: 'მიახლოვება',
  3195. zoomout: 'მასშტაბირება'
  3196. };
  3197. var TRANSLATION_KO_KR = {
  3198. accessors: '접근자',
  3199. arguments: '인수',
  3200. bootstrap: 'Bootstrap',
  3201. branches: '브랜치',
  3202. browse: '탐색',
  3203. classe: '클래스',
  3204. classes: '클래스',
  3205. component: '컴포넌트',
  3206. components: '컴포넌트',
  3207. constructor: '생성자',
  3208. controllers: '컨트롤러',
  3209. controller: '컨트롤러',
  3210. 'coverage-page-title': '문서 커버리지',
  3211. declarations: '선언',
  3212. decorators: '데코레이터',
  3213. 'default-value': '기본 값',
  3214. 'defined-in': '다음에 정의됨',
  3215. dependencies: '의존성',
  3216. deprecated: '비추천',
  3217. description: '설명',
  3218. directive: 'Directive',
  3219. directives: 'Directives',
  3220. 'dom tree': '돔 트리',
  3221. entities: '엔티티',
  3222. entity: '실재',
  3223. entrycomponents: 'EntryComponents',
  3224. enumerations: '열거',
  3225. enums: 'Enums',
  3226. example: '예시',
  3227. examples: '예',
  3228. exports: '내보내기',
  3229. extends: 'Extends',
  3230. file: '파일',
  3231. functions: '함수',
  3232. 'generated-using': '이 문서는 다음을 이용하여 생성되었습니다',
  3233. 'getting-started': '시작하기',
  3234. guard: '가드',
  3235. guards: '가드',
  3236. hostbindings: 'HostBindings',
  3237. hostdirectives: 'HostDirectives',
  3238. hostlisteners: 'HostListeners',
  3239. 'html-element': 'HTML 요소',
  3240. 'html-element-with-directive': '지시어가 있는 HTML 요소',
  3241. identifier: '식별자',
  3242. implements: '구현',
  3243. imports: '가져오기',
  3244. index: '색인',
  3245. indexable: 'Indexable',
  3246. info: '정보',
  3247. 'inherited-from': '다음에서 상속됨',
  3248. injectable: 'Injectable',
  3249. injectables: 'Injectables',
  3250. inputs: '입력',
  3251. interceptors: 'Interceptors',
  3252. interface: '인터페이스',
  3253. interfaces: '인터페이스',
  3254. legend: '범례',
  3255. license: '라이선스',
  3256. lines: '줄',
  3257. metadata: '메타데이터',
  3258. methods: '메소드',
  3259. miscellaneous: '기타',
  3260. module: '모듈',
  3261. modules: '모듈',
  3262. name: '이름',
  3263. no: '아니오',
  3264. 'no-graph': '사용할 수 있는 그래프가 없습니다.',
  3265. 'no-iframe': '사용중인 브라우저가 iframe을 지원하지 않습니다',
  3266. 'no-result-matching': '검색 결과가 없습니다',
  3267. 'no-svg': '브라우저가 SVG를 지원하지 않습니다',
  3268. optional: '선택적',
  3269. outputs: '결과물',
  3270. overview: '개요',
  3271. parameters: '매개변수',
  3272. 'peer-dependencies': '상호 의존성',
  3273. pipe: '파이프',
  3274. pipes: '파이프',
  3275. prefix: '접두어',
  3276. properties: '속성',
  3277. providers: '제공자',
  3278. pure: 'Pure',
  3279. readme: 'README',
  3280. required: '필수의',
  3281. reset: '초기화',
  3282. 'results-matching': '개의 결과가 일치했습니다',
  3283. returns: '반환',
  3284. route: 'Route',
  3285. routes: 'Routes',
  3286. schemas: '스키마',
  3287. 'search-placeholder': '검색어 입력',
  3288. selector: '선택자',
  3289. signature: 'Signature',
  3290. source: '출처',
  3291. standalone: 'Standalone',
  3292. statements: 'Statements',
  3293. styles: '스타일',
  3294. template: '주형',
  3295. type: '타입',
  3296. 'type-aliases': '타입 별칭',
  3297. 'type-parameters': '타입 매개 변수',
  3298. types: '타입',
  3299. 'unamed-property': '익명 속성',
  3300. 'unit-test-coverage': '단위 테스트 커버리지',
  3301. value: '값',
  3302. variables: '변수',
  3303. yes: '네',
  3304. zoomin: '확대',
  3305. zoomout: '축소'
  3306. };
  3307. var TRANSLATION_NL_NL = {
  3308. accessors: 'Accessors',
  3309. arguments: 'Argumenten',
  3310. bootstrap: 'Bootstrap',
  3311. branches: 'Branches',
  3312. browse: 'Browse',
  3313. classe: 'Klasse',
  3314. classes: 'Klassen',
  3315. component: 'Component',
  3316. components: 'Componenten',
  3317. constructor: 'Constructor',
  3318. controllers: 'Controllers',
  3319. controller: 'Controller',
  3320. 'coverage-page-title': 'Documentatie coverage',
  3321. declarations: 'Declaraties',
  3322. decorators: 'Decorators',
  3323. 'default-value': 'Default waarde',
  3324. 'defined-in': 'Gedefinieerd in',
  3325. dependencies: 'Dependencies',
  3326. deprecated: 'Verouderd',
  3327. description: 'Omschrijving',
  3328. directive: 'Directive',
  3329. directives: 'Directives',
  3330. 'dom tree': 'DOM boom',
  3331. entities: 'Entiteiten',
  3332. entity: 'Entiteit',
  3333. entrycomponents: 'EntryComponents',
  3334. enumerations: 'Enumerations',
  3335. enums: 'Enums',
  3336. example: 'Voorbeeld',
  3337. examples: 'Voorbeelden',
  3338. exports: 'Exports',
  3339. extends: 'Extends',
  3340. file: 'Bestand',
  3341. functions: 'Functies',
  3342. 'generated-using': 'Documentatie gegenereed met',
  3343. 'getting-started': 'Aan de slag',
  3344. guard: 'Guard',
  3345. guards: 'Guards',
  3346. hostbindings: 'HostBindings',
  3347. hostdirectives: 'HostDirectives',
  3348. hostlisteners: 'HostListeners',
  3349. 'html-element': 'Html element',
  3350. 'html-element-with-directive': 'Html element met directive',
  3351. identifier: 'Identifier',
  3352. implements: 'Implementeert',
  3353. imports: 'Imports',
  3354. index: 'Index',
  3355. indexable: 'Indexeerbaar',
  3356. info: 'Informatie',
  3357. 'inherited-from': 'Inherited van',
  3358. injectable: 'Injectable',
  3359. injectables: 'Injectables',
  3360. inputs: 'Inputs',
  3361. interceptors: 'Interceptors',
  3362. interface: 'Interface',
  3363. interfaces: 'Interfaces',
  3364. legend: 'Legenda',
  3365. license: 'Licentie',
  3366. lines: 'Regels',
  3367. metadata: 'Metadata',
  3368. methods: 'Methods',
  3369. miscellaneous: 'Diversen',
  3370. module: 'Module',
  3371. modules: 'Modules',
  3372. name: 'Naam',
  3373. no: 'Nee',
  3374. 'no-graph': 'Geen diagram beschikbaar.',
  3375. 'no-iframe': 'Uw browser ondersteund geen iframes.',
  3376. 'no-result-matching': 'Geen overeenkomende resultaten',
  3377. 'no-svg': 'Uw browser ondersteund geen SVG',
  3378. optional: 'Optioneel',
  3379. outputs: 'Outputs',
  3380. overview: 'Overzicht',
  3381. parameters: 'Parameters',
  3382. 'peer-dependencies': 'Peer dependencies',
  3383. pipe: 'Pipe',
  3384. pipes: 'Pipes',
  3385. prefix: 'Voorvoegsel',
  3386. properties: 'Properties',
  3387. providers: 'Providers',
  3388. pure: 'Puur',
  3389. readme: 'README',
  3390. required: 'Vereist',
  3391. reset: 'Reset',
  3392. 'results-matching': 'overeenkomende resultaten',
  3393. returns: 'Returns',
  3394. route: 'Route',
  3395. routes: 'Routes',
  3396. schemas: "Schema's",
  3397. 'search-placeholder': 'Type om te zoeken',
  3398. selector: 'Selector',
  3399. signature: 'Handtekening',
  3400. source: 'Bron',
  3401. standalone: 'Standalone',
  3402. statements: 'Statements',
  3403. styles: 'Stijlen',
  3404. template: 'Sjabloon',
  3405. type: 'Type',
  3406. 'type-aliases': 'Type aliassen',
  3407. 'type-parameters': 'Type parameters',
  3408. types: 'Types',
  3409. 'unamed-property': 'Naamloze property',
  3410. 'unit-test-coverage': 'Unit test coverage',
  3411. value: 'Waarde',
  3412. variables: 'Variabelen',
  3413. yes: 'Ja',
  3414. zoomin: 'Zoom in',
  3415. zoomout: 'Zoom uit'
  3416. };
  3417. var TRANSLATION_PL_PL = {
  3418. accessors: 'Akcesor',
  3419. arguments: 'Argumenty',
  3420. bootstrap: 'Uruchomienie',
  3421. branches: 'Gałęzie',
  3422. browse: 'Przeglądaj',
  3423. classe: 'Klasa',
  3424. classes: 'Klasy',
  3425. component: 'Komponent',
  3426. components: 'Komponenty',
  3427. constructor: 'Konstruktor',
  3428. controllers: 'Kontrolery',
  3429. controller: 'Kontroler',
  3430. 'coverage-page-title': 'Pokrycie dokumentacją',
  3431. declarations: 'Deklaracje',
  3432. decorators: 'Dekoratory',
  3433. 'default-value': 'Domyślna wartość',
  3434. 'defined-in': 'Zdefiniowane w',
  3435. dependencies: 'Biblioteki',
  3436. deprecated: 'Przestarzałe',
  3437. description: 'Opis',
  3438. directive: 'Dyrektywa',
  3439. directives: 'Dyrektywy',
  3440. 'dom tree': 'DOM drzewo',
  3441. entities: 'Podmioty',
  3442. entity: 'Podmiot',
  3443. entrycomponents: 'EntryComponents',
  3444. enumerations: 'Enumeracje',
  3445. enums: 'Enumy',
  3446. example: 'Przykład',
  3447. examples: 'Przykłady',
  3448. exports: 'Exporty',
  3449. extends: 'Rozszerza',
  3450. file: 'Plik',
  3451. functions: 'Funkcje',
  3452. 'generated-using': 'Dokumentacja wygenerowana przy użyciu',
  3453. 'getting-started': 'Start',
  3454. guard: 'Guard',
  3455. guards: "Guard'y",
  3456. hostbindings: 'HostBindingi',
  3457. hostdirectives: 'HostDirectives',
  3458. hostlisteners: 'HostListenery',
  3459. 'html-element': 'Html element',
  3460. 'html-element-with-directive': 'Html element z dyrektywą',
  3461. identifier: 'Identyfikator',
  3462. implements: 'Implementuje',
  3463. imports: 'Importuje',
  3464. index: 'Indeks',
  3465. indexable: 'Indeksowany',
  3466. info: 'Informatie',
  3467. 'inherited-from': 'Dziedziczy z',
  3468. injectable: 'Injectable',
  3469. injectables: 'Injectables',
  3470. inputs: 'Inputy',
  3471. interceptors: 'Interceptory',
  3472. interface: 'Interfejs',
  3473. interfaces: 'Interfejsy',
  3474. legend: 'Legenda',
  3475. license: 'Licencja',
  3476. lines: 'Linie',
  3477. metadata: 'Metadane',
  3478. methods: 'Metody',
  3479. miscellaneous: 'Różne',
  3480. module: 'Moduł',
  3481. modules: 'Moduły',
  3482. name: 'Nazwa',
  3483. no: 'Nie',
  3484. 'no-graph': 'Graf niedostępny.',
  3485. 'no-iframe': "Twoja przeglądarka nie wspiera iframe'ów.",
  3486. 'no-result-matching': 'Brak pasujących wyników',
  3487. 'no-svg': 'Twoja przeglądarka nie wspiera SVG',
  3488. optional: 'Opcjonalne',
  3489. outputs: 'Outputy',
  3490. overview: 'Przegląd',
  3491. parameters: 'Parametry',
  3492. 'peer-dependencies': 'Biblioteki zależne',
  3493. pipe: 'Pipe',
  3494. pipes: "Pipe'y",
  3495. prefix: 'Prefiks',
  3496. properties: 'Włąściwości',
  3497. providers: 'Dostarczyciele',
  3498. pure: 'Czysty',
  3499. readme: 'README',
  3500. required: 'Wymagany',
  3501. reset: 'Reset',
  3502. 'results-matching': 'pasujących wyników',
  3503. returns: 'Zwraca',
  3504. route: 'Route',
  3505. routes: "Route'y",
  3506. schemas: 'Schematy',
  3507. 'search-placeholder': 'Wprowadź tekst wyszukiwania',
  3508. selector: 'Selektor',
  3509. signature: 'Podpis',
  3510. source: 'Source',
  3511. standalone: 'Standalone',
  3512. statements: 'Instrukcje',
  3513. styles: 'Estilos',
  3514. template: 'Modelo',
  3515. type: 'Typ',
  3516. 'type-aliases': 'Aliasy typów',
  3517. 'type-parameters': 'Parametry typów',
  3518. types: 'Typy',
  3519. 'unamed-property': 'Nienazwana właśność',
  3520. 'unit-test-coverage': 'Pokrycie testami jednostkowymi',
  3521. value: 'Wartość',
  3522. variables: 'Zmienne',
  3523. yes: 'Tak',
  3524. zoomin: 'Przybliż',
  3525. zoomout: 'Oddal'
  3526. };
  3527. var TRANSLATION_PT_BR = {
  3528. accessors: 'Acessores',
  3529. arguments: 'Argumentos',
  3530. bootstrap: 'Bootstrap',
  3531. branches: 'Branches',
  3532. browse: 'Navegar',
  3533. classe: 'Classe',
  3534. classes: 'Classes',
  3535. component: 'Componente',
  3536. components: 'Componentes',
  3537. constructor: 'Construtor',
  3538. controllers: 'Controladores',
  3539. controller: 'Controlador',
  3540. 'coverage-page-title': 'Cobertura da documentação',
  3541. declarations: 'Declarações',
  3542. decorators: 'Decoradores',
  3543. 'default-value': 'Valor padrão',
  3544. 'defined-in': 'Definido em',
  3545. dependencies: 'Dependências',
  3546. deprecated: 'Descontinuada',
  3547. description: 'Descrição',
  3548. directive: 'Diretiva',
  3549. directives: 'Diretivas',
  3550. 'dom tree': 'Arvore DOM',
  3551. entities: 'Entidades',
  3552. entity: 'Entidade',
  3553. entrycomponents: 'EntryComponents',
  3554. enumerations: 'Enumerações',
  3555. enums: 'Enums',
  3556. example: 'Exemplo',
  3557. examples: 'Exemplos',
  3558. exports: 'Exports',
  3559. extends: 'Extende',
  3560. file: 'Arquivo',
  3561. functions: 'Funções',
  3562. 'generated-using': 'Documentação gerada usando',
  3563. 'getting-started': 'Começando',
  3564. guard: 'Guarda',
  3565. guards: 'Guardas',
  3566. hostbindings: 'HostBindings',
  3567. hostdirectives: 'HostDirectives',
  3568. hostlisteners: 'HostListeners',
  3569. 'html-element': 'Elemento HTML',
  3570. 'html-element-with-directive': 'Elemento HTML com diretiva',
  3571. identifier: 'Identificador',
  3572. implements: 'Implementa',
  3573. imports: 'Imports',
  3574. index: 'Index',
  3575. indexable: 'Indexável',
  3576. info: 'Informação',
  3577. 'inherited-from': 'Herdado de',
  3578. injectable: 'Injetável',
  3579. injectables: 'Injetáveis',
  3580. inputs: 'Inputs',
  3581. interceptors: 'Interceptors',
  3582. interface: 'Interface',
  3583. interfaces: 'Interfaces',
  3584. legend: 'Legend',
  3585. license: 'Licença',
  3586. lines: 'Linhas',
  3587. metadata: 'Metadata',
  3588. methods: 'Métodos',
  3589. miscellaneous: 'Miscelânea',
  3590. module: 'Módulo',
  3591. modules: 'Módulos',
  3592. name: 'Nome',
  3593. no: 'Não',
  3594. 'no-graph': 'Sem gráfico disponível.',
  3595. 'no-iframe': 'Seu browser não tem suporte a iframes.',
  3596. 'no-result-matching': 'Nenhum resultado correspondente',
  3597. 'no-svg': 'Seu browser não tem suporte a SVG',
  3598. optional: 'Opcional',
  3599. outputs: 'Outputs',
  3600. overview: 'Visão geral',
  3601. parameters: 'Parâmetros',
  3602. 'peer-dependencies': 'Peer dependencies',
  3603. pipe: 'Pipe',
  3604. pipes: 'Pipes',
  3605. prefix: 'Prefixo',
  3606. properties: 'Propriedades',
  3607. providers: 'Providers',
  3608. pure: 'Puro',
  3609. readme: 'README',
  3610. required: 'Obrigatório',
  3611. reset: 'Resetar',
  3612. 'results-matching': 'resultados correspondentes',
  3613. returns: 'Retorna',
  3614. route: 'Rota',
  3615. routes: 'Rotas',
  3616. schemas: 'Esquemas',
  3617. 'search-placeholder': 'Digite para pesquisar',
  3618. selector: 'Seletor',
  3619. signature: 'Assinatura',
  3620. source: 'Fonte',
  3621. standalone: 'Standalone',
  3622. statements: 'Statements',
  3623. styles: 'Estilos',
  3624. template: 'Modelo',
  3625. type: 'Tipo',
  3626. 'type-aliases': 'Aliases de tipo',
  3627. 'type-parameters': 'Parâmetros de tipo',
  3628. types: 'Tipos',
  3629. 'unamed-property': 'Propriedade não-nomeada',
  3630. 'unit-test-coverage': 'Cobertura de teste unitário',
  3631. value: 'Valor',
  3632. variables: 'Variáveis',
  3633. yes: 'Sim',
  3634. zoomin: 'Zoom in',
  3635. zoomout: 'Zoom out'
  3636. };
  3637. var TRANSLATION_RU_RU = {
  3638. accessors: 'Аксессор',
  3639. arguments: 'Аргументы',
  3640. bootstrap: 'Загрузчик',
  3641. branches: 'Ветки',
  3642. browse: 'Обзор',
  3643. classe: 'Класс',
  3644. classes: 'Классы',
  3645. component: 'Компонент',
  3646. components: 'Компоненты',
  3647. constructor: 'Конструктор',
  3648. controllers: 'Контроллеры',
  3649. controller: 'Контроллер',
  3650. 'coverage-page-title': 'Покрытие документацией',
  3651. declarations: 'Декларации',
  3652. decorators: 'Декораторы',
  3653. 'default-value': 'Значение по умолчанию',
  3654. 'defined-in': 'Определен в',
  3655. dependencies: 'Зависимости',
  3656. deprecated: 'Устаревшая',
  3657. description: 'Описание',
  3658. directive: 'Директива',
  3659. directives: 'Директивы',
  3660. 'dom tree': 'DOM-дерево',
  3661. entities: 'Сущности',
  3662. entity: 'Сущность',
  3663. entrycomponents: 'Входные компоненты',
  3664. enumerations: 'Перечисления',
  3665. enums: 'Перечисления',
  3666. example: 'Пример',
  3667. examples: 'Примеры',
  3668. exports: 'Экспорт',
  3669. extends: 'Расширяет',
  3670. file: 'Файл',
  3671. functions: 'Функции',
  3672. 'generated-using': 'Документация создана с помощью',
  3673. 'getting-started': 'Начало работы',
  3674. guard: 'Защитник',
  3675. guards: 'Защитники',
  3676. hostbindings: 'Привязки хоста',
  3677. hostdirectives: 'Директивы хоста',
  3678. hostlisteners: 'Слушатели хоста',
  3679. 'html-element': 'Html-элемент',
  3680. 'html-element-with-directive': 'Html-элемент с директивой',
  3681. identifier: 'Идентификатор',
  3682. implements: 'Реализует',
  3683. imports: 'Импорт',
  3684. index: 'Индекс',
  3685. indexable: 'Индексируемый',
  3686. info: 'Информация',
  3687. 'inherited-from': 'Наследуемый из',
  3688. injectable: 'Внедрение',
  3689. injectables: 'Внедрения',
  3690. inputs: 'Входные данные',
  3691. interceptors: 'Перехватчики',
  3692. interface: 'Интерфейс',
  3693. interfaces: 'Интерфейсы',
  3694. legend: 'Легенда',
  3695. license: 'Лицензия',
  3696. lines: 'Строки',
  3697. metadata: 'Метаданные',
  3698. methods: 'Методы',
  3699. miscellaneous: 'Разное',
  3700. module: 'Модуль',
  3701. modules: 'Модули',
  3702. name: 'Имя',
  3703. no: 'Нет',
  3704. 'no-graph': 'Диаграмма недоступна.',
  3705. 'no-iframe': 'Браузер не поддерживает iframes.',
  3706. 'no-result-matching': 'Результаты не найдены',
  3707. 'no-svg': 'Браузер не поддерживает SVG',
  3708. optional: 'Опциональный',
  3709. outputs: 'Выходные данные',
  3710. overview: 'Обзор',
  3711. parameters: 'Параметры',
  3712. 'peer-dependencies': 'Одноранговые зависимости',
  3713. pipe: 'Конвейер',
  3714. pipes: 'Конвейеры',
  3715. prefix: 'Префикс',
  3716. properties: 'Свойства',
  3717. providers: 'Провайдеры',
  3718. pure: 'Чистый',
  3719. readme: 'README',
  3720. required: 'Требуемый',
  3721. reset: 'Сброс',
  3722. 'results-matching': 'результатов найдено',
  3723. returns: 'Тип возвращаемого значения',
  3724. route: 'Маршрут',
  3725. routes: 'Маршруты',
  3726. schemas: 'Схемы',
  3727. 'search-placeholder': 'Введите для поиска',
  3728. selector: 'Селектор',
  3729. signature: 'Сигнатура',
  3730. source: 'Источник',
  3731. standalone: 'Автономный',
  3732. statements: 'Утверждения',
  3733. styles: 'Стили',
  3734. template: 'Шаблон',
  3735. type: 'Тип',
  3736. 'type-aliases': 'Псевдонимы типов',
  3737. 'type-parameters': 'Типы параметров',
  3738. types: 'Типы',
  3739. 'unamed-property': 'Безымянное свойство',
  3740. 'unit-test-coverage': 'Покрытие модульными тестами',
  3741. value: 'Значение',
  3742. variables: 'Переменные',
  3743. yes: 'Да',
  3744. zoomin: 'Приблизить',
  3745. zoomout: 'Отдалить'
  3746. };
  3747. var TRANSLATION_SK_SK = {
  3748. accessors: 'Modifikátory prístupu',
  3749. arguments: 'Argumenty',
  3750. bootstrap: 'Bootstrap',
  3751. branches: 'Vetvy',
  3752. browse: 'Prezerať',
  3753. classe: 'Trieda',
  3754. classes: 'Triedy',
  3755. component: 'Komponent',
  3756. components: 'Komponenty',
  3757. constructor: 'Konštruktor',
  3758. controllers: 'Controllers',
  3759. controller: 'Controller',
  3760. 'coverage-page-title': 'Pokrytie dokumentáciou',
  3761. declarations: 'Deklarácie',
  3762. decorators: 'Dekorátory',
  3763. 'default-value': 'Predvolená hodnota',
  3764. 'defined-in': 'Definované v',
  3765. dependencies: 'Závislosti',
  3766. deprecated: 'Zastarel',
  3767. description: 'Popis',
  3768. directive: 'Direktíva',
  3769. directives: 'Direktívy',
  3770. 'dom tree': 'DOM strom',
  3771. entities: 'Subjektov',
  3772. entity: 'Subjekt',
  3773. entrycomponents: 'EntryComponents',
  3774. enumerations: 'Enumerátory',
  3775. enums: 'Enumerátory',
  3776. example: 'Príklad',
  3777. examples: 'Príklady',
  3778. exports: 'Exporty',
  3779. extends: 'Rozširuje',
  3780. file: 'Súbor',
  3781. functions: 'Funkcie',
  3782. 'generated-using': 'Dokumentácia vytvorená pomocou',
  3783. 'getting-started': 'Začíname',
  3784. guard: 'Guard',
  3785. guards: 'Guards',
  3786. hostbindings: 'HostBindings',
  3787. hostdirectives: 'HostDirectives',
  3788. hostlisteners: 'HostListeners',
  3789. 'html-element': 'HTML element',
  3790. 'html-element-with-directive': 'HTML element s direktívou',
  3791. identifier: 'Identifikátor',
  3792. implements: 'Implementuje',
  3793. imports: 'Importuje',
  3794. index: 'Index',
  3795. indexable: 'Indexovateľný',
  3796. info: 'Informácie',
  3797. 'inherited-from': 'Zdedené od',
  3798. injectable: 'Injectable',
  3799. injectables: 'Injectables',
  3800. inputs: 'Vstupy',
  3801. interceptors: 'Interceptors',
  3802. interface: 'Rozhranie',
  3803. interfaces: 'Rozhrania',
  3804. legend: 'Legenda',
  3805. license: 'Licencia',
  3806. lines: 'Riadky',
  3807. metadata: 'Metadáta',
  3808. methods: 'Metódy',
  3809. miscellaneous: 'Rôzne',
  3810. module: 'Modul',
  3811. modules: 'Moduly',
  3812. name: 'Názov',
  3813. no: 'Nie',
  3814. 'no-graph': 'Nie je k dispozícii žiadny graf.',
  3815. 'no-iframe': 'Váš prehliadač nepodporuje iframe',
  3816. 'no-result-matching': 'Nenájdené žiadne výsledky pre',
  3817. 'no-svg': 'Váš prehliadač nepodporuje SVG',
  3818. optional: 'Voliteľný',
  3819. outputs: 'Výstupy',
  3820. overview: 'Prehľad',
  3821. parameters: 'Parametre',
  3822. 'peer-dependencies': 'Peer dependencies',
  3823. pipe: 'Pipe',
  3824. pipes: 'Pipes',
  3825. prefix: 'Prefix',
  3826. properties: 'Vlastnosti',
  3827. providers: 'Providers',
  3828. pure: 'Pure',
  3829. readme: 'README',
  3830. required: 'Požadovaný',
  3831. reset: 'Resetovať',
  3832. 'results-matching': 'výsledkov pre',
  3833. returns: 'Návratová hodnota',
  3834. route: 'Route',
  3835. routes: 'Routes',
  3836. schemas: 'Schémy',
  3837. 'search-placeholder': 'Zadajte hľadaný text',
  3838. selector: 'Selektor',
  3839. signature: 'Podpis',
  3840. source: 'Zdroj',
  3841. standalone: 'Standalone',
  3842. statements: 'Statements',
  3843. styles: 'Štýly',
  3844. template: 'Šablóna',
  3845. type: 'Typ',
  3846. 'type-aliases': 'Type aliases',
  3847. 'type-parameters': 'Type parameters',
  3848. types: 'Typy',
  3849. 'unamed-property': 'Nepomenovaný atribút',
  3850. 'unit-test-coverage': 'Pokrytie unit testami',
  3851. value: 'Hodnota',
  3852. variables: 'Premenné',
  3853. yes: 'Áno',
  3854. zoomin: 'Priblížiť',
  3855. zoomout: 'Oddialiť'
  3856. };
  3857. var TRANSLATION_ZH_CN = {
  3858. accessors: '存取器',
  3859. arguments: 'Arguments',
  3860. bootstrap: '根组件',
  3861. branches: '分支',
  3862. browse: '查看',
  3863. classe: '类',
  3864. classes: '类列表',
  3865. component: '组件',
  3866. components: '组件列表',
  3867. constructor: '构造方法',
  3868. controllers: 'Controllers',
  3869. controller: 'Controller',
  3870. 'coverage-page-title': '文档概览',
  3871. declarations: '可声明对象列表',
  3872. decorators: '装饰器列表',
  3873. 'default-value': '缺省值',
  3874. 'defined-in': '被定义在',
  3875. dependencies: '依赖项',
  3876. deprecated: '已弃用',
  3877. description: '描述',
  3878. directive: '指令',
  3879. directives: '指令列表',
  3880. 'dom tree': 'DOM 树',
  3881. entities: '实体',
  3882. entity: '实体',
  3883. entrycomponents: '入口组件列表',
  3884. enumerations: '列举',
  3885. enums: '枚举列表',
  3886. example: '例子',
  3887. examples: '例子',
  3888. exports: '导出',
  3889. extends: '继承',
  3890. file: '文件',
  3891. functions: '函数',
  3892. 'generated-using': '文档生成使用',
  3893. 'getting-started': '入门指南',
  3894. guard: '路由守卫',
  3895. guards: '路由守卫列表',
  3896. hostbindings: '宿主绑定',
  3897. hostdirectives: 'Host Directives',
  3898. hostlisteners: '宿主监听',
  3899. 'html-element': 'Html 元素',
  3900. 'html-element-with-directive': '带指令的Html元素',
  3901. identifier: '标识符',
  3902. implements: '实现',
  3903. imports: '引入',
  3904. index: '索引',
  3905. indexable: 'Indexable',
  3906. info: '信息',
  3907. 'inherited-from': '继承自',
  3908. injectable: '可注入的',
  3909. injectables: '可注入的',
  3910. inputs: '输入属性',
  3911. interceptors: '拦截器',
  3912. interface: '接口',
  3913. interfaces: '接口',
  3914. legend: '图例',
  3915. license: '许可协议',
  3916. lines: 'Lines',
  3917. metadata: '元数据',
  3918. methods: '方法',
  3919. miscellaneous: '其他',
  3920. module: '模块',
  3921. modules: '模块列表',
  3922. name: '名称',
  3923. no: '否',
  3924. 'no-graph': '无数据显示',
  3925. 'no-iframe': '你的浏览器不支持iframes',
  3926. 'no-result-matching': '无匹配的结果',
  3927. 'no-svg': '你的浏览器不支持SVG',
  3928. optional: '可选的',
  3929. outputs: '输出属性',
  3930. overview: '概述',
  3931. parameters: '参数列表',
  3932. 'peer-dependencies': '同级依赖',
  3933. pipe: '管道',
  3934. pipes: '管道列表',
  3935. prefix: '字首',
  3936. properties: '属性列表',
  3937. providers: '提供商列表',
  3938. pure: 'Pure',
  3939. readme: '手册',
  3940. required: '必需的',
  3941. reset: '重置',
  3942. 'results-matching': '匹配的结果',
  3943. returns: '返回',
  3944. route: '路由',
  3945. routes: '路由列表',
  3946. schemas: '模式',
  3947. 'search-placeholder': '请输入查询关键字',
  3948. selector: '选择器',
  3949. signature: '签名',
  3950. source: '来源',
  3951. standalone: 'Standalone',
  3952. statements: '注释',
  3953. styles: '样式',
  3954. template: '模板',
  3955. type: '类型',
  3956. 'type-aliases': '类型别名',
  3957. 'type-parameters': '类型参数',
  3958. types: '类型',
  3959. 'unamed-property': '未命名属性',
  3960. 'unit-test-coverage': '单元测试概览',
  3961. value: '值',
  3962. variables: '变量',
  3963. yes: '是',
  3964. zoomin: '放大',
  3965. zoomout: '缩小'
  3966. };
  3967. var TRANSLATION_ZH_TW = {
  3968. accessors: '存取器',
  3969. arguments: '參數',
  3970. bootstrap: '根元件',
  3971. branches: '分支',
  3972. browse: '瀏覽',
  3973. classe: '類別',
  3974. classes: '類別',
  3975. component: '元件',
  3976. components: '元件列表',
  3977. constructor: '建構式方法',
  3978. controllers: 'Controllers',
  3979. controller: 'Controller',
  3980. 'coverage-page-title': '覆蓋率頁面標題',
  3981. declarations: 'Declarations',
  3982. decorators: '裝飾器列表',
  3983. 'default-value': '預設值',
  3984. 'defined-in': '被定義在',
  3985. dependencies: '依賴項',
  3986. deprecated: '已棄用',
  3987. description: '描述',
  3988. directive: '指令 (Directive)',
  3989. directives: '指令 (Directives)',
  3990. 'dom tree': 'DOM 樹',
  3991. entities: '實體',
  3992. entity: '實體',
  3993. entrycomponents: 'Entrycomponents',
  3994. enumerations: '列舉',
  3995. enums: '枚舉列表',
  3996. example: '範例',
  3997. examples: '範例',
  3998. exports: '匯出',
  3999. extends: '繼承',
  4000. file: '檔案',
  4001. functions: '函數',
  4002. 'generated-using': '產生文件使用',
  4003. 'getting-started': '快速上手',
  4004. guard: '路由守衛',
  4005. guards: '路由守衛列表',
  4006. hostbindings: 'Host Bindings',
  4007. hostdirectives: 'Host Directives',
  4008. hostlisteners: 'Host Listeners',
  4009. 'html-element': 'HTML 元素',
  4010. 'html-element-with-directive': '帶指令的 HTML 元素',
  4011. identifier: '識別符號',
  4012. implements: '實作',
  4013. imports: '匯入',
  4014. index: '索引',
  4015. indexable: 'Indexable',
  4016. info: '資訊',
  4017. 'inherited-from': '繼承自',
  4018. injectable: 'Injectable',
  4019. injectables: 'Injectables',
  4020. inputs: '輸入屬性',
  4021. interceptors: '攔截器',
  4022. interface: '介面',
  4023. interfaces: '介面',
  4024. legend: '圖例',
  4025. license: '授權協議',
  4026. lines: 'Lines',
  4027. metadata: '元數據',
  4028. methods: '方法',
  4029. miscellaneous: '其他',
  4030. module: '模組',
  4031. modules: '模組列表',
  4032. name: '名稱',
  4033. no: '否',
  4034. 'no-graph': '無數據顯示',
  4035. 'no-iframe': '你的瀏覽器不支援 iframes',
  4036. 'no-result-matching': '無匹配的結果',
  4037. 'no-svg': '你的瀏覽器不支援 SVG',
  4038. optional: '可選的',
  4039. outputs: '輸出屬性',
  4040. overview: '概述',
  4041. parameters: '參數列表',
  4042. 'peer-dependencies': 'Peer Dependencies',
  4043. pipe: '管道',
  4044. pipes: '管道列表',
  4045. prefix: '前置詞',
  4046. properties: '屬性列表',
  4047. providers: '提供者列表',
  4048. pure: 'Pure',
  4049. readme: 'README',
  4050. required: '必需的',
  4051. reset: '重設',
  4052. 'results-matching': '匹配的結果',
  4053. returns: '回傳值',
  4054. route: '路由',
  4055. routes: '路由列表',
  4056. schemas: 'Schemas',
  4057. 'search-placeholder': '請輸入查詢關鍵字',
  4058. selector: '選擇器',
  4059. signature: '簽名',
  4060. source: '來源',
  4061. standalone: 'Standalone',
  4062. statements: '陳述式',
  4063. styles: '樣式',
  4064. template: '範本',
  4065. type: '型別',
  4066. 'type-aliases': '型別別名',
  4067. 'type-parameters': '型別參數',
  4068. types: '型別',
  4069. 'unamed-property': '未命名屬性',
  4070. 'unit-test-coverage': '單元測試覆蓋率',
  4071. value: '值',
  4072. variables: '變數',
  4073. yes: '是',
  4074. zoomin: '放大',
  4075. zoomout: '縮小'
  4076. };
  4077. var I18nEngine = /** @class */ (function () {
  4078. function I18nEngine() {
  4079. this.availablesLanguages = {
  4080. 'bg-BG': 'bg-BG',
  4081. 'de-DE': 'de-DE',
  4082. 'en-US': 'en-US',
  4083. 'es-ES': 'es-ES',
  4084. 'fr-FR': 'fr-FR',
  4085. 'hu-HU': 'hu-HU',
  4086. 'it-IT': 'it-IT',
  4087. 'ja-JP': 'ja-JP',
  4088. 'ka-GE': 'ka-GE',
  4089. 'ko-KR': 'ko-KR',
  4090. 'nl-NL': 'nl-NL',
  4091. 'pl-PL': 'pl-PL',
  4092. 'pt-BR': 'pt-BR',
  4093. 'ru-RU': 'ru-RU',
  4094. 'sk-SK': 'sk-SK',
  4095. 'zh-CN': 'zh-CN',
  4096. 'zh-TW': 'zh-TW'
  4097. };
  4098. this.fallbackLanguage = 'en-US';
  4099. }
  4100. I18nEngine.getInstance = function () {
  4101. if (!I18nEngine.instance) {
  4102. I18nEngine.instance = new I18nEngine();
  4103. }
  4104. return I18nEngine.instance;
  4105. };
  4106. I18nEngine.prototype.init = function (language) {
  4107. i18next.init({
  4108. lng: language,
  4109. fallbackLng: this.fallbackLanguage,
  4110. interpolation: {
  4111. skipOnVariables: false
  4112. }
  4113. });
  4114. i18next.addResources('de-DE', 'translation', TRANSLATION_DE_DE);
  4115. i18next.addResources('en-US', 'translation', TRANSLATION_EN_US);
  4116. i18next.addResources('es-ES', 'translation', TRANSLATION_ES_ES);
  4117. i18next.addResources('fr-FR', 'translation', TRANSLATION_FR_FR);
  4118. i18next.addResources('hu-HU', 'translation', TRANSLATION_HU_HU);
  4119. i18next.addResources('it-IT', 'translation', TRANSLATION_IT_IT);
  4120. i18next.addResources('ja-JP', 'translation', TRANSLATION_JA_JP);
  4121. i18next.addResources('ka-GE', 'translation', TRANSLATION_KA_GE);
  4122. i18next.addResources('ko-KR', 'translation', TRANSLATION_KO_KR);
  4123. i18next.addResources('nl-NL', 'translation', TRANSLATION_NL_NL);
  4124. i18next.addResources('pl-PL', 'translation', TRANSLATION_PL_PL);
  4125. i18next.addResources('pt-BR', 'translation', TRANSLATION_PT_BR);
  4126. i18next.addResources('ru-RU', 'translation', TRANSLATION_RU_RU);
  4127. i18next.addResources('sk-SK', 'translation', TRANSLATION_SK_SK);
  4128. i18next.addResources('zh-CN', 'translation', TRANSLATION_ZH_CN);
  4129. i18next.addResources('zh-TW', 'translation', TRANSLATION_ZH_TW);
  4130. };
  4131. I18nEngine.prototype.translate = function (key) {
  4132. return i18next.t(key);
  4133. };
  4134. I18nEngine.prototype.exists = function (key) {
  4135. return i18next.exists(key);
  4136. };
  4137. I18nEngine.prototype.supportLanguage = function (language) {
  4138. return typeof this.availablesLanguages[language] !== 'undefined';
  4139. };
  4140. return I18nEngine;
  4141. }());
  4142. var I18nEngine$1 = I18nEngine.getInstance();
  4143. require('handlebars');
  4144. var I18nHelper = /** @class */ (function () {
  4145. function I18nHelper() {
  4146. }
  4147. I18nHelper.prototype.helperFunc = function (context, i18n_key) {
  4148. if (I18nEngine$1.exists(i18n_key)) {
  4149. return I18nEngine$1.translate(i18n_key.toLowerCase());
  4150. }
  4151. else {
  4152. return i18n_key;
  4153. }
  4154. };
  4155. return I18nHelper;
  4156. }());
  4157. var IfStringHelper = /** @class */ (function () {
  4158. function IfStringHelper() {
  4159. }
  4160. IfStringHelper.prototype.helperFunc = function (context, a, options) {
  4161. if (typeof a === 'string') {
  4162. return options.fn(context);
  4163. }
  4164. return options.inverse(context);
  4165. };
  4166. return IfStringHelper;
  4167. }());
  4168. var IndexableSignatureHelper = /** @class */ (function () {
  4169. function IndexableSignatureHelper() {
  4170. }
  4171. IndexableSignatureHelper.prototype.helperFunc = function (context, method) {
  4172. var args = method.args.map(function (arg) { return "".concat(arg.name, ": ").concat(arg.type); }).join(', ');
  4173. if (method.name) {
  4174. return "".concat(method.name, "[").concat(args, "]");
  4175. }
  4176. else {
  4177. return "[".concat(args, "]");
  4178. }
  4179. };
  4180. return IndexableSignatureHelper;
  4181. }());
  4182. var IsInitialTabHelper = /** @class */ (function () {
  4183. function IsInitialTabHelper() {
  4184. }
  4185. IsInitialTabHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
  4186. return tabs[0].id === tabId ? options.fn(context) : options.inverse(context);
  4187. };
  4188. return IsInitialTabHelper;
  4189. }());
  4190. var IsNotToggleHelper = /** @class */ (function () {
  4191. function IsNotToggleHelper() {
  4192. }
  4193. IsNotToggleHelper.prototype.helperFunc = function (context, type, options) {
  4194. var result = Configuration$1.mainData.toggleMenuItems.indexOf(type);
  4195. if (Configuration$1.mainData.toggleMenuItems.indexOf('all') !== -1) {
  4196. return options.inverse(context);
  4197. }
  4198. else if (result !== -1) {
  4199. return options.fn(context);
  4200. }
  4201. else {
  4202. return options.inverse(context);
  4203. }
  4204. };
  4205. return IsNotToggleHelper;
  4206. }());
  4207. var IsTabEnabledHelper = /** @class */ (function () {
  4208. function IsTabEnabledHelper() {
  4209. }
  4210. IsTabEnabledHelper.prototype.helperFunc = function (context, tabs, tabId, options) {
  4211. var isTabEnabled = -1 !== ___namespace.findIndex(tabs, { id: tabId });
  4212. return isTabEnabled ? options.fn(context) : options.inverse(context);
  4213. };
  4214. return IsTabEnabledHelper;
  4215. }());
  4216. var JsdocCodeExampleHelper = /** @class */ (function () {
  4217. function JsdocCodeExampleHelper() {
  4218. }
  4219. JsdocCodeExampleHelper.prototype.cleanTag = function (comment) {
  4220. if (comment.charAt(0) === '*') {
  4221. comment = comment.substring(1, comment.length);
  4222. }
  4223. if (comment.charAt(0) === ' ') {
  4224. comment = comment.substring(1, comment.length);
  4225. }
  4226. if (comment.indexOf('<p>') === 0) {
  4227. comment = comment.substring(3, comment.length);
  4228. }
  4229. if (comment.substr(-1) === '\n') {
  4230. comment = comment.substring(0, comment.length - 1);
  4231. }
  4232. if (comment.substr(-4) === '</p>') {
  4233. comment = comment.substring(0, comment.length - 4);
  4234. }
  4235. return comment;
  4236. };
  4237. JsdocCodeExampleHelper.prototype.getHtmlEntities = function (str) {
  4238. return String(str)
  4239. .replace(/&/g, '&amp;')
  4240. .replace(/</g, '&lt;')
  4241. .replace(/>/g, '&gt;')
  4242. .replace(/"/g, '&quot;');
  4243. };
  4244. JsdocCodeExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
  4245. var i = 0;
  4246. var len = jsdocTags.length;
  4247. var tags = [];
  4248. var type = 'html';
  4249. if (options.hash.type) {
  4250. type = options.hash.type;
  4251. }
  4252. for (i; i < len; i++) {
  4253. if (jsdocTags[i].tagName) {
  4254. if (jsdocTags[i].tagName.text === 'example') {
  4255. var tag = {};
  4256. if (jsdocTags[i].comment) {
  4257. if (jsdocTags[i].comment.indexOf('<caption>') !== -1) {
  4258. tag.comment = jsdocTags[i].comment
  4259. .replace(/<caption>/g, '<b><i>')
  4260. .replace(/\/caption>/g, '/b></i>');
  4261. }
  4262. else {
  4263. tag.comment =
  4264. "<pre class=\"line-numbers\"><code class=\"language-".concat(type, "\">") +
  4265. this.getHtmlEntities(this.cleanTag(jsdocTags[i].comment)) +
  4266. "</code></pre>";
  4267. }
  4268. tags.push(tag);
  4269. }
  4270. }
  4271. }
  4272. }
  4273. if (tags.length > 0) {
  4274. context.tags = tags;
  4275. return options.fn(context);
  4276. }
  4277. };
  4278. return JsdocCodeExampleHelper;
  4279. }());
  4280. var JsdocDefaultHelper = /** @class */ (function () {
  4281. function JsdocDefaultHelper() {
  4282. }
  4283. JsdocDefaultHelper.prototype.helperFunc = function (context, jsdocTags, options) {
  4284. if (jsdocTags) {
  4285. var i = 0;
  4286. var len = jsdocTags.length;
  4287. var tag = {};
  4288. var defaultValue = false;
  4289. for (i; i < len; i++) {
  4290. if (jsdocTags[i].tagName) {
  4291. if (jsdocTags[i].tagName.text === 'default') {
  4292. defaultValue = true;
  4293. if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
  4294. tag.type = jsdocTags[i].typeExpression.type.name.text;
  4295. }
  4296. if (jsdocTags[i].comment) {
  4297. tag.comment = jsdocTags[i].comment;
  4298. }
  4299. if (jsdocTags[i].name) {
  4300. tag.name = jsdocTags[i].name.text;
  4301. }
  4302. }
  4303. }
  4304. }
  4305. if (defaultValue) {
  4306. context.tag = tag;
  4307. return options.fn(context);
  4308. }
  4309. }
  4310. };
  4311. return JsdocDefaultHelper;
  4312. }());
  4313. var JsdocExampleHelper = /** @class */ (function () {
  4314. function JsdocExampleHelper() {
  4315. }
  4316. JsdocExampleHelper.prototype.helperFunc = function (context, jsdocTags, options) {
  4317. var i = 0;
  4318. var len = jsdocTags.length;
  4319. var tags = [];
  4320. for (i; i < len; i++) {
  4321. if (jsdocTags[i].tagName) {
  4322. if (jsdocTags[i].tagName.text === 'example') {
  4323. var tag = {};
  4324. if (jsdocTags[i].comment) {
  4325. tag.comment = jsdocTags[i].comment
  4326. .replace(/<caption>/g, '<b><i>')
  4327. .replace(/\/caption>/g, '/b></i>');
  4328. }
  4329. tags.push(tag);
  4330. }
  4331. }
  4332. }
  4333. if (tags.length > 0) {
  4334. context.tags = tags;
  4335. return options.fn(context);
  4336. }
  4337. };
  4338. return JsdocExampleHelper;
  4339. }());
  4340. var JsdocParamsValidHelper = /** @class */ (function () {
  4341. function JsdocParamsValidHelper() {
  4342. }
  4343. JsdocParamsValidHelper.prototype.helperFunc = function (context, jsdocTags, options) {
  4344. var i = 0;
  4345. var len = jsdocTags.length;
  4346. var valid = false;
  4347. for (i; i < len; i++) {
  4348. if (jsdocTags[i].tagName) {
  4349. if (jsdocTags[i].tagName.text === 'param') {
  4350. valid = true;
  4351. }
  4352. }
  4353. }
  4354. if (valid) {
  4355. return options.fn(context);
  4356. }
  4357. else {
  4358. return options.inverse(context);
  4359. }
  4360. };
  4361. return JsdocParamsValidHelper;
  4362. }());
  4363. var JsdocParamsHelper = /** @class */ (function () {
  4364. function JsdocParamsHelper() {
  4365. }
  4366. JsdocParamsHelper.prototype.helperFunc = function (context, jsdocTags, options) {
  4367. var i = 0;
  4368. var len = jsdocTags.length;
  4369. var tags = [];
  4370. for (i; i < len; i++) {
  4371. if (jsdocTags[i].tagName) {
  4372. if (jsdocTags[i].tagName.text === 'param') {
  4373. var tag = {};
  4374. if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.kind) {
  4375. tag.type = kindToType(jsdocTags[i].typeExpression.type.kind);
  4376. }
  4377. if (jsdocTags[i].typeExpression && jsdocTags[i].typeExpression.type.name) {
  4378. tag.type = jsdocTags[i].typeExpression.type.name.text;
  4379. }
  4380. else {
  4381. tag.type = jsdocTags[i].type;
  4382. }
  4383. if (jsdocTags[i].comment) {
  4384. tag.comment = jsdocTags[i].comment;
  4385. }
  4386. if (jsdocTags[i].defaultValue) {
  4387. tag.defaultValue = jsdocTags[i].defaultValue;
  4388. }
  4389. if (jsdocTags[i].name) {
  4390. if (jsdocTags[i].name.text) {
  4391. tag.name = jsdocTags[i].name.text;
  4392. }
  4393. else {
  4394. tag.name = jsdocTags[i].name;
  4395. }
  4396. }
  4397. if (jsdocTags[i].optional) {
  4398. tag.optional = true;
  4399. }
  4400. tags.push(tag);
  4401. }
  4402. }
  4403. }
  4404. if (tags.length >= 1) {
  4405. context.tags = tags;
  4406. return options.fn(context);
  4407. }
  4408. };
  4409. return JsdocParamsHelper;
  4410. }());
  4411. var JsdocReturnsCommentHelper = /** @class */ (function () {
  4412. function JsdocReturnsCommentHelper() {
  4413. }
  4414. JsdocReturnsCommentHelper.prototype.helperFunc = function (context, jsdocTags, options) {
  4415. var i = 0;
  4416. var len = jsdocTags.length;
  4417. var result;
  4418. for (i; i < len; i++) {
  4419. if (jsdocTags[i].tagName) {
  4420. if (jsdocTags[i].tagName.text === 'returns' ||
  4421. jsdocTags[i].tagName.text === 'return') {
  4422. result = jsdocTags[i].comment;
  4423. break;
  4424. }
  4425. }
  4426. }
  4427. return result;
  4428. };
  4429. return JsdocReturnsCommentHelper;
  4430. }());
  4431. var ast$1 = new tsMorph.Project();
  4432. var ImportsUtil = /** @class */ (function () {
  4433. function ImportsUtil() {
  4434. }
  4435. ImportsUtil.getInstance = function () {
  4436. if (!ImportsUtil.instance) {
  4437. ImportsUtil.instance = new ImportsUtil();
  4438. }
  4439. return ImportsUtil.instance;
  4440. };
  4441. /**
  4442. * Find for a sourceFile a variable value in a local enum
  4443. * @param srcFile
  4444. * @param variableName
  4445. * @param variableValue
  4446. */
  4447. ImportsUtil.prototype.findInEnums = function (srcFile, variableName, variableValue) {
  4448. var res = '';
  4449. srcFile.getEnum(function (e) {
  4450. if (e.getName() === variableName) {
  4451. e.getMember(function (m) {
  4452. if (m.getName() === variableValue) {
  4453. res = m.getValue();
  4454. }
  4455. });
  4456. }
  4457. });
  4458. return res;
  4459. };
  4460. /**
  4461. * Find for a sourceFile a variable value in a local static class
  4462. * @param srcFile
  4463. * @param variableName
  4464. * @param variableValue
  4465. */
  4466. ImportsUtil.prototype.findInClasses = function (srcFile, variableName, variableValue) {
  4467. var res = '';
  4468. srcFile.getClass(function (c) {
  4469. var staticProperty = c.getStaticProperty(variableValue);
  4470. if (staticProperty) {
  4471. if (staticProperty.getInitializer()) {
  4472. res = staticProperty.getInitializer().getText();
  4473. }
  4474. }
  4475. });
  4476. return res;
  4477. };
  4478. /**
  4479. * Find a value in a local variable declaration like an object
  4480. * @param variableDeclaration
  4481. * @param variablesAttributes
  4482. */
  4483. ImportsUtil.prototype.findInObjectVariableDeclaration = function (variableDeclaration, variablesAttributes) {
  4484. var variableKind = variableDeclaration.getKind();
  4485. if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
  4486. var initializer = variableDeclaration.getInitializer();
  4487. if (initializer) {
  4488. var initializerKind = initializer.getKind();
  4489. if (initializerKind && initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
  4490. var compilerNode = initializer.compilerNode, finalValue_1 = '';
  4491. // Find thestring from AVAR.BVAR.thestring inside properties
  4492. var depth_1 = 0;
  4493. var loopProperties_1 = function (properties) {
  4494. properties.forEach(function (prop) {
  4495. if (prop.name) {
  4496. if (variablesAttributes[depth_1 + 1]) {
  4497. if (prop.name.getText() === variablesAttributes[depth_1 + 1]) {
  4498. if (prop.initializer) {
  4499. if (prop.initializer.properties) {
  4500. depth_1 += 1;
  4501. loopProperties_1(prop.initializer.properties);
  4502. }
  4503. else {
  4504. finalValue_1 = prop.initializer.text;
  4505. }
  4506. }
  4507. else {
  4508. finalValue_1 = prop.initializer.text;
  4509. }
  4510. }
  4511. }
  4512. }
  4513. });
  4514. };
  4515. loopProperties_1(compilerNode.properties);
  4516. return finalValue_1;
  4517. }
  4518. }
  4519. }
  4520. };
  4521. /**
  4522. * Find in imports something like myvar
  4523. * @param {string} inputVariableName like myvar
  4524. * @return {[type]} myvar value
  4525. */
  4526. ImportsUtil.prototype.findValueInImportOrLocalVariables = function (inputVariableName, sourceFile, decoratorType) {
  4527. var e_1, _a;
  4528. var metadataVariableName = inputVariableName, searchedImport, aliasOriginalName = '', foundWithNamedImport = false, foundWithAlias = false;
  4529. var file = typeof ast$1.getSourceFile(sourceFile.fileName) !== 'undefined'
  4530. ? ast$1.getSourceFile(sourceFile.fileName)
  4531. : ast$1.addSourceFileAtPathIfExists(sourceFile.fileName); // tslint:disable-line
  4532. var imports = file.getImportDeclarations();
  4533. /**
  4534. * Loop through all imports, and find one matching inputVariableName
  4535. */
  4536. imports.forEach(function (i) {
  4537. var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
  4538. if (namedImportsLength > 0) {
  4539. for (j; j < namedImportsLength; j++) {
  4540. var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
  4541. if (namedImports[j].getAliasNode()) {
  4542. importAlias = namedImports[j].getAliasNode().getText();
  4543. }
  4544. if (importName === metadataVariableName) {
  4545. foundWithNamedImport = true;
  4546. searchedImport = i;
  4547. break;
  4548. }
  4549. if (importAlias === metadataVariableName) {
  4550. foundWithNamedImport = true;
  4551. foundWithAlias = true;
  4552. aliasOriginalName = importName;
  4553. searchedImport = i;
  4554. break;
  4555. }
  4556. }
  4557. }
  4558. var namespaceImport = i.getNamespaceImport();
  4559. if (namespaceImport) {
  4560. var namespaceImportLocalName = namespaceImport.getText();
  4561. if (namespaceImportLocalName === metadataVariableName) {
  4562. searchedImport = i;
  4563. }
  4564. }
  4565. if (!foundWithNamedImport) {
  4566. var defaultImport = i.getDefaultImport();
  4567. if (defaultImport) {
  4568. var defaultImportText = defaultImport.getText();
  4569. if (defaultImportText === metadataVariableName) {
  4570. searchedImport = i;
  4571. }
  4572. }
  4573. }
  4574. });
  4575. function hasFoundValues(variableDeclaration) {
  4576. var variableKind = variableDeclaration.getKind();
  4577. if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
  4578. var initializer = variableDeclaration.getInitializer();
  4579. if (initializer) {
  4580. var initializerKind = initializer.getKind();
  4581. if (initializerKind && initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
  4582. var compilerNode = initializer.compilerNode;
  4583. return compilerNode.properties;
  4584. }
  4585. }
  4586. }
  4587. }
  4588. if (typeof searchedImport !== 'undefined') {
  4589. var importPathReference = searchedImport.getModuleSpecifierSourceFile();
  4590. var importPath = void 0;
  4591. if (typeof importPathReference !== 'undefined') {
  4592. importPath = importPathReference.compilerNode.fileName;
  4593. var sourceFileImport = typeof ast$1.getSourceFile(importPath) !== 'undefined'
  4594. ? ast$1.getSourceFile(importPath)
  4595. : ast$1.addSourceFileAtPathIfExists(importPath); // tslint:disable-line
  4596. if (sourceFileImport) {
  4597. var variableName_1 = foundWithAlias ? aliasOriginalName : metadataVariableName;
  4598. var variableDeclaration = sourceFileImport.getVariableDeclaration(variableName_1);
  4599. if (variableDeclaration) {
  4600. return hasFoundValues(variableDeclaration);
  4601. }
  4602. else {
  4603. // Try with exports
  4604. var exportDeclarations = sourceFileImport.getExportedDeclarations();
  4605. if (exportDeclarations && exportDeclarations.size > 0) {
  4606. try {
  4607. for (var exportDeclarations_1 = __values(exportDeclarations), exportDeclarations_1_1 = exportDeclarations_1.next(); !exportDeclarations_1_1.done; exportDeclarations_1_1 = exportDeclarations_1.next()) {
  4608. var _b = __read(exportDeclarations_1_1.value, 2), exportDeclarationKey = _b[0], exportDeclarationValues = _b[1];
  4609. exportDeclarationValues.forEach(function (exportDeclarationValue) {
  4610. if (exportDeclarationValue instanceof tsMorph.VariableDeclaration &&
  4611. exportDeclarationValue.getName() === variableName_1) {
  4612. return hasFoundValues(exportDeclarationValue);
  4613. }
  4614. });
  4615. }
  4616. }
  4617. catch (e_1_1) { e_1 = { error: e_1_1 }; }
  4618. finally {
  4619. try {
  4620. if (exportDeclarations_1_1 && !exportDeclarations_1_1.done && (_a = exportDeclarations_1.return)) _a.call(exportDeclarations_1);
  4621. }
  4622. finally { if (e_1) throw e_1.error; }
  4623. }
  4624. }
  4625. }
  4626. }
  4627. }
  4628. if (!importPathReference &&
  4629. decoratorType === 'template' &&
  4630. searchedImport.getModuleSpecifierValue().indexOf('.html') !== -1) {
  4631. var originalSourceFilePath = sourceFile.path;
  4632. var originalSourceFilePathFolder = originalSourceFilePath.substring(0, originalSourceFilePath.lastIndexOf('/'));
  4633. var finalImportedPath = originalSourceFilePathFolder + '/' + searchedImport.getModuleSpecifierValue();
  4634. var finalImportedPathData = FileEngine$1.getSync(finalImportedPath);
  4635. return finalImportedPathData;
  4636. }
  4637. }
  4638. else {
  4639. // Find in local variables of the file
  4640. var variableDeclaration = file.getVariableDeclaration(metadataVariableName);
  4641. if (variableDeclaration) {
  4642. var variableKind = variableDeclaration.getKind();
  4643. if (variableKind && variableKind === tsMorph.SyntaxKind.VariableDeclaration) {
  4644. var initializer = variableDeclaration.getInitializer();
  4645. if (initializer) {
  4646. var initializerKind = initializer.getKind();
  4647. if (initializerKind &&
  4648. initializerKind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
  4649. var compilerNode = initializer.compilerNode;
  4650. return compilerNode.properties;
  4651. }
  4652. else if (initializerKind &&
  4653. (initializerKind === tsMorph.SyntaxKind.StringLiteral ||
  4654. initializerKind === tsMorph.SyntaxKind.NoSubstitutionTemplateLiteral)) {
  4655. if (decoratorType === 'template') {
  4656. return initializer.getText();
  4657. }
  4658. else {
  4659. return variableDeclaration.compilerNode;
  4660. }
  4661. }
  4662. else if (initializerKind) {
  4663. return variableDeclaration.compilerNode;
  4664. }
  4665. }
  4666. }
  4667. }
  4668. }
  4669. return [];
  4670. };
  4671. ImportsUtil.prototype.getFileNameOfImport = function (variableName, sourceFile) {
  4672. var file = typeof ast$1.getSourceFile(sourceFile.fileName) !== 'undefined'
  4673. ? ast$1.getSourceFile(sourceFile.fileName)
  4674. : ast$1.addSourceFileAtPath(sourceFile.fileName); // tslint:disable-line
  4675. var imports = file.getImportDeclarations();
  4676. var searchedImport, finalPath = '';
  4677. imports.forEach(function (i) {
  4678. var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
  4679. if (namedImportsLength > 0) {
  4680. for (j; j < namedImportsLength; j++) {
  4681. var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
  4682. if (namedImports[j].getAliasNode()) {
  4683. importAlias = namedImports[j].getAliasNode().getText();
  4684. }
  4685. if (importName === variableName) {
  4686. searchedImport = i;
  4687. break;
  4688. }
  4689. if (importAlias === variableName) {
  4690. searchedImport = i;
  4691. break;
  4692. }
  4693. }
  4694. }
  4695. });
  4696. if (typeof searchedImport !== 'undefined') {
  4697. var importPath = path__namespace.resolve(path__namespace.dirname(sourceFile.fileName) +
  4698. '/' +
  4699. searchedImport.getModuleSpecifierValue() +
  4700. '.ts');
  4701. var cleaner = (process.cwd() + path__namespace.sep).replace(/\\/g, '/');
  4702. finalPath = importPath.replace(cleaner, '');
  4703. }
  4704. return finalPath;
  4705. };
  4706. /**
  4707. * Find the file path of imported variable
  4708. * @param {string} inputVariableName like thestring
  4709. * @return {[type]} thestring destination path
  4710. */
  4711. ImportsUtil.prototype.findFilePathOfImportedVariable = function (inputVariableName, sourceFilePath) {
  4712. var searchedImport, finalPath = '';
  4713. var file = typeof ast$1.getSourceFile(sourceFilePath) !== 'undefined'
  4714. ? ast$1.getSourceFile(sourceFilePath)
  4715. : ast$1.addSourceFileAtPath(sourceFilePath); // tslint:disable-line
  4716. var imports = file.getImportDeclarations();
  4717. /**
  4718. * Loop through all imports, and find one matching inputVariableName
  4719. */
  4720. imports.forEach(function (i) {
  4721. var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
  4722. if (namedImportsLength > 0) {
  4723. for (j; j < namedImportsLength; j++) {
  4724. var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
  4725. if (namedImports[j].getAliasNode()) {
  4726. importAlias = namedImports[j].getAliasNode().getText();
  4727. }
  4728. if (importName === inputVariableName) {
  4729. searchedImport = i;
  4730. break;
  4731. }
  4732. if (importAlias === inputVariableName) {
  4733. searchedImport = i;
  4734. break;
  4735. }
  4736. }
  4737. }
  4738. });
  4739. if (typeof searchedImport !== 'undefined') {
  4740. finalPath = path__namespace.resolve(path__namespace.dirname(sourceFilePath) +
  4741. '/' +
  4742. searchedImport.getModuleSpecifierValue() +
  4743. '.ts');
  4744. }
  4745. return finalPath;
  4746. };
  4747. /**
  4748. * Find in imports something like VAR.AVAR.BVAR.thestring
  4749. * @param {string} inputVariableName like VAR.AVAR.BVAR.thestring
  4750. * @return {[type]} thestring value
  4751. */
  4752. ImportsUtil.prototype.findPropertyValueInImportOrLocalVariables = function (inputVariableName, sourceFile) {
  4753. var variablesAttributes = inputVariableName.split('.'), metadataVariableName = variablesAttributes[0], searchedImport, aliasOriginalName = '', foundWithAlias = false;
  4754. var file = typeof ast$1.getSourceFile(sourceFile.fileName) !== 'undefined'
  4755. ? ast$1.getSourceFile(sourceFile.fileName)
  4756. : ast$1.addSourceFileAtPath(sourceFile.fileName); // tslint:disable-line
  4757. var imports = file.getImportDeclarations();
  4758. /**
  4759. * Loop through all imports, and find one matching inputVariableName
  4760. */
  4761. imports.forEach(function (i) {
  4762. var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
  4763. if (namedImportsLength > 0) {
  4764. for (j; j < namedImportsLength; j++) {
  4765. var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
  4766. if (namedImports[j].getAliasNode()) {
  4767. importAlias = namedImports[j].getAliasNode().getText();
  4768. }
  4769. if (importName === metadataVariableName) {
  4770. searchedImport = i;
  4771. break;
  4772. }
  4773. if (importAlias === metadataVariableName) {
  4774. foundWithAlias = true;
  4775. aliasOriginalName = importName;
  4776. searchedImport = i;
  4777. break;
  4778. }
  4779. }
  4780. }
  4781. });
  4782. var fileToSearchIn, variableDeclaration;
  4783. if (typeof searchedImport !== 'undefined') {
  4784. var importPath = path__namespace.resolve(path__namespace.dirname(sourceFile.fileName) +
  4785. '/' +
  4786. searchedImport.getModuleSpecifierValue() +
  4787. '.ts');
  4788. var sourceFileImport = typeof ast$1.getSourceFile(importPath) !== 'undefined'
  4789. ? ast$1.getSourceFile(importPath)
  4790. : ast$1.addSourceFileAtPath(importPath); // tslint:disable-line
  4791. if (sourceFileImport) {
  4792. fileToSearchIn = sourceFileImport;
  4793. var variableName = foundWithAlias ? aliasOriginalName : metadataVariableName;
  4794. variableDeclaration = fileToSearchIn.getVariableDeclaration(variableName);
  4795. }
  4796. }
  4797. else {
  4798. fileToSearchIn = file;
  4799. // Find in local variables of the file
  4800. variableDeclaration = fileToSearchIn.getVariableDeclaration(metadataVariableName);
  4801. }
  4802. if (variableDeclaration) {
  4803. return this.findInObjectVariableDeclaration(variableDeclaration, variablesAttributes);
  4804. }
  4805. // Try find it in enums
  4806. if (variablesAttributes.length > 0) {
  4807. if (typeof fileToSearchIn !== 'undefined') {
  4808. var val = this.findInEnums(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
  4809. if (val !== '') {
  4810. return val;
  4811. }
  4812. val = this.findInClasses(fileToSearchIn, metadataVariableName, variablesAttributes[1]);
  4813. if (val !== '') {
  4814. return val;
  4815. }
  4816. }
  4817. }
  4818. };
  4819. return ImportsUtil;
  4820. }());
  4821. var ImportsUtil$1 = ImportsUtil.getInstance();
  4822. var Handlebars$5 = require('handlebars');
  4823. var traverse$1 = require('neotraverse/legacy');
  4824. var ast = new tsMorph.Project();
  4825. var RouterParserUtil = /** @class */ (function () {
  4826. function RouterParserUtil() {
  4827. this.scannedFiles = [];
  4828. this.routes = [];
  4829. this.incompleteRoutes = [];
  4830. this.modules = [];
  4831. this.modulesWithRoutes = [];
  4832. this.transformAngular8ImportSyntax = /(['"]loadChildren['"]:)\(\)(:[^)]+?)?=>"import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)\.then\(\(?\w+?\)?=>\S+?\.([^)]+?)\)(\\'|'|")/g;
  4833. this.transformAngular8ImportSyntaxComponent = /(['"]loadComponent['"]:)\(\)(:[^)]+?)?=>"import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)\.then\(\(?\w+?\)?=>\S+?\.([^)]+?)\)(\\'|'|")/g;
  4834. this.transformAngular8ImportSyntaxAsyncAwait = /(['"]loadChildren['"]:)\(\)(:[^)]+?)?=>\("import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)"\)\.['"]([^)]+?)['"]/g;
  4835. this.transformAngular8ImportSyntaxComponentAsyncAwait = /(['"]loadComponent['"]:)\(\)(:[^)]+?)?=>\("import\((\\'|'|"|`)([^'"]+?)(\\'|'|"|`)\)"\)\.['"]([^)]+?)['"]/g;
  4836. this.trailingComma = /,\s*([\]})])/g;
  4837. }
  4838. RouterParserUtil.getInstance = function () {
  4839. if (!RouterParserUtil.instance) {
  4840. RouterParserUtil.instance = new RouterParserUtil();
  4841. }
  4842. return RouterParserUtil.instance;
  4843. };
  4844. RouterParserUtil.prototype.addRoute = function (route) {
  4845. this.routes.push(route);
  4846. this.routes = ___namespace.sortBy(___namespace.uniqWith(this.routes, ___namespace.isEqual), ['name']);
  4847. };
  4848. RouterParserUtil.prototype.addIncompleteRoute = function (route) {
  4849. this.incompleteRoutes.push(route);
  4850. this.incompleteRoutes = ___namespace.sortBy(___namespace.uniqWith(this.incompleteRoutes, ___namespace.isEqual), ['name']);
  4851. };
  4852. RouterParserUtil.prototype.addModuleWithRoutes = function (moduleName, moduleImports, filename) {
  4853. this.modulesWithRoutes.push({
  4854. name: moduleName,
  4855. importsNode: moduleImports,
  4856. filename: filename
  4857. });
  4858. this.modulesWithRoutes = ___namespace.sortBy(___namespace.uniqWith(this.modulesWithRoutes, ___namespace.isEqual), ['name']);
  4859. };
  4860. RouterParserUtil.prototype.addModule = function (moduleName, moduleImports) {
  4861. this.modules.push({
  4862. name: moduleName,
  4863. importsNode: moduleImports
  4864. });
  4865. this.modules = ___namespace.sortBy(___namespace.uniqWith(this.modules, ___namespace.isEqual), ['name']);
  4866. };
  4867. RouterParserUtil.prototype.cleanRawRouteParsed = function (route) {
  4868. return JSON5__namespace.parse(this.cleanRawRoute(route));
  4869. };
  4870. RouterParserUtil.prototype.cleanRawRoute = function (route) {
  4871. return route
  4872. .replace(/\s/g, '')
  4873. .replace(this.trailingComma, '$1')
  4874. .replace(this.transformAngular8ImportSyntax, '$1"$4#$6"')
  4875. .replace(this.transformAngular8ImportSyntaxAsyncAwait, '$1"$4#$6"')
  4876. .replace(this.transformAngular8ImportSyntaxComponent, '$1"$4#$6"')
  4877. .replace(this.transformAngular8ImportSyntaxComponentAsyncAwait, '$1"$4#$6"');
  4878. };
  4879. RouterParserUtil.prototype.setRootModule = function (module) {
  4880. this.rootModule = module;
  4881. };
  4882. RouterParserUtil.prototype.hasRouterModuleInImports = function (imports) {
  4883. for (var i = 0; i < imports.length; i++) {
  4884. if (imports[i].name.indexOf('RouterModule.forChild') !== -1 ||
  4885. imports[i].name.indexOf('RouterModule.forRoot') !== -1 ||
  4886. imports[i].name.indexOf('RouterModule') !== -1) {
  4887. return true;
  4888. }
  4889. }
  4890. return false;
  4891. };
  4892. RouterParserUtil.prototype.fixIncompleteRoutes = function (miscellaneousVariables) {
  4893. var matchingVariables = [];
  4894. // For each incompleteRoute, scan if one misc variable is in code
  4895. // if ok, try recreating complete route
  4896. for (var i = 0; i < this.incompleteRoutes.length; i++) {
  4897. for (var j = 0; j < miscellaneousVariables.length; j++) {
  4898. if (this.incompleteRoutes[i].data.indexOf(miscellaneousVariables[j].name) !== -1) {
  4899. console.log('found one misc var inside incompleteRoute');
  4900. console.log(miscellaneousVariables[j].name);
  4901. matchingVariables.push(miscellaneousVariables[j]);
  4902. }
  4903. }
  4904. // Clean incompleteRoute
  4905. this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace('[', '');
  4906. this.incompleteRoutes[i].data = this.incompleteRoutes[i].data.replace(']', '');
  4907. }
  4908. };
  4909. RouterParserUtil.prototype.linkModulesAndRoutes = function () {
  4910. var _this = this;
  4911. var i = 0;
  4912. var len = this.modulesWithRoutes.length;
  4913. for (i; i < len; i++) {
  4914. ___namespace.forEach(this.modulesWithRoutes[i].importsNode, function (node) {
  4915. var initializer = node.initializer;
  4916. if (initializer) {
  4917. if (initializer.elements) {
  4918. ___namespace.forEach(initializer.elements, function (element) {
  4919. // find element with arguments
  4920. if (element.arguments) {
  4921. ___namespace.forEach(element.arguments, function (argument) {
  4922. ___namespace.forEach(_this.routes, function (route) {
  4923. if (argument.text &&
  4924. route.name === argument.text &&
  4925. route.filename === _this.modulesWithRoutes[i].filename) {
  4926. route.module = _this.modulesWithRoutes[i].name;
  4927. }
  4928. else if (argument.text &&
  4929. route.name === argument.text &&
  4930. route.filename !== _this.modulesWithRoutes[i].filename) {
  4931. var argumentImportPath = ImportsUtil$1.findFilePathOfImportedVariable(argument.text, _this.modulesWithRoutes[i].filename);
  4932. argumentImportPath = argumentImportPath
  4933. .replace(process.cwd() + path__namespace.sep, '')
  4934. .replace(/\\/g, '/');
  4935. if (argument.text &&
  4936. route.name === argument.text &&
  4937. route.filename === argumentImportPath) {
  4938. route.module = _this.modulesWithRoutes[i].name;
  4939. }
  4940. }
  4941. });
  4942. });
  4943. }
  4944. });
  4945. }
  4946. }
  4947. /**
  4948. * direct support of for example
  4949. * export const HomeRoutingModule: ModuleWithProviders = RouterModule.forChild(HOME_ROUTES);
  4950. */
  4951. if (tsMorph.ts.isCallExpression(node)) {
  4952. if (node.arguments) {
  4953. ___namespace.forEach(node.arguments, function (argument) {
  4954. ___namespace.forEach(_this.routes, function (route) {
  4955. if (argument.text &&
  4956. route.name === argument.text &&
  4957. route.filename === _this.modulesWithRoutes[i].filename) {
  4958. route.module = _this.modulesWithRoutes[i].name;
  4959. }
  4960. });
  4961. });
  4962. }
  4963. }
  4964. });
  4965. }
  4966. };
  4967. RouterParserUtil.prototype.foundRouteWithModuleName = function (moduleName) {
  4968. return ___namespace.find(this.routes, { module: moduleName });
  4969. };
  4970. RouterParserUtil.prototype.foundLazyModuleWithPath = function (modulePath) {
  4971. // path is like app/customers/customers.module#CustomersModule
  4972. var split = modulePath.split('#');
  4973. var lazyModuleName = split[1];
  4974. return lazyModuleName;
  4975. };
  4976. RouterParserUtil.prototype.foundLazyComponentWithPath = function (componentPath) {
  4977. // path is like app/customers/customers.component#CustomersComponent
  4978. var split = componentPath.split('#');
  4979. var lazyComponentName = split[1];
  4980. return lazyComponentName;
  4981. };
  4982. RouterParserUtil.prototype.constructRoutesTree = function () {
  4983. var _this = this;
  4984. // routes[] contains routes with module link
  4985. // modulesTree contains modules tree
  4986. // make a final routes tree with that
  4987. traverse$1(this.modulesTree).forEach(function (node) {
  4988. if (node) {
  4989. if (node.parent) {
  4990. delete node.parent;
  4991. }
  4992. if (node.initializer) {
  4993. delete node.initializer;
  4994. }
  4995. if (node.importsNode) {
  4996. delete node.importsNode;
  4997. }
  4998. }
  4999. });
  5000. this.cleanModulesTree = ___namespace.cloneDeep(this.modulesTree);
  5001. var routesTree = {
  5002. name: '<root>',
  5003. kind: 'module',
  5004. className: this.rootModule,
  5005. children: []
  5006. };
  5007. var loopModulesParser = function (node) {
  5008. if (node.children && node.children.length > 0) {
  5009. // If module has child modules
  5010. for (var i in node.children) {
  5011. var route = _this.foundRouteWithModuleName(node.children[i].name);
  5012. if (route && route.data) {
  5013. try {
  5014. route.children = JSON5__namespace.parse(route.data);
  5015. }
  5016. catch (e) {
  5017. logger.error('Error during generation of routes JSON file, maybe a trailing comma or an external variable inside one route.');
  5018. }
  5019. delete route.data;
  5020. route.kind = 'module';
  5021. routesTree.children.push(route);
  5022. }
  5023. if (node.children[i].children) {
  5024. loopModulesParser(node.children[i]);
  5025. }
  5026. }
  5027. }
  5028. else {
  5029. // else routes are directly inside the module
  5030. var rawRoutes = _this.foundRouteWithModuleName(node.name);
  5031. if (rawRoutes) {
  5032. var routes = JSON5__namespace.parse(rawRoutes.data);
  5033. if (routes) {
  5034. var i = 0;
  5035. var len = routes.length;
  5036. var routeAddedOnce = false;
  5037. for (i; i < len; i++) {
  5038. var route = routes[i];
  5039. if (routes[i].component) {
  5040. routeAddedOnce = true;
  5041. routesTree.children.push({
  5042. kind: 'component',
  5043. component: routes[i].component,
  5044. path: routes[i].path
  5045. });
  5046. }
  5047. }
  5048. if (!routeAddedOnce) {
  5049. routesTree.children = __spreadArray(__spreadArray([], __read(routesTree.children), false), __read(routes), false);
  5050. }
  5051. }
  5052. }
  5053. }
  5054. };
  5055. var startModule = ___namespace.find(this.cleanModulesTree, { name: this.rootModule });
  5056. if (startModule) {
  5057. loopModulesParser(startModule);
  5058. // Loop twice for routes with lazy loading
  5059. // loopModulesParser(routesTree);
  5060. }
  5061. var cleanedRoutesTree = undefined;
  5062. var cleanRoutesTree = function (route) {
  5063. for (var i in route.children) {
  5064. route.children[i].routes;
  5065. }
  5066. return route;
  5067. };
  5068. cleanedRoutesTree = cleanRoutesTree(routesTree);
  5069. // Try updating routes with lazy loading
  5070. var loopInsideModule = function (mod, _rawModule) {
  5071. if (mod.children) {
  5072. for (var z in mod.children) {
  5073. var route = _this.foundRouteWithModuleName(mod.children[z].name);
  5074. if (typeof route !== 'undefined') {
  5075. if (route.data) {
  5076. route.children = JSON5__namespace.parse(route.data);
  5077. delete route.data;
  5078. route.kind = 'module';
  5079. _rawModule.children.push(route);
  5080. }
  5081. }
  5082. }
  5083. }
  5084. else {
  5085. var route = _this.foundRouteWithModuleName(mod.name);
  5086. if (typeof route !== 'undefined') {
  5087. if (route.data) {
  5088. route.children = JSON5__namespace.parse(route.data);
  5089. delete route.data;
  5090. route.kind = 'module';
  5091. _rawModule.children.push(route);
  5092. }
  5093. }
  5094. }
  5095. };
  5096. var loopRoutesParser = function (route) {
  5097. if (route.children) {
  5098. for (var i in route.children) {
  5099. if (route.children[i].loadChildren) {
  5100. var child = _this.foundLazyModuleWithPath(route.children[i].loadChildren);
  5101. var module_1 = ___namespace.find(_this.cleanModulesTree, {
  5102. name: child
  5103. });
  5104. if (module_1) {
  5105. var _rawModule = {};
  5106. _rawModule.kind = 'module';
  5107. _rawModule.children = [];
  5108. _rawModule.module = module_1.name;
  5109. loopInsideModule(module_1, _rawModule);
  5110. route.children[i].children = [];
  5111. route.children[i].children.push(_rawModule);
  5112. }
  5113. }
  5114. if (route.children[i].loadComponent) {
  5115. var child = _this.foundLazyComponentWithPath(route.children[i].loadComponent);
  5116. if (child) {
  5117. route.children[i].component = child;
  5118. }
  5119. }
  5120. loopRoutesParser(route.children[i]);
  5121. }
  5122. }
  5123. };
  5124. loopRoutesParser(cleanedRoutesTree);
  5125. return cleanedRoutesTree;
  5126. };
  5127. RouterParserUtil.prototype.constructModulesTree = function () {
  5128. var _this = this;
  5129. var getNestedChildren = function (arr, parent) {
  5130. var out = [];
  5131. for (var i in arr) {
  5132. if (arr[i].parent === parent) {
  5133. var children = getNestedChildren(arr, arr[i].name);
  5134. if (children.length) {
  5135. arr[i].children = children;
  5136. }
  5137. out.push(arr[i]);
  5138. }
  5139. }
  5140. return out;
  5141. };
  5142. // Scan each module and add parent property
  5143. ___namespace.forEach(this.modules, function (firstLoopModule) {
  5144. ___namespace.forEach(firstLoopModule.importsNode, function (importNode) {
  5145. ___namespace.forEach(_this.modules, function (module) {
  5146. if (module.name === importNode.name) {
  5147. module.parent = firstLoopModule.name;
  5148. }
  5149. });
  5150. });
  5151. });
  5152. this.modulesTree = getNestedChildren(this.modules);
  5153. };
  5154. RouterParserUtil.prototype.generateRoutesIndex = function (outputFolder, routes) {
  5155. return FileEngine$1.get(__dirname + '/../src/templates/partials/routes-index.hbs').then(function (data) {
  5156. var template = Handlebars$5.compile(data);
  5157. var result = template({
  5158. routes: JSON.stringify(routes)
  5159. });
  5160. var testOutputDir = outputFolder.match(process.cwd());
  5161. if (testOutputDir && testOutputDir.length > 0) {
  5162. outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
  5163. }
  5164. return FileEngine$1.write(outputFolder + path__namespace.sep + '/js/routes/routes_index.js', result);
  5165. }, function (err) { return Promise.reject('Error during routes index generation'); });
  5166. };
  5167. RouterParserUtil.prototype.routesLength = function () {
  5168. var _n = 0;
  5169. var routesParser = function (route) {
  5170. if (typeof route.path !== 'undefined') {
  5171. _n += 1;
  5172. }
  5173. if (route.children) {
  5174. for (var j in route.children) {
  5175. routesParser(route.children[j]);
  5176. }
  5177. }
  5178. };
  5179. for (var i in this.routes) {
  5180. routesParser(this.routes[i]);
  5181. }
  5182. return _n;
  5183. };
  5184. RouterParserUtil.prototype.printRoutes = function () {
  5185. console.log('');
  5186. console.log('printRoutes: ');
  5187. console.log(this.routes);
  5188. };
  5189. RouterParserUtil.prototype.printModulesRoutes = function () {
  5190. console.log('');
  5191. console.log('printModulesRoutes: ');
  5192. console.log(this.modulesWithRoutes);
  5193. };
  5194. RouterParserUtil.prototype.isVariableRoutes = function (node) {
  5195. var result = false;
  5196. if (node.declarationList && node.declarationList.declarations) {
  5197. var i = 0;
  5198. var len = node.declarationList.declarations.length;
  5199. for (i; i < len; i++) {
  5200. if (node.declarationList.declarations[i].type) {
  5201. if (node.declarationList.declarations[i].type.typeName &&
  5202. node.declarationList.declarations[i].type.typeName.text === 'Routes') {
  5203. result = true;
  5204. }
  5205. }
  5206. }
  5207. }
  5208. return result;
  5209. };
  5210. RouterParserUtil.prototype.cleanFileIdentifiers = function (sourceFile) {
  5211. var e_1, _a, e_2, _b;
  5212. var _this = this;
  5213. var file = sourceFile;
  5214. var identifiers = file.getDescendantsOfKind(tsMorph.SyntaxKind.Identifier).filter(function (p) {
  5215. return (tsMorph.Node.isArrayLiteralExpression(p.getParentOrThrow()) ||
  5216. tsMorph.Node.isPropertyAssignment(p.getParentOrThrow()));
  5217. });
  5218. var identifiersInRoutesVariableStatement = [];
  5219. var _loop_1 = function (identifier) {
  5220. // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
  5221. var foundParentVariableStatement = false;
  5222. identifier.getParentWhile(function (n) {
  5223. if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
  5224. if (_this.isVariableRoutes(n.compilerNode)) {
  5225. foundParentVariableStatement = true;
  5226. }
  5227. }
  5228. return true;
  5229. });
  5230. if (foundParentVariableStatement) {
  5231. identifiersInRoutesVariableStatement.push(identifier);
  5232. }
  5233. };
  5234. try {
  5235. for (var identifiers_1 = __values(identifiers), identifiers_1_1 = identifiers_1.next(); !identifiers_1_1.done; identifiers_1_1 = identifiers_1.next()) {
  5236. var identifier = identifiers_1_1.value;
  5237. _loop_1(identifier);
  5238. }
  5239. }
  5240. catch (e_1_1) { e_1 = { error: e_1_1 }; }
  5241. finally {
  5242. try {
  5243. if (identifiers_1_1 && !identifiers_1_1.done && (_a = identifiers_1.return)) _a.call(identifiers_1);
  5244. }
  5245. finally { if (e_1) throw e_1.error; }
  5246. }
  5247. try {
  5248. // inline the property access expressions
  5249. for (var identifiersInRoutesVariableStatement_1 = __values(identifiersInRoutesVariableStatement), identifiersInRoutesVariableStatement_1_1 = identifiersInRoutesVariableStatement_1.next(); !identifiersInRoutesVariableStatement_1_1.done; identifiersInRoutesVariableStatement_1_1 = identifiersInRoutesVariableStatement_1.next()) {
  5250. var identifier = identifiersInRoutesVariableStatement_1_1.value;
  5251. var identifierDeclaration = identifier
  5252. .getSymbolOrThrow()
  5253. .getValueDeclarationOrThrow();
  5254. if (!tsMorph.Node.isPropertyAssignment(identifierDeclaration) &&
  5255. tsMorph.Node.isVariableDeclaration(identifierDeclaration) &&
  5256. tsMorph.Node.isPropertyAssignment(identifierDeclaration) &&
  5257. !tsMorph.Node.isVariableDeclaration(identifierDeclaration)) {
  5258. throw new Error("Not implemented referenced declaration kind: ".concat(identifierDeclaration.getKindName()));
  5259. }
  5260. if (tsMorph.Node.isVariableDeclaration(identifierDeclaration)) {
  5261. identifier.replaceWithText(identifierDeclaration.getInitializerOrThrow().getText());
  5262. }
  5263. }
  5264. }
  5265. catch (e_2_1) { e_2 = { error: e_2_1 }; }
  5266. finally {
  5267. try {
  5268. if (identifiersInRoutesVariableStatement_1_1 && !identifiersInRoutesVariableStatement_1_1.done && (_b = identifiersInRoutesVariableStatement_1.return)) _b.call(identifiersInRoutesVariableStatement_1);
  5269. }
  5270. finally { if (e_2) throw e_2.error; }
  5271. }
  5272. return file;
  5273. };
  5274. RouterParserUtil.prototype.cleanFileSpreads = function (sourceFile) {
  5275. var e_3, _a, e_4, _b;
  5276. var _this = this;
  5277. var file = sourceFile;
  5278. var spreadElements = file
  5279. .getDescendantsOfKind(tsMorph.SyntaxKind.SpreadElement)
  5280. .filter(function (p) { return tsMorph.Node.isArrayLiteralExpression(p.getParentOrThrow()); });
  5281. var spreadElementsInRoutesVariableStatement = [];
  5282. var _loop_2 = function (spreadElement) {
  5283. // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
  5284. var foundParentVariableStatement = false;
  5285. spreadElement.getParentWhile(function (n) {
  5286. if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
  5287. if (_this.isVariableRoutes(n.compilerNode)) {
  5288. foundParentVariableStatement = true;
  5289. }
  5290. }
  5291. return true;
  5292. });
  5293. if (foundParentVariableStatement) {
  5294. spreadElementsInRoutesVariableStatement.push(spreadElement);
  5295. }
  5296. };
  5297. try {
  5298. for (var spreadElements_1 = __values(spreadElements), spreadElements_1_1 = spreadElements_1.next(); !spreadElements_1_1.done; spreadElements_1_1 = spreadElements_1.next()) {
  5299. var spreadElement = spreadElements_1_1.value;
  5300. _loop_2(spreadElement);
  5301. }
  5302. }
  5303. catch (e_3_1) { e_3 = { error: e_3_1 }; }
  5304. finally {
  5305. try {
  5306. if (spreadElements_1_1 && !spreadElements_1_1.done && (_a = spreadElements_1.return)) _a.call(spreadElements_1);
  5307. }
  5308. finally { if (e_3) throw e_3.error; }
  5309. }
  5310. var _loop_3 = function (spreadElement) {
  5311. var spreadElementIdentifier = spreadElement.getExpression().getText(), searchedImport, aliasOriginalName = '', foundWithAliasInImports = false, foundWithAlias = false;
  5312. // Try to find it in imports
  5313. var imports = file.getImportDeclarations();
  5314. imports.forEach(function (i) {
  5315. var namedImports = i.getNamedImports(), namedImportsLength = namedImports.length, j = 0;
  5316. if (namedImportsLength > 0) {
  5317. for (j; j < namedImportsLength; j++) {
  5318. var importName = namedImports[j].getNameNode().getText(), importAlias = void 0;
  5319. if (namedImports[j].getAliasNode()) {
  5320. importAlias = namedImports[j].getAliasNode().getText();
  5321. }
  5322. if (importName === spreadElementIdentifier) {
  5323. foundWithAliasInImports = true;
  5324. searchedImport = i;
  5325. break;
  5326. }
  5327. if (importAlias === spreadElementIdentifier) {
  5328. foundWithAliasInImports = true;
  5329. foundWithAlias = true;
  5330. aliasOriginalName = importName;
  5331. searchedImport = i;
  5332. break;
  5333. }
  5334. }
  5335. }
  5336. });
  5337. var referencedDeclaration = void 0;
  5338. if (foundWithAliasInImports) {
  5339. if (typeof searchedImport !== 'undefined') {
  5340. var routePathIsBad = function (path) {
  5341. var result = _this.scannedFiles.find(function (scannedFile) { return path === scannedFile.path; });
  5342. return !result;
  5343. };
  5344. var getIndicesOf = function (searchStr, str, caseSensitive) {
  5345. var searchStrLen = searchStr.length;
  5346. if (searchStrLen == 0) {
  5347. return [];
  5348. }
  5349. var startIndex = 0, index, indices = [];
  5350. if (!caseSensitive) {
  5351. str = str.toLowerCase();
  5352. searchStr = searchStr.toLowerCase();
  5353. }
  5354. while ((index = str.indexOf(searchStr, startIndex)) > -1) {
  5355. indices.push(index);
  5356. startIndex = index + searchStrLen;
  5357. }
  5358. return indices;
  5359. };
  5360. var dirNamePath = path__namespace.dirname(file.getFilePath());
  5361. var searchedImportPath = searchedImport.getModuleSpecifierValue();
  5362. var leadingFilePath = searchedImportPath.split('/').shift();
  5363. var importPath = path__namespace.resolve(dirNamePath + '/' + searchedImport.getModuleSpecifierValue() + '.ts');
  5364. if (routePathIsBad(importPath)) {
  5365. var leadingIndices = getIndicesOf(leadingFilePath, importPath, true);
  5366. if (leadingIndices.length > 1) {
  5367. // Nested route fixes
  5368. var startIndex = leadingIndices[0];
  5369. var endIndex = leadingIndices[leadingIndices.length - 1];
  5370. importPath =
  5371. importPath.slice(0, startIndex) + importPath.slice(endIndex);
  5372. }
  5373. else {
  5374. // Top level route fixes
  5375. importPath =
  5376. path__namespace.dirname(dirNamePath) + '/' + searchedImportPath + '.ts';
  5377. }
  5378. }
  5379. var sourceFileImport = typeof ast.getSourceFile(importPath) !== 'undefined'
  5380. ? ast.getSourceFile(importPath)
  5381. : ast.addSourceFileAtPath(importPath);
  5382. if (sourceFileImport) {
  5383. var variableName = foundWithAlias
  5384. ? aliasOriginalName
  5385. : spreadElementIdentifier;
  5386. referencedDeclaration =
  5387. sourceFileImport.getVariableDeclaration(variableName);
  5388. }
  5389. }
  5390. }
  5391. else {
  5392. // if not, try directly in file
  5393. referencedDeclaration = spreadElement
  5394. .getExpression()
  5395. .getSymbolOrThrow()
  5396. .getValueDeclarationOrThrow();
  5397. }
  5398. if (!tsMorph.Node.isVariableDeclaration(referencedDeclaration)) {
  5399. throw new Error("Not implemented referenced declaration kind: ".concat(referencedDeclaration.getKindName()));
  5400. }
  5401. var referencedArray = referencedDeclaration.getInitializerIfKindOrThrow(tsMorph.SyntaxKind.ArrayLiteralExpression);
  5402. var spreadElementArray = spreadElement.getParentIfKindOrThrow(tsMorph.SyntaxKind.ArrayLiteralExpression);
  5403. var insertIndex = spreadElementArray.getElements().indexOf(spreadElement);
  5404. spreadElementArray.removeElement(spreadElement);
  5405. spreadElementArray.insertElements(insertIndex, referencedArray.getElements().map(function (e) { return e.getText(); }));
  5406. };
  5407. try {
  5408. // inline the ArrayLiteralExpression SpreadElements
  5409. for (var spreadElementsInRoutesVariableStatement_1 = __values(spreadElementsInRoutesVariableStatement), spreadElementsInRoutesVariableStatement_1_1 = spreadElementsInRoutesVariableStatement_1.next(); !spreadElementsInRoutesVariableStatement_1_1.done; spreadElementsInRoutesVariableStatement_1_1 = spreadElementsInRoutesVariableStatement_1.next()) {
  5410. var spreadElement = spreadElementsInRoutesVariableStatement_1_1.value;
  5411. _loop_3(spreadElement);
  5412. }
  5413. }
  5414. catch (e_4_1) { e_4 = { error: e_4_1 }; }
  5415. finally {
  5416. try {
  5417. if (spreadElementsInRoutesVariableStatement_1_1 && !spreadElementsInRoutesVariableStatement_1_1.done && (_b = spreadElementsInRoutesVariableStatement_1.return)) _b.call(spreadElementsInRoutesVariableStatement_1);
  5418. }
  5419. finally { if (e_4) throw e_4.error; }
  5420. }
  5421. return file;
  5422. };
  5423. RouterParserUtil.prototype.cleanFileDynamics = function (sourceFile) {
  5424. var e_5, _a, e_6, _b;
  5425. var _this = this;
  5426. var file = sourceFile;
  5427. var propertyAccessExpressions = file
  5428. .getDescendantsOfKind(tsMorph.SyntaxKind.PropertyAccessExpression)
  5429. .filter(function (p) { return !tsMorph.Node.isPropertyAccessExpression(p.getParentOrThrow()); });
  5430. var propertyAccessExpressionsInRoutesVariableStatement = [];
  5431. var _loop_4 = function (propertyAccessExpression) {
  5432. // Loop through their parents nodes, and if one is a variableStatement and === 'routes'
  5433. var foundParentVariableStatement = false;
  5434. propertyAccessExpression.getParentWhile(function (n) {
  5435. if (n.getKind() === tsMorph.SyntaxKind.VariableStatement) {
  5436. if (_this.isVariableRoutes(n.compilerNode)) {
  5437. foundParentVariableStatement = true;
  5438. }
  5439. }
  5440. return true;
  5441. });
  5442. if (foundParentVariableStatement) {
  5443. propertyAccessExpressionsInRoutesVariableStatement.push(propertyAccessExpression);
  5444. }
  5445. };
  5446. try {
  5447. for (var propertyAccessExpressions_1 = __values(propertyAccessExpressions), propertyAccessExpressions_1_1 = propertyAccessExpressions_1.next(); !propertyAccessExpressions_1_1.done; propertyAccessExpressions_1_1 = propertyAccessExpressions_1.next()) {
  5448. var propertyAccessExpression = propertyAccessExpressions_1_1.value;
  5449. _loop_4(propertyAccessExpression);
  5450. }
  5451. }
  5452. catch (e_5_1) { e_5 = { error: e_5_1 }; }
  5453. finally {
  5454. try {
  5455. if (propertyAccessExpressions_1_1 && !propertyAccessExpressions_1_1.done && (_a = propertyAccessExpressions_1.return)) _a.call(propertyAccessExpressions_1);
  5456. }
  5457. finally { if (e_5) throw e_5.error; }
  5458. }
  5459. try {
  5460. // inline the property access expressions
  5461. for (var propertyAccessExpressionsInRoutesVariableStatement_1 = __values(propertyAccessExpressionsInRoutesVariableStatement), propertyAccessExpressionsInRoutesVariableStatement_1_1 = propertyAccessExpressionsInRoutesVariableStatement_1.next(); !propertyAccessExpressionsInRoutesVariableStatement_1_1.done; propertyAccessExpressionsInRoutesVariableStatement_1_1 = propertyAccessExpressionsInRoutesVariableStatement_1.next()) {
  5462. var propertyAccessExpression = propertyAccessExpressionsInRoutesVariableStatement_1_1.value;
  5463. var propertyAccessExpressionNodeName = propertyAccessExpression.getNameNode();
  5464. if (propertyAccessExpressionNodeName) {
  5465. try {
  5466. var propertyAccessExpressionNodeNameSymbol = propertyAccessExpressionNodeName.getSymbolOrThrow();
  5467. if (propertyAccessExpressionNodeNameSymbol) {
  5468. var referencedDeclaration = propertyAccessExpressionNodeNameSymbol.getValueDeclarationOrThrow();
  5469. if (!tsMorph.Node.isPropertyAssignment(referencedDeclaration) &&
  5470. tsMorph.Node.isEnumMember(referencedDeclaration) &&
  5471. tsMorph.Node.isPropertyAssignment(referencedDeclaration) &&
  5472. !tsMorph.Node.isEnumMember(referencedDeclaration)) {
  5473. throw new Error("Not implemented referenced declaration kind: ".concat(referencedDeclaration.getKindName()));
  5474. }
  5475. if (typeof referencedDeclaration.getInitializerOrThrow !== 'undefined') {
  5476. propertyAccessExpression.replaceWithText(referencedDeclaration.getInitializerOrThrow().getText());
  5477. }
  5478. }
  5479. }
  5480. catch (e) { }
  5481. }
  5482. }
  5483. }
  5484. catch (e_6_1) { e_6 = { error: e_6_1 }; }
  5485. finally {
  5486. try {
  5487. if (propertyAccessExpressionsInRoutesVariableStatement_1_1 && !propertyAccessExpressionsInRoutesVariableStatement_1_1.done && (_b = propertyAccessExpressionsInRoutesVariableStatement_1.return)) _b.call(propertyAccessExpressionsInRoutesVariableStatement_1);
  5488. }
  5489. finally { if (e_6) throw e_6.error; }
  5490. }
  5491. return file;
  5492. };
  5493. /**
  5494. * replace callexpressions with string : utils.doWork() -> 'utils.doWork()' doWork() -> 'doWork()'
  5495. * @param sourceFile ts.SourceFile
  5496. */
  5497. RouterParserUtil.prototype.cleanCallExpressions = function (sourceFile) {
  5498. var e_7, _a;
  5499. var file = sourceFile;
  5500. var variableStatements = sourceFile.getVariableDeclaration(function (v) {
  5501. var result = false;
  5502. var type = v.compilerNode.type;
  5503. if (typeof type !== 'undefined' && typeof type.typeName !== 'undefined') {
  5504. result = type.typeName.text === 'Routes';
  5505. }
  5506. return result;
  5507. });
  5508. var initializer = variableStatements.getInitializer();
  5509. var _loop_5 = function (callExpr) {
  5510. if (callExpr.wasForgotten()) {
  5511. return "continue";
  5512. }
  5513. callExpr.replaceWithText(function (writer) { return writer.quote(callExpr.getText()); });
  5514. };
  5515. try {
  5516. for (var _b = __values(initializer.getDescendantsOfKind(tsMorph.SyntaxKind.CallExpression)), _c = _b.next(); !_c.done; _c = _b.next()) {
  5517. var callExpr = _c.value;
  5518. _loop_5(callExpr);
  5519. }
  5520. }
  5521. catch (e_7_1) { e_7 = { error: e_7_1 }; }
  5522. finally {
  5523. try {
  5524. if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
  5525. }
  5526. finally { if (e_7) throw e_7.error; }
  5527. }
  5528. return file;
  5529. };
  5530. /**
  5531. * Clean routes definition with imported data, for example path, children, or dynamic stuff inside data
  5532. *
  5533. * const MY_ROUTES: Routes = [
  5534. * {
  5535. * path: 'home',
  5536. * component: HomeComponent
  5537. * },
  5538. * {
  5539. * path: PATHS.home,
  5540. * component: HomeComponent
  5541. * }
  5542. * ];
  5543. *
  5544. * The initializer is an array (ArrayLiteralExpression - 177 ), it has elements, objects (ObjectLiteralExpression - 178)
  5545. * with properties (PropertyAssignment - 261)
  5546. *
  5547. * For each know property (https://angular.io/api/router/Routes#description), we try to see if we have what we want
  5548. *
  5549. * Ex: path and pathMatch want a string, component a component reference.
  5550. *
  5551. * It is an imperative approach, not a generic way, parsing all the tree
  5552. * and find something like this which willl break JSON.stringify : MYIMPORT.path
  5553. *
  5554. * @param {ts.Node} initializer The node of routes definition
  5555. * @return {ts.Node} The edited node
  5556. */
  5557. RouterParserUtil.prototype.cleanRoutesDefinitionWithImport = function (initializer, node, sourceFile) {
  5558. initializer.elements.forEach(function (element) {
  5559. element.properties.forEach(function (property) {
  5560. var propertyName = property.name.getText(), propertyInitializer = property.initializer;
  5561. switch (propertyName) {
  5562. case 'path':
  5563. case 'redirectTo':
  5564. case 'outlet':
  5565. case 'pathMatch':
  5566. if (propertyInitializer) {
  5567. if (propertyInitializer.kind !== tsMorph.SyntaxKind.StringLiteral) {
  5568. // Identifier(71) won't break parsing, but it will be better to retrive them
  5569. // PropertyAccessExpression(179) ex: MYIMPORT.path will break it, find it in import
  5570. if (propertyInitializer.kind === tsMorph.SyntaxKind.PropertyAccessExpression) {
  5571. var lastObjectLiteralAttributeName = propertyInitializer.name.getText(), firstObjectLiteralAttributeName = void 0;
  5572. if (propertyInitializer.expression) {
  5573. firstObjectLiteralAttributeName =
  5574. propertyInitializer.expression.getText();
  5575. var result = ImportsUtil$1.findPropertyValueInImportOrLocalVariables(firstObjectLiteralAttributeName +
  5576. '.' +
  5577. lastObjectLiteralAttributeName, sourceFile); // tslint:disable-line
  5578. if (result !== '') {
  5579. propertyInitializer.kind = 9;
  5580. propertyInitializer.text = result;
  5581. }
  5582. }
  5583. }
  5584. }
  5585. }
  5586. break;
  5587. }
  5588. });
  5589. });
  5590. return initializer;
  5591. };
  5592. return RouterParserUtil;
  5593. }());
  5594. var RouterParserUtil$1 = RouterParserUtil.getInstance();
  5595. function isModuleWithProviders(node) {
  5596. var result = false;
  5597. if (node.declarationList) {
  5598. if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
  5599. var i = 0; node.declarationList.declarations; var len = node.declarationList.declarations.length;
  5600. for (i; i < len; i++) {
  5601. var declaration = node.declarationList.declarations[i];
  5602. if (declaration.type) {
  5603. var type = declaration.type;
  5604. if (type.typeName) {
  5605. var text = type.typeName.getText();
  5606. if (text === 'ModuleWithProviders') {
  5607. result = true;
  5608. }
  5609. }
  5610. }
  5611. }
  5612. }
  5613. }
  5614. return result;
  5615. }
  5616. function getModuleWithProviders(node) {
  5617. var result;
  5618. if (node.declarationList) {
  5619. if (node.declarationList.declarations && node.declarationList.declarations.length > 0) {
  5620. var i = 0, len = node.declarationList.declarations.length;
  5621. for (i; i < len; i++) {
  5622. var declaration = node.declarationList.declarations[i];
  5623. if (declaration.type) {
  5624. var type = declaration.type;
  5625. if (type.typeName) {
  5626. var text = type.typeName.getText();
  5627. if (text === 'ModuleWithProviders') {
  5628. result = declaration.initializer;
  5629. }
  5630. }
  5631. }
  5632. }
  5633. }
  5634. }
  5635. return result;
  5636. }
  5637. var ExtendsMerger = /** @class */ (function () {
  5638. function ExtendsMerger() {
  5639. }
  5640. ExtendsMerger.getInstance = function () {
  5641. if (!ExtendsMerger.instance) {
  5642. ExtendsMerger.instance = new ExtendsMerger();
  5643. }
  5644. return ExtendsMerger.instance;
  5645. };
  5646. ExtendsMerger.prototype.merge = function (deps) {
  5647. var _this = this;
  5648. this.components = deps.components;
  5649. this.classes = deps.classes;
  5650. this.injectables = deps.injectables;
  5651. this.directives = deps.directives;
  5652. this.controllers = deps.controllers;
  5653. this.aliases = deps.aliases;
  5654. var mergeExtendedProperties = function (component) {
  5655. var ext;
  5656. if (typeof component.extends !== 'undefined') {
  5657. ext = _this.findInDependencies(component.extends[0]);
  5658. if (ext) {
  5659. var recursiveScanWithInheritance_1 = function (cls) {
  5660. // From class to component
  5661. if (typeof cls.methods !== 'undefined' && cls.methods.length > 0) {
  5662. var newMethods = _.cloneDeep(cls.methods);
  5663. newMethods = _this.markInheritance(newMethods, cls);
  5664. if (typeof component.methodsClass !== 'undefined') {
  5665. _this.mergeInheritance(component, 'methodsClass', newMethods);
  5666. }
  5667. }
  5668. if (typeof cls.properties !== 'undefined' && cls.properties.length > 0) {
  5669. var newProperties = _.cloneDeep(cls.properties);
  5670. newProperties = _this.markInheritance(newProperties, cls);
  5671. if (typeof component.propertiesClass !== 'undefined') {
  5672. _this.mergeInheritance(component, 'propertiesClass', newProperties);
  5673. }
  5674. }
  5675. // From component to component or directive to component
  5676. if (typeof cls.inputsClass !== 'undefined' && cls.inputsClass.length > 0) {
  5677. var newInputs = _.cloneDeep(cls.inputsClass);
  5678. newInputs = _this.markInheritance(newInputs, cls);
  5679. if (typeof component.inputsClass !== 'undefined') {
  5680. _this.mergeInheritance(component, 'inputsClass', newInputs);
  5681. }
  5682. }
  5683. if (typeof cls.outputsClass !== 'undefined' &&
  5684. cls.outputsClass.length > 0) {
  5685. var newOutputs = _.cloneDeep(cls.outputsClass);
  5686. newOutputs = _this.markInheritance(newOutputs, cls);
  5687. if (typeof component.outputsClass !== 'undefined') {
  5688. _this.mergeInheritance(component, 'outputsClass', newOutputs);
  5689. }
  5690. }
  5691. if (typeof cls.methodsClass !== 'undefined' &&
  5692. cls.methodsClass.length > 0) {
  5693. var newMethods = _.cloneDeep(cls.methodsClass);
  5694. newMethods = _this.markInheritance(newMethods, cls);
  5695. if (typeof component.methodsClass !== 'undefined') {
  5696. _this.mergeInheritance(component, 'methodsClass', newMethods);
  5697. }
  5698. }
  5699. if (typeof cls.propertiesClass !== 'undefined' &&
  5700. cls.propertiesClass.length > 0) {
  5701. var newProperties = _.cloneDeep(cls.propertiesClass);
  5702. newProperties = _this.markInheritance(newProperties, cls);
  5703. if (typeof component.propertiesClass !== 'undefined') {
  5704. _this.mergeInheritance(component, 'propertiesClass', newProperties);
  5705. }
  5706. }
  5707. if (typeof cls.hostBindings !== 'undefined' &&
  5708. cls.hostBindings.length > 0) {
  5709. var newHostBindings = _.cloneDeep(cls.hostBindings);
  5710. newHostBindings = _this.markInheritance(newHostBindings, cls);
  5711. if (typeof component.hostBindings !== 'undefined') {
  5712. _this.mergeInheritance(component, 'hostBindings', newHostBindings);
  5713. }
  5714. }
  5715. if (typeof cls.hostListeners !== 'undefined' &&
  5716. cls.hostListeners.length > 0) {
  5717. var newHostListeners = _.cloneDeep(cls.hostListeners);
  5718. newHostListeners = _this.markInheritance(newHostListeners, cls);
  5719. if (typeof component.hostListeners !== 'undefined') {
  5720. _this.mergeInheritance(component, 'hostListeners', newHostListeners);
  5721. }
  5722. }
  5723. if (Configuration$1.mainData.disableLifeCycleHooks) {
  5724. component.methodsClass = cleanLifecycleHooksFromMethods(component.methodsClass);
  5725. }
  5726. if (cls.extends) {
  5727. recursiveScanWithInheritance_1(_this.findInDependencies(cls.extends[0]));
  5728. }
  5729. };
  5730. // From class to class
  5731. recursiveScanWithInheritance_1(ext);
  5732. }
  5733. }
  5734. };
  5735. this.components.forEach(mergeExtendedProperties);
  5736. this.directives.forEach(mergeExtendedProperties);
  5737. this.controllers.forEach(mergeExtendedProperties);
  5738. var mergeExtendedClasses = function (el) {
  5739. var ext;
  5740. if (typeof el.extends !== 'undefined') {
  5741. ext = _this.findInDependencies(el.extends[0]);
  5742. if (ext) {
  5743. var recursiveScanWithInheritance_2 = function (cls) {
  5744. if (typeof cls.methods !== 'undefined' && cls.methods.length > 0) {
  5745. var newMethods = _.cloneDeep(cls.methods);
  5746. newMethods = _this.markInheritance(newMethods, cls);
  5747. if (typeof el.methods !== 'undefined') {
  5748. _this.mergeInheritance(el, 'methods', newMethods);
  5749. }
  5750. }
  5751. if (typeof cls.properties !== 'undefined' && cls.properties.length > 0) {
  5752. var newProperties = _.cloneDeep(cls.properties);
  5753. newProperties = _this.markInheritance(newProperties, cls);
  5754. if (typeof el.properties !== 'undefined') {
  5755. _this.mergeInheritance(el, 'properties', newProperties);
  5756. }
  5757. }
  5758. if (cls.extends) {
  5759. recursiveScanWithInheritance_2(_this.findInDependencies(cls.extends[0]));
  5760. }
  5761. };
  5762. // From elss to elss
  5763. recursiveScanWithInheritance_2(ext);
  5764. }
  5765. }
  5766. };
  5767. this.classes.forEach(mergeExtendedClasses);
  5768. this.injectables.forEach(mergeExtendedClasses);
  5769. this.directives.forEach(mergeExtendedClasses);
  5770. this.controllers.forEach(mergeExtendedClasses);
  5771. return deps;
  5772. };
  5773. ExtendsMerger.prototype.markInheritance = function (data, originalource) {
  5774. return data.map(function (el) {
  5775. var newElement = el;
  5776. newElement.inheritance = {
  5777. file: originalource.name
  5778. };
  5779. return newElement;
  5780. });
  5781. };
  5782. ExtendsMerger.prototype.mergeInheritance = function (component, metaPropertyId, newMembers) {
  5783. newMembers.forEach(function (newMember) {
  5784. var overriddenMethod = component[metaPropertyId].find(function (componentMember) { return componentMember.name === newMember.name; });
  5785. if (overriddenMethod) {
  5786. overriddenMethod.inheritance = newMember.inheritance;
  5787. }
  5788. else {
  5789. component[metaPropertyId].push(newMember);
  5790. }
  5791. });
  5792. };
  5793. ExtendsMerger.prototype.findInDependencies = function (name) {
  5794. var mergedData = _.concat([], this.components, this.classes, this.injectables, this.directives, this.controllers);
  5795. var result = _.find(mergedData, { name: name });
  5796. // Find in aliases ?
  5797. if (!result) {
  5798. var aliases = Object.values(this.aliases);
  5799. var isInAlias = aliases.includes(name);
  5800. if (isInAlias) {
  5801. var finalOriginalName = this.findInAliases(name);
  5802. if (finalOriginalName) {
  5803. result = _.find(mergedData, { name: finalOriginalName });
  5804. }
  5805. }
  5806. }
  5807. return result || false;
  5808. };
  5809. ExtendsMerger.prototype.findInAliases = function (name) {
  5810. var finalOriginalName = null;
  5811. for (var originalName in this.aliases) {
  5812. if (this.aliases[originalName].includes(name)) {
  5813. finalOriginalName = originalName;
  5814. }
  5815. }
  5816. return finalOriginalName;
  5817. };
  5818. return ExtendsMerger;
  5819. }());
  5820. var ExtendsMerger$1 = ExtendsMerger.getInstance();
  5821. var LinkTypeHelper = /** @class */ (function () {
  5822. function LinkTypeHelper() {
  5823. }
  5824. LinkTypeHelper.prototype.helperFunc = function (context, name, options) {
  5825. var _result = DependenciesEngine$1.find(name);
  5826. // Find in aliases ?
  5827. if (!_result) {
  5828. var potentialAlias = ExtendsMerger$1.findInAliases(name);
  5829. if (potentialAlias) {
  5830. _result = DependenciesEngine$1.find(potentialAlias);
  5831. }
  5832. }
  5833. var angularDocPrefix = AngularVersionUtil$1.prefixOfficialDoc(Configuration$1.mainData.angularVersion);
  5834. if (_result) {
  5835. context.type = {
  5836. raw: name,
  5837. indexKey: ''
  5838. };
  5839. if (_result.source === 'internal') {
  5840. if (_result.data.type === 'class') {
  5841. _result.data.type = 'classe';
  5842. }
  5843. context.type.href = '../' + _result.data.type + 's/' + _result.data.name + '.html';
  5844. if (context.indexKey !== '' && context.indexKey !== undefined) {
  5845. context.type.href += '#' + context.indexKey;
  5846. context.type.indexKey = context.indexKey;
  5847. }
  5848. if (_result.data.type === 'miscellaneous' ||
  5849. (_result.data.ctype && _result.data.ctype === 'miscellaneous')) {
  5850. var mainpage = '';
  5851. switch (_result.data.subtype) {
  5852. case 'enum':
  5853. mainpage = 'enumerations';
  5854. break;
  5855. case 'function':
  5856. mainpage = 'functions';
  5857. break;
  5858. case 'typealias':
  5859. mainpage = 'typealiases';
  5860. break;
  5861. case 'variable':
  5862. mainpage = 'variables';
  5863. }
  5864. context.type.href = '../' + _result.data.ctype + '/' + mainpage + '.html';
  5865. if (_result.data && _result.data.name) {
  5866. context.type.href += '#' + _result.data.name;
  5867. }
  5868. }
  5869. if (!context.type.indexKey) {
  5870. context.type.indexKey = '';
  5871. }
  5872. context.type.target = '_self';
  5873. }
  5874. else {
  5875. context.type.href = "https://".concat(angularDocPrefix, "angular.io/").concat(_result.data.path);
  5876. context.type.target = '_blank';
  5877. }
  5878. return options.fn(context);
  5879. }
  5880. else if (BasicTypeUtil$1.isKnownType(name)) {
  5881. context.type = {
  5882. raw: name,
  5883. indexKey: ''
  5884. };
  5885. context.type.target = '_blank';
  5886. context.type.href = BasicTypeUtil$1.getTypeUrl(name);
  5887. return options.fn(context);
  5888. }
  5889. else {
  5890. return options.inverse(context);
  5891. }
  5892. };
  5893. return LinkTypeHelper;
  5894. }());
  5895. var ModifIconHelper = /** @class */ (function () {
  5896. function ModifIconHelper() {
  5897. }
  5898. ModifIconHelper.prototype.helperFunc = function (context, kind) {
  5899. var _kindText = '';
  5900. switch (kind) {
  5901. case tsMorph.SyntaxKind.PrivateKeyword:
  5902. _kindText = 'lock'; // private
  5903. break;
  5904. case tsMorph.SyntaxKind.ProtectedKeyword:
  5905. _kindText = 'lock'; // protected
  5906. break;
  5907. case tsMorph.SyntaxKind.StaticKeyword:
  5908. _kindText = 'reset'; // static
  5909. break;
  5910. case tsMorph.SyntaxKind.ExportKeyword:
  5911. _kindText = 'export'; // export
  5912. break;
  5913. default:
  5914. _kindText = 'reset';
  5915. break;
  5916. }
  5917. return _kindText;
  5918. };
  5919. return ModifIconHelper;
  5920. }());
  5921. var Handlebars$4 = require('handlebars');
  5922. var ModifKindHelper = /** @class */ (function () {
  5923. function ModifKindHelper() {
  5924. }
  5925. /**
  5926. * Transform SyntaxKind into string
  5927. * @param {any} context Handlebars context
  5928. * @param {SyntaxKind[]} kind SyntaxKind concatenated
  5929. * @return {string} Parsed string
  5930. */
  5931. ModifKindHelper.prototype.helperFunc = function (context, kind) {
  5932. var _kindText = '';
  5933. switch (kind) {
  5934. case tsMorph.SyntaxKind.PrivateKeyword:
  5935. _kindText = 'Private';
  5936. break;
  5937. case tsMorph.SyntaxKind.ReadonlyKeyword:
  5938. _kindText = 'Readonly';
  5939. break;
  5940. case tsMorph.SyntaxKind.ProtectedKeyword:
  5941. _kindText = 'Protected';
  5942. break;
  5943. case tsMorph.SyntaxKind.PublicKeyword:
  5944. _kindText = 'Public';
  5945. break;
  5946. case tsMorph.SyntaxKind.StaticKeyword:
  5947. _kindText = 'Static';
  5948. break;
  5949. case tsMorph.SyntaxKind.AsyncKeyword:
  5950. _kindText = 'Async';
  5951. break;
  5952. case tsMorph.SyntaxKind.AbstractKeyword:
  5953. _kindText = 'Abstract';
  5954. break;
  5955. }
  5956. return new Handlebars$4.SafeString(_kindText);
  5957. };
  5958. return ModifKindHelper;
  5959. }());
  5960. var ObjectLengthHelper = /** @class */ (function () {
  5961. function ObjectLengthHelper() {
  5962. }
  5963. ObjectLengthHelper.prototype.helperFunc = function (context, obj, operator, length) {
  5964. var len = arguments.length - 1;
  5965. var options = arguments[len];
  5966. if (typeof obj !== 'object') {
  5967. return options.inverse(context);
  5968. }
  5969. var size = 0, key;
  5970. for (key in obj) {
  5971. if (obj.hasOwnProperty(key)) {
  5972. size++;
  5973. }
  5974. }
  5975. var result;
  5976. switch (operator) {
  5977. case '===':
  5978. result = size === length;
  5979. break;
  5980. case '!==':
  5981. result = size !== length;
  5982. break;
  5983. case '>':
  5984. result = size > length;
  5985. break;
  5986. default: {
  5987. throw new Error('helper {{objectLength}}: invalid operator: `' + operator + '`');
  5988. }
  5989. }
  5990. if (result === false) {
  5991. return options.inverse(context);
  5992. }
  5993. return options.fn(context);
  5994. };
  5995. return ObjectLengthHelper;
  5996. }());
  5997. var Handlebars$3 = require('handlebars');
  5998. var ObjectHelper = /** @class */ (function () {
  5999. function ObjectHelper() {
  6000. }
  6001. ObjectHelper.prototype.helperFunc = function (context, text) {
  6002. text = JSON.stringify(text);
  6003. text = text.replace(/{"/, '{<br>&nbsp;&nbsp;&nbsp;&nbsp;"');
  6004. text = text.replace(/,"/, ',<br>&nbsp;&nbsp;&nbsp;&nbsp;"');
  6005. text = text.replace(/}$/, '<br>}');
  6006. return new Handlebars$3.SafeString(text);
  6007. };
  6008. return ObjectHelper;
  6009. }());
  6010. var OneParameterHasHelper = /** @class */ (function () {
  6011. function OneParameterHasHelper() {
  6012. }
  6013. OneParameterHasHelper.prototype.helperFunc = function (context, tags, typeToCheck) {
  6014. var result = false;
  6015. var len = arguments.length - 1;
  6016. var options = arguments[len];
  6017. var i = 0, leng = tags.length;
  6018. for (i; i < leng; i++) {
  6019. if (typeof tags[i][typeToCheck] !== 'undefined' && tags[i][typeToCheck] !== '') {
  6020. result = true;
  6021. }
  6022. }
  6023. if (result) {
  6024. return options.fn(context);
  6025. }
  6026. else {
  6027. return options.inverse(context);
  6028. }
  6029. };
  6030. return OneParameterHasHelper;
  6031. }());
  6032. var OrLengthHelper = /** @class */ (function () {
  6033. function OrLengthHelper() {
  6034. }
  6035. OrLengthHelper.prototype.helperFunc = function (context /* any, any, ..., options */) {
  6036. var len = arguments.length - 1;
  6037. var options = arguments[len];
  6038. // We start at 1 because of options
  6039. for (var i = 1; i < len; i++) {
  6040. if (typeof arguments[i] !== 'undefined') {
  6041. if (Object.keys(arguments[i]).length > 0) {
  6042. return options.fn(context);
  6043. }
  6044. }
  6045. }
  6046. return options.inverse(context);
  6047. };
  6048. return OrLengthHelper;
  6049. }());
  6050. var OrHelper = /** @class */ (function () {
  6051. function OrHelper() {
  6052. }
  6053. OrHelper.prototype.helperFunc = function (context /* any, any, ..., options */) {
  6054. var len = arguments.length - 1;
  6055. var options = arguments[len];
  6056. // We start at 1 because of options
  6057. for (var i = 1; i < len; i++) {
  6058. if (arguments[i]) {
  6059. return options.fn(context);
  6060. }
  6061. }
  6062. return options.inverse(context);
  6063. };
  6064. return OrHelper;
  6065. }());
  6066. var ParseDescriptionHelper = /** @class */ (function () {
  6067. function ParseDescriptionHelper() {
  6068. }
  6069. ParseDescriptionHelper.prototype.helperFunc = function (context, description, depth) {
  6070. var tagRegExpLight = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
  6071. var tagRegExpFull = new RegExp('\\{@link\\s+((?:.|\n)+?)\\}', 'i');
  6072. var tagRegExp;
  6073. var matches;
  6074. var previousString;
  6075. tagRegExp = description.indexOf(']{') !== -1 ? tagRegExpFull : tagRegExpLight;
  6076. var processTheLink = function (originalDescription, matchedTag, leadingText) {
  6077. var leading = extractLeadingText(originalDescription, matchedTag.completeTag);
  6078. var split;
  6079. var resultInCompodoc;
  6080. var newLink;
  6081. var rootPath;
  6082. var stringtoReplace;
  6083. var anchor = '';
  6084. var label;
  6085. var pageName;
  6086. split = splitLinkText(matchedTag.text);
  6087. if (typeof split.linkText !== 'undefined') {
  6088. resultInCompodoc = DependenciesEngine$1.findInCompodoc(split.target);
  6089. }
  6090. else {
  6091. var info = matchedTag.text;
  6092. if (matchedTag.text.indexOf('#') !== -1) {
  6093. anchor = matchedTag.text.substr(matchedTag.text.indexOf('#'), matchedTag.text.length);
  6094. info = matchedTag.text.substr(0, matchedTag.text.indexOf('#'));
  6095. }
  6096. resultInCompodoc = DependenciesEngine$1.findInCompodoc(info);
  6097. }
  6098. if (resultInCompodoc) {
  6099. label = resultInCompodoc.name;
  6100. pageName = resultInCompodoc.name;
  6101. if (leadingText) {
  6102. stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
  6103. }
  6104. else if (leading.leadingText !== undefined) {
  6105. stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
  6106. }
  6107. else if (typeof split.linkText !== 'undefined') {
  6108. stringtoReplace = matchedTag.completeTag;
  6109. }
  6110. else {
  6111. stringtoReplace = matchedTag.completeTag;
  6112. }
  6113. if (resultInCompodoc.type === 'class') {
  6114. resultInCompodoc.type = 'classes';
  6115. }
  6116. else if (resultInCompodoc.type === 'miscellaneous' ||
  6117. (resultInCompodoc.ctype && resultInCompodoc.ctype === 'miscellaneous')) {
  6118. resultInCompodoc.type = 'miscellaneous'; // Not a typo, it is for matching other single types : component, module etc
  6119. label = resultInCompodoc.name;
  6120. anchor = '#' + resultInCompodoc.name;
  6121. if (resultInCompodoc.subtype === 'enum') {
  6122. pageName = 'enumerations';
  6123. }
  6124. else if (resultInCompodoc.subtype === 'function') {
  6125. pageName = 'functions';
  6126. }
  6127. else if (resultInCompodoc.subtype === 'typealias') {
  6128. pageName = 'typealiases';
  6129. }
  6130. else if (resultInCompodoc.subtype === 'variable') {
  6131. pageName = 'variables';
  6132. }
  6133. }
  6134. rootPath = '';
  6135. switch (depth) {
  6136. case 0:
  6137. rootPath = './';
  6138. break;
  6139. case 1:
  6140. case 2:
  6141. case 3:
  6142. case 4:
  6143. case 5:
  6144. rootPath = '../'.repeat(depth);
  6145. break;
  6146. }
  6147. if (leading.leadingText !== undefined) {
  6148. label = leading.leadingText;
  6149. }
  6150. if (typeof split.linkText !== 'undefined') {
  6151. label = split.linkText;
  6152. }
  6153. if (resultInCompodoc.type === 'miscellaneous' ||
  6154. resultInCompodoc.type === 'classes') {
  6155. newLink = "<a href=\"".concat(rootPath).concat(resultInCompodoc.type, "/").concat(pageName, ".html").concat(anchor, "\">").concat(label, "</a>");
  6156. }
  6157. else {
  6158. newLink = "<a href=\"".concat(rootPath).concat(resultInCompodoc.type, "s/").concat(pageName, ".html").concat(anchor, "\">").concat(label, "</a>");
  6159. }
  6160. return originalDescription.replace(stringtoReplace, newLink);
  6161. }
  6162. else if (!resultInCompodoc && typeof split.linkText !== 'undefined') {
  6163. newLink = "<a href=\"".concat(split.target, "\">").concat(split.linkText, "</a>");
  6164. if (leadingText) {
  6165. stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
  6166. }
  6167. else if (leading.leadingText !== undefined) {
  6168. stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
  6169. }
  6170. else if (typeof split.linkText !== 'undefined') {
  6171. stringtoReplace = matchedTag.completeTag;
  6172. }
  6173. else {
  6174. stringtoReplace = matchedTag.completeTag;
  6175. }
  6176. return originalDescription.replace(stringtoReplace, newLink);
  6177. }
  6178. else if (!resultInCompodoc && leading && typeof leading.leadingText !== 'undefined') {
  6179. newLink = "<a href=\"".concat(split.target, "\">").concat(leading.leadingText, "</a>");
  6180. if (leadingText) {
  6181. stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
  6182. }
  6183. else if (leading.leadingText !== undefined) {
  6184. stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
  6185. }
  6186. else if (typeof split.linkText !== 'undefined') {
  6187. stringtoReplace = matchedTag.completeTag;
  6188. }
  6189. else {
  6190. stringtoReplace = matchedTag.completeTag;
  6191. }
  6192. return originalDescription.replace(stringtoReplace, newLink);
  6193. }
  6194. else if (!resultInCompodoc && typeof split.linkText === 'undefined') {
  6195. newLink = "<a href=\"".concat(split.target, "\">").concat(split.target, "</a>");
  6196. if (leadingText) {
  6197. stringtoReplace = '[' + leadingText + ']' + matchedTag.completeTag;
  6198. }
  6199. else if (leading.leadingText !== undefined) {
  6200. stringtoReplace = '[' + leading.leadingText + ']' + matchedTag.completeTag;
  6201. }
  6202. else {
  6203. stringtoReplace = matchedTag.completeTag;
  6204. }
  6205. return originalDescription.replace(stringtoReplace, newLink);
  6206. }
  6207. else {
  6208. return originalDescription;
  6209. }
  6210. };
  6211. function replaceMatch(replacer, tag, match, text, linkText) {
  6212. var matchedTag = {
  6213. completeTag: match,
  6214. tag: tag,
  6215. text: text
  6216. };
  6217. if (linkText) {
  6218. return replacer(description, matchedTag, linkText);
  6219. }
  6220. else {
  6221. return replacer(description, matchedTag);
  6222. }
  6223. }
  6224. // Clean description for marked a tag parsed too early
  6225. if (description.indexOf('href=') !== -1) {
  6226. var insideMarkedATagResults = description.match(/<a [^>]+>([^<]+)<\/a>/g);
  6227. if (insideMarkedATagResults && insideMarkedATagResults.length > 0) {
  6228. for (var i = 0; i < insideMarkedATagResults.length; i++) {
  6229. var markedATagRegExp = new RegExp('<a [^>]+>([^<]+)</a>', 'gm');
  6230. var parsedATag = markedATagRegExp.exec(description);
  6231. if (parsedATag && parsedATag.length === 2) {
  6232. var insideMarkedATag = parsedATag[1];
  6233. description = description.replace("{@link <a href=\"".concat(encodeURI(insideMarkedATag), "\">").concat(insideMarkedATag, "</a>"), "{@link ".concat(insideMarkedATag));
  6234. }
  6235. }
  6236. }
  6237. }
  6238. do {
  6239. matches = tagRegExp.exec(description);
  6240. // Did we have {@link ?
  6241. if (matches) {
  6242. previousString = description;
  6243. if (matches.length === 2) {
  6244. description = replaceMatch(processTheLink, 'link', matches[0], matches[1]);
  6245. }
  6246. if (matches.length === 3) {
  6247. description = replaceMatch(processTheLink, 'link', matches[0], matches[2], matches[1]);
  6248. }
  6249. }
  6250. } while (matches && previousString !== description);
  6251. return description;
  6252. };
  6253. return ParseDescriptionHelper;
  6254. }());
  6255. require('handlebars');
  6256. var ParsePropertyHelper = /** @class */ (function () {
  6257. function ParsePropertyHelper() {
  6258. }
  6259. ParsePropertyHelper.prototype.helperFunc = function (context, text) {
  6260. var prop = text;
  6261. if (!!text && text.constructor === Object && text['url'] !== undefined) {
  6262. prop = text['url'];
  6263. }
  6264. if (!!text && text.constructor === Object && text['name'] !== undefined) {
  6265. prop = text['name'];
  6266. }
  6267. if (!!text && text.constructor === Object && Object.keys(text).length === 0) {
  6268. prop = '';
  6269. }
  6270. if (prop instanceof String && prop !== '' && prop.indexOf('https') !== -1) {
  6271. return "<a href=\"".concat(prop, "\" target=\"_blank\">").concat(prop, "</a>");
  6272. }
  6273. else if (prop !== '' && prop instanceof Array && prop.length > 0) {
  6274. prop = JSON.stringify(prop);
  6275. prop = prop.replace(/","/g, ', ');
  6276. prop = prop.replace(/\["/g, '');
  6277. prop = prop.replace(/"]/g, '');
  6278. return prop;
  6279. }
  6280. else {
  6281. return prop;
  6282. }
  6283. };
  6284. return ParsePropertyHelper;
  6285. }());
  6286. var RelativeURLHelper = /** @class */ (function () {
  6287. function RelativeURLHelper() {
  6288. }
  6289. RelativeURLHelper.prototype.helperFunc = function (context, currentDepth, options) {
  6290. switch (currentDepth) {
  6291. case 0:
  6292. return './';
  6293. case 1:
  6294. case 2:
  6295. case 3:
  6296. case 4:
  6297. case 5:
  6298. return '../'.repeat(currentDepth);
  6299. }
  6300. return '';
  6301. };
  6302. return RelativeURLHelper;
  6303. }());
  6304. var ShortURLHelper = /** @class */ (function () {
  6305. function ShortURLHelper() {
  6306. }
  6307. ShortURLHelper.prototype.helperFunc = function (context, url, options) {
  6308. var newUrl = url;
  6309. var firstIndexOfSlash = newUrl.indexOf('/');
  6310. var lastIndexOfSlash = newUrl.lastIndexOf('/');
  6311. if (firstIndexOfSlash !== -1 || lastIndexOfSlash !== -1) {
  6312. newUrl =
  6313. newUrl.substr(0, firstIndexOfSlash + 1) +
  6314. '...' +
  6315. newUrl.substr(lastIndexOfSlash, newUrl.length);
  6316. }
  6317. return newUrl;
  6318. };
  6319. return ShortURLHelper;
  6320. }());
  6321. var StripURLHelper = /** @class */ (function () {
  6322. function StripURLHelper() {
  6323. }
  6324. StripURLHelper.prototype.helperFunc = function (context, prefix, url, options) {
  6325. return prefix + url.split("/").pop();
  6326. };
  6327. return StripURLHelper;
  6328. }());
  6329. var IfEqualStringHelper = /** @class */ (function () {
  6330. function IfEqualStringHelper() {
  6331. }
  6332. IfEqualStringHelper.prototype.helperFunc = function (context, a, b, options) {
  6333. if (a == b) {
  6334. return options.fn(context);
  6335. }
  6336. return options.inverse(context);
  6337. };
  6338. return IfEqualStringHelper;
  6339. }());
  6340. var Handlebars$2 = require('handlebars');
  6341. var HtmlEngineHelpers = /** @class */ (function () {
  6342. function HtmlEngineHelpers() {
  6343. }
  6344. HtmlEngineHelpers.prototype.registerHelpers = function (bars) {
  6345. this.registerHelper(bars, 'compare', new CompareHelper());
  6346. this.registerHelper(bars, 'or', new OrHelper());
  6347. this.registerHelper(bars, 'functionSignature', new FunctionSignatureHelper());
  6348. this.registerHelper(bars, 'isNotToggle', new IsNotToggleHelper());
  6349. this.registerHelper(bars, 'isInitialTab', new IsInitialTabHelper());
  6350. this.registerHelper(bars, 'isTabEnabled', new IsTabEnabledHelper());
  6351. this.registerHelper(bars, 'ifString', new IfStringHelper());
  6352. this.registerHelper(bars, 'ifEqualString', new IfEqualStringHelper());
  6353. this.registerHelper(bars, 'orLength', new OrLengthHelper());
  6354. this.registerHelper(bars, 'filterAngular2Modules', new FilterAngular2ModulesHelper());
  6355. this.registerHelper(bars, 'debug', new DebugHelper());
  6356. this.registerHelper(bars, 'breaklines', new BreakLinesHelper(bars));
  6357. this.registerHelper(bars, 'clean-paragraph', new CleanParagraphHelper());
  6358. this.registerHelper(bars, 'escapeSimpleQuote', new EscapeSimpleQuoteHelper());
  6359. this.registerHelper(bars, 'breakComma', new BreakCommaHelper(bars));
  6360. this.registerHelper(bars, 'modifKind', new ModifKindHelper());
  6361. this.registerHelper(bars, 'modifIcon', new ModifIconHelper());
  6362. this.registerHelper(bars, 'relativeURL', new RelativeURLHelper());
  6363. this.registerHelper(bars, 'jsdoc-returns-comment', new JsdocReturnsCommentHelper());
  6364. this.registerHelper(bars, 'jsdoc-code-example', new JsdocCodeExampleHelper());
  6365. this.registerHelper(bars, 'jsdoc-example', new JsdocExampleHelper());
  6366. this.registerHelper(bars, 'jsdoc-params', new JsdocParamsHelper());
  6367. this.registerHelper(bars, 'jsdoc-params-valid', new JsdocParamsValidHelper());
  6368. this.registerHelper(bars, 'jsdoc-default', new JsdocDefaultHelper());
  6369. this.registerHelper(bars, 'linkType', new LinkTypeHelper());
  6370. this.registerHelper(bars, 'indexableSignature', new IndexableSignatureHelper());
  6371. this.registerHelper(bars, 'object', new ObjectHelper());
  6372. this.registerHelper(bars, 'objectLength', new ObjectLengthHelper());
  6373. this.registerHelper(bars, 'parseDescription', new ParseDescriptionHelper());
  6374. this.registerHelper(bars, 'one-parameter-has', new OneParameterHasHelper());
  6375. this.registerHelper(bars, 'element-alone', new ElementAloneHelper());
  6376. this.registerHelper(bars, 'hasOwn', new HasOwnHelper());
  6377. this.registerHelper(bars, 'short-url', new ShortURLHelper());
  6378. this.registerHelper(bars, 'strip-url', new StripURLHelper());
  6379. this.registerHelper(bars, 't', new I18nHelper());
  6380. this.registerHelper(bars, 'capitalize', new CapitalizeHelper());
  6381. this.registerHelper(bars, 'parse-property', new ParsePropertyHelper());
  6382. };
  6383. HtmlEngineHelpers.prototype.registerHelper = function (bars, key, helper) {
  6384. Handlebars$2.registerHelper(key, function () {
  6385. // tslint:disable-next-line:no-invalid-this
  6386. return helper.helperFunc.apply(helper, __spreadArray([this], __read(___namespace.slice(arguments)), false));
  6387. });
  6388. };
  6389. return HtmlEngineHelpers;
  6390. }());
  6391. var Handlebars$1 = require('handlebars');
  6392. var HtmlEngine = /** @class */ (function () {
  6393. function HtmlEngine() {
  6394. this.cache = {};
  6395. var helper = new HtmlEngineHelpers();
  6396. helper.registerHelpers(Handlebars$1);
  6397. }
  6398. HtmlEngine.getInstance = function () {
  6399. if (!HtmlEngine.instance) {
  6400. HtmlEngine.instance = new HtmlEngine();
  6401. }
  6402. return HtmlEngine.instance;
  6403. };
  6404. HtmlEngine.prototype.init = function (templatePath) {
  6405. var _this = this;
  6406. var partials = [
  6407. 'overview',
  6408. 'markdown',
  6409. 'modules',
  6410. 'module',
  6411. 'component',
  6412. 'controller',
  6413. 'entity',
  6414. 'component-detail',
  6415. 'directive',
  6416. 'injectable',
  6417. 'interceptor',
  6418. 'guard',
  6419. 'pipe',
  6420. 'class',
  6421. 'interface',
  6422. 'routes',
  6423. 'index',
  6424. 'index-misc',
  6425. 'search-results',
  6426. 'search-input',
  6427. 'link-type',
  6428. 'block-method',
  6429. 'block-host-listener',
  6430. 'block-enum',
  6431. 'block-property',
  6432. 'block-index',
  6433. 'block-constructor',
  6434. 'block-typealias',
  6435. 'block-accessors',
  6436. 'block-input',
  6437. 'block-output',
  6438. 'coverage-report',
  6439. 'unit-test-report',
  6440. 'miscellaneous-functions',
  6441. 'miscellaneous-variables',
  6442. 'miscellaneous-typealiases',
  6443. 'miscellaneous-enumerations',
  6444. 'additional-page',
  6445. 'package-dependencies',
  6446. 'package-properties'
  6447. ];
  6448. if (templatePath) {
  6449. if (FileEngine$1.existsSync(path__namespace.resolve(process.cwd() + path__namespace.sep + templatePath)) ===
  6450. false) {
  6451. logger.warn('Template path specificed but does not exist...using default templates');
  6452. }
  6453. }
  6454. return Promise.all(partials.map(function (partial) {
  6455. var partialPath = _this.determineTemplatePath(templatePath, 'partials/' + partial + '.hbs');
  6456. return FileEngine$1.get(partialPath).then(function (data) {
  6457. return Handlebars$1.registerPartial(partial, data);
  6458. });
  6459. }))
  6460. .then(function () {
  6461. var pagePath = _this.determineTemplatePath(templatePath, 'page.hbs');
  6462. return FileEngine$1.get(pagePath).then(function (data) {
  6463. _this.cache.page = data;
  6464. _this.compiledPage = Handlebars$1.compile(_this.cache.page, {
  6465. preventIndent: true,
  6466. strict: true
  6467. });
  6468. });
  6469. })
  6470. .then(function () {
  6471. var menuPath = _this.determineTemplatePath(templatePath, 'partials/menu.hbs');
  6472. return FileEngine$1.get(menuPath).then(function (menuTemplate) {
  6473. _this.precompiledMenu = Handlebars$1.compile(menuTemplate, {
  6474. preventIndent: true,
  6475. strict: true
  6476. });
  6477. });
  6478. });
  6479. };
  6480. HtmlEngine.prototype.renderMenu = function (templatePath, data) {
  6481. var menuPath = this.determineTemplatePath(templatePath, 'partials/menu.hbs');
  6482. return FileEngine$1.get(menuPath).then(function (menuTemplate) {
  6483. data.menu = 'normal';
  6484. return Handlebars$1.compile(menuTemplate, {
  6485. preventIndent: true,
  6486. strict: true
  6487. })(__assign({}, data));
  6488. });
  6489. };
  6490. HtmlEngine.prototype.render = function (mainData, page) {
  6491. var o = mainData;
  6492. Object.assign(o, page);
  6493. // let mem = process.memoryUsage();
  6494. // console.log(`heapTotal: ${mem.heapTotal} | heapUsed: ${mem.heapUsed}`);
  6495. return this.compiledPage({
  6496. data: o
  6497. });
  6498. };
  6499. HtmlEngine.prototype.determineTemplatePath = function (templatePath, filePath) {
  6500. var outPath = path__namespace.resolve(__dirname + '/../src/templates/' + filePath);
  6501. if (templatePath) {
  6502. var testPath = path__namespace.resolve(process.cwd() + path__namespace.sep + templatePath + path__namespace.sep + filePath);
  6503. outPath = FileEngine$1.existsSync(testPath) ? testPath : outPath;
  6504. }
  6505. return outPath;
  6506. };
  6507. HtmlEngine.prototype.generateCoverageBadge = function (outputFolder, label, coverageData) {
  6508. return FileEngine$1.get(path__namespace.resolve(__dirname + '/../src/templates/partials/coverage-badge.hbs')).then(function (data) {
  6509. var template = Handlebars$1.compile(data);
  6510. coverageData.label = label;
  6511. var result = template({
  6512. data: coverageData
  6513. });
  6514. var testOutputDir = outputFolder.match(process.cwd());
  6515. if (testOutputDir && testOutputDir.length > 0) {
  6516. outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
  6517. }
  6518. return FileEngine$1.write(outputFolder + path__namespace.sep + '/images/coverage-badge-' + label + '.svg', result).catch(function (err) {
  6519. logger.error('Error during coverage badge ' + label + ' file generation ', err);
  6520. return Promise.reject(err);
  6521. });
  6522. }, function (err) { return Promise.reject('Error during coverage badge generation'); });
  6523. };
  6524. return HtmlEngine;
  6525. }());
  6526. var HtmlEngine$1 = HtmlEngine.getInstance();
  6527. var decache = require('decache');
  6528. var MarkdownEngine = /** @class */ (function () {
  6529. function MarkdownEngine() {
  6530. var _this = this;
  6531. /**
  6532. * List of markdown files without .md extension
  6533. */
  6534. this.markdownFiles = ['README', 'CHANGELOG', 'LICENSE', 'CONTRIBUTING', 'TODO'];
  6535. decache('marked');
  6536. this.markedInstance = markedAcl;
  6537. var renderer = new this.markedInstance.Renderer();
  6538. renderer.code = function (code, language) {
  6539. var highlighted = code;
  6540. if (!language) {
  6541. language = 'none';
  6542. }
  6543. highlighted = _this.escape(code);
  6544. return "<b>".concat(I18nEngine$1.translate('example'), " :</b><div><pre class=\"line-numbers\"><code class=\"language-").concat(language, "\">").concat(highlighted, "</code></pre></div>");
  6545. };
  6546. renderer.table = function (header, body) {
  6547. return ('<table class="table table-bordered compodoc-table">\n' +
  6548. '<thead>\n' +
  6549. header +
  6550. '</thead>\n' +
  6551. '<tbody>\n' +
  6552. body +
  6553. '</tbody>\n' +
  6554. '</table>\n');
  6555. };
  6556. renderer.image = function (href, title, text) {
  6557. var out = '<img src="' + href + '" alt="' + text + '" class="img-responsive"';
  6558. if (title) {
  6559. out += ' title="' + title + '"';
  6560. }
  6561. out += '>';
  6562. return out;
  6563. };
  6564. this.markedInstance.setOptions({
  6565. renderer: renderer,
  6566. gfm: true,
  6567. breaks: false
  6568. });
  6569. }
  6570. MarkdownEngine.getInstance = function () {
  6571. if (!MarkdownEngine.instance) {
  6572. MarkdownEngine.instance = new MarkdownEngine();
  6573. }
  6574. return MarkdownEngine.instance;
  6575. };
  6576. MarkdownEngine.prototype.getTraditionalMarkdown = function (filepath) {
  6577. var _this = this;
  6578. return FileEngine$1.get(process.cwd() + path__namespace.sep + filepath + '.md')
  6579. .catch(function (err) { return FileEngine$1.get(process.cwd() + path__namespace.sep + filepath).then(); })
  6580. .then(function (data) {
  6581. var returnedData = {
  6582. markdown: _this.markedInstance(data),
  6583. rawData: data
  6584. };
  6585. return returnedData;
  6586. });
  6587. };
  6588. MarkdownEngine.prototype.getTraditionalMarkdownSync = function (filepath) {
  6589. return this.markedInstance(FileEngine$1.getSync(process.cwd() + path__namespace.sep + filepath));
  6590. };
  6591. MarkdownEngine.prototype.getReadmeFile = function () {
  6592. var _this = this;
  6593. return FileEngine$1.get(process.cwd() + path__namespace.sep + 'README.md').then(function (data) {
  6594. return _this.markedInstance(data);
  6595. });
  6596. };
  6597. MarkdownEngine.prototype.readNeighbourReadmeFile = function (file) {
  6598. var dirname = path__namespace.dirname(file);
  6599. var readmeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
  6600. return fs__namespace.readFileSync(readmeFile, 'utf8');
  6601. };
  6602. MarkdownEngine.prototype.hasNeighbourReadmeFile = function (file) {
  6603. var dirname = path__namespace.dirname(file);
  6604. var readmeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
  6605. return FileEngine$1.existsSync(readmeFile);
  6606. };
  6607. MarkdownEngine.prototype.componentReadmeFile = function (file) {
  6608. var dirname = path__namespace.dirname(file);
  6609. var readmeFile = dirname + path__namespace.sep + 'README.md';
  6610. var readmeAlternativeFile = dirname + path__namespace.sep + path__namespace.basename(file, '.ts') + '.md';
  6611. var finalPath = '';
  6612. if (FileEngine$1.existsSync(readmeFile)) {
  6613. finalPath = readmeFile;
  6614. }
  6615. else {
  6616. finalPath = readmeAlternativeFile;
  6617. }
  6618. return finalPath;
  6619. };
  6620. /**
  6621. * Checks if any of the markdown files is exists with or without endings
  6622. */
  6623. MarkdownEngine.prototype.hasRootMarkdowns = function () {
  6624. return this.addEndings(this.markdownFiles).some(function (x) {
  6625. return FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x);
  6626. });
  6627. };
  6628. MarkdownEngine.prototype.listRootMarkdowns = function () {
  6629. var foundFiles = this.markdownFiles.filter(function (x) {
  6630. return FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x + '.md') ||
  6631. FileEngine$1.existsSync(process.cwd() + path__namespace.sep + x);
  6632. });
  6633. return this.addEndings(foundFiles);
  6634. };
  6635. MarkdownEngine.prototype.escape = function (html) {
  6636. return html
  6637. .replace(/&/g, '&amp;')
  6638. .replace(/</g, '&lt;')
  6639. .replace(/>/g, '&gt;')
  6640. .replace(/"/g, '&quot;')
  6641. .replace(/'/g, '&#39;')
  6642. .replace(/@/g, '&#64;');
  6643. };
  6644. /**
  6645. * ['README'] => ['README', 'README.md']
  6646. */
  6647. MarkdownEngine.prototype.addEndings = function (files) {
  6648. return ___namespace.flatMap(files, function (x) { return [x, x + '.md']; });
  6649. };
  6650. return MarkdownEngine;
  6651. }());
  6652. var MarkdownEngine$1 = MarkdownEngine.getInstance();
  6653. var ngdT = require('@compodoc/ngd-transformer');
  6654. var NgdEngine = /** @class */ (function () {
  6655. function NgdEngine() {
  6656. }
  6657. NgdEngine.getInstance = function () {
  6658. if (!NgdEngine.instance) {
  6659. NgdEngine.instance = new NgdEngine();
  6660. }
  6661. return NgdEngine.instance;
  6662. };
  6663. NgdEngine.prototype.init = function (outputpath) {
  6664. this.engine = new ngdT.DotEngine({
  6665. output: outputpath,
  6666. displayLegend: true,
  6667. outputFormats: 'svg',
  6668. silent: true
  6669. });
  6670. };
  6671. NgdEngine.prototype.renderGraph = function (filepath, outputpath, type, name) {
  6672. this.engine.updateOutput(outputpath);
  6673. if (type === 'f') {
  6674. return this.engine.generateGraph([DependenciesEngine$1.getRawModule(name)]);
  6675. }
  6676. else {
  6677. return this.engine.generateGraph(DependenciesEngine$1.rawModulesForOverview);
  6678. }
  6679. };
  6680. NgdEngine.prototype.readGraph = function (filepath, name) {
  6681. return FileEngine$1.get(filepath).catch(function (err) {
  6682. return Promise.reject('Error during graph read ' + name);
  6683. });
  6684. };
  6685. return NgdEngine;
  6686. }());
  6687. var NgdEngine$1 = NgdEngine.getInstance();
  6688. var COMPODOC_CONSTANTS = {
  6689. navTabDefinitions: [
  6690. {
  6691. id: 'info',
  6692. href: '#info',
  6693. 'data-link': 'info',
  6694. label: 'Info',
  6695. depTypes: ['all']
  6696. },
  6697. {
  6698. id: 'readme',
  6699. href: '#readme',
  6700. 'data-link': 'readme',
  6701. label: 'README',
  6702. depTypes: ['all']
  6703. },
  6704. {
  6705. id: 'source',
  6706. href: '#source',
  6707. 'data-link': 'source',
  6708. label: 'Source',
  6709. depTypes: ['all']
  6710. },
  6711. {
  6712. id: 'templateData',
  6713. href: '#templateData',
  6714. 'data-link': 'template',
  6715. label: 'Template',
  6716. depTypes: ['component']
  6717. },
  6718. {
  6719. id: 'styleData',
  6720. href: '#styleData',
  6721. 'data-link': 'style',
  6722. label: 'Styles',
  6723. depTypes: ['component']
  6724. },
  6725. {
  6726. id: 'tree',
  6727. href: '#tree',
  6728. 'data-link': 'dom-tree',
  6729. label: 'DOM Tree',
  6730. depTypes: ['component']
  6731. },
  6732. {
  6733. id: 'example',
  6734. href: '#example',
  6735. 'data-link': 'example',
  6736. label: 'Examples',
  6737. depTypes: ['component', 'directive', 'injectable', 'pipe']
  6738. }
  6739. ]
  6740. };
  6741. /**
  6742. * Max length for the string of a file during Lunr search engine indexing.
  6743. * Prevent stack size exceeded
  6744. */
  6745. var MAX_SIZE_FILE_SEARCH_INDEX = 50000;
  6746. /**
  6747. * Max length for the string of a file during cheerio parsing.
  6748. * Prevent stack size exceeded
  6749. */
  6750. var MAX_SIZE_FILE_CHEERIO_PARSING = 400000000;
  6751. var Handlebars = require('handlebars');
  6752. var lunr = require('lunr');
  6753. var SearchEngine = /** @class */ (function () {
  6754. function SearchEngine() {
  6755. this.searchDocuments = [];
  6756. this.documentsStore = {};
  6757. this.amountOfMemory = 0;
  6758. }
  6759. SearchEngine.getInstance = function () {
  6760. if (!SearchEngine.instance) {
  6761. SearchEngine.instance = new SearchEngine();
  6762. }
  6763. return SearchEngine.instance;
  6764. };
  6765. SearchEngine.prototype.indexPage = function (page) {
  6766. var text;
  6767. this.amountOfMemory += page.rawData.length;
  6768. if (this.amountOfMemory < MAX_SIZE_FILE_CHEERIO_PARSING) {
  6769. var indexStartContent = page.rawData.indexOf('<!-- START CONTENT -->');
  6770. var indexEndContent = page.rawData.indexOf('<!-- END CONTENT -->');
  6771. var $ = cheerio__namespace.load(page.rawData.substring(indexStartContent + 1, indexEndContent));
  6772. text = $('.content').html();
  6773. text = htmlEntities.decode(text);
  6774. text = text.replace(/(<([^>]+)>)/gi, '');
  6775. page.url = page.url.replace(Configuration$1.mainData.output, '');
  6776. var doc = {
  6777. url: page.url,
  6778. title: page.infos.context + ' - ' + page.infos.name,
  6779. body: text
  6780. };
  6781. if (!this.documentsStore.hasOwnProperty(doc.url) &&
  6782. doc.body.length < MAX_SIZE_FILE_SEARCH_INDEX) {
  6783. this.documentsStore[doc.url] = doc;
  6784. this.searchDocuments.push(doc);
  6785. }
  6786. }
  6787. };
  6788. SearchEngine.prototype.generateSearchIndexJson = function (outputFolder) {
  6789. var _this = this;
  6790. var that = this;
  6791. var searchIndex = lunr(function () {
  6792. /* tslint:disable:no-invalid-this */
  6793. this.ref('url');
  6794. this.field('title');
  6795. this.field('body');
  6796. this.pipeline.remove(lunr.stemmer);
  6797. var i = 0;
  6798. var len = that.searchDocuments.length;
  6799. for (i; i < len; i++) {
  6800. this.add(that.searchDocuments[i]);
  6801. }
  6802. });
  6803. return FileEngine$1.get(__dirname + '/../src/templates/partials/search-index.hbs').then(function (data) {
  6804. var template = Handlebars.compile(data);
  6805. var result = template({
  6806. index: JSON.stringify(searchIndex),
  6807. store: JSON.stringify(_this.documentsStore)
  6808. });
  6809. var testOutputDir = outputFolder.match(process.cwd());
  6810. if (testOutputDir && testOutputDir.length > 0) {
  6811. outputFolder = outputFolder.replace(process.cwd() + path__namespace.sep, '');
  6812. }
  6813. return FileEngine$1.write(outputFolder + path__namespace.sep + '/js/search/search_index.js', result).catch(function (err) {
  6814. logger.error('Error during search index file generation ', err);
  6815. return Promise.reject(err);
  6816. });
  6817. }, function (err) { return Promise.reject('Error during search index generation'); });
  6818. };
  6819. return SearchEngine;
  6820. }());
  6821. var SearchEngine$1 = SearchEngine.getInstance();
  6822. var ComponentsTreeEngine = /** @class */ (function () {
  6823. function ComponentsTreeEngine() {
  6824. this.components = [];
  6825. this.componentsForTree = [];
  6826. }
  6827. ComponentsTreeEngine.getInstance = function () {
  6828. if (!ComponentsTreeEngine.instance) {
  6829. ComponentsTreeEngine.instance = new ComponentsTreeEngine();
  6830. }
  6831. return ComponentsTreeEngine.instance;
  6832. };
  6833. ComponentsTreeEngine.prototype.addComponent = function (component) {
  6834. this.components.push(component);
  6835. };
  6836. ComponentsTreeEngine.prototype.readTemplates = function () {
  6837. var _this = this;
  6838. return new Promise(function (resolve, reject) {
  6839. var i = 0;
  6840. var len = _this.componentsForTree.length;
  6841. var loop = function () {
  6842. if (i <= len - 1) {
  6843. if (_this.componentsForTree[i].templateUrl) {
  6844. var filePath = process.cwd() +
  6845. path__namespace.sep +
  6846. path__namespace.dirname(_this.componentsForTree[i].file) +
  6847. path__namespace.sep +
  6848. _this.componentsForTree[i].templateUrl;
  6849. FileEngine$1.get(filePath).then(function (templateData) {
  6850. _this.componentsForTree[i].templateData = templateData;
  6851. i++;
  6852. loop();
  6853. }, function (e) {
  6854. logger.error(e);
  6855. reject();
  6856. });
  6857. }
  6858. else {
  6859. _this.componentsForTree[i].templateData = _this.componentsForTree[i].template;
  6860. i++;
  6861. loop();
  6862. }
  6863. }
  6864. else {
  6865. resolve();
  6866. }
  6867. };
  6868. loop();
  6869. });
  6870. };
  6871. ComponentsTreeEngine.prototype.findChildrenAndParents = function () {
  6872. var _this = this;
  6873. return new Promise(function (resolve, reject) {
  6874. ___namespace.forEach(_this.componentsForTree, function (component) {
  6875. var $component = cheerio__namespace(component.templateData);
  6876. ___namespace.forEach(_this.componentsForTree, function (componentToFind) {
  6877. if ($component.find(componentToFind.selector).length > 0) {
  6878. console.log(componentToFind.name + ' found in ' + component.name);
  6879. component.children.push(componentToFind.name);
  6880. }
  6881. });
  6882. });
  6883. resolve();
  6884. });
  6885. };
  6886. ComponentsTreeEngine.prototype.createTreesForComponents = function () {
  6887. var _this = this;
  6888. return new Promise(function (resolve, reject) {
  6889. ___namespace.forEach(_this.components, function (component) {
  6890. var _component = {
  6891. name: component.name,
  6892. file: component.file,
  6893. selector: component.selector,
  6894. children: [],
  6895. template: '',
  6896. templateUrl: ''
  6897. };
  6898. if (typeof component.template !== 'undefined') {
  6899. _component.template = component.template;
  6900. }
  6901. if (component.templateUrl.length > 0) {
  6902. _component.templateUrl = component.templateUrl[0];
  6903. }
  6904. _this.componentsForTree.push(_component);
  6905. });
  6906. _this.readTemplates().then(function () {
  6907. _this.findChildrenAndParents().then(function () {
  6908. // console.log('this.componentsForTree: ', this.componentsForTree);
  6909. resolve();
  6910. }, function (e) {
  6911. logger.error(e);
  6912. reject();
  6913. });
  6914. }, function (e) {
  6915. logger.error(e);
  6916. });
  6917. });
  6918. };
  6919. return ComponentsTreeEngine;
  6920. }());
  6921. var ComponentsTreeEngine$1 = ComponentsTreeEngine.getInstance();
  6922. function StringifyArrowFunction(af) {
  6923. var i = 0, result = '(';
  6924. var len = af.parameters.length;
  6925. if (len === 1) {
  6926. result = '';
  6927. }
  6928. for (i; i < len; i++) {
  6929. if (af.parameters[i].name && af.parameters[i].name.escapedText) {
  6930. result += af.parameters[i].name.escapedText;
  6931. }
  6932. if (i < len - 1) {
  6933. result += ', ';
  6934. }
  6935. }
  6936. if (len > 1 || len === 0) {
  6937. result += ')';
  6938. }
  6939. // body
  6940. result += ' => ';
  6941. if (af.body) {
  6942. if (af.body.kind === tsMorph.SyntaxKind.Identifier && af.body.escapedText) {
  6943. result += af.body.escapedText;
  6944. }
  6945. else if (af.body.kind === tsMorph.SyntaxKind.PropertyAccessExpression &&
  6946. af.body.expression &&
  6947. af.body.name) {
  6948. result += af.body.expression.escapedText;
  6949. result += '.' + af.body.name.escapedText;
  6950. }
  6951. else if (af.body.kind === tsMorph.SyntaxKind.StringLiteral && af.body.text) {
  6952. result += af.body.text;
  6953. }
  6954. }
  6955. return result;
  6956. }
  6957. function StringifyObjectLiteralExpression(ole) {
  6958. var returnedString = '{';
  6959. if (ole.properties && ole.properties.length > 0) {
  6960. ole.properties.forEach(function (property, index) {
  6961. if (property.name) {
  6962. returnedString += property.name.text + ': ';
  6963. }
  6964. if (property.initializer) {
  6965. if (property.initializer.kind === tsMorph.SyntaxKind.StringLiteral) {
  6966. returnedString += "'" + property.initializer.text + "'";
  6967. }
  6968. else if (property.initializer.kind === tsMorph.SyntaxKind.TrueKeyword) {
  6969. returnedString += "true";
  6970. }
  6971. else if (property.initializer.kind === tsMorph.SyntaxKind.FalseKeyword) {
  6972. returnedString += "false";
  6973. }
  6974. else if (property.initializer.kind === tsMorph.SyntaxKind.ArrowFunction) {
  6975. returnedString += StringifyArrowFunction(property.initializer);
  6976. }
  6977. else {
  6978. returnedString += property.initializer.text;
  6979. }
  6980. }
  6981. if (index < ole.properties.length - 1) {
  6982. returnedString += ', ';
  6983. }
  6984. });
  6985. }
  6986. returnedString += '}';
  6987. return returnedString;
  6988. }
  6989. function nodeHasDecorator(node) {
  6990. var result = false;
  6991. var nodeModifiers = node.modifiers; // ts.getModifiers(node);
  6992. if (nodeModifiers && nodeModifiers.length > 0) {
  6993. nodeModifiers.forEach(function (nodeModifier) {
  6994. if (nodeModifier.kind === tsMorph.ts.SyntaxKind.Decorator) {
  6995. result = true;
  6996. }
  6997. });
  6998. }
  6999. return result;
  7000. }
  7001. function getNodeDecorators(node) {
  7002. var result = [];
  7003. var nodeModifiers = node.modifiers; // ts.getModifiers(node);
  7004. if (nodeModifiers && nodeModifiers.length > 0) {
  7005. nodeModifiers.forEach(function (nodeModifier) {
  7006. if (nodeModifier.kind === tsMorph.ts.SyntaxKind.Decorator) {
  7007. result.push(nodeModifier);
  7008. }
  7009. });
  7010. }
  7011. return result;
  7012. }
  7013. var crypto$7 = require('crypto');
  7014. var ClassHelper = /** @class */ (function () {
  7015. function ClassHelper(typeChecker) {
  7016. this.typeChecker = typeChecker;
  7017. this.jsdocParserUtil = new JsdocParserUtil();
  7018. }
  7019. /**
  7020. * HELPERS
  7021. */
  7022. ClassHelper.prototype.stringifyDefaultValue = function (node) {
  7023. /**
  7024. * Copyright https://github.com/ng-bootstrap/ng-bootstrap
  7025. */
  7026. if (node.getText()) {
  7027. return node.getText();
  7028. }
  7029. else if (node.kind === tsMorph.SyntaxKind.FalseKeyword) {
  7030. return 'false';
  7031. }
  7032. else if (node.kind === tsMorph.SyntaxKind.TrueKeyword) {
  7033. return 'true';
  7034. }
  7035. };
  7036. ClassHelper.prototype.checkForDeprecation = function (tags, result) {
  7037. ___namespace.forEach(tags, function (tag) {
  7038. if (tag.tagName && tag.tagName.text && tag.tagName.text.indexOf('deprecated') > -1) {
  7039. result.deprecated = true;
  7040. result.deprecationMessage = tag.comment || '';
  7041. }
  7042. });
  7043. };
  7044. ClassHelper.prototype.getDecoratorOfType = function (node, decoratorType) {
  7045. var decorators = getNodeDecorators(node) || [];
  7046. var result = [];
  7047. var len = decorators.length;
  7048. if (len > 1) {
  7049. for (var i = 0; i < decorators.length; i++) {
  7050. if (decorators[i].expression.expression) {
  7051. if (decorators[i].expression.expression.text === decoratorType) {
  7052. result.push(decorators[i]);
  7053. }
  7054. }
  7055. }
  7056. if (result.length > 0) {
  7057. return result;
  7058. }
  7059. }
  7060. else {
  7061. if (len === 1 && decorators[0].expression && decorators[0].expression.expression) {
  7062. if (decorators[0].expression.expression.text === decoratorType) {
  7063. result.push(decorators[0]);
  7064. return result;
  7065. }
  7066. }
  7067. }
  7068. return undefined;
  7069. };
  7070. ClassHelper.prototype.formatDecorators = function (decorators) {
  7071. var _this = this;
  7072. var _decorators = [];
  7073. ___namespace.forEach(decorators, function (decorator) {
  7074. if (decorator.expression) {
  7075. if (decorator.expression.text) {
  7076. _decorators.push({ name: decorator.expression.text });
  7077. }
  7078. if (decorator.expression.expression) {
  7079. var info = { name: decorator.expression.expression.text };
  7080. if (decorator.expression.arguments) {
  7081. info.stringifiedArguments = _this.stringifyArguments(decorator.expression.arguments);
  7082. }
  7083. _decorators.push(info);
  7084. }
  7085. }
  7086. });
  7087. return _decorators;
  7088. };
  7089. ClassHelper.prototype.handleFunction = function (arg) {
  7090. var _this = this;
  7091. if (arg.function.length === 0) {
  7092. return "".concat(arg.name).concat(this.getOptionalString(arg), ": () => void");
  7093. }
  7094. var argums = arg.function.map(function (argu) {
  7095. var _result = DependenciesEngine$1.find(argu.type);
  7096. if (_result) {
  7097. if (_result.source === 'internal') {
  7098. var path = _result.data.type;
  7099. if (_result.data.type === 'class') {
  7100. path = 'classe';
  7101. }
  7102. return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"../").concat(path, "s/").concat(_result.data.name, ".html\">").concat(argu.type, "</a>");
  7103. }
  7104. else {
  7105. var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
  7106. return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
  7107. }
  7108. }
  7109. else if (BasicTypeUtil$1.isKnownType(argu.type)) {
  7110. var path = BasicTypeUtil$1.getTypeUrl(argu.type);
  7111. return "".concat(argu.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(argu.type, "</a>");
  7112. }
  7113. else {
  7114. if (argu.name && argu.type) {
  7115. return "".concat(argu.name).concat(_this.getOptionalString(arg), ": ").concat(argu.type);
  7116. }
  7117. else {
  7118. if (argu.name) {
  7119. return "".concat(argu.name.text);
  7120. }
  7121. else {
  7122. return '';
  7123. }
  7124. }
  7125. }
  7126. });
  7127. return "".concat(arg.name).concat(this.getOptionalString(arg), ": (").concat(argums, ") => void");
  7128. };
  7129. ClassHelper.prototype.getOptionalString = function (arg) {
  7130. return arg.optional ? '?' : '';
  7131. };
  7132. ClassHelper.prototype.stringifyArguments = function (args) {
  7133. var _this = this;
  7134. var stringifyArgs = [];
  7135. stringifyArgs = args
  7136. .map(function (arg) {
  7137. var _result = DependenciesEngine$1.find(arg.type);
  7138. if (_result) {
  7139. if (_result.source === 'internal') {
  7140. var path = _result.data.type;
  7141. if (_result.data.type === 'class') {
  7142. path = 'classe';
  7143. }
  7144. return "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"../").concat(path, "s/").concat(_result.data.name, ".html\">").concat(arg.type, "</a>");
  7145. }
  7146. else {
  7147. var path = AngularVersionUtil$1.getApiLink(_result.data, Configuration$1.mainData.angularVersion);
  7148. return "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(arg.type, "</a>");
  7149. }
  7150. }
  7151. else if (arg.dotDotDotToken) {
  7152. return "...".concat(arg.name, ": ").concat(arg.type);
  7153. }
  7154. else if (arg.function) {
  7155. return _this.handleFunction(arg);
  7156. }
  7157. else if (arg.expression && arg.name) {
  7158. return arg.expression.text + '.' + arg.name.text;
  7159. }
  7160. else if (arg.expression && arg.kind === tsMorph.SyntaxKind.NewExpression) {
  7161. return 'new ' + arg.expression.text + '()';
  7162. }
  7163. else if (arg.kind && arg.kind === tsMorph.SyntaxKind.StringLiteral) {
  7164. return "'" + arg.text + "'";
  7165. }
  7166. else if (arg.kind &&
  7167. arg.kind === tsMorph.SyntaxKind.ArrayLiteralExpression &&
  7168. arg.elements &&
  7169. arg.elements.length > 0) {
  7170. var i = 0, len = arg.elements.length, result = '[';
  7171. for (i; i < len; i++) {
  7172. result += "'" + arg.elements[i].text + "'";
  7173. if (i < len - 1) {
  7174. result += ', ';
  7175. }
  7176. }
  7177. result += ']';
  7178. return result;
  7179. }
  7180. else if (arg.kind &&
  7181. arg.kind === tsMorph.SyntaxKind.ArrowFunction &&
  7182. arg.parameters &&
  7183. arg.parameters.length > 0) {
  7184. return StringifyArrowFunction(arg);
  7185. }
  7186. else if (arg.kind && arg.kind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
  7187. return StringifyObjectLiteralExpression(arg);
  7188. }
  7189. else if (BasicTypeUtil$1.isKnownType(arg.type)) {
  7190. var path = BasicTypeUtil$1.getTypeUrl(arg.type);
  7191. return "".concat(arg.name).concat(_this.getOptionalString(arg), ": <a href=\"").concat(path, "\" target=\"_blank\">").concat(arg.type, "</a>");
  7192. }
  7193. else {
  7194. if (arg.type) {
  7195. var finalStringifiedArgument = '';
  7196. var separator = ':';
  7197. if (arg.name) {
  7198. finalStringifiedArgument += arg.name;
  7199. }
  7200. if (arg.kind === tsMorph.SyntaxKind.AsExpression &&
  7201. arg.expression &&
  7202. arg.expression.text) {
  7203. finalStringifiedArgument += arg.expression.text;
  7204. separator = ' as';
  7205. }
  7206. if (arg.optional) {
  7207. finalStringifiedArgument += _this.getOptionalString(arg);
  7208. }
  7209. if (arg.type) {
  7210. finalStringifiedArgument += separator + ' ' + _this.visitType(arg.type);
  7211. }
  7212. return finalStringifiedArgument;
  7213. }
  7214. else if (arg.text) {
  7215. return "".concat(arg.text);
  7216. }
  7217. else {
  7218. return "".concat(arg.name).concat(_this.getOptionalString(arg));
  7219. }
  7220. }
  7221. })
  7222. .join(', ');
  7223. return stringifyArgs;
  7224. };
  7225. ClassHelper.prototype.getPosition = function (node, sourceFile) {
  7226. var position;
  7227. if (node.name && node.name.end) {
  7228. position = tsMorph.ts.getLineAndCharacterOfPosition(sourceFile, node.name.end);
  7229. }
  7230. else {
  7231. position = tsMorph.ts.getLineAndCharacterOfPosition(sourceFile, node.pos);
  7232. }
  7233. return position;
  7234. };
  7235. ClassHelper.prototype.addAccessor = function (accessors, nodeAccessor, sourceFile) {
  7236. var _this = this;
  7237. var nodeName = '';
  7238. if (nodeAccessor.name) {
  7239. nodeName = nodeAccessor.name.text;
  7240. var jsdoctags = this.jsdocParserUtil.getJSDocs(nodeAccessor);
  7241. if (!accessors[nodeName]) {
  7242. accessors[nodeName] = {
  7243. name: nodeName,
  7244. setSignature: undefined,
  7245. getSignature: undefined
  7246. };
  7247. }
  7248. if (nodeAccessor.kind === tsMorph.SyntaxKind.SetAccessor) {
  7249. var setSignature = {
  7250. name: nodeName,
  7251. type: 'void',
  7252. deprecated: false,
  7253. deprecationMessage: '',
  7254. args: nodeAccessor.parameters.map(function (param) { return _this.visitArgument(param); }),
  7255. returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : 'void',
  7256. line: this.getPosition(nodeAccessor, sourceFile).line + 1
  7257. };
  7258. if (nodeAccessor.jsDoc && nodeAccessor.jsDoc.length >= 1) {
  7259. var comment = this.jsdocParserUtil.getMainCommentOfNode(nodeAccessor, sourceFile);
  7260. if (typeof comment !== 'undefined') {
  7261. var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
  7262. setSignature.rawdescription = cleanedDescription;
  7263. setSignature.description = markedAcl(cleanedDescription);
  7264. }
  7265. }
  7266. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  7267. this.checkForDeprecation(jsdoctags[0].tags, setSignature);
  7268. setSignature.jsdoctags = markedtags(jsdoctags[0].tags);
  7269. }
  7270. if (setSignature.jsdoctags && setSignature.jsdoctags.length > 0) {
  7271. setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args, setSignature.jsdoctags);
  7272. }
  7273. else if (setSignature.args && setSignature.args.length > 0) {
  7274. setSignature.jsdoctags = mergeTagsAndArgs(setSignature.args);
  7275. }
  7276. accessors[nodeName].setSignature = setSignature;
  7277. }
  7278. if (nodeAccessor.kind === tsMorph.SyntaxKind.GetAccessor) {
  7279. var getSignature = {
  7280. name: nodeName,
  7281. type: nodeAccessor.type ? kindToType(nodeAccessor.type.kind) : '',
  7282. returnType: nodeAccessor.type ? this.visitType(nodeAccessor.type) : '',
  7283. line: this.getPosition(nodeAccessor, sourceFile).line + 1
  7284. };
  7285. if (nodeAccessor.jsDoc && nodeAccessor.jsDoc.length >= 1) {
  7286. var comment = this.jsdocParserUtil.getMainCommentOfNode(nodeAccessor, sourceFile);
  7287. if (typeof comment !== 'undefined') {
  7288. var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
  7289. getSignature.rawdescription = cleanedDescription;
  7290. getSignature.description = markedAcl(cleanedDescription);
  7291. }
  7292. }
  7293. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  7294. this.checkForDeprecation(jsdoctags[0].tags, getSignature);
  7295. getSignature.jsdoctags = markedtags(jsdoctags[0].tags);
  7296. }
  7297. accessors[nodeName].getSignature = getSignature;
  7298. }
  7299. }
  7300. };
  7301. ClassHelper.prototype.isDirectiveDecorator = function (decorator) {
  7302. if (decorator.expression.expression) {
  7303. var decoratorIdentifierText = decorator.expression.expression.text;
  7304. return (decoratorIdentifierText === 'Directive' || decoratorIdentifierText === 'Component');
  7305. }
  7306. else {
  7307. return false;
  7308. }
  7309. };
  7310. ClassHelper.prototype.isServiceDecorator = function (decorator) {
  7311. return decorator.expression.expression
  7312. ? decorator.expression.expression.text === 'Injectable'
  7313. : false;
  7314. };
  7315. ClassHelper.prototype.isPrivate = function (member) {
  7316. /**
  7317. * Copyright https://github.com/ng-bootstrap/ng-bootstrap
  7318. */
  7319. if (member.modifiers) {
  7320. var isPrivate = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.PrivateKeyword; });
  7321. if (isPrivate) {
  7322. return true;
  7323. }
  7324. }
  7325. // Check for ECMAScript Private Fields
  7326. if (member.name && member.name.escapedText) {
  7327. var isPrivate = member.name.escapedText.indexOf('#') === 0;
  7328. if (isPrivate) {
  7329. return true;
  7330. }
  7331. }
  7332. return this.isHiddenMember(member);
  7333. };
  7334. ClassHelper.prototype.isProtected = function (member) {
  7335. if (member.modifiers) {
  7336. var isProtected = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.ProtectedKeyword; });
  7337. if (isProtected) {
  7338. return true;
  7339. }
  7340. }
  7341. return this.isHiddenMember(member);
  7342. };
  7343. ClassHelper.prototype.isInternal = function (member) {
  7344. var e_1, _a, e_2, _b;
  7345. /**
  7346. * Copyright https://github.com/ng-bootstrap/ng-bootstrap
  7347. */
  7348. var internalTags = ['internal'];
  7349. if (member.jsDoc) {
  7350. try {
  7351. for (var _c = __values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
  7352. var doc = _d.value;
  7353. if (doc.tags) {
  7354. try {
  7355. for (var _e = (e_2 = void 0, __values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
  7356. var tag = _f.value;
  7357. if (internalTags.indexOf(tag.tagName.text) > -1) {
  7358. return true;
  7359. }
  7360. }
  7361. }
  7362. catch (e_2_1) { e_2 = { error: e_2_1 }; }
  7363. finally {
  7364. try {
  7365. if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
  7366. }
  7367. finally { if (e_2) throw e_2.error; }
  7368. }
  7369. }
  7370. }
  7371. }
  7372. catch (e_1_1) { e_1 = { error: e_1_1 }; }
  7373. finally {
  7374. try {
  7375. if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
  7376. }
  7377. finally { if (e_1) throw e_1.error; }
  7378. }
  7379. }
  7380. return false;
  7381. };
  7382. ClassHelper.prototype.isPublic = function (member) {
  7383. if (member.modifiers) {
  7384. var isPublic = member.modifiers.some(function (modifier) { return modifier.kind === tsMorph.SyntaxKind.PublicKeyword; });
  7385. if (isPublic) {
  7386. return true;
  7387. }
  7388. }
  7389. return this.isHiddenMember(member);
  7390. };
  7391. ClassHelper.prototype.isHiddenMember = function (member) {
  7392. var e_3, _a, e_4, _b;
  7393. /**
  7394. * Copyright https://github.com/ng-bootstrap/ng-bootstrap
  7395. */
  7396. var internalTags = ['hidden'];
  7397. if (member.jsDoc) {
  7398. try {
  7399. for (var _c = __values(member.jsDoc), _d = _c.next(); !_d.done; _d = _c.next()) {
  7400. var doc = _d.value;
  7401. if (doc.tags) {
  7402. try {
  7403. for (var _e = (e_4 = void 0, __values(doc.tags)), _f = _e.next(); !_f.done; _f = _e.next()) {
  7404. var tag = _f.value;
  7405. if (internalTags.indexOf(tag.tagName.text) > -1) {
  7406. return true;
  7407. }
  7408. }
  7409. }
  7410. catch (e_4_1) { e_4 = { error: e_4_1 }; }
  7411. finally {
  7412. try {
  7413. if (_f && !_f.done && (_b = _e.return)) _b.call(_e);
  7414. }
  7415. finally { if (e_4) throw e_4.error; }
  7416. }
  7417. }
  7418. }
  7419. }
  7420. catch (e_3_1) { e_3 = { error: e_3_1 }; }
  7421. finally {
  7422. try {
  7423. if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
  7424. }
  7425. finally { if (e_3) throw e_3.error; }
  7426. }
  7427. }
  7428. return false;
  7429. };
  7430. ClassHelper.prototype.isPipeDecorator = function (decorator) {
  7431. return decorator.expression.expression
  7432. ? decorator.expression.expression.text === 'Pipe'
  7433. : false;
  7434. };
  7435. ClassHelper.prototype.isControllerDecorator = function (decorator) {
  7436. return decorator.expression.expression
  7437. ? decorator.expression.expression.text === 'Controller'
  7438. : false;
  7439. };
  7440. ClassHelper.prototype.isModuleDecorator = function (decorator) {
  7441. return decorator.expression.expression
  7442. ? decorator.expression.expression.text === 'NgModule' ||
  7443. decorator.expression.expression.text === 'Module'
  7444. : false;
  7445. };
  7446. /**
  7447. * VISITERS
  7448. */
  7449. ClassHelper.prototype.visitClassDeclaration = function (fileName, classDeclaration, sourceFile, astFile) {
  7450. var symbol = this.typeChecker.getSymbolAtLocation(classDeclaration.name);
  7451. var rawdescription = '';
  7452. var deprecated = false;
  7453. var deprecationMessage = '';
  7454. var description = '';
  7455. var jsdoctags = [];
  7456. if (symbol) {
  7457. var comment = this.jsdocParserUtil.getMainCommentOfNode(classDeclaration, sourceFile);
  7458. rawdescription = this.jsdocParserUtil.parseComment(comment);
  7459. description = markedAcl(rawdescription);
  7460. if (symbol.valueDeclaration && isIgnore(symbol.valueDeclaration)) {
  7461. return [{ ignore: true }];
  7462. }
  7463. if (symbol.declarations && symbol.declarations.length > 0) {
  7464. var declarationsjsdoctags = this.jsdocParserUtil.getJSDocs(symbol.declarations[0]);
  7465. if (declarationsjsdoctags &&
  7466. declarationsjsdoctags.length >= 1 &&
  7467. declarationsjsdoctags[0].tags) {
  7468. var deprecation = { deprecated: false, deprecationMessage: '' };
  7469. this.checkForDeprecation(declarationsjsdoctags[0].tags, deprecation);
  7470. deprecated = deprecation.deprecated;
  7471. deprecationMessage = deprecation.deprecationMessage;
  7472. }
  7473. if (isIgnore(symbol.declarations[0])) {
  7474. return [{ ignore: true }];
  7475. }
  7476. }
  7477. if (symbol.valueDeclaration) {
  7478. jsdoctags = this.jsdocParserUtil.getJSDocs(symbol.valueDeclaration);
  7479. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  7480. var deprecation = { deprecated: false, deprecationMessage: '' };
  7481. this.checkForDeprecation(jsdoctags[0].tags, deprecation);
  7482. deprecated = deprecation.deprecated;
  7483. deprecationMessage = deprecation.deprecationMessage;
  7484. jsdoctags = markedtags(jsdoctags[0].tags);
  7485. }
  7486. }
  7487. }
  7488. var className = classDeclaration.name.text;
  7489. var members;
  7490. var implementsElements = [];
  7491. var extendsElements = [];
  7492. if (typeof tsMorph.ts.getEffectiveImplementsTypeNodes !== 'undefined') {
  7493. var implementedTypes = tsMorph.ts.getEffectiveImplementsTypeNodes(classDeclaration);
  7494. if (implementedTypes) {
  7495. var i = 0;
  7496. var len = implementedTypes.length;
  7497. for (i; i < len; i++) {
  7498. if (implementedTypes[i].expression) {
  7499. implementsElements.push(implementedTypes[i].expression.text);
  7500. }
  7501. }
  7502. }
  7503. }
  7504. if (typeof tsMorph.ts.getClassExtendsHeritageElement !== 'undefined') {
  7505. if (astFile) {
  7506. var interfaceOrClassNode = astFile.getInterface(className);
  7507. if (!interfaceOrClassNode) {
  7508. interfaceOrClassNode = astFile.getClass(className);
  7509. }
  7510. if (interfaceOrClassNode) {
  7511. var extendsListRaw = interfaceOrClassNode.getExtends();
  7512. var extendsList_1 = [];
  7513. if (extendsListRaw) {
  7514. if (Array.isArray(extendsListRaw)) {
  7515. if (extendsListRaw.length > 0) {
  7516. extendsListRaw.forEach(function (extendElement) {
  7517. var extendElementExpression = extendElement.getExpression();
  7518. if (extendElementExpression) {
  7519. var text = extendElementExpression.getText();
  7520. if (text) {
  7521. extendsList_1.push(text);
  7522. }
  7523. }
  7524. });
  7525. }
  7526. }
  7527. else {
  7528. var extendElementExpression = extendsListRaw.getExpression();
  7529. if (extendElementExpression) {
  7530. var text = extendElementExpression.getText();
  7531. if (text) {
  7532. extendsList_1.push(text);
  7533. }
  7534. }
  7535. }
  7536. }
  7537. extendsElements = extendsList_1;
  7538. }
  7539. }
  7540. }
  7541. members = this.visitMembers(classDeclaration.members, sourceFile);
  7542. if (nodeHasDecorator(classDeclaration)) {
  7543. var classDecorators = getNodeDecorators(classDeclaration);
  7544. // Loop and search for official decorators at top-level :
  7545. // Angular : @NgModule, @Component, @Directive, @Injectable, @Pipe
  7546. // Nestjs : @Controller, @Module, @Injectable
  7547. // Stencil : @Component
  7548. var isDirective = false;
  7549. var isService = false;
  7550. var isPipe = false;
  7551. var isModule = false;
  7552. var isController = false;
  7553. for (var a = 0; a < classDecorators.length; a++) {
  7554. //console.log(classDeclaration.decorators[i].expression);
  7555. // RETURN TOO EARLY FOR MANY DECORATORS !!!!
  7556. // iterating through the decorators array we have to keep the flags `true` values from the previous loop iteration
  7557. isDirective = isDirective || this.isDirectiveDecorator(classDecorators[a]);
  7558. isService = isService || this.isServiceDecorator(classDecorators[a]);
  7559. isPipe = isPipe || this.isPipeDecorator(classDecorators[a]);
  7560. isModule = isModule || this.isModuleDecorator(classDecorators[a]);
  7561. isController = isController || this.isControllerDecorator(classDecorators[a]);
  7562. }
  7563. if (isDirective) {
  7564. return {
  7565. deprecated: deprecated,
  7566. deprecationMessage: deprecationMessage,
  7567. description: description,
  7568. rawdescription: rawdescription,
  7569. inputs: members.inputs,
  7570. outputs: members.outputs,
  7571. hostBindings: members.hostBindings,
  7572. hostListeners: members.hostListeners,
  7573. properties: members.properties,
  7574. methods: members.methods,
  7575. indexSignatures: members.indexSignatures,
  7576. kind: members.kind,
  7577. constructor: members.constructor,
  7578. jsdoctags: jsdoctags,
  7579. extends: extendsElements,
  7580. implements: implementsElements,
  7581. accessors: members.accessors
  7582. };
  7583. }
  7584. else if (isService) {
  7585. return [
  7586. {
  7587. fileName: fileName,
  7588. className: className,
  7589. deprecated: deprecated,
  7590. deprecationMessage: deprecationMessage,
  7591. description: description,
  7592. rawdescription: rawdescription,
  7593. methods: members.methods,
  7594. indexSignatures: members.indexSignatures,
  7595. properties: members.properties,
  7596. kind: members.kind,
  7597. constructor: members.constructor,
  7598. jsdoctags: jsdoctags,
  7599. extends: extendsElements,
  7600. implements: implementsElements,
  7601. accessors: members.accessors
  7602. }
  7603. ];
  7604. }
  7605. else if (isPipe) {
  7606. return [
  7607. {
  7608. fileName: fileName,
  7609. className: className,
  7610. deprecated: deprecated,
  7611. deprecationMessage: deprecationMessage,
  7612. description: description,
  7613. rawdescription: rawdescription,
  7614. jsdoctags: jsdoctags,
  7615. properties: members.properties,
  7616. methods: members.methods
  7617. }
  7618. ];
  7619. }
  7620. else if (isModule) {
  7621. return [
  7622. {
  7623. fileName: fileName,
  7624. className: className,
  7625. deprecated: deprecated,
  7626. deprecationMessage: deprecationMessage,
  7627. description: description,
  7628. rawdescription: rawdescription,
  7629. jsdoctags: jsdoctags,
  7630. methods: members.methods
  7631. }
  7632. ];
  7633. }
  7634. else {
  7635. return [
  7636. {
  7637. deprecated: deprecated,
  7638. deprecationMessage: deprecationMessage,
  7639. description: description,
  7640. rawdescription: rawdescription,
  7641. methods: members.methods,
  7642. indexSignatures: members.indexSignatures,
  7643. properties: members.properties,
  7644. kind: members.kind,
  7645. constructor: members.constructor,
  7646. jsdoctags: jsdoctags,
  7647. extends: extendsElements,
  7648. implements: implementsElements,
  7649. accessors: members.accessors
  7650. }
  7651. ];
  7652. }
  7653. }
  7654. else if (description) {
  7655. return [
  7656. {
  7657. deprecated: deprecated,
  7658. deprecationMessage: deprecationMessage,
  7659. description: description,
  7660. rawdescription: rawdescription,
  7661. inputs: members.inputs,
  7662. outputs: members.outputs,
  7663. hostBindings: members.hostBindings,
  7664. hostListeners: members.hostListeners,
  7665. methods: members.methods,
  7666. indexSignatures: members.indexSignatures,
  7667. properties: members.properties,
  7668. kind: members.kind,
  7669. constructor: members.constructor,
  7670. jsdoctags: jsdoctags,
  7671. extends: extendsElements,
  7672. implements: implementsElements,
  7673. accessors: members.accessors
  7674. }
  7675. ];
  7676. }
  7677. else {
  7678. return [
  7679. {
  7680. deprecated: deprecated,
  7681. deprecationMessage: deprecationMessage,
  7682. methods: members.methods,
  7683. inputs: members.inputs,
  7684. outputs: members.outputs,
  7685. hostBindings: members.hostBindings,
  7686. hostListeners: members.hostListeners,
  7687. indexSignatures: members.indexSignatures,
  7688. properties: members.properties,
  7689. kind: members.kind,
  7690. constructor: members.constructor,
  7691. jsdoctags: jsdoctags,
  7692. extends: extendsElements,
  7693. implements: implementsElements,
  7694. accessors: members.accessors
  7695. }
  7696. ];
  7697. }
  7698. };
  7699. ClassHelper.prototype.visitMembers = function (members, sourceFile) {
  7700. /**
  7701. * Copyright https://github.com/ng-bootstrap/ng-bootstrap
  7702. */
  7703. var inputs = [];
  7704. var outputs = [];
  7705. var methods = [];
  7706. var properties = [];
  7707. var indexSignatures = [];
  7708. var kind;
  7709. var inputDecorator;
  7710. var hostBindings = [];
  7711. var hostListeners = [];
  7712. var constructor;
  7713. var outputDecorator;
  7714. var accessors = {};
  7715. var result = {};
  7716. for (var i = 0; i < members.length; i++) {
  7717. // Allows typescript guess type when using ts.is*
  7718. var member = members[i];
  7719. inputDecorator = this.getDecoratorOfType(member, 'Input');
  7720. outputDecorator = this.getDecoratorOfType(member, 'Output');
  7721. var parsedHostBindings = this.getDecoratorOfType(member, 'HostBinding');
  7722. var parsedHostListeners = this.getDecoratorOfType(member, 'HostListener');
  7723. kind = member.kind;
  7724. if (isIgnore(member)) {
  7725. continue;
  7726. }
  7727. if (this.isInternal(member) && Configuration$1.mainData.disableInternal) {
  7728. continue;
  7729. }
  7730. if (inputDecorator && inputDecorator.length > 0) {
  7731. inputs.push(this.visitInputAndHostBinding(member, inputDecorator[0], sourceFile));
  7732. if (tsMorph.ts.isSetAccessorDeclaration(member)) {
  7733. this.addAccessor(accessors, members[i], sourceFile);
  7734. }
  7735. }
  7736. else if (outputDecorator && outputDecorator.length > 0) {
  7737. outputs.push(this.visitOutput(member, outputDecorator[0], sourceFile));
  7738. }
  7739. else if (parsedHostBindings && parsedHostBindings.length > 0) {
  7740. var k = 0;
  7741. var lenHB = parsedHostBindings.length;
  7742. for (k; k < lenHB; k++) {
  7743. hostBindings.push(this.visitInputAndHostBinding(member, parsedHostBindings[k], sourceFile));
  7744. }
  7745. }
  7746. else if (parsedHostListeners && parsedHostListeners.length > 0) {
  7747. var l = 0;
  7748. var lenHL = parsedHostListeners.length;
  7749. for (l; l < lenHL; l++) {
  7750. hostListeners.push(this.visitHostListener(member, parsedHostListeners[l], sourceFile));
  7751. }
  7752. }
  7753. if (!this.isHiddenMember(member)) {
  7754. if (!(this.isPrivate(member) && Configuration$1.mainData.disablePrivate)) {
  7755. if (!(this.isInternal(member) && Configuration$1.mainData.disableInternal)) {
  7756. if (!(this.isProtected(member) && Configuration$1.mainData.disableProtected)) {
  7757. if (tsMorph.ts.isMethodDeclaration(member) || tsMorph.ts.isMethodSignature(member)) {
  7758. methods.push(this.visitMethodDeclaration(member, sourceFile));
  7759. }
  7760. else if (tsMorph.ts.isPropertyDeclaration(member) ||
  7761. tsMorph.ts.isPropertySignature(member)) {
  7762. if (!inputDecorator && !outputDecorator) {
  7763. properties.push(this.visitProperty(member, sourceFile));
  7764. }
  7765. }
  7766. else if (tsMorph.ts.isCallSignatureDeclaration(member)) {
  7767. properties.push(this.visitCallDeclaration(member, sourceFile));
  7768. }
  7769. else if (tsMorph.ts.isGetAccessorDeclaration(member) ||
  7770. tsMorph.ts.isSetAccessorDeclaration(member)) {
  7771. this.addAccessor(accessors, members[i], sourceFile);
  7772. }
  7773. else if (tsMorph.ts.isIndexSignatureDeclaration(member)) {
  7774. indexSignatures.push(this.visitIndexDeclaration(member, sourceFile));
  7775. }
  7776. else if (tsMorph.ts.isConstructorDeclaration(member)) {
  7777. var _constructorProperties = this.visitConstructorProperties(member, sourceFile);
  7778. var j = 0;
  7779. var len = _constructorProperties.length;
  7780. for (j; j < len; j++) {
  7781. properties.push(_constructorProperties[j]);
  7782. }
  7783. constructor = this.visitConstructorDeclaration(member, sourceFile);
  7784. }
  7785. }
  7786. }
  7787. }
  7788. }
  7789. }
  7790. inputs.sort(getNamesCompareFn());
  7791. outputs.sort(getNamesCompareFn());
  7792. hostBindings.sort(getNamesCompareFn());
  7793. hostListeners.sort(getNamesCompareFn());
  7794. properties.sort(getNamesCompareFn());
  7795. methods.sort(getNamesCompareFn());
  7796. indexSignatures.sort(getNamesCompareFn());
  7797. result = {
  7798. inputs: inputs,
  7799. outputs: outputs,
  7800. hostBindings: hostBindings,
  7801. hostListeners: hostListeners,
  7802. methods: methods,
  7803. properties: properties,
  7804. indexSignatures: indexSignatures,
  7805. kind: kind,
  7806. constructor: constructor
  7807. };
  7808. if (Object.keys(accessors).length) {
  7809. result['accessors'] = accessors;
  7810. }
  7811. return result;
  7812. };
  7813. ClassHelper.prototype.visitTypeName = function (typeName) {
  7814. if (typeName.escapedText) {
  7815. return typeName.escapedText;
  7816. }
  7817. if (typeName.text) {
  7818. return typeName.text;
  7819. }
  7820. if (typeName.left && typeName.right) {
  7821. return this.visitTypeName(typeName.left) + '.' + this.visitTypeName(typeName.right);
  7822. }
  7823. return '';
  7824. };
  7825. ClassHelper.prototype.visitTypeIndex = function (node) {
  7826. var _return = '';
  7827. if (!node) {
  7828. return _return;
  7829. }
  7830. if (node.type &&
  7831. node.type.kind === tsMorph.SyntaxKind.IndexedAccessType &&
  7832. node.type.indexType &&
  7833. node.type.indexType.literal) {
  7834. return this.visitTypeName(node.type.indexType.literal);
  7835. }
  7836. return _return;
  7837. };
  7838. ClassHelper.prototype.visitType = function (node) {
  7839. var e_5, _a;
  7840. var _this = this;
  7841. var _return = 'void';
  7842. if (!node) {
  7843. return _return;
  7844. }
  7845. if (node.typeName) {
  7846. _return = this.visitTypeName(node.typeName);
  7847. }
  7848. else if (node.type) {
  7849. if (node.type.kind) {
  7850. _return = kindToType(node.type.kind);
  7851. }
  7852. if (node.type.typeName) {
  7853. _return = this.visitTypeName(node.type.typeName);
  7854. }
  7855. if (node.type.typeArguments) {
  7856. _return += '<';
  7857. var typeArguments = [];
  7858. try {
  7859. for (var _b = __values(node.type.typeArguments), _c = _b.next(); !_c.done; _c = _b.next()) {
  7860. var argument = _c.value;
  7861. typeArguments.push(this.visitType(argument));
  7862. }
  7863. }
  7864. catch (e_5_1) { e_5 = { error: e_5_1 }; }
  7865. finally {
  7866. try {
  7867. if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
  7868. }
  7869. finally { if (e_5) throw e_5.error; }
  7870. }
  7871. _return += typeArguments.join(' | ');
  7872. _return += '>';
  7873. }
  7874. if (node.type.elementType) {
  7875. var _firstPart = this.visitType(node.type.elementType);
  7876. _return = _firstPart + kindToType(node.type.kind);
  7877. if (node.type.elementType.kind === tsMorph.SyntaxKind.ParenthesizedType) {
  7878. _return = '(' + _firstPart + ')' + kindToType(node.type.kind);
  7879. }
  7880. }
  7881. var parseTypesOrElements = function (arr, separator) {
  7882. var e_6, _a;
  7883. var i = 0;
  7884. var len = arr.length;
  7885. for (i; i < len; i++) {
  7886. var type = arr[i];
  7887. if (type.elementType) {
  7888. var _firstPart = _this.visitType(type.elementType);
  7889. if (type.elementType.kind === tsMorph.SyntaxKind.ParenthesizedType) {
  7890. _return += '(' + _firstPart + ')' + kindToType(type.kind);
  7891. }
  7892. else {
  7893. _return += _firstPart + kindToType(type.kind);
  7894. }
  7895. }
  7896. else {
  7897. if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
  7898. if (type.literal.text) {
  7899. _return += '"' + type.literal.text + '"';
  7900. }
  7901. else {
  7902. _return += kindToType(type.literal.kind);
  7903. }
  7904. }
  7905. else {
  7906. _return += kindToType(type.kind);
  7907. }
  7908. if (type.typeName) {
  7909. _return += _this.visitTypeName(type.typeName);
  7910. }
  7911. if (type.kind === tsMorph.SyntaxKind.RestType && type.type) {
  7912. _return += '...' + _this.visitType(type.type);
  7913. }
  7914. if (type.typeArguments) {
  7915. _return += '<';
  7916. var typeArguments = [];
  7917. try {
  7918. for (var _b = (e_6 = void 0, __values(type.typeArguments)), _c = _b.next(); !_c.done; _c = _b.next()) {
  7919. var argument = _c.value;
  7920. typeArguments.push(_this.visitType(argument));
  7921. }
  7922. }
  7923. catch (e_6_1) { e_6 = { error: e_6_1 }; }
  7924. finally {
  7925. try {
  7926. if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
  7927. }
  7928. finally { if (e_6) throw e_6.error; }
  7929. }
  7930. _return += typeArguments.join(separator);
  7931. _return += '>';
  7932. }
  7933. }
  7934. if (i < len - 1) {
  7935. _return += separator;
  7936. }
  7937. }
  7938. };
  7939. if (node.type.elements && tsMorph.ts.isTupleTypeNode(node.type)) {
  7940. _return += '[';
  7941. parseTypesOrElements(node.type.elements, ', ');
  7942. _return += ']';
  7943. }
  7944. if (node.type.types && tsMorph.ts.isUnionTypeNode(node.type)) {
  7945. parseTypesOrElements(node.type.types, ' | ');
  7946. }
  7947. if (node.type.elementTypes) {
  7948. var elementTypes = node.type.elementTypes;
  7949. var i = 0;
  7950. var len = elementTypes.length;
  7951. if (len > 0) {
  7952. _return = '[';
  7953. for (i; i < len; i++) {
  7954. var type = elementTypes[i];
  7955. if (type.kind === tsMorph.SyntaxKind.ArrayType && type.elementType) {
  7956. _return += kindToType(type.elementType.kind);
  7957. _return += kindToType(type.kind);
  7958. }
  7959. else {
  7960. _return += kindToType(type.kind);
  7961. }
  7962. if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
  7963. if (type.literal.text) {
  7964. _return += '"' + type.literal.text + '"';
  7965. }
  7966. else {
  7967. _return += kindToType(type.literal.kind);
  7968. }
  7969. }
  7970. if (type.typeName) {
  7971. _return += this.visitTypeName(type.typeName);
  7972. }
  7973. if (type.kind === tsMorph.SyntaxKind.RestType && type.type) {
  7974. _return += '...' + this.visitType(type.type);
  7975. }
  7976. if (type.kind === tsMorph.SyntaxKind.TypeReference &&
  7977. type.typeName &&
  7978. typeof type.typeName.escapedText !== 'undefined' &&
  7979. type.typeName.escapedText === '') {
  7980. continue;
  7981. }
  7982. if (i < len - 1) {
  7983. _return += ', ';
  7984. }
  7985. }
  7986. _return += ']';
  7987. }
  7988. }
  7989. if (node.type &&
  7990. node.type.kind === tsMorph.SyntaxKind.IndexedAccessType &&
  7991. node.type.objectType &&
  7992. node.type.objectType.typeName) {
  7993. _return = this.visitTypeName(node.type.objectType.typeName);
  7994. }
  7995. }
  7996. else if (node.elementType) {
  7997. _return = kindToType(node.elementType.kind) + kindToType(node.kind);
  7998. if (node.elementType.typeName) {
  7999. _return = this.visitTypeName(node.elementType.typeName) + kindToType(node.kind);
  8000. }
  8001. }
  8002. else if (node.types && tsMorph.ts.isUnionTypeNode(node)) {
  8003. _return = '';
  8004. var i = 0;
  8005. var len = node.types.length;
  8006. for (i; i < len; i++) {
  8007. var type = node.types[i];
  8008. _return += kindToType(type.kind);
  8009. if (tsMorph.ts.isLiteralTypeNode(type) && type.literal) {
  8010. if (type.literal.text) {
  8011. _return += '"' + type.literal.text + '"';
  8012. }
  8013. else {
  8014. _return += kindToType(type.literal.kind);
  8015. }
  8016. }
  8017. if (type.typeName) {
  8018. _return += this.visitTypeName(type.typeName);
  8019. }
  8020. if (i < len - 1) {
  8021. _return += ' | ';
  8022. }
  8023. }
  8024. }
  8025. else if (node.dotDotDotToken) {
  8026. _return = 'any[]';
  8027. }
  8028. else {
  8029. _return = kindToType(node.kind);
  8030. if (_return === '' &&
  8031. node.initializer &&
  8032. node.initializer.kind &&
  8033. (node.kind === tsMorph.SyntaxKind.PropertyDeclaration || node.kind === tsMorph.SyntaxKind.Parameter)) {
  8034. _return = kindToType(node.initializer.kind);
  8035. }
  8036. if (node.kind === tsMorph.SyntaxKind.TypeParameter) {
  8037. _return = node.name.text;
  8038. }
  8039. if (node.kind === tsMorph.SyntaxKind.LiteralType) {
  8040. _return = node.literal.text;
  8041. }
  8042. }
  8043. if (node.typeArguments && node.typeArguments.length > 0) {
  8044. _return += '<';
  8045. var i = 0, len = node.typeArguments.length;
  8046. for (i; i < len; i++) {
  8047. var argument = node.typeArguments[i];
  8048. _return += this.visitType(argument);
  8049. if (i >= 0 && i < len - 1) {
  8050. _return += ', ';
  8051. }
  8052. }
  8053. _return += '>';
  8054. }
  8055. return _return;
  8056. };
  8057. ClassHelper.prototype.visitCallDeclaration = function (method, sourceFile) {
  8058. var _this = this;
  8059. var sourceCode = sourceFile.getText();
  8060. var hash = crypto$7.createHash('sha512').update(sourceCode).digest('hex');
  8061. var result = {
  8062. id: 'call-declaration-' + hash,
  8063. args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
  8064. returnType: this.visitType(method.type),
  8065. line: this.getPosition(method, sourceFile).line + 1,
  8066. deprecated: false,
  8067. deprecationMessage: ''
  8068. };
  8069. if (method.jsDoc) {
  8070. var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
  8071. var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
  8072. result.rawdescription = cleanedDescription;
  8073. result.description = markedAcl(cleanedDescription);
  8074. }
  8075. var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
  8076. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  8077. this.checkForDeprecation(jsdoctags[0].tags, result);
  8078. result.jsdoctags = markedtags(jsdoctags[0].tags);
  8079. }
  8080. return result;
  8081. };
  8082. ClassHelper.prototype.visitIndexDeclaration = function (method, sourceFile) {
  8083. var _this = this;
  8084. var sourceCode = sourceFile.getText();
  8085. var hash = crypto$7.createHash('sha512').update(sourceCode).digest('hex');
  8086. var result = {
  8087. id: 'index-declaration-' + hash,
  8088. args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
  8089. returnType: this.visitType(method.type),
  8090. line: this.getPosition(method, sourceFile).line + 1,
  8091. deprecated: false,
  8092. deprecationMessage: ''
  8093. };
  8094. var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
  8095. if (method.jsDoc) {
  8096. var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
  8097. var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
  8098. result.rawdescription = cleanedDescription;
  8099. result.description = markedAcl(cleanedDescription);
  8100. }
  8101. if (jsdoctags && jsdoctags.length >= 1) {
  8102. if (jsdoctags[0].tags) {
  8103. this.checkForDeprecation(jsdoctags[0].tags, result);
  8104. if (method.jsDoc) {
  8105. result.jsdoctags = markedtags(jsdoctags[0].tags);
  8106. }
  8107. }
  8108. }
  8109. return result;
  8110. };
  8111. ClassHelper.prototype.visitConstructorDeclaration = function (method, sourceFile) {
  8112. var _this = this;
  8113. /**
  8114. * Copyright https://github.com/ng-bootstrap/ng-bootstrap
  8115. */
  8116. var result = {
  8117. name: 'constructor',
  8118. description: '',
  8119. deprecated: false,
  8120. deprecationMessage: '',
  8121. args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
  8122. line: this.getPosition(method, sourceFile).line + 1
  8123. };
  8124. var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
  8125. if (method.jsDoc) {
  8126. var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
  8127. var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
  8128. result.rawdescription = cleanedDescription;
  8129. result.description = markedAcl(cleanedDescription);
  8130. }
  8131. if (method.modifiers) {
  8132. if (method.modifiers.length > 0) {
  8133. var kinds = method.modifiers.map(function (modifier) {
  8134. return modifier.kind;
  8135. });
  8136. if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
  8137. ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
  8138. kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
  8139. }
  8140. result.modifierKind = kinds;
  8141. }
  8142. }
  8143. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  8144. this.checkForDeprecation(jsdoctags[0].tags, result);
  8145. result.jsdoctags = markedtags(jsdoctags[0].tags);
  8146. }
  8147. if (result.jsdoctags && result.jsdoctags.length > 0) {
  8148. result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
  8149. }
  8150. else if (result.args.length > 0) {
  8151. result.jsdoctags = mergeTagsAndArgs(result.args);
  8152. }
  8153. return result;
  8154. };
  8155. ClassHelper.prototype.visitProperty = function (property, sourceFile) {
  8156. var result = {
  8157. name: property.name.text,
  8158. defaultValue: property.initializer
  8159. ? this.stringifyDefaultValue(property.initializer)
  8160. : undefined,
  8161. deprecated: false,
  8162. deprecationMessage: '',
  8163. type: this.visitType(property),
  8164. indexKey: this.visitTypeIndex(property),
  8165. optional: typeof property.questionToken !== 'undefined',
  8166. description: '',
  8167. line: this.getPosition(property, sourceFile).line + 1
  8168. };
  8169. var jsdoctags;
  8170. if (property.initializer && property.initializer.kind === tsMorph.SyntaxKind.ArrowFunction) {
  8171. result.defaultValue = '() => {...}';
  8172. }
  8173. if (typeof result.name === 'undefined' && typeof property.name.expression !== 'undefined') {
  8174. result.name = property.name.expression.text;
  8175. }
  8176. jsdoctags = this.jsdocParserUtil.getJSDocs(property);
  8177. if (property.jsDoc) {
  8178. var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
  8179. var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
  8180. result.rawdescription = cleanedDescription;
  8181. result.description = markedAcl(cleanedDescription);
  8182. }
  8183. if (nodeHasDecorator(property)) {
  8184. var propertyDecorators = getNodeDecorators(property);
  8185. result.decorators = this.formatDecorators(propertyDecorators);
  8186. }
  8187. if (property.modifiers) {
  8188. if (property.modifiers.length > 0) {
  8189. var kinds = property.modifiers.map(function (modifier) {
  8190. return modifier.kind;
  8191. });
  8192. if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
  8193. ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
  8194. kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
  8195. }
  8196. result.modifierKind = kinds;
  8197. }
  8198. }
  8199. // Check for ECMAScript Private Fields
  8200. if (this.isPrivate(property)) {
  8201. if (!result.modifierKind) {
  8202. result.modifierKind = [];
  8203. }
  8204. var hasAlreadyPrivateLeyword_1 = false;
  8205. result.modifierKind.forEach(function (modifierKind) {
  8206. if (modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
  8207. hasAlreadyPrivateLeyword_1 = true;
  8208. }
  8209. });
  8210. if (!hasAlreadyPrivateLeyword_1) {
  8211. result.modifierKind.push(tsMorph.SyntaxKind.PrivateKeyword);
  8212. }
  8213. }
  8214. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  8215. this.checkForDeprecation(jsdoctags[0].tags, result);
  8216. if (property.jsDoc) {
  8217. result.jsdoctags = markedtags(jsdoctags[0].tags);
  8218. }
  8219. }
  8220. return result;
  8221. };
  8222. ClassHelper.prototype.visitConstructorProperties = function (constr, sourceFile) {
  8223. if (constr.parameters) {
  8224. var _parameters_1 = [];
  8225. var i = 0;
  8226. var len = constr.parameters.length;
  8227. for (i; i < len; i++) {
  8228. var parameterOfConstructor = constr.parameters[i];
  8229. if (isIgnore(parameterOfConstructor)) {
  8230. continue;
  8231. }
  8232. if (this.isInternal(parameterOfConstructor) &&
  8233. Configuration$1.mainData.disableInternal) {
  8234. continue;
  8235. }
  8236. if (this.isPublic(parameterOfConstructor)) {
  8237. _parameters_1.push(this.visitProperty(constr.parameters[i], sourceFile));
  8238. }
  8239. }
  8240. /**
  8241. * Merge JSDoc tags description from constructor with parameters
  8242. */
  8243. if (constr.jsDoc) {
  8244. if (constr.jsDoc.length > 0) {
  8245. var constrTags = constr.jsDoc[0].tags;
  8246. if (constrTags && constrTags.length > 0) {
  8247. constrTags.forEach(function (tag) {
  8248. _parameters_1.forEach(function (param) {
  8249. if (tag.tagName &&
  8250. tag.tagName.escapedText &&
  8251. tag.tagName.escapedText === 'param') {
  8252. if (tag.name &&
  8253. tag.name.escapedText &&
  8254. tag.name.escapedText === param.name) {
  8255. param.description = tag.comment;
  8256. }
  8257. }
  8258. });
  8259. });
  8260. }
  8261. }
  8262. }
  8263. return _parameters_1;
  8264. }
  8265. else {
  8266. return [];
  8267. }
  8268. };
  8269. ClassHelper.prototype.visitMethodDeclaration = function (method, sourceFile) {
  8270. var _this = this;
  8271. var result = {
  8272. name: method.name.text,
  8273. args: method.parameters ? method.parameters.map(function (prop) { return _this.visitArgument(prop); }) : [],
  8274. optional: typeof method.questionToken !== 'undefined',
  8275. returnType: this.visitType(method.type),
  8276. typeParameters: [],
  8277. line: this.getPosition(method, sourceFile).line + 1,
  8278. deprecated: false,
  8279. deprecationMessage: ''
  8280. };
  8281. var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
  8282. if (typeof method.type === 'undefined') {
  8283. // Try to get inferred type
  8284. if (method.symbol) {
  8285. var symbol = method.symbol;
  8286. if (symbol.valueDeclaration) {
  8287. var symbolType = this.typeChecker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration);
  8288. if (symbolType) {
  8289. try {
  8290. var signature = this.typeChecker.getSignatureFromDeclaration(method);
  8291. var returnType = signature.getReturnType();
  8292. result.returnType = this.typeChecker.typeToString(returnType);
  8293. // tslint:disable-next-line:no-empty
  8294. }
  8295. catch (error) { }
  8296. }
  8297. }
  8298. }
  8299. }
  8300. if (method.typeParameters && method.typeParameters.length > 0) {
  8301. result.typeParameters = method.typeParameters.map(function (typeParameter) {
  8302. return _this.visitType(typeParameter);
  8303. });
  8304. }
  8305. if (method.jsDoc) {
  8306. var comment = this.jsdocParserUtil.getMainCommentOfNode(method, sourceFile);
  8307. var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
  8308. result.rawdescription = cleanedDescription;
  8309. result.description = markedAcl(cleanedDescription);
  8310. }
  8311. if (nodeHasDecorator(method)) {
  8312. var methodDecorators = getNodeDecorators(method);
  8313. result.decorators = this.formatDecorators(methodDecorators);
  8314. }
  8315. if (method.modifiers) {
  8316. if (method.modifiers.length > 0) {
  8317. var kinds = method.modifiers.map(function (modifier) {
  8318. return modifier.kind;
  8319. });
  8320. if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
  8321. ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
  8322. kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
  8323. }
  8324. result.modifierKind = kinds;
  8325. }
  8326. }
  8327. // Check for ECMAScript Private Fields
  8328. if (this.isPrivate(method)) {
  8329. if (!result.modifierKind) {
  8330. result.modifierKind = [];
  8331. }
  8332. var hasAlreadyPrivateLeyword_2 = false;
  8333. result.modifierKind.forEach(function (modifierKind) {
  8334. if (modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
  8335. hasAlreadyPrivateLeyword_2 = true;
  8336. }
  8337. });
  8338. if (!hasAlreadyPrivateLeyword_2) {
  8339. result.modifierKind.push(tsMorph.SyntaxKind.PrivateKeyword);
  8340. }
  8341. }
  8342. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  8343. this.checkForDeprecation(jsdoctags[0].tags, result);
  8344. result.jsdoctags = markedtags(jsdoctags[0].tags);
  8345. }
  8346. if (result.jsdoctags && result.jsdoctags.length > 0) {
  8347. result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
  8348. }
  8349. else if (result.args.length > 0) {
  8350. result.jsdoctags = mergeTagsAndArgs(result.args);
  8351. }
  8352. return result;
  8353. };
  8354. ClassHelper.prototype.visitOutput = function (property, outDecorator, sourceFile) {
  8355. var inArgs = outDecorator.expression.arguments;
  8356. var _return = {
  8357. name: inArgs.length > 0 ? inArgs[0].text : property.name.text,
  8358. defaultValue: property.initializer
  8359. ? this.stringifyDefaultValue(property.initializer)
  8360. : undefined,
  8361. deprecated: false,
  8362. deprecationMessage: ''
  8363. };
  8364. if (property.jsDoc) {
  8365. var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
  8366. var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
  8367. var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
  8368. _return.rawdescription = cleanedDescription;
  8369. _return.description = markedAcl(cleanedDescription);
  8370. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  8371. this.checkForDeprecation(jsdoctags[0].tags, _return);
  8372. _return.jsdoctags = markedtags(jsdoctags[0].tags);
  8373. }
  8374. }
  8375. if (!_return.description) {
  8376. if (property.jsDoc && property.jsDoc.length > 0) {
  8377. if (typeof property.jsDoc[0].comment !== 'undefined') {
  8378. var rawDescription = property.jsDoc[0].comment;
  8379. _return.rawdescription = rawDescription;
  8380. _return.description = markedAcl(rawDescription);
  8381. }
  8382. }
  8383. }
  8384. _return.line = this.getPosition(property, sourceFile).line + 1;
  8385. if (property.type) {
  8386. _return.type = this.visitType(property);
  8387. }
  8388. else {
  8389. // handle NewExpression
  8390. if (property.initializer) {
  8391. if (tsMorph.ts.isNewExpression(property.initializer)) {
  8392. if (property.initializer.expression) {
  8393. _return.type = property.initializer.expression.text;
  8394. }
  8395. }
  8396. }
  8397. }
  8398. return _return;
  8399. };
  8400. ClassHelper.prototype.visitArgument = function (arg) {
  8401. var _this = this;
  8402. var _result = {
  8403. name: arg.name.text,
  8404. type: this.visitType(arg),
  8405. deprecated: false,
  8406. deprecationMessage: ''
  8407. };
  8408. if (arg.dotDotDotToken) {
  8409. _result.dotDotDotToken = true;
  8410. }
  8411. if (arg.questionToken) {
  8412. _result.optional = true;
  8413. }
  8414. if (arg.type) {
  8415. if (arg.type.kind) {
  8416. if (tsMorph.ts.isFunctionTypeNode(arg.type)) {
  8417. _result.function = arg.type.parameters
  8418. ? arg.type.parameters.map(function (prop) { return _this.visitArgument(prop); })
  8419. : [];
  8420. }
  8421. }
  8422. }
  8423. if (arg.initializer) {
  8424. _result.defaultValue = this.stringifyDefaultValue(arg.initializer);
  8425. }
  8426. var jsdoctags = this.jsdocParserUtil.getJSDocs(arg);
  8427. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  8428. this.checkForDeprecation(jsdoctags[0].tags, _result);
  8429. }
  8430. return _result;
  8431. };
  8432. ClassHelper.prototype.visitInputAndHostBinding = function (property, inDecorator, sourceFile) {
  8433. var inArgs = inDecorator.expression.arguments;
  8434. var _return = {};
  8435. var isInputConfigStringLiteral = false;
  8436. var isInputConfigObjectLiteralExpression = false;
  8437. var hasRequiredField = false;
  8438. var hasAlias = false;
  8439. var getRequiredField = function () {
  8440. return inArgs[0].properties.find(function (property) { return property.name.escapedText === 'required'; });
  8441. };
  8442. var getAliasProperty = function () {
  8443. return inArgs[0].properties.find(function (property) { return property.name.escapedText === 'alias'; });
  8444. };
  8445. if (inArgs.length > 0) {
  8446. isInputConfigStringLiteral = inArgs[0] && tsMorph.ts.isStringLiteral(inArgs[0]);
  8447. isInputConfigObjectLiteralExpression =
  8448. inArgs[0] && tsMorph.ts.isObjectLiteralExpression(inArgs[0]);
  8449. if (isInputConfigObjectLiteralExpression && inArgs[0].properties) {
  8450. hasRequiredField = isInputConfigObjectLiteralExpression && !!getRequiredField();
  8451. hasAlias = isInputConfigObjectLiteralExpression ? !!getAliasProperty() : false;
  8452. _return.required = !!getRequiredField();
  8453. }
  8454. _return.name = isInputConfigStringLiteral
  8455. ? inArgs[0].text
  8456. : hasAlias
  8457. ? getAliasProperty().initializer.text
  8458. : property.name.text;
  8459. }
  8460. else {
  8461. _return.name = property.name.text;
  8462. }
  8463. _return.defaultValue = property.initializer
  8464. ? this.stringifyDefaultValue(property.initializer)
  8465. : undefined;
  8466. _return.deprecated = false;
  8467. _return.deprecationMessage = '';
  8468. if (inArgs.length > 0 && inArgs[0].properties && hasRequiredField) {
  8469. _return.optional = getRequiredField().initializer.kind !== tsMorph.SyntaxKind.TrueKeyword;
  8470. }
  8471. if (!_return.description) {
  8472. if (property.jsDoc) {
  8473. if (property.jsDoc.length > 0) {
  8474. var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
  8475. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  8476. this.checkForDeprecation(jsdoctags[0].tags, _return);
  8477. _return.jsdoctags = markedtags(jsdoctags[0].tags);
  8478. }
  8479. if (typeof property.jsDoc[0].comment !== 'undefined') {
  8480. var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
  8481. var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
  8482. _return.rawdescription = cleanedDescription;
  8483. _return.description = markedAcl(cleanedDescription);
  8484. }
  8485. }
  8486. }
  8487. }
  8488. _return.line = this.getPosition(property, sourceFile).line + 1;
  8489. if (property.type) {
  8490. _return.type = this.visitType(property);
  8491. }
  8492. else {
  8493. // handle NewExpression
  8494. if (property.initializer) {
  8495. if (tsMorph.ts.isNewExpression(property.initializer)) {
  8496. if (property.initializer.expression) {
  8497. _return.type = property.initializer.expression.text;
  8498. }
  8499. }
  8500. }
  8501. // Try to get inferred type
  8502. if (property.symbol) {
  8503. var symbol = property.symbol;
  8504. if (symbol.valueDeclaration) {
  8505. var symbolType = this.typeChecker.getTypeOfSymbolAtLocation(symbol, symbol.valueDeclaration);
  8506. if (symbolType) {
  8507. _return.type = this.typeChecker.typeToString(symbolType);
  8508. }
  8509. }
  8510. }
  8511. }
  8512. if (property.kind === tsMorph.SyntaxKind.SetAccessor) {
  8513. // For setter accessor, find type in first parameter
  8514. if (property.parameters && property.parameters.length === 1) {
  8515. if (property.parameters[0].type) {
  8516. _return.type = this.visitType(property.parameters[0].type);
  8517. }
  8518. }
  8519. }
  8520. if (nodeHasDecorator(property)) {
  8521. var propertyDecorators = getNodeDecorators(property);
  8522. _return.decorators = this.formatDecorators(propertyDecorators).filter(function (item) { return item.name !== 'Input' && item.name !== 'HostBinding'; });
  8523. }
  8524. return _return;
  8525. };
  8526. ClassHelper.prototype.visitHostListener = function (property, hostListenerDecorator, sourceFile) {
  8527. var _this = this;
  8528. var inArgs = hostListenerDecorator.expression.arguments;
  8529. var _return = {};
  8530. _return.name = inArgs.length > 0 ? inArgs[0].text : property.name.text;
  8531. _return.args = property.parameters
  8532. ? property.parameters.map(function (prop) { return _this.visitArgument(prop); })
  8533. : [];
  8534. _return.argsDecorator =
  8535. inArgs.length > 1
  8536. ? inArgs[1].elements.map(function (prop) {
  8537. return prop.text;
  8538. })
  8539. : [];
  8540. _return.deprecated = false;
  8541. _return.deprecationMessage = '';
  8542. if (property.jsDoc) {
  8543. var comment = this.jsdocParserUtil.getMainCommentOfNode(property, sourceFile);
  8544. var jsdoctags = this.jsdocParserUtil.getJSDocs(property);
  8545. var cleanedDescription = this.jsdocParserUtil.parseComment(comment);
  8546. _return.rawdescription = cleanedDescription;
  8547. _return.description = markedAcl(cleanedDescription);
  8548. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  8549. this.checkForDeprecation(jsdoctags[0].tags, _return);
  8550. _return.jsdoctags = markedtags(jsdoctags[0].tags);
  8551. }
  8552. }
  8553. if (!_return.description) {
  8554. if (property.jsDoc) {
  8555. if (property.jsDoc.length > 0) {
  8556. if (typeof property.jsDoc[0].comment !== 'undefined') {
  8557. var rawDescription = property.jsDoc[0].comment;
  8558. _return.rawdescription = rawDescription;
  8559. _return.description = markedAcl(rawDescription);
  8560. }
  8561. }
  8562. }
  8563. }
  8564. _return.line = this.getPosition(property, sourceFile).line + 1;
  8565. return _return;
  8566. };
  8567. return ClassHelper;
  8568. }());
  8569. var TsPrinterUtil = /** @class */ (function () {
  8570. function TsPrinterUtil() {
  8571. this.printer = tsMorph.ts.createPrinter({
  8572. newLine: tsMorph.ts.NewLineKind.LineFeed
  8573. });
  8574. }
  8575. TsPrinterUtil.prototype.print = function (node) {
  8576. return this.printer.printNode(tsMorph.ts.EmitHint.Unspecified, node, tsMorph.ts.createSourceFile('', '', tsMorph.ts.ScriptTarget.Latest));
  8577. };
  8578. return TsPrinterUtil;
  8579. }());
  8580. var SymbolHelper = /** @class */ (function () {
  8581. function SymbolHelper() {
  8582. this.unknown = '???';
  8583. }
  8584. SymbolHelper.prototype.parseDeepIndentifier = function (name, srcFile) {
  8585. var result = {
  8586. name: '',
  8587. type: ''
  8588. };
  8589. if (typeof name === 'undefined') {
  8590. return result;
  8591. }
  8592. var nsModule = name.split('.');
  8593. var type = this.getType(name);
  8594. if (nsModule.length > 1) {
  8595. result.ns = nsModule[0];
  8596. result.name = name;
  8597. result.type = type;
  8598. return result;
  8599. }
  8600. if (typeof srcFile !== 'undefined') {
  8601. result.file = ImportsUtil$1.getFileNameOfImport(name, srcFile);
  8602. }
  8603. result.name = name;
  8604. result.type = type;
  8605. return result;
  8606. };
  8607. SymbolHelper.prototype.getType = function (name) {
  8608. var type;
  8609. if (name.toLowerCase().indexOf('component') !== -1) {
  8610. type = 'component';
  8611. }
  8612. else if (name.toLowerCase().indexOf('pipe') !== -1) {
  8613. type = 'pipe';
  8614. }
  8615. else if (name.toLowerCase().indexOf('controller') !== -1) {
  8616. type = 'controller';
  8617. }
  8618. else if (name.toLowerCase().indexOf('module') !== -1) {
  8619. type = 'module';
  8620. }
  8621. else if (name.toLowerCase().indexOf('directive') !== -1) {
  8622. type = 'directive';
  8623. }
  8624. else if (name.toLowerCase().indexOf('injectable') !== -1 ||
  8625. name.toLowerCase().indexOf('service') !== -1) {
  8626. type = 'injectable';
  8627. }
  8628. return type;
  8629. };
  8630. /**
  8631. * Output
  8632. * RouterModule.forRoot 179
  8633. */
  8634. SymbolHelper.prototype.buildIdentifierName = function (node, name) {
  8635. if (tsMorph.ts.isIdentifier(node) && !tsMorph.ts.isPropertyAccessExpression(node)) {
  8636. return "".concat(node.text, ".").concat(name);
  8637. }
  8638. name = name ? ".".concat(name) : '';
  8639. var nodeName = this.unknown;
  8640. if (node.name) {
  8641. nodeName = node.name.text;
  8642. }
  8643. else if (node.text) {
  8644. nodeName = node.text;
  8645. }
  8646. else if (node.expression) {
  8647. if (node.expression.text) {
  8648. nodeName = node.expression.text;
  8649. }
  8650. else if (node.expression.elements) {
  8651. if (tsMorph.ts.isArrayLiteralExpression(node.expression)) {
  8652. nodeName = node.expression.elements.map(function (el) { return el.text; }).join(', ');
  8653. nodeName = "[".concat(nodeName, "]");
  8654. }
  8655. }
  8656. }
  8657. if (tsMorph.ts.isSpreadElement(node)) {
  8658. return "...".concat(nodeName);
  8659. }
  8660. return "".concat(this.buildIdentifierName(node.expression, nodeName)).concat(name);
  8661. };
  8662. /**
  8663. * parse expressions such as:
  8664. * { provide: APP_BASE_HREF, useValue: '/' }
  8665. * { provide: 'Date', useFactory: (d1, d2) => new Date(), deps: ['d1', 'd2'] }
  8666. */
  8667. SymbolHelper.prototype.parseProviderConfiguration = function (node) {
  8668. if (node.kind && node.kind === tsMorph.SyntaxKind.ObjectLiteralExpression) {
  8669. // Search for provide: HTTP_INTERCEPTORS
  8670. // and if true, return type: 'interceptor' + name
  8671. var interceptorName_1, hasInterceptor_1;
  8672. if (node.properties) {
  8673. if (node.properties.length > 0) {
  8674. ___namespace.forEach(node.properties, function (property) {
  8675. if (property.kind && property.kind === tsMorph.SyntaxKind.PropertyAssignment) {
  8676. if (property.name.text === 'provide') {
  8677. if (property.initializer.text === 'HTTP_INTERCEPTORS') {
  8678. hasInterceptor_1 = true;
  8679. }
  8680. }
  8681. if (property.name.text === 'useClass' ||
  8682. property.name.text === 'useExisting') {
  8683. interceptorName_1 = property.initializer.text;
  8684. }
  8685. }
  8686. });
  8687. }
  8688. }
  8689. if (hasInterceptor_1) {
  8690. return interceptorName_1;
  8691. }
  8692. else {
  8693. return new TsPrinterUtil().print(node);
  8694. }
  8695. }
  8696. else {
  8697. return new TsPrinterUtil().print(node);
  8698. }
  8699. };
  8700. /**
  8701. * Kind
  8702. * 181 CallExpression => "RouterModule.forRoot(args)"
  8703. * 71 Identifier => "RouterModule" "TodoStore"
  8704. * 9 StringLiteral => "./app.component.css" "./tab.scss"
  8705. */
  8706. SymbolHelper.prototype.parseSymbolElements = function (node) {
  8707. // parse expressions such as: AngularFireModule.initializeApp(firebaseConfig)
  8708. // if (ts.isCallExpression(node) && ts.isPropertyAccessExpression(node.expression)) {
  8709. if ((tsMorph.ts.isCallExpression(node) && tsMorph.ts.isPropertyAccessExpression(node.expression)) ||
  8710. (tsMorph.ts.isNewExpression(node) && tsMorph.ts.isElementAccessExpression(node.expression))) {
  8711. var className = this.buildIdentifierName(node.expression);
  8712. // function arguments could be really complex. There are so
  8713. // many use cases that we can't handle. Just print "args" to indicate
  8714. // that we have arguments.
  8715. var functionArgs = node.arguments.length > 0 ? 'args' : '';
  8716. var text = "".concat(className, "(").concat(functionArgs, ")");
  8717. return text;
  8718. }
  8719. else if (tsMorph.ts.isPropertyAccessExpression(node)) {
  8720. // parse expressions such as: Shared.Module
  8721. return this.buildIdentifierName(node);
  8722. }
  8723. else if (tsMorph.ts.isIdentifier(node)) {
  8724. // parse expressions such as: MyComponent
  8725. if (node.text) {
  8726. return node.text;
  8727. }
  8728. if (node.escapedText) {
  8729. return node.escapedText;
  8730. }
  8731. }
  8732. else if (tsMorph.ts.isSpreadElement(node)) {
  8733. // parse expressions such as: ...MYARRAY
  8734. // Resolve MYARRAY in imports or local file variables after full scan, just return the name of the variable
  8735. if (node.expression && node.expression.text) {
  8736. return node.expression.text;
  8737. }
  8738. }
  8739. return node.text ? node.text : this.parseProviderConfiguration(node);
  8740. };
  8741. /**
  8742. * Kind
  8743. * 177 ArrayLiteralExpression
  8744. * 122 BooleanKeyword
  8745. * 9 StringLiteral
  8746. */
  8747. SymbolHelper.prototype.parseSymbols = function (node, srcFile, decoratorType) {
  8748. var _this = this;
  8749. var localNode = node;
  8750. if (tsMorph.ts.isShorthandPropertyAssignment(localNode) && decoratorType !== 'template') {
  8751. localNode = ImportsUtil$1.findValueInImportOrLocalVariables(node.name.text, srcFile, decoratorType);
  8752. }
  8753. if (tsMorph.ts.isShorthandPropertyAssignment(localNode) && decoratorType === 'template') {
  8754. var data = ImportsUtil$1.findValueInImportOrLocalVariables(node.name.text, srcFile, decoratorType);
  8755. return [data];
  8756. }
  8757. if (localNode.initializer && tsMorph.ts.isArrayLiteralExpression(localNode.initializer)) {
  8758. return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
  8759. }
  8760. else if ((localNode.initializer && tsMorph.ts.isStringLiteral(localNode.initializer)) ||
  8761. (localNode.initializer && tsMorph.ts.isTemplateLiteral(localNode.initializer)) ||
  8762. (localNode.initializer &&
  8763. tsMorph.ts.isPropertyAssignment(localNode) &&
  8764. localNode.initializer.text)) {
  8765. return [localNode.initializer.text];
  8766. }
  8767. else if (localNode.initializer &&
  8768. localNode.initializer.kind &&
  8769. (localNode.initializer.kind === tsMorph.SyntaxKind.TrueKeyword ||
  8770. localNode.initializer.kind === tsMorph.SyntaxKind.FalseKeyword)) {
  8771. return [localNode.initializer.kind === tsMorph.SyntaxKind.TrueKeyword ? true : false];
  8772. }
  8773. else if (localNode.initializer && tsMorph.ts.isPropertyAccessExpression(localNode.initializer)) {
  8774. var identifier = this.parseSymbolElements(localNode.initializer);
  8775. return [identifier];
  8776. }
  8777. else if (localNode.initializer &&
  8778. localNode.initializer.elements &&
  8779. localNode.initializer.elements.length > 0) {
  8780. // Node replaced by ts-simple-ast & kind = 265
  8781. return localNode.initializer.elements.map(function (x) { return _this.parseSymbolElements(x); });
  8782. }
  8783. };
  8784. SymbolHelper.prototype.getSymbolDeps = function (props, decoratorType, srcFile, multiLine) {
  8785. var _this = this;
  8786. if (props.length === 0) {
  8787. return [];
  8788. }
  8789. var i = 0, len = props.length, filteredProps = [];
  8790. for (i; i < len; i++) {
  8791. if (props[i].name && props[i].name.text === decoratorType) {
  8792. filteredProps.push(props[i]);
  8793. }
  8794. }
  8795. return filteredProps.map(function (x) { return _this.parseSymbols(x, srcFile, decoratorType); }).pop() || [];
  8796. };
  8797. SymbolHelper.prototype.getSymbolDepsRaw = function (props, type, multiLine) {
  8798. return props.filter(function (node) { return node.name.text === type; });
  8799. };
  8800. return SymbolHelper;
  8801. }());
  8802. var ComponentHelper = /** @class */ (function () {
  8803. function ComponentHelper(classHelper, symbolHelper) {
  8804. if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
  8805. this.classHelper = classHelper;
  8806. this.symbolHelper = symbolHelper;
  8807. }
  8808. ComponentHelper.prototype.getComponentChangeDetection = function (props, srcFile) {
  8809. return this.symbolHelper.getSymbolDeps(props, 'changeDetection', srcFile).pop();
  8810. };
  8811. ComponentHelper.prototype.getComponentEncapsulation = function (props, srcFile) {
  8812. return this.symbolHelper.getSymbolDeps(props, 'encapsulation', srcFile);
  8813. };
  8814. ComponentHelper.prototype.getComponentPure = function (props, srcFile) {
  8815. return this.symbolHelper.getSymbolDeps(props, 'pure', srcFile).pop();
  8816. };
  8817. ComponentHelper.prototype.getComponentName = function (props, srcFile) {
  8818. return this.symbolHelper.getSymbolDeps(props, 'name', srcFile).pop();
  8819. };
  8820. ComponentHelper.prototype.getComponentExportAs = function (props, srcFile) {
  8821. return this.symbolHelper.getSymbolDeps(props, 'exportAs', srcFile).pop();
  8822. };
  8823. ComponentHelper.prototype.getComponentHostDirectives = function (props) {
  8824. var hostDirectiveSymbolParsed = this.symbolHelper.getSymbolDepsRaw(props, 'hostDirectives');
  8825. var hostDirectiveSymbol = null;
  8826. if (hostDirectiveSymbolParsed.length > 0) {
  8827. hostDirectiveSymbol = hostDirectiveSymbolParsed.pop();
  8828. }
  8829. var result = [];
  8830. if (hostDirectiveSymbol &&
  8831. hostDirectiveSymbol.initializer &&
  8832. hostDirectiveSymbol.initializer.elements &&
  8833. hostDirectiveSymbol.initializer.elements.length > 0) {
  8834. hostDirectiveSymbol.initializer.elements.forEach(function (element) {
  8835. if (element.kind === tsMorph.SyntaxKind.Identifier) {
  8836. result.push({
  8837. name: element.escapedText
  8838. });
  8839. }
  8840. else if (element.kind === tsMorph.SyntaxKind.ObjectLiteralExpression &&
  8841. element.properties &&
  8842. element.properties.length > 0) {
  8843. var parsedDirective_1 = {
  8844. name: '',
  8845. inputs: [],
  8846. outputs: []
  8847. };
  8848. element.properties.forEach(function (property) {
  8849. if (property.name.escapedText === 'directive') {
  8850. parsedDirective_1.name = property.initializer.escapedText;
  8851. }
  8852. else if (property.name.escapedText === 'inputs') {
  8853. if (property.initializer &&
  8854. property.initializer.elements &&
  8855. property.initializer.elements.length > 0) {
  8856. property.initializer.elements.forEach(function (propertyElement) {
  8857. parsedDirective_1.inputs.push(propertyElement.text);
  8858. });
  8859. }
  8860. }
  8861. else if (property.name.escapedText === 'outputs') {
  8862. if (property.initializer &&
  8863. property.initializer.elements &&
  8864. property.initializer.elements.length > 0) {
  8865. property.initializer.elements.forEach(function (propertyElement) {
  8866. parsedDirective_1.outputs.push(propertyElement.text);
  8867. });
  8868. }
  8869. }
  8870. });
  8871. result.push(parsedDirective_1);
  8872. }
  8873. });
  8874. }
  8875. return result;
  8876. };
  8877. ComponentHelper.prototype.getComponentHost = function (props) {
  8878. return this.getSymbolDepsObject(props, 'host');
  8879. };
  8880. ComponentHelper.prototype.getComponentTag = function (props, srcFile) {
  8881. return this.symbolHelper.getSymbolDeps(props, 'tag', srcFile).pop();
  8882. };
  8883. ComponentHelper.prototype.getComponentInputsMetadata = function (props, srcFile) {
  8884. return this.symbolHelper.getSymbolDeps(props, 'inputs', srcFile);
  8885. };
  8886. ComponentHelper.prototype.getInputSignals = function (props) {
  8887. var inputSignals = [];
  8888. props === null || props === void 0 ? void 0 : props.forEach(function (prop, i) {
  8889. var _a, _b, _c, _d;
  8890. var regexpInput = /input(?:\.(required))?(?:<([\w-]+)>)?\(([\w-]+)?\)/;
  8891. var resInput = regexpInput.exec(prop.defaultValue);
  8892. if (resInput) {
  8893. var newInput = prop;
  8894. newInput.defaultValue = resInput[resInput.length - 1];
  8895. newInput.required = (_b = (_a = resInput[0]) === null || _a === void 0 ? void 0 : _a.includes('.required')) !== null && _b !== void 0 ? _b : false;
  8896. inputSignals.push(newInput);
  8897. }
  8898. else {
  8899. var regexpModel = /model(?:\.(required))?(?:<([\w-]+)>)?\(([\w-]+)?\)/;
  8900. var resModel = regexpModel.exec(prop.defaultValue);
  8901. if (resModel) {
  8902. var newInput = prop;
  8903. newInput.defaultValue = resModel[resModel.length - 1];
  8904. newInput.required = (_d = (_c = resModel[0]) === null || _c === void 0 ? void 0 : _c.includes('.required')) !== null && _d !== void 0 ? _d : false;
  8905. inputSignals.push(newInput);
  8906. }
  8907. }
  8908. });
  8909. return inputSignals;
  8910. };
  8911. ComponentHelper.prototype.getOutputSignals = function (props) {
  8912. var outputSignals = [];
  8913. props === null || props === void 0 ? void 0 : props.forEach(function (prop, i) {
  8914. var _a, _b;
  8915. var regexp = /output(?:\.(required))?(?:<([\w-]+)>)?\(([\w-]+)?\)/;
  8916. var res = regexp.exec(prop.defaultValue);
  8917. if (res) {
  8918. var newOutput = prop;
  8919. newOutput.defaultValue = res[res.length - 1];
  8920. newOutput.required = (_b = (_a = res[0]) === null || _a === void 0 ? void 0 : _a.includes('.required')) !== null && _b !== void 0 ? _b : false;
  8921. outputSignals.push(newOutput);
  8922. }
  8923. });
  8924. return outputSignals;
  8925. };
  8926. ComponentHelper.prototype.getComponentStandalone = function (props, srcFile) {
  8927. var result = null;
  8928. var parsedData = this.symbolHelper.getSymbolDeps(props, 'standalone', srcFile);
  8929. if (parsedData.length === 1) {
  8930. result = JSON.parse(parsedData[0]);
  8931. }
  8932. return result;
  8933. };
  8934. ComponentHelper.prototype.getComponentTemplate = function (props, srcFile) {
  8935. var t = this.symbolHelper.getSymbolDeps(props, 'template', srcFile, true).pop();
  8936. if (t) {
  8937. t = detectIndent(t);
  8938. t = t.replace(/\n/, '');
  8939. t = t.replace(/ +$/gm, '');
  8940. }
  8941. return t;
  8942. };
  8943. ComponentHelper.prototype.getComponentStyleUrls = function (props, srcFile) {
  8944. return this.symbolHelper.getSymbolDeps(props, 'styleUrls', srcFile);
  8945. };
  8946. ComponentHelper.prototype.getComponentStyleUrl = function (props, srcFile) {
  8947. return this.symbolHelper.getSymbolDeps(props, 'styleUrl', srcFile).pop();
  8948. };
  8949. ComponentHelper.prototype.getComponentShadow = function (props, srcFile) {
  8950. return this.symbolHelper.getSymbolDeps(props, 'shadow', srcFile).pop();
  8951. };
  8952. ComponentHelper.prototype.getComponentScoped = function (props, srcFile) {
  8953. return this.symbolHelper.getSymbolDeps(props, 'scoped', srcFile).pop();
  8954. };
  8955. ComponentHelper.prototype.getComponentAssetsDir = function (props, srcFile) {
  8956. return this.symbolHelper.getSymbolDeps(props, 'assetsDir', srcFile).pop();
  8957. };
  8958. ComponentHelper.prototype.getComponentAssetsDirs = function (props, srcFile) {
  8959. return this.sanitizeUrls(this.symbolHelper.getSymbolDeps(props, 'assetsDir', srcFile));
  8960. };
  8961. ComponentHelper.prototype.getComponentStyles = function (props, srcFile) {
  8962. return this.symbolHelper.getSymbolDeps(props, 'styles', srcFile);
  8963. };
  8964. ComponentHelper.prototype.getComponentModuleId = function (props, srcFile) {
  8965. return this.symbolHelper.getSymbolDeps(props, 'moduleId', srcFile).pop();
  8966. };
  8967. ComponentHelper.prototype.getComponentOutputs = function (props, srcFile) {
  8968. return this.symbolHelper.getSymbolDeps(props, 'outputs', srcFile);
  8969. };
  8970. ComponentHelper.prototype.getComponentProviders = function (props, srcFile) {
  8971. var _this = this;
  8972. return this.symbolHelper
  8973. .getSymbolDeps(props, 'providers', srcFile)
  8974. .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
  8975. };
  8976. ComponentHelper.prototype.getComponentImports = function (props, srcFile) {
  8977. var _this = this;
  8978. return this.symbolHelper
  8979. .getSymbolDeps(props, 'imports', srcFile)
  8980. .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
  8981. };
  8982. ComponentHelper.prototype.getComponentEntryComponents = function (props, srcFile) {
  8983. var _this = this;
  8984. return this.symbolHelper
  8985. .getSymbolDeps(props, 'entryComponents', srcFile)
  8986. .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
  8987. };
  8988. ComponentHelper.prototype.getComponentViewProviders = function (props, srcFile) {
  8989. var _this = this;
  8990. return this.symbolHelper
  8991. .getSymbolDeps(props, 'viewProviders', srcFile)
  8992. .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
  8993. };
  8994. ComponentHelper.prototype.getComponentTemplateUrl = function (props, srcFile) {
  8995. return this.symbolHelper.getSymbolDeps(props, 'templateUrl', srcFile);
  8996. };
  8997. ComponentHelper.prototype.getComponentExampleUrls = function (text) {
  8998. var exampleUrlsMatches = text.match(/<example-url>(.*?)<\/example-url>/g);
  8999. var exampleUrls = undefined;
  9000. if (exampleUrlsMatches && exampleUrlsMatches.length) {
  9001. exampleUrls = exampleUrlsMatches.map(function (val) {
  9002. return val.replace(/<\/?example-url>/g, '');
  9003. });
  9004. }
  9005. return exampleUrls;
  9006. };
  9007. ComponentHelper.prototype.getComponentPreserveWhitespaces = function (props, srcFile) {
  9008. return this.symbolHelper.getSymbolDeps(props, 'preserveWhitespaces', srcFile).pop();
  9009. };
  9010. ComponentHelper.prototype.getComponentSelector = function (props, srcFile) {
  9011. return this.symbolHelper.getSymbolDeps(props, 'selector', srcFile).pop();
  9012. };
  9013. ComponentHelper.prototype.parseProperties = function (node) {
  9014. var obj = new Map();
  9015. var properties = node.initializer.properties || [];
  9016. properties.forEach(function (prop) {
  9017. obj.set(prop.name.text, prop.initializer.text);
  9018. });
  9019. return obj;
  9020. };
  9021. ComponentHelper.prototype.getSymbolDepsObject = function (props, type, multiLine) {
  9022. var _this = this;
  9023. var i = 0, len = props.length, filteredProps = [];
  9024. for (i; i < len; i++) {
  9025. if (props[i].name && props[i].name.text === type) {
  9026. filteredProps.push(props[i]);
  9027. }
  9028. }
  9029. return filteredProps.map(function (x) { return _this.parseProperties(x); }).pop();
  9030. };
  9031. ComponentHelper.prototype.getComponentIO = function (filename, sourceFile, node, fileBody, astFile) {
  9032. var _this = this;
  9033. /**
  9034. * Copyright https://github.com/ng-bootstrap/ng-bootstrap
  9035. */
  9036. var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
  9037. var res = reducedSource.reduce(function (directive, statement) {
  9038. if (tsMorph.ts.isClassDeclaration(statement)) {
  9039. if (statement.pos === node.pos && statement.end === node.end) {
  9040. return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile, astFile));
  9041. }
  9042. }
  9043. return directive;
  9044. }, []);
  9045. return res[0] || {};
  9046. };
  9047. ComponentHelper.prototype.sanitizeUrls = function (urls) {
  9048. return urls.map(function (url) { return url.replace('./', ''); });
  9049. };
  9050. return ComponentHelper;
  9051. }());
  9052. var ComponentCache = /** @class */ (function () {
  9053. function ComponentCache() {
  9054. this.cache = new Map();
  9055. }
  9056. ComponentCache.prototype.get = function (key) {
  9057. return this.cache.get(key);
  9058. };
  9059. ComponentCache.prototype.set = function (key, value) {
  9060. this.cache.set(key, value);
  9061. };
  9062. return ComponentCache;
  9063. }());
  9064. var FrameworkDependencies = /** @class */ (function () {
  9065. function FrameworkDependencies(files, options) {
  9066. this.files = files;
  9067. var transpileOptions = {
  9068. target: tsMorph.ts.ScriptTarget.ES5,
  9069. module: tsMorph.ts.ModuleKind.CommonJS,
  9070. tsconfigDirectory: options.tsconfigDirectory,
  9071. allowJs: true
  9072. };
  9073. this.program = tsMorph.ts.createProgram(this.files, transpileOptions, compilerHost(transpileOptions));
  9074. this.typeChecker = this.program.getTypeChecker();
  9075. this.classHelper = new ClassHelper(this.typeChecker);
  9076. this.componentHelper = new ComponentHelper(this.classHelper);
  9077. }
  9078. return FrameworkDependencies;
  9079. }());
  9080. var CodeGenerator = /** @class */ (function () {
  9081. function CodeGenerator() {
  9082. }
  9083. CodeGenerator.prototype.generate = function (node) {
  9084. return this.visitAndRecognize(node, []).join('');
  9085. };
  9086. CodeGenerator.prototype.visitAndRecognize = function (node, code, depth) {
  9087. var _this = this;
  9088. if (depth === void 0) { depth = 0; }
  9089. this.recognize(node, code);
  9090. node.getChildren().forEach(function (c) { return _this.visitAndRecognize(c, code, depth + 1); });
  9091. return code;
  9092. };
  9093. CodeGenerator.prototype.recognize = function (node, code) {
  9094. var _this = this;
  9095. var conversion = TsKindConversion.find(function (x) { return x.kinds.some(function (z) { return z === node.kind; }); });
  9096. if (conversion) {
  9097. var result = conversion.output(node);
  9098. result.forEach(function (text) { return _this.gen(text, code); });
  9099. }
  9100. };
  9101. CodeGenerator.prototype.gen = function (token, code) {
  9102. if (!token) {
  9103. return;
  9104. }
  9105. if (token === '\n') {
  9106. code.push('');
  9107. }
  9108. else {
  9109. code.push(token);
  9110. }
  9111. };
  9112. return CodeGenerator;
  9113. }());
  9114. var TsKindsToText = /** @class */ (function () {
  9115. function TsKindsToText(output, kinds) {
  9116. this.output = output;
  9117. this.kinds = kinds;
  9118. }
  9119. return TsKindsToText;
  9120. }());
  9121. var TsKindConversion = [
  9122. new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [tsMorph.SyntaxKind.FirstLiteralToken, tsMorph.SyntaxKind.Identifier]),
  9123. new TsKindsToText(function (node) { return ['"', node.text, '"']; }, [tsMorph.SyntaxKind.StringLiteral]),
  9124. new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.ArrayLiteralExpression]),
  9125. new TsKindsToText(function (node) { return ['import', ' ']; }, [tsMorph.SyntaxKind.ImportKeyword]),
  9126. new TsKindsToText(function (node) { return ['from', ' ']; }, [tsMorph.SyntaxKind.FromKeyword]),
  9127. new TsKindsToText(function (node) { return ['\n', 'export', ' ']; }, [tsMorph.SyntaxKind.ExportKeyword]),
  9128. new TsKindsToText(function (node) { return ['class', ' ']; }, [tsMorph.SyntaxKind.ClassKeyword]),
  9129. new TsKindsToText(function (node) { return ['this']; }, [tsMorph.SyntaxKind.ThisKeyword]),
  9130. new TsKindsToText(function (node) { return ['constructor']; }, [tsMorph.SyntaxKind.ConstructorKeyword]),
  9131. new TsKindsToText(function (node) { return ['false']; }, [tsMorph.SyntaxKind.FalseKeyword]),
  9132. new TsKindsToText(function (node) { return ['true']; }, [tsMorph.SyntaxKind.TrueKeyword]),
  9133. new TsKindsToText(function (node) { return ['null']; }, [tsMorph.SyntaxKind.NullKeyword]),
  9134. new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.AtToken]),
  9135. new TsKindsToText(function (node) { return ['+']; }, [tsMorph.SyntaxKind.PlusToken]),
  9136. new TsKindsToText(function (node) { return [' => ']; }, [tsMorph.SyntaxKind.EqualsGreaterThanToken]),
  9137. new TsKindsToText(function (node) { return ['(']; }, [tsMorph.SyntaxKind.OpenParenToken]),
  9138. new TsKindsToText(function (node) { return ['{', ' ']; }, [tsMorph.SyntaxKind.ImportClause, tsMorph.SyntaxKind.ObjectLiteralExpression]),
  9139. new TsKindsToText(function (node) { return ['{', '\n']; }, [tsMorph.SyntaxKind.Block]),
  9140. new TsKindsToText(function (node) { return ['}']; }, [tsMorph.SyntaxKind.CloseBraceToken]),
  9141. new TsKindsToText(function (node) { return [')']; }, [tsMorph.SyntaxKind.CloseParenToken]),
  9142. new TsKindsToText(function (node) { return ['[']; }, [tsMorph.SyntaxKind.OpenBracketToken]),
  9143. new TsKindsToText(function (node) { return [']']; }, [tsMorph.SyntaxKind.CloseBracketToken]),
  9144. new TsKindsToText(function (node) { return [';', '\n']; }, [tsMorph.SyntaxKind.SemicolonToken]),
  9145. new TsKindsToText(function (node) { return [',', ' ']; }, [tsMorph.SyntaxKind.CommaToken]),
  9146. new TsKindsToText(function (node) { return [' ', ':', ' ']; }, [tsMorph.SyntaxKind.ColonToken]),
  9147. new TsKindsToText(function (node) { return ['.']; }, [tsMorph.SyntaxKind.DotToken]),
  9148. new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.DoStatement]),
  9149. new TsKindsToText(function (node) { return []; }, [tsMorph.SyntaxKind.Decorator]),
  9150. new TsKindsToText(function (node) { return [' = ']; }, [tsMorph.SyntaxKind.FirstAssignment]),
  9151. new TsKindsToText(function (node) { return [' ']; }, [tsMorph.SyntaxKind.FirstPunctuation]),
  9152. new TsKindsToText(function (node) { return ['private', ' ']; }, [tsMorph.SyntaxKind.PrivateKeyword]),
  9153. new TsKindsToText(function (node) { return ['public', ' ']; }, [tsMorph.SyntaxKind.PublicKeyword])
  9154. ];
  9155. var crypto$6 = require('crypto');
  9156. var ComponentDepFactory = /** @class */ (function () {
  9157. function ComponentDepFactory(helper) {
  9158. this.helper = helper;
  9159. }
  9160. ComponentDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
  9161. // console.log(util.inspect(props, { showHidden: true, depth: 10 }));
  9162. var sourceCode = srcFile.getText();
  9163. var hash = crypto$6.createHash('sha512').update(sourceCode).digest('hex');
  9164. var componentDep = {
  9165. name: name,
  9166. id: 'component-' + name + '-' + hash,
  9167. file: file,
  9168. // animations?: string[]; // TODO
  9169. changeDetection: this.helper.getComponentChangeDetection(props, srcFile),
  9170. encapsulation: this.helper.getComponentEncapsulation(props, srcFile),
  9171. entryComponents: this.helper.getComponentEntryComponents(props, srcFile),
  9172. exportAs: this.helper.getComponentExportAs(props, srcFile),
  9173. host: this.helper.getComponentHost(props),
  9174. inputs: this.helper.getComponentInputsMetadata(props, srcFile),
  9175. // interpolation?: string; // TODO waiting doc infos
  9176. moduleId: this.helper.getComponentModuleId(props, srcFile),
  9177. outputs: this.helper.getComponentOutputs(props, srcFile),
  9178. providers: this.helper.getComponentProviders(props, srcFile),
  9179. // queries?: Deps[]; // TODO
  9180. selector: this.helper.getComponentSelector(props, srcFile),
  9181. styleUrls: this.helper.getComponentStyleUrls(props, srcFile),
  9182. styles: this.helper.getComponentStyles(props, srcFile), // TODO fix args
  9183. template: this.helper.getComponentTemplate(props, srcFile),
  9184. templateUrl: this.helper.getComponentTemplateUrl(props, srcFile),
  9185. viewProviders: this.helper.getComponentViewProviders(props, srcFile),
  9186. hostDirectives: __spreadArray([], __read(this.helper.getComponentHostDirectives(props)), false),
  9187. inputsClass: IO.inputs,
  9188. outputsClass: IO.outputs,
  9189. propertiesClass: IO.properties,
  9190. methodsClass: IO.methods,
  9191. deprecated: IO.deprecated,
  9192. deprecationMessage: IO.deprecationMessage,
  9193. hostBindings: IO.hostBindings,
  9194. hostListeners: IO.hostListeners,
  9195. standalone: this.helper.getComponentStandalone(props, srcFile) ? true : false,
  9196. imports: this.helper.getComponentImports(props, srcFile),
  9197. description: IO.description,
  9198. rawdescription: IO.rawdescription,
  9199. type: 'component',
  9200. sourceCode: srcFile.getText(),
  9201. exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText()),
  9202. tag: this.helper.getComponentTag(props, srcFile),
  9203. styleUrl: this.helper.getComponentStyleUrl(props, srcFile),
  9204. shadow: this.helper.getComponentShadow(props, srcFile),
  9205. scoped: this.helper.getComponentScoped(props, srcFile),
  9206. assetsDir: this.helper.getComponentAssetsDir(props, srcFile),
  9207. assetsDirs: this.helper.getComponentAssetsDirs(props, srcFile),
  9208. styleUrlsData: '',
  9209. stylesData: ''
  9210. };
  9211. if (typeof this.helper.getComponentPreserveWhitespaces(props, srcFile) !== 'undefined') {
  9212. componentDep.preserveWhitespaces = this.helper.getComponentPreserveWhitespaces(props, srcFile);
  9213. }
  9214. if (Configuration$1.mainData.disableLifeCycleHooks) {
  9215. componentDep.methodsClass = cleanLifecycleHooksFromMethods(componentDep.methodsClass);
  9216. }
  9217. if (IO.jsdoctags && IO.jsdoctags.length > 0) {
  9218. componentDep.jsdoctags = IO.jsdoctags[0].tags;
  9219. }
  9220. if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
  9221. componentDep.constructorObj = IO.constructor;
  9222. }
  9223. if (IO.extends) {
  9224. componentDep.extends = IO.extends;
  9225. }
  9226. if (IO.implements && IO.implements.length > 0) {
  9227. componentDep.implements = IO.implements;
  9228. }
  9229. if (IO.accessors) {
  9230. componentDep.accessors = IO.accessors;
  9231. }
  9232. if (IO.properties) {
  9233. componentDep.inputsClass = componentDep.inputsClass.concat(this.helper.getInputSignals(IO.properties));
  9234. componentDep.outputsClass = componentDep.outputsClass.concat(this.helper.getOutputSignals(IO.properties));
  9235. }
  9236. return componentDep;
  9237. };
  9238. return ComponentDepFactory;
  9239. }());
  9240. var crypto$5 = require('crypto');
  9241. var ControllerDepFactory = /** @class */ (function () {
  9242. function ControllerDepFactory() {
  9243. }
  9244. ControllerDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
  9245. var sourceCode = srcFile.getText();
  9246. var hash = crypto$5.createHash('sha512').update(sourceCode).digest('hex');
  9247. var infos = {
  9248. name: name,
  9249. id: 'controller-' + name + '-' + hash,
  9250. file: file,
  9251. methodsClass: IO.methods,
  9252. type: 'controller',
  9253. description: IO.description,
  9254. rawdescription: IO.rawdescription,
  9255. sourceCode: srcFile.text,
  9256. deprecated: IO.deprecated,
  9257. deprecationMessage: IO.deprecationMessage
  9258. };
  9259. if (properties && properties.length === 1) {
  9260. if (properties[0].text) {
  9261. infos.prefix = properties[0].text;
  9262. }
  9263. }
  9264. if (IO.extends) {
  9265. infos.extends = IO.extends;
  9266. }
  9267. return infos;
  9268. };
  9269. return ControllerDepFactory;
  9270. }());
  9271. var crypto$4 = require('crypto');
  9272. var DirectiveDepFactory = /** @class */ (function () {
  9273. function DirectiveDepFactory(helper) {
  9274. this.helper = helper;
  9275. }
  9276. DirectiveDepFactory.prototype.create = function (file, srcFile, name, props, IO) {
  9277. var sourceCode = srcFile.getText();
  9278. var hash = crypto$4.createHash('sha512').update(sourceCode).digest('hex');
  9279. var directiveDeps = {
  9280. name: name,
  9281. id: 'directive-' + name + '-' + hash,
  9282. file: file,
  9283. type: 'directive',
  9284. description: IO.description,
  9285. rawdescription: IO.rawdescription,
  9286. sourceCode: srcFile.getText(),
  9287. selector: this.helper.getComponentSelector(props, srcFile),
  9288. providers: this.helper.getComponentProviders(props, srcFile),
  9289. exportAs: this.helper.getComponentExportAs(props, srcFile),
  9290. hostDirectives: __spreadArray([], __read(this.helper.getComponentHostDirectives(props)), false),
  9291. standalone: this.helper.getComponentStandalone(props, srcFile) ? true : false,
  9292. inputsClass: this.helper.getInputSignals(IO.properties).concat(IO.inputs),
  9293. outputsClass: this.helper.getInputSignals(IO.properties).concat(IO.outputs),
  9294. deprecated: IO.deprecated,
  9295. deprecationMessage: IO.deprecationMessage,
  9296. hostBindings: IO.hostBindings,
  9297. hostListeners: IO.hostListeners,
  9298. propertiesClass: IO.properties,
  9299. methodsClass: IO.methods,
  9300. exampleUrls: this.helper.getComponentExampleUrls(srcFile.getText())
  9301. };
  9302. if (Configuration$1.mainData.disableLifeCycleHooks) {
  9303. directiveDeps.methodsClass = cleanLifecycleHooksFromMethods(directiveDeps.methodsClass);
  9304. }
  9305. if (IO.jsdoctags && IO.jsdoctags.length > 0) {
  9306. directiveDeps.jsdoctags = IO.jsdoctags[0].tags;
  9307. }
  9308. if (IO.extends) {
  9309. directiveDeps.extends = IO.extends;
  9310. }
  9311. if (IO.implements && IO.implements.length > 0) {
  9312. directiveDeps.implements = IO.implements;
  9313. }
  9314. if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
  9315. directiveDeps.constructorObj = IO.constructor;
  9316. }
  9317. if (IO.accessors) {
  9318. directiveDeps.accessors = IO.accessors;
  9319. }
  9320. return directiveDeps;
  9321. };
  9322. return DirectiveDepFactory;
  9323. }());
  9324. var JsDocHelper = /** @class */ (function () {
  9325. function JsDocHelper() {
  9326. }
  9327. JsDocHelper.prototype.hasJSDocInternalTag = function (filename, sourceFile, node) {
  9328. if (typeof sourceFile.statements !== 'undefined') {
  9329. return this.checkStatements(sourceFile.statements, node);
  9330. }
  9331. return false;
  9332. };
  9333. JsDocHelper.prototype.checkStatements = function (statements, node) {
  9334. var _this = this;
  9335. return statements.some(function (x) { return _this.checkStatement(x, node); });
  9336. };
  9337. JsDocHelper.prototype.checkStatement = function (statement, node) {
  9338. if (statement.pos === node.pos && statement.end === node.end) {
  9339. if (node.jsDoc && node.jsDoc.length > 0) {
  9340. return this.checkJsDocs(node.jsDoc);
  9341. }
  9342. }
  9343. return false;
  9344. };
  9345. JsDocHelper.prototype.checkJsDocs = function (jsDocs) {
  9346. var _this = this;
  9347. return jsDocs
  9348. .filter(function (x) { return x.tags && x.tags.length > 0; })
  9349. .some(function (x) { return _this.checkJsDocTags(x.tags); });
  9350. };
  9351. JsDocHelper.prototype.checkJsDocTags = function (tags) {
  9352. return tags.some(function (x) { return x.tagName && x.tagName.text === 'internal'; });
  9353. };
  9354. return JsDocHelper;
  9355. }());
  9356. var ModuleHelper = /** @class */ (function () {
  9357. function ModuleHelper(cache, symbolHelper) {
  9358. if (symbolHelper === void 0) { symbolHelper = new SymbolHelper(); }
  9359. this.cache = cache;
  9360. this.symbolHelper = symbolHelper;
  9361. }
  9362. ModuleHelper.prototype.getModuleProviders = function (props, srcFile) {
  9363. var _this = this;
  9364. return this.symbolHelper
  9365. .getSymbolDeps(props, 'providers', srcFile)
  9366. .map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
  9367. };
  9368. ModuleHelper.prototype.getModuleControllers = function (props, srcFile) {
  9369. var _this = this;
  9370. return this.symbolHelper
  9371. .getSymbolDeps(props, 'controllers', srcFile)
  9372. .map(function (providerName) { return _this.symbolHelper.parseDeepIndentifier(providerName, srcFile); });
  9373. };
  9374. ModuleHelper.prototype.getModuleDeclarations = function (props, srcFile) {
  9375. var _this = this;
  9376. return this.symbolHelper.getSymbolDeps(props, 'declarations', srcFile).map(function (name) {
  9377. var component = _this.cache.get(name);
  9378. if (component) {
  9379. return component;
  9380. }
  9381. return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
  9382. });
  9383. };
  9384. ModuleHelper.prototype.getModuleEntryComponents = function (props, srcFile) {
  9385. var _this = this;
  9386. return this.symbolHelper.getSymbolDeps(props, 'entryComponents', srcFile).map(function (name) {
  9387. var component = _this.cache.get(name);
  9388. if (component) {
  9389. return component;
  9390. }
  9391. return _this.symbolHelper.parseDeepIndentifier(name, srcFile);
  9392. });
  9393. };
  9394. ModuleHelper.prototype.cleanImportForRootForChild = function (name) {
  9395. var nsModule = name.split('.');
  9396. if (nsModule.length > 0) {
  9397. name = nsModule[0];
  9398. }
  9399. return name;
  9400. };
  9401. ModuleHelper.prototype.getModuleImports = function (props, srcFile) {
  9402. var _this = this;
  9403. return this.symbolHelper
  9404. .getSymbolDeps(props, 'imports', srcFile)
  9405. .map(function (name) { return _this.cleanImportForRootForChild(name); })
  9406. .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name); });
  9407. };
  9408. ModuleHelper.prototype.getModuleExports = function (props, srcFile) {
  9409. var _this = this;
  9410. return this.symbolHelper
  9411. .getSymbolDeps(props, 'exports', srcFile)
  9412. .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
  9413. };
  9414. ModuleHelper.prototype.getModuleImportsRaw = function (props, srcFile) {
  9415. return this.symbolHelper.getSymbolDepsRaw(props, 'imports');
  9416. };
  9417. ModuleHelper.prototype.getModuleId = function (props, srcFile) {
  9418. var _id = this.symbolHelper.getSymbolDeps(props, 'id', srcFile), id;
  9419. if (_id.length === 1) {
  9420. id = _id[0];
  9421. }
  9422. return id;
  9423. };
  9424. ModuleHelper.prototype.getModuleSchemas = function (props, srcFile) {
  9425. var schemas = this.symbolHelper.getSymbolDeps(props, 'schemas', srcFile);
  9426. return schemas;
  9427. };
  9428. ModuleHelper.prototype.getModuleBootstrap = function (props, srcFile) {
  9429. var _this = this;
  9430. return this.symbolHelper
  9431. .getSymbolDeps(props, 'bootstrap', srcFile)
  9432. .map(function (name) { return _this.symbolHelper.parseDeepIndentifier(name, srcFile); });
  9433. };
  9434. return ModuleHelper;
  9435. }());
  9436. var crypto$3 = require('crypto');
  9437. var ModuleDepFactory = /** @class */ (function () {
  9438. function ModuleDepFactory(moduleHelper) {
  9439. this.moduleHelper = moduleHelper;
  9440. }
  9441. ModuleDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
  9442. var sourceCode = srcFile.getText();
  9443. var hash = crypto$3.createHash('sha512').update(sourceCode).digest('hex');
  9444. return {
  9445. name: name,
  9446. id: 'module-' + name + '-' + hash,
  9447. file: file,
  9448. ngid: this.moduleHelper.getModuleId(properties, srcFile),
  9449. providers: this.moduleHelper.getModuleProviders(properties, srcFile),
  9450. declarations: this.moduleHelper.getModuleDeclarations(properties, srcFile),
  9451. controllers: this.moduleHelper.getModuleControllers(properties, srcFile),
  9452. entryComponents: this.moduleHelper.getModuleEntryComponents(properties, srcFile),
  9453. imports: this.moduleHelper.getModuleImports(properties, srcFile),
  9454. exports: this.moduleHelper.getModuleExports(properties, srcFile),
  9455. schemas: this.moduleHelper.getModuleSchemas(properties, srcFile),
  9456. bootstrap: this.moduleHelper.getModuleBootstrap(properties, srcFile),
  9457. type: 'module',
  9458. rawdescription: IO.rawdescription,
  9459. methods: IO.methods,
  9460. description: IO.description,
  9461. sourceCode: srcFile.text,
  9462. deprecated: IO.deprecated,
  9463. deprecationMessage: IO.deprecationMessage
  9464. };
  9465. };
  9466. return ModuleDepFactory;
  9467. }());
  9468. var crypto$2 = require('crypto');
  9469. var EntityDepFactory = /** @class */ (function () {
  9470. function EntityDepFactory() {
  9471. }
  9472. EntityDepFactory.prototype.create = function (file, srcFile, name, properties, IO) {
  9473. var sourceCode = srcFile.getText();
  9474. var hash = crypto$2.createHash('sha512').update(sourceCode).digest('hex');
  9475. var infos = {
  9476. name: name,
  9477. id: 'controller-' + name + '-' + hash,
  9478. file: file,
  9479. type: 'entity',
  9480. description: IO.description,
  9481. rawdescription: IO.rawdescription,
  9482. sourceCode: srcFile.text,
  9483. deprecated: IO.deprecated,
  9484. deprecationMessage: IO.deprecationMessage,
  9485. properties: IO.properties
  9486. };
  9487. return infos;
  9488. };
  9489. return EntityDepFactory;
  9490. }());
  9491. var crypto$1 = require('crypto');
  9492. var project = new tsMorph.Project();
  9493. // TypeScript reference : https://github.com/Microsoft/TypeScript/blob/master/lib/typescript.d.ts
  9494. var AngularDependencies = /** @class */ (function (_super) {
  9495. __extends(AngularDependencies, _super);
  9496. function AngularDependencies(files, options) {
  9497. var _this = _super.call(this, files, options) || this;
  9498. _this.cache = new ComponentCache();
  9499. _this.moduleHelper = new ModuleHelper(_this.cache);
  9500. _this.jsDocHelper = new JsDocHelper();
  9501. _this.symbolHelper = new SymbolHelper();
  9502. _this.jsdocParserUtil = new JsdocParserUtil();
  9503. return _this;
  9504. }
  9505. AngularDependencies.prototype.getDependencies = function () {
  9506. var _this = this;
  9507. var deps = {
  9508. aliases: {},
  9509. modules: [],
  9510. modulesForGraph: [],
  9511. components: [],
  9512. controllers: [],
  9513. entities: [],
  9514. injectables: [],
  9515. interceptors: [],
  9516. guards: [],
  9517. pipes: [],
  9518. directives: [],
  9519. routes: [],
  9520. classes: [],
  9521. interfaces: [],
  9522. typescriptImports: [],
  9523. miscellaneous: {
  9524. variables: [],
  9525. functions: [],
  9526. typealiases: [],
  9527. enumerations: []
  9528. },
  9529. routesTree: undefined
  9530. };
  9531. var sourceFiles = this.program.getSourceFiles() || [];
  9532. RouterParserUtil$1.scannedFiles = sourceFiles;
  9533. sourceFiles.map(function (file) {
  9534. var filePath = file.fileName;
  9535. if (path__namespace.extname(filePath) === '.ts' || path__namespace.extname(filePath) === '.tsx') {
  9536. if (!Configuration$1.mainData.angularJSProject && path__namespace.extname(filePath) === '.js') {
  9537. logger.info('parsing', filePath);
  9538. _this.getSourceFileDecorators(file, deps);
  9539. }
  9540. else {
  9541. if (filePath.lastIndexOf('.d.ts') === -1 &&
  9542. filePath.lastIndexOf('spec.ts') === -1) {
  9543. logger.info('parsing', filePath);
  9544. _this.getTypescriptExportsAliases(file, deps);
  9545. _this.getTypescriptImportsAliases(file, deps);
  9546. _this.getSourceFileDecorators(file, deps);
  9547. }
  9548. }
  9549. }
  9550. return deps;
  9551. });
  9552. // End of file scanning
  9553. // Try merging inside the same file declarated variables & modules with imports | exports | declarations | providers
  9554. if (deps.miscellaneous.variables.length > 0) {
  9555. deps.miscellaneous.variables.forEach(function (_variable) {
  9556. var newVar = [];
  9557. // link ...VAR to VAR values, recursively
  9558. (function (_var, _newVar) {
  9559. // getType pr reconstruire....
  9560. var elementsMatcher = function (variabelToReplace) {
  9561. if (variabelToReplace.initializer) {
  9562. if (variabelToReplace.initializer.elements) {
  9563. if (variabelToReplace.initializer.elements.length > 0) {
  9564. variabelToReplace.initializer.elements.forEach(function (element) {
  9565. // Direct value -> Kind 79
  9566. if (element.text &&
  9567. element.kind === tsMorph.SyntaxKind.Identifier) {
  9568. newVar.push({
  9569. name: element.text,
  9570. type: _this.symbolHelper.getType(element.text)
  9571. });
  9572. }
  9573. // if _variable is ArrayLiteralExpression 203
  9574. // and has SpreadElements in his elements
  9575. // merge them
  9576. if (element.kind === tsMorph.SyntaxKind.SpreadElement &&
  9577. element.expression) {
  9578. var el = deps.miscellaneous.variables.find(function (variable) {
  9579. return variable.name === element.expression.text;
  9580. });
  9581. if (el) {
  9582. elementsMatcher(el);
  9583. }
  9584. }
  9585. });
  9586. }
  9587. }
  9588. }
  9589. };
  9590. elementsMatcher(_var);
  9591. })(_variable);
  9592. var onLink = function (mod) {
  9593. var process = function (initialArray, _var) {
  9594. var indexToClean = 0;
  9595. var found = false;
  9596. var findVariableInArray = function (el, index) {
  9597. if (el.name === _var.name) {
  9598. indexToClean = index;
  9599. found = true;
  9600. }
  9601. };
  9602. initialArray.forEach(findVariableInArray);
  9603. // Clean indexes to replace
  9604. if (found) {
  9605. initialArray.splice(indexToClean, 1);
  9606. // Add variable
  9607. newVar.forEach(function (newEle) {
  9608. if (typeof ___namespace.find(initialArray, { name: newEle.name }) ===
  9609. 'undefined') {
  9610. initialArray.push(newEle);
  9611. }
  9612. });
  9613. }
  9614. };
  9615. process(mod.imports, _variable);
  9616. process(mod.exports, _variable);
  9617. process(mod.controllers, _variable);
  9618. process(mod.declarations, _variable);
  9619. process(mod.providers, _variable);
  9620. };
  9621. deps.modules.forEach(onLink);
  9622. deps.modulesForGraph.forEach(onLink);
  9623. });
  9624. }
  9625. /**
  9626. * If one thing extends another, merge them, only for internal sources
  9627. * - classes
  9628. * - components
  9629. * - injectables
  9630. * - directives
  9631. * for
  9632. * - inputs
  9633. * - outputs
  9634. * - properties
  9635. * - methods
  9636. */
  9637. deps = ExtendsMerger$1.merge(deps);
  9638. // RouterParserUtil.printModulesRoutes();
  9639. // RouterParserUtil.printRoutes();
  9640. if (!Configuration$1.mainData.disableRoutesGraph) {
  9641. RouterParserUtil$1.linkModulesAndRoutes();
  9642. RouterParserUtil$1.constructModulesTree();
  9643. deps.routesTree = RouterParserUtil$1.constructRoutesTree();
  9644. }
  9645. return deps;
  9646. };
  9647. AngularDependencies.prototype.processClass = function (node, file, srcFile, outputSymbols, fileBody, astFile) {
  9648. var name = this.getSymboleName(node);
  9649. var IO = this.getClassIO(file, srcFile, node, fileBody, astFile);
  9650. var sourceCode = srcFile.getText();
  9651. var hash = crypto$1.createHash('sha512').update(sourceCode).digest('hex');
  9652. var deps = {
  9653. name: name,
  9654. id: 'class-' + name + '-' + hash,
  9655. file: file,
  9656. deprecated: IO.deprecated,
  9657. deprecationMessage: IO.deprecationMessage,
  9658. type: 'class',
  9659. sourceCode: srcFile.getText()
  9660. };
  9661. var excludeFromClassArray = false;
  9662. if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
  9663. deps.constructorObj = IO.constructor;
  9664. }
  9665. if (IO.inputs) {
  9666. deps.inputsClass = IO.inputs;
  9667. }
  9668. if (IO.outputs) {
  9669. deps.outputsClass = IO.outputs;
  9670. }
  9671. if (IO.properties) {
  9672. deps.properties = IO.properties;
  9673. deps.inputsClass = deps.inputsClass
  9674. ? deps.inputsClass.concat(this.componentHelper.getInputSignals(IO.properties))
  9675. : this.componentHelper.getInputSignals(IO.properties);
  9676. deps.outputsClass = deps.outputsClass
  9677. ? deps.outputsClass.concat(this.componentHelper.getOutputSignals(IO.properties))
  9678. : this.componentHelper.getOutputSignals(IO.properties);
  9679. }
  9680. if (IO.description) {
  9681. deps.description = IO.description;
  9682. }
  9683. if (IO.rawdescription) {
  9684. deps.rawdescription = IO.rawdescription;
  9685. }
  9686. if (IO.methods) {
  9687. deps.methods = IO.methods;
  9688. }
  9689. if (IO.indexSignatures) {
  9690. deps.indexSignatures = IO.indexSignatures;
  9691. }
  9692. if (IO.extends) {
  9693. deps.extends = IO.extends;
  9694. }
  9695. if (IO.jsdoctags && IO.jsdoctags.length > 0) {
  9696. deps.jsdoctags = IO.jsdoctags[0].tags;
  9697. }
  9698. if (IO.accessors) {
  9699. deps.accessors = IO.accessors;
  9700. }
  9701. if (IO.hostBindings) {
  9702. deps.hostBindings = IO.hostBindings;
  9703. }
  9704. if (IO.hostListeners) {
  9705. deps.hostListeners = IO.hostListeners;
  9706. }
  9707. if (Configuration$1.mainData.disableLifeCycleHooks) {
  9708. deps.methods = cleanLifecycleHooksFromMethods(deps.methods);
  9709. }
  9710. if (IO.implements && IO.implements.length > 0) {
  9711. deps.implements = IO.implements;
  9712. if (this.isGuard(IO.implements)) {
  9713. // We don't want the Guard to show up in the Classes menu
  9714. excludeFromClassArray = true;
  9715. deps.type = 'guard';
  9716. outputSymbols.guards.push(deps);
  9717. }
  9718. }
  9719. if (typeof IO.ignore === 'undefined') {
  9720. this.debug(deps);
  9721. if (!excludeFromClassArray) {
  9722. outputSymbols.classes.push(deps);
  9723. }
  9724. }
  9725. else {
  9726. this.ignore(deps);
  9727. }
  9728. };
  9729. AngularDependencies.prototype.getTypescriptImportsAliases = function (initialSrcFile, outputSymbols) {
  9730. var astFile = typeof project.getSourceFile(initialSrcFile.fileName) !== 'undefined'
  9731. ? project.getSourceFile(initialSrcFile.fileName)
  9732. : project.addSourceFileAtPath(initialSrcFile.fileName);
  9733. if (astFile) {
  9734. var importDeclarations = astFile.getImportDeclarations();
  9735. if (importDeclarations && importDeclarations.length > 0) {
  9736. importDeclarations.forEach(function (importDeclaration) {
  9737. var namedImports = importDeclaration.getNamedImports();
  9738. if (namedImports && namedImports.length > 0) {
  9739. namedImports.forEach(function (namedImport) {
  9740. if (namedImport.getAliasNode()) {
  9741. if (outputSymbols.aliases.hasOwnProperty(namedImport.getName())) {
  9742. outputSymbols.aliases[namedImport.getName()].push(namedImport.getAliasNode().getText());
  9743. }
  9744. else {
  9745. outputSymbols.aliases[namedImport.getName()] = [
  9746. namedImport.getAliasNode().getText()
  9747. ];
  9748. }
  9749. }
  9750. });
  9751. }
  9752. });
  9753. }
  9754. }
  9755. };
  9756. AngularDependencies.prototype.getTypescriptExportsAliases = function (initialSrcFile, outputSymbols) {
  9757. var astFile = typeof project.getSourceFile(initialSrcFile.fileName) !== 'undefined'
  9758. ? project.getSourceFile(initialSrcFile.fileName)
  9759. : project.addSourceFileAtPath(initialSrcFile.fileName);
  9760. if (astFile) {
  9761. var exportDeclarations = astFile.getExportDeclarations();
  9762. if (exportDeclarations && exportDeclarations.length > 0) {
  9763. exportDeclarations.forEach(function (exportDeclaration) {
  9764. var hasNamedExports = exportDeclaration.hasNamedExports();
  9765. if (hasNamedExports) {
  9766. var namedExports = exportDeclaration.getNamedExports();
  9767. if (namedExports && namedExports.length > 0) {
  9768. namedExports.forEach(function (namedExport) {
  9769. if (namedExport.getAliasNode()) {
  9770. if (outputSymbols.aliases.hasOwnProperty(namedExport.getName())) {
  9771. outputSymbols.aliases[namedExport.getName()].push(namedExport.getAliasNode().getText());
  9772. }
  9773. else {
  9774. outputSymbols.aliases[namedExport.getName()] = [
  9775. namedExport.getAliasNode().getText()
  9776. ];
  9777. }
  9778. }
  9779. });
  9780. }
  9781. }
  9782. });
  9783. }
  9784. }
  9785. };
  9786. AngularDependencies.prototype.getSourceFileDecorators = function (initialSrcFile, outputSymbols) {
  9787. var _this = this;
  9788. var cleaner = (process.cwd() + path__namespace.sep).replace(/\\/g, '/');
  9789. var fileName = initialSrcFile.fileName.replace(cleaner, '');
  9790. var scannedFile = initialSrcFile;
  9791. // Search in file for variable statement as routes definitions
  9792. var astFile = typeof project.getSourceFile(initialSrcFile.fileName) !== 'undefined'
  9793. ? project.getSourceFile(initialSrcFile.fileName)
  9794. : project.addSourceFileAtPath(initialSrcFile.fileName);
  9795. var variableRoutesStatements = astFile.getVariableStatements();
  9796. var hasRoutesStatements = false;
  9797. if (variableRoutesStatements.length > 0) {
  9798. // Clean file for spread and dynamics inside routes definitions
  9799. variableRoutesStatements.forEach(function (s) {
  9800. var variableDeclarations = s.getDeclarations();
  9801. var len = variableDeclarations.length;
  9802. var i = 0;
  9803. for (i; i < len; i++) {
  9804. if (variableDeclarations[i].compilerNode.type) {
  9805. if (variableDeclarations[i].compilerNode.type.typeName &&
  9806. variableDeclarations[i].compilerNode.type.typeName.text === 'Routes') {
  9807. hasRoutesStatements = true;
  9808. }
  9809. }
  9810. }
  9811. });
  9812. }
  9813. if (hasRoutesStatements && !Configuration$1.mainData.disableRoutesGraph) {
  9814. // Clean file for spread and dynamics inside routes definitions
  9815. logger.info('Analysing routes definitions and clean them if necessary');
  9816. // scannedFile = RouterParserUtil.cleanFileIdentifiers(astFile).compilerNode;
  9817. RouterParserUtil$1.cleanFileSpreads(astFile);
  9818. scannedFile = RouterParserUtil$1.cleanCallExpressions(astFile).compilerNode;
  9819. scannedFile = RouterParserUtil$1.cleanFileDynamics(astFile).compilerNode;
  9820. scannedFile.kind = tsMorph.SyntaxKind.SourceFile;
  9821. }
  9822. tsMorph.ts.forEachChild(scannedFile, function (initialNode) {
  9823. if (_this.jsDocHelper.hasJSDocInternalTag(fileName, scannedFile, initialNode) &&
  9824. Configuration$1.mainData.disableInternal) {
  9825. return;
  9826. }
  9827. var parseNode = function (file, srcFile, node, fileBody, astFile) {
  9828. var sourceCode = srcFile.getText();
  9829. var hash = crypto$1.createHash('sha512').update(sourceCode).digest('hex');
  9830. if (nodeHasDecorator(node)) {
  9831. var classWithCustomDecorator_1 = false;
  9832. var nodeDecorators_1 = getNodeDecorators(node);
  9833. var visitDecorator = function (visitedDecorator, index) {
  9834. var deps;
  9835. var name = _this.getSymboleName(node);
  9836. var props = _this.findProperties(visitedDecorator, srcFile);
  9837. var IO = _this.componentHelper.getComponentIO(file, srcFile, node, fileBody, astFile);
  9838. if (_this.isModule(visitedDecorator)) {
  9839. var moduleDep = new ModuleDepFactory(_this.moduleHelper).create(file, srcFile, name, props, IO);
  9840. if (RouterParserUtil$1.hasRouterModuleInImports(moduleDep.imports)) {
  9841. RouterParserUtil$1.addModuleWithRoutes(name, _this.moduleHelper.getModuleImportsRaw(props, srcFile), file);
  9842. }
  9843. deps = moduleDep;
  9844. if (typeof IO.ignore === 'undefined') {
  9845. RouterParserUtil$1.addModule(name, moduleDep.imports);
  9846. outputSymbols.modules.push(moduleDep);
  9847. outputSymbols.modulesForGraph.push(moduleDep);
  9848. }
  9849. }
  9850. else if (_this.isComponent(visitedDecorator)) {
  9851. if (props.length === 0) {
  9852. return;
  9853. }
  9854. var componentDep = new ComponentDepFactory(_this.componentHelper).create(file, srcFile, name, props, IO);
  9855. deps = componentDep;
  9856. if (typeof IO.ignore === 'undefined') {
  9857. ComponentsTreeEngine$1.addComponent(componentDep);
  9858. outputSymbols.components.push(componentDep);
  9859. }
  9860. }
  9861. else if (_this.isController(visitedDecorator)) {
  9862. var controllerDep = new ControllerDepFactory().create(file, srcFile, name, props, IO);
  9863. deps = controllerDep;
  9864. if (typeof IO.ignore === 'undefined') {
  9865. outputSymbols.controllers.push(controllerDep);
  9866. }
  9867. }
  9868. else if (_this.isEntity(visitedDecorator)) {
  9869. var entityDep = new EntityDepFactory().create(file, srcFile, name, props, IO);
  9870. deps = entityDep;
  9871. if (typeof IO.ignore === 'undefined') {
  9872. outputSymbols.entities.push(entityDep);
  9873. }
  9874. }
  9875. else if (_this.isInjectable(visitedDecorator)) {
  9876. var injectableDeps = {
  9877. name: name,
  9878. id: 'injectable-' + name + '-' + hash,
  9879. file: file,
  9880. properties: IO.properties,
  9881. methods: IO.methods,
  9882. deprecated: IO.deprecated,
  9883. deprecationMessage: IO.deprecationMessage,
  9884. description: IO.description,
  9885. rawdescription: IO.rawdescription,
  9886. sourceCode: srcFile.getText(),
  9887. exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
  9888. };
  9889. if (IO.constructor && !Configuration$1.mainData.disableConstructors) {
  9890. injectableDeps.constructorObj = IO.constructor;
  9891. }
  9892. if (IO.jsdoctags && IO.jsdoctags.length > 0) {
  9893. injectableDeps.jsdoctags = IO.jsdoctags[0].tags;
  9894. }
  9895. if (IO.accessors) {
  9896. injectableDeps.accessors = IO.accessors;
  9897. }
  9898. if (IO.extends) {
  9899. injectableDeps.extends = IO.extends;
  9900. }
  9901. if (Configuration$1.mainData.disableLifeCycleHooks) {
  9902. injectableDeps.methods = cleanLifecycleHooksFromMethods(injectableDeps.methods);
  9903. }
  9904. deps = injectableDeps;
  9905. if (typeof IO.ignore === 'undefined') {
  9906. if (___namespace.includes(IO.implements, 'HttpInterceptor')) {
  9907. injectableDeps.type = 'interceptor';
  9908. outputSymbols.interceptors.push(injectableDeps);
  9909. }
  9910. else if (_this.isGuard(IO.implements)) {
  9911. injectableDeps.type = 'guard';
  9912. outputSymbols.guards.push(injectableDeps);
  9913. }
  9914. else {
  9915. injectableDeps.type = 'injectable';
  9916. _this.addNewEntityInStore(injectableDeps, outputSymbols.injectables);
  9917. }
  9918. }
  9919. }
  9920. else if (_this.isPipe(visitedDecorator)) {
  9921. var pipeDeps = {
  9922. name: name,
  9923. id: 'pipe-' + name + '-' + hash,
  9924. file: file,
  9925. type: 'pipe',
  9926. deprecated: IO.deprecated,
  9927. deprecationMessage: IO.deprecationMessage,
  9928. description: IO.description,
  9929. rawdescription: IO.rawdescription,
  9930. properties: IO.properties,
  9931. methods: IO.methods,
  9932. standalone: _this.componentHelper.getComponentStandalone(props, srcFile)
  9933. ? true
  9934. : false,
  9935. pure: _this.componentHelper.getComponentPure(props, srcFile),
  9936. ngname: _this.componentHelper.getComponentName(props, srcFile),
  9937. sourceCode: srcFile.getText(),
  9938. exampleUrls: _this.componentHelper.getComponentExampleUrls(srcFile.getText())
  9939. };
  9940. if (Configuration$1.mainData.disableLifeCycleHooks) {
  9941. pipeDeps.methods = cleanLifecycleHooksFromMethods(pipeDeps.methods);
  9942. }
  9943. if (IO.jsdoctags && IO.jsdoctags.length > 0) {
  9944. pipeDeps.jsdoctags = IO.jsdoctags[0].tags;
  9945. }
  9946. deps = pipeDeps;
  9947. if (typeof IO.ignore === 'undefined') {
  9948. outputSymbols.pipes.push(pipeDeps);
  9949. }
  9950. }
  9951. else if (_this.isDirective(visitedDecorator)) {
  9952. var directiveDeps = new DirectiveDepFactory(_this.componentHelper).create(file, srcFile, name, props, IO);
  9953. deps = directiveDeps;
  9954. if (typeof IO.ignore === 'undefined') {
  9955. outputSymbols.directives.push(directiveDeps);
  9956. }
  9957. }
  9958. else {
  9959. var hasMultipleDecoratorsWithInternalOne = _this.hasInternalDecorator(nodeDecorators_1);
  9960. // Just a class
  9961. if (!classWithCustomDecorator_1 &&
  9962. !hasMultipleDecoratorsWithInternalOne) {
  9963. classWithCustomDecorator_1 = true;
  9964. _this.processClass(node, file, srcFile, outputSymbols, fileBody);
  9965. }
  9966. }
  9967. _this.cache.set(name, deps);
  9968. if (typeof IO.ignore === 'undefined') {
  9969. _this.debug(deps);
  9970. }
  9971. else {
  9972. _this.ignore(deps);
  9973. }
  9974. };
  9975. var filterByDecorators = function (filteredNode) {
  9976. if (filteredNode.expression && filteredNode.expression.expression) {
  9977. var _test = /(NgModule|Component|Injectable|Pipe|Directive)/.test(filteredNode.expression.expression.text);
  9978. if (!_test && tsMorph.ts.isClassDeclaration(node)) {
  9979. _test = true;
  9980. }
  9981. return _test;
  9982. }
  9983. if (tsMorph.ts.isClassDeclaration(node)) {
  9984. return true;
  9985. }
  9986. return false;
  9987. };
  9988. nodeDecorators_1.filter(filterByDecorators).forEach(visitDecorator);
  9989. }
  9990. else if (node.symbol) {
  9991. if (node.symbol.flags === tsMorph.ts.SymbolFlags.Class) {
  9992. _this.processClass(node, file, srcFile, outputSymbols, fileBody, astFile);
  9993. }
  9994. else if (node.symbol.flags === tsMorph.ts.SymbolFlags.Interface) {
  9995. var name = _this.getSymboleName(node);
  9996. var IO = _this.getInterfaceIO(file, srcFile, node, fileBody, astFile);
  9997. var interfaceDeps = {
  9998. name: name,
  9999. id: 'interface-' + name + '-' + hash,
  10000. file: file,
  10001. deprecated: IO.deprecated,
  10002. deprecationMessage: IO.deprecationMessage,
  10003. type: 'interface',
  10004. sourceCode: srcFile.getText()
  10005. };
  10006. if (IO.properties) {
  10007. interfaceDeps.properties = IO.properties;
  10008. }
  10009. if (IO.indexSignatures) {
  10010. interfaceDeps.indexSignatures = IO.indexSignatures;
  10011. }
  10012. if (IO.kind) {
  10013. interfaceDeps.kind = IO.kind;
  10014. }
  10015. if (IO.description) {
  10016. interfaceDeps.description = IO.description;
  10017. interfaceDeps.rawdescription = IO.rawdescription;
  10018. }
  10019. if (IO.methods) {
  10020. interfaceDeps.methods = IO.methods;
  10021. }
  10022. if (IO.extends) {
  10023. interfaceDeps.extends = IO.extends;
  10024. }
  10025. if (typeof IO.ignore === 'undefined') {
  10026. _this.debug(interfaceDeps);
  10027. outputSymbols.interfaces.push(interfaceDeps);
  10028. }
  10029. else {
  10030. _this.ignore(interfaceDeps);
  10031. }
  10032. }
  10033. else if (tsMorph.ts.isFunctionDeclaration(node)) {
  10034. var infos = _this.visitFunctionDeclaration(node);
  10035. var name = infos.name;
  10036. var deprecated = infos.deprecated;
  10037. var deprecationMessage = infos.deprecationMessage;
  10038. var functionDep = {
  10039. name: name,
  10040. file: file,
  10041. ctype: 'miscellaneous',
  10042. subtype: 'function',
  10043. deprecated: deprecated,
  10044. deprecationMessage: deprecationMessage,
  10045. description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
  10046. };
  10047. if (infos.args) {
  10048. functionDep.args = infos.args;
  10049. }
  10050. if (infos.returnType) {
  10051. functionDep.returnType = infos.returnType;
  10052. }
  10053. if (infos.jsdoctags && infos.jsdoctags.length > 0) {
  10054. functionDep.jsdoctags = infos.jsdoctags;
  10055. }
  10056. if (typeof infos.ignore === 'undefined') {
  10057. if (!(_this.hasPrivateJSDocTag(functionDep.jsdoctags) &&
  10058. Configuration$1.mainData.disablePrivate)) {
  10059. _this.debug(functionDep);
  10060. outputSymbols.miscellaneous.functions.push(functionDep);
  10061. }
  10062. }
  10063. }
  10064. else if (tsMorph.ts.isEnumDeclaration(node)) {
  10065. var infos = _this.visitEnumDeclaration(node);
  10066. var name = infos.name;
  10067. var deprecated = infos.deprecated;
  10068. var deprecationMessage = infos.deprecationMessage;
  10069. var enumDeps = {
  10070. name: name,
  10071. childs: infos.members,
  10072. ctype: 'miscellaneous',
  10073. subtype: 'enum',
  10074. deprecated: deprecated,
  10075. deprecationMessage: deprecationMessage,
  10076. description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
  10077. file: file
  10078. };
  10079. if (!isIgnore(node)) {
  10080. _this.debug(enumDeps);
  10081. outputSymbols.miscellaneous.enumerations.push(enumDeps);
  10082. }
  10083. }
  10084. else if (tsMorph.ts.isTypeAliasDeclaration(node)) {
  10085. var infos = _this.visitTypeDeclaration(node);
  10086. var name = infos.name;
  10087. var deprecated = infos.deprecated;
  10088. var deprecationMessage = infos.deprecationMessage;
  10089. var typeAliasDeps = {
  10090. name: name,
  10091. ctype: 'miscellaneous',
  10092. subtype: 'typealias',
  10093. rawtype: _this.classHelper.visitType(node),
  10094. file: file,
  10095. deprecated: deprecated,
  10096. deprecationMessage: deprecationMessage,
  10097. description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
  10098. };
  10099. if (node.type) {
  10100. typeAliasDeps.kind = node.type.kind;
  10101. if (typeAliasDeps.rawtype === '') {
  10102. typeAliasDeps.rawtype = _this.classHelper.visitType(node);
  10103. }
  10104. }
  10105. if (typeAliasDeps.kind &&
  10106. typeAliasDeps.kind === tsMorph.SyntaxKind.TemplateLiteralType &&
  10107. node.type) {
  10108. typeAliasDeps.rawtype = srcFile.text.substring(node.type.pos, node.type.end);
  10109. }
  10110. if (!isIgnore(node)) {
  10111. outputSymbols.miscellaneous.typealiases.push(typeAliasDeps);
  10112. }
  10113. if (typeof infos.ignore === 'undefined') {
  10114. _this.debug(typeAliasDeps);
  10115. }
  10116. }
  10117. else if (tsMorph.ts.isModuleDeclaration(node)) {
  10118. if (node.body) {
  10119. if (node.body.statements && node.body.statements.length > 0) {
  10120. node.body.statements.forEach(function (statement) {
  10121. return parseNode(file, srcFile, statement, node.body, astFile);
  10122. });
  10123. }
  10124. }
  10125. }
  10126. }
  10127. else {
  10128. var IO = _this.getRouteIO(file, srcFile, node);
  10129. if (IO.routes) {
  10130. var newRoutes = void 0;
  10131. try {
  10132. newRoutes = RouterParserUtil$1.cleanRawRouteParsed(IO.routes);
  10133. }
  10134. catch (e) {
  10135. // tslint:disable-next-line:max-line-length
  10136. logger.error('Routes parsing error, maybe a trailing comma or an external variable, trying to fix that later after sources scanning.');
  10137. newRoutes = IO.routes.replace(/ /gm, '');
  10138. RouterParserUtil$1.addIncompleteRoute({
  10139. data: newRoutes,
  10140. file: file
  10141. });
  10142. return true;
  10143. }
  10144. outputSymbols.routes = __spreadArray(__spreadArray([], __read(outputSymbols.routes), false), __read(newRoutes), false);
  10145. }
  10146. if (tsMorph.ts.isClassDeclaration(node)) {
  10147. _this.processClass(node, file, srcFile, outputSymbols, fileBody);
  10148. }
  10149. if (tsMorph.ts.isExpressionStatement(node) || tsMorph.ts.isIfStatement(node)) {
  10150. var bootstrapModuleReference = 'bootstrapModule';
  10151. // Find the root module with bootstrapModule call
  10152. // 1. find a simple call : platformBrowserDynamic().bootstrapModule(AppModule);
  10153. // 2. or inside a call :
  10154. // () => {
  10155. // platformBrowserDynamic().bootstrapModule(AppModule);
  10156. // });
  10157. // 3. with a catch : platformBrowserDynamic().bootstrapModule(AppModule).catch(error => console.error(error));
  10158. // 4. with parameters : platformBrowserDynamic().bootstrapModule(AppModule, {}).catch(error => console.error(error));
  10159. // Find recusively in expression nodes one with name 'bootstrapModule'
  10160. var rootModule_1;
  10161. var resultNode = void 0;
  10162. if (srcFile.text.indexOf(bootstrapModuleReference) !== -1) {
  10163. if (node.expression) {
  10164. resultNode = _this.findExpressionByNameInExpressions(node.expression, 'bootstrapModule');
  10165. }
  10166. if (typeof node.thenStatement !== 'undefined') {
  10167. if (node.thenStatement.statements &&
  10168. node.thenStatement.statements.length > 0) {
  10169. var firstStatement = node.thenStatement.statements[0];
  10170. resultNode = _this.findExpressionByNameInExpressions(firstStatement.expression, 'bootstrapModule');
  10171. }
  10172. }
  10173. if (!resultNode) {
  10174. if (node.expression &&
  10175. node.expression.arguments &&
  10176. node.expression.arguments.length > 0) {
  10177. resultNode = _this.findExpressionByNameInExpressionArguments(node.expression.arguments, 'bootstrapModule');
  10178. }
  10179. }
  10180. if (resultNode) {
  10181. if (resultNode.arguments.length > 0) {
  10182. ___namespace.forEach(resultNode.arguments, function (argument) {
  10183. if (argument.text) {
  10184. rootModule_1 = argument.text;
  10185. }
  10186. });
  10187. }
  10188. if (rootModule_1) {
  10189. RouterParserUtil$1.setRootModule(rootModule_1);
  10190. }
  10191. }
  10192. }
  10193. }
  10194. if (tsMorph.ts.isVariableStatement(node) && !RouterParserUtil$1.isVariableRoutes(node)) {
  10195. var isDestructured = false;
  10196. // Check for destructuring array
  10197. var nodeVariableDeclarations = node.declarationList.declarations;
  10198. if (nodeVariableDeclarations) {
  10199. if (nodeVariableDeclarations.length > 0) {
  10200. if (nodeVariableDeclarations[0].name &&
  10201. nodeVariableDeclarations[0].name.kind ===
  10202. tsMorph.SyntaxKind.ArrayBindingPattern) {
  10203. isDestructured = true;
  10204. }
  10205. }
  10206. }
  10207. var visitVariableNode = function (variableNode) {
  10208. var infos = _this.visitVariableDeclaration(variableNode);
  10209. if (infos) {
  10210. var name = infos.name;
  10211. var deprecated = infos.deprecated;
  10212. var deprecationMessage = infos.deprecationMessage;
  10213. var deps = {
  10214. name: name,
  10215. ctype: 'miscellaneous',
  10216. subtype: 'variable',
  10217. file: file,
  10218. deprecated: deprecated,
  10219. deprecationMessage: deprecationMessage
  10220. };
  10221. deps.type = infos.type ? infos.type : '';
  10222. if (infos.defaultValue) {
  10223. deps.defaultValue = infos.defaultValue;
  10224. }
  10225. if (infos.initializer) {
  10226. deps.initializer = infos.initializer;
  10227. }
  10228. if (variableNode.jsDoc &&
  10229. variableNode.jsDoc.length > 0 &&
  10230. variableNode.jsDoc[0].comment) {
  10231. var rawDescription = _this.jsdocParserUtil.parseJSDocNode(variableNode.jsDoc[0]);
  10232. deps.rawdescription = rawDescription;
  10233. deps.description = markedAcl(rawDescription);
  10234. }
  10235. if (isModuleWithProviders(variableNode)) {
  10236. var routingInitializer = getModuleWithProviders(variableNode);
  10237. RouterParserUtil$1.addModuleWithRoutes(name, [routingInitializer], file);
  10238. RouterParserUtil$1.addModule(name, [routingInitializer]);
  10239. }
  10240. if (!isIgnore(variableNode)) {
  10241. _this.debug(deps);
  10242. outputSymbols.miscellaneous.variables.push(deps);
  10243. }
  10244. }
  10245. };
  10246. if (isDestructured) {
  10247. if (nodeVariableDeclarations[0].name.elements) {
  10248. var destructuredVariables = nodeVariableDeclarations[0].name.elements;
  10249. for (var i = 0; i < destructuredVariables.length; i++) {
  10250. var destructuredVariable = destructuredVariables[i];
  10251. var name = destructuredVariable.name
  10252. ? destructuredVariable.name.escapedText
  10253. : '';
  10254. var deps = {
  10255. name: name,
  10256. ctype: 'miscellaneous',
  10257. subtype: 'variable',
  10258. file: file
  10259. };
  10260. if (nodeVariableDeclarations[0].initializer) {
  10261. if (nodeVariableDeclarations[0].initializer.elements) {
  10262. deps.initializer =
  10263. nodeVariableDeclarations[0].initializer.elements[i];
  10264. }
  10265. deps.defaultValue = deps.initializer
  10266. ? _this.classHelper.stringifyDefaultValue(deps.initializer)
  10267. : undefined;
  10268. }
  10269. if (!isIgnore(destructuredVariables[i])) {
  10270. _this.debug(deps);
  10271. outputSymbols.miscellaneous.variables.push(deps);
  10272. }
  10273. }
  10274. }
  10275. }
  10276. else {
  10277. visitVariableNode(node);
  10278. }
  10279. }
  10280. if (tsMorph.ts.isTypeAliasDeclaration(node)) {
  10281. var infos = _this.visitTypeDeclaration(node);
  10282. var name = infos.name;
  10283. var deprecated = infos.deprecated;
  10284. var deprecationMessage = infos.deprecationMessage;
  10285. var deps = {
  10286. name: name,
  10287. ctype: 'miscellaneous',
  10288. subtype: 'typealias',
  10289. rawtype: _this.classHelper.visitType(node),
  10290. file: file,
  10291. deprecated: deprecated,
  10292. deprecationMessage: deprecationMessage,
  10293. description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
  10294. };
  10295. if (node.type) {
  10296. deps.kind = node.type.kind;
  10297. }
  10298. if (deps.kind &&
  10299. deps.kind === tsMorph.SyntaxKind.TemplateLiteralType &&
  10300. node.type) {
  10301. deps.rawtype = srcFile.text.substring(node.type.pos, node.type.end);
  10302. }
  10303. if (!isIgnore(node)) {
  10304. _this.debug(deps);
  10305. outputSymbols.miscellaneous.typealiases.push(deps);
  10306. }
  10307. }
  10308. if (tsMorph.ts.isFunctionDeclaration(node)) {
  10309. var infos = _this.visitFunctionDeclaration(node);
  10310. var name = infos.name;
  10311. var deprecated = infos.deprecated;
  10312. var deprecationMessage = infos.deprecationMessage;
  10313. var functionDep = {
  10314. name: name,
  10315. ctype: 'miscellaneous',
  10316. subtype: 'function',
  10317. file: file,
  10318. deprecated: deprecated,
  10319. deprecationMessage: deprecationMessage,
  10320. description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node)
  10321. };
  10322. if (infos.args) {
  10323. functionDep.args = infos.args;
  10324. }
  10325. if (infos.returnType) {
  10326. functionDep.returnType = infos.returnType;
  10327. }
  10328. if (infos.jsdoctags && infos.jsdoctags.length > 0) {
  10329. functionDep.jsdoctags = infos.jsdoctags;
  10330. }
  10331. if (typeof infos.ignore === 'undefined') {
  10332. if (!(_this.hasPrivateJSDocTag(functionDep.jsdoctags) &&
  10333. Configuration$1.mainData.disablePrivate)) {
  10334. _this.debug(functionDep);
  10335. outputSymbols.miscellaneous.functions.push(functionDep);
  10336. }
  10337. }
  10338. }
  10339. if (tsMorph.ts.isEnumDeclaration(node)) {
  10340. var infos = _this.visitEnumDeclaration(node);
  10341. var name = infos.name;
  10342. var deprecated = infos.deprecated;
  10343. var deprecationMessage = infos.deprecationMessage;
  10344. var enumDeps = {
  10345. name: name,
  10346. childs: infos.members,
  10347. ctype: 'miscellaneous',
  10348. subtype: 'enum',
  10349. deprecated: deprecated,
  10350. deprecationMessage: deprecationMessage,
  10351. description: _this.visitEnumTypeAliasFunctionDeclarationDescription(node),
  10352. file: file
  10353. };
  10354. if (!isIgnore(node)) {
  10355. _this.debug(enumDeps);
  10356. outputSymbols.miscellaneous.enumerations.push(enumDeps);
  10357. }
  10358. }
  10359. }
  10360. };
  10361. parseNode(fileName, scannedFile, initialNode, null, astFile);
  10362. });
  10363. };
  10364. /**
  10365. * Function to in a specific store an entity, and check before is there is not the same one
  10366. * in that store : same name, id and file
  10367. * @param entity Entity to store
  10368. * @param store Store
  10369. */
  10370. AngularDependencies.prototype.addNewEntityInStore = function (entity, store) {
  10371. var findSameEntityInStore = ___namespace.filter(store, {
  10372. name: entity.name,
  10373. id: entity.id,
  10374. file: entity.file
  10375. });
  10376. if (findSameEntityInStore.length === 0) {
  10377. store.push(entity);
  10378. }
  10379. };
  10380. AngularDependencies.prototype.debug = function (deps) {
  10381. if (deps) {
  10382. logger.debug('found', "".concat(deps.name));
  10383. }
  10384. else {
  10385. return;
  10386. }
  10387. ['imports', 'exports', 'declarations', 'providers', 'bootstrap'].forEach(function (symbols) {
  10388. if (deps[symbols] && deps[symbols].length > 0) {
  10389. logger.debug('', "- ".concat(symbols, ":"));
  10390. deps[symbols]
  10391. .map(function (i) { return i.name; })
  10392. .forEach(function (d) {
  10393. logger.debug('', "\t- ".concat(d));
  10394. });
  10395. }
  10396. });
  10397. };
  10398. AngularDependencies.prototype.ignore = function (deps) {
  10399. if (deps) {
  10400. logger.warn('ignore', "".concat(deps.name));
  10401. }
  10402. else {
  10403. return;
  10404. }
  10405. };
  10406. AngularDependencies.prototype.checkForDeprecation = function (tags, result) {
  10407. ___namespace.forEach(tags, function (tag) {
  10408. if (tag.tagName && tag.tagName.text && tag.tagName.text.indexOf('deprecated') > -1) {
  10409. result.deprecated = true;
  10410. result.deprecationMessage = tag.comment || '';
  10411. }
  10412. });
  10413. };
  10414. AngularDependencies.prototype.findExpressionByNameInExpressions = function (entryNode, name) {
  10415. var result;
  10416. var loop = function (node, z) {
  10417. if (node) {
  10418. if (node.expression && !node.expression.name) {
  10419. loop(node.expression, z);
  10420. }
  10421. if (node.expression && node.expression.name) {
  10422. if (node.expression.name.text === z) {
  10423. result = node;
  10424. }
  10425. else {
  10426. loop(node.expression, z);
  10427. }
  10428. }
  10429. }
  10430. };
  10431. loop(entryNode, name);
  10432. return result;
  10433. };
  10434. AngularDependencies.prototype.findExpressionByNameInExpressionArguments = function (arg, name) {
  10435. var result;
  10436. var that = this;
  10437. var i = 0;
  10438. var len = arg.length;
  10439. var loop = function (node, z) {
  10440. if (node.body) {
  10441. if (node.body.statements && node.body.statements.length > 0) {
  10442. var j = 0;
  10443. var leng = node.body.statements.length;
  10444. for (j; j < leng; j++) {
  10445. result = that.findExpressionByNameInExpressions(node.body.statements[j], z);
  10446. }
  10447. }
  10448. }
  10449. };
  10450. for (i; i < len; i++) {
  10451. loop(arg[i], name);
  10452. }
  10453. return result;
  10454. };
  10455. AngularDependencies.prototype.parseDecorators = function (decorators, type) {
  10456. var result = false;
  10457. if (decorators.length > 1) {
  10458. ___namespace.forEach(decorators, function (decorator) {
  10459. if (decorator.expression.expression) {
  10460. if (decorator.expression.expression.text === type) {
  10461. result = true;
  10462. }
  10463. }
  10464. });
  10465. }
  10466. else {
  10467. if (decorators[0].expression.expression) {
  10468. if (decorators[0].expression.expression.text === type) {
  10469. result = true;
  10470. }
  10471. }
  10472. }
  10473. return result;
  10474. };
  10475. AngularDependencies.prototype.parseDecorator = function (decorator, type) {
  10476. var result = false;
  10477. if (decorator.expression.expression) {
  10478. if (decorator.expression.expression.text === type) {
  10479. result = true;
  10480. }
  10481. }
  10482. return result;
  10483. };
  10484. AngularDependencies.prototype.isController = function (metadata) {
  10485. return this.parseDecorator(metadata, 'Controller');
  10486. };
  10487. AngularDependencies.prototype.isEntity = function (metadata) {
  10488. return this.parseDecorator(metadata, 'Entity');
  10489. };
  10490. AngularDependencies.prototype.isComponent = function (metadata) {
  10491. return this.parseDecorator(metadata, 'Component');
  10492. };
  10493. AngularDependencies.prototype.isPipe = function (metadata) {
  10494. return this.parseDecorator(metadata, 'Pipe');
  10495. };
  10496. AngularDependencies.prototype.isDirective = function (metadata) {
  10497. return this.parseDecorator(metadata, 'Directive');
  10498. };
  10499. AngularDependencies.prototype.isInjectable = function (metadata) {
  10500. return this.parseDecorator(metadata, 'Injectable');
  10501. };
  10502. AngularDependencies.prototype.isModule = function (metadata) {
  10503. return this.parseDecorator(metadata, 'NgModule') || this.parseDecorator(metadata, 'Module');
  10504. };
  10505. AngularDependencies.prototype.hasInternalDecorator = function (metadatas) {
  10506. return (this.parseDecorators(metadatas, 'Controller') ||
  10507. this.parseDecorators(metadatas, 'Component') ||
  10508. this.parseDecorators(metadatas, 'Pipe') ||
  10509. this.parseDecorators(metadatas, 'Directive') ||
  10510. this.parseDecorators(metadatas, 'Injectable') ||
  10511. this.parseDecorators(metadatas, 'NgModule') ||
  10512. this.parseDecorators(metadatas, 'Module'));
  10513. };
  10514. AngularDependencies.prototype.isGuard = function (ioImplements) {
  10515. return (___namespace.includes(ioImplements, 'CanActivate') ||
  10516. ___namespace.includes(ioImplements, 'CanActivateChild') ||
  10517. ___namespace.includes(ioImplements, 'CanDeactivate') ||
  10518. ___namespace.includes(ioImplements, 'Resolve') ||
  10519. ___namespace.includes(ioImplements, 'CanLoad'));
  10520. };
  10521. AngularDependencies.prototype.getSymboleName = function (node) {
  10522. return node.name.text;
  10523. };
  10524. AngularDependencies.prototype.findProperties = function (visitedNode, sourceFile) {
  10525. if (visitedNode.expression &&
  10526. visitedNode.expression.arguments &&
  10527. visitedNode.expression.arguments.length > 0) {
  10528. var pop = visitedNode.expression.arguments[0];
  10529. if (pop && pop.properties && pop.properties.length >= 0) {
  10530. return pop.properties;
  10531. }
  10532. else if (pop && pop.kind && pop.kind === tsMorph.SyntaxKind.StringLiteral) {
  10533. return [pop];
  10534. }
  10535. else {
  10536. logger.warn('Empty metadatas, trying to find it with imports.');
  10537. return ImportsUtil$1.findValueInImportOrLocalVariables(pop.text, sourceFile);
  10538. }
  10539. }
  10540. return [];
  10541. };
  10542. AngularDependencies.prototype.isAngularLifecycleHook = function (methodName) {
  10543. /**
  10544. * Copyright https://github.com/ng-bootstrap/ng-bootstrap
  10545. */
  10546. var ANGULAR_LIFECYCLE_METHODS = [
  10547. 'ngOnInit',
  10548. 'ngOnChanges',
  10549. 'ngDoCheck',
  10550. 'ngOnDestroy',
  10551. 'ngAfterContentInit',
  10552. 'ngAfterContentChecked',
  10553. 'ngAfterViewInit',
  10554. 'ngAfterViewChecked',
  10555. 'writeValue',
  10556. 'registerOnChange',
  10557. 'registerOnTouched',
  10558. 'setDisabledState'
  10559. ];
  10560. return ANGULAR_LIFECYCLE_METHODS.indexOf(methodName) >= 0;
  10561. };
  10562. AngularDependencies.prototype.visitTypeDeclaration = function (node) {
  10563. var result = {
  10564. deprecated: false,
  10565. deprecationMessage: '',
  10566. name: node.name.text,
  10567. kind: node.kind
  10568. };
  10569. var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
  10570. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  10571. this.checkForDeprecation(jsdoctags[0].tags, result);
  10572. result.jsdoctags = markedtags(jsdoctags[0].tags);
  10573. }
  10574. return result;
  10575. };
  10576. AngularDependencies.prototype.visitArgument = function (arg) {
  10577. var _this = this;
  10578. if (arg.name && arg.name.kind == tsMorph.SyntaxKind.ObjectBindingPattern) {
  10579. var results = [];
  10580. var destrucuredGroupId_1 = uuid.v4();
  10581. results = arg.name.elements.map(function (element) { return _this.visitArgument(element); });
  10582. results = results.map(function (result) {
  10583. result.destrucuredGroupId = destrucuredGroupId_1;
  10584. return result;
  10585. });
  10586. if (arg.name.elements && arg.type && arg.type.members) {
  10587. if (arg.name.elements.length === arg.type.members.length) {
  10588. for (var i = 0; i < arg.name.elements.length; i++) {
  10589. results[i].type = this.classHelper.visitType(arg.type.members[i]);
  10590. }
  10591. }
  10592. }
  10593. if (arg.name.elements && arg.type && arg.type.typeName) {
  10594. results[0].type = this.classHelper.visitType(arg.type);
  10595. }
  10596. return results;
  10597. }
  10598. else {
  10599. var result = {
  10600. name: arg.name.text,
  10601. type: this.classHelper.visitType(arg),
  10602. deprecated: false,
  10603. deprecationMessage: ''
  10604. };
  10605. if (arg.dotDotDotToken) {
  10606. result.dotDotDotToken = true;
  10607. }
  10608. if (arg.questionToken) {
  10609. result.optional = true;
  10610. }
  10611. if (arg.initializer) {
  10612. result.defaultValue = arg.initializer
  10613. ? this.classHelper.stringifyDefaultValue(arg.initializer)
  10614. : undefined;
  10615. }
  10616. if (arg.type) {
  10617. result.type = this.mapType(arg.type.kind);
  10618. if (arg.type.kind === tsMorph.SyntaxKind.TypeReference) {
  10619. // try replace TypeReference with typeName
  10620. if (arg.type.typeName) {
  10621. result.type = arg.type.typeName.text;
  10622. }
  10623. }
  10624. }
  10625. var jsdoctags = this.jsdocParserUtil.getJSDocs(arg);
  10626. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  10627. this.checkForDeprecation(jsdoctags[0].tags, result);
  10628. }
  10629. return result;
  10630. }
  10631. };
  10632. AngularDependencies.prototype.mapType = function (type) {
  10633. switch (type) {
  10634. case tsMorph.SyntaxKind.NullKeyword:
  10635. return 'null';
  10636. case tsMorph.SyntaxKind.AnyKeyword:
  10637. return 'any';
  10638. case tsMorph.SyntaxKind.BooleanKeyword:
  10639. return 'boolean';
  10640. case tsMorph.SyntaxKind.NeverKeyword:
  10641. return 'never';
  10642. case tsMorph.SyntaxKind.NumberKeyword:
  10643. return 'number';
  10644. case tsMorph.SyntaxKind.StringKeyword:
  10645. return 'string';
  10646. case tsMorph.SyntaxKind.UndefinedKeyword:
  10647. return 'undefined';
  10648. case tsMorph.SyntaxKind.TypeReference:
  10649. return 'typeReference';
  10650. }
  10651. };
  10652. AngularDependencies.prototype.hasPrivateJSDocTag = function (tags) {
  10653. var result = false;
  10654. if (tags) {
  10655. tags.forEach(function (tag) {
  10656. if (tag.tagName && tag.tagName.text && tag.tagName.text === 'private') {
  10657. result = true;
  10658. }
  10659. });
  10660. }
  10661. return result;
  10662. };
  10663. AngularDependencies.prototype.visitFunctionDeclaration = function (method) {
  10664. var methodName = method.name ? method.name.text : 'Unnamed function';
  10665. var resultArguments = [];
  10666. var result = {
  10667. deprecated: false,
  10668. deprecationMessage: '',
  10669. name: methodName
  10670. };
  10671. for (var i = 0; i < method.parameters.length; i++) {
  10672. var argument = method.parameters[i];
  10673. if (argument) {
  10674. var argumentParsed = this.visitArgument(argument);
  10675. if (argumentParsed.length > 0) {
  10676. for (var j = 0; j < argumentParsed.length; j++) {
  10677. var argumentParsedInside = argumentParsed[j];
  10678. argumentParsedInside.destructuredParameter = true;
  10679. resultArguments.push(argumentParsedInside);
  10680. }
  10681. }
  10682. else {
  10683. resultArguments.push(argumentParsed);
  10684. }
  10685. }
  10686. }
  10687. result.args = resultArguments;
  10688. var jsdoctags = this.jsdocParserUtil.getJSDocs(method);
  10689. if (typeof method.type !== 'undefined') {
  10690. result.returnType = this.classHelper.visitType(method.type);
  10691. }
  10692. if (method.modifiers) {
  10693. if (method.modifiers.length > 0) {
  10694. var kinds = method.modifiers
  10695. .map(function (modifier) {
  10696. return modifier.kind;
  10697. })
  10698. .reverse();
  10699. if (___namespace.indexOf(kinds, tsMorph.SyntaxKind.PublicKeyword) !== -1 &&
  10700. ___namespace.indexOf(kinds, tsMorph.SyntaxKind.StaticKeyword) !== -1) {
  10701. kinds = kinds.filter(function (kind) { return kind !== tsMorph.SyntaxKind.PublicKeyword; });
  10702. }
  10703. }
  10704. }
  10705. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  10706. this.checkForDeprecation(jsdoctags[0].tags, result);
  10707. result.jsdoctags = markedtags(jsdoctags[0].tags);
  10708. ___namespace.forEach(jsdoctags[0].tags, function (tag) {
  10709. if (tag.tagName) {
  10710. if (tag.tagName.text) {
  10711. if (tag.tagName.text.indexOf('ignore') > -1) {
  10712. result.ignore = true;
  10713. }
  10714. }
  10715. }
  10716. });
  10717. }
  10718. if (result.jsdoctags && result.jsdoctags.length > 0) {
  10719. result.jsdoctags = mergeTagsAndArgs(result.args, result.jsdoctags);
  10720. }
  10721. else if (result.args.length > 0) {
  10722. result.jsdoctags = mergeTagsAndArgs(result.args);
  10723. }
  10724. return result;
  10725. };
  10726. AngularDependencies.prototype.visitVariableDeclaration = function (node) {
  10727. if (node.declarationList && node.declarationList.declarations) {
  10728. var i = 0;
  10729. var len = node.declarationList.declarations.length;
  10730. for (i; i < len; i++) {
  10731. var result = {
  10732. name: node.declarationList.declarations[i].name.text,
  10733. defaultValue: node.declarationList.declarations[i].initializer
  10734. ? this.classHelper.stringifyDefaultValue(node.declarationList.declarations[i].initializer)
  10735. : undefined,
  10736. deprecated: false,
  10737. deprecationMessage: ''
  10738. };
  10739. if (node.declarationList.declarations[i].initializer) {
  10740. result.initializer = node.declarationList.declarations[i].initializer;
  10741. }
  10742. if (node.declarationList.declarations[i].type) {
  10743. result.type = this.classHelper.visitType(node.declarationList.declarations[i].type);
  10744. }
  10745. if (typeof result.type === 'undefined' && result.initializer) {
  10746. result.type = kindToType(result.initializer.kind);
  10747. }
  10748. var jsdoctags = this.jsdocParserUtil.getJSDocs(node.declarationList.declarations[i]);
  10749. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  10750. this.checkForDeprecation(jsdoctags[0].tags, result);
  10751. }
  10752. return result;
  10753. }
  10754. }
  10755. };
  10756. AngularDependencies.prototype.visitEnumTypeAliasFunctionDeclarationDescription = function (node) {
  10757. var description = '';
  10758. if (node.jsDoc) {
  10759. if (node.jsDoc.length > 0) {
  10760. if (typeof node.jsDoc[0].comment !== 'undefined') {
  10761. var rawDescription = this.jsdocParserUtil.parseJSDocNode(node.jsDoc[0]);
  10762. description = markedAcl(rawDescription);
  10763. }
  10764. }
  10765. }
  10766. return description;
  10767. };
  10768. AngularDependencies.prototype.visitEnumDeclaration = function (node) {
  10769. var result = {
  10770. deprecated: false,
  10771. deprecationMessage: '',
  10772. name: node.name.text,
  10773. members: []
  10774. };
  10775. if (node.members) {
  10776. var i = 0;
  10777. var len = node.members.length;
  10778. var memberjsdoctags = [];
  10779. for (i; i < len; i++) {
  10780. var member = {
  10781. name: node.members[i].name.text,
  10782. deprecated: false,
  10783. deprecationMessage: ''
  10784. };
  10785. if (node.members[i].initializer) {
  10786. // if the initializer kind is a number do cast to the number type
  10787. member.value = IsKindType.NUMBER(node.members[i].initializer.kind)
  10788. ? Number(node.members[i].initializer.text)
  10789. : node.members[i].initializer.text;
  10790. }
  10791. memberjsdoctags = this.jsdocParserUtil.getJSDocs(node.members[i]);
  10792. if (memberjsdoctags && memberjsdoctags.length >= 1 && memberjsdoctags[0].tags) {
  10793. this.checkForDeprecation(memberjsdoctags[0].tags, member);
  10794. }
  10795. result.members.push(member);
  10796. }
  10797. }
  10798. var jsdoctags = this.jsdocParserUtil.getJSDocs(node);
  10799. if (jsdoctags && jsdoctags.length >= 1 && jsdoctags[0].tags) {
  10800. this.checkForDeprecation(jsdoctags[0].tags, result);
  10801. }
  10802. return result;
  10803. };
  10804. AngularDependencies.prototype.visitEnumDeclarationForRoutes = function (fileName, node) {
  10805. if (node.declarationList.declarations) {
  10806. var i = 0;
  10807. var len = node.declarationList.declarations.length;
  10808. for (i; i < len; i++) {
  10809. var routesInitializer = node.declarationList.declarations[i].initializer;
  10810. var data = new CodeGenerator().generate(routesInitializer);
  10811. RouterParserUtil$1.addRoute({
  10812. name: node.declarationList.declarations[i].name.text,
  10813. data: RouterParserUtil$1.cleanRawRoute(data),
  10814. filename: fileName
  10815. });
  10816. return [
  10817. {
  10818. routes: data
  10819. }
  10820. ];
  10821. }
  10822. }
  10823. return [];
  10824. };
  10825. AngularDependencies.prototype.getRouteIO = function (filename, sourceFile, node) {
  10826. var _this = this;
  10827. var res;
  10828. if (sourceFile.statements) {
  10829. res = sourceFile.statements.reduce(function (directive, statement) {
  10830. if (RouterParserUtil$1.isVariableRoutes(statement)) {
  10831. if (statement.pos === node.pos && statement.end === node.end) {
  10832. return directive.concat(_this.visitEnumDeclarationForRoutes(filename, statement));
  10833. }
  10834. }
  10835. return directive;
  10836. }, []);
  10837. return res[0] || {};
  10838. }
  10839. else {
  10840. return {};
  10841. }
  10842. };
  10843. AngularDependencies.prototype.getClassIO = function (filename, sourceFile, node, fileBody, astFile) {
  10844. var _this = this;
  10845. /**
  10846. * Copyright https://github.com/ng-bootstrap/ng-bootstrap
  10847. */
  10848. var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
  10849. var res = reducedSource.reduce(function (directive, statement) {
  10850. if (tsMorph.ts.isClassDeclaration(statement)) {
  10851. if (statement.pos === node.pos && statement.end === node.end) {
  10852. return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile, astFile));
  10853. }
  10854. }
  10855. return directive;
  10856. }, []);
  10857. return res[0] || {};
  10858. };
  10859. AngularDependencies.prototype.getInterfaceIO = function (filename, sourceFile, node, fileBody, astFile) {
  10860. var _this = this;
  10861. /**
  10862. * Copyright https://github.com/ng-bootstrap/ng-bootstrap
  10863. */
  10864. var reducedSource = fileBody ? fileBody.statements : sourceFile.statements;
  10865. var res = reducedSource.reduce(function (directive, statement) {
  10866. if (tsMorph.ts.isInterfaceDeclaration(statement)) {
  10867. if (statement.pos === node.pos && statement.end === node.end) {
  10868. return directive.concat(_this.classHelper.visitClassDeclaration(filename, statement, sourceFile, astFile));
  10869. }
  10870. }
  10871. return directive;
  10872. }, []);
  10873. return res[0] || {};
  10874. };
  10875. return AngularDependencies;
  10876. }(FrameworkDependencies));
  10877. var AngularJSDependencies = /** @class */ (function (_super) {
  10878. __extends(AngularJSDependencies, _super);
  10879. function AngularJSDependencies(files, options) {
  10880. var _this = _super.call(this, files, options) || this;
  10881. _this.cache = new ComponentCache();
  10882. _this.moduleHelper = new ModuleHelper(_this.cache);
  10883. _this.jsDocHelper = new JsDocHelper();
  10884. _this.symbolHelper = new SymbolHelper();
  10885. return _this;
  10886. }
  10887. AngularJSDependencies.prototype.getDependencies = function () {
  10888. var deps = {
  10889. modules: [],
  10890. modulesForGraph: [],
  10891. components: [],
  10892. injectables: [],
  10893. interceptors: [],
  10894. pipes: [],
  10895. directives: [],
  10896. routes: [],
  10897. classes: [],
  10898. interfaces: [],
  10899. miscellaneous: {
  10900. variables: [],
  10901. functions: [],
  10902. typealiases: [],
  10903. enumerations: []
  10904. },
  10905. routesTree: undefined
  10906. };
  10907. return deps;
  10908. };
  10909. return AngularJSDependencies;
  10910. }(FrameworkDependencies));
  10911. function promiseSequential(promises) {
  10912. if (!Array.isArray(promises)) {
  10913. throw new Error('First argument need to be an array of Promises');
  10914. }
  10915. return new Promise(function (resolve, reject) {
  10916. var count = 0;
  10917. var results = [];
  10918. var iterateeFunc = function (previousPromise, currentPromise) {
  10919. return previousPromise
  10920. .then(function (result) {
  10921. if (count++ !== 0) {
  10922. results = results.concat(result);
  10923. }
  10924. return currentPromise(result, results, count);
  10925. })
  10926. .catch(function (err) {
  10927. return reject(err);
  10928. });
  10929. };
  10930. promises = promises.concat(function () { return Promise.resolve(); });
  10931. promises.reduce(iterateeFunc, Promise.resolve(false)).then(function (res) {
  10932. resolve(results);
  10933. });
  10934. });
  10935. }
  10936. var chokidar = require('chokidar');
  10937. var traverse = require('neotraverse/legacy');
  10938. var crypto = require('crypto');
  10939. var babel = require('@babel/core');
  10940. var cwd$1 = process.cwd();
  10941. var startTime = new Date();
  10942. var generationPromiseResolve;
  10943. var generationPromiseReject;
  10944. var generationPromise = new Promise(function (resolve, reject) {
  10945. generationPromiseResolve = resolve;
  10946. generationPromiseReject = reject;
  10947. });
  10948. var Application = /** @class */ (function () {
  10949. /**
  10950. * Create a new compodoc application instance.
  10951. *
  10952. * @param options An object containing the options that should be used.
  10953. */
  10954. function Application(options) {
  10955. var _this = this;
  10956. /**
  10957. * Files changed during watch scanning
  10958. */
  10959. this.watchChangedFiles = [];
  10960. /**
  10961. * Boolean for watching status
  10962. * @type {boolean}
  10963. */
  10964. this.isWatching = false;
  10965. /**
  10966. * Store package.json data
  10967. */
  10968. this.packageJsonData = {};
  10969. this.preparePipes = function (somePipes) {
  10970. logger.info('Prepare pipes');
  10971. Configuration$1.mainData.pipes = somePipes ? somePipes : DependenciesEngine$1.getPipes();
  10972. return new Promise(function (resolve, reject) {
  10973. var i = 0;
  10974. var len = Configuration$1.mainData.pipes.length;
  10975. var loop = function () {
  10976. if (i < len) {
  10977. var pipe = Configuration$1.mainData.pipes[i];
  10978. if (MarkdownEngine$1.hasNeighbourReadmeFile(pipe.file)) {
  10979. logger.info(" ".concat(pipe.name, " has a README file, include it"));
  10980. var readme = MarkdownEngine$1.readNeighbourReadmeFile(pipe.file);
  10981. pipe.readme = markedAcl(readme);
  10982. }
  10983. var page = {
  10984. path: 'pipes',
  10985. name: pipe.name,
  10986. id: pipe.id,
  10987. navTabs: _this.getNavTabs(pipe),
  10988. context: 'pipe',
  10989. pipe: pipe,
  10990. depth: 1,
  10991. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  10992. };
  10993. if (pipe.isDuplicate) {
  10994. page.name += '-' + pipe.duplicateId;
  10995. }
  10996. Configuration$1.addPage(page);
  10997. i++;
  10998. loop();
  10999. }
  11000. else {
  11001. resolve(true);
  11002. }
  11003. };
  11004. loop();
  11005. });
  11006. };
  11007. this.prepareClasses = function (someClasses) {
  11008. logger.info('Prepare classes');
  11009. Configuration$1.mainData.classes = someClasses
  11010. ? someClasses
  11011. : DependenciesEngine$1.getClasses();
  11012. return new Promise(function (resolve, reject) {
  11013. var i = 0;
  11014. var len = Configuration$1.mainData.classes.length;
  11015. var loop = function () {
  11016. if (i < len) {
  11017. var classe = Configuration$1.mainData.classes[i];
  11018. if (MarkdownEngine$1.hasNeighbourReadmeFile(classe.file)) {
  11019. logger.info(" ".concat(classe.name, " has a README file, include it"));
  11020. var readme = MarkdownEngine$1.readNeighbourReadmeFile(classe.file);
  11021. classe.readme = markedAcl(readme);
  11022. }
  11023. var page = {
  11024. path: 'classes',
  11025. name: classe.name,
  11026. id: classe.id,
  11027. navTabs: _this.getNavTabs(classe),
  11028. context: 'class',
  11029. class: classe,
  11030. depth: 1,
  11031. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  11032. };
  11033. if (classe.isDuplicate) {
  11034. page.name += '-' + classe.duplicateId;
  11035. }
  11036. Configuration$1.addPage(page);
  11037. i++;
  11038. loop();
  11039. }
  11040. else {
  11041. resolve(true);
  11042. }
  11043. };
  11044. loop();
  11045. });
  11046. };
  11047. for (var option in options) {
  11048. if (typeof Configuration$1.mainData[option] !== 'undefined') {
  11049. Configuration$1.mainData[option] = options[option];
  11050. }
  11051. // For documentationMainName, process it outside the loop, for handling conflict with pages name
  11052. if (option === 'name') {
  11053. Configuration$1.mainData.documentationMainName = options[option];
  11054. }
  11055. // For documentationMainName, process it outside the loop, for handling conflict with pages name
  11056. if (option === 'silent') {
  11057. logger.silent = false;
  11058. }
  11059. }
  11060. }
  11061. /**
  11062. * Start compodoc process
  11063. */
  11064. Application.prototype.generate = function () {
  11065. var _this = this;
  11066. process.on('unhandledRejection', this.unhandledRejectionListener);
  11067. process.on('uncaughtException', this.uncaughtExceptionListener);
  11068. I18nEngine$1.init(Configuration$1.mainData.language);
  11069. if (Configuration$1.mainData.output.charAt(Configuration$1.mainData.output.length - 1) !== '/') {
  11070. Configuration$1.mainData.output += '/';
  11071. }
  11072. if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
  11073. this.processPackageJson();
  11074. }
  11075. else {
  11076. HtmlEngine$1.init(Configuration$1.mainData.templates).then(function () { return _this.processPackageJson(); });
  11077. }
  11078. return generationPromise;
  11079. };
  11080. Application.prototype.endCallback = function () {
  11081. process.removeListener('unhandledRejection', this.unhandledRejectionListener);
  11082. process.removeListener('uncaughtException', this.uncaughtExceptionListener);
  11083. };
  11084. Application.prototype.unhandledRejectionListener = function (err, p) {
  11085. console.log('Unhandled Rejection at:', p, 'reason:', err);
  11086. 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
  11087. process.exit(1);
  11088. };
  11089. Application.prototype.uncaughtExceptionListener = function (err) {
  11090. logger.error(err);
  11091. 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
  11092. process.exit(1);
  11093. };
  11094. /**
  11095. * Start compodoc documentation coverage
  11096. */
  11097. Application.prototype.testCoverage = function () {
  11098. this.getDependenciesData();
  11099. };
  11100. /**
  11101. * Store files for initial processing
  11102. * @param {Array<string>} files Files found during source folder and tsconfig scan
  11103. */
  11104. Application.prototype.setFiles = function (files) {
  11105. this.files = files;
  11106. };
  11107. /**
  11108. * Store files for watch processing
  11109. * @param {Array<string>} files Files found during source folder and tsconfig scan
  11110. */
  11111. Application.prototype.setUpdatedFiles = function (files) {
  11112. this.updatedFiles = files;
  11113. };
  11114. /**
  11115. * Return a boolean indicating presence of one TypeScript file in updatedFiles list
  11116. * @return {boolean} Result of scan
  11117. */
  11118. Application.prototype.hasWatchedFilesTSFiles = function () {
  11119. var result = false;
  11120. ___namespace.forEach(this.updatedFiles, function (file) {
  11121. if (path__namespace.extname(file) === '.ts') {
  11122. result = true;
  11123. }
  11124. });
  11125. return result;
  11126. };
  11127. /**
  11128. * Return a boolean indicating presence of one root markdown files in updatedFiles list
  11129. * @return {boolean} Result of scan
  11130. */
  11131. Application.prototype.hasWatchedFilesRootMarkdownFiles = function () {
  11132. var result = false;
  11133. ___namespace.forEach(this.updatedFiles, function (file) {
  11134. if (path__namespace.extname(file) === '.md' && path__namespace.dirname(file) === cwd$1) {
  11135. result = true;
  11136. }
  11137. });
  11138. return result;
  11139. };
  11140. /**
  11141. * Clear files for watch processing
  11142. */
  11143. Application.prototype.clearUpdatedFiles = function () {
  11144. this.updatedFiles = [];
  11145. this.watchChangedFiles = [];
  11146. };
  11147. Application.prototype.processPackageJson = function () {
  11148. var _this = this;
  11149. logger.info('Searching package.json file');
  11150. FileEngine$1.get(cwd$1 + path__namespace.sep + 'package.json').then(function (packageData) {
  11151. var parsedData = JSON.parse(packageData);
  11152. _this.packageJsonData = parsedData;
  11153. if (typeof parsedData.name !== 'undefined' &&
  11154. Configuration$1.mainData.documentationMainName === COMPODOC_DEFAULTS.title) {
  11155. Configuration$1.mainData.documentationMainName =
  11156. parsedData.name + ' documentation';
  11157. }
  11158. if (typeof parsedData.description !== 'undefined') {
  11159. Configuration$1.mainData.documentationMainDescription = parsedData.description;
  11160. }
  11161. Configuration$1.mainData.angularVersion =
  11162. AngularVersionUtil$1.getAngularVersionOfProject(parsedData);
  11163. logger.info('package.json file found');
  11164. if (!Configuration$1.mainData.disableDependencies) {
  11165. if (typeof parsedData.dependencies !== 'undefined') {
  11166. _this.processPackageDependencies(parsedData.dependencies);
  11167. }
  11168. if (typeof parsedData.peerDependencies !== 'undefined') {
  11169. _this.processPackagePeerDependencies(parsedData.peerDependencies);
  11170. }
  11171. }
  11172. if (!Configuration$1.mainData.disableProperties) {
  11173. var propertiesToCheck = [
  11174. 'version',
  11175. 'description',
  11176. 'keywords',
  11177. 'homepage',
  11178. 'bugs',
  11179. 'license',
  11180. 'repository',
  11181. 'author'
  11182. ];
  11183. var hasOneOfCheckedProperties_1 = false;
  11184. propertiesToCheck.forEach(function (prop) {
  11185. if (prop in parsedData) {
  11186. hasOneOfCheckedProperties_1 = true;
  11187. Configuration$1.mainData.packageProperties[prop] = parsedData[prop];
  11188. }
  11189. });
  11190. if (hasOneOfCheckedProperties_1) {
  11191. Configuration$1.addPage({
  11192. name: 'properties',
  11193. id: 'packageProperties',
  11194. context: 'package-properties',
  11195. depth: 0,
  11196. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
  11197. });
  11198. }
  11199. }
  11200. _this.processMarkdowns().then(function () {
  11201. _this.getDependenciesData();
  11202. }, function (errorMessage) {
  11203. logger.error(errorMessage);
  11204. process.exit(1);
  11205. });
  11206. }, function (errorMessage) {
  11207. logger.error(errorMessage);
  11208. logger.error('Continuing without package.json file');
  11209. _this.processMarkdowns().then(function () {
  11210. _this.getDependenciesData();
  11211. }, function (errorMessage1) {
  11212. logger.error(errorMessage1);
  11213. process.exit(1);
  11214. });
  11215. });
  11216. };
  11217. Application.prototype.processPackagePeerDependencies = function (dependencies) {
  11218. logger.info('Processing package.json peerDependencies');
  11219. Configuration$1.mainData.packagePeerDependencies = dependencies;
  11220. if (!Configuration$1.hasPage('dependencies')) {
  11221. Configuration$1.addPage({
  11222. name: 'dependencies',
  11223. id: 'packageDependencies',
  11224. context: 'package-dependencies',
  11225. depth: 0,
  11226. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
  11227. });
  11228. }
  11229. };
  11230. Application.prototype.processPackageDependencies = function (dependencies) {
  11231. logger.info('Processing package.json dependencies');
  11232. Configuration$1.mainData.packageDependencies = dependencies;
  11233. Configuration$1.addPage({
  11234. name: 'dependencies',
  11235. id: 'packageDependencies',
  11236. context: 'package-dependencies',
  11237. depth: 0,
  11238. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
  11239. });
  11240. };
  11241. Application.prototype.processMarkdowns = function () {
  11242. logger.info('Searching README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md files');
  11243. return new Promise(function (resolve, reject) {
  11244. var i = 0;
  11245. var markdowns = ['readme', 'changelog', 'contributing', 'license', 'todo'];
  11246. var numberOfMarkdowns = 5;
  11247. var loop = function () {
  11248. if (i < numberOfMarkdowns) {
  11249. MarkdownEngine$1.getTraditionalMarkdown(markdowns[i].toUpperCase()).then(function (readmeData) {
  11250. Configuration$1.addPage({
  11251. name: markdowns[i] === 'readme' ? 'index' : markdowns[i],
  11252. context: 'getting-started',
  11253. id: 'getting-started',
  11254. markdown: readmeData.markdown,
  11255. data: readmeData.rawData,
  11256. depth: 0,
  11257. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
  11258. });
  11259. if (markdowns[i] === 'readme') {
  11260. Configuration$1.mainData.readme = true;
  11261. Configuration$1.addPage({
  11262. name: 'overview',
  11263. id: 'overview',
  11264. context: 'overview',
  11265. depth: 0,
  11266. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
  11267. });
  11268. }
  11269. else {
  11270. Configuration$1.mainData.markdowns.push({
  11271. name: markdowns[i],
  11272. uppername: markdowns[i].toUpperCase(),
  11273. depth: 0,
  11274. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
  11275. });
  11276. }
  11277. logger.info("".concat(markdowns[i].toUpperCase(), ".md file found"));
  11278. i++;
  11279. loop();
  11280. }, function (errorMessage) {
  11281. logger.warn(errorMessage);
  11282. logger.warn("Continuing without ".concat(markdowns[i].toUpperCase(), ".md file"));
  11283. if (markdowns[i] === 'readme') {
  11284. Configuration$1.addPage({
  11285. name: 'index',
  11286. id: 'index',
  11287. context: 'overview',
  11288. depth: 0,
  11289. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
  11290. });
  11291. }
  11292. i++;
  11293. loop();
  11294. });
  11295. }
  11296. else {
  11297. resolve(true);
  11298. }
  11299. };
  11300. loop();
  11301. });
  11302. };
  11303. Application.prototype.rebuildRootMarkdowns = function () {
  11304. var _this = this;
  11305. logger.info('Regenerating README.md, CHANGELOG.md, CONTRIBUTING.md, LICENSE.md, TODO.md pages');
  11306. var actions = [];
  11307. Configuration$1.resetRootMarkdownPages();
  11308. actions.push(function () {
  11309. return _this.processMarkdowns();
  11310. });
  11311. promiseSequential(actions)
  11312. .then(function (res) {
  11313. _this.processPages();
  11314. _this.clearUpdatedFiles();
  11315. })
  11316. .catch(function (errorMessage) {
  11317. logger.error(errorMessage);
  11318. });
  11319. };
  11320. /**
  11321. * Get dependency data for small group of updated files during watch process
  11322. */
  11323. Application.prototype.getMicroDependenciesData = function () {
  11324. logger.info('Get diff dependencies data');
  11325. var dependenciesClass = AngularDependencies;
  11326. Configuration$1.mainData.angularProject = true;
  11327. if (this.detectAngularJSProjects()) {
  11328. logger.info('AngularJS project detected');
  11329. Configuration$1.mainData.angularProject = false;
  11330. Configuration$1.mainData.angularJSProject = true;
  11331. dependenciesClass = AngularJSDependencies;
  11332. }
  11333. var crawler = new dependenciesClass(this.updatedFiles, {
  11334. tsconfigDirectory: path__namespace.dirname(Configuration$1.mainData.tsconfig)
  11335. }, Configuration$1, RouterParserUtil$1);
  11336. var dependenciesData = crawler.getDependencies();
  11337. DependenciesEngine$1.update(dependenciesData);
  11338. this.prepareJustAFewThings(dependenciesData);
  11339. };
  11340. /**
  11341. * Rebuild external documentation during watch process
  11342. */
  11343. Application.prototype.rebuildExternalDocumentation = function () {
  11344. var _this = this;
  11345. logger.info('Rebuild external documentation');
  11346. var actions = [];
  11347. Configuration$1.resetAdditionalPages();
  11348. if (Configuration$1.mainData.includes !== '') {
  11349. actions.push(function () {
  11350. return _this.prepareExternalIncludes();
  11351. });
  11352. }
  11353. promiseSequential(actions)
  11354. .then(function (res) {
  11355. _this.processPages();
  11356. _this.clearUpdatedFiles();
  11357. })
  11358. .catch(function (errorMessage) {
  11359. logger.error(errorMessage);
  11360. });
  11361. };
  11362. Application.prototype.detectAngularJSProjects = function () {
  11363. if (typeof this.packageJsonData.dependencies !== 'undefined') {
  11364. if (typeof this.packageJsonData.dependencies.angular !== 'undefined') ;
  11365. else {
  11366. var countJSFiles_1 = 0;
  11367. this.files.forEach(function (file) {
  11368. if (path__namespace.extname(file) === '.js') {
  11369. countJSFiles_1 += 1;
  11370. }
  11371. });
  11372. (countJSFiles_1 * 100) / this.files.length;
  11373. }
  11374. }
  11375. return false;
  11376. };
  11377. Application.prototype.getDependenciesData = function () {
  11378. logger.info('Get dependencies data');
  11379. /**
  11380. * AngularJS detection strategy :
  11381. * - if in package.json
  11382. * - if 75% of scanned files are *.js files
  11383. */
  11384. var dependenciesClass = AngularDependencies;
  11385. Configuration$1.mainData.angularProject = true;
  11386. if (this.detectAngularJSProjects()) {
  11387. logger.info('AngularJS project detected');
  11388. Configuration$1.mainData.angularProject = false;
  11389. Configuration$1.mainData.angularJSProject = true;
  11390. dependenciesClass = AngularJSDependencies;
  11391. }
  11392. var crawler = new dependenciesClass(this.files, {
  11393. tsconfigDirectory: path__namespace.dirname(Configuration$1.mainData.tsconfig)
  11394. }, Configuration$1, RouterParserUtil$1);
  11395. var dependenciesData = crawler.getDependencies();
  11396. DependenciesEngine$1.init(dependenciesData);
  11397. Configuration$1.mainData.routesLength = RouterParserUtil$1.routesLength();
  11398. this.printStatistics();
  11399. this.prepareEverything();
  11400. };
  11401. Application.prototype.prepareJustAFewThings = function (diffCrawledData) {
  11402. var _this = this;
  11403. var actions = [];
  11404. Configuration$1.resetPages();
  11405. if (!Configuration$1.mainData.disableRoutesGraph) {
  11406. actions.push(function () { return _this.prepareRoutes(); });
  11407. }
  11408. if (diffCrawledData.components.length > 0) {
  11409. actions.push(function () { return _this.prepareComponents(); });
  11410. }
  11411. if (diffCrawledData.controllers.length > 0) {
  11412. actions.push(function () { return _this.prepareControllers(); });
  11413. }
  11414. if (diffCrawledData.entities.length > 0) {
  11415. actions.push(function () { return _this.prepareEntities(); });
  11416. }
  11417. if (diffCrawledData.modules.length > 0) {
  11418. actions.push(function () { return _this.prepareModules(); });
  11419. }
  11420. if (diffCrawledData.directives.length > 0) {
  11421. actions.push(function () { return _this.prepareDirectives(); });
  11422. }
  11423. if (diffCrawledData.injectables.length > 0) {
  11424. actions.push(function () { return _this.prepareInjectables(); });
  11425. }
  11426. if (diffCrawledData.interceptors.length > 0) {
  11427. actions.push(function () { return _this.prepareInterceptors(); });
  11428. }
  11429. if (diffCrawledData.guards.length > 0) {
  11430. actions.push(function () { return _this.prepareGuards(); });
  11431. }
  11432. if (diffCrawledData.pipes.length > 0) {
  11433. actions.push(function () { return _this.preparePipes(); });
  11434. }
  11435. if (diffCrawledData.classes.length > 0) {
  11436. actions.push(function () { return _this.prepareClasses(); });
  11437. }
  11438. if (diffCrawledData.interfaces.length > 0) {
  11439. actions.push(function () { return _this.prepareInterfaces(); });
  11440. }
  11441. if (diffCrawledData.miscellaneous.variables.length > 0 ||
  11442. diffCrawledData.miscellaneous.functions.length > 0 ||
  11443. diffCrawledData.miscellaneous.typealiases.length > 0 ||
  11444. diffCrawledData.miscellaneous.enumerations.length > 0) {
  11445. actions.push(function () { return _this.prepareMiscellaneous(); });
  11446. }
  11447. if (!Configuration$1.mainData.disableCoverage) {
  11448. actions.push(function () { return _this.prepareCoverage(); });
  11449. }
  11450. promiseSequential(actions)
  11451. .then(function (res) {
  11452. if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
  11453. if (COMPODOC_DEFAULTS.exportFormatsSupported.indexOf(Configuration$1.mainData.exportFormat) > -1) {
  11454. logger.info("Generating documentation in export format ".concat(Configuration$1.mainData.exportFormat));
  11455. ExportEngine$1.export(Configuration$1.mainData.output, Configuration$1.mainData).then(function () {
  11456. generationPromiseResolve(true);
  11457. _this.endCallback();
  11458. logger.info('Documentation generated in ' +
  11459. Configuration$1.mainData.output +
  11460. ' in ' +
  11461. _this.getElapsedTime() +
  11462. ' seconds');
  11463. if (Configuration$1.mainData.serve) {
  11464. logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(Configuration$1.mainData.port));
  11465. _this.runWebServer(Configuration$1.mainData.output);
  11466. }
  11467. });
  11468. }
  11469. else {
  11470. logger.warn("Exported format not supported");
  11471. }
  11472. }
  11473. else {
  11474. _this.processGraphs();
  11475. _this.clearUpdatedFiles();
  11476. }
  11477. })
  11478. .catch(function (errorMessage) {
  11479. logger.error(errorMessage);
  11480. });
  11481. };
  11482. Application.prototype.printStatistics = function () {
  11483. logger.info('-------------------');
  11484. logger.info('Project statistics ');
  11485. if (DependenciesEngine$1.modules.length > 0) {
  11486. logger.info("- files : ".concat(this.files.length));
  11487. }
  11488. if (DependenciesEngine$1.modules.length > 0) {
  11489. logger.info("- module : ".concat(DependenciesEngine$1.modules.length));
  11490. }
  11491. if (DependenciesEngine$1.components.length > 0) {
  11492. logger.info("- component : ".concat(DependenciesEngine$1.components.length));
  11493. }
  11494. if (DependenciesEngine$1.controllers.length > 0) {
  11495. logger.info("- controller : ".concat(DependenciesEngine$1.controllers.length));
  11496. }
  11497. if (DependenciesEngine$1.entities.length > 0) {
  11498. logger.info("- entity : ".concat(DependenciesEngine$1.entities.length));
  11499. }
  11500. if (DependenciesEngine$1.directives.length > 0) {
  11501. logger.info("- directive : ".concat(DependenciesEngine$1.directives.length));
  11502. }
  11503. if (DependenciesEngine$1.injectables.length > 0) {
  11504. logger.info("- injectable : ".concat(DependenciesEngine$1.injectables.length));
  11505. }
  11506. if (DependenciesEngine$1.interceptors.length > 0) {
  11507. logger.info("- injector : ".concat(DependenciesEngine$1.interceptors.length));
  11508. }
  11509. if (DependenciesEngine$1.guards.length > 0) {
  11510. logger.info("- guard : ".concat(DependenciesEngine$1.guards.length));
  11511. }
  11512. if (DependenciesEngine$1.pipes.length > 0) {
  11513. logger.info("- pipe : ".concat(DependenciesEngine$1.pipes.length));
  11514. }
  11515. if (DependenciesEngine$1.classes.length > 0) {
  11516. logger.info("- class : ".concat(DependenciesEngine$1.classes.length));
  11517. }
  11518. if (DependenciesEngine$1.interfaces.length > 0) {
  11519. logger.info("- interface : ".concat(DependenciesEngine$1.interfaces.length));
  11520. }
  11521. if (Configuration$1.mainData.routesLength > 0) {
  11522. logger.info("- route : ".concat(Configuration$1.mainData.routesLength));
  11523. }
  11524. if (DependenciesEngine$1.miscellaneous.typealiases.length > 0) {
  11525. logger.info("- type aliases : ".concat(DependenciesEngine$1.miscellaneous.typealiases.length));
  11526. }
  11527. logger.info('-------------------');
  11528. };
  11529. Application.prototype.prepareEverything = function () {
  11530. var _this = this;
  11531. var actions = [];
  11532. actions.push(function () {
  11533. return _this.prepareComponents();
  11534. });
  11535. actions.push(function () {
  11536. return _this.prepareModules();
  11537. });
  11538. if (DependenciesEngine$1.directives.length > 0) {
  11539. actions.push(function () {
  11540. return _this.prepareDirectives();
  11541. });
  11542. }
  11543. if (DependenciesEngine$1.controllers.length > 0) {
  11544. actions.push(function () {
  11545. return _this.prepareControllers();
  11546. });
  11547. }
  11548. if (DependenciesEngine$1.entities.length > 0) {
  11549. actions.push(function () {
  11550. return _this.prepareEntities();
  11551. });
  11552. }
  11553. if (DependenciesEngine$1.injectables.length > 0) {
  11554. actions.push(function () {
  11555. return _this.prepareInjectables();
  11556. });
  11557. }
  11558. if (DependenciesEngine$1.interceptors.length > 0) {
  11559. actions.push(function () {
  11560. return _this.prepareInterceptors();
  11561. });
  11562. }
  11563. if (DependenciesEngine$1.guards.length > 0) {
  11564. actions.push(function () {
  11565. return _this.prepareGuards();
  11566. });
  11567. }
  11568. if (DependenciesEngine$1.routes &&
  11569. DependenciesEngine$1.routes.children.length > 0 &&
  11570. !Configuration$1.mainData.disableRoutesGraph) {
  11571. actions.push(function () {
  11572. return _this.prepareRoutes();
  11573. });
  11574. }
  11575. if (DependenciesEngine$1.pipes.length > 0) {
  11576. actions.push(function () {
  11577. return _this.preparePipes();
  11578. });
  11579. }
  11580. if (DependenciesEngine$1.classes.length > 0) {
  11581. actions.push(function () {
  11582. return _this.prepareClasses();
  11583. });
  11584. }
  11585. if (DependenciesEngine$1.interfaces.length > 0) {
  11586. actions.push(function () {
  11587. return _this.prepareInterfaces();
  11588. });
  11589. }
  11590. if (DependenciesEngine$1.miscellaneous.variables.length > 0 ||
  11591. DependenciesEngine$1.miscellaneous.functions.length > 0 ||
  11592. DependenciesEngine$1.miscellaneous.typealiases.length > 0 ||
  11593. DependenciesEngine$1.miscellaneous.enumerations.length > 0) {
  11594. actions.push(function () {
  11595. return _this.prepareMiscellaneous();
  11596. });
  11597. }
  11598. if (!Configuration$1.mainData.disableCoverage) {
  11599. actions.push(function () {
  11600. return _this.prepareCoverage();
  11601. });
  11602. }
  11603. if (Configuration$1.mainData.unitTestCoverage !== '') {
  11604. actions.push(function () {
  11605. return _this.prepareUnitTestCoverage();
  11606. });
  11607. }
  11608. if (Configuration$1.mainData.includes !== '') {
  11609. actions.push(function () {
  11610. return _this.prepareExternalIncludes();
  11611. });
  11612. }
  11613. promiseSequential(actions)
  11614. .then(function (res) {
  11615. if (Configuration$1.mainData.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
  11616. if (COMPODOC_DEFAULTS.exportFormatsSupported.indexOf(Configuration$1.mainData.exportFormat) > -1) {
  11617. logger.info("Generating documentation in export format ".concat(Configuration$1.mainData.exportFormat));
  11618. ExportEngine$1.export(Configuration$1.mainData.output, Configuration$1.mainData).then(function () {
  11619. generationPromiseResolve(true);
  11620. _this.endCallback();
  11621. logger.info('Documentation generated in ' +
  11622. Configuration$1.mainData.output +
  11623. ' in ' +
  11624. _this.getElapsedTime() +
  11625. ' seconds');
  11626. if (Configuration$1.mainData.serve) {
  11627. logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(Configuration$1.mainData.port));
  11628. _this.runWebServer(Configuration$1.mainData.output);
  11629. }
  11630. });
  11631. }
  11632. else {
  11633. logger.warn("Exported format not supported");
  11634. }
  11635. }
  11636. else {
  11637. _this.processGraphs();
  11638. }
  11639. })
  11640. .catch(function (errorMessage) {
  11641. logger.error(errorMessage);
  11642. process.exit(1);
  11643. });
  11644. };
  11645. Application.prototype.getIncludedPathForFile = function (file) {
  11646. return path__namespace.join(Configuration$1.mainData.includes, file);
  11647. };
  11648. Application.prototype.prepareExternalIncludes = function () {
  11649. var _this = this;
  11650. logger.info('Adding external markdown files');
  11651. // Scan include folder for files detailed in summary.json
  11652. // For each file, add to Configuration.mainData.additionalPages
  11653. // Each file will be converted to html page, inside COMPODOC_DEFAULTS.additionalEntryPath
  11654. return new Promise(function (resolve, reject) {
  11655. FileEngine$1.get(_this.getIncludedPathForFile('summary.json')).then(function (summaryData) {
  11656. logger.info('Additional documentation: summary.json file found');
  11657. var parsedSummaryData = JSON.parse(summaryData);
  11658. var that = _this;
  11659. var lastLevelOnePage = undefined;
  11660. traverse(parsedSummaryData).forEach(function () {
  11661. // tslint:disable-next-line:no-invalid-this
  11662. if (this.notRoot && typeof this.node === 'object') {
  11663. // tslint:disable-next-line:no-invalid-this
  11664. var rawPath = this.path;
  11665. // tslint:disable-next-line:no-invalid-this
  11666. var additionalNode = this.node;
  11667. var file = additionalNode.file;
  11668. var title = additionalNode.title;
  11669. var finalPath_1 = Configuration$1.mainData.includesFolder;
  11670. var finalDepth = rawPath.filter(function (el) {
  11671. return !isNaN(parseInt(el, 10));
  11672. });
  11673. if (typeof file !== 'undefined' && typeof title !== 'undefined') {
  11674. var url = cleanNameWithoutSpaceAndToLowerCase(title);
  11675. /**
  11676. * Id created with title + file path hash, seems to be hypothetically unique here
  11677. */
  11678. var id = crypto
  11679. .createHash('sha512')
  11680. .update(title + file)
  11681. .digest('hex');
  11682. // tslint:disable-next-line:no-invalid-this
  11683. this.node.id = id;
  11684. var lastElementRootTree_1 = undefined;
  11685. finalDepth.forEach(function (el) {
  11686. var elementTree = typeof lastElementRootTree_1 === 'undefined'
  11687. ? parsedSummaryData
  11688. : lastElementRootTree_1;
  11689. if (typeof elementTree.children !== 'undefined') {
  11690. elementTree = elementTree.children[el];
  11691. }
  11692. else {
  11693. elementTree = elementTree[el];
  11694. }
  11695. finalPath_1 +=
  11696. '/' +
  11697. cleanNameWithoutSpaceAndToLowerCase(elementTree.title);
  11698. lastElementRootTree_1 = elementTree;
  11699. });
  11700. finalPath_1 = finalPath_1.replace('/' + url, '');
  11701. var markdownFile = MarkdownEngine$1.getTraditionalMarkdownSync(that.getIncludedPathForFile(file));
  11702. if (finalDepth.length > 5) {
  11703. logger.error('Only 5 levels of depth are supported');
  11704. }
  11705. else {
  11706. var _page = {
  11707. name: title,
  11708. id: id,
  11709. filename: url,
  11710. context: 'additional-page',
  11711. path: finalPath_1,
  11712. additionalPage: markdownFile,
  11713. depth: finalDepth.length,
  11714. childrenLength: additionalNode.children
  11715. ? additionalNode.children.length
  11716. : 0,
  11717. children: [],
  11718. lastChild: false,
  11719. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  11720. };
  11721. if (finalDepth.length === 1) {
  11722. lastLevelOnePage = _page;
  11723. }
  11724. if (finalDepth.length > 1) {
  11725. // store all child pages of the last root level 1 page inside it
  11726. lastLevelOnePage.children.push(_page);
  11727. }
  11728. else {
  11729. Configuration$1.addAdditionalPage(_page);
  11730. }
  11731. }
  11732. }
  11733. }
  11734. });
  11735. resolve(true);
  11736. }, function (errorMessage) {
  11737. logger.error(errorMessage);
  11738. reject('Error during Additional documentation generation');
  11739. });
  11740. });
  11741. };
  11742. Application.prototype.prepareModules = function (someModules) {
  11743. var _this = this;
  11744. logger.info('Prepare modules');
  11745. var i = 0;
  11746. var _modules = someModules ? someModules : DependenciesEngine$1.getModules();
  11747. return new Promise(function (resolve, reject) {
  11748. Configuration$1.mainData.modules = _modules.map(function (ngModule) {
  11749. ngModule.compodocLinks = {
  11750. components: [],
  11751. controllers: [],
  11752. directives: [],
  11753. injectables: [],
  11754. pipes: []
  11755. };
  11756. ['declarations', 'bootstrap', 'imports', 'exports', 'controllers'].forEach(function (metadataType) {
  11757. ngModule[metadataType] = ngModule[metadataType].filter(function (metaDataItem) {
  11758. switch (metaDataItem.type) {
  11759. case 'directive':
  11760. return DependenciesEngine$1.getDirectives().some(function (directive) {
  11761. var selectedDirective;
  11762. if (typeof metaDataItem.id !== 'undefined') {
  11763. selectedDirective =
  11764. directive.id === metaDataItem.id;
  11765. }
  11766. else {
  11767. selectedDirective =
  11768. directive.name === metaDataItem.name;
  11769. }
  11770. if (selectedDirective &&
  11771. !ngModule.compodocLinks.directives.includes(directive)) {
  11772. ngModule.compodocLinks.directives.push(directive);
  11773. }
  11774. return selectedDirective;
  11775. });
  11776. case 'component':
  11777. return DependenciesEngine$1.getComponents().some(function (component) {
  11778. var selectedComponent;
  11779. if (typeof metaDataItem.id !== 'undefined') {
  11780. selectedComponent =
  11781. component.id === metaDataItem.id;
  11782. }
  11783. else {
  11784. selectedComponent =
  11785. component.name === metaDataItem.name;
  11786. }
  11787. if (selectedComponent &&
  11788. !ngModule.compodocLinks.components.includes(component)) {
  11789. if (!component.standalone) {
  11790. ngModule.compodocLinks.components.push(component);
  11791. }
  11792. }
  11793. return selectedComponent;
  11794. });
  11795. case 'controller':
  11796. return DependenciesEngine$1.getControllers().some(function (controller) {
  11797. var selectedController;
  11798. if (typeof metaDataItem.id !== 'undefined') {
  11799. selectedController =
  11800. controller.id === metaDataItem.id;
  11801. }
  11802. else {
  11803. selectedController =
  11804. controller.name === metaDataItem.name;
  11805. }
  11806. if (selectedController &&
  11807. !ngModule.compodocLinks.controllers.includes(controller)) {
  11808. ngModule.compodocLinks.controllers.push(controller);
  11809. }
  11810. return selectedController;
  11811. });
  11812. case 'module':
  11813. return DependenciesEngine$1.getModules().some(function (module) { return module.name === metaDataItem.name; });
  11814. case 'pipe':
  11815. return DependenciesEngine$1.getPipes().some(function (pipe) {
  11816. var selectedPipe;
  11817. if (typeof metaDataItem.id !== 'undefined') {
  11818. selectedPipe = pipe.id === metaDataItem.id;
  11819. }
  11820. else {
  11821. selectedPipe = pipe.name === metaDataItem.name;
  11822. }
  11823. if (selectedPipe &&
  11824. !ngModule.compodocLinks.pipes.includes(pipe)) {
  11825. ngModule.compodocLinks.pipes.push(pipe);
  11826. }
  11827. return selectedPipe;
  11828. });
  11829. default:
  11830. return true;
  11831. }
  11832. });
  11833. });
  11834. ngModule.providers = ngModule.providers.filter(function (provider) {
  11835. return (DependenciesEngine$1.getInjectables().some(function (injectable) {
  11836. var selectedInjectable = injectable.name === provider.name;
  11837. if (selectedInjectable &&
  11838. !ngModule.compodocLinks.injectables.includes(injectable)) {
  11839. ngModule.compodocLinks.injectables.push(injectable);
  11840. }
  11841. return selectedInjectable;
  11842. }) ||
  11843. DependenciesEngine$1.getInterceptors().some(function (interceptor) { return interceptor.name === provider.name; }));
  11844. });
  11845. // Try fixing type undefined for each providers
  11846. ___namespace.forEach(ngModule.providers, function (provider) {
  11847. if (DependenciesEngine$1.getInjectables().find(function (injectable) { return injectable.name === provider.name; })) {
  11848. provider.type = 'injectable';
  11849. }
  11850. if (DependenciesEngine$1.getInterceptors().find(function (interceptor) { return interceptor.name === provider.name; })) {
  11851. provider.type = 'interceptor';
  11852. }
  11853. });
  11854. // Order things
  11855. ngModule.compodocLinks.components = ___namespace.sortBy(ngModule.compodocLinks.components, [
  11856. 'name'
  11857. ]);
  11858. ngModule.compodocLinks.controllers = ___namespace.sortBy(ngModule.compodocLinks.controllers, [
  11859. 'name'
  11860. ]);
  11861. ngModule.compodocLinks.directives = ___namespace.sortBy(ngModule.compodocLinks.directives, [
  11862. 'name'
  11863. ]);
  11864. ngModule.compodocLinks.injectables = ___namespace.sortBy(ngModule.compodocLinks.injectables, [
  11865. 'name'
  11866. ]);
  11867. ngModule.compodocLinks.pipes = ___namespace.sortBy(ngModule.compodocLinks.pipes, ['name']);
  11868. ngModule.declarations = ___namespace.sortBy(ngModule.declarations, ['name']);
  11869. ngModule.entryComponents = ___namespace.sortBy(ngModule.entryComponents, ['name']);
  11870. ngModule.providers = ___namespace.sortBy(ngModule.providers, ['name']);
  11871. ngModule.imports = ___namespace.sortBy(ngModule.imports, ['name']);
  11872. ngModule.exports = ___namespace.sortBy(ngModule.exports, ['name']);
  11873. return ngModule;
  11874. });
  11875. Configuration$1.addPage({
  11876. name: 'modules',
  11877. id: 'modules',
  11878. context: 'modules',
  11879. depth: 0,
  11880. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
  11881. });
  11882. var len = Configuration$1.mainData.modules.length;
  11883. var loop = function () {
  11884. if (i < len) {
  11885. if (MarkdownEngine$1.hasNeighbourReadmeFile(Configuration$1.mainData.modules[i].file)) {
  11886. logger.info(" ".concat(Configuration$1.mainData.modules[i].name, " has a README file, include it"));
  11887. var readme = MarkdownEngine$1.readNeighbourReadmeFile(Configuration$1.mainData.modules[i].file);
  11888. Configuration$1.mainData.modules[i].readme = markedAcl(readme);
  11889. }
  11890. Configuration$1.addPage({
  11891. path: 'modules',
  11892. name: Configuration$1.mainData.modules[i].name,
  11893. id: Configuration$1.mainData.modules[i].id,
  11894. navTabs: _this.getNavTabs(Configuration$1.mainData.modules[i]),
  11895. context: 'module',
  11896. module: Configuration$1.mainData.modules[i],
  11897. depth: 1,
  11898. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  11899. });
  11900. i++;
  11901. loop();
  11902. }
  11903. else {
  11904. resolve(true);
  11905. }
  11906. };
  11907. loop();
  11908. });
  11909. };
  11910. Application.prototype.prepareInterfaces = function (someInterfaces) {
  11911. var _this = this;
  11912. logger.info('Prepare interfaces');
  11913. Configuration$1.mainData.interfaces = someInterfaces
  11914. ? someInterfaces
  11915. : DependenciesEngine$1.getInterfaces();
  11916. return new Promise(function (resolve, reject) {
  11917. var i = 0;
  11918. var len = Configuration$1.mainData.interfaces.length;
  11919. var loop = function () {
  11920. if (i < len) {
  11921. var interf = Configuration$1.mainData.interfaces[i];
  11922. if (MarkdownEngine$1.hasNeighbourReadmeFile(interf.file)) {
  11923. logger.info(" ".concat(interf.name, " has a README file, include it"));
  11924. var readme = MarkdownEngine$1.readNeighbourReadmeFile(interf.file);
  11925. interf.readme = markedAcl(readme);
  11926. }
  11927. var page = {
  11928. path: 'interfaces',
  11929. name: interf.name,
  11930. id: interf.id,
  11931. navTabs: _this.getNavTabs(interf),
  11932. context: 'interface',
  11933. interface: interf,
  11934. depth: 1,
  11935. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  11936. };
  11937. if (interf.isDuplicate) {
  11938. page.name += '-' + interf.duplicateId;
  11939. }
  11940. Configuration$1.addPage(page);
  11941. i++;
  11942. loop();
  11943. }
  11944. else {
  11945. resolve(true);
  11946. }
  11947. };
  11948. loop();
  11949. });
  11950. };
  11951. Application.prototype.prepareMiscellaneous = function (someMisc) {
  11952. logger.info('Prepare miscellaneous');
  11953. Configuration$1.mainData.miscellaneous = someMisc
  11954. ? someMisc
  11955. : DependenciesEngine$1.getMiscellaneous();
  11956. return new Promise(function (resolve, reject) {
  11957. if (Configuration$1.mainData.miscellaneous.functions.length > 0) {
  11958. Configuration$1.addPage({
  11959. path: 'miscellaneous',
  11960. name: 'functions',
  11961. id: 'miscellaneous-functions',
  11962. context: 'miscellaneous-functions',
  11963. depth: 1,
  11964. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  11965. });
  11966. }
  11967. if (Configuration$1.mainData.miscellaneous.variables.length > 0) {
  11968. Configuration$1.addPage({
  11969. path: 'miscellaneous',
  11970. name: 'variables',
  11971. id: 'miscellaneous-variables',
  11972. context: 'miscellaneous-variables',
  11973. depth: 1,
  11974. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  11975. });
  11976. }
  11977. if (Configuration$1.mainData.miscellaneous.typealiases.length > 0) {
  11978. Configuration$1.addPage({
  11979. path: 'miscellaneous',
  11980. name: 'typealiases',
  11981. id: 'miscellaneous-typealiases',
  11982. context: 'miscellaneous-typealiases',
  11983. depth: 1,
  11984. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  11985. });
  11986. }
  11987. if (Configuration$1.mainData.miscellaneous.enumerations.length > 0) {
  11988. Configuration$1.addPage({
  11989. path: 'miscellaneous',
  11990. name: 'enumerations',
  11991. id: 'miscellaneous-enumerations',
  11992. context: 'miscellaneous-enumerations',
  11993. depth: 1,
  11994. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  11995. });
  11996. }
  11997. resolve(true);
  11998. });
  11999. };
  12000. Application.prototype.handleTemplateurl = function (component) {
  12001. var dirname = path__namespace.dirname(component.file);
  12002. var templatePath = path__namespace.resolve(dirname + path__namespace.sep + component.templateUrl);
  12003. if (!FileEngine$1.existsSync(templatePath)) {
  12004. var err = "Cannot read template for ".concat(component.name);
  12005. logger.error(err);
  12006. return new Promise(function (resolve, reject) { });
  12007. }
  12008. return FileEngine$1.get(templatePath).then(function (data) { return (component.templateData = data); }, function (err) {
  12009. logger.error(err);
  12010. return Promise.reject('');
  12011. });
  12012. };
  12013. Application.prototype.handleStyles = function (component) {
  12014. var styles = component.styles;
  12015. component.stylesData = '';
  12016. return new Promise(function (resolveStyles, rejectStyles) {
  12017. styles.forEach(function (style) {
  12018. component.stylesData = component.stylesData + style + '\n';
  12019. });
  12020. resolveStyles(true);
  12021. });
  12022. };
  12023. Application.prototype.handleStyleurls = function (component) {
  12024. var dirname = path__namespace.dirname(component.file);
  12025. var styleDataPromise = component.styleUrls.map(function (styleUrl) {
  12026. var stylePath = path__namespace.resolve(dirname + path__namespace.sep + styleUrl);
  12027. if (!FileEngine$1.existsSync(stylePath)) {
  12028. var err = "Cannot read style url ".concat(stylePath, " for ").concat(component.name);
  12029. logger.error(err);
  12030. return new Promise(function (resolve, reject) { });
  12031. }
  12032. return new Promise(function (resolve, reject) {
  12033. FileEngine$1.get(stylePath).then(function (data) {
  12034. resolve({
  12035. data: data,
  12036. styleUrl: styleUrl
  12037. });
  12038. });
  12039. });
  12040. });
  12041. return Promise.all(styleDataPromise).then(function (data) { return (component.styleUrlsData = data); }, function (err) {
  12042. logger.error(err);
  12043. return Promise.reject('');
  12044. });
  12045. };
  12046. Application.prototype.getNavTabs = function (dependency) {
  12047. var navTabConfig = Configuration$1.mainData.navTabConfig;
  12048. var hasCustomNavTabConfig = navTabConfig.length !== 0;
  12049. navTabConfig =
  12050. navTabConfig.length === 0
  12051. ? ___namespace.cloneDeep(COMPODOC_CONSTANTS.navTabDefinitions)
  12052. : navTabConfig;
  12053. var matchDepType = function (depType) {
  12054. return depType === 'all' || depType === dependency.type;
  12055. };
  12056. var navTabs = [];
  12057. ___namespace.forEach(navTabConfig, function (customTab) {
  12058. var navTab = ___namespace.find(COMPODOC_CONSTANTS.navTabDefinitions, { id: customTab.id });
  12059. if (!navTab) {
  12060. throw new Error("Invalid tab ID '".concat(customTab.id, "' specified in tab configuration"));
  12061. }
  12062. navTab.label = customTab.label;
  12063. if (hasCustomNavTabConfig) {
  12064. navTab.custom = true;
  12065. }
  12066. // is tab applicable to target dependency?
  12067. if (-1 === ___namespace.findIndex(navTab.depTypes, matchDepType)) {
  12068. return;
  12069. }
  12070. // global config
  12071. if (customTab.id === 'tree' && Configuration$1.mainData.disableDomTree) {
  12072. return;
  12073. }
  12074. if (customTab.id === 'source' && Configuration$1.mainData.disableSourceCode) {
  12075. return;
  12076. }
  12077. if (customTab.id === 'templateData' && Configuration$1.mainData.disableTemplateTab) {
  12078. return;
  12079. }
  12080. if (customTab.id === 'styleData' && Configuration$1.mainData.disableStyleTab) {
  12081. return;
  12082. }
  12083. // per dependency config
  12084. if (customTab.id === 'readme' && !dependency.readme) {
  12085. return;
  12086. }
  12087. if (customTab.id === 'example' && !dependency.exampleUrls) {
  12088. return;
  12089. }
  12090. if (customTab.id === 'templateData' &&
  12091. (!dependency.templateUrl || dependency.templateUrl.length === 0)) {
  12092. return;
  12093. }
  12094. if (customTab.id === 'styleData' &&
  12095. (!dependency.styleUrls || dependency.styleUrls.length === 0) &&
  12096. (!dependency.styles || dependency.styles.length === 0)) {
  12097. return;
  12098. }
  12099. navTabs.push(navTab);
  12100. });
  12101. if (navTabs.length === 0) {
  12102. 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."));
  12103. }
  12104. return navTabs;
  12105. };
  12106. Application.prototype.prepareControllers = function (someControllers) {
  12107. var _this = this;
  12108. logger.info('Prepare controllers');
  12109. Configuration$1.mainData.controllers = someControllers
  12110. ? someControllers
  12111. : DependenciesEngine$1.getControllers();
  12112. return new Promise(function (resolve, reject) {
  12113. var i = 0;
  12114. var len = Configuration$1.mainData.controllers.length;
  12115. var loop = function () {
  12116. if (i < len) {
  12117. var controller = Configuration$1.mainData.controllers[i];
  12118. var page = {
  12119. path: 'controllers',
  12120. name: controller.name,
  12121. id: controller.id,
  12122. navTabs: _this.getNavTabs(controller),
  12123. context: 'controller',
  12124. controller: controller,
  12125. depth: 1,
  12126. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  12127. };
  12128. if (controller.isDuplicate) {
  12129. page.name += '-' + controller.duplicateId;
  12130. }
  12131. Configuration$1.addPage(page);
  12132. i++;
  12133. loop();
  12134. }
  12135. else {
  12136. resolve(true);
  12137. }
  12138. };
  12139. loop();
  12140. });
  12141. };
  12142. Application.prototype.prepareEntities = function (someEntities) {
  12143. var _this = this;
  12144. logger.info('Prepare entities');
  12145. Configuration$1.mainData.entities = someEntities
  12146. ? someEntities
  12147. : DependenciesEngine$1.getEntities();
  12148. return new Promise(function (resolve, reject) {
  12149. var i = 0;
  12150. var len = Configuration$1.mainData.entities.length;
  12151. var loop = function () {
  12152. if (i < len) {
  12153. var entity = Configuration$1.mainData.entities[i];
  12154. var page = {
  12155. path: 'entities',
  12156. name: entity.name,
  12157. id: entity.id,
  12158. navTabs: _this.getNavTabs(entity),
  12159. context: 'entity',
  12160. entity: entity,
  12161. depth: 1,
  12162. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  12163. };
  12164. if (entity.isDuplicate) {
  12165. page.name += '-' + entity.duplicateId;
  12166. }
  12167. Configuration$1.addPage(page);
  12168. i++;
  12169. loop();
  12170. }
  12171. else {
  12172. resolve(true);
  12173. }
  12174. };
  12175. loop();
  12176. });
  12177. };
  12178. Application.prototype.prepareComponents = function (someComponents) {
  12179. var _this = this;
  12180. logger.info('Prepare components');
  12181. Configuration$1.mainData.components = someComponents
  12182. ? someComponents
  12183. : DependenciesEngine$1.getComponents();
  12184. return new Promise(function (mainPrepareComponentResolve, mainPrepareComponentReject) {
  12185. var i = 0;
  12186. var len = Configuration$1.mainData.components.length;
  12187. var loop = function () {
  12188. if (i <= len - 1) {
  12189. var component_1 = Configuration$1.mainData.components[i];
  12190. if (MarkdownEngine$1.hasNeighbourReadmeFile(component_1.file)) {
  12191. logger.info(" ".concat(component_1.name, " has a README file, include it"));
  12192. var readmeFile = MarkdownEngine$1.readNeighbourReadmeFile(component_1.file);
  12193. component_1.readme = markedAcl(readmeFile);
  12194. }
  12195. var page = {
  12196. path: 'components',
  12197. name: component_1.name,
  12198. id: component_1.id,
  12199. navTabs: _this.getNavTabs(component_1),
  12200. context: 'component',
  12201. component: component_1,
  12202. depth: 1,
  12203. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  12204. };
  12205. if (component_1.isDuplicate) {
  12206. page.name += '-' + component_1.duplicateId;
  12207. }
  12208. Configuration$1.addPage(page);
  12209. var componentTemplateUrlPromise = new Promise(function (componentTemplateUrlResolve, componentTemplateUrlReject) {
  12210. if (component_1.templateUrl.length > 0) {
  12211. logger.info(" ".concat(component_1.name, " has a templateUrl, include it"));
  12212. _this.handleTemplateurl(component_1).then(function () {
  12213. componentTemplateUrlResolve(true);
  12214. }, function (e) {
  12215. logger.error(e);
  12216. componentTemplateUrlReject();
  12217. });
  12218. }
  12219. else {
  12220. componentTemplateUrlResolve(true);
  12221. }
  12222. });
  12223. var componentStyleUrlsPromise = new Promise(function (componentStyleUrlsResolve, componentStyleUrlsReject) {
  12224. if (component_1.styleUrls.length > 0) {
  12225. logger.info(" ".concat(component_1.name, " has styleUrls, include them"));
  12226. _this.handleStyleurls(component_1).then(function () {
  12227. componentStyleUrlsResolve(true);
  12228. }, function (e) {
  12229. logger.error(e);
  12230. componentStyleUrlsReject();
  12231. });
  12232. }
  12233. else {
  12234. componentStyleUrlsResolve(true);
  12235. }
  12236. });
  12237. var componentStylesPromise = new Promise(function (componentStylesResolve, componentStylesReject) {
  12238. if (component_1.styles.length > 0) {
  12239. logger.info(" ".concat(component_1.name, " has styles, include them"));
  12240. _this.handleStyles(component_1).then(function () {
  12241. componentStylesResolve(true);
  12242. }, function (e) {
  12243. logger.error(e);
  12244. componentStylesReject();
  12245. });
  12246. }
  12247. else {
  12248. componentStylesResolve(true);
  12249. }
  12250. });
  12251. Promise.all([
  12252. componentTemplateUrlPromise,
  12253. componentStyleUrlsPromise,
  12254. componentStylesPromise
  12255. ]).then(function () {
  12256. i++;
  12257. loop();
  12258. });
  12259. }
  12260. else {
  12261. mainPrepareComponentResolve(true);
  12262. }
  12263. };
  12264. loop();
  12265. });
  12266. };
  12267. Application.prototype.prepareDirectives = function (someDirectives) {
  12268. var _this = this;
  12269. logger.info('Prepare directives');
  12270. Configuration$1.mainData.directives = someDirectives
  12271. ? someDirectives
  12272. : DependenciesEngine$1.getDirectives();
  12273. return new Promise(function (resolve, reject) {
  12274. var i = 0;
  12275. var len = Configuration$1.mainData.directives.length;
  12276. var loop = function () {
  12277. if (i < len) {
  12278. var directive = Configuration$1.mainData.directives[i];
  12279. if (MarkdownEngine$1.hasNeighbourReadmeFile(directive.file)) {
  12280. logger.info(" ".concat(directive.name, " has a README file, include it"));
  12281. var readme = MarkdownEngine$1.readNeighbourReadmeFile(directive.file);
  12282. directive.readme = markedAcl(readme);
  12283. }
  12284. var page = {
  12285. path: 'directives',
  12286. name: directive.name,
  12287. id: directive.id,
  12288. navTabs: _this.getNavTabs(directive),
  12289. context: 'directive',
  12290. directive: directive,
  12291. depth: 1,
  12292. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  12293. };
  12294. if (directive.isDuplicate) {
  12295. page.name += '-' + directive.duplicateId;
  12296. }
  12297. Configuration$1.addPage(page);
  12298. i++;
  12299. loop();
  12300. }
  12301. else {
  12302. resolve(true);
  12303. }
  12304. };
  12305. loop();
  12306. });
  12307. };
  12308. Application.prototype.prepareInjectables = function (someInjectables) {
  12309. var _this = this;
  12310. logger.info('Prepare injectables');
  12311. Configuration$1.mainData.injectables = someInjectables
  12312. ? someInjectables
  12313. : DependenciesEngine$1.getInjectables();
  12314. return new Promise(function (resolve, reject) {
  12315. var i = 0;
  12316. var len = Configuration$1.mainData.injectables.length;
  12317. var loop = function () {
  12318. if (i < len) {
  12319. var injec = Configuration$1.mainData.injectables[i];
  12320. if (MarkdownEngine$1.hasNeighbourReadmeFile(injec.file)) {
  12321. logger.info(" ".concat(injec.name, " has a README file, include it"));
  12322. var readme = MarkdownEngine$1.readNeighbourReadmeFile(injec.file);
  12323. injec.readme = markedAcl(readme);
  12324. }
  12325. var page = {
  12326. path: 'injectables',
  12327. name: injec.name,
  12328. id: injec.id,
  12329. navTabs: _this.getNavTabs(injec),
  12330. context: 'injectable',
  12331. injectable: injec,
  12332. depth: 1,
  12333. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  12334. };
  12335. if (injec.isDuplicate) {
  12336. page.name += '-' + injec.duplicateId;
  12337. }
  12338. Configuration$1.addPage(page);
  12339. i++;
  12340. loop();
  12341. }
  12342. else {
  12343. resolve();
  12344. }
  12345. };
  12346. loop();
  12347. });
  12348. };
  12349. Application.prototype.prepareInterceptors = function (someInterceptors) {
  12350. var _this = this;
  12351. logger.info('Prepare interceptors');
  12352. Configuration$1.mainData.interceptors = someInterceptors
  12353. ? someInterceptors
  12354. : DependenciesEngine$1.getInterceptors();
  12355. return new Promise(function (resolve, reject) {
  12356. var i = 0;
  12357. var len = Configuration$1.mainData.interceptors.length;
  12358. var loop = function () {
  12359. if (i < len) {
  12360. var interceptor = Configuration$1.mainData.interceptors[i];
  12361. if (MarkdownEngine$1.hasNeighbourReadmeFile(interceptor.file)) {
  12362. logger.info(" ".concat(interceptor.name, " has a README file, include it"));
  12363. var readme = MarkdownEngine$1.readNeighbourReadmeFile(interceptor.file);
  12364. interceptor.readme = markedAcl(readme);
  12365. }
  12366. var page = {
  12367. path: 'interceptors',
  12368. name: interceptor.name,
  12369. id: interceptor.id,
  12370. navTabs: _this.getNavTabs(interceptor),
  12371. context: 'interceptor',
  12372. injectable: interceptor,
  12373. depth: 1,
  12374. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  12375. };
  12376. if (interceptor.isDuplicate) {
  12377. page.name += '-' + interceptor.duplicateId;
  12378. }
  12379. Configuration$1.addPage(page);
  12380. i++;
  12381. loop();
  12382. }
  12383. else {
  12384. resolve();
  12385. }
  12386. };
  12387. loop();
  12388. });
  12389. };
  12390. Application.prototype.prepareGuards = function (someGuards) {
  12391. var _this = this;
  12392. logger.info('Prepare guards');
  12393. Configuration$1.mainData.guards = someGuards ? someGuards : DependenciesEngine$1.getGuards();
  12394. return new Promise(function (resolve, reject) {
  12395. var i = 0;
  12396. var len = Configuration$1.mainData.guards.length;
  12397. var loop = function () {
  12398. if (i < len) {
  12399. var guard = Configuration$1.mainData.guards[i];
  12400. if (MarkdownEngine$1.hasNeighbourReadmeFile(guard.file)) {
  12401. logger.info(" ".concat(guard.name, " has a README file, include it"));
  12402. var readme = MarkdownEngine$1.readNeighbourReadmeFile(guard.file);
  12403. guard.readme = markedAcl(readme);
  12404. }
  12405. var page = {
  12406. path: 'guards',
  12407. name: guard.name,
  12408. id: guard.id,
  12409. navTabs: _this.getNavTabs(guard),
  12410. context: 'guard',
  12411. injectable: guard,
  12412. depth: 1,
  12413. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.INTERNAL
  12414. };
  12415. if (guard.isDuplicate) {
  12416. page.name += '-' + guard.duplicateId;
  12417. }
  12418. Configuration$1.addPage(page);
  12419. i++;
  12420. loop();
  12421. }
  12422. else {
  12423. resolve();
  12424. }
  12425. };
  12426. loop();
  12427. });
  12428. };
  12429. Application.prototype.prepareRoutes = function () {
  12430. logger.info('Process routes');
  12431. Configuration$1.mainData.routes = DependenciesEngine$1.getRoutes();
  12432. return new Promise(function (resolve, reject) {
  12433. Configuration$1.addPage({
  12434. name: 'routes',
  12435. id: 'routes',
  12436. context: 'routes',
  12437. depth: 0,
  12438. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
  12439. });
  12440. if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
  12441. RouterParserUtil$1.generateRoutesIndex(Configuration$1.mainData.output, Configuration$1.mainData.routes).then(function () {
  12442. logger.info(' Routes index generated');
  12443. resolve();
  12444. }, function (e) {
  12445. logger.error(e);
  12446. reject();
  12447. });
  12448. }
  12449. else {
  12450. resolve();
  12451. }
  12452. });
  12453. };
  12454. Application.prototype.prepareCoverage = function () {
  12455. logger.info('Process documentation coverage report');
  12456. return new Promise(function (resolve, reject) {
  12457. /*
  12458. * loop with components, directives, controllers, entities, classes, injectables, interfaces, pipes, guards, misc functions variables
  12459. */
  12460. var files = [];
  12461. var totalProjectStatementDocumented = 0;
  12462. var getStatus = function (percent) {
  12463. var status;
  12464. if (percent <= 25) {
  12465. status = 'low';
  12466. }
  12467. else if (percent > 25 && percent <= 50) {
  12468. status = 'medium';
  12469. }
  12470. else if (percent > 50 && percent <= 75) {
  12471. status = 'good';
  12472. }
  12473. else {
  12474. status = 'very-good';
  12475. }
  12476. return status;
  12477. };
  12478. var processComponentsAndDirectivesAndControllersAndEntities = function (list) {
  12479. ___namespace.forEach(list, function (el) {
  12480. var element = Object.assign({}, el);
  12481. if (!element.propertiesClass) {
  12482. element.propertiesClass = [];
  12483. }
  12484. if (!element.methodsClass) {
  12485. element.methodsClass = [];
  12486. }
  12487. if (!element.hostBindings) {
  12488. element.hostBindings = [];
  12489. }
  12490. if (!element.hostListeners) {
  12491. element.hostListeners = [];
  12492. }
  12493. if (!element.inputsClass) {
  12494. element.inputsClass = [];
  12495. }
  12496. if (!element.outputsClass) {
  12497. element.outputsClass = [];
  12498. }
  12499. var cl = {
  12500. filePath: element.file,
  12501. type: element.type,
  12502. linktype: element.type,
  12503. name: element.name
  12504. };
  12505. var totalStatementDocumented = 0;
  12506. var totalStatements = element.propertiesClass.length +
  12507. element.methodsClass.length +
  12508. element.inputsClass.length +
  12509. element.hostBindings.length +
  12510. element.hostListeners.length +
  12511. element.outputsClass.length +
  12512. 1; // +1 for element decorator comment
  12513. if (element.constructorObj) {
  12514. totalStatements += 1;
  12515. if (element.constructorObj &&
  12516. element.constructorObj.description &&
  12517. element.constructorObj.description !== '') {
  12518. totalStatementDocumented += 1;
  12519. }
  12520. }
  12521. if (element.description && element.description !== '') {
  12522. totalStatementDocumented += 1;
  12523. }
  12524. ___namespace.forEach(element.propertiesClass, function (property) {
  12525. if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
  12526. // Doesn't handle private for coverage
  12527. totalStatements -= 1;
  12528. }
  12529. if (property.description &&
  12530. property.description !== '' &&
  12531. property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
  12532. totalStatementDocumented += 1;
  12533. }
  12534. });
  12535. ___namespace.forEach(element.methodsClass, function (method) {
  12536. if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
  12537. // Doesn't handle private for coverage
  12538. totalStatements -= 1;
  12539. }
  12540. if (method.description &&
  12541. method.description !== '' &&
  12542. method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
  12543. totalStatementDocumented += 1;
  12544. }
  12545. });
  12546. ___namespace.forEach(element.hostBindings, function (property) {
  12547. if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
  12548. // Doesn't handle private for coverage
  12549. totalStatements -= 1;
  12550. }
  12551. if (property.description &&
  12552. property.description !== '' &&
  12553. property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
  12554. totalStatementDocumented += 1;
  12555. }
  12556. });
  12557. ___namespace.forEach(element.hostListeners, function (method) {
  12558. if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
  12559. // Doesn't handle private for coverage
  12560. totalStatements -= 1;
  12561. }
  12562. if (method.description &&
  12563. method.description !== '' &&
  12564. method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
  12565. totalStatementDocumented += 1;
  12566. }
  12567. });
  12568. ___namespace.forEach(element.inputsClass, function (input) {
  12569. if (input.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
  12570. // Doesn't handle private for coverage
  12571. totalStatements -= 1;
  12572. }
  12573. if (input.description &&
  12574. input.description !== '' &&
  12575. input.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
  12576. totalStatementDocumented += 1;
  12577. }
  12578. });
  12579. ___namespace.forEach(element.outputsClass, function (output) {
  12580. if (output.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
  12581. // Doesn't handle private for coverage
  12582. totalStatements -= 1;
  12583. }
  12584. if (output.description &&
  12585. output.description !== '' &&
  12586. output.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
  12587. totalStatementDocumented += 1;
  12588. }
  12589. });
  12590. cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
  12591. if (totalStatements === 0) {
  12592. cl.coveragePercent = 0;
  12593. }
  12594. cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
  12595. cl.status = getStatus(cl.coveragePercent);
  12596. totalProjectStatementDocumented += cl.coveragePercent;
  12597. files.push(cl);
  12598. });
  12599. };
  12600. var processCoveragePerFile = function () {
  12601. logger.info('Process documentation coverage per file');
  12602. logger.info('-------------------');
  12603. var overFiles = files.filter(function (f) {
  12604. var overTest = f.coveragePercent >= Configuration$1.mainData.coverageMinimumPerFile;
  12605. if (overTest && !Configuration$1.mainData.coverageTestShowOnlyFailed) {
  12606. logger.info("".concat(f.coveragePercent, " % for file ").concat(f.filePath, " - ").concat(f.name, " - over minimum per file"));
  12607. }
  12608. return overTest;
  12609. });
  12610. var underFiles = files.filter(function (f) {
  12611. var underTest = f.coveragePercent < Configuration$1.mainData.coverageMinimumPerFile;
  12612. if (underTest) {
  12613. logger.error("".concat(f.coveragePercent, " % for file ").concat(f.filePath, " - ").concat(f.name, " - under minimum per file"));
  12614. }
  12615. return underTest;
  12616. });
  12617. logger.info('-------------------');
  12618. return {
  12619. overFiles: overFiles,
  12620. underFiles: underFiles
  12621. };
  12622. };
  12623. var processFunctionsAndVariables = function (id, type) {
  12624. ___namespace.forEach(id, function (el) {
  12625. var cl = {
  12626. filePath: el.file,
  12627. type: type,
  12628. linktype: el.type,
  12629. linksubtype: el.subtype,
  12630. name: el.name
  12631. };
  12632. if (type === 'variable' || type === 'function' || type === 'type alias') {
  12633. cl.linktype = 'miscellaneous';
  12634. }
  12635. var totalStatementDocumented = 0;
  12636. var totalStatements = 1;
  12637. if (el.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
  12638. // Doesn't handle private for coverage
  12639. totalStatements -= 1;
  12640. }
  12641. if (el.description &&
  12642. el.description !== '' &&
  12643. el.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
  12644. totalStatementDocumented += 1;
  12645. }
  12646. cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
  12647. cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
  12648. cl.status = getStatus(cl.coveragePercent);
  12649. totalProjectStatementDocumented += cl.coveragePercent;
  12650. files.push(cl);
  12651. });
  12652. };
  12653. var processClasses = function (list, type, linktype) {
  12654. ___namespace.forEach(list, function (cl) {
  12655. var element = Object.assign({}, cl);
  12656. if (!element.properties) {
  12657. element.properties = [];
  12658. }
  12659. if (!element.methods) {
  12660. element.methods = [];
  12661. }
  12662. var cla = {
  12663. filePath: element.file,
  12664. type: type,
  12665. linktype: linktype,
  12666. name: element.name
  12667. };
  12668. var totalStatementDocumented = 0;
  12669. var totalStatements = element.properties.length + element.methods.length + 1; // +1 for element itself
  12670. if (element.constructorObj) {
  12671. totalStatements += 1;
  12672. if (element.constructorObj &&
  12673. element.constructorObj.description &&
  12674. element.constructorObj.description !== '') {
  12675. totalStatementDocumented += 1;
  12676. }
  12677. }
  12678. if (element.description && element.description !== '') {
  12679. totalStatementDocumented += 1;
  12680. }
  12681. ___namespace.forEach(element.properties, function (property) {
  12682. if (property.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
  12683. // Doesn't handle private for coverage
  12684. totalStatements -= 1;
  12685. }
  12686. if (property.description &&
  12687. property.description !== '' &&
  12688. property.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
  12689. totalStatementDocumented += 1;
  12690. }
  12691. });
  12692. ___namespace.forEach(element.methods, function (method) {
  12693. if (method.modifierKind === tsMorph.SyntaxKind.PrivateKeyword) {
  12694. // Doesn't handle private for coverage
  12695. totalStatements -= 1;
  12696. }
  12697. if (method.description &&
  12698. method.description !== '' &&
  12699. method.modifierKind !== tsMorph.SyntaxKind.PrivateKeyword) {
  12700. totalStatementDocumented += 1;
  12701. }
  12702. });
  12703. cla.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
  12704. if (totalStatements === 0) {
  12705. cla.coveragePercent = 0;
  12706. }
  12707. cla.coverageCount = totalStatementDocumented + '/' + totalStatements;
  12708. cla.status = getStatus(cla.coveragePercent);
  12709. totalProjectStatementDocumented += cla.coveragePercent;
  12710. files.push(cla);
  12711. });
  12712. };
  12713. processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.components);
  12714. processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.directives);
  12715. processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.controllers);
  12716. processComponentsAndDirectivesAndControllersAndEntities(Configuration$1.mainData.entities);
  12717. processClasses(Configuration$1.mainData.classes, 'class', 'classe');
  12718. processClasses(Configuration$1.mainData.injectables, 'injectable', 'injectable');
  12719. processClasses(Configuration$1.mainData.interfaces, 'interface', 'interface');
  12720. processClasses(Configuration$1.mainData.guards, 'guard', 'guard');
  12721. processClasses(Configuration$1.mainData.interceptors, 'interceptor', 'interceptor');
  12722. ___namespace.forEach(Configuration$1.mainData.pipes, function (pipe) {
  12723. var cl = {
  12724. filePath: pipe.file,
  12725. type: pipe.type,
  12726. linktype: pipe.type,
  12727. name: pipe.name
  12728. };
  12729. var totalStatementDocumented = 0;
  12730. var totalStatements = 1;
  12731. if (pipe.description && pipe.description !== '') {
  12732. totalStatementDocumented += 1;
  12733. }
  12734. cl.coveragePercent = Math.floor((totalStatementDocumented / totalStatements) * 100);
  12735. cl.coverageCount = totalStatementDocumented + '/' + totalStatements;
  12736. cl.status = getStatus(cl.coveragePercent);
  12737. totalProjectStatementDocumented += cl.coveragePercent;
  12738. files.push(cl);
  12739. });
  12740. processFunctionsAndVariables(Configuration$1.mainData.miscellaneous.functions, 'function');
  12741. processFunctionsAndVariables(Configuration$1.mainData.miscellaneous.variables, 'variable');
  12742. processFunctionsAndVariables(Configuration$1.mainData.miscellaneous.typealiases, 'type alias');
  12743. files = ___namespace.sortBy(files, ['filePath']);
  12744. var coverageData = {
  12745. count: files.length > 0
  12746. ? Math.floor(totalProjectStatementDocumented / files.length)
  12747. : 0,
  12748. status: '',
  12749. files: files
  12750. };
  12751. coverageData.status = getStatus(coverageData.count);
  12752. Configuration$1.addPage({
  12753. name: 'coverage',
  12754. id: 'coverage',
  12755. context: 'coverage',
  12756. files: files,
  12757. data: coverageData,
  12758. depth: 0,
  12759. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
  12760. });
  12761. coverageData.files = files;
  12762. Configuration$1.mainData.coverageData = coverageData;
  12763. if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
  12764. HtmlEngine$1.generateCoverageBadge(Configuration$1.mainData.output, 'documentation', coverageData);
  12765. }
  12766. files = ___namespace.sortBy(files, ['coveragePercent']);
  12767. var coverageTestPerFileResults;
  12768. if (Configuration$1.mainData.coverageTest &&
  12769. !Configuration$1.mainData.coverageTestPerFile) {
  12770. // Global coverage test and not per file
  12771. if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold) {
  12772. logger.info("Documentation coverage (".concat(coverageData.count, "%) is over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"));
  12773. generationPromiseResolve(true);
  12774. process.exit(0);
  12775. }
  12776. else {
  12777. var message = "Documentation coverage (".concat(coverageData.count, "%) is not over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)");
  12778. generationPromiseReject();
  12779. if (Configuration$1.mainData.coverageTestThresholdFail) {
  12780. logger.error(message);
  12781. process.exit(1);
  12782. }
  12783. else {
  12784. logger.warn(message);
  12785. process.exit(0);
  12786. }
  12787. }
  12788. }
  12789. else if (!Configuration$1.mainData.coverageTest &&
  12790. Configuration$1.mainData.coverageTestPerFile) {
  12791. coverageTestPerFileResults = processCoveragePerFile();
  12792. // Per file coverage test and not global
  12793. if (coverageTestPerFileResults.underFiles.length > 0) {
  12794. var message = "Documentation coverage per file is not over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)");
  12795. generationPromiseReject();
  12796. if (Configuration$1.mainData.coverageTestThresholdFail) {
  12797. logger.error(message);
  12798. process.exit(1);
  12799. }
  12800. else {
  12801. logger.warn(message);
  12802. process.exit(0);
  12803. }
  12804. }
  12805. else {
  12806. logger.info("Documentation coverage per file is over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)"));
  12807. generationPromiseResolve(true);
  12808. process.exit(0);
  12809. }
  12810. }
  12811. else if (Configuration$1.mainData.coverageTest &&
  12812. Configuration$1.mainData.coverageTestPerFile) {
  12813. // Per file coverage test and global
  12814. coverageTestPerFileResults = processCoveragePerFile();
  12815. if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold &&
  12816. coverageTestPerFileResults.underFiles.length === 0) {
  12817. logger.info("Documentation coverage (".concat(coverageData.count, "%) is over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"));
  12818. logger.info("Documentation coverage per file is over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)"));
  12819. generationPromiseResolve(true);
  12820. process.exit(0);
  12821. }
  12822. else if (coverageData.count >= Configuration$1.mainData.coverageTestThreshold &&
  12823. coverageTestPerFileResults.underFiles.length > 0) {
  12824. logger.info("Documentation coverage (".concat(coverageData.count, "%) is over threshold (").concat(Configuration$1.mainData.coverageTestThreshold, "%)"));
  12825. var message = "Documentation coverage per file is not over threshold (".concat(Configuration$1.mainData.coverageMinimumPerFile, "%)");
  12826. generationPromiseReject();
  12827. if (Configuration$1.mainData.coverageTestThresholdFail) {
  12828. logger.error(message);
  12829. process.exit(1);
  12830. }
  12831. else {
  12832. logger.warn(message);
  12833. process.exit(0);
  12834. }
  12835. }
  12836. else if (coverageData.count < Configuration$1.mainData.coverageTestThreshold &&
  12837. coverageTestPerFileResults.underFiles.length > 0) {
  12838. 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, "%)");
  12839. generationPromiseReject();
  12840. if (Configuration$1.mainData.coverageTestThresholdFail) {
  12841. logger.error(messageGlobal);
  12842. logger.error(messagePerFile);
  12843. process.exit(1);
  12844. }
  12845. else {
  12846. logger.warn(messageGlobal);
  12847. logger.warn(messagePerFile);
  12848. process.exit(0);
  12849. }
  12850. }
  12851. else {
  12852. 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, "%)");
  12853. generationPromiseReject();
  12854. if (Configuration$1.mainData.coverageTestThresholdFail) {
  12855. logger.error(message);
  12856. logger.info(messagePerFile);
  12857. process.exit(1);
  12858. }
  12859. else {
  12860. logger.warn(message);
  12861. logger.info(messagePerFile);
  12862. process.exit(0);
  12863. }
  12864. }
  12865. }
  12866. else {
  12867. resolve(true);
  12868. }
  12869. });
  12870. };
  12871. Application.prototype.prepareUnitTestCoverage = function () {
  12872. logger.info('Process unit test coverage report');
  12873. return new Promise(function (resolve, reject) {
  12874. var covDat, covFileNames;
  12875. var coverageData = Configuration$1.mainData.coverageData;
  12876. if (!coverageData.files) {
  12877. logger.warn('Missing documentation coverage data');
  12878. }
  12879. else {
  12880. covDat = {};
  12881. covFileNames = ___namespace.map(coverageData.files, function (el) {
  12882. var fileName = path__namespace.normalize(el.filePath);
  12883. covDat[fileName] = {
  12884. type: el.type,
  12885. linktype: el.linktype,
  12886. linksubtype: el.linksubtype,
  12887. name: el.name
  12888. };
  12889. return fileName;
  12890. });
  12891. }
  12892. // read coverage summary file and data
  12893. var unitTestSummary = {};
  12894. var fileDat = FileEngine$1.getSync(Configuration$1.mainData.unitTestCoverage);
  12895. if (fileDat) {
  12896. unitTestSummary = JSON.parse(fileDat);
  12897. }
  12898. else {
  12899. return Promise.reject('Error reading unit test coverage file');
  12900. }
  12901. var getCovStatus = function (percent, totalLines) {
  12902. var status;
  12903. if (totalLines === 0) {
  12904. status = 'uncovered';
  12905. }
  12906. else if (percent <= 25) {
  12907. status = 'low';
  12908. }
  12909. else if (percent > 25 && percent <= 50) {
  12910. status = 'medium';
  12911. }
  12912. else if (percent > 50 && percent <= 75) {
  12913. status = 'good';
  12914. }
  12915. else {
  12916. status = 'very-good';
  12917. }
  12918. return status;
  12919. };
  12920. var getCoverageData = function (data, fileName) {
  12921. var out = {};
  12922. if (fileName !== 'total') {
  12923. if (covDat === undefined) {
  12924. // need a name to include in output but this isn't visible
  12925. out = { name: fileName, filePath: fileName };
  12926. }
  12927. else {
  12928. var findMatch = ___namespace.filter(covFileNames, function (el) {
  12929. var normalizedFilename = path__namespace.normalize(fileName).replace(/\\/g, '/');
  12930. return el.includes(fileName) || normalizedFilename.includes(el);
  12931. });
  12932. if (findMatch.length > 0) {
  12933. out = ___namespace.clone(covDat[findMatch[0]]);
  12934. out['filePath'] = fileName;
  12935. }
  12936. }
  12937. }
  12938. var keysToGet = ['statements', 'branches', 'functions', 'lines'];
  12939. ___namespace.forEach(keysToGet, function (key) {
  12940. if (data[key]) {
  12941. var t = data[key];
  12942. out[key] = {
  12943. coveragePercent: Math.round(t.pct),
  12944. coverageCount: '' + t.covered + '/' + t.total,
  12945. status: getCovStatus(t.pct, t.total)
  12946. };
  12947. }
  12948. });
  12949. return out;
  12950. };
  12951. var unitTestData = {};
  12952. var files = [];
  12953. for (var file in unitTestSummary) {
  12954. var dat = getCoverageData(unitTestSummary[file], file);
  12955. if (file === 'total') {
  12956. unitTestData['total'] = dat;
  12957. }
  12958. else {
  12959. files.push(dat);
  12960. }
  12961. }
  12962. unitTestData['files'] = files;
  12963. unitTestData['idColumn'] = covDat !== undefined; // should we include the id column
  12964. Configuration$1.mainData.unitTestData = unitTestData;
  12965. Configuration$1.addPage({
  12966. name: 'unit-test',
  12967. id: 'unit-test',
  12968. context: 'unit-test',
  12969. files: files,
  12970. data: unitTestData,
  12971. depth: 0,
  12972. pageType: COMPODOC_DEFAULTS.PAGE_TYPES.ROOT
  12973. });
  12974. if (Configuration$1.mainData.exportFormat === COMPODOC_DEFAULTS.exportFormat) {
  12975. var keysToGet = ['statements', 'branches', 'functions', 'lines'];
  12976. ___namespace.forEach(keysToGet, function (key) {
  12977. if (unitTestData['total'][key]) {
  12978. HtmlEngine$1.generateCoverageBadge(Configuration$1.mainData.output, key, {
  12979. count: unitTestData['total'][key]['coveragePercent'],
  12980. status: unitTestData['total'][key]['status']
  12981. });
  12982. }
  12983. });
  12984. }
  12985. resolve(true);
  12986. });
  12987. };
  12988. Application.prototype.processPage = function (page) {
  12989. logger.info('Process page', page.name);
  12990. var htmlData = HtmlEngine$1.render(Configuration$1.mainData, page);
  12991. var finalPath = Configuration$1.mainData.output;
  12992. if (Configuration$1.mainData.output.lastIndexOf('/') === -1) {
  12993. finalPath += '/';
  12994. }
  12995. if (page.path) {
  12996. finalPath += page.path + '/';
  12997. }
  12998. if (page.filename) {
  12999. finalPath += page.filename + '.html';
  13000. }
  13001. else {
  13002. finalPath += page.name + '.html';
  13003. }
  13004. if (!Configuration$1.mainData.disableSearch) {
  13005. SearchEngine$1.indexPage({
  13006. infos: page,
  13007. rawData: htmlData,
  13008. url: finalPath
  13009. });
  13010. }
  13011. FileEngine$1.writeSync(finalPath, htmlData);
  13012. return Promise.resolve(true);
  13013. };
  13014. Application.prototype.processPages = function () {
  13015. var _this = this;
  13016. var pages = ___namespace.sortBy(Configuration$1.pages, ['name']);
  13017. logger.info('Process pages');
  13018. Promise.all(pages.map(function (page) { return _this.processPage(page); }))
  13019. .then(function () {
  13020. var callbacksAfterGenerateSearchIndexJson = function () {
  13021. if (Configuration$1.mainData.additionalPages.length > 0) {
  13022. _this.processAdditionalPages();
  13023. }
  13024. else {
  13025. if (Configuration$1.mainData.assetsFolder !== '') {
  13026. _this.processAssetsFolder();
  13027. }
  13028. _this.processResources();
  13029. }
  13030. };
  13031. if (!Configuration$1.mainData.disableSearch) {
  13032. SearchEngine$1.generateSearchIndexJson(Configuration$1.mainData.output).then(function () {
  13033. callbacksAfterGenerateSearchIndexJson();
  13034. }, function (e) {
  13035. logger.error(e);
  13036. });
  13037. }
  13038. else {
  13039. callbacksAfterGenerateSearchIndexJson();
  13040. }
  13041. })
  13042. .then(function () {
  13043. return _this.processMenu(Configuration$1.mainData);
  13044. })
  13045. .catch(function (e) {
  13046. logger.error(e);
  13047. });
  13048. };
  13049. Application.prototype.transpileMenuWCToES5 = function (es6Code) {
  13050. return babel.transformAsync(es6Code, {
  13051. cwd: __dirname,
  13052. filename: 'menu-wc_es5.js',
  13053. presets: [
  13054. [
  13055. '@babel/preset-env',
  13056. {
  13057. targets: {
  13058. ie: '11'
  13059. }
  13060. }
  13061. ]
  13062. ],
  13063. plugins: [
  13064. [
  13065. '@babel/plugin-transform-private-methods',
  13066. {
  13067. loose: false
  13068. }
  13069. ]
  13070. ]
  13071. });
  13072. };
  13073. Application.prototype.processMenu = function (mainData) {
  13074. var _this = this;
  13075. logger.info('Process menu...');
  13076. return new Promise(function (resolveProcessMenu, rejectProcessMenu) {
  13077. var output = mainData.output.slice();
  13078. var outputLastCharacter = output.lastIndexOf('/');
  13079. if (outputLastCharacter !== -1) {
  13080. output = output.slice(0, -1);
  13081. }
  13082. var finalPathES6 = "".concat(output, "/js/menu-wc.js");
  13083. var finalPathES5 = "".concat(output, "/js/menu-wc_es5.js");
  13084. HtmlEngine$1.renderMenu(Configuration$1.mainData.templates, mainData)
  13085. .then(function (htmlData) {
  13086. FileEngine$1.write(finalPathES6, htmlData)
  13087. .then(function () {
  13088. _this.transpileMenuWCToES5(htmlData)
  13089. .then(function (es5Data) {
  13090. FileEngine$1.write(finalPathES5, es5Data.code)
  13091. .then(function () {
  13092. resolveProcessMenu();
  13093. })
  13094. .catch(function (err) {
  13095. logger.error('Error during ' + finalPathES5 + ' page generation');
  13096. logger.error(err);
  13097. return rejectProcessMenu('');
  13098. });
  13099. })
  13100. .catch(function (err) {
  13101. logger.error('Error during ' + finalPathES5 + ' page generation');
  13102. logger.error(err);
  13103. return rejectProcessMenu('');
  13104. });
  13105. })
  13106. .catch(function (err) {
  13107. logger.error('Error during ' + finalPathES6 + ' page generation');
  13108. logger.error(err);
  13109. return rejectProcessMenu('');
  13110. });
  13111. })
  13112. .catch(function (err) {
  13113. logger.error('Error during ' + finalPathES6 + ' page generation');
  13114. logger.error(err);
  13115. return rejectProcessMenu('');
  13116. });
  13117. });
  13118. };
  13119. Application.prototype.processAdditionalPages = function () {
  13120. var _this = this;
  13121. logger.info('Process additional pages');
  13122. var pages = Configuration$1.mainData.additionalPages;
  13123. Promise.all(pages.map(function (page) {
  13124. if (page.children.length > 0) {
  13125. return Promise.all(__spreadArray([
  13126. _this.processPage(page)
  13127. ], __read(page.children.map(function (childPage) { return _this.processPage(childPage); })), false));
  13128. }
  13129. else {
  13130. return _this.processPage(page);
  13131. }
  13132. }))
  13133. .then(function () {
  13134. SearchEngine$1.generateSearchIndexJson(Configuration$1.mainData.output).then(function () {
  13135. if (Configuration$1.mainData.assetsFolder !== '') {
  13136. _this.processAssetsFolder();
  13137. }
  13138. _this.processResources();
  13139. });
  13140. })
  13141. .catch(function (e) {
  13142. logger.error(e);
  13143. return Promise.reject(e);
  13144. });
  13145. };
  13146. Application.prototype.processAssetsFolder = function () {
  13147. logger.info('Copy assets folder');
  13148. if (!FileEngine$1.existsSync(Configuration$1.mainData.assetsFolder)) {
  13149. logger.error("Provided assets folder ".concat(Configuration$1.mainData.assetsFolder, " did not exist"));
  13150. }
  13151. else {
  13152. var finalOutput = Configuration$1.mainData.output;
  13153. var testOutputDir = Configuration$1.mainData.output.match(cwd$1);
  13154. if (testOutputDir && testOutputDir.length > 0) {
  13155. finalOutput = Configuration$1.mainData.output.replace(cwd$1 + path__namespace.sep, '');
  13156. }
  13157. var destination = path__namespace.join(finalOutput, path__namespace.basename(Configuration$1.mainData.assetsFolder));
  13158. fs__namespace.copy(path__namespace.resolve(Configuration$1.mainData.assetsFolder), path__namespace.resolve(destination), function (err) {
  13159. if (err) {
  13160. logger.error('Error during resources copy ', err);
  13161. }
  13162. });
  13163. }
  13164. };
  13165. Application.prototype.processResources = function () {
  13166. var _this = this;
  13167. logger.info('Copy main resources');
  13168. var onComplete = function () {
  13169. logger.info('Documentation generated in ' +
  13170. Configuration$1.mainData.output +
  13171. ' in ' +
  13172. _this.getElapsedTime() +
  13173. ' seconds using ' +
  13174. Configuration$1.mainData.theme +
  13175. ' theme');
  13176. if (Configuration$1.mainData.serve) {
  13177. logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(Configuration$1.mainData.port));
  13178. _this.runWebServer(Configuration$1.mainData.output);
  13179. }
  13180. else {
  13181. generationPromiseResolve(true);
  13182. _this.endCallback();
  13183. }
  13184. };
  13185. var finalOutput = Configuration$1.mainData.output;
  13186. var testOutputDir = Configuration$1.mainData.output.match(cwd$1);
  13187. if (testOutputDir && testOutputDir.length > 0) {
  13188. finalOutput = Configuration$1.mainData.output.replace(cwd$1 + path__namespace.sep, '');
  13189. }
  13190. fs__namespace.copy(path__namespace.resolve(__dirname + '/../src/resources/'), path__namespace.resolve(finalOutput), function (errorCopy) {
  13191. if (errorCopy) {
  13192. logger.error('Error during resources copy ', errorCopy);
  13193. }
  13194. else {
  13195. var extThemePromise = new Promise(function (extThemeResolve, extThemeReject) {
  13196. if (Configuration$1.mainData.extTheme) {
  13197. fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.extTheme), path__namespace.resolve(finalOutput + '/styles/'), function (errorCopyTheme) {
  13198. if (errorCopyTheme) {
  13199. logger.error('Error during external styling theme copy ', errorCopyTheme);
  13200. extThemeReject();
  13201. }
  13202. else {
  13203. logger.info('External styling theme copy succeeded');
  13204. extThemeResolve(true);
  13205. }
  13206. });
  13207. }
  13208. else {
  13209. extThemeResolve(true);
  13210. }
  13211. });
  13212. var customFaviconPromise = new Promise(function (customFaviconResolve, customFaviconReject) {
  13213. if (Configuration$1.mainData.customFavicon !== '') {
  13214. logger.info("Custom favicon supplied");
  13215. fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.customFavicon), path__namespace.resolve(finalOutput + '/images/favicon.ico'), function (errorCopyFavicon) {
  13216. // tslint:disable-line
  13217. if (errorCopyFavicon) {
  13218. logger.error('Error during resources copy of favicon', errorCopyFavicon);
  13219. customFaviconReject();
  13220. }
  13221. else {
  13222. logger.info('External custom favicon copy succeeded');
  13223. customFaviconResolve(true);
  13224. }
  13225. });
  13226. }
  13227. else {
  13228. customFaviconResolve(true);
  13229. }
  13230. });
  13231. var customLogoPromise = new Promise(function (customLogoResolve, customLogoReject) {
  13232. if (Configuration$1.mainData.customLogo !== '') {
  13233. logger.info("Custom logo supplied");
  13234. fs__namespace.copy(path__namespace.resolve(cwd$1 + path__namespace.sep + Configuration$1.mainData.customLogo), path__namespace.resolve(finalOutput +
  13235. '/images/' +
  13236. Configuration$1.mainData.customLogo.split('/').pop()), function (errorCopyLogo) {
  13237. // tslint:disable-line
  13238. if (errorCopyLogo) {
  13239. logger.error('Error during resources copy of logo', errorCopyLogo);
  13240. customLogoReject();
  13241. }
  13242. else {
  13243. logger.info('External custom logo copy succeeded');
  13244. customLogoResolve(true);
  13245. }
  13246. });
  13247. }
  13248. else {
  13249. customLogoResolve(true);
  13250. }
  13251. });
  13252. Promise.all([extThemePromise, customFaviconPromise, customLogoPromise]).then(function () {
  13253. onComplete();
  13254. });
  13255. }
  13256. });
  13257. };
  13258. /**
  13259. * Calculates the elapsed time since the program was started.
  13260. *
  13261. * @returns {number}
  13262. */
  13263. Application.prototype.getElapsedTime = function () {
  13264. return (new Date().valueOf() - startTime.valueOf()) / 1000;
  13265. };
  13266. Application.prototype.processGraphs = function () {
  13267. var _this = this;
  13268. if (Configuration$1.mainData.disableGraph) {
  13269. logger.info('Graph generation disabled');
  13270. this.processPages();
  13271. }
  13272. else {
  13273. logger.info('Process main graph');
  13274. var modules_1 = Configuration$1.mainData.modules;
  13275. var i_1 = 0;
  13276. var len_1 = modules_1.length;
  13277. var loop_1 = function () {
  13278. if (i_1 <= len_1 - 1) {
  13279. logger.info('Process module graph ', modules_1[i_1].name);
  13280. var finalPath_2 = Configuration$1.mainData.output;
  13281. if (Configuration$1.mainData.output.lastIndexOf('/') === -1) {
  13282. finalPath_2 += '/';
  13283. }
  13284. finalPath_2 += 'modules/' + modules_1[i_1].name;
  13285. var _rawModule = DependenciesEngine$1.getRawModule(modules_1[i_1].name);
  13286. if (_rawModule.declarations.length > 0 ||
  13287. _rawModule.bootstrap.length > 0 ||
  13288. _rawModule.imports.length > 0 ||
  13289. _rawModule.exports.length > 0 ||
  13290. _rawModule.providers.length > 0) {
  13291. NgdEngine$1.renderGraph(modules_1[i_1].file, finalPath_2, 'f', modules_1[i_1].name).then(function () {
  13292. NgdEngine$1.readGraph(path__namespace.resolve(finalPath_2 + path__namespace.sep + 'dependencies.svg'), modules_1[i_1].name).then(function (data) {
  13293. modules_1[i_1].graph = data;
  13294. i_1++;
  13295. loop_1();
  13296. }, function (err) {
  13297. logger.error('Error during graph read: ', err);
  13298. });
  13299. }, function (errorMessage) {
  13300. logger.error(errorMessage);
  13301. });
  13302. }
  13303. else {
  13304. i_1++;
  13305. loop_1();
  13306. }
  13307. }
  13308. else {
  13309. _this.processPages();
  13310. }
  13311. };
  13312. var finalMainGraphPath_1 = Configuration$1.mainData.output;
  13313. if (finalMainGraphPath_1.lastIndexOf('/') === -1) {
  13314. finalMainGraphPath_1 += '/';
  13315. }
  13316. finalMainGraphPath_1 += 'graph';
  13317. NgdEngine$1.init(path__namespace.resolve(finalMainGraphPath_1));
  13318. NgdEngine$1.renderGraph(Configuration$1.mainData.tsconfig, path__namespace.resolve(finalMainGraphPath_1), 'p').then(function () {
  13319. NgdEngine$1.readGraph(path__namespace.resolve(finalMainGraphPath_1 + path__namespace.sep + 'dependencies.svg'), 'Main graph').then(function (data) {
  13320. Configuration$1.mainData.mainGraph = data;
  13321. loop_1();
  13322. }, function (err) {
  13323. logger.error('Error during main graph reading : ', err);
  13324. Configuration$1.mainData.disableMainGraph = true;
  13325. loop_1();
  13326. });
  13327. }, function (err) {
  13328. logger.error('Ooops error during main graph generation, moving on next part with main graph disabled : ', err);
  13329. Configuration$1.mainData.disableMainGraph = true;
  13330. loop_1();
  13331. });
  13332. }
  13333. };
  13334. Application.prototype.runWebServer = function (folder) {
  13335. if (!this.isWatching) {
  13336. var liveServerConfiguration = {
  13337. root: folder,
  13338. open: Configuration$1.mainData.open,
  13339. quiet: true,
  13340. logLevel: 0,
  13341. wait: 1000,
  13342. port: Configuration$1.mainData.port
  13343. };
  13344. if (Configuration$1.mainData.host !== '') {
  13345. liveServerConfiguration.host = Configuration$1.mainData.host;
  13346. }
  13347. LiveServer__namespace.start(liveServerConfiguration);
  13348. }
  13349. if (Configuration$1.mainData.watch && !this.isWatching) {
  13350. if (typeof this.files === 'undefined') {
  13351. logger.error('No sources files available, please use -p flag');
  13352. generationPromiseReject();
  13353. process.exit(1);
  13354. }
  13355. else {
  13356. this.runWatch();
  13357. }
  13358. }
  13359. else if (Configuration$1.mainData.watch && this.isWatching) {
  13360. var srcFolder = findMainSourceFolder(this.files);
  13361. logger.info("Already watching sources in ".concat(srcFolder, " folder"));
  13362. }
  13363. };
  13364. Application.prototype.runWatch = function () {
  13365. var _this = this;
  13366. var sources = [findMainSourceFolder(this.files)];
  13367. var watcherReady = false;
  13368. this.isWatching = true;
  13369. logger.info("Watching sources in ".concat(findMainSourceFolder(this.files), " folder"));
  13370. if (MarkdownEngine$1.hasRootMarkdowns()) {
  13371. sources = sources.concat(MarkdownEngine$1.listRootMarkdowns());
  13372. }
  13373. if (Configuration$1.mainData.includes !== '') {
  13374. sources = sources.concat(Configuration$1.mainData.includes);
  13375. }
  13376. // Check all elements of sources list exist
  13377. sources = cleanSourcesForWatch(sources);
  13378. var watcher = chokidar.watch(sources, {
  13379. awaitWriteFinish: true,
  13380. ignoreInitial: true,
  13381. ignored: /(spec|\.d)\.ts/
  13382. });
  13383. var timerAddAndRemoveRef;
  13384. var timerChangeRef;
  13385. var runnerAddAndRemove = function () {
  13386. startTime = new Date();
  13387. _this.generate();
  13388. };
  13389. var waiterAddAndRemove = function () {
  13390. clearTimeout(timerAddAndRemoveRef);
  13391. timerAddAndRemoveRef = setTimeout(runnerAddAndRemove, 1000);
  13392. };
  13393. var runnerChange = function () {
  13394. startTime = new Date();
  13395. _this.setUpdatedFiles(_this.watchChangedFiles);
  13396. if (_this.hasWatchedFilesTSFiles()) {
  13397. _this.getMicroDependenciesData();
  13398. }
  13399. else if (_this.hasWatchedFilesRootMarkdownFiles()) {
  13400. _this.rebuildRootMarkdowns();
  13401. }
  13402. else {
  13403. _this.rebuildExternalDocumentation();
  13404. }
  13405. };
  13406. var waiterChange = function () {
  13407. clearTimeout(timerChangeRef);
  13408. timerChangeRef = setTimeout(runnerChange, 1000);
  13409. };
  13410. watcher.on('ready', function () {
  13411. if (!watcherReady) {
  13412. watcherReady = true;
  13413. watcher
  13414. .on('add', function (file) {
  13415. logger.debug("File ".concat(file, " has been added"));
  13416. // Test extension, if ts
  13417. // rescan everything
  13418. if (path__namespace.extname(file) === '.ts') {
  13419. waiterAddAndRemove();
  13420. }
  13421. })
  13422. .on('change', function (file) {
  13423. logger.debug("File ".concat(file, " has been changed"));
  13424. // Test extension, if ts
  13425. // rescan only file
  13426. if (path__namespace.extname(file) === '.ts' ||
  13427. path__namespace.extname(file) === '.md' ||
  13428. path__namespace.extname(file) === '.json') {
  13429. _this.watchChangedFiles.push(path__namespace.join(cwd$1 + path__namespace.sep + file));
  13430. waiterChange();
  13431. }
  13432. })
  13433. .on('unlink', function (file) {
  13434. logger.debug("File ".concat(file, " has been removed"));
  13435. // Test extension, if ts
  13436. // rescan everything
  13437. if (path__namespace.extname(file) === '.ts') {
  13438. waiterAddAndRemove();
  13439. }
  13440. });
  13441. }
  13442. });
  13443. };
  13444. Object.defineProperty(Application.prototype, "application", {
  13445. /**
  13446. * Return the application / root component instance.
  13447. */
  13448. get: function () {
  13449. return this;
  13450. },
  13451. enumerable: false,
  13452. configurable: true
  13453. });
  13454. Object.defineProperty(Application.prototype, "isCLI", {
  13455. get: function () {
  13456. return false;
  13457. },
  13458. enumerable: false,
  13459. configurable: true
  13460. });
  13461. return Application;
  13462. }());
  13463. var fg = require('fast-glob');
  13464. var os = require('os');
  13465. var osName = require('os-name');
  13466. var pkg = require('../package.json');
  13467. var program = require('commander').program;
  13468. var cosmiconfigModuleName = 'compodoc';
  13469. var scannedFiles = [];
  13470. var excludeFiles = EXCLUDE_PATTERNS;
  13471. var includeFiles = [];
  13472. var cwd = process.cwd();
  13473. process.setMaxListeners(0);
  13474. var CliApplication = /** @class */ (function (_super) {
  13475. __extends(CliApplication, _super);
  13476. function CliApplication() {
  13477. return _super !== null && _super.apply(this, arguments) || this;
  13478. }
  13479. /**
  13480. * Run compodoc from the command line.
  13481. */
  13482. CliApplication.prototype.start = function () {
  13483. var _this = this;
  13484. function list(val) {
  13485. return val.split(',');
  13486. }
  13487. program
  13488. .version(pkg.version)
  13489. .usage('<src> [options]')
  13490. .option('-c, --config [config]', 'A configuration file : .compodocrc, .compodocrc.json, .compodocrc.yaml or compodoc property in package.json')
  13491. .option('-p, --tsconfig [config]', 'A tsconfig.json file')
  13492. .option('-d, --output [folder]', 'Where to store the generated documentation', COMPODOC_DEFAULTS.folder)
  13493. .option('-y, --extTheme [file]', 'External styling theme file')
  13494. .option('-n, --name [name]', 'Title documentation', COMPODOC_DEFAULTS.title)
  13495. .option('-a, --assetsFolder [folder]', 'External assets folder to copy in generated documentation folder')
  13496. .option('-o, --open [value]', 'Open the generated documentation')
  13497. .option('-t, --silent', "In silent mode, log messages aren't logged in the console", false)
  13498. .option('-s, --serve', 'Serve generated documentation (default http://localhost:8080/)', false)
  13499. .option('--host [host]', 'Change default host address')
  13500. .option('-r, --port [port]', 'Change default serving port', COMPODOC_DEFAULTS.port)
  13501. .option('-w, --watch', 'Watch source files after serve and force documentation rebuild', false)
  13502. .option('-e, --exportFormat [format]', 'Export in specified format (json, html)', COMPODOC_DEFAULTS.exportFormat)
  13503. .option('--files [files]', 'Files provided by external tool, used for coverage test')
  13504. .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)
  13505. .option('--theme [theme]', "Choose one of available themes, default is 'gitbook' (laravel, original, material, postmark, readthedocs, stripe, vagrant)")
  13506. .option('--hideGenerator', 'Do not print the Compodoc link at the bottom of the page', false)
  13507. .option('--hideDarkModeToggle', 'Do not show dark mode toggle button at the top right position of the page', false)
  13508. .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)
  13509. .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))
  13510. .option('--templates [folder]', 'Path to directory of Handlebars templates to override built-in templates')
  13511. .option('--includes [path]', 'Path of external markdown files to include')
  13512. .option('--includesName [name]', 'Name of item menu of externals markdown files', COMPODOC_DEFAULTS.additionalEntryName)
  13513. .option('--coverageTest [threshold]', 'Test command of documentation coverage with a threshold (default 70)')
  13514. .option('--coverageMinimumPerFile [minimum]', 'Test command of documentation coverage per file with a minimum (default 0)')
  13515. .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)
  13516. .option('--coverageTestShowOnlyFailed', 'Display only failed files for a coverage test')
  13517. .option('--unitTestCoverage [json-summary]', 'To include unit test coverage, specify istanbul JSON coverage summary file')
  13518. .option('--disableSourceCode', 'Do not add source code tab and links to source code', false)
  13519. .option('--disableDomTree', 'Do not add dom tree tab', false)
  13520. .option('--disableTemplateTab', 'Do not add template tab', false)
  13521. .option('--disableStyleTab', 'Do not add style tab', false)
  13522. .option('--disableGraph', 'Do not add the dependency graph', false)
  13523. .option('--disableCoverage', 'Do not add the documentation coverage report', false)
  13524. .option('--disablePrivate', 'Do not show private in generated documentation', false)
  13525. .option('--disableProtected', 'Do not show protected in generated documentation', false)
  13526. .option('--disableInternal', 'Do not show @internal in generated documentation', false)
  13527. .option('--disableLifeCycleHooks', 'Do not show Angular lifecycle hooks in generated documentation', false)
  13528. .option('--disableConstructors', 'Do not show constructors in generated documentation', false)
  13529. .option('--disableRoutesGraph', 'Do not add the routes graph', COMPODOC_DEFAULTS.disableRoutesGraph)
  13530. .option('--disableSearch', 'Do not add the search input', false)
  13531. .option('--disableDependencies', 'Do not add the dependencies list', COMPODOC_DEFAULTS.disableDependencies)
  13532. .option('--disableProperties', 'Do not add the properties list', COMPODOC_DEFAULTS.disableProperties)
  13533. .option('--minimal', 'Minimal mode with only documentation. No search, no graph, no coverage.', false)
  13534. .option('--customFavicon [path]', 'Use a custom favicon')
  13535. .option('--customLogo [path]', 'Use a custom logo')
  13536. .option('--gaID [id]', 'Google Analytics tracking ID')
  13537. .option('--gaSite [site]', 'Google Analytics site name', COMPODOC_DEFAULTS.gaSite)
  13538. .option('--maxSearchResults [maxSearchResults]', 'Max search results on the results page. To show all results, set to 0', COMPODOC_DEFAULTS.maxSearchResults)
  13539. .parse(process.argv);
  13540. var outputHelp = function () {
  13541. program.outputHelp();
  13542. process.exit(1);
  13543. };
  13544. var configExplorer = cosmiconfig.cosmiconfigSync(cosmiconfigModuleName);
  13545. var configExplorerResult;
  13546. var configFile = {};
  13547. var programOptions = program.opts();
  13548. if (programOptions.config) {
  13549. var configFilePath = programOptions.config;
  13550. var testConfigFilePath = configFilePath.match(process.cwd());
  13551. if (testConfigFilePath && testConfigFilePath.length > 0) {
  13552. configFilePath = configFilePath.replace(process.cwd() + path__namespace.sep, '');
  13553. }
  13554. configExplorerResult = configExplorer.load(path__namespace.resolve(configFilePath));
  13555. }
  13556. else {
  13557. configExplorerResult = configExplorer.search();
  13558. }
  13559. if (configExplorerResult) {
  13560. if (typeof configExplorerResult.config !== 'undefined') {
  13561. configFile = configExplorerResult.config;
  13562. }
  13563. }
  13564. if (configFile.output) {
  13565. Configuration$1.mainData.output = configFile.output;
  13566. }
  13567. if (programOptions.output && programOptions.output !== COMPODOC_DEFAULTS.folder) {
  13568. Configuration$1.mainData.output = programOptions.output;
  13569. }
  13570. if (configFile.extTheme) {
  13571. Configuration$1.mainData.extTheme = configFile.extTheme;
  13572. }
  13573. if (programOptions.extTheme) {
  13574. Configuration$1.mainData.extTheme = programOptions.extTheme;
  13575. }
  13576. if (configFile.language) {
  13577. Configuration$1.mainData.language = configFile.language;
  13578. }
  13579. if (programOptions.language) {
  13580. Configuration$1.mainData.language = programOptions.language;
  13581. }
  13582. if (configFile.theme) {
  13583. Configuration$1.mainData.theme = configFile.theme;
  13584. }
  13585. if (programOptions.theme) {
  13586. Configuration$1.mainData.theme = programOptions.theme;
  13587. }
  13588. if (configFile.name) {
  13589. Configuration$1.mainData.documentationMainName = configFile.name;
  13590. }
  13591. if (programOptions.name && programOptions.name !== COMPODOC_DEFAULTS.title) {
  13592. Configuration$1.mainData.documentationMainName = programOptions.name;
  13593. }
  13594. if (configFile.assetsFolder) {
  13595. Configuration$1.mainData.assetsFolder = configFile.assetsFolder;
  13596. }
  13597. if (programOptions.assetsFolder) {
  13598. Configuration$1.mainData.assetsFolder = programOptions.assetsFolder;
  13599. }
  13600. if (configFile.open) {
  13601. Configuration$1.mainData.open = configFile.open;
  13602. }
  13603. if (programOptions.open) {
  13604. Configuration$1.mainData.open = programOptions.open;
  13605. }
  13606. if (configFile.toggleMenuItems) {
  13607. Configuration$1.mainData.toggleMenuItems = configFile.toggleMenuItems;
  13608. }
  13609. if (programOptions.toggleMenuItems &&
  13610. programOptions.toggleMenuItems !== COMPODOC_DEFAULTS.toggleMenuItems) {
  13611. Configuration$1.mainData.toggleMenuItems = programOptions.toggleMenuItems;
  13612. }
  13613. if (configFile.templates) {
  13614. Configuration$1.mainData.templates = configFile.templates;
  13615. }
  13616. if (programOptions.templates) {
  13617. Configuration$1.mainData.templates = programOptions.templates;
  13618. }
  13619. if (configFile.navTabConfig) {
  13620. Configuration$1.mainData.navTabConfig = configFile.navTabConfig;
  13621. }
  13622. if (programOptions.navTabConfig &&
  13623. JSON.parse(programOptions.navTabConfig).length !== COMPODOC_DEFAULTS.navTabConfig.length) {
  13624. Configuration$1.mainData.navTabConfig = JSON.parse(programOptions.navTabConfig);
  13625. }
  13626. if (configFile.includes) {
  13627. Configuration$1.mainData.includes = configFile.includes;
  13628. }
  13629. if (programOptions.includes) {
  13630. Configuration$1.mainData.includes = programOptions.includes;
  13631. }
  13632. if (configFile.includesName) {
  13633. Configuration$1.mainData.includesName = configFile.includesName;
  13634. }
  13635. if (programOptions.includesName &&
  13636. programOptions.includesName !== COMPODOC_DEFAULTS.additionalEntryName) {
  13637. Configuration$1.mainData.includesName = programOptions.includesName;
  13638. }
  13639. if (configFile.silent) {
  13640. logger.silent = false;
  13641. }
  13642. if (programOptions.silent) {
  13643. logger.silent = false;
  13644. }
  13645. if (configFile.serve) {
  13646. Configuration$1.mainData.serve = configFile.serve;
  13647. }
  13648. if (programOptions.serve) {
  13649. Configuration$1.mainData.serve = programOptions.serve;
  13650. }
  13651. if (configFile.host) {
  13652. Configuration$1.mainData.host = configFile.host;
  13653. Configuration$1.mainData.hostname = configFile.host;
  13654. }
  13655. if (programOptions.host) {
  13656. Configuration$1.mainData.host = programOptions.host;
  13657. Configuration$1.mainData.hostname = programOptions.host;
  13658. }
  13659. if (configFile.port) {
  13660. Configuration$1.mainData.port = configFile.port;
  13661. }
  13662. if (programOptions.port && programOptions.port !== COMPODOC_DEFAULTS.port) {
  13663. Configuration$1.mainData.port = programOptions.port;
  13664. }
  13665. if (configFile.watch) {
  13666. Configuration$1.mainData.watch = configFile.watch;
  13667. }
  13668. if (programOptions.watch) {
  13669. Configuration$1.mainData.watch = programOptions.watch;
  13670. }
  13671. if (configFile.exportFormat) {
  13672. Configuration$1.mainData.exportFormat = configFile.exportFormat;
  13673. }
  13674. if (programOptions.exportFormat &&
  13675. programOptions.exportFormat !== COMPODOC_DEFAULTS.exportFormat) {
  13676. Configuration$1.mainData.exportFormat = programOptions.exportFormat;
  13677. }
  13678. if (configFile.hideGenerator) {
  13679. Configuration$1.mainData.hideGenerator = configFile.hideGenerator;
  13680. }
  13681. if (programOptions.hideGenerator) {
  13682. Configuration$1.mainData.hideGenerator = programOptions.hideGenerator;
  13683. }
  13684. if (configFile.hideDarkModeToggle) {
  13685. Configuration$1.mainData.hideDarkModeToggle = configFile.hideDarkModeToggle;
  13686. }
  13687. if (programOptions.hideDarkModeToggle) {
  13688. Configuration$1.mainData.hideDarkModeToggle = programOptions.hideDarkModeToggle;
  13689. }
  13690. if (configFile.coverageTest) {
  13691. Configuration$1.mainData.coverageTest = true;
  13692. Configuration$1.mainData.coverageTestThreshold =
  13693. typeof configFile.coverageTest === 'string'
  13694. ? parseInt(configFile.coverageTest, 10)
  13695. : COMPODOC_DEFAULTS.defaultCoverageThreshold;
  13696. }
  13697. if (programOptions.coverageTest) {
  13698. Configuration$1.mainData.coverageTest = true;
  13699. Configuration$1.mainData.coverageTestThreshold =
  13700. typeof programOptions.coverageTest === 'string'
  13701. ? parseInt(programOptions.coverageTest, 10)
  13702. : COMPODOC_DEFAULTS.defaultCoverageThreshold;
  13703. }
  13704. if (configFile.coverageMinimumPerFile) {
  13705. Configuration$1.mainData.coverageTestPerFile = true;
  13706. Configuration$1.mainData.coverageMinimumPerFile =
  13707. typeof configFile.coverageMinimumPerFile === 'string'
  13708. ? parseInt(configFile.coverageMinimumPerFile, 10)
  13709. : COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
  13710. }
  13711. if (programOptions.coverageMinimumPerFile) {
  13712. Configuration$1.mainData.coverageTestPerFile = true;
  13713. Configuration$1.mainData.coverageMinimumPerFile =
  13714. typeof programOptions.coverageMinimumPerFile === 'string'
  13715. ? parseInt(programOptions.coverageMinimumPerFile, 10)
  13716. : COMPODOC_DEFAULTS.defaultCoverageMinimumPerFile;
  13717. }
  13718. if (configFile.coverageTestThresholdFail) {
  13719. Configuration$1.mainData.coverageTestThresholdFail =
  13720. configFile.coverageTestThresholdFail === 'false' ? false : true;
  13721. }
  13722. if (programOptions.coverageTestThresholdFail) {
  13723. Configuration$1.mainData.coverageTestThresholdFail =
  13724. programOptions.coverageTestThresholdFail === 'false' ? false : true;
  13725. }
  13726. if (configFile.coverageTestShowOnlyFailed) {
  13727. Configuration$1.mainData.coverageTestShowOnlyFailed =
  13728. configFile.coverageTestShowOnlyFailed;
  13729. }
  13730. if (programOptions.coverageTestShowOnlyFailed) {
  13731. Configuration$1.mainData.coverageTestShowOnlyFailed =
  13732. programOptions.coverageTestShowOnlyFailed;
  13733. }
  13734. if (configFile.unitTestCoverage) {
  13735. Configuration$1.mainData.unitTestCoverage = configFile.unitTestCoverage;
  13736. }
  13737. if (programOptions.unitTestCoverage) {
  13738. Configuration$1.mainData.unitTestCoverage = programOptions.unitTestCoverage;
  13739. }
  13740. if (configFile.disableSourceCode) {
  13741. Configuration$1.mainData.disableSourceCode = configFile.disableSourceCode;
  13742. }
  13743. if (programOptions.disableSourceCode) {
  13744. Configuration$1.mainData.disableSourceCode = programOptions.disableSourceCode;
  13745. }
  13746. if (configFile.disableDomTree) {
  13747. Configuration$1.mainData.disableDomTree = configFile.disableDomTree;
  13748. }
  13749. if (programOptions.disableDomTree) {
  13750. Configuration$1.mainData.disableDomTree = programOptions.disableDomTree;
  13751. }
  13752. if (configFile.disableTemplateTab) {
  13753. Configuration$1.mainData.disableTemplateTab = configFile.disableTemplateTab;
  13754. }
  13755. if (programOptions.disableTemplateTab) {
  13756. Configuration$1.mainData.disableTemplateTab = programOptions.disableTemplateTab;
  13757. }
  13758. if (configFile.disableStyleTab) {
  13759. Configuration$1.mainData.disableStyleTab = configFile.disableStyleTab;
  13760. }
  13761. if (programOptions.disableStyleTab) {
  13762. Configuration$1.mainData.disableStyleTab = programOptions.disableStyleTab;
  13763. }
  13764. if (configFile.disableGraph) {
  13765. Configuration$1.mainData.disableGraph = configFile.disableGraph;
  13766. }
  13767. if (programOptions.disableGraph) {
  13768. Configuration$1.mainData.disableGraph = programOptions.disableGraph;
  13769. }
  13770. if (configFile.disableCoverage) {
  13771. Configuration$1.mainData.disableCoverage = configFile.disableCoverage;
  13772. }
  13773. if (programOptions.disableCoverage) {
  13774. Configuration$1.mainData.disableCoverage = programOptions.disableCoverage;
  13775. }
  13776. if (configFile.disablePrivate) {
  13777. Configuration$1.mainData.disablePrivate = configFile.disablePrivate;
  13778. }
  13779. if (programOptions.disablePrivate) {
  13780. Configuration$1.mainData.disablePrivate = programOptions.disablePrivate;
  13781. }
  13782. if (configFile.disableProtected) {
  13783. Configuration$1.mainData.disableProtected = configFile.disableProtected;
  13784. }
  13785. if (programOptions.disableProtected) {
  13786. Configuration$1.mainData.disableProtected = programOptions.disableProtected;
  13787. }
  13788. if (configFile.disableInternal) {
  13789. Configuration$1.mainData.disableInternal = configFile.disableInternal;
  13790. }
  13791. if (programOptions.disableInternal) {
  13792. Configuration$1.mainData.disableInternal = programOptions.disableInternal;
  13793. }
  13794. if (configFile.disableLifeCycleHooks) {
  13795. Configuration$1.mainData.disableLifeCycleHooks = configFile.disableLifeCycleHooks;
  13796. }
  13797. if (programOptions.disableLifeCycleHooks) {
  13798. Configuration$1.mainData.disableLifeCycleHooks = programOptions.disableLifeCycleHooks;
  13799. }
  13800. if (configFile.disableConstructors) {
  13801. Configuration$1.mainData.disableConstructors = configFile.disableConstructors;
  13802. }
  13803. if (programOptions.disableConstructors) {
  13804. Configuration$1.mainData.disableConstructors = programOptions.disableConstructors;
  13805. }
  13806. if (configFile.disableRoutesGraph) {
  13807. Configuration$1.mainData.disableRoutesGraph = configFile.disableRoutesGraph;
  13808. }
  13809. if (programOptions.disableRoutesGraph) {
  13810. Configuration$1.mainData.disableRoutesGraph = programOptions.disableRoutesGraph;
  13811. }
  13812. if (configFile.disableSearch) {
  13813. Configuration$1.mainData.disableSearch = configFile.disableSearch;
  13814. }
  13815. if (programOptions.disableSearch) {
  13816. Configuration$1.mainData.disableSearch = programOptions.disableSearch;
  13817. }
  13818. if (configFile.disableDependencies) {
  13819. Configuration$1.mainData.disableDependencies = configFile.disableDependencies;
  13820. }
  13821. if (programOptions.disableDependencies) {
  13822. Configuration$1.mainData.disableDependencies = programOptions.disableDependencies;
  13823. }
  13824. if (configFile.disableProperties) {
  13825. Configuration$1.mainData.disableProperties = configFile.disableProperties;
  13826. }
  13827. if (programOptions.disableProperties) {
  13828. Configuration$1.mainData.disableProperties = programOptions.disableProperties;
  13829. }
  13830. if (configFile.minimal) {
  13831. Configuration$1.mainData.disableSearch = true;
  13832. Configuration$1.mainData.disableRoutesGraph = true;
  13833. Configuration$1.mainData.disableGraph = true;
  13834. Configuration$1.mainData.disableCoverage = true;
  13835. }
  13836. if (programOptions.minimal) {
  13837. Configuration$1.mainData.disableSearch = true;
  13838. Configuration$1.mainData.disableRoutesGraph = true;
  13839. Configuration$1.mainData.disableGraph = true;
  13840. Configuration$1.mainData.disableCoverage = true;
  13841. }
  13842. if (configFile.customFavicon) {
  13843. Configuration$1.mainData.customFavicon = configFile.customFavicon;
  13844. }
  13845. if (programOptions.customFavicon) {
  13846. Configuration$1.mainData.customFavicon = programOptions.customFavicon;
  13847. }
  13848. if (configFile.customLogo) {
  13849. Configuration$1.mainData.customLogo = configFile.customLogo;
  13850. }
  13851. if (programOptions.customLogo) {
  13852. Configuration$1.mainData.customLogo = programOptions.customLogo;
  13853. }
  13854. if (configFile.gaID) {
  13855. Configuration$1.mainData.gaID = configFile.gaID;
  13856. }
  13857. if (programOptions.gaID) {
  13858. Configuration$1.mainData.gaID = programOptions.gaID;
  13859. }
  13860. if (configFile.gaSite) {
  13861. Configuration$1.mainData.gaSite = configFile.gaSite;
  13862. }
  13863. if (programOptions.gaSite && programOptions.gaSite !== COMPODOC_DEFAULTS.gaSite) {
  13864. Configuration$1.mainData.gaSite = programOptions.gaSite;
  13865. }
  13866. if (!this.isWatching) {
  13867. if (!logger.silent) {
  13868. console.log("Compodoc v".concat(pkg.version));
  13869. }
  13870. else {
  13871. console.log(fs__namespace.readFileSync(path__namespace.join(__dirname, '../src/banner')).toString());
  13872. console.log(pkg.version);
  13873. console.log('');
  13874. console.log("TypeScript version used by Compodoc : ".concat(tsMorph.ts.version));
  13875. console.log('');
  13876. if (FileEngine$1.existsSync(cwd + path__namespace.sep + 'package.json')) {
  13877. var packageData = FileEngine$1.getSync(cwd + path__namespace.sep + 'package.json');
  13878. if (packageData) {
  13879. var parsedData = JSON.parse(packageData);
  13880. var projectDevDependencies = parsedData.devDependencies;
  13881. if (projectDevDependencies && projectDevDependencies.typescript) {
  13882. var tsProjectVersion = AngularVersionUtil$1.cleanVersion(projectDevDependencies.typescript);
  13883. console.log("TypeScript version of current project : ".concat(tsProjectVersion));
  13884. console.log('');
  13885. }
  13886. }
  13887. }
  13888. console.log("Node.js version : ".concat(process.version));
  13889. console.log('');
  13890. console.log("Operating system : ".concat(osName(os.platform(), os.release())));
  13891. console.log('');
  13892. }
  13893. }
  13894. if (configExplorerResult) {
  13895. if (typeof configExplorerResult.config !== 'undefined') {
  13896. logger.info("Using configuration file : ".concat(configExplorerResult.filepath));
  13897. }
  13898. }
  13899. if (!configExplorerResult) {
  13900. logger.warn("No configuration file found, switching to CLI flags.");
  13901. }
  13902. if (programOptions.language && !I18nEngine$1.supportLanguage(programOptions.language)) {
  13903. logger.warn("The language ".concat(programOptions.language, " is not available, falling back to ").concat(I18nEngine$1.fallbackLanguage));
  13904. }
  13905. if (programOptions.tsconfig && typeof programOptions.tsconfig === 'boolean') {
  13906. logger.error("Please provide a tsconfig file.");
  13907. process.exit(1);
  13908. }
  13909. if (configFile.tsconfig) {
  13910. Configuration$1.mainData.tsconfig = configFile.tsconfig;
  13911. }
  13912. if (programOptions.tsconfig) {
  13913. Configuration$1.mainData.tsconfig = programOptions.tsconfig;
  13914. }
  13915. if (programOptions.maxSearchResults) {
  13916. Configuration$1.mainData.maxSearchResults = programOptions.maxSearchResults;
  13917. }
  13918. if (configFile.files) {
  13919. scannedFiles = configFile.files;
  13920. }
  13921. if (configFile.exclude) {
  13922. excludeFiles = configFile.exclude;
  13923. }
  13924. if (configFile.include) {
  13925. includeFiles = configFile.include;
  13926. }
  13927. /**
  13928. * Check --files argument call
  13929. */
  13930. var argv = require('minimist')(process.argv.slice(2));
  13931. if (argv && argv.files) {
  13932. Configuration$1.mainData.hasFilesToCoverage = true;
  13933. if (typeof argv.files === 'string') {
  13934. _super.prototype.setFiles.call(this, [argv.files]);
  13935. }
  13936. else {
  13937. _super.prototype.setFiles.call(this, argv.files);
  13938. }
  13939. }
  13940. if (programOptions.serve && !Configuration$1.mainData.tsconfig && programOptions.output) {
  13941. // if -s & -d, serve it
  13942. if (!FileEngine$1.existsSync(Configuration$1.mainData.output)) {
  13943. logger.error("".concat(Configuration$1.mainData.output, " folder doesn't exist"));
  13944. process.exit(1);
  13945. }
  13946. else {
  13947. logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(programOptions.port));
  13948. _super.prototype.runWebServer.call(this, Configuration$1.mainData.output);
  13949. }
  13950. }
  13951. else if (programOptions.serve &&
  13952. !Configuration$1.mainData.tsconfig &&
  13953. !programOptions.output) {
  13954. // if only -s find ./documentation, if ok serve, else error provide -d
  13955. if (!FileEngine$1.existsSync(Configuration$1.mainData.output)) {
  13956. logger.error('Provide output generated folder with -d flag');
  13957. process.exit(1);
  13958. }
  13959. else {
  13960. logger.info("Serving documentation from ".concat(Configuration$1.mainData.output, " at http://").concat(Configuration$1.mainData.hostname, ":").concat(programOptions.port));
  13961. _super.prototype.runWebServer.call(this, Configuration$1.mainData.output);
  13962. }
  13963. }
  13964. else if (Configuration$1.mainData.hasFilesToCoverage) {
  13965. if (programOptions.coverageMinimumPerFile) {
  13966. logger.info('Run documentation coverage test for files');
  13967. _super.prototype.testCoverage.call(this);
  13968. }
  13969. else {
  13970. logger.error('Missing coverage configuration');
  13971. }
  13972. }
  13973. else {
  13974. if (programOptions.hideGenerator) {
  13975. Configuration$1.mainData.hideGenerator = true;
  13976. }
  13977. if (Configuration$1.mainData.tsconfig) {
  13978. /**
  13979. * tsconfig file provided only
  13980. */
  13981. var testTsConfigPath = Configuration$1.mainData.tsconfig.indexOf(process.cwd());
  13982. if (testTsConfigPath !== -1) {
  13983. Configuration$1.mainData.tsconfig = Configuration$1.mainData.tsconfig.replace(process.cwd() + path__namespace.sep, '');
  13984. }
  13985. var sourceFolder = void 0;
  13986. if (program.args.length > 0) {
  13987. /**
  13988. * tsconfig file provided with source folder in arg
  13989. */
  13990. var testTsConfigPath_1 = Configuration$1.mainData.tsconfig.indexOf(process.cwd());
  13991. if (testTsConfigPath_1 !== -1) {
  13992. Configuration$1.mainData.tsconfig = Configuration$1.mainData.tsconfig.replace(process.cwd() + path__namespace.sep, '');
  13993. }
  13994. sourceFolder = program.args[0];
  13995. if (!FileEngine$1.existsSync(sourceFolder)) {
  13996. logger.error("Provided source folder ".concat(sourceFolder, " was not found in the current directory"));
  13997. process.exit(1);
  13998. }
  13999. else {
  14000. logger.info('Using provided source folder');
  14001. }
  14002. }
  14003. if (!FileEngine$1.existsSync(Configuration$1.mainData.tsconfig)) {
  14004. logger.error("\"".concat(Configuration$1.mainData.tsconfig, "\" file was not found in the current directory"));
  14005. process.exit(1);
  14006. }
  14007. else {
  14008. var _file = path__namespace.join(path__namespace.join(process.cwd(), path__namespace.dirname(Configuration$1.mainData.tsconfig)), path__namespace.basename(Configuration$1.mainData.tsconfig));
  14009. // use the current directory of tsconfig.json as a working directory
  14010. cwd = _file.split(path__namespace.sep).slice(0, -1).join(path__namespace.sep);
  14011. logger.info('Using tsconfig file ', _file);
  14012. var tsConfigFile = readConfig(_file);
  14013. if (tsConfigFile.files) {
  14014. scannedFiles = tsConfigFile.files;
  14015. // Normalize path of these files
  14016. scannedFiles = scannedFiles.map(function (scannedFile) {
  14017. return cwd + path__namespace.sep + scannedFile;
  14018. });
  14019. }
  14020. // even if files are supplied with "files" attributes, enhance the array with includes
  14021. excludeFiles = __spreadArray(__spreadArray([], __read(excludeFiles), false), __read((tsConfigFile.exclude || [])), false);
  14022. includeFiles = __spreadArray(__spreadArray([], __read(includeFiles), false), __read((tsConfigFile.include || [])), false);
  14023. if (scannedFiles.length > 0) {
  14024. includeFiles = __spreadArray(__spreadArray([], __read(includeFiles), false), __read(scannedFiles), false);
  14025. }
  14026. if (!includeFiles.length) {
  14027. includeFiles = INCLUDE_PATTERNS;
  14028. }
  14029. var stream = fg.stream(includeFiles, {
  14030. cwd: sourceFolder || cwd,
  14031. ignore: excludeFiles,
  14032. absolute: true
  14033. });
  14034. stream.on('data', function (file) {
  14035. if (path__namespace.extname(file) === '.ts' || path__namespace.extname(file) === '.tsx') {
  14036. logger.debug('Including', file);
  14037. scannedFiles.push(file);
  14038. }
  14039. else {
  14040. logger.warn('Excluding', file);
  14041. }
  14042. });
  14043. stream.on('end', function () {
  14044. _super.prototype.setFiles.call(_this, scannedFiles);
  14045. if (programOptions.coverageTest || programOptions.coverageTestPerFile) {
  14046. logger.info('Run documentation coverage test');
  14047. _super.prototype.testCoverage.call(_this);
  14048. }
  14049. else {
  14050. _super.prototype.generate.call(_this);
  14051. }
  14052. });
  14053. }
  14054. }
  14055. else {
  14056. logger.error('tsconfig.json file was not found, please use -p flag');
  14057. outputHelp();
  14058. }
  14059. }
  14060. };
  14061. return CliApplication;
  14062. }(Application));
  14063. exports.Application = Application;
  14064. exports.CliApplication = CliApplication;
  14065. //# 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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