{"version":3,"file":"main.9b0f4e4eb1d88259.js","mappings":"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QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAElCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAElCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAElCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,mBACEA,mBAAoD,YAApDA,CAAoD,YAApDA,CAAoD,YAApDA,CAAoD,YAApDA,CAAoD,YAApDA,CAAoD,YAApDA,CAAoD,aAQtDA,QACAA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,UAEpCA,gBAAI,YACcA,oBAA8BA,QAC9CA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,QAClCA,gBAAIA,oBAA8BA,wCE7U1C,MAAO2K,GAIX/K,YAAoBgL,mBAFV/K,kBAAuC,IAAIgL,KAEX,CAE1CC,cACMjL,KAAKwB,YAAY4I,SACnBpK,KAAKwB,WAAaxB,KAAKwB,WAAWkI,OAC/BlE,GACCA,EAAUO,KAAO1C,2BACjBmC,EAAUO,KAAO1C,0BAIvBrD,KAAK+K,SAASG,SAASC,SAASC,cAAc,QAAS,aACzD,CAEAC,cACErL,KAAK+K,SAASO,YAAYH,SAASC,cAAc,QAAS,aAC5D,CAEAG,OAAOC,GACL,MAAMC,EAAQzL,KAAKwB,WAAWkK,QAAQF,GACtCxL,KAAKwB,WAAWqH,OAAO4C,EAAO,EAChC,CAEAE,OAAOC,GACL,IAAIH,EAAQG,EAAMH,aACPA,EAAU,MACnBA,EAAQzL,KAAKwB,WAAW4I,QAG1BpK,KAAKwB,WAAWqH,OAAO4C,EAAO,EAAGG,EAAMjG,KACzC,CAEAkG,MAAMC,GACAA,EACF9L,KAAK+L,aAAaC,KAAKhM,KAAKwB,WAAW+D,IAAKC,GAAcA,EAAUO,KAEpE/F,KAAK+L,aAAaC,MAEtB,EA1CWlB,GAA6B,oCAA7BA,IAA6BnK,eAA7BmK,GAA6B,sBAA7BA,GAA6BlK,2xCDlB1CT,iBAA6B,WACtBA,gCAASyK,SAAM,EAAM,GAA2BzK,QACrDA,iBAAwB,aAAxBA,CAAwB,UAGlBA,8BACFA,UAEFA,iBAAkC,SAE9BA,gGAEFA,QAEAA,iBAAiBA,mCAAWyK,WAAc,GACxCzK,yBAwBAA,kBAIFA,QAEAA,sBAEC,gBACSA,gCAASyK,SAAM,EAAM,GAAiBzK,mBAAMA,QACpDA,sBAAQA,gCAASyK,SAAM,EAAK,GAC1BzK,2BACFA,YAGJA,sBACEA,gCAASyK,SAAM,EAAM,GAGtBzK,mBA1C2BA,6hyJEDdA,gBACEA,SACFA,+BADEA,qFAIFA,gBACEA,SACFA,+BADEA,mHAmDFA,gBACEA,8HAMAA,gBAAMA,4BAAgBA,QACtBA,mBACEA,gBACFA,oDA3ElBA,iBAAiE,UAAjEA,CAAiE,UAAjEA,CAAiE,UAAjEA,CAAiE,UAAjEA,CAAiE,WAAjEA,CAAiE,aAOnDA,iCAKAA,iCAKFA,YAGJA,kBAAyB,YAAzBA,CAAyB,cAAzBA,CAAyB,eAWjBA,6FAA4CA,uBAAc,GAH5DA,QAKAA,kCACAA,iBAGFA,UAEFA,mBAGC,cAHDA,CAGC,eAOKA,yFAAwCA,uBAAc,GAHxDA,QAKAA,gCACAA,iBAGFA,UAEFA,mBAAwB,YAAxBA,CAAwB,UAAxBA,CAAwB,UAAxBA,CAAwB,cAKdA,iBACFA,UAEFA,wBAYFA,gBAKRA,mBAA2D,YAA3DA,CAA2D,YAA3DA,CAA2D,cAA3DA,CAA2D,eASjDA,6FAA4CA,uBAAc,GAH5DA,QAKAA,kCACFA,UAEFA,mBAAwB,cAAxBA,CAAwB,eAOlBA,yFAAwCA,uBAAc,GAHxDA,QAKAA,gCACFA,4CApGMA,mDAgECA,0JAmDfA,gBAGEA,gGAAyC,EAAC,GAEzCA,gBACFA,iCAFCA,0FAGFA,gBAGEA,gGAAyC,EAAC,GAKzCA,gBACFA,iCALCA,wHA+BQA,gBAIGA,SAAqBA,yCADtBA,2CACCA,mDAEHA,gBAKGA,SAAqBA,yCAFtBA,2CAECA,kEAEHA,gBAEEA,+EAASA,4CAA2C,GAEpDA,gBAIFA,kCAkBFA,kEAMEA,0FAEFA,aAIC,UASGA,gBACAA,4CAA+BA,2CAP/BA,0NAzENA,kBAeC,YAIGA,uBAMAA,uBAOAA,uBASFA,QACAA,gBAIEA,kBAKAA,gBAIEA,SAA6BA,UAGjCA,yCAQAA,uBAiBFA,mDA3EEA,qFAYKA,qCAMAA,qCAOAA,8CAWHA,2DAIEA,4EAA6D,kCAK7DA,2DAEAA,uCAIDA,+FAQAA,yGApEPA,SACEA,2BAoFFA,6CAnFKA,4PAkGGA,gBAEEA,oEAASA,mCAAsC,GAI/CA,gBAOFA,2CALIA,oMA8BAA,gBAGEA,2DAASA,6BAAgC,GAKzCA,gBAMAA,SACFA,oCAXEA,yCAKEA,iDAKFA,0EAYEA,gBAEEA,2DAASA,6BAAsC,GAM/CA,gBAMAA,SACFA,oCAXEA,yCAKEA,iDAKFA,2DAtBJA,SACEA,iBACAA,kBAA2B,UAEvBA,SACFA,UAGFA,uBAgBFA,kCApBMA,gCAKmBA,8DAV3BA,SACEA,kCAyBFA,yCAzBqCA,6DAoC3CA,4CADFA,SACEA,yBASFA,6CAPKA,0LAvGTA,kBAGC,WAHDA,CAGC,WAHDA,CAGC,YAMOA,uBAcAA,mBAAmCA,SAAiBA,UAEtDA,kBAKC,WALDA,CAKC,UAEmBA,8EAASA,oCAA+B,GACtDA,iBACFA,UAEFA,mBAIC,YAJDA,CAIC,YAJDA,CAIC,WAIOA,UACFA,UAEFA,wBAiBAA,kCA2BFA,gBAMRA,mBAGEA,mCAWFA,qEAnGSA,0BAWgCA,wBAInCA,yEAiBQA,sDAKgBA,mCAeLA,mCAoCaA,kEAsD1BA,mBAOEA,gBAGFA,8DAREA,sFARJA,uBAKEA,SACAA,0BAWAA,gBAEEA,+EAASA,+BAA6B,QAAO,GAC5CA,kBAAMA,kEAnBTA,gCAIAA,uCAMGA,qEAYLA,kBAIEA,eACFA,kDA5CFA,kBAgBEA,yBAuBAA,yBAMAA,gBAEEA,+EAASA,+BAA6B,QAAO,GAC5CA,kBAAMA,4EAxCTA,oFAUGA,0DAuBAA,oFA1CPA,SACEA,yBAmDFA,6CAlDKA,2KAVTA,kBAAmD,WAAnDA,CAAmD,UAKzCA,SAAiBA,UAEzBA,kBACEA,kCAqDFA,qDA1DEA,6CAEMA,wBAG8BA,kEAT1CA,SACEA,yBA+DFA,kCA/D8BA,6DAwFtBA,4DAUEA,+GAXJA,SACEA,yBAkBFA,kEAhBKA,oNAvBTA,mBAOC,YAPDA,CAOC,YAPDA,CAOC,gBAK4CA,SAErCA,YAGNA,mBAGEA,kCAoBFA,qDA5B2CA,wBAQLA,kEAwD5BA,mBAOEA,gBAGFA,8DAREA,sFARJA,uBAKEA,SACAA,0BAWAA,gBAEEA,+EAASA,+BAAgC,QAAO,GAC/CA,kBAAMA,kEAnBTA,gCAIAA,uCAMGA,qEAYLA,kBAIEA,eACFA,kDA5CFA,kBAgBEA,yBAuBAA,yBAMAA,gBAEEA,+EAASA,+BAAgC,QAAO,GAC/CA,kBAAMA,4EA9CTA,oFAgBGA,0DAuBAA,oFA1CPA,SACEA,yBAmDFA,6CA1CKA,2KAlBTA,kBAAsD,WAAtDA,CAAsD,UAK5CA,SAAoBA,UAE5BA,kBACEA,kCAqDFA,qDA1DEA,6CAEMA,wBAG8BA,kEAT1CA,eACEA,yBA+DFA,kCA/D8BA,8DA9ChCA,SACEA,0BA4CAA,yBAiEFA,6CA3GKA,0FA0CuBA,+HA3OhCA,SACEA,0BAmHAA,kBAOEA,kCAmEAA,kCA+GFA,QACFA,6CA3SKA,mDAkHDA,8CACAA,gEAKgCA,mCAmEGA,0GAtT7CA,kBAGC,YAKGA,uBAOAA,uBAYAA,kBACEA,kBACAA,kBACEA,kCAsFFA,UAGFA,kBACEA,kCA+SFA,kCAlaAA,iDACAA,gDAGGA,yEAOAA,yEAcqCA,uCA0FNA,2DAmTtCA,iBAGC,UAHDA,CAGC,YAHDA,CAGC,YAHDA,CAGC,YAHDA,CAGC,YAHDA,CAGC,aASaA,iBAGAA,kBACEA,qEACFA,UAEFA,eAAI,SAEAA,+EAEFA,QACAA,eAAIA,sDAAyCA,QAC7CA,eACEA,4LAGFA,UAEFA,kBACGA,4BAAeA,2CAS9BA,oFAKFA,0CAGEA,iEAAgBA,0BAAsB,GACvCA,gCAHCA,iGCzjBI,MAAO8L,EAqCXlM,YACUmM,EACA3B,EACA9F,GAFAzE,wBACAA,uBACAA,oBAtCDA,UAAsB+D,aACtB/D,kBAAuB,EACvBA,gCAAqC,EACrCA,6BAAkC,EAClCA,2BAAgC,EAChCA,wBAA6B,EAG5BA,kBAA0C,IAAIgL,MAOxDhL,kBAAuBqD,0BACvBrD,gBAAqBqD,wBAErBrD,qBAA0B,EAC1BA,mBAAwB,EAKxBA,cAAmB,EAEnBA,iCAAsC,EAEtCA,uBAA4B,EAC5BA,mBAAgB,EAChBA,2BAAgC,EAGhCA,UAAO+D,CAMJ,CAEHkH,cACOjL,KAAKmM,cAA6C,IAA7BnM,KAAKmM,aAAa/B,QAK5CpK,KAAKoM,SAAU,EAEfpM,KAAKqM,gBAAiB,EACtBrM,KAAKsM,cAAe,EAEpBtM,KAAKkM,iBACFrG,sBAAsB,CACrBR,KAAMrF,KAAKqF,KACXD,OAAQpF,KAAKoF,OACbN,IAAK9E,KAAKmM,eAEX7H,KACEgB,IAEGtF,KAAKwB,WADHxB,KAAKmM,eAAiBnM,KAAKoF,OACXpF,KAAKuM,qBACrBvM,KAAKmM,aACL7G,GAGgBA,KAGpBlB,QACEoI,MAAS,CACPxM,KAAKkM,iBAAiBpG,KAAK9F,KAAK6D,YAChC7D,KAAKkM,iBAAiBpG,KAAK9F,KAAK4D,iBAElCU,KAAK,EAAEmI,EAAmBC,MAC1B1M,KAAK2M,kBAAoBF,EACzBzM,KAAK4M,oBAAsBF,EAE3B1M,KAAKwB,WAAWqL,QAAQJ,GACxBzM,KAAKwB,WAAWqL,QAAQH,GAExB1M,KAAK8M,eACL9M,KAAK+M,8BAEL/M,KAAKoM,SAAU,GAChB,EAEFY,IACChN,KAAKoM,SAAU,IAIrBpM,KAAKyE,aAAaP,KAAK,CAAEmB,KAAMrF,KAAKqF,OAAQf,KAAMC,IAChDvE,KAAKiN,OAAS1I,KAlDdvE,KAAKwB,WAAa,EAoDtB,CAEA0L,8BAA8BC,GAC5BnN,KAAKuK,gBAAgBd,OAAO0D,GAE5BnN,KAAKwB,WAAaxB,KAAKwB,WAAWkI,OAC/BlE,GAAyBA,EAAUO,KAAOoH,GAE7CnN,KAAKoN,sBAAwBpN,KAAKqN,0BACpC,CAEAC,oBAAoBjH,GAClB,OAAOA,EAAMrB,OAAOuI,KAAM5F,IAAOA,EAAE6F,SACrC,CAEAC,sBAAsBC,GAElB1N,KAAK2N,0BADH3N,KAAK2N,4BAA8BD,EACJ,GAEAA,CAErC,CAGAZ,eAME,OALA9M,KAAKoN,sBAAwBpN,KAAKqN,4BAK1B,GAEN,KAAKO,OAAOC,WAAaxK,4BACvBrD,KAAKoN,sBAAwB,EAC7BpN,KAAK8N,kBAAmB,EACxB9N,KAAK+N,qBAAuB,EAC5B,MAEF,KAAKH,OAAOC,WAAaxK,4BACvBrD,KAAKoN,sBAAwB,EAC7BpN,KAAK8N,kBAAmB,EACxB9N,KAAK+N,qBAAuB,EAC5B,MAEF,KAAKH,OAAOC,YAAcxK,4BAjBL,IAkBnBrD,KAAKoN,sBACHQ,OAAOC,WAlBQ,IAmBjB7N,KAAK8N,kBAAmB,EACxB9N,KAAK+N,qBAAuBC,KAAKC,OAC9BL,OAAOC,WArBO,KADE,KAwBnB,MACF,QACE7N,KAAK8N,kBAAmB,EAE9B,CAGAf,8BACEmB,WAAW,KACTlO,KAAKmO,YAAY5E,QAAS6E,IAExB,MAAMC,EACJL,KAAKC,MACHK,WACEV,OACGW,iBAAiBH,EAAGI,eACpBH,WAAWI,UAAU,EAAG,KAE3B,EAEFL,EAAGI,cAAcE,aAAeL,GAClCD,EAAGI,cAAcG,UAAUvF,IACzB,wBACA,eAAc,EAGnB,EACA,IACL,CAEAiE,2BACE,OACErN,KAAKwB,WAAW4I,QACfpK,KAAKsM,aAAe,EAAI,IACxBtM,KAAKqM,eAAiB,EAAI,EAE/B,CAGAuC,kBAAkBC,GAChB,MAAMV,EACJhD,SAAS2D,uBAAuBD,GAClCxF,MAAM0F,KAAKZ,GAAa5E,QAASyF,IAC/BA,EAAKL,UAAUjG,OAAO,eAAc,EAExC,CAEAuG,eAAeC,GACblP,KAAKmP,4BAA6B,EAC9BD,EAAoB9E,SACtBpK,KAAKwB,WAAaxB,KAAKuM,qBACrB2C,EACAlP,KAAKwB,YAGPxB,KAAKwB,WAAWqL,QAAQ7M,KAAK2M,mBAC7B3M,KAAKwB,WAAWqL,QAAQ7M,KAAK4M,qBAE7B5M,KAAKoP,aAAapD,KAAKhM,KAAKwB,YAEhC,CAEQ+K,qBACN2C,EACA1N,GAEA,OAAO0N,EAAoB3J,IAAKQ,GAC9BvE,EAAWkG,KAAM2H,GAAiBA,EAAEtJ,KAAOA,GAE/C,CAGAuJ,SAASC,GAELA,EAAYC,UAAUxH,SAAS,kBAC/BuH,EAAYC,UAAUxH,SAAS,yBAG/BhI,KAAK2N,0BAA4B,GAErC,CAGA8B,WACEzP,KAAK8M,eACL9M,KAAK+M,6BACP,EA1OWd,EAA4B,oCAA5BA,GAA4BtL,6BAA5BsL,EAA4B,sBAA5BA,EAA4BrL,sMAA5BgK,oBAAuB,wCAAvBA,aAAgB,0xQDzB7BzK,iBAOEA,yBAiHAA,0BA2aAA,yBAyCAA,oDAGFA,QAEAA,sDA/kBEA,kFAKwBA,2DAmHrBA,2DA2aAA,oFAwCAA,iCAMFA,y4mLEzkBHA,SACEA,iBAAuB,UAAvBA,CAAuB,UAAvBA,CAAuB,UAAvBA,CAAuB,QAAvBA,CAAuB,QAAvBA,CAAuB,YAWTA,gBACFA,UAEFA,gBAIC,aAEGA,iBACFA,QACAA,iBAAMA,6BAAgBA,cAI5BA,mBAA2B,YAA3BA,CAA2B,YAA3BA,CAA2B,YAKnBA,+CACFA,YAKJA,mBAAiC,YAAjCA,CAAiC,WAAjCA,CAAiC,UAAjCA,CAAiC,UAAjCA,CAAiC,aAMrBA,iBACFA,UAEFA,iBAKEA,yDAASA,mDAAwC,GAEjDA,iBAAMA,8BAAiBA,QACvBA,mBACEA,iBACFA,oBAOZA,cACEA,2KAGFA,cAKNA,wCAKEA,iEAAgBA,0BAAsB,GACvCA,QACHA,gCAvEcA,6CASAA,6CA+BMA,yDAyBhBA,iCAAoB,0BAApBA,CAAoB,uBAApBA,CAAoB,wCCtElB,MAAOuP,GAKX3P,YACEM,EACQ6L,EACA3B,EACAoF,EACRvM,GAHQpD,wBACAA,uBACAA,qBAPVA,sBAA2B,EAC3BA,kBAA4C,GAS1CoD,EAAYZ,QAAQ,cACpBnC,EAAkBE,gBAAgBE,KAAK,CAAC,CAAEK,MAAO,uBACnD,CAEAR,WACEN,KAAK4P,qBAAuB5P,KAAKuK,gBAAgBrG,OAAOqB,IAAKsK,GAAMA,EAAE9J,IACrE/F,KAAK8P,aAAe9P,KAAK2P,cAAc7F,iBACzC,CAEMiG,mBAAmB5D,GAAsB,qCAC7ClG,EAAK+J,iBAAkB,QACjB/J,EAAKiG,iBAAiBlG,SAASmG,GACrClG,EAAK+J,iBAAkB,CAAK,EAHiB,EAI/C,CAEAf,eAAezN,GACbxB,KAAKuK,gBAAgBZ,mBAAmBnI,EAC1C,EA7BWkO,GAAmB,oCAAnBA,IAAmB/O,+CAAnB+O,GAAmB,sBAAnBA,GAAmB9O,85BDdhCT,iBAA0D,UAA1DA,CAA0D,UAA1DA,CAA0D,WAIlDA,0BACFA,cAKNA,yCAAeA,oFEIT,MAAO8P,EAGXlQ,YACU6B,EACAS,GADArC,YACAA,0BAERA,KAAKqC,mBAAmBR,kBAAkBrB,UAAW8B,IACnDtC,KAAKuC,YAAcD,GAEvB,CAEA4N,yBAIE,SAAO9L,KACLpE,KAAK4B,KAAKG,IACR,GAAG/B,KAAKuC,YAAY8B,aAAaL,oBAGvC,CAEAmM,8BAGE,SAAO/L,KACLpE,KAAK4B,KAAKG,IACR,GAAG/B,KAAKuC,YAAY8B,aAAaL,gBAKvC,EAjCWiM,EAAoB,oCAApBA,GAAoBtP,uBAApBsP,EAAoB,wBAApBA,EAAoB/P,QAApB+P,EAAoB,qBAFnB,SCFR,MAAOG,EAGXrQ,YACU6B,EACAS,GADArC,YACAA,0BAERA,KAAKqC,mBAAmBR,kBAAkBrB,UAAW8B,IACnDtC,KAAKuC,YAAcD,GAEvB,CAEM+N,oBAAiB,qCACrB,SAAOjM,KACL6B,EAAKrE,KAAKG,IAAI,GAAGkE,EAAK1D,YAAY+N,2BAClChM,KAAMiM,GACCA,EACP,EALmB,EAMvB,EAlBWH,EAAc,oCAAdA,GAAczP,uBAAdyP,EAAc,wBAAdA,EAAclQ,QAAdkQ,EAAc,qBAFb,SCIR,MAAOI,EAGXzQ,YACU6B,EACAS,GADArC,YACAA,0BAERA,KAAKqC,mBAAmBR,kBAAkBrB,UAAW8B,IACnDtC,KAAKuC,YAAcD,GAEvB,CAEM4B,OAAI,qCACR,SAAOE,KACL6B,EAAKrE,KAAKG,IACR,GAAGkE,EAAK1D,YAAY8B,aAAaL,gBAEnCM,KAAMmM,GACCA,EACP,EAPM,EAQV,CAEM3K,KAAKC,GAAU,qCACnB,SAAO3B,KACLsM,EAAK9O,KAAKG,IACR,GAAG2O,EAAKnO,YAAY8B,aAAaL,gBAA8B+B,MAEjEzB,KAAMqM,GACCA,EACP,EAPiB,EAQrB,4BCvBcxQ,qBAIEA,SACFA,kCAHEA,uBAEAA,2DAMFA,qBAIEA,SACFA,kCAHEA,uBAEAA,iCDrBLqQ,EAAc,oCAAdA,GAAc7P,uBAAd6P,EAAc,wBAAdA,EAActQ,QAAdsQ,EAAc,qBAFb,kJCVdrQ,iBAA+D,UAA/DA,CAA+D,UAA/DA,CAA+D,UAA/DA,CAA+D,SASrDA,uCACFA,QAEAA,kBAGC,UAHDA,CAGC,UAHDA,CAGC,cAIOA,6BAMFA,UAEFA,mBAA+C,gBAE3CA,6BAMFA,YAIJA,iBASGA,oCACHA,wCApCAA,0CAO4BA,sCAUAA,sCAU1BA,yCAA8B,kGC9BpC,MAAOyQ,GAKX7Q,YAAoB8Q,wBAAiC,CAErDvQ,WACEN,KAAK6Q,eAAe3M,OAAOI,KAAMqM,IAC/B3Q,KAAKyB,UAAYkP,EAEjB3Q,KAAK8Q,YAAc,IAAIC,KAAU,CAC/BC,SAAU,IAAIC,KACZjR,KAAKyB,UACHuM,KAAKC,MAAMD,KAAKkD,SAAWlR,KAAKyB,UAAU2I,SAC1CtJ,OAEJqQ,SAAU,IAAIF,KACZjR,KAAKyB,UACHuM,KAAKC,MAAMD,KAAKkD,SAAWlR,KAAKyB,UAAU2I,SAC1CtJ,QAEL,EAEL,EAxBW8P,GAAgC,oCAAhCA,IAAgCjQ,WAAhCiQ,GAAgC,sBAAhCA,GAAgChQ,o4BDV7CT,+BAA8CA,ugzJEAvC,IAAKiR,GAQX,aARWA,UAAS,KACnBA,oBACAA,kCACAA,sBACAA,sBACAA,kBACAA,sBACAA,yBAPUA,GAAZ,IAAYA,GAQX,2BCAK,MAAOC,EACXtR,YAAoBuR,EAAwBC,GAAxBvR,cAAwBA,cAE1CA,KAAKsR,OAAOE,mBAAmBC,iBAAmB,KACzC,CAEX,CAGAC,SAASC,GACP,MAAMxQ,EAAenB,KAAK4R,aAAaD,GAEvC3R,KAAKuR,OAAOM,IAAI,KACd7R,KAAKsR,OAAOQ,cAAc3Q,EAAM,GAAE,EAEtC,CAEAyQ,aAAaD,GACX,IAAIxQ,EAAO,GAEX,OAAQwQ,EAAKI,MACX,IAAK,cAAe,CAClB,MAAMC,EAAYL,EAAKxN,OAAOuD,KAAMuK,GAAiB,cAAXA,EAAEpP,OAAuB0E,MACnEpG,GAAQ,cAAc6Q,IACtB,MAEF,IAAK,oBACH7Q,GAAQnB,KAAKsR,OACVY,cAAc,CAAC,cAAe,CAC7BC,YAAaR,EAAKxN,OAAOgC,OACvB,CAACC,EAAgCgM,KAC/BhM,EAAIgM,EAAMvP,MAAQuP,EAAM7K,MACjBnB,GAET,MAGHvB,WAIP,OAAO1D,CACT,EA1CWkQ,EAAgB,oCAAhBA,GAAgB1Q,2BAAhB0Q,EAAgB,wBAAhBA,EAAgBnR,QAAhBmR,EAAgB,qBAFf,oCCgBR,MAAOgB,EAsCXtS,YAAoBuS,2BAjCpBtS,YAAiB,IAETA,YAAc,CAAEuS,IAAK,GAAIC,OAAQ,GAAIC,KAAM,GAAIC,MAAO,IAGtD1S,SAAc,EAAIgO,KAAK2E,GACvB3S,gBAAa,EACbA,kCAA+B,GAUvCA,qBAA0B,CAgB+B,CAdzD4S,kBAAkBjN,GAChBA,SAAK4D,QAAQ,CAACsJ,EAAUpH,KACtBoH,EAASC,MAAQ,GACfD,EAASE,UAAY,IAAIxJ,QAAQ,CAACyJ,EAAcC,KAEhDJ,EAASC,OAASE,EAAQF,MAE1BE,EAAQE,YAAczH,EACtBuH,EAAQG,cAAgBF,GACzB,GAEItN,CACT,CAIAyN,kBACEpT,KAAKqT,qBACLrT,KAAKsT,gBAAiB,CACxB,CAEArI,YAAYsI,GACNvT,KAAKsT,gBACPtT,KAAKqT,oBAET,CAEAA,qBACE,MAAMG,EAAanB,EAAkBoB,WAAWzT,KAAK0T,QAAQ/N,MAE7D,IAAIW,EAAmB,GACvBtG,KAAK2T,WAAa,EAClB,UAAWC,KAAaJ,EACtBlN,EAAYA,EAAUuN,OAAOD,EAAUb,UACvC/S,KAAK2T,YAAcC,EAAUd,MAG/B,MAAMgB,EAAU9T,KAAK+T,eAAevF,cACpCxO,KAAKgU,MAAQF,EAAQG,YAAcjU,KAAKkU,OAAOzB,KAAOzS,KAAKkU,OAAOxB,MAClE1S,KAAKmU,aAAenU,KAAKoU,OAASpU,KAAKkU,OAAO3B,IAAMvS,KAAKkU,OAAO1B,QAAU,EAC1ExS,KAAKqU,aAAkC,EAAnBrU,KAAKmU,YACzBnU,KAAKsU,YAAiC,EAAnBtU,KAAKmU,YACxBL,EAAQS,UAAY,GAEpB,MAAMC,EAAS,CACb,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAIIC,EAAMC,SAETP,YAAYnU,KAAKmU,aACjBG,YAAYtU,KAAKqU,cACdM,EAAWD,SAEdP,YAAYnU,KAAKqU,cACjBC,YAAYtU,KAAKsU,aAGdM,EAAMF,MACFZ,GACPe,OAAO,OACPC,KAAK,QAAS9U,KAAKgU,OACnBc,KAAK,SAAU9U,KAAKoU,QAGvBpU,KAAK+U,UAASC,UACXF,KAAK,QAAS,iDACdG,OAAO,CAAC,EAAG,IACXC,KACC,CAACC,EAAQC,IACP,yCAAyCA,EAAEtU,0CAA0CsU,EAAEtC,aAE7F9S,KAAKqV,aAAYL,UACdF,KAAK,QAAS,iDACdG,OAAO,CAAC,IAAK,IACbC,KACC,CAACC,EAAQC,IACP,yCAAyCA,EAAEtU,0CAA0CsU,EAAEtC,aAE7F8B,EAAIU,KAAKtV,KAAK+U,QACdH,EAAIU,KAAKtV,KAAKqV,WAEd,MAAME,EAAIX,EACPC,OAAO,KACPC,KACC,YACA,aAAe9U,KAAKgU,MAAQ,EAAI,IAAMhU,KAAKoU,OAAS,EAAI,KAEzDoB,GAAG,WAAaJ,IACfK,EAAYC,KAAK,IACjB1V,KAAK+U,OAAOY,OACZ3V,KAAKqV,UAAUM,MAAI,GAIjBC,EAAQL,EACXM,UAAU,UACVlQ,KAAK6N,GACLsC,QACAjB,OAAO,KACPC,KAAK,QAAS,iBAEjBc,EACGf,OAAO,QACPkB,MAAOX,GAAWpV,KAAKgW,UAAUZ,EAAG9O,EAAU8D,SAC9C6L,MAAM,OAAQ,CAACb,EAAQ/F,IAAWmF,EAAOnF,IACzC4G,MAAM,SAAU,QAChBnB,KAAK,IAAKL,GACVe,GAAG,YAAa,CAACL,EAAQC,KACxBK,EAAYC,KAAK,GAAGN,EAAEtC,kBAAkBsC,EAAEtC,MAAQ,EAAI,IAAM,MAC5D,MAAMoD,GAAUd,EAAEe,WAAaf,EAAEgB,UAAY,EAAIpW,KAAKqW,IAAO,IACzDH,EAAQ,IAAMA,GAAS,IACzBlW,KAAKqV,UAAUvP,KAAKqP,EAAGC,GAEvBpV,KAAK+U,OAAOjP,KAAKqP,EAAGC,EAAC,GAGxBI,GAAG,WAAY,KACdxV,KAAKqV,UAAUM,OACf3V,KAAK+U,OAAOY,MAAI,GAEjBH,GAAG,QAAS,CAAC5J,EAAOwJ,KACnBpV,KAAK+U,OAAOY,OACZ3V,KAAKqV,UAAUM,OACf3V,KAAKsS,iBAAiBZ,SAAS0D,EAAEzD,KAAI,GAIzCiE,EACGf,OAAO,QACPC,KAAK,cAAe,UACpBA,KAAK,YAAcM,IAClB,MAAMkB,GAAelB,EAAEe,WAAaf,EAAEgB,UAAY,EAAIpI,KAAK2E,GAAK,EAE1D4D,EACJvW,KAAKmU,aAAenU,KAAKqU,aAAerU,KAAKmU,aAAe,EAK9D,MAAO,aAHCoC,EAAWvI,KAAKwI,IAAIF,MACpBC,EAAWvI,KAAKyI,IAAIH,KAEHI,GAE1BhB,KAAMN,IAEL,GAAIA,EAAEgB,SAAWhB,EAAEe,YAAcnW,KAAK2W,6BAA8B,CAElE,MAAM3C,EAAQhU,KAAKqU,aAAerU,KAAKmU,YACvC,OAAIiB,EAAEtU,MAAMsJ,OAAS4J,EAAQ,EACpBoB,EAAEtU,MAAM2N,UAAU,EAAGuF,EAAQ,EAAI,GAAK,MAExCoB,EAAEtU,SAGZmV,MAAM,YAAa,UACnBT,GAAG,YAAa,CAACL,EAAQC,KACxBK,EAAYC,KAAK,GAAGN,EAAEtC,kBAAkBsC,EAAEtC,MAAQ,EAAI,IAAM,MAC5D,MAAMoD,GAAUd,EAAEe,WAAaf,EAAEgB,UAAY,EAAIpW,KAAKqW,IAAO,IACzDH,EAAQ,IAAMA,GAAS,IACzBlW,KAAKqV,UAAUvP,KAAKqP,EAAGC,GAEvBpV,KAAK+U,OAAOjP,KAAKqP,EAAGC,EAAC,GAGxBI,GAAG,WAAaJ,IACfK,EAAYC,KAAK,IACjB1V,KAAKqV,UAAUM,OACf3V,KAAK+U,OAAOY,MAAI,GAEjBH,GAAG,QAAS,CAAC5J,EAAOwJ,KACnBpV,KAAK+U,OAAOY,OACZ3V,KAAKqV,UAAUM,OACf3V,KAAKsS,iBAAiBZ,SAAS0D,EAAEzD,KAAI,GAIzC,MAAMiF,EAAarB,EAChBM,UAAU,gBACVlQ,KAAKW,GACLwP,QACAjB,OAAO,KACPC,KAAK,QAAS,uBAEjB8B,EACG/B,OAAO,QACPkB,MAAOX,GAAWpV,KAAKgW,UAAUZ,EAAG9O,EAAU8D,SAC9C6L,MAAM,OAASb,GACdV,OACSF,EAAOY,EAAElC,cACf2D,UAAUzB,EAAEjC,cAAgB,GAAK,GACjCtO,YAEJoR,MAAM,SAAU,QAChBnB,KAAK,IAAKH,GACVa,GAAG,YAAa,CAACL,EAAQC,KACxBK,EAAYC,KAAK,GAAGN,EAAEtC,kBAAkBsC,EAAEtC,MAAQ,EAAI,IAAM,MAC5D,MAAMoD,GAAUd,EAAEe,WAAaf,EAAEgB,UAAY,EAAIpW,KAAKqW,IAAO,IACzDH,EAAQ,IAAMA,GAAS,IACzBlW,KAAKqV,UAAUvP,KAAKqP,EAAGC,GAEvBpV,KAAK+U,OAAOjP,KAAKqP,EAAGC,EAAC,GAGxBI,GAAG,WAAaJ,IACfK,EAAYC,KAAK,IACjB1V,KAAK+U,OAAOY,OACZ3V,KAAKqV,UAAUM,MAAI,GAEpBH,GAAG,QAAS,CAAC5J,EAAOwJ,KACnBpV,KAAK+U,OAAOY,OACZ3V,KAAKqV,UAAUM,OACf3V,KAAKsS,iBAAiBZ,SAAS0D,EAAEzD,KAAI,GAIzCiF,EACG/B,OAAO,QACPC,KAAK,cAAe,UACpBA,KAAK,YAAcM,IAClB,MAAMkB,GAAelB,EAAEe,WAAaf,EAAEgB,UAAY,EAAIpI,KAAK2E,GAAK,EAEhE,IAAI4D,EAWJ,OATEA,EADEnB,EAAEgB,SAAWhB,EAAEe,YAAcnW,KAAK2W,6BACzB3W,KAAKsU,YAActU,KAAKkU,OAAO3B,IAGxCvS,KAAKqU,cAAgBrU,KAAKsU,YAActU,KAAKqU,cAAgB,EAM1D,aAHCkC,EAAWvI,KAAKwI,IAAIF,MACpBC,EAAWvI,KAAKyI,IAAIH,KAEHI,GAE1BhB,KAAK,CAACN,EAAQ/F,KAEb,MAAM2E,EAAQhU,KAAKsU,YAActU,KAAKqU,aACtC,OAAIe,EAAEtU,MAAMsJ,OAAS4J,EAAQ,EACpBoB,EAAEtU,MAAM2N,UAAU,EAAGuF,EAAQ,EAAI,GAAK,MAExCoB,EAAEtU,QAEVmV,MAAM,YAAa,UACnBT,GAAG,YAAa,CAACL,EAAQC,KACxBK,EAAYC,KAAK,GAAGN,EAAEtC,kBAAkBsC,EAAEtC,MAAQ,EAAI,IAAM,MAC5D,MAAMoD,GAAUd,EAAEe,WAAaf,EAAEgB,UAAY,EAAIpW,KAAKqW,IAAO,IACzDH,EAAQ,IAAMA,GAAS,IACzBlW,KAAKqV,UAAUvP,KAAKqP,EAAGC,GAEvBpV,KAAK+U,OAAOjP,KAAKqP,EAAGC,EAAC,GAGxBI,GAAG,QAAS,CAAC5J,EAAOwJ,KACnBpV,KAAK+U,OAAOY,OACZ3V,KAAKqV,UAAUM,OACf3V,KAAKsS,iBAAiBZ,SAAS0D,EAAEzD,KAAI,GAIzC,MAAM8D,EAAcF,EACjBV,OAAO,YACPC,KAAK,QAAS,SACdA,KAAK,KAAM,SACXA,KAAK,cAAe,UACpBY,KAAK,GACV,CAEAM,UAAUZ,EAAQ0B,GAEhB,OAAI9W,KAAKoW,UAAYpW,KAAKqW,MACxBrW,KAAKoW,SAAWpW,KAAKoW,SAAWpW,KAAKqW,KAEvCrW,KAAKmW,WAAanW,KAAKoW,SAAWpW,KAAKoW,SAAW,EAGlDpW,KAAKoW,SAAWpW,KAAKmW,WAAcf,EAAEtC,MAAQ9S,KAAK2T,WAAc3T,KAAKqW,IAErEjB,EAAEe,WAAanW,KAAKmW,WACpBf,EAAEgB,SAAWpW,KAAKoW,SACXhB,CACT,EAhdW/C,EAAiB,oCAAjBA,GAAiB1R,WAAjB0R,EAAiB,sBAAjBA,EAAiBzR,yQCtB9BT,6DCAO,MAAM4W,GAAwC,CACnDC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,IAAK,KACLC,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,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,UACA,WAhKSH,EAmKJO,cAAgB,UAnKZP,EAAY,oCAAZA,EAAY,EAAZA,EAAY,wBAAZA,EAAYtpB,QAAZspB,EAAY,qBAFX,SEWR,MAAOQ,GAoDXjqB,YAAoBuS,2BAhDpBtS,qBAAuB,CACrBiqB,YAAY,EACZC,SAAU,CACR7kB,KAAM,QACN8kB,WAAW,GAEbC,OAAQ,CACN1T,EAAG,CACD3Q,GAAI,SACJ9E,MAAO,CACLopB,SAAS,IAGbC,EAAG,CACDvkB,GAAI,UAENwkB,GAAI,CACFxkB,GAAI,SACJoB,KAAM,WACNqjB,KAAM,CACJC,UAAY3W,IACV,MAAM4W,EACJ1qB,KAAK0T,QAAQ/N,KAAKmO,EAAQrI,QAAQif,WAC9BC,EACJ3qB,KAAK0T,QAAQ/N,KAAKmO,EAAQrI,MAAQ,IAAIif,WAExC,OAAOA,IAAeC,EAAqB,EAAI,IAGnDC,MAAO,CACLC,MAAO,QACPC,SAAU,CAACC,EAAgBtf,KACzB,MAAMif,EAAqB1qB,KAAK0T,QAAQ/N,KAAK8F,GAAOif,WAE9CC,EACJ3qB,KAAK0T,QA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BACA,mBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,mBACA,gBACA,WACA,cACA,aACA,gBACA,aACA,gBACA,YACA,eACA,mBACA,sBACA,kBACA,qBACA,aACA,gBACA,aACA,gBACA,WACA,cACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,iBACA,oBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,mBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,cACA,iBACA,aACA,gBACA,aACA,gBACA,aACA,gBACA,gBACA,mBACA,cACA,iBACA,aACA,gBACA,cACA,iBACA,cACA,kBACA,qBACA,iBACA,gBACA,mBACA,aACA,gBACA,aACA,gBACA,aACA,kBACA,qBACA,gBACA,aACA,gBACA,mBACA,sBACA,aACA,gBACA,gBACA,mBACA,gBACA,mBACA,gBACA,mBACA,gBACA,oBAIA,cACA,WACA,WACA,CACA,cACA,cACA,8CACA,gCACAmI,CACA,CACA,WACA,CACA4kB,kBACA,qBACA,EACAA,YACAC,YACAD","names":["BreadcrumbService","constructor","this","BehaviorSubject","factory","i0","BreadcrumbComponent","breadcrumbService","ngOnInit","breadcrumbLinks","subscribe","next","newBreadcrumbLinks","core","selectors","Error404Component","label","metaDataContent","defaultMeta","title","description","path","home","about","indicators","comparator","incentives","countries","error404","EnvironmentService","http","loadEnvironment","environment$","get","ENV_URL","pipe","shareReplay","MetaService","meta","environmentService","env","environment","setTags","pageName","setTitle","metaTitleSuffix","updateTag","name","content","setDynamicTags","pageMeta","baseUrl","absoluteOgImage","AboutComponent","metaService","appConstants","windowBreakpoints","mobile","tablet","desktop","wideScreen","fullHD","OECDmedianId","EUmedianId","cyprusNote","IncentiveMode","TargetApiRoutes","ThemeService","list","params","firstValueFrom","apiBaseUrl","then","themeRes","IncentiveService","themeService","listParams","withoutPagination","page","toString","ids","join","fields","Object","assign","similarTo","sortBy","mode","incentiveRes","map","incentive","formatIncentive","paginator","data","listPaginated","listWithoutPagination","show","id","download","_this","flatFields","reduce","acc","theme","subThemes","subTheme","flat","headings","field","flatField","formatCSVString","values","every","country","csv","blob","Blob","type","saveAs","valueObject","extractTooltip","value","tooltipValues","isDisabled","find","f","str","replace","getTooltipPart","tooltipMarker","includes","split","FavoriteService","Subject","JSON","parse","localStorage","getItem","localStorageKey","favoriteIncentives","toggle","selectedIncentive","isFavorite","splice","findIndex","favoriteIncentive","push","image","setItem","stringify","add","Array","isArray","forEach","removeAllFavorites","remove","filter","replaceByNewValues","FilterService","filterRes","getSavedFilters","filtersLocalStorageKey","saveFilters","filters","activeFilters","activeOptions","length","fieldId","FavoriteButtonComponent","favoriteService","tooltipContent","getTooltipContent","toggleFavorite","compact","ctx","IncentiveComparatorLoaderComponent","OrderIncentivesModalComponent","renderer","EventEmitter","ngOnChanges","addClass","document","querySelector","ngOnDestroy","removeClass","onDrag","item","index","indexOf","onDrop","event","close","saveChanges","onCloseModal","emit","IncentiveComparatorComponent","incentiveService","incentiveIds","loading","showOECDMedian","showEUMedian","orderIncentivesByIds","forkJoin","EUMedianIncentive","OECDMedianRes","incentiveEUMedian","incentiveOECDMedian","unshift","initCarousel","initTruncateMultiLineValues","err","themes","removeIncentiveFromComparator","incentiveIdToDelete","visibleIncentiveCount","getVisibleIncentiveCount","hasVisibleSubFields","some","isHidden","toggleThemeVisibility","themeId","themeVisibilityDialogOpen","window","innerWidth","isCarouselActive","maxVisibleIncentives","Math","floor","setTimeout","valueFields","vF","lineHeight","parseFloat","getComputedStyle","nativeElement","substring","offsetHeight","classList","toggleExtendValue","elemClassName","getElementsByClassName","from","elem","onOrderChanged","incentiveIdsInOrder","isOrderIncentivesModalOpen","orderChanged","i","clickOut","eventTarget","className","onResize","ComparatorComponent","filterService","favoriteIncentiveIds","s","savedFilters","downloadIncentives","loadingDownload","VisualizationService","listMainVisualizations","listIndicatorVisualizations","ContentService","getDynamicContent","dynamicContentEndpoint","dynamicContentRes","CountryService","countriesRes","_this2","countryRes","CountryComparisonWidgetComponent","countryService","countryForm","FormGroup","country1","FormControl","random","country2","ChartType","SmartLinkService","router","ngZone","routeReuseStrategy","shouldReuseRoute","goToLink","link","generatePath","run","navigateByUrl","view","countryId","p","createUrlTree","queryParams","param","SunburstComponent","smartLinkService","top","bottom","left","right","PI","static","mainItem","count","subItems","subItem","subIndex","parentIndex","indexInParent","ngAfterViewInit","buildSunburstChart","isChartVisible","changes","mainThemes","formatData","dataset","totalCount","mainTheme","concat","element","chartContainer","width","offsetWidth","margin","innerRadius","height","middleRadius","outerRadius","innerHTML","colors","arc","d3","outerArc","svg","append","attr","topTip","d3tip","offset","html","e","d","bottomTip","call","g","on","centralText","text","hide","slice","selectAll","enter","datum","getAngles","style","angle","startAngle","endAngle","tau","middleAngle","distance","cos","sin","y","minAngleToDisplayLabelInside","outerSlice","brighter","subThemesLength","iso3ToIso2","AFG","ALB","DZA","ASM","AND","AGO","AIA","ATA","ATG","ARG","ARM","ABW","AUS","AUT","AZE","BHS","BHR","BGD","BRB","BLR","BEL","BLZ","BEN","BMU","BTN","BOL","BIH","BWA","BVT","BRA","IOT","BRN","BGR","BFA","BDI","KHM","CMR","CAN","CPV","CYM","CAF","TCD","CHL","CHN","CXR","CCK","COL","COM","COG","COK","CRI","CIV","HRV","CUB","CYP","CZE","DNK","DJI","DMA","DOM","TMP","ECU","EGY","SLV","GNQ","ERI","EST","ETH","FLK","FRO","FJI","FIN","FRA","FXX","GUF","PYF","ATF","GAB","GMB","GEO","DEU","GHA","GIB","GRC","GRL","GRD","GLP","GUM","GTM","GIN","GNB","GUY","HTI","HMD","VAT","HND","HKG","HUN","ISL","IND","IDN","IRN","IRQ","IRL","ISR","ITA","JAM","JPN","JOR","KAZ","KEN","KIR","PRK","KOR","KWT","KGZ","LAO","LVA","LBN","LSO","LBR","LBY","LIE","LTU","LUX","MAC","MKD","MDG","MWI","MYS","MDV","MLI","MLT","MHL","MTQ","MRT","MUS","MYT","MEX","FSM","MDA","MCO","MNG","MSR","MAR","MOZ","MMR","NAM","NRU","NPL","NLD","ANT","NCL","NZL","NIC","NER","NGA","NIU","NFK","MNP","NOR","OMN","PAK","PLW","PAN","PNG","PRY","PER","PHL","PCN","POL","PRT","PRI","QAT","REU","ROU","RUS","RWA","KNA","LCA","VCT","WSM","SMR","STP","SAU","SEN","SYC","SLE","SGP","SVK","SVN","SLB","SOM","ZAF","SGS","ESP","LKA","SHN","SPM","SDN","SUR","SJM","SWZ","SWE","CHE","SYR","TWN","TJK","TZA","THA","TGO","TKL","TON","TTO","TUN","TUR","TKM","TCA","TUV","UGA","UKR","ARE","GBR","USA","UMI","URY","UZB","VUT","VEN","VNM","VGB","VIR","WLF","ESH","YEM","YUG","ZAR","ZMB","SRB","RKS","WorldMapComponent","color","showLegend","buildWorldMap","chart","am4core","am4maps","geodata","am4geodata_worldLow","projection","zoomControl","wheelable","polygonSeries","series","useGeodata","tooltip","fitPointerToBounds","getFillFromObject","fillOpacity","strokeOpacity","valign","background","fill","tooltipColor","stroke","clear","fontSize","fontFamily","polygonTemplate","mapPolygons","template","tooltipText","strokeColor","strokeWidth","properties","noDataColor","cursorOverStyle","tooltipY","states","create","hoverColor","exclude","convertIso3IntoIso2","code","getCountryColor","propertyFields","events","target","dataItem","dataContext","hasOwnProperty","showTooltipOn","iso3","zeroIncentiveColor","countryGroups","group","ColorService","shuffle","shuffleArray","primaryColors","array","arrayClone","j","disabledColor","StackedBarComponent","responsive","tooltips","intersect","scales","display","x","x2","grid","tickWidth","groupLabel","previousGroupLabel","ticks","align","callback","_value","barChartOptions","yAxisLabel","Set","chartItem","sI","possibleValues","datasets","possibleValue","subItemData","links","backgroundColor","borderColor","stack","barChartData","labels","onChartClick","clickedElement","active","datasetIndex","PieChartComponent","plugins","legend","position","pieChartData","chartClicked","clickedItem","IframeComponent","sanitizer","source","bypassSecurityTrustResourceUrl","uri","BarChartComponent","indexAxis","xAxisLabel","ScatterPlotComponent","ChartDataLabels","elements","point","radius","datalabels","anchor","formatter","context","dataIndex","callbacks","displayColors","lineWidth","tick","chartOptions","valueX","valueY","chartData","AggregationWrapperComponent","selectedDataset","aggregation","selectDataset","downloadDataset","fileSaver","AggregationWidgetComponent","aggregations","layout","selectedAggregation","HomeComponent","visualizationService","contentService","loadingAggregations","visualizationRes","otherAggregation","dynamicContent","additionalResources","homePageContent","IndicatorsComponent","aggregationGroups","sections","indicatorsPageContent","FlashMessageService","success","message","sticky","flashMessage","timeout","error","info","FilterLoaderComponent","IncentiveLoaderComponent","MultiSelectInputComponent","elementRef","selectOptions","selectNone","option","String","toggleSelected","clickedOption","valueChanged","options","showList","contains","TruncatePipe","transform","args","limit","trail","pure","IncentiveDatabaseComponent","formBuilder","activatedRoute","flashMessageService","guidedTourService","UntypedFormControl","loadingFilters","sort","a","b","form","addControl","filterId","keys","key","setValue","loadingIncentives","isAllFavorites","tableColumns","getTableColumns","startTour","tourId","minimumScreenSize","useOrb","steps","selector","orientation","Orientation","setStyle","scrollBarChild","tableContainer","scrollWidth","resetTour","clearAllForm","skipLocationChange","navigate","basePath","clearOption","snapshot","reload","Date","getTime","queryParamsHandling","onFilterChange","t","toggleAllFavorites","onScroll","scrollbarName","scrollLeft","scrollBarWrapper","incentiveFields","_this3","showExportMenu","CountryDetailLoaderComponent","CountryDetailComponent","policyChangesFields","fieldLabels","obj","comparativeCountry","groupPolicyChangesByIncentive","policyChanges","grouped","incentiveMap","Map","change","has","incentiveLabel","set","years","incentiveGroup","yearGroup","year","CountryListComponent","IncentiveDetailComponent","comparatorIncentiveIds","similarIncentiveIds","isCollapsed","routes","component","redirectTo","AppRoutingModule","RouterModule","FooterComponent","moment","format","HeaderCountriesLoaderComponent","listAnimation","trigger","transition","opacity","animate","CartComponent","removeOldFavorites","oldFavorites","lastAddedIncentives","resetFavorites","HeaderComponent","newFavoriteIncentives","isCartOpen","isUserAlreadyAddedIncentiveToCart","NavigationEnd","url","activeItem","activeCountry","isCountryDropdownExtended","toggleMobileMenu","closeOnly","showMobileMenu","goToComparator","FlashMessageComponent","res","AppComponent","routeChanged","scrollTo","AppModule","bootstrap","GuidedTourService","provide","APP_INITIALIZER","useFactory","toPromise","deps","multi","imports","BrowserModule","BrowserAnimationsModule","ReactiveFormsModule","HttpClientModule","NgChartsModule","DndModule","GuidedTourModule","enableProdMode","__NgCli_bootstrap_1","bootstrapModule","catch","console","webpackContext","module"],"sourceRoot":"webpack:///","sources":["./src/app/shared/services/breadcrumb.service.ts","./src/app/partials/breadcrumb/breadcrumb.component.html","./src/app/partials/breadcrumb/breadcrumb.component.ts","./src/app/errors/error404/error404.component.ts","./src/app/errors/error404/error404.component.html","./src/app/shared/content/meta-data.content.ts","./src/app/shared/services/environment.service.ts","./src/environments/environment.prod.ts","./src/app/shared/services/meta.service.ts","./src/app/pages/about/about.component.ts","./src/app/pages/about/about.component.html","./src/app/app.constants.ts","./src/app/shared/enums/incentive-mode.enum.ts","./src/app/shared/enums/target-api-routes.enum.ts","./src/app/shared/services/theme.service.ts","./src/app/shared/services/incentive.service.ts","./src/app/shared/services/favorite.service.ts","./src/app/shared/services/filter.service.ts","./src/app/partials/favorite-button/favorite-button.component.html","./src/app/partials/favorite-button/favorite-button.component.ts","./src/app/resources/incentive/incentive-comparator/incentive-comparator-loader.component.ts","./src/app/resources/incentive/order-incentive-modal/order-incentives-modal.component.html","./src/app/resources/incentive/order-incentive-modal/order-incentives-modal.component.ts","./src/app/resources/incentive/incentive-comparator/incentive-comparator.component.html","./src/app/resources/incentive/incentive-comparator/incentive-comparator.component.ts","./src/app/pages/comparator/comparator.component.html","./src/app/pages/comparator/comparator.component.ts","./src/app/shared/services/visualization.service.ts","./src/app/shared/services/content.service.ts","./src/app/shared/services/country.service.ts","./src/app/partials/country-comparison-widget/country-comparison-widget.component.html","./src/app/partials/country-comparison-widget/country-comparison-widget.component.ts","./src/app/shared/enums/chart-type.enum.ts","./src/app/shared/services/smart-link.service.ts","./src/app/data-visualization/charts/sunburst/sunburst.component.ts","./src/app/data-visualization/charts/sunburst/sunburst.component.html","./src/app/data-visualization/charts/world-map/iso3-to-iso2.ts","./src/app/data-visualization/charts/world-map/world-map.component.html","./src/app/data-visualization/charts/world-map/world-map.component.ts","./src/app/shared/services/color.service.ts","./src/app/data-visualization/charts/stacked-bar/stacked-bar.component.html","./src/app/data-visualization/charts/stacked-bar/stacked-bar.component.ts","./src/app/data-visualization/charts/pie-chart/pie-chart.component.html","./src/app/data-visualization/charts/pie-chart/pie-chart.component.ts","./src/app/data-visualization/charts/iframe/iframe.component.ts","./src/app/data-visualization/charts/bar-chart/bar-chart.component.html","./src/app/data-visualization/charts/iframe/iframe.component.html","./src/app/data-visualization/charts/bar-chart/bar-chart.component.ts","./src/app/data-visualization/charts/scatter-plot/scatter-plot.component.html","./src/app/data-visualization/charts/scatter-plot/scatter-plot.component.ts","./src/app/data-visualization/components/aggregation-wrapper/aggregation-wrapper.component.html","./src/app/data-visualization/components/aggregation-wrapper/aggregation-wrapper.component.ts","./src/app/data-visualization/components/aggregation-widget/aggregation-widget.component.html","./src/app/data-visualization/components/aggregation-widget/aggregation-widget.component.ts","./src/app/pages/home/home.component.html","./src/app/pages/home/home.component.ts","./src/app/pages/indicators/indicators.component.html","./src/app/pages/indicators/indicators.component.ts","./src/app/shared/services/flash-message.service.ts","./src/app/pages/incentive-database/filter-loader.component.ts","./src/app/pages/incentive-database/incentive-loader.component.ts","./src/app/partials/multi-select-input/multi-select-input.component.html","./src/app/partials/multi-select-input/multi-select-input.component.ts","./src/app/shared/pipes/truncate.pipe.ts","./src/app/pages/incentive-database/incentive-database.component.html","./src/app/pages/incentive-database/incentive-database.component.ts","./src/app/resources/country/country-detail/country-detail-loader.component.ts","./src/app/resources/country/country-detail/country-detail.component.html","./src/app/resources/country/country-detail/country-detail.component.ts","./src/app/resources/country/country-list/country-list.component.html","./src/app/resources/country/country-list/country-list.component.ts","./src/app/resources/incentive/incentive-detail/incentive-detail.component.html","./src/app/resources/incentive/incentive-detail/incentive-detail.component.ts","./src/app/app-routing.module.ts","./src/app/partials/footer/footer.component.ts","./src/app/partials/footer/footer.component.html","./src/app/partials/header/header-countries-loader.component.ts","./src/app/partials/cart/list.animation.ts","./src/app/partials/cart/cart.component.html","./src/app/partials/cart/cart.component.ts","./src/app/partials/header/header.component.html","./src/app/partials/header/header.component.ts","./src/app/partials/flash-message/flash-message.component.html","./src/app/partials/flash-message/flash-message.component.ts","./src/app/app.component.ts","./src/app/app.component.html","./src/app/app.module.ts","./src/main.ts","./node_modules/moment/locale/ sync ^\\.\\/.*$"],"sourcesContent":["import { Injectable } from '@angular/core'\nimport { BehaviorSubject } from 'rxjs'\n\nimport { BreadcrumbLink } from '../interfaces/resources/breadcrumb-link.interface'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BreadcrumbService {\n breadcrumbLinks = new BehaviorSubject([])\n}\n","\n \n\n","import { Component, OnInit } from '@angular/core'\n\nimport { BreadcrumbLink } from '../../shared/interfaces/resources/breadcrumb-link.interface'\nimport { BreadcrumbService } from '../../shared/services/breadcrumb.service'\n\n@Component({\n selector: 'app-breadcrumb',\n templateUrl: './breadcrumb.component.html',\n styleUrls: ['./breadcrumb.component.scss']\n})\nexport class BreadcrumbComponent implements OnInit {\n breadcrumbLinks: BreadcrumbLink[]\n\n constructor(private breadcrumbService: BreadcrumbService) {}\n\n ngOnInit(): void {\n this.breadcrumbService.breadcrumbLinks.subscribe({\n next: (newBreadcrumbLinks: BreadcrumbLink[]) => {\n this.breadcrumbLinks = newBreadcrumbLinks\n }\n })\n }\n}\n","import { Component, OnInit } from '@angular/core'\nimport { BreadcrumbService } from 'src/app/shared/services/breadcrumb.service'\n\n@Component({\n selector: 'app-error404',\n templateUrl: './error404.component.html',\n styleUrls: ['./error404.component.scss']\n})\nexport class Error404Component implements OnInit {\n constructor(private breadcrumbService: BreadcrumbService) {}\n\n ngOnInit(): void {\n this.breadcrumbService.breadcrumbLinks.next([{ label: 'Error 404' }])\n }\n}\n","
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n

Page not found

\n

\n Error 404\n

\n

Sorry you landed on this error page

\n

Please use the navigation to find what you were looking for.

\n
\n
\n
\n","import { MetaObject } from '../interfaces/meta-object.interface'\n\nexport const metaDataContent: {\n [key: string]: MetaObject\n} = {\n defaultMeta: {\n title: 'OECD INNOTAX',\n description: '',\n path: ''\n },\n\n home: {\n title: 'OECD',\n description:\n 'An OECD tool to explore and compare R&D tax incentives in OECD countries and partner economies.',\n path: ''\n },\n\n about: {\n title: 'About',\n description:\n 'Background on the OECD INNOTAX portal and its purpose. This page additionally provides information on the data methodology and related OECD work.',\n path: 'about'\n },\n\n indicators: {\n title: 'Indicators & Analysis',\n description:\n 'Quantitative indicators on the policy mix and generosity of public support for R&D and innovation, drawing on the OECD R&D tax incentives database.',\n path: 'indicators-and-analysis'\n },\n\n comparator: {\n title: 'Tax incentive comparison',\n description:\n 'A navigation tool to explore and compare the design of R&D tax incentives in OECD countries and partner economies in a side-by-side comparison.',\n path: 'comparator'\n },\n\n incentives: {\n title: 'Find Incentives',\n description:\n 'A navigation tool to explore and compare the design of R&D tax incentives in OECD countries and partner economies in a side-by-side comparison.',\n path: 'incentives'\n },\n\n countries: {\n title: 'Country overview',\n description:\n 'OECD countries and partner economies: Select a country for obtaining information on country-specific R&D tax incentives and support schemes.',\n path: 'countries'\n },\n\n // Other.\n error404: {\n title: 'Error 404 : Page not found - OECD RD TAX',\n description: 'We could not find the page you are looking for.',\n path: '404'\n }\n}\n","import { Injectable } from '@angular/core'\nimport { Observable } from 'rxjs'\nimport { HttpClient } from '@angular/common/http'\nimport { shareReplay } from 'rxjs/operators'\n\nimport { environment } from '../../../environments/environment'\nimport { Environment } from '../interfaces/environment.interface'\n/*\n * This service allows to exclude env variables from the bundle for CI reasons.\n * Indeed we need to have exactly the same artifact for different versions (pre-prod, prod...) and this is not the case on Angular builds.\n * That is why we get env variables from a config.json file located at the root of the build\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class EnvironmentService {\n private readonly ENV_URL = environment.envFileUrl\n private environment$: Observable\n\n constructor(private http: HttpClient) {}\n\n public loadEnvironment(): Observable {\n if (!this.environment$) {\n this.environment$ = this.http\n .get(this.ENV_URL)\n .pipe(shareReplay(1))\n }\n return this.environment$\n }\n}\n","export const environment = {\n production: true,\n envFileUrl: 'app-config.json'\n}\n","import { Injectable } from '@angular/core'\nimport { Title, Meta } from '@angular/platform-browser'\nimport { metaDataContent } from '../content/meta-data.content'\nimport { MetaObject } from '../interfaces/meta-object.interface'\nimport { environment } from '../../../environments/environment'\nimport { EnvironmentService } from './environment.service'\nimport { Environment } from '../interfaces/environment.interface'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class MetaService {\n defaultMeta: MetaObject = metaDataContent['defaultMeta']\n\n metaTitleSuffix = ' | INNOTAX Portal'\n\n environment: Environment\n\n constructor(\n private title: Title,\n private meta: Meta,\n private environmentService: EnvironmentService\n ) {\n this.environmentService.loadEnvironment().subscribe((env) => {\n this.environment = env\n })\n }\n\n setTags(pageName: string): void {\n const meta = metaDataContent[pageName] || this.defaultMeta\n\n this.title.setTitle(\n meta.title + this.metaTitleSuffix || (this.defaultMeta.title as string)\n )\n this.meta.updateTag({\n name: 'description',\n content: meta.description || (this.defaultMeta.description as string)\n })\n }\n\n setDynamicTags(pageMeta: MetaObject): void {\n this.title.setTitle(\n pageMeta.title + this.metaTitleSuffix ||\n (this.defaultMeta.title as string)\n )\n this.meta.updateTag({\n name: 'description',\n content: pageMeta.description || (this.defaultMeta.description as string)\n })\n this.meta.updateTag({\n name: 'og:description',\n content: pageMeta.description || (this.defaultMeta.description as string)\n })\n this.meta.updateTag({\n name: 'og:title',\n content: pageMeta.title || (this.defaultMeta.title as string)\n })\n this.meta.updateTag({\n name: 'og:url',\n content: this.environment.baseUrl + pageMeta.path\n })\n this.meta.updateTag({\n name: 'og:image',\n content:\n pageMeta.absoluteOgImage || (this.defaultMeta.absoluteOgImage as string)\n })\n }\n}\n","import { Component, OnInit } from '@angular/core'\nimport { BreadcrumbService } from 'src/app/shared/services/breadcrumb.service'\nimport { MetaService } from 'src/app/shared/services/meta.service'\n\n@Component({\n selector: 'app-about',\n templateUrl: './about.component.html',\n styleUrls: ['./about.component.scss']\n})\nexport class AboutComponent implements OnInit {\n constructor(\n private breadcrumbService: BreadcrumbService,\n private metaService: MetaService\n ) {}\n\n ngOnInit(): void {\n this.breadcrumbService.breadcrumbLinks.next([{ label: 'About' }])\n this.metaService.setTags('about')\n }\n}\n","
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

About

\n\n

Why this portal?

\n

\n The OECD INNOTAX portal is the reference platform for policy analysis\n and comparison and up-to-date evidence on the use, generosity, cost\n and impact of R&D tax incentives supporting government officials,\n policy analysts and scholars. Tax incentives for business R&D\n expenditures have become a major tool in the business innovation\n support policy mix of countries in the OECD area and beyond. Since\n 2007, the OECD has continuously worked to extend the international\n evidence on R&D tax incentives and has developed methodologies (OECD, 2015) and\n data infrastructures\n that are widely used by experts in the policy, statistical, tax\n advisory and academic arena.\n

\n

\n This new and interactive OECD tool, developed with financial support\n from the EU Horizon Programme, builds upon and extends the existing\n OECD research infrastructure on R&D tax incentives, enabling users to visualise, explore and compare the design and\n administration of R&D tax incentives across OECD countries and partner\n economies, and access the latest OECD indicators and analysis in this\n area. The portal is hosted by the\n OECD-EC STIP Compass policy database, a leading resource on national policies for science, technology and\n innovation.\n

\n

\n Where do the data in the INNOTAX portal come from?\n

\n

\n INNOTAX provides the most up-to-date information on the design,\n implementation and role of R&D tax incentives in the innovation policy\n mix of OECD countries and partner economies, drawing on the\n contributions of members of the OECD R&D tax incentives expert network\n to the annual OECD R&D tax incentives data collection. The OECD expert\n network on R&D tax incentives comprises government officials from STI\n ministries, tax offices and national statistical organisations (NSOs)\n in all OECD member countries, EU member states and several other major\n economies, with responsibility for responding to the OECD surveys on\n R&D tax incentives. This informal network draws on contacts from the\n OECD Committee for Scientific and Technological Policy (CSTP), its\n Working Party of National Experts on Science and Technology Indicators\n (NESTI) and the Committee on Fiscal Affairs' Working Party No. 2 on\n Tax Policy Analysis and Tax Statistics (WP2).\n

\n\n

\n What are the main features of the INNOTAX portal?\n

\n

\n The OECD INNOTAX portal incorporates interactive dashboards for the\n visualisation of key design features and the similarity of national\n R&D tax incentive schemes, coupled with interactive charts that\n provide the latest evidence on the use, generosity and cost of R&D tax\n relief in the OECD area and beyond. In addition to these interactive\n dashboards and charts, INNOTAX provides a sophisticated interactive\n tool with smart filtering that facilitates policy discovery, analysis\n and comparison, including the retrieval of R&D tax incentive schemes\n with similar design features. The visual interfaces allow users to\n seamlessly query the INNOTAX database to identify and compare national\n R&D tax incentive schemes on a wide range of different dimensions that\n relate to the design and implementation of R&D tax incentives.\n

\n\n

\n Your opinion matters to us\n

\n

\n Send us\n your feedback and suggestions on how to improve our tool.\n

\n
\n
\n
\n
\n","export const appConstants = {\n windowBreakpoints: {\n mobile: 768,\n tablet: 1008,\n desktop: 1140,\n wideScreen: 1284,\n fullHD: 1440\n },\n incentives: {\n OECDmedianId: 'OECD1',\n EUmedianId: 'EU1'\n },\n cyprusNote:\n 'Note by Türkiye: The information in the documents with reference to \"Cyprus\" relates to the southern part of the Island. There is no single authority representing both Turkish and Greek Cypriot people on the Island. Türkiye recognizes the Turkish Republic of Northern Cyprus (TRNC). Until a lasting and equitable solution is found within the context of the United Nations, Türkiye shall preserve its position concerning the \"Cyprus issue\". Note by all the European Union Member States of the OECD and the European Union: The Republic of Cyprus is recognised by all members of the United Nations with the exception of Türkiye. The information in the documents relates to the area under the effective control of the Government of the Republic of Cyprus.'\n}\n","export enum IncentiveMode {\n CountryView = 'country',\n List = 'list',\n Comparison = 'comparison',\n Detail = 'detail',\n Export = 'export'\n}\n","export enum TargetApiRoutes {\n Visualizations = 'main',\n Incentives = 'incentives',\n Incentive = 'incentive',\n Countries = 'countries',\n Country = 'country',\n Themes = 'themes',\n Filters = 'filters',\n Indicators = 'indicators'\n}\n","import { HttpClient } from '@angular/common/http'\nimport { Injectable } from '@angular/core'\nimport { firstValueFrom } from 'rxjs'\n\nimport { environment } from '../../../environments/environment'\nimport { IncentiveMode } from '../enums/incentive-mode.enum'\nimport { TargetApiRoutes } from '../enums/target-api-routes.enum'\nimport { Environment } from '../interfaces/environment.interface'\nimport { Theme } from '../interfaces/resources/theme.interface'\nimport { EnvironmentService } from './environment.service'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ThemeService {\n environment: Environment\n\n constructor(\n private http: HttpClient,\n private environmentService: EnvironmentService\n ) {\n this.environmentService.loadEnvironment().subscribe((env) => {\n this.environment = env\n })\n }\n\n list(params?: { mode?: IncentiveMode }): Promise {\n return firstValueFrom(\n this.http.get(`${this.environment.apiBaseUrl}${TargetApiRoutes.Themes}`, {\n params\n })\n ).then((themeRes: Object) => {\n return themeRes as Theme[]\n })\n }\n}\n","import { HttpClient } from '@angular/common/http'\nimport { Injectable } from '@angular/core'\nimport { saveAs } from 'file-saver'\nimport { firstValueFrom } from 'rxjs'\n\nimport { appConstants } from '../../app.constants'\nimport { IncentiveMode } from '../enums/incentive-mode.enum'\nimport { TargetApiRoutes } from '../enums/target-api-routes.enum'\nimport { Environment } from '../interfaces/environment.interface'\nimport { Paginator } from '../interfaces/paginator.interface'\nimport { Field } from '../interfaces/resources/field.interface'\nimport { Incentive } from '../interfaces/resources/incentive.interface'\nimport { Theme } from '../interfaces/resources/theme.interface'\nimport { EnvironmentService } from './environment.service'\nimport { ThemeService } from './theme.service'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class IncentiveService {\n environment: Environment\n\n constructor(\n private http: HttpClient,\n private themeService: ThemeService,\n private environmentService: EnvironmentService\n ) {\n this.environmentService.loadEnvironment().subscribe((env) => {\n this.environment = env\n })\n }\n\n list(listParams: {\n ids?: string[]\n withoutPagination?: boolean\n similarTo?: string\n fields?: { [key: string]: string }\n mode?: IncentiveMode\n sortBy?: string\n page?: number\n }): Promise | Incentive[]> {\n let params: any = {}\n\n if (listParams.withoutPagination) {\n params.withoutPagination = true\n } else {\n params.page = listParams.page ? listParams.page.toString() : '1'\n }\n\n if (listParams.ids) {\n params.ids = listParams.ids.join(',')\n }\n\n if (listParams.fields) {\n Object.assign(params, listParams.fields)\n }\n\n if (listParams.similarTo) {\n params.similarTo = listParams.similarTo\n }\n\n if (listParams.sortBy) {\n params.sortBy = listParams.sortBy\n }\n\n if (listParams.mode) {\n params.mode = listParams.mode\n }\n\n if (params.withoutPagination) {\n return (\n firstValueFrom(\n this.http.get(\n `${this.environment.apiBaseUrl}${TargetApiRoutes.Incentives}`,\n {\n params: params\n }\n )\n ) as Promise\n ).then((incentiveRes: Incentive[]) =>\n incentiveRes.map((incentive) => this.formatIncentive(incentive))\n )\n } else {\n return (\n firstValueFrom(\n this.http.get(\n `${this.environment.apiBaseUrl}${TargetApiRoutes.Incentives}`,\n {\n params: params\n }\n )\n ) as Promise>\n ).then((paginator: Paginator) => {\n paginator.data.map((incentive) => this.formatIncentive(incentive))\n }) as Promise>\n }\n }\n\n listPaginated(\n listParams: {\n ids?: string[]\n withoutPagination?: boolean\n fields?: { [key: string]: string }\n mode?: IncentiveMode\n similarTo?: string\n page?: number\n } = {}\n ): Promise> {\n return this.list({\n ...listParams,\n withoutPagination: false\n }) as Promise>\n }\n\n listWithoutPagination(\n listParams: {\n ids?: string[]\n withoutPagination?: boolean\n fields?: { [key: string]: string }\n mode?: IncentiveMode\n similarTo?: string\n sortBy?: string\n page?: number\n } = {}\n ): Promise {\n return this.list({\n ...listParams,\n withoutPagination: true\n }) as Promise\n }\n\n show(id: string): Promise {\n return (\n firstValueFrom(\n this.http.get(\n `${this.environment.apiBaseUrl}${TargetApiRoutes.Incentive}`,\n {\n params: {\n id,\n mode: IncentiveMode.Detail\n }\n }\n )\n ) as Promise\n ).then((incentiveRes: Incentive) => {\n return this.formatIncentive(incentiveRes)\n })\n }\n\n async download(ids: string[]): Promise {\n const incentives: Incentive[] = await this.listWithoutPagination({\n ids,\n mode: IncentiveMode.Export\n })\n\n const themes: Theme[] = await this.themeService.list({\n mode: IncentiveMode.Export\n })\n\n const flatFields: Field[] = themes.reduce(\n (acc: Field[], theme: Theme) => [\n ...acc,\n ...theme.fields,\n ...theme.subThemes.map((subTheme: Theme) => subTheme.fields).flat()\n ],\n []\n )\n\n let headings: string = flatFields\n .map((field) => `\"${field.label}\"`)\n .join(',')\n const content: string[] = incentives.map((incentive: Incentive) =>\n flatFields\n .map((flatField: Field) =>\n this.formatCSVString(incentive.values[flatField.id])\n )\n\n .join(',')\n )\n\n // Add Cyprus special note.\n if (incentives.every((incentive) => incentive.country.label === 'Cyprus')) {\n headings =\n `\"${appConstants.cyprusNote.replace(/\"/g, '\"\"')}\",` +\n flatFields.map((field) => `\"\"`) +\n '\\r\\n' +\n headings\n }\n\n const csv = [headings, ...content].join('\\r\\n')\n const blob = new Blob([csv], { type: 'text/csv' })\n\n saveAs(blob, 'INNOTAX incentive exports.csv')\n }\n\n formatIncentive(incentive: Incentive): Incentive {\n return {\n ...incentive,\n values: incentive.fields.reduce(\n (valueObject, field: Field) => ({\n ...valueObject,\n [field.id]: this.extractTooltip(field.value)\n }),\n {}\n ),\n tooltipValues: incentive.fields.reduce(\n (valueObject, field: Field) => ({\n ...valueObject,\n [field.id]: this.extractTooltip(field.value, true)\n }),\n {}\n ),\n isDisabled:\n incentive.fields.find((f) => f.id === 'f:active')?.value === 'Repealed'\n }\n }\n\n private formatCSVString(str: string): string {\n if (!str) {\n return '\"-\"'\n }\n return `\"${str.replace(/\"/g, '\"\"')}\"`\n }\n\n private extractTooltip(str: string, getTooltipPart?: boolean): string {\n const tooltipMarker: string = 'infoTooltip:'\n if (!str.includes(tooltipMarker)) {\n return getTooltipPart ? null : str\n }\n\n return getTooltipPart\n ? str.split(tooltipMarker)[1]\n : str.split(tooltipMarker)[0]\n }\n}\n","import { Injectable } from '@angular/core'\nimport { Subject } from 'rxjs'\n\nimport { Favorite } from '../interfaces/resources/favorite.interface'\nimport { Incentive } from '../interfaces/resources/incentive.interface'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FavoriteService {\n favoriteIncentives = new Subject()\n localStorageKey = 'oecdRdTax'\n\n list(): Favorite[] {\n const appLocalStorage: {\n favoriteIncentives: Favorite[]\n } = JSON.parse(localStorage.getItem(this.localStorageKey) as string)\n\n return appLocalStorage?.favoriteIncentives || []\n }\n\n toggle(selectedIncentive: Incentive): boolean {\n const favoriteIncentives: Favorite[] = this.list()\n\n const isFavorite: boolean = this.isFavorite(selectedIncentive)\n\n if (isFavorite) {\n favoriteIncentives.splice(\n favoriteIncentives.findIndex(\n (favoriteIncentive) => favoriteIncentive.id === selectedIncentive.id\n ),\n 1\n )\n } else {\n favoriteIncentives.push({\n id: selectedIncentive.id,\n label: selectedIncentive.label,\n image: selectedIncentive.country.image\n })\n }\n\n localStorage.setItem(\n this.localStorageKey,\n JSON.stringify({\n favoriteIncentives\n })\n )\n\n this.favoriteIncentives.next(favoriteIncentives)\n return !isFavorite\n }\n\n add(incentives: Incentive | Incentive[]) {\n if (!Array.isArray(incentives)) {\n incentives = [incentives]\n }\n\n const favoriteIncentives: Favorite[] = this.list()\n\n incentives.forEach((incentive) => {\n if (!this.isFavorite(incentive)) {\n favoriteIncentives.push({\n id: incentive.id,\n label: incentive.label,\n image: incentive.country.image\n })\n }\n })\n\n localStorage.setItem(\n this.localStorageKey,\n JSON.stringify({\n favoriteIncentives\n })\n )\n\n this.favoriteIncentives.next(this.list())\n }\n\n isFavorite(incentive: Incentive | string): boolean {\n if (typeof incentive === 'string') {\n return !!this.list().find(\n (favoriteIncentive: Favorite) => favoriteIncentive.id === incentive\n )\n }\n\n return !!this.list().find(\n (favoriteIncentive: Favorite) => favoriteIncentive.id === incentive.id\n )\n }\n\n removeAllFavorites() {\n localStorage.setItem(\n this.localStorageKey,\n JSON.stringify({\n favoriteIncentives: []\n })\n )\n this.favoriteIncentives.next([])\n }\n\n remove(ids: string | string[]) {\n if (typeof ids === 'string') {\n ids = [ids]\n }\n\n localStorage.setItem(\n this.localStorageKey,\n JSON.stringify({\n favoriteIncentives: this.list().filter(\n (favoriteIncentive: { id: string; label: string }) =>\n !ids.includes(favoriteIncentive.id)\n )\n })\n )\n\n this.favoriteIncentives.next(this.list())\n }\n\n replaceByNewValues(incentives: Incentive[]) {\n localStorage.setItem(\n this.localStorageKey,\n JSON.stringify({\n favoriteIncentives: incentives.map((incentive) => ({\n id: incentive.id,\n label: incentive.label,\n image: incentive.country.image\n }))\n })\n )\n }\n}\n","import { HttpClient } from '@angular/common/http'\nimport { Injectable } from '@angular/core'\nimport { firstValueFrom } from 'rxjs'\n\nimport { TargetApiRoutes } from '../enums/target-api-routes.enum'\nimport { Environment } from '../interfaces/environment.interface'\nimport { Filter } from '../interfaces/resources/filter.interface'\nimport { EnvironmentService } from './environment.service'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FilterService {\n environment: Environment\n filtersLocalStorageKey = `InnotaxPersistentFilters`\n\n constructor(\n private http: HttpClient,\n private environmentService: EnvironmentService\n ) {\n this.environmentService.loadEnvironment().subscribe((env) => {\n this.environment = env\n })\n }\n\n list(): Promise {\n return firstValueFrom(\n this.http.get(`${this.environment.apiBaseUrl}${TargetApiRoutes.Filters}`)\n ).then((filterRes: Object) => {\n return filterRes as Filter[]\n })\n }\n\n getSavedFilters(): { [key: string]: string[] } {\n return JSON.parse(localStorage.getItem(this.filtersLocalStorageKey) || '{}')\n }\n\n saveFilters(filters: Filter[]): void {\n const activeFilters: { [key: string]: string[] } = {}\n\n filters.forEach((filter) => {\n if (filter.activeOptions.length) {\n activeFilters[filter.fieldId] = filter.activeOptions\n }\n })\n\n localStorage.setItem(\n this.filtersLocalStorageKey,\n JSON.stringify(activeFilters)\n )\n }\n}\n","\n \n Add to comparison\n\n","import { Component, Input, OnInit } from '@angular/core'\n\nimport { Incentive } from '../../shared/interfaces/resources/incentive.interface'\nimport { FavoriteService } from '../../shared/services/favorite.service'\n\n@Component({\n selector: 'app-favorite-button',\n templateUrl: './favorite-button.component.html',\n styleUrls: ['./favorite-button.component.scss']\n})\nexport class FavoriteButtonComponent implements OnInit {\n @Input() incentive: Incentive\n @Input() compact: boolean\n\n isFavorite: boolean\n tooltipContent: string\n\n constructor(private favoriteService: FavoriteService) {}\n\n ngOnInit(): void {\n this.tooltipContent = this.getTooltipContent()\n this.isFavorite = this.favoriteService.isFavorite(this.incentive)\n\n this.favoriteService.favoriteIncentives.subscribe((incentives) => {\n this.isFavorite = this.favoriteService.isFavorite(this.incentive)\n })\n }\n\n toggleFavorite(incentive: Incentive) {\n this.isFavorite = this.favoriteService.toggle(incentive)\n this.tooltipContent = this.getTooltipContent()\n }\n\n getTooltipContent() {\n if (!this.compact) {\n return null\n }\n\n return this.isFavorite ? 'Remove from comparison' : 'Add to comparison'\n }\n}\n","import { Component } from '@angular/core'\n\n@Component({\n selector: 'app-incentive-comparator-loader',\n template: `
\n
\n
\n \n
\n \n
\n
\n
\n
\n
\n
\n \n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n
\n
\n
\n
\n `\n})\nexport class IncentiveComparatorLoaderComponent {}\n","
\n
\n
\n
\n

\n Order incentives\n

\n
\n
\n

\n You can order the display of incentives in the comparator view using\n drag and drop\n

\n\n
\n \n \n \n \n \n {{ incentive.label }} \n
\n
\n
\n
\n \n\n \n \n \n \n \n \n \n\n","import {\n Component,\n EventEmitter,\n Input,\n OnChanges,\n Output,\n Renderer2\n} from '@angular/core'\nimport { DndDropEvent } from 'ngx-drag-drop'\n\nimport { appConstants } from '../../../app.constants'\nimport { Incentive } from '../../../shared/interfaces/resources/incentive.interface'\n\n@Component({\n selector: 'app-order-incentives-modal',\n templateUrl: './order-incentives-modal.component.html',\n styleUrls: ['./order-incentives-modal.component.scss']\n})\nexport class OrderIncentivesModalComponent implements OnChanges {\n @Input() incentives: Incentive[]\n @Output() onCloseModal: EventEmitter = new EventEmitter()\n\n constructor(private renderer: Renderer2) {}\n\n ngOnChanges(): void {\n if (this.incentives?.length) {\n this.incentives = this.incentives.filter(\n (incentive) =>\n incentive.id !== appConstants.incentives.OECDmedianId &&\n incentive.id !== appConstants.incentives.EUmedianId\n )\n }\n\n this.renderer.addClass(document.querySelector('html'), 'is-clipped')\n }\n\n ngOnDestroy(): void {\n this.renderer.removeClass(document.querySelector('html'), 'is-clipped')\n }\n\n onDrag(item: Incentive) {\n const index = this.incentives.indexOf(item)\n this.incentives.splice(index, 1)\n }\n\n onDrop(event: DndDropEvent) {\n let index = event.index\n if (typeof index === 'undefined') {\n index = this.incentives.length\n }\n\n this.incentives.splice(index, 0, event.data)\n }\n\n close(saveChanges: boolean) {\n if (saveChanges) {\n this.onCloseModal.emit(this.incentives.map((incentive) => incentive.id))\n } else {\n this.onCloseModal.emit()\n }\n }\n}\n","= 5\n }\"\n>\n
\n \n \n \n \n \n = visibleIncentiveCount\n }\"\n >\n\n \n
\n
\n
\n \n \n \n {{ incentive.label }}\n {{ incentive.label }}\n \n \n \n
\n \n \n \n {{ incentive.country.label }}\n \n \n \n \n \n Compare with similar incentives\n

\n
\n \n \n \n\n
\n \n \n
\n \n
\n \n \n \n {{ theme.label }}\n
\n \n
\n \n \n \n
\n \n
\n
\n

\n Display / hide {{ theme.label }} fields\n

\n
\n \n \n {{ field.label }}\n \n\n \n \n
\n
\n

\n {{ subTheme.label }}\n

\n
\n\n \n \n {{ subField.label }}\n \n
\n
\n
\n
\n
\n \n \n\n \n \n \n \n \n \n\n \n \n \n
\n \n {{ field.label }}\n
\n
\n \n \n \n {{ incentive.values[field.id] }}\n \n \n \n Reduce\n
\n \n -\n \n Extend\n \n
\n \n \n \n\n \n \n \n
\n \n {{\n subTheme.label\n }}\n
\n \n \n \n \n \n \n \n\n \n
\n
\n \n {{ subField.label }}\n
\n
\n \n \n \n {{ incentive.values[subField.id] }}\n \n \n \n Reduce\n
\n \n -\n
\n Extend\n \n
\n \n \n \n \n \n \n \n \n \n\n \n
\n
\n
\n
\n
\n \n \n

\n You have not selected any tax incentives for comparison\n

\n
\n
    \n
  1. \n Explore and add tax incentives through the \"Find incentives\"\n tab\n
  2. \n
  3. Select the incentives you want to compare
  4. \n
  5. \n Take advantage of comparison interface of the OECD INNOTAX\n portal to compare R&D tax incentives in OECD and partner\n economies along the design parameters of interest to you.\n
  6. \n
\n Find incentives\n
\n
\n
\n
\n \n \n\n \n\n\n\n","import {\n Component,\n EventEmitter,\n HostListener,\n Input,\n OnChanges,\n Output,\n QueryList,\n ViewChildren\n} from '@angular/core'\nimport { firstValueFrom, forkJoin } from 'rxjs'\n\nimport { appConstants } from '../../../app.constants'\nimport { IncentiveMode } from '../../../shared/enums/incentive-mode.enum'\nimport { Incentive } from '../../../shared/interfaces/resources/incentive.interface'\nimport { Theme } from '../../../shared/interfaces/resources/theme.interface'\nimport { FavoriteService } from '../../../shared/services/favorite.service'\nimport { IncentiveService } from '../../../shared/services/incentive.service'\nimport { ThemeService } from '../../../shared/services/theme.service'\n\n@Component({\n selector: 'app-incentive-comparator',\n templateUrl: './incentive-comparator.component.html',\n styleUrls: ['./incentive-comparator.component.scss']\n})\nexport class IncentiveComparatorComponent implements OnChanges {\n @Input() incentiveIds: string[]\n @Input() mode: IncentiveMode = IncentiveMode.Comparison\n @Input() isOrderable: boolean = false\n @Input() isFavoriteButtonDisplayed: boolean = false\n @Input() isShowSimilarDisplayed: boolean = false\n @Input() allowDeleteIncentive: boolean = false\n @Input() showAdviceIfEmpty: boolean = false\n @Input() sortBy: string\n\n @Output() orderChanged: EventEmitter = new EventEmitter()\n\n @ViewChildren('valueField') valueFields: QueryList\n\n incentives: Incentive[]\n themes: Theme[]\n\n OECDmedianId: string = appConstants.incentives.OECDmedianId\n EUmedianId: string = appConstants.incentives.EUmedianId\n\n showOECDMedian: boolean = false\n showEUMedian: boolean = false\n incentiveOECDMedian: Incentive\n incentiveEUMedian: Incentive\n\n themeVisibilityDialogOpen: string\n loading: boolean = false\n\n isOrderIncentivesModalOpen: boolean = false\n\n isCarouselActive: boolean = false\n carouselIndex = 0\n visibleIncentiveCount: number = 0\n maxVisibleIncentives: number\n\n Mode = IncentiveMode\n\n constructor(\n private incentiveService: IncentiveService,\n private favoriteService: FavoriteService,\n private themeService: ThemeService\n ) {}\n\n ngOnChanges(): void {\n if (!this.incentiveIds || this.incentiveIds.length === 0) {\n this.incentives = []\n return\n }\n\n this.loading = true\n\n this.showOECDMedian = false\n this.showEUMedian = false\n\n this.incentiveService\n .listWithoutPagination({\n mode: this.mode,\n sortBy: this.sortBy,\n ids: this.incentiveIds\n })\n .then(\n (incentiveRes: Incentive[]) => {\n if (this.incentiveIds && !this.sortBy) {\n this.incentives = this.orderIncentivesByIds(\n this.incentiveIds,\n incentiveRes\n )\n } else {\n this.incentives = incentiveRes\n }\n\n firstValueFrom(\n forkJoin([\n this.incentiveService.show(this.EUmedianId),\n this.incentiveService.show(this.OECDmedianId)\n ])\n ).then(([EUMedianIncentive, OECDMedianRes]) => {\n this.incentiveEUMedian = EUMedianIncentive\n this.incentiveOECDMedian = OECDMedianRes\n\n this.incentives.unshift(EUMedianIncentive)\n this.incentives.unshift(OECDMedianRes)\n\n this.initCarousel()\n this.initTruncateMultiLineValues()\n\n this.loading = false\n })\n },\n (err) => {\n this.loading = false\n }\n )\n\n this.themeService.list({ mode: this.mode }).then((themeRes: Theme[]) => {\n this.themes = themeRes\n })\n }\n\n removeIncentiveFromComparator(incentiveIdToDelete: string) {\n this.favoriteService.remove(incentiveIdToDelete)\n\n this.incentives = this.incentives.filter(\n (incentive: Incentive) => incentive.id !== incentiveIdToDelete\n )\n this.visibleIncentiveCount = this.getVisibleIncentiveCount()\n }\n\n hasVisibleSubFields(theme: Theme): boolean {\n return theme.fields.some((f) => !f.isHidden)\n }\n\n toggleThemeVisibility(themeId: string) {\n if (this.themeVisibilityDialogOpen === themeId) {\n this.themeVisibilityDialogOpen = ''\n } else {\n this.themeVisibilityDialogOpen = themeId\n }\n }\n\n // Setup carousel based on window width and number of visible incentives.\n initCarousel() {\n this.visibleIncentiveCount = this.getVisibleIncentiveCount()\n\n const incentiveWidth = 280\n const sidebarWidth = 254\n\n switch (true) {\n // Mobile.\n case window.innerWidth < appConstants.windowBreakpoints.mobile &&\n this.visibleIncentiveCount > 1:\n this.isCarouselActive = true\n this.maxVisibleIncentives = 1\n break\n // Tablet and desktop.\n case window.innerWidth < appConstants.windowBreakpoints.fullHD &&\n this.visibleIncentiveCount > 3:\n this.isCarouselActive = true\n this.maxVisibleIncentives = 3\n break\n // Full HD.\n case window.innerWidth >= appConstants.windowBreakpoints.fullHD &&\n this.visibleIncentiveCount * incentiveWidth >\n window.innerWidth - sidebarWidth:\n this.isCarouselActive = true\n this.maxVisibleIncentives = Math.floor(\n (window.innerWidth - sidebarWidth) / incentiveWidth\n )\n break\n default:\n this.isCarouselActive = false\n }\n }\n\n // Truncate multi-line values based on field size and content.\n initTruncateMultiLineValues() {\n setTimeout(() => {\n this.valueFields.forEach((vF) => {\n // Get line height of the field. We need to add 1px to the value to avoid miscalculations on mobile.\n const lineHeight =\n Math.floor(\n parseFloat(\n window\n .getComputedStyle(vF.nativeElement)\n .lineHeight.substring(0, 2)\n )\n ) + 1\n\n if (vF.nativeElement.offsetHeight > lineHeight) {\n vF.nativeElement.classList.add(\n 'has-multiline-content',\n 'is-truncated'\n )\n }\n })\n }, 100)\n }\n\n getVisibleIncentiveCount() {\n return (\n this.incentives.length -\n (this.showEUMedian ? 0 : 1) -\n (this.showOECDMedian ? 0 : 1)\n )\n }\n\n // Extend or truncate multi-line values. The whole line is concerned (includes values of the same field in other incentives).\n toggleExtendValue(elemClassName: string) {\n const valueFields: HTMLCollectionOf =\n document.getElementsByClassName(elemClassName)\n Array.from(valueFields).forEach((elem: Element) => {\n elem.classList.toggle('is-truncated')\n })\n }\n\n onOrderChanged(incentiveIdsInOrder: string[]) {\n this.isOrderIncentivesModalOpen = false\n if (incentiveIdsInOrder.length) {\n this.incentives = this.orderIncentivesByIds(\n incentiveIdsInOrder,\n this.incentives\n )\n\n this.incentives.unshift(this.incentiveEUMedian)\n this.incentives.unshift(this.incentiveOECDMedian)\n\n this.orderChanged.emit(this.incentives)\n }\n }\n\n private orderIncentivesByIds(\n incentiveIdsInOrder: string[],\n incentives: Incentive[]\n ): Incentive[] {\n return incentiveIdsInOrder.map((id: string) =>\n incentives.find((i: Incentive) => i.id === id)\n )\n }\n\n @HostListener('document:click', ['$event.target'])\n clickOut(eventTarget: any) {\n if (\n eventTarget.className.includes('dropdown-item') ||\n eventTarget.className.includes('fa-solid fa-sliders')\n ) {\n } else {\n this.themeVisibilityDialogOpen = ''\n }\n }\n\n @HostListener('window:resize', ['$event'])\n onResize() {\n this.initCarousel()\n this.initTruncateMultiLineValues()\n }\n}\n","
\n
\n
\n
\n \n
\n
\n
\n
\n\n\n
\n
\n
\n
\n

\n \n \n \n \n \n \n \n \n \n Modify selection\n \n

\n
\n \n

\n This interactive interface allows you to view and compare key features\n of several R&D tax incentives at a glance, and find incentives with\n similar features.\n

\n
\n
\n
\n\n \n\n","import { Component, OnInit } from '@angular/core'\nimport { MetaService } from 'src/app/shared/services/meta.service'\n\nimport { Incentive } from '../../shared/interfaces/resources/incentive.interface'\nimport { BreadcrumbService } from '../../shared/services/breadcrumb.service'\nimport { FavoriteService } from '../../shared/services/favorite.service'\nimport { FilterService } from '../../shared/services/filter.service'\nimport { IncentiveService } from '../../shared/services/incentive.service'\n\n@Component({\n selector: 'app-comparator',\n templateUrl: './comparator.component.html',\n styleUrls: ['./comparator.component.scss']\n})\nexport class ComparatorComponent implements OnInit {\n favoriteIncentiveIds: string[]\n loadingDownload: boolean = false\n savedFilters: { [key: string]: string[] } = {}\n\n constructor(\n breadcrumbService: BreadcrumbService,\n private incentiveService: IncentiveService,\n private favoriteService: FavoriteService,\n private filterService: FilterService,\n metaService: MetaService\n ) {\n metaService.setTags('comparator')\n breadcrumbService.breadcrumbLinks.next([{ label: 'Compare incentives' }])\n }\n\n ngOnInit(): void {\n this.favoriteIncentiveIds = this.favoriteService.list().map((s) => s.id)\n this.savedFilters = this.filterService.getSavedFilters()\n }\n\n async downloadIncentives(incentiveIds: string[]): Promise {\n this.loadingDownload = true\n await this.incentiveService.download(incentiveIds)\n this.loadingDownload = false\n }\n\n onOrderChanged(incentives: Incentive[]): void {\n this.favoriteService.replaceByNewValues(incentives)\n }\n}\n","import { HttpClient } from '@angular/common/http'\nimport { Injectable } from '@angular/core'\nimport { firstValueFrom } from 'rxjs'\n\nimport { environment } from '../../../environments/environment'\nimport { TargetApiRoutes } from '../enums/target-api-routes.enum'\nimport { Environment } from '../interfaces/environment.interface'\nimport { AggregationGroup } from '../interfaces/visualizations/aggregation-group.interface'\nimport { Aggregation } from '../interfaces/visualizations/aggregation.interface'\nimport { EnvironmentService } from './environment.service'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class VisualizationService {\n environment: Environment\n\n constructor(\n private http: HttpClient,\n private environmentService: EnvironmentService\n ) {\n this.environmentService.loadEnvironment().subscribe((env) => {\n this.environment = env\n })\n }\n\n listMainVisualizations(): Promise<{\n aggregations: Aggregation[]\n otherAggregation: Aggregation\n }> {\n return firstValueFrom(\n this.http.get(\n `${this.environment.apiBaseUrl}${TargetApiRoutes.Visualizations}`\n )\n ) as Promise<{ aggregations: Aggregation[]; otherAggregation: Aggregation }>\n }\n\n listIndicatorVisualizations(): Promise<{\n aggregationGroups: AggregationGroup[]\n }> {\n return firstValueFrom(\n this.http.get(\n `${this.environment.apiBaseUrl}${TargetApiRoutes.Indicators}`\n )\n ) as Promise<{\n aggregationGroups: AggregationGroup[]\n }>\n }\n}\n","import { HttpClient } from '@angular/common/http'\nimport { Injectable } from '@angular/core'\nimport { EnvironmentService } from './environment.service'\nimport { Environment } from '../interfaces/environment.interface'\nimport { DynamicContent } from '../interfaces/dynamic-content.interface'\nimport { firstValueFrom } from 'rxjs'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ContentService {\n environment: Environment\n\n constructor(\n private http: HttpClient,\n private environmentService: EnvironmentService\n ) {\n this.environmentService.loadEnvironment().subscribe((env) => {\n this.environment = env\n })\n }\n\n async getDynamicContent(): Promise {\n return firstValueFrom(\n this.http.get(`${this.environment.dynamicContentEndpoint}`)\n ).then((dynamicContentRes: Object) => {\n return dynamicContentRes as DynamicContent\n })\n }\n}\n","import { HttpClient } from '@angular/common/http'\nimport { Injectable } from '@angular/core'\nimport { firstValueFrom } from 'rxjs'\n\nimport { TargetApiRoutes } from '../enums/target-api-routes.enum'\nimport { Environment } from '../interfaces/environment.interface'\nimport { Country } from '../interfaces/resources/country.interface'\nimport { EnvironmentService } from './environment.service'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class CountryService {\n environment: Environment\n\n constructor(\n private http: HttpClient,\n private environmentService: EnvironmentService\n ) {\n this.environmentService.loadEnvironment().subscribe((env) => {\n this.environment = env\n })\n }\n\n async list(): Promise {\n return firstValueFrom(\n this.http.get(\n `${this.environment.apiBaseUrl}${TargetApiRoutes.Countries}`\n )\n ).then((countriesRes: Object) => {\n return countriesRes as Country[]\n })\n }\n\n async show(id: string): Promise {\n return firstValueFrom(\n this.http.get(\n `${this.environment.apiBaseUrl}${TargetApiRoutes.Country}&id=${id}`\n )\n ).then((countryRes: Object) => {\n return countryRes as Country\n })\n }\n}\n","
\n
\n \n \n

\n Country comparison widget\n

\n\n \n
\n
\n \n
\n
\n \n
\n
\n\n Compare tax incentives\n \n \n
\n
\n \n\n","import { Component, OnInit } from '@angular/core'\nimport { CountryService } from '../../shared/services/country.service'\nimport { Country } from '../../shared/interfaces/resources/country.interface'\nimport { FormControl, FormGroup } from '@angular/forms'\n\n@Component({\n selector: 'app-country-comparison-widget',\n templateUrl: './country-comparison-widget.component.html',\n styleUrls: ['./country-comparison-widget.component.scss']\n})\nexport class CountryComparisonWidgetComponent implements OnInit {\n countries: Country[]\n\n countryForm: FormGroup\n\n constructor(private countryService: CountryService) {}\n\n ngOnInit() {\n this.countryService.list().then((countryRes: Country[]) => {\n this.countries = countryRes\n\n this.countryForm = new FormGroup({\n country1: new FormControl(\n this.countries[\n Math.floor(Math.random() * this.countries.length)\n ].label\n ),\n country2: new FormControl(\n this.countries[\n Math.floor(Math.random() * this.countries.length)\n ].label\n )\n })\n })\n }\n}\n","export enum ChartType {\n Sunburst = 'sunburst',\n StackedBarChart = 'stackedColumn',\n WorldMap = 'worldMap',\n PieChart = 'pieChart',\n Iframe = 'iframe',\n BarChart = 'barChart',\n ScatterPlot = 'plotArea'\n}\n","import { Injectable, NgZone } from '@angular/core'\nimport { Router } from '@angular/router'\n\nimport { SmartLink } from '../interfaces/smart-link.interface'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SmartLinkService {\n constructor(private router: Router, private ngZone: NgZone) {\n // Force reload if navigate to same state.\n this.router.routeReuseStrategy.shouldReuseRoute = () => {\n return false\n }\n }\n\n // Navigates to link page.\n goToLink(link: SmartLink) {\n const path: string = this.generatePath(link)\n\n this.ngZone.run(() => {\n this.router.navigateByUrl(path, {})\n })\n }\n\n generatePath(link: SmartLink): string {\n let path = ``\n\n switch (link.view) {\n case 'countryPage': {\n const countryId = link.params.find((p) => p.name === 'countryId')?.value\n path += `/countries/${countryId}`\n break\n }\n case 'incentiveDatabase': {\n path += this.router\n .createUrlTree(['incentives'], {\n queryParams: link.params.reduce(\n (acc: { [key: string]: string }, param) => {\n acc[param.name] = param.value\n return acc\n },\n {}\n )\n })\n .toString()\n break\n }\n }\n return path\n }\n}\n","import {\n AfterViewInit,\n Component,\n ElementRef,\n Input,\n OnChanges,\n SimpleChanges,\n ViewChild\n} from '@angular/core'\nimport * as d3 from 'd3'\nimport { tip as d3tip } from 'd3-v6-tip'\n\nimport { AggregationDataset } from '../../../shared/interfaces/visualizations/aggregation-dataset.interface'\nimport { SmartLinkService } from '../../../shared/services/smart-link.service'\n\ndeclare var require: any\n\n@Component({\n selector: 'app-sunburst',\n templateUrl: './sunburst.component.html',\n styleUrls: ['./sunburst.component.scss']\n})\nexport class SunburstComponent implements OnChanges, AfterViewInit {\n @ViewChild('sunburstChart') chartContainer: ElementRef\n\n @Input() dataset: AggregationDataset\n\n height: number = 500\n\n private margin: any = { top: 20, bottom: 20, left: 20, right: 20 }\n private width: number\n\n private tau: number = 2 * Math.PI\n private totalCount = 0\n private minAngleToDisplayLabelInside = 0.3\n private startAngle: number\n private endAngle: number\n private innerRadius: number\n private middleRadius: number\n private outerRadius: number\n\n private topTip: any\n private bottomTip: any\n\n isChartVisible: boolean = false\n\n static formatData(data: any[]) {\n data.forEach((mainItem, index) => {\n mainItem.count = 0\n ;(mainItem.subItems || []).forEach((subItem: any, subIndex: any) => {\n // We count total incentives to calculate radiuses.\n mainItem.count += subItem.count\n // Store parent index in sub item for color coherence.\n subItem.parentIndex = index\n subItem.indexInParent = subIndex\n })\n })\n return data\n }\n\n constructor(private smartLinkService: SmartLinkService) {}\n\n ngAfterViewInit(): void {\n this.buildSunburstChart()\n this.isChartVisible = true\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n if (this.isChartVisible) {\n this.buildSunburstChart()\n }\n }\n\n buildSunburstChart(): void {\n const mainThemes = SunburstComponent.formatData(this.dataset.data)\n\n let subThemes: any[] = []\n this.totalCount = 0\n for (const mainTheme of mainThemes) {\n subThemes = subThemes.concat(mainTheme.subItems)\n this.totalCount += mainTheme.count\n }\n\n const element = this.chartContainer.nativeElement\n this.width = element.offsetWidth - this.margin.left - this.margin.right\n this.innerRadius = (this.height - this.margin.top - this.margin.bottom) / 8\n this.middleRadius = this.innerRadius * 2\n this.outerRadius = this.innerRadius * 4\n element.innerHTML = ''\n\n const colors = [\n '#c3cbcb',\n '#d5464b',\n '#529fd2',\n '#99c7d6',\n '#A089B4',\n '#AD71A2',\n '#C14B86',\n '#F15D89',\n '#D4266B',\n '#DF566C',\n '#EA876D',\n '#F1A76E',\n '#F8C76E',\n '#FFE76F',\n '#E7EB79',\n '#D6EB79',\n '#44ad9d',\n '#aa89f4',\n '#5dabcc',\n '#ff7877',\n '#f7cb7f',\n '#54beac',\n '#75d0e8',\n '#6bb9d9',\n '#ff8d8c',\n '#f9c072',\n '#5dc7b3',\n '#b091f4',\n '#7ac9e7',\n '#ff9897',\n '#f7cb7f',\n '#65d0ba',\n '#b599f5',\n '#89d8f4',\n '#ffa2a2',\n '#f6d187',\n '#6dd9c2',\n '#baa1f5',\n '#61c9db',\n '#ffacac',\n '#f5d68e',\n '#75e2c9',\n '#c0a8f5',\n '#4dc1cd',\n '#f1615d',\n '#fdcdac',\n '#bff29b',\n '#c5b0f5',\n '#39b9be',\n '#e5605a',\n '#ffc79c',\n '#adeb98',\n '#cbb8f5',\n '#26b0ae',\n '#f1615d',\n '#ffc18c',\n '#9be496',\n '#d0c0f5',\n '#12a89d',\n '#ffbb7b',\n '#88dd94',\n '#009f8b',\n '#e5605a',\n '#ffab45',\n '#307fa5',\n '#c46363',\n '#b9d1a8',\n '#c987c4',\n '#fdae61',\n '#3ca496',\n '#DDB9A1',\n '#FCC951',\n '#ABD9E9',\n '#8C759F',\n '#aa89f4',\n '#fd6161',\n '#ea94b6',\n '#75e2c9',\n '#ffa62e',\n '#258cbc',\n '#fcdb51',\n '#aa89f4',\n '#89d8f4',\n '#eaa77b',\n '#E569A7',\n '#ADF58E',\n '#80955D',\n '#D5CA9D',\n '#B3FCE0',\n '#FAA35C',\n '#E5C4DC',\n '#F5D68E',\n '#D9DCCA',\n '#009f8b',\n '#77EAA5',\n '#FF9100',\n '#81ACA0',\n '#A8FF72',\n '#D9CCBF',\n '#1ADBBE',\n '#E8BE15',\n '#36BB8F',\n '#E96B39',\n '#61E8CA',\n '#66FF8E',\n '#6CC15F',\n '#D9CD00',\n '#D0ECFF',\n '#F7EEE7',\n '#00B6BF',\n '#FFCD86',\n '#D9CCBF',\n '#81ACA0',\n '#E59026',\n '#f9f4f4',\n '#f9f4f6',\n '#f4f9f8',\n '#f4f8f9',\n '#f9f8f4',\n '#f6f4f9',\n '#f4f7f9',\n '#f9f6f4',\n '#136E59',\n '#FD8F8F',\n '#DDAC6C',\n '#D1C592',\n '#FF69A4',\n '#7D43FF',\n '#97B9C9',\n '#27B7EA',\n '#FFA050',\n '#54DE7F',\n '#A8CAC2',\n '#FEC7C7',\n '#EED5B5',\n '#E8E2C8',\n '#FEB3D1',\n '#BDA0FD',\n '#CBDCE4',\n '#92DBF4',\n '#FFCFA7',\n '#C8EDD9',\n '#B3E2CD',\n '#E7FCEC',\n '#CEF9B8',\n '#A6E9FF',\n '#FEF79F',\n '#FFD5A9',\n '#A8ED90',\n '#7AD6FF',\n '#FEF16F',\n '#FFB77E',\n '#83DB70',\n '#59C3FF',\n '#FDEA4C',\n '#FF9B5D',\n '#51C444',\n '#23A3FF',\n '#FCE111',\n '#FF6C28',\n '#239185'\n ]\n\n // Create arcs\n const arc = d3\n .arc()\n .innerRadius(this.innerRadius)\n .outerRadius(this.middleRadius)\n const outerArc = d3\n .arc()\n .innerRadius(this.middleRadius)\n .outerRadius(this.outerRadius)\n\n // create svg const\n const svg = d3\n .select(element)\n .append('svg')\n .attr('width', this.width)\n .attr('height', this.height)\n\n // Tooltips\n this.topTip = d3tip()\n .attr('class', 'is-tooltip is-tooltip-dark is-small is-bottom')\n .offset([0, 0])\n .html(\n (e: any, d: any) =>\n `

${d.label}

Incentives : ${d.count}

`\n )\n this.bottomTip = d3tip()\n .attr('class', 'is-tooltip is-tooltip-dark is-small is-bottom')\n .offset([160, 0])\n .html(\n (e: any, d: any) =>\n `

${d.label}

Incentives : ${d.count}

`\n )\n svg.call(this.topTip)\n svg.call(this.bottomTip)\n\n const g = svg\n .append('g')\n .attr(\n 'transform',\n 'translate(' + this.width / 2 + ',' + this.height / 2 + ')'\n )\n .on('mouseout', (d: any) => {\n centralText.text('')\n this.topTip.hide()\n this.bottomTip.hide()\n })\n\n // Inner circle\n const slice = g\n .selectAll('.slice')\n .data(mainThemes)\n .enter()\n .append('g')\n .attr('class', 'slice pointer')\n\n slice\n .append('path')\n .datum((d: any) => this.getAngles(d, subThemes.length))\n .style('fill', (d: any, i: any) => colors[i])\n .style('stroke', '#fff')\n .attr('d', arc as any)\n .on('mouseover', (e: any, d: any) => {\n centralText.text(`${d.count} incentive${d.count > 1 ? 's' : ''}`)\n const angle = ((d.startAngle + d.endAngle) / 2 / this.tau) * 360\n if (angle > 90 && angle <= 270) {\n this.bottomTip.show(e, d)\n } else {\n this.topTip.show(e, d)\n }\n })\n .on('mouseout', () => {\n this.bottomTip.hide()\n this.topTip.hide()\n })\n .on('click', (event, d: any) => {\n this.topTip.hide()\n this.bottomTip.hide()\n this.smartLinkService.goToLink(d.link)\n })\n\n // Inner circle text\n slice\n .append('text')\n .attr('text-anchor', 'middle')\n .attr('transform', (d: any) => {\n const middleAngle = (d.startAngle + d.endAngle) / 2 - Math.PI / 2\n\n const distance =\n this.innerRadius + (this.middleRadius - this.innerRadius) / 2\n\n var x = distance * Math.cos(middleAngle)\n var y = distance * Math.sin(middleAngle)\n\n return `translate(${x} ${y})`\n })\n .text((d: any) => {\n // We don't display labels if the angle is too thin\n if (d.endAngle - d.startAngle >= this.minAngleToDisplayLabelInside) {\n // Get the doughnut width to truncate text\n const width = this.middleRadius - this.innerRadius\n if (d.label.length > width / 6) {\n return d.label.substring(0, width / 6 - 3) + '...'\n }\n return d.label\n }\n })\n .style('font-size', '1.1rem')\n .on('mouseover', (e: any, d: any) => {\n centralText.text(`${d.count} incentive${d.count > 1 ? 's' : ''}`)\n const angle = ((d.startAngle + d.endAngle) / 2 / this.tau) * 360\n if (angle > 90 && angle <= 270) {\n this.bottomTip.show(e, d)\n } else {\n this.topTip.show(e, d)\n }\n })\n .on('mouseout', (d: any) => {\n centralText.text('')\n this.bottomTip.hide()\n this.topTip.hide()\n })\n .on('click', (event, d: any) => {\n this.topTip.hide()\n this.bottomTip.hide()\n this.smartLinkService.goToLink(d.link)\n })\n\n // Outer circle\n const outerSlice = g\n .selectAll('.outer-slice')\n .data(subThemes)\n .enter()\n .append('g')\n .attr('class', 'outer-slice pointer')\n\n outerSlice\n .append('path')\n .datum((d: any) => this.getAngles(d, subThemes.length))\n .style('fill', (d: any) =>\n d3\n .color(colors[d.parentIndex])\n .brighter((d.indexInParent + 2) / 6)\n .toString()\n )\n .style('stroke', '#fff')\n .attr('d', outerArc as any)\n .on('mouseover', (e: any, d: any) => {\n centralText.text(`${d.count} incentive${d.count > 1 ? 's' : ''}`)\n const angle = ((d.startAngle + d.endAngle) / 2 / this.tau) * 360\n if (angle > 90 && angle <= 270) {\n this.bottomTip.show(e, d)\n } else {\n this.topTip.show(e, d)\n }\n })\n .on('mouseout', (d: any) => {\n centralText.text('')\n this.topTip.hide()\n this.bottomTip.hide()\n })\n .on('click', (event, d: any) => {\n this.topTip.hide()\n this.bottomTip.hide()\n this.smartLinkService.goToLink(d.link)\n })\n\n // Outer slice text\n outerSlice\n .append('text')\n .attr('text-anchor', 'middle')\n .attr('transform', (d: any) => {\n const middleAngle = (d.startAngle + d.endAngle) / 2 - Math.PI / 2\n\n let distance\n if (d.endAngle - d.startAngle <= this.minAngleToDisplayLabelInside) {\n distance = this.outerRadius + this.margin.top\n } else {\n distance =\n this.middleRadius + (this.outerRadius - this.middleRadius) / 2\n }\n\n var x = distance * Math.cos(middleAngle)\n var y = distance * Math.sin(middleAngle)\n\n return `translate(${x} ${y})`\n })\n .text((d: any, i) => {\n // Get the doughnut width to truncate text\n const width = this.outerRadius - this.middleRadius\n if (d.label.length > width / 6) {\n return d.label.substring(0, width / 6 - 3) + '...'\n }\n return d.label\n })\n .style('font-size', '1.1rem')\n .on('mouseover', (e: any, d: any) => {\n centralText.text(`${d.count} incentive${d.count > 1 ? 's' : ''}`)\n const angle = ((d.startAngle + d.endAngle) / 2 / this.tau) * 360\n if (angle > 90 && angle <= 270) {\n this.bottomTip.show(e, d)\n } else {\n this.topTip.show(e, d)\n }\n })\n .on('click', (event, d: any) => {\n this.topTip.hide()\n this.bottomTip.hide()\n this.smartLinkService.goToLink(d.link)\n })\n\n // Central text.\n const centralText = g\n .append('svg:text')\n .attr('class', 'score')\n .attr('dy', '.80em')\n .attr('text-anchor', 'middle')\n .text('')\n }\n\n getAngles(d: any, subThemesLength: any): object {\n // Restart if we made a full turn of the circle\n if (this.endAngle >= this.tau) {\n this.endAngle = this.endAngle - this.tau\n }\n this.startAngle = this.endAngle ? this.endAngle : 0\n\n // Adapt radius to count.\n this.endAngle = this.startAngle + (d.count / this.totalCount) * this.tau\n\n d.startAngle = this.startAngle\n d.endAngle = this.endAngle\n return d\n }\n}\n","
\n","export const iso3ToIso2: { [key: string]: string } = {\n AFG: 'AF',\n ALB: 'AL',\n DZA: 'DZ',\n ASM: 'AS',\n AND: 'AD',\n AGO: 'AO',\n AIA: 'AI',\n ATA: 'AQ',\n ATG: 'AG',\n ARG: 'AR',\n ARM: 'AM',\n ABW: 'AW',\n AUS: 'AU',\n AUT: 'AT',\n AZE: 'AZ',\n BHS: 'BS',\n BHR: 'BH',\n BGD: 'BD',\n BRB: 'BB',\n BLR: 'BY',\n BEL: 'BE',\n BLZ: 'BZ',\n BEN: 'BJ',\n BMU: 'BM',\n BTN: 'BT',\n BOL: 'BO',\n BIH: 'BA',\n BWA: 'BW',\n BVT: 'BV',\n BRA: 'BR',\n IOT: 'IO',\n BRN: 'BN',\n BGR: 'BG',\n BFA: 'BF',\n BDI: 'BI',\n KHM: 'KH',\n CMR: 'CM',\n CAN: 'CA',\n CPV: 'CV',\n CYM: 'KY',\n CAF: 'CF',\n TCD: 'TD',\n CHL: 'CL',\n CHN: 'CN',\n CXR: 'CX',\n CCK: 'CC',\n COL: 'CO',\n COM: 'KM',\n COG: 'CG',\n COK: 'CK',\n CRI: 'CR',\n CIV: 'CI',\n HRV: 'HR',\n CUB: 'CU',\n CYP: 'CY',\n CZE: 'CZ',\n DNK: 'DK',\n DJI: 'DJ',\n DMA: 'DM',\n DOM: 'DO',\n TMP: 'TP',\n ECU: 'EC',\n EGY: 'EG',\n SLV: 'SV',\n GNQ: 'GQ',\n ERI: 'ER',\n EST: 'EE',\n ETH: 'ET',\n FLK: 'FK',\n FRO: 'FO',\n FJI: 'FJ',\n FIN: 'FI',\n FRA: 'FR',\n FXX: 'FX',\n GUF: 'GF',\n PYF: 'PF',\n ATF: 'TF',\n GAB: 'GA',\n GMB: 'GM',\n GEO: 'GE',\n DEU: 'DE',\n GHA: 'GH',\n GIB: 'GI',\n GRC: 'GR',\n GRL: 'GL',\n GRD: 'GD',\n GLP: 'GP',\n GUM: 'GU',\n GTM: 'GT',\n GIN: 'GN',\n GNB: 'GW',\n GUY: 'GY',\n HTI: 'HT',\n HMD: 'HM',\n VAT: 'VA',\n HND: 'HN',\n HKG: 'HK',\n HUN: 'HU',\n ISL: 'IS',\n IND: 'IN',\n IDN: 'ID',\n IRN: 'IR',\n IRQ: 'IQ',\n IRL: 'IE',\n ISR: 'IL',\n ITA: 'IT',\n JAM: 'JM',\n JPN: 'JP',\n JOR: 'JO',\n KAZ: 'KZ',\n KEN: 'KE',\n KIR: 'KI',\n PRK: 'KP',\n KOR: 'KR',\n KWT: 'KW',\n KGZ: 'KG',\n LAO: 'LA',\n LVA: 'LV',\n LBN: 'LB',\n LSO: 'LS',\n LBR: 'LR',\n LBY: 'LY',\n LIE: 'LI',\n LTU: 'LT',\n LUX: 'LU',\n MAC: 'MO',\n MKD: 'MK',\n MDG: 'MG',\n MWI: 'MW',\n MYS: 'MY',\n MDV: 'MV',\n MLI: 'ML',\n MLT: 'MT',\n MHL: 'MH',\n MTQ: 'MQ',\n MRT: 'MR',\n MUS: 'MU',\n MYT: 'YT',\n MEX: 'MX',\n FSM: 'FM',\n MDA: 'MD',\n MCO: 'MC',\n MNG: 'MN',\n MSR: 'MS',\n MAR: 'MA',\n MOZ: 'MZ',\n MMR: 'MM',\n NAM: 'NA',\n NRU: 'NR',\n NPL: 'NP',\n NLD: 'NL',\n ANT: 'AN',\n NCL: 'NC',\n NZL: 'NZ',\n NIC: 'NI',\n NER: 'NE',\n NGA: 'NG',\n NIU: 'NU',\n NFK: 'NF',\n MNP: 'MP',\n NOR: 'NO',\n OMN: 'OM',\n PAK: 'PK',\n PLW: 'PW',\n PAN: 'PA',\n PNG: 'PG',\n PRY: 'PY',\n PER: 'PE',\n PHL: 'PH',\n PCN: 'PN',\n POL: 'PL',\n PRT: 'PT',\n PRI: 'PR',\n QAT: 'QA',\n REU: 'RE',\n ROU: 'RO',\n RUS: 'RU',\n RWA: 'RW',\n KNA: 'KN',\n LCA: 'LC',\n VCT: 'VC',\n WSM: 'WS',\n SMR: 'SM',\n STP: 'ST',\n SAU: 'SA',\n SEN: 'SN',\n SYC: 'SC',\n SLE: 'SL',\n SGP: 'SG',\n SVK: 'SK',\n SVN: 'SI',\n SLB: 'SB',\n SOM: 'SO',\n ZAF: 'ZA',\n SGS: 'GS',\n ESP: 'ES',\n LKA: 'LK',\n SHN: 'SH',\n SPM: 'PM',\n SDN: 'SD',\n SUR: 'SR',\n SJM: 'SJ',\n SWZ: 'SZ',\n SWE: 'SE',\n CHE: 'CH',\n SYR: 'SY',\n TWN: 'TW',\n TJK: 'TJ',\n TZA: 'TZ',\n THA: 'TH',\n TGO: 'TG',\n TKL: 'TK',\n TON: 'TO',\n TTO: 'TT',\n TUN: 'TN',\n TUR: 'TR',\n TKM: 'TM',\n TCA: 'TC',\n TUV: 'TV',\n UGA: 'UG',\n UKR: 'UA',\n ARE: 'AE',\n GBR: 'GB',\n USA: 'US',\n UMI: 'UM',\n URY: 'UY',\n UZB: 'UZ',\n VUT: 'VU',\n VEN: 'VE',\n VNM: 'VN',\n VGB: 'VG',\n VIR: 'VI',\n WLF: 'WF',\n ESH: 'EH',\n YEM: 'YE',\n YUG: 'YU',\n ZAR: 'ZR',\n ZMB: 'ZM',\n SRB: 'RS',\n RKS: 'XK'\n}\n","
\n
\n \n \n
\n {{ group.name }}\n
\n \n\n","import am4geodata_worldLow from '@amcharts/amcharts4-geodata/worldLow'\nimport * as am4core from '@amcharts/amcharts4/core'\nimport * as am4maps from '@amcharts/amcharts4/maps'\nimport {\n Component,\n ElementRef,\n Input,\n OnChanges,\n ViewChild\n} from '@angular/core'\n\nimport { AggregationDataset } from '../../../shared/interfaces/visualizations/aggregation-dataset.interface'\nimport { SmartLinkService } from '../../../shared/services/smart-link.service'\nimport { MapCountryItem } from './interfaces/map-country-item.interface'\nimport { iso3ToIso2 } from './iso3-to-iso2'\n\n@Component({\n selector: 'app-world-map',\n templateUrl: './world-map.component.html',\n styleUrls: ['./world-map.component.scss']\n})\nexport class WorldMapComponent implements OnChanges {\n @ViewChild('worldMap', { static: true }) chartContainer: ElementRef\n\n @Input() dataset: AggregationDataset\n\n private chart: any\n private height = 500\n\n private zeroIncentiveColor = '#EBEEF1'\n private noDataColor = '#F5F7F9'\n private hoverColor = '#C4CAFF'\n private tooltipColor = '#023047'\n private strokeColor = '#B9B5B8'\n\n // We hide legend by default and show it after chart is rendered to avoid flickering.\n showLegend = false\n\n countryGroups: { name: string; color: string }[] = [\n { name: 'Mixed', color: '#FFC304' },\n { name: 'Single', color: '#FF7918' },\n { name: 'Dual', color: '#66D4E8' },\n { name: 'Multiple', color: '#74E0B1' }\n ]\n\n constructor(private smartLinkService: SmartLinkService) {}\n\n ngOnChanges(): void {\n this.showLegend = false\n\n setTimeout(() => {\n this.buildWorldMap()\n this.showLegend = true\n }, 0)\n }\n\n buildWorldMap(): void {\n // Set chart container height from calculation in parent.\n this.chartContainer.nativeElement.style.height = `${this.height}px`\n\n this.chart = am4core.create('world-map', am4maps.MapChart)\n this.chart.geodata = am4geodata_worldLow\n this.chart.projection = new am4maps.projections.Miller()\n this.chart.zoomControl = new am4maps.ZoomControl()\n this.chart.chartContainer.wheelable = false\n\n const polygonSeries = this.chart.series.push(new am4maps.MapPolygonSeries())\n\n polygonSeries.useGeodata = true\n // Tooltip style.\n polygonSeries.tooltip.fitPointerToBounds = true\n polygonSeries.tooltip.getFillFromObject = false\n polygonSeries.tooltip.fillOpacity = 100\n polygonSeries.tooltip.strokeOpacity = 1\n polygonSeries.tooltip.valign = 'top'\n polygonSeries.tooltip.background.fill = am4core.color(this.tooltipColor)\n polygonSeries.tooltip.background.stroke = am4core.color(this.tooltipColor)\n polygonSeries.tooltip.background.filters.clear()\n polygonSeries.tooltip.fontSize = '12px'\n polygonSeries.tooltip.fontFamily =\n 'Helvetica Neue, Helvetica, Arial, sans-serif'\n\n // Configure series\n const polygonTemplate = polygonSeries.mapPolygons.template\n\n polygonTemplate.tooltipText = `[bold]{name}[/]\n Incentives : {count}`\n\n polygonTemplate.stroke = am4core.color(this.strokeColor)\n polygonTemplate.strokeWidth = 1\n polygonTemplate.strokeOpacity = 0.4\n polygonTemplate.properties.fill = am4core.color(this.noDataColor)\n polygonTemplate.cursorOverStyle = am4core.MouseCursorStyle.pointer\n polygonTemplate.tooltipY = 100\n\n // Create hover state and set alternative fill color\n const hoverState = polygonTemplate.states.create('hover')\n hoverState.properties.fill = am4core.color(this.hoverColor)\n\n // Remove Antarctica (No tax incentives there!).\n polygonSeries.exclude = ['AQ']\n\n // Add data.\n polygonSeries.data = this.dataset.data.map((country) => ({\n id: this.convertIso3IntoIso2(country.code),\n\n color: this.getCountryColor(country),\n name: country.label,\n count: country.count,\n description: country.description,\n link: country.value === 0 ? null : country.link\n }))\n\n // Bind \"fill\" property to \"color\" key in data\n polygonTemplate.propertyFields.fill = 'color'\n\n polygonTemplate.events.on('hit', (event: any) => {\n const country = event.target.dataItem.dataContext\n\n if (country.link) {\n this.smartLinkService.goToLink(country.link)\n }\n })\n\n polygonTemplate.events.on('over', (event: any) => {\n const country = event.target.dataItem.dataContext\n\n if (!country.hasOwnProperty('count')) {\n // Hack: do not show tooltip for countries without incentiveCount.\n event.target.showTooltipOn = 'hit'\n }\n })\n }\n\n convertIso3IntoIso2(iso3: string): any {\n return iso3ToIso2[iso3]\n }\n\n // We get the country color based on terms included on the description.\n getCountryColor(country: MapCountryItem): am4core.Color {\n if (country.count === 0) {\n return am4core.color(this.zeroIncentiveColor)\n }\n\n // We return the first color that matches the description. It means that the order of this.countryGroups is important.\n return am4core.color(\n this.countryGroups.filter((group) =>\n country.value.includes(group.name)\n )[0]?.color\n )\n }\n}\n","import { Injectable } from '@angular/core'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ColorService {\n // First color is used when one color only on chart. Following colors are widely used too.\n private static primaryColors: string[] = [\n '#76B3D4',\n '#7389B1',\n '#94738F',\n '#B55D6D',\n '#C43C41',\n '#C43C41',\n '#F1A76E',\n '#F8C76E',\n '#D3674D',\n '#D3674D',\n '#FFE76F',\n '#E7EB79',\n '#D6EB79',\n '#44ad9d',\n '#aa89f4',\n '#5dabcc',\n '#ff7877',\n '#f7cb7f',\n '#54beac',\n '#75d0e8',\n '#6bb9d9',\n '#ff8d8c',\n '#f9c072',\n '#5dc7b3',\n '#b091f4',\n '#7ac9e7',\n '#ff9897',\n '#f7cb7f',\n '#65d0ba',\n '#b599f5',\n '#89d8f4',\n '#ffa2a2',\n '#f6d187',\n '#6dd9c2',\n '#baa1f5',\n '#61c9db',\n '#ffacac',\n '#f5d68e',\n '#75e2c9',\n '#c0a8f5',\n '#4dc1cd',\n '#f1615d',\n '#fdcdac',\n '#bff29b',\n '#c5b0f5',\n '#39b9be',\n '#e5605a',\n '#ffc79c',\n '#adeb98',\n '#cbb8f5',\n '#26b0ae',\n '#f1615d',\n '#ffc18c',\n '#9be496',\n '#d0c0f5',\n '#12a89d',\n '#ffbb7b',\n '#88dd94',\n '#009f8b',\n '#e5605a',\n '#ffab45',\n '#307fa5',\n '#c46363',\n '#b9d1a8',\n '#c987c4',\n '#fdae61',\n '#3ca496',\n '#DDB9A1',\n '#FCC951',\n '#ABD9E9',\n '#8C759F',\n '#aa89f4',\n '#fd6161',\n '#ea94b6',\n '#75e2c9',\n '#ffa62e',\n '#258cbc',\n '#fcdb51',\n '#aa89f4',\n '#89d8f4',\n '#eaa77b',\n '#E569A7',\n '#ADF58E',\n '#80955D',\n '#D5CA9D',\n '#B3FCE0',\n '#FAA35C',\n '#E5C4DC',\n '#F5D68E',\n '#D9DCCA',\n '#009f8b',\n '#77EAA5',\n '#FF9100',\n '#81ACA0',\n '#A8FF72',\n '#D9CCBF',\n '#1ADBBE',\n '#E8BE15',\n '#36BB8F',\n '#E96B39',\n '#61E8CA',\n '#66FF8E',\n '#6CC15F',\n '#D9CD00',\n '#D0ECFF',\n '#F7EEE7',\n '#00B6BF',\n '#FFCD86',\n '#D9CCBF',\n '#81ACA0',\n '#E59026',\n '#f9f4f4',\n '#f9f4f6',\n '#f4f9f8',\n '#f4f8f9',\n '#f9f8f4',\n '#f6f4f9',\n '#f4f7f9',\n '#f9f6f4',\n '#136E59',\n '#FD8F8F',\n '#DDAC6C',\n '#D1C592',\n '#FF69A4',\n '#7D43FF',\n '#97B9C9',\n '#27B7EA',\n '#FFA050',\n '#54DE7F',\n '#A8CAC2',\n '#FEC7C7',\n '#EED5B5',\n '#E8E2C8',\n '#FEB3D1',\n '#BDA0FD',\n '#CBDCE4',\n '#92DBF4',\n '#FFCFA7',\n '#C8EDD9',\n '#B3E2CD',\n '#E7FCEC',\n '#CEF9B8',\n '#A6E9FF',\n '#FEF79F',\n '#FFD5A9',\n '#A8ED90',\n '#7AD6FF',\n '#FEF16F',\n '#FFB77E',\n '#83DB70',\n '#59C3FF',\n '#FDEA4C',\n '#FF9B5D',\n '#51C444',\n '#23A3FF',\n '#FCE111',\n '#FF6C28',\n '#239185'\n ]\n\n static disabledColor = '#DBD9DA'\n\n static getColors(shuffle?: boolean): string[] {\n return shuffle\n ? ColorService.shuffleArray(ColorService.primaryColors)\n : ColorService.primaryColors\n }\n\n static shuffleArray(array: any[]): any[] {\n // Clone array to prevent modifying other objects.\n const arrayClone = JSON.parse(JSON.stringify(array))\n\n for (let i = arrayClone.length - 1; i > 0; i--) {\n const j = Math.floor(Math.random() * (i + 1))\n ;[arrayClone[i], arrayClone[j]] = [arrayClone[j], arrayClone[i]]\n }\n return arrayClone\n }\n}\n","
\n \n \n
\n {{ value.label }}\n
\n \n\n\n\n\n","import { Component, Input, OnChanges } from '@angular/core'\nimport { ChartConfiguration } from 'chart.js'\n\nimport { SmartLink } from '../../../shared/interfaces/smart-link.interface'\nimport { AggregationDataset } from '../../../shared/interfaces/visualizations/aggregation-dataset.interface'\nimport { ColorService } from '../../../shared/services/color.service'\nimport { SmartLinkService } from '../../../shared/services/smart-link.service'\nimport { ChartItem } from './interfaces/chart-item.interface'\n\n@Component({\n selector: 'app-stacked-bar',\n templateUrl: './stacked-bar.component.html',\n styleUrls: ['./stacked-bar.component.scss']\n})\nexport class StackedBarComponent implements OnChanges {\n @Input() dataset: AggregationDataset\n\n barChartData: ChartConfiguration<'bar'>['data']\n barChartOptions: any = {\n responsive: true,\n tooltips: {\n mode: 'index',\n intersect: false\n },\n scales: {\n y: {\n id: 'yAxis1',\n title: {\n display: true\n }\n },\n x: {\n id: 'xAxis1'\n },\n x2: {\n id: 'xAxis2',\n type: 'category',\n grid: {\n tickWidth: (element: { index: number; tick: { label: string } }) => {\n const groupLabel: string =\n this.dataset.data[element.index]?.groupLabel\n const previousGroupLabel: string =\n this.dataset.data[element.index - 1]?.groupLabel\n\n return groupLabel !== previousGroupLabel ? 2 : 0\n }\n },\n ticks: {\n align: 'right',\n callback: (_value: string, index: number) => {\n const groupLabel: string = this.dataset.data[index].groupLabel\n\n const previousGroupLabel: string =\n this.dataset.data[index - 1]?.groupLabel\n\n return groupLabel !== previousGroupLabel ? groupLabel : ''\n }\n }\n }\n }\n }\n\n possibleValues: { label: string; color?: string }[]\n // We use \"any\" instead of ChartDataset<'bar', any>[] to attach \"link\" to the dataset.\n datasets: any[]\n\n constructor(private smartLinkService: SmartLinkService) {}\n\n ngOnChanges() {\n this.barChartOptions.scales.y.title.text = this.dataset.yAxisLabel\n\n // Group data by groupLabel.\n const groupedData: { [key: string]: ChartItem[] } =\n this.dataset.data.reduce((acc, d) => {\n if (!acc[d.groupLabel]) {\n acc[d.groupLabel] = []\n }\n acc[d.groupLabel].push(d)\n return acc\n }, {})\n\n // Match each subItem with a color.\n const subItems: string[] = [\n ...new Set(\n [].concat(\n ...this.dataset.data.map((chartItem: ChartItem) =>\n chartItem.subItems.map((sI, i) => sI.label)\n )\n )\n )\n ]\n\n this.possibleValues = subItems.map((subItem: string, i: number) => ({\n label: subItem,\n color: ColorService.getColors()[i]\n }))\n\n this.datasets = this.possibleValues.map((possibleValue) => ({\n label: possibleValue.label,\n data: this.dataset.data.map((chartItem: ChartItem) => {\n const subItemData = chartItem.subItems.find(\n (sI) => sI.label === possibleValue.label\n )\n return subItemData ? subItemData.count : 0\n }),\n links: this.dataset.data.map((chartItem: ChartItem) => {\n const subItemData = chartItem.subItems.find(\n (sI) => sI.label === possibleValue.label\n )\n return subItemData ? subItemData.link : null\n }),\n backgroundColor: possibleValue.color,\n borderColor: possibleValue.color,\n stack: 'stack1'\n }))\n\n this.barChartData = {\n labels: this.dataset.data.map((d) => d.label),\n datasets: this.datasets\n }\n }\n\n onChartClick(event: any) {\n const clickedElement = event.active[0]\n if (!clickedElement) {\n return\n }\n const link: SmartLink =\n this.datasets[clickedElement.datasetIndex].links[clickedElement.index]\n\n if (link) {\n this.smartLinkService.goToLink(link)\n }\n }\n}\n","\n\n","import { Component, Input, OnChanges } from '@angular/core'\nimport { ChartData, ChartEvent, ChartOptions, plugins } from 'chart.js'\n\nimport { AggregationDataset } from '../../../shared/interfaces/visualizations/aggregation-dataset.interface'\nimport { ColorService } from '../../../shared/services/color.service'\nimport { SmartLinkService } from '../../../shared/services/smart-link.service'\nimport { PieChartItem } from './interfaces/pie-chart-item'\n\n@Component({\n selector: 'app-pie-chart',\n templateUrl: './pie-chart.component.html',\n styleUrls: ['./pie-chart.component.scss']\n})\nexport class PieChartComponent implements OnChanges {\n @Input() dataset: AggregationDataset\n\n pieChartOptions: ChartOptions<'pie'> = {\n responsive: true,\n plugins: {\n legend: {\n position: 'bottom'\n }\n }\n }\n\n pieChartData: ChartData<'pie', number[], string | string[]>\n\n constructor(private smartLinkService: SmartLinkService) {}\n\n ngOnChanges(): void {\n const colors: string[] = ColorService.getColors()\n this.pieChartData = {\n labels: this.dataset.data.map((d: PieChartItem) => d.label),\n datasets: [\n {\n data: this.dataset.data.map((d: PieChartItem) => d.count),\n backgroundColor: this.dataset.data.map(\n (d: PieChartItem, i: number) => colors[i]\n ),\n borderColor: this.dataset.data.map(\n (d: PieChartItem, i: number) => colors[i]\n )\n }\n ]\n }\n }\n\n chartClicked(event: {\n event?: ChartEvent\n active?: ({ index: number } | any)[]\n }): void {\n const clickedItem: PieChartItem = this.dataset.data[event.active[0].index]\n\n if (clickedItem?.link) {\n this.smartLinkService.goToLink(clickedItem.link)\n }\n }\n}\n","import { Component, Input, OnChanges } from '@angular/core'\nimport { DomSanitizer, SafeResourceUrl } from '@angular/platform-browser'\nimport { AggregationDataset } from '../../../shared/interfaces/visualizations/aggregation-dataset.interface'\n\n@Component({\n selector: 'app-iframe',\n templateUrl: './iframe.component.html',\n styleUrls: ['./iframe.component.scss']\n})\nexport class IframeComponent implements OnChanges {\n @Input() dataset: AggregationDataset\n\n source: SafeResourceUrl\n\n constructor(public sanitizer: DomSanitizer) {}\n\n ngOnChanges() {\n this.source = this.sanitizer.bypassSecurityTrustResourceUrl(\n this.dataset.data[0].uri\n )\n }\n}\n","\n\n","\n","import { Component, Input, OnChanges } from '@angular/core'\nimport { ChartConfiguration } from 'chart.js'\nimport { SmartLink } from '../../../shared/interfaces/smart-link.interface'\nimport { AggregationDataset } from '../../../shared/interfaces/visualizations/aggregation-dataset.interface'\nimport { ColorService } from '../../../shared/services/color.service'\nimport { SmartLinkService } from '../../../shared/services/smart-link.service'\n\n@Component({\n selector: 'app-bar-chart',\n templateUrl: './bar-chart.component.html',\n styleUrls: ['./bar-chart.component.scss']\n})\nexport class BarChartComponent implements OnChanges {\n @Input() dataset: AggregationDataset\n\n barChartData: ChartConfiguration<'bar'>['data']\n // We use \"any\" instead of ChartDataset<'bar', any>[] to attach \"link\" to the dataset.\n datasets: any[]\n\n barChartOptions: any = {\n indexAxis: 'y',\n responsive: true,\n scales: {\n x: {\n title: {\n display: true\n }\n },\n y: {\n grid: {\n display: false\n }\n }\n }\n }\n\n colors: string[] = ColorService.getColors()\n\n constructor(private smartLinkService: SmartLinkService) {}\n\n ngOnChanges() {\n this.barChartOptions.scales.x.title.text = this.dataset.xAxisLabel\n\n this.datasets = [\n {\n data: this.dataset.data.map((d) => d.count),\n backgroundColor: this.dataset.data.map((d, i) => this.colors[i]),\n borderColor: this.dataset.data.map((d, i) => this.colors[i]),\n links: this.dataset.data.map((d) => d.link)\n }\n ]\n\n this.barChartData = {\n labels: this.dataset.data.map((d) => d.label),\n datasets: this.datasets\n }\n }\n\n onChartClick(event: any) {\n const clickedElement = event.active[0]\n if (!clickedElement) {\n return\n }\n const link: SmartLink =\n this.datasets[clickedElement.datasetIndex].links[clickedElement.index]\n\n if (link) {\n this.smartLinkService.goToLink(link)\n }\n }\n}\n","\n\n","import { Component, Input, OnChanges, SimpleChanges } from '@angular/core'\nimport { ChartConfiguration } from 'chart.js'\nimport { SmartLink } from '../../../shared/interfaces/smart-link.interface'\n\nimport { AggregationDataset } from '../../../shared/interfaces/visualizations/aggregation-dataset.interface'\nimport { ColorService } from '../../../shared/services/color.service'\nimport { SmartLinkService } from '../../../shared/services/smart-link.service'\nimport ChartDataLabels from 'chartjs-plugin-datalabels'\n\n@Component({\n selector: 'app-scatter-plot',\n templateUrl: './scatter-plot.component.html',\n styleUrls: ['./scatter-plot.component.scss']\n})\nexport class ScatterPlotComponent implements OnChanges {\n @Input() dataset: AggregationDataset\n\n chartData: ChartConfiguration<'scatter'>['data']\n // We use \"any\" instead of ChartDataset<'bar', any>[] to attach \"link\" to the dataset.\n datasets: any[]\n\n chartPlugins = [ChartDataLabels]\n\n chartOptions: any = {\n responsive: true,\n elements: {\n point: {\n radius: 6\n }\n },\n plugins: {\n datalabels: {\n anchor: 'center',\n align: 'right',\n offset: 4,\n formatter: (_value: any, context: any) =>\n this.dataset.data[context.dataIndex].uri\n },\n tooltip: {\n mode: 'index',\n callbacks: {\n title: () => '',\n label: (context: any) => context.label\n },\n displayColors: false\n }\n },\n scales: {\n x: {\n grid: {\n lineWidth: (context: any) => (context.tick.value === 0 ? 3 : 1)\n },\n title: {\n display: true\n }\n },\n\n y: {\n grid: {\n lineWidth: (context: any) => (context.tick.value === 0 ? 3 : 1)\n },\n title: {\n display: true\n }\n }\n }\n }\n\n colors: string[] = ColorService.getColors()\n\n constructor(private smartLinkService: SmartLinkService) {}\n\n ngOnChanges(): void {\n this.chartOptions.scales.x.title.text = this.dataset.xAxisLabel\n this.chartOptions.scales.y.title.text = this.dataset.yAxisLabel\n\n this.datasets = [\n {\n label: 'Incentive similarity',\n data: this.dataset.data.map((d) => ({\n x: d.valueX,\n y: d.valueY\n })),\n backgroundColor: '#68caff',\n links: this.dataset.data.map((d) => d.link)\n }\n ]\n\n this.chartData = {\n labels: this.dataset.data.map((d) => d.label),\n datasets: this.datasets\n }\n }\n\n onChartClick(event: any) {\n const clickedElement = event.active[0]\n if (!clickedElement) {\n return\n }\n const link: SmartLink =\n this.datasets[clickedElement.datasetIndex].links[clickedElement.index]\n\n if (link) {\n this.smartLinkService.goToLink(link)\n }\n }\n}\n","
\n \n {{ aggregation.longLabel || aggregation.label }}\n \n\n

\n {{ aggregation.description }}\n

\n\n \n \n\n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n","import { Component, Input, OnChanges, OnInit } from '@angular/core'\nimport * as fileSaver from 'file-saver'\nimport { ChartType } from '../../../shared/enums/chart-type.enum'\n\nimport { AggregationDataset } from '../../../shared/interfaces/visualizations/aggregation-dataset.interface'\nimport { Aggregation } from '../../../shared/interfaces/visualizations/aggregation.interface'\n\n@Component({\n selector: 'app-aggregation-wrapper',\n templateUrl: './aggregation-wrapper.component.html',\n styleUrls: ['./aggregation-wrapper.component.scss']\n})\nexport class AggregationWrapperComponent implements OnChanges {\n @Input() aggregation: Aggregation\n\n selectedDataset: AggregationDataset\n ChartType = ChartType\n\n ngOnChanges(): void {\n this.selectedDataset = this.aggregation.datasets[0]\n }\n\n selectDataset(eventTarget: any): void {\n this.selectedDataset = this.aggregation.datasets.find(\n (d: AggregationDataset) => d.id === eventTarget.value\n )\n }\n\n downloadDataset(dataset: AggregationDataset): void {\n const blob = new Blob([dataset.csv], {\n type: 'text/csv;charset=utf-8;'\n })\n fileSaver.saveAs(blob, `${this.aggregation.label} - ${dataset.label}.csv`)\n }\n}\n","\n\n
\n
\n
\n \n \n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n \n \n \n
\n\n\n 1\"\n>\n \n\n\n\n
\n
\n
\n
\n \n \n
\n \n \n
\n
\n
\n
\n
\n \n \n \n\n\n\n\n
\n
\n
\n
\n \n \n
\n \n \n
\n
\n
\n
\n
\n \n \n \n \n
\n","import { Component, Input, OnChanges } from '@angular/core'\n\nimport { Aggregation } from '../../../shared/interfaces/visualizations/aggregation.interface'\n\n@Component({\n selector: 'app-aggregation-widget',\n templateUrl: './aggregation-widget.component.html',\n styleUrls: ['./aggregation-widget.component.scss']\n})\nexport class AggregationWidgetComponent implements OnChanges {\n @Input() aggregations: Aggregation[]\n @Input() loading: boolean\n @Input() layout: 'tabs' | 'list' = 'tabs'\n\n selectedAggregation: Aggregation\n\n ngOnChanges() {\n if (this.aggregations && this.layout === 'tabs') {\n this.selectedAggregation = this.aggregations[0]\n }\n }\n}\n","
\n
\n
\n
\n
\n \n
\n \n \n
\n \n
\n\n

\n Review the latest indicators and OECD analysis on R&D tax\n incentives\n

\n
\n \n \n Access indicators\n \n
\n
\n
\n \n \n
\n \n
\n

\n Search and compare the design of R&D tax incentives\n

\n
\n \n \n Select tax incentives\n \n
\n
\n
\n \n
\n \n \n \n \n \n \n
\n\n
\n \n
\n
\n

\n Design of R&D tax incentives at a glance\n

\n
\n
\n\n \n\n
\n
\n

\n Generosity of R&D tax incentives\n

\n
\n

\n Implied tax subsidy rates on R&D tax incentives, calculated as 1 minus\n the\n B-Index, provide a synthetic representation of the generosity of the tax\n system in incentivising business R&D investment  Explore additional\n OECD indicators and analysis on R&D tax incentives.\n

\n

\n \n \n \n \n Explore additional OECD indicators and analysis on R&D tax\n incentives\n \n

\n
\n
\n
\n\n \n\n
\n
\n \n
\n
\n

\n Additional resources\n

\n\n

\n R&D tax incentives have become a major tool in the business\n innovation support policy mix of countries in the OECD area and\n beyond. Since 2007, the OECD has continuously worked to extend the\n international evidence on the use, generosity, cost and impacts of\n R&D tax incentives. Recent OECD publications include:\n

\n
    \n
  • \n {{ additionalResource.anchor }}\n \n  \n {{ additionalResource['extra-text']['pre-title'] }}\n {{ additionalResource['extra-text'].anchor }}\n {{ additionalResource['extra-text']['post-title'] }}\n \n
  • \n
\n\n

\n \n \n \n \n Discover additional resources and related OECD work\n \n

\n
\n
\n
\n
\n
\n\n","import { Component, OnInit } from '@angular/core'\nimport { MetaService } from 'src/app/shared/services/meta.service'\n\nimport { Aggregation } from '../../shared/interfaces/visualizations/aggregation.interface'\nimport { VisualizationService } from '../../shared/services/visualization.service'\nimport { ContentService } from '../../shared/services/content.service'\nimport {\n DynamicContent,\n DynamicContentItem\n} from '../../shared/interfaces/dynamic-content.interface'\n\n@Component({\n selector: 'app-home',\n templateUrl: './home.component.html',\n styleUrls: ['./home.component.scss']\n})\nexport class HomeComponent implements OnInit {\n loadingAggregations: boolean = false\n aggregations: Aggregation[]\n otherAggregation: Aggregation\n\n additionalResources: DynamicContentItem[]\n\n constructor(\n private visualizationService: VisualizationService,\n private contentService: ContentService,\n private metaService: MetaService\n ) {}\n\n ngOnInit(): void {\n this.loadingAggregations = true\n this.visualizationService.listMainVisualizations().then(\n (visualizationRes: {\n aggregations: Aggregation[]\n otherAggregation: Aggregation\n }) => {\n this.loadingAggregations = false\n this.aggregations = visualizationRes.aggregations\n this.otherAggregation = visualizationRes.otherAggregation\n },\n (err) => {\n this.loadingAggregations = false\n }\n )\n\n this.contentService\n .getDynamicContent()\n .then((dynamicContent: DynamicContent) => {\n this.additionalResources = dynamicContent.homePageContent\n })\n\n this.metaService.setTags('home')\n }\n}\n","
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n
\n

\n Indicators & analysis\n

\n
\n
\n\n
\n

\n The OECD INNOTAX portal provides an overview of some key outputs of the\n OECD measurement and analytical work on R&D tax incentives and a link to\n related OECD work in this area. It presents the latest indicators of\n Government Tax Relief for R&D (GTARD) and implied marginal R&D tax\n subsidy rates based on the B-Index. These two indicators, contained in\n the\n OECD R&D Tax Incentives database, provide a complementary picture of governments' efforts to\n incentivise business R&D through the tax system. Moreover, it points to\n the latest OECD publications, working papers, policy papers and reports\n on R&D tax incentives. The descriptive and empirical OECD analysis\n contained in these documents shed light on the recent and long-term\n trends in the role of R&D tax incentives in the innovation policy mix\n across OECD countries and partner economies and provide insights into\n the impact of R&D tax incentives and direct support measures.\n

\n
\n
\n\n \n \n
\n
\n

\n {{ group.label }}\n

\n

\n {{ group.subTitle }}\n

\n
\n
\n
\n \n
\n\n
\n
\n
\n

\n {{ section.title }}\n

\n\n
\n \n

{{ subSection.title }}

\n \n
\n
\n
\n
\n
\n\n","import { Component, OnInit } from '@angular/core'\nimport { BreadcrumbService } from 'src/app/shared/services/breadcrumb.service'\nimport { MetaService } from 'src/app/shared/services/meta.service'\n\nimport { AggregationGroup } from '../../shared/interfaces/visualizations/aggregation-group.interface'\nimport { VisualizationService } from '../../shared/services/visualization.service'\nimport { ContentService } from '../../shared/services/content.service'\nimport {\n DynamicContent,\n DynamicContentItem\n} from '../../shared/interfaces/dynamic-content.interface'\n\n@Component({\n selector: 'app-indicators',\n templateUrl: './indicators.component.html',\n styleUrls: ['./indicators.component.scss']\n})\nexport class IndicatorsComponent implements OnInit {\n aggregationGroups: AggregationGroup[]\n\n loadingAggregations = false\n sections: {\n title: string\n subSections: {\n title: string\n isHalfWidth: boolean\n items: DynamicContentItem[]\n }[]\n }[]\n\n constructor(\n private visualizationService: VisualizationService,\n private contentService: ContentService,\n private breadcrumbService: BreadcrumbService,\n metaService: MetaService\n ) {\n metaService.setTags('indicators')\n }\n\n ngOnInit(): void {\n this.breadcrumbService.breadcrumbLinks.next([\n { label: 'Indicators & analysis' }\n ])\n\n this.loadingAggregations = true\n this.visualizationService.listIndicatorVisualizations().then(\n (visualizationRes: { aggregationGroups: AggregationGroup[] }) => {\n this.aggregationGroups = visualizationRes.aggregationGroups\n this.loadingAggregations = false\n },\n (err) => {\n this.loadingAggregations = false\n }\n )\n\n this.contentService\n .getDynamicContent()\n .then((dynamicContent: DynamicContent) => {\n this.sections = dynamicContent.indicatorsPageContent\n })\n }\n}\n","import { Inject, Injectable } from '@angular/core'\nimport { Subject } from 'rxjs'\n\n@Injectable({\n providedIn: 'root'\n})\nexport class FlashMessageService {\n public flashMessage: Subject<{\n message: string\n className: string\n }> = new Subject()\n\n timeout: number = 6000\n\n success(message: string, sticky = false): void {\n this.flashMessage.next({\n message,\n className: 'notification is-success-light'\n })\n setTimeout(\n () => {\n this.flashMessage.next(null)\n },\n sticky ? 9999999 : this.timeout\n )\n }\n\n error(message: string, sticky = false): void {\n this.flashMessage.next({\n message,\n className: 'notification is-danger is-light'\n })\n setTimeout(\n () => {\n this.flashMessage.next(null)\n },\n sticky ? 9999999 : this.timeout\n )\n }\n\n info(message: string, sticky = false): void {\n this.flashMessage.next({\n message,\n className: 'notification is-info is-light'\n })\n setTimeout(\n () => {\n this.flashMessage.next(null)\n },\n sticky ? 9999999 : this.timeout\n )\n }\n}\n","import { Component } from '@angular/core'\n\n@Component({\n selector: 'app-filter-loader',\n template: `
\n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n
`\n})\nexport class FilterLoaderComponent {}\n","import { Component } from '@angular/core'\n\n@Component({\n selector: 'app-incentive-loader',\n template: `
\n
\n
\n
\n
\n
\n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
\n
\n
\n
\n
\n
`\n})\nexport class IncentiveLoaderComponent {}\n","
\n
\n {{ label }}\n \n\n \n 0\n }\"\n (click)=\"showList = !showList\"\n >\n \n All\n 1 item selected\n {{ activeOptions.length }} items selected\n \n \n
\n\n \n
\n \n

\n Select all\n Select none\n

\n \n \n {{ option }}\n \n \n
\n
\n \n\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n NgZone,\n OnChanges,\n Output,\n SimpleChange\n} from '@angular/core'\n\n@Component({\n selector: 'app-multi-select-input',\n templateUrl: './multi-select-input.component.html',\n styleUrls: ['./multi-select-input.component.scss']\n})\nexport class MultiSelectInputComponent implements OnChanges {\n @Input() label: string\n @Input() options: string[]\n @Input() activeOptions: string[]\n\n @Output() valueChanged: EventEmitter = new EventEmitter()\n\n showList = false\n\n constructor(private elementRef: ElementRef, private ngZone: NgZone) {}\n\n ngOnChanges(changes: { selectOptions?: SimpleChange }) {\n // Reset form value if we change select options.\n if (this.activeOptions?.length && changes.selectOptions) {\n return this.selectNone()\n }\n\n if (!this.activeOptions) {\n this.activeOptions = []\n } else {\n if (Array.isArray(this.activeOptions)) {\n this.activeOptions = this.activeOptions.map((option) => String(option))\n } else {\n this.activeOptions = [String(this.activeOptions)]\n }\n }\n }\n\n toggleSelected(option: string): void {\n const clickedOption: string = String(option)\n\n this.ngZone.run(() => {\n const index = this.activeOptions.indexOf(clickedOption)\n if (index !== -1) {\n this.activeOptions.splice(index, 1)\n } else {\n this.activeOptions.push(String(option))\n }\n\n this.valueChanged.emit(this.activeOptions)\n })\n }\n\n selectAll() {\n this.ngZone.run(() => {\n this.activeOptions = this.options\n this.valueChanged.emit(this.activeOptions)\n })\n }\n\n selectNone() {\n this.ngZone.run(() => {\n this.activeOptions = []\n this.valueChanged.emit(this.activeOptions)\n })\n }\n\n // Click outside closes list\n @HostListener('document:click', ['$event.target'])\n clickOut(eventTarget: any) {\n if (\n this.showList &&\n !this.elementRef.nativeElement.contains(eventTarget) &&\n !eventTarget.className.includes('mass-selection-button')\n ) {\n this.showList = false\n }\n }\n}\n","import { Pipe, PipeTransform } from '@angular/core'\n\n@Pipe({\n name: 'truncate'\n})\nexport class TruncatePipe implements PipeTransform {\n transform(value: string, args: number[]): string {\n if (!value) {\n return ''\n }\n const limit = args.length > 0 ? args[0] : 20\n const trail = args.length > 1 ? args[1] : '...'\n return value.length > limit ? value.substring(0, limit) + trail : value\n }\n}\n","
\n
\n
\n
\n \n
\n
\n
\n
\n\n
\n
\n
\n \n Find incentives\n \n\n

\n This interactive tool allows you to find R&D tax incentives with\n specific features and create a selection of incentives for review and\n comparison.\n

\n
\n
\n
\n
\n
\n
\n \n \n
\n
\n \n \n \n
\n \n
\n\n \n \n \n \n \n \n
\n \n
\n \n\n \n \n \n \n\n \n
\n
\n \n Similar to:\n {{ activeOption.value }}\n \n \n
\n
\n \n\n\n
\n
\n
\n
\n \n

There are no results for your search.

\n

Try to remove some filters to expand your search.

\n
\n
\n
\n
\n
\n\n\n
\n
\n
\n \n
\n \n
\n
\n \n \n \n \n \n \n {{ column.label | truncate : [20] }}\n \n \n \n \n \n \n\n \n \n \n
\n \n \n \n Incentive\n \n
\n \n \n \n \n \n \n \n {{ incentive.label }}\n \n \n \n \n {{\n incentive.values[column.fieldId] | truncate : [80]\n }}\n -\n
\n
\n \n \n \n\n\n \n","import {\n Component,\n ElementRef,\n HostListener,\n OnDestroy,\n OnInit,\n Renderer2,\n ViewChild\n} from '@angular/core'\nimport {\n UntypedFormBuilder,\n UntypedFormControl,\n UntypedFormGroup\n} from '@angular/forms'\nimport { ActivatedRoute, Params, Router } from '@angular/router'\nimport { GuidedTourService, Orientation } from 'ngx-guided-tour'\n\nimport { appConstants } from '../../app.constants'\nimport { IncentiveMode } from '../../shared/enums/incentive-mode.enum'\nimport { BreadcrumbLink } from '../../shared/interfaces/resources/breadcrumb-link.interface'\nimport { Field } from '../../shared/interfaces/resources/field.interface'\nimport { Filter } from '../../shared/interfaces/resources/filter.interface'\nimport { Incentive } from '../../shared/interfaces/resources/incentive.interface'\nimport { Theme } from '../../shared/interfaces/resources/theme.interface'\nimport { BreadcrumbService } from '../../shared/services/breadcrumb.service'\nimport { FavoriteService } from '../../shared/services/favorite.service'\nimport { FilterService } from '../../shared/services/filter.service'\nimport { FlashMessageService } from '../../shared/services/flash-message.service'\nimport { IncentiveService } from '../../shared/services/incentive.service'\nimport { MetaService } from '../../shared/services/meta.service'\nimport { ThemeService } from '../../shared/services/theme.service'\n\n@Component({\n selector: 'app-incentive-database',\n templateUrl: './incentive-database.component.html',\n styleUrls: ['./incentive-database.component.scss']\n})\nexport class IncentiveDatabaseComponent implements OnInit, OnDestroy {\n @ViewChild('tableContainer') tableContainer: ElementRef\n @ViewChild('scrollBarWrapper') scrollBarWrapper: ElementRef\n @ViewChild('scrollBarChild') scrollBarChild: ElementRef\n\n breadcrumbLinks: BreadcrumbLink[]\n incentives: Incentive[]\n\n loadingIncentives = true\n loadingFilters = true\n loadingDownload = false\n\n filters: Filter[]\n tableColumns: { label: string; fieldId: string }[]\n showAdvancedFilters: boolean = false\n showExportMenu: boolean = false\n activeOptions: { value: string; filterId: string }[] = []\n isAllFavorites: boolean\n\n basePath = 'incentives'\n\n form: UntypedFormGroup = this.formBuilder.group({\n similarTo: new UntypedFormControl()\n })\n\n constructor(\n breadcrumbService: BreadcrumbService,\n private metaService: MetaService,\n private incentiveService: IncentiveService,\n private favoriteService: FavoriteService,\n private filterService: FilterService,\n private themeService: ThemeService,\n private formBuilder: UntypedFormBuilder,\n private router: Router,\n private activatedRoute: ActivatedRoute,\n private renderer: Renderer2,\n private flashMessageService: FlashMessageService,\n private guidedTourService: GuidedTourService\n ) {\n breadcrumbService.breadcrumbLinks.next([{ label: 'Find incentives' }])\n }\n\n async ngOnInit() {\n this.filters = await this.filterService.list().then(\n (filterRes: Filter[]) => {\n this.loadingFilters = false\n\n // Sort filters, type \"basic\" are shown first.\n return filterRes.sort((a: Filter, b: Filter) => {\n if (a.type === 'basic' && b.type !== 'basic') {\n return -1\n }\n if (a.type !== 'basic' && b.type === 'basic') {\n return 1\n }\n return 0\n })\n },\n () => {\n this.loadingFilters = false\n this.flashMessageService.error(\n 'Could not load filters. Please try again later.'\n )\n return []\n }\n )\n\n this.filters.forEach((filter: Filter) => {\n this.form.addControl(filter.fieldId, new UntypedFormControl())\n })\n\n this.activatedRoute.queryParams.subscribe(async (queryParams: Params) => {\n // Set the active options for each filter.\n this.activeOptions = []\n\n // Special case for similarTo as it has no filter thus no options predefined.\n if (queryParams['similarTo']) {\n this.activeOptions.push({\n value: (await this.incentiveService.show(queryParams['similarTo']))\n ?.label,\n filterId: 'similarTo'\n })\n }\n\n this.filters.forEach((filter: Filter) => {\n if (queryParams[filter.fieldId]) {\n filter.activeOptions = queryParams[filter.fieldId]\n\n if (Array.isArray(queryParams[filter.fieldId])) {\n filter.activeOptions = queryParams[filter.fieldId]\n queryParams[filter.fieldId].forEach((value: string) => {\n this.activeOptions.push({\n value,\n filterId: filter.fieldId\n })\n })\n } else {\n filter.activeOptions = [queryParams[filter.fieldId]]\n this.activeOptions.push({\n value: queryParams[filter.fieldId],\n filterId: filter.fieldId\n })\n }\n } else {\n filter.activeOptions = []\n }\n })\n\n Object.keys(queryParams)\n .filter((key) => key !== 'reload')\n .forEach((fieldId) => {\n this.form.get(fieldId).setValue(queryParams[fieldId])\n })\n\n this.filterService.saveFilters(this.filters)\n\n this.loadingIncentives = true\n this.incentiveService\n .listWithoutPagination({\n fields: queryParams,\n mode: IncentiveMode.List\n })\n .then(\n async (incentiveRes: Incentive[]) => {\n this.loadingIncentives = false\n this.incentives = incentiveRes\n\n // Check and subscribe to check the mass selection checkbox if all incentives are in favorites.\n this.isAllFavorites = this.incentives.every((incentive) =>\n this.favoriteService.isFavorite(incentive.id)\n )\n this.favoriteService.favoriteIncentives.subscribe(() => {\n this.isAllFavorites = this.incentives.every((incentive) =>\n this.favoriteService.isFavorite(incentive.id)\n )\n })\n\n if (!this.tableColumns && this.incentives.length > 0) {\n this.tableColumns = await this.getTableColumns(\n this.incentives[0].fields.flat()\n )\n }\n\n this.guidedTourService.startTour({\n tourId: 'IncentiveListTour',\n minimumScreenSize: appConstants.windowBreakpoints.desktop,\n useOrb: true,\n steps: [\n {\n title: 'Welcome to the INNOTAX tour guide',\n selector: '#incentive-database-h1',\n content:\n 'Discover in 6 steps how you can find and compare R&D tax incentives in this portal.',\n orientation: Orientation.Center\n },\n {\n selector: '.multiselect-box',\n title: 'Find tax incentives',\n content:\n 'Use filters to find incentives in certain countries or with specific features.',\n orientation: Orientation.Right\n },\n {\n selector: '.incentive-id',\n title: 'Description of tax incentives',\n content:\n 'Click on the name of the tax incentive to view its features.',\n orientation: Orientation.Top\n },\n {\n selector: '#favorite-button',\n title: 'Select tax incentives for comparison',\n content:\n 'Use the checkbox to select tax incentives for comparison.',\n orientation: Orientation.Right\n },\n {\n selector: '#my-comparator',\n title: 'Comparison preview',\n content:\n 'See the selection of tax incentives and click the button to compare their features.',\n orientation: Orientation.Bottom\n },\n {\n selector: '.dropdown-trigger',\n title: 'Export as CSV',\n content:\n 'Export the selected or full list of tax incentives, including description of design features.',\n orientation: Orientation.Left\n }\n ]\n })\n\n setTimeout(() => {\n if (this.incentives.length > 0) {\n this.renderer.setStyle(\n this.scrollBarChild?.nativeElement,\n 'width',\n this.tableContainer.nativeElement?.scrollWidth + 'px'\n )\n }\n }, 50)\n },\n () => {\n this.loadingFilters = false\n this.flashMessageService.error(\n 'Could not load incentives. Please try again later.'\n )\n }\n )\n })\n\n this.metaService.setTags('incentives')\n }\n\n ngOnDestroy(): void {\n this.guidedTourService.resetTour()\n }\n\n clearAllForm() {\n // A bit hacky, but it works: reset filters and incentives.\n this.router\n .navigateByUrl('/', { skipLocationChange: true })\n .then(() => this.router.navigate([this.basePath]))\n }\n\n clearOption(filterId: string, value: string) {\n const queryParams: { [key: string]: any } = Object.assign(\n {},\n this.activatedRoute.snapshot.queryParams\n )\n\n if (Array.isArray(queryParams[filterId])) {\n const index = queryParams[filterId].indexOf(value)\n if (index > -1) {\n queryParams[filterId].splice(index, 1)\n }\n } else {\n queryParams[filterId] = null\n }\n\n queryParams['reload'] = new Date().getTime()\n\n this.router.navigate([this.basePath], {\n queryParams,\n queryParamsHandling: 'merge'\n })\n }\n\n onFilterChange(fieldId: string, value: string[]) {\n const queryParams: any = {\n [fieldId]: value\n }\n\n this.router.navigate([this.basePath], {\n queryParams,\n queryParamsHandling: 'merge'\n })\n }\n\n isFavorite(incentive: Incentive): boolean {\n return this.favoriteService.isFavorite(incentive)\n }\n\n toggleAllFavorites(incentives: Incentive[]) {\n this.isAllFavorites = incentives.every((incentive) =>\n this.favoriteService.isFavorite(incentive)\n )\n\n if (this.isAllFavorites) {\n this.favoriteService.remove(incentives.map((i) => i.id))\n } else {\n this.favoriteService.add(incentives)\n }\n }\n\n onScroll(event: any, scrollbarName: 'top' | 'bottom') {\n if (scrollbarName === 'top') {\n this.tableContainer.nativeElement.scrollLeft = event.target.scrollLeft\n }\n if (scrollbarName === 'bottom') {\n this.scrollBarWrapper.nativeElement.scrollLeft = event.target.scrollLeft\n }\n }\n\n async getTableColumns(\n incentiveFields: Field[]\n ): Promise<{ label: string; fieldId: string }[]> {\n const themes: Theme[] = await this.themeService.list({\n mode: IncentiveMode.List\n })\n\n // Get all field from the themes and subThemes.\n const themeFields = themes.map((theme) => theme.fields).flat()\n const subThemeFields = themes\n .map((theme) => theme.subThemes.map((subTheme) => subTheme.fields).flat())\n .flat()\n\n return [...themeFields, ...subThemeFields]\n .filter((theme) => incentiveFields.some(({ id }) => theme.id === id))\n .map((t) => ({ label: t.label, fieldId: t.id }))\n }\n\n async downloadIncentives(incentives: Incentive[]): Promise {\n this.loadingDownload = true\n await this.incentiveService.download(\n incentives.map((incentive) => incentive.id)\n )\n this.loadingDownload = false\n }\n\n @HostListener('document:click', ['$event'])\n clickOut(event: any) {\n if (\n this.showExportMenu &&\n !event.target.className.includes('dropdown-menu') &&\n !event.target.className.includes('button') &&\n !event.target.className.includes('is-hidden-touch')\n ) {\n this.showExportMenu = false\n }\n }\n}\n","import { Component } from '@angular/core'\n\n@Component({\n selector: 'app-country-detail-loader',\n template: `
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n \n `\n})\nexport class CountryDetailLoaderComponent {}\n","
\n
\n
\n
\n \n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n \n

\n {{ country.label }}\n \n \n \n

\n
\n
\n
\n
\n
\n
\n
\n \n
\n\n
\n
\n
\n \n \n
\n
\n
\n
\n\n \n\n \n
\n
\n
\n
\n
\n
\n \n

\n Recent policy developments\n

\n \n \n \n
\n \n
\n \n \n \n \n \n \n {{ incentiveGroup.incentiveLabel }}\n \n \n \n \n \n \n {{ yearGroup.year }}\n \n \n \n \n {{ fieldLabels[field.id] }}\n \n {{ field.value }}\n \n \n \n
\n \n \n \n \n \n \n \n
\n In 2023, {{ country.label }} did not undertake changes\n in its R&D tax relief provisions.\n
\n
\n
\n
\n
\n
\n \n \n \n\n \n
\n
\n
\n

\n {{ group.label }}\n

\n

\n {{ group.subTitle }}\n

\n

{{ group.description }}

\n
\n
\n \n
\n\n \n
\n
\n
\n

\n Compare the incentives in {{ country.label }} with those in other\n countries\n

\n
\n \n \n \n {{\n comparativeCountry.label\n }}\n \n
\n\n \n
\n \n
\n","import { Component, OnInit } from '@angular/core'\nimport { ActivatedRoute, Params } from '@angular/router'\n\nimport { appConstants } from '../../../app.constants'\nimport { IncentiveMode } from '../../../shared/enums/incentive-mode.enum'\nimport { Country } from '../../../shared/interfaces/resources/country.interface'\nimport { Field } from '../../../shared/interfaces/resources/field.interface'\nimport { Theme } from '../../../shared/interfaces/resources/theme.interface'\nimport { Aggregation } from '../../../shared/interfaces/visualizations/aggregation.interface'\nimport { BreadcrumbService } from '../../../shared/services/breadcrumb.service'\nimport { CountryService } from '../../../shared/services/country.service'\nimport { IncentiveService } from '../../../shared/services/incentive.service'\nimport { MetaService } from '../../../shared/services/meta.service'\nimport { ThemeService } from '../../../shared/services/theme.service'\n\n@Component({\n selector: 'app-country-detail',\n templateUrl: './country-detail.component.html',\n styleUrls: ['./country-detail.component.scss']\n})\nexport class CountryDetailComponent implements OnInit {\n country: Country\n countries: Country[]\n fieldLabels: { [key: string]: string }\n incentiveModeCountryView: IncentiveMode = IncentiveMode.CountryView\n\n loadingDownload: boolean = false\n isPolicyChangesExtended: boolean = true\n\n selectedAggregation: Aggregation\n cyprusNote: string = appConstants.cyprusNote\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private countryService: CountryService,\n private themeService: ThemeService,\n private metaService: MetaService,\n private incentiveService: IncentiveService,\n private breadcrumbService: BreadcrumbService\n ) {}\n\n ngOnInit(): void {\n this.activatedRoute.params.subscribe((params: Params) => {\n this.countryService.show(params['code']).then((countryRes: Country) => {\n this.country = countryRes\n\n // Select first aggregation for each group.\n this.country.aggregationGroups.forEach((group) => {\n group.selectedAggregation = group.aggregations[0]\n })\n\n this.themeService.list().then((themeRes) => {\n const policyChangesFields = themeRes.find(\n (theme: Theme) => theme.id === 'policyChanges'\n ).fields\n\n // Format the fields of PolicyChanges in API to an Object that value can be displayed in template.\n this.fieldLabels = policyChangesFields.reduce((obj, field: Field) => {\n return {\n ...obj,\n [field.id]: field.label\n }\n }, {})\n })\n\n this.countryService.list().then((countryRes: Country[]) => {\n this.countries = countryRes.filter(\n (comparativeCountry) => comparativeCountry.id !== this.country.id\n )\n })\n\n this.breadcrumbService.breadcrumbLinks.next([\n { label: 'Countries', path: '/countries' },\n { label: this.country.label }\n ])\n\n this.metaService.setDynamicTags({\n title: `${this.country.label} - Details`,\n description: `Detailed summary of the R&D tax incentives currently and historically implemented in ${this.country.label}. Additional quantitative data on the generosity of ${this.country.label}'s R&D support policies. `,\n path: `countries/${this.country.id}`\n })\n })\n })\n }\n\n async downloadIncentives(incentiveIds: string[]): Promise {\n this.loadingDownload = true\n await this.incentiveService.download(incentiveIds)\n this.loadingDownload = false\n }\n\n /**\n * Group policy changes by incentiveLabel and year.\n * @param policyChanges Array of policy changes.\n * @returns Grouped policy changes.\n */\n groupPolicyChangesByIncentive(policyChanges: any[]): any[] {\n const grouped: any[] = []\n const incentiveMap = new Map()\n\n // Group by incentiveLabel\n for (const change of policyChanges) {\n if (!incentiveMap.has(change.incentiveLabel)) {\n incentiveMap.set(change.incentiveLabel, {\n incentiveLabel: change.incentiveLabel,\n years: []\n })\n }\n const incentiveGroup = incentiveMap.get(change.incentiveLabel)\n\n // Find or create year group\n let yearGroup = incentiveGroup.years.find(\n (y: any) => y.year === change.year\n )\n if (!yearGroup) {\n yearGroup = { year: change.year, fields: [] }\n incentiveGroup.years.push(yearGroup)\n }\n yearGroup.fields.push(...change.fields)\n }\n\n // Convert Map to array for template iteration\n incentiveMap.forEach((value) => grouped.push(value))\n return grouped\n }\n}\n","
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n

Countries

\n

\n The OECD INNOTAX portal covers all OECD member countries, EU member\n states and several other major economies that participate in the OECD\n surveys on R&D tax incentives. The country-specific pages of the OECD\n INNOTAX portal aim to provide a description of the design and\n implementation of R&D tax incentives for all countries that provided R&D\n tax incentives at central government level from 2000 onwards, either on\n a temporary or permanent basis. Click on a country to get information on\n its R&D tax incentives.\n

\n
\n
\n
\n \n \n \n {{ country.label }}\n \n
\n \n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n \n \n \n \n\n","import { Component, OnInit } from '@angular/core'\nimport { BreadcrumbService } from 'src/app/shared/services/breadcrumb.service'\nimport { Country } from '../../../shared/interfaces/resources/country.interface'\nimport { CountryService } from '../../../shared/services/country.service'\nimport { MetaService } from '../../../shared/services/meta.service'\n\n@Component({\n selector: 'app-country-list',\n templateUrl: './country-list.component.html',\n styleUrls: ['./country-list.component.scss']\n})\nexport class CountryListComponent implements OnInit {\n countries: Country[]\n\n constructor(\n private countryService: CountryService,\n private breadcrumbService: BreadcrumbService,\n private metaService: MetaService\n ) {}\n\n ngOnInit(): void {\n this.countryService.list().then((countriesRes: Country[]) => {\n this.countries = countriesRes\n })\n\n this.breadcrumbService.breadcrumbLinks.next([{ label: 'Countries' }])\n this.metaService.setTags('countries')\n }\n}\n","
\n
\n
\n
\n \n
\n
\n
\n
\n\n
\n
\n
\n
\n
\n
\n
\n \n \n \n \n\n \n

\n {{ incentive.label }}\n \n \n \n

\n
\n
\n
\n
\n
\n
\n \n
\n\n
\n
\n
\n
\n \n \n

\n {{ theme.label }}\n

\n \n \n \n
\n \n
\n \n \n \n \n \n \n \n \n \n \n {{ subField.label }}\n \n \n \n \n \n\n \n \n \n \n \n \n {{ field.label }}\n \n \n \n \n \n
\n {{ subTheme.label }}\n
\n {{ incentive?.values[subField.id] }}\n -
\n Other\n
\n {{ incentive?.values[field.id] }}\n -
\n
\n
\n \n
\n
\n \n\n\n\n
\n
\n
\n \n
\n
\n
\n\n \n
\n
\n
\n \n
\n
\n
\n \n
\n
\n \n \n
\n
\n \n \n
\n
\n \n \n \n\n\n
\n
\n
\n
\n
\n \n \n Compare with similar incentives\n
\n
\n
\n
\n
\n","import { Component, OnInit } from '@angular/core'\nimport { ActivatedRoute, Params } from '@angular/router'\nimport { BreadcrumbService } from 'src/app/shared/services/breadcrumb.service'\nimport { appConstants } from '../../../app.constants'\n\nimport { IncentiveMode } from '../../../shared/enums/incentive-mode.enum'\nimport { Incentive } from '../../../shared/interfaces/resources/incentive.interface'\nimport { Theme } from '../../../shared/interfaces/resources/theme.interface'\nimport { IncentiveService } from '../../../shared/services/incentive.service'\nimport { MetaService } from '../../../shared/services/meta.service'\nimport { ThemeService } from '../../../shared/services/theme.service'\n\n@Component({\n selector: 'app-incentive-detail',\n templateUrl: './incentive-detail.component.html',\n styleUrls: ['./incentive-detail.component.scss']\n})\nexport class IncentiveDetailComponent implements OnInit {\n incentive: Incentive\n comparatorIncentiveIds: string[]\n themes: Theme[]\n cyprusNote: string = appConstants.cyprusNote\n\n constructor(\n private activatedRoute: ActivatedRoute,\n private incentiveService: IncentiveService,\n private themeService: ThemeService,\n private metaService: MetaService,\n private breadcrumbService: BreadcrumbService\n ) {}\n\n ngOnInit(): void {\n this.activatedRoute.params.subscribe((params: Params) => {\n this.incentiveService\n .show(params['id'])\n .then((incentiveRes: Incentive) => {\n this.incentive = incentiveRes\n this.comparatorIncentiveIds = [\n this.incentive.id,\n ...this.incentive.similarIncentiveIds\n ]\n\n this.breadcrumbService.breadcrumbLinks.next([\n { label: 'Countries', path: '/countries' },\n {\n label: this.incentive.country.label,\n path: `/countries/${this.incentive.country.id}`\n },\n { label: this.incentive.label }\n ])\n\n this.metaService.setDynamicTags({\n title: `${this.incentive.label} details - ${this.incentive.country.label}`,\n description: `Detailed overview of the policy design features of the ${this.incentive.label} in ${this.incentive.country.label}. Data is based on the OECD R&D tax incentive survey.`,\n path: `incentives/${this.incentive.id}`\n })\n })\n\n this.themeService\n .list({ mode: IncentiveMode.Detail })\n .then((themeRes: Theme[]) => {\n this.themes = themeRes\n\n this.themes.forEach((theme: Theme) => {\n theme.isCollapsed = theme.id !== 'general'\n })\n })\n })\n }\n}\n","import { NgModule } from '@angular/core'\nimport { RouterModule, Routes } from '@angular/router'\n\nimport { Error404Component } from './errors/error404/error404.component'\nimport { AboutComponent } from './pages/about/about.component'\nimport { ComparatorComponent } from './pages/comparator/comparator.component'\nimport { HomeComponent } from './pages/home/home.component'\nimport { IndicatorsComponent } from './pages/indicators/indicators.component'\nimport { IncentiveDatabaseComponent } from './pages/incentive-database/incentive-database.component'\nimport { CountryDetailComponent } from './resources/country/country-detail/country-detail.component'\nimport { CountryListComponent } from './resources/country/country-list/country-list.component'\nimport { IncentiveDetailComponent } from './resources/incentive/incentive-detail/incentive-detail.component'\n\nconst routes: Routes = [\n // Pages.\n {\n path: '',\n component: HomeComponent\n },\n {\n path: 'comparator',\n component: ComparatorComponent\n },\n {\n path: 'indicators-and-analysis',\n component: IndicatorsComponent\n },\n {\n path: 'incentives',\n component: IncentiveDatabaseComponent\n },\n {\n path: 'about',\n component: AboutComponent\n },\n\n { path: 'countries', component: CountryListComponent },\n { path: 'countries/:code', component: CountryDetailComponent },\n { path: 'incentives/:id', component: IncentiveDetailComponent },\n {\n path: '404',\n component: Error404Component\n },\n {\n path: '**',\n redirectTo: '/404'\n }\n]\n\n@NgModule({\n imports: [RouterModule.forRoot(routes)],\n exports: [RouterModule]\n})\nexport class AppRoutingModule {}\n","import { Component, OnInit } from '@angular/core'\nimport * as moment from 'moment'\n\n@Component({\n selector: 'app-footer',\n templateUrl: './footer.component.html',\n styleUrls: ['./footer.component.scss']\n})\nexport class FooterComponent implements OnInit {\n currentYear: string = moment().format('YYYY')\n\n constructor() {}\n\n ngOnInit(): void {}\n}\n","
\n
\n
\n
\n \n
\n
\n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n","import { Component } from '@angular/core'\n\n@Component({\n selector: 'app-header-countries-loader',\n template: `
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n
\n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n
\n \n
\n
\n
\n \n \n `\n})\nexport class HeaderCountriesLoaderComponent {}\n","import { trigger, transition, style, animate } from '@angular/animations'\nexport const listAnimation = trigger('fadeInFlash', [\n transition(':enter', [\n style({\n opacity: 0,\n backgroundColor: '#F8B232'\n }),\n animate(\n '360ms cubic-bezier(0.390, 0.575, 0.565, 1.000)',\n style({ opacity: 1 })\n ),\n animate(\n '1800ms cubic-bezier(0.390, 0.575, 0.565, 1.000)',\n style({\n backgroundColor: '#fff'\n })\n )\n ]),\n transition(':leave', [\n animate(\n '360ms cubic-bezier(0.390, 0.575, 0.565, 1.000)',\n style({ opacity: 0 })\n )\n ])\n])\n","
\n
\n
\n

\n Comparison preview\n \n

\n
\n
\n = 1\">\n \n
\n
\n
\n
\n \n
\n
\n

\n The incentive has been added with success.\n

\n

1\">\n The incentives has been added with success.\n

\n

\n If you wish, you can remove your previous selection by\n clicking on the button below. Otherwise you can continue to\n add incentives to your comparison.\n

\n

\n \n \n \n \n Remove all but the last incentive\n \n 1\"\n class=\"is-inside-cart\"\n >Remove all but the last incentives\n \n \n

\n
\n
\n
\n
\n
\n \n
\n \n \n \n \n {{ favoriteIncentive.label }}\n \n
\n
\n
\n
\n\n \n
\n

you haven't selected any incentive yet.

\n

\n How to add incentives for comparison ?\n

\n
    \n
  1. \n Go to\n find incentives page using the\n navbar.\n
  2. \n
  3. Use the filters to find incentives
  4. \n
  5. \n On the filtered list of incentives, click on the incentives you\n are interested in.\n
    \n \n
  6. \n
  7. \n You will see your selection here and you can access the comparison\n interface using the button below.\n
  8. \n
\n
\n
\n \n\n \n \n \n Compare 0 incentive\n \n \n \n Explore the incentive\n \n \n \n Compare {{ favoriteIncentives.length }} incentives\n \n \n \n Reset comparison\n \n \n\n","import {\n Component,\n ElementRef,\n EventEmitter,\n HostListener,\n Input,\n Output\n} from '@angular/core'\n\nimport { Favorite } from '../../shared/interfaces/resources/favorite.interface'\nimport { FavoriteService } from '../../shared/services/favorite.service'\nimport { listAnimation } from './list.animation'\n\n@Component({\n selector: 'app-cart',\n templateUrl: './cart.component.html',\n styleUrls: ['./cart.component.scss'],\n animations: [listAnimation]\n})\nexport class CartComponent {\n @Input() favoriteIncentives: Favorite[] = []\n @Input() lastAddedIncentives: Favorite[] = []\n @Input() isCartOpen: boolean\n\n @Output() onCloseModal: EventEmitter = new EventEmitter()\n\n constructor(\n private elementRef: ElementRef,\n private favoriteService: FavoriteService\n ) {}\n\n remove(id: string) {\n this.favoriteService.remove(id)\n }\n\n removeOldFavorites() {\n const oldFavorites: Favorite[] = this.favoriteIncentives.filter(\n (incentive) => !this.lastAddedIncentives.includes(incentive)\n )\n\n this.favoriteService.remove(oldFavorites.map((incentive) => incentive.id))\n }\n\n resetFavorites() {\n this.favoriteService.removeAllFavorites()\n }\n\n @HostListener('document:click', ['$event'])\n clickOut(event: any) {\n if (\n !this.elementRef.nativeElement.contains(event.target) &&\n event.target.id !== 'my-comparator' &&\n event.target.type !== 'checkbox' &&\n // For some reason, the first expression is not working on deep nested elements.\n !event.target.className.includes('is-inside-cart')\n ) {\n this.onCloseModal.emit()\n }\n }\n}\n","\n \n
\n
\n
\n
\n \n \n
\n
\n
\n

\n Created by the OECD Directorate for Science, Technology and\n Innovation\n

\n

\n This website was created by the OECD Directorate for Science\n Technology and Innovation\n (STI).\n

\n
\n
\n

\n How to validate authenticity\n

\n

\n Validation that this is an official OECD website can be found on\n the\n R&D Tax Incentives\n page of the corporate OECD website.\n

\n
\n
\n
\n \n
\n \n
\n \n \n \n\n \n \n \n \n \n
\n\n
\n
\n\n
\n
\n \n About\n \n
\n \n \n Countries\n \n
\n
\n
\n
\n

\n Find out about a country\n

\n
\n
\n
\n
\n \n \n Back\n \n
\n \n \n \n \n \n {{ country.label }}\n \n
\n
\n
\n
\n
\n
\n
\n
\n \n Indicators and analysis\n \n
\n
\n \n Find incentives\n \n
\n\n
\n \n Compare incentives\n = 1\n }\"\n >{{ favoriteIncentives?.length }}\n \n \n My comparator\n = 1\n }\"\n >{{ favoriteIncentives?.length }}\n \n
\n
\n\n \n \n \n \n \n\n","import {\n Component,\n ElementRef,\n HostListener,\n OnInit,\n Renderer2,\n ViewChild\n} from '@angular/core'\nimport { NavigationEnd, Router } from '@angular/router'\n\nimport { appConstants } from '../../app.constants'\nimport { Country } from '../../shared/interfaces/resources/country.interface'\nimport { Favorite } from '../../shared/interfaces/resources/favorite.interface'\nimport { CountryService } from '../../shared/services/country.service'\nimport { FavoriteService } from '../../shared/services/favorite.service'\n\n@Component({\n selector: 'app-header',\n templateUrl: './header.component.html',\n styleUrls: ['./header.component.scss']\n})\nexport class HeaderComponent implements OnInit {\n @ViewChild('countryMenu') countryMenuEl: ElementRef\n\n countries: Country[]\n favoriteIncentives: Favorite[]\n lastAddedIncentives: Favorite[]\n isUserAlreadyAddedIncentiveToCart = false\n\n activeItem: string\n activeCountry: string\n showMobileMenu = false\n isCountryDropdownExtended = false\n isLegalMenuExpanded = false\n isCartOpen = false\n\n constructor(\n private countryService: CountryService,\n private favoriteService: FavoriteService,\n private elem: ElementRef,\n private router: Router,\n private renderer: Renderer2\n ) {}\n\n ngOnInit(): void {\n this.countryService.list().then((countryRes: Country[]) => {\n this.countries = countryRes\n })\n\n this.favoriteIncentives = this.favoriteService.list()\n\n this.favoriteService.favoriteIncentives.subscribe({\n next: (newFavoriteIncentives) => {\n this.lastAddedIncentives = []\n this.isCartOpen = true\n\n // Compare new favorite incentives with old favorite incentives and add or remove incentives from the list accordingly.\n // This is necessary for the animation to work properly (changing the array instead of replacing it).\n newFavoriteIncentives.forEach((favoriteIncentive) => {\n if (\n !this.favoriteIncentives.find(\n (incentive) => incentive.id === favoriteIncentive.id\n )\n ) {\n this.favoriteIncentives.push(favoriteIncentive)\n\n if (!this.isUserAlreadyAddedIncentiveToCart) {\n this.lastAddedIncentives.push(favoriteIncentive)\n }\n }\n })\n\n this.favoriteIncentives = this.favoriteIncentives.filter((incentive) =>\n newFavoriteIncentives.find(\n (favoriteIncentive) => favoriteIncentive.id === incentive.id\n )\n )\n\n this.isUserAlreadyAddedIncentiveToCart = true\n }\n })\n\n this.router.events.subscribe((event) => {\n if (event instanceof NavigationEnd) {\n if (event.url.substring(0, 11) === '/incentives') {\n this.activeItem = 'incentives'\n this.isUserAlreadyAddedIncentiveToCart = false\n } else if (event.url.substring(0, 10) === '/countries') {\n this.activeItem = 'countries'\n } else if (event.url.substring(0, 11) === '/comparator') {\n this.activeItem = 'comparator'\n } else if (event.url.substring(0, 6) === '/about') {\n this.activeItem = 'about'\n } else if (event.url.substring(0, 24) === '/indicators-and-analysis') {\n this.activeItem = 'indicators'\n } else {\n this.activeItem = ''\n }\n\n this.activeCountry = event.url.split('/')?.[2]\n this.isCountryDropdownExtended = false\n this.isCartOpen = false\n }\n })\n }\n\n toggleMobileMenu(closeOnly?: boolean): void {\n if (appConstants.windowBreakpoints.tablet > window.innerWidth) {\n if (this.showMobileMenu) {\n this.showMobileMenu = false\n this.renderer.removeClass(document.querySelector('html'), 'is-clipped')\n } else if (!closeOnly) {\n this.showMobileMenu = true\n this.renderer.addClass(document.querySelector('html'), 'is-clipped')\n }\n }\n }\n\n goToComparator(): void {\n this.router.navigate(['/comparator'])\n }\n\n @HostListener('document:click', ['$event'])\n clickOut(event: Event) {\n if (!this.elem.nativeElement.contains(event.target)) {\n this.isCountryDropdownExtended = false\n }\n }\n}\n","\n

{{ flashMessage.message }}

\n\n","import { Component, OnInit } from '@angular/core'\nimport { FlashMessageService } from '../../shared/services/flash-message.service'\n\n@Component({\n selector: 'app-flash-message',\n templateUrl: './flash-message.component.html',\n styleUrls: ['./flash-message.component.scss']\n})\nexport class FlashMessageComponent implements OnInit {\n flashMessage: { message: string; className: string }\n\n constructor(private flashMessageService: FlashMessageService) {}\n\n ngOnInit() {\n this.flashMessageService.flashMessage.subscribe((res) => {\n this.flashMessage = res\n })\n }\n}\n","import { Component } from '@angular/core'\nimport { NavigationEnd, Router } from '@angular/router'\n\n@Component({\n selector: 'app-root',\n templateUrl: './app.component.html',\n styleUrls: ['./app.component.scss']\n})\nexport class AppComponent {\n constructor(private router: Router) {}\n\n ngOnInit() {\n this.router.events.subscribe((routeChanged) => {\n if (routeChanged instanceof NavigationEnd) {\n window.scrollTo(0, 0)\n }\n })\n }\n}\n","\n
\n \n
\n\n\n\n","import { HttpClientModule } from '@angular/common/http'\nimport { APP_INITIALIZER, NgModule } from '@angular/core'\nimport { ReactiveFormsModule } from '@angular/forms'\nimport { BrowserModule } from '@angular/platform-browser'\nimport { BrowserAnimationsModule } from '@angular/platform-browser/animations'\nimport { NgChartsModule } from 'ng2-charts'\nimport { DndModule } from 'ngx-drag-drop'\nimport { GuidedTourModule, GuidedTourService } from 'ngx-guided-tour'\n\nimport { AppRoutingModule } from './app-routing.module'\nimport { AppComponent } from './app.component'\nimport { BarChartComponent } from './data-visualization/charts/bar-chart/bar-chart.component'\nimport { IframeComponent } from './data-visualization/charts/iframe/iframe.component'\nimport { PieChartComponent } from './data-visualization/charts/pie-chart/pie-chart.component'\nimport { ScatterPlotComponent } from './data-visualization/charts/scatter-plot/scatter-plot.component'\nimport { StackedBarComponent } from './data-visualization/charts/stacked-bar/stacked-bar.component'\nimport { SunburstComponent } from './data-visualization/charts/sunburst/sunburst.component'\nimport { WorldMapComponent } from './data-visualization/charts/world-map/world-map.component'\nimport { AggregationWidgetComponent } from './data-visualization/components/aggregation-widget/aggregation-widget.component'\nimport { AggregationWrapperComponent } from './data-visualization/components/aggregation-wrapper/aggregation-wrapper.component'\nimport { Error404Component } from './errors/error404/error404.component'\nimport { AboutComponent } from './pages/about/about.component'\nimport { ComparatorComponent } from './pages/comparator/comparator.component'\nimport { HomeComponent } from './pages/home/home.component'\nimport { FilterLoaderComponent } from './pages/incentive-database/filter-loader.component'\nimport { IncentiveDatabaseComponent } from './pages/incentive-database/incentive-database.component'\nimport { IncentiveLoaderComponent } from './pages/incentive-database/incentive-loader.component'\nimport { indicatorsLoaderComponent } from './pages/indicators/indicators-loader.component'\nimport { IndicatorsComponent } from './pages/indicators/indicators.component'\nimport { BreadcrumbComponent } from './partials/breadcrumb/breadcrumb.component'\nimport { CartComponent } from './partials/cart/cart.component'\nimport { CountryComparisonWidgetComponent } from './partials/country-comparison-widget/country-comparison-widget.component'\nimport { FavoriteButtonComponent } from './partials/favorite-button/favorite-button.component'\nimport { FlashMessageComponent } from './partials/flash-message/flash-message.component'\nimport { FooterComponent } from './partials/footer/footer.component'\nimport { HeaderCountriesLoaderComponent } from './partials/header/header-countries-loader.component'\nimport { HeaderComponent } from './partials/header/header.component'\nimport { MultiSelectInputComponent } from './partials/multi-select-input/multi-select-input.component'\nimport { CountryDetailLoaderComponent } from './resources/country/country-detail/country-detail-loader.component'\nimport { CountryDetailComponent } from './resources/country/country-detail/country-detail.component'\nimport { CountryListComponent } from './resources/country/country-list/country-list.component'\nimport { IncentiveComparatorLoaderComponent } from './resources/incentive/incentive-comparator/incentive-comparator-loader.component'\nimport { IncentiveComparatorComponent } from './resources/incentive/incentive-comparator/incentive-comparator.component'\nimport { IncentiveDetailComponent } from './resources/incentive/incentive-detail/incentive-detail.component'\nimport { OrderIncentivesModalComponent } from './resources/incentive/order-incentive-modal/order-incentives-modal.component'\nimport { TruncatePipe } from './shared/pipes/truncate.pipe'\nimport { EnvironmentService } from './shared/services/environment.service'\n\n@NgModule({\n declarations: [\n AppComponent,\n FooterComponent,\n HeaderComponent,\n HeaderCountriesLoaderComponent,\n FavoriteButtonComponent,\n HomeComponent,\n ComparatorComponent,\n IncentiveDatabaseComponent,\n CountryListComponent,\n CountryDetailComponent,\n CountryDetailLoaderComponent,\n CountryComparisonWidgetComponent,\n IncentiveDetailComponent,\n IncentiveComparatorComponent,\n IncentiveComparatorLoaderComponent,\n FilterLoaderComponent,\n IncentiveLoaderComponent,\n indicatorsLoaderComponent,\n BreadcrumbComponent,\n FlashMessageComponent,\n AggregationWrapperComponent,\n\n // Pipes.\n TruncatePipe,\n MultiSelectInputComponent,\n CartComponent,\n SunburstComponent,\n WorldMapComponent,\n StackedBarComponent,\n OrderIncentivesModalComponent,\n AboutComponent,\n Error404Component,\n IndicatorsComponent,\n PieChartComponent,\n IframeComponent,\n BarChartComponent,\n AggregationWidgetComponent,\n ScatterPlotComponent\n ],\n imports: [\n BrowserModule,\n BrowserAnimationsModule,\n AppRoutingModule,\n ReactiveFormsModule,\n HttpClientModule,\n NgChartsModule,\n DndModule,\n GuidedTourModule\n ],\n providers: [\n GuidedTourService,\n {\n provide: APP_INITIALIZER,\n useFactory: (environmentService: EnvironmentService) => () =>\n environmentService.loadEnvironment().toPromise(),\n deps: [EnvironmentService],\n multi: true\n }\n ],\n bootstrap: [AppComponent]\n})\nexport class AppModule {}\n","import { enableProdMode } from '@angular/core';\nimport { platformBrowserDynamic } from '@angular/platform-browser-dynamic';\n\nimport { AppModule } from './app/app.module';\nimport { environment } from './environments/environment';\n\nif (environment.production) {\n enableProdMode();\n}\n\nplatformBrowserDynamic().bootstrapModule(AppModule)\n .catch(err => console.error(err));\n","var map = {\n\t\"./af\": 58685,\n\t\"./af.js\": 58685,\n\t\"./ar\": 254,\n\t\"./ar-dz\": 4312,\n\t\"./ar-dz.js\": 4312,\n\t\"./ar-kw\": 32614,\n\t\"./ar-kw.js\": 32614,\n\t\"./ar-ly\": 18630,\n\t\"./ar-ly.js\": 18630,\n\t\"./ar-ma\": 28674,\n\t\"./ar-ma.js\": 28674,\n\t\"./ar-sa\": 49032,\n\t\"./ar-sa.js\": 49032,\n\t\"./ar-tn\": 24730,\n\t\"./ar-tn.js\": 24730,\n\t\"./ar.js\": 254,\n\t\"./az\": 53052,\n\t\"./az.js\": 53052,\n\t\"./be\": 60150,\n\t\"./be.js\": 60150,\n\t\"./bg\": 63069,\n\t\"./bg.js\": 63069,\n\t\"./bm\": 13466,\n\t\"./bm.js\": 13466,\n\t\"./bn\": 18516,\n\t\"./bn-bd\": 90557,\n\t\"./bn-bd.js\": 90557,\n\t\"./bn.js\": 18516,\n\t\"./bo\": 26273,\n\t\"./bo.js\": 26273,\n\t\"./br\": 9588,\n\t\"./br.js\": 9588,\n\t\"./bs\": 19815,\n\t\"./bs.js\": 19815,\n\t\"./ca\": 83331,\n\t\"./ca.js\": 83331,\n\t\"./cs\": 21320,\n\t\"./cs.js\": 21320,\n\t\"./cv\": 72219,\n\t\"./cv.js\": 72219,\n\t\"./cy\": 68266,\n\t\"./cy.js\": 68266,\n\t\"./da\": 66427,\n\t\"./da.js\": 66427,\n\t\"./de\": 67435,\n\t\"./de-at\": 52871,\n\t\"./de-at.js\": 52871,\n\t\"./de-ch\": 12994,\n\t\"./de-ch.js\": 12994,\n\t\"./de.js\": 67435,\n\t\"./dv\": 82357,\n\t\"./dv.js\": 82357,\n\t\"./el\": 95649,\n\t\"./el.js\": 95649,\n\t\"./en-au\": 59961,\n\t\"./en-au.js\": 59961,\n\t\"./en-ca\": 19878,\n\t\"./en-ca.js\": 19878,\n\t\"./en-gb\": 3924,\n\t\"./en-gb.js\": 3924,\n\t\"./en-ie\": 70864,\n\t\"./en-ie.js\": 70864,\n\t\"./en-il\": 91579,\n\t\"./en-il.js\": 91579,\n\t\"./en-in\": 30940,\n\t\"./en-in.js\": 30940,\n\t\"./en-nz\": 16181,\n\t\"./en-nz.js\": 16181,\n\t\"./en-sg\": 44301,\n\t\"./en-sg.js\": 44301,\n\t\"./eo\": 85291,\n\t\"./eo.js\": 85291,\n\t\"./es\": 54529,\n\t\"./es-do\": 53764,\n\t\"./es-do.js\": 53764,\n\t\"./es-mx\": 12584,\n\t\"./es-mx.js\": 12584,\n\t\"./es-us\": 63425,\n\t\"./es-us.js\": 63425,\n\t\"./es.js\": 54529,\n\t\"./et\": 35203,\n\t\"./et.js\": 35203,\n\t\"./eu\": 70678,\n\t\"./eu.js\": 70678,\n\t\"./fa\": 83483,\n\t\"./fa.js\": 83483,\n\t\"./fi\": 96262,\n\t\"./fi.js\": 96262,\n\t\"./fil\": 52521,\n\t\"./fil.js\": 52521,\n\t\"./fo\": 34555,\n\t\"./fo.js\": 34555,\n\t\"./fr\": 63131,\n\t\"./fr-ca\": 88239,\n\t\"./fr-ca.js\": 88239,\n\t\"./fr-ch\": 21702,\n\t\"./fr-ch.js\": 21702,\n\t\"./fr.js\": 63131,\n\t\"./fy\": 267,\n\t\"./fy.js\": 267,\n\t\"./ga\": 23821,\n\t\"./ga.js\": 23821,\n\t\"./gd\": 71753,\n\t\"./gd.js\": 71753,\n\t\"./gl\": 4074,\n\t\"./gl.js\": 4074,\n\t\"./gom-deva\": 92762,\n\t\"./gom-deva.js\": 92762,\n\t\"./gom-latn\": 5969,\n\t\"./gom-latn.js\": 5969,\n\t\"./gu\": 82809,\n\t\"./gu.js\": 82809,\n\t\"./he\": 45402,\n\t\"./he.js\": 45402,\n\t\"./hi\": 315,\n\t\"./hi.js\": 315,\n\t\"./hr\": 10410,\n\t\"./hr.js\": 10410,\n\t\"./hu\": 38288,\n\t\"./hu.js\": 38288,\n\t\"./hy-am\": 67928,\n\t\"./hy-am.js\": 67928,\n\t\"./id\": 71334,\n\t\"./id.js\": 71334,\n\t\"./is\": 86959,\n\t\"./is.js\": 86959,\n\t\"./it\": 34864,\n\t\"./it-ch\": 51124,\n\t\"./it-ch.js\": 51124,\n\t\"./it.js\": 34864,\n\t\"./ja\": 36141,\n\t\"./ja.js\": 36141,\n\t\"./jv\": 29187,\n\t\"./jv.js\": 29187,\n\t\"./ka\": 42136,\n\t\"./ka.js\": 42136,\n\t\"./kk\": 94332,\n\t\"./kk.js\": 94332,\n\t\"./km\": 18607,\n\t\"./km.js\": 18607,\n\t\"./kn\": 84305,\n\t\"./kn.js\": 84305,\n\t\"./ko\": 70234,\n\t\"./ko.js\": 70234,\n\t\"./ku\": 16003,\n\t\"./ku.js\": 16003,\n\t\"./ky\": 75061,\n\t\"./ky.js\": 75061,\n\t\"./lb\": 32786,\n\t\"./lb.js\": 32786,\n\t\"./lo\": 66183,\n\t\"./lo.js\": 66183,\n\t\"./lt\": 50029,\n\t\"./lt.js\": 50029,\n\t\"./lv\": 24169,\n\t\"./lv.js\": 24169,\n\t\"./me\": 68577,\n\t\"./me.js\": 68577,\n\t\"./mi\": 68177,\n\t\"./mi.js\": 68177,\n\t\"./mk\": 50337,\n\t\"./mk.js\": 50337,\n\t\"./ml\": 65260,\n\t\"./ml.js\": 65260,\n\t\"./mn\": 52325,\n\t\"./mn.js\": 52325,\n\t\"./mr\": 14695,\n\t\"./mr.js\": 14695,\n\t\"./ms\": 75334,\n\t\"./ms-my\": 37151,\n\t\"./ms-my.js\": 37151,\n\t\"./ms.js\": 75334,\n\t\"./mt\": 63570,\n\t\"./mt.js\": 63570,\n\t\"./my\": 97963,\n\t\"./my.js\": 97963,\n\t\"./nb\": 88028,\n\t\"./nb.js\": 88028,\n\t\"./ne\": 86638,\n\t\"./ne.js\": 86638,\n\t\"./nl\": 50302,\n\t\"./nl-be\": 66782,\n\t\"./nl-be.js\": 66782,\n\t\"./nl.js\": 50302,\n\t\"./nn\": 33501,\n\t\"./nn.js\": 33501,\n\t\"./oc-lnc\": 50563,\n\t\"./oc-lnc.js\": 50563,\n\t\"./pa-in\": 50869,\n\t\"./pa-in.js\": 50869,\n\t\"./pl\": 65302,\n\t\"./pl.js\": 65302,\n\t\"./pt\": 49687,\n\t\"./pt-br\": 74884,\n\t\"./pt-br.js\": 74884,\n\t\"./pt.js\": 49687,\n\t\"./ro\": 79107,\n\t\"./ro.js\": 79107,\n\t\"./ru\": 33627,\n\t\"./ru.js\": 33627,\n\t\"./sd\": 30355,\n\t\"./sd.js\": 30355,\n\t\"./se\": 83427,\n\t\"./se.js\": 83427,\n\t\"./si\": 11848,\n\t\"./si.js\": 11848,\n\t\"./sk\": 54590,\n\t\"./sk.js\": 54590,\n\t\"./sl\": 20184,\n\t\"./sl.js\": 20184,\n\t\"./sq\": 56361,\n\t\"./sq.js\": 56361,\n\t\"./sr\": 78965,\n\t\"./sr-cyrl\": 81287,\n\t\"./sr-cyrl.js\": 81287,\n\t\"./sr.js\": 78965,\n\t\"./ss\": 25456,\n\t\"./ss.js\": 25456,\n\t\"./sv\": 70451,\n\t\"./sv.js\": 70451,\n\t\"./sw\": 77558,\n\t\"./sw.js\": 77558,\n\t\"./ta\": 51356,\n\t\"./ta.js\": 51356,\n\t\"./te\": 73693,\n\t\"./te.js\": 73693,\n\t\"./tet\": 21243,\n\t\"./tet.js\": 21243,\n\t\"./tg\": 42500,\n\t\"./tg.js\": 42500,\n\t\"./th\": 55768,\n\t\"./th.js\": 55768,\n\t\"./tk\": 77761,\n\t\"./tk.js\": 77761,\n\t\"./tl-ph\": 35780,\n\t\"./tl-ph.js\": 35780,\n\t\"./tlh\": 29590,\n\t\"./tlh.js\": 29590,\n\t\"./tr\": 33807,\n\t\"./tr.js\": 33807,\n\t\"./tzl\": 93857,\n\t\"./tzl.js\": 93857,\n\t\"./tzm\": 60654,\n\t\"./tzm-latn\": 8806,\n\t\"./tzm-latn.js\": 8806,\n\t\"./tzm.js\": 60654,\n\t\"./ug-cn\": 30845,\n\t\"./ug-cn.js\": 30845,\n\t\"./uk\": 19232,\n\t\"./uk.js\": 19232,\n\t\"./ur\": 47052,\n\t\"./ur.js\": 47052,\n\t\"./uz\": 77967,\n\t\"./uz-latn\": 32233,\n\t\"./uz-latn.js\": 32233,\n\t\"./uz.js\": 77967,\n\t\"./vi\": 98615,\n\t\"./vi.js\": 98615,\n\t\"./x-pseudo\": 12320,\n\t\"./x-pseudo.js\": 12320,\n\t\"./yo\": 31313,\n\t\"./yo.js\": 31313,\n\t\"./zh-cn\": 64490,\n\t\"./zh-cn.js\": 64490,\n\t\"./zh-hk\": 55910,\n\t\"./zh-hk.js\": 55910,\n\t\"./zh-mo\": 98262,\n\t\"./zh-mo.js\": 98262,\n\t\"./zh-tw\": 44223,\n\t\"./zh-tw.js\": 44223\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 46700;"],"x_google_ignoreList":[88]}