@envive-ai/react-hooks 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/amplitudeContext-CHzas7Cf.d.cts +52 -0
- package/dist/amplitudeContext-D-7fmVh1.cjs +356 -0
- package/dist/amplitudeContext-hY3caPC6.js +322 -0
- package/dist/amplitudeContext-tJ4y-SzX.d.ts +52 -0
- package/dist/api-DjeZXxl_.js +207 -0
- package/dist/api-_JaUnIUj.cjs +292 -0
- package/dist/app-CjsQ2_n-.js +132 -0
- package/dist/app-CnKRZ9RW.cjs +178 -0
- package/dist/application/models/graphql/index.cjs +3 -12
- package/dist/application/models/graphql/index.d.cts +1 -1
- package/dist/application/models/graphql/index.d.ts +1 -1
- package/dist/application/models/graphql/index.js +1 -10
- package/dist/application/models/guards/api/index.cjs +1 -2
- package/dist/application/models/guards/api/index.d.cts +2 -2
- package/dist/application/models/guards/api/index.d.ts +2 -2
- package/dist/application/models/guards/api/index.js +1 -2
- package/dist/application/models/index.cjs +48 -54
- package/dist/application/models/index.d.cts +7 -9
- package/dist/application/models/index.d.ts +7 -9
- package/dist/application/models/index.js +7 -11
- package/dist/application/models/utilityTypes/index.cjs +1 -1
- package/dist/application/models/utilityTypes/index.d.cts +1 -1
- package/dist/application/models/utilityTypes/index.d.ts +1 -1
- package/dist/application/models/utilityTypes/index.js +1 -1
- package/dist/application/models/variantInfo/index.cjs +1 -1
- package/dist/application/models/variantInfo/index.d.cts +1 -1
- package/dist/application/models/variantInfo/index.d.ts +1 -1
- package/dist/application/models/variantInfo/index.js +1 -1
- package/dist/application/utils/index.cjs +40 -37
- package/dist/application/utils/index.d.cts +18 -14
- package/dist/application/utils/index.d.ts +17 -13
- package/dist/application/utils/index.js +13 -10
- package/dist/{atomStore-JwGb7pcy.cjs → atomStore-B4jIaDPd.cjs} +1 -1
- package/dist/{atomStore-B1cgmbP0.js → atomStore-D8pjE1vL.js} +1 -1
- package/dist/atoms/app/index.cjs +14 -16
- package/dist/atoms/app/index.d.cts +20 -19
- package/dist/atoms/app/index.d.ts +20 -19
- package/dist/atoms/app/index.js +10 -11
- package/dist/atoms/atomStore/index.cjs +2 -1
- package/dist/atoms/atomStore/index.d.cts +1 -1
- package/dist/atoms/atomStore/index.js +2 -1
- package/dist/atoms/chat/index.cjs +44 -40
- package/dist/atoms/chat/index.d.cts +35 -36
- package/dist/atoms/chat/index.d.ts +35 -36
- package/dist/atoms/chat/index.js +14 -10
- package/dist/atoms/globalSearch/index.cjs +1 -1
- package/dist/atoms/globalSearch/index.d.cts +5 -5
- package/dist/atoms/globalSearch/index.d.ts +5 -5
- package/dist/atoms/globalSearch/index.js +1 -1
- package/dist/atoms/org/index.cjs +26 -37
- package/dist/atoms/org/index.d.cts +37 -47
- package/dist/atoms/org/index.d.ts +37 -47
- package/dist/atoms/org/index.js +11 -11
- package/dist/atoms/search/index.cjs +47 -41
- package/dist/atoms/search/index.d.cts +7 -9
- package/dist/atoms/search/index.d.ts +7 -9
- package/dist/atoms/search/index.js +16 -10
- package/dist/bandolier-DYEz4-8C.js +1229 -0
- package/dist/bandolier-o_-xrbOV.cjs +1229 -0
- package/dist/carpe-CsG5jCcl.cjs +607 -0
- package/dist/carpe-DONk00bZ.js +605 -0
- package/dist/cdnUtils-32v8bDX9.cjs +16 -0
- package/dist/cdnUtils-E4tLBt2g.js +11 -0
- package/dist/{chat-BgONoYU7.cjs → chat-BubCW1as.cjs} +1 -1
- package/dist/chat-CO7cRkaq.cjs +506 -0
- package/dist/{chat-CLJ4NWcN.js → chat-CV6MXeID.js} +1 -1
- package/dist/chat-hcRc4RRd.js +285 -0
- package/dist/{components-CV1fhAkj.js → components-B4T3Uzth.js} +1 -1
- package/dist/{components-BKZbet67.cjs → components-Cw9WjA6g.cjs} +1 -1
- package/dist/config/locators/components/chat/index.cjs +1 -1
- package/dist/config/locators/components/chat/index.d.cts +1 -1
- package/dist/config/locators/components/chat/index.d.ts +1 -1
- package/dist/config/locators/components/chat/index.js +1 -1
- package/dist/config/locators/components/chat/variants/index.d.ts +1 -1
- package/dist/config/locators/components/index.cjs +1 -1
- package/dist/config/locators/components/index.d.cts +1 -1
- package/dist/config/locators/components/index.d.ts +1 -1
- package/dist/config/locators/components/index.js +1 -1
- package/dist/config/locators/index.cjs +4 -4
- package/dist/config/locators/index.d.cts +2 -2
- package/dist/config/locators/index.d.ts +3 -3
- package/dist/config/locators/index.js +4 -4
- package/dist/contexts/index.cjs +45 -14
- package/dist/contexts/index.d.cts +10 -78
- package/dist/contexts/index.d.ts +10 -78
- package/dist/contexts/index.js +22 -11
- package/dist/contexts-B4ihTBsV.cjs +2980 -0
- package/dist/contexts-DGlr7M1o.js +2596 -0
- package/dist/coterie-CKB93qfz.cjs +239 -0
- package/dist/{coterie-yQ-_JXSw.cjs → coterie-DHcj2fRE.js} +64 -65
- package/dist/{custservice-types-C83itZmy.cjs → custservice-types-Dy0kc9TW.cjs} +1 -1
- package/dist/{custservice-types-DPQ-4TI6.js → custservice-types-mnIunabv.js} +1 -1
- package/dist/default-BnB4p0Se.cjs +234 -0
- package/dist/default-D6f5Dyt7.js +199 -0
- package/dist/default-ZKkE5zT4.cjs +4 -0
- package/dist/default-legGZJwI.js +4 -0
- package/dist/{divIds-DEL_-qU0.cjs → divIds-2dJlU3z8.cjs} +1 -15
- package/dist/{divIds-CWkntTsx.js → divIds-BUrN2vY-.js} +2 -4
- package/dist/dreamlandBaby-BiRYYFav.js +346 -0
- package/dist/dreamlandBaby-zuvmfzfD.cjs +346 -0
- package/dist/{embedded-C5uJqmuD.js → embedded-BJLWIriJ.js} +1 -1
- package/dist/{embedded--2L0F4b5.cjs → embedded-Dl79TJLC.cjs} +1 -1
- package/dist/{entrypoints-CNUvSgnk.js → entrypoints-Bs3pn6EV.js} +1 -1
- package/dist/{entrypoints-DM9Sm18O.cjs → entrypoints-Dqi5pzWH.cjs} +1 -1
- package/dist/enviveConfig-BccuzS2a.cjs +240 -0
- package/dist/enviveConfig-CzhTz8Aa.js +152 -0
- package/dist/events/index.cjs +1 -1
- package/dist/events/index.d.cts +1 -1
- package/dist/events/index.js +1 -1
- package/dist/{events-ClCDFK7t.js → events-BrLpaNxh.js} +1 -1
- package/dist/{events-Da7gpmGv.cjs → events-DwT6cEwI.cjs} +1 -1
- package/dist/fiveCbd-DwTTwC2j.cjs +613 -0
- package/dist/fiveCbd-Dz2NouOF.js +613 -0
- package/dist/forLoveAndLemons-DqSdyD6S.js +665 -0
- package/dist/forLoveAndLemons-Ud6mPrV3.cjs +667 -0
- package/dist/{globalSearch-b0wC7ZEO.js → globalSearch-B6THR7Jx.js} +1 -1
- package/dist/{globalSearch-BTeZxvk1.cjs → globalSearch-BFvEg53C.cjs} +1 -1
- package/dist/graphql-BNW60InJ.cjs +128 -0
- package/dist/graphql-CjB8wHzm.js +74 -0
- package/dist/graphqlConfig-CYt6tWII.js +30 -0
- package/dist/graphqlConfig-DicykC-o.cjs +61 -0
- package/dist/greenpan-B_EbPkSP.js +397 -0
- package/dist/greenpan-kPE4fJgd.cjs +397 -0
- package/dist/grooveLife-Ckuir319.js +342 -0
- package/dist/grooveLife-DKSEQp1F.cjs +342 -0
- package/dist/homegrownCannabis-BVPa2pqe.js +410 -0
- package/dist/homegrownCannabis-BwIAkxuA.cjs +410 -0
- package/dist/hooks/index.cjs +40 -16
- package/dist/hooks/index.d.cts +122 -95
- package/dist/hooks/index.d.ts +122 -95
- package/dist/hooks/index.js +22 -11
- package/dist/{index-D46Rd0io.d.cts → index-B0NW9KTj.d.cts} +1 -1
- package/dist/{index-jBATkcc_.d.cts → index-BDPWBU3h.d.cts} +1 -1
- package/dist/index-BMPtlgac.d.ts +191 -0
- package/dist/{index-BTK5uzs6.d.cts → index-Bmub8e38.d.cts} +1 -1
- package/dist/{index-C62lPpy4.d.cts → index-Byb45OPg.d.cts} +1 -1
- package/dist/{index-DPx8s5YH.d.ts → index-C6KdON7d.d.ts} +1 -1
- package/dist/index-C7pGDl1A.d.ts +1609 -0
- package/dist/{index-CYtsPztZ.d.cts → index-C9lgsCWp.d.cts} +32 -32
- package/dist/{index-BzgkfbNO.d.cts → index-CESxqFso.d.cts} +1 -1
- package/dist/{index-C_C0tLeD.d.ts → index-Cc-wBCn6.d.ts} +32 -32
- package/dist/{index-Cx9e-fRi.d.ts → index-CcIG01PJ.d.ts} +2 -2
- package/dist/{index-ClJ0nMsR.d.cts → index-CiWEYzXl.d.cts} +2 -2
- package/dist/{index-CKKkTsms.d.ts → index-Cqg6ltII.d.ts} +1 -1
- package/dist/{index-CExtydIH.d.ts → index-DOii3C6b.d.ts} +1 -1
- package/dist/index-DTu2X-YS.d.cts +1609 -0
- package/dist/index-OEifcBsm.d.cts +191 -0
- package/dist/{index-Dxpscrvz.d.ts → index-PGF8BvxQ.d.ts} +1 -1
- package/dist/{index-D2VaMPA3.d.ts → index-ylUiJvnr.d.ts} +1 -1
- package/dist/interceptors/index.cjs +2 -12
- package/dist/interceptors/index.d.cts +8 -13
- package/dist/interceptors/index.d.ts +8 -13
- package/dist/interceptors/index.js +2 -11
- package/dist/jackArcher-B39OEIj6.cjs +727 -0
- package/dist/{jackArcher-CXf_IAmC.js → jackArcher-BwkWGybC.js} +24 -25
- package/dist/jordanCraig-CxRH_jLi.js +1786 -0
- package/dist/jordanCraig-RwmWw-jM.cjs +1786 -0
- package/dist/kindredBravely-D78VwL20.cjs +490 -0
- package/dist/kindredBravely-DQDpAzdl.js +490 -0
- package/dist/kutFromTheKloth-TcXQkIti.js +369 -0
- package/dist/kutFromTheKloth-dXRrNti0.cjs +369 -0
- package/dist/larryAndSerges-Bh5XEXsZ.js +262 -0
- package/dist/larryAndSerges-COdBzOzu.cjs +262 -0
- package/dist/leapsAndRebounds-BbXnqkl5.cjs +360 -0
- package/dist/leapsAndRebounds-mjCaH1k-.js +360 -0
- package/dist/longevityrx-DdV3v26F.cjs +320 -0
- package/dist/longevityrx-DfPDfvAt.js +320 -0
- package/dist/lookOptic-DgXFGBPP.cjs +282 -0
- package/dist/{lookOptic-BGhU4910.js → lookOptic-FgVW1afF.js} +19 -20
- package/dist/mantraBrand-C5gVm3rk.cjs +750 -0
- package/dist/{mantraBrand-DrqG9uqO.js → mantraBrand-uV8HCDR8.js} +22 -23
- package/dist/medterra-BtDpr1Hw.cjs +583 -0
- package/dist/medterra-DgzE7-mj.js +583 -0
- package/dist/modells-CJjsxOIR.js +484 -0
- package/dist/modells-Ck5KbRFj.cjs +484 -0
- package/dist/models-BkXg5eIP.cjs +1534 -0
- package/dist/models-UZ6HszfZ.js +1281 -0
- package/dist/{nodeSelector-BiCDowlK.d.ts → nodeSelector-BxrS2S_k.d.ts} +1 -1
- package/dist/{nodeSelector-B3bPtEjX.d.cts → nodeSelector-Dm4S-10n.d.cts} +1 -1
- package/dist/org-C2RrBVQR.cjs +81 -0
- package/dist/org-xMytX--e.js +38 -0
- package/dist/orgAnalyticsConfig-BJ2A1RZ-.cjs +39 -0
- package/dist/orgAnalyticsConfig-ClrFy2qH.js +14 -0
- package/dist/pressedFloral-Bteoboms.js +661 -0
- package/dist/pressedFloral-CexgV-xy.cjs +661 -0
- package/dist/search-BMOAmrmY.js +459 -0
- package/dist/search-Df0Ifneg.cjs +672 -0
- package/dist/{search-filter-types-BNTLVXqQ.d.cts → search-filter-types-DosbseF3.d.cts} +1 -1
- package/dist/{search-filter-types-DkmH1TxJ.d.ts → search-filter-types-fZf91Pdw.d.ts} +1 -1
- package/dist/skinPerfection-BGzq9lq-.cjs +334 -0
- package/dist/skinPerfection-BlvcEcUE.js +334 -0
- package/dist/snapSupplements-CbbGzAgO.cjs +285 -0
- package/dist/snapSupplements-kcsPAOm9.js +285 -0
- package/dist/{socialProofClasses-ky69yppk.cjs → socialProofClasses-Db8gzsfi.cjs} +1 -1
- package/dist/{socialProofClasses-DdzG1tZy.js → socialProofClasses-kwDvwLOZ.js} +1 -1
- package/dist/spanx-B4WFA_rI.js +661 -0
- package/dist/spanx-BWoE4F8b.cjs +663 -0
- package/dist/spanxStaging-BOrOjhXn.js +845 -0
- package/dist/spanxStaging-BfdfIug4.cjs +848 -0
- package/dist/{suggestionBarV2-types-CwOXzIKq.js → suggestionBarV2-types-IMMOmCir.js} +1 -1
- package/dist/{suggestionBarV2-types-Dc4-zJlV.cjs → suggestionBarV2-types-nnGNgFvR.cjs} +1 -1
- package/dist/supergoop-22dd5_BS.js +323 -0
- package/dist/supergoop-B-a4cku2.cjs +323 -0
- package/dist/{test-types-CXVJxTeu.d.ts → test-types-C9b_OdfO.d.ts} +1 -1
- package/dist/{test-types-CuOq25VT.d.cts → test-types-CgVJtwUr.d.cts} +1 -1
- package/dist/types/index.cjs +2 -2
- package/dist/types/index.d.cts +2 -2
- package/dist/types/index.d.ts +2 -2
- package/dist/types/index.js +2 -2
- package/dist/types--pr1GQQx.js +154 -0
- package/dist/types-BVSyY3Hk.cjs +196 -0
- package/dist/{uniqueVintage-Cui74mlJ.js → uniqueVintage-CJXiNNe7.js} +19 -20
- package/dist/uniqueVintage-D0jzJWlo.cjs +1213 -0
- package/dist/useMessageInterceptor-B87e3yu3.cjs +33 -0
- package/dist/useMessageInterceptor-Bb7YRaWk.js +25 -0
- package/dist/userIdentityContext-BPqvVIg0.d.cts +20 -0
- package/dist/userIdentityContext-wbCRmlzp.d.ts +20 -0
- package/dist/utils-C9ZSCx12.js +888 -0
- package/dist/utils-D5HO61hG.cjs +1016 -0
- package/dist/variantInfo-DbVxA1yE.js +1 -0
- package/dist/variantInfo-orXoPBCU.cjs +0 -0
- package/dist/venaCbd-Bhhu_qUf.cjs +365 -0
- package/dist/venaCbd-CanovPS_.js +365 -0
- package/dist/westonJonBoucher-BC0x1ktI.cjs +422 -0
- package/dist/{westonJonBoucher-C95EuCl-.js → westonJonBoucher-BUu1_wP1.js} +19 -20
- package/dist/wineEnthusiast-BlCryfil.cjs +940 -0
- package/dist/{wineEnthusiast-DeTFY8Gm.js → wineEnthusiast-Ck1x5iJq.js} +19 -20
- package/dist/wolfMattress-D9Mjq-HP.js +372 -0
- package/dist/wolfMattress-JssghhC-.cjs +372 -0
- package/dist/wolfTactical-C6exYhL7.cjs +349 -0
- package/dist/wolfTactical-CnV3KQdI.js +349 -0
- package/package.json +101 -19
- package/src/{adapters/spiffy/commerce/api.ts → application/commerce-api.ts} +31 -23
- package/src/application/models/colorsConfig.ts +18 -18
- package/src/application/models/frontendConfig.ts +3 -3
- package/src/application/models/graphql/queries/getMerchantColorsQuery.ts +1 -1
- package/src/application/models/graphql/queries/getMerchantFrontendConfigQuery.ts +1 -1
- package/src/application/models/index.ts +0 -2
- package/src/application/models/localStorageEventListener.ts +2 -2
- package/src/application/models/supportedOrgs.ts +1 -1
- package/src/application/models/utils/snakeToCamelTransformer.ts +8 -8
- package/src/application/models/validators/validateGraphQLColorsConfig.ts +0 -21
- package/src/application/models/validators/validateGraphQLFrontendConfig.ts +2 -2
- package/src/application/utils/analyticsUtils.ts +53 -22
- package/src/application/utils/cdnUtils.ts +11 -0
- package/src/atoms/amplitude/amplitudeTrackEventAtom.ts +15 -0
- package/src/atoms/app/index.ts +7 -17
- package/src/atoms/app/variant.ts +13 -4
- package/src/atoms/chat/chatState.ts +28 -18
- package/src/atoms/chat/messageQueue.ts +36 -5
- package/src/atoms/chat/replies.ts +45 -37
- package/src/atoms/envive/enviveConfig.ts +10 -6
- package/src/atoms/org/graphqlConfig.ts +21 -4
- package/src/atoms/org/index.ts +7 -7
- package/src/atoms/org/newOrgConfigAtom.ts +8 -0
- package/src/atoms/org/orgPageConfig.ts +6 -5
- package/src/atoms/search/chatSearch.ts +11 -5
- package/src/atoms/search/searchAPI.ts +68 -48
- package/src/atoms/search/searchServiceAdapter.ts +25 -0
- package/src/contexts/amplitudeContext.tsx +466 -0
- package/src/contexts/cdnContext.tsx +48 -0
- package/src/contexts/chatContext.tsx +15 -12
- package/src/contexts/enviveConfigContext.tsx +22 -17
- package/src/contexts/enviveCssContext.tsx +34 -5
- package/src/contexts/featureFlagContext.tsx +193 -0
- package/src/contexts/featureFlagServiceContext.tsx +87 -0
- package/src/contexts/graphqlContext.tsx +165 -0
- package/src/contexts/index.ts +13 -3
- package/src/contexts/localStorageContext.tsx +159 -0
- package/src/contexts/newOrgConfigContext.tsx +104 -0
- package/src/contexts/orgConfigContext.tsx +92 -92
- package/src/contexts/searchContext.tsx +187 -0
- package/src/contexts/sessionStorageContext.tsx +80 -0
- package/src/contexts/shopifyUrlContext.tsx +97 -0
- package/src/contexts/types.ts +12 -8
- package/src/contexts/userIdentityContext.tsx +197 -0
- package/src/events/registerAnalyticsListeners.ts +32 -38
- package/src/hooks/index.ts +10 -6
- package/src/hooks/useAmplitudeOperations.ts +35 -0
- package/src/hooks/useAppDetails.ts +49 -0
- package/src/hooks/useCdnOperations.ts +16 -0
- package/src/hooks/useChatToggle.ts +5 -4
- package/src/hooks/useChatToggleAnalytics.ts +15 -0
- package/src/hooks/useGraphQLConfig.ts +63 -0
- package/src/hooks/useIdentifyUser.ts +33 -0
- package/src/hooks/useImageResolver.ts +18 -10
- package/src/hooks/useLocalStorageOperations.ts +92 -0
- package/src/hooks/useNewOrgConfig.ts +7 -0
- package/src/hooks/useSearch.tsx +21 -18
- package/src/hooks/useSearchOperations.ts +97 -0
- package/src/hooks/useSessionStorageOperations.ts +28 -0
- package/src/hooks/useShopifyUrlOperations.ts +45 -0
- package/src/hooks/useTrackComponentVisibleEvent.ts +12 -8
- package/src/hooks/useUpdateAnalyticsProps.ts +28 -17
- package/src/interceptors/index.ts +0 -1
- package/src/interceptors/useMessageInterceptor.ts +5 -8
- package/src/merchants/bandolier/bandolier.ts +10 -28
- package/src/merchants/carpe/carpe.ts +5 -8
- package/src/merchants/coterie/coterie.ts +3 -6
- package/src/merchants/default.ts +73 -70
- package/src/merchants/domInsertion.ts +30 -0
- package/src/merchants/dreamlandBaby/dreamlandBaby.ts +12 -6
- package/src/merchants/fiveCbd/fiveCbd.ts +7 -13
- package/src/merchants/forLoveAndLemons/forLoveAndLemons.ts +44 -14
- package/src/merchants/greenpan/greenpan.ts +6 -12
- package/src/merchants/gridInsertion.ts +19 -0
- package/src/merchants/grooveLife/grooveLife.ts +13 -7
- package/src/merchants/homegrownCannabis/homegrownCannabis.ts +12 -6
- package/src/merchants/jackArcher/jackArcher.ts +26 -11
- package/src/merchants/jordanCraig/jordanCraig.ts +5 -5
- package/src/merchants/kindredBravely/kindredBravely.ts +16 -7
- package/src/merchants/kutFromTheKloth/kutFromTheKloth.ts +9 -6
- package/src/merchants/larryAndSerges/larryAndSerges.ts +6 -2
- package/src/merchants/leapsAndRebounds/leapsAndRebounds.ts +7 -7
- package/src/merchants/longevityrx/longevityrx.ts +14 -8
- package/src/merchants/lookOptic/lookOptic.ts +6 -6
- package/src/merchants/mantraBrand/mantraBrand.ts +14 -8
- package/src/merchants/medterra/medterra.ts +14 -11
- package/src/merchants/modells/modells.ts +6 -9
- package/src/merchants/pressedFloral/pressedFloral.ts +7 -13
- package/src/merchants/skinPerfection/skinPerfection.ts +13 -7
- package/src/merchants/snapSupplements/snapSupplements.ts +13 -10
- package/src/merchants/spanx/spanx.ts +6 -6
- package/src/merchants/spanx/spanxStaging.ts +6 -12
- package/src/merchants/supergoop/supergoop.ts +11 -12
- package/src/merchants/uniqueVintage/uniqueVintage.ts +6 -6
- package/src/merchants/venaCbd/venaCbd.ts +6 -9
- package/src/merchants/westonJonBoucher/westonJonBoucher.ts +6 -6
- package/src/merchants/wineEnthusiast/wineEnthusiast.ts +6 -6
- package/src/merchants/wolfMattress/wolfMattress.ts +3 -3
- package/src/merchants/wolfTactical/wolfTactical.ts +5 -11
- package/src/types/config-versions.ts +6 -0
- package/src/types.ts +0 -53
- package/dist/adapters/amplitude/index.cjs +0 -14
- package/dist/adapters/amplitude/index.d.cts +0 -6
- package/dist/adapters/amplitude/index.d.ts +0 -6
- package/dist/adapters/amplitude/index.js +0 -12
- package/dist/api-B2euFL-5.cjs +0 -269
- package/dist/api-XRr_lAG6.js +0 -190
- package/dist/application/config/index.cjs +0 -43
- package/dist/application/config/index.d.cts +0 -15
- package/dist/application/config/index.d.ts +0 -15
- package/dist/application/config/index.js +0 -41
- package/dist/application/service/customerService/index.cjs +0 -4
- package/dist/application/service/customerService/index.d.cts +0 -3
- package/dist/application/service/customerService/index.d.ts +0 -3
- package/dist/application/service/customerService/index.js +0 -4
- package/dist/application/service/index.cjs +0 -41
- package/dist/application/service/index.d.cts +0 -399
- package/dist/application/service/index.d.ts +0 -399
- package/dist/application/service/index.js +0 -12
- package/dist/bandolier-B76-OE75.cjs +0 -1230
- package/dist/bandolier-DRn_x1g1.js +0 -1230
- package/dist/carpe-kHi4RLB5.cjs +0 -608
- package/dist/carpe-qrSU99gq.js +0 -606
- package/dist/contexts-CQDwe3rK.cjs +0 -14333
- package/dist/contexts-e2sM-B9g.js +0 -12919
- package/dist/coterie-mMirPcHP.js +0 -240
- package/dist/customerService-BG1uNZZ1.cjs +0 -36
- package/dist/customerService-BHQRnLhC.js +0 -23
- package/dist/default-8Jfv8ehQ.cjs +0 -199
- package/dist/default-C8PQf-38.js +0 -176
- package/dist/default-LukSiCz1.js +0 -4
- package/dist/default-rJSJ887P.cjs +0 -4
- package/dist/dreamlandBaby-DHltv12Z.cjs +0 -347
- package/dist/dreamlandBaby-cG0HM9bt.js +0 -347
- package/dist/featureFlagService-5wdmW02z.d.ts +0 -18
- package/dist/featureFlagService-DaelrXEk.d.cts +0 -18
- package/dist/fiveCbd-Cvnwh03g.cjs +0 -614
- package/dist/fiveCbd-DhYMlsf9.js +0 -614
- package/dist/forLoveAndLemons-C8DuUexW.js +0 -666
- package/dist/forLoveAndLemons-DR6a1zjJ.cjs +0 -668
- package/dist/greenpan-B4Pu65kV.js +0 -398
- package/dist/greenpan-BL5p6j7f.cjs +0 -398
- package/dist/grooveLife-DjKWHoN3.cjs +0 -343
- package/dist/grooveLife-JK0TyaPz.js +0 -343
- package/dist/homegrownCannabis-DxqSDkmS.js +0 -411
- package/dist/homegrownCannabis-ZnfCqW-m.cjs +0 -411
- package/dist/index-BfuO9b0Q.d.ts +0 -749
- package/dist/index-CNsGWfS6.d.cts +0 -749
- package/dist/index-DFL1dIT_.d.ts +0 -7
- package/dist/index-MFbPQ8Ji.d.ts +0 -95
- package/dist/index-VSFakgAI.d.cts +0 -95
- package/dist/index-zZjcds15.d.cts +0 -7
- package/dist/jackArcher-mGkojXek.cjs +0 -728
- package/dist/jordanCraig-BvCvPRoR.js +0 -1787
- package/dist/jordanCraig-Dv8pVCiS.cjs +0 -1787
- package/dist/kindredBravely-UQP7wiNu.cjs +0 -491
- package/dist/kindredBravely-X8F_LNph.js +0 -491
- package/dist/kutFromTheKloth-BhYKk3CN.cjs +0 -370
- package/dist/kutFromTheKloth-D1xsTSJr.js +0 -370
- package/dist/larryAndSerges-1411NuZa.cjs +0 -262
- package/dist/larryAndSerges-DVIRLItu.js +0 -262
- package/dist/leapsAndRebounds-BJ8mwr33.js +0 -361
- package/dist/leapsAndRebounds-UcP9EJVO.cjs +0 -361
- package/dist/logger-Dln20ans.cjs +0 -26
- package/dist/logger-pdEEY8T2.js +0 -20
- package/dist/longevityrx-BFSv9GF5.cjs +0 -321
- package/dist/longevityrx-Cp6wleWr.js +0 -321
- package/dist/lookOptic-KieSqskd.cjs +0 -283
- package/dist/mantraBrand-CHQw-0nw.cjs +0 -751
- package/dist/medterra-CLG6Co1C.cjs +0 -584
- package/dist/medterra-D8ZX9NZC.js +0 -584
- package/dist/modells-BzyPwN2m.cjs +0 -485
- package/dist/modells-CAfqOCW4.js +0 -485
- package/dist/orgConfigResults--dAwtw3W.d.ts +0 -881
- package/dist/orgConfigResults-BL0XBA6x.d.cts +0 -881
- package/dist/pressedFloral-DULBuQwR.cjs +0 -662
- package/dist/pressedFloral-Dp-7Fk3S.js +0 -662
- package/dist/skinPerfection-BxuYCeJX.js +0 -335
- package/dist/skinPerfection-Cd3XZ6By.cjs +0 -335
- package/dist/snapSupplements-Bf6htPM0.js +0 -286
- package/dist/snapSupplements-ZFnXyMuZ.cjs +0 -286
- package/dist/spanx-CwDPQaGj.js +0 -662
- package/dist/spanx-Cyd4qDlK.cjs +0 -664
- package/dist/spanxStaging-D43nyAGy.js +0 -846
- package/dist/spanxStaging-ijbYnHzr.cjs +0 -849
- package/dist/supergoop-BnbFG7hm.cjs +0 -338
- package/dist/supergoop-CY043wIg.js +0 -336
- package/dist/types-BF_CJeck.js +0 -177
- package/dist/types-CD4LFta-.d.cts +0 -33
- package/dist/types-CNH4sfF-.cjs +0 -231
- package/dist/types-DBdI0j89.d.ts +0 -33
- package/dist/uniqueVintage-R2Jcu1y1.cjs +0 -1214
- package/dist/variant-CKVRF2-W.d.ts +0 -13
- package/dist/variant-raYuOP4L.d.cts +0 -13
- package/dist/venaCbd-o5_vOp4e.js +0 -366
- package/dist/venaCbd-r-IxEVc1.cjs +0 -366
- package/dist/westonJonBoucher-DjGEW3ZB.cjs +0 -423
- package/dist/wineEnthusiast-DvfcV5B3.cjs +0 -941
- package/dist/wolfMattress-6xPfOJt3.js +0 -373
- package/dist/wolfMattress-BjGnGKjP.cjs +0 -373
- package/dist/wolfTactical-Bi3WZu0m.cjs +0 -350
- package/dist/wolfTactical-C_F9-oPX.js +0 -350
- package/src/adapters/amplitude/amplitudeAdapter.ts +0 -477
- package/src/adapters/amplitude/index.ts +0 -2
- package/src/adapters/amplitude/stubAmplitudeAdapter.ts +0 -34
- package/src/adapters/spiffy/commerce/graphql.ts +0 -219
- package/src/application/config/generalStaticConfig.ts +0 -40
- package/src/application/config/index.ts +0 -1
- package/src/application/models/domMutationContinuation.ts +0 -7
- package/src/application/models/domObservationStrategy.ts +0 -9
- package/src/application/service/cachingService.ts +0 -84
- package/src/application/service/cdnService.ts +0 -20
- package/src/application/service/customerService/index.ts +0 -8
- package/src/application/service/customerService/providers/UnsupportedCustomerService.ts +0 -15
- package/src/application/service/domMutationObserver.ts +0 -320
- package/src/application/service/domMutations/GridInsertionService.ts +0 -123
- package/src/application/service/domMutations/dataLayer/dataLayerEventsListener.ts +0 -99
- package/src/application/service/domMutations/domInsertionService.ts +0 -90
- package/src/application/service/domMutations/domMutationListener.ts +0 -15
- package/src/application/service/domMutations/domMutationListenerState.ts +0 -52
- package/src/application/service/domMutations/floatingChat/embeddedChatsPlacementsListener.ts +0 -41
- package/src/application/service/domMutations/gladly/gladlyListener.ts +0 -61
- package/src/application/service/domMutations/spiffy/orgs/common/kustomerVisibilityListener.ts +0 -41
- package/src/application/service/domMutations/spiffy/orgs/common/orgsCommonDataLayerListener.ts +0 -119
- package/src/application/service/featureFlagService.ts +0 -130
- package/src/application/service/index.ts +0 -31
- package/src/application/service/kustomerIntegrationService.ts +0 -111
- package/src/application/service/localStorageService.ts +0 -77
- package/src/application/service/pageVariantService.ts +0 -866
- package/src/application/service/searchService.ts +0 -147
- package/src/application/service/sessionStorageService.ts +0 -27
- package/src/application/service/shopifyUrlService.ts +0 -63
- package/src/application/service/userIdentityService.ts +0 -114
- package/src/application/service/windowChatToggleService.ts +0 -80
- package/src/application/service/windowDataLayerService.ts +0 -181
- package/src/application/service/windowFrontendConfigService.ts +0 -129
- package/src/atoms/org/merchantCss.ts +0 -158
- package/src/atoms/org/org.ts +0 -291
- package/src/atoms/org/orgUIConfig.ts +0 -142
- package/src/enabled-features.ts +0 -83
- package/src/hooks/useDynamicVariants.ts +0 -210
- package/src/hooks/useFileUpload.ts +0 -63
- package/src/hooks/useHideElements.ts +0 -82
- package/src/hooks/useHorizontalScrollAnimation.ts +0 -115
- package/src/hooks/useReducedMotionWithOverride.ts +0 -15
- package/src/hooks/useSnapControl.ts +0 -155
- package/src/interceptors/useFormEscalation.ts +0 -57
- /package/dist/{variantInfo-CzhR5W6h.js → atomStore-CZnUUsrr.js} +0 -0
- /package/dist/{variantInfo-CNRTY0gH.cjs → atomStore-KSoFS3Jj.cjs} +0 -0
- /package/dist/{utilityTypes-C4h2wgAK.cjs → locators-0YYZu9n4.cjs} +0 -0
- /package/dist/{utilityTypes-BVikejDo.js → locators-fBXS_pxP.js} +0 -0
- /package/dist/{locators-Dc5ZT0aF.js → utilityTypes-8sETsYPk.js} +0 -0
- /package/dist/{locators-lQMJj830.cjs → utilityTypes-COShxVir.cjs} +0 -0
- /package/src/{application/service/customerService/types.ts → types/customerService.ts} +0 -0
- /package/src/{adapters/spiffy/commerce → types}/exceptions/sessionExceptions.ts +0 -0
- /package/src/{adapters/spiffy/commerce → types}/exceptions/unsupportedProductExceptions.ts +0 -0
|
@@ -0,0 +1,1281 @@
|
|
|
1
|
+
import { PageVariantTestType } from "./types--pr1GQQx.js";
|
|
2
|
+
import { hasPropertyOfType, isApiPDPAttributes, isApiProductResponseAttributes, isApiProductSearchResponseAttributes, isApiQueryTypedAttributes, isApiResponse, isApiReviewResponseAttributes, isApiSearchAttributes, isApiSuggestionClickedAttributes, isApiTextResponseAttributes, isApiUserEvent, isSuggestion, logger_default } from "./api-DjeZXxl_.js";
|
|
3
|
+
import { FormType, FulfillmentDisplayStatus, OrganizationStatusEnum, PLPAttributeCategory, PageVisitCategory, ResponseCategory, UserEventCategory } from "@spiffy-ai/commerce-api-client";
|
|
4
|
+
|
|
5
|
+
//#region src/application/models/featureGates.ts
|
|
6
|
+
let FeatureGates = /* @__PURE__ */ function(FeatureGates$1) {
|
|
7
|
+
FeatureGates$1["IsClientSessionEnabled"] = "is_client_session_enabled";
|
|
8
|
+
FeatureGates$1["IsNewFeatureEnabled"] = "is_new_feature_enabled";
|
|
9
|
+
FeatureGates$1["IsFineTunedModel8b"] = "is_fine_tuned_model_8b";
|
|
10
|
+
FeatureGates$1["IsIntegratedCXEnabled"] = "is_integrated_cx_enabled";
|
|
11
|
+
FeatureGates$1["IsNonShapewearEnabled"] = "is_non_shapewear_enabled";
|
|
12
|
+
FeatureGates$1["IsImageBannerEnabled"] = "is_image_banner_enabled";
|
|
13
|
+
FeatureGates$1["IsOrderLookupEnabled"] = "is_order_lookup_enabled";
|
|
14
|
+
FeatureGates$1["IsSummarizeReviewsEnabled"] = "is_summarize_reviews_enabled";
|
|
15
|
+
FeatureGates$1["IsGlobalSearchEnabled"] = "is_global_search_enabled";
|
|
16
|
+
FeatureGates$1["IsImagePromptEnabled"] = "is_image_prompt_enabled";
|
|
17
|
+
FeatureGates$1["IsWatermarkEnabled"] = "is_watermark_enabled";
|
|
18
|
+
FeatureGates$1["IsInferenceRegion0"] = "is_inference_region_0";
|
|
19
|
+
FeatureGates$1["IsGraphQLUIConfigsEnabled"] = "is_graphql_ui_configs_enabled";
|
|
20
|
+
FeatureGates$1["IsGraphQLPageConfigsEnabled"] = "is_graphql_page_configs_enabled";
|
|
21
|
+
FeatureGates$1["IsGraphQLComponentConfigsEnabled"] = "is_graphql_component_configs_enabled";
|
|
22
|
+
FeatureGates$1["IsChatVariantEnabled"] = "is_chat_variant_enabled";
|
|
23
|
+
FeatureGates$1["IsChatVariantAEnabled"] = "is_chat_variant_a_enabled";
|
|
24
|
+
FeatureGates$1["IsChatVariantBEnabled"] = "is_chat_variant_b_enabled";
|
|
25
|
+
FeatureGates$1["IsUserQueryAlwaysEnabled"] = "is_user_query_always_enabled";
|
|
26
|
+
return FeatureGates$1;
|
|
27
|
+
}({});
|
|
28
|
+
|
|
29
|
+
//#endregion
|
|
30
|
+
//#region src/application/models/chatElementDisplayLocation.ts
|
|
31
|
+
let ChatElementDisplayLocation = /* @__PURE__ */ function(ChatElementDisplayLocation$1) {
|
|
32
|
+
ChatElementDisplayLocation$1["IN_CHAT"] = "in_chat";
|
|
33
|
+
ChatElementDisplayLocation$1["CHAT_PREVIEW"] = "chat_preview";
|
|
34
|
+
ChatElementDisplayLocation$1["FLOATING_BUTTON"] = "floating_button";
|
|
35
|
+
ChatElementDisplayLocation$1["HELP_ME_CHOOSE"] = "help_me_choose";
|
|
36
|
+
ChatElementDisplayLocation$1["PLP_IMAGE_BANNER"] = "plp_image_banner";
|
|
37
|
+
ChatElementDisplayLocation$1["TOP_REVIEWS_SNIPPET"] = "top_reviews_snippet";
|
|
38
|
+
ChatElementDisplayLocation$1["BOTTOM_REVIEWS_SNIPPET"] = "bottom_reviews_snippet";
|
|
39
|
+
ChatElementDisplayLocation$1["BLOCK_BACK_BUTTON"] = "block_back_button";
|
|
40
|
+
ChatElementDisplayLocation$1["SWITCH_TO_AGENT"] = "switch_to_agent";
|
|
41
|
+
ChatElementDisplayLocation$1["CONVERSATIONAL_SEARCH"] = "conversational_search";
|
|
42
|
+
ChatElementDisplayLocation$1["GLOBAL_SEARCH_ENTRYPOINT"] = "global_search_entrypoint";
|
|
43
|
+
ChatElementDisplayLocation$1["SEARCH_NAV_ENTRYPOINT"] = "search_nav_entrypoint";
|
|
44
|
+
ChatElementDisplayLocation$1["SEARCH_PROMPT"] = "search_prompt";
|
|
45
|
+
ChatElementDisplayLocation$1["SEARCH_PROMPT_BUTTON"] = "search_prompt_button";
|
|
46
|
+
ChatElementDisplayLocation$1["PRODUCT_GRID"] = "product_grid";
|
|
47
|
+
ChatElementDisplayLocation$1["UNSPECIFIED"] = "unspecified";
|
|
48
|
+
ChatElementDisplayLocation$1["FILTER_MODAL"] = "filter_modal";
|
|
49
|
+
ChatElementDisplayLocation$1["PROMPT_CARD"] = "prompt_card";
|
|
50
|
+
ChatElementDisplayLocation$1["WINDOW_API_CALL"] = "window_api_call";
|
|
51
|
+
return ChatElementDisplayLocation$1;
|
|
52
|
+
}({});
|
|
53
|
+
|
|
54
|
+
//#endregion
|
|
55
|
+
//#region src/application/models/events.ts
|
|
56
|
+
let SpiffyEventName = /* @__PURE__ */ function(SpiffyEventName$1) {
|
|
57
|
+
SpiffyEventName$1["WidgetOpen"] = "spiffy:widgetopen";
|
|
58
|
+
SpiffyEventName$1["WidgetClose"] = "spiffy:widgetclose";
|
|
59
|
+
return SpiffyEventName$1;
|
|
60
|
+
}({});
|
|
61
|
+
|
|
62
|
+
//#endregion
|
|
63
|
+
//#region src/application/models/googleAnalyticsEvents.ts
|
|
64
|
+
var GoogleAnalyticsEvents = /* @__PURE__ */ function(GoogleAnalyticsEvents$1) {
|
|
65
|
+
GoogleAnalyticsEvents$1["ADD_TO_CART_v1"] = "add_to_cart";
|
|
66
|
+
GoogleAnalyticsEvents$1["ADD_TO_CART_v2"] = "addToCart";
|
|
67
|
+
return GoogleAnalyticsEvents$1;
|
|
68
|
+
}(GoogleAnalyticsEvents || {});
|
|
69
|
+
|
|
70
|
+
//#endregion
|
|
71
|
+
//#region src/application/models/message.ts
|
|
72
|
+
let MessageRole = /* @__PURE__ */ function(MessageRole$1) {
|
|
73
|
+
MessageRole$1["User"] = "user";
|
|
74
|
+
MessageRole$1["Assistant"] = "assistant";
|
|
75
|
+
return MessageRole$1;
|
|
76
|
+
}({});
|
|
77
|
+
let MessageType = /* @__PURE__ */ function(MessageType$1) {
|
|
78
|
+
MessageType$1["Text"] = "text";
|
|
79
|
+
MessageType$1["SuggestionClicked"] = "suggestion_clicked";
|
|
80
|
+
MessageType$1["Product"] = "product";
|
|
81
|
+
MessageType$1["ProductSearch"] = "product_search";
|
|
82
|
+
MessageType$1["Review"] = "review";
|
|
83
|
+
MessageType$1["QueryTyped"] = "query_typed";
|
|
84
|
+
MessageType$1["Separator"] = "separator";
|
|
85
|
+
MessageType$1["Page"] = "page";
|
|
86
|
+
MessageType$1["Search"] = "search";
|
|
87
|
+
MessageType$1["Attachment"] = "attachment";
|
|
88
|
+
MessageType$1["CXAgentResponse"] = "cx_agent_response";
|
|
89
|
+
MessageType$1["Form"] = "form";
|
|
90
|
+
MessageType$1["Order"] = "order";
|
|
91
|
+
MessageType$1["ProductSearchFilter"] = "product_search_filter";
|
|
92
|
+
return MessageType$1;
|
|
93
|
+
}({});
|
|
94
|
+
|
|
95
|
+
//#endregion
|
|
96
|
+
//#region src/application/models/productExperiment.ts
|
|
97
|
+
let ProductExperiment = /* @__PURE__ */ function(ProductExperiment$1) {
|
|
98
|
+
ProductExperiment$1["Default"] = "default";
|
|
99
|
+
return ProductExperiment$1;
|
|
100
|
+
}({});
|
|
101
|
+
|
|
102
|
+
//#endregion
|
|
103
|
+
//#region src/application/models/spiffyWidgets.ts
|
|
104
|
+
/**
|
|
105
|
+
* Enum of all widget names. These are widgets that are rendered and integrated into
|
|
106
|
+
* a merchant's website.
|
|
107
|
+
*/
|
|
108
|
+
let SpiffyWidgets = /* @__PURE__ */ function(SpiffyWidgets$1) {
|
|
109
|
+
SpiffyWidgets$1["ImageBanner"] = "image_banner";
|
|
110
|
+
SpiffyWidgets$1["ImagePromptCard"] = "image_prompt_card";
|
|
111
|
+
SpiffyWidgets$1["SingleImagePrompt"] = "single_image_prompt";
|
|
112
|
+
SpiffyWidgets$1["EmbeddedWidget"] = "embedded_widget";
|
|
113
|
+
SpiffyWidgets$1["FloatingButton"] = "floating_button";
|
|
114
|
+
SpiffyWidgets$1["SuggestionBar"] = "suggestion_bar";
|
|
115
|
+
SpiffyWidgets$1["SearchPrompt"] = "search_prompt";
|
|
116
|
+
SpiffyWidgets$1["GlobalSearch"] = "global_search";
|
|
117
|
+
SpiffyWidgets$1["SearchResults"] = "search_results";
|
|
118
|
+
SpiffyWidgets$1["GlobalSearchEntryPoint"] = "global_search_entry_point";
|
|
119
|
+
return SpiffyWidgets$1;
|
|
120
|
+
}({});
|
|
121
|
+
|
|
122
|
+
//#endregion
|
|
123
|
+
//#region src/application/models/graphql/queries/getMerchantOrgIdQuery.ts
|
|
124
|
+
const getMerchantOrgIdQuery = `
|
|
125
|
+
query {
|
|
126
|
+
me {
|
|
127
|
+
org {
|
|
128
|
+
id
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
`;
|
|
133
|
+
|
|
134
|
+
//#endregion
|
|
135
|
+
//#region src/application/models/guards/isBaseEcommerceEvent.ts
|
|
136
|
+
/**
|
|
137
|
+
* Checks if an event is a base Google Analytics ecommerce event.
|
|
138
|
+
*
|
|
139
|
+
* @param data The event to check.
|
|
140
|
+
*
|
|
141
|
+
* @returns True if the event is a base ecommerce event, false otherwise.
|
|
142
|
+
*/
|
|
143
|
+
const isBaseEcommerceEvent = (data) => data != null && typeof data === "object" && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "event" in data && typeof data.event === "string";
|
|
144
|
+
|
|
145
|
+
//#endregion
|
|
146
|
+
//#region src/application/models/guards/isGA4EcommerceEvent.ts
|
|
147
|
+
/**
|
|
148
|
+
* Checks if an event is a Google Analytics 4 ecommerce event.
|
|
149
|
+
*
|
|
150
|
+
* @param data The event to check.
|
|
151
|
+
*
|
|
152
|
+
* @returns True if the event is a GA4 ecommerce event, false otherwise.
|
|
153
|
+
*/
|
|
154
|
+
const isGA4EcommerceEvent = (data) => typeof data === "object" && data != null && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "items" in data.ecommerce && Array.isArray(data.ecommerce.items);
|
|
155
|
+
|
|
156
|
+
//#endregion
|
|
157
|
+
//#region src/application/models/guards/isLegacyUAEcommerceEvent.ts
|
|
158
|
+
/**
|
|
159
|
+
* Checks if an event is a legacy Universal Analytics ecommerce event.
|
|
160
|
+
*
|
|
161
|
+
* @param data The event to check.
|
|
162
|
+
*
|
|
163
|
+
* @returns True if the event is a legacy UA ecommerce event, false otherwise.
|
|
164
|
+
*/
|
|
165
|
+
const isLegacyUAEcommerceEvent = (data) => data != null && typeof data === "object" && "ecommerce" in data && data.ecommerce != null && typeof data.ecommerce === "object" && "add" in data.ecommerce && typeof data.ecommerce.add === "object";
|
|
166
|
+
|
|
167
|
+
//#endregion
|
|
168
|
+
//#region src/application/models/guards/isMobilePLPChatPlacementParameter.ts
|
|
169
|
+
const isMobilePLPChatPlacementParameter = (value) => value != null && typeof value === "object" && "row_index" in value && typeof value.row_index === "number";
|
|
170
|
+
|
|
171
|
+
//#endregion
|
|
172
|
+
//#region src/application/models/guards/isSpanxTakeAQuizCtaParameter.ts
|
|
173
|
+
const isSpanxTakeAQuizCtaParameter = (value) => value != null && typeof value === "object" && "text" in value && typeof value.text === "string";
|
|
174
|
+
|
|
175
|
+
//#endregion
|
|
176
|
+
//#region src/application/models/guards/isVariantInfo.ts
|
|
177
|
+
const isPDPVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "pdp" && "productId" in variantInfo && typeof variantInfo.productId === "string";
|
|
178
|
+
const isPLPVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "plp" && "plpId" in variantInfo && typeof variantInfo.plpId === "string";
|
|
179
|
+
const isPageVisitVariantInfo = (variantInfo) => "variant" in variantInfo && variantInfo.variant === "page_visit" && "url" in variantInfo && typeof variantInfo.url === "string" && "pageVisitCategory" in variantInfo && Object.values(PageVisitCategory).includes(variantInfo.pageVisitCategory);
|
|
180
|
+
/**
|
|
181
|
+
* Type guard to check if an object is a valid VariantInfo.
|
|
182
|
+
*
|
|
183
|
+
* @param variantInfo - The unknown object to check.
|
|
184
|
+
*
|
|
185
|
+
* @returns True if the data is a valid VariantInfo object, false otherwise.
|
|
186
|
+
*/
|
|
187
|
+
const isVariantInfo = (variantInfo) => variantInfo != null && typeof variantInfo === "object" && "variantId" in variantInfo && (isPDPVariantInfo(variantInfo) || isPLPVariantInfo(variantInfo) || isPageVisitVariantInfo(variantInfo));
|
|
188
|
+
|
|
189
|
+
//#endregion
|
|
190
|
+
//#region src/application/models/guards/api/isApiFormResponse.ts
|
|
191
|
+
/**
|
|
192
|
+
* Type guard to check if the provided data has the all of the properties (with the correct types) of
|
|
193
|
+
* a FormResponseAttribute
|
|
194
|
+
*
|
|
195
|
+
* @param data - The data to check
|
|
196
|
+
*
|
|
197
|
+
* @returns true if the data has the correct properties, false otherwise
|
|
198
|
+
*/
|
|
199
|
+
const isApiFormResponseAttributes = (data) => {
|
|
200
|
+
if (data == null || typeof data !== "object") {
|
|
201
|
+
logger_default.logError("isApiFormResponseAttributes: data is null or not an object", void 0, { data });
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
204
|
+
if ("form_category" in data && typeof data.form_category !== "object") {
|
|
205
|
+
logger_default.logError("isApiFormResponseAttributes: form_category is not an object", void 0, { data });
|
|
206
|
+
return false;
|
|
207
|
+
}
|
|
208
|
+
if ("form_category" in data && typeof data.form_category === "object") {
|
|
209
|
+
if (!hasPropertyOfType(data.form_category, "form_type", "string") || !Object.values(FormType).includes(data.form_category.form_type)) {
|
|
210
|
+
logger_default.logError("isApiFormResponseAttributes: form_type is missing or not a valid form type", void 0, { data });
|
|
211
|
+
return false;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (!hasPropertyOfType(data, "schema", "object")) {
|
|
215
|
+
logger_default.logError("isApiFormResponseAttributes: schema is missing or not an object", void 0, { data });
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
if (!hasPropertyOfType(data.schema, "properties", "object")) {
|
|
219
|
+
logger_default.logError("isApiFormResponseAttributes: schema.properties is missing or not an object", void 0, { data });
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
if (!hasPropertyOfType(data.schema, "required", "array")) {
|
|
223
|
+
logger_default.logError("isApiFormResponseAttributes: schema.required is missing or not an array", void 0, { data });
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
if (!data.schema.required.every((key) => typeof key === "string" && key in data.schema.properties)) {
|
|
227
|
+
logger_default.logError("isApiFormResponseAttributes: schema.required contains invalid property keys", void 0, { data });
|
|
228
|
+
return false;
|
|
229
|
+
}
|
|
230
|
+
return true;
|
|
231
|
+
};
|
|
232
|
+
|
|
233
|
+
//#endregion
|
|
234
|
+
//#region src/application/models/guards/api/isApiFormSubmittedResponseAttributes.ts
|
|
235
|
+
const isApiFormSubmittedResponseAttributes = (data) => {
|
|
236
|
+
if (data == null || typeof data !== "object") {
|
|
237
|
+
logger_default.logError("isApiFormSubmittedResponseAttributes", "data is null or not an object", data);
|
|
238
|
+
return false;
|
|
239
|
+
}
|
|
240
|
+
if (!hasPropertyOfType(data, "filled_schema", "object")) {
|
|
241
|
+
logger_default.logError("isApiFormSubmittedResponseAttributes", "filled_schema is not an object", data);
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
if (!hasPropertyOfType(data, "form_response_id", "string")) {
|
|
245
|
+
logger_default.logError("isApiFormSubmittedResponseAttributes", "form_response_id is not a string", data);
|
|
246
|
+
return false;
|
|
247
|
+
}
|
|
248
|
+
if (!("form_type" in data) || !Object.values(FormType).includes(data.form_type)) {
|
|
249
|
+
logger_default.logError("isApiFormSubmittedResponseAttributes", "form_type is not a valid form type enum", data);
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
return true;
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
//#endregion
|
|
256
|
+
//#region src/application/models/guards/api/isApiOrderResponseAttributes.ts
|
|
257
|
+
const isApiOrderItemInfo = (data) => {
|
|
258
|
+
if (data == null || typeof data !== "object") {
|
|
259
|
+
logger_default.logError("OrderItemInfo must be an object", void 0, { data });
|
|
260
|
+
return false;
|
|
261
|
+
}
|
|
262
|
+
if (!hasPropertyOfType(data, "order_item_id", "string")) {
|
|
263
|
+
logger_default.logError("OrderItemInfo must have an order_item_id property", void 0, { data });
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
if (!hasPropertyOfType(data, "item_title", "string")) {
|
|
267
|
+
logger_default.logError("OrderItemInfo must have an item_title property", void 0, { data });
|
|
268
|
+
return false;
|
|
269
|
+
}
|
|
270
|
+
if (!hasPropertyOfType(data, "item_price", "number")) {
|
|
271
|
+
logger_default.logError("OrderItemInfo must have an item_price property", void 0, { data });
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
if (!hasPropertyOfType(data, "item_quantity", "number")) {
|
|
275
|
+
logger_default.logError("OrderItemInfo must have an item_quantity property", void 0, { data });
|
|
276
|
+
return false;
|
|
277
|
+
}
|
|
278
|
+
if (!hasPropertyOfType(data, "image", "string", true)) {
|
|
279
|
+
logger_default.logError("OrderItemInfo.image must be a string or null", void 0, { data });
|
|
280
|
+
return false;
|
|
281
|
+
}
|
|
282
|
+
if (!hasPropertyOfType(data, "fulfillment_display_status", "string", true)) {
|
|
283
|
+
logger_default.logError("OrderItemInfo.fulfillment_display_status must be a string or null", void 0, { data });
|
|
284
|
+
return false;
|
|
285
|
+
}
|
|
286
|
+
if (!hasPropertyOfType(data, "tracking_url", "string", true)) {
|
|
287
|
+
logger_default.logError("OrderItemInfo.tracking_url must be a string or null", void 0, { data });
|
|
288
|
+
return false;
|
|
289
|
+
}
|
|
290
|
+
if (!hasPropertyOfType(data, "delivered_at", "string", true)) {
|
|
291
|
+
logger_default.logError("OrderItemInfo.delivered_at must be a string or null", void 0, { data });
|
|
292
|
+
return false;
|
|
293
|
+
}
|
|
294
|
+
if (!hasPropertyOfType(data, "estimated_delivery_at", "string", true)) {
|
|
295
|
+
logger_default.logError("OrderItemInfo.estimated_delivery_at must be a string or null", void 0, { data });
|
|
296
|
+
return false;
|
|
297
|
+
}
|
|
298
|
+
if (!hasPropertyOfType(data, "in_transit_at", "string", true)) {
|
|
299
|
+
logger_default.logError("OrderItemInfo.in_transit_at must be a string or null", void 0, { data });
|
|
300
|
+
return false;
|
|
301
|
+
}
|
|
302
|
+
return true;
|
|
303
|
+
};
|
|
304
|
+
const isApiOrderResponseAttributes = (data) => {
|
|
305
|
+
if (data == null || typeof data !== "object") {
|
|
306
|
+
logger_default.logError("Order response attributes must be an object", void 0, { data });
|
|
307
|
+
return false;
|
|
308
|
+
}
|
|
309
|
+
if (!hasPropertyOfType(data, "created_at", "string")) {
|
|
310
|
+
logger_default.logError("Order response attributes must have a created_at property and have type string", void 0, { data });
|
|
311
|
+
return false;
|
|
312
|
+
}
|
|
313
|
+
if (!hasPropertyOfType(data, "latest_event_date", "string")) {
|
|
314
|
+
logger_default.logError("Order response attributes must have a latest_event_date property and have type string", void 0, { data });
|
|
315
|
+
return false;
|
|
316
|
+
}
|
|
317
|
+
if (!hasPropertyOfType(data, "line_items", "array") || !data.line_items.every((item) => isApiOrderItemInfo(item))) {
|
|
318
|
+
logger_default.logError("Order response attributes must have a line_items property with at least one order item", void 0, { data });
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
if (!hasPropertyOfType(data, "order_id", "string")) {
|
|
322
|
+
logger_default.logError("Order response attributes must have an order_id property and have type string", void 0, { data });
|
|
323
|
+
return false;
|
|
324
|
+
}
|
|
325
|
+
if (!hasPropertyOfType(data, "order_number", "string")) {
|
|
326
|
+
logger_default.logError("Order response attributes must have an order_number property and have type string", void 0, { data });
|
|
327
|
+
return false;
|
|
328
|
+
}
|
|
329
|
+
return true;
|
|
330
|
+
};
|
|
331
|
+
|
|
332
|
+
//#endregion
|
|
333
|
+
//#region src/application/models/guards/api/isApiOrganizationConfig.ts
|
|
334
|
+
const isApiOrgAnalyticsConfigAmplitude = (data) => {
|
|
335
|
+
if (data == null || typeof data !== "object") {
|
|
336
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: data is not an object", data);
|
|
337
|
+
return false;
|
|
338
|
+
}
|
|
339
|
+
if (!("session_replay_enabled" in data) || typeof data.session_replay_enabled !== "boolean") {
|
|
340
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: session_replay_enabled is not a boolean", data);
|
|
341
|
+
return false;
|
|
342
|
+
}
|
|
343
|
+
if (!("session_replay_sample_rate" in data) || typeof data.session_replay_sample_rate !== "number") {
|
|
344
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: session_replay_sample_rate is not a number", data);
|
|
345
|
+
return false;
|
|
346
|
+
}
|
|
347
|
+
if (!("tracking_enabled" in data) || typeof data.tracking_enabled !== "boolean") {
|
|
348
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigAmplitude: tracking_enabled is not a boolean", data);
|
|
349
|
+
return false;
|
|
350
|
+
}
|
|
351
|
+
return true;
|
|
352
|
+
};
|
|
353
|
+
const isApiOrgAnalyticsConfigCustomerService = (data) => {
|
|
354
|
+
if (data == null || typeof data !== "object") {
|
|
355
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigCustomerService: data is not an object", data);
|
|
356
|
+
return false;
|
|
357
|
+
}
|
|
358
|
+
if (!("provider" in data) || typeof data.provider !== "string") {
|
|
359
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigCustomerService: provider is not a string", data);
|
|
360
|
+
return false;
|
|
361
|
+
}
|
|
362
|
+
return true;
|
|
363
|
+
};
|
|
364
|
+
const isApiOrgAnalyticsConfigGoogleAnalytics = (data) => {
|
|
365
|
+
if (data == null || typeof data !== "object") {
|
|
366
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigGoogleAnalytics: data is not an object", data);
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
if (!("measurement_id" in data) || typeof data.measurement_id !== "string") {
|
|
370
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgAnalyticsConfigGoogleAnalytics: measurement_id is not a string", data);
|
|
371
|
+
return false;
|
|
372
|
+
}
|
|
373
|
+
return true;
|
|
374
|
+
};
|
|
375
|
+
/**
|
|
376
|
+
*
|
|
377
|
+
* @param data
|
|
378
|
+
* @returns
|
|
379
|
+
*/
|
|
380
|
+
const isApiOrgAnalyticsConfig = (data) => {
|
|
381
|
+
if (data == null || typeof data !== "object") {
|
|
382
|
+
logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: data is not an object", data);
|
|
383
|
+
return false;
|
|
384
|
+
}
|
|
385
|
+
if ("amplitude" in data && !isApiOrgAnalyticsConfigAmplitude(data.amplitude)) {
|
|
386
|
+
logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: amplitude is not an object", data);
|
|
387
|
+
return false;
|
|
388
|
+
}
|
|
389
|
+
if ("customer_service" in data && !isApiOrgAnalyticsConfigCustomerService(data.customer_service)) {
|
|
390
|
+
logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: customer_service is not an object", data);
|
|
391
|
+
return false;
|
|
392
|
+
}
|
|
393
|
+
if ("google_analytics" in data && !isApiOrgAnalyticsConfigGoogleAnalytics(data.google_analytics)) {
|
|
394
|
+
logger_default.logDebug("[spiffy-ai] isOrgAnalyticsConfig: google_analytics is not an object", data);
|
|
395
|
+
return false;
|
|
396
|
+
}
|
|
397
|
+
return true;
|
|
398
|
+
};
|
|
399
|
+
/**
|
|
400
|
+
*
|
|
401
|
+
* @param data
|
|
402
|
+
* @returns
|
|
403
|
+
*/
|
|
404
|
+
const isApiOrganizationConfig = (data) => {
|
|
405
|
+
if (data == null || typeof data !== "object") {
|
|
406
|
+
logger_default.logDebug("[spiffy-ai] isOrgConfig: data is not an object", data);
|
|
407
|
+
return false;
|
|
408
|
+
}
|
|
409
|
+
if (!("created_at" in data)) {
|
|
410
|
+
logger_default.logDebug("[spiffy-ai] isOrgConfig: created_at is not defined", data);
|
|
411
|
+
return false;
|
|
412
|
+
}
|
|
413
|
+
if (!("namespace" in data) || typeof data.namespace !== "string") {
|
|
414
|
+
logger_default.logDebug("[spiffy-ai] isOrgConfig: namespace is not a string", data);
|
|
415
|
+
return false;
|
|
416
|
+
}
|
|
417
|
+
if (!("is_latest" in data) || typeof data.is_latest !== "boolean") {
|
|
418
|
+
logger_default.logDebug("[spiffy-ai] isOrgConfig: is_latest is not a boolean", data);
|
|
419
|
+
return false;
|
|
420
|
+
}
|
|
421
|
+
if (!("version" in data) || typeof data.version !== "string") {
|
|
422
|
+
logger_default.logDebug("[spiffy-ai] isOrgConfig: version is not a string", data);
|
|
423
|
+
return false;
|
|
424
|
+
}
|
|
425
|
+
if (!("updated_at" in data)) {
|
|
426
|
+
logger_default.logDebug("[spiffy-ai] isOrgConfig: updated_at is not defined", data);
|
|
427
|
+
return false;
|
|
428
|
+
}
|
|
429
|
+
if (!("config" in data) || typeof data.config !== "object" || !isApiOrgAnalyticsConfig(data.config)) {
|
|
430
|
+
logger_default.logDebug("[spiffy-ai] isOrgConfig: config is not an object", data);
|
|
431
|
+
return false;
|
|
432
|
+
}
|
|
433
|
+
if ("organization_id" in data && typeof data.organization_id !== "string") {
|
|
434
|
+
logger_default.logDebug("[spiffy-ai] isOrgConfig: organization_id is not a string", data);
|
|
435
|
+
return false;
|
|
436
|
+
}
|
|
437
|
+
if ("id" in data && typeof data.id !== "string") {
|
|
438
|
+
logger_default.logDebug("[spiffy-ai] isOrgConfig: id is not a string", data);
|
|
439
|
+
return false;
|
|
440
|
+
}
|
|
441
|
+
return true;
|
|
442
|
+
};
|
|
443
|
+
|
|
444
|
+
//#endregion
|
|
445
|
+
//#region src/application/models/guards/api/isApiOrgConfigResults.ts
|
|
446
|
+
const isApiOrgConfigExperiment = (data) => {
|
|
447
|
+
if (data == null || typeof data !== "object") {
|
|
448
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: data is not an object", void 0, { data });
|
|
449
|
+
return false;
|
|
450
|
+
}
|
|
451
|
+
if ("group" in data && typeof data.group !== "string" && data.group !== void 0) {
|
|
452
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: group is not a string or undefined", void 0, { data });
|
|
453
|
+
return false;
|
|
454
|
+
}
|
|
455
|
+
if ("group_name" in data && typeof data.group_name !== "string" && data.group_name !== void 0) {
|
|
456
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: group_name is not a string", void 0, { data });
|
|
457
|
+
return false;
|
|
458
|
+
}
|
|
459
|
+
if ("name" in data && typeof data.name !== "string" && data.name !== void 0) {
|
|
460
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: name is not a string", void 0, { data });
|
|
461
|
+
return false;
|
|
462
|
+
}
|
|
463
|
+
if ("rule_id" in data && typeof data.rule_id !== "string" && data.rule_id !== void 0) {
|
|
464
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: rule_id is not a string", void 0, { data });
|
|
465
|
+
return false;
|
|
466
|
+
}
|
|
467
|
+
if ("value" in data && typeof data.value !== "object" && data.value !== void 0) {
|
|
468
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigExperiment: value is not an object", void 0, { data });
|
|
469
|
+
return false;
|
|
470
|
+
}
|
|
471
|
+
return true;
|
|
472
|
+
};
|
|
473
|
+
const isApiOrgConfigFeatureGate = (data) => {
|
|
474
|
+
if (data == null || typeof data !== "object") {
|
|
475
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: data is not an object", void 0, { data });
|
|
476
|
+
return false;
|
|
477
|
+
}
|
|
478
|
+
if ("name" in data && typeof data.name !== "string" && data.name !== void 0) {
|
|
479
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: name is not a string", void 0, { data });
|
|
480
|
+
return false;
|
|
481
|
+
}
|
|
482
|
+
if ("rule_id" in data && typeof data.rule_id !== "string" && data.rule_id !== void 0) {
|
|
483
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: rule_id is not a string", void 0, { data });
|
|
484
|
+
return false;
|
|
485
|
+
}
|
|
486
|
+
if ("value" in data && typeof data.value !== "boolean" && data.value !== void 0) {
|
|
487
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigFeatureGate: value is not a boolean", void 0, { data });
|
|
488
|
+
return false;
|
|
489
|
+
}
|
|
490
|
+
return true;
|
|
491
|
+
};
|
|
492
|
+
const isApiOrganization = (data) => {
|
|
493
|
+
if (data == null || typeof data !== "object") {
|
|
494
|
+
logger_default.logDebug("[spiffy-ai] isApiOrganization: data is not an object", void 0, { data });
|
|
495
|
+
return false;
|
|
496
|
+
}
|
|
497
|
+
if (!("id" in data) || typeof data.id !== "string") {
|
|
498
|
+
logger_default.logDebug("[spiffy-ai] isApiOrganization: id is not a string", void 0, { data });
|
|
499
|
+
return false;
|
|
500
|
+
}
|
|
501
|
+
if (!("display_name" in data) || typeof data.display_name !== "string") {
|
|
502
|
+
logger_default.logDebug("[spiffy-ai] isApiOrganization: display_name is not a string", void 0, { data });
|
|
503
|
+
return false;
|
|
504
|
+
}
|
|
505
|
+
if (!("domain" in data) || typeof data.domain !== "string") {
|
|
506
|
+
logger_default.logDebug("[spiffy-ai] isApiOrganization: domain is not a string", void 0, { data });
|
|
507
|
+
return false;
|
|
508
|
+
}
|
|
509
|
+
if (!("short_name" in data) || typeof data.short_name !== "string") {
|
|
510
|
+
logger_default.logDebug("[spiffy-ai] isApiOrganization: short_name is not a string", void 0, { data });
|
|
511
|
+
return false;
|
|
512
|
+
}
|
|
513
|
+
if (!("status" in data) || !Object.values(OrganizationStatusEnum).includes(data.status)) {
|
|
514
|
+
logger_default.logDebug("[spiffy-ai] isApiOrganization: status is not a valid OrganizationStatusEnum value", void 0, { data });
|
|
515
|
+
return false;
|
|
516
|
+
}
|
|
517
|
+
if ("created_at" in data && !(data.created_at instanceof Date) && typeof data.created_at !== "string" && data.created_at !== void 0) {
|
|
518
|
+
logger_default.logDebug("[spiffy-ai] isApiOrganization: created_at is not a Date", void 0, { data });
|
|
519
|
+
return false;
|
|
520
|
+
}
|
|
521
|
+
if ("updated_at" in data && !(data.updated_at instanceof Date) && typeof data.updated_at !== "string" && data.updated_at !== void 0) {
|
|
522
|
+
logger_default.logDebug("[spiffy-ai] isApiOrganization: updated_at is not a Date", void 0, { data });
|
|
523
|
+
return false;
|
|
524
|
+
}
|
|
525
|
+
return true;
|
|
526
|
+
};
|
|
527
|
+
const isApiOrgConfigOrganizationSettings = (data) => {
|
|
528
|
+
if (data == null || typeof data !== "object") {
|
|
529
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigOrganizationSettings: data is not an object", void 0, { data });
|
|
530
|
+
return false;
|
|
531
|
+
}
|
|
532
|
+
if (!("org" in data) || !isApiOrganization(data.org)) {
|
|
533
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigOrganizationSettings: org is not an object", void 0, { data });
|
|
534
|
+
return false;
|
|
535
|
+
}
|
|
536
|
+
return true;
|
|
537
|
+
};
|
|
538
|
+
/**
|
|
539
|
+
*
|
|
540
|
+
* @param data
|
|
541
|
+
* @returns
|
|
542
|
+
*/
|
|
543
|
+
const isApiOrgConfigResults = (data) => {
|
|
544
|
+
if (data == null || typeof data !== "object") {
|
|
545
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: data is not an object", void 0, { data });
|
|
546
|
+
return false;
|
|
547
|
+
}
|
|
548
|
+
if (!("configs" in data) || !Array.isArray(data.configs) || !data.configs.every((config) => isApiOrganizationConfig(config))) {
|
|
549
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: configs is not an array", void 0, { data });
|
|
550
|
+
return false;
|
|
551
|
+
}
|
|
552
|
+
if ("experiments" in data && data.experiments !== void 0 && (!Array.isArray(data.experiments) || !data.experiments.every((exp) => isApiOrgConfigExperiment(exp)))) {
|
|
553
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: experiments is not an array or contains invalid items", void 0, { data });
|
|
554
|
+
return false;
|
|
555
|
+
}
|
|
556
|
+
if (!("gates" in data) || !Array.isArray(data.gates) || !data.gates.every((gate) => isApiOrgConfigFeatureGate(gate))) {
|
|
557
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: gates is not an array or contains invalid items", void 0, { data });
|
|
558
|
+
return false;
|
|
559
|
+
}
|
|
560
|
+
if (!("org" in data) || !isApiOrgConfigOrganizationSettings(data.org)) {
|
|
561
|
+
logger_default.logDebug("[spiffy-ai] isApiOrgConfigResults: org is not an object or has invalid fields", void 0, { data });
|
|
562
|
+
return false;
|
|
563
|
+
}
|
|
564
|
+
return true;
|
|
565
|
+
};
|
|
566
|
+
|
|
567
|
+
//#endregion
|
|
568
|
+
//#region src/application/models/guards/api/isApiPageResponseAttributes.ts
|
|
569
|
+
const isApiPageResponseAttributes = (obj) => {
|
|
570
|
+
if (obj == null || typeof obj !== "object") return false;
|
|
571
|
+
if ("title" in obj && obj.title != null && typeof obj.title !== "string") return false;
|
|
572
|
+
if ("description" in obj && typeof obj.description !== "string") return false;
|
|
573
|
+
if ("url" in obj && typeof obj.url !== "string") return false;
|
|
574
|
+
return true;
|
|
575
|
+
};
|
|
576
|
+
|
|
577
|
+
//#endregion
|
|
578
|
+
//#region src/application/models/guards/api/isApiPLPEventAttributes.ts
|
|
579
|
+
const isApiPLPIdAttribute = (data) => {
|
|
580
|
+
if (data == null || typeof data !== "object") return false;
|
|
581
|
+
if (!("id" in data) || typeof data.id !== "string") return false;
|
|
582
|
+
return true;
|
|
583
|
+
};
|
|
584
|
+
const isApiPLPEventAttributes = (data) => {
|
|
585
|
+
if (data == null || typeof data !== "object") return false;
|
|
586
|
+
if (!("category" in data) || typeof data.category !== "string" || !Object.values(PLPAttributeCategory).includes(data.category)) return false;
|
|
587
|
+
if (!("attributes" in data) || typeof data.attributes !== "object" || !isApiPLPIdAttribute(data.attributes)) return false;
|
|
588
|
+
return true;
|
|
589
|
+
};
|
|
590
|
+
|
|
591
|
+
//#endregion
|
|
592
|
+
//#region src/application/models/guards/api/isApiProductSearchFilterAttributes.ts
|
|
593
|
+
const isApiProductSearchFilterResponseAttributes = (attributes) => {
|
|
594
|
+
if (attributes == null || typeof attributes !== "object") return false;
|
|
595
|
+
if ("filter_name" in attributes && typeof attributes.filter_name !== "string") return false;
|
|
596
|
+
return true;
|
|
597
|
+
};
|
|
598
|
+
|
|
599
|
+
//#endregion
|
|
600
|
+
//#region src/application/models/guards/graphQL/isGraphQLColorsConfig.ts
|
|
601
|
+
const REQUIRED_COLOR_FIELDS = [
|
|
602
|
+
"accent_primary",
|
|
603
|
+
"accent_secondary",
|
|
604
|
+
"background_dark",
|
|
605
|
+
"background_light",
|
|
606
|
+
"background_primary",
|
|
607
|
+
"background_saturated",
|
|
608
|
+
"background_secondary",
|
|
609
|
+
"background_secondary_dark",
|
|
610
|
+
"background_tertiary",
|
|
611
|
+
"border_dark",
|
|
612
|
+
"border_light",
|
|
613
|
+
"border_medium",
|
|
614
|
+
"border_outline",
|
|
615
|
+
"text_accent",
|
|
616
|
+
"text_light",
|
|
617
|
+
"text_link",
|
|
618
|
+
"text_primary",
|
|
619
|
+
"text_secondary"
|
|
620
|
+
];
|
|
621
|
+
const isGraphQLColorsConfig = (data) => {
|
|
622
|
+
if (typeof data !== "object" || data === null) {
|
|
623
|
+
logger_default.logError("Invalid graphql response for colors config", void 0, { data });
|
|
624
|
+
return false;
|
|
625
|
+
}
|
|
626
|
+
const missingFields = REQUIRED_COLOR_FIELDS.filter((field) => !(field in data) || typeof data[field] !== "string");
|
|
627
|
+
if (missingFields.length === REQUIRED_COLOR_FIELDS.length) {
|
|
628
|
+
logger_default.logError("All color fields are missing or null", void 0);
|
|
629
|
+
return false;
|
|
630
|
+
}
|
|
631
|
+
if (missingFields.length > 0) {
|
|
632
|
+
logger_default.logError("Missing or invalid color fields", void 0, {
|
|
633
|
+
data,
|
|
634
|
+
missingFields
|
|
635
|
+
});
|
|
636
|
+
return false;
|
|
637
|
+
}
|
|
638
|
+
return true;
|
|
639
|
+
};
|
|
640
|
+
|
|
641
|
+
//#endregion
|
|
642
|
+
//#region src/application/models/utils/snakeToCamelTransformer.ts
|
|
643
|
+
/**
|
|
644
|
+
* Generic utility to transform snake_case object keys to camelCase at runtime.
|
|
645
|
+
* This is the runtime equivalent of the CamelCasedPropertiesDeep type utility.
|
|
646
|
+
*/
|
|
647
|
+
const PRESERVED_ACRONYMS = [
|
|
648
|
+
"PLP",
|
|
649
|
+
"PDP",
|
|
650
|
+
"SVG"
|
|
651
|
+
];
|
|
652
|
+
/**
|
|
653
|
+
* Converts a snake_case string to camelCase
|
|
654
|
+
* Handles specific acronyms like PLP and PDP correctly
|
|
655
|
+
*/
|
|
656
|
+
const toCamelCase = (str) => {
|
|
657
|
+
let processedStr = str;
|
|
658
|
+
for (const acronym of PRESERVED_ACRONYMS) {
|
|
659
|
+
const regex = new RegExp(`_${acronym}_?`, "gi");
|
|
660
|
+
if (processedStr.match(regex)) processedStr = processedStr.replace(regex, (v) => v.endsWith("_") ? `${acronym}_` : `${acronym}`);
|
|
661
|
+
}
|
|
662
|
+
return processedStr.replace(/_([a-z])/g, (_, letter) => letter.toUpperCase());
|
|
663
|
+
};
|
|
664
|
+
/**
|
|
665
|
+
* Converts a camelCase string to snake_case
|
|
666
|
+
* Handles consecutive capital letters correctly (e.g., "PDP" -> "pdp", not "p_d_p")
|
|
667
|
+
* Preserves specific acronyms like PLP and PDP as lowercase in snake_case
|
|
668
|
+
*/
|
|
669
|
+
const toSnakeCase = (str) => str.replace(/([A-Z])(?=[a-z])/g, "_$1").replace(/([a-z])([A-Z])/g, "$1_$2").toLowerCase().replace(/^_/, "");
|
|
670
|
+
/**
|
|
671
|
+
* Recursively transforms all object keys from snake_case to camelCase
|
|
672
|
+
*/
|
|
673
|
+
const transformSnakeToCamel = (obj) => {
|
|
674
|
+
if (obj === null || obj === void 0) return obj;
|
|
675
|
+
if (Array.isArray(obj)) return obj.map((val) => transformSnakeToCamel(val));
|
|
676
|
+
if (typeof obj === "object") {
|
|
677
|
+
const result = {};
|
|
678
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
679
|
+
const camelKey = toCamelCase(key);
|
|
680
|
+
result[camelKey] = transformSnakeToCamel(value);
|
|
681
|
+
}
|
|
682
|
+
return result;
|
|
683
|
+
}
|
|
684
|
+
return obj;
|
|
685
|
+
};
|
|
686
|
+
/**
|
|
687
|
+
* Recursively transforms all object keys from camelCase to snake_case
|
|
688
|
+
*/
|
|
689
|
+
const transformCamelToSnake = (obj) => {
|
|
690
|
+
if (obj === null || obj === void 0) return obj;
|
|
691
|
+
if (Array.isArray(obj)) return obj.map(transformCamelToSnake);
|
|
692
|
+
if (typeof obj === "object") {
|
|
693
|
+
const result = {};
|
|
694
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
695
|
+
const snakeKey = toSnakeCase(key);
|
|
696
|
+
result[snakeKey] = transformCamelToSnake(value);
|
|
697
|
+
}
|
|
698
|
+
return result;
|
|
699
|
+
}
|
|
700
|
+
return obj;
|
|
701
|
+
};
|
|
702
|
+
|
|
703
|
+
//#endregion
|
|
704
|
+
//#region src/application/models/utils/stringToFulfillmentDisplayStatusEnumValue.ts
|
|
705
|
+
/**
|
|
706
|
+
* Converts a string to a FulfillmentDisplayStatus enum value.
|
|
707
|
+
*
|
|
708
|
+
* @param status - The string to convert.
|
|
709
|
+
*
|
|
710
|
+
* @returns The FulfillmentDisplayStatus enum value or undefined if the string
|
|
711
|
+
* does not map to a valid enum
|
|
712
|
+
*/
|
|
713
|
+
const stringToFulfillmentDisplayStatusEnumValue = (status) => {
|
|
714
|
+
switch (status) {
|
|
715
|
+
case "ATTEMPTED_DELIVERY": return FulfillmentDisplayStatus.ATTEMPTED_DELIVERY;
|
|
716
|
+
case "CANCELED": return FulfillmentDisplayStatus.CANCELED;
|
|
717
|
+
case "CONFIRMED": return FulfillmentDisplayStatus.CONFIRMED;
|
|
718
|
+
case "DELIVERED": return FulfillmentDisplayStatus.DELIVERED;
|
|
719
|
+
case "FAILURE": return FulfillmentDisplayStatus.FAILURE;
|
|
720
|
+
case "FULFILLED": return FulfillmentDisplayStatus.FULFILLED;
|
|
721
|
+
case "IN_TRANSIT": return FulfillmentDisplayStatus.IN_TRANSIT;
|
|
722
|
+
case "LABEL_PRINTED": return FulfillmentDisplayStatus.LABEL_PRINTED;
|
|
723
|
+
case "LABEL_PURCHASED": return FulfillmentDisplayStatus.LABEL_PURCHASED;
|
|
724
|
+
case "LABEL_VOIDED": return FulfillmentDisplayStatus.LABEL_VOIDED;
|
|
725
|
+
case "MARKED_AS_FULFILLED": return FulfillmentDisplayStatus.MARKED_AS_FULFILLED;
|
|
726
|
+
case "NOT_DELIVERED": return FulfillmentDisplayStatus.NOT_DELIVERED;
|
|
727
|
+
case "OUT_FOR_DELIVERY": return FulfillmentDisplayStatus.OUT_FOR_DELIVERY;
|
|
728
|
+
case "PICKED_UP": return FulfillmentDisplayStatus.PICKED_UP;
|
|
729
|
+
case "READY_FOR_PICKUP": return FulfillmentDisplayStatus.READY_FOR_PICKUP;
|
|
730
|
+
case "SUBMITTED": return FulfillmentDisplayStatus.SUBMITTED;
|
|
731
|
+
case "IN_PROGRESS": return FulfillmentDisplayStatus.IN_PROGRESS;
|
|
732
|
+
case "ON_HOLD": return FulfillmentDisplayStatus.ON_HOLD;
|
|
733
|
+
case "OPEN": return FulfillmentDisplayStatus.OPEN;
|
|
734
|
+
case "PARTIALLY_FULFILLED": return FulfillmentDisplayStatus.PARTIALLY_FULFILLED;
|
|
735
|
+
case "PENDING_FULFILLMENT": return FulfillmentDisplayStatus.PENDING_FULFILLMENT;
|
|
736
|
+
case "REQUEST_DECLINED": return FulfillmentDisplayStatus.REQUEST_DECLINED;
|
|
737
|
+
case "RESTOCKED": return FulfillmentDisplayStatus.RESTOCKED;
|
|
738
|
+
case "SCHEDULED": return FulfillmentDisplayStatus.SCHEDULED;
|
|
739
|
+
case "UNFULFILLED": return FulfillmentDisplayStatus.UNFULFILLED;
|
|
740
|
+
default: return;
|
|
741
|
+
}
|
|
742
|
+
};
|
|
743
|
+
|
|
744
|
+
//#endregion
|
|
745
|
+
//#region src/application/models/validators/validateGraphQLColorsConfig.ts
|
|
746
|
+
const validateGraphQLColorsConfig = (data) => {
|
|
747
|
+
if (!isGraphQLColorsConfig(data)) return;
|
|
748
|
+
};
|
|
749
|
+
|
|
750
|
+
//#endregion
|
|
751
|
+
//#region src/merchants/domInsertion.ts
|
|
752
|
+
var DOMInsertionType = /* @__PURE__ */ function(DOMInsertionType$1) {
|
|
753
|
+
DOMInsertionType$1["AFTER"] = "after";
|
|
754
|
+
DOMInsertionType$1["BEFORE"] = "before";
|
|
755
|
+
DOMInsertionType$1["ADJACENT_AFTER_BEGIN"] = "adjacent-after-begin";
|
|
756
|
+
DOMInsertionType$1["ADJACENT_BEFORE_BEGIN"] = "adjacent-before-begin";
|
|
757
|
+
DOMInsertionType$1["ADJACENT_AFTER_END"] = "adjacent-after-end";
|
|
758
|
+
DOMInsertionType$1["ADJACENT_BEFORE_END"] = "adjacent-before-end";
|
|
759
|
+
DOMInsertionType$1["APPEND_CHILD"] = "append-child";
|
|
760
|
+
DOMInsertionType$1["NONE"] = "none";
|
|
761
|
+
return DOMInsertionType$1;
|
|
762
|
+
}(DOMInsertionType || {});
|
|
763
|
+
|
|
764
|
+
//#endregion
|
|
765
|
+
//#region src/merchants/gridInsertion.ts
|
|
766
|
+
var GridInsertionType = /* @__PURE__ */ function(GridInsertionType$1) {
|
|
767
|
+
GridInsertionType$1["FIXED_1"] = "fixed-1";
|
|
768
|
+
GridInsertionType$1["FIXED_2"] = "fixed-2";
|
|
769
|
+
GridInsertionType$1["FIXED_3"] = "fixed-3";
|
|
770
|
+
GridInsertionType$1["FIXED_4"] = "fixed-4";
|
|
771
|
+
GridInsertionType$1["FIXED_5"] = "fixed-5";
|
|
772
|
+
GridInsertionType$1["FIXED_6"] = "fixed-6";
|
|
773
|
+
GridInsertionType$1["FIXED_7"] = "fixed-7";
|
|
774
|
+
GridInsertionType$1["FIXED_8"] = "fixed-8";
|
|
775
|
+
GridInsertionType$1["FIXED_9"] = "fixed-9";
|
|
776
|
+
GridInsertionType$1["FIXED_12"] = "fixed-12";
|
|
777
|
+
GridInsertionType$1["FIXED_13"] = "fixed-13";
|
|
778
|
+
GridInsertionType$1["ROW_1"] = "row-1";
|
|
779
|
+
GridInsertionType$1["ROW_2"] = "row-2";
|
|
780
|
+
GridInsertionType$1["ROW_3"] = "row-3";
|
|
781
|
+
GridInsertionType$1["ROW_4"] = "row-4";
|
|
782
|
+
return GridInsertionType$1;
|
|
783
|
+
}(GridInsertionType || {});
|
|
784
|
+
|
|
785
|
+
//#endregion
|
|
786
|
+
//#region src/application/models/validators/validateGraphQLFrontendConfig.ts
|
|
787
|
+
const validateAndTransformPageVariants = (config) => {
|
|
788
|
+
const { variantChecks, widgetMounting,...rest } = transformSnakeToCamel(config);
|
|
789
|
+
const variantTests = Array.isArray(variantChecks) ? variantChecks.map(({ checkType,...restCheck }) => ({
|
|
790
|
+
...restCheck,
|
|
791
|
+
testType: checkType
|
|
792
|
+
})) : [];
|
|
793
|
+
const normalizedWidgetMounting = Array.isArray(widgetMounting) ? widgetMounting.map(({ mountingPointWidgets,...restMounting }) => ({
|
|
794
|
+
...restMounting,
|
|
795
|
+
...Array.isArray(mountingPointWidgets) ? { mountingPointWidgets: mountingPointWidgets.map(({ checks,...restWidget }) => ({
|
|
796
|
+
...restWidget,
|
|
797
|
+
tests: Array.isArray(checks) ? checks.map(({ checkType,...restCheck }) => ({
|
|
798
|
+
...restCheck,
|
|
799
|
+
testType: checkType
|
|
800
|
+
})) : []
|
|
801
|
+
})) } : {}
|
|
802
|
+
})) : [];
|
|
803
|
+
const normalizedConfig = {
|
|
804
|
+
...rest,
|
|
805
|
+
...variantTests ? { variantTests } : {},
|
|
806
|
+
...normalizedWidgetMounting ? { widgetMounting: normalizedWidgetMounting } : {}
|
|
807
|
+
};
|
|
808
|
+
const variantId = normalizedConfig.variantId;
|
|
809
|
+
const variantType = normalizedConfig.variantType;
|
|
810
|
+
if (typeof variantId !== "string" || !variantId) throw new Error(`Missing or invalid variantId for pageVariant`);
|
|
811
|
+
if (typeof variantType !== "string" || !variantType) throw new Error(`Missing or invalid variantType for pageVariant '${variantId}'`);
|
|
812
|
+
if (!Array.isArray(variantTests)) throw new Error(`Missing or invalid variantTests for pageVariant '${variantId}'. Must be an array`);
|
|
813
|
+
for (const test of variantTests) {
|
|
814
|
+
if (!test.testType || typeof test.testType !== "string") throw new Error(`Invalid variantTest.testType for pageVariant '${variantId}'`);
|
|
815
|
+
if (!Object.values(PageVariantTestType).includes(test.testType)) throw new Error(`Invalid testType '${test.testType}' for pageVariant '${variantId}'. Valid types: ${Object.values(PageVariantTestType).join(", ")}`);
|
|
816
|
+
}
|
|
817
|
+
if (!Array.isArray(normalizedWidgetMounting)) throw new Error(`Missing or invalid widgetMounting for pageVariant '${variantId}'. Must be an array`);
|
|
818
|
+
for (const mounting of normalizedWidgetMounting) {
|
|
819
|
+
if (typeof mounting.mountingConfigId !== "string" || !mounting.mountingConfigId) throw new Error(`Invalid mountingConfigId in widgetMounting for pageVariant '${variantId}'`);
|
|
820
|
+
if (mounting.widgetConfigId && typeof mounting.widgetConfigId !== "string") throw new Error(`Invalid widgetConfigId in widgetMounting for pageVariant '${variantId}'`);
|
|
821
|
+
if (mounting.mountingPointWidgets) for (const widget of mounting.mountingPointWidgets) {
|
|
822
|
+
if (typeof widget.widgetConfigId !== "string" || !widget.widgetConfigId) throw new Error(`Invalid widgetConfigId in mountingPointWidgets for pageVariant '${variantId}'`);
|
|
823
|
+
if (!Array.isArray(widget.tests)) throw new Error(`Invalid or missing tests in mountingPointWidgets for pageVariant '${variantId}'`);
|
|
824
|
+
}
|
|
825
|
+
}
|
|
826
|
+
if (variantType === "plp") {
|
|
827
|
+
if (typeof normalizedConfig.plpIdExtractor !== "string" || !normalizedConfig.plpIdExtractor) throw new Error(`Missing or invalid plpIdExtractor for PLP pageVariant '${variantId}'`);
|
|
828
|
+
}
|
|
829
|
+
if (variantType === "pdp") {
|
|
830
|
+
if (typeof normalizedConfig.productIdExtractor !== "string" || !normalizedConfig.productIdExtractor) throw new Error(`Missing or invalid productIdExtractor for PDP pageVariant '${variantId}'`);
|
|
831
|
+
if (normalizedConfig.parentProductIdExtractor && typeof normalizedConfig.parentProductIdExtractor !== "string") throw new Error(`Invalid parentProductIdExtractor for PDP pageVariant '${variantId}'. Must be string if provided`);
|
|
832
|
+
}
|
|
833
|
+
return normalizedConfig;
|
|
834
|
+
};
|
|
835
|
+
const validateAndTransformMountingConfig = (config, configKey) => {
|
|
836
|
+
const normalizedConfig = { ...config };
|
|
837
|
+
if (normalizedConfig.checkId && !normalizedConfig.testId) {
|
|
838
|
+
normalizedConfig.testId = normalizedConfig.checkId;
|
|
839
|
+
delete normalizedConfig.checkId;
|
|
840
|
+
}
|
|
841
|
+
if (typeof normalizedConfig.mountingConfigId !== "string" || !normalizedConfig.mountingConfigId) throw new Error(`Missing or invalid mountingConfigId for config '${configKey}'`);
|
|
842
|
+
if (typeof normalizedConfig.containerId !== "string" || !normalizedConfig.containerId) throw new Error(`Missing or invalid containerId for config '${configKey}'`);
|
|
843
|
+
if (typeof normalizedConfig.testId !== "string" || !normalizedConfig.testId) throw new Error(`Missing or invalid testId for config '${configKey}'`);
|
|
844
|
+
if (!normalizedConfig.insertionPoint || typeof normalizedConfig.insertionPoint !== "object" || Array.isArray(normalizedConfig.insertionPoint)) throw new Error(`Missing or invalid insertionPoint for config '${configKey}'`);
|
|
845
|
+
const insertionPoint = normalizedConfig.insertionPoint;
|
|
846
|
+
if (typeof insertionPoint.selector !== "string" || !insertionPoint.selector) throw new Error(`Missing or invalid insertionPoint.selector for config '${configKey}'`);
|
|
847
|
+
if (typeof insertionPoint.insertionType !== "string" || !insertionPoint.insertionType) throw new Error(`Missing or invalid insertionPoint.insertionType for config '${configKey}'`);
|
|
848
|
+
if (!Object.values(DOMInsertionType).includes(insertionPoint.insertionType)) throw new Error(`Invalid insertionPoint.insertionType '${insertionPoint.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
|
|
849
|
+
if (insertionPoint.selectionIndex != null && typeof insertionPoint.selectionIndex !== "number") throw new Error(`Invalid insertionPoint.selectionIndex for config '${configKey}'. Must be a number or null/undefined`);
|
|
850
|
+
let parentInsertionPoint;
|
|
851
|
+
if (normalizedConfig.parentInsertionPoint) {
|
|
852
|
+
if (typeof normalizedConfig.parentInsertionPoint !== "object" || Array.isArray(normalizedConfig.parentInsertionPoint)) throw new Error(`Invalid parentInsertionPoint for config '${configKey}'. Must be an object`);
|
|
853
|
+
const parentPoint = normalizedConfig.parentInsertionPoint;
|
|
854
|
+
if (typeof parentPoint.selector !== "string" || !parentPoint.selector) throw new Error(`Missing or invalid parentInsertionPoint.selector for config '${configKey}'`);
|
|
855
|
+
if (typeof parentPoint.insertionType !== "string" || !parentPoint.insertionType) throw new Error(`Missing or invalid parentInsertionPoint.insertionType for config '${configKey}'`);
|
|
856
|
+
if (!Object.values(DOMInsertionType).includes(parentPoint.insertionType)) throw new Error(`Invalid parentInsertionPoint.insertionType '${parentPoint.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
|
|
857
|
+
if (parentPoint.selectionIndex != null && typeof parentPoint.selectionIndex !== "number") throw new Error(`Invalid parentInsertionPoint.selectionIndex for config '${configKey}'. Must be a number or null/undefined`);
|
|
858
|
+
parentInsertionPoint = {
|
|
859
|
+
selector: parentPoint.selector,
|
|
860
|
+
insertionType: parentPoint.insertionType,
|
|
861
|
+
selectionIndex: parentPoint.selectionIndex
|
|
862
|
+
};
|
|
863
|
+
}
|
|
864
|
+
let wrappingElement;
|
|
865
|
+
if (normalizedConfig.wrappingElement) {
|
|
866
|
+
if (typeof normalizedConfig.wrappingElement !== "object" || Array.isArray(normalizedConfig.wrappingElement)) throw new Error(`Invalid wrappingElement for config '${configKey}'. Must be an object`);
|
|
867
|
+
const wrapping = normalizedConfig.wrappingElement;
|
|
868
|
+
if (typeof wrapping.className !== "string" || !wrapping.className) throw new Error(`Missing or invalid wrappingElement.className for config '${configKey}'`);
|
|
869
|
+
if (typeof wrapping.element !== "string" || !wrapping.element) throw new Error(`Missing or invalid wrappingElement.element for config '${configKey}'`);
|
|
870
|
+
if (typeof wrapping.insertionType !== "string" || !wrapping.insertionType) throw new Error(`Missing or invalid wrappingElement.insertionType for config '${configKey}'`);
|
|
871
|
+
if (!Object.values(DOMInsertionType).includes(wrapping.insertionType)) throw new Error(`Invalid wrappingElement.insertionType '${wrapping.insertionType}' for config '${configKey}'. Valid types: ${Object.values(DOMInsertionType).join(", ")}`);
|
|
872
|
+
wrappingElement = {
|
|
873
|
+
className: wrapping.className,
|
|
874
|
+
element: wrapping.element,
|
|
875
|
+
insertionType: wrapping.insertionType
|
|
876
|
+
};
|
|
877
|
+
}
|
|
878
|
+
if (normalizedConfig.divCheckSelector != null && typeof normalizedConfig.divCheckSelector !== "string") throw new Error(`Invalid divCheckSelector for config '${configKey}'. Must be a string or null/undefined`);
|
|
879
|
+
if (normalizedConfig.className != null && typeof normalizedConfig.className !== "string") throw new Error(`Invalid className for config '${configKey}'. Must be a string or null/undefined`);
|
|
880
|
+
if (normalizedConfig.suppressionSelector != null && typeof normalizedConfig.suppressionSelector !== "string") throw new Error(`Invalid suppressionSelector for config '${configKey}'. Must be a string or null/undefined`);
|
|
881
|
+
if (normalizedConfig.dataAttributes != null && (typeof normalizedConfig.dataAttributes !== "object" || Array.isArray(normalizedConfig.dataAttributes))) throw new Error(`Invalid dataAttributes for config '${configKey}'. Must be an object or null/undefined`);
|
|
882
|
+
if (normalizedConfig.style != null && (typeof normalizedConfig.style !== "object" || Array.isArray(normalizedConfig.style))) throw new Error(`Invalid style for config '${configKey}'. Must be an object or null/undefined`);
|
|
883
|
+
let gridInsertionType;
|
|
884
|
+
if (normalizedConfig.gridInsertionType) {
|
|
885
|
+
if (typeof normalizedConfig.gridInsertionType !== "string" || !normalizedConfig.gridInsertionType) throw new Error(`Invalid gridInsertionType for config '${configKey}'. Must be a string`);
|
|
886
|
+
if (!Object.values(GridInsertionType).includes(normalizedConfig.gridInsertionType)) throw new Error(`Invalid gridInsertionType '${normalizedConfig.gridInsertionType}' for config '${configKey}'. Valid types: ${Object.values(GridInsertionType).join(", ")}`);
|
|
887
|
+
gridInsertionType = normalizedConfig.gridInsertionType;
|
|
888
|
+
}
|
|
889
|
+
const result = {
|
|
890
|
+
mountingConfigId: normalizedConfig.mountingConfigId,
|
|
891
|
+
containerId: normalizedConfig.containerId,
|
|
892
|
+
testId: normalizedConfig.testId,
|
|
893
|
+
insertionPoint: {
|
|
894
|
+
selector: insertionPoint.selector,
|
|
895
|
+
insertionType: insertionPoint.insertionType,
|
|
896
|
+
...insertionPoint.selectionIndex != null && { selectionIndex: insertionPoint.selectionIndex }
|
|
897
|
+
}
|
|
898
|
+
};
|
|
899
|
+
if (parentInsertionPoint) result.parentInsertionPoint = parentInsertionPoint;
|
|
900
|
+
if (gridInsertionType) result.gridInsertionType = gridInsertionType;
|
|
901
|
+
if (wrappingElement) result.wrappingElement = wrappingElement;
|
|
902
|
+
if (normalizedConfig.divCheckSelector) result.divCheckSelector = normalizedConfig.divCheckSelector;
|
|
903
|
+
if (normalizedConfig.className) result.className = normalizedConfig.className;
|
|
904
|
+
if (normalizedConfig.suppressionSelector) result.suppressionSelector = normalizedConfig.suppressionSelector;
|
|
905
|
+
if (normalizedConfig.dataAttributes) result.dataAttributes = normalizedConfig.dataAttributes;
|
|
906
|
+
if (normalizedConfig.style) result.style = normalizedConfig.style;
|
|
907
|
+
return result;
|
|
908
|
+
};
|
|
909
|
+
const validateAndTransformWidgetConfig = (config, configKey) => {
|
|
910
|
+
const normalizedConfig = transformSnakeToCamel(config);
|
|
911
|
+
if (typeof normalizedConfig.widgetConfigId !== "string" || !normalizedConfig.widgetConfigId) throw new Error(`Missing or invalid widgetConfigId for widget config '${configKey}'`);
|
|
912
|
+
if (typeof normalizedConfig.type !== "string" || !normalizedConfig.type) throw new Error(`Missing or invalid type for widget config '${configKey}'`);
|
|
913
|
+
if (normalizedConfig.contentId != null && typeof normalizedConfig.contentId !== "string") throw new Error(`Invalid contentId for widget config '${configKey}'. Must be a string or null/undefined`);
|
|
914
|
+
return normalizedConfig;
|
|
915
|
+
};
|
|
916
|
+
const validateGraphQLFrontendConfig = (data) => {
|
|
917
|
+
if (data === null || data === void 0) return;
|
|
918
|
+
if (typeof data !== "object" || Array.isArray(data)) {
|
|
919
|
+
logger_default.logWarn("Invalid GraphQL frontend config data: not an object", void 0, { data });
|
|
920
|
+
return;
|
|
921
|
+
}
|
|
922
|
+
const obj = data;
|
|
923
|
+
if ("merchant_override_css" in obj && typeof obj.merchant_override_css !== "string" && obj.merchant_override_css !== null) {
|
|
924
|
+
logger_default.logWarn("Invalid GraphQL frontend config data: merchant_override_css must be a string or null", void 0, { data });
|
|
925
|
+
return;
|
|
926
|
+
}
|
|
927
|
+
if ("page_variants" in obj) {
|
|
928
|
+
if (obj.page_variants !== void 0 && obj.page_variants !== null && !Array.isArray(obj.page_variants)) {
|
|
929
|
+
logger_default.logWarn("Invalid GraphQL frontend config data: page_variants must be an array or null/undefined", void 0, { data });
|
|
930
|
+
return;
|
|
931
|
+
}
|
|
932
|
+
}
|
|
933
|
+
if ("mounting_configs" in obj) {
|
|
934
|
+
if (obj.mounting_configs !== void 0 && obj.mounting_configs !== null && !Array.isArray(obj.mounting_configs)) {
|
|
935
|
+
logger_default.logWarn("Invalid GraphQL frontend config data: mounting_configs must be an array or null/undefined", void 0, { data });
|
|
936
|
+
return;
|
|
937
|
+
}
|
|
938
|
+
}
|
|
939
|
+
if ("widget_configs" in obj) {
|
|
940
|
+
if (obj.widget_configs !== void 0 && obj.widget_configs !== null && !Array.isArray(obj.widget_configs)) {
|
|
941
|
+
logger_default.logWarn("Invalid GraphQL frontend config data: widget_configs must be an array or null/undefined", void 0, { data });
|
|
942
|
+
return;
|
|
943
|
+
}
|
|
944
|
+
}
|
|
945
|
+
if ("ui_configs" in obj && typeof obj.ui_configs !== "object" && obj.ui_configs !== null) {
|
|
946
|
+
logger_default.logWarn("Invalid GraphQL frontend config data: ui_configs must be an object or null/undefined", void 0, { data });
|
|
947
|
+
return;
|
|
948
|
+
}
|
|
949
|
+
try {
|
|
950
|
+
const transformedData = transformSnakeToCamel(obj);
|
|
951
|
+
if (transformedData.pageVariants && Array.isArray(transformedData.pageVariants)) {
|
|
952
|
+
const pageVariantsArray = transformedData.pageVariants;
|
|
953
|
+
const validatedPageVariants = [];
|
|
954
|
+
for (const variant of pageVariantsArray) if (variant && typeof variant === "object" && typeof variant.variantId === "string") try {
|
|
955
|
+
const validatedVariant = validateAndTransformPageVariants(variant);
|
|
956
|
+
validatedPageVariants.push(validatedVariant);
|
|
957
|
+
} catch (error) {
|
|
958
|
+
logger_default.logWarn("Invalid page variant, skipping", error, {
|
|
959
|
+
variantId: variant.variantId,
|
|
960
|
+
variant
|
|
961
|
+
});
|
|
962
|
+
}
|
|
963
|
+
else logger_default.logWarn("Invalid page variant structure, skipping", void 0, { variant });
|
|
964
|
+
transformedData.pageVariants = validatedPageVariants;
|
|
965
|
+
}
|
|
966
|
+
if (transformedData.mountingConfigs && Array.isArray(transformedData.mountingConfigs)) {
|
|
967
|
+
const mountingConfigsArray = transformedData.mountingConfigs;
|
|
968
|
+
const mountingConfigsRecord = {};
|
|
969
|
+
for (const item of mountingConfigsArray) if (item && typeof item.key === "string" && item.config && typeof item.config === "object") try {
|
|
970
|
+
const config = item.config;
|
|
971
|
+
const validatedConfig = validateAndTransformMountingConfig(config, item.key);
|
|
972
|
+
mountingConfigsRecord[item.key] = validatedConfig;
|
|
973
|
+
} catch (error) {
|
|
974
|
+
logger_default.logWarn("Invalid mounting config, skipping", error, {
|
|
975
|
+
configKey: item.key,
|
|
976
|
+
config: item.config
|
|
977
|
+
});
|
|
978
|
+
}
|
|
979
|
+
else logger_default.logWarn("Invalid mounting config item structure, skipping", void 0, { item });
|
|
980
|
+
transformedData.mountingConfigs = mountingConfigsRecord;
|
|
981
|
+
}
|
|
982
|
+
if (transformedData.widgetConfigs && Array.isArray(transformedData.widgetConfigs)) {
|
|
983
|
+
const widgetConfigsArray = transformedData.widgetConfigs;
|
|
984
|
+
const widgetConfigsRecord = {};
|
|
985
|
+
for (const item of widgetConfigsArray) if (item && typeof item.key === "string" && item.config && typeof item.config === "object") try {
|
|
986
|
+
const config = item.config;
|
|
987
|
+
const validatedConfig = validateAndTransformWidgetConfig(config, item.key);
|
|
988
|
+
widgetConfigsRecord[item.key] = validatedConfig;
|
|
989
|
+
} catch (error) {
|
|
990
|
+
logger_default.logWarn("Invalid widget config, skipping", error, {
|
|
991
|
+
configKey: item.key,
|
|
992
|
+
config: item.config
|
|
993
|
+
});
|
|
994
|
+
}
|
|
995
|
+
else logger_default.logWarn("Invalid widget config item structure, skipping", void 0, { item });
|
|
996
|
+
transformedData.widgetConfigs = widgetConfigsRecord;
|
|
997
|
+
}
|
|
998
|
+
return transformedData;
|
|
999
|
+
} catch (error) {
|
|
1000
|
+
logger_default.logWarn("Failed to validate and transform GraphQL frontend config data", error, { data });
|
|
1001
|
+
return;
|
|
1002
|
+
}
|
|
1003
|
+
};
|
|
1004
|
+
|
|
1005
|
+
//#endregion
|
|
1006
|
+
//#region src/application/models/validators/validateGraphQLOrgId.ts
|
|
1007
|
+
const validateGraphQLOrgId = (data) => {
|
|
1008
|
+
if (typeof data !== "string" || data === "") return;
|
|
1009
|
+
return data;
|
|
1010
|
+
};
|
|
1011
|
+
|
|
1012
|
+
//#endregion
|
|
1013
|
+
//#region src/application/models/validators/validateMobilePLPChatPlacementParameter.ts
|
|
1014
|
+
const validateMobilePLPChatPlacementParameter = (value) => {
|
|
1015
|
+
if (!isMobilePLPChatPlacementParameter(value)) return;
|
|
1016
|
+
return { rowIndex: value.row_index };
|
|
1017
|
+
};
|
|
1018
|
+
|
|
1019
|
+
//#endregion
|
|
1020
|
+
//#region src/application/models/validators/validateOrganizationConfig.ts
|
|
1021
|
+
const validateOrganizationConfig = (data) => {
|
|
1022
|
+
if (!isApiOrganizationConfig(data)) return;
|
|
1023
|
+
return {
|
|
1024
|
+
id: data.id,
|
|
1025
|
+
createdAt: data.created_at.toISOString(),
|
|
1026
|
+
namespace: data.namespace,
|
|
1027
|
+
organizationId: data.organization_id,
|
|
1028
|
+
isLatest: data.is_latest,
|
|
1029
|
+
version: data.version,
|
|
1030
|
+
updatedAt: data.updated_at.toISOString(),
|
|
1031
|
+
config: {
|
|
1032
|
+
amplitude: data.config.amplitude ? {
|
|
1033
|
+
sessionReplayEnabled: data.config.amplitude.session_replay_enabled,
|
|
1034
|
+
sessionReplaySampleRate: data.config.amplitude.session_replay_sample_rate,
|
|
1035
|
+
trackingEnabled: data.config.amplitude.tracking_enabled
|
|
1036
|
+
} : void 0,
|
|
1037
|
+
customerService: data.config.customer_service ? { provider: data.config.customer_service.provider } : void 0,
|
|
1038
|
+
googleAnalytics: data.config.google_analytics ? { measurementId: data.config.google_analytics.measurement_id } : void 0
|
|
1039
|
+
}
|
|
1040
|
+
};
|
|
1041
|
+
};
|
|
1042
|
+
|
|
1043
|
+
//#endregion
|
|
1044
|
+
//#region src/application/models/validators/validateOrgConfigResults.ts
|
|
1045
|
+
/**
|
|
1046
|
+
*
|
|
1047
|
+
* @param data
|
|
1048
|
+
* @returns
|
|
1049
|
+
*/
|
|
1050
|
+
const validateOrgConfigResults = (data) => {
|
|
1051
|
+
if (!isApiOrgConfigResults(data)) return;
|
|
1052
|
+
return {
|
|
1053
|
+
configs: data.configs.map((config) => validateOrganizationConfig(config)).filter((config) => config != null),
|
|
1054
|
+
experiments: data.experiments.map((experiment) => ({
|
|
1055
|
+
group: experiment.group,
|
|
1056
|
+
groupName: experiment.group_name,
|
|
1057
|
+
name: experiment.name,
|
|
1058
|
+
ruleId: experiment.rule_id,
|
|
1059
|
+
value: experiment.value
|
|
1060
|
+
})),
|
|
1061
|
+
gates: data.gates.map((gate) => ({
|
|
1062
|
+
groupName: gate.group_name,
|
|
1063
|
+
name: gate.name,
|
|
1064
|
+
ruleId: gate.rule_id,
|
|
1065
|
+
value: gate.value
|
|
1066
|
+
})),
|
|
1067
|
+
org: {
|
|
1068
|
+
org: {
|
|
1069
|
+
id: data.org.org.id,
|
|
1070
|
+
displayName: data.org.org.display_name,
|
|
1071
|
+
domain: data.org.org.domain,
|
|
1072
|
+
shortName: data.org.org.short_name,
|
|
1073
|
+
status: data.org.org.status,
|
|
1074
|
+
createdAt: data.org.org.created_at?.toISOString(),
|
|
1075
|
+
updatedAt: data.org.org.updated_at?.toISOString()
|
|
1076
|
+
},
|
|
1077
|
+
settings: {}
|
|
1078
|
+
}
|
|
1079
|
+
};
|
|
1080
|
+
};
|
|
1081
|
+
|
|
1082
|
+
//#endregion
|
|
1083
|
+
//#region src/application/models/validators/validateResponse.ts
|
|
1084
|
+
const richInformationFromCommerceRichInformation = (data) => ({
|
|
1085
|
+
cons: data.cons,
|
|
1086
|
+
pros: data.pros,
|
|
1087
|
+
reviewDate: data.review_date,
|
|
1088
|
+
reviewerTitle: data.reviewer_title,
|
|
1089
|
+
productFamiliarity: data.product_familiarity
|
|
1090
|
+
});
|
|
1091
|
+
const validateResponse = (data) => {
|
|
1092
|
+
if (!isApiResponse(data)) return;
|
|
1093
|
+
if (data.category === ResponseCategory.Text && isApiTextResponseAttributes(data.attributes)) return {
|
|
1094
|
+
id: data.id,
|
|
1095
|
+
createdAt: data.created_at,
|
|
1096
|
+
category: ResponseCategory.Text,
|
|
1097
|
+
attributes: { content: data.attributes.content }
|
|
1098
|
+
};
|
|
1099
|
+
if (data.category === ResponseCategory.Product && isApiProductResponseAttributes(data.attributes)) return {
|
|
1100
|
+
id: data.id,
|
|
1101
|
+
createdAt: data.created_at,
|
|
1102
|
+
category: ResponseCategory.Product,
|
|
1103
|
+
attributes: {
|
|
1104
|
+
id: data.attributes.id,
|
|
1105
|
+
description: data.attributes.description,
|
|
1106
|
+
imageUrl: data.attributes.image_url,
|
|
1107
|
+
imageUrls: data.attributes.image_urls,
|
|
1108
|
+
title: data.attributes.title,
|
|
1109
|
+
url: data.attributes.url,
|
|
1110
|
+
originalPrice: data.attributes.original_price,
|
|
1111
|
+
salePrice: data.attributes.sale_price,
|
|
1112
|
+
averageRating: data.attributes.average_rating,
|
|
1113
|
+
numberReviews: data.attributes.number_reviews,
|
|
1114
|
+
metadata: data.attributes.metadata,
|
|
1115
|
+
isForGrid: data.attributes.is_for_grid,
|
|
1116
|
+
colors: data.attributes.colors,
|
|
1117
|
+
sizes: data.attributes.sizes,
|
|
1118
|
+
filters: data.attributes.filters
|
|
1119
|
+
}
|
|
1120
|
+
};
|
|
1121
|
+
if (data.category === ResponseCategory.Review && isApiReviewResponseAttributes(data.attributes)) return {
|
|
1122
|
+
id: data.id,
|
|
1123
|
+
createdAt: data.created_at,
|
|
1124
|
+
category: ResponseCategory.Review,
|
|
1125
|
+
attributes: {
|
|
1126
|
+
id: data.attributes.id,
|
|
1127
|
+
productId: data.attributes.product_id,
|
|
1128
|
+
title: data.attributes.title,
|
|
1129
|
+
reviewer: data.attributes.reviewer,
|
|
1130
|
+
review: data.attributes.review,
|
|
1131
|
+
stars: data.attributes.stars,
|
|
1132
|
+
richInformation: data.attributes.rich_information ? richInformationFromCommerceRichInformation(data.attributes.rich_information) : void 0
|
|
1133
|
+
}
|
|
1134
|
+
};
|
|
1135
|
+
if (data.category === ResponseCategory.Separator) return {
|
|
1136
|
+
id: data.id,
|
|
1137
|
+
createdAt: data.created_at,
|
|
1138
|
+
category: ResponseCategory.Separator
|
|
1139
|
+
};
|
|
1140
|
+
if (data.category === ResponseCategory.Page && isApiPageResponseAttributes(data.attributes)) return {
|
|
1141
|
+
id: data.id,
|
|
1142
|
+
createdAt: data.created_at,
|
|
1143
|
+
category: ResponseCategory.Page,
|
|
1144
|
+
attributes: {
|
|
1145
|
+
id: data.attributes.id,
|
|
1146
|
+
title: data.attributes.title,
|
|
1147
|
+
description: data.attributes.description,
|
|
1148
|
+
url: data.attributes.url
|
|
1149
|
+
}
|
|
1150
|
+
};
|
|
1151
|
+
if (data.category === ResponseCategory.Form && isApiFormResponseAttributes(data.attributes)) return {
|
|
1152
|
+
id: data.id,
|
|
1153
|
+
createdAt: data.created_at,
|
|
1154
|
+
category: ResponseCategory.Form,
|
|
1155
|
+
attributes: {
|
|
1156
|
+
formCategory: data.attributes.form_category ? { formType: data.attributes.form_category.form_type } : void 0,
|
|
1157
|
+
schema: {
|
|
1158
|
+
properties: data.attributes.schema.properties,
|
|
1159
|
+
required: data.attributes.schema.required.map(String)
|
|
1160
|
+
}
|
|
1161
|
+
}
|
|
1162
|
+
};
|
|
1163
|
+
if (data.category === ResponseCategory.ProductSearch && isApiProductSearchResponseAttributes(data.attributes)) return {
|
|
1164
|
+
id: data.id,
|
|
1165
|
+
createdAt: data.created_at,
|
|
1166
|
+
category: ResponseCategory.ProductSearch,
|
|
1167
|
+
attributes: {
|
|
1168
|
+
generatedQuery: data.attributes.generated_query,
|
|
1169
|
+
productCount: data.attributes.product_count
|
|
1170
|
+
}
|
|
1171
|
+
};
|
|
1172
|
+
if (data.category === ResponseCategory.ProductSearchFilter && isApiProductSearchFilterResponseAttributes(data.attributes)) return {
|
|
1173
|
+
id: data.id,
|
|
1174
|
+
createdAt: data.created_at,
|
|
1175
|
+
category: ResponseCategory.ProductSearchFilter,
|
|
1176
|
+
attributes: { filterName: data.attributes.filter_name }
|
|
1177
|
+
};
|
|
1178
|
+
if (data.category === ResponseCategory.Order && isApiOrderResponseAttributes(data.attributes)) return {
|
|
1179
|
+
id: data.id,
|
|
1180
|
+
createdAt: data.created_at,
|
|
1181
|
+
category: ResponseCategory.Order,
|
|
1182
|
+
attributes: {
|
|
1183
|
+
orderId: data.attributes.order_id,
|
|
1184
|
+
orderNumber: data.attributes.order_number,
|
|
1185
|
+
createdAt: data.attributes.created_at,
|
|
1186
|
+
latestEventDate: data.attributes.latest_event_date,
|
|
1187
|
+
lineItems: data.attributes.line_items.map((item) => ({
|
|
1188
|
+
itemTitle: item.item_title,
|
|
1189
|
+
itemPrice: item.item_price,
|
|
1190
|
+
itemQuantity: item.item_quantity,
|
|
1191
|
+
orderItemId: item.order_item_id,
|
|
1192
|
+
image: item.image ?? void 0,
|
|
1193
|
+
inTransitAt: item.in_transit_at ?? void 0,
|
|
1194
|
+
deliveredAt: item.delivered_at ?? void 0,
|
|
1195
|
+
estimatedDeliveryAt: item.estimated_delivery_at ?? void 0,
|
|
1196
|
+
fulfillmentDisplayStatus: item.fulfillment_display_status ? stringToFulfillmentDisplayStatusEnumValue(item.fulfillment_display_status) : void 0,
|
|
1197
|
+
trackingUrl: item.tracking_url ?? void 0
|
|
1198
|
+
}))
|
|
1199
|
+
}
|
|
1200
|
+
};
|
|
1201
|
+
};
|
|
1202
|
+
|
|
1203
|
+
//#endregion
|
|
1204
|
+
//#region src/application/models/validators/validateSuggestion.ts
|
|
1205
|
+
const validateSuggestion = (data) => {
|
|
1206
|
+
if (!isSuggestion(data)) return;
|
|
1207
|
+
return {
|
|
1208
|
+
id: data.id,
|
|
1209
|
+
category: data.category,
|
|
1210
|
+
content: data.content,
|
|
1211
|
+
createdAt: data.created_at,
|
|
1212
|
+
isAnswer: data.is_answer
|
|
1213
|
+
};
|
|
1214
|
+
};
|
|
1215
|
+
|
|
1216
|
+
//#endregion
|
|
1217
|
+
//#region src/application/models/validators/validateUserEvent.ts
|
|
1218
|
+
const validateUserEvent = (data) => {
|
|
1219
|
+
if (!isApiUserEvent(data)) return;
|
|
1220
|
+
if (data.category === UserEventCategory.PdpVisit && isApiPDPAttributes(data.attributes)) return {
|
|
1221
|
+
eventId: data.event_id,
|
|
1222
|
+
createdAt: data.created_at,
|
|
1223
|
+
category: UserEventCategory.PdpVisit,
|
|
1224
|
+
attributes: {
|
|
1225
|
+
productId: data.attributes.product_id,
|
|
1226
|
+
parentProductId: data.attributes.parent_product_id,
|
|
1227
|
+
url: data.attributes.url
|
|
1228
|
+
}
|
|
1229
|
+
};
|
|
1230
|
+
if (data.category === UserEventCategory.QueryTyped && isApiQueryTypedAttributes(data.attributes)) return {
|
|
1231
|
+
eventId: data.event_id,
|
|
1232
|
+
createdAt: data.created_at,
|
|
1233
|
+
category: UserEventCategory.QueryTyped,
|
|
1234
|
+
attributes: { query: data.attributes.query }
|
|
1235
|
+
};
|
|
1236
|
+
if (data.category === UserEventCategory.Search && isApiSearchAttributes(data.attributes)) return {
|
|
1237
|
+
eventId: data.event_id,
|
|
1238
|
+
createdAt: data.created_at,
|
|
1239
|
+
category: UserEventCategory.Search,
|
|
1240
|
+
attributes: {
|
|
1241
|
+
searchTerm: data.attributes.search_term,
|
|
1242
|
+
selectedFilters: data.attributes.selected_filters
|
|
1243
|
+
}
|
|
1244
|
+
};
|
|
1245
|
+
if (data.category === UserEventCategory.SuggestionClicked && isApiSuggestionClickedAttributes(data.attributes)) return {
|
|
1246
|
+
eventId: data.event_id,
|
|
1247
|
+
createdAt: data.created_at,
|
|
1248
|
+
category: UserEventCategory.SuggestionClicked,
|
|
1249
|
+
attributes: { suggestionId: data.attributes.suggestion_id }
|
|
1250
|
+
};
|
|
1251
|
+
if (data.category === UserEventCategory.PlpVisit && isApiPLPEventAttributes(data.attributes)) {
|
|
1252
|
+
if (isApiPLPIdAttribute(data.attributes)) return {
|
|
1253
|
+
eventId: data.event_id,
|
|
1254
|
+
createdAt: data.created_at,
|
|
1255
|
+
category: UserEventCategory.PlpVisit,
|
|
1256
|
+
attributes: {
|
|
1257
|
+
category: data.attributes.category,
|
|
1258
|
+
attributes: { id: data.attributes.id }
|
|
1259
|
+
}
|
|
1260
|
+
};
|
|
1261
|
+
}
|
|
1262
|
+
if (data.category === UserEventCategory.FormSubmitted && isApiFormSubmittedResponseAttributes(data.attributes)) return {
|
|
1263
|
+
eventId: data.event_id,
|
|
1264
|
+
createdAt: data.created_at,
|
|
1265
|
+
category: UserEventCategory.FormSubmitted,
|
|
1266
|
+
attributes: {
|
|
1267
|
+
filledSchema: { ...data.attributes.filled_schema },
|
|
1268
|
+
formResponseId: data.attributes.form_response_id,
|
|
1269
|
+
formType: data.attributes.form_type
|
|
1270
|
+
}
|
|
1271
|
+
};
|
|
1272
|
+
return {
|
|
1273
|
+
eventId: data.event_id,
|
|
1274
|
+
createdAt: data.created_at,
|
|
1275
|
+
category: UserEventCategory.AppLoaded
|
|
1276
|
+
};
|
|
1277
|
+
};
|
|
1278
|
+
|
|
1279
|
+
//#endregion
|
|
1280
|
+
export { ChatElementDisplayLocation, DOMInsertionType, FeatureGates, GoogleAnalyticsEvents, GridInsertionType, MessageRole, MessageType, ProductExperiment, SpiffyEventName, SpiffyWidgets, getMerchantOrgIdQuery, isApiFormResponseAttributes, isApiFormSubmittedResponseAttributes, isApiOrderResponseAttributes, isApiOrgConfigResults, isApiOrganizationConfig, isApiPLPEventAttributes, isApiPLPIdAttribute, isApiPageResponseAttributes, isApiProductSearchFilterResponseAttributes, isBaseEcommerceEvent, isGA4EcommerceEvent, isGraphQLColorsConfig, isLegacyUAEcommerceEvent, isMobilePLPChatPlacementParameter, isSpanxTakeAQuizCtaParameter, isVariantInfo, stringToFulfillmentDisplayStatusEnumValue, transformCamelToSnake, transformSnakeToCamel, validateAndTransformMountingConfig, validateAndTransformPageVariants, validateAndTransformWidgetConfig, validateGraphQLColorsConfig, validateGraphQLFrontendConfig, validateGraphQLOrgId, validateMobilePLPChatPlacementParameter, validateOrgConfigResults, validateOrganizationConfig, validateResponse, validateSuggestion, validateUserEvent };
|
|
1281
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLVVaNkhzemZaLmpzIiwibmFtZXMiOlsicmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiIsIm5vcm1hbGl6ZWRDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IiwicmVzdWx0OiBXaWRnZXRNb3VudGluZ0NvbmZpZyIsInZhbGlkYXRlZFBhZ2VWYXJpYW50czogUGFnZVZhcmlhbnRDb25maWdbXSIsIm1vdW50aW5nQ29uZmlnc1JlY29yZDogUmVjb3JkPHN0cmluZywgV2lkZ2V0TW91bnRpbmdDb25maWc+Iiwid2lkZ2V0Q29uZmlnc1JlY29yZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4iXSwic291cmNlcyI6WyIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2ZlYXR1cmVHYXRlcy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvY2hhdEVsZW1lbnREaXNwbGF5TG9jYXRpb24udHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2V2ZW50cy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ29vZ2xlQW5hbHl0aWNzRXZlbnRzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9tZXNzYWdlLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9wcm9kdWN0RXhwZXJpbWVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvc3BpZmZ5V2lkZ2V0cy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3JhcGhxbC9xdWVyaWVzL2dldE1lcmNoYW50T3JnSWRRdWVyeS50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2lzQmFzZUVjb21tZXJjZUV2ZW50LnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvaXNHQTRFY29tbWVyY2VFdmVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2lzTGVnYWN5VUFFY29tbWVyY2VFdmVudC50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2lzTW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2lzU3BhbnhUYWtlQVF1aXpDdGFQYXJhbWV0ZXIudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9pc1ZhcmlhbnRJbmZvLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpRm9ybVJlc3BvbnNlLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpRm9ybVN1Ym1pdHRlZFJlc3BvbnNlQXR0cmlidXRlcy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpT3JnYW5pemF0aW9uQ29uZmlnLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpT3JnQ29uZmlnUmVzdWx0cy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQTFBFdmVudEF0dHJpYnV0ZXMudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQcm9kdWN0U2VhcmNoRmlsdGVyQXR0cmlidXRlcy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2dyYXBoUUwvaXNHcmFwaFFMQ29sb3JzQ29uZmlnLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy91dGlscy9zbmFrZVRvQ2FtZWxUcmFuc2Zvcm1lci50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdXRpbHMvc3RyaW5nVG9GdWxmaWxsbWVudERpc3BsYXlTdGF0dXNFbnVtVmFsdWUudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVHcmFwaFFMQ29sb3JzQ29uZmlnLnRzIiwiLi4vc3JjL21lcmNoYW50cy9kb21JbnNlcnRpb24udHMiLCIuLi9zcmMvbWVyY2hhbnRzL2dyaWRJbnNlcnRpb24udHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVHcmFwaFFMRnJvbnRlbmRDb25maWcudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVHcmFwaFFMT3JnSWQudHMiLCIuLi9zcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlT3JnYW5pemF0aW9uQ29uZmlnLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlT3JnQ29uZmlnUmVzdWx0cy50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVJlc3BvbnNlLnRzIiwiLi4vc3JjL2FwcGxpY2F0aW9uL21vZGVscy92YWxpZGF0b3JzL3ZhbGlkYXRlU3VnZ2VzdGlvbi50cyIsIi4uL3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvdmFsaWRhdG9ycy92YWxpZGF0ZVVzZXJFdmVudC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZW51bSBGZWF0dXJlR2F0ZXMge1xuICBJc0NsaWVudFNlc3Npb25FbmFibGVkID0gXCJpc19jbGllbnRfc2Vzc2lvbl9lbmFibGVkXCIsXG4gIElzTmV3RmVhdHVyZUVuYWJsZWQgPSBcImlzX25ld19mZWF0dXJlX2VuYWJsZWRcIixcbiAgLy8gSXNGaW5lVHVuZWRNb2RlbDhiIGlzIGRlZmluZWQgaGVyZSBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBjb3JyZWxhdGluZyBldmVudHMgdG8gYSBzcGVjaWZpYyBtb2RlbCBpbiBBbXBsaXR1ZGVcbiAgSXNGaW5lVHVuZWRNb2RlbDhiID0gXCJpc19maW5lX3R1bmVkX21vZGVsXzhiXCIsXG4gIElzSW50ZWdyYXRlZENYRW5hYmxlZCA9IFwiaXNfaW50ZWdyYXRlZF9jeF9lbmFibGVkXCIsXG4gIC8vIFRPRE86IHJlbW92ZSB0aGlzIG9uY2Ugd2UndmUgZnVsbHkgcm9sbGVkIG91dCBvbiBub24tc2hhcGV3ZWFyIHBhZ2VzXG4gIElzTm9uU2hhcGV3ZWFyRW5hYmxlZCA9IFwiaXNfbm9uX3NoYXBld2Vhcl9lbmFibGVkXCIsXG4gIElzSW1hZ2VCYW5uZXJFbmFibGVkID0gXCJpc19pbWFnZV9iYW5uZXJfZW5hYmxlZFwiLFxuICBJc09yZGVyTG9va3VwRW5hYmxlZCA9IFwiaXNfb3JkZXJfbG9va3VwX2VuYWJsZWRcIixcbiAgSXNTdW1tYXJpemVSZXZpZXdzRW5hYmxlZCA9IFwiaXNfc3VtbWFyaXplX3Jldmlld3NfZW5hYmxlZFwiLFxuICBJc0dsb2JhbFNlYXJjaEVuYWJsZWQgPSBcImlzX2dsb2JhbF9zZWFyY2hfZW5hYmxlZFwiLFxuICBJc0ltYWdlUHJvbXB0RW5hYmxlZCA9IFwiaXNfaW1hZ2VfcHJvbXB0X2VuYWJsZWRcIixcbiAgSXNXYXRlcm1hcmtFbmFibGVkID0gXCJpc193YXRlcm1hcmtfZW5hYmxlZFwiLFxuICBJc0luZmVyZW5jZVJlZ2lvbjAgPSBcImlzX2luZmVyZW5jZV9yZWdpb25fMFwiLFxuICBJc0dyYXBoUUxVSUNvbmZpZ3NFbmFibGVkID0gXCJpc19ncmFwaHFsX3VpX2NvbmZpZ3NfZW5hYmxlZFwiLFxuICBJc0dyYXBoUUxQYWdlQ29uZmlnc0VuYWJsZWQgPSBcImlzX2dyYXBocWxfcGFnZV9jb25maWdzX2VuYWJsZWRcIixcbiAgSXNHcmFwaFFMQ29tcG9uZW50Q29uZmlnc0VuYWJsZWQgPSBcImlzX2dyYXBocWxfY29tcG9uZW50X2NvbmZpZ3NfZW5hYmxlZFwiLFxuICBJc0NoYXRWYXJpYW50RW5hYmxlZCA9IFwiaXNfY2hhdF92YXJpYW50X2VuYWJsZWRcIixcbiAgSXNDaGF0VmFyaWFudEFFbmFibGVkID0gXCJpc19jaGF0X3ZhcmlhbnRfYV9lbmFibGVkXCIsXG4gIElzQ2hhdFZhcmlhbnRCRW5hYmxlZCA9IFwiaXNfY2hhdF92YXJpYW50X2JfZW5hYmxlZFwiLFxuICBJc1VzZXJRdWVyeUFsd2F5c0VuYWJsZWQgPSBcImlzX3VzZXJfcXVlcnlfYWx3YXlzX2VuYWJsZWRcIixcbn1cbiIsIi8vIENoYXQgZWxlbWVudCBkaXNwbGF5IGxvY2F0aW9uIGVudW1cbmV4cG9ydCBlbnVtIENoYXRFbGVtZW50RGlzcGxheUxvY2F0aW9uIHtcbiAgSU5fQ0hBVCA9ICdpbl9jaGF0JyxcbiAgQ0hBVF9QUkVWSUVXID0gJ2NoYXRfcHJldmlldycsXG4gIEZMT0FUSU5HX0JVVFRPTiA9ICdmbG9hdGluZ19idXR0b24nLFxuICBIRUxQX01FX0NIT09TRSA9ICdoZWxwX21lX2Nob29zZScsXG4gIFBMUF9JTUFHRV9CQU5ORVIgPSAncGxwX2ltYWdlX2Jhbm5lcicsXG4gIFRPUF9SRVZJRVdTX1NOSVBQRVQgPSAndG9wX3Jldmlld3Nfc25pcHBldCcsXG4gIEJPVFRPTV9SRVZJRVdTX1NOSVBQRVQgPSAnYm90dG9tX3Jldmlld3Nfc25pcHBldCcsXG4gIEJMT0NLX0JBQ0tfQlVUVE9OID0gJ2Jsb2NrX2JhY2tfYnV0dG9uJyxcbiAgU1dJVENIX1RPX0FHRU5UID0gJ3N3aXRjaF90b19hZ2VudCcsXG4gIENPTlZFUlNBVElPTkFMX1NFQVJDSCA9ICdjb252ZXJzYXRpb25hbF9zZWFyY2gnLFxuICBHTE9CQUxfU0VBUkNIX0VOVFJZUE9JTlQgPSAnZ2xvYmFsX3NlYXJjaF9lbnRyeXBvaW50JyxcbiAgU0VBUkNIX05BVl9FTlRSWVBPSU5UID0gJ3NlYXJjaF9uYXZfZW50cnlwb2ludCcsXG4gIFNFQVJDSF9QUk9NUFQgPSAnc2VhcmNoX3Byb21wdCcsXG4gIFNFQVJDSF9QUk9NUFRfQlVUVE9OID0gJ3NlYXJjaF9wcm9tcHRfYnV0dG9uJyxcbiAgUFJPRFVDVF9HUklEID0gJ3Byb2R1Y3RfZ3JpZCcsXG4gIFVOU1BFQ0lGSUVEID0gJ3Vuc3BlY2lmaWVkJyxcbiAgRklMVEVSX01PREFMID0gJ2ZpbHRlcl9tb2RhbCcsXG4gIFBST01QVF9DQVJEID0gJ3Byb21wdF9jYXJkJyxcbiAgV0lORE9XX0FQSV9DQUxMID0gJ3dpbmRvd19hcGlfY2FsbCcsXG59XG4iLCIvLyBuYW1lcyBvZiBTcGlmZnkgc3BlY2lmaWMgSFRNTCBldmVudHNcbmV4cG9ydCBlbnVtIFNwaWZmeUV2ZW50TmFtZSB7XG4gIFdpZGdldE9wZW4gPSAnc3BpZmZ5OndpZGdldG9wZW4nLFxuICBXaWRnZXRDbG9zZSA9ICdzcGlmZnk6d2lkZ2V0Y2xvc2UnLFxufVxuIiwiZW51bSBHb29nbGVBbmFseXRpY3NFdmVudHMge1xuICBBRERfVE9fQ0FSVF92MSA9ICdhZGRfdG9fY2FydCcsXG4gIEFERF9UT19DQVJUX3YyID0gJ2FkZFRvQ2FydCcsXG59XG5cbmV4cG9ydCB7XG4gIEdvb2dsZUFuYWx5dGljc0V2ZW50c1xufSIsImltcG9ydCB7IEN1c3RTZXJ2aWNlQXR0YWNobWVudCwgRm9ybVR5cGUgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHtcbiAgT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMsXG4gIFByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXMsXG4gIFJldmlld1Jlc3BvbnNlQXR0cmlidXRlcyxcbiAgUGFnZVJlc3BvbnNlQXR0cmlidXRlcyxcbiAgVGV4dFJlc3BvbnNlQXR0cmlidXRlcyxcbiAgU2VhcmNoUmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBTZWFyY2hQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzLFxuICBBY2NlcHRhYmxlRm9ybUZpZWxkVHlwZSxcbiAgU2VhcmNoUHJvZHVjdEZpbHRlckF0dHJpYnV0ZXMsXG59IGZyb20gJy4vYXBpL3Jlc3BvbnNlJztcblxuZXhwb3J0IGVudW0gTWVzc2FnZVJvbGUge1xuICBVc2VyID0gJ3VzZXInLFxuICBBc3Npc3RhbnQgPSAnYXNzaXN0YW50Jyxcbn1cblxuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBUZXh0ID0gJ3RleHQnLFxuICBTdWdnZXN0aW9uQ2xpY2tlZCA9ICdzdWdnZXN0aW9uX2NsaWNrZWQnLFxuICBQcm9kdWN0ID0gJ3Byb2R1Y3QnLFxuICBQcm9kdWN0U2VhcmNoID0gJ3Byb2R1Y3Rfc2VhcmNoJyxcbiAgUmV2aWV3ID0gJ3JldmlldycsXG4gIFF1ZXJ5VHlwZWQgPSAncXVlcnlfdHlwZWQnLFxuICBTZXBhcmF0b3IgPSAnc2VwYXJhdG9yJyxcbiAgUGFnZSA9ICdwYWdlJyxcbiAgU2VhcmNoID0gJ3NlYXJjaCcsXG4gIEF0dGFjaG1lbnQgPSAnYXR0YWNobWVudCcsXG4gIENYQWdlbnRSZXNwb25zZSA9ICdjeF9hZ2VudF9yZXNwb25zZScsXG4gIEZvcm0gPSAnZm9ybScsXG4gIE9yZGVyID0gJ29yZGVyJyxcbiAgUHJvZHVjdFNlYXJjaEZpbHRlciA9ICdwcm9kdWN0X3NlYXJjaF9maWx0ZXInLFxufVxuXG5leHBvcnQgdHlwZSBNZXNzYWdlID0ge1xuICBpZDogc3RyaW5nO1xuICByb2xlOiBNZXNzYWdlUm9sZTtcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG59ICYgKFxuICB8IFRleHRNZXNzYWdlTWV0YWRhdGFcbiAgfCBRdWVyeVR5cGVkTWV0YWRhdGFcbiAgfCBTdWdnZXN0aW9uTWVzc2FnZU1ldGFkYXRhXG4gIHwgUHJvZHVjdE1lc3NhZ2VNZXRhZGF0YVxuICB8IFByb2R1Y3RTZWFyY2hNZXNzYWdlTWV0YWRhdGFcbiAgfCBSZXZpZXdNZXNzYWdlTWV0YWRhdGFcbiAgfCBTZXBhcmF0b3JNZXNzYWdlTWV0YWRhdGFcbiAgfCBQYWdlTWVzc2FnZU1ldGFkYXRhXG4gIHwgU2VhcmNoTWVzc2FnZU1ldGFkYXRhXG4gIHwgQXR0YWNobWVudE1ldGFkYXRhXG4gIHwgQ1hBZ2VudFJlc3BvbnNlTWV0YWRhdGFcbiAgfCBGb3JtTWVzc2FnZU1ldGFkYXRhXG4gIHwgT3JkZXJNZXNzYWdlTWV0YWRhdGFcbiAgfCBQcm9kdWN0U2VhcmNoRmlsdGVyTWV0YWRhdGFcbik7XG5cbnR5cGUgQXR0YWNobWVudE1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5BdHRhY2htZW50O1xuICBtZXRhZGF0YToge1xuICAgIG1lc3NhZ2U/OiBzdHJpbmc7XG4gICAgYXR0YWNobWVudDogQ3VzdFNlcnZpY2VBdHRhY2htZW50W107XG4gIH07XG59O1xuXG50eXBlIENYQWdlbnRSZXNwb25zZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5DWEFnZW50UmVzcG9uc2U7XG4gIG1ldGFkYXRhOiB7XG4gICAgbWVzc2FnZTogc3RyaW5nO1xuICAgIGFnZW50TmFtZTogc3RyaW5nO1xuICB9O1xufTtcblxudHlwZSBUZXh0TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5UZXh0O1xuICBtZXRhZGF0YTogVGV4dFJlc3BvbnNlQXR0cmlidXRlc1snYXR0cmlidXRlcyddO1xufTtcblxudHlwZSBRdWVyeVR5cGVkTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlF1ZXJ5VHlwZWQ7XG4gIG1ldGFkYXRhOiBUZXh0UmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFN1Z2dlc3Rpb25NZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlN1Z2dlc3Rpb25DbGlja2VkO1xuICBtZXRhZGF0YToge1xuICAgIHN1Z2dlc3Rpb25JZDogc3RyaW5nO1xuICAgIHN1Z2dlc3Rpb25Db250ZW50OiBzdHJpbmc7XG4gIH07XG59O1xuXG5leHBvcnQgdHlwZSBQcm9kdWN0TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5Qcm9kdWN0O1xuICBtZXRhZGF0YTogUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlc1snYXR0cmlidXRlcyddO1xufTtcblxuZXhwb3J0IHR5cGUgUHJvZHVjdFNlYXJjaE1lc3NhZ2VNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaDtcbiAgbWV0YWRhdGE6IFNlYXJjaFByb2R1Y3RSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG5cbnR5cGUgUmV2aWV3TWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5SZXZpZXc7XG4gIG1ldGFkYXRhOiBSZXZpZXdSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG5cbnR5cGUgU2VwYXJhdG9yTWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5TZXBhcmF0b3I7XG59O1xuXG50eXBlIFBhZ2VNZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLlBhZ2U7XG4gIG1ldGFkYXRhOiBQYWdlUmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFNlYXJjaE1lc3NhZ2VNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuU2VhcmNoO1xuICBtZXRhZGF0YTogU2VhcmNoUmVzcG9uc2VBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG50eXBlIFByb2R1Y3RTZWFyY2hGaWx0ZXJNZXRhZGF0YSA9IHtcbiAgdHlwZTogTWVzc2FnZVR5cGUuUHJvZHVjdFNlYXJjaEZpbHRlcjtcbiAgbWV0YWRhdGE6IFNlYXJjaFByb2R1Y3RGaWx0ZXJBdHRyaWJ1dGVzWydhdHRyaWJ1dGVzJ107XG59O1xuXG5leHBvcnQgdHlwZSBGb3JtRmllbGQgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0aXRsZTogc3RyaW5nO1xuICB0eXBlOiBBY2NlcHRhYmxlRm9ybUZpZWxkVHlwZTtcbiAgcmVxdWlyZWQ6IGJvb2xlYW47XG4gIC8vIHRoaXMgaXMgdGhlIG9ubHkgZm9ybWF0IHdlIGN1cnJlbnRseSBzdXBwb3J0XG4gIGZvcm1hdD86ICdlbWFpbCc7XG4gIHZhbHVlPzogc3RyaW5nO1xufTtcblxudHlwZSBGb3JtTWVzc2FnZU1ldGFkYXRhID0ge1xuICB0eXBlOiBNZXNzYWdlVHlwZS5Gb3JtO1xuICBtZXRhZGF0YToge1xuICAgIGZvcm1UeXBlPzogRm9ybVR5cGU7XG4gICAgZmllbGRzOiBGb3JtRmllbGRbXTtcbiAgfTtcbn07XG5cbnR5cGUgT3JkZXJNZXNzYWdlTWV0YWRhdGEgPSB7XG4gIHR5cGU6IE1lc3NhZ2VUeXBlLk9yZGVyO1xuICBtZXRhZGF0YTogT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXNbJ2F0dHJpYnV0ZXMnXTtcbn07XG4iLCJleHBvcnQgZW51bSBQcm9kdWN0RXhwZXJpbWVudCB7XG4gIC8vIERlZmF1bHQgaXMgb25seSB1c2VkIHRvIGVuc3VyZSB0aGF0IHRoZSBlbnVtIGlzIG5vbi1lbXB0eSwgb3RoZXJ3aXNlXG4gIC8vIGNhbGxlcnMgdGhhdCB0cnkgdG8gdXNlIHRoaXMgZW51bSB3aWxsIGdlbmVyYXRlIGEgdHlwZXNjcmlwdCBlcnJvclxuICBEZWZhdWx0ID0gJ2RlZmF1bHQnLFxufVxuIiwiLyoqXG4gKiBFbnVtIG9mIGFsbCB3aWRnZXQgbmFtZXMuIFRoZXNlIGFyZSB3aWRnZXRzIHRoYXQgYXJlIHJlbmRlcmVkIGFuZCBpbnRlZ3JhdGVkIGludG9cbiAqIGEgbWVyY2hhbnQncyB3ZWJzaXRlLlxuICovXG5leHBvcnQgZW51bSBTcGlmZnlXaWRnZXRzIHtcbiAgSW1hZ2VCYW5uZXIgPSAnaW1hZ2VfYmFubmVyJyxcbiAgSW1hZ2VQcm9tcHRDYXJkID0gJ2ltYWdlX3Byb21wdF9jYXJkJyxcbiAgU2luZ2xlSW1hZ2VQcm9tcHQgPSAnc2luZ2xlX2ltYWdlX3Byb21wdCcsXG4gIEVtYmVkZGVkV2lkZ2V0ID0gJ2VtYmVkZGVkX3dpZGdldCcsXG4gIEZsb2F0aW5nQnV0dG9uID0gJ2Zsb2F0aW5nX2J1dHRvbicsXG4gIFN1Z2dlc3Rpb25CYXIgPSAnc3VnZ2VzdGlvbl9iYXInLFxuICBTZWFyY2hQcm9tcHQgPSAnc2VhcmNoX3Byb21wdCcsXG4gIEdsb2JhbFNlYXJjaCA9ICdnbG9iYWxfc2VhcmNoJyxcbiAgU2VhcmNoUmVzdWx0cyA9ICdzZWFyY2hfcmVzdWx0cycsXG4gIEdsb2JhbFNlYXJjaEVudHJ5UG9pbnQgPSAnZ2xvYmFsX3NlYXJjaF9lbnRyeV9wb2ludCcsXG59XG4iLCJjb25zdCBnZXRNZXJjaGFudE9yZ0lkUXVlcnkgPSBgXG4gIHF1ZXJ5IHtcbiAgICBtZSB7XG4gICAgICBvcmcge1xuICAgICAgICBpZFxuICAgICAgfVxuICAgIH1cbiAgfVxuYDtcblxuZXhwb3J0IHsgZ2V0TWVyY2hhbnRPcmdJZFF1ZXJ5IH07XG4iLCJpbXBvcnQgdHlwZSB7IEJhc2VFY29tbWVyY2VFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBhIGJhc2UgR29vZ2xlIEFuYWx5dGljcyBlY29tbWVyY2UgZXZlbnQuXG4gKlxuICogQHBhcmFtIGRhdGEgVGhlIGV2ZW50IHRvIGNoZWNrLlxuICpcbiAqIEByZXR1cm5zIFRydWUgaWYgdGhlIGV2ZW50IGlzIGEgYmFzZSBlY29tbWVyY2UgZXZlbnQsIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzQmFzZUVjb21tZXJjZUV2ZW50ID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEJhc2VFY29tbWVyY2VFdmVudCA9PlxuICBkYXRhICE9IG51bGwgJiZcbiAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICdlY29tbWVyY2UnIGluIGRhdGEgJiZcbiAgZGF0YS5lY29tbWVyY2UgIT0gbnVsbCAmJlxuICB0eXBlb2YgZGF0YS5lY29tbWVyY2UgPT09ICdvYmplY3QnICYmXG4gICdldmVudCcgaW4gZGF0YSAmJlxuICB0eXBlb2YgZGF0YS5ldmVudCA9PT0gJ3N0cmluZyc7XG4iLCJpbXBvcnQgdHlwZSB7IEdBNEVjb21tZXJjZUV2ZW50IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscyc7XG5cbi8qKlxuICogQ2hlY2tzIGlmIGFuIGV2ZW50IGlzIGEgR29vZ2xlIEFuYWx5dGljcyA0IGVjb21tZXJjZSBldmVudC5cbiAqXG4gKiBAcGFyYW0gZGF0YSBUaGUgZXZlbnQgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgYSBHQTQgZWNvbW1lcmNlIGV2ZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0dBNEVjb21tZXJjZUV2ZW50ID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEdBNEVjb21tZXJjZUV2ZW50ID0+XG4gIHR5cGVvZiBkYXRhID09PSAnb2JqZWN0JyAmJlxuICBkYXRhICE9IG51bGwgJiZcbiAgJ2Vjb21tZXJjZScgaW4gZGF0YSAmJlxuICBkYXRhLmVjb21tZXJjZSAhPSBudWxsICYmXG4gIHR5cGVvZiBkYXRhLmVjb21tZXJjZSA9PT0gJ29iamVjdCcgJiZcbiAgJ2l0ZW1zJyBpbiBkYXRhLmVjb21tZXJjZSAmJlxuICBBcnJheS5pc0FycmF5KGRhdGEuZWNvbW1lcmNlLml0ZW1zKTtcbiIsImltcG9ydCB0eXBlIHsgVUFFY29tbWVyY2VFdmVudCB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMnO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhbiBldmVudCBpcyBhIGxlZ2FjeSBVbml2ZXJzYWwgQW5hbHl0aWNzIGVjb21tZXJjZSBldmVudC5cbiAqXG4gKiBAcGFyYW0gZGF0YSBUaGUgZXZlbnQgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZXZlbnQgaXMgYSBsZWdhY3kgVUEgZWNvbW1lcmNlIGV2ZW50LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBpc0xlZ2FjeVVBRWNvbW1lcmNlRXZlbnQgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgVUFFY29tbWVyY2VFdmVudCA9PlxuICBkYXRhICE9IG51bGwgJiZcbiAgdHlwZW9mIGRhdGEgPT09ICdvYmplY3QnICYmXG4gICdlY29tbWVyY2UnIGluIGRhdGEgJiZcbiAgZGF0YS5lY29tbWVyY2UgIT0gbnVsbCAmJlxuICB0eXBlb2YgZGF0YS5lY29tbWVyY2UgPT09ICdvYmplY3QnICYmXG4gICdhZGQnIGluIGRhdGEuZWNvbW1lcmNlICYmXG4gIHR5cGVvZiBkYXRhLmVjb21tZXJjZS5hZGQgPT09ICdvYmplY3QnO1xuIiwiaW50ZXJmYWNlIE1vYmlsZVBscENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIge1xuICByb3dfaW5kZXg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IGlzTW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4pOiB2YWx1ZSBpcyBNb2JpbGVQbHBDaGF0UGxhY2VtZW50UGFyYW1ldGVyID0+XG4gIHZhbHVlICE9IG51bGwgJiZcbiAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAncm93X2luZGV4JyBpbiB2YWx1ZSAmJlxuICB0eXBlb2YgdmFsdWUucm93X2luZGV4ID09PSAnbnVtYmVyJztcbiIsImltcG9ydCB7IFNwYW54VGFrZUFRdWl6Q3RhUGFyYW1ldGVyIH0gZnJvbSAnLi4vc3BhbnhUYWtlQVF1aXpDdGFQYXJhbWV0ZXInO1xuXG5leHBvcnQgY29uc3QgaXNTcGFueFRha2VBUXVpekN0YVBhcmFtZXRlciA9ICh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFNwYW54VGFrZUFRdWl6Q3RhUGFyYW1ldGVyID0+XG4gIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAndGV4dCcgaW4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnRleHQgPT09ICdzdHJpbmcnOyIsImltcG9ydCB7IFBhZ2VWaXNpdENhdGVnb3J5IH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IFBEUFZhcmlhbnRJbmZvLCBQTFBWYXJpYW50SW5mbywgUGFnZVZpc2l0VmFyaWFudEluZm8sIFZhcmlhbnRJbmZvIH0gZnJvbSAnLi4vdmFyaWFudEluZm8nO1xuXG5jb25zdCBpc1BEUFZhcmlhbnRJbmZvID0gKHZhcmlhbnRJbmZvOiBvYmplY3QpOiB2YXJpYW50SW5mbyBpcyBQRFBWYXJpYW50SW5mbyA9PlxuICAndmFyaWFudCcgaW4gdmFyaWFudEluZm8gJiZcbiAgdmFyaWFudEluZm8udmFyaWFudCA9PT0gJ3BkcCcgJiZcbiAgJ3Byb2R1Y3RJZCcgaW4gdmFyaWFudEluZm8gJiZcbiAgdHlwZW9mIHZhcmlhbnRJbmZvLnByb2R1Y3RJZCA9PT0gJ3N0cmluZyc7XG5cbmNvbnN0IGlzUExQVmFyaWFudEluZm8gPSAodmFyaWFudEluZm86IG9iamVjdCk6IHZhcmlhbnRJbmZvIGlzIFBMUFZhcmlhbnRJbmZvID0+XG4gICd2YXJpYW50JyBpbiB2YXJpYW50SW5mbyAmJlxuICB2YXJpYW50SW5mby52YXJpYW50ID09PSAncGxwJyAmJlxuICAncGxwSWQnIGluIHZhcmlhbnRJbmZvICYmXG4gIHR5cGVvZiB2YXJpYW50SW5mby5wbHBJZCA9PT0gJ3N0cmluZyc7XG5cbmNvbnN0IGlzUGFnZVZpc2l0VmFyaWFudEluZm8gPSAodmFyaWFudEluZm86IG9iamVjdCk6IHZhcmlhbnRJbmZvIGlzIFBhZ2VWaXNpdFZhcmlhbnRJbmZvID0+XG4gICd2YXJpYW50JyBpbiB2YXJpYW50SW5mbyAmJlxuICB2YXJpYW50SW5mby52YXJpYW50ID09PSAncGFnZV92aXNpdCcgJiZcbiAgJ3VybCcgaW4gdmFyaWFudEluZm8gJiZcbiAgdHlwZW9mIHZhcmlhbnRJbmZvLnVybCA9PT0gJ3N0cmluZycgJiZcbiAgJ3BhZ2VWaXNpdENhdGVnb3J5JyBpbiB2YXJpYW50SW5mbyAmJlxuICBPYmplY3QudmFsdWVzKFBhZ2VWaXNpdENhdGVnb3J5KS5pbmNsdWRlcyh2YXJpYW50SW5mby5wYWdlVmlzaXRDYXRlZ29yeSBhcyBQYWdlVmlzaXRDYXRlZ29yeSk7XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaXMgYSB2YWxpZCBWYXJpYW50SW5mby5cbiAqXG4gKiBAcGFyYW0gdmFyaWFudEluZm8gLSBUaGUgdW5rbm93biBvYmplY3QgdG8gY2hlY2suXG4gKlxuICogQHJldHVybnMgVHJ1ZSBpZiB0aGUgZGF0YSBpcyBhIHZhbGlkIFZhcmlhbnRJbmZvIG9iamVjdCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgY29uc3QgaXNWYXJpYW50SW5mbyA9ICh2YXJpYW50SW5mbzogdW5rbm93bik6IHZhcmlhbnRJbmZvIGlzIFZhcmlhbnRJbmZvID0+XG4gIHZhcmlhbnRJbmZvICE9IG51bGwgJiZcbiAgdHlwZW9mIHZhcmlhbnRJbmZvID09PSAnb2JqZWN0JyAmJlxuICAndmFyaWFudElkJyBpbiB2YXJpYW50SW5mbyAmJlxuICAoaXNQRFBWYXJpYW50SW5mbyh2YXJpYW50SW5mbykgfHxcbiAgICBpc1BMUFZhcmlhbnRJbmZvKHZhcmlhbnRJbmZvKSB8fFxuICAgIGlzUGFnZVZpc2l0VmFyaWFudEluZm8odmFyaWFudEluZm8pKTtcbiIsImltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcbmltcG9ydCB7IEZvcm1UeXBlIH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IEFwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9yZXNwb25zZUdlbmVyaWNzJztcbmltcG9ydCB7IGhhc1Byb3BlcnR5T2ZUeXBlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvdXRpbHMnO1xuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgdGhlIHByb3ZpZGVkIGRhdGEgaGFzIHRoZSBhbGwgb2YgdGhlIHByb3BlcnRpZXMgKHdpdGggdGhlIGNvcnJlY3QgdHlwZXMpIG9mXG4gKiBhIEZvcm1SZXNwb25zZUF0dHJpYnV0ZVxuICpcbiAqIEBwYXJhbSBkYXRhIC0gVGhlIGRhdGEgdG8gY2hlY2tcbiAqXG4gKiBAcmV0dXJucyB0cnVlIGlmIHRoZSBkYXRhIGhhcyB0aGUgY29ycmVjdCBwcm9wZXJ0aWVzLCBmYWxzZSBvdGhlcndpc2VcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlcyA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ2lzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlczogZGF0YSBpcyBudWxsIG9yIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdmb3JtX2NhdGVnb3J5JyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLmZvcm1fY2F0ZWdvcnkgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IGZvcm1fY2F0ZWdvcnkgaXMgbm90IGFuIG9iamVjdCcsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ2Zvcm1fY2F0ZWdvcnknIGluIGRhdGEgJiYgdHlwZW9mIGRhdGEuZm9ybV9jYXRlZ29yeSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAoXG4gICAgICAhaGFzUHJvcGVydHlPZlR5cGUoZGF0YS5mb3JtX2NhdGVnb3J5LCAnZm9ybV90eXBlJywgJ3N0cmluZycpIHx8XG4gICAgICAhT2JqZWN0LnZhbHVlcyhGb3JtVHlwZSkuaW5jbHVkZXMoZGF0YS5mb3JtX2NhdGVnb3J5LmZvcm1fdHlwZSBhcyBGb3JtVHlwZSlcbiAgICApIHtcbiAgICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICAgJ2lzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlczogZm9ybV90eXBlIGlzIG1pc3Npbmcgb3Igbm90IGEgdmFsaWQgZm9ybSB0eXBlJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7XG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnc2NoZW1hJywgJ29iamVjdCcpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXM6IHNjaGVtYSBpcyBtaXNzaW5nIG9yIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gVE9ETzogYWxzbyB3YW5uYSB2YWxpZGF0ZSB0aGUgZmllbGRzIG9mIGRhdGEuc2NoZW1hLnByb3BlcnRpZXMgYnV0IG1pZ2h0IHdhbm5hIGNoYW5nZSB0aGUgc2NoZW1hXG4gIC8vIHRvIG5vdCBoYXZlIHRoZSBwcm9wZXJ0eSBuYW1lIGFzIGEga2V5IGluIHRoZSBvYmplY3RcbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLnNjaGVtYSwgJ3Byb3BlcnRpZXMnLCAnb2JqZWN0JykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnaXNBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzOiBzY2hlbWEucHJvcGVydGllcyBpcyBtaXNzaW5nIG9yIG5vdCBhbiBvYmplY3QnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YS5zY2hlbWEsICdyZXF1aXJlZCcsICdhcnJheScpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ2lzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlczogc2NoZW1hLnJlcXVpcmVkIGlzIG1pc3Npbmcgb3Igbm90IGFuIGFycmF5JyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgZGF0YSB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICFkYXRhLnNjaGVtYS5yZXF1aXJlZC5ldmVyeShcbiAgICAgIChrZXk6IHVua25vd24pID0+IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnICYmIGtleSBpbiBkYXRhLnNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgIClcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ2lzQXBpRm9ybVJlc3BvbnNlQXR0cmlidXRlczogc2NoZW1hLnJlcXVpcmVkIGNvbnRhaW5zIGludmFsaWQgcHJvcGVydHkga2V5cycsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiaW1wb3J0IExvZ2dlciBmcm9tICdzcmMvYXBwbGljYXRpb24vbG9nZ2luZy9sb2dnZXInO1xuaW1wb3J0IHsgRm9ybVN1Ym1pdHRlZEF0dHJpYnV0ZXMsIEZvcm1UeXBlIH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcbmltcG9ydCB7IGhhc1Byb3BlcnR5T2ZUeXBlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzID0gKFxuICBkYXRhOiB1bmtub3duLFxuKTogZGF0YSBpcyBGb3JtU3VibWl0dGVkQXR0cmlidXRlcyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMnLCAnZGF0YSBpcyBudWxsIG9yIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdmaWxsZWRfc2NoZW1hJywgJ29iamVjdCcpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMnLCAnZmlsbGVkX3NjaGVtYSBpcyBub3QgYW4gb2JqZWN0JywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnZm9ybV9yZXNwb25zZV9pZCcsICdzdHJpbmcnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMnLFxuICAgICAgJ2Zvcm1fcmVzcG9uc2VfaWQgaXMgbm90IGEgc3RyaW5nJyxcbiAgICAgIGRhdGEsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnZm9ybV90eXBlJyBpbiBkYXRhKSB8fCAhT2JqZWN0LnZhbHVlcyhGb3JtVHlwZSkuaW5jbHVkZXMoZGF0YS5mb3JtX3R5cGUgYXMgRm9ybVR5cGUpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ2lzQXBpRm9ybVN1Ym1pdHRlZFJlc3BvbnNlQXR0cmlidXRlcycsXG4gICAgICAnZm9ybV90eXBlIGlzIG5vdCBhIHZhbGlkIGZvcm0gdHlwZSBlbnVtJyxcbiAgICAgIGRhdGEsXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQgeyBPcmRlckl0ZW1JbmZvLCBPcmRlclJlc3BvbnNlQXR0cmlidXRlcyB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBoYXNQcm9wZXJ0eU9mVHlwZSB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL3V0aWxzJztcblxuLy8gdGhlIGNsaWVudCBTREsgZ2VuZXJhdGVzIGRhdGUtdGltZSBmb3JtYXQgdHlwZXMgYXMgYERhdGVgIGJ1dCB0aGUgb3BlbmFwaSB0eXBlc2NyaXB0IGdlbmVyYXRvclxuLy8gZG9lcyBub3QgY29ycmVjdGx5IGRlc2VyaWFsaXplIGRhdGUtdGltZSB2YWx1ZXMgc28gdGhleSBhcmUgYWx3YXlzIGBzdHJpbmdgIGF0IHJ1bnRpbWUgaW5zdGVhZCBvZlxuLy8gYERhdGVgIG9iamVjdHMuIFRoZXNlIGludGVyZmFjZXMgb3ZlcnJpZGUgdGhlIFNESyB0eXBlcyBzbyB0aGF0IHdlIGNhbiB2YWxpZGF0ZSBhZ2FpbnN0IHRoZSBhY3R1YWxcbi8vIGBzdHJpbmdgIHZhbHVlcy4gaHR0cHM6Ly9naXRodWIuY29tL09wZW5BUElUb29scy9vcGVuYXBpLWdlbmVyYXRvci9pc3N1ZXMvOTI2XG5leHBvcnQgaW50ZXJmYWNlIEFwaU9yZGVySXRlbUluZm9cbiAgZXh0ZW5kcyBPbWl0PE9yZGVySXRlbUluZm8sICdkZWxpdmVyZWRfYXQnIHwgJ2VzdGltYXRlZF9kZWxpdmVyeV9hdCcgfCAnaW5fdHJhbnNpdF9hdCc+IHtcbiAgZGVsaXZlcmVkX2F0Pzogc3RyaW5nO1xuICBlc3RpbWF0ZWRfZGVsaXZlcnlfYXQ/OiBzdHJpbmc7XG4gIGluX3RyYW5zaXRfYXQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXBpT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXNcbiAgZXh0ZW5kcyBPbWl0PE9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzLCAnY3JlYXRlZF9hdCcgfCAnbGF0ZXN0X2V2ZW50X2RhdGUnIHwgJ2xpbmVfaXRlbXMnPiB7XG4gIGNyZWF0ZWRfYXQ6IHN0cmluZztcbiAgbGF0ZXN0X2V2ZW50X2RhdGU6IHN0cmluZztcbiAgbGluZV9pdGVtczogQXBpT3JkZXJJdGVtSW5mb1tdO1xufVxuXG5jb25zdCBpc0FwaU9yZGVySXRlbUluZm8gPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JkZXJJdGVtSW5mbyA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvIG11c3QgYmUgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnb3JkZXJfaXRlbV9pZCcsICdzdHJpbmcnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mbyBtdXN0IGhhdmUgYW4gb3JkZXJfaXRlbV9pZCBwcm9wZXJ0eScsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2l0ZW1fdGl0bGUnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8gbXVzdCBoYXZlIGFuIGl0ZW1fdGl0bGUgcHJvcGVydHknLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdpdGVtX3ByaWNlJywgJ251bWJlcicpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvIG11c3QgaGF2ZSBhbiBpdGVtX3ByaWNlIHByb3BlcnR5JywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnaXRlbV9xdWFudGl0eScsICdudW1iZXInKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mbyBtdXN0IGhhdmUgYW4gaXRlbV9xdWFudGl0eSBwcm9wZXJ0eScsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2ltYWdlJywgJ3N0cmluZycsIHRydWUpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvLmltYWdlIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2Z1bGZpbGxtZW50X2Rpc3BsYXlfc3RhdHVzJywgJ3N0cmluZycsIHRydWUpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKFxuICAgICAgJ09yZGVySXRlbUluZm8uZnVsZmlsbG1lbnRfZGlzcGxheV9zdGF0dXMgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICd0cmFja2luZ191cmwnLCAnc3RyaW5nJywgdHJ1ZSkpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ09yZGVySXRlbUluZm8udHJhY2tpbmdfdXJsIG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2RlbGl2ZXJlZF9hdCcsICdzdHJpbmcnLCB0cnVlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mby5kZWxpdmVyZWRfYXQgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsJywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnZXN0aW1hdGVkX2RlbGl2ZXJ5X2F0JywgJ3N0cmluZycsIHRydWUpKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdPcmRlckl0ZW1JbmZvLmVzdGltYXRlZF9kZWxpdmVyeV9hdCBtdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnaW5fdHJhbnNpdF9hdCcsICdzdHJpbmcnLCB0cnVlKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXJJdGVtSW5mby5pbl90cmFuc2l0X2F0IG11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQXBpT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JkZXJSZXNwb25zZUF0dHJpYnV0ZXMgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dFcnJvcignT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGJlIGFuIG9iamVjdCcsIHVuZGVmaW5lZCwgeyBkYXRhIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ2NyZWF0ZWRfYXQnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGhhdmUgYSBjcmVhdGVkX2F0IHByb3BlcnR5IGFuZCBoYXZlIHR5cGUgc3RyaW5nJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdsYXRlc3RfZXZlbnRfZGF0ZScsICdzdHJpbmcnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdPcmRlciByZXNwb25zZSBhdHRyaWJ1dGVzIG11c3QgaGF2ZSBhIGxhdGVzdF9ldmVudF9kYXRlIHByb3BlcnR5IGFuZCBoYXZlIHR5cGUgc3RyaW5nJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgIWhhc1Byb3BlcnR5T2ZUeXBlKGRhdGEsICdsaW5lX2l0ZW1zJywgJ2FycmF5JykgfHxcbiAgICAhZGF0YS5saW5lX2l0ZW1zLmV2ZXJ5KChpdGVtOiB1bmtub3duKSA9PiBpc0FwaU9yZGVySXRlbUluZm8oaXRlbSkpXG4gICkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdPcmRlciByZXNwb25zZSBhdHRyaWJ1dGVzIG11c3QgaGF2ZSBhIGxpbmVfaXRlbXMgcHJvcGVydHkgd2l0aCBhdCBsZWFzdCBvbmUgb3JkZXIgaXRlbScsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFoYXNQcm9wZXJ0eU9mVHlwZShkYXRhLCAnb3JkZXJfaWQnLCAnc3RyaW5nJykpIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoXG4gICAgICAnT3JkZXIgcmVzcG9uc2UgYXR0cmlidXRlcyBtdXN0IGhhdmUgYW4gb3JkZXJfaWQgcHJvcGVydHkgYW5kIGhhdmUgdHlwZSBzdHJpbmcnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaGFzUHJvcGVydHlPZlR5cGUoZGF0YSwgJ29yZGVyX251bWJlcicsICdzdHJpbmcnKSkge1xuICAgIExvZ2dlci5sb2dFcnJvcihcbiAgICAgICdPcmRlciByZXNwb25zZSBhdHRyaWJ1dGVzIG11c3QgaGF2ZSBhbiBvcmRlcl9udW1iZXIgcHJvcGVydHkgYW5kIGhhdmUgdHlwZSBzdHJpbmcnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcbmltcG9ydCB7IE9yZ2FuaXphdGlvbkNvbmZpZyB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5cbi8vIHRoZSBcImNvbmZpZ1wiIHByb3BlcnR5IGlzIGEgZ2VuZXJpYyBvYmplY3QgaW4gdGhlIGNvbW1lcmNlIGFwaSBzcGVjLCB0aGVzZSBpbnRlcmZhY2VzXG4vLyBhcmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgc3RydWN0dXJlIG9mIHRoYXQgb2JqZWN0IGFuZCB0byB0cmFuc2Zvcm0gdGhlIGFwaSByZXNwb25zZVxuLy8gaW50byBhIHR5cGVkIG9iamVjdCBmb3IgdGhlIGZyb250ZW5kLiBEbyBub3QgdXNlIHRoZXNlIGludGVyZmFjZXMgZm9yIGFueXRoaW5nIGVsc2UuXG5pbnRlcmZhY2UgQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlIHtcbiAgc2Vzc2lvbl9yZXBsYXlfZW5hYmxlZDogYm9vbGVhbjtcbiAgc2Vzc2lvbl9yZXBsYXlfc2FtcGxlX3JhdGU6IG51bWJlcjtcbiAgdHJhY2tpbmdfZW5hYmxlZDogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIEFwaU9yZ0FuYWx5dGljc0NvbmZpZ0N1c3RvbWVyU2VydmljZSB7XG4gIHByb3ZpZGVyOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBBcGlPcmdBbmFseXRpY3NDb25maWdHb29nbGVBbmFseXRpY3Mge1xuICBtZWFzdXJlbWVudF9pZDogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgQXBpT3JnQW5hbHl0aWNzQ29uZmlnIHtcbiAgYW1wbGl0dWRlPzogQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlO1xuICBjdXN0b21lcl9zZXJ2aWNlPzogQXBpT3JnQW5hbHl0aWNzQ29uZmlnQ3VzdG9tZXJTZXJ2aWNlO1xuICBnb29nbGVfYW5hbHl0aWNzPzogQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFwaU9yZ2FuaXphdGlvbkNvbmZpZyBleHRlbmRzIE9yZ2FuaXphdGlvbkNvbmZpZyB7XG4gIGNvbmZpZzogQXBpT3JnQW5hbHl0aWNzQ29uZmlnO1xufVxuXG5jb25zdCBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZSA9IChcbiAgZGF0YTogdW5rbm93bixcbik6IGRhdGEgaXMgQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnc2Vzc2lvbl9yZXBsYXlfZW5hYmxlZCcgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEuc2Vzc2lvbl9yZXBsYXlfZW5hYmxlZCAhPT0gJ2Jvb2xlYW4nKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlOiBzZXNzaW9uX3JlcGxheV9lbmFibGVkIGlzIG5vdCBhIGJvb2xlYW4nLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdzZXNzaW9uX3JlcGxheV9zYW1wbGVfcmF0ZScgaW4gZGF0YSkgfHxcbiAgICB0eXBlb2YgZGF0YS5zZXNzaW9uX3JlcGxheV9zYW1wbGVfcmF0ZSAhPT0gJ251bWJlcidcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnQW1wbGl0dWRlOiBzZXNzaW9uX3JlcGxheV9zYW1wbGVfcmF0ZSBpcyBub3QgYSBudW1iZXInLFxuICAgICAgZGF0YSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCd0cmFja2luZ19lbmFibGVkJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS50cmFja2luZ19lbmFibGVkICE9PSAnYm9vbGVhbicpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdBbmFseXRpY3NDb25maWdBbXBsaXR1ZGU6IHRyYWNraW5nX2VuYWJsZWQgaXMgbm90IGEgYm9vbGVhbicsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0N1c3RvbWVyU2VydmljZSA9IChcbiAgZGF0YTogdW5rbm93bixcbik6IGRhdGEgaXMgQXBpT3JnQW5hbHl0aWNzQ29uZmlnQ3VzdG9tZXJTZXJ2aWNlID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdBbmFseXRpY3NDb25maWdDdXN0b21lclNlcnZpY2U6IGRhdGEgaXMgbm90IGFuIG9iamVjdCcsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ3Byb3ZpZGVyJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5wcm92aWRlciAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdBbmFseXRpY3NDb25maWdDdXN0b21lclNlcnZpY2U6IHByb3ZpZGVyIGlzIG5vdCBhIHN0cmluZycsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5jb25zdCBpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0dvb2dsZUFuYWx5dGljcyA9IChcbiAgZGF0YTogdW5rbm93bixcbik6IGRhdGEgaXMgQXBpT3JnQW5hbHl0aWNzQ29uZmlnR29vZ2xlQW5hbHl0aWNzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdBbmFseXRpY3NDb25maWdHb29nbGVBbmFseXRpY3M6IGRhdGEgaXMgbm90IGFuIG9iamVjdCcsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ21lYXN1cmVtZW50X2lkJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5tZWFzdXJlbWVudF9pZCAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdBbmFseXRpY3NDb25maWdHb29nbGVBbmFseXRpY3M6IG1lYXN1cmVtZW50X2lkIGlzIG5vdCBhIHN0cmluZycsXG4gICAgICBkYXRhLFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHJldHVybnNcbiAqL1xuY29uc3QgaXNBcGlPcmdBbmFseXRpY3NDb25maWcgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JnQW5hbHl0aWNzQ29uZmlnID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQW5hbHl0aWNzQ29uZmlnOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgJ2FtcGxpdHVkZScgaW4gZGF0YSAmJlxuICAgICFpc0FwaU9yZ0FuYWx5dGljc0NvbmZpZ0FtcGxpdHVkZShkYXRhLmFtcGxpdHVkZSlcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0FuYWx5dGljc0NvbmZpZzogYW1wbGl0dWRlIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgJ2N1c3RvbWVyX3NlcnZpY2UnIGluIGRhdGEgJiZcbiAgICAhaXNBcGlPcmdBbmFseXRpY3NDb25maWdDdXN0b21lclNlcnZpY2UoZGF0YS5jdXN0b21lcl9zZXJ2aWNlKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQW5hbHl0aWNzQ29uZmlnOiBjdXN0b21lcl9zZXJ2aWNlIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgJ2dvb2dsZV9hbmFseXRpY3MnIGluIGRhdGEgJiZcbiAgICAhaXNBcGlPcmdBbmFseXRpY3NDb25maWdHb29nbGVBbmFseXRpY3MoZGF0YS5nb29nbGVfYW5hbHl0aWNzKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQW5hbHl0aWNzQ29uZmlnOiBnb29nbGVfYW5hbHl0aWNzIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBkYXRhXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgaXNBcGlPcmdhbml6YXRpb25Db25maWcgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JnYW5pemF0aW9uQ29uZmlnID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnY3JlYXRlZF9hdCcgaW4gZGF0YSkpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBjcmVhdGVkX2F0IGlzIG5vdCBkZWZpbmVkJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ25hbWVzcGFjZScgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEubmFtZXNwYWNlICE9PSAnc3RyaW5nJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNPcmdDb25maWc6IG5hbWVzcGFjZSBpcyBub3QgYSBzdHJpbmcnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnaXNfbGF0ZXN0JyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5pc19sYXRlc3QgIT09ICdib29sZWFuJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNPcmdDb25maWc6IGlzX2xhdGVzdCBpcyBub3QgYSBib29sZWFuJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ3ZlcnNpb24nIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLnZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc09yZ0NvbmZpZzogdmVyc2lvbiBpcyBub3QgYSBzdHJpbmcnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgndXBkYXRlZF9hdCcgaW4gZGF0YSkpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiB1cGRhdGVkX2F0IGlzIG5vdCBkZWZpbmVkJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICEoJ2NvbmZpZycgaW4gZGF0YSkgfHxcbiAgICB0eXBlb2YgZGF0YS5jb25maWcgIT09ICdvYmplY3QnIHx8XG4gICAgIWlzQXBpT3JnQW5hbHl0aWNzQ29uZmlnKGRhdGEuY29uZmlnKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBjb25maWcgaXMgbm90IGFuIG9iamVjdCcsIGRhdGEpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnb3JnYW5pemF0aW9uX2lkJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLm9yZ2FuaXphdGlvbl9pZCAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBvcmdhbml6YXRpb25faWQgaXMgbm90IGEgc3RyaW5nJywgZGF0YSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdpZCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzT3JnQ29uZmlnOiBpZCBpcyBub3QgYSBzdHJpbmcnLCBkYXRhKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG4iLCJpbXBvcnQgTG9nZ2VyIGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9sb2dnaW5nL2xvZ2dlcic7XG5pbXBvcnQge1xuICBTdGF0c2lnRXhwZXJpbWVudCBhcyBBcGlPcmdDb25maWdFeHBlcmltZW50LFxuICBTdGF0c2lnRmVhdHVyZUdhdGUgYXMgQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGUsXG4gIE9yZ2FuaXphdGlvblNldHRpbmdzIGFzIEFwaU9yZ0NvbmZpZ09yZ2FuaXphdGlvblNldHRpbmdzLFxuICBPcmdhbml6YXRpb24gYXMgQXBpT3JnYW5pemF0aW9uLFxuICBPcmdhbml6YXRpb25TdGF0dXNFbnVtLFxufSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgQXBpT3JnYW5pemF0aW9uQ29uZmlnLCBpc0FwaU9yZ2FuaXphdGlvbkNvbmZpZyB9IGZyb20gJy4vaXNBcGlPcmdhbml6YXRpb25Db25maWcnO1xuXG5pbnRlcmZhY2UgQXBpT3JnQ29uZmlnUmVzdWx0cyB7XG4gIGNvbmZpZ3M6IEFwaU9yZ2FuaXphdGlvbkNvbmZpZ1tdO1xuICBleHBlcmltZW50czogQXBpT3JnQ29uZmlnRXhwZXJpbWVudFtdO1xuICBnYXRlczogQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGVbXTtcbiAgb3JnOiBBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5ncztcbn1cblxuY29uc3QgaXNBcGlPcmdDb25maWdFeHBlcmltZW50ID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEFwaU9yZ0NvbmZpZ0V4cGVyaW1lbnQgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdFeHBlcmltZW50OiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdncm91cCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5ncm91cCAhPT0gJ3N0cmluZycgJiYgZGF0YS5ncm91cCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKFxuICAgICAgJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudDogZ3JvdXAgaXMgbm90IGEgc3RyaW5nIG9yIHVuZGVmaW5lZCcsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdncm91cF9uYW1lJyBpbiBkYXRhICYmXG4gICAgdHlwZW9mIGRhdGEuZ3JvdXBfbmFtZSAhPT0gJ3N0cmluZycgJiZcbiAgICBkYXRhLmdyb3VwX25hbWUgIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudDogZ3JvdXBfbmFtZSBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCduYW1lJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLm5hbWUgIT09ICdzdHJpbmcnICYmIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0V4cGVyaW1lbnQ6IG5hbWUgaXMgbm90IGEgc3RyaW5nJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgncnVsZV9pZCcgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5ydWxlX2lkICE9PSAnc3RyaW5nJyAmJiBkYXRhLnJ1bGVfaWQgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdFeHBlcmltZW50OiBydWxlX2lkIGlzIG5vdCBhIHN0cmluZycsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ3ZhbHVlJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLnZhbHVlICE9PSAnb2JqZWN0JyAmJiBkYXRhLnZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnRXhwZXJpbWVudDogdmFsdWUgaXMgbm90IGFuIG9iamVjdCcsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IGlzQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGUgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGUgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdGZWF0dXJlR2F0ZTogZGF0YSBpcyBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnbmFtZScgaW4gZGF0YSAmJiB0eXBlb2YgZGF0YS5uYW1lICE9PSAnc3RyaW5nJyAmJiBkYXRhLm5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdGZWF0dXJlR2F0ZTogbmFtZSBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCdydWxlX2lkJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLnJ1bGVfaWQgIT09ICdzdHJpbmcnICYmIGRhdGEucnVsZV9pZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlOiBydWxlX2lkIGlzIG5vdCBhIHN0cmluZycsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ3ZhbHVlJyBpbiBkYXRhICYmIHR5cGVvZiBkYXRhLnZhbHVlICE9PSAnYm9vbGVhbicgJiYgZGF0YS52YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ0ZlYXR1cmVHYXRlOiB2YWx1ZSBpcyBub3QgYSBib29sZWFuJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgaXNBcGlPcmdhbml6YXRpb24gPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgQXBpT3JnYW5pemF0aW9uID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2lkJyBpbiBkYXRhKSB8fCB0eXBlb2YgZGF0YS5pZCAhPT0gJ3N0cmluZycpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBpZCBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2Rpc3BsYXlfbmFtZScgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEuZGlzcGxheV9uYW1lICE9PSAnc3RyaW5nJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdhbml6YXRpb246IGRpc3BsYXlfbmFtZSBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ2RvbWFpbicgaW4gZGF0YSkgfHwgdHlwZW9mIGRhdGEuZG9tYWluICE9PSAnc3RyaW5nJykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZygnW3NwaWZmeS1haV0gaXNBcGlPcmdhbml6YXRpb246IGRvbWFpbiBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCEoJ3Nob3J0X25hbWUnIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLnNob3J0X25hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ2FuaXphdGlvbjogc2hvcnRfbmFtZSBpcyBub3QgYSBzdHJpbmcnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICEoJ3N0YXR1cycgaW4gZGF0YSkgfHxcbiAgICAhT2JqZWN0LnZhbHVlcyhPcmdhbml6YXRpb25TdGF0dXNFbnVtKS5pbmNsdWRlcyhkYXRhLnN0YXR1cyBhcyBPcmdhbml6YXRpb25TdGF0dXNFbnVtKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdhbml6YXRpb246IHN0YXR1cyBpcyBub3QgYSB2YWxpZCBPcmdhbml6YXRpb25TdGF0dXNFbnVtIHZhbHVlJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgJ2NyZWF0ZWRfYXQnIGluIGRhdGEgJiZcbiAgICAhKGRhdGEuY3JlYXRlZF9hdCBpbnN0YW5jZW9mIERhdGUpICYmXG4gICAgdHlwZW9mIGRhdGEuY3JlYXRlZF9hdCAhPT0gJ3N0cmluZycgJiZcbiAgICBkYXRhLmNyZWF0ZWRfYXQgIT09IHVuZGVmaW5lZFxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnYW5pemF0aW9uOiBjcmVhdGVkX2F0IGlzIG5vdCBhIERhdGUnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICd1cGRhdGVkX2F0JyBpbiBkYXRhICYmXG4gICAgIShkYXRhLnVwZGF0ZWRfYXQgaW5zdGFuY2VvZiBEYXRlKSAmJlxuICAgIHR5cGVvZiBkYXRhLnVwZGF0ZWRfYXQgIT09ICdzdHJpbmcnICYmXG4gICAgZGF0YS51cGRhdGVkX2F0ICE9PSB1bmRlZmluZWRcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ2FuaXphdGlvbjogdXBkYXRlZF9hdCBpcyBub3QgYSBEYXRlJywgdW5kZWZpbmVkLCB7XG4gICAgICBkYXRhLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgaXNBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5ncyA9IChcbiAgZGF0YTogdW5rbm93bixcbik6IGRhdGEgaXMgQXBpT3JnQ29uZmlnT3JnYW5pemF0aW9uU2V0dGluZ3MgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ09yZ2FuaXphdGlvblNldHRpbmdzOiBkYXRhIGlzIG5vdCBhbiBvYmplY3QnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghKCdvcmcnIGluIGRhdGEpIHx8ICFpc0FwaU9yZ2FuaXphdGlvbihkYXRhLm9yZykpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5nczogb3JnIGlzIG5vdCBhbiBvYmplY3QnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAge1xuICAgICAgICBkYXRhLFxuICAgICAgfSxcbiAgICApO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIHNraXAgdmFsaWRhdGlvbiBmb3IgJ3NldHRpbmdzJyBmb3Igbm93XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gZGF0YVxuICogQHJldHVybnNcbiAqL1xuZXhwb3J0IGNvbnN0IGlzQXBpT3JnQ29uZmlnUmVzdWx0cyA9IChkYXRhOiB1bmtub3duKTogZGF0YSBpcyBSZXF1aXJlZDxBcGlPcmdDb25maWdSZXN1bHRzPiA9PiB7XG4gIGlmIChkYXRhID09IG51bGwgfHwgdHlwZW9mIGRhdGEgIT09ICdvYmplY3QnKSB7XG4gICAgTG9nZ2VyLmxvZ0RlYnVnKCdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ1Jlc3VsdHM6IGRhdGEgaXMgbm90IGFuIG9iamVjdCcsIHVuZGVmaW5lZCwge1xuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoXG4gICAgISgnY29uZmlncycgaW4gZGF0YSkgfHxcbiAgICAhQXJyYXkuaXNBcnJheShkYXRhLmNvbmZpZ3MpIHx8XG4gICAgIWRhdGEuY29uZmlncy5ldmVyeSgoY29uZmlnKSA9PiBpc0FwaU9yZ2FuaXphdGlvbkNvbmZpZyhjb25maWcpKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoJ1tzcGlmZnktYWldIGlzQXBpT3JnQ29uZmlnUmVzdWx0czogY29uZmlncyBpcyBub3QgYW4gYXJyYXknLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICdleHBlcmltZW50cycgaW4gZGF0YSAmJlxuICAgIGRhdGEuZXhwZXJpbWVudHMgIT09IHVuZGVmaW5lZCAmJlxuICAgICghQXJyYXkuaXNBcnJheShkYXRhLmV4cGVyaW1lbnRzKSB8fFxuICAgICAgIWRhdGEuZXhwZXJpbWVudHMuZXZlcnkoKGV4cCkgPT4gaXNBcGlPcmdDb25maWdFeHBlcmltZW50KGV4cCkpKVxuICApIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdSZXN1bHRzOiBleHBlcmltZW50cyBpcyBub3QgYW4gYXJyYXkgb3IgY29udGFpbnMgaW52YWxpZCBpdGVtcycsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB7XG4gICAgICAgIGRhdGEsXG4gICAgICB9LFxuICAgICk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICEoJ2dhdGVzJyBpbiBkYXRhKSB8fFxuICAgICFBcnJheS5pc0FycmF5KGRhdGEuZ2F0ZXMpIHx8XG4gICAgIWRhdGEuZ2F0ZXMuZXZlcnkoKGdhdGUpID0+IGlzQXBpT3JnQ29uZmlnRmVhdHVyZUdhdGUoZ2F0ZSkpXG4gICkge1xuICAgIExvZ2dlci5sb2dEZWJ1ZyhcbiAgICAgICdbc3BpZmZ5LWFpXSBpc0FwaU9yZ0NvbmZpZ1Jlc3VsdHM6IGdhdGVzIGlzIG5vdCBhbiBhcnJheSBvciBjb250YWlucyBpbnZhbGlkIGl0ZW1zJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHtcbiAgICAgICAgZGF0YSxcbiAgICAgIH0sXG4gICAgKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnb3JnJyBpbiBkYXRhKSB8fCAhaXNBcGlPcmdDb25maWdPcmdhbml6YXRpb25TZXR0aW5ncyhkYXRhLm9yZykpIHtcbiAgICBMb2dnZXIubG9nRGVidWcoXG4gICAgICAnW3NwaWZmeS1haV0gaXNBcGlPcmdDb25maWdSZXN1bHRzOiBvcmcgaXMgbm90IGFuIG9iamVjdCBvciBoYXMgaW52YWxpZCBmaWVsZHMnLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgeyBkYXRhIH0sXG4gICAgKTtcblxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCB7IEFwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9yZXNwb25zZUdlbmVyaWNzJztcblxuZXhwb3J0IGNvbnN0IGlzQXBpUGFnZVJlc3BvbnNlQXR0cmlidXRlcyA9IChvYmo6IHVua25vd24pOiBvYmogaXMgQXBpUGFnZVJlc3BvbnNlQXR0cmlidXRlcyA9PiB7XG4gIGlmIChvYmogPT0gbnVsbCB8fCB0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgndGl0bGUnIGluIG9iaiAmJiBvYmoudGl0bGUgIT0gbnVsbCAmJiB0eXBlb2Ygb2JqLnRpdGxlICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgnZGVzY3JpcHRpb24nIGluIG9iaiAmJiB0eXBlb2Ygb2JqLmRlc2NyaXB0aW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICgndXJsJyBpbiBvYmogJiYgdHlwZW9mIG9iai51cmwgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuIiwiaW1wb3J0IHtcbiAgUExQQXR0cmlidXRlQ2F0ZWdvcnksXG4gIFBMUEF0dHJpYnV0ZXMsXG4gIFBMUElkQXR0cmlidXRlcyxcbn0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcblxuZXhwb3J0IGNvbnN0IGlzQXBpUExQSWRBdHRyaWJ1dGUgPSAoZGF0YTogdW5rbm93bik6IGRhdGEgaXMgUExQSWRBdHRyaWJ1dGVzID0+IHtcbiAgaWYgKGRhdGEgPT0gbnVsbCB8fCB0eXBlb2YgZGF0YSAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoISgnaWQnIGluIGRhdGEpIHx8IHR5cGVvZiBkYXRhLmlkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzQXBpUExQRXZlbnRBdHRyaWJ1dGVzID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIFBMUEF0dHJpYnV0ZXMgPT4ge1xuICBpZiAoZGF0YSA9PSBudWxsIHx8IHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChcbiAgICAhKCdjYXRlZ29yeScgaW4gZGF0YSkgfHxcbiAgICB0eXBlb2YgZGF0YS5jYXRlZ29yeSAhPT0gJ3N0cmluZycgfHxcbiAgICAhT2JqZWN0LnZhbHVlcyhQTFBBdHRyaWJ1dGVDYXRlZ29yeSkuaW5jbHVkZXMoZGF0YS5jYXRlZ29yeSBhcyBQTFBBdHRyaWJ1dGVDYXRlZ29yeSlcbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKFxuICAgICEoJ2F0dHJpYnV0ZXMnIGluIGRhdGEpIHx8XG4gICAgdHlwZW9mIGRhdGEuYXR0cmlidXRlcyAhPT0gJ29iamVjdCcgfHxcbiAgICAhaXNBcGlQTFBJZEF0dHJpYnV0ZShkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCB7IFByb2R1Y3RTZWFyY2hGaWx0ZXJSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuXG5leHBvcnQgY29uc3QgaXNBcGlQcm9kdWN0U2VhcmNoRmlsdGVyUmVzcG9uc2VBdHRyaWJ1dGVzID0gKFxuICBhdHRyaWJ1dGVzOiB1bmtub3duLFxuKTogYXR0cmlidXRlcyBpcyBQcm9kdWN0U2VhcmNoRmlsdGVyUmVzcG9uc2VBdHRyaWJ1dGVzID0+IHtcbiAgaWYgKGF0dHJpYnV0ZXMgPT0gbnVsbCB8fCB0eXBlb2YgYXR0cmlidXRlcyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoJ2ZpbHRlcl9uYW1lJyBpbiBhdHRyaWJ1dGVzICYmIHR5cGVvZiBhdHRyaWJ1dGVzLmZpbHRlcl9uYW1lICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsImltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcbmltcG9ydCB7IEdldE1lcmNoYW50Q29sb3JzUXVlcnlEYXRhIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ncmFwaHFsJztcblxuY29uc3QgUkVRVUlSRURfQ09MT1JfRklFTERTID0gW1xuICAnYWNjZW50X3ByaW1hcnknLFxuICAnYWNjZW50X3NlY29uZGFyeScsXG4gICdiYWNrZ3JvdW5kX2RhcmsnLFxuICAnYmFja2dyb3VuZF9saWdodCcsXG4gICdiYWNrZ3JvdW5kX3ByaW1hcnknLFxuICAnYmFja2dyb3VuZF9zYXR1cmF0ZWQnLFxuICAnYmFja2dyb3VuZF9zZWNvbmRhcnknLFxuICAnYmFja2dyb3VuZF9zZWNvbmRhcnlfZGFyaycsXG4gICdiYWNrZ3JvdW5kX3RlcnRpYXJ5JyxcbiAgJ2JvcmRlcl9kYXJrJyxcbiAgJ2JvcmRlcl9saWdodCcsXG4gICdib3JkZXJfbWVkaXVtJyxcbiAgJ2JvcmRlcl9vdXRsaW5lJyxcbiAgJ3RleHRfYWNjZW50JyxcbiAgJ3RleHRfbGlnaHQnLFxuICAndGV4dF9saW5rJyxcbiAgJ3RleHRfcHJpbWFyeScsXG4gICd0ZXh0X3NlY29uZGFyeScsXG5dIGFzIGNvbnN0O1xuXG5leHBvcnQgY29uc3QgaXNHcmFwaFFMQ29sb3JzQ29uZmlnID0gKGRhdGE6IHVua25vd24pOiBkYXRhIGlzIEdldE1lcmNoYW50Q29sb3JzUXVlcnlEYXRhID0+IHtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSAnb2JqZWN0JyB8fCBkYXRhID09PSBudWxsKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdJbnZhbGlkIGdyYXBocWwgcmVzcG9uc2UgZm9yIGNvbG9ycyBjb25maWcnLCB1bmRlZmluZWQsIHsgZGF0YSB9KTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBDaGVjayBlYWNoIHJlcXVpcmVkIGZpZWxkXG4gIGNvbnN0IG1pc3NpbmdGaWVsZHMgPSBSRVFVSVJFRF9DT0xPUl9GSUVMRFMuZmlsdGVyKFxuICAgIChmaWVsZCkgPT4gIShmaWVsZCBpbiBkYXRhKSB8fCB0eXBlb2YgKGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pW2ZpZWxkXSAhPT0gJ3N0cmluZycsXG4gICk7XG5cbiAgaWYgKG1pc3NpbmdGaWVsZHMubGVuZ3RoID09PSBSRVFVSVJFRF9DT0xPUl9GSUVMRFMubGVuZ3RoKSB7XG4gICAgTG9nZ2VyLmxvZ0Vycm9yKCdBbGwgY29sb3IgZmllbGRzIGFyZSBtaXNzaW5nIG9yIG51bGwnLCB1bmRlZmluZWQpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChtaXNzaW5nRmllbGRzLmxlbmd0aCA+IDApIHtcbiAgICBMb2dnZXIubG9nRXJyb3IoJ01pc3Npbmcgb3IgaW52YWxpZCBjb2xvciBmaWVsZHMnLCB1bmRlZmluZWQsIHtcbiAgICAgIGRhdGEsXG4gICAgICBtaXNzaW5nRmllbGRzLFxuICAgIH0pO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcbiIsIi8qKlxuICogR2VuZXJpYyB1dGlsaXR5IHRvIHRyYW5zZm9ybSBzbmFrZV9jYXNlIG9iamVjdCBrZXlzIHRvIGNhbWVsQ2FzZSBhdCBydW50aW1lLlxuICogVGhpcyBpcyB0aGUgcnVudGltZSBlcXVpdmFsZW50IG9mIHRoZSBDYW1lbENhc2VkUHJvcGVydGllc0RlZXAgdHlwZSB1dGlsaXR5LlxuICovXG5cbi8vIExpc3Qgb2YgYWNyb255bXMgdGhhdCBzaG91bGQgYmUgcHJlc2VydmVkIGFzIHVwcGVyY2FzZSBpbiBjYW1lbENhc2UgYW5kIGxvd2VyY2FzZSBpbiBzbmFrZV9jYXNlXG5jb25zdCBQUkVTRVJWRURfQUNST05ZTVMgPSBbXCJQTFBcIiwgXCJQRFBcIiwgXCJTVkdcIl07XG5cbi8qKlxuICogQ29udmVydHMgYSBzbmFrZV9jYXNlIHN0cmluZyB0byBjYW1lbENhc2VcbiAqIEhhbmRsZXMgc3BlY2lmaWMgYWNyb255bXMgbGlrZSBQTFAgYW5kIFBEUCBjb3JyZWN0bHlcbiAqL1xuY29uc3QgdG9DYW1lbENhc2UgPSAoc3RyOiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuICAvLyBQcmUtcHJvY2VzczogY29udmVydCBhbGwgd29yZHMgdGhhdCBtYXRjaCB0aGUgUFJFU0VSVkVEX0FDUk9OWU1TIHJlZ2V4IHRvIHVwcGVyY2FzZVxuICBsZXQgcHJvY2Vzc2VkU3RyID0gc3RyO1xuICBmb3IgKGNvbnN0IGFjcm9ueW0gb2YgUFJFU0VSVkVEX0FDUk9OWU1TKSB7XG4gICAgY29uc3QgcmVnZXggPSBuZXcgUmVnRXhwKGBfJHthY3JvbnltfV8/YCwgXCJnaVwiKTtcblxuICAgIGlmIChwcm9jZXNzZWRTdHIubWF0Y2gocmVnZXgpKSB7XG4gICAgICBwcm9jZXNzZWRTdHIgPSBwcm9jZXNzZWRTdHIucmVwbGFjZShyZWdleCwgKHYpID0+XG4gICAgICAgIHYuZW5kc1dpdGgoXCJfXCIpID8gYCR7YWNyb255bX1fYCA6IGAke2Fjcm9ueW19YFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHByb2Nlc3NlZFN0ci5yZXBsYWNlKC9fKFthLXpdKS9nLCAoXywgbGV0dGVyKSA9PiBsZXR0ZXIudG9VcHBlckNhc2UoKSk7XG59O1xuXG4vKipcbiAqIENvbnZlcnRzIGEgY2FtZWxDYXNlIHN0cmluZyB0byBzbmFrZV9jYXNlXG4gKiBIYW5kbGVzIGNvbnNlY3V0aXZlIGNhcGl0YWwgbGV0dGVycyBjb3JyZWN0bHkgKGUuZy4sIFwiUERQXCIgLT4gXCJwZHBcIiwgbm90IFwicF9kX3BcIilcbiAqIFByZXNlcnZlcyBzcGVjaWZpYyBhY3JvbnltcyBsaWtlIFBMUCBhbmQgUERQIGFzIGxvd2VyY2FzZSBpbiBzbmFrZV9jYXNlXG4gKi9cbmNvbnN0IHRvU25ha2VDYXNlID0gKHN0cjogc3RyaW5nKSA9PlxuICBzdHJcbiAgICAucmVwbGFjZSgvKFtBLVpdKSg/PVthLXpdKS9nLCBcIl8kMVwiKVxuICAgIC5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCBcIiQxXyQyXCIpXG4gICAgLnRvTG93ZXJDYXNlKClcbiAgICAucmVwbGFjZSgvXl8vLCBcIlwiKTtcblxuLyoqXG4gKiBSZWN1cnNpdmVseSB0cmFuc2Zvcm1zIGFsbCBvYmplY3Qga2V5cyBmcm9tIHNuYWtlX2Nhc2UgdG8gY2FtZWxDYXNlXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwgPSAob2JqOiB1bmtub3duKTogdW5rbm93biA9PiB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgb2JqID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkge1xuICAgIHJldHVybiBvYmoubWFwKCh2YWwpID0+IHRyYW5zZm9ybVNuYWtlVG9DYW1lbCh2YWwpKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgY29uc3QgY2FtZWxLZXkgPSB0b0NhbWVsQ2FzZShrZXkpO1xuICAgICAgcmVzdWx0W2NhbWVsS2V5XSA9IHRyYW5zZm9ybVNuYWtlVG9DYW1lbCh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYW5zZm9ybXMgYWxsIG9iamVjdCBrZXlzIGZyb20gY2FtZWxDYXNlIHRvIHNuYWtlX2Nhc2VcbiAqL1xuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybUNhbWVsVG9TbmFrZSA9IChvYmo6IHVua25vd24pOiB1bmtub3duID0+IHtcbiAgaWYgKG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheShvYmopKSB7XG4gICAgcmV0dXJuIG9iai5tYXAodHJhbnNmb3JtQ2FtZWxUb1NuYWtlKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSBcIm9iamVjdFwiKSB7XG4gICAgY29uc3QgcmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMob2JqKSkge1xuICAgICAgY29uc3Qgc25ha2VLZXkgPSB0b1NuYWtlQ2FzZShrZXkpO1xuICAgICAgcmVzdWx0W3NuYWtlS2V5XSA9IHRyYW5zZm9ybUNhbWVsVG9TbmFrZSh2YWx1ZSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuIiwiaW1wb3J0IHsgRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzIH0gZnJvbSAnQHNwaWZmeS1haS9jb21tZXJjZS1hcGktY2xpZW50JztcblxuLyoqXG4gKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cyBlbnVtIHZhbHVlLlxuICpcbiAqIEBwYXJhbSBzdGF0dXMgLSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuXG4gKlxuICogQHJldHVybnMgVGhlIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cyBlbnVtIHZhbHVlIG9yIHVuZGVmaW5lZCBpZiB0aGUgc3RyaW5nXG4gKiBkb2VzIG5vdCBtYXAgdG8gYSB2YWxpZCBlbnVtXG4gKi9cbmV4cG9ydCBjb25zdCBzdHJpbmdUb0Z1bGZpbGxtZW50RGlzcGxheVN0YXR1c0VudW1WYWx1ZSA9IChcbiAgc3RhdHVzOiBzdHJpbmcsXG4pOiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMgfCB1bmRlZmluZWQgPT4ge1xuICBzd2l0Y2ggKHN0YXR1cykge1xuICAgIGNhc2UgJ0FUVEVNUFRFRF9ERUxJVkVSWSc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkFUVEVNUFRFRF9ERUxJVkVSWTtcbiAgICBjYXNlICdDQU5DRUxFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkNBTkNFTEVEO1xuICAgIGNhc2UgJ0NPTkZJUk1FRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkNPTkZJUk1FRDtcbiAgICBjYXNlICdERUxJVkVSRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5ERUxJVkVSRUQ7XG4gICAgY2FzZSAnRkFJTFVSRSc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkZBSUxVUkU7XG4gICAgY2FzZSAnRlVMRklMTEVEJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuRlVMRklMTEVEO1xuICAgIGNhc2UgJ0lOX1RSQU5TSVQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5JTl9UUkFOU0lUO1xuICAgIGNhc2UgJ0xBQkVMX1BSSU5URUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5MQUJFTF9QUklOVEVEO1xuICAgIGNhc2UgJ0xBQkVMX1BVUkNIQVNFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLkxBQkVMX1BVUkNIQVNFRDtcbiAgICBjYXNlICdMQUJFTF9WT0lERUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5MQUJFTF9WT0lERUQ7XG4gICAgY2FzZSAnTUFSS0VEX0FTX0ZVTEZJTExFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLk1BUktFRF9BU19GVUxGSUxMRUQ7XG4gICAgY2FzZSAnTk9UX0RFTElWRVJFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLk5PVF9ERUxJVkVSRUQ7XG4gICAgY2FzZSAnT1VUX0ZPUl9ERUxJVkVSWSc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLk9VVF9GT1JfREVMSVZFUlk7XG4gICAgY2FzZSAnUElDS0VEX1VQJzpcbiAgICAgIHJldHVybiBGdWxmaWxsbWVudERpc3BsYXlTdGF0dXMuUElDS0VEX1VQO1xuICAgIGNhc2UgJ1JFQURZX0ZPUl9QSUNLVVAnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5SRUFEWV9GT1JfUElDS1VQO1xuICAgIGNhc2UgJ1NVQk1JVFRFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLlNVQk1JVFRFRDtcbiAgICBjYXNlICdJTl9QUk9HUkVTUyc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLklOX1BST0dSRVNTO1xuICAgIGNhc2UgJ09OX0hPTEQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5PTl9IT0xEO1xuICAgIGNhc2UgJ09QRU4nOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5PUEVOO1xuICAgIGNhc2UgJ1BBUlRJQUxMWV9GVUxGSUxMRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5QQVJUSUFMTFlfRlVMRklMTEVEO1xuICAgIGNhc2UgJ1BFTkRJTkdfRlVMRklMTE1FTlQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5QRU5ESU5HX0ZVTEZJTExNRU5UO1xuICAgIGNhc2UgJ1JFUVVFU1RfREVDTElORUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5SRVFVRVNUX0RFQ0xJTkVEO1xuICAgIGNhc2UgJ1JFU1RPQ0tFRCc6XG4gICAgICByZXR1cm4gRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzLlJFU1RPQ0tFRDtcbiAgICBjYXNlICdTQ0hFRFVMRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5TQ0hFRFVMRUQ7XG4gICAgY2FzZSAnVU5GVUxGSUxMRUQnOlxuICAgICAgcmV0dXJuIEZ1bGZpbGxtZW50RGlzcGxheVN0YXR1cy5VTkZVTEZJTExFRDtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTtcbiIsImltcG9ydCB7IENvbG9yTWFwcGluZywgQ29sb3JOYW1lcyB9IGZyb20gXCJzcmMvYXBwbGljYXRpb24vbW9kZWxzL2NvbG9yc0NvbmZpZ1wiO1xuaW1wb3J0IHsgaXNHcmFwaFFMQ29sb3JzQ29uZmlnIH0gZnJvbSBcInNyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2dyYXBoUUwvaXNHcmFwaFFMQ29sb3JzQ29uZmlnXCI7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUdyYXBoUUxDb2xvcnNDb25maWcgPSAoXG4gIGRhdGE6IHVua25vd25cbik6IENvbG9yTWFwcGluZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNHcmFwaFFMQ29sb3JzQ29uZmlnKGRhdGEpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTtcbiIsImVudW0gRE9NSW5zZXJ0aW9uVHlwZSB7XG4gIEFGVEVSID0gXCJhZnRlclwiLFxuICBCRUZPUkUgPSBcImJlZm9yZVwiLFxuICBBREpBQ0VOVF9BRlRFUl9CRUdJTiA9IFwiYWRqYWNlbnQtYWZ0ZXItYmVnaW5cIixcbiAgQURKQUNFTlRfQkVGT1JFX0JFR0lOID0gXCJhZGphY2VudC1iZWZvcmUtYmVnaW5cIixcbiAgQURKQUNFTlRfQUZURVJfRU5EID0gXCJhZGphY2VudC1hZnRlci1lbmRcIixcbiAgQURKQUNFTlRfQkVGT1JFX0VORCA9IFwiYWRqYWNlbnQtYmVmb3JlLWVuZFwiLFxuICBBUFBFTkRfQ0hJTEQgPSBcImFwcGVuZC1jaGlsZFwiLFxuICBOT05FID0gXCJub25lXCIsXG59XG5cbmV4cG9ydCBjb25zdCBET01JbnNlcnRpb25UeXBlVG9JbnNlcnRQb3NpdGlvbiA9IChcbiAgdHlwZTogRE9NSW5zZXJ0aW9uVHlwZVxuKTogSW5zZXJ0UG9zaXRpb24gPT4ge1xuICBzd2l0Y2ggKHR5cGUpIHtcbiAgICBjYXNlIERPTUluc2VydGlvblR5cGUuQURKQUNFTlRfQUZURVJfQkVHSU46XG4gICAgICByZXR1cm4gXCJhZnRlcmJlZ2luXCI7XG4gICAgY2FzZSBET01JbnNlcnRpb25UeXBlLkJFRk9SRTpcbiAgICBjYXNlIERPTUluc2VydGlvblR5cGUuQURKQUNFTlRfQkVGT1JFX0JFR0lOOlxuICAgICAgcmV0dXJuIFwiYmVmb3JlYmVnaW5cIjtcbiAgICBjYXNlIERPTUluc2VydGlvblR5cGUuQURKQUNFTlRfQkVGT1JFX0VORDpcbiAgICAgIHJldHVybiBcImJlZm9yZWVuZFwiO1xuICAgIGNhc2UgRE9NSW5zZXJ0aW9uVHlwZS5BRlRFUjpcbiAgICBjYXNlIERPTUluc2VydGlvblR5cGUuQURKQUNFTlRfQUZURVJfRU5EOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gXCJhZnRlcmVuZFwiO1xuICB9XG59O1xuXG5leHBvcnQgeyBET01JbnNlcnRpb25UeXBlIH07XG4iLCJlbnVtIEdyaWRJbnNlcnRpb25UeXBlIHtcbiAgRklYRURfMSA9IFwiZml4ZWQtMVwiLFxuICBGSVhFRF8yID0gXCJmaXhlZC0yXCIsXG4gIEZJWEVEXzMgPSBcImZpeGVkLTNcIixcbiAgRklYRURfNCA9IFwiZml4ZWQtNFwiLFxuICBGSVhFRF81ID0gXCJmaXhlZC01XCIsXG4gIEZJWEVEXzYgPSBcImZpeGVkLTZcIixcbiAgRklYRURfNyA9IFwiZml4ZWQtN1wiLFxuICBGSVhFRF84ID0gXCJmaXhlZC04XCIsXG4gIEZJWEVEXzkgPSBcImZpeGVkLTlcIixcbiAgRklYRURfMTIgPSBcImZpeGVkLTEyXCIsXG4gIEZJWEVEXzEzID0gXCJmaXhlZC0xM1wiLFxuICBST1dfMSA9IFwicm93LTFcIixcbiAgUk9XXzIgPSBcInJvdy0yXCIsXG4gIFJPV18zID0gXCJyb3ctM1wiLFxuICBST1dfNCA9IFwicm93LTRcIixcbn1cblxuZXhwb3J0IHsgR3JpZEluc2VydGlvblR5cGUgfTtcbiIsImltcG9ydCB7IEZyb250ZW5kQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9mcm9udGVuZENvbmZpZyc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL3V0aWxzL3NuYWtlVG9DYW1lbFRyYW5zZm9ybWVyJztcbmltcG9ydCB7XG4gIFdpZGdldENvbmZpZyxcbiAgUGFnZVZhcmlhbnRDb25maWcsXG4gIFBhZ2VWYXJpYW50VGVzdFR5cGUsXG4gIFdpZGdldE1vdW50aW5nQ29uZmlnLFxufSBmcm9tICdzcmMvY29udGV4dHMvdHlwZXMnO1xuaW1wb3J0IHsgRE9NSW5zZXJ0aW9uVHlwZSB9IGZyb20gJ3NyYy9tZXJjaGFudHMvZG9tSW5zZXJ0aW9uJztcbmltcG9ydCB7IEdyaWRJbnNlcnRpb25UeXBlIH0gZnJvbSAnc3JjL21lcmNoYW50cy9ncmlkSW5zZXJ0aW9uJztcbmltcG9ydCBMb2dnZXIgZnJvbSAnc3JjL2FwcGxpY2F0aW9uL2xvZ2dpbmcvbG9nZ2VyJztcblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIHZhbGlkYXRlIGFuZCB0cmFuc2Zvcm0gUGFnZVZhcmlhbnRRdWVyeURhdGEgdG8gUGFnZVZhcmlhbnRDb25maWdcbmV4cG9ydCBjb25zdCB2YWxpZGF0ZUFuZFRyYW5zZm9ybVBhZ2VWYXJpYW50cyA9IChcbiAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbik6IFBhZ2VWYXJpYW50Q29uZmlnID0+IHtcbiAgY29uc3QgdHJhbnNmb3JtZWQgPSB0cmFuc2Zvcm1TbmFrZVRvQ2FtZWwoY29uZmlnKSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICBjb25zdCB7IHZhcmlhbnRDaGVja3MsIHdpZGdldE1vdW50aW5nLCAuLi5yZXN0IH0gPSB0cmFuc2Zvcm1lZDtcblxuICAvLyBDb252ZXJ0IHZhcmlhbnRDaGVja3MgdG8gdmFyaWFudFRlc3RzIHdpdGggdGVzdFR5cGUgbm9ybWFsaXphdGlvblxuICBjb25zdCB2YXJpYW50VGVzdHMgPSBBcnJheS5pc0FycmF5KHZhcmlhbnRDaGVja3MpXG4gICAgPyB2YXJpYW50Q2hlY2tzLm1hcCgoeyBjaGVja1R5cGUsIC4uLnJlc3RDaGVjayB9KSA9PiAoe1xuICAgICAgICAuLi5yZXN0Q2hlY2ssXG4gICAgICAgIHRlc3RUeXBlOiBjaGVja1R5cGUsXG4gICAgICB9KSlcbiAgICA6IFtdO1xuXG4gIC8vIE5vcm1hbGl6ZSB3aWRnZXRNb3VudGluZzogY2hlY2tzIC0+IHRlc3RzLCBjaGVja1R5cGUgLT4gdGVzdFR5cGVcbiAgY29uc3Qgbm9ybWFsaXplZFdpZGdldE1vdW50aW5nID0gQXJyYXkuaXNBcnJheSh3aWRnZXRNb3VudGluZylcbiAgICA/IHdpZGdldE1vdW50aW5nLm1hcCgoeyBtb3VudGluZ1BvaW50V2lkZ2V0cywgLi4ucmVzdE1vdW50aW5nIH0pID0+ICh7XG4gICAgICAgIC4uLnJlc3RNb3VudGluZyxcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkobW91bnRpbmdQb2ludFdpZGdldHMpXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIG1vdW50aW5nUG9pbnRXaWRnZXRzOiBtb3VudGluZ1BvaW50V2lkZ2V0cy5tYXAoKHsgY2hlY2tzLCAuLi5yZXN0V2lkZ2V0IH0pID0+ICh7XG4gICAgICAgICAgICAgICAgLi4ucmVzdFdpZGdldCxcbiAgICAgICAgICAgICAgICB0ZXN0czogQXJyYXkuaXNBcnJheShjaGVja3MpXG4gICAgICAgICAgICAgICAgICA/IGNoZWNrcy5tYXAoKHsgY2hlY2tUeXBlLCAuLi5yZXN0Q2hlY2sgfSkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAuLi5yZXN0Q2hlY2ssXG4gICAgICAgICAgICAgICAgICAgICAgdGVzdFR5cGU6IGNoZWNrVHlwZSxcbiAgICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICA6IFtdLFxuICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICB9KSlcbiAgICA6IFtdO1xuXG4gIGNvbnN0IG5vcm1hbGl6ZWRDb25maWc6IFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge1xuICAgIC4uLnJlc3QsXG4gICAgLi4uKHZhcmlhbnRUZXN0cyA/IHsgdmFyaWFudFRlc3RzIH0gOiB7fSksXG4gICAgLi4uKG5vcm1hbGl6ZWRXaWRnZXRNb3VudGluZyA/IHsgd2lkZ2V0TW91bnRpbmc6IG5vcm1hbGl6ZWRXaWRnZXRNb3VudGluZyB9IDoge30pLFxuICB9O1xuXG4gIGNvbnN0IHZhcmlhbnRJZCA9IG5vcm1hbGl6ZWRDb25maWcudmFyaWFudElkIGFzIHN0cmluZztcbiAgY29uc3QgdmFyaWFudFR5cGUgPSBub3JtYWxpemVkQ29uZmlnLnZhcmlhbnRUeXBlIGFzIHN0cmluZztcblxuICBpZiAodHlwZW9mIHZhcmlhbnRJZCAhPT0gJ3N0cmluZycgfHwgIXZhcmlhbnRJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHZhcmlhbnRJZCBmb3IgcGFnZVZhcmlhbnRgKTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFyaWFudFR5cGUgIT09ICdzdHJpbmcnIHx8ICF2YXJpYW50VHlwZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHZhcmlhbnRUeXBlIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9J2ApO1xuICB9XG5cbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhcmlhbnRUZXN0cykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgTWlzc2luZyBvciBpbnZhbGlkIHZhcmlhbnRUZXN0cyBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfScuIE11c3QgYmUgYW4gYXJyYXlgLFxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IHRlc3Qgb2YgdmFyaWFudFRlc3RzKSB7XG4gICAgaWYgKCF0ZXN0LnRlc3RUeXBlIHx8IHR5cGVvZiB0ZXN0LnRlc3RUeXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhcmlhbnRUZXN0LnRlc3RUeXBlIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9J2ApO1xuICAgIH1cbiAgICBpZiAoIU9iamVjdC52YWx1ZXMoUGFnZVZhcmlhbnRUZXN0VHlwZSkuaW5jbHVkZXModGVzdC50ZXN0VHlwZSBhcyBQYWdlVmFyaWFudFRlc3RUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCB0ZXN0VHlwZSAnJHt0ZXN0LnRlc3RUeXBlfScgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nLiBWYWxpZCB0eXBlczogJHtPYmplY3QudmFsdWVzKFxuICAgICAgICAgIFBhZ2VWYXJpYW50VGVzdFR5cGUsXG4gICAgICAgICkuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIUFycmF5LmlzQXJyYXkobm9ybWFsaXplZFdpZGdldE1vdW50aW5nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNaXNzaW5nIG9yIGludmFsaWQgd2lkZ2V0TW91bnRpbmcgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nLiBNdXN0IGJlIGFuIGFycmF5YCxcbiAgICApO1xuICB9XG5cbiAgZm9yIChjb25zdCBtb3VudGluZyBvZiBub3JtYWxpemVkV2lkZ2V0TW91bnRpbmcpIHtcbiAgICBpZiAodHlwZW9mIG1vdW50aW5nLm1vdW50aW5nQ29uZmlnSWQgIT09ICdzdHJpbmcnIHx8ICFtb3VudGluZy5tb3VudGluZ0NvbmZpZ0lkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgbW91bnRpbmdDb25maWdJZCBpbiB3aWRnZXRNb3VudGluZyBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgICB9XG5cbiAgICBpZiAobW91bnRpbmcud2lkZ2V0Q29uZmlnSWQgJiYgdHlwZW9mIG1vdW50aW5nLndpZGdldENvbmZpZ0lkICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHdpZGdldENvbmZpZ0lkIGluIHdpZGdldE1vdW50aW5nIGZvciBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9J2ApO1xuICAgIH1cblxuICAgIGlmIChtb3VudGluZy5tb3VudGluZ1BvaW50V2lkZ2V0cykge1xuICAgICAgZm9yIChjb25zdCB3aWRnZXQgb2YgbW91bnRpbmcubW91bnRpbmdQb2ludFdpZGdldHMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aWRnZXQud2lkZ2V0Q29uZmlnSWQgIT09ICdzdHJpbmcnIHx8ICF3aWRnZXQud2lkZ2V0Q29uZmlnSWQpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgSW52YWxpZCB3aWRnZXRDb25maWdJZCBpbiBtb3VudGluZ1BvaW50V2lkZ2V0cyBmb3IgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkod2lkZ2V0LnRlc3RzKSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBJbnZhbGlkIG9yIG1pc3NpbmcgdGVzdHMgaW4gbW91bnRpbmdQb2ludFdpZGdldHMgZm9yIHBhZ2VWYXJpYW50ICcke3ZhcmlhbnRJZH0nYCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHZhcmlhbnRUeXBlID09PSAncGxwJykge1xuICAgIGlmICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5wbHBJZEV4dHJhY3RvciAhPT0gJ3N0cmluZycgfHwgIW5vcm1hbGl6ZWRDb25maWcucGxwSWRFeHRyYWN0b3IpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHBscElkRXh0cmFjdG9yIGZvciBQTFAgcGFnZVZhcmlhbnQgJyR7dmFyaWFudElkfSdgKTtcbiAgICB9XG4gIH1cblxuICBpZiAodmFyaWFudFR5cGUgPT09ICdwZHAnKSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcucHJvZHVjdElkRXh0cmFjdG9yICE9PSAnc3RyaW5nJyB8fFxuICAgICAgIW5vcm1hbGl6ZWRDb25maWcucHJvZHVjdElkRXh0cmFjdG9yXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCBwcm9kdWN0SWRFeHRyYWN0b3IgZm9yIFBEUCBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9J2ApO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBub3JtYWxpemVkQ29uZmlnLnBhcmVudFByb2R1Y3RJZEV4dHJhY3RvciAmJlxuICAgICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcucGFyZW50UHJvZHVjdElkRXh0cmFjdG9yICE9PSAnc3RyaW5nJ1xuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgSW52YWxpZCBwYXJlbnRQcm9kdWN0SWRFeHRyYWN0b3IgZm9yIFBEUCBwYWdlVmFyaWFudCAnJHt2YXJpYW50SWR9Jy4gTXVzdCBiZSBzdHJpbmcgaWYgcHJvdmlkZWRgLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbm9ybWFsaXplZENvbmZpZyBhcyBQYWdlVmFyaWFudENvbmZpZztcbn07XG5cbi8vIEhlbHBlciBmdW5jdGlvbiB0byB2YWxpZGF0ZSBhbmQgdHJhbnNmb3JtIE1vdW50aW5nQ29uZmlnUXVlcnlEYXRhIHRvIFdpZGdldE1vdW50aW5nQ29uZmlnXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBbmRUcmFuc2Zvcm1Nb3VudGluZ0NvbmZpZyA9IChcbiAgY29uZmlnOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgY29uZmlnS2V5OiBzdHJpbmcsXG4pOiBXaWRnZXRNb3VudGluZ0NvbmZpZyA9PiB7XG4gIC8vIFJFTkFNSU5HIExPR0lDOiBDb252ZXJ0IGJhY2tlbmQgXCJDaGVja1wiIHRlcm1pbm9sb2d5IHRvIGZyb250ZW5kIFwiVGVzdFwiIHRlcm1pbm9sb2d5XG4gIGNvbnN0IG5vcm1hbGl6ZWRDb25maWcgPSB7IC4uLmNvbmZpZyB9O1xuXG4gIC8vIENvbnZlcnQgY2hlY2tJZCB0byB0ZXN0SWQgZm9yIGZyb250ZW5kIGNvbXBhdGliaWxpdHkgKGRhdGEgaXMgYWxyZWFkeSBjYW1lbENhc2UpXG4gIGlmIChub3JtYWxpemVkQ29uZmlnLmNoZWNrSWQgJiYgIW5vcm1hbGl6ZWRDb25maWcudGVzdElkKSB7XG4gICAgbm9ybWFsaXplZENvbmZpZy50ZXN0SWQgPSBub3JtYWxpemVkQ29uZmlnLmNoZWNrSWQ7XG4gICAgZGVsZXRlIG5vcm1hbGl6ZWRDb25maWcuY2hlY2tJZDtcbiAgfVxuXG4gIC8vIFJlcXVpcmVkIGZpZWxkcyAtIHRoZXNlIG11c3QgYmUgcHJlc2VudCBhbmQgdmFsaWRcbiAgaWYgKHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLm1vdW50aW5nQ29uZmlnSWQgIT09ICdzdHJpbmcnIHx8ICFub3JtYWxpemVkQ29uZmlnLm1vdW50aW5nQ29uZmlnSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCBtb3VudGluZ0NvbmZpZ0lkIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuICBpZiAodHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuY29udGFpbmVySWQgIT09ICdzdHJpbmcnIHx8ICFub3JtYWxpemVkQ29uZmlnLmNvbnRhaW5lcklkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgY29udGFpbmVySWQgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICB9XG4gIGlmICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy50ZXN0SWQgIT09ICdzdHJpbmcnIHx8ICFub3JtYWxpemVkQ29uZmlnLnRlc3RJZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIHRlc3RJZCBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gIH1cblxuICAvLyBSZXF1aXJlZCBpbnNlcnRpb25Qb2ludFxuICBpZiAoXG4gICAgIW5vcm1hbGl6ZWRDb25maWcuaW5zZXJ0aW9uUG9pbnQgfHxcbiAgICB0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5pbnNlcnRpb25Qb2ludCAhPT0gJ29iamVjdCcgfHxcbiAgICBBcnJheS5pc0FycmF5KG5vcm1hbGl6ZWRDb25maWcuaW5zZXJ0aW9uUG9pbnQpXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTWlzc2luZyBvciBpbnZhbGlkIGluc2VydGlvblBvaW50IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuXG4gIGNvbnN0IGluc2VydGlvblBvaW50ID0gbm9ybWFsaXplZENvbmZpZy5pbnNlcnRpb25Qb2ludCBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblxuICAvLyBWYWxpZGF0ZSBpbnNlcnRpb25Qb2ludCByZXF1aXJlZCBmaWVsZHNcbiAgaWYgKHR5cGVvZiBpbnNlcnRpb25Qb2ludC5zZWxlY3RvciAhPT0gJ3N0cmluZycgfHwgIWluc2VydGlvblBvaW50LnNlbGVjdG9yKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgaW5zZXJ0aW9uUG9pbnQuc2VsZWN0b3IgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICB9XG4gIGlmICh0eXBlb2YgaW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSAhPT0gJ3N0cmluZycgfHwgIWluc2VydGlvblBvaW50Lmluc2VydGlvblR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCBpbnNlcnRpb25Qb2ludC5pbnNlcnRpb25UeXBlIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIGluc2VydGlvblR5cGUgaXMgYSB2YWxpZCBET01JbnNlcnRpb25UeXBlXG4gIGlmICghT2JqZWN0LnZhbHVlcyhET01JbnNlcnRpb25UeXBlKS5pbmNsdWRlcyhpbnNlcnRpb25Qb2ludC5pbnNlcnRpb25UeXBlIGFzIERPTUluc2VydGlvblR5cGUpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgaW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSAnJHtpbnNlcnRpb25Qb2ludC5pbnNlcnRpb25UeXBlfScgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gVmFsaWQgdHlwZXM6ICR7T2JqZWN0LnZhbHVlcyhET01JbnNlcnRpb25UeXBlKS5qb2luKCcsICcpfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIG9wdGlvbmFsIGluc2VydGlvblBvaW50IGZpZWxkc1xuICBpZiAoaW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXggIT0gbnVsbCAmJiB0eXBlb2YgaW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXggIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgaW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXggZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIG51bWJlciBvciBudWxsL3VuZGVmaW5lZGAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIG9wdGlvbmFsIHBhcmVudEluc2VydGlvblBvaW50IGlmIHByZXNlbnRcbiAgbGV0IHBhcmVudEluc2VydGlvblBvaW50O1xuICBpZiAobm9ybWFsaXplZENvbmZpZy5wYXJlbnRJbnNlcnRpb25Qb2ludCkge1xuICAgIGlmIChcbiAgICAgIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLnBhcmVudEluc2VydGlvblBvaW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgQXJyYXkuaXNBcnJheShub3JtYWxpemVkQ29uZmlnLnBhcmVudEluc2VydGlvblBvaW50KVxuICAgICkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHBhcmVudEluc2VydGlvblBvaW50IGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYW4gb2JqZWN0YCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyZW50UG9pbnQgPSBub3JtYWxpemVkQ29uZmlnLnBhcmVudEluc2VydGlvblBvaW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmICh0eXBlb2YgcGFyZW50UG9pbnQuc2VsZWN0b3IgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnRQb2ludC5zZWxlY3Rvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgcGFyZW50SW5zZXJ0aW9uUG9pbnQuc2VsZWN0b3IgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHBhcmVudFBvaW50Lmluc2VydGlvblR5cGUgIT09ICdzdHJpbmcnIHx8ICFwYXJlbnRQb2ludC5pbnNlcnRpb25UeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNaXNzaW5nIG9yIGludmFsaWQgcGFyZW50SW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFPYmplY3QudmFsdWVzKERPTUluc2VydGlvblR5cGUpLmluY2x1ZGVzKHBhcmVudFBvaW50Lmluc2VydGlvblR5cGUgYXMgRE9NSW5zZXJ0aW9uVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgcGFyZW50SW5zZXJ0aW9uUG9pbnQuaW5zZXJ0aW9uVHlwZSAnJHtwYXJlbnRQb2ludC5pbnNlcnRpb25UeXBlfScgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gVmFsaWQgdHlwZXM6ICR7T2JqZWN0LnZhbHVlcyhET01JbnNlcnRpb25UeXBlKS5qb2luKCcsICcpfWAsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChwYXJlbnRQb2ludC5zZWxlY3Rpb25JbmRleCAhPSBudWxsICYmIHR5cGVvZiBwYXJlbnRQb2ludC5zZWxlY3Rpb25JbmRleCAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgcGFyZW50SW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXggZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIG51bWJlciBvciBudWxsL3VuZGVmaW5lZGAsXG4gICAgICApO1xuICAgIH1cblxuICAgIHBhcmVudEluc2VydGlvblBvaW50ID0ge1xuICAgICAgc2VsZWN0b3I6IHBhcmVudFBvaW50LnNlbGVjdG9yLFxuICAgICAgaW5zZXJ0aW9uVHlwZTogcGFyZW50UG9pbnQuaW5zZXJ0aW9uVHlwZSBhcyBET01JbnNlcnRpb25UeXBlLFxuICAgICAgc2VsZWN0aW9uSW5kZXg6IHBhcmVudFBvaW50LnNlbGVjdGlvbkluZGV4IGFzIG51bWJlciB8IHVuZGVmaW5lZCxcbiAgICB9O1xuICB9XG5cbiAgLy8gVmFsaWRhdGUgb3B0aW9uYWwgd3JhcHBpbmdFbGVtZW50IGlmIHByZXNlbnRcbiAgbGV0IHdyYXBwaW5nRWxlbWVudDtcbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcud3JhcHBpbmdFbGVtZW50KSB7XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcud3JhcHBpbmdFbGVtZW50ICE9PSAnb2JqZWN0JyB8fFxuICAgICAgQXJyYXkuaXNBcnJheShub3JtYWxpemVkQ29uZmlnLndyYXBwaW5nRWxlbWVudClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCB3cmFwcGluZ0VsZW1lbnQgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhbiBvYmplY3RgKTtcbiAgICB9XG5cbiAgICBjb25zdCB3cmFwcGluZyA9IG5vcm1hbGl6ZWRDb25maWcud3JhcHBpbmdFbGVtZW50IGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICAgIGlmICh0eXBlb2Ygd3JhcHBpbmcuY2xhc3NOYW1lICE9PSAnc3RyaW5nJyB8fCAhd3JhcHBpbmcuY2xhc3NOYW1lKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB3cmFwcGluZ0VsZW1lbnQuY2xhc3NOYW1lIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fSdgKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB3cmFwcGluZy5lbGVtZW50ICE9PSAnc3RyaW5nJyB8fCAhd3JhcHBpbmcuZWxlbWVudCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgd3JhcHBpbmdFbGVtZW50LmVsZW1lbnQgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHdyYXBwaW5nLmluc2VydGlvblR5cGUgIT09ICdzdHJpbmcnIHx8ICF3cmFwcGluZy5pbnNlcnRpb25UeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB3cmFwcGluZ0VsZW1lbnQuaW5zZXJ0aW9uVHlwZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nYCk7XG4gICAgfVxuXG4gICAgaWYgKCFPYmplY3QudmFsdWVzKERPTUluc2VydGlvblR5cGUpLmluY2x1ZGVzKHdyYXBwaW5nLmluc2VydGlvblR5cGUgYXMgRE9NSW5zZXJ0aW9uVHlwZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgd3JhcHBpbmdFbGVtZW50Lmluc2VydGlvblR5cGUgJyR7d3JhcHBpbmcuaW5zZXJ0aW9uVHlwZX0nIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoRE9NSW5zZXJ0aW9uVHlwZSkuam9pbignLCAnKX1gLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICB3cmFwcGluZ0VsZW1lbnQgPSB7XG4gICAgICBjbGFzc05hbWU6IHdyYXBwaW5nLmNsYXNzTmFtZSxcbiAgICAgIGVsZW1lbnQ6IHdyYXBwaW5nLmVsZW1lbnQsXG4gICAgICBpbnNlcnRpb25UeXBlOiB3cmFwcGluZy5pbnNlcnRpb25UeXBlIGFzIERPTUluc2VydGlvblR5cGUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIG9wdGlvbmFsIGZpZWxkc1xuICBpZiAoXG4gICAgbm9ybWFsaXplZENvbmZpZy5kaXZDaGVja1NlbGVjdG9yICE9IG51bGwgJiZcbiAgICB0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5kaXZDaGVja1NlbGVjdG9yICE9PSAnc3RyaW5nJ1xuICApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBkaXZDaGVja1NlbGVjdG9yIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYSBzdHJpbmcgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICk7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuY2xhc3NOYW1lICE9IG51bGwgJiYgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuY2xhc3NOYW1lICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGNsYXNzTmFtZSBmb3IgY29uZmlnICcke2NvbmZpZ0tleX0nLiBNdXN0IGJlIGEgc3RyaW5nIG9yIG51bGwvdW5kZWZpbmVkYCxcbiAgICApO1xuICB9XG4gIGlmIChcbiAgICBub3JtYWxpemVkQ29uZmlnLnN1cHByZXNzaW9uU2VsZWN0b3IgIT0gbnVsbCAmJlxuICAgIHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLnN1cHByZXNzaW9uU2VsZWN0b3IgIT09ICdzdHJpbmcnXG4gICkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIHN1cHByZXNzaW9uU2VsZWN0b3IgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZGAsXG4gICAgKTtcbiAgfVxuICBpZiAoXG4gICAgbm9ybWFsaXplZENvbmZpZy5kYXRhQXR0cmlidXRlcyAhPSBudWxsICYmXG4gICAgKHR5cGVvZiBub3JtYWxpemVkQ29uZmlnLmRhdGFBdHRyaWJ1dGVzICE9PSAnb2JqZWN0JyB8fFxuICAgICAgQXJyYXkuaXNBcnJheShub3JtYWxpemVkQ29uZmlnLmRhdGFBdHRyaWJ1dGVzKSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEludmFsaWQgZGF0YUF0dHJpYnV0ZXMgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhbiBvYmplY3Qgb3IgbnVsbC91bmRlZmluZWRgLFxuICAgICk7XG4gIH1cbiAgaWYgKFxuICAgIG5vcm1hbGl6ZWRDb25maWcuc3R5bGUgIT0gbnVsbCAmJlxuICAgICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5zdHlsZSAhPT0gJ29iamVjdCcgfHwgQXJyYXkuaXNBcnJheShub3JtYWxpemVkQ29uZmlnLnN0eWxlKSlcbiAgKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHN0eWxlIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIE11c3QgYmUgYW4gb2JqZWN0IG9yIG51bGwvdW5kZWZpbmVkYCk7XG4gIH1cblxuICAvLyBWYWxpZGF0ZSBncmlkSW5zZXJ0aW9uVHlwZSBpZiBwcmVzZW50XG4gIGxldCBncmlkSW5zZXJ0aW9uVHlwZTtcbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuZ3JpZEluc2VydGlvblR5cGUpIHtcbiAgICBpZiAoXG4gICAgICB0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy5ncmlkSW5zZXJ0aW9uVHlwZSAhPT0gJ3N0cmluZycgfHxcbiAgICAgICFub3JtYWxpemVkQ29uZmlnLmdyaWRJbnNlcnRpb25UeXBlXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZ3JpZEluc2VydGlvblR5cGUgZm9yIGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIHN0cmluZ2ApO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgICFPYmplY3QudmFsdWVzKEdyaWRJbnNlcnRpb25UeXBlKS5pbmNsdWRlcyhcbiAgICAgICAgbm9ybWFsaXplZENvbmZpZy5ncmlkSW5zZXJ0aW9uVHlwZSBhcyBHcmlkSW5zZXJ0aW9uVHlwZSxcbiAgICAgIClcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEludmFsaWQgZ3JpZEluc2VydGlvblR5cGUgJyR7bm9ybWFsaXplZENvbmZpZy5ncmlkSW5zZXJ0aW9uVHlwZX0nIGZvciBjb25maWcgJyR7Y29uZmlnS2V5fScuIFZhbGlkIHR5cGVzOiAke09iamVjdC52YWx1ZXMoR3JpZEluc2VydGlvblR5cGUpLmpvaW4oJywgJyl9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGdyaWRJbnNlcnRpb25UeXBlID0gbm9ybWFsaXplZENvbmZpZy5ncmlkSW5zZXJ0aW9uVHlwZSBhcyBHcmlkSW5zZXJ0aW9uVHlwZTtcbiAgfVxuXG4gIC8vIEJ1aWxkIHRoZSByZXR1cm4gb2JqZWN0LCBvbmx5IGluY2x1ZGluZyBvcHRpb25hbCBmaWVsZHMgaWYgdGhleSBoYXZlIHZhbHVlc1xuICBjb25zdCByZXN1bHQ6IFdpZGdldE1vdW50aW5nQ29uZmlnID0ge1xuICAgIG1vdW50aW5nQ29uZmlnSWQ6IG5vcm1hbGl6ZWRDb25maWcubW91bnRpbmdDb25maWdJZCxcbiAgICBjb250YWluZXJJZDogbm9ybWFsaXplZENvbmZpZy5jb250YWluZXJJZCxcbiAgICB0ZXN0SWQ6IG5vcm1hbGl6ZWRDb25maWcudGVzdElkLFxuICAgIGluc2VydGlvblBvaW50OiB7XG4gICAgICBzZWxlY3RvcjogaW5zZXJ0aW9uUG9pbnQuc2VsZWN0b3IsXG4gICAgICBpbnNlcnRpb25UeXBlOiBpbnNlcnRpb25Qb2ludC5pbnNlcnRpb25UeXBlIGFzIERPTUluc2VydGlvblR5cGUsXG4gICAgICAuLi4oaW5zZXJ0aW9uUG9pbnQuc2VsZWN0aW9uSW5kZXggIT0gbnVsbCAmJiB7XG4gICAgICAgIHNlbGVjdGlvbkluZGV4OiBpbnNlcnRpb25Qb2ludC5zZWxlY3Rpb25JbmRleCxcbiAgICAgIH0pLFxuICAgIH0sXG4gIH07XG5cbiAgLy8gT25seSBhZGQgb3B0aW9uYWwgZmllbGRzIGlmIHRoZXkgaGF2ZSB2YWx1ZXNcbiAgaWYgKHBhcmVudEluc2VydGlvblBvaW50KSB7XG4gICAgcmVzdWx0LnBhcmVudEluc2VydGlvblBvaW50ID0gcGFyZW50SW5zZXJ0aW9uUG9pbnQ7XG4gIH1cbiAgaWYgKGdyaWRJbnNlcnRpb25UeXBlKSB7XG4gICAgcmVzdWx0LmdyaWRJbnNlcnRpb25UeXBlID0gZ3JpZEluc2VydGlvblR5cGU7XG4gIH1cbiAgaWYgKHdyYXBwaW5nRWxlbWVudCkge1xuICAgIHJlc3VsdC53cmFwcGluZ0VsZW1lbnQgPSB3cmFwcGluZ0VsZW1lbnQ7XG4gIH1cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuZGl2Q2hlY2tTZWxlY3Rvcikge1xuICAgIHJlc3VsdC5kaXZDaGVja1NlbGVjdG9yID0gbm9ybWFsaXplZENvbmZpZy5kaXZDaGVja1NlbGVjdG9yIGFzIHN0cmluZztcbiAgfVxuICBpZiAobm9ybWFsaXplZENvbmZpZy5jbGFzc05hbWUpIHtcbiAgICByZXN1bHQuY2xhc3NOYW1lID0gbm9ybWFsaXplZENvbmZpZy5jbGFzc05hbWUgYXMgc3RyaW5nO1xuICB9XG4gIGlmIChub3JtYWxpemVkQ29uZmlnLnN1cHByZXNzaW9uU2VsZWN0b3IpIHtcbiAgICByZXN1bHQuc3VwcHJlc3Npb25TZWxlY3RvciA9IG5vcm1hbGl6ZWRDb25maWcuc3VwcHJlc3Npb25TZWxlY3RvcjtcbiAgfVxuICBpZiAobm9ybWFsaXplZENvbmZpZy5kYXRhQXR0cmlidXRlcykge1xuICAgIHJlc3VsdC5kYXRhQXR0cmlidXRlcyA9IG5vcm1hbGl6ZWRDb25maWcuZGF0YUF0dHJpYnV0ZXMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPjtcbiAgfVxuICBpZiAobm9ybWFsaXplZENvbmZpZy5zdHlsZSkge1xuICAgIHJlc3VsdC5zdHlsZSA9IG5vcm1hbGl6ZWRDb25maWcuc3R5bGUgYXMgUGFydGlhbDxDU1NTdHlsZURlY2xhcmF0aW9uPjtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gdmFsaWRhdGUgYW5kIHRyYW5zZm9ybSBXaWRnZXRDb25maWdRdWVyeURhdGEgdG8gV2lkZ2V0Q29uZmlnXG5leHBvcnQgY29uc3QgdmFsaWRhdGVBbmRUcmFuc2Zvcm1XaWRnZXRDb25maWcgPSAoXG4gIGNvbmZpZzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gIGNvbmZpZ0tleTogc3RyaW5nLFxuKTogV2lkZ2V0Q29uZmlnID0+IHtcbiAgY29uc3Qgbm9ybWFsaXplZENvbmZpZyA9IHRyYW5zZm9ybVNuYWtlVG9DYW1lbChjb25maWcpIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gIGlmICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy53aWRnZXRDb25maWdJZCAhPT0gJ3N0cmluZycgfHwgIW5vcm1hbGl6ZWRDb25maWcud2lkZ2V0Q29uZmlnSWQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3Npbmcgb3IgaW52YWxpZCB3aWRnZXRDb25maWdJZCBmb3Igd2lkZ2V0IGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICB9XG4gIGlmICh0eXBlb2Ygbm9ybWFsaXplZENvbmZpZy50eXBlICE9PSAnc3RyaW5nJyB8fCAhbm9ybWFsaXplZENvbmZpZy50eXBlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIG9yIGludmFsaWQgdHlwZSBmb3Igd2lkZ2V0IGNvbmZpZyAnJHtjb25maWdLZXl9J2ApO1xuICB9XG5cbiAgaWYgKG5vcm1hbGl6ZWRDb25maWcuY29udGVudElkICE9IG51bGwgJiYgdHlwZW9mIG5vcm1hbGl6ZWRDb25maWcuY29udGVudElkICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGNvbnRlbnRJZCBmb3Igd2lkZ2V0IGNvbmZpZyAnJHtjb25maWdLZXl9Jy4gTXVzdCBiZSBhIHN0cmluZyBvciBudWxsL3VuZGVmaW5lZGAsXG4gICAgKTtcbiAgfVxuXG4gIC8vIE5vdGU6IFdpZGdldCBjb25maWdzIGFyZSBjb21wbGV4IHVuaW9ucyB3aXRoIHR5cGUtc3BlY2lmaWMgcHJvcGVydGllcy5cblxuICAvLyBSZXR1cm4gdGhlIG5vcm1hbGl6ZWQgY29uZmlnIGFzIFdpZGdldENvbmZpZ1xuICAvLyBVc2UgaW50ZXJtZWRpYXRlICd1bmtub3duJyBjYXN0IGZvciBjb21wbGV4IHVuaW9uIHR5cGVzXG4gIHJldHVybiBub3JtYWxpemVkQ29uZmlnIGFzIHVua25vd24gYXMgV2lkZ2V0Q29uZmlnO1xufTtcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlR3JhcGhRTEZyb250ZW5kQ29uZmlnID0gKGRhdGE6IHVua25vd24pOiBGcm9udGVuZENvbmZpZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmIChkYXRhID09PSBudWxsIHx8IGRhdGEgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAodHlwZW9mIGRhdGEgIT09ICdvYmplY3QnIHx8IEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiBub3QgYW4gb2JqZWN0JywgdW5kZWZpbmVkLCB7IGRhdGEgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGNvbnN0IG9iaiA9IGRhdGEgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cbiAgLy8gVmFsaWRhdGUgbWVyY2hhbnRfb3ZlcnJpZGVfY3NzIGlmIHByZXNlbnRcbiAgaWYgKFxuICAgICdtZXJjaGFudF9vdmVycmlkZV9jc3MnIGluIG9iaiAmJlxuICAgIHR5cGVvZiBvYmoubWVyY2hhbnRfb3ZlcnJpZGVfY3NzICE9PSAnc3RyaW5nJyAmJlxuICAgIG9iai5tZXJjaGFudF9vdmVycmlkZV9jc3MgIT09IG51bGxcbiAgKSB7XG4gICAgTG9nZ2VyLmxvZ1dhcm4oXG4gICAgICAnSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiBtZXJjaGFudF9vdmVycmlkZV9jc3MgbXVzdCBiZSBhIHN0cmluZyBvciBudWxsJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgZGF0YSB9LFxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHBhZ2VfdmFyaWFudHMgaWYgcHJlc2VudFxuICBpZiAoJ3BhZ2VfdmFyaWFudHMnIGluIG9iaikge1xuICAgIGlmIChcbiAgICAgIG9iai5wYWdlX3ZhcmlhbnRzICE9PSB1bmRlZmluZWQgJiZcbiAgICAgIG9iai5wYWdlX3ZhcmlhbnRzICE9PSBudWxsICYmXG4gICAgICAhQXJyYXkuaXNBcnJheShvYmoucGFnZV92YXJpYW50cylcbiAgICApIHtcbiAgICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgICAnSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiBwYWdlX3ZhcmlhbnRzIG11c3QgYmUgYW4gYXJyYXkgb3IgbnVsbC91bmRlZmluZWQnLFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHsgZGF0YSB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLy8gVmFsaWRhdGUgbW91bnRpbmdfY29uZmlncyBpZiBwcmVzZW50XG4gIGlmICgnbW91bnRpbmdfY29uZmlncycgaW4gb2JqKSB7XG4gICAgaWYgKFxuICAgICAgb2JqLm1vdW50aW5nX2NvbmZpZ3MgIT09IHVuZGVmaW5lZCAmJlxuICAgICAgb2JqLm1vdW50aW5nX2NvbmZpZ3MgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KG9iai5tb3VudGluZ19jb25maWdzKVxuICAgICkge1xuICAgICAgTG9nZ2VyLmxvZ1dhcm4oXG4gICAgICAgICdJbnZhbGlkIEdyYXBoUUwgZnJvbnRlbmQgY29uZmlnIGRhdGE6IG1vdW50aW5nX2NvbmZpZ3MgbXVzdCBiZSBhbiBhcnJheSBvciBudWxsL3VuZGVmaW5lZCcsXG4gICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgeyBkYXRhIH0sXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cblxuICAvLyBWYWxpZGF0ZSB3aWRnZXRfY29uZmlncyBpZiBwcmVzZW50XG4gIGlmICgnd2lkZ2V0X2NvbmZpZ3MnIGluIG9iaikge1xuICAgIGlmIChcbiAgICAgIG9iai53aWRnZXRfY29uZmlncyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICBvYmoud2lkZ2V0X2NvbmZpZ3MgIT09IG51bGwgJiZcbiAgICAgICFBcnJheS5pc0FycmF5KG9iai53aWRnZXRfY29uZmlncylcbiAgICApIHtcbiAgICAgIExvZ2dlci5sb2dXYXJuKFxuICAgICAgICAnSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiB3aWRnZXRfY29uZmlncyBtdXN0IGJlIGFuIGFycmF5IG9yIG51bGwvdW5kZWZpbmVkJyxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB7IGRhdGEgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIC8vIFZhbGlkYXRlIHVpX2NvbmZpZ3MgaWYgcHJlc2VudFxuICBpZiAoJ3VpX2NvbmZpZ3MnIGluIG9iaiAmJiB0eXBlb2Ygb2JqLnVpX2NvbmZpZ3MgIT09ICdvYmplY3QnICYmIG9iai51aV9jb25maWdzICE9PSBudWxsKSB7XG4gICAgTG9nZ2VyLmxvZ1dhcm4oXG4gICAgICAnSW52YWxpZCBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhOiB1aV9jb25maWdzIG11c3QgYmUgYW4gb2JqZWN0IG9yIG51bGwvdW5kZWZpbmVkJyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHsgZGF0YSB9LFxuICAgICk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gVHJhbnNmb3JtIHRoZSBkYXRhIHRvIGNhbWVsQ2FzZVxuICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRyYW5zZm9ybVNuYWtlVG9DYW1lbChvYmopIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgLy8gQ29udmVydCBwYWdlX3ZhcmlhbnRzIGZyb20gYXJyYXkgdG8gdmFsaWRhdGVkIGFycmF5IGlmIHByZXNlbnRcbiAgICBpZiAodHJhbnNmb3JtZWREYXRhLnBhZ2VWYXJpYW50cyAmJiBBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVkRGF0YS5wYWdlVmFyaWFudHMpKSB7XG4gICAgICBjb25zdCBwYWdlVmFyaWFudHNBcnJheSA9IHRyYW5zZm9ybWVkRGF0YS5wYWdlVmFyaWFudHM7XG4gICAgICBjb25zdCB2YWxpZGF0ZWRQYWdlVmFyaWFudHM6IFBhZ2VWYXJpYW50Q29uZmlnW10gPSBbXTtcblxuICAgICAgZm9yIChjb25zdCB2YXJpYW50IG9mIHBhZ2VWYXJpYW50c0FycmF5KSB7XG4gICAgICAgIGlmICh2YXJpYW50ICYmIHR5cGVvZiB2YXJpYW50ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFyaWFudC52YXJpYW50SWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZFZhcmlhbnQgPSB2YWxpZGF0ZUFuZFRyYW5zZm9ybVBhZ2VWYXJpYW50cyh2YXJpYW50KTtcbiAgICAgICAgICAgIHZhbGlkYXRlZFBhZ2VWYXJpYW50cy5wdXNoKHZhbGlkYXRlZFZhcmlhbnQpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCBwYWdlIHZhcmlhbnQsIHNraXBwaW5nJywgZXJyb3IsIHtcbiAgICAgICAgICAgICAgdmFyaWFudElkOiB2YXJpYW50LnZhcmlhbnRJZCxcbiAgICAgICAgICAgICAgdmFyaWFudCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ29udGludWUgcHJvY2Vzc2luZyBvdGhlciB2YXJpYW50c1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCBwYWdlIHZhcmlhbnQgc3RydWN0dXJlLCBza2lwcGluZycsIHVuZGVmaW5lZCwgeyB2YXJpYW50IH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyYW5zZm9ybWVkRGF0YS5wYWdlVmFyaWFudHMgPSB2YWxpZGF0ZWRQYWdlVmFyaWFudHM7XG4gICAgfVxuXG4gICAgLy8gQ29udmVydCBtb3VudGluZ19jb25maWdzIGZyb20gYXJyYXkgdG8gUmVjb3JkIGlmIHByZXNlbnRcbiAgICBpZiAodHJhbnNmb3JtZWREYXRhLm1vdW50aW5nQ29uZmlncyAmJiBBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVkRGF0YS5tb3VudGluZ0NvbmZpZ3MpKSB7XG4gICAgICBjb25zdCBtb3VudGluZ0NvbmZpZ3NBcnJheSA9IHRyYW5zZm9ybWVkRGF0YS5tb3VudGluZ0NvbmZpZ3MgYXMgQXJyYXk8e1xuICAgICAgICBrZXk6IHN0cmluZztcbiAgICAgICAgY29uZmlnOiB1bmtub3duO1xuICAgICAgfT47XG4gICAgICBjb25zdCBtb3VudGluZ0NvbmZpZ3NSZWNvcmQ6IFJlY29yZDxzdHJpbmcsIFdpZGdldE1vdW50aW5nQ29uZmlnPiA9IHt9O1xuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgbW91bnRpbmdDb25maWdzQXJyYXkpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGl0ZW0gJiZcbiAgICAgICAgICB0eXBlb2YgaXRlbS5rZXkgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgaXRlbS5jb25maWcgJiZcbiAgICAgICAgICB0eXBlb2YgaXRlbS5jb25maWcgPT09ICdvYmplY3QnXG4gICAgICAgICkge1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBWYWxpZGF0ZSBhbmQgdHJhbnNmb3JtIHRoZSBjb25maWcgc3RydWN0dXJlXG4gICAgICAgICAgICBjb25zdCBjb25maWcgPSBpdGVtLmNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgICAgICAgICAgIGNvbnN0IHZhbGlkYXRlZENvbmZpZyA9IHZhbGlkYXRlQW5kVHJhbnNmb3JtTW91bnRpbmdDb25maWcoY29uZmlnLCBpdGVtLmtleSk7XG4gICAgICAgICAgICBtb3VudGluZ0NvbmZpZ3NSZWNvcmRbaXRlbS5rZXldID0gdmFsaWRhdGVkQ29uZmlnO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCBtb3VudGluZyBjb25maWcsIHNraXBwaW5nJywgZXJyb3IsIHtcbiAgICAgICAgICAgICAgY29uZmlnS2V5OiBpdGVtLmtleSxcbiAgICAgICAgICAgICAgY29uZmlnOiBpdGVtLmNvbmZpZyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgLy8gQ29udGludWUgcHJvY2Vzc2luZyBvdGhlciBjb25maWdzXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIExvZ2dlci5sb2dXYXJuKCdJbnZhbGlkIG1vdW50aW5nIGNvbmZpZyBpdGVtIHN0cnVjdHVyZSwgc2tpcHBpbmcnLCB1bmRlZmluZWQsIHsgaXRlbSB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0cmFuc2Zvcm1lZERhdGEubW91bnRpbmdDb25maWdzID0gbW91bnRpbmdDb25maWdzUmVjb3JkO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgd2lkZ2V0X2NvbmZpZ3MgZnJvbSBhcnJheSB0byBSZWNvcmQgaWYgcHJlc2VudFxuICAgIGlmICh0cmFuc2Zvcm1lZERhdGEud2lkZ2V0Q29uZmlncyAmJiBBcnJheS5pc0FycmF5KHRyYW5zZm9ybWVkRGF0YS53aWRnZXRDb25maWdzKSkge1xuICAgICAgY29uc3Qgd2lkZ2V0Q29uZmlnc0FycmF5ID0gdHJhbnNmb3JtZWREYXRhLndpZGdldENvbmZpZ3MgYXMgQXJyYXk8e1xuICAgICAgICBrZXk6IHN0cmluZztcbiAgICAgICAgY29uZmlnOiB1bmtub3duO1xuICAgICAgfT47XG4gICAgICBjb25zdCB3aWRnZXRDb25maWdzUmVjb3JkOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgICBmb3IgKGNvbnN0IGl0ZW0gb2Ygd2lkZ2V0Q29uZmlnc0FycmF5KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpdGVtICYmXG4gICAgICAgICAgdHlwZW9mIGl0ZW0ua2V5ID09PSAnc3RyaW5nJyAmJlxuICAgICAgICAgIGl0ZW0uY29uZmlnICYmXG4gICAgICAgICAgdHlwZW9mIGl0ZW0uY29uZmlnID09PSAnb2JqZWN0J1xuICAgICAgICApIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gVmFsaWRhdGUgYW5kIHRyYW5zZm9ybSB3aWRnZXQgY29uZmlnIHVzaW5nIHRoZSBkZWRpY2F0ZWQgdmFsaWRhdGlvbiBmdW5jdGlvblxuICAgICAgICAgICAgY29uc3QgY29uZmlnID0gaXRlbS5jb25maWcgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG4gICAgICAgICAgICBjb25zdCB2YWxpZGF0ZWRDb25maWcgPSB2YWxpZGF0ZUFuZFRyYW5zZm9ybVdpZGdldENvbmZpZyhjb25maWcsIGl0ZW0ua2V5KTtcbiAgICAgICAgICAgIHdpZGdldENvbmZpZ3NSZWNvcmRbaXRlbS5rZXldID0gdmFsaWRhdGVkQ29uZmlnO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCB3aWRnZXQgY29uZmlnLCBza2lwcGluZycsIGVycm9yLCB7XG4gICAgICAgICAgICAgIGNvbmZpZ0tleTogaXRlbS5rZXksXG4gICAgICAgICAgICAgIGNvbmZpZzogaXRlbS5jb25maWcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIENvbnRpbnVlIHByb2Nlc3Npbmcgb3RoZXIgY29uZmlnc1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBMb2dnZXIubG9nV2FybignSW52YWxpZCB3aWRnZXQgY29uZmlnIGl0ZW0gc3RydWN0dXJlLCBza2lwcGluZycsIHVuZGVmaW5lZCwgeyBpdGVtIH0pO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHRyYW5zZm9ybWVkRGF0YS53aWRnZXRDb25maWdzID0gd2lkZ2V0Q29uZmlnc1JlY29yZDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJhbnNmb3JtZWREYXRhIGFzIEZyb250ZW5kQ29uZmlnO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIExvZ2dlci5sb2dXYXJuKCdGYWlsZWQgdG8gdmFsaWRhdGUgYW5kIHRyYW5zZm9ybSBHcmFwaFFMIGZyb250ZW5kIGNvbmZpZyBkYXRhJywgZXJyb3IsIHtcbiAgICAgIGRhdGEsXG4gICAgfSk7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxufTtcbiIsImV4cG9ydCBjb25zdCB2YWxpZGF0ZUdyYXBoUUxPcmdJZCA9IChkYXRhOiB1bmtub3duKTogc3RyaW5nIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKHR5cGVvZiBkYXRhICE9PSAnc3RyaW5nJyB8fCBkYXRhID09PSAnJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4gZGF0YTtcbn07XG4iLCJpbXBvcnQgeyBpc01vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIgfSBmcm9tICcuLi9ndWFyZHMvaXNNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyJztcbmltcG9ydCB7IE1vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIgfSBmcm9tICcuLi9tb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyJztcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlTW9iaWxlUExQQ2hhdFBsYWNlbWVudFBhcmFtZXRlciA9IChcbiAgdmFsdWU6IHVua25vd24sXG4pOiBNb2JpbGVQTFBDaGF0UGxhY2VtZW50UGFyYW1ldGVyIHwgdW5kZWZpbmVkID0+IHtcbiAgaWYgKCFpc01vYmlsZVBMUENoYXRQbGFjZW1lbnRQYXJhbWV0ZXIodmFsdWUpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcm93SW5kZXg6IHZhbHVlLnJvd19pbmRleCxcbiAgfTtcbn07XG4iLCJpbXBvcnQgeyBPcmdhbml6YXRpb25Db25maWcgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9vcmdhbml6YXRpb25Db25maWcnO1xuaW1wb3J0IHsgaXNBcGlPcmdhbml6YXRpb25Db25maWcgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlPcmdhbml6YXRpb25Db25maWcnO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVPcmdhbml6YXRpb25Db25maWcgPSAoZGF0YTogdW5rbm93bik6IE9yZ2FuaXphdGlvbkNvbmZpZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNBcGlPcmdhbml6YXRpb25Db25maWcoZGF0YSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBpZDogZGF0YS5pZCxcbiAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdC50b0lTT1N0cmluZygpLFxuICAgIG5hbWVzcGFjZTogZGF0YS5uYW1lc3BhY2UsXG4gICAgb3JnYW5pemF0aW9uSWQ6IGRhdGEub3JnYW5pemF0aW9uX2lkLFxuICAgIGlzTGF0ZXN0OiBkYXRhLmlzX2xhdGVzdCxcbiAgICB2ZXJzaW9uOiBkYXRhLnZlcnNpb24sXG4gICAgdXBkYXRlZEF0OiBkYXRhLnVwZGF0ZWRfYXQudG9JU09TdHJpbmcoKSxcbiAgICBjb25maWc6IHtcbiAgICAgIGFtcGxpdHVkZTogZGF0YS5jb25maWcuYW1wbGl0dWRlXG4gICAgICAgID8ge1xuICAgICAgICAgICAgc2Vzc2lvblJlcGxheUVuYWJsZWQ6IGRhdGEuY29uZmlnLmFtcGxpdHVkZS5zZXNzaW9uX3JlcGxheV9lbmFibGVkLFxuICAgICAgICAgICAgc2Vzc2lvblJlcGxheVNhbXBsZVJhdGU6IGRhdGEuY29uZmlnLmFtcGxpdHVkZS5zZXNzaW9uX3JlcGxheV9zYW1wbGVfcmF0ZSxcbiAgICAgICAgICAgIHRyYWNraW5nRW5hYmxlZDogZGF0YS5jb25maWcuYW1wbGl0dWRlLnRyYWNraW5nX2VuYWJsZWQsXG4gICAgICAgICAgfVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGN1c3RvbWVyU2VydmljZTogZGF0YS5jb25maWcuY3VzdG9tZXJfc2VydmljZVxuICAgICAgICA/IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiBkYXRhLmNvbmZpZy5jdXN0b21lcl9zZXJ2aWNlLnByb3ZpZGVyLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICBnb29nbGVBbmFseXRpY3M6IGRhdGEuY29uZmlnLmdvb2dsZV9hbmFseXRpY3NcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBtZWFzdXJlbWVudElkOiBkYXRhLmNvbmZpZy5nb29nbGVfYW5hbHl0aWNzLm1lYXN1cmVtZW50X2lkLFxuICAgICAgICAgIH1cbiAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgfSxcbiAgfTtcbn07XG4iLCJpbXBvcnQgeyBpc0FwaU9yZ0NvbmZpZ1Jlc3VsdHMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlPcmdDb25maWdSZXN1bHRzJztcbmltcG9ydCB7IE9yZ0NvbmZpZyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvYXBpL29yZ0NvbmZpZ1Jlc3VsdHMnO1xuaW1wb3J0IHsgdmFsaWRhdGVPcmdhbml6YXRpb25Db25maWcgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL3ZhbGlkYXRvcnMvdmFsaWRhdGVPcmdhbml6YXRpb25Db25maWcnO1xuaW1wb3J0IHsgT3JnYW5pemF0aW9uQ29uZmlnIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9hcGkvb3JnYW5pemF0aW9uQ29uZmlnJztcblxuLyoqXG4gKlxuICogQHBhcmFtIGRhdGFcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZU9yZ0NvbmZpZ1Jlc3VsdHMgPSAoZGF0YTogdW5rbm93bik6IE9yZ0NvbmZpZyB8IHVuZGVmaW5lZCA9PiB7XG4gIGlmICghaXNBcGlPcmdDb25maWdSZXN1bHRzKGRhdGEpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgY29uZmlnczogZGF0YS5jb25maWdzXG4gICAgICAubWFwKChjb25maWcpID0+IHZhbGlkYXRlT3JnYW5pemF0aW9uQ29uZmlnKGNvbmZpZykpXG4gICAgICAuZmlsdGVyKChjb25maWcpOiBjb25maWcgaXMgT3JnYW5pemF0aW9uQ29uZmlnID0+IGNvbmZpZyAhPSBudWxsKSxcbiAgICBleHBlcmltZW50czogZGF0YS5leHBlcmltZW50cy5tYXAoKGV4cGVyaW1lbnQpID0+ICh7XG4gICAgICBncm91cDogZXhwZXJpbWVudC5ncm91cCxcbiAgICAgIGdyb3VwTmFtZTogZXhwZXJpbWVudC5ncm91cF9uYW1lLFxuICAgICAgbmFtZTogZXhwZXJpbWVudC5uYW1lLFxuICAgICAgcnVsZUlkOiBleHBlcmltZW50LnJ1bGVfaWQsXG4gICAgICAvLyBUT0RPIHRoaXMgbmVlZHMgdG8gYmUgc3Ryb25nbHkgdHlwZWQgYnV0IHdlJ3JlIG5vdCBydW5uaW5nIGFueSBleHBlcmltZW50cyBhdCB0aGUgbW9tZW50XG4gICAgICB2YWx1ZTogZXhwZXJpbWVudC52YWx1ZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICB9KSksXG4gICAgZ2F0ZXM6IGRhdGEuZ2F0ZXMubWFwKChnYXRlKSA9PiAoe1xuICAgICAgZ3JvdXBOYW1lOiBnYXRlLmdyb3VwX25hbWUsXG4gICAgICBuYW1lOiBnYXRlLm5hbWUsXG4gICAgICBydWxlSWQ6IGdhdGUucnVsZV9pZCxcbiAgICAgIHZhbHVlOiBnYXRlLnZhbHVlLFxuICAgIH0pKSxcbiAgICBvcmc6IHtcbiAgICAgIG9yZzoge1xuICAgICAgICBpZDogZGF0YS5vcmcub3JnLmlkLFxuICAgICAgICBkaXNwbGF5TmFtZTogZGF0YS5vcmcub3JnLmRpc3BsYXlfbmFtZSxcbiAgICAgICAgZG9tYWluOiBkYXRhLm9yZy5vcmcuZG9tYWluLFxuICAgICAgICBzaG9ydE5hbWU6IGRhdGEub3JnLm9yZy5zaG9ydF9uYW1lLFxuICAgICAgICBzdGF0dXM6IGRhdGEub3JnLm9yZy5zdGF0dXMsXG4gICAgICAgIGNyZWF0ZWRBdDogZGF0YS5vcmcub3JnLmNyZWF0ZWRfYXQ/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgIHVwZGF0ZWRBdDogZGF0YS5vcmcub3JnLnVwZGF0ZWRfYXQ/LnRvSVNPU3RyaW5nKCksXG4gICAgICB9LFxuICAgICAgc2V0dGluZ3M6IHt9LFxuICAgIH0sXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgUmVzcG9uc2VDYXRlZ29yeSB9IGZyb20gJ0BzcGlmZnktYWkvY29tbWVyY2UtYXBpLWNsaWVudCc7XG5pbXBvcnQgeyBSZXNwb25zZSwgUmV2aWV3UmljaEluZm9ybWF0aW9uIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9pbmRleCc7XG5pbXBvcnQgeyBBcGlSZXZpZXdSaWNoSW5mb3JtYXRpb24gfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2FwaS9yZXNwb25zZUdlbmVyaWNzJztcbmltcG9ydCB7IGlzQXBpUGFnZVJlc3BvbnNlQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVBhZ2VSZXNwb25zZUF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUHJvZHVjdFJlc3BvbnNlQXR0cmlidXRlcyc7XG5pbXBvcnQgeyBpc0FwaVJlc3BvbnNlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpUmVzcG9uc2UnO1xuaW1wb3J0IHsgaXNBcGlSZXZpZXdSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlSZXZpZXdSZXNwb25zZUF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlUZXh0UmVzcG9uc2VBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpVGV4dFJlc3BvbnNlQXR0cmlidXRlcyc7XG5pbXBvcnQgeyBpc0FwaVByb2R1Y3RTZWFyY2hSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQcm9kdWN0U2VhcmNoQXR0cmlidXRlcyc7XG5pbXBvcnQgeyBpc0FwaUZvcm1SZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlGb3JtUmVzcG9uc2UnO1xuaW1wb3J0IHsgaXNBcGlPcmRlclJlc3BvbnNlQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzJztcbmltcG9ydCB7IHN0cmluZ1RvRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzRW51bVZhbHVlIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy91dGlscy9zdHJpbmdUb0Z1bGZpbGxtZW50RGlzcGxheVN0YXR1c0VudW1WYWx1ZSc7XG5pbXBvcnQgeyBpc0FwaVByb2R1Y3RTZWFyY2hGaWx0ZXJSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQcm9kdWN0U2VhcmNoRmlsdGVyQXR0cmlidXRlcyc7XG5cbmNvbnN0IHJpY2hJbmZvcm1hdGlvbkZyb21Db21tZXJjZVJpY2hJbmZvcm1hdGlvbiA9IChcbiAgZGF0YTogQXBpUmV2aWV3UmljaEluZm9ybWF0aW9uLFxuKTogUmV2aWV3UmljaEluZm9ybWF0aW9uID0+ICh7XG4gIGNvbnM6IGRhdGEuY29ucyxcbiAgcHJvczogZGF0YS5wcm9zLFxuICByZXZpZXdEYXRlOiBkYXRhLnJldmlld19kYXRlLFxuICByZXZpZXdlclRpdGxlOiBkYXRhLnJldmlld2VyX3RpdGxlLFxuICBwcm9kdWN0RmFtaWxpYXJpdHk6IGRhdGEucHJvZHVjdF9mYW1pbGlhcml0eSxcbn0pO1xuXG5leHBvcnQgY29uc3QgdmFsaWRhdGVSZXNwb25zZSA9IChkYXRhOiB1bmtub3duKTogUmVzcG9uc2UgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzQXBpUmVzcG9uc2UoZGF0YSkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuVGV4dCAmJiBpc0FwaVRleHRSZXNwb25zZUF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuVGV4dCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgY29udGVudDogZGF0YS5hdHRyaWJ1dGVzLmNvbnRlbnQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0ICYmXG4gICAgaXNBcGlQcm9kdWN0UmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0LFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBpZDogZGF0YS5hdHRyaWJ1dGVzLmlkLFxuICAgICAgICBkZXNjcmlwdGlvbjogZGF0YS5hdHRyaWJ1dGVzLmRlc2NyaXB0aW9uLFxuICAgICAgICBpbWFnZVVybDogZGF0YS5hdHRyaWJ1dGVzLmltYWdlX3VybCxcbiAgICAgICAgaW1hZ2VVcmxzOiBkYXRhLmF0dHJpYnV0ZXMuaW1hZ2VfdXJscyxcbiAgICAgICAgdGl0bGU6IGRhdGEuYXR0cmlidXRlcy50aXRsZSxcbiAgICAgICAgdXJsOiBkYXRhLmF0dHJpYnV0ZXMudXJsLFxuICAgICAgICBvcmlnaW5hbFByaWNlOiBkYXRhLmF0dHJpYnV0ZXMub3JpZ2luYWxfcHJpY2UsXG4gICAgICAgIHNhbGVQcmljZTogZGF0YS5hdHRyaWJ1dGVzLnNhbGVfcHJpY2UsXG4gICAgICAgIGF2ZXJhZ2VSYXRpbmc6IGRhdGEuYXR0cmlidXRlcy5hdmVyYWdlX3JhdGluZyxcbiAgICAgICAgbnVtYmVyUmV2aWV3czogZGF0YS5hdHRyaWJ1dGVzLm51bWJlcl9yZXZpZXdzLFxuICAgICAgICBtZXRhZGF0YTogZGF0YS5hdHRyaWJ1dGVzLm1ldGFkYXRhLFxuICAgICAgICBpc0ZvckdyaWQ6IGRhdGEuYXR0cmlidXRlcy5pc19mb3JfZ3JpZCxcbiAgICAgICAgY29sb3JzOiBkYXRhLmF0dHJpYnV0ZXMuY29sb3JzLFxuICAgICAgICBzaXplczogZGF0YS5hdHRyaWJ1dGVzLnNpemVzLFxuICAgICAgICBmaWx0ZXJzOiBkYXRhLmF0dHJpYnV0ZXMuZmlsdGVycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlJldmlldyAmJiBpc0FwaVJldmlld1Jlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5SZXZpZXcsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGlkOiBkYXRhLmF0dHJpYnV0ZXMuaWQsXG4gICAgICAgIHByb2R1Y3RJZDogZGF0YS5hdHRyaWJ1dGVzLnByb2R1Y3RfaWQsXG4gICAgICAgIHRpdGxlOiBkYXRhLmF0dHJpYnV0ZXMudGl0bGUsXG4gICAgICAgIHJldmlld2VyOiBkYXRhLmF0dHJpYnV0ZXMucmV2aWV3ZXIsXG4gICAgICAgIHJldmlldzogZGF0YS5hdHRyaWJ1dGVzLnJldmlldyxcbiAgICAgICAgc3RhcnM6IGRhdGEuYXR0cmlidXRlcy5zdGFycyxcbiAgICAgICAgcmljaEluZm9ybWF0aW9uOiBkYXRhLmF0dHJpYnV0ZXMucmljaF9pbmZvcm1hdGlvblxuICAgICAgICAgID8gcmljaEluZm9ybWF0aW9uRnJvbUNvbW1lcmNlUmljaEluZm9ybWF0aW9uKGRhdGEuYXR0cmlidXRlcy5yaWNoX2luZm9ybWF0aW9uKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuU2VwYXJhdG9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5TZXBhcmF0b3IsXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LlBhZ2UgJiYgaXNBcGlQYWdlUmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBSZXNwb25zZUNhdGVnb3J5LlBhZ2UsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGlkOiBkYXRhLmF0dHJpYnV0ZXMuaWQsXG4gICAgICAgIHRpdGxlOiBkYXRhLmF0dHJpYnV0ZXMudGl0bGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBkYXRhLmF0dHJpYnV0ZXMuZGVzY3JpcHRpb24sXG4gICAgICAgIHVybDogZGF0YS5hdHRyaWJ1dGVzLnVybCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBSZXNwb25zZUNhdGVnb3J5LkZvcm0gJiYgaXNBcGlGb3JtUmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBSZXNwb25zZUNhdGVnb3J5LkZvcm0sXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIGZvcm1DYXRlZ29yeTogZGF0YS5hdHRyaWJ1dGVzLmZvcm1fY2F0ZWdvcnlcbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgZm9ybVR5cGU6IGRhdGEuYXR0cmlidXRlcy5mb3JtX2NhdGVnb3J5LmZvcm1fdHlwZSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgc2NoZW1hOiB7XG4gICAgICAgICAgcHJvcGVydGllczogZGF0YS5hdHRyaWJ1dGVzLnNjaGVtYS5wcm9wZXJ0aWVzLFxuICAgICAgICAgIHJlcXVpcmVkOiBkYXRhLmF0dHJpYnV0ZXMuc2NoZW1hLnJlcXVpcmVkLm1hcChTdHJpbmcpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9O1xuICB9XG5cbiAgaWYgKFxuICAgIGRhdGEuY2F0ZWdvcnkgPT09IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaCAmJlxuICAgIGlzQXBpUHJvZHVjdFNlYXJjaFJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBpZDogZGF0YS5pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFJlc3BvbnNlQ2F0ZWdvcnkuUHJvZHVjdFNlYXJjaCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZ2VuZXJhdGVkUXVlcnk6IGRhdGEuYXR0cmlidXRlcy5nZW5lcmF0ZWRfcXVlcnksXG4gICAgICAgIHByb2R1Y3RDb3VudDogZGF0YS5hdHRyaWJ1dGVzLnByb2R1Y3RfY291bnQsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0U2VhcmNoRmlsdGVyICYmXG4gICAgaXNBcGlQcm9kdWN0U2VhcmNoRmlsdGVyUmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBkYXRhLmlkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogUmVzcG9uc2VDYXRlZ29yeS5Qcm9kdWN0U2VhcmNoRmlsdGVyLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBmaWx0ZXJOYW1lOiBkYXRhLmF0dHJpYnV0ZXMuZmlsdGVyX25hbWUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gUmVzcG9uc2VDYXRlZ29yeS5PcmRlciAmJiBpc0FwaU9yZGVyUmVzcG9uc2VBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcykpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IGRhdGEuaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBSZXNwb25zZUNhdGVnb3J5Lk9yZGVyLFxuICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICBvcmRlcklkOiBkYXRhLmF0dHJpYnV0ZXMub3JkZXJfaWQsXG4gICAgICAgIG9yZGVyTnVtYmVyOiBkYXRhLmF0dHJpYnV0ZXMub3JkZXJfbnVtYmVyLFxuICAgICAgICBjcmVhdGVkQXQ6IGRhdGEuYXR0cmlidXRlcy5jcmVhdGVkX2F0LFxuICAgICAgICBsYXRlc3RFdmVudERhdGU6IGRhdGEuYXR0cmlidXRlcy5sYXRlc3RfZXZlbnRfZGF0ZSxcbiAgICAgICAgbGluZUl0ZW1zOiBkYXRhLmF0dHJpYnV0ZXMubGluZV9pdGVtcy5tYXAoKGl0ZW0pID0+ICh7XG4gICAgICAgICAgaXRlbVRpdGxlOiBpdGVtLml0ZW1fdGl0bGUsXG4gICAgICAgICAgaXRlbVByaWNlOiBpdGVtLml0ZW1fcHJpY2UsXG4gICAgICAgICAgaXRlbVF1YW50aXR5OiBpdGVtLml0ZW1fcXVhbnRpdHksXG4gICAgICAgICAgb3JkZXJJdGVtSWQ6IGl0ZW0ub3JkZXJfaXRlbV9pZCxcbiAgICAgICAgICBpbWFnZTogaXRlbS5pbWFnZSA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgaW5UcmFuc2l0QXQ6IGl0ZW0uaW5fdHJhbnNpdF9hdCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZGVsaXZlcmVkQXQ6IGl0ZW0uZGVsaXZlcmVkX2F0ID8/IHVuZGVmaW5lZCxcbiAgICAgICAgICBlc3RpbWF0ZWREZWxpdmVyeUF0OiBpdGVtLmVzdGltYXRlZF9kZWxpdmVyeV9hdCA/PyB1bmRlZmluZWQsXG4gICAgICAgICAgZnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzOiBpdGVtLmZ1bGZpbGxtZW50X2Rpc3BsYXlfc3RhdHVzXG4gICAgICAgICAgICA/IHN0cmluZ1RvRnVsZmlsbG1lbnREaXNwbGF5U3RhdHVzRW51bVZhbHVlKGl0ZW0uZnVsZmlsbG1lbnRfZGlzcGxheV9zdGF0dXMpXG4gICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgICB0cmFja2luZ1VybDogaXRlbS50cmFja2luZ191cmwgPz8gdW5kZWZpbmVkLFxuICAgICAgICB9KSksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbiIsImltcG9ydCB7IGlzU3VnZ2VzdGlvbiB9IGZyb20gJy4uL2d1YXJkcy9hcGkvaXNBcGlTdWdnZXN0aW9uJztcbmltcG9ydCB7IFN1Z2dlc3Rpb24gfSBmcm9tICcuLi9hcGkvc3VnZ2VzdGlvbic7XG5cbmV4cG9ydCBjb25zdCB2YWxpZGF0ZVN1Z2dlc3Rpb24gPSAoZGF0YTogdW5rbm93bik6IFN1Z2dlc3Rpb24gfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzU3VnZ2VzdGlvbihkYXRhKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGlkOiBkYXRhLmlkLFxuICAgIGNhdGVnb3J5OiBkYXRhLmNhdGVnb3J5LFxuICAgIGNvbnRlbnQ6IGRhdGEuY29udGVudCxcbiAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICBpc0Fuc3dlcjogZGF0YS5pc19hbnN3ZXIsXG4gIH07XG59O1xuIiwiaW1wb3J0IHsgVXNlckV2ZW50Q2F0ZWdvcnkgfSBmcm9tICdAc3BpZmZ5LWFpL2NvbW1lcmNlLWFwaS1jbGllbnQnO1xuaW1wb3J0IHsgaXNBcGlVc2VyRXZlbnQgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlVc2VyRXZlbnQnO1xuaW1wb3J0IHsgVXNlckV2ZW50IH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9pbmRleCc7XG5pbXBvcnQgeyBpc0FwaVBEUEF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlQRFBFdmVudEF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlRdWVyeVR5cGVkQXR0cmlidXRlcyB9IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVF1ZXJ5VHlwZWRFdmVudEF0dHJpYnV0ZXMnO1xuaW1wb3J0IHsgaXNBcGlTZWFyY2hBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpU2VhcmNoRXZlbnRBdHRyaWJ1dGVzJztcbmltcG9ydCB7IGlzQXBpU3VnZ2VzdGlvbkNsaWNrZWRBdHRyaWJ1dGVzIH0gZnJvbSAnc3JjL2FwcGxpY2F0aW9uL21vZGVscy9ndWFyZHMvYXBpL2lzQXBpU3VnZ2VzdGlvbkNsaWNrZWRFdmVudEF0dHJpYnV0ZXMnO1xuaW1wb3J0IHtcbiAgaXNBcGlQTFBFdmVudEF0dHJpYnV0ZXMsXG4gIGlzQXBpUExQSWRBdHRyaWJ1dGUsXG59IGZyb20gJ3NyYy9hcHBsaWNhdGlvbi9tb2RlbHMvZ3VhcmRzL2FwaS9pc0FwaVBMUEV2ZW50QXR0cmlidXRlcyc7XG5pbXBvcnQgeyBpc0FwaUZvcm1TdWJtaXR0ZWRSZXNwb25zZUF0dHJpYnV0ZXMgfSBmcm9tICdzcmMvYXBwbGljYXRpb24vbW9kZWxzL2d1YXJkcy9hcGkvaXNBcGlGb3JtU3VibWl0dGVkUmVzcG9uc2VBdHRyaWJ1dGVzJztcblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlVXNlckV2ZW50ID0gKGRhdGE6IHVua25vd24pOiBVc2VyRXZlbnQgfCB1bmRlZmluZWQgPT4ge1xuICBpZiAoIWlzQXBpVXNlckV2ZW50KGRhdGEpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QZHBWaXNpdCAmJiBpc0FwaVBEUEF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudElkOiBkYXRhLmV2ZW50X2lkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuUGRwVmlzaXQsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHByb2R1Y3RJZDogZGF0YS5hdHRyaWJ1dGVzLnByb2R1Y3RfaWQsXG4gICAgICAgIHBhcmVudFByb2R1Y3RJZDogZGF0YS5hdHRyaWJ1dGVzLnBhcmVudF9wcm9kdWN0X2lkLFxuICAgICAgICB1cmw6IGRhdGEuYXR0cmlidXRlcy51cmwsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuUXVlcnlUeXBlZCAmJlxuICAgIGlzQXBpUXVlcnlUeXBlZEF0dHJpYnV0ZXMoZGF0YS5hdHRyaWJ1dGVzKVxuICApIHtcbiAgICByZXR1cm4ge1xuICAgICAgZXZlbnRJZDogZGF0YS5ldmVudF9pZCxcbiAgICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgICAgY2F0ZWdvcnk6IFVzZXJFdmVudENhdGVnb3J5LlF1ZXJ5VHlwZWQsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHF1ZXJ5OiBkYXRhLmF0dHJpYnV0ZXMucXVlcnksXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICBpZiAoZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuU2VhcmNoICYmIGlzQXBpU2VhcmNoQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50SWQ6IGRhdGEuZXZlbnRfaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBVc2VyRXZlbnRDYXRlZ29yeS5TZWFyY2gsXG4gICAgICBhdHRyaWJ1dGVzOiB7XG4gICAgICAgIHNlYXJjaFRlcm06IGRhdGEuYXR0cmlidXRlcy5zZWFyY2hfdGVybSxcbiAgICAgICAgc2VsZWN0ZWRGaWx0ZXJzOiBkYXRhLmF0dHJpYnV0ZXMuc2VsZWN0ZWRfZmlsdGVycyxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChcbiAgICBkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCAmJlxuICAgIGlzQXBpU3VnZ2VzdGlvbkNsaWNrZWRBdHRyaWJ1dGVzKGRhdGEuYXR0cmlidXRlcylcbiAgKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGV2ZW50SWQ6IGRhdGEuZXZlbnRfaWQsXG4gICAgICBjcmVhdGVkQXQ6IGRhdGEuY3JlYXRlZF9hdCxcbiAgICAgIGNhdGVnb3J5OiBVc2VyRXZlbnRDYXRlZ29yeS5TdWdnZXN0aW9uQ2xpY2tlZCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgc3VnZ2VzdGlvbklkOiBkYXRhLmF0dHJpYnV0ZXMuc3VnZ2VzdGlvbl9pZCxcbiAgICAgIH0sXG4gICAgfTtcbiAgfVxuXG4gIGlmIChkYXRhLmNhdGVnb3J5ID09PSBVc2VyRXZlbnRDYXRlZ29yeS5QbHBWaXNpdCAmJiBpc0FwaVBMUEV2ZW50QXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpKSB7XG4gICAgaWYgKGlzQXBpUExQSWRBdHRyaWJ1dGUoZGF0YS5hdHRyaWJ1dGVzKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZXZlbnRJZDogZGF0YS5ldmVudF9pZCxcbiAgICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICAgIGNhdGVnb3J5OiBVc2VyRXZlbnRDYXRlZ29yeS5QbHBWaXNpdCxcbiAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgIGNhdGVnb3J5OiBkYXRhLmF0dHJpYnV0ZXMuY2F0ZWdvcnksXG4gICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgaWQ6IGRhdGEuYXR0cmlidXRlcy5pZCxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICBpZiAoXG4gICAgZGF0YS5jYXRlZ29yeSA9PT0gVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZCAmJlxuICAgIGlzQXBpRm9ybVN1Ym1pdHRlZFJlc3BvbnNlQXR0cmlidXRlcyhkYXRhLmF0dHJpYnV0ZXMpXG4gICkge1xuICAgIHJldHVybiB7XG4gICAgICBldmVudElkOiBkYXRhLmV2ZW50X2lkLFxuICAgICAgY3JlYXRlZEF0OiBkYXRhLmNyZWF0ZWRfYXQsXG4gICAgICBjYXRlZ29yeTogVXNlckV2ZW50Q2F0ZWdvcnkuRm9ybVN1Ym1pdHRlZCxcbiAgICAgIGF0dHJpYnV0ZXM6IHtcbiAgICAgICAgZmlsbGVkU2NoZW1hOiB7IC4uLmRhdGEuYXR0cmlidXRlcy5maWxsZWRfc2NoZW1hIH0sXG4gICAgICAgIGZvcm1SZXNwb25zZUlkOiBkYXRhLmF0dHJpYnV0ZXMuZm9ybV9yZXNwb25zZV9pZCxcbiAgICAgICAgZm9ybVR5cGU6IGRhdGEuYXR0cmlidXRlcy5mb3JtX3R5cGUsXG4gICAgICB9LFxuICAgIH07XG4gIH1cblxuICAvLyB3ZSdyZSBub3QgdXNpbmcgYXBwX3VubG9hZGVkIGF0IHRoZSBtb21lbnQgc28gcmV0dXJuIHRoZSBhcHBfbG9hZGVkIGV2ZW50IGFzIGRlZmF1bHRcbiAgcmV0dXJuIHtcbiAgICBldmVudElkOiBkYXRhLmV2ZW50X2lkLFxuICAgIGNyZWF0ZWRBdDogZGF0YS5jcmVhdGVkX2F0LFxuICAgIGNhdGVnb3J5OiBVc2VyRXZlbnRDYXRlZ29yeS5BcHBMb2FkZWQsXG4gIH07XG59O1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBLElBQVksd0RBQUw7QUFDTDtBQUNBO0FBRUE7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7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
|