{"version":3,"file":"js/iframe.min.js","mappings":"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AA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA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AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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","sources":["webpack:///./node_modules/@web-nfb/player/src/i18n/ lazy ^\\.\\/.*_CA\\.json$ chunkName: videojs-language strict namespace object","webpack:///./node_modules/@web-nfb/player/src/sass/themes/ lazy ^\\.\\/.*\\/index\\.sass$ strict namespace object","webpack:///./src/js/ApiClient.ts","webpack:///./src/js/DeviceHandler.ts","webpack:///./src/js/PlayerStats.ts","webpack:///./src/js/constants.ts","webpack:///./src/js/helpers/availability.ts","webpack:///./src/js/helpers/browser.ts","webpack:///./src/js/helpers/cookies.ts","webpack:///./src/js/helpers/element/card.ts","webpack:///./src/js/helpers/format.ts","webpack:///./src/js/helpers/language.ts","webpack:///./src/js/helpers/page/common/display.ts","webpack:///./src/js/helpers/page/common/highlight.ts","webpack:///./src/js/helpers/page/common/queue.ts","webpack:///./src/js/helpers/paths.ts","webpack:///./src/js/helpers/player.ts","webpack:///./src/js/helpers/sessionStorage.ts","webpack:///./src/js/helpers/sort.ts","webpack:///./src/js/redux/animatedHoverCardReducer.ts","webpack:///./src/js/redux/bookmarksReducer.ts","webpack:///./src/js/redux/carouselReducer.ts","webpack:///./src/js/redux/channelsReducer.ts","webpack:///./src/js/redux/directorsPageReducer.ts","webpack:///./src/js/redux/directorsReducer.ts","webpack:///./src/js/redux/educationalSubjectPageReducer.ts","webpack:///./src/js/redux/exploreBySubjectReducer.ts","webpack:///./src/js/redux/exploreByWorkPageReducer.ts","webpack:///./src/js/redux/filmHistoryReducer.ts","webpack:///./src/js/redux/filmsReducer.ts","webpack:///./src/js/redux/indigenousCinemaReducer.ts","webpack:///./src/js/redux/likesReducer.ts","webpack:///./src/js/redux/nationsReducer.ts","webpack:///./src/js/redux/playersReducer.ts","webpack:///./src/js/redux/playlistTabsReducer.ts","webpack:///./src/js/redux/recommendationsReducer.ts","webpack:///./src/js/redux/seriesPageReducer.ts","webpack:///./src/js/redux/historyMiddleware.ts","webpack:///./src/js/redux/seriesMiddleware.ts","webpack:///./src/js/redux/workPageMiddleware.ts","webpack:///./src/js/redux/store.ts","webpack:///./src/js/redux/subjectsReducer.ts","webpack:///./src/js/redux/userReducer.ts","webpack:///./src/js/redux/viewingHistoryReducer.ts","webpack:///./src/js/redux/workHistoryReducer.ts","webpack:///./src/js/redux/workPageReducer.ts","webpack:///./src/js/redux/worksReducer.ts","webpack:///./src/js/sections/player/iframe.ts","webpack:///./src/sass/wc/NFBWorkPageEpisodeTitle.sass","webpack:///./src/js/wc/work-page/NFBWorkPageEpisodeTitle.ts","webpack:///./src/sass/wc/NFBSeasonList.sass","webpack:///./src/js/wc/series-page/NFBSeasonList.ts","webpack:///./src/sass/wc/NFBEpisodeList.sass","webpack:///./src/js/wc/series-page/NFBEpisodeList.ts","webpack:///./src/js/sections/series-page/series-page.ts","webpack:///./src/js/wc/NFBPlayerErrorMessage.ts","webpack:///./src/sass/wc/NFBWorkPagePlayer.sass","webpack:///./src/js/wc/NFBPlayerModal.ts","webpack:///./src/sass/wc/NFBShareModal.sass","webpack:///./src/js/wc/NFBShareButton.ts","webpack:///./src/js/wc/NFBShareModal.ts","webpack:///./src/sass/wc/NFBVideo.sass","webpack:///./src/js/wc/NFBVideo.ts","webpack:///./src/js/wc/cards/NFBDisplayWorkCard.ts","webpack:///./src/sass/wc/NFBPlayWorkCard.sass","webpack:///./src/js/wc/cards/NFBPlayWorkCard.ts","webpack:///./src/js/wc/carousels/NFBRecommendationsCarousel.ts","webpack:///./src/js/wc/carousels/base/NFBNormanCarousel.ts","webpack:///./src/js/wc/carousels/base/NFBWorkCarousel.ts","webpack:///./src/js/wc/work-page/NFBExtraCard.ts","webpack:///./src/js/wc/work-page/NFBExtras.ts","webpack:///./src/js/wc/work-page/NFBWatchButton.ts","webpack:///./src/sass/wc/NFBWorkPageCreator.sass","webpack:///./src/js/wc/work-page/NFBWorkPageCreator.ts","webpack:///./src/sass/wc/NFBWorkPageDescription.sass","webpack:///./src/js/wc/work-page/NFBWorkPageDescription.ts","webpack:///./src/sass/wc/NFBWorkPageDetailsVersionList.sass","webpack:///./src/js/wc/work-page/NFBWorkPageDetailsVersionList.ts","webpack:///./src/js/wc/work-page/NFBWorkPageHeaderCreator.ts","webpack:///./src/js/wc/work-page/NFBWorkPageHeaderImage.ts","webpack:///./src/js/wc/work-page/NFBWorkPageHeaderLegend.ts","webpack:///./src/sass/wc/NFBWorkPageHeaderLogIn.sass","webpack:///./src/js/wc/work-page/NFBWorkPageHeaderLogIn.ts","webpack:///./src/js/wc/work-page/NFBWorkPageHeaderProgress.ts","webpack:///./src/js/wc/work-page/NFBWorkPageHeaderWatchButton.ts","webpack:///./src/sass/wc/NFBWorkPageHeaderImage.sass","webpack:///./src/js/wc/work-page/NFBWorkPageImage.ts","webpack:///./src/sass/wc/NFBWorkPageLegend.sass","webpack:///./src/js/wc/work-page/NFBWorkPageLegend.ts","webpack:///./src/js/wc/work-page/NFBWorkPageReactiveHeaderElement.ts","webpack:///./src/sass/wc/NFBWorkPageTitle.sass","webpack:///./src/js/wc/work-page/NFBWorkPageTitle.ts","webpack:///./src/sass/wc/NFBWorkPageUpNext.sass","webpack:///./src/js/wc/work-page/NFBWorkPageUpNext.ts","webpack:///./src/sass/wc/NFBWorkPageWarning.sass","webpack:///./src/js/wc/work-page/NFBWorkPageWarning.ts"],"sourcesContent":["var map = {\n\t\"./en_CA.json\": [\n\t\t73389,\n\t\t3640\n\t],\n\t\"./fr_CA.json\": [\n\t\t33212,\n\t\t6449\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn __webpack_require__.e(ids[1]).then(() => {\n\t\treturn __webpack_require__.t(id, 1 | 16);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 43415;\nmodule.exports = webpackAsyncContext;","var map = {\n\t\"./balmoral-neue/index.sass\": [\n\t\t562,\n\t\t4710,\n\t\t8181\n\t],\n\t\"./compact/index.sass\": [\n\t\t48057,\n\t\t3171,\n\t\t8057\n\t],\n\t\"./default/index.sass\": [\n\t\t97257,\n\t\t707,\n\t\t7257\n\t]\n};\nfunction webpackAsyncContext(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\treturn Promise.resolve().then(() => {\n\t\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\t\te.code = 'MODULE_NOT_FOUND';\n\t\t\tthrow e;\n\t\t});\n\t}\n\n\tvar ids = map[req], id = ids[0];\n\treturn Promise.all(ids.slice(1).map(__webpack_require__.e)).then(() => {\n\t\treturn __webpack_require__(id);\n\t});\n}\nwebpackAsyncContext.keys = () => (Object.keys(map));\nwebpackAsyncContext.id = 91507;\nmodule.exports = webpackAsyncContext;","import qs from 'qs'\nimport axios, { AxiosRequestConfig } from 'axios'\n\ndeclare global {\n  interface Window {\n    PUBLIC_API_ENDPOINT: string\n  }\n}\n\ntype ApiClientOptions = {\n  baseURL?: string\n  basePath?: string\n}\n\nexport type WORK_CATEGORY_TYPE = 'films' | 'series' | 'collections'\n\nabstract class ApiClient {\n  declare axios\n  baseURL: string\n  basePath: string\n\n  constructor ({ basePath, baseURL }: ApiClientOptions) {\n    this.baseURL = baseURL ?? ''\n    this.basePath = basePath ?? ''\n    this.axios = axios.create({\n      baseURL: `${this.baseURL}${this.basePath}`\n    })\n  }\n\n  call ({ method, url, data, headers, params }: AxiosRequestConfig) {\n    return this.axios({\n      method,\n      url,\n      data,\n      params,\n      headers,\n      paramsSerializer: params =>\n        qs.stringify(params, { arrayFormat: 'repeat' })\n    })\n  }\n}\n\nclass ApiV4Client extends ApiClient {\n  private static _instance = new ApiV4Client()\n\n  private constructor () {\n    super({ basePath: '/api/v4' })\n\n    this.axios.defaults.xsrfCookieName = 'csrftoken'\n    this.axios.defaults.xsrfHeaderName = 'X-CSRFToken'\n    this.axios.defaults.withCredentials = true\n  }\n\n  static get instance () { return ApiV4Client._instance }\n}\n\nclass PublicApiV5Client extends ApiClient {\n  private static _instance = new PublicApiV5Client()\n\n  private constructor () {\n    super({ baseURL: window.PUBLIC_API_ENDPOINT, basePath: '/api/v5' })\n  }\n\n  static get instance () { return PublicApiV5Client._instance }\n\n  call ({ method, url, data, headers, params }: AxiosRequestConfig) {\n    return super.call({\n      method,\n      url,\n      data,\n      headers,\n      params: {\n        ...params\n      }\n    })\n  }\n}\n\nexport { ApiV4Client, PublicApiV5Client }\n","/**\n * Used to track device, we generate a uniq 6 alpha numeric code for device id\n *\n * Info is stored inside localStorage because data has no expiration time.\n */\n\nimport { cookiesAreEnabled } from '@src/js/helpers/cookies'\n\nconst DEVICE_ID_KEY = 'deviceId'\n\nexport default class DeviceHandler {\n  static generateDeviceId (): string {\n    return (Math.random() + 1).toString(36).substring(6)\n      .split('').map(char => Math.random() < 0.5 ? char.toLowerCase() : char.toUpperCase())\n      .join('')\n  }\n\n  static getDeviceId () {\n    let storageDeviceId\n    if (cookiesAreEnabled()) {\n      storageDeviceId = localStorage.getItem(DEVICE_ID_KEY)\n      if (storageDeviceId) {\n        return storageDeviceId\n      }\n    }\n\n    storageDeviceId = this.generateDeviceId()\n    this.setDeviceId(storageDeviceId)\n\n    return storageDeviceId\n  }\n\n  static setDeviceId (deviceId: string) {\n    if (cookiesAreEnabled()) {\n      localStorage.setItem(DEVICE_ID_KEY, deviceId)\n    }\n  }\n}\n","import NFBExpose from '@web-nfb/player/src/NFBExpose'\nimport { waitForMetadata, getParentUrl, getUnstatsPlatform } from '@src/js/helpers/player'\nimport DeviceHandler from '@src/js/DeviceHandler'\nimport { store } from '@src/js/redux/store'\nimport { getCurrentEpisodeUrl } from '@src/js/sections/series-page/series-page'\n\nimport {\n  GTMWorkBase,\n  GTMVideoBase,\n  GTMCastBase,\n  GTMWorkStart,\n  GTMVideoStart,\n  GTMWorkProgress,\n  GTMVideoProgress,\n  GTMWorkResume,\n  GTMVideoComplete,\n  GTMWorkComplete,\n  GTMLangSwitch,\n  GTMLangContentType,\n  GTMCastStart\n} from '@src/js/types/GTM'\nimport {\n  GTM_EVENTS,\n  GTM_VIDEO_CAST_TYPE,\n  GTM_VIDEO_CASTING_TYPE,\n  GTM_VIDEO_CAST_TECH_TYPE,\n  GTM_LANG_CONTENT_TYPE\n} from '@src/js/constants'\n\ntype BaseStatsOptions = {\n  registryId: number|string\n  title: string\n  workType: string\n  embedMode: boolean\n  autoplay: boolean,\n  isChapter: boolean\n  chapter?: {\n    start: number\n  }\n}\n\ntype GTMStatsOptions = BaseStatsOptions & {\n  versionLang: string\n  catalogingLang: string\n  interfaceLang: string\n}\n\ntype UnstatsOptions = BaseStatsOptions & {\n  slug: string,\n  url: string,\n  user: string|-1,\n  context: string,\n  labels: object|string,\n  platform?: string\n}\n\nexport type StatsOptions = GTMStatsOptions & UnstatsOptions\n\ntype GTMEventList =\n  GTMVideoStart |\n  GTMWorkStart |\n  GTMVideoProgress |\n  GTMWorkProgress |\n  GTMVideoComplete |\n  GTMWorkComplete\n\nclass GTMHandler {\n  player: NFBExpose\n  options: GTMStatsOptions\n\n  commonParams: GTMWorkBase\n  videoParams: GTMVideoBase\n\n  constructor (player: NFBExpose, options: GTMStatsOptions) {\n    this.player = player\n    this.options = options\n    this.init()\n  }\n\n  async init () {\n    //  Make sure duration is available\n    await waitForMetadata(this.player)\n\n    this.initCommonParams()\n    this.initVideoParams()\n  }\n\n  initCommonParams () {\n    this.commonParams = {\n      //  work infos\n      nfb_version_id: this.options.registryId.toString(),\n      nfb_version_duration: Math.round(this.player.duration),\n      nfb_version_title: this.options.title,\n      nfb_version_type: `${this.options.workType}${this.options.isChapter ? '_chapter' : ''}`,\n\n      // lang\n      nfb_version_lang: this.options.versionLang,\n      nfb_interface_lang: this.options.interfaceLang,\n      nfb_cataloging_lang: this.options.catalogingLang,\n      nfb_version_cc_lang: this.player.currentCC.substring(0, 2), // take only to first chars (eng => en, fra => fr)\n      nfb_version_dv_lang: this.player.dvPlaying ? this.options.versionLang : '',\n\n      // embed\n      nfb_embed: this.options.embedMode,\n      nfb_embed_url: getParentUrl(),\n\n      // cast\n      nfb_video_cast: this.player.hasCastDevicesAvailable ? GTM_VIDEO_CAST_TYPE.AVAILABLE : GTM_VIDEO_CAST_TYPE.UNAVAILABLE,\n\n      // other\n      nfb_autoplay: this.options.autoplay,\n      nfb_platform_name: 'nfb-onf'\n    }\n  }\n\n  initVideoParams () {\n    this.videoParams = {\n      video_current_time: this.player.currentTime,\n      video_duration: Math.round(this.player.duration),\n      video_title: this.options.title,\n      video_provider: 'NFB-ONF'\n    }\n  }\n\n  refreshVideoURL () {\n    // Get the URL according to current video playing on the store\n    this.videoParams.video_url = getCurrentEpisodeUrl(store.getState()).toString()\n  }\n\n  refreshParams () {\n    // Update params that might have changed\n    this.refreshVideoURL()\n    this.videoParams.video_current_time = Math.round(this.player.currentTime)\n\n    this.commonParams.nfb_version_cc_lang = this.player.currentCC.substring(0, 2) // take only to first chars (eng => en, fra => fr)\n    this.commonParams.nfb_version_dv_lang = this.player.dvPlaying ? this.options.versionLang : ''\n  }\n\n  getCastingInfos (): GTMCastBase {\n    const hasCastDevicesAvailable = this.player.hasCastDevicesAvailable\n    const castingInfos: GTMCastBase = {\n      nfb_video_cast: hasCastDevicesAvailable ? GTM_VIDEO_CAST_TYPE.AVAILABLE : GTM_VIDEO_CAST_TYPE.UNAVAILABLE,\n      nfb_video_casting: GTM_VIDEO_CASTING_TYPE.NOT_APPLICABLE,\n      nfb_video_cast_tech: GTM_VIDEO_CAST_TECH_TYPE.NOT_APPLICABLE\n    }\n    if (hasCastDevicesAvailable) {\n      castingInfos.nfb_video_casting = this.player.isCasting ? GTM_VIDEO_CASTING_TYPE.ON : GTM_VIDEO_CASTING_TYPE.OFF\n      castingInfos.nfb_video_cast_tech = this.player.castTech\n    }\n\n    return castingInfos\n  }\n\n  async sendStart () {\n    // If videojs don't preload stuff (like in embed iframe)\n    // We need to wait for metadata to be set to have commonParams initialized\n    await waitForMetadata(this.player)\n\n    // Make sure to get the updated URL\n    this.refreshVideoURL()\n\n    // If it's a chapter, we want to send the right start value\n    // (and don't wait for chapter plugin to be intialized)\n    if (this.options.isChapter && this.options.chapter) {\n      this.videoParams.video_current_time = this.options.chapter?.start\n    }\n\n    const videoStart: GTMVideoStart = {\n      event: GTM_EVENTS.VIDEO_START,\n      ...this.commonParams,\n      ...this.videoParams\n    }\n    this.pushEventToDatalayerAndSentry(videoStart)\n\n    const nfbWorkStart: GTMWorkStart = {\n      event: GTM_EVENTS.WORK_START,\n      ...this.commonParams,\n      ...this.videoParams\n    }\n    this.pushEventToDatalayerAndSentry(nfbWorkStart)\n  }\n\n  async sendResume () {\n    // If videojs don't preload stuff (like in embed iframe)\n    // We need to wait for metadata to be set to have commonParams initialized\n    await waitForMetadata(this.player)\n\n    this.initCommonParams()\n\n    // Make sure to get the updated URL\n    this.refreshVideoURL()\n\n    const nfbWorkResume: GTMWorkResume = {\n      event: GTM_EVENTS.WORK_RESUME,\n      ...this.commonParams,\n      ...this.videoParams\n    }\n    this.pushEventToDatalayerAndSentry(nfbWorkResume)\n  }\n\n  sendProgress (percent: number) {\n    this.refreshParams()\n\n    const videoProgress: GTMVideoProgress = {\n      event: GTM_EVENTS.VIDEO_PROGRESS,\n      ...this.commonParams,\n      ...this.videoParams,\n      video_percent: percent\n    }\n    this.pushEventToDatalayerAndSentry(videoProgress)\n\n    const castingInfos: GTMCastBase = this.getCastingInfos()\n    const nfbWorkProgress: GTMWorkProgress = {\n      event: GTM_EVENTS.WORK_PROGRESS,\n      ...this.commonParams,\n      ...this.videoParams,\n      ...castingInfos,\n      nfb_progress: percent\n    }\n    this.pushEventToDatalayerAndSentry(nfbWorkProgress)\n  }\n\n  sendComplete () {\n    this.refreshParams()\n\n    const videoComplete: GTMVideoComplete = {\n      event: GTM_EVENTS.VIDEO_COMPLETE,\n      ...this.commonParams,\n      ...this.videoParams\n    }\n    this.pushEventToDatalayerAndSentry(videoComplete)\n\n    const castingInfos: GTMCastBase = this.getCastingInfos()\n    const nfbWorkComplete: GTMWorkComplete = {\n      event: GTM_EVENTS.WORK_COMPLETE,\n      ...this.commonParams,\n      ...this.videoParams,\n      ...castingInfos\n    }\n    this.pushEventToDatalayerAndSentry(nfbWorkComplete)\n  }\n\n  sendLangSwitch (contentType: GTMLangContentType) {\n    this.refreshParams()\n\n    const nfbLangSwitch: GTMLangSwitch = {\n      event: GTM_EVENTS.LANG_SWITCH,\n      nfb_version_lang: this.options.versionLang,\n      nfb_interface_lang: this.options.interfaceLang,\n      nfb_cataloging_lang: this.options.catalogingLang,\n      nfb_version_cc_lang: this.player.currentCC.substring(0, 2), // take only to first chars (eng => en, fra => fr)\n      nfb_version_dv_lang: this.player.dvPlaying ? this.options.versionLang : '',\n      content_type: contentType\n    }\n    window.dataLayer?.push(nfbLangSwitch)\n  }\n\n  sendCastStart () {\n    const castStart: GTMCastStart = {\n      event: GTM_EVENTS.CAST_START,\n      ...this.commonParams,\n      ...this.videoParams,\n      nfb_video_cast_tech: this.player.castTech\n    }\n    window.dataLayer?.push(castStart)\n  }\n\n  pushEventToDatalayerAndSentry (dataLayer: GTMEventList) {\n    const sendToSentry = window.Sentry !== undefined && window.SEND_GTM_UNSTATS_LOGS_TO_SENTRY\n\n    if (sendToSentry) {\n      const tags = {\n        'gtm.event': dataLayer.event ?? 'undefined',\n        'gtm.nfb_version_id': dataLayer.nfb_version_id ?? 'undefined',\n        'gtm.nfb_version_title': dataLayer.nfb_version_title ?? 'undefined',\n        'gtm.nfb_platform_name': dataLayer.nfb_platform_name ?? 'undefined',\n        'gtm.nfb_embed': dataLayer.nfb_embed ?? 'undefined',\n        'gtm.nfb_embed_url': dataLayer.nfb_embed_url ?? 'undefined',\n        'gtm.nfb_autoplay': dataLayer.nfb_autoplay ?? 'undefined'\n      }\n      window.Sentry.setContext('dataLayer', dataLayer)\n      window.Sentry.setTags(tags)\n    }\n\n    if (!window.dataLayer && sendToSentry) {\n      window.Sentry?.captureMessage('Player iframe - Unable to push event to dataLayer')\n      return\n    }\n\n    window.dataLayer?.push(dataLayer)\n    if (sendToSentry) {\n      window.Sentry?.captureMessage('Player iframe - Event pushed to dataLayer')\n    }\n  }\n}\n\n// Player Stats implementation of specification 1.1\n// https://gitlab.nfb.ca/web-nfb/nfb_unstats/-/blob/develop/doc/implement_spec_v1.0.md\nclass UnstatsHandler {\n  player: NFBExpose\n  options: UnstatsOptions\n  randomId: string\n  decodedLabels: {\n    p_id?: string, // player id\n    tc?: string, // timecode\n    chapter?: number, // 1 = chapter\n    embed?: number, // 1 = embed mode\n    p_url?: string, // parent url for embed mode\n    d_id?: string, // device id : 6 alpha numeric digits\n  }\n\n  encodedLabels: string\n\n  constructor (player: NFBExpose, options: UnstatsOptions) {\n    this.player = player\n    this.options = options\n    this.init()\n  }\n\n  init () {\n    this.randomId = Math.random().toString(36).slice(2, 8)\n\n    // labels could be object or encoded string\n    if (typeof this.options.labels === 'object') {\n      this.decodedLabels = { ...this.options.labels }\n    } else {\n      this.decodedLabels = JSON.parse(this.options.labels) ?? {}\n    }\n\n    // we want to add uniqid to track doublon\n    this.decodedLabels.p_id = this.randomId\n    this.decodedLabels.d_id = DeviceHandler.getDeviceId()\n\n    // if embed, add embed & parent url to labels\n    if (this.options.embedMode) {\n      this.decodedLabels.embed = 1\n      this.decodedLabels.p_url = getParentUrl()\n    }\n  }\n\n  send (type: string, value: string|number, extraLabels = {}) {\n    const eventUrl = `//${window.UNSTATS_HOST}/events/${type}/`\n    const platform = this.options.platform ?? getUnstatsPlatform()\n    const encodedLabels = JSON.stringify({\n      ...this.decodedLabels,\n      ...extraLabels\n    })\n\n    const data = new FormData()\n    data.append('api_key', window.UNSTATS_API_KEY)\n    data.append('event_value', value.toString())\n    data.append('platform', platform)\n    data.append('labels', encodedLabels)\n    // if (this.options.user && this.options.user !== -1) {\n    // user is required, we need to send -1 value for now (should be fixed soon in Unstats API)\n    data.append('user', this.options.user.toString())\n    // }\n    data.append('context', this.options.context)\n    data.append('registry_id', this.options.registryId.toString())\n    data.append('work_type', this.options.workType)\n    data.append('work_slug', this.options.slug)\n    data.append('url', this.options.url)\n\n    const sendToSentry = window.Sentry !== undefined && window.SEND_GTM_UNSTATS_LOGS_TO_SENTRY\n    if (sendToSentry) {\n      const tags = {\n        'unstats.event_value': value ?? 'undefined',\n        'unstats.platform': platform ?? 'undefined',\n        'unstats.context': this.options.context ?? 'undefined',\n        'unstats.registry_id': this.options.registryId ?? 'undefined',\n        'unstats.labels': encodedLabels ?? 'undefined'\n      }\n      window.Sentry.setContext('formData', data)\n      window.Sentry.setTags(tags)\n    }\n\n    fetch(eventUrl, {\n      method: 'post',\n      body: data\n    })\n      .then(() => {\n        if (sendToSentry) {\n          window.Sentry?.captureMessage('Player iframe - Event sent to Unstats')\n        }\n      })\n      .catch(e => {\n        if (sendToSentry) {\n          window.Sentry?.captureMessage('Player iframe - Error sending Unstats event')\n        }\n        console.error(e)\n      })\n  }\n}\n\nexport default class PlayerStats {\n  player: NFBExpose\n  options: StatsOptions\n\n  gtmHandler: GTMHandler\n  unstatsHandler: UnstatsHandler\n\n  isResume: boolean\n\n  constructor (player: NFBExpose, options: StatsOptions) {\n    this.player = player\n    this.options = options\n\n    this.onFirstPlay = this.onFirstPlay.bind(this)\n    this.onProgress = this.onProgress.bind(this)\n    this.onLangSwitch = this.onLangSwitch.bind(this)\n    this.onCastStart = this.onCastStart.bind(this)\n\n    this.gtmHandler = new GTMHandler(player, options)\n    this.unstatsHandler = new UnstatsHandler(player, options)\n  }\n\n  init () {\n    this.addListeners()\n  }\n\n  async addListeners () {\n    if (this.options.autoplay) {\n      this.player.one('autoplay', this.onFirstPlay)\n      this.player.one('autoplayfailed', () => {\n        this.player.one('play', this.onFirstPlay)\n      })\n    } else {\n      this.player.one('play', this.onFirstPlay)\n    }\n\n    this.player.on('closedcaptionchanged', () => this.onLangSwitch(GTM_LANG_CONTENT_TYPE.CC))\n    this.player.on('audiodescriptionchanged', () => this.onLangSwitch(GTM_LANG_CONTENT_TYPE.DV))\n    this.player.on('caststart', this.onCastStart)\n\n    // Track progress only for upcoming percent in case of continue watching\n    await waitForMetadata(this.player)\n    this.isResume = this.player.currentTime > 0\n    const currentPercent = Math.floor(this.player.currentTime / this.player.duration * 100)\n    const progressToTrack = [10, 25, 50, 75, 95]\n    progressToTrack.forEach(progress => {\n      if (currentPercent < progress) {\n        this.player.one(`progress${progress}`, () => this.onProgress(progress))\n      }\n    })\n  }\n\n  onFirstPlay () {\n    if (this.isResume) {\n      this.gtmHandler.sendStart()\n      this.unstatsHandler.send('play-control', 'start', {\n        tc: this.player.currentTime\n      })\n    } else {\n      this.gtmHandler.sendStart()\n      this.unstatsHandler.send('play-control', 'start')\n    }\n  }\n\n  onProgress (percent: number) {\n    if (percent === 95) {\n      this.gtmHandler.sendComplete()\n    } else {\n      this.gtmHandler.sendProgress(percent)\n    }\n    this.unstatsHandler.send('percent-point-reach', percent)\n  }\n\n  onLangSwitch (contentType: GTMLangContentType) {\n    this.gtmHandler.sendLangSwitch(contentType)\n  }\n\n  onCastStart () {\n    this.gtmHandler.sendCastStart()\n  }\n\n  sendResume () {\n    this.gtmHandler.sendResume()\n  }\n}\n","export const GTM_EVENTS = {\n  ADD_TO_MYLIST: 'nfb_add_to_mylist',\n  REMOVE_FROM_MYLIST: 'nfb_remove_from_mylist',\n  SHARE: 'share',\n  TAB: 'nfb_tab',\n  SELECT_WORK: 'nfb_select_work',\n  SELECT_LIST: 'nfb_select_list',\n  TIE_IN_PROMO: 'nfb_tie_in_promo',\n  REMOVE_FROM_HISTORY: 'nfb_remove_from_history',\n  LIKE: 'nfb_like',\n  PREVIEW_WORK: 'nfb_preview_work',\n\n  // Ecomm\n  ADD_TO_CART: 'add_to_cart',\n  BEGIN_CHECKOUT: 'begin_checkout',\n\n  //  Player\n  WORK_START: 'nfb_work_start',\n  VIDEO_START: 'video_start',\n  WORK_RESUME: 'nfb_work_resume',\n  WORK_PROGRESS: 'nfb_work_progress',\n  VIDEO_PROGRESS: 'video_progress',\n  WORK_COMPLETE: 'nfb_work_complete',\n  VIDEO_COMPLETE: 'video_complete',\n  LANG_SWITCH: 'nfb_lang_switch',\n  CAST_START: 'nfb_cast_start',\n\n  // AB Testing\n  AB_GROUP_VIEW: 'nfb_ab_group_view',\n  AB_GROUP_CLICK: 'nfb_ab_group_click',\n\n  // Newsletter\n  SUBSCRIPTION_NEWSLETTER: 'nfb_subscription_newsletter',\n\n  // Page view\n  PAGE_VIEW_SPA: 'nfb_page_view_spa',\n\n  // Poll\n  POLL_VIEW: 'nfb_poll_view',\n  POLL_ANSWER: 'nfb_poll_answer'\n} as const\n\nexport const GTM_LIST_TYPE = {\n  CAROUSEL: 'carousel',\n  LIST: 'list',\n  GRID: 'grid',\n  FEATURE: 'feature'\n} as const\n\nexport const GTM_LIST_CATEGORY = {\n  PROGRAMMING: 'programming', // thematic carrousels published by the content team\n  BLOG: 'blog',\n  SUGGESTIONS: 'suggestions', // suggested films on work page\n  EXTRAS: 'extras', // extras on work page\n  TRENDING: 'trending', // trending carrousel\n  ARTICLES: 'articles', // @todo: blog carrousel\n  SEARCH_RESULT: 'search_results',\n  EXPLORE: 'explore', // explore by\n  SPECIAL_COLLECTION: 'special_collection', // indigenous collection\n  PLAYLIST: 'playlist',\n  PART_OF: 'part_of', // film or episode list on work page\n  PERSONAL_RECOMMENDATION: 'personal_recommendation',\n  SUBJECTS: 'subjects',\n  FILMOGRAPHY: 'filmography',\n  USER: 'user'\n} as const\n\nexport const GTM_LIST_ID = {\n  SUGGESTIONS: 'recommended', // suggested films on work page\n  EXTRAS: 'extras', // extras on work page\n  USER_RECOMMENDATIONS: 'recommended_for_you',\n  CONTINUE: 'continue_watching',\n  INDIGENOUS_CINEMA: 'indigenous_cinema',\n  USER_HISTORY: 'user_history',\n  EXPLORE_BY_WORKS: 'explore_by_title',\n  RENTALS: 'rentals',\n  USER_LIST: 'user_list'\n} as const\n\nexport const GTM_CONTENT_TYPE = {\n  FILM: 'film',\n  SERIES: 'series',\n  COLLECTION: 'collection',\n  PLAYLIST: 'playlist'\n} as const\n\nexport const GTM_VIDEO_CAST_TYPE = {\n  AVAILABLE: 'available',\n  UNAVAILABLE: 'unavailable'\n} as const\n\nexport const GTM_VIDEO_CASTING_TYPE = {\n  ON: 'on',\n  OFF: 'off',\n  NOT_APPLICABLE: 'n/a'\n} as const\n\nexport const GTM_VIDEO_CAST_TECH_TYPE = {\n  CHROMECAST: 'chromecast',\n  AIRPLAY: 'airplay',\n  NOT_APPLICABLE: 'n/a'\n} as const\n\nexport const GTM_LANG_CONTENT_TYPE = {\n  CC: 'cc',\n  DV: 'dv',\n  INTERFACE: 'interface'\n} as const\n\nexport const GTM_ECOMMERCE_ITEM_DETAIL = {\n  CURRENCY: 'CAD',\n  AFFILIATION: 'NFB-ONF',\n  BRAND: 'ONF/NFB'\n} as const\n\nexport const GTM_TIE_IN_DETAIL = {\n  LOGIN_SAVE_PROGRESS: 'login_to_save_progress',\n  LOGIN_TO_ADD: 'login_to_add'\n} as const\n\nexport const GTM_AB_GROUP = {\n  LOGIN_TO_ADD: 'login_to_add_2025_10'\n}\n\nexport const DEFAULT_LIST_LENGTH = 15\n\nexport const ERROR_MESSAGE = {\n  API_ERROR: window.pgettext('error', 'An error occurred while processing your request'),\n  NO_RESULT: window.pgettext('error', 'No result found')\n}\n\nexport const LANGUAGE_FILTER_OPTIONS = [\n  { name: window.pgettext('Language filter', 'All languages'), slug: 'all_languages' },\n  { name: window.pgettext('Language filter', 'French'), slug: 'fr' },\n  { name: window.pgettext('Language filter', 'English'), slug: 'en' }\n]\n\nexport const SORT_BY_FILTER_OPTIONS = [\n  { name: window.pgettext('Order by filter', 'Alphabetical order'), slug: 'title' },\n  { name: window.pgettext('Order by filter', 'Production date'), slug: 'year:desc,title' }\n]\n\nexport const WATCH_HISTORY_LIST_LENGTH = 12\n\nexport const DEFAULT_GRID_LIST_LENGTH = 60\n","import { WorkCard } from '@src/js/redux/worksReducer'\nimport { store } from '@src/js/redux/store'\nimport { selectActiveRentalForWork } from '@src/js/redux/userReducer'\n\nexport enum WorkAvailabilityStatus {\n  PUBLIC = 'public',\n  PROMO = 'promo',\n  UNAVAILABLE = 'unavailable', // unavailable or geoblocked with no buy/rent options\n  PURCHASE = 'purchase', // not public or geoblocked but has buy options\n  RENTED = 'rented' // not public or geoblocked but rented\n}\n\n/** Status considered playable\n * (will eventually include RENTED)\n */\nexport const PLAYABLE_STATUS = [\n  WorkAvailabilityStatus.PUBLIC\n]\n\n/**\n * @returns WorkAvailabilityStatus (public, promo, unavailable, buy)\n * based on availability data returned by API.\n * This status doesn't reflect ALL the availabilites, but\n * the \"first\" way the work can be watched.\n */\nexport const getAvailabilityStatusForWork = (work: WorkCard): WorkAvailabilityStatus => {\n  const availabilityData = work.availability\n\n  // Not availability data or no resource_url, return UNAVAILABLE\n  if (!availabilityData || availabilityData?.resource_url === null) {\n    return WorkAvailabilityStatus.UNAVAILABLE\n  }\n\n  // If can't be watched (geoblocked or not public)...\n  if (work.geoblocked || availabilityData?.is_public === false) {\n    // Look for buy options (RENTED or BUY)\n    if ((availabilityData?.rent || availabilityData?.buy || availabilityData?.dvd)) {\n      if (availabilityData?.rent && !!(selectActiveRentalForWork(store.getState().user, work))) {\n        return WorkAvailabilityStatus.RENTED\n      } else {\n        return WorkAvailabilityStatus.PURCHASE\n      }\n    // If no buy options and geoblocked, return UNAVAILABLE\n    } else if (work.geoblocked) {\n      return WorkAvailabilityStatus.UNAVAILABLE\n    // No buy options, not public and not geoblocked: PROMO is the only option left\n    } else {\n      return WorkAvailabilityStatus.PROMO\n    }\n  }\n\n  return WorkAvailabilityStatus.PUBLIC\n}\n","export function isTouch (isTouchScreen: boolean) {\n  const userAgentCheck = /Mobi|Android|iPhone|iPad|iPod|BlackBerry|webOS|Windows Phone/i.test(navigator.userAgent)\n  const touchCheck = window.matchMedia('(pointer: coarse)').matches || isTouchScreen\n  const screenCheck = window.innerWidth <= 768\n\n  return userAgentCheck || touchCheck || screenCheck\n}\n\nexport function isDialogAvailable () {\n  return typeof HTMLDialogElement === 'function'\n}\n\nexport function getSafariVersion () : number | null {\n  if (navigator.userAgent.includes('Safari/')) {\n    const safariMatch = navigator.userAgent.match(/Version\\/(\\d+(?:\\.\\d+)*)/)\n    if (safariMatch && safariMatch[1]) {\n      return parseFloat(safariMatch[1])\n    }\n  }\n\n  return null\n}\n","/**\n * Use this function instead of navigator.cookieEnabled, which verifies\n * if the browser is configured to interact with cookies, but might still return\n * true if there is a policy in place blocking cookies.\n * @returns wheter cookies are enabled by the navigator.\n */\nexport const cookiesAreEnabled = () => {\n  try {\n    document.cookie.indexOf('test')\n    window.localStorage.getItem('test')\n    window.sessionStorage.getItem('test')\n    return true\n  } catch {\n    return false\n  }\n}\n","import { nothing, TemplateResult } from 'lit'\n\nimport { html } from 'lit/static-html.js'\n\nimport { WorkAvailabilityStatus } from '@src/js/helpers/availability'\nimport {\n  formatComingSoonDate,\n  formatSeriesInfo,\n  formatCollectionInfo,\n  formatYearRange,\n  formatDuration\n} from '@src/js/helpers/format'\nimport { getPlatformLanguageCode } from '@src/js/helpers/language'\nimport normanPaths from '@src/js/helpers/paths'\nimport { selectActiveRentalForWork, UserState } from '@src/js/redux/userReducer'\nimport { WorkCard } from '@src/js/redux/worksReducer'\nimport { bookmarkButtonType } from '@src/js/wc/cards/NFBDisplayWorkCard'\n\nexport const getRestriction = (film: WorkCard, availabilityStatus: WorkAvailabilityStatus, isDark: boolean, userState: UserState) => {\n  const workIsDTO = film?.availability?.buy as boolean\n  const workIsRental = film?.availability?.rent as boolean\n\n  if (availabilityStatus === WorkAvailabilityStatus.PURCHASE) {\n    if (workIsDTO && workIsRental) {\n      return html`\n      <nfb-pill\n        text=\"${window.gettext('Available to rent or buy')}\"\n        icon-name=\"cash\"\n        is-dark=\"${isDark ?? nothing}\"\n        variant=\"round\"\n      >\n      </nfb-pill>`\n    } else if (workIsRental) {\n      return html`\n      <nfb-pill\n        text=\"${window.gettext('Available to rent')}\"\n        icon-name=\"cash\"\n        is-dark=\"${isDark ?? nothing}\"\n        variant=\"round\"\n      >\n      </nfb-pill>`\n    } else {\n      return html`\n      <nfb-pill\n        text=\"${window.gettext('Available to buy')}\"\n        icon-name=\"cash\"\n        is-dark=\"${isDark ?? nothing}\"\n        variant=\"round\"\n      >\n      </nfb-pill>`\n    }\n  } else if (availabilityStatus === WorkAvailabilityStatus.RENTED) {\n    const rental = selectActiveRentalForWork(userState, film as WorkCard)\n    const expirationDate = new Date(rental!.expiration)\n\n    const formatedExpiredDate = new Intl.DateTimeFormat(getPlatformLanguageCode(), {\n      dateStyle: 'medium',\n      timeStyle: 'short'\n    }).format(expirationDate)\n\n    return html`\n      <nfb-pill\n        is-dark=\"${isDark ?? nothing}\"\n        text=\"${`${window.gettext('Expires')} ${window.gettext('on')} ${formatedExpiredDate}`}\"\n        variant=\"primary\"\n      >\n      </nfb-pill>`\n  }\n}\n\nexport const getAvailabilityMessage = (availabilityStatus: WorkAvailabilityStatus, film: WorkCard, isDark: boolean): TemplateResult | typeof nothing => {\n  if (availabilityStatus === WorkAvailabilityStatus.UNAVAILABLE) {\n    const message = film.geoblocked\n      ? window.gettext('Not available to view in your current location.')\n      : window.gettext('This content is no longer available.')\n    return html`\n      <nfb-inline-message\n        is-dark=\"${isDark ?? nothing}\"\n        text=\"${message}\"\n      >\n      </nfb-inline-message>`\n  } else if (availabilityStatus === WorkAvailabilityStatus.PROMO && film.coming_soon) {\n    return html`\n      <nfb-pill\n       is-dark=\"${isDark ?? nothing}\"\n       text=\"${`${window.pgettext('Coming soon date', 'Coming')} ${formatComingSoonDate(film.coming_soon)}`}\"\n      >\n      </nfb-pill>`\n  }\n\n  return nothing\n}\n\nexport const cardShouldBeDisabled = (availabilityStatus: WorkAvailabilityStatus) => {\n  return availabilityStatus === WorkAvailabilityStatus.UNAVAILABLE\n}\n\nexport const getNFBAddToMyListButton = (registryId: number, title: string, isDark: boolean) => {\n  if (window.USER_CONNECTED) {\n    return html`\n    <div slot=\"action-button\">\n      <nfb-add-to-mylist\n        registry-id=\"${registryId}\"\n        source-title=\"${title}\"\n        is-dark=\"${isDark}\"\n        is-small=\"true\"\n      >\n      </nfb-add-to-mylist>\n    <div> `\n  }\n}\n\nexport const getActionButton = (buttonType: bookmarkButtonType | null = null, registryId: number, work: WorkCard, isDark: boolean) => {\n  if (!buttonType || !window.USER_CONNECTED) return nothing\n\n  //  for bookmark\n  if (buttonType === bookmarkButtonType.delete) {\n    return html`\n      <div slot=\"action-button\">\n        <nfb-delete-bookmark-button\n          registry-id=\"${work.id}\"\n          source-title=\"${work.title}\"\n          is-dark=\"${isDark ?? nothing}\"\n          is-small=\"true\"\n        >\n        </nfb-delete-bookmark-button>\n      </div>`\n  }\n\n  if (buttonType === bookmarkButtonType.add) {\n    return getNFBAddToMyListButton(registryId, work.title, isDark)\n  }\n}\n\nexport const handleUrl = (work: WorkCard) => {\n  if (work.category === 'series') return normanPaths.series.replace('{slug}', work.slug)\n\n  if (work.category === 'collection') return normanPaths.collection.replace('{slug}', work.slug)\n\n  return normanPaths.film.replace('{slug}', work.slug)\n}\n\nexport const getSeriesOrCollectionLegend = (work: WorkCard, availabilityStatus: WorkAvailabilityStatus, isDark: boolean) => {\n  let seriesInfo = ''\n  let creatorSlot = null\n  if (work.category === 'series') {\n    creatorSlot = html`\n      <nfb-work-page-creator\n        creators=\"${JSON.stringify(work.directors)}\"\n        is-unavailable=\"${cardShouldBeDisabled(availabilityStatus)}\"\n        is-dark=\"${isDark ?? nothing}\"\n      ></nfb-work-page-creator>`\n    seriesInfo = formatSeriesInfo(work)\n  } else {\n    seriesInfo = formatCollectionInfo(work)\n  }\n  return html`\n    ${creatorSlot}\n    <div class=\"nfb-legend\">\n      <nfb-work-page-legend \n        year=\"${formatYearRange(work)}\"\n        series-info=\"${seriesInfo}\"\n      >\n      </nfb-work-page-legend>\n    </div>\n  `\n}\n\nexport const getFilmLegend = (work: WorkCard, availabilityStatus: WorkAvailabilityStatus, isDark: boolean) => {\n  return html`\n    ${work.directors?.length\n    ? html`<nfb-work-page-creator\n      creators=\"${JSON.stringify(work.directors)}\"\n      is-unavailable=\"${cardShouldBeDisabled(availabilityStatus)}\"\n      is-dark=\"${isDark ?? nothing}\"\n    ></nfb-work-page-creator>`\n    : nothing}\n    <div class=\"nfb-legend\">\n      <nfb-work-page-legend \n        year=\"${work.year}\"\n        running-time=\"${formatDuration(work.duration)}\"\n      >\n      </nfb-work-page-legend>\n    </div>\n  `\n}\n","import { type WorkDirector, type WorkCard } from '@src/js/redux/worksReducer'\nimport { getPlatformLanguageCode } from '@src/js/helpers/language'\n\n/**\n * @param duration\n * @return\n * Duration formatted to XX h XX min, XX min or XX s.\n * If duration can't be converted to Number, return duration.\n*/\nexport const formatDuration = (duration: string | number) => {\n  const durationToNumber = Number(duration)\n\n  if (isNaN(durationToNumber)) return duration\n\n  if (durationToNumber < 60) {\n    return `${duration} s`\n  }\n\n  const h = Math.floor(durationToNumber / 3600).toString()\n  const m = Math.floor(durationToNumber % 3600 / 60).toString()\n\n  return `${h !== '0' ? `${h} h` : ''} ${m !== '0' ? `${m} min` : ''}`\n}\n\n/**\n * @param dateString Coming soon date returned from Public API, expected format: 'YYYY-MM-DDT00:00:00'.\n * @returns Date in format 'Month Day' if date is successfully parsed, else null.\n */\nexport const formatComingSoonDate = (dateString: string): string | null => {\n  const lang = getPlatformLanguageCode()\n  const dateObject = new Date(dateString)\n\n  if (isNaN(dateObject.getDate())) {\n    return null\n  }\n\n  return dateObject.toLocaleString(lang, { month: 'long', day: 'numeric' })\n}\n\n/**\n *\n * @param directors\n * @returns directors formatted:\n * 'FirstName LastName',\n * or 'FirstName1 LastName1 & FirstName2 LastName2',\n * or 'FirstName1 LastName1, FirstName2 LastName2 & FirstName3 LastName3'\n */\nexport const formatDirectors = (directors: WorkDirector[]): string | null => {\n  if (directors?.length > 0) {\n    let directorsString = ''\n    directors.forEach((d, index) => {\n      let separator = ''\n\n      if (directors.length > 1 && index > 0) {\n        if (index === directors.length - 1) {\n          separator = ` ${window.gettext('&')} `\n        } else {\n          separator = ', '\n        }\n      }\n\n      directorsString += `${separator}${d.first_name} ${d.last_name}`\n    })\n    return directorsString\n  }\n\n  return null\n}\n\n/**\n * @param work\n * @return\n * Series info formatted to X seasons or X episodes.\n*/\nexport const formatSeriesInfo = (work: WorkCard) => {\n  if (work.seasons_count && work.seasons_count > 1) {\n    return `${work.seasons_count} ${window.pgettext('Helper to format series info', 'seasons')}`\n  } else {\n    return `${work.episodes_count} ${window.pgettext('Helper to format series info', 'episodes')}`\n  }\n}\n\n/**\n * @param work\n * @return\n * Collection info formatted to X editions or X films.\n*/\nexport const formatCollectionInfo = (work: WorkCard) => {\n  if (work.seasons_count && work.seasons_count > 1) {\n    return `${work.seasons_count} ${window.pgettext('Helper to format collections info', 'editions')}`\n  } else {\n    return `${work.episodes_count} ${window.pgettext('Helper to format collections info', 'films')}`\n  }\n}\n\n/**\n * @param work\n * @return\n * Format year range year_max-year_min or year.\n*/\nexport const formatYearRange = (work: WorkCard) => {\n  return work.year_min !== work.year_max ? `${work.year_min + '-' + work.year_max}` : work.year\n}\n\n/**\n * @param timestamp\n * @returns Format timestamp from history item to YYYY-MM-DD\n */\nexport const formatHistoryItemDate = (timestamp: number) => {\n  return new Date(timestamp).toLocaleDateString()\n}\n\n/**\n * @param genreList\n * @return\n * Format genre into string.\n*/\nexport const formatGenreInfo = (genreList: string[]) => {\n  return genreList.join(', ')\n}\n\n/**\n * Remove HTML tags from string\n *\n * @param html\n * @returns string\n */\nexport const stripTags = (html: string) => {\n  const doc = new DOMParser().parseFromString(html, 'text/html')\n  return doc.body.textContent || ''\n}\n\nexport const secondsToMinutes = (seconds: number) => {\n  return Math.round(seconds / 60)\n}\n\nexport const minutesToSeconds = (minutes: number) => {\n  return minutes * 60\n}\n","/**\n * @returns fr if platform is onf.ca else en\n */\nexport const getPlatformLanguageCode = () => {\n  return window.location.host.match(/onf.ca/) ? 'fr' : 'en'\n}\n","import { store } from '@src/js/redux/store'\nimport { setCurrentActiveClickElement, setLastClickElement } from '@src/js/redux/workPageReducer'\n\n/**\n * Call callback function after newRegistryId is fully displayed\n * (set at displayedRegistryId and header image is loaded)\n */\nexport function executeAfterRegistryIdIsDisplayed (newRegistryId: number, callback: () => void) {\n  const idIsDisplayed = () => {\n    const { workPage } = store.getState()\n    return workPage.displayedRegistryId === newRegistryId && workPage.headerImageIsLoaded\n  }\n\n  if (idIsDisplayed()) {\n    callback()\n  } else {\n    const unsubscribe = store.subscribe(() => {\n      if (idIsDisplayed()) {\n        unsubscribe()\n        callback()\n      }\n    })\n  }\n}\n\n/**\n * Function to update the lastClickElement and the currentActiveClickElement\n * when the video player is closed\n */\n\nexport function handleFocusOnLastElementClicked (lastClickedElement: string|null, currentActiveClickElement: string|null) {\n  store.dispatch(setLastClickElement(lastClickedElement))\n  store.dispatch(setCurrentActiveClickElement(currentActiveClickElement))\n}\n","import { PlayerUniqId } from '@src/js/redux/playersReducer'\nimport { store } from '@src/js/redux/store'\nimport { setHighlightId } from '@src/js/redux/workPageReducer'\n\nexport function verifyHighlight (\n  currentHighlightId: string | null,\n  oldHighlightId: string | null,\n  currentPlaying: PlayerUniqId | null,\n  oldCurrentPlaying: PlayerUniqId | null\n) {\n  if (JSON.stringify(oldCurrentPlaying) !== JSON.stringify(currentPlaying) && currentPlaying?.streamType === 'films') {\n    store.dispatch(setHighlightId(null))\n  } else if (currentHighlightId !== oldHighlightId) {\n    if (currentHighlightId) {\n      appendHighlightToUrl(currentHighlightId, currentPlaying?.registryId ?? null)\n    } else {\n      removeHighlightFromUrl()\n    }\n  }\n}\n\nconst appendHighlightToUrl = (highlightId: string, highlightRegistryId: number | null) => {\n  const currentUrl = new URL(window.location.href)\n  currentUrl.searchParams.set('highlight', highlightId)\n  window.history.pushState({ state: { id: highlightRegistryId } }, '', currentUrl.href)\n}\n\nconst removeHighlightFromUrl = () => {\n  const currentUrl = new URL(window.location.href)\n  currentUrl.searchParams.delete('highlight')\n  window.history.pushState({ state: {} }, '', currentUrl.href)\n}\n","import { store } from '@src/js/redux/store'\nimport { type WorkCard } from '@src/js/redux/worksReducer'\nimport {\n  PlayerError,\n  selectNextInQueue,\n  selectPlayerOptionsByRegistryId,\n  setCurrentError,\n  setCurrentPlaying\n} from '@src/js/redux/playersReducer'\nimport { selectWorkById } from '@src/js/redux/worksReducer'\nimport { setDisplayedRegistryId } from '@src/js/redux/workPageReducer'\nimport { getAvailabilityStatusForWork, WorkAvailabilityStatus } from '@src/js/helpers/availability'\n\nexport function getNextWork (\n  playingRegistryId: number,\n  skipUnplayableWork = false\n): WorkCard|null {\n  const state = store.getState()\n  if (playingRegistryId) {\n    let nextId = selectNextInQueue(state.players, playingRegistryId)\n    if (nextId) {\n      let nextWork = selectWorkById(state.works, nextId) ?? null\n\n      if (skipUnplayableWork) {\n        while (nextWork && (getAvailabilityStatusForWork(nextWork) !== WorkAvailabilityStatus.PUBLIC || nextWork?.geoblocked)) {\n          nextId = selectNextInQueue(state.players, nextWork.id)\n          nextWork = selectWorkById(state.works, nextId) ?? null\n          if (nextWork?.id === playingRegistryId) {\n            // Stop loop if back to original registry_id\n            nextWork = null\n          }\n        }\n      }\n\n      return nextWork\n    }\n  }\n\n  return null\n}\n\nexport async function displayNextWork (\n  playingRegistryId: number | null = null,\n  skipUnplayableWork = false\n): Promise<number | null> {\n  const current = playingRegistryId ?? store.getState().players.currentPlaying?.registryId\n  if (!current) { return null }\n\n  const nextWork = getNextWork(current, skipUnplayableWork)\n\n  if (nextWork) {\n    await store.dispatch(setDisplayedRegistryId(nextWork.id))\n    let workError = null\n    if (nextWork?.geoblocked) {\n      workError = PlayerError.GEOBLOCKED\n    } else if (!selectPlayerOptionsByRegistryId(store.getState().players, nextWork.id)) {\n      workError = PlayerError.NO_PLAYER_OPTIONS\n    }\n\n    store.dispatch(setCurrentError(workError))\n    return nextWork.id\n  }\n\n  return null\n}\n\nexport function playNextWork (\n  playingRegistryId: number | null = null,\n  skipUnplayableWork = false\n) {\n  const current = playingRegistryId ?? store.getState().players.currentPlaying?.registryId\n  if (!current) { return }\n\n  const nextWork = getNextWork(current, skipUnplayableWork)\n\n  if (!nextWork) {\n    store.dispatch(setCurrentPlaying(null))\n  } else {\n    store.dispatch(setCurrentPlaying({\n      registryId: nextWork.id,\n      slug: nextWork.slug,\n      streamType: 'films'\n    }))\n  }\n}\n","const normanPaths = {\n  series: window.gettext('/series/{slug}/'),\n  collection: window.gettext('/collection/{slug}/'),\n  film: window.gettext('/film/{slug}/'),\n  directors: window.gettext('/directors/{slug}/'),\n  embed: window.gettext('/film/{slug}/embed/player/'),\n  promoEmbed: window.gettext('/film/{parentSlug}/{streamType}/{slug}/embed/player/'),\n  indigenousCinemaSubject: window.gettext('/indigenous-cinema/subjects/{slug}/'),\n  indigenousCinemaSecondarySubject: window.gettext('/indigenous-cinema/subjects/{slug}/{secondarySlug}'),\n  playlist: window.gettext('/playlist/{slug}/'),\n  exploreByChildSubject: window.gettext('/subjects/{parentSubject}/{childSubject}/')\n}\n\nexport default normanPaths\n","import NFBExpose from '@web-nfb/player/src/NFBExpose'\nimport { WorkCard } from '@src/js/redux/worksReducer'\nimport { StreamTypes } from '@src/js/redux/playersReducer'\nimport { PlayerOptions } from '@src/js/types/Player'\nimport normanPaths from '@src/js/helpers/paths'\nimport { getPlatformLanguageCode } from '@src/js/helpers/language'\n\nexport const waitForMetadata = async (player: NFBExpose) => {\n  await new Promise<void>(resolve => {\n    if (player.readyState < 1) {\n      // we don't have duration info, wait for metadata to be loaded\n      player.one('loadedmetadata', () => {\n        resolve()\n      })\n    } else {\n      resolve()\n    }\n  })\n}\n\nexport const getParentUrl = (): string => {\n  return document.referrer || (window.location?.ancestorOrigins?.length ? window.location.ancestorOrigins[0] : '')\n}\n\nexport const getUnstatsPlatform = () => {\n  return window.location.host.match(/onf.ca/) ? 'onf_ca' : 'nfb_ca'\n}\n\n/** Note: only used to generate player options for extras for now. */\nexport const generatePlayerOptionsForWork = (work: WorkCard, streamType: StreamTypes, parentSlug: string): PlayerOptions => {\n  const workCategory = convertStreamTypeToCategory(streamType)\n  const platformLang = getPlatformLanguageCode()\n  const eduContext = window.EDU_CONTEXT ? JSON.parse(window.EDU_CONTEXT) : {}\n\n  return {\n    registryId: work.id,\n    language: work.cataloging_language ?? '',\n    ...(work.opening_credits_timecode ? { openingCreditsTimecode: work.opening_credits_timecode } : {}),\n    ...(work.ending_credits_timecode ? { endingCreditsTimecode: work.opening_credits_timecode } : {}),\n    geoblocked: work.geoblocked ?? false,\n    poster: work.thumbnail,\n    theme: {\n      name: 'balmoral-neue'\n    },\n    expiredSourceWarning: true,\n    overlay: {\n      // @ts-expect-error Property not showing, error even if in PlayerOptions?\n      showBackButton: true,\n      backButtonLabel: work.title,\n      showLogo: false,\n      showShare: true,\n      url: work.availability?.resource_url ?? '',\n      embed: {\n        html: getShareablePlayerIframeTagForWork(work, streamType, parentSlug),\n        options: {\n          width: 516,\n          height: 290\n        }\n      },\n      share: {\n        email: {\n          subject: work.title,\n          body: work.availability?.resource_url\n        }\n      }\n    },\n    gtm: {\n      title: work.title,\n      registryId: work.id.toString(),\n      versionType: workCategory,\n      // versionLang should eventually be set with another value from API,\n      // but cataloging_language will work for now with extras\n      // (would only be a problem for example with a language\n      // other than english of french).\n      versionLang: work.cataloging_language,\n      catalogingLang: work.cataloging_language,\n      interfaceLang: platformLang,\n      contentCategory: '',\n      context: eduContext,\n      embedMode: false,\n      autoplay: false\n    },\n    unstats: {\n      domain: window.UNSTATS_HOST,\n      apiKey: window.UNSTATS_API_KEY,\n      user: window.AUTH_USER_ID,\n      registryId: work.id.toString(),\n      slug: work.slug,\n      type: workCategory,\n      platform: platformLang === 'fr' ? 'onf_ca' : 'nfb_ca',\n      labels: eduContext,\n      context: window.EDU_CONTEXT_LEGACY_STRING,\n      autoplay: false,\n      url: `${window.location.origin}${window.location.pathname}${workCategory}/${work.slug}/`\n    },\n    playbackRates: [0.5, 1, 1.5, 2],\n    ...(work.warning\n      ? {\n        message: `<i class='nfb-icon icon-warning-o rating-warning'></i>&nbsp;${work.warning}`\n      }\n      : {})\n  }\n}\n\nexport const getShareablePlayerIframeTagForWork = (work: WorkCard, streamType: StreamTypes, parentSlug: string) => {\n  const { protocol, host } = window.location\n  const formattedStreamType = convertStreamTypeToCategory(streamType)\n  const embedPath = (formattedStreamType === 'film')\n    ? normanPaths.embed.replace('{slug}', work.slug)\n    : normanPaths.promoEmbed\n      .replace('{slug}', work.slug)\n      .replace('{streamType}', formattedStreamType)\n      .replace('{parentSlug}', parentSlug ?? work.slug)\n\n  return `<iframe src=\"${protocol}//${host}${embedPath}\" width=\"(( width ))\" height=\"(( height ))\" frameborder=\"0\" allowfullscreen=\"true\" webkitallowfullscreen=\"true\" mozallowfullscreen=\"true\"></iframe>`\n}\n\n/** Stream types are currently plural, remove the \"s\" to get category */\nexport const convertStreamTypeToCategory = (streamType: StreamTypes) => {\n  return streamType.replace(/s$/, '')\n}\n","import { postHistory, WorkHistoryReturnParams } from '@src/js/redux/workHistoryReducer'\nimport { AppDispatch } from '@src/js/redux/store'\nimport { sortByTimestamp } from '@src/js/helpers/sort'\nimport { cookiesAreEnabled } from '@src/js/helpers/cookies'\n\nexport const fetchAllFromSessionStorage = (key: string): WorkHistoryReturnParams => {\n  if (!cookiesAreEnabled()) {\n    return { data: [], count: 0 }\n  }\n\n  const unparsedSessionHistory: string|null = window.sessionStorage.getItem(key)\n  const parsedSessionHistory = unparsedSessionHistory ? JSON.parse(unparsedSessionHistory) : []\n\n  const returnData: WorkHistoryReturnParams = {\n    data: parsedSessionHistory.sort(sortByTimestamp),\n    count: parsedSessionHistory.length\n  }\n\n  return returnData\n}\n\nexport const postSessionStorage = async (key: string, thunkAPI: {dispatch: AppDispatch}) => {\n  const historySession = fetchAllFromSessionStorage(key).data\n  if (historySession.length > 0) {\n    for (const item of historySession) {\n      await thunkAPI.dispatch(postHistory(item))\n    }\n    window.sessionStorage.removeItem(key)\n  }\n}\n","export type ObjectWithTimestamp = {\n  timestamp?: number|undefined\n}\n\nexport const sortByTimestamp = (a: ObjectWithTimestamp, b: ObjectWithTimestamp) => {\n  if (!a.timestamp || !b.timestamp) return 0\n  if (a.timestamp > b.timestamp) return -1\n  else return 1\n}\n","import { createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\n\nexport interface AnimatedHoverCardState {\n  currentOpenCard: string | null\n}\n\nconst initialState: AnimatedHoverCardState = {\n  currentOpenCard: null\n}\n\nexport const animatedHoverCardSlice = createSlice({\n  name: 'animatedHoverCardSlice',\n  initialState,\n  reducers: {\n    setCurrentOpenCard (state, action: PayloadAction<string|null>) {\n      state.currentOpenCard = action.payload\n    }\n  }\n})\n\nexport const {\n  setCurrentOpenCard\n} = animatedHoverCardSlice.actions\n\nexport default animatedHoverCardSlice.reducer\n","import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { AppDispatch, RootState } from '@src/js/redux/store'\nimport { fetchWorks } from '@src/js/redux/worksReducer'\n\ninterface GetBookmarkApiResponse {\n  items: [{ registry_id: number }]\n}\n\nexport interface BookmarksState {\n  list: number[] | null\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  currentLoadingId: number | null\n}\n\nconst initialState: BookmarksState = {\n  list: null,\n  status: undefined,\n  currentLoadingId: null\n}\n\nconst apiV4Client = ApiV4Client.instance\n\nexport const fetchBookmarks = createAsyncThunk<GetBookmarkApiResponse>('bookmarks/fetch', async () => {\n  const response = await apiV4Client.call({\n    method: 'GET',\n    url: '/bookmarks/'\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  return await response.data\n})\n\nexport const postBookmark = createAsyncThunk<\n  number | null,\n  number\n>('bookmarks/add', async (registry_id: number): Promise<number|null> => {\n  const response = await apiV4Client.call({\n    method: 'POST',\n    url: `/bookmarks/${registry_id}/`\n  })\n\n  return response.status === 201 ? registry_id : null\n})\n\nexport const deleteBookmark = createAsyncThunk<\n  number | null,\n  number\n>('bookmarks/delete', async (registry_id: number): Promise<number | null> => {\n  const response = await apiV4Client.call({\n    method: 'DELETE',\n    url: `/bookmarks/${registry_id}/`\n  })\n\n  return response.status === 204 ? registry_id : null\n})\n\nexport const fetchBookmarksList = createAsyncThunk<\n  void,\n  void,\n  {\n    dispatch: AppDispatch,\n    state: RootState\n  }>('bookmarks/fetchBookmarks', async (_, thunkAPI) => {\n    await thunkAPI.dispatch(fetchBookmarks())\n    const state: RootState = thunkAPI.getState()\n    const idListToFetch: number[] = state.bookmarks.list!\n    await thunkAPI.dispatch(fetchWorks({ idList: idListToFetch, subset: 'gc/gc-films' }))\n  })\n\nexport const bookmarksSlice = createSlice({\n  name: 'bookmarks',\n  initialState,\n  reducers: {\n    setLoadingItem: (state, action: PayloadAction<number|null>) => {\n      state.currentLoadingId = action.payload\n    }\n  },\n  extraReducers: (builder) => {\n    builder\n      .addCase(fetchBookmarks.pending, (state) => {\n        state.status = 'loading'\n        state.currentLoadingId = null\n      })\n      .addCase(fetchBookmarks.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload.items.map(i => i.registry_id)\n      })\n      .addCase(fetchBookmarks.rejected, (state) => {\n        state.status = 'failed'\n      })\n      .addCase(postBookmark.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentLoadingId = action.meta.arg\n      })\n      .addCase(postBookmark.fulfilled, (state, action: PayloadAction<number|null>) => {\n        state.status = 'succeeded'\n        state.currentLoadingId = null\n        if (state.list !== null && action.payload) {\n          state.list.unshift(action.payload)\n        }\n      })\n      .addCase(postBookmark.rejected, (state) => {\n        state.status = 'failed'\n      })\n      .addCase(deleteBookmark.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentLoadingId = action.meta.arg\n      })\n      .addCase(deleteBookmark.fulfilled, (state, action: PayloadAction<number|null>) => {\n        state.status = 'succeeded'\n        state.currentLoadingId = null\n        if (action.payload) {\n          state.list = state.list!.filter(b => b !== action.payload)\n        }\n      })\n      .addCase(deleteBookmark.rejected, (state) => {\n        state.status = 'failed'\n      })\n  },\n  selectors: {\n    selectIdIsLoading: (state: BookmarksState, id: number): boolean => {\n      return state.status === 'loading' && state.currentLoadingId === id\n    },\n    selectIdHasError: (state: BookmarksState, id: number): boolean => {\n      return state.status === 'failed' && state.currentLoadingId === id\n    },\n    selectIdIsBookmarked: (state: BookmarksState, id: number): boolean => {\n      return state.list !== null && state.list.includes(id)\n    },\n    selectBookmarksIds: (state: BookmarksState): number[] => {\n      return state.list ?? []\n    }\n  }\n})\n\nexport const {\n  selectIdIsBookmarked,\n  selectIdIsLoading,\n  selectIdHasError,\n  selectBookmarksIds\n} = bookmarksSlice.getSelectors()\n\nexport default bookmarksSlice.reducer\n","import { createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\n\nexport interface CarouselState {\n  currentActiveCarousel: string | null\n}\n\nconst initialState: CarouselState = {\n  currentActiveCarousel: null\n}\n\nexport const carouselSlice = createSlice({\n  name: 'carouselSlice',\n  initialState,\n  reducers: {\n    setCurrentActiveCarousel (state, action: PayloadAction<string|null>) {\n      state.currentActiveCarousel = action.payload\n    }\n  }\n})\n\nexport const {\n  setCurrentActiveCarousel\n} = carouselSlice.actions\n\nexport default carouselSlice.reducer\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\n\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { DEFAULT_LIST_LENGTH } from '@src/js/constants'\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { fetchWorks, basicIncludeFields } from '@src/js/redux/worksReducer'\n\nconst apiV4Client = ApiV4Client.instance\n\nexport interface ChannelsState {\n  list: number[] | null\n  status: undefined | 'loading' | 'succeeded' | 'failed'\n}\n\nconst initialState: ChannelsState = {\n  list: null,\n  status: undefined\n}\n\nexport interface GetChannelsParams {\n  slug: string,\n  include_featured?: boolean,\n  per_page?: number,\n  page?: number\n}\n\nexport const fetchChannel = createAsyncThunk<\nnumber[], GetChannelsParams, ThunkAPI\n>('channelsPage/fetchChannel', async ({\n  slug,\n  include_featured = true,\n  per_page = DEFAULT_LIST_LENGTH,\n  page = 1\n}, thunkAPI) => {\n  const response = await apiV4Client.call({\n    method: 'GET',\n    url: `/channels/${slug}/items`,\n    params: {\n      response_format: 'registry_id',\n      types: 'film,series,collection',\n      include_featured,\n      per_page,\n      page\n    }\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  const idsList = await response.data.data.map((r: any) => r.registry_id)\n  await thunkAPI.dispatch(fetchWorks({ idList: idsList, includeFields: basicIncludeFields }))\n\n  return idsList as number[]\n})\n\nexport const channelsSlice = createSlice({\n  name: 'channels',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder\n      .addCase(fetchChannel.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchChannel.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload ?? []\n      })\n      .addCase(fetchChannel.rejected, (state) => {\n        state.status = 'failed'\n      })\n  }\n})\n\nexport default channelsSlice.reducer\n","import uniq from 'lodash/uniq'\nimport { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\n\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { ERROR_MESSAGE, DEFAULT_LIST_LENGTH } from '@src/js/constants'\nimport { APIWorksResponse, fetchWorks, WorkCard } from '@src/js/redux/worksReducer'\n\ninterface DirectorWorkIdList {\n  slug: string,\n  idList: number[],\n  totalCount: number\n}\n\nexport interface GetDirectorParams {\n  slug?: string,\n  size?: number,\n  language?: string,\n  page?: number\n}\n\nexport interface DirectorList {\n  [key: string]: number[]\n}\n\ninterface DirectorWorkListTotal {\n  [key: string]: number\n}\n\nexport interface DirectorsPageState {\n  list: DirectorList,\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  totalCount: DirectorWorkListTotal,\n  apiError: string | null,\n  currentPage: number\n}\n\nconst initialState: DirectorsPageState = {\n  list: {},\n  status: undefined,\n  totalCount: {},\n  apiError: null,\n  currentPage: 1\n}\n\nexport const fetchWorkListByDirector = createAsyncThunk<\n  DirectorWorkIdList,\n  GetDirectorParams,\n  ThunkAPI\n>('directors/fetchWorkListByDirector', async ({ slug, size = DEFAULT_LIST_LENGTH, language = window.LOCALE, page }, thunkAPI) => {\n  let idList: number[] = []\n\n  const worksPayload = (await thunkAPI.dispatch(\n    fetchWorks({\n      sort: 'year:desc',\n      director: slug,\n      language,\n      size,\n      page\n    }))).payload as APIWorksResponse\n\n  if (worksPayload.items?.length) {\n    idList = worksPayload.items?.map((w: WorkCard) => w.id)\n  }\n\n  const totalCount = worksPayload.meta.pagination.total\n\n  return { slug, idList, totalCount } as DirectorWorkIdList\n})\n\nexport const directorsSlice = createSlice({\n  name: 'directorsPage',\n  initialState,\n  reducers: {\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    },\n    resetList: (state, action: PayloadAction<string>) => {\n      state.list[action.payload] = []\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchWorkListByDirector.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        const slug = action.payload.slug\n        state.list[slug] = uniq([\n          ...(state.list[slug] ?? []),\n          ...action.payload.idList\n        ])\n        state.totalCount[slug] = action.payload.totalCount\n      })\n      .addCase(fetchWorkListByDirector.rejected, (state, action) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport const {\n  setCurrentPage, resetList\n} = directorsSlice.actions\n\nexport default directorsSlice.reducer\n","import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { ERROR_MESSAGE } from '../constants'\nimport { WorkDirector } from './worksReducer'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\nexport interface APIDirectorsResponse {\n  items: WorkDirector[],\n  meta: {\n    pagination: {\n      page: number,\n      pages: number,\n      size: number,\n      total: number\n    }\n    count_by_letter: object\n  }\n}\n\nexport interface GetDirectorsParams {\n  subset?: 'nfb/public' | 'gc/gc-films' | 'nfb/indigenous-films',\n  indigenous_nation?: string,\n  first_letter?: string,\n  count_by_letter?: boolean,\n  page?: number,\n  size?: number,\n  sort?: string\n}\n\nexport interface DirectorsState {\n  list: WorkDirector[] | null,\n  letterList: object | null,\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  apiError: string | null\n}\n\nconst initialState: DirectorsState = {\n  list: null,\n  letterList: null,\n  status: undefined,\n  apiError: null\n}\n\nexport const fetchDirectorList = createAsyncThunk<\nAPIDirectorsResponse, GetDirectorsParams\n>('directors/fetchDirectorList', async ({ subset, indigenous_nation, first_letter, count_by_letter, page, size, sort }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/directors',\n    params: {\n      locale: window.LOCALE,\n      ...(subset ? { subset } : {}),\n      ...(indigenous_nation ? { indigenous_nation } : {}),\n      ...(first_letter ? { first_letter } : {}),\n      ...(count_by_letter ? { count_by_letter } : {}),\n      ...(page ? { page } : {}),\n      ...(size ? { size } : {}),\n      ...(sort ? { sort } : {})\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n})\n\nexport const fetchDirectorCountByLetterList = createAsyncThunk<\nAPIDirectorsResponse, GetDirectorsParams\n>('directors/fetchDirectorCountByLetterList', async ({ subset, indigenous_nation }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/directors',\n    params: {\n      locale: window.LOCALE,\n      size: 0,\n      count_by_letter: true,\n      ...(subset ? { subset } : {}),\n      ...(indigenous_nation ? { indigenous_nation } : {})\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n})\n\nexport const directorsSlice = createSlice({\n  name: 'indigenousCinema',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder\n      .addCase(fetchDirectorList.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchDirectorList.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload.items\n      })\n      .addCase(fetchDirectorList.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n      .addCase(fetchDirectorCountByLetterList.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchDirectorCountByLetterList.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.letterList = action.payload.meta.count_by_letter\n      })\n      .addCase(fetchDirectorCountByLetterList.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport default directorsSlice.reducer\n","import { createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\n\nexport const DEFAULT_FILTER = {\n  language: window.LOCALE,\n  age_min: 5,\n  age_max: 18\n}\n\ninterface Filter {\n  language: string,\n  age_min: number,\n  age_max: number\n}\n\nexport interface EducationalSubjectPageState {\n  currentPage: number,\n  filter: Filter\n}\n\nconst initialState: EducationalSubjectPageState = {\n  currentPage: 1,\n  filter: DEFAULT_FILTER\n}\n\nexport const educationalSubjectPageSlice = createSlice({\n  name: 'educationalSubjectPageSlice',\n  initialState,\n  reducers: {\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    },\n    setFilter (state, action: PayloadAction<Filter>) {\n      state.filter = action.payload\n    }\n  }\n})\n\nexport const {\n  setCurrentPage, setFilter\n} = educationalSubjectPageSlice.actions\n\nexport default educationalSubjectPageSlice.reducer\n","import uniq from 'lodash/uniq'\n\nimport { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'\n\nimport { ThunkAPI, NFBStore } from '@src/js/redux/store'\nimport { APIWorksResponse, fetchWorks, WorkCard } from '@src/js/redux/worksReducer'\nimport { DEFAULT_LIST_LENGTH, ERROR_MESSAGE } from '@src/js/constants'\n\ninterface ExploreBySubjectIdList {\n  slug: string,\n  idList: number[],\n  totalCount: number\n}\n\nexport interface ExploreBySubjectList {\n  [key: string]: number[]\n}\n\ninterface ExploreBySubjectTotal {\n  [key: string]: number\n}\n\nexport interface ExploreBySubjectState {\n  list: ExploreBySubjectList\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  currentPage: number,\n  totalCount: ExploreBySubjectTotal,\n  apiError: string | null\n}\n\nconst initialState: ExploreBySubjectState = {\n  list: {},\n  status: undefined,\n  currentPage: 1,\n  totalCount: {},\n  apiError: null\n}\n\nexport interface GetExploreByChildSubjectParams {\n  slug?: string,\n  size?: number,\n  language?: string,\n  page?: number\n}\n\nexport const fetchExploreByChildSubject = createAsyncThunk<\n  ExploreBySubjectIdList,\n  GetExploreByChildSubjectParams,\n  ThunkAPI\n>('exploreByPage/fetchExploreByChildSubject', async ({ slug, size = DEFAULT_LIST_LENGTH, language = window.LOCALE, page }, thunkAPI) => {\n  let idList: number[] = []\n\n  const worksPayload = (await thunkAPI.dispatch(\n    fetchWorks({\n      sort: 'year:desc',\n      subject: slug,\n      language,\n      size,\n      subjectCategory: 'general',\n      page\n    }))).payload as APIWorksResponse\n\n  if (worksPayload.items?.length) {\n    idList = worksPayload.items?.map((w: WorkCard) => w.id)\n  }\n\n  const totalCount = worksPayload.meta.pagination.total\n\n  return { slug, idList, totalCount } as ExploreBySubjectIdList\n})\n\nexport const exploreBySubjectSlice = createSlice({\n  name: 'exploreBySubject',\n  initialState,\n  reducers: {\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    },\n    resetList: (state, action: PayloadAction<string>) => {\n      state.list[action.payload] = []\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchExploreByChildSubject.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchExploreByChildSubject.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        const slug = action.payload.slug\n        state.list[slug] = uniq([\n          ...(state.list[slug] ?? []),\n          ...action.payload.idList\n        ])\n        state.totalCount[slug] = action.payload.totalCount\n      })\n      .addCase(fetchExploreByChildSubject.rejected, (state, action) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport const {\n  setCurrentPage, resetList\n} = exploreBySubjectSlice.actions\n\nexport default exploreBySubjectSlice.reducer\n","import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\nimport uniq from 'lodash/uniq'\n\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { APIWorksResponse, fetchWorks, GetWorksParams } from '@src/js/redux/worksReducer'\n\nimport { DEFAULT_GRID_LIST_LENGTH, ERROR_MESSAGE } from '@src/js/constants'\n\nconst sortMapping = {\n  alphabetical: 'title',\n  publication_date: 'publication_date:desc',\n  production_date: 'year:desc'\n}\n\nexport const SORT_ORDER = {\n  ALPHABETICAL: 'alphabetical',\n  PUBLICATION_DATE: 'publication_date',\n  PRODUCTION_DATE: 'production_date'\n} as const\n\nexport type SortOrder = typeof SORT_ORDER[keyof typeof SORT_ORDER]\n\nexport interface ExploreByWorkFilterList {\n  language: string,\n  genre: string[],\n  availability: string[],\n  sort: SortOrder,\n  cc: boolean,\n  dv: boolean,\n  safeSearch: boolean,\n  yearMin: number | undefined,\n  yearMax: number | undefined,\n  durationMin: number | undefined,\n  durationMax: number | undefined,\n  titleLetter: string,\n}\n\nexport interface ExploreByWorkPageState extends ExploreByWorkFilterList {\n  isLoading: boolean,\n  currentPage: number,\n  total: number,\n  letterList: object,\n  workIdList: number[],\n  apiError: string | null\n}\n\nexport const initialFilterList: ExploreByWorkFilterList = {\n  language: window.LOCALE,\n  genre: [],\n  availability: [],\n  sort: SORT_ORDER.PRODUCTION_DATE,\n  cc: false,\n  dv: false,\n  safeSearch: false,\n  yearMin: undefined,\n  yearMax: undefined,\n  durationMin: undefined,\n  durationMax: undefined,\n  titleLetter: ''\n}\n\nexport const initialState: ExploreByWorkPageState = {\n  isLoading: true,\n  currentPage: 1,\n  total: 0,\n  letterList: {},\n  workIdList: [],\n  apiError: null,\n  ...initialFilterList\n}\n\nexport const fetchExploreByWork = createAsyncThunk<\n  APIWorksResponse,\n  GetWorksParams,\n  ThunkAPI\n>('exploreByWorkPage/fetchExploreByWork', async ({ page, size = DEFAULT_GRID_LIST_LENGTH }, thunkAPI) => {\n  const currentPageState = thunkAPI.getState().exploreByWorkPage\n\n  const response = await thunkAPI.dispatch(fetchWorks({\n    subset: 'nfb/published',\n    size,\n    page,\n    category: 'film',\n    language: currentPageState.language === 'all_languages' ? '' : currentPageState.language,\n    genre: currentPageState.genre,\n    availability: currentPageState.availability,\n    sort: sortMapping[currentPageState.sort],\n    cc: currentPageState.cc,\n    dv: currentPageState.dv,\n    safeSearch: currentPageState.safeSearch,\n    yearMin: currentPageState.yearMin,\n    yearMax: currentPageState.yearMax,\n    durationMin: currentPageState.durationMin,\n    durationMax: currentPageState.durationMax,\n    titleLetter: currentPageState.titleLetter.toLowerCase()\n  }))\n\n  if (response.type === 'works/fetchWorks/rejected') {\n    return thunkAPI.rejectWithValue('Failed to fetch works')\n  }\n\n  return response.payload as APIWorksResponse\n})\n\nexport const exploreByWorkPageSlice = createSlice({\n  name: 'exploreByWorkPage',\n  initialState,\n  reducers: {\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    },\n    setLanguage (state, action: PayloadAction<string>) {\n      state.language = action.payload\n    },\n    setGenre (state, action: PayloadAction<string[]>) {\n      state.genre = action.payload\n    },\n    setAvailability (state, action: PayloadAction<string[]>) {\n      state.availability = action.payload\n    },\n    setSort (state, action: PayloadAction<SortOrder>) {\n      state.sort = action.payload\n      if (state.sort === SORT_ORDER.ALPHABETICAL) {\n        state.titleLetter = 'a'\n      } else {\n        state.titleLetter = ''\n      }\n    },\n    setCC (state, action: PayloadAction<boolean>) {\n      state.cc = action.payload\n    },\n    setDV (state, action: PayloadAction<boolean>) {\n      state.dv = action.payload\n    },\n    setSafeSearch (state, action: PayloadAction<boolean>) {\n      state.safeSearch = action.payload\n    },\n    setYearMin (state, action: PayloadAction<number>) {\n      state.yearMin = action.payload\n    },\n    setYearMax (state, action: PayloadAction<number>) {\n      state.yearMax = action.payload\n    },\n    setDurationMin (state, action: PayloadAction<number>) {\n      state.durationMin = action.payload\n    },\n    setDurationMax (state, action: PayloadAction<number>) {\n      state.durationMax = action.payload\n    },\n    setTitleLetter (state, action: PayloadAction<string>) {\n      state.titleLetter = action.payload\n    },\n    resetSearchResult (state) {\n      state.isLoading = initialState.isLoading\n      state.currentPage = initialState.currentPage\n      state.total = initialState.total\n      state.workIdList = initialState.workIdList\n      state.apiError = initialState.apiError\n    },\n    setAllFilters (state, action: PayloadAction<ExploreByWorkFilterList>) {\n      state.genre = action.payload.genre\n      state.language = action.payload.language\n      state.availability = action.payload.availability\n      state.sort = action.payload.sort\n      state.cc = action.payload.cc\n      state.dv = action.payload.dv\n      state.safeSearch = action.payload.safeSearch\n      state.yearMin = action.payload.yearMin\n      state.yearMax = action.payload.yearMax\n      state.durationMin = action.payload.durationMin\n      state.durationMax = action.payload.durationMax\n      state.titleLetter = action.payload.titleLetter\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchExploreByWork.pending, state => {\n        state.isLoading = true\n      })\n      .addCase(fetchExploreByWork.fulfilled, (state, action: PayloadAction<APIWorksResponse>) => {\n        state.total = action.payload.meta.pagination.total\n        state.letterList = action.payload.meta.letter_count\n        state.workIdList = uniq([\n          ...state.workIdList,\n          ...action.payload.items.map(item => item.id)\n        ])\n        state.isLoading = false\n      })\n      .addCase(fetchExploreByWork.rejected, (state) => {\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport const {\n  setCurrentPage,\n  setLanguage,\n  setGenre,\n  setAvailability,\n  setSort,\n  setCC,\n  setDV,\n  setSafeSearch,\n  setYearMin,\n  setYearMax,\n  setDurationMin,\n  setDurationMax,\n  setTitleLetter,\n  resetSearchResult,\n  setAllFilters\n} = exploreByWorkPageSlice.actions\n\nexport default exploreByWorkPageSlice.reducer\n","/**\n * Film history used for work page detail\n * Retrieve only history for a specific film,\n * or to get history for a list of episodes/films if it's a series/collection\n */\nimport { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport uniqBy from 'lodash/uniqBy'\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { fetchAllFromSessionStorage, postSessionStorage } from '@src/js/helpers/sessionStorage'\nimport { cookiesAreEnabled } from '@src/js/helpers/cookies'\nimport { sortByTimestamp } from '@src/js/helpers/sort'\n\nconst apiV4Client = ApiV4Client.instance\nconst SESSION_FILM_HISTORY_KEY = 'nfb_session_film_history'\n\nexport interface FilmHistory {\n  registry_id: number\n  timecode: number\n  percent: number\n  timestamp?: number\n  is_completed?: boolean\n}\n\nexport interface FilmHistoryState {\n  list: FilmHistory[],\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  countFilmHistory: number,\n}\n\nexport interface GetFilmHistoryParams {\n  is_completed?: boolean,\n  registry_ids?: number[],\n  per_page?: number,\n  page?: number\n}\n\nexport interface FilmHistoryReturnParams {\n  data: FilmHistory[],\n  count: number,\n}\n\nconst initialState: FilmHistoryState = {\n  list: fetchAllFromSessionStorage(SESSION_FILM_HISTORY_KEY).data ?? [],\n  status: undefined,\n  countFilmHistory: 0,\n}\n\nexport const fetchFilmHistory = createAsyncThunk<\n  FilmHistoryReturnParams,\n  GetFilmHistoryParams,\n  ThunkAPI\n  >('filmHistory/fetchFilmHistory', async ({ per_page, is_completed, page, registry_ids }, thunkAPI) => {\n    if (window.USER_CONNECTED) {\n      // user has data in session storage ?\n      // we need to sync\n      await postSessionStorage(SESSION_FILM_HISTORY_KEY, thunkAPI)\n\n      const response = await apiV4Client.call({\n        method: 'GET',\n        url: '/watch_history/films',\n        params: {\n          registry_ids: registry_ids?.join(','),\n          per_page,\n          is_completed,\n          page\n        }\n      })\n\n      if (response.status !== 200) {\n        throw new Error(`Response status: ${response.status}`)\n      }\n\n      return await response.data\n    } else {\n      // get from session storage\n      const sessionHistory = fetchAllFromSessionStorage(SESSION_FILM_HISTORY_KEY).data\n      return {\n        data: sessionHistory.filter((f: FilmHistory) => registry_ids?.includes(f.registry_id))\n      }\n    }\n  })\n\nexport const deleteFilmHistory = createAsyncThunk<\n  number | null,\n  number\n>('filmHistory/delete', async (registry_id: number): Promise<number | null> => {\n  const response = await apiV4Client.call({\n    method: 'DELETE',\n    url: `/watch_history/films/${registry_id}/`\n  })\n  return response.status === 204 ? registry_id : null\n})\n\nexport const filmHistorySlice = createSlice({\n  name: 'filmHistory',\n  initialState,\n  reducers: {\n    updateFilmHistoryList (state, action: PayloadAction<{data: FilmHistory[]}>) {\n      const tempList = uniqBy([\n        ...action.payload.data, // uniqBy keep first occurence\n        ...state.list\n      ], 'registry_id')\n\n      state.list = tempList.sort(sortByTimestamp)\n\n      // Record in local storage\n      if (!window.USER_CONNECTED && cookiesAreEnabled()) {\n        window.sessionStorage.setItem(SESSION_FILM_HISTORY_KEY, JSON.stringify(state.list))\n      }\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchFilmHistory.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchFilmHistory.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.countFilmHistory = action.payload.count\n        filmHistorySlice.caseReducers.updateFilmHistoryList(state, action)\n      })\n      .addCase(fetchFilmHistory.rejected, state => {\n        state.status = 'failed'\n        // @todo: handle errors\n      })\n      .addCase(deleteFilmHistory.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(deleteFilmHistory.fulfilled, (state, action: PayloadAction<number|null>) => {\n        state.status = 'succeeded'\n        if (action.payload) {\n          state.list = state.list!.filter(b => b.registry_id !== action.payload)\n        }\n      })\n      .addCase(deleteFilmHistory.rejected, (state) => {\n        state.status = 'failed'\n      })\n  },\n  selectors: {\n    selectFilmHistoryById: (state: FilmHistoryState, id: number) => {\n      return state.list.find(item => item.registry_id === id)\n    },\n    selectFilmHistoryIds: (state: FilmHistoryState) => {\n      return state.list\n        .map(item => (item.registry_id) as number)\n    }\n  }\n})\n\nexport const {\n  selectFilmHistoryById,\n  selectFilmHistoryIds\n} = filmHistorySlice.getSelectors()\n\nexport const {\n  updateFilmHistoryList\n} = filmHistorySlice.actions\n\nexport default filmHistorySlice.reducer\n","import uniqBy from 'lodash/uniqBy'\nimport { createSlice, createAsyncThunk } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { NFBStore } from '@src/js/redux/store'\nimport { WorkCard } from '@src/js/redux/worksReducer'\nimport { ERROR_MESSAGE } from '@src/js/constants'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\nexport interface FilmDirector {\n  first_name: string,\n  last_name: string,\n  slug: string\n}\n\nexport interface APIFilmsResponse {\n  items: WorkCard[],\n  meta: {\n    age_level_range: {\n      min?: number,\n      max?: number\n    },\n    media: {\n      original_url: string,\n      thumbnail_url: string\n    },\n    pagination: {\n      page: number,\n      pages: number,\n      size: number,\n      total: number\n    },\n    year_range: {\n      min?: number,\n      max?: number\n    },\n    letter_count: object\n  }\n}\n\nexport interface GetFilmsParams {\n  idList?: number[],\n  subset?: 'nfb/public' | 'gc/gc-films' | 'nfb/indigenous-films' | 'nfb/published',\n  subject_category?: 'general' | 'education' | 'indigenous',\n  sort?: string,\n  language?: string,\n  subject?: string,\n  size?: number,\n  page?: number,\n  age_level_min?: number,\n  age_level_max?: number,\n  year_min?: number,\n  year_max?: number,\n  title_letter?: string\n}\n\nexport interface FilmsState {\n  list: WorkCard[] | null,\n  status: 'idle' | 'loading' | 'succeeded' | 'failed',\n  thumbnailPattern: string,\n  currentFetchParams: GetFilmsParams | null,\n  ageRange: {min?: number, max?: number} | null,\n  countFilms: number | null,\n  apiError: string | null,\n  letterCount: object | null,\n  yearRange: {min?: number, max?: number} | null\n}\n\nconst initialState: FilmsState = {\n  list: null,\n  status: 'idle',\n  thumbnailPattern: '',\n  currentFetchParams: null,\n  ageRange: null,\n  countFilms: null,\n  apiError: null,\n  letterCount: null,\n  yearRange: null\n}\n\nexport const fetchFilms = createAsyncThunk<\nAPIFilmsResponse, GetFilmsParams\n>('films/fetchFilms', async ({ idList, sort, language, subset = 'nfb/public', size = 24, subject, subject_category, page, age_level_min, age_level_max, year_min, year_max, title_letter }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/films',\n    params: {\n      locale: window.LOCALE,\n      subset,\n      size,\n      page,\n      ...(idList?.length\n        ? {\n          registry_ids: idList.join(','),\n          size: idList.length\n        }\n        : {}),\n      ...(sort ? { sort } : {}),\n      ...(language ? { language } : {}),\n      ...(subject ? { subject } : {}),\n      ...(subject_category ? { subject_category } : {}),\n      ...(age_level_min ? { age_level_min } : {}),\n      ...(age_level_max ? { age_level_max } : {}),\n      ...(year_min ? { year_min } : {}),\n      ...(year_max ? { year_max } : {}),\n      ...(title_letter ? { title_letter } : {})\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  return await response.data\n}, {\n  condition: (getFilmsParams, { getState }) => {\n    // Don't trigger dispatch if film ids from\n    // params already exists in list, or if they\n    // exist in a fetch currently in progress\n\n    const state = (getState() as NFBStore).films\n    const ids = [\n      ...(state.currentFetchParams?.idList ?? []),\n      ...(state.list?.map((w: WorkCard) => w.id) ?? [])]\n\n    if (ids.length && getFilmsParams.idList) {\n      const diff = getFilmsParams.idList?.filter(i => !ids.includes(i))\n      return !!diff?.length\n    }\n\n    return true\n  }\n})\n\nexport const filmsSlice = createSlice({\n  name: 'films',\n  initialState,\n  reducers: {\n    resetFilmList: (state) => {\n      state.list = []\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchFilms.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentFetchParams = action.meta.arg\n      })\n      .addCase(fetchFilms.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.currentFetchParams = null\n        state.list = uniqBy([\n          ...(state.list ?? []),\n          ...action.payload.items\n        ], 'id')\n        state.thumbnailPattern = action.payload.meta.media.thumbnail_url\n        state.ageRange = action.payload.meta.age_level_range\n        state.countFilms = action.payload.meta.pagination.total\n        state.letterCount = action.payload.meta.letter_count\n        state.yearRange = action.payload.meta.year_range\n      })\n      .addCase(fetchFilms.rejected, (state, action) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport const { resetFilmList } = filmsSlice.actions\n\nexport default filmsSlice.reducer\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit'\n\nexport interface Filter {\n  language: string,\n  year_min: number,\n  year_max: number,\n  sort: string,\n  selectedLetter: string\n}\n\nexport interface Slider {\n  year_min: number,\n  year_max: number\n}\n\nexport interface IndigenousCinemaState {\n  currentPage: number,\n  selectedLetter: string | null,\n  filter: Filter | null,\n  sliderMinMax: Slider | null\n}\n\nconst initialState: IndigenousCinemaState = {\n  currentPage: 1,\n  selectedLetter: null,\n  filter: null,\n  sliderMinMax: null\n}\n\nexport const indigenousCinemaSlice = createSlice({\n  name: 'indigenousCinema',\n  initialState,\n  reducers: {\n    setSelectedLetter (state, action: PayloadAction<string|null>) {\n      state.selectedLetter = action.payload\n    },\n    setFilter (state, action: PayloadAction<Filter>) {\n      state.filter = action.payload\n    },\n    setSliderMinMax (state, action: PayloadAction<Slider>) {\n      state.sliderMinMax = action.payload\n    },\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    }\n  }\n})\n\nexport const {\n  setSelectedLetter, setFilter, setCurrentPage, setSliderMinMax\n} = indigenousCinemaSlice.actions\n\nexport default indigenousCinemaSlice.reducer\n","import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport { ApiV4Client } from '@src/js/ApiClient'\n\ninterface GetLikesApiResponse {\n  data: [{ registry_id: number }]\n}\n\nexport interface LikesState {\n  list: number[] | null\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  currentLoadingId: number | null\n}\n\nconst initialState: LikesState = {\n  list: null,\n  status: undefined,\n  currentLoadingId: null\n}\n\nconst apiV4Client = ApiV4Client.instance\n\nexport const fetchLikeByRegistryId = createAsyncThunk<\n  GetLikesApiResponse,\n  number\n>('likes/fetch', async (registryId: number) => {\n  const response = await apiV4Client.call({\n    method: 'GET',\n    url: '/likes/',\n    params: {\n      registry_id: registryId\n    }\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  return await response.data\n})\n\nexport const postLike = createAsyncThunk<\n  number | null,\n  number\n>('likes/add', async (registry_id: number): Promise<number|null> => {\n  const response = await apiV4Client.call({\n    method: 'POST',\n    url: `/likes/${registry_id}/`\n  })\n\n  return response.status === 201 ? registry_id : null\n})\n\nexport const deleteLike = createAsyncThunk<\n  number | null,\n  number\n>('likes/delete', async (registry_id: number): Promise<number | null> => {\n  const response = await apiV4Client.call({\n    method: 'DELETE',\n    url: `/likes/${registry_id}/`\n  })\n\n  return response.status === 204 ? registry_id : null\n})\n\nexport const likesSlice = createSlice({\n  name: 'likes',\n  initialState,\n  reducers: {\n    setLoadingItem: (state, action: PayloadAction<number|null>) => {\n      state.currentLoadingId = action.payload\n    }\n  },\n  extraReducers: (builder) => {\n    builder\n      .addCase(fetchLikeByRegistryId.pending, (state) => {\n        state.status = 'loading'\n        state.currentLoadingId = null\n      })\n      .addCase(fetchLikeByRegistryId.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload.data.map(i => i.registry_id)\n      })\n      .addCase(fetchLikeByRegistryId.rejected, (state) => {\n        state.status = 'failed'\n      })\n      .addCase(postLike.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentLoadingId = action.meta.arg\n      })\n      .addCase(postLike.fulfilled, (state, action: PayloadAction<number|null>) => {\n        state.status = 'succeeded'\n        state.currentLoadingId = null\n        if (state.list !== null && action.payload) {\n          state.list.unshift(action.payload)\n        }\n      })\n      .addCase(postLike.rejected, (state) => {\n        state.status = 'failed'\n      })\n      .addCase(deleteLike.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentLoadingId = action.meta.arg\n      })\n      .addCase(deleteLike.fulfilled, (state, action: PayloadAction<number|null>) => {\n        state.status = 'succeeded'\n        state.currentLoadingId = null\n        if (action.payload) {\n          state.list = state.list!.filter(b => b !== action.payload)\n        }\n      })\n      .addCase(deleteLike.rejected, (state) => {\n        state.status = 'failed'\n      })\n  },\n  selectors: {\n    selectIdIsLoading: (state: LikesState, id: number): boolean => {\n      return state.status === 'loading' && state.currentLoadingId === id\n    },\n    selectIdHasError: (state: LikesState, id: number): boolean => {\n      return state.status === 'failed' && state.currentLoadingId === id\n    },\n    selectIdIsLiked: (state: LikesState, id: number): boolean => {\n      return state.list !== null && state.list.includes(id)\n    }\n  }\n})\n\nexport const {\n  selectIdIsLiked,\n  selectIdIsLoading,\n  selectIdHasError\n} = likesSlice.getSelectors()\n\nexport default likesSlice.reducer\n","import { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { ERROR_MESSAGE } from '../constants'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\nexport interface NationInfo {\n  name?: string\n  slug?: string\n}\n\nexport interface APINationResponse {\n  items: NationInfo[],\n  meta: {\n    pagination: {\n      page: number,\n      pages: number,\n      size: number,\n      total: number\n    }\n  }\n}\n\nexport interface NationsState {\n  list: NationInfo[] | null,\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  apiError: string | null\n}\n\nconst initialState: NationsState = {\n  list: null,\n  status: undefined,\n  apiError: null\n}\n\nexport const fetchNationList = createAsyncThunk<\nAPINationResponse, void\n>('nations/fetchNationList', async () => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/nations',\n    params: {\n      locale: window.LOCALE\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n})\n\nexport const nationsSlice = createSlice({\n  name: 'nations',\n  initialState,\n  reducers: {\n    updateList (state: NationsState, action: PayloadAction<{items: NationInfo[]}>) {\n      const tempList = [\n        { name: window.pgettext('indigenous-cinema', 'All nations/people'), slug: 'all_nations' },\n        ...action.payload.items\n      ]\n\n      state.list = tempList\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchNationList.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchNationList.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        nationsSlice.caseReducers.updateList(state, action)\n      })\n      .addCase(fetchNationList.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport default nationsSlice.reducer\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { PlayerOptions } from '@src/js/types/Player'\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { ThunkAPI } from '@src/js/redux/store'\n\nexport enum PlayerError {\n  NO_SLUG_OR_STREAM_TYPE = 'no-slug-or-stream-type',\n  NO_PLAYER_OPTIONS = 'no-player-options',\n  NO_SOURCE = 'no-source',\n  VIDEO_JS = 'video-js',\n  GEOBLOCKED = 'geoblocked',\n  GENERIC = 'generic',\n}\n\nexport type StreamTypes =\n  | 'films' | 'trailers' | 'making_ofs' | 'clips' | 'interviews'\n  | 'promo_clips' | 'education_exclusives'\n\ninterface StreamData {\n  hls: string\n  hls_dv: string | undefined\n}\n\nexport interface StreamFetchResponse {\n  registryId: number\n  slug: string,\n  streamType: StreamTypes\n  source: string | undefined\n  dvSource: string | undefined\n}\n\n// We need this 3 infos to identify player\n// Extras work have the same registry id as the main work\nexport interface PlayerUniqId {\n  registryId: number,\n  slug: string,\n  streamType: StreamTypes,\n  isExtra?: boolean\n}\n\nexport interface PlayerOptionsList {\n  [key: string]: PlayerOptions\n}\n\nexport interface PlayersState {\n  // Player options retrieve with window.PLAYER_OPTIONS\n  playerOptionsList: PlayerOptionsList|null,\n  queue: number[],\n  currentPlaying: PlayerUniqId|null,\n  currentError: PlayerError|null,\n  isLoading: boolean,\n  nextIdReturnedByAPI: number|null\n}\n\nconst initialState: PlayersState = {\n  playerOptionsList: null,\n  queue: [],\n  currentPlaying: null,\n  currentError: null,\n  isLoading: true,\n  nextIdReturnedByAPI: null\n}\n\nconst apiV4Client = ApiV4Client.instance\n\nexport const fetchStream = createAsyncThunk<\n  StreamFetchResponse, PlayerUniqId, ThunkAPI\n>('players/fetchStream', async ({ registryId, slug, streamType }) => {\n  let streamData: StreamData | null = null\n  const streamResponse: AxiosResponse = await apiV4Client.call({\n    method: 'GET',\n    url: `${streamType}/${slug}/stream`\n  })\n\n  if (streamResponse.status === 200) {\n    streamData = await streamResponse.data\n  }\n\n  return {\n    registryId,\n    slug,\n    streamType,\n    source: streamData?.hls,\n    dvSource: streamData?.hls_dv\n  }\n})\n\nexport const playersSlice = createSlice({\n  name: 'players',\n  initialState,\n  reducers: {\n    addToPlayerOptionsList (state: PlayersState, action: PayloadAction<PlayerOptionsList|null>) {\n      state.playerOptionsList = {\n        ...(state.playerOptionsList ?? {}),\n        ...action.payload\n      }\n    },\n    setQueue (state: PlayersState, action: PayloadAction<number[]>) {\n      state.queue = action.payload\n    },\n    setCurrentPlaying (state: PlayersState, action: PayloadAction<PlayerUniqId|null>) {\n      state.currentPlaying = action.payload\n    },\n    setCurrentError (state: PlayersState, action: PayloadAction<PlayerError|null>) {\n      state.currentError = action.payload\n    },\n    setIsLoading (state: PlayersState, action: PayloadAction<boolean>) {\n      state.isLoading = action.payload\n    },\n    setNextIdReturnedByAPI (state: PlayersState, action: PayloadAction<number|null>) {\n      state.nextIdReturnedByAPI = action.payload\n    },\n    // Modify player options: currently only used in Cypress tests\n    modifyPlayerOptions (state, action: PayloadAction<Record<number, PlayerOptions>>) {\n      const id = parseInt(Object.keys(action.payload)[0])\n      const existingOptions = state.playerOptionsList && id in state.playerOptionsList\n        ? state.playerOptionsList[id]\n        : {}\n      const options = {\n        ...existingOptions,\n        ...action.payload[id]\n      }\n      state.playerOptionsList = {\n        ...(state.playerOptionsList ?? {}),\n        [id]: options\n      }\n    },\n    // Invalidate stream data: currently only used in Cypress tests\n    invalidateStreamDataForWork (state, action: PayloadAction<number>) {\n      const registryId = action.payload\n      if (state.playerOptionsList && registryId in state.playerOptionsList) {\n        state.playerOptionsList[registryId] = {\n          ...state.playerOptionsList[registryId],\n          source: '',\n          dvSource: ''\n        }\n      }\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchStream.fulfilled, (state: PlayersState, action: PayloadAction<StreamFetchResponse>) => {\n        const { registryId, source, dvSource } = action.payload\n\n        // Add source to player options\n        if (source && state.playerOptionsList && state.playerOptionsList[registryId]) {\n          state.playerOptionsList[registryId] = {\n            ...state.playerOptionsList[registryId],\n            source,\n            dvSource\n          }\n        }\n      })\n  },\n  selectors: {\n    selectPlayerOptionsByRegistryId (state: PlayersState, registryId: number) {\n      if (!state.playerOptionsList) { return null }\n\n      return state.playerOptionsList[registryId]\n    },\n    selectNextInQueue: (state: PlayersState, currentRegistryId: number) => {\n      if (state.nextIdReturnedByAPI) {\n        return state.nextIdReturnedByAPI\n      }\n\n      let next\n      const indexOfCurrent = state.queue.indexOf(currentRegistryId)\n      const indexOfNext = indexOfCurrent + 1\n      if (indexOfNext > state.queue.length - 1) {\n        next = state.queue[0]\n      } else {\n        next = state.queue[indexOfNext]\n      }\n      return next\n    }\n  }\n})\n\nexport const {\n  selectPlayerOptionsByRegistryId,\n  selectNextInQueue\n} = playersSlice.getSelectors()\n\nexport const {\n  addToPlayerOptionsList,\n  setQueue,\n  setCurrentPlaying,\n  setCurrentError,\n  setIsLoading,\n  setNextIdReturnedByAPI,\n  modifyPlayerOptions,\n  invalidateStreamDataForWork\n} = playersSlice.actions\n\nexport default playersSlice.reducer\n","import { createAsyncThunk, createSlice, PayloadAction } from '@reduxjs/toolkit'\nimport uniqBy from 'lodash/uniqBy'\n\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { ThunkAPI } from '@src/js/redux/store'\n\nconst apiV4Client = ApiV4Client.instance\n\nexport interface Playlist {\n  url: string,\n  slug: string,\n  title: string,\n  description: string,\n  thumbnails: string[],\n  thumbnail_mode: string\n}\n\nexport interface PlaylistTab {\n  slug: string,\n  items: Playlist[]\n}\n\nexport interface PlaylistTabsState {\n  list: PlaylistTab[]\n  status: undefined | 'loading' | 'succeeded' | 'failed'\n  currentLoadingSlug: string | undefined\n  thumbnailPattern: string\n}\n\nconst initialState: PlaylistTabsState = {\n  list: [],\n  status: undefined,\n  currentLoadingSlug: undefined,\n  thumbnailPattern: window.THUMBNAIL_PATTERN\n}\n\nexport const fetchPlaylistTab = createAsyncThunk<\n  PlaylistTab,\n  string,\n  ThunkAPI\n>('playlistTabs/fetchBySlug', async (slug, ThunkAPI) => {\n  const response = await apiV4Client.call({\n    method: 'GET',\n    url: `/playlist_tabs/${slug}/playlists`,\n    params: {\n      per_page: 70\n    }\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  const data = await response.data\n\n  ThunkAPI.dispatch(playlistTabsSlice.actions.setThumbnailPattern(data.meta.mixed_media.thumbnail_url))\n\n  const items = data.data\n\n  return {\n    slug,\n    items\n  }\n})\n\nexport const playlistTabsSlice = createSlice({\n  name: 'playlistTabs',\n  initialState,\n  reducers: {\n    setCurrentLoadingSlug: (state: PlaylistTabsState, action: PayloadAction<string>) => {\n      state.currentLoadingSlug = action.payload\n    },\n    setThumbnailPattern: (state: PlaylistTabsState, action: PayloadAction<string>) => {\n      state.thumbnailPattern = action.payload\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchPlaylistTab.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchPlaylistTab.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        const tempList = uniqBy([\n          action.payload,\n          ...state.list\n        ], 'slug')\n\n        state.list = tempList\n      })\n      .addCase(fetchPlaylistTab.rejected, (state) => {\n        state.status = 'failed'\n      })\n  },\n  selectors: {\n    selectBySlug: (state: PlaylistTabsState, slug: string): PlaylistTab | null => {\n      return state.list.find(item => item.slug === slug) ?? null\n    }\n  }\n})\nexport const {\n  selectBySlug\n} = playlistTabsSlice.getSelectors()\n\nexport default playlistTabsSlice.reducer\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { DEFAULT_LIST_LENGTH } from '@src/js/constants'\n\nconst apiV4Client = ApiV4Client.instance\n\nexport interface RecommendationsState {\n  list: number[] | undefined\n  status: 'idle' | 'loading' | 'succeeded' | 'failed'\n}\n\nconst initialState: RecommendationsState = {\n  list: undefined,\n  status: 'idle'\n}\n\nexport interface GetRecommendationsParams {\n  slug: string,\n  workType: string\n}\n\nexport const fetchRecommendations = createAsyncThunk<\n  number[], GetRecommendationsParams\n>('recommendations/fetch', async ({ slug, workType }) => {\n  const recommendationsResponse = await apiV4Client.call({\n    method: 'GET',\n    url: `${workType}/${slug}/recommendations`,\n    params: {\n      size: DEFAULT_LIST_LENGTH + 1\n    }\n  })\n\n  const ids = (await recommendationsResponse.data).data.map((item: any) => item.registry_id)\n  return ids\n})\n\nexport const recommendationsSlice = createSlice({\n  name: 'recommendations',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder\n      .addCase(fetchRecommendations.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchRecommendations.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload ?? []\n      })\n      .addCase(fetchRecommendations.rejected, (state) => {\n        state.status = 'failed'\n      })\n  },\n  selectors: {\n    selectRecommendationsIds: (state: RecommendationsState) => {\n      return state.list\n    }\n  }\n})\n\nexport const {\n  selectRecommendationsIds\n} = recommendationsSlice.getSelectors()\n\nexport default recommendationsSlice.reducer\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { WorkCard, addWorkToList, fetchWorks } from '@src/js/redux/worksReducer'\nimport { store, ThunkAPI } from '@src/js/redux/store'\nimport { setQueue } from '@src/js/redux/playersReducer'\nimport { selectFilmHistoryById } from '@src/js/redux/filmHistoryReducer'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\nconst API_ENDPOINT_FOR_TYPE = {\n  collection: 'collections',\n  series: 'series'\n}\n\nexport type Season = {\n  id: number\n  slug: string\n  title: string\n  number: number\n  year: number\n  episodes: WorkCard[]\n}\n\nexport type SeriesCard = {\n  seasons: Season[]\n} & WorkCard\n\nexport interface SeriesApiResponse {\n  item: SeriesCard\n}\n\ntype EpisodesList = Record<number, number[]>\n\nexport interface SeriesPageState {\n  seriesRegistryId: number | null\n  seriesSlug: string | null\n  seriesType: string | null\n  displayedSeasonNumber: number | null\n  displayedSeasonTitle: string | null\n  seasonList: Season[]\n  episodesList: EpisodesList,\n  allEpisodeIdList: number[],\n}\n\nconst initialState: SeriesPageState = {\n  seriesRegistryId: null,\n  seriesSlug: null,\n  seriesType: null,\n  displayedSeasonNumber: null,\n  displayedSeasonTitle: null,\n  seasonList: [],\n  episodesList: {},\n  allEpisodeIdList: []\n}\n\nexport const fetchSeries = createAsyncThunk<\n  SeriesApiResponse, void, ThunkAPI\n>('seriesPage/fetchSeries', async (_, thunkAPI) => {\n  const state = thunkAPI.getState().seriesPage\n\n  const seriesEndpoint = state.seriesType\n    ? API_ENDPOINT_FOR_TYPE[state.seriesType as keyof typeof API_ENDPOINT_FOR_TYPE]\n    : API_ENDPOINT_FOR_TYPE.series\n\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: `/${seriesEndpoint}/${state.seriesSlug}`\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  const seriesData = await response.data as SeriesApiResponse\n  thunkAPI.dispatch(addWorkToList([seriesData.item]))\n\n  const seasons: Season[] = seriesData.item.seasons\n  const episodesList: EpisodesList = {}\n  const episodesIdsList: number[] = []\n  seasons.forEach(s => {\n    const idsList = s.episodes.map(e => e.id)\n    episodesList[s.number] = idsList\n    episodesIdsList.push(...idsList)\n  })\n\n  thunkAPI.dispatch(setEpisodesList(episodesList))\n  thunkAPI.dispatch(setAllEpisodeIdList(episodesIdsList))\n  await thunkAPI.dispatch(fetchWorks({ idList: episodesIdsList }))\n\n  if (seriesData.item.category === 'collection') {\n    const reversesSeasons = [...seasons].reverse()\n    const reverseEpisodesList = reversesSeasons.map(s => s.episodes.map(e => e.id)).flat()\n    thunkAPI.dispatch(setQueue(reverseEpisodesList))\n    thunkAPI.dispatch(setSeasonList(reversesSeasons))\n  } else {\n    thunkAPI.dispatch(setQueue(episodesIdsList))\n    thunkAPI.dispatch(setSeasonList(seasons))\n  }\n\n  return seriesData\n})\n\nexport const seriesPageSlice = createSlice({\n  name: 'seriesPage',\n  initialState,\n  reducers: {\n    initSeries (state) {\n      state.seriesRegistryId = window.SERIES_ID\n      state.seriesSlug = window.SERIES_SLUG\n      state.seriesType = window.SERIES_TYPE\n      state.displayedSeasonNumber = parseInt(window.SEASON_NUMBER)\n      state.displayedSeasonTitle = window.SEASON_TITLE\n    },\n    setDisplayedSeasonNumber (state, action) {\n      state.displayedSeasonNumber = action.payload\n    },\n    setDisplayedSeasonTitle (state, action) {\n      state.displayedSeasonTitle = action.payload\n    },\n    setSeasonList (state, action) {\n      state.seasonList = action.payload\n      // when seasonList is updated,\n      // check if displayedSeasonNumber is valid\n      // otherwhise, take the first season's number\n      if (state.displayedSeasonNumber) {\n        const validSeason = (state.displayedSeasonNumber in state.episodesList)\n        if (!validSeason) {\n          state.displayedSeasonNumber = state.seasonList[0].number\n          state.displayedSeasonTitle = state.seasonList[0].title\n        }\n      }\n    },\n    setEpisodesList (state, action) {\n      state.episodesList = action.payload\n    },\n    setAllEpisodeIdList (state, action) {\n      state.allEpisodeIdList = action.payload\n    }\n  },\n  selectors: {\n    selectCurrentEpisodesList: (state) => {\n      const currentSeason = state.displayedSeasonNumber\n      if (!currentSeason || !(currentSeason in state.episodesList)) return null\n\n      return state.episodesList[currentSeason]\n    },\n    selectSeriesIsCompleted: (state) => {\n      let allCompleted = true\n      state.allEpisodeIdList?.some(registryId => {\n        const filmHistory = selectFilmHistoryById(store.getState().filmHistory, registryId)\n\n        // If no history found, episode/film not started\n        if (!filmHistory || filmHistory.is_completed === false) {\n          allCompleted = false\n          return true\n        }\n\n        return false\n      })\n\n      return allCompleted\n    }\n  }\n})\n\nexport const {\n  initSeries,\n  setDisplayedSeasonNumber,\n  setDisplayedSeasonTitle,\n  setSeasonList,\n  setEpisodesList,\n  setAllEpisodeIdList\n} = seriesPageSlice.actions\n\nexport const {\n  selectCurrentEpisodesList,\n  selectSeriesIsCompleted\n} = seriesPageSlice.getSelectors()\n\nexport default seriesPageSlice.reducer\n","import { PayloadAction } from '@reduxjs/toolkit'\n\nimport rootStore from '@web-nfb/workshop-frontend/src/store'\nimport { FilmHistory, updateFilmHistoryList } from '@src/js/redux/filmHistoryReducer'\n\nconst historyMiddleware = (store: typeof rootStore) => (next: (action: PayloadAction<FilmHistory>) => void) => async (action: PayloadAction<FilmHistory>) => {\n  if (action.type.match(/workHistory\\/post\\/fulfilled/)) {\n    // Before saving to work history, we want to save item in film history\n    store.dispatch(updateFilmHistoryList({ data: [action.payload] }))\n  }\n  next(action)\n}\n\nexport default historyMiddleware\n","import { PayloadAction } from '@reduxjs/toolkit'\nimport { setDisplayedSeasonNumber, setDisplayedSeasonTitle, Season } from '@src/js/redux/seriesPageReducer'\n\nconst seriesMiddleware = (store: any) => (next: any) => async (action: PayloadAction<any>) => {\n  if (action.type.match('workPage/setDisplayedRegistryId/fulfilled')) {\n    const seriesPageState = store.getState().seriesPage\n    // When changing displayed registry id, also change displayed season in episodes list if necessary.\n    const registryId = action.payload as number\n    let seasonNumber: string | null = null\n\n    const episodesListEntries = Object.entries(seriesPageState.episodesList)\n    for (const [number, list] of episodesListEntries) {\n      if ((list as number[]).includes((registryId))) {\n        seasonNumber = number\n        break\n      }\n    }\n\n    if (seasonNumber && seriesPageState.displayedSeasonNumber !== seasonNumber) {\n      const seasonNumberInt = parseInt(seasonNumber)\n      const seasonTitle = seriesPageState.seasonList.find((season: Season) => season.number === seasonNumberInt).title\n      store.dispatch(setDisplayedSeasonNumber(seasonNumberInt))\n      store.dispatch(setDisplayedSeasonTitle(seasonTitle))\n    }\n    next(action)\n  } else {\n    next(action)\n  }\n}\n\nexport default seriesMiddleware\n","import { PayloadAction } from '@reduxjs/toolkit'\n\nimport { selectWorkById, WorkCard } from '@src/js/redux/worksReducer'\nimport { setDisplayedWork } from '@src/js/redux/workPageReducer'\n\nconst workPageWiddleware = (store: any) => (next: any) => async (action: PayloadAction<any>) => {\n  if (action.type.match('workPage/setDisplayedRegistryId/fulfilled')) {\n    // When changing displayed registry id, update displayed work if found.\n    const registryId = action.payload as number\n    const work: WorkCard | null = selectWorkById(store.getState().works, registryId)\n    if (work) {\n      store.dispatch(setDisplayedWork(work))\n    }\n    next(action)\n  } else {\n    next(action)\n  }\n}\n\nexport default workPageWiddleware\n","import { configureStore } from '@reduxjs/toolkit'\n\nimport bookmarksReducer, { BookmarksState } from '@src/js/redux/bookmarksReducer'\nimport workHistoryReducer, { WorkHistoryState } from '@src/js/redux/workHistoryReducer'\nimport worksReducer, { WorksState } from '@src/js/redux/worksReducer'\nimport filmHistoryReducer, { FilmHistoryState } from '@src/js/redux/filmHistoryReducer'\nimport workPageReducer, { WorkPageState } from '@src/js/redux/workPageReducer'\nimport seriesPageReducer, { SeriesPageState } from '@src/js/redux/seriesPageReducer'\nimport playersReducer, { PlayersState } from '@src/js/redux/playersReducer'\nimport recommendationsReducer, { RecommendationsState } from '@src/js/redux/recommendationsReducer'\nimport userReducer, { UserState } from '@src/js/redux/userReducer'\nimport channelsReducer, { ChannelsState } from '@src/js/redux/channelsReducer'\nimport viewingHistoryReducer, { ViewingHistoryState } from '@src/js/redux/viewingHistoryReducer'\nimport subjectsReducer, { SubjectsState } from '@src/js/redux/subjectsReducer'\nimport indigenousCinemaReducer, { IndigenousCinemaState } from '@src/js/redux/indigenousCinemaReducer'\nimport nationsReducer, { NationsState } from '@src/js/redux/nationsReducer'\nimport directorsReducer, { DirectorsState } from '@src/js/redux/directorsReducer'\nimport filmsReducer, { FilmsState } from '@src/js/redux/filmsReducer'\nimport educationalSubjectPageReducer, { EducationalSubjectPageState } from '@src/js/redux/educationalSubjectPageReducer'\nimport likesReducer, { LikesState } from '@src/js/redux/likesReducer'\nimport playlistTabsReducer, { PlaylistTabsState } from '@src/js/redux//playlistTabsReducer'\nimport animatedHoverCardReducer, { AnimatedHoverCardState } from '@src/js/redux/animatedHoverCardReducer'\nimport carouselReducer, { CarouselState } from '@src/js/redux/carouselReducer'\nimport exploreBySubjectReducer, { ExploreBySubjectState } from '@src/js/redux/exploreBySubjectReducer'\nimport directorsPageReducer, { DirectorsPageState } from '@src/js/redux/directorsPageReducer'\nimport exploreByWorkPageReducer, { ExploreByWorkPageState } from '@src/js/redux/exploreByWorkPageReducer'\n\nimport historyMiddleware from '@src/js/redux/historyMiddleware'\nimport seriesMiddleware from '@src/js/redux/seriesMiddleware'\nimport workPageWiddleware from '@src/js/redux/workPageMiddleware'\n\nexport type NFBStore = {\n  bookmarks: BookmarksState\n  channels: ChannelsState\n  filmHistory: FilmHistoryState\n  players: PlayersState\n  recommendations: RecommendationsState\n  seriesPage: SeriesPageState\n  workHistory: WorkHistoryState\n  workPage: WorkPageState\n  user: UserState\n  works: WorksState\n  viewingHistory: ViewingHistoryState\n  subjects: SubjectsState\n  indigenousCinema: IndigenousCinemaState\n  directors: DirectorsState\n  nations: NationsState\n  films: FilmsState\n  educationalSubjectPage: EducationalSubjectPageState\n  likes: LikesState\n  playlistTabs: PlaylistTabsState\n  animatedHoverCard: AnimatedHoverCardState\n  carousel: CarouselState\n  exploreBySubject: ExploreBySubjectState\n  directorsPage: DirectorsPageState,\n  exploreByWorkPage: ExploreByWorkPageState\n}\n\nexport const store = configureStore({\n  reducer: {\n    bookmarks: bookmarksReducer,\n    channels: channelsReducer,\n    filmHistory: filmHistoryReducer,\n    players: playersReducer,\n    recommendations: recommendationsReducer,\n    seriesPage: seriesPageReducer,\n    workHistory: workHistoryReducer,\n    workPage: workPageReducer,\n    user: userReducer,\n    works: worksReducer,\n    viewingHistory: viewingHistoryReducer,\n    subjects: subjectsReducer,\n    indigenousCinema: indigenousCinemaReducer,\n    directors: directorsReducer,\n    nations: nationsReducer,\n    films: filmsReducer,\n    educationalSubjectPage: educationalSubjectPageReducer,\n    likes: likesReducer,\n    playlistTabs: playlistTabsReducer,\n    animatedHoverCard: animatedHoverCardReducer,\n    carousel: carouselReducer,\n    exploreBySubject: exploreBySubjectReducer,\n    directorsPage: directorsPageReducer,\n    exploreByWorkPage: exploreByWorkPageReducer\n  },\n  // @ts-expect-error The expected type comes from property 'middleware' which is declared here on type 'ConfigureStoreOptions'\n  middleware: (getDefaultMiddleware) => {\n    return getDefaultMiddleware().concat(\n      historyMiddleware,\n      seriesMiddleware,\n      workPageWiddleware\n    )\n  }\n})\n\nexport type RootState = ReturnType<typeof store.getState>\nexport type AppDispatch = typeof store.dispatch\nexport type ThunkAPI = {\n  dispatch: AppDispatch,\n  state: RootState\n}\n\nif (window.Cypress) {\n  window.redux = store\n}\n","import { createSlice, createAsyncThunk } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { ERROR_MESSAGE } from '../constants'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\ntype SubjectsCategory = 'general' | 'education' | 'indigenous'\n\nexport interface SubjectInfo {\n  name?: string\n  slug?: string\n  category_type?: string\n}\n\nexport interface SubjectDetailInfo {\n  name?: string\n  slug?: string\n  children?: SubjectInfo[]\n}\n\nexport interface APISubjectsResponse {\n  items: SubjectInfo[],\n  meta: {\n    pagination: {\n      page: number,\n      pages: number,\n      size: number,\n      total: number\n    }\n  }\n}\n\nexport interface APISubjectsBySlugResponse {\n  item: SubjectDetailInfo\n}\n\nexport interface GetSubjectsParams {\n  category_type?: SubjectsCategory,\n  page?: number,\n  size?: number\n}\n\nexport interface GetSubjectsBySlugParams {\n  category_type?: SubjectsCategory,\n  slug?: string,\n}\n\nexport interface GetSubjectsByChildParams {\n  category_type?: SubjectsCategory,\n  slug?: string,\n  childSlug?: string\n}\n\nexport interface SubjectsState {\n  list: SubjectInfo[] | null,\n  status: undefined | 'loading' | 'succeeded' | 'failed',\n  subjectBySlugDetail: SubjectDetailInfo | null,\n  subjectDetail: SubjectInfo | null,\n  apiError: string | null\n}\n\nconst initialState: SubjectsState = {\n  list: null,\n  status: undefined,\n  subjectBySlugDetail: null,\n  subjectDetail: null,\n  apiError: null\n}\n\nexport const fetchSubjectList = createAsyncThunk<\n  APISubjectsResponse, GetSubjectsParams\n>('subjects/fetchSubjectList', async ({ category_type, page, size }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/subjects',\n    params: {\n      category_type,\n      page,\n      locale: window.LOCALE,\n      size\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n})\n\nexport const fetchSubjectBySlug = createAsyncThunk<\nAPISubjectsBySlugResponse, GetSubjectsBySlugParams\n>('subjects/fetchSubjectBySlug', async ({ slug, category_type }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: `/subjects/${slug}`,\n    params: {\n      category_type,\n      locale: window.LOCALE\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n})\n\nexport const fetchSubjectByChildSlug = createAsyncThunk<\nAPISubjectsBySlugResponse, GetSubjectsByChildParams\n>('subjects/fetchSubjectByChildSlug', async ({ slug, childSlug, category_type }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: `/subjects/${slug}/children/${childSlug}`,\n    params: {\n      category_type,\n      locale: window.LOCALE\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n  return await response.data\n})\n\nexport const subjectsSlice = createSlice({\n  name: 'subjects',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder\n      .addCase(fetchSubjectList.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchSubjectList.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.list = action.payload.items\n      })\n      .addCase(fetchSubjectList.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n      .addCase(fetchSubjectBySlug.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchSubjectBySlug.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.subjectBySlugDetail = action.payload.item\n      })\n      .addCase(fetchSubjectBySlug.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n      .addCase(fetchSubjectByChildSlug.pending, (state) => {\n        state.status = 'loading'\n      })\n      .addCase(fetchSubjectByChildSlug.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.subjectDetail = action.payload.item\n      })\n      .addCase(fetchSubjectByChildSlug.rejected, (state) => {\n        state.status = 'failed'\n        state.apiError = ERROR_MESSAGE.API_ERROR\n      })\n  }\n})\n\nexport default subjectsSlice.reducer\n","import { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\n\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { WorkCard, fetchWorks } from '@src/js/redux/worksReducer'\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { DEFAULT_LIST_LENGTH } from '@src/js/constants'\n\nconst apiV4Client = ApiV4Client.instance\n\ninterface Rental {\n  registry_id: number\n  expiration: number\n}\n\nexport interface UserState {\n  isConnected: boolean\n  rentals: Rental[],\n  recommendations: number[]\n}\n\nconst initialState: UserState = {\n  isConnected: window.USER_CONNECTED,\n  rentals: [],\n  recommendations: []\n}\n\nexport interface GetRentalsParams {\n  include_expired?: boolean,\n}\n\nexport const fetchRentals = createAsyncThunk<\n  Rental[], GetRentalsParams, ThunkAPI\n>('user/fetchRentals', async ({ include_expired = true }, thunkAPI) => {\n  if (thunkAPI.getState().user.isConnected) {\n    const response = await apiV4Client.call({\n      method: 'GET',\n      url: '/rentals',\n      params: {\n        include_expired\n      }\n    })\n\n    const idsList = await response.data.data.map((r: any) => r.registry_id)\n    await thunkAPI.dispatch(fetchWorks({ idList: idsList }))\n\n    return (await response.data).data\n  }\n\n  return []\n})\n\nexport const fetchUserRecommendations = createAsyncThunk<\n  number[], number, ThunkAPI\n>('user/fetchRecommendations', async (size = DEFAULT_LIST_LENGTH, thunkAPI) => {\n  if (thunkAPI.getState().user.isConnected) {\n    const response = await apiV4Client.call({\n      method: 'GET',\n      url: '/recommendations',\n      params: {\n        size,\n        language: window.LOCALE\n      }\n    })\n\n    return (await response.data).data\n  }\n\n  return []\n})\n\nexport const userSlice = createSlice({\n  name: 'user',\n  initialState,\n  reducers: {},\n  extraReducers: builder => {\n    builder.addCase(fetchRentals.fulfilled, (state, action) => {\n      state.rentals = action.payload\n    })\n    builder.addCase(fetchUserRecommendations.fulfilled, (state, action) => {\n      state.recommendations = action.payload\n    })\n  },\n  selectors: {\n    selectActiveRentalForWork: (state: UserState, work: WorkCard) => {\n      return state.rentals.find(r => r.registry_id === work.id)\n    },\n    selectUserRecommendationsIds: (state: UserState) => {\n      return state.recommendations\n    }\n  }\n})\n\nexport const {\n  selectActiveRentalForWork,\n  selectUserRecommendationsIds\n} = userSlice.getSelectors()\n\nexport default userSlice.reducer\n","import { createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\n\nexport interface ViewingHistoryState {\n  currentPage: number,\n  isDeleting: boolean\n}\n\nconst initialState: ViewingHistoryState = {\n  currentPage: 1,\n  isDeleting: false\n}\n\nexport const viewingHistorySlice = createSlice({\n  name: 'viewingHistory',\n  initialState,\n  reducers: {\n    setCurrentPage (state, action: PayloadAction<number>) {\n      state.currentPage = action.payload\n    },\n    setIsDeleting (state, action: PayloadAction<boolean>) {\n      state.isDeleting = action.payload\n    }\n  }\n})\n\nexport const {\n  setCurrentPage,\n  setIsDeleting\n} = viewingHistorySlice.actions\n\nexport default viewingHistorySlice.reducer\n","/**\n * Work history used for continue watching carrousel or history listing.\n * We only want history information about the \"main\" work for series/collections\n */\nimport { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport uniqBy from 'lodash/uniqBy'\nimport uniq from 'lodash/uniq'\nimport { ApiV4Client } from '@src/js/ApiClient'\nimport { ThunkAPI } from '@src/js/redux/store'\n\nimport { FilmHistory, updateFilmHistoryList } from '@src/js/redux/filmHistoryReducer'\nimport { setNextIdReturnedByAPI } from '@src/js/redux/playersReducer'\nimport { fetchAllFromSessionStorage, postSessionStorage } from '@src/js/helpers/sessionStorage'\nimport { sortByTimestamp } from '@src/js/helpers/sort'\nimport { DEFAULT_LIST_LENGTH } from '@src/js/constants'\nimport { cookiesAreEnabled } from '@src/js/helpers/cookies'\n\nconst SESSION_WORK_HISTORY_KEY = 'nfb_session_work_history'\nconst apiV4Client = ApiV4Client.instance\n\nexport interface WorkHistory extends FilmHistory {\n  work?: { // only for series/collection type\n    is_completed?: boolean\n    registry_id: number,\n  }\n}\n\nexport interface UpdateWorkHistoryResponse {\n  code: string,\n  message: string\n}\n\nexport interface GetWatchHistoryParams {\n  is_completed?: boolean,\n  registry_id?: number,\n  per_page?: number,\n  page?: number\n}\n\nexport interface WorkHistoryState {\n  list: WorkHistory[],\n  continueWatchingList: WorkHistory[],\n  countContinueWatching: number,\n  countWatchHistory: number\n  status: undefined | 'idle' | 'loading' | 'succeeded' | 'failed'\n}\n\nexport interface WorkHistoryReturnParams {\n  data: WorkHistory[],\n  count: number,\n}\n\nexport const fetchAllFromApi = async (params: GetWatchHistoryParams) => {\n  const response = await apiV4Client.call({\n    method: 'GET',\n    url: '/watch_history/works',\n    params\n  })\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  return await response.data\n}\n\nexport const fetchAll = createAsyncThunk<\n  WorkHistoryReturnParams,\n  GetWatchHistoryParams,\n  ThunkAPI\n  >('workHistory/fetchAll', async ({ per_page = DEFAULT_LIST_LENGTH, is_completed, registry_id, page }, thunkAPI) => {\n    if (window.USER_CONNECTED) {\n      // user has data in session storage ?\n      // we need to sync\n      await postSessionStorage(SESSION_WORK_HISTORY_KEY, thunkAPI)\n\n      return await fetchAllFromApi({ per_page, is_completed, page, registry_id })\n    } else {\n      let sessionHistory = fetchAllFromSessionStorage(SESSION_WORK_HISTORY_KEY)\n      if (registry_id) {\n        const filteredSessionHistory = sessionHistory.data.filter((f: WorkHistory) => f.work && registry_id === f.work.registry_id)\n        sessionHistory = {\n          data: filteredSessionHistory,\n          count: filteredSessionHistory.length\n        }\n      }\n      return sessionHistory\n    }\n  })\n\nexport const fetchAllContinueWatching = createAsyncThunk<\n  WorkHistoryReturnParams,\n  void,\n  ThunkAPI\n  >('workHistory/fetchAllContinueWatching', async (_, thunkAPI) => {\n    if (window.USER_CONNECTED) {\n      await postSessionStorage(SESSION_WORK_HISTORY_KEY, thunkAPI)\n      // Fetch one more than default list length to trigger see more card behavior if necessary.\n      return await fetchAllFromApi({ is_completed: false, per_page: DEFAULT_LIST_LENGTH + 1 })\n    } else {\n      return []\n    }\n  })\n\nexport const postHistory = createAsyncThunk<\nWorkHistory, WorkHistory, ThunkAPI\n>('workHistory/post', async (history, thunkAPI) => {\n  if (!history.timestamp) {\n    history.timestamp = Date.now()\n  }\n\n  if (window.USER_CONNECTED) {\n    const response = await apiV4Client.call({\n      method: 'POST',\n      url: '/watch_history/works',\n      data: history\n    })\n\n    if (response.status !== 200) {\n      throw new Error(`Response status: ${response.status}`)\n    }\n\n    const returnedHistory = (await response.data).data\n\n    // Only for series/collection\n    if (history.work?.registry_id !== history.registry_id) {\n      // Next item sent by API\n      if (returnedHistory.registry_id !== history.registry_id) {\n        // Current is ended\n        history.is_completed = true\n        // Parent work could be completed to\n        history.work = returnedHistory.work\n        // Save next in store\n        thunkAPI.dispatch(setNextIdReturnedByAPI(returnedHistory.registry_id))\n        // Save current completed in film history\n        thunkAPI.dispatch(updateFilmHistoryList({ data: [history] }))\n      }\n    }\n\n    return returnedHistory\n  } else {\n    history.is_completed = history.percent >= 95\n\n    return history\n  }\n})\n\nconst initialState: WorkHistoryState = {\n  list: fetchAllFromSessionStorage(SESSION_WORK_HISTORY_KEY).data ?? [],\n  continueWatchingList: [],\n  countContinueWatching: 0,\n  countWatchHistory: 0,\n  status: undefined\n}\n\nexport const workHistorySlice = createSlice({\n  name: 'workHistory',\n  initialState,\n  reducers: {\n    updateList (state: WorkHistoryState, action: PayloadAction<{data: WorkHistory[]}>) {\n      // Work history should return only one film by work id\n      const tempList = uniqBy([\n        ...action.payload.data,\n        ...state.list\n      ], 'work.registry_id')\n\n      state.list = tempList.sort(sortByTimestamp)\n\n      // Record in local storage\n      if (!window.USER_CONNECTED && cookiesAreEnabled()) {\n        window.sessionStorage.setItem(SESSION_WORK_HISTORY_KEY, JSON.stringify(state.list))\n      }\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchAll.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchAll.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.countWatchHistory = action.payload.count\n        workHistorySlice.caseReducers.updateList(state, action)\n      })\n      .addCase(fetchAll.rejected, state => {\n        state.status = 'failed'\n        // @todo: handle errors\n      })\n      .addCase(fetchAllContinueWatching.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(fetchAllContinueWatching.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.continueWatchingList = action.payload.data\n        state.countContinueWatching = action.payload.count\n        workHistorySlice.caseReducers.updateList(state, action)\n      })\n      .addCase(fetchAllContinueWatching.rejected, state => {\n        state.status = 'failed'\n        // @todo: handle errors\n      })\n      .addCase(postHistory.pending, state => {\n        state.status = 'loading'\n      })\n      .addCase(postHistory.fulfilled, (state: WorkHistoryState, action) => {\n        state.status = 'succeeded'\n        workHistorySlice.caseReducers.updateList(state, { payload: { data: [action.payload] }, type: 'workHistory/updateList' })\n      })\n      .addCase(postHistory.rejected, (state, action) => {\n        state.status = 'failed'\n        // If post failed, save data from action arg to list\n        const history = action.meta.arg\n        workHistorySlice.caseReducers.updateList(state, { payload: { data: [history] }, type: 'workHistory/updateList' })\n      })\n  },\n  selectors: {\n    selectWorkHistoryById: (state: WorkHistoryState, id: number): WorkHistory | undefined => {\n      return state.list.find(item => item.registry_id === id)\n    },\n    selectContinueWatching: (state: WorkHistoryState) => {\n      return state.continueWatchingList\n    },\n    selectContinueWatchingIds: (state: WorkHistoryState) => {\n      return state.continueWatchingList\n        .map(item => (item.registry_id) as number)\n    },\n    selectContinueWatchingAndParentWorkIds: (state: WorkHistoryState) => {\n      const filmIds: number[] = workHistorySlice.getSelectors().selectContinueWatchingIds(state)\n      const viewContextIds: number[] = state.continueWatchingList\n        .map(item => (item.work?.registry_id) as number)\n      return uniq([...filmIds, ...viewContextIds])\n    },\n    selectHistoryForParentWork: (state, parentRegistryId: number): WorkHistory[] | null => {\n      return state.list\n        .filter(h => h.work?.registry_id === parentRegistryId)\n        .sort(sortByTimestamp)\n    }\n  }\n})\n\nexport const {\n  selectWorkHistoryById,\n  selectContinueWatching,\n  selectContinueWatchingIds,\n  selectContinueWatchingAndParentWorkIds,\n  selectHistoryForParentWork\n} = workHistorySlice.getSelectors()\n\nexport default workHistorySlice.reducer\n","import { AxiosResponse } from 'axios'\n\nimport { createAsyncThunk, createSlice } from '@reduxjs/toolkit'\nimport type { PayloadAction } from '@reduxjs/toolkit'\n\nimport { ThunkAPI } from '@src/js/redux/store'\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { fetchWorks, WorkCard } from '@src/js/redux/worksReducer'\nimport { setNextIdReturnedByAPI } from '@src/js/redux/playersReducer'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\nexport interface WorkPageState {\n  pageIsReady: boolean\n  headerImageIsLoaded: boolean | null\n  displayedRegistryId: number | null\n  displayedWork: WorkCard | null\n  highlightId: string | null\n  lastClickElement: string|null\n  currentActiveClickElement: string|null\n  versionList: WorkCard[] | null\n}\n\nconst initialState: WorkPageState = {\n  pageIsReady: false,\n  headerImageIsLoaded: null,\n  displayedRegistryId: null,\n  displayedWork: null,\n  highlightId: null,\n  lastClickElement: null,\n  currentActiveClickElement: null,\n  versionList: []\n}\n\nexport interface GetWorkVersionsParams {\n  expression_id: number,\n  id: number,\n  subset?: 'nfb/public'\n  includeFields?: string []\n}\n\nexport const setDisplayedRegistryId = createAsyncThunk<\n  number, number, ThunkAPI\n>('workPage/setDisplayedRegistryId', async (registryId, thunkAPI) => {\n  // Make sure we have info loaded from Public API\n  const worksList = thunkAPI.getState().works.list\n  if (!worksList || !(worksList.find(w => w.id === registryId))) {\n    await thunkAPI.dispatch(fetchWorks({ idList: [registryId] }))\n  }\n  // Reset next\n  thunkAPI.dispatch(setNextIdReturnedByAPI(null))\n\n  return registryId\n})\n\nexport const fetchVersionList = createAsyncThunk<\n  WorkCard[], GetWorkVersionsParams\n>('workPage/fetchVersionList', async ({ expression_id, id, subset = 'nfb/published', includeFields = ['cataloging_language', 'slug'] }) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/works',\n    params: {\n      expression_id,\n      include_fields: includeFields,\n      subset\n    }\n  }) as AxiosResponse\n\n  return await response.data.items.filter((i: WorkCard) => i.id !== id)\n})\n\nexport const workPageSlice = createSlice({\n  name: 'workPage',\n  initialState,\n  reducers: {\n    setPageIsReady (state, action: PayloadAction<boolean>) {\n      state.pageIsReady = action.payload\n    },\n    initHighlightId (state) {\n      const currentUrl = new URL(window.location.href)\n      const highlightIdFromURL = currentUrl.searchParams.get('highlight')\n      if (highlightIdFromURL) {\n        state.highlightId = highlightIdFromURL\n      }\n    },\n    initWork (state) {\n      state.displayedRegistryId = window.DISPLAYED_WORK_ID ?? null\n    },\n    setHighlightId (state, action: PayloadAction<string | null>) {\n      const { payload: id } = action\n      state.highlightId = id\n    },\n    // dispatch when play is triggered\n    setLastClickElement (state, action: PayloadAction<string|null>) {\n      state.lastClickElement = action.payload\n    },\n    // dispatch when player is closed\n    setCurrentActiveClickElement (state, action: PayloadAction<string|null>) {\n      state.currentActiveClickElement = action.payload\n    },\n    setHeaderImageIsLoaded (state, action: PayloadAction<boolean>) {\n      state.headerImageIsLoaded = action.payload\n    },\n    setDisplayedWork (state, action: PayloadAction<WorkCard>) {\n      state.displayedWork = action.payload\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(setDisplayedRegistryId.fulfilled, (state, action) => {\n        state.displayedRegistryId = action.payload\n      })\n      .addCase(setDisplayedRegistryId.rejected, (state, action) => {\n        console.log(action.error)\n      })\n      .addCase(fetchVersionList.fulfilled, (state, action) => {\n        state.versionList = action.payload\n      })\n  }\n})\n\nexport const {\n  setPageIsReady,\n  initWork,\n  initHighlightId,\n  setHighlightId,\n  setHeaderImageIsLoaded,\n  setDisplayedWork,\n  setLastClickElement,\n  setCurrentActiveClickElement\n} = workPageSlice.actions\n\nexport default workPageSlice.reducer\n","import uniqBy from 'lodash/uniqBy'\nimport { createSlice, createAsyncThunk, PayloadAction } from '@reduxjs/toolkit'\nimport { AxiosResponse } from 'axios'\n\nimport { Language } from '@web-nfb/player/src/types'\n\nimport { PublicApiV5Client } from '@src/js/ApiClient'\nimport { fetchAllContinueWatching, selectContinueWatchingAndParentWorkIds, GetWatchHistoryParams } from '@src/js/redux/workHistoryReducer'\nimport { AppDispatch, NFBStore, RootState } from '@src/js/redux/store'\nimport { fetchFilmHistory, selectFilmHistoryIds } from '@src/js/redux/filmHistoryReducer'\nimport { fetchRecommendations, GetRecommendationsParams, selectRecommendationsIds } from '@src/js/redux/recommendationsReducer'\nimport { StreamTypes } from '@src/js/redux/playersReducer'\nimport { fetchUserRecommendations, selectUserRecommendationsIds } from '@src/js/redux/userReducer'\nimport { DEFAULT_LIST_LENGTH } from '@src/js/constants'\n\nconst publicApiV5Client = PublicApiV5Client.instance\n\ntype WorkCategory = 'film' | 'series' | 'collection'\n\nexport interface WorkDirector {\n  first_name: string,\n  last_name: string,\n  slug: string\n}\n\nexport interface ExtraCard {\n  content_type: StreamTypes\n  description: string\n  duration: number\n  id: number\n  slug: string\n  thumbnail: string\n  title: string\n  year: number\n  publish_date: string\n}\n\nexport interface WorkCard {\n  id: number\n  title: string\n  slug: string\n  duration: number\n  year: number\n  thumbnail: string\n  label?: string\n  directors?: WorkDirector[]\n  producers?: WorkDirector[]\n  category: WorkCategory\n  description: string\n  tagline?: string\n  cc?: boolean\n  dv?: boolean\n  rating?: string\n  coming_soon?: string\n  is_new_release?: boolean\n  leaving_soon?: string\n  title_treatment?: string | null\n  key_art_square?: string | null\n  key_art_horizontal?: string | null\n  jacket?: string | null\n  story_art_horizontal?: string | null\n  story_art_vertical?: string | null\n  story_art_square?: string | null\n  geoblocked?: boolean\n  warning?: string\n  availability?: {\n    resource_url?: string | null\n    buy?: boolean\n    dvd?: boolean\n    is_public?: boolean\n    rent?: boolean\n  }\n  subjects?: string[]\n  credits_timecodes?: {\n    opening: number | null\n    ending: number | null\n  }\n  year_max?: number\n  year_min?: number\n  episodes_count?: number\n  seasons_count?: number\n  genres?: string[]\n  extras?: Record<StreamTypes, ExtraCard[]>\n  cataloging_language: Language\n  opening_credits_timecode?: number | null\n  ending_credits_timecode?: number | null\n  part_of?: [\n    {\n      category: 'collection' | 'series'\n      registry_id: number\n      slug: string\n    }\n  ]\n}\n\nexport interface APIWorksResponse {\n  items: WorkCard[],\n  meta: {\n    letter_count: object,\n    mixed_media: {\n      thumbnail_url: {\n        film: string,\n        collection: string,\n        interactive: string,\n        series: string\n      }\n    },\n    pagination: {\n      page: number,\n      pages: number,\n      size: number,\n      total: number\n    }\n  }\n}\n\nexport interface APITypeResponse {\n  item: {\n    subjects: [\n      {\n        category_type: string\n        slug: string\n        name: string\n        children: [\n          {\n            category_type: string | null,\n            slug: string\n            name: string\n          }\n        ]\n      },\n    ]\n  }\n}\n\nexport interface GetWorksParams {\n  idList?: number [],\n  subset?: 'nfb/public' | 'gc/gc-films' | 'nfb/indigenous-films' | 'nfb/published'\n  includeFields?: string [],\n  category?: string,\n  sort?: string,\n  language?: string,\n  subject?: string,\n  size?: number,\n  subjectCategory?: 'general' | 'education' | 'indigenous',\n  director?: string,\n  page?: number,\n  genre?: string[],\n  availability?: string[],\n  cc?: boolean,\n  dv?: boolean,\n  safeSearch?: boolean,\n  yearMin?: number,\n  yearMax?: number,\n  durationMin?: number, // in seconds\n  durationMax?: number, // in seconds\n  titleLetter?: string,\n}\n\nexport const basicIncludeFields = [\n  'slug', 'duration', 'year', 'thumbnail', 'directors', 'cc', 'dv', 'rating', 'coming_soon',\n  'is_new_release', 'leaving_soon', 'availability', 'geoblocked', 'producers', 'year_max',\n  'year_min', 'seasons_count', 'episodes_count', 'cataloging_language', 'story_art_horizontal'\n]\n\nexport const detailedIncludeFields = [\n  ...basicIncludeFields,\n  'tagline', 'description', 'label',\n  'title_treatment', 'key_art_square', 'jacket',\n  'subjects', 'genres',\n  'extras', 'part_of'\n]\n\nexport interface WorksState {\n  list: WorkCard[] | null,\n  status: 'idle' | 'loading' | 'succeeded' | 'failed',\n  thumbnailPattern: {\n    [key: string]: string\n  },\n  currentFetchParams: GetWorksParams | null\n}\n\nconst initialState: WorksState = {\n  list: null,\n  status: 'idle',\n  thumbnailPattern: {},\n  currentFetchParams: null\n}\n\nexport const fetchWorks = createAsyncThunk<\n  APIWorksResponse, GetWorksParams\n>('works/fetchWorks', async ({\n  idList,\n  // --- filter\n  availability,\n  cc,\n  category,\n  director,\n  durationMax,\n  durationMin,\n  dv,\n  genre,\n  includeFields = detailedIncludeFields,\n  language,\n  safeSearch,\n  sort,\n  subject,\n  subjectCategory,\n  subset,\n  titleLetter,\n  yearMax,\n  yearMin,\n  // --- pagination\n  page = 1,\n  size = 25\n}) => {\n  const response = await publicApiV5Client.call({\n    method: 'GET',\n    url: '/works',\n    params: {\n      include_series_episodes: true,\n      include_fields: includeFields,\n      locale: window.LOCALE,\n      subject_category: subjectCategory,\n      subset,\n      size,\n      page,\n      ...(category ? { category } : {}),\n      ...(idList?.length\n        ? {\n          registry_ids: idList.join(','),\n          size: idList.length\n        }\n        : {}),\n      ...(sort ? { sort } : {}),\n      ...(language ? { language } : {}),\n      ...(subject ? { subject } : {}),\n      ...(director ? { director } : {}),\n      ...(genre ? { genre } : {}),\n      ...(availability ? { availability } : {}),\n      ...(cc ? { cc } : {}),\n      ...(dv ? { dv } : {}),\n      ...(safeSearch ? { safe_search: safeSearch } : {}),\n      ...(yearMax ? { year_max: yearMax } : {}),\n      ...(yearMin ? { year_min: yearMin } : {}),\n      ...(durationMax ? { duration_max: durationMax } : {}),\n      ...(durationMin ? { duration_min: durationMin } : {}),\n      ...(titleLetter ? { title_letter: titleLetter } : {})\n    }\n  }) as AxiosResponse\n\n  if (response.status !== 200) {\n    throw new Error(`Response status: ${response.status}`)\n  }\n\n  return await response.data\n}, {\n  condition: (getWorkParams, { getState }) => {\n    // Don't trigger dispatch if work ids from\n    // params already exists in list, or if they\n    // exist in a fetch currently in progress\n\n    const state = (getState() as NFBStore).works\n    const ids = [\n      ...(state.currentFetchParams?.idList ?? []),\n      ...(state.list?.map((w: WorkCard) => w.id) ?? [])]\n\n    if (ids.length && getWorkParams.idList) {\n      const diff = getWorkParams.idList?.filter(i => !ids.includes(i))\n      return !!diff?.length\n    }\n\n    return true\n  }\n})\n\nexport const worksSlice = createSlice({\n  name: 'works',\n  initialState,\n  reducers: {\n    addWorkToList: (state, action: PayloadAction<WorkCard[]>) => {\n      state.list = uniqBy([\n        ...action.payload,\n        ...(state.list ?? [])\n      ], 'id')\n    },\n    resetWorkList: (state) => {\n      state.list = []\n    }\n  },\n  extraReducers: builder => {\n    builder\n      .addCase(fetchWorks.pending, (state, action) => {\n        state.status = 'loading'\n        state.currentFetchParams = action.meta.arg\n      })\n      .addCase(fetchWorks.fulfilled, (state, action) => {\n        state.status = 'succeeded'\n        state.currentFetchParams = null\n        state.list = uniqBy([\n          ...action.payload.items,\n          ...(state.list ?? [])\n        ], 'id')\n        state.thumbnailPattern = action.payload.meta.mixed_media.thumbnail_url\n      })\n      .addCase(fetchWorks.rejected, (state, action) => {\n        state.status = 'failed'\n        state.currentFetchParams = null\n        console.log(action.error)\n        // @todo: handle errors\n      })\n  },\n  selectors: {\n    selectWorkById: (state: WorksState, id: number) => {\n      if (!state.list) return null\n\n      return state.list.find(work => work.id === id) ?? null\n    },\n    selectWorkByIdList: (state: WorksState, idList: number[]): WorkCard[] | null => {\n      if (!state.list) return null\n\n      if (!idList?.length) {\n        return []\n      }\n\n      // NB: The result will be a list of work in the same order as the ids\n      // in idList, without removing duplicates. If duplicates should be filtered out,\n      // this should be done on idList before calling this function.\n      return idList.map((id: number) => {\n        return state.list?.find(w => w.id === id)\n      }).filter(w => !!w)\n    },\n    selectWorksFromParams: (state: WorksState, params: GetWorksParams) => {\n      if (!state.list) return null\n\n      return state.list.filter(work => {\n        let test = true\n        if (params.category && work.category) {\n          test = test && work.category === params.category\n        }\n        if (params.language && work.cataloging_language) {\n          test = test && work.cataloging_language === params.language\n        }\n        return test\n      })\n    }\n  }\n})\n\nexport const fetchContinueWatchingWorks = createAsyncThunk<\n  void,\n  void,\n  {\n    dispatch: AppDispatch,\n    state: RootState\n  }>('works/fetchContinueWatching', async (_, thunkAPI) => {\n    await thunkAPI.dispatch(fetchAllContinueWatching())\n    const state: RootState = thunkAPI.getState()\n    const idListToFetch: number[] = selectContinueWatchingAndParentWorkIds(state.workHistory)\n    if (idListToFetch.length) {\n      // This call is needed to popuplate film history store\n      await thunkAPI.dispatch(fetchFilmHistory({ registry_ids: idListToFetch }))\n      // This call is needed to fetch infos for displaying card\n      await thunkAPI.dispatch(fetchWorks({ idList: idListToFetch }))\n    }\n  })\n\nexport const fetchViewingHistory = createAsyncThunk<\n  void,\n  GetWatchHistoryParams,\n  {\n    dispatch: AppDispatch,\n    state: RootState\n  }>('works/fetchViewingHistory', async (params, thunkAPI) => {\n    await thunkAPI.dispatch(fetchFilmHistory(params))\n    const state: RootState = thunkAPI.getState()\n    const idListToFetch: number[] = selectFilmHistoryIds(state.filmHistory)\n\n    if (idListToFetch.length) {\n      // This call is needed to fetch infos for displaying card\n      await thunkAPI.dispatch(fetchWorks({ idList: idListToFetch }))\n    }\n  })\n\nexport const fetchRecommendationsWorks = createAsyncThunk<\n  void,\n  GetRecommendationsParams,\n  {\n    dispatch: AppDispatch,\n    state: RootState\n  }>('works/fetchRecommendations', async ({ slug, workType }, thunkAPI) => {\n    await thunkAPI.dispatch(fetchRecommendations({ slug, workType }))\n    const idListToFetch: number[] | undefined = selectRecommendationsIds(thunkAPI.getState().recommendations)\n\n    if (!idListToFetch) {\n      return\n    }\n\n    await thunkAPI.dispatch(fetchWorks({ idList: idListToFetch }))\n  })\n\nexport const fetchUserRecommendationsWorks = createAsyncThunk<\n  void,\n  void,\n  {\n    dispatch: AppDispatch,\n    state: RootState\n  }>('works/fetchUserRecommendations', async (_, thunkAPI) => {\n    await thunkAPI.dispatch(fetchUserRecommendations(DEFAULT_LIST_LENGTH))\n    const state: RootState = thunkAPI.getState()\n    const idListToFetch: number[] = selectUserRecommendationsIds(state.user)\n    await thunkAPI.dispatch(fetchWorks({ idList: idListToFetch }))\n  })\n\nexport const { addWorkToList, resetWorkList } = worksSlice.actions\n\nexport const {\n  selectWorkById, selectWorkByIdList, selectWorksFromParams\n} = worksSlice.getSelectors()\n\nexport default worksSlice.reducer\n","import PlayerStats, { StatsOptions } from '@src/js/PlayerStats'\n\nimport NFBWebPlayer from '@web-nfb/player'\nimport { QualityLevel } from '@src/js/types/Player'\nimport NFBExpose from '@web-nfb/player/src/NFBExpose'\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  const {\n    gtm: gtmOptions,\n    unstats: unstatsOptions,\n    ...playerSpecificOptions\n  } = window.IFRAME_OPTIONS\n\n  const nfbWebPlayer = new NFBWebPlayer({\n    el: '#nfb-player',\n    options: {\n      ...playerSpecificOptions,\n      disableResolutions: [270, 360],\n      ready: (player: NFBExpose) => {\n        const statsOptions: StatsOptions = {\n          // Base\n          registryId: gtmOptions.registryId,\n          title: gtmOptions.title,\n          workType: unstatsOptions.type,\n          embedMode: true,\n          autoplay: false,\n          isChapter: !!playerSpecificOptions.chapter,\n          chapter: playerSpecificOptions.chapter,\n          // GTM\n          versionLang: gtmOptions.versionLang,\n          catalogingLang: gtmOptions.catalogingLang,\n          interfaceLang: window.LOCALE,\n          // Unstats\n          slug: unstatsOptions.slug,\n          url: unstatsOptions.url,\n          user: unstatsOptions.user,\n          context: unstatsOptions.context,\n          labels: unstatsOptions.labels,\n          platform: unstatsOptions.platform\n        }\n\n        const playerStats = new PlayerStats(player, statsOptions)\n        playerStats.init()\n\n        if (window.IFRAME_OPTIONS.autoplay) {\n          player.one('play', function (e: any) {\n            // Autoplay should be applied only once.\n            // To fix a bug on Safari and make sure the autoplay\n            // behavior won't be triggered again, remove the attribute manually\n            // from the video object after first play.\n            e.target?.querySelector('video')?.removeAttribute('autoplay')\n          })\n        }\n        if (window.BACK_URL) {\n          const navigateToBackUrl = () => { document.location.href = window.BACK_URL }\n          document.addEventListener('nfbplayer:backbuttonclicked', navigateToBackUrl)\n          player.on('ended', navigateToBackUrl)\n        }\n\n        if (window.SENTRY_IS_ENABLED) {\n          player.on('error', function () {\n            window.Sentry?.captureException(player.error)\n          })\n        }\n      }\n    }\n  })\n})\n","import {css} from 'lit';\nexport const styles = css`.nfb-series-page__header-episode-title {\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 600;\n  font-size: 2rem;\n  line-height: 2.375rem;\n  color: #000;\n  color: #fff;\n  margin-top: 1rem;\n  margin-bottom: 1rem;\n}`;\nexport default styles;\n","import { html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBWorkPageEpisodeTitle.sass?lit'\n\nimport NFBWorkPageReactiveHeaderElement from './NFBWorkPageReactiveHeaderElement'\n\n@customElement('nfb-work-page-episode-title')\nexport default class NFBWorkPageEpisodeTitle extends NFBWorkPageReactiveHeaderElement {\n  @property({ type: String, attribute: 'text' })\n  text = ''\n\n  static styles = [styles]\n\n  render () {\n    let title\n    const work = this.getRelatedWork()\n\n    if (!work) {\n      title = this.text\n      if (!title) return\n    } else {\n      title = work.title\n    }\n\n    return html`\n      <h2\n        class=\"nfb-series-page__header-episode-title\"\n      >\n        ${title}\n      </h2>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-season-list {\n  height: 60px;\n  overflow: hidden;\n}\n\n.nfb-season-list[data-ui-is-collapsed=false] {\n  height: auto;\n}\n\n.nfb-season-list__buttons-container {\n  display: flex;\n  justify-content: flex-start;\n  margin-top: 0.5rem;\n  margin-bottom: 0.25rem;\n}\n\n@media screen and (min-width: 768px), print {\n  .nfb-season-list__buttons-container {\n    margin-left: 1rem;\n  }\n}\n.nfb-season-list__seasons-buttons {\n  display: flex;\n  justify-content: flex-start;\n}\n\n[data-ui-is-collapsed=false] .nfb-season-list__seasons-buttons {\n  flex-wrap: wrap;\n}`;\nexport default styles;\n","import { LitElement, html, css, unsafeCSS, nothing, PropertyValues } from 'lit'\nimport { customElement, property, query, queryAll, state } from 'lit/decorators.js'\nimport throttle from 'lodash.throttle'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport spacings from '@web-nfb/frontend-static/design-system/sass/exports/spacing.module.sass'\n\nimport { store } from '@src/js/redux/store'\nimport { Season, setDisplayedSeasonNumber, setDisplayedSeasonTitle } from '@src/js/redux/seriesPageReducer'\n\n// @ts-expect-error Lit Sass import\nimport listStyle from '@src/sass/wc/NFBSeasonList.sass?lit'\nimport { GTMTab, GTMPageViewSPA } from '@src/js/types/GTM'\nimport { GTM_EVENTS } from '@src/js/constants'\n\n@customElement('nfb-season-button')\nexport class NFBSeasonButton extends LitElement {\n  @property({ type: Number, attribute: 'number' })\n  number: number = 0\n\n  @property({ type: String })\n  text: string = ''\n\n  @property({ type: String })\n  type: 'series' | 'collection' = 'series'\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark: boolean = false\n\n  @state()\n  isSelected: boolean = false\n\n  static styles = [css`\n    nfb-button::part(button) {\n      text-transform: none;\n      margin-right: ${unsafeCSS(spacings.sm)};\n      margin-bottom: ${unsafeCSS(spacings.sm)};\n    }\n  `]\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n  }\n\n  async connectedCallback (): Promise<void> {\n    super.connectedCallback()\n    store.subscribe(this.stateChanged)\n  }\n\n  stateChanged () {\n    const state = store.getState().seriesPage\n    this.isSelected = this.number === state.displayedSeasonNumber\n  }\n\n  buttonClicked () {\n    // Tab event\n    const tabEvent: GTMTab = {\n      event: GTM_EVENTS.TAB,\n      nfb_detail: this.type,\n      link_text: this.text\n    }\n\n    // Page view event\n    const pageViewEvent: GTMPageViewSPA = {\n      event: GTM_EVENTS.PAGE_VIEW_SPA,\n      nfb_subtab_name: this.type === 'series' ? `season ${this.number}` : `edition ${this.number}`,\n    }\n\n    window.dataLayer?.push(tabEvent, pageViewEvent)\n    store.dispatch(setDisplayedSeasonNumber(this.number))\n    store.dispatch(setDisplayedSeasonTitle(this.text))\n  }\n\n  render () {\n    return html`\n      <nfb-button\n        @click=${this.buttonClicked}\n        id=\"season-${this.number}-tab\"\n        class=\"nfb-episode-list__season-btn\"\n        text=\"${this.text}\"\n        primary-variant=\"pill\"\n        is-dark=\"${this.isDark ?? nothing}\"\n        is-selected=\"${this.isSelected ?? nothing}\"\n        role=\"tab\"\n        aria-selected=\"${this.isSelected}\"\n        aria-controls=\"season-${this.number}-container\"\n      >\n      </nfb-button>\n    `\n  }\n}\n\ntype ButtonData = {\n  element: HTMLElement,\n  width: number,\n}\n\n@customElement('nfb-season-list')\nexport class NFBSeasonList extends LitElement {\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark: boolean = false\n\n  @state()\n  isLoading: boolean = true\n\n  @state()\n  numberOfSeasonsDisplayed: number = 0\n\n  @state()\n  activeIndex: number = 0\n\n  @query('[data-ui-el=\"more-button\"]')\n  moreButton: HTMLElement\n\n  @queryAll('nfb-season-button')\n  seasonButtonList: NodeList\n\n  seasonListLoaded: boolean = false\n  seasonList: Season[] = []\n  numberOfSeasons: number = 0\n  seriesType: string = ''\n  displayedSeasonNumber: number | null = null\n  moreButtonInitWidth: number = 89\n  moreButtonRealWidth: number = 0\n  isCollapsed: boolean = true\n  buttonsData: ButtonData[] = []\n  buttonsContainerWidth: number = 0\n  buttonsIntersectionObserver: IntersectionObserver\n  buttonsContainerResizeObserver: ResizeObserver\n  buttonsIntersectionObserverIsInit: boolean = false\n\n  static styles = [\n    css`\n      .nfb-season-list[is-loading=\"true\"] {\n        opacity: 0;\n      }\n    `,\n    listStyle\n  ]\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n    this.containerHasResized = this.containerHasResized.bind(this)\n    this.evaluateButtonsContainerSpace = this.evaluateButtonsContainerSpace.bind(this)\n    this.buttonIsIntersecting = this.buttonIsIntersecting.bind(this)\n  }\n\n  async connectedCallback (): Promise<void> {\n    super.connectedCallback()\n    store.subscribe(this.stateChanged)\n  }\n\n  updated (changedProperties: PropertyValues): void {\n    if (changedProperties.has('isLoading') && !this.isLoading && this.seasonList.length) {\n      this.buttonsData = []\n      this.seasonButtonList.forEach(el => {\n        this.buttonsData.push({\n          element: el as HTMLElement,\n          width: 0\n        })\n      })\n\n      this.initIntersectionObserver()\n      this.initResizeObserver()\n    }\n  }\n\n  stateChanged () {\n    const state = store.getState()\n    const oldDisplayedSeasonNumber = this.displayedSeasonNumber\n    this.displayedSeasonNumber = state.seriesPage.displayedSeasonNumber\n    if (!this.seasonListLoaded && state.seriesPage.seasonList.length) {\n      this.seasonListLoaded = true\n      this.seriesType = state.seriesPage.seriesType ?? 'series'\n      this.seasonList = state.seriesPage.seasonList\n      this.numberOfSeasons = this.seasonList.length\n      this.numberOfSeasonsDisplayed = this.numberOfSeasons\n      this.activeIndex = this.seasonList.findIndex(season => season.number === state.seriesPage.displayedSeasonNumber)\n    } else if (this.seasonListLoaded && oldDisplayedSeasonNumber !== this.displayedSeasonNumber) {\n      this.activeIndex = this.seasonList.findIndex(season => season.number === state.seriesPage.displayedSeasonNumber)\n    }\n    this.isLoading = !state.workPage.pageIsReady\n  }\n\n  initIntersectionObserver () {\n    this.buttonsIntersectionObserver = new IntersectionObserver(this.buttonIsIntersecting)\n    this.buttonsData.forEach(b => { this.buttonsIntersectionObserver.observe(b.element) })\n  }\n\n  initResizeObserver () {\n    const seasonsButtonsContainer = this.shadowRoot?.querySelector('.nfb-season-list__buttons-container')\n    if (seasonsButtonsContainer) {\n      this.buttonsContainerResizeObserver = new ResizeObserver(throttle(this.containerHasResized, 100))\n      this.buttonsContainerResizeObserver.observe(seasonsButtonsContainer)\n    }\n  }\n\n  evaluateButtonsContainerSpace () {\n    if (!this.buttonsIntersectionObserverIsInit) {\n      return\n    }\n\n    let count = 0; let availableSpace = this.buttonsContainerWidth\n\n    for (const buttonData of this.buttonsData) {\n      if (buttonData.width === 0) {\n        break\n      }\n\n      availableSpace -= buttonData.width\n      if (availableSpace > 0) {\n        count += 1\n      } else {\n        break\n      }\n    }\n\n    this.numberOfSeasonsDisplayed = count\n  }\n\n  containerHasResized (entries: ResizeObserverEntry[]) {\n    if (this.moreButton) {\n      if (!this.moreButtonRealWidth) {\n        // Add + 4 pixels to compensate for possible \"active\" state of more button\n        this.moreButtonRealWidth = this.moreButton.getBoundingClientRect().width + 4\n\n        // Add container left margin compensation to calculation\n        const seasonsButtonsContainerMargin = parseInt(window.getComputedStyle(entries[0].target).marginLeft)\n        this.moreButtonRealWidth += seasonsButtonsContainerMargin\n\n        this.moreButtonInitWidth = this.moreButtonRealWidth\n      }\n    }\n\n    this.buttonsContainerWidth = entries[0].contentRect.width - this.moreButtonInitWidth\n    this.evaluateButtonsContainerSpace()\n  }\n\n  buttonIsIntersecting (entries: IntersectionObserverEntry[]) {\n    if (!entries.find(e => e.boundingClientRect.width !== 0)) {\n      return\n    }\n\n    entries.forEach(e => {\n      const data = this.buttonsData.find(b => b.element === e.target)\n      if (data) {\n        data.width = e.boundingClientRect.width\n      }\n    })\n\n    if (!this.buttonsIntersectionObserverIsInit) {\n      this.buttonsIntersectionObserverIsInit = true\n      this.evaluateButtonsContainerSpace()\n    }\n\n    if (!this.buttonsData.find(b => b.width === 0)) {\n      this.buttonsIntersectionObserver.disconnect()\n    }\n  }\n\n  moreButtonClick () {\n    this.isCollapsed = !this.isCollapsed\n\n    if (!this.isCollapsed) {\n      this.buttonsIntersectionObserver.disconnect()\n      this.buttonsContainerResizeObserver.disconnect()\n    } else {\n      this.initIntersectionObserver()\n      this.initResizeObserver()\n      this.buttonsIntersectionObserverIsInit = false\n    }\n\n    this.numberOfSeasonsDisplayed = this.numberOfSeasons\n  }\n\n  renderMoreButton () {\n    return html`\n      <div class=\"nfb-season-list__more-button\">\n        <nfb-button\n          @click=${this.moreButtonClick}\n          data-ui-el=\"more-button\"\n          text=\"${this.isCollapsed ? window.gettext('More') : window.gettext('Less')}\"\n          icon-name=\"${this.isCollapsed ? 'down' : 'up'}\"\n          primary-variant=\"pill\"\n          secondary-variant=\"discreet\"\n          is-dark=\"${this.isDark.toString()}\"\n          is-selected=\"${this.activeIndex >= this.numberOfSeasonsDisplayed}\"\n        >\n        </nfb-button>\n      </div>\n    `\n  }\n\n  render () {\n    return html`\n      <div \n        class=\"nfb-season-list\"\n        data-ui-is-collapsed=\"${this.isCollapsed}\"\n        is-loading=${this.isLoading.toString()}\n      >\n        <div class=\"nfb-season-list__buttons-container\" role=\"tablist\">\n          <div class=\"nfb-season-list__seasons-buttons\">\n          ${this.seasonList.map((season, i) => {\n    return html`<nfb-season-button\n              number=\"${season.number}\"\n              text=\"${season.title}\"\n              type=\"${this.seriesType}\"\n              is-dark=\"true\"\n              data-cy=\"season-btn\"\n              style=\"${i + 1 > this.numberOfSeasonsDisplayed ? 'display:none' : nothing}\"\n            >\n            </nfb-season-button>`\n  })}\n          ${!this.isCollapsed ? this.renderMoreButton() : nothing}\n          </div>\n          <div class=\"nfb-season-list__more-button-container\">\n            ${this.isCollapsed && this.numberOfSeasonsDisplayed < this.numberOfSeasons ? this.renderMoreButton() : nothing}\n          </div>\n        </div>\n      </div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-season-list': NFBSeasonList\n    'nfb-season-button': NFBSeasonButton\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-episode-list {\n  --nfb-episode-list-active-color: #1C7A3E;\n}\n\n.nfb-episode-list__list {\n  position: relative;\n  min-height: 200px;\n  margin: 0;\n  padding: 0;\n  max-width: 990px;\n}\n\n.nfb-work-page--dark .nfb-episode-list {\n  --nfb-episode-list-active-color: #05EE80;\n}\n\n.nfb-work-page--dark .nfb-episode-list .nfb-card__thumbnail-container {\n  max-height: 300px;\n}\n\n.nfb-work-page--dark .nfb-episode-list .nfb-card__thumbnail-container .nfb-card {\n  margin-bottom: 1.5rem;\n  margin-left: -0.5rem;\n}\n\n.nfb-work-page--dark .nfb-episode-list .nfb-card__thumbnail-container .nfb-card--no-border {\n  margin-left: -1rem;\n}\n\n.nfb-work-page--dark .nfb-episode-list .nfb-card__thumbnail-container .nfb-card--no-border__mylist-button-container {\n  display: none;\n}`;\nexport default styles;\n","import { LitElement, html, nothing } from 'lit'\nimport { customElement, state, property } from 'lit/decorators.js'\nimport { repeat } from 'lit/directives/repeat.js'\nimport { Unsubscribe } from '@reduxjs/toolkit'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport { RootState, store } from '@src/js/redux/store'\nimport { WorkCard, selectWorkById } from '@src/js/redux/worksReducer'\nimport { GTMSelectWork } from '@src/js/types/GTM'\nimport { GTM_EVENTS, GTM_LIST_CATEGORY, GTM_LIST_TYPE } from '@src/js/constants'\n\n// @ts-expect-error Lit Sass import\nimport episodeListStyle from '@src/sass/wc/NFBEpisodeList.sass?lit'\nimport { selectCurrentEpisodesList } from '@src/js/redux/seriesPageReducer'\n\n@customElement('nfb-episode-list')\nexport default class NFBEpisodesList extends LitElement {\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark = false\n\n  @state()\n  isReady = false\n\n  @state()\n  workIdList: number[]\n\n  @state()\n  series: WorkCard | null = null\n\n  @state()\n  pageCurrentDisplayedRegistryId: number | undefined\n\n  _state: RootState\n\n  static styles = [\n    episodeListStyle\n  ]\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    store.subscribe(this.stateChanged)\n  }\n\n  stateChanged (): void {\n    this._state = store.getState()\n    this.isReady = this._state.workPage.pageIsReady\n    this.series = selectWorkById(this._state.works, this._state.seriesPage.seriesRegistryId!)\n    if (this._state.seriesPage.episodesList) {\n      const currentEpisodesList = selectCurrentEpisodesList(this._state.seriesPage)\n      if (currentEpisodesList) {\n        this.workIdList = currentEpisodesList\n      }\n    }\n\n    if (this._state.workPage.highlightId) {\n      // if highlight id from extra, we don't want to highlight registry id in episode list\n      this.pageCurrentDisplayedRegistryId = undefined\n    } else {\n      this.pageCurrentDisplayedRegistryId = this._state.workPage.displayedRegistryId!\n    }\n  }\n\n  getStoryArtByWorkId (workId: number) {\n    const work: WorkCard | null = selectWorkById(this._state.works, workId)\n    if (!work || !work?.story_art_horizontal) {\n      return nothing\n    }\n\n    return work.story_art_horizontal\n  }\n\n  render () {\n    if (!this.isReady) {\n      return html`\n        <div class=\"nfb-episode-list__list\">\n          <nfb-spinner\n            is-dark=\"${this.isDark.toString()}\"\n            is-loading=\"true\"\n          ></nfb-spinner>\n        </div>`\n    }\n\n    return html`\n      <ul \n        data-cy=\"season-${store.getState().seriesPage.displayedSeasonNumber}\"\n        class=\"nfb-episode-list__list\"\n        data-ui-el=\"episode-list\"\n      >\n        ${repeat(this.workIdList, workId => workId, (workId, index) => {\n    const gtmAttrs: GTMSelectWork = {\n      event: GTM_EVENTS.SELECT_WORK,\n      nfb_list_name: `${this.series?.title} : ${store.getState().seriesPage.displayedSeasonTitle}`,\n      nfb_list_id: this.series?.category === 'collection' ? 'collectionWorkList' : 'episodeList',\n      nfb_list_type: GTM_LIST_TYPE.LIST,\n      nfb_list_category: GTM_LIST_CATEGORY.PART_OF,\n      nfb_detail: (index + 1).toString()\n    }\n    return html`\n        <nfb-play-work-card\n          registry-id=\"${workId}\"\n          is-dark=\"${this.isDark.toString()}\"\n          is-active=${this.pageCurrentDisplayedRegistryId === workId}\n          primary-variant=\"list\"\n          secondary-variant=\"no-border\"\n          gtm-attributes=\"${JSON.stringify(gtmAttrs)}\"\n          data-cy=\"episode-card\"\n          include-description=\"true\"\n          include-progress-bar=\"true\"\n          include-see-more-link=\"${this.series?.category === 'collection'}\"\n          thumbnail-path=\"${this.getStoryArtByWorkId(workId)}\"\n        ></nfb-play-work-card>`\n  })}\n      </ul>`\n  }\n}\n","import '@src/js/wc/work-page/NFBWatchButton'\nimport '@src/js/wc/NFBPlayerErrorMessage'\nimport '@src/js/wc/work-page/NFBWorkPageTitle'\nimport '@src/js/wc/work-page/NFBWorkPageDescription'\nimport '@src/js/wc/work-page/NFBWorkPageWarning'\nimport '@src/js/wc/work-page/NFBWorkPageCreator'\nimport '@src/js/wc/work-page/NFBWorkPageLegend'\nimport '@src/js/wc/work-page/NFBWorkPageImage'\nimport '@src/js/wc/work-page/NFBWorkPageHeaderCreator'\nimport '@src/js/wc/work-page/NFBWorkPageHeaderImage'\nimport '@src/js/wc/work-page/NFBWorkPageHeaderProgress'\nimport '@src/js/wc/work-page/NFBWorkPageHeaderWatchButton'\nimport '@src/js/wc/work-page/NFBWorkPageHeaderLegend'\nimport '@src/js/wc/work-page/NFBWorkPageHeaderLogIn'\nimport '@src/js/wc/work-page/NFBWorkPageEpisodeTitle'\nimport '@src/js/wc/work-page/NFBWorkPageDetailsVersionList'\nimport '@src/js/wc/carousels/NFBRecommendationsCarousel'\nimport '@src/js/wc/work-page/NFBExtras'\nimport '@src/js/wc/series-page/NFBSeasonList'\nimport '@src/js/wc/series-page/NFBEpisodeList'\nimport '@src/js/wc/work-page/NFBWorkPageUpNext'\nimport '@src/js/wc/cards/NFBPlayWorkCard'\nimport '@src/js/wc/work-page/NFBExtraCard'\nimport { NFB_PLAYER_EVENTS, NFB_VIDEO_EVENTS } from '@src/js/wc/NFBVideo'\nimport '@src/js/wc/NFBPlayerModal'\nimport '@src/js/wc/NFBShareModal'\n\nimport { RootState, store } from '@src/js/redux/store'\nimport { SeriesPageState, fetchSeries, initSeries } from '@src/js/redux/seriesPageReducer'\nimport {\n  initHighlightId,\n  initWork,\n  setDisplayedRegistryId,\n  setPageIsReady,\n  WorkPageState\n} from '@src/js/redux/workPageReducer'\nimport {\n  PlayersState,\n  PlayerUniqId,\n  setCurrentPlaying,\n  addToPlayerOptionsList\n} from '@src/js/redux/playersReducer'\nimport { selectWorkById } from '@src/js/redux/worksReducer'\nimport { fetchAll, selectHistoryForParentWork } from '@src/js/redux/workHistoryReducer'\nimport { fetchFilmHistory } from '@src/js/redux/filmHistoryReducer'\nimport { formatDirectors } from '@src/js/helpers/format'\nimport { handleFocusOnLastElementClicked } from '@src/js/helpers/page/common/display'\n\nimport * as queueUtils from '@src/js/helpers/page/common/queue'\nimport * as highlightUtils from '@src/js/helpers/page/common/highlight'\nimport * as displayUtils from '@src/js/helpers/page/common/display'\n\nexport const getCurrentEpisodeUrl = (state: RootState): URL => {\n  const { protocol, host, search } = window.location\n\n  let seasonLabel = window.pgettext('For series page url', 'season')\n  if (state.seriesPage.seriesType === 'collection') {\n    seasonLabel = window.pgettext('For series page url', 'collection')\n  }\n\n  let urlString = `${protocol}//${host}/` +\n    `${state.seriesPage.seriesType}/${state.seriesPage.seriesSlug}/`\n\n  if (state.workPage.displayedWork) {\n    urlString += `${seasonLabel}${state.seriesPage.displayedSeasonNumber}/` +\n      `${state.workPage.displayedWork?.slug}/`\n  }\n\n  urlString += (search ?? '')\n\n  return new URL(urlString.replace(/(\\r\\n|\\n|\\r)/gm, '').trim())\n}\n\nclass SeriesPage {\n  state: SeriesPageState\n  workPageState: WorkPageState\n  playersState: PlayersState\n  currentPlaying: PlayerUniqId | null = null\n  highlightId: string | null = null\n  displayedId: number | null = null\n\n  constructor () {\n    this.onStateChanged = this.onStateChanged.bind(this)\n    store.subscribe(this.onStateChanged)\n  }\n\n  async init () {\n    // We update our stores with data furnished in templates by the back\n\n    // Init player options\n    // @todo: now we are using API, player options should be retrieve with API infos?\n    store.dispatch(addToPlayerOptionsList(window.PLAYER_OPTIONS))\n\n    store.dispatch(initWork())\n    store.dispatch(initSeries())\n\n    if (!this.state.seriesRegistryId) {\n      return\n    }\n\n    // Fetch series\n    await store.dispatch(fetchSeries())\n\n    // Fetch history\n    await this.fetchHistory()\n\n    // Fetch latest episode\n    await this.fetchLatestEpisode()\n    const historyList = selectHistoryForParentWork(store.getState().workHistory, this.state.seriesRegistryId)\n\n    // If has history and no specific episode has been requested in URL\n    if (historyList?.length && !window.EPISODE_INDEX) {\n      // @todo: if user connected => get specific episode/film from API\n      // if user not connected => get most recent history\n      const mostRecentHistory = historyList[0]\n      let idToDisplay = mostRecentHistory.registry_id\n      if (mostRecentHistory.is_completed) {\n        const next = queueUtils.getNextWork(mostRecentHistory.registry_id)\n        if (next) {\n          idToDisplay = next.id\n        }\n      }\n      await this.updateDisplayedRegistryId(idToDisplay)\n\n      // wait for history item to be loaded before setting page as ready\n      displayUtils.executeAfterRegistryIdIsDisplayed(idToDisplay, this.pageIsReady)\n    } else {\n      this.pageIsReady()\n    }\n\n    // Listen for next inside player (play directly without hiding player)\n    document.addEventListener(NFB_PLAYER_EVENTS.NEXT_BUTTON_CLICKED, () => { queueUtils.playNextWork() })\n\n    // Listen for player ended, show info in header & highlight\n    document.addEventListener(NFB_VIDEO_EVENTS.PLAYER_ENDED, this.onPlayerEnded)\n  }\n\n  async fetchHistory () {\n    const episodesRegistryIdList = this.state.seasonList.map(s => s.episodes.map(e => e.id)).flat()\n\n    if (episodesRegistryIdList.length) {\n      await store.dispatch(fetchFilmHistory({ registry_ids: episodesRegistryIdList }))\n    }\n  }\n\n  async fetchLatestEpisode () {\n    if (this.state.seriesRegistryId) {\n      await store.dispatch(fetchAll({ registry_id: this.state.seriesRegistryId }))\n    }\n  }\n\n  pageIsReady () {\n    store.dispatch(setPageIsReady(true))\n    document.querySelector('#work-page-header')?.setAttribute('is-ready', 'true')\n\n    // set highlighted card at the end of process,\n    // to make sure scroll position takes into accounted\n    // the async loaded episodes list\n    store.dispatch(initHighlightId())\n  }\n\n  onStateChanged () {\n    const rootState = store.getState()\n    this.state = rootState.seriesPage\n    this.workPageState = rootState.workPage\n    this.playersState = rootState.players\n\n    const oldCurrentPlaying = this.currentPlaying\n    this.currentPlaying = this.playersState.currentPlaying\n    const oldHighlightId = this.highlightId\n    this.highlightId = rootState.workPage.highlightId\n    const oldDiplayedId = this.displayedId\n    this.displayedId = rootState.workPage.displayedRegistryId\n\n    highlightUtils.verifyHighlight(\n      this.highlightId,\n      oldHighlightId,\n      this.currentPlaying,\n      oldCurrentPlaying\n    )\n\n    if (JSON.stringify(oldCurrentPlaying) !== JSON.stringify(this.currentPlaying)) {\n      if (!this.currentPlaying?.isExtra) {\n        this.onCurrentPlayingChanged(this.currentPlaying)\n      }\n    }\n\n    if (this.displayedId && oldDiplayedId !== this.displayedId) {\n      this.onDisplayedIdChanged()\n    }\n  }\n\n  async onCurrentPlayingChanged (newCurrentPlaying: PlayerUniqId | null) {\n    // We need to updated displayed work only for films (not for extras)\n    if (newCurrentPlaying?.streamType === 'films') {\n      // If loading, wait for loading to be over to change display\n      if (store.getState().players.isLoading) {\n        const unsubscribe = store.subscribe(() => {\n          if (!store.getState().players.isLoading) {\n            unsubscribe()\n            this.updateDisplayedRegistryId(newCurrentPlaying.registryId)\n          }\n        })\n      } else {\n        this.updateDisplayedRegistryId(newCurrentPlaying.registryId)\n      }\n    }\n  }\n\n  onDisplayedIdChanged () {\n    if (this.displayedId && this.state.displayedSeasonNumber) {\n      this.updateUrl(this.displayedId)\n      this.updateMeta(this.displayedId)\n      this.scrollAndPutFocusOnHeader()\n    }\n  }\n\n  onPlayerEnded = async (e: Event) => {\n    e.preventDefault()\n    // On player ended, display next episode in queue if available,\n    // wait for displayed episode to be ready before closing player\n    const newRegistryId = await queueUtils.displayNextWork()\n    if (newRegistryId) {\n      displayUtils.executeAfterRegistryIdIsDisplayed(newRegistryId, () => {\n      // use short timeout to make sure header image is fully displayed\n        setTimeout(() => {\n          store.dispatch(setCurrentPlaying(null))\n        }, 200)\n      })\n    } else {\n      store.dispatch(setCurrentPlaying(null))\n    }\n  }\n\n  scrollAndPutFocusOnHeader () {\n    // Manage to put focus on watch button when one episode ends\n    if (this.currentPlaying?.streamType === 'films') {\n      const watchButtonId = document.querySelector('nfb-work-page-header-watch-button')?.shadowRoot?.querySelector('nfb-watch-button')?.shadowRoot?.querySelector('nfb-button')?.dataset.uiEl\n      if (watchButtonId) {\n        window.scrollTo(0, 0)\n        handleFocusOnLastElementClicked(watchButtonId, null)\n      }\n    }\n  }\n\n  async updateDisplayedRegistryId (registryId: number) {\n    await store.dispatch(setDisplayedRegistryId(registryId))\n  }\n\n  updateUrl (registryId: number) {\n    const url = getCurrentEpisodeUrl(store.getState())\n    const work = selectWorkById(store.getState().works, registryId)\n    if (window.location.toString() !== url.toString()) {\n      window.history.pushState({\n        seasonIndex: this.state.displayedSeasonNumber,\n        episodeSlug: work?.slug\n      }, '', url)\n    }\n  }\n\n  updateMeta = (registryId: number) => {\n    const state = store.getState()\n    const episode = selectWorkById(state.works, registryId)\n    const series = selectWorkById(state.works, state.seriesPage.seriesRegistryId!)\n\n    if (episode && series) {\n      const directors = episode.directors ? formatDirectors(episode.directors) : null\n      const titleTag = document.querySelector('title')\n      if (titleTag) {\n        titleTag.innerHTML =\n        `${series.title} - ${episode.title} ${directors ? `${window.gettext('by')} ${directors}` : ''} - ${window.gettext('NFB')}`\n      }\n    }\n  }\n}\n\nconst seriesPage = new SeriesPage()\n\ndocument.addEventListener('DOMContentLoaded', () => {\n  seriesPage.init()\n})\n","import { LitElement, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { Unsubscribe } from '@reduxjs/toolkit'\n\nimport { PlayerError, setCurrentError } from '@src/js/redux/playersReducer'\nimport { store } from '@src/js/redux/store'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nconst ERROR_MESSAGES = {\n  [PlayerError.NO_SLUG_OR_STREAM_TYPE]: window.gettext('This content is not currently available.'),\n  [PlayerError.NO_PLAYER_OPTIONS]: window.gettext('This content is not currently available.'),\n  [PlayerError.NO_SOURCE]: window.gettext('This content is not currently available.'),\n  [PlayerError.VIDEO_JS]: window.gettext('This content is not currently available.'),\n  [PlayerError.GENERIC]: window.gettext('This content is not currently available.'),\n  [PlayerError.GEOBLOCKED]: window.gettext('Sorry this content is not available to view in your current location.')\n}\n\n@customElement('nfb-player-error-message')\nexport default class NFBPlayerErrorMessage extends LitElement {\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n    isDark = false\n\n  @property({ type: String, attribute: 'error' })\n    initialError = null\n\n  @state()\n    error: PlayerError | null = null\n\n  storeUnsubscribe: Unsubscribe\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    this.storeUnsubscribe = store.subscribe(this.stateChanged)\n\n    if (this.initialError) {\n      store.dispatch(setCurrentError(this.initialError))\n    }\n  }\n\n  disconnectedCallback = (): void => {\n    super.disconnectedCallback()\n    this.storeUnsubscribe()\n  }\n\n  stateChanged = (): void => {\n    const state = store.getState().players\n    this.error = state.currentError\n\n    // Used in CSS to display none if no error\n    this.setAttribute('has-error', (!!this.error).toString())\n  }\n\n  render () {\n    if (!this.error) return\n\n    return html`\n      <nfb-inline-message\n        is-dark=\"${this.isDark ?? nothing}\"\n        text=\"${this.error in ERROR_MESSAGES ? ERROR_MESSAGES[this.error] : ERROR_MESSAGES[PlayerError.GENERIC]}\"\n      >\n      </nfb-inline-message>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-work-page__player-modal {\n  visibility: hidden;\n  opacity: 0;\n  position: fixed;\n  width: 100vw;\n  height: 100vh;\n  height: 100dvh;\n  margin: 0 auto;\n  padding: 0;\n  top: 0;\n  left: 0;\n  background: #000;\n  z-index: 999;\n  transition: visibility 0s, opacity 0.5s;\n  transition-delay: 0.2s, 0s;\n}\n\n.nfb-work-page-player {\n  width: 100%;\n  height: 100%;\n  max-width: 100%;\n  max-height: 100%;\n}\n\n.nfb-work-page-player[show=true], .nfb-work-page-player[open] {\n  visibility: visible;\n  opacity: 1;\n  transition-delay: unset;\n  outline: none;\n}\n\n.nfb-work-page__player-modal--chapter[show=true], .nfb-work-page__player-modal--chapter[open] {\n  display: flex;\n  align-items: center;\n  visibility: visible;\n  opacity: 1;\n}\n\n.nfb-work-page__player-modal--chapter .nfb-work-page__player-container {\n  aspect-ratio: 16/9;\n  margin: 64px;\n  width: calc(100% - 128px);\n  height: auto;\n}\n\n@media screen and (max-width: 480px), print {\n  .nfb-work-page__player-modal--chapter .nfb-work-page__player-container {\n    width: 100%;\n    margin-right: 0;\n    margin-left: 0;\n  }\n}\n.nfb-work-page__player-modal--chapter .nfb-work-page__player-modal-close-button-container {\n  position: absolute;\n  top: 24px;\n  right: 24px;\n  display: flex;\n  justify-content: flex-end;\n  color: #fff;\n  transition: color 0.2s;\n}\n\n.nfb-work-page__player-modal--chapter .nfb-work-page__player-modal-close-button i {\n  font-size: 1.75rem;\n}\n\n.nfb-work-page__player-modal--chapter .nfb-work-page__player-modal-close-button:hover {\n  color: #05ee80;\n}`;\nexport default styles;\n","import { LitElement, html, nothing } from 'lit'\nimport { customElement, property, state, query } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\nimport dialogPolyfill from 'dialog-polyfill'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport { executeAfterRegistryIdIsDisplayed, handleFocusOnLastElementClicked } from '@src/js/helpers/page/common/display'\nimport {\n  PlayersState,\n  PlayerUniqId,\n  setCurrentPlaying,\n  setIsLoading\n} from '@src/js/redux/playersReducer'\nimport { store } from '@src/js/redux/store'\nimport { selectFilmHistoryById } from '@src/js/redux/filmHistoryReducer'\nimport { NFB_PLAYER_EVENTS, NFBVideo } from '@src/js/wc/NFBVideo'\nimport { displayNextWork } from '@src/js/helpers/page/common/queue'\nimport { isDialogAvailable } from '@src/js/helpers/browser'\n\n// @ts-expect-error Lit Sass import\nimport playerStyles from '@src/sass/wc/NFBWorkPagePlayer.sass?lit'\n\nenum PlayerModalLayout {\n  FULLSCREEN = 'fullscreen', // work page\n  CENTERED = 'centered' // chapter legacy page\n}\n\n@customElement('nfb-player-modal')\nexport class NFBPlayerModal extends LitElement {\n  @property({ type: String })\n  layout: PlayerModalLayout = PlayerModalLayout.FULLSCREEN\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-chapter' })\n  isChapter: boolean = false\n\n  @state()\n  currentPlaying: PlayerUniqId | null\n\n  @state()\n  isPlayerLoading: boolean = false\n\n  @state()\n  isPlayerSwitching: boolean = false\n\n  @query('nfb-video')\n  nfbVideo!: NFBVideo\n\n  @query('dialog')\n  _dialog!: HTMLDialogElement\n\n  _playersState: PlayersState\n  _isOpen: boolean\n\n  static styles = [\n    playerStyles\n  ]\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n    this.hideModal = this.hideModal.bind(this)\n    this.resetCurrentPlaying = this.resetCurrentPlaying.bind(this)\n    store.subscribe(this.stateChanged)\n  }\n\n  protected async firstUpdated (): Promise<void> {\n    await this.updateComplete\n\n    // Dialog polyfill for old browser\n    if (!isDialogAvailable()) {\n      dialogPolyfill.registerDialog(this._dialog)\n    }\n\n    // This is related to the bug EO-7363, For certain buttons in the player\n    // the keydown event is not caught by the eventlistener when the focus is on it.\n    // Ex. when pressing ESC after clicking on the play/pause button.\n    // It looks like the Button component of video.js is intercepting it.\n    // Since we use the dialog element, it seems best to listen to the close event of the dialog.\n    this._dialog?.addEventListener('close', this.resetCurrentPlaying)\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    document.addEventListener(NFB_PLAYER_EVENTS.BACK_BUTTON_CLICKED, this.resetCurrentPlaying)\n  }\n\n  disconnectedCallback (): void {\n    super.disconnectedCallback()\n    document.removeEventListener(NFB_PLAYER_EVENTS.BACK_BUTTON_CLICKED, this.resetCurrentPlaying)\n  }\n\n  stateChanged (): void {\n    const oldPlaying = this._playersState?.currentPlaying\n    const oldLoading = this._playersState?.isLoading\n    let playingOrLoadingChanged = false\n\n    this._playersState = store.getState().players\n\n    // Playing work changed\n    if (JSON.stringify(oldPlaying) !== JSON.stringify(this._playersState.currentPlaying)) {\n      playingOrLoadingChanged = true\n      this.currentPlaying = this._playersState.currentPlaying\n\n      // We are switching video\n      if (this._dialog?.open && oldPlaying !== null && this.currentPlaying !== null) {\n        this.isPlayerSwitching = true\n      }\n\n      // Dispatch loading if current playing\n      if (this.currentPlaying !== null) {\n        this.isPlayerLoading = true\n        store.dispatch(setIsLoading(true))\n      }\n\n      this._playersState = store.getState().players\n    }\n\n    // Loading changed\n    if (oldLoading !== this._playersState.isLoading) {\n      playingOrLoadingChanged = true\n      this.isPlayerLoading = this._playersState.isLoading\n      if (this.isPlayerLoading === false) {\n        if (this.isPlayerSwitching) {\n          // if player was switching video\n          // send resume for new episode/film if needed\n          this.maySendResume()\n        }\n        this.isPlayerSwitching = false\n      }\n    }\n\n    // Playing or loading changed\n    if (playingOrLoadingChanged) {\n      // Set data attributes to root element.\n      // Used by a CSS rules that disables scrolling when a film is playing.\n      // (See work_page.sass)\n      this.setAttribute('is-playing', (this.currentPlaying !== null).toString())\n      this.setAttribute('is-loading', this.isPlayerLoading.toString())\n      this.setAttribute('is-switching', this.isPlayerSwitching.toString())\n\n      if (this.currentPlaying !== null && (this.isPlayerLoading === false || this.isPlayerSwitching === true)) {\n        this.showModal()\n      } else {\n        const currentDisplayedId = store.getState().workPage.displayedRegistryId\n        if (currentDisplayedId) {\n        // Wait for header image to be loaded\n          executeAfterRegistryIdIsDisplayed(currentDisplayedId, () => {\n            this.hideModal()\n          })\n        } else {\n          this.hideModal()\n        }\n      }\n    }\n  }\n\n  async resetCurrentPlaying () {\n    if (this.nfbVideo?.isReady && this.currentPlaying) {\n      // save progress before reset & hide\n      await this.nfbVideo.saveProgress()\n      const filmHistory = selectFilmHistoryById(store.getState().filmHistory, this.currentPlaying?.registryId)\n      if (filmHistory?.is_completed && this.currentPlaying) {\n        // If is_completed, destroy instance to reset video events\n        this.nfbVideo.destroyVideoJsInstance(this.currentPlaying)\n\n        // should display next instance\n        await displayNextWork(this.currentPlaying.registryId)\n      }\n\n      store.dispatch(setCurrentPlaying(null))\n    } else {\n      store.dispatch(setCurrentPlaying(null))\n    }\n  }\n\n  showModal () {\n    // Check if modal alreay opened to prevent useless listener\n    // and resending resume\n    if (!this._isOpen) {\n      this._isOpen = true\n      this._dialog.showModal()\n      this.maySendResume()\n    }\n  }\n\n  maySendResume () {\n    // We want to send resume everytime the player is opened (if current time > 0)\n    if (this.nfbVideo.playerExposed && this.nfbVideo.playerExposed?.currentTime > 0) {\n      this.nfbVideo.playerStats.sendResume()\n    }\n  }\n\n  hideModal () {\n    if (this._isOpen) {\n      this._isOpen = false\n      this.nfbVideo?.pause()\n      this._dialog.close()\n      const lastClickedElement = store.getState()?.workPage?.lastClickElement\n\n      if (lastClickedElement) {\n        handleFocusOnLastElementClicked(null, lastClickedElement)\n      }\n    }\n  }\n\n  getClasses () {\n    return {\n      'nfb-work-page__player-modal': true,\n      'nfb-work-page-player': true,\n      'nfb-work-page__player-modal--chapter': this.layout === PlayerModalLayout.CENTERED\n    }\n  }\n\n  renderVideoElement () {\n    if (!this.currentPlaying) {\n      return nothing\n    }\n\n    return html`\n      <nfb-video\n        is-chapter=${this.isChapter}\n        registry-id=\"${this.currentPlaying.registryId}\"\n        slug=\"${this.currentPlaying.slug}\"\n        stream-type=\"${this.currentPlaying.streamType}\"\n      ></nfb-video>\n    `\n  }\n\n  render () {\n    return html`\n    <dialog\n      class=\"${classMap(this.getClasses())}\"\n    >\n        ${this.layout === PlayerModalLayout.CENTERED\n    ? html`\n        <div class=\"nfb-work-page__player-modal-close-button-container _nfb--is-high-index\">\n          <nfb-button\n            @click=\"${this.resetCurrentPlaying}\"\n            primary-variant=\"round-with-icon\"\n            is-dark=\"true\"\n            icon-name=\"delete-o\"\n          >\n          </nfb-button>\n        </div>\n        <div class=\"nfb-work-page__player-container\">\n          ${this.renderVideoElement()}\n        </div>\n        `\n    : html`\n      ${this.renderVideoElement()}\n    `}\n    </dialog>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-share-modal {\n  --nfb-share-modal-background-color: #FFFFFF;\n  --nfb-share-modal-text-color: #000000;\n  --nfb-share-modal-border-color: transparent;\n}\n\n.nfb-share-modal--dark {\n  --nfb-share-modal-background-color: #000000;\n  --nfb-share-modal-text-color: #FFFFFF;\n  --nfb-share-modal-border-color: #626065;\n}\n\n.nfb-share-modal--dark .nfb-modal__header {\n  border: none;\n  border-bottom: 1px solid var(--nfb-share-modal-border-color);\n}\n\n.nfb-share-modal.nfb-modal {\n  --nfb-modal-min-width-mobile: 390px;\n  z-index: 1000;\n}\n\n.nfb-share-modal.nfb-modal .nfb-form__text-container--simple input[readonly], .nfb-share-modal.nfb-modal .nfb-form__text-container--multiple textarea[readonly] {\n  color: #000;\n}\n\n.nfb-share-modal.nfb-modal .nfb-modal__container {\n  background-color: var(--nfb-share-modal-background-color);\n  color: var(--nfb-share-modal-text-color);\n  border: 1px solid var(--nfb-share-modal-border-color);\n}\n\n.nfb-share-modal.nfb-modal .nfb-modal__close-button:hover {\n  color: #05ee80;\n}\n\n.nfb-share-modal.nfb-modal .nfb-modal__body {\n  padding-bottom: 2rem;\n}\n\n.nfb-share-modal.nfb-modal .nfb-modal__content {\n  justify-content: center;\n  align-items: center;\n}\n\n.nfb-share-modal__buttons, .nfb-share-modal__link {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n}\n\n.nfb-share-modal__buttons {\n  margin-bottom: 1.5rem;\n  list-style-type: none;\n  gap: 2rem;\n}\n\n.nfb-share-modal__link {\n  margin-bottom: 2rem;\n  gap: 1rem;\n  width: 90%;\n}\n\n.nfb-share-modal__link > * input {\n  width: 100%;\n}\n\n.nfb-share-modal .nfb-form__element-container {\n  position: relative;\n  min-width: 0;\n  flex-grow: 1;\n}\n\n.nfb-share-modal .nfb-form__message {\n  position: absolute;\n  bottom: -4px;\n  transform: translateY(100%);\n}\n\n.nfb-share-modal__link-pasted {\n  font-family: \"Ciutadella\", -apple-system, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", \"Helvetica\", \"Arial\", sans-serif;\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: #000;\n  color: var(--nfb-share-modal-text-color);\n}\n\n@media screen and (max-width: 768px), print {\n  .nfb-share-modal__link {\n    padding: 0 10px;\n  }\n  .nfb-share-modal__link > *:not(:last-child) {\n    margin-right: 0.5rem;\n  }\n}`;\nexport default styles;\n","import { LitElement, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport { GTMShare, GTMContentType } from '@src/js/types/GTM'\nimport { GTM_EVENTS } from '@src/js/constants'\n\nexport const SHARE_METHOD_LIST = {\n  FACEBOOK: 'Facebook',\n  TWITTER: 'Twitter',\n  EMAIL: 'Email'\n} as const\n\ntype ObjectValues<T> = T[keyof T]\nexport type ShareMethodType = ObjectValues<typeof SHARE_METHOD_LIST>\n\n@customElement('nfb-share-button')\nexport default class NFBShareButton extends LitElement {\n  @property({ type: String })\n  icon: string = 'facebook'\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark: boolean = true\n\n  @property({ type: String })\n  method: ShareMethodType = SHARE_METHOD_LIST.FACEBOOK\n\n  @property({ type: String })\n  title: string\n\n  @property({ type: String })\n  url: string\n\n  @state()\n  arialLabel: string\n\n  // Info sent to GTM, could be slug (for playlist) or registry id\n  @property({ type: String, attribute: 'item-id' })\n  itemId: string\n\n  // Info sent to GTM, could be empty if no registry id (for playlist)\n  @property({ type: String, attribute: 'registry-id' })\n  registryId: string\n\n  // Info sent to GTM\n  @property({ type: String, attribute: 'content-type' })\n  contentType: GTMContentType\n\n  connectedCallback (): void {\n    super.connectedCallback()\n\n    if (this.method === SHARE_METHOD_LIST.FACEBOOK) {\n      this.loadFacebookSDK()\n    }\n  }\n\n  attributeChangedCallback (name: string, _old: string | null, value: string | null): void {\n    super.attributeChangedCallback(name, _old, value)\n    if (name === 'title') {\n      this.initAriaLabel()\n    }\n  }\n\n  initAriaLabel () {\n    let text = ''\n    switch (this.method) {\n    case SHARE_METHOD_LIST.FACEBOOK:\n      text = window.gettext('Share %s on Facebook')\n      break\n    case SHARE_METHOD_LIST.TWITTER:\n      text = window.gettext('Share %s on X')\n      break\n    case SHARE_METHOD_LIST.EMAIL:\n      text = window.gettext('Share %s by email')\n      break\n    }\n    this.ariaLabel = window.interpolate(text, [this.title])\n  }\n\n  loadFacebookSDK () {\n    if (!window.fbAsyncInit) {\n      window.fbAsyncInit = () => {\n        window.FB?.init({\n          appId: window.FB_APP_ID,\n          xfbml: true,\n          version: 'v21.0'\n        })\n      }\n\n      // Add sdk script\n      const s = document.createElement('script')\n      s.type = 'text/javascript'\n      s.async = true\n      s.defer = true\n      s.src = `https://connect.facebook.net/${window.LOCALE === 'fr' ? 'fr_CA' : 'en_CA'}/sdk.js`\n      const x = document.getElementsByTagName('script')[0]\n      x.parentNode?.insertBefore(s, x)\n    }\n  }\n\n  onClick () {\n    switch (this.method) {\n    case SHARE_METHOD_LIST.FACEBOOK:\n      this.shareOnFacebook()\n      break\n    case SHARE_METHOD_LIST.TWITTER:\n      this.shareOnTwitter()\n      break\n    case SHARE_METHOD_LIST.EMAIL:\n      this.shareByEmail()\n      break\n    }\n    this.sentGTMEvent()\n  }\n\n  shareOnFacebook () {\n    window.FB?.ui({\n      method: 'share',\n      href: this.url\n    })\n  }\n\n  shareOnTwitter () {\n    let shareURL = 'https://twitter.com/intent/tweet'\n    shareURL += `?text=${encodeURIComponent(this.title)}`\n    shareURL += `&url=${encodeURIComponent(this.url)}`\n\n    window.open(\n      shareURL,\n      '',\n      'menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=350,width=600'\n    )\n  }\n\n  shareByEmail () {\n    let shareURL = 'mailto:'\n    shareURL += `?subject=${encodeURIComponent(this.title)}`\n    shareURL += `&body=${encodeURIComponent(this.url)}`\n\n    window.open(shareURL)\n  }\n\n  sentGTMEvent () {\n    const event: GTMShare = {\n      event: GTM_EVENTS.SHARE,\n      method: this.method,\n      item_id: this.itemId,\n      nfb_version_id: this.registryId,\n      content_type: this.contentType,\n      link_url: this.url\n    }\n    window.dataLayer?.push(event)\n  }\n\n  render () {\n    return html`\n      <nfb-button\n        @click=\"${this.onClick}\"\n        is-dark=\"${this.isDark}\"\n        primary-variant=\"round-with-icon\"\n        icon-name=\"${this.icon}\"\n        aria-label=\"${this.ariaLabel}\"\n      ></nfb-button>\n    `\n  }\n}\n","import { LitElement, html, nothing } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\nimport { classMap } from 'lit/directives/class-map.js'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport { WorkCard, selectWorkById } from '@src/js/redux/worksReducer'\nimport { RootState, store } from '@src/js/redux/store'\nimport normanPaths from '@src/js/helpers/paths'\n\n// @ts-expect-error Lit Sass import\nimport formStyles from '@web-nfb/frontend-static/design-system/sass/elements/form.sass?lit'\n// @ts-expect-error Lit Sass import\nimport modalStyles from '@web-nfb/frontend-static/design-system/sass/elements/modal.sass?lit'\n// @ts-expect-error Lit Sass import\nimport shareModalstyles from '@src/sass/wc/NFBShareModal.sass?lit'\n\nimport { SHARE_METHOD_LIST, ShareMethodType } from '@src/js/wc/NFBShareButton'\n\nconst SHARE_INPUT_LIST = {\n  LINK: 'link',\n  EMBED: 'embed'\n}\n\n@customElement('nfb-share-modal')\nexport default class NFBShareModal extends LitElement {\n  @property({ type: Number, attribute: 'registry-id' })\n  registryId: number\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark: boolean = true\n\n  @property({ type: String, attribute: 'embed-template-ref' })\n  embedTemplateRef: string\n\n  @property({ type: Number, attribute: 'embed-width' })\n  embedWidth: number = 560\n\n  @property({ type: String, attribute: 'title' })\n  initialTitle: string\n\n  @property({ type: String, attribute: 'url-to-share' })\n  initialUrlToShare: string\n\n  @property({ type: String, attribute: 'content-type' })\n  initialContentType: string\n\n  @property({ type: String, attribute: 'item-id' })\n  initialItemId: string\n\n  @state()\n  title: string\n\n  @state()\n  urlToShare: string\n\n  @state()\n  contentType: string\n\n  @state()\n  itemId: string\n\n  @state()\n  linkCopied: boolean = false\n\n  @state()\n  embedTag: string\n\n  @state()\n  embedCopied: boolean = false\n\n  @query('[data-ui-el=\"share-modal-element\"]')\n  modalElement: HTMLDialogElement\n\n  @query('[data-ui-el=\"modal-inner-container-element\"]')\n  modalContainer: HTMLDivElement\n\n  _state: RootState\n\n  _work: WorkCard | null = null\n\n  static styles = [\n    formStyles,\n    modalStyles,\n    shareModalstyles\n  ]\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n    this.open = this.open.bind(this)\n    this.close = this.close.bind(this)\n    this.enableParentScrolling = this.enableParentScrolling.bind(this)\n    this.disableParentScrolling = this.disableParentScrolling.bind(this)\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    this.updateInfos()\n    store.subscribe(this.stateChanged)\n  }\n\n  protected firstUpdated (): void {\n    this.initModal()\n  }\n\n  initModal () {\n    const openButton = document.querySelector('[data-ui-el=\"share-modal-trigger\"]')\n    if (openButton) {\n      openButton.addEventListener('click', this.open)\n    }\n\n    this.modalElement.addEventListener('click', this.close)\n    this.modalElement.addEventListener('close', this.enableParentScrolling)\n    this.modalContainer.addEventListener('click', (e) => e.stopPropagation())\n  }\n\n  enableParentScrolling () {\n    document.querySelector('html')!.dataset.uiShowModal = false.toString()\n  }\n\n  disableParentScrolling () {\n    document.querySelector('html')!.dataset.uiShowModal = true.toString()\n  }\n\n  open () {\n    this.modalElement.showModal()\n    this.disableParentScrolling()\n    this.linkCopied = false\n    this.embedCopied = false\n  }\n\n  close () {\n    this.enableParentScrolling()\n    this.modalElement.close()\n  }\n\n  stateChanged () {\n    const oldWork = this._work\n\n    this._state = store.getState()\n    this._work = selectWorkById(this._state.works, this.registryId)\n    if (oldWork?.id !== this._work?.id) {\n      this.updateInfos()\n    }\n  }\n\n  updateInfos () {\n    if (this._work) {\n      this.title = this._work.title\n      this.contentType = this._work.category\n      this.urlToShare = `${location.origin}`\n      this.urlToShare += normanPaths[this._work?.category].replace('{slug}', this._work.slug)\n      this.itemId = this._work.id.toString()\n    } else {\n      this.title = this.initialTitle\n      this.contentType = this.initialContentType\n      this.urlToShare = this.initialUrlToShare\n      this.itemId = this.initialItemId\n    }\n\n    if (this.contentType === 'film') {\n      this.updateEmbedTag()\n    }\n  }\n\n  updateEmbedTag () {\n    const template = document.querySelector(this.embedTemplateRef)?.innerHTML.trim()\n    if (template) {\n      const embedRatio = 0.5625\n      const height = Math.ceil(this.embedWidth * embedRatio)\n      this.embedTag = template\n        .replace(/width=\"(\\(\\( width \\)\\)|\\d+|)\"/g, `width=\"${this.embedWidth}\"`)\n        .replace(/height=\"(\\(\\( height \\)\\)|\\d+|)\"/g, `height=\"${height}\"`)\n        .replace(/width:(\\(\\( width \\)\\)|\\d+|)/g, `width:${this.embedWidth}`)\n    }\n  }\n\n  copyLink () {\n    navigator.clipboard.writeText(this.urlToShare)\n    this.linkCopied = true\n  }\n\n  copyEmbed () {\n    navigator.clipboard.writeText(this.embedTag)\n    this.embedCopied = true\n  }\n\n  renderShareIcon (method: ShareMethodType) {\n    let icon; let dataCy = ''\n    switch (method) {\n    case SHARE_METHOD_LIST.FACEBOOK:\n      icon = 'facebook'\n      dataCy = 'facebook-share-button'\n      break\n    case SHARE_METHOD_LIST.TWITTER:\n      icon = 'twitter-x'\n      dataCy = 'twitter-share-button'\n      break\n    case SHARE_METHOD_LIST.EMAIL:\n      icon = 'enveloppe-o'\n      dataCy = 'email-share-button'\n      break\n    }\n\n    return html`\n      <li class=\"nfb-share-modal__button\">\n        <nfb-share-button\n          icon=\"${icon}\"\n          method=\"${method}\"\n          is-dark=\"${this.isDark}\"\n          url=\"${this.urlToShare}\"\n          content-type=\"${this.contentType}\"\n          title=\"${this.title}\"\n          item-id=\"${this.itemId}\"\n          registry-id=\"${this.registryId}\"\n          data-cy=\"${dataCy}\"\n        ></nfb-share-button>\n      </li>`\n  }\n\n  renderShareInput (input: string) {\n    let icon, value, copied, copyFunction, dataCy\n    switch (input) {\n    case SHARE_INPUT_LIST.LINK:\n      icon = 'link'\n      value = this.urlToShare\n      copied = this.linkCopied\n      copyFunction = this.copyLink\n      dataCy = 'link-input'\n      break\n    case SHARE_INPUT_LIST.EMBED:\n      icon = 'embed'\n      value = this.embedTag\n      copied = this.embedCopied\n      copyFunction = this.copyEmbed\n      dataCy = 'embed-input'\n      break\n    }\n    return html`\n      <div class=\"nfb-share-modal__link nfb-form\">\n        <nfb-icon name=\"${icon}\"></nfb-icon>\n        <div class=\"nfb-form__element-container\">\n          <div class=\"nfb-form__text-container--simple\">\n            <input\n              class=\"nfb-font__body--lg--sans nfb-form__text--simple\"\n              type=\"text\"\n              readonly\n              value=\"${value}\"\n              data-cy=\"${dataCy}\"\n            >\n          </div>\n          ${copied\n    ? html`\n          <div class=\"nfb-form__message\">\n            <span class=\"nfb-share-modal__link-pasted\">\n              ${window.pgettext('Share modal', 'Pasted to clipboard!')}\n            </span>\n          </div>`\n    : nothing}\n        </div>\n        <nfb-button\n          @click=\"${copyFunction}\"\n          is-dark=\"${this.isDark}\"\n          text=\"${window.pgettext('Share modal', 'copy')}\"\n        ></nfb-button>\n      </div>\n    `\n  }\n\n  render () {\n    return html`\n    <dialog\n      class=\"${classMap({ 'nfb-modal': true, 'nfb-share-modal': true, 'nfb-share-modal--dark': this.isDark })}\"\n      data-ui-el=\"share-modal-element\"\n    >\n      <div class=\"nfb-modal__container--vertical\">\n        <div\n          class=\"nfb-modal__container--horizontal nfb-modal__container\"\n          data-ui-el=\"modal-inner-container-element\"\n        > \n          <div class=\"nfb-modal__header\">\n            <div class=\"nfb-modal__header-title\">${window.pgettext('Share modal title', 'Share')}</div>\n            <nfb-button\n              is-dark=\"${this.isDark}\"\n              icon-name=\"delete-o\"\n              primary-variant=\"round-with-icon\"\n              @click=\"${this.close}\"\n              data-cy=\"share-modal-close-button\"\n            >\n            </nfb-button>\n          </div>\n          <div class=\"nfb-modal__body\">\n            <div class=\"nfb-modal__content\">\n              <ul class=\"nfb-share-modal__buttons\">\n                  ${this.renderShareIcon(SHARE_METHOD_LIST.FACEBOOK)}\n                  ${this.renderShareIcon(SHARE_METHOD_LIST.TWITTER)}\n                  ${this.renderShareIcon(SHARE_METHOD_LIST.EMAIL)}\n              </ul>\n              ${this.renderShareInput(SHARE_INPUT_LIST.LINK)}\n              ${this._work?.category === 'film' ? this.renderShareInput(SHARE_INPUT_LIST.EMBED) : nothing}\n            </div>\n          </div>\n        </div>\n      </div>\n    </dialog>`\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`@charset \"UTF-8\";\n.vjs-svg-icon {\n  display: inline-block;\n  background-repeat: no-repeat;\n  background-position: center;\n  fill: currentColor;\n  height: 1.8em;\n  width: 1.8em;\n}\n\n.vjs-svg-icon:before {\n  content: none !important;\n}\n\n.vjs-svg-icon:hover, .vjs-control:focus .vjs-svg-icon {\n  filter: drop-shadow(0 0 0.25em #fff);\n}\n\n.vjs-modal-dialog .vjs-modal-dialog-content, .video-js .vjs-modal-dialog, .vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.vjs-button > .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\n  text-align: center;\n}\n\n.vjs-icon-play, .video-js .vjs-play-control .vjs-icon-placeholder, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button .vjs-icon-placeholder, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-play:before, .video-js .vjs-play-control .vjs-icon-placeholder:before, .video-js .vjs-big-play-button .vjs-icon-placeholder:before {\n  content: \"\\\\f101\";\n}\n\n.vjs-icon-play-circle {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-play-circle:before {\n  content: \"\\\\f102\";\n}\n\n.vjs-icon-pause, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder, .video-js.vjs-nfb-theme-balmoral-neue .vjs-playing.vjs-big-play-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-pause:before, .video-js .vjs-play-control.vjs-playing .vjs-icon-placeholder:before, .video-js.vjs-nfb-theme-balmoral-neue .vjs-playing.vjs-big-play-button .vjs-icon-placeholder:before {\n  content: \"\\\\f103\";\n}\n\n.vjs-icon-volume-mute, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-volume-mute:before, .video-js .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder:before {\n  content: \"\\\\f104\";\n}\n\n.vjs-icon-volume-low, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-volume-low:before, .video-js .vjs-mute-control.vjs-vol-1 .vjs-icon-placeholder:before {\n  content: \"\\\\f105\";\n}\n\n.vjs-icon-volume-mid, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-volume-mid:before, .video-js .vjs-mute-control.vjs-vol-2 .vjs-icon-placeholder:before {\n  content: \"\\\\f106\";\n}\n\n.vjs-icon-volume-high, .video-js .vjs-mute-control .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-volume-high:before, .video-js .vjs-mute-control .vjs-icon-placeholder:before {\n  content: \"\\\\f107\";\n}\n\n.vjs-icon-fullscreen-enter, .video-js .vjs-fullscreen-control .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-fullscreen-enter:before, .video-js .vjs-fullscreen-control .vjs-icon-placeholder:before {\n  content: \"\\\\f108\";\n}\n\n.vjs-icon-fullscreen-exit, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-fullscreen-exit:before, .video-js.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder:before {\n  content: \"\\\\f109\";\n}\n\n.vjs-icon-spinner {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-spinner:before {\n  content: \"\\\\f10a\";\n}\n\n.vjs-icon-subtitles, .video-js .vjs-subs-caps-button .vjs-icon-placeholder, .video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-subtitles-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-subtitles:before, .video-js .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js.video-js:lang(en-GB) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js.video-js:lang(en-IE) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js.video-js:lang(en-AU) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js.video-js:lang(en-NZ) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-subtitles-button .vjs-icon-placeholder:before {\n  content: \"\\\\f10b\";\n}\n\n.vjs-icon-captions, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder, .video-js .vjs-captions-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-captions:before, .video-js:lang(en) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js:lang(fr-CA) .vjs-subs-caps-button .vjs-icon-placeholder:before, .video-js .vjs-captions-button .vjs-icon-placeholder:before {\n  content: \"\\\\f10c\";\n}\n\n.vjs-icon-hd {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-hd:before {\n  content: \"\\\\f10d\";\n}\n\n.vjs-icon-chapters, .video-js .vjs-chapters-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-chapters:before, .video-js .vjs-chapters-button .vjs-icon-placeholder:before {\n  content: \"\\\\f10e\";\n}\n\n.vjs-icon-downloading {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-downloading:before {\n  content: \"\\\\f10f\";\n}\n\n.vjs-icon-file-download {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-file-download:before {\n  content: \"\\\\f110\";\n}\n\n.vjs-icon-file-download-done {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-file-download-done:before {\n  content: \"\\\\f111\";\n}\n\n.vjs-icon-file-download-off {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-file-download-off:before {\n  content: \"\\\\f112\";\n}\n\n.vjs-icon-share {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-share:before {\n  content: \"\\\\f113\";\n}\n\n.vjs-icon-cog {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-cog:before {\n  content: \"\\\\f114\";\n}\n\n.vjs-icon-square {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-square:before {\n  content: \"\\\\f115\";\n}\n\n.vjs-icon-circle, .vjs-seek-to-live-control .vjs-icon-placeholder, .video-js .vjs-volume-level, .video-js .vjs-play-progress {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-circle:before, .vjs-seek-to-live-control .vjs-icon-placeholder:before, .video-js .vjs-volume-level:before, .video-js .vjs-play-progress:before {\n  content: \"\\\\f116\";\n}\n\n.vjs-icon-circle-outline {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-circle-outline:before {\n  content: \"\\\\f117\";\n}\n\n.vjs-icon-circle-inner-circle {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-circle-inner-circle:before {\n  content: \"\\\\f118\";\n}\n\n.vjs-icon-cancel, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-cancel:before, .video-js .vjs-control.vjs-close-button .vjs-icon-placeholder:before {\n  content: \"\\\\f119\";\n}\n\n.vjs-icon-repeat {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-repeat:before {\n  content: \"\\\\f11a\";\n}\n\n.vjs-icon-replay, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder, .video-js.vjs-nfb-theme-balmoral-neue .vjs-ended.vjs-big-play-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-replay:before, .video-js .vjs-play-control.vjs-ended .vjs-icon-placeholder:before, .video-js.vjs-nfb-theme-balmoral-neue .vjs-ended.vjs-big-play-button .vjs-icon-placeholder:before {\n  content: \"\\\\f11b\";\n}\n\n.vjs-icon-replay-5, .video-js .vjs-skip-backward-5 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-replay-5:before, .video-js .vjs-skip-backward-5 .vjs-icon-placeholder:before {\n  content: \"\\\\f11c\";\n}\n\n.vjs-icon-replay-10, .video-js .vjs-skip-backward-10 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-replay-10:before, .video-js .vjs-skip-backward-10 .vjs-icon-placeholder:before {\n  content: \"\\\\f11d\";\n}\n\n.vjs-icon-replay-30, .video-js .vjs-skip-backward-30 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-replay-30:before, .video-js .vjs-skip-backward-30 .vjs-icon-placeholder:before {\n  content: \"\\\\f11e\";\n}\n\n.vjs-icon-forward-5, .video-js .vjs-skip-forward-5 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-forward-5:before, .video-js .vjs-skip-forward-5 .vjs-icon-placeholder:before {\n  content: \"\\\\f11f\";\n}\n\n.vjs-icon-forward-10, .video-js .vjs-skip-forward-10 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-forward-10:before, .video-js .vjs-skip-forward-10 .vjs-icon-placeholder:before {\n  content: \"\\\\f120\";\n}\n\n.vjs-icon-forward-30, .video-js .vjs-skip-forward-30 .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-forward-30:before, .video-js .vjs-skip-forward-30 .vjs-icon-placeholder:before {\n  content: \"\\\\f121\";\n}\n\n.vjs-icon-audio, .video-js .vjs-audio-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-audio:before, .video-js .vjs-audio-button .vjs-icon-placeholder:before {\n  content: \"\\\\f122\";\n}\n\n.vjs-icon-next-item {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-next-item:before {\n  content: \"\\\\f123\";\n}\n\n.vjs-icon-previous-item {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-previous-item:before {\n  content: \"\\\\f124\";\n}\n\n.vjs-icon-shuffle {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-shuffle:before {\n  content: \"\\\\f125\";\n}\n\n.vjs-icon-cast {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-cast:before {\n  content: \"\\\\f126\";\n}\n\n.vjs-icon-picture-in-picture-enter, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-picture-in-picture-enter:before, .video-js .vjs-picture-in-picture-control .vjs-icon-placeholder:before {\n  content: \"\\\\f127\";\n}\n\n.vjs-icon-picture-in-picture-exit, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-picture-in-picture-exit:before, .video-js.vjs-picture-in-picture .vjs-picture-in-picture-control .vjs-icon-placeholder:before {\n  content: \"\\\\f128\";\n}\n\n.vjs-icon-facebook {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-facebook:before {\n  content: \"\\\\f129\";\n}\n\n.vjs-icon-linkedin {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-linkedin:before {\n  content: \"\\\\f12a\";\n}\n\n.vjs-icon-twitter {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-twitter:before {\n  content: \"\\\\f12b\";\n}\n\n.vjs-icon-tumblr {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-tumblr:before {\n  content: \"\\\\f12c\";\n}\n\n.vjs-icon-pinterest {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-pinterest:before {\n  content: \"\\\\f12d\";\n}\n\n.vjs-icon-audio-description, .video-js .vjs-descriptions-button .vjs-icon-placeholder {\n  font-family: VideoJS;\n  font-weight: 400;\n  font-style: normal;\n}\n\n.vjs-icon-audio-description:before, .video-js .vjs-descriptions-button .vjs-icon-placeholder:before {\n  content: \"\\\\f12e\";\n}\n\n.video-js {\n  display: inline-block;\n  vertical-align: top;\n  box-sizing: border-box;\n  color: #fff;\n  background-color: #000;\n  position: relative;\n  padding: 0;\n  font-size: 10px;\n  line-height: 1;\n  font-weight: 400;\n  font-style: normal;\n  font-family: Arial, Helvetica, sans-serif;\n  word-break: initial;\n}\n\n.video-js:-moz-full-screen {\n  position: absolute;\n}\n\n.video-js:-webkit-full-screen {\n  width: 100% !important;\n  height: 100% !important;\n}\n\n.video-js[tabindex=\"-1\"] {\n  outline: none;\n}\n\n.video-js *, .video-js *:before, .video-js *:after {\n  box-sizing: inherit;\n}\n\n.video-js ul {\n  font-family: inherit;\n  font-size: inherit;\n  line-height: inherit;\n  list-style-position: outside;\n  margin: 0;\n}\n\n.video-js.vjs-fluid, .video-js.vjs-16-9, .video-js.vjs-4-3, .video-js.vjs-9-16, .video-js.vjs-1-1 {\n  width: 100%;\n  max-width: 100%;\n}\n\n.video-js.vjs-fluid:not(.vjs-audio-only-mode), .video-js.vjs-16-9:not(.vjs-audio-only-mode), .video-js.vjs-4-3:not(.vjs-audio-only-mode), .video-js.vjs-9-16:not(.vjs-audio-only-mode), .video-js.vjs-1-1:not(.vjs-audio-only-mode) {\n  height: 0;\n}\n\n.video-js.vjs-16-9:not(.vjs-audio-only-mode) {\n  padding-top: 56.25%;\n}\n\n.video-js.vjs-4-3:not(.vjs-audio-only-mode) {\n  padding-top: 75%;\n}\n\n.video-js.vjs-9-16:not(.vjs-audio-only-mode) {\n  padding-top: 177.7777777778%;\n}\n\n.video-js.vjs-1-1:not(.vjs-audio-only-mode) {\n  padding-top: 100%;\n}\n\n.video-js.vjs-fill:not(.vjs-audio-only-mode) {\n  width: 100%;\n  height: 100%;\n}\n\n.video-js .vjs-tech {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.video-js.vjs-audio-only-mode .vjs-tech {\n  display: none;\n}\n\nbody.vjs-full-window, body.vjs-pip-window {\n  padding: 0;\n  margin: 0;\n  height: 100%;\n}\n\n.vjs-full-window .video-js.vjs-fullscreen, body.vjs-pip-window .video-js {\n  position: fixed;\n  overflow: hidden;\n  z-index: 1000;\n  inset: 0;\n}\n\n.video-js.vjs-fullscreen:not(.vjs-ios-native-fs), body.vjs-pip-window .video-js {\n  width: 100% !important;\n  height: 100% !important;\n  padding-top: 0 !important;\n  display: block;\n}\n\n.video-js.vjs-fullscreen.vjs-user-inactive {\n  cursor: none;\n}\n\n.vjs-pip-container .vjs-pip-text {\n  position: absolute;\n  bottom: 10%;\n  font-size: 2em;\n  background-color: rgba(0, 0, 0, 0.7019607843);\n  padding: 0.5em;\n  text-align: center;\n  width: 100%;\n}\n\n.vjs-layout-tiny.vjs-pip-container .vjs-pip-text, .vjs-layout-x-small.vjs-pip-container .vjs-pip-text, .vjs-layout-small.vjs-pip-container .vjs-pip-text {\n  bottom: 0;\n  font-size: 1.4em;\n}\n\n.vjs-hidden {\n  display: none !important;\n}\n\n.vjs-disabled {\n  opacity: 0.5;\n  cursor: default;\n}\n\n.video-js .vjs-offscreen {\n  height: 1px;\n  left: -9999px;\n  position: absolute;\n  top: 0;\n  width: 1px;\n}\n\n.vjs-lock-showing {\n  display: block !important;\n  opacity: 1 !important;\n  visibility: visible !important;\n}\n\n.vjs-no-js {\n  padding: 20px;\n  color: #fff;\n  background-color: #000;\n  font-size: 18px;\n  font-family: Arial, Helvetica, sans-serif;\n  text-align: center;\n  width: 300px;\n  height: 150px;\n  margin: 0 auto;\n}\n\n.vjs-no-js a, .vjs-no-js a:visited {\n  color: #66a8cc;\n}\n\n.video-js .vjs-big-play-button {\n  font-size: 3em;\n  line-height: 1.5em;\n  height: 1.63332em;\n  width: 3em;\n  display: block;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  padding: 0;\n  margin-top: -0.81666em;\n  margin-left: -1.5em;\n  cursor: pointer;\n  opacity: 1;\n  border: 0.06666em solid #fff;\n  background-color: #2b333f;\n  background-color: rgba(43, 51, 63, 0.7019607843);\n  border-radius: 0.3em;\n  transition: all 0.4s;\n}\n\n.vjs-big-play-button .vjs-svg-icon {\n  width: 1em;\n  height: 1em;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  line-height: 1;\n  transform: translate(-50%, -50%);\n}\n\n.video-js:hover .vjs-big-play-button, .video-js .vjs-big-play-button:focus {\n  border-color: #fff;\n  background-color: #73859f;\n  background-color: rgba(115, 133, 159, 0.5019607843);\n  transition: all 0s;\n}\n\n.vjs-controls-disabled .vjs-big-play-button, .vjs-has-started .vjs-big-play-button, .vjs-using-native-controls .vjs-big-play-button, .vjs-error .vjs-big-play-button {\n  display: none;\n}\n\n.vjs-has-started.vjs-paused.vjs-show-big-play-button-on-pause:not(.vjs-seeking):not(.vjs-scrubbing):not(.vjs-error) .vjs-big-play-button {\n  display: block;\n}\n\n.video-js button {\n  background: none;\n  border: none;\n  color: inherit;\n  display: inline-block;\n  font-size: inherit;\n  line-height: inherit;\n  text-transform: none;\n  -webkit-text-decoration: none;\n  text-decoration: none;\n  transition: none;\n  -webkit-appearance: none;\n  appearance: none;\n}\n\n.video-js.vjs-spatial-navigation-enabled .vjs-button:focus {\n  outline: 0.0625em solid white;\n  box-shadow: none;\n}\n\n.vjs-control .vjs-button {\n  width: 100%;\n  height: 100%;\n}\n\n.video-js .vjs-control.vjs-close-button {\n  cursor: pointer;\n  height: 3em;\n  position: absolute;\n  right: 0;\n  top: 0.5em;\n  z-index: 2;\n}\n\n.video-js .vjs-modal-dialog {\n  background: rgba(0, 0, 0, 0.8);\n  background: linear-gradient(180deg, rgba(0, 0, 0, 0.8), rgba(255, 255, 255, 0));\n  overflow: auto;\n}\n\n.video-js .vjs-modal-dialog > * {\n  box-sizing: border-box;\n}\n\n.vjs-modal-dialog .vjs-modal-dialog-content {\n  font-size: 1.2em;\n  line-height: 1.5;\n  padding: 20px 24px;\n  z-index: 1;\n}\n\n.vjs-menu-button {\n  cursor: pointer;\n}\n\n.vjs-menu-button.vjs-disabled {\n  cursor: default;\n}\n\n.vjs-workinghover .vjs-menu-button.vjs-disabled:hover .vjs-menu {\n  display: none;\n}\n\n.vjs-menu .vjs-menu-content {\n  display: block;\n  padding: 0;\n  margin: 0;\n  font-family: Arial, Helvetica, sans-serif;\n  overflow: auto;\n}\n\n.vjs-menu .vjs-menu-content > * {\n  box-sizing: border-box;\n}\n\n.vjs-scrubbing .vjs-control.vjs-menu-button:hover .vjs-menu {\n  display: none;\n}\n\n.vjs-menu li {\n  display: flex;\n  justify-content: center;\n  list-style: none;\n  margin: 0;\n  padding: 0.2em 0;\n  line-height: 1.4em;\n  font-size: 1.2em;\n  text-align: center;\n  text-transform: lowercase;\n}\n\n.vjs-menu li.vjs-menu-item:focus, .vjs-menu li.vjs-menu-item:hover, .js-focus-visible .vjs-menu li.vjs-menu-item:hover {\n  background-color: #73859f;\n  background-color: rgba(115, 133, 159, 0.5019607843);\n}\n\n.vjs-menu li.vjs-selected, .vjs-menu li.vjs-selected:focus, .vjs-menu li.vjs-selected:hover, .js-focus-visible .vjs-menu li.vjs-selected:hover {\n  background-color: #fff;\n  color: #2b333f;\n}\n\n.vjs-menu li.vjs-selected .vjs-svg-icon, .vjs-menu li.vjs-selected:focus .vjs-svg-icon, .vjs-menu li.vjs-selected:hover .vjs-svg-icon, .js-focus-visible .vjs-menu li.vjs-selected:hover .vjs-svg-icon {\n  fill: #000;\n}\n\n.video-js .vjs-menu *:not(.vjs-selected):focus:not(:focus-visible), .js-focus-visible .vjs-menu *:not(.vjs-selected):focus:not(.focus-visible) {\n  background: none;\n}\n\n.vjs-menu li.vjs-menu-title {\n  text-align: center;\n  text-transform: uppercase;\n  font-size: 1em;\n  line-height: 2em;\n  padding: 0;\n  margin: 0 0 0.3em;\n  font-weight: 700;\n  cursor: default;\n}\n\n.vjs-menu-button-popup .vjs-menu {\n  display: none;\n  position: absolute;\n  bottom: 0;\n  width: 10em;\n  left: -3em;\n  height: 0em;\n  margin-bottom: 1.5em;\n  border-top-color: rgba(43, 51, 63, 0.7019607843);\n}\n\n.vjs-pip-window .vjs-menu-button-popup .vjs-menu {\n  left: unset;\n  right: 1em;\n}\n\n.vjs-menu-button-popup .vjs-menu .vjs-menu-content {\n  background-color: #2b333f;\n  background-color: rgba(43, 51, 63, 0.7019607843);\n  position: absolute;\n  width: 100%;\n  bottom: 1.5em;\n  max-height: 15em;\n}\n\n.vjs-layout-tiny .vjs-menu-button-popup .vjs-menu .vjs-menu-content, .vjs-layout-x-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\n  max-height: 5em;\n}\n\n.vjs-layout-small .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\n  max-height: 10em;\n}\n\n.vjs-layout-medium .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\n  max-height: 14em;\n}\n\n.vjs-layout-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content, .vjs-layout-x-large .vjs-menu-button-popup .vjs-menu .vjs-menu-content, .vjs-layout-huge .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\n  max-height: 25em;\n}\n\n.vjs-workinghover .vjs-menu-button-popup.vjs-hover .vjs-menu, .vjs-menu-button-popup .vjs-menu.vjs-lock-showing {\n  display: block;\n}\n\n.video-js .vjs-menu-button-inline {\n  transition: all 0.4s;\n  overflow: hidden;\n}\n\n.video-js .vjs-menu-button-inline:before {\n  width: 2.222222222em;\n}\n\n.video-js .vjs-menu-button-inline:hover, .video-js .vjs-menu-button-inline:focus, .video-js .vjs-menu-button-inline.vjs-slider-active {\n  width: 12em;\n}\n\n.vjs-menu-button-inline .vjs-menu {\n  opacity: 0;\n  height: 100%;\n  width: auto;\n  position: absolute;\n  left: 4em;\n  top: 0;\n  padding: 0;\n  margin: 0;\n  transition: all 0.4s;\n}\n\n.vjs-menu-button-inline:hover .vjs-menu, .vjs-menu-button-inline:focus .vjs-menu, .vjs-menu-button-inline.vjs-slider-active .vjs-menu {\n  display: block;\n  opacity: 1;\n}\n\n.vjs-menu-button-inline .vjs-menu-content {\n  width: auto;\n  height: 100%;\n  margin: 0;\n  overflow: hidden;\n}\n\n.video-js .vjs-control-bar {\n  display: none;\n  width: 100%;\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  right: 0;\n  height: 3em;\n  background-color: #2b333f;\n  background-color: rgba(43, 51, 63, 0.7019607843);\n}\n\n.video-js.vjs-spatial-navigation-enabled .vjs-control-bar {\n  gap: 1px;\n}\n\n.video-js:not(.vjs-controls-disabled):not(.vjs-using-native-controls):not(.vjs-error) .vjs-control-bar.vjs-lock-showing {\n  display: flex !important;\n}\n\n.vjs-has-started .vjs-control-bar, .vjs-audio-only-mode .vjs-control-bar {\n  display: flex;\n  visibility: visible;\n  opacity: 1;\n  transition: visibility 0.1s, opacity 0.1s;\n}\n\n.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {\n  visibility: visible;\n  opacity: 0;\n  pointer-events: none;\n  transition: visibility 1s, opacity 1s;\n}\n\n.vjs-controls-disabled .vjs-control-bar, .vjs-using-native-controls .vjs-control-bar, .vjs-error .vjs-control-bar {\n  display: none !important;\n}\n\n.vjs-audio.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar, .vjs-audio-only-mode.vjs-has-started.vjs-user-inactive.vjs-playing .vjs-control-bar {\n  opacity: 1;\n  visibility: visible;\n  pointer-events: auto;\n}\n\n.video-js .vjs-control {\n  position: relative;\n  text-align: center;\n  margin: 0;\n  padding: 0;\n  height: 100%;\n  width: 4em;\n  flex: none;\n}\n\n.video-js .vjs-control.vjs-visible-text {\n  width: auto;\n  padding-left: 1em;\n  padding-right: 1em;\n}\n\n.vjs-button > .vjs-icon-placeholder:before {\n  font-size: 1.8em;\n  line-height: 1.67;\n}\n\n.vjs-button > .vjs-icon-placeholder {\n  display: block;\n}\n\n.vjs-button > .vjs-svg-icon {\n  display: inline-block;\n}\n\n.video-js .vjs-control:focus:before, .video-js .vjs-control:hover:before, .video-js .vjs-control:focus {\n  text-shadow: 0em 0em 1em white;\n}\n\n.video-js *:not(.vjs-visible-text) > .vjs-control-text {\n  border: 0;\n  clip: rect(0 0 0 0);\n  height: 1px;\n  overflow: hidden;\n  padding: 0;\n  position: absolute;\n  width: 1px;\n}\n\n.video-js .vjs-custom-control-spacer {\n  display: none;\n}\n\n.video-js .vjs-progress-control {\n  cursor: pointer;\n  flex: auto;\n  display: flex;\n  align-items: center;\n  min-width: 4em;\n  touch-action: none;\n}\n\n.video-js .vjs-progress-control.disabled {\n  cursor: default;\n}\n\n.vjs-live .vjs-progress-control {\n  display: none;\n}\n\n.vjs-liveui .vjs-progress-control {\n  display: flex;\n  align-items: center;\n}\n\n.video-js .vjs-progress-holder {\n  flex: auto;\n  transition: all 0.2s;\n  height: 0.3em;\n}\n\n.video-js .vjs-progress-control .vjs-progress-holder {\n  margin: 0 10px;\n}\n\n.video-js .vjs-progress-control:hover .vjs-progress-holder, .video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-progress-holder {\n  font-size: 1.6666666667em;\n}\n\n.video-js .vjs-progress-control:hover .vjs-progress-holder.disabled {\n  font-size: 1em;\n}\n\n.video-js .vjs-progress-holder .vjs-play-progress, .video-js .vjs-progress-holder .vjs-load-progress, .video-js .vjs-progress-holder .vjs-load-progress div {\n  position: absolute;\n  display: block;\n  height: 100%;\n  margin: 0;\n  padding: 0;\n  width: 0;\n}\n\n.video-js .vjs-play-progress {\n  background-color: #fff;\n}\n\n.video-js .vjs-play-progress:before {\n  font-size: 0.9em;\n  position: absolute;\n  right: -0.5em;\n  line-height: 0.35em;\n  z-index: 1;\n}\n\n.vjs-svg-icons-enabled .vjs-play-progress:before {\n  content: none !important;\n}\n\n.vjs-play-progress .vjs-svg-icon {\n  position: absolute;\n  top: -0.35em;\n  right: -0.4em;\n  width: 0.9em;\n  height: 0.9em;\n  pointer-events: none;\n  line-height: 0.15em;\n  z-index: 1;\n}\n\n.video-js .vjs-load-progress {\n  background: rgba(115, 133, 159, 0.5019607843);\n}\n\n.video-js .vjs-load-progress div {\n  background: rgba(115, 133, 159, 0.7490196078);\n}\n\n.video-js .vjs-time-tooltip {\n  background-color: #fff;\n  background-color: rgba(255, 255, 255, 0.8);\n  border-radius: 0.3em;\n  color: #000;\n  float: right;\n  font-family: Arial, Helvetica, sans-serif;\n  font-size: 1em;\n  padding: 6px 8px 8px;\n  pointer-events: none;\n  position: absolute;\n  top: -3.4em;\n  visibility: hidden;\n  z-index: 1;\n}\n\n.video-js .vjs-progress-holder:focus .vjs-time-tooltip {\n  display: none;\n}\n\n.video-js .vjs-progress-control:hover .vjs-time-tooltip, .video-js .vjs-progress-control:hover .vjs-progress-holder:focus .vjs-time-tooltip, .video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-time-tooltip {\n  display: block;\n  font-size: 0.6em;\n  visibility: visible;\n}\n\n.video-js .vjs-progress-control.disabled:hover .vjs-time-tooltip {\n  font-size: 1em;\n}\n\n.video-js .vjs-progress-control .vjs-mouse-display {\n  display: none;\n  position: absolute;\n  width: 1px;\n  height: 100%;\n  background-color: #000;\n  z-index: 1;\n}\n\n.video-js .vjs-progress-control:hover .vjs-mouse-display, .video-js.vjs-scrubbing.vjs-touch-enabled .vjs-progress-control .vjs-mouse-display {\n  display: block;\n}\n\n.video-js.vjs-user-inactive .vjs-progress-control .vjs-mouse-display, .video-js.vjs-touch-enabled:not(.vjs-scrubbing) .vjs-progress-control .vjs-mouse-display {\n  visibility: hidden;\n  opacity: 0;\n  transition: visibility 1s, opacity 1s;\n}\n\n.vjs-mouse-display .vjs-time-tooltip {\n  color: #fff;\n  background-color: #000;\n  background-color: rgba(0, 0, 0, 0.8);\n}\n\n.video-js .vjs-slider {\n  position: relative;\n  cursor: pointer;\n  padding: 0;\n  margin: 0 0.45em;\n  -webkit-touch-callout: none;\n  -webkit-user-select: none;\n  user-select: none;\n  background-color: #73859f;\n  background-color: rgba(115, 133, 159, 0.5019607843);\n}\n\n.video-js .vjs-slider.disabled {\n  cursor: default;\n}\n\n.video-js .vjs-slider:focus {\n  text-shadow: 0em 0em 1em white;\n  box-shadow: 0 0 1em #fff;\n}\n\n.video-js.vjs-spatial-navigation-enabled .vjs-slider:focus {\n  outline: 0.0625em solid white;\n}\n\n.video-js .vjs-mute-control {\n  cursor: pointer;\n  flex: none;\n}\n\n.video-js .vjs-volume-control {\n  cursor: pointer;\n  margin-right: 1em;\n  display: flex;\n}\n\n.video-js .vjs-volume-control.vjs-volume-horizontal {\n  width: 5em;\n}\n\n.video-js .vjs-volume-panel .vjs-volume-control {\n  visibility: visible;\n  opacity: 0;\n  width: 1px;\n  height: 1px;\n  margin-left: -1px;\n}\n\n.video-js .vjs-volume-panel {\n  transition: width 1s;\n}\n\n.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control, .video-js .vjs-volume-panel:active .vjs-volume-control, .video-js .vjs-volume-panel:focus .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control:active, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active {\n  visibility: visible;\n  opacity: 1;\n  position: relative;\n  transition: visibility 0.1s, opacity 0.1s, height 0.1s, width 0.1s, left 0s, top 0s;\n}\n\n.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-horizontal, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-horizontal, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-horizontal {\n  width: 5em;\n  height: 3em;\n  margin-right: 0;\n}\n\n.video-js .vjs-volume-panel.vjs-hover .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:active .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel:focus .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control:active.vjs-volume-vertical, .video-js .vjs-volume-panel.vjs-hover .vjs-mute-control ~ .vjs-volume-control.vjs-volume-vertical, .video-js .vjs-volume-panel .vjs-volume-control.vjs-slider-active.vjs-volume-vertical {\n  left: -3.5em;\n  transition: left 0s;\n}\n\n.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active {\n  width: 10em;\n  transition: width 0.1s;\n}\n\n.video-js .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-mute-toggle-only {\n  width: 4em;\n}\n\n.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical {\n  height: 8em;\n  width: 3em;\n  left: -3000em;\n  transition: visibility 1s, opacity 1s, height 1s 1s, width 1s 1s, left 1s 1s, top 1s 1s;\n}\n\n.video-js .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal {\n  transition: visibility 1s, opacity 1s, height 1s 1s, width 1s, left 1s 1s, top 1s 1s;\n}\n\n.video-js .vjs-volume-panel {\n  display: flex;\n}\n\n.video-js .vjs-volume-bar {\n  margin: 1.35em 0.45em;\n}\n\n.vjs-volume-bar.vjs-slider-horizontal {\n  width: 5em;\n  height: 0.3em;\n}\n\n.vjs-volume-bar.vjs-slider-vertical {\n  width: 0.3em;\n  height: 5em;\n  margin: 1.35em auto;\n}\n\n.video-js .vjs-volume-level {\n  position: absolute;\n  bottom: 0;\n  left: 0;\n  background-color: #fff;\n}\n\n.video-js .vjs-volume-level:before {\n  position: absolute;\n  font-size: 0.9em;\n  z-index: 1;\n}\n\n.vjs-slider-vertical .vjs-volume-level {\n  width: 0.3em;\n}\n\n.vjs-slider-vertical .vjs-volume-level:before {\n  top: -0.5em;\n  left: -0.3em;\n  z-index: 1;\n}\n\n.vjs-svg-icons-enabled .vjs-volume-level:before {\n  content: none;\n}\n\n.vjs-volume-level .vjs-svg-icon {\n  position: absolute;\n  width: 0.9em;\n  height: 0.9em;\n  pointer-events: none;\n  z-index: 1;\n}\n\n.vjs-slider-horizontal .vjs-volume-level {\n  height: 0.3em;\n}\n\n.vjs-slider-horizontal .vjs-volume-level:before {\n  line-height: 0.35em;\n  right: -0.5em;\n}\n\n.vjs-slider-horizontal .vjs-volume-level .vjs-svg-icon {\n  right: -0.3em;\n  transform: translateY(-50%);\n}\n\n.vjs-slider-vertical .vjs-volume-level .vjs-svg-icon {\n  top: -0.55em;\n  transform: translate(-50%);\n}\n\n.video-js .vjs-volume-panel.vjs-volume-panel-vertical {\n  width: 4em;\n}\n\n.vjs-volume-bar.vjs-slider-vertical .vjs-volume-level {\n  height: 100%;\n}\n\n.vjs-volume-bar.vjs-slider-horizontal .vjs-volume-level {\n  width: 100%;\n}\n\n.video-js .vjs-volume-vertical {\n  width: 3em;\n  height: 8em;\n  bottom: 8em;\n  background-color: #2b333f;\n  background-color: rgba(43, 51, 63, 0.7019607843);\n}\n\n.video-js .vjs-volume-horizontal .vjs-menu {\n  left: -2em;\n}\n\n.video-js .vjs-volume-tooltip {\n  background-color: #fff;\n  background-color: rgba(255, 255, 255, 0.8);\n  border-radius: 0.3em;\n  color: #000;\n  float: right;\n  font-family: Arial, Helvetica, sans-serif;\n  font-size: 1em;\n  padding: 6px 8px 8px;\n  pointer-events: none;\n  position: absolute;\n  top: -3.4em;\n  visibility: hidden;\n  z-index: 1;\n}\n\n.video-js .vjs-volume-control:hover .vjs-volume-tooltip, .video-js .vjs-volume-control:hover .vjs-progress-holder:focus .vjs-volume-tooltip {\n  display: block;\n  font-size: 1em;\n  visibility: visible;\n}\n\n.video-js .vjs-volume-vertical:hover .vjs-volume-tooltip, .video-js .vjs-volume-vertical:hover .vjs-progress-holder:focus .vjs-volume-tooltip {\n  left: 1em;\n  top: -12px;\n}\n\n.video-js .vjs-volume-control.disabled:hover .vjs-volume-tooltip {\n  font-size: 1em;\n}\n\n.video-js .vjs-volume-control .vjs-mouse-display {\n  display: none;\n  position: absolute;\n  width: 100%;\n  height: 1px;\n  background-color: #000;\n  z-index: 1;\n}\n\n.video-js .vjs-volume-horizontal .vjs-mouse-display {\n  width: 1px;\n  height: 100%;\n}\n\n.video-js .vjs-volume-control:hover .vjs-mouse-display {\n  display: block;\n}\n\n.video-js.vjs-user-inactive .vjs-volume-control .vjs-mouse-display {\n  visibility: hidden;\n  opacity: 0;\n  transition: visibility 1s, opacity 1s;\n}\n\n.vjs-mouse-display .vjs-volume-tooltip {\n  color: #fff;\n  background-color: #000;\n  background-color: rgba(0, 0, 0, 0.8);\n}\n\n.vjs-poster {\n  display: inline-block;\n  vertical-align: middle;\n  cursor: pointer;\n  margin: 0;\n  padding: 0;\n  position: absolute;\n  inset: 0;\n  height: 100%;\n}\n\n.vjs-has-started .vjs-poster, .vjs-using-native-controls .vjs-poster {\n  display: none;\n}\n\n.vjs-audio.vjs-has-started .vjs-poster, .vjs-has-started.vjs-audio-poster-mode .vjs-poster, .vjs-pip-container.vjs-has-started .vjs-poster {\n  display: block;\n}\n\n.vjs-poster img {\n  width: 100%;\n  height: 100%;\n  object-fit: contain;\n}\n\n.video-js .vjs-live-control {\n  display: flex;\n  align-items: flex-start;\n  flex: auto;\n  font-size: 1em;\n  line-height: 3em;\n}\n\n.video-js:not(.vjs-live) .vjs-live-control, .video-js.vjs-liveui .vjs-live-control {\n  display: none;\n}\n\n.video-js .vjs-seek-to-live-control {\n  align-items: center;\n  cursor: pointer;\n  flex: none;\n  display: inline-flex;\n  height: 100%;\n  padding-left: 0.5em;\n  padding-right: 0.5em;\n  font-size: 1em;\n  line-height: 3em;\n  width: auto;\n  min-width: 4em;\n}\n\n.video-js.vjs-live:not(.vjs-liveui) .vjs-seek-to-live-control, .video-js:not(.vjs-live) .vjs-seek-to-live-control {\n  display: none;\n}\n\n.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge {\n  cursor: auto;\n}\n\n.vjs-seek-to-live-control .vjs-icon-placeholder {\n  margin-right: 0.5em;\n  color: #888;\n}\n\n.vjs-svg-icons-enabled .vjs-seek-to-live-control {\n  line-height: 0;\n}\n\n.vjs-seek-to-live-control .vjs-svg-icon {\n  width: 1em;\n  height: 1em;\n  pointer-events: none;\n  fill: #888;\n}\n\n.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-icon-placeholder {\n  color: red;\n}\n\n.vjs-seek-to-live-control.vjs-control.vjs-at-live-edge .vjs-svg-icon {\n  fill: red;\n}\n\n.video-js .vjs-time-control {\n  flex: none;\n  font-size: 1em;\n  line-height: 3em;\n  min-width: 2em;\n  width: auto;\n  padding-left: 1em;\n  padding-right: 1em;\n}\n\n.vjs-live .vjs-time-control, .vjs-live .vjs-time-divider, .video-js .vjs-current-time, .video-js .vjs-duration {\n  display: none;\n}\n\n.vjs-time-divider {\n  display: none;\n  line-height: 3em;\n}\n\n.vjs-normalise-time-controls:not(.vjs-live) .vjs-time-control {\n  display: flex;\n}\n\n.video-js .vjs-play-control, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button {\n  cursor: pointer;\n}\n\n.video-js .vjs-play-control .vjs-icon-placeholder, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button .vjs-icon-placeholder {\n  flex: none;\n}\n\n.vjs-text-track-display {\n  position: absolute;\n  inset: 0 0 3em;\n  pointer-events: none;\n}\n\n.vjs-error .vjs-text-track-display {\n  display: none;\n}\n\n.video-js.vjs-controls-disabled .vjs-text-track-display, .video-js.vjs-user-inactive.vjs-playing .vjs-text-track-display {\n  bottom: 1em;\n}\n\n.video-js .vjs-text-track {\n  font-size: 1.4em;\n  text-align: center;\n  margin-bottom: 0.1em;\n}\n\n.vjs-subtitles {\n  color: #fff;\n}\n\n.vjs-captions {\n  color: #fc6;\n}\n\n.vjs-tt-cue {\n  display: block;\n}\n\nvideo::-webkit-media-text-track-display {\n  transform: translateY(-3em);\n}\n\n.video-js.vjs-controls-disabled video::-webkit-media-text-track-display, .video-js.vjs-user-inactive.vjs-playing video::-webkit-media-text-track-display {\n  transform: translateY(-1.5em);\n}\n\n.video-js.vjs-force-center-align-cues .vjs-text-track-cue {\n  text-align: center !important;\n  width: 80% !important;\n}\n\n@supports not (inset: 10px) {\n  .video-js .vjs-text-track-display > div {\n    inset: 0;\n  }\n}\n.video-js .vjs-picture-in-picture-control {\n  cursor: pointer;\n  flex: none;\n}\n\n.video-js.vjs-audio-only-mode .vjs-picture-in-picture-control, .vjs-pip-window .vjs-picture-in-picture-control {\n  display: none;\n}\n\n.video-js .vjs-fullscreen-control {\n  cursor: pointer;\n  flex: none;\n}\n\n.video-js.vjs-audio-only-mode .vjs-fullscreen-control, .vjs-pip-window .vjs-fullscreen-control {\n  display: none;\n}\n\n.vjs-playback-rate > .vjs-menu-button, .vjs-playback-rate .vjs-playback-rate-value {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n}\n\n.vjs-playback-rate .vjs-playback-rate-value {\n  pointer-events: none;\n  font-size: 1.5em;\n  line-height: 2;\n  text-align: center;\n}\n\n.vjs-playback-rate .vjs-menu {\n  width: 4em;\n  left: 0;\n}\n\n.vjs-error .vjs-error-display .vjs-modal-dialog-content {\n  font-size: 1.4em;\n  text-align: center;\n}\n\n.vjs-loading-spinner {\n  display: none;\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  opacity: 0.85;\n  text-align: left;\n  border: 0.6em solid rgba(43, 51, 63, 0.7);\n  box-sizing: border-box;\n  background-clip: padding-box;\n  width: 5em;\n  height: 5em;\n  border-radius: 50%;\n  visibility: hidden;\n}\n\n.vjs-seeking .vjs-loading-spinner, .vjs-waiting .vjs-loading-spinner {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  animation: vjs-spinner-show 0s linear 0.3s forwards;\n}\n\n.vjs-error .vjs-loading-spinner {\n  display: none;\n}\n\n.vjs-loading-spinner:before, .vjs-loading-spinner:after {\n  content: \"\";\n  position: absolute;\n  box-sizing: inherit;\n  width: inherit;\n  height: inherit;\n  border-radius: inherit;\n  opacity: 1;\n  border: inherit;\n  border-color: transparent;\n  border-top-color: #fff;\n}\n\n.vjs-seeking .vjs-loading-spinner:before, .vjs-seeking .vjs-loading-spinner:after, .vjs-waiting .vjs-loading-spinner:before, .vjs-waiting .vjs-loading-spinner:after {\n  animation: vjs-spinner-spin 1.1s cubic-bezier(0.6, 0.2, 0, 0.8) infinite, vjs-spinner-fade 1.1s linear infinite;\n}\n\n.vjs-seeking .vjs-loading-spinner:before, .vjs-waiting .vjs-loading-spinner:before {\n  border-top-color: #fff;\n}\n\n.vjs-seeking .vjs-loading-spinner:after, .vjs-waiting .vjs-loading-spinner:after {\n  border-top-color: #fff;\n  animation-delay: 0.44s;\n}\n\n@keyframes vjs-spinner-show {\n  to {\n    visibility: visible;\n  }\n}\n@keyframes vjs-spinner-spin {\n  to {\n    transform: rotate(360deg);\n  }\n}\n@keyframes vjs-spinner-fade {\n  0% {\n    border-top-color: #73859f;\n  }\n  20% {\n    border-top-color: #73859f;\n  }\n  35% {\n    border-top-color: #fff;\n  }\n  60% {\n    border-top-color: #73859f;\n  }\n  to {\n    border-top-color: #73859f;\n  }\n}\n.video-js.vjs-audio-only-mode .vjs-captions-button {\n  display: none;\n}\n\n.vjs-chapters-button .vjs-menu ul {\n  width: 24em;\n}\n\n.video-js.vjs-audio-only-mode .vjs-descriptions-button {\n  display: none;\n}\n\n.vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-svg-icon {\n  width: 1.5em;\n  height: 1.5em;\n}\n\n.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder {\n  vertical-align: middle;\n  display: inline-block;\n  margin-bottom: -0.1em;\n}\n\n.video-js .vjs-subs-caps-button + .vjs-menu .vjs-captions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before {\n  font-family: VideoJS;\n  content: \"\\\\f10c\";\n  font-size: 1.5em;\n  line-height: inherit;\n}\n\n.video-js.vjs-audio-only-mode .vjs-subs-caps-button {\n  display: none;\n}\n\n.video-js .vjs-audio-button + .vjs-menu .vjs-descriptions-menu-item .vjs-menu-item-text .vjs-icon-placeholder, .video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder {\n  vertical-align: middle;\n  display: inline-block;\n  margin-bottom: -0.1em;\n}\n\n.video-js .vjs-audio-button + .vjs-menu .vjs-descriptions-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before, .video-js .vjs-audio-button + .vjs-menu .vjs-main-desc-menu-item .vjs-menu-item-text .vjs-icon-placeholder:before {\n  font-family: VideoJS;\n  content: \" \\\\f12e\";\n  font-size: 1.5em;\n  line-height: inherit;\n}\n\n.video-js.vjs-layout-small .vjs-current-time, .video-js.vjs-layout-small .vjs-time-divider, .video-js.vjs-layout-small .vjs-duration, .video-js.vjs-layout-small .vjs-remaining-time, .video-js.vjs-layout-small .vjs-playback-rate, .video-js.vjs-layout-small .vjs-volume-control, .video-js.vjs-layout-x-small .vjs-current-time, .video-js.vjs-layout-x-small .vjs-time-divider, .video-js.vjs-layout-x-small .vjs-duration, .video-js.vjs-layout-x-small .vjs-remaining-time, .video-js.vjs-layout-x-small .vjs-playback-rate, .video-js.vjs-layout-x-small .vjs-volume-control, .video-js.vjs-layout-tiny .vjs-current-time, .video-js.vjs-layout-tiny .vjs-time-divider, .video-js.vjs-layout-tiny .vjs-duration, .video-js.vjs-layout-tiny .vjs-remaining-time, .video-js.vjs-layout-tiny .vjs-playback-rate, .video-js.vjs-layout-tiny .vjs-volume-control {\n  display: none;\n}\n\n.video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover, .video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js.vjs-layout-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:hover, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js.vjs-layout-x-small .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:hover, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal:active, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-slider-active, .video-js.vjs-layout-tiny .vjs-volume-panel.vjs-volume-panel-horizontal.vjs-hover {\n  width: auto;\n  width: initial;\n}\n\n.video-js.vjs-layout-x-small .vjs-progress-control, .video-js.vjs-layout-tiny .vjs-progress-control {\n  display: none;\n}\n\n.video-js.vjs-layout-x-small .vjs-custom-control-spacer {\n  flex: auto;\n  display: block;\n}\n\n.vjs-modal-dialog.vjs-text-track-settings {\n  background-color: #2b333f;\n  background-color: rgba(43, 51, 63, 0.7490196078);\n  color: #fff;\n  height: 70%;\n}\n\n.vjs-spatial-navigation-enabled .vjs-modal-dialog.vjs-text-track-settings {\n  height: 80%;\n}\n\n.vjs-error .vjs-text-track-settings {\n  display: none;\n}\n\n.vjs-text-track-settings .vjs-modal-dialog-content {\n  display: table;\n}\n\n.vjs-text-track-settings .vjs-track-settings-colors, .vjs-text-track-settings .vjs-track-settings-font, .vjs-text-track-settings .vjs-track-settings-controls {\n  display: table-cell;\n}\n\n.vjs-text-track-settings .vjs-track-settings-controls {\n  text-align: right;\n  vertical-align: bottom;\n}\n\n@supports (display: grid) {\n  .vjs-text-track-settings .vjs-modal-dialog-content {\n    display: grid;\n    grid-template-columns: 1fr 1fr;\n    grid-template-rows: 1fr;\n    padding: 20px 24px 0;\n  }\n  .vjs-track-settings-controls .vjs-default-button {\n    margin-bottom: 20px;\n  }\n  .vjs-text-track-settings .vjs-track-settings-controls {\n    grid-column: 1/-1;\n  }\n  .vjs-layout-small .vjs-text-track-settings .vjs-modal-dialog-content, .vjs-layout-x-small .vjs-text-track-settings .vjs-modal-dialog-content, .vjs-layout-tiny .vjs-text-track-settings .vjs-modal-dialog-content {\n    grid-template-columns: 1fr;\n  }\n}\n.vjs-text-track-settings select {\n  font-size: inherit;\n}\n\n.vjs-track-setting > select {\n  margin-right: 1em;\n  margin-bottom: 0.5em;\n}\n\n.vjs-text-track-settings fieldset {\n  margin: 10px;\n  border: none;\n}\n\n.vjs-text-track-settings fieldset span {\n  display: inline-block;\n  padding: 0 0.6em 0.8em;\n}\n\n.vjs-text-track-settings fieldset span > select {\n  max-width: 7.3em;\n}\n\n.vjs-text-track-settings legend {\n  color: #fff;\n  font-weight: 700;\n  font-size: 1.2em;\n}\n\n.vjs-text-track-settings .vjs-label {\n  margin: 0 0.5em 0.5em 0;\n}\n\n.vjs-track-settings-controls button:focus, .vjs-track-settings-controls button:active {\n  outline-style: solid;\n  outline-width: medium;\n  background-image: linear-gradient(0deg, #fff 88%, #73859f);\n}\n\n.vjs-track-settings-controls button:hover {\n  color: rgba(43, 51, 63, 0.7490196078);\n}\n\n.vjs-track-settings-controls button {\n  background-color: #fff;\n  background-image: linear-gradient(-180deg, #fff 88%, #73859f);\n  color: #2b333f;\n  cursor: pointer;\n  border-radius: 2px;\n}\n\n.vjs-track-settings-controls .vjs-default-button {\n  margin-right: 1em;\n}\n\n.vjs-title-bar {\n  background: rgba(0, 0, 0, 0.9019607843);\n  background: linear-gradient(180deg, rgba(0, 0, 0, 0.9019607843), rgba(0, 0, 0, 0.7019607843) 60%, rgba(0, 0, 0, 0));\n  font-size: 1.2em;\n  line-height: 1.5;\n  transition: opacity 0.1s;\n  padding: 0.666em 1.333em 4em;\n  pointer-events: none;\n  position: absolute;\n  top: 0;\n  width: 100%;\n}\n\n.vjs-error .vjs-title-bar {\n  display: none;\n}\n\n.vjs-title-bar-title, .vjs-title-bar-description {\n  margin: 0;\n  overflow: hidden;\n  text-overflow: ellipsis;\n  white-space: nowrap;\n}\n\n.vjs-title-bar-title {\n  font-weight: 700;\n  margin-bottom: 0.333em;\n}\n\n.vjs-playing.vjs-user-inactive .vjs-title-bar {\n  opacity: 0;\n  transition: opacity 1s;\n}\n\n.video-js .vjs-skip-forward-5, .video-js .vjs-skip-forward-10, .video-js .vjs-skip-forward-30, .video-js .vjs-skip-backward-5, .video-js .vjs-skip-backward-10, .video-js .vjs-skip-backward-30 {\n  cursor: pointer;\n}\n\n.video-js .vjs-transient-button {\n  position: absolute;\n  height: 3em;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  background-color: rgba(50, 50, 50, 0.5019607843);\n  cursor: pointer;\n  opacity: 1;\n  transition: opacity 1s;\n}\n\n.video-js:not(.vjs-has-started) .vjs-transient-button {\n  display: none;\n}\n\n.video-js.not-hover .vjs-transient-button:not(.force-display), .video-js.vjs-user-inactive .vjs-transient-button:not(.force-display) {\n  opacity: 0;\n}\n\n.video-js .vjs-transient-button span {\n  padding: 0 0.5em;\n}\n\n.video-js .vjs-transient-button.vjs-left {\n  left: 1em;\n}\n\n.video-js .vjs-transient-button.vjs-right {\n  right: 1em;\n}\n\n.video-js .vjs-transient-button.vjs-top {\n  top: 1em;\n}\n\n.video-js .vjs-transient-button.vjs-near-top {\n  top: 4em;\n}\n\n.video-js .vjs-transient-button.vjs-bottom {\n  bottom: 4em;\n}\n\n.video-js .vjs-transient-button:hover {\n  background-color: rgba(50, 50, 50, 0.9019607843);\n}\n\n@media print {\n  .video-js > *:not(.vjs-tech):not(.vjs-poster) {\n    visibility: hidden;\n  }\n}\n.vjs-resize-manager {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  border: none;\n  z-index: -1000;\n}\n\n.js-focus-visible .video-js *:focus:not(.focus-visible) {\n  outline: none;\n}\n\n.video-js *:focus:not(:focus-visible) {\n  outline: none;\n}\n\n.video-js {\n  opacity: 0;\n}\n\n.nfb-form {\n  --nfb-form-color: #000000;\n  --nfb-form-message-color: #403E43;\n  --nfb-form-background-color: #FDFDFD;\n  --nfb-form-option-background-color: #ECEBED;\n  --nfb-form-accent-color: #1C7A3E;\n  --nfb-form-border-color: #D4D3D6;\n  --nfb-form-checkbox-border-color: #D4D3D6;\n  --nfb-form-error-color: #B42B22;\n  --nfb-form-success-color: #1C7A3E;\n  --nfb-form-disable-background-color: #FAF9FA;\n  --nfb-form-disable-color: #403E43;\n  --nfb-form-disable-border-color: #ECEBED;\n  --nfb-form-help-color: #626065;\n}\n\n.nfb-form__element-container {\n  display: flex;\n  flex-direction: column;\n  min-width: 400px;\n  padding: 0;\n}\n\n@media screen and (max-width: 480px), print {\n  .nfb-form__element-container {\n    min-width: unset;\n    max-width: 400px;\n  }\n}\n.nfb-form__element-container label, .nfb-form__element-container legend {\n  color: var(--nfb-form-color);\n}\n\n.nfb-form__element-container label {\n  margin-bottom: 8px;\n}\n\n.nfb-form__element-container input {\n  background-color: var(--nfb-form-background-color);\n}\n\n.nfb-form__element-container .nfb-form__message {\n  color: var(--nfb-form-message-color);\n  display: flex;\n  align-items: center;\n}\n\n.nfb-form__element-container .nfb-form__message .nfb-icon.icon-warning-o, .nfb-form__element-container .nfb-form__message nfb-icon {\n  display: none;\n}\n\n.nfb-form__element-container--valid legend, .nfb-form__element-container--valid label, .nfb-form__element-container--valid .nfb-form__message {\n  color: var(--nfb-form-success-color);\n}\n\n.nfb-form__element-container--invalid legend, .nfb-form__element-container--invalid label, .nfb-form__element-container--invalid .nfb-form__message, .nfb-form__element-container--invalid input + label {\n  color: var(--nfb-form-error-color);\n}\n\n.nfb-form__element-container--invalid legend a, .nfb-form__element-container--invalid label a, .nfb-form__element-container--invalid .nfb-form__message a, .nfb-form__element-container--invalid input + label a {\n  color: var(--nfb-form-error-color) !important;\n  text-decoration: underline;\n}\n\n.nfb-form__element-container--invalid .nfb-form__message a {\n  color: var(--nfb-form-error-color) !important;\n  text-decoration: underline;\n}\n\n.nfb-form__element-container--invalid .nfb-form__message .nfb-icon.icon-warning-o {\n  display: inline;\n  margin-right: 4px;\n}\n\n.nfb-form__element-container--invalid .nfb-form__message nfb-icon {\n  display: inline-flex;\n  margin-right: 4px;\n  margin-bottom: 1px;\n}\n\n.nfb-form__element-container--invalid .nfb-form__file-preview-container {\n  color: var(--nfb-form-error-color);\n  border-color: var(--nfb-form-error-color);\n}\n\n.nfb-form__element-container .nfb-icon, .nfb-form__element-container nfb-icon {\n  vertical-align: bottom;\n  font-size: 1rem;\n}\n\n.nfb-form__element-container[data-collapsible-is-triggered=true] .nfb-form__collapsible-container {\n  display: block;\n  color: var(--nfb-form-color);\n}\n\n.nfb-form__element-container[data-collapsible-is-triggered=true] .nfb-form__collapsible-container legend {\n  color: var(--nfb-form-color);\n}\n\n.nfb-form__collapsible-container {\n  display: none;\n  margin: 24px 0;\n  padding-left: 24px;\n}\n\n.nfb-form__icon {\n  margin-right: 8px;\n}\n\n.nfb-form__file-container {\n  display: flex;\n  color: var(--nfb-form-message-color);\n}\n\n.nfb-form__file-container[data-file-is-uploaded=false] .nfb-form__file-preview-container:focus-visible {\n  outline: none;\n}\n\n.nfb-form__file-container[data-file-is-uploaded=false] .icon-delete-o {\n  display: none;\n}\n\n.nfb-form__file-container[data-file-is-uploaded=true] .icon-delete-o {\n  display: block;\n  cursor: pointer;\n}\n\n.nfb-form__file-container[data-file-is-uploaded=true] .nfb-form__file {\n  background-color: var(--nfb-form-background-color);\n}\n\n.nfb-form__file-container input[type=file] {\n  opacity: 0;\n  width: 0;\n  height: 0;\n}\n\n.nfb-form__file-button {\n  margin-left: 14px;\n  display: flex;\n  align-self: center;\n  align-items: baseline;\n}\n\n.nfb-form__file-button--disabled {\n  background-color: var(--nfb-form-disable-background-color);\n  border-color: var(--nfb-form-disable-border-color);\n  color: var(--nfb-form-disable-color);\n}\n\n.nfb-form__file-preview-container {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  border: 1px solid var(--nfb-form-border-color);\n  border-radius: 5px;\n  padding: 7px 15px;\n  width: 100%;\n  background-color: var(--nfb-form-background-color);\n}\n\n.nfb-form__file-preview-container span {\n  text-overflow: ellipsis;\n  white-space: nowrap;\n  overflow: hidden !important;\n}\n\n.nfb-form__text-container--simple, .nfb-form__text-container--multiple {\n  box-sizing: border-box;\n  display: flex;\n  align-items: center;\n  justify-content: space-around;\n  border: 1px solid var(--nfb-form-border-color);\n  border-radius: 5px;\n  padding: 7px 15px;\n  width: 100%;\n  background-color: var(--nfb-form-background-color);\n  color: var(--nfb-form-color);\n}\n\n.nfb-form__text-container--simple[data-input-is-active=true], .nfb-form__text-container--simple:hover, .nfb-form__text-container--simple:focus-within, .nfb-form__text-container--multiple[data-input-is-active=true], .nfb-form__text-container--multiple:hover, .nfb-form__text-container--multiple:focus-within {\n  border-color: var(--nfb-form-accent-color);\n}\n\n.nfb-form__text-container--simple[data-input-is-active=true]:focus-within, .nfb-form__text-container--multiple[data-input-is-active=true]:focus-within {\n  border-width: 1px;\n  padding: 7px 15px;\n}\n\n.nfb-form__text-container--simple:focus-within, .nfb-form__text-container--multiple:focus-within {\n  border-width: 4px;\n  padding: 4px 12px;\n}\n\n.nfb-form__text-container--simple .nfb-form__icon--success, .nfb-form__text-container--simple .nfb-form__icon--error, .nfb-form__text-container--multiple .nfb-form__icon--success, .nfb-form__text-container--multiple .nfb-form__icon--error {\n  display: none;\n}\n\n.nfb-form__text-container--simple input, .nfb-form__text-container--simple textarea, .nfb-form__text-container--multiple input, .nfb-form__text-container--multiple textarea {\n  background-color: var(--nfb-form-background-color);\n  color: var(--nfb-form-color);\n  border: none;\n}\n\n.nfb-form__text-container--simple input:-webkit-autofill, .nfb-form__text-container--simple input:-webkit-autofill:hover, .nfb-form__text-container--simple input:-webkit-autofill:focus, .nfb-form__text-container--simple input:-webkit-autofill:active, .nfb-form__text-container--simple textarea:-webkit-autofill, .nfb-form__text-container--simple textarea:-webkit-autofill:hover, .nfb-form__text-container--simple textarea:-webkit-autofill:focus, .nfb-form__text-container--simple textarea:-webkit-autofill:active, .nfb-form__text-container--multiple input:-webkit-autofill, .nfb-form__text-container--multiple input:-webkit-autofill:hover, .nfb-form__text-container--multiple input:-webkit-autofill:focus, .nfb-form__text-container--multiple input:-webkit-autofill:active, .nfb-form__text-container--multiple textarea:-webkit-autofill, .nfb-form__text-container--multiple textarea:-webkit-autofill:hover, .nfb-form__text-container--multiple textarea:-webkit-autofill:focus, .nfb-form__text-container--multiple textarea:-webkit-autofill:active {\n  -webkit-box-shadow: 0 0 0 30px var(--nfb-form-background-color) inset !important;\n  -webkit-text-fill-color: var(--nfb-form-color) !important;\n}\n\n.nfb-form__text-container--simple input[disabled], .nfb-form__text-container--simple input[readonly], .nfb-form__text-container--simple textarea[readonly], .nfb-form__text-container--simple textarea[disabled], .nfb-form__text-container--multiple input[disabled], .nfb-form__text-container--multiple input[readonly], .nfb-form__text-container--multiple textarea[readonly], .nfb-form__text-container--multiple textarea[disabled] {\n  pointer-events: none;\n  color: var(--nfb-form-disable-color);\n  background-color: var(--nfb-form-disable-background-color);\n}\n\n.nfb-form__text-container--simple--invalid, .nfb-form__text-container--multiple--invalid {\n  color: var(--nfb-form-error-color);\n  border-color: var(--nfb-form-error-color);\n}\n\n.nfb-form__text-container--simple--invalid[data-input-is-active=true], .nfb-form__text-container--simple--invalid:hover, .nfb-form__text-container--simple--invalid:focus-within, .nfb-form__text-container--multiple--invalid[data-input-is-active=true], .nfb-form__text-container--multiple--invalid:hover, .nfb-form__text-container--multiple--invalid:focus-within {\n  border-color: var(--nfb-form-error-color);\n}\n\n.nfb-form__text-container--simple--valid, .nfb-form__text-container--multiple--valid {\n  color: var(--nfb-form-success-color);\n  border-color: var(--nfb-form-success-color);\n}\n\n.nfb-form__text-container--simple--valid[data-input-is-active=true], .nfb-form__text-container--simple--valid:hover, .nfb-form__text-container--simple--valid:focus-within, .nfb-form__text-container--multiple--valid[data-input-is-active=true], .nfb-form__text-container--multiple--valid:hover, .nfb-form__text-container--multiple--valid:focus-within {\n  border-color: var(--nfb-form-success-color);\n}\n\n.nfb-form__text-container--simple--invalid .nfb-form__icon--success, .nfb-form__text-container--multiple--invalid .nfb-form__icon--success {\n  display: none;\n}\n\n.nfb-form__text-container--simple--invalid .nfb-form__icon--error, .nfb-form__text-container--multiple--invalid .nfb-form__icon--error {\n  display: block;\n}\n\n.nfb-form__text-container--simple--valid .nfb-form__icon--success, .nfb-form__text-container--multiple--valid .nfb-form__icon--success {\n  display: block;\n}\n\n.nfb-form__text-container--simple--valid .nfb-form__icon--error, .nfb-form__text-container--multiple--valid .nfb-form__icon--error {\n  display: none;\n}\n\n.nfb-form__text-container--simple:has(> input[disabled], input[readonly]), .nfb-form__text-container--multiple:has(> input[disabled], input[readonly], textarea[disabled], textarea[readonly]) {\n  background-color: var(--nfb-form-disable-background-color);\n}\n\n.nfb-form__text-container--simple:has(> input[disabled], input[readonly]):hover, .nfb-form__text-container--multiple:has(> input[disabled], input[readonly], textarea[disabled], textarea[readonly]):hover {\n  border-color: var(--nfb-form-border-color);\n}\n\n.nfb-form__text--simple, .nfb-form__text--multiple {\n  outline: 0;\n  width: 100%;\n}\n\n.nfb-form__text--multiple {\n  resize: vertical;\n}\n\n.nfb-form__message {\n  display: inline-block;\n  margin-top: 8px;\n}\n\n.nfb-form fieldset {\n  border: none;\n}\n\n.nfb-form__input-container {\n  width: 100%;\n  display: flex;\n  gap: 0.5rem;\n  padding: 4px;\n  justify-content: flex-start;\n  margin-bottom: 4px;\n}\n\n.nfb-form__input-container input:hover, .nfb-form__input-container label:hover {\n  cursor: pointer;\n}\n\n.nfb-form__input-container input[type=checkbox], .nfb-form__input-container input[type=radio] {\n  appearance: none;\n  outline: none;\n  border: 1px solid var(--nfb-form-checkbox-border-color);\n  margin: 0;\n  width: 1rem;\n  height: 1rem;\n  min-width: 1rem;\n}\n\n.nfb-form__input-container input[type=checkbox]:hover, .nfb-form__input-container input[type=checkbox]:checked, .nfb-form__input-container input[type=checkbox]:focus-visible, .nfb-form__input-container input[type=radio]:hover, .nfb-form__input-container input[type=radio]:checked, .nfb-form__input-container input[type=radio]:focus-visible {\n  border-color: var(--nfb-form-accent-color);\n}\n\n.nfb-form__input-container input[type=checkbox]:focus-visible, .nfb-form__input-container input[type=radio]:focus-visible {\n  outline: none;\n  border: 2px solid var(--nfb-form-accent-color);\n}\n\n.nfb-form__input-container input[type=radio] {\n  border-radius: 50%;\n}\n\n.nfb-form__input-container input[type=radio]:checked {\n  border: 1px solid var(--nfb-form-border-color);\n  background-color: var(--nfb-form-accent-color);\n}\n\n.nfb-form__input-container input[type=checkbox] {\n  border-radius: 10%;\n  display: grid;\n  place-content: center;\n}\n\n.nfb-form__input-container input[type=checkbox]:checked {\n  background-color: var(--nfb-form-accent-color);\n}\n\n.nfb-form__input-container input[type=checkbox]:checked::before {\n  transform: scale(1);\n}\n\n.nfb-form__input-container input[type=checkbox]::before {\n  content: \"\";\n  width: 8px;\n  height: 8px;\n  transform: scale(0);\n  background-color: var(--nfb-form-background-color);\n  transform-origin: bottom left;\n  clip-path: polygon(14% 44%, 0 65%, 50% 100%, 100% 16%, 80% 0%, 43% 62%);\n}\n\n.nfb-form__input-legend {\n  margin: 24px 0;\n  font-weight: bold !important;\n}\n\n.nfb-form__select-container {\n  position: relative;\n  width: 100%;\n}\n\n.nfb-form__select-container--disabled {\n  pointer-events: none;\n  border-color: var(--nfb-form-disable-border-color);\n}\n\n.nfb-form__select-container--disabled button, .nfb-form__select-container--disabled input {\n  opacity: 0.25;\n}\n\n.nfb-form__select-input-container {\n  display: inline-flex;\n  box-sizing: border-box;\n  cursor: pointer;\n  border: 1px solid var(--nfb-form-border-color);\n  border-radius: 4px;\n  padding: 7px 15px;\n  width: 100%;\n  justify-content: space-between;\n  background-color: rgba(0, 0, 0, 0);\n}\n\n.nfb-form__select-input-container[data-input-is-active=true], .nfb-form__select-input-container:hover, .nfb-form__select-input-container:focus-within {\n  border-color: var(--nfb-form-accent-color);\n}\n\n.nfb-form__element-container--invalid .nfb-form__select-input-container[data-input-is-active=true], .nfb-form__element-container--invalid .nfb-form__select-input-container:hover, .nfb-form__element-container--invalid .nfb-form__select-input-container:focus-within {\n  border-color: var(--nfb-form-error-color);\n}\n\n.nfb-form__select-input-container[data-input-is-active=true]:focus-within {\n  border-width: 1px;\n  padding: 7px 15px;\n}\n\n.nfb-form__select-input-container:focus-within {\n  border-width: 4px;\n  padding: 4px 12px;\n}\n\n.nfb-form__element-container--invalid .nfb-form__select-input-container {\n  border-color: var(--nfb-form-error-color);\n}\n\n.nfb-form__element-container--invalid .nfb-form__select-input-container input {\n  color: var(--nfb-form-error-color);\n}\n\n.nfb-form__element-container--valid .nfb-form__select-input-container {\n  border-color: var(--nfb-form-success-color);\n}\n\n.nfb-form__element-container--valid .nfb-form__select-input-container input {\n  color: var(--nfb-form-success-color);\n}\n\n.nfb-form__select-input-container .nfb-form__text--simple {\n  border: none;\n}\n\n.nfb-form__select-input-container [role=combobox] {\n  color: var(--nfb-form-color);\n  background-color: rgba(0, 0, 0, 0);\n  display: flex;\n  align-items: center;\n}\n\n.nfb-form__select-input-container [role=combobox][disabled] {\n  pointer-events: none;\n  cursor: pointer;\n  user-select: none;\n}\n\n.nfb-form__select-button-container {\n  box-sizing: border-box;\n  height: 30px;\n  padding: 0;\n  margin: 0;\n  vertical-align: bottom;\n  position: relative;\n  cursor: pointer;\n  border: none;\n  width: 19px;\n  color: var(--nfb-form-color);\n}\n\n.nfb-form__select-button-container .icon-up, .nfb-form__select-button-container [data-ui-el=icon-up] {\n  display: none;\n}\n\n.nfb-form__select-button-container .icon-down, .nfb-form__select-button-container [data-ui-el=icon-down] {\n  display: block;\n}\n\n.nfb-form__select-button-container[aria-expanded=true] .icon-up, .nfb-form__select-button-container[aria-expanded=true] [data-ui-el=icon-up] {\n  display: block;\n}\n\n.nfb-form__select-button-container[aria-expanded=true] .icon-down, .nfb-form__select-button-container[aria-expanded=true] [data-ui-el=icon-down] {\n  display: none;\n}\n\n.nfb-form__select-list-container {\n  position: absolute;\n  background-color: var(--nfb-form-background-color);\n  z-index: 1;\n  max-height: 200px;\n  display: none;\n  margin-top: 4px;\n  padding: 0;\n  list-style: none;\n  box-sizing: border-box;\n  width: 100%;\n  overflow: auto;\n  overflow-x: hidden;\n  cursor: pointer;\n  color: var(--nfb-form-color) !important;\n}\n\n.nfb-form__select-list-container[data-list-is-open=true] {\n  display: block;\n  outline: none;\n  border: 4px solid var(--nfb-form-accent-color);\n}\n\n.nfb-form__element-container--invalid .nfb-form__select-list-container[data-list-is-open=true] {\n  border-color: var(--nfb-form-error-color);\n}\n\n.nfb-form__select--compact {\n  flex-direction: row;\n  align-items: center;\n  gap: 0.5rem;\n}\n\n.nfb-form__select--compact label {\n  margin: 0;\n}\n\n.nfb-form__select--compact[disabled] {\n  opacity: 0.5;\n  pointer-events: none;\n}\n\n.nfb-form__select--compact[is-focus=true] .nfb-form__select-container {\n  outline: 2px solid var(--nfb-form-accent-color);\n}\n\n.nfb-form__select--compact .nfb-form__select-button-container:focus-visible {\n  outline: none;\n}\n\n.nfb-form__select--compact .nfb-form__select-container {\n  padding: 0.25rem;\n  width: auto;\n}\n\n.nfb-form__select--compact .nfb-form__select-input-container {\n  padding: 0;\n  border: none;\n}\n\n.nfb-form__select--compact .nfb-form__select-input-container [role=combobox] {\n  user-select: none;\n  color: var(--nfb-form-accent-color);\n  font-weight: 600;\n  margin-right: 0.25rem;\n}\n\n.nfb-form__select--compact .nfb-form__select-input-container [role=combobox][data-ui-is-placeholder=true] {\n  opacity: 1;\n  color: var(--nfb-form-color);\n  font-weight: normal;\n}\n\n.nfb-form__select--compact .nfb-form__select-list-container {\n  width: 200px;\n}\n\n.nfb-form__select--compact .nfb-form__select-list-container[data-list-is-open=true] {\n  border: 1px solid var(--nfb-form-border-color);\n}\n\n.nfb-form__select--compact .nfb-form__select-list-container .nfb-form__option {\n  position: relative;\n}\n\n.nfb-form__select--compact .nfb-form__select-list-container .nfb-form__option--focus {\n  color: var(--nfb-form-accent-color);\n}\n\n.nfb-form__select--compact .nfb-form__select-list-container .nfb-form__option[data-ui-selected=true] {\n  font-weight: 600;\n}\n\n.nfb-form__select--compact .nfb-form__select-list-container .nfb-form__option[data-ui-selected=true]::after {\n  position: absolute;\n  right: 1rem;\n  top: 50%;\n  transform: translateY(-50%);\n  font-family: \"balmoral-icons\";\n  font-weight: normal;\n  content: \"\\\\e954\";\n}\n\n.nfb-form__option {\n  margin: 0;\n  display: block;\n  padding: 8px;\n}\n\n.nfb-form__option--focus {\n  background-color: var(--nfb-form-option-background-color);\n}\n\n.nfb-form__help {\n  width: fit-content;\n  height: fit-content;\n  color: var(--nfb-form-help-color);\n}\n\n.nfb-form__help::after {\n  font-size: 1rem;\n  font-family: \"balmoral-icons\";\n  font-style: normal;\n  content: \"\\\\e94c\";\n}\n\n.nfb-form__help:hover {\n  color: var(--nfb-form-accent-color);\n}\n\n.nfb-form__help:focus {\n  color: var(--nfb-form-accent-color);\n  outline: none;\n}\n\n.nfb-form.nfb-form--dark {\n  --nfb-form-accent-color: #05EE80;\n  --nfb-form-message-color: #D4D3D6;\n  --nfb-form-background-color: #18171A;\n  --nfb-form-option-background-color: #403E43;\n  --nfb-form-color: #FFFFFF;\n  --nfb-form-border-color: #403E43;\n  --nfb-form-error-color: #E4352A;\n  --nfb-form-success-color: #05EE80;\n  --nfb-form-disable-background-color: #27262A;\n  --nfb-form-disable-color: #8B898E;\n  --nfb-form-disable-border-color: #403E43;\n  --nfb-form-help-color: #D4D3D6;\n}\n\n.nfb-font__family--sans-serif, .nfb-font__display--xxl, .nfb-font__display--xl, .nfb-font__display--lg, .nfb-font__display--md, .nfb-font__display--sm, .nfb-font__headline--1, .nfb-font__headline--2, .nfb-font__headline--3, .nfb-font__headline--4, .nfb-font__headline--5, .nfb-font__headline--6, .nfb-font__title--3xl, .nfb-font__title--xxl, .nfb-font__title--xl, .nfb-font__title--lg, .nfb-font__title--md, .nfb-font__title--sm, .nfb-font__body--xl--sans, .nfb-font__body--lg--sans, .nfb-font__body--md--sans, .nfb-font__body--sm--sans, .nfb-font__body--xs--sans, .nfb-font__label--xl--sans, .nfb-font__label--lg--sans, .nfb-font__label--md--sans, .nfb-font__label--sm--sans, .nfb-font__label--xs--sans {\n  font-family: \"Ciutadella\", -apple-system, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", \"Helvetica\", \"Arial\", sans-serif;\n}\n\n.nfb-font__family--serif, .nfb-font__body--xl--serif, .nfb-font__body--lg--serif, .nfb-font__body--md--serif, .nfb-font__body--sm--serif, .nfb-font__label--lg--serif, .nfb-font__label--md--serif, .nfb-font__label--xs--serif {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n}\n\n.nfb-font__family--monospace {\n  font-family: monospace;\n}\n\n.nfb-font__label--xs--sans {\n  font-style: normal;\n  font-weight: 500;\n  font-size: 0.75rem;\n  line-height: 1rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--sm--sans {\n  font-style: normal;\n  font-weight: 500;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--md--sans {\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--lg--sans {\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1.125rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--xl--sans {\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1.5rem;\n  line-height: 2rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--xs--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.75rem;\n  line-height: 1rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--md--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.875rem;\n  line-height: 1.25rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--lg--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.25rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__body--xs--sans {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.75rem;\n  line-height: 1rem;\n  color: #000;\n}\n\n.nfb-font__body--sm--sans {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: #000;\n}\n\n.nfb-font__body--md--sans {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__body--lg--sans {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.125rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__body--xl--sans {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.5rem;\n  line-height: 2rem;\n  color: #000;\n}\n\n.nfb-font__body--sm--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.75rem;\n  line-height: 1rem;\n  color: #000;\n}\n\n.nfb-font__body--md--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.875rem;\n  line-height: 1.25rem;\n  color: #000;\n}\n\n.nfb-font__body--lg--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__body--xl--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.25rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__title--sm {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: #000;\n}\n\n.nfb-font__title--md {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 1rem;\n  line-height: 1.25rem;\n  color: #000;\n}\n\n.nfb-font__title--lg {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 1.125rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__title--xl {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 1.5rem;\n  line-height: 2rem;\n  color: #000;\n}\n\n.nfb-font__title--xxl {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 2rem;\n  line-height: 3rem;\n  color: #000;\n}\n\n.nfb-font__title--3xl {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 3rem;\n  line-height: 3.5rem;\n  color: #000;\n}\n\n.nfb-font__headline--6 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.3125rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__headline--5 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.5rem;\n  line-height: 2rem;\n  color: #000;\n}\n\n.nfb-font__headline--4 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.75rem;\n  line-height: 2.125rem;\n  color: #000;\n}\n\n.nfb-font__headline--3 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 2rem;\n  line-height: 2.375rem;\n  color: #000;\n}\n\n.nfb-font__headline--2 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 3rem;\n  line-height: 3.625rem;\n  color: #000;\n}\n\n.nfb-font__headline--1 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 4rem;\n  line-height: 4.75rem;\n  color: #000;\n}\n\n.nfb-font__display--sm {\n  font-style: normal;\n  font-weight: bold;\n  font-size: 1.75rem;\n  line-height: 2rem;\n  color: #000;\n}\n\n.nfb-font__display--md {\n  font-style: normal;\n  font-weight: bold;\n  font-size: 2rem;\n  line-height: 3rem;\n  color: #000;\n}\n\n.nfb-font__display--lg {\n  font-style: normal;\n  font-weight: bold;\n  font-size: 3rem;\n  line-height: 3.5rem;\n  color: #000;\n}\n\n.nfb-font__display--xl {\n  font-style: normal;\n  font-weight: bold;\n  font-size: 4rem;\n  line-height: 4.5rem;\n  color: #000;\n}\n\n.nfb-font__display--xxl {\n  font-style: normal;\n  font-weight: bold;\n  font-size: 6.5rem;\n  line-height: 6.5rem;\n  color: #000;\n}\n\n._nfb-font__volume--is-discreet-on-light {\n  color: #6b6a69 !important;\n}\n\n._nfb-font__volume--is-mute-on-light {\n  color: #c0bfbe !important;\n}\n\n._nfb-font__volume--is-discreet-on-dark {\n  color: #aaa9a7 !important;\n}\n\n._nfb-font__volume--is-mute-on-dark {\n  color: #464545 !important;\n}\n\n._nfb-font__case--is-upper {\n  text-transform: uppercase !important;\n}\n\n._nfb-font__case--is-lower {\n  text-transform: lowercase !important;\n}\n\n._nfb-font__style--is-italic {\n  font-style: italic !important;\n}\n\n.vjs-nfb-overlay {\n  font-family: \"Ciutadella\", -apple-system, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", \"Helvetica\", \"Arial\", sans-serif;\n}\n\n.vjs-nfb-overlay button {\n  cursor: pointer;\n}\n\n.vjs-nfb-overlay .icon {\n  display: block;\n}\n\n.vjs-nfb-overlay .top-bar-container {\n  position: absolute;\n  top: 0;\n  left: 0;\n  padding: 16px;\n  width: 100%;\n  display: flex;\n  align-items: flex-start;\n  justify-content: space-between;\n}\n\n@media screen and (min-width: 480px) {\n  .vjs-nfb-overlay .top-bar-container {\n    padding: 22px;\n  }\n}\n.vjs-nfb-overlay .top-bar-container::before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 130%;\n  opacity: 0.6;\n  background: linear-gradient(to bottom, hsla(0, 0%, 0%, 0.6) 0%, hsla(0, 0%, 0%, 0.592) 8%, hsla(0, 0%, 0%, 0.571) 15.5%, hsla(0, 0%, 0%, 0.538) 22.7%, hsla(0, 0%, 0%, 0.495) 29.5%, hsla(0, 0%, 0%, 0.444) 36.1%, hsla(0, 0%, 0%, 0.389) 42.5%, hsla(0, 0%, 0%, 0.33) 48.8%, hsla(0, 0%, 0%, 0.27) 54.9%, hsla(0, 0%, 0%, 0.211) 61.1%, hsla(0, 0%, 0%, 0.156) 67.2%, hsla(0, 0%, 0%, 0.105) 73.4%, hsla(0, 0%, 0%, 0.062) 79.7%, hsla(0, 0%, 0%, 0.029) 86.2%, hsla(0, 0%, 0%, 0.008) 93%, hsla(0, 0%, 0%, 0) 100%);\n}\n\n.vjs-nfb-overlay .title-container {\n  color: #fff;\n  z-index: 1;\n  position: relative;\n}\n\n.vjs-nfb-overlay .title-container a {\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  text-decoration: none;\n  color: inherit;\n  transition: all 0.2s linear;\n}\n\n.vjs-nfb-overlay .title-container a:hover {\n  color: var(--accent-color);\n  transition: all 0.2s linear;\n}\n\n.vjs-nfb-overlay .info-container, .vjs-nfb-overlay .share-container {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 2;\n  background: #0a0a0a;\n  background: linear-gradient(to bottom, rgba(0, 0, 0, 0.8) 0%, rgba(62, 62, 62, 0.8) 100%);\n  backdrop-filter: blur(8px);\n}\n\n.vjs-nfb-overlay .info-container .btn-close, .vjs-nfb-overlay .share-container .btn-close {\n  position: absolute;\n  top: 16px;\n  right: 16px;\n  transition: all 0.2s linear;\n  padding: 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n@media screen and (min-width: 480px) {\n  .vjs-nfb-overlay .info-container .btn-close, .vjs-nfb-overlay .share-container .btn-close {\n    top: 22px;\n    right: 22px;\n  }\n}\n.vjs-nfb-overlay .info-container .btn-close:hover, .vjs-nfb-overlay .share-container .btn-close:hover {\n  transform: rotate(90deg);\n  transition: all 0.2s linear;\n  color: var(--accent-color);\n}\n\n.vjs-nfb-overlay .info-container .btn-close .nfb-icon, .vjs-nfb-overlay .share-container .btn-close .nfb-icon {\n  font-size: 1.25em;\n}\n\n.vjs-nfb-overlay .info-container .content-container, .vjs-nfb-overlay .share-container .content-container {\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  overflow-y: auto;\n  padding: 32px 64px;\n  font-size: 0.8125em;\n}\n\n@media screen and (min-width: 769px), print {\n  .vjs-nfb-overlay .info-container .content-container, .vjs-nfb-overlay .share-container .content-container {\n    font-size: 1em;\n    padding: 44px 88px;\n  }\n}\n.vjs-nfb-overlay .info-container .content-container .auto-center, .vjs-nfb-overlay .share-container .content-container .auto-center {\n  margin: auto 0;\n}\n\n.vjs-nfb-overlay .info-container .content-container a, .vjs-nfb-overlay .share-container .content-container a {\n  text-decoration: none;\n  color: var(--accent-color);\n}\n\n.vjs-nfb-overlay .info-container .copy {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  line-height: 1.5;\n}\n\n.vjs-nfb-overlay .share-container .content-container {\n  max-width: 600px;\n  margin: 0 auto;\n}\n\n.vjs-nfb-overlay .share-container .share-buttons {\n  margin: 16px 0;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n@media screen and (min-width: 769px), print {\n  .vjs-nfb-overlay .share-container .share-buttons {\n    margin: 22px 0;\n  }\n}\n.vjs-nfb-overlay .share-container .share-buttons a:not(:last-child) {\n  margin-right: 1rem;\n}\n\n.vjs-nfb-overlay .share-container .share-buttons a {\n  color: inherit;\n}\n\n.vjs-nfb-overlay .share-container .input-container {\n  display: flex;\n  align-items: center;\n  border: 1px solid #fff;\n  padding: 10px;\n  margin: 0.5em 0;\n  color: #fff;\n}\n\n.vjs-nfb-overlay .share-container .input-container i {\n  font-size: 0.85em;\n}\n\n.vjs-nfb-overlay .share-container .input-container input {\n  background: none;\n  padding: 0;\n  margin: 0;\n  color: inherit;\n  font-family: inherit;\n  border-radius: 0;\n  border: 0;\n  flex-grow: 1;\n  margin-left: 10px;\n  outline: none;\n}\n\n.vjs-nfb-overlay .left-controls-container {\n  z-index: 1;\n  position: relative;\n}\n\n.vjs-nfb-overlay .right-controls-container, .vjs-nfb-overlay .left-controls-row {\n  z-index: 1;\n  position: relative;\n  display: flex;\n  align-items: center;\n}\n\n.vjs-nfb-overlay .right-controls-container button, .vjs-nfb-overlay .left-controls-row button {\n  padding: 0;\n  margin-left: 16px;\n  transition: all 0.2s linear;\n}\n\n.vjs-nfb-overlay .right-controls-container button.back-button, .vjs-nfb-overlay .left-controls-row button.back-button {\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  margin-left: 0;\n  margin-right: 1em;\n  display: inline-flex;\n  align-items: center;\n}\n\n.vjs-nfb-overlay .right-controls-container button.back-button i, .vjs-nfb-overlay .left-controls-row button.back-button i {\n  font-size: 1.5em;\n  margin-right: 0.5em;\n}\n\n@media screen and (min-width: 769px), print {\n  .vjs-nfb-overlay .right-controls-container button, .vjs-nfb-overlay .left-controls-row button {\n    margin-left: 22px;\n  }\n}\n.vjs-nfb-overlay .right-controls-container button:hover, .vjs-nfb-overlay .left-controls-row button:hover {\n  color: var(--accent-color);\n  transition: all 0.2s linear;\n}\n\n.vjs-nfb-overlay .right-controls-container button:focus-visible, .vjs-nfb-overlay .left-controls-row button:focus-visible {\n  outline: 2px solid #fff;\n}\n\n.vjs-nfb-overlay .logo-container {\n  position: absolute;\n  right: 0;\n  bottom: 16px;\n}\n\n.vjs-has-started.vjs-nfb-overlay .logo-container {\n  bottom: 120px;\n}\n\n.vjs-nfb-overlay .logo-container a {\n  display: block;\n  padding: 8px;\n  background: #000;\n  color: #fff;\n  text-decoration: none;\n  transition: all 0.2s linear;\n}\n\n.vjs-nfb-overlay .logo-container a .nfb-icon {\n  font-size: 1.125em;\n}\n\n@media screen and (min-width: 769px), print {\n  .vjs-nfb-overlay .logo-container a .nfb-icon {\n    font-size: 2em;\n  }\n}\n@media screen and (min-width: 769px), print {\n  .vjs-nfb-overlay .logo-container a {\n    padding: 11px;\n  }\n}\n.vjs-nfb-overlay .logo-container a:hover {\n  background: #fff;\n  color: #000;\n  transition: all 0.2s linear;\n}\n\n@media screen and (min-width: 400px) {\n  .vjs-has-started.vjs-nfb-overlay .logo-container {\n    bottom: 170px;\n  }\n}\n@media screen and (min-width: 480px) {\n  .vjs-nfb-overlay .logo-container {\n    bottom: 22px;\n  }\n}\n@media screen and (min-width: 769px), print {\n  .vjs-has-started.vjs-nfb-overlay .logo-container {\n    bottom: 220px;\n  }\n}\n.vjs-nfb-overlay ._hide {\n  display: none;\n}\n\n.vjs-nfb-overlay .nfb-player__input-container {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  margin-bottom: 0.5rem;\n}\n\n.vjs-nfb-overlay .nfb-player__input-container > *:not(:last-child) {\n  margin-right: 1.5rem;\n}\n\n.vjs-nfb-overlay .nfb-player__input-container > * input {\n  width: 100%;\n}\n\n.vjs-nfb-overlay .nfb-player__input-container > * input[readonly] {\n  color: #000;\n}\n\n.vjs-nfb-overlay .nfb-player__input-container > *[data-ui-copied=true] {\n  text-align: center;\n}\n\n.vjs-nfb-ratings .ratings-container {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  padding: 16px;\n}\n\n@media screen and (min-width: 480px) {\n  .vjs-nfb-ratings .ratings-container {\n    padding: 22px;\n  }\n}\n.vjs-nfb-ratings .ratings-container::before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 130%;\n  opacity: 0.6;\n  background: linear-gradient(to bottom, hsla(0, 0%, 0%, 0.6) 0%, hsla(0, 0%, 0%, 0.592) 8%, hsla(0, 0%, 0%, 0.571) 15.5%, hsla(0, 0%, 0%, 0.538) 22.7%, hsla(0, 0%, 0%, 0.495) 29.5%, hsla(0, 0%, 0%, 0.444) 36.1%, hsla(0, 0%, 0%, 0.389) 42.5%, hsla(0, 0%, 0%, 0.33) 48.8%, hsla(0, 0%, 0%, 0.27) 54.9%, hsla(0, 0%, 0%, 0.211) 61.1%, hsla(0, 0%, 0%, 0.156) 67.2%, hsla(0, 0%, 0%, 0.105) 73.4%, hsla(0, 0%, 0%, 0.062) 79.7%, hsla(0, 0%, 0%, 0.029) 86.2%, hsla(0, 0%, 0%, 0.008) 93%, hsla(0, 0%, 0%, 0) 100%);\n}\n\n.vjs-nfb-ratings .ratings-container .rating-message {\n  position: relative;\n  z-index: 1;\n  font-size: 0.8125em;\n}\n\n.vjs-nfb-ratings .ratings-container .rating-message .nfb-icon {\n  font-size: inherit;\n}\n\n.vjs-nfb-ratings.vjs-nfb-overlay .ratings-container {\n  position: relative;\n  padding: 0;\n  padding-top: 0.5em;\n}\n\n.vjs-nfb-ratings.vjs-nfb-overlay .ratings-container::before {\n  display: none;\n}\n\n.vjs-nfb-ratings.vjs-nfb-overlay .top-bar-container::before {\n  height: 200%;\n}\n\n.underdash {\n  position: relative;\n  padding-bottom: calc(4px + 0.5em);\n}\n\n.underdash::after {\n  content: \" \";\n  position: absolute;\n  border-bottom: 4px solid #00bfb3;\n  width: 5rem;\n  bottom: 0;\n  left: 0;\n}\n\n.underdash.is-1::after {\n  width: 7.5rem;\n}\n\n.underdash.is-2::after {\n  width: 6.25rem;\n}\n\n.underdash.is-3::after {\n  width: 5rem;\n}\n\n.underdash.is-4::after {\n  width: 3.75rem;\n}\n\n.underdash.is-5::after {\n  width: 3.125rem;\n}\n\n.underdash.is-6::after {\n  width: 2.5rem;\n}\n\n.underdash.is-7::after {\n  width: 1.875rem;\n}\n\n.underdash.is-white::after {\n  border-bottom-color: #fff;\n}\n\n.underdash.is-black::after {\n  border-bottom-color: #0a0a0a;\n}\n\n.underdash.is-light::after {\n  border-bottom-color: #f5f5f5;\n}\n\n.underdash.is-dark::after {\n  border-bottom-color: #464545;\n}\n\n.underdash.is-primary::after {\n  border-bottom-color: #00bfb3;\n}\n\n.underdash.is-link::after {\n  border-bottom-color: #263ea6;\n}\n\n.underdash.is-info::after {\n  border-bottom-color: #01c5c5;\n}\n\n.underdash.is-success::after {\n  border-bottom-color: #c4d600;\n}\n\n.underdash.is-warning::after {\n  border-bottom-color: #ffd100;\n}\n\n.underdash.is-danger::after {\n  border-bottom-color: #e03c31;\n}\n\n.underdash.is-orange::after {\n  border-bottom-color: #ff5c39;\n}\n\n.underdash.is-yellow::after {\n  border-bottom-color: #ffd100;\n}\n\n.underdash.is-green::after {\n  border-bottom-color: #c4d600;\n}\n\n.underdash.is-turquoise::after {\n  border-bottom-color: #00bfb3;\n}\n\n.underdash.is-cyan::after {\n  border-bottom-color: #01c5c5;\n}\n\n.underdash.is-blue::after {\n  border-bottom-color: #0085ca;\n}\n\n.underdash.is-purple::after {\n  border-bottom-color: #87319a;\n}\n\n.underdash.is-red::after {\n  border-bottom-color: #e03c31;\n}\n\n.underdash.is-pink::after {\n  border-bottom-color: #f6416c;\n}\n\n.vjs-nfb-trigger-warnings.vjs-nfb-trigger-warnings-with-poster .vjs-poster {\n  display: block;\n}\n\n.vjs-nfb-trigger-warnings .trigger-warnings-container {\n  position: absolute;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  z-index: 2;\n  display: none;\n}\n\n.vjs-nfb-trigger-warnings .trigger-warnings-container::before {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 0;\n  display: block;\n  width: 100%;\n  height: 100%;\n  background: #0a0a0a;\n  opacity: 0.8;\n  z-index: 1;\n}\n\n.vjs-nfb-trigger-warnings .trigger-warnings-container::after {\n  content: \"\";\n  position: absolute;\n  top: 0;\n  left: 0;\n  display: block;\n  width: 100%;\n  height: 100%;\n  background: #0a0a0a;\n  background: rgba(0, 0, 0, 0) radial-gradient(closest-side at 50% 50%, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.7450980392) 77%, #000000 100%) 0% 0% no-repeat padding-box;\n  opacity: 0.75;\n  z-index: 2;\n}\n\n.vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-item {\n  opacity: 0;\n  position: absolute;\n  z-index: 3;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  display: flex;\n  flex-direction: column;\n  justify-content: space-between;\n  padding: 0.6666666667em;\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-weight: 500;\n  color: #fff;\n  font-size: 0.875em;\n  pointer-events: none;\n}\n\n@media screen and (min-width: 769px), print {\n  .vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-item {\n    font-size: 1.125em;\n    padding: 1em;\n  }\n}\n@media screen and (min-width: 1024px) {\n  .vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-item {\n    font-size: 1.5em;\n    padding: 1.3333333333em;\n  }\n}\n.vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-item[data-active-trigger-warning] {\n  opacity: 1;\n  transition: opacity 1250ms;\n  pointer-events: auto;\n}\n\n.vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-item .title {\n  font-size: inherit;\n  font-weight: inherit;\n  text-transform: uppercase;\n  margin-top: 0;\n  margin-bottom: calc(0.5em + 2px);\n}\n\n.vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-item .copy {\n  line-height: 1.25;\n  overflow-y: scroll;\n  max-height: 100%;\n  padding-right: 1em;\n  scrollbar-width: thin;\n  scrollbar-color: #e03c31 rgba(0, 0, 0, 0);\n}\n\n.vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-item .copy::-webkit-scrollbar {\n  width: 0.5em;\n}\n\n.vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-item .copy::-webkit-scrollbar-thumb {\n  background-color: #e03c31;\n  outline: 0;\n}\n\n.vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-content {\n  overflow: hidden;\n  max-width: 720px;\n}\n\n.vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-progress {\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  margin-top: calc(0.5em + 2px);\n}\n\n.vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-progress .circular-progress {\n  width: 1.1428571429em;\n  height: 1.1428571429em;\n  margin-right: 0.9166666667em;\n}\n\n@media screen and (min-width: 769px), print {\n  .vjs-nfb-trigger-warnings .trigger-warnings-container .trigger-warnings-progress .circular-progress {\n    width: 2.3333333333em;\n    height: 2.3333333333em;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue {\n  font-size: 1rem;\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  overflow: hidden;\n  color: #fff;\n  opacity: 1;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-modal-dialog {\n  z-index: 1;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue select:focus, .video-js.vjs-nfb-theme-balmoral-neue vjs-menu li.vjs-selected, .video-js.vjs-nfb-theme-balmoral-neue .vjs-menu li.vjs-selected:focus {\n  background: #fff;\n}\n\n.is-safari.video-js.vjs-nfb-theme-balmoral-neue .vjs-tech {\n  pointer-events: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue button {\n  font-family: inherit;\n}\n\n.video-js[data-settings-panel-active=true] .vjs-tech {\n  pointer-events: none;\n}\n\n.nfb-font__family--sans-serif, .nfb-font__label--xs--sans, .nfb-font__label--sm--sans, .nfb-font__label--md--sans, .nfb-font__label--lg--sans, .nfb-font__label--xl--sans, .nfb-font__body--xs--sans, .nfb-font__body--sm--sans, .nfb-font__body--md--sans, .nfb-font__body--lg--sans, .nfb-font__body--xl--sans, .nfb-font__title--sm, .nfb-font__title--md, .nfb-font__title--lg, .nfb-font__title--xl, .nfb-font__title--xxl, .nfb-font__title--3xl, .nfb-font__headline--6, .nfb-font__headline--5, .nfb-font__headline--4, .nfb-font__headline--3, .nfb-font__headline--2, .nfb-font__headline--1, .nfb-font__display--sm, .nfb-font__display--md, .nfb-font__display--lg, .nfb-font__display--xl, .nfb-font__display--xxl {\n  font-family: \"Ciutadella\", -apple-system, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", \"Helvetica\", \"Arial\", sans-serif;\n}\n\n.nfb-font__family--serif, .nfb-font__label--xs--serif, .nfb-font__label--md--serif, .nfb-font__label--lg--serif, .nfb-font__body--sm--serif, .nfb-font__body--md--serif, .nfb-font__body--lg--serif, .nfb-font__body--xl--serif {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n}\n\n.nfb-font__family--monospace {\n  font-family: monospace;\n}\n\n.nfb-font__label--xs--sans {\n  font-style: normal;\n  font-weight: 500;\n  font-size: 0.75rem;\n  line-height: 1rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--sm--sans {\n  font-style: normal;\n  font-weight: 500;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--md--sans {\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--lg--sans {\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1.125rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--xl--sans {\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1.5rem;\n  line-height: 2rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--xs--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.75rem;\n  line-height: 1rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--md--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.875rem;\n  line-height: 1.25rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__label--lg--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.25rem;\n  color: #1c1b1b;\n}\n\n.nfb-font__body--xs--sans {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.75rem;\n  line-height: 1rem;\n  color: #000;\n}\n\n.nfb-font__body--sm--sans {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: #000;\n}\n\n.nfb-font__body--md--sans {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__body--lg--sans {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.125rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__body--xl--sans {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.5rem;\n  line-height: 2rem;\n  color: #000;\n}\n\n.nfb-font__body--sm--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.75rem;\n  line-height: 1rem;\n  color: #000;\n}\n\n.nfb-font__body--md--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.875rem;\n  line-height: 1.25rem;\n  color: #000;\n}\n\n.nfb-font__body--lg--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__body--xl--serif {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.25rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__title--sm {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: #000;\n}\n\n.nfb-font__title--md {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 1rem;\n  line-height: 1.25rem;\n  color: #000;\n}\n\n.nfb-font__title--lg {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 1.125rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__title--xl {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 1.5rem;\n  line-height: 2rem;\n  color: #000;\n}\n\n.nfb-font__title--xxl {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 2rem;\n  line-height: 3rem;\n  color: #000;\n}\n\n.nfb-font__title--3xl {\n  font-style: normal;\n  font-weight: 600;\n  font-size: 3rem;\n  line-height: 3.5rem;\n  color: #000;\n}\n\n.nfb-font__headline--6 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.3125rem;\n  line-height: 1.5rem;\n  color: #000;\n}\n\n.nfb-font__headline--5 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.5rem;\n  line-height: 2rem;\n  color: #000;\n}\n\n.nfb-font__headline--4 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1.75rem;\n  line-height: 2.125rem;\n  color: #000;\n}\n\n.nfb-font__headline--3 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 2rem;\n  line-height: 2.375rem;\n  color: #000;\n}\n\n.nfb-font__headline--2 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 3rem;\n  line-height: 3.625rem;\n  color: #000;\n}\n\n.nfb-font__headline--1 {\n  font-style: normal;\n  font-weight: normal;\n  font-size: 4rem;\n  line-height: 4.75rem;\n  color: #000;\n}\n\n.nfb-font__display--sm {\n  font-style: normal;\n  font-weight: bold;\n  font-size: 1.75rem;\n  line-height: 2rem;\n  color: #000;\n}\n\n.nfb-font__display--md {\n  font-style: normal;\n  font-weight: bold;\n  font-size: 2rem;\n  line-height: 3rem;\n  color: #000;\n}\n\n.nfb-font__display--lg {\n  font-style: normal;\n  font-weight: bold;\n  font-size: 3rem;\n  line-height: 3.5rem;\n  color: #000;\n}\n\n.nfb-font__display--xl {\n  font-style: normal;\n  font-weight: bold;\n  font-size: 4rem;\n  line-height: 4.5rem;\n  color: #000;\n}\n\n.nfb-font__display--xxl {\n  font-style: normal;\n  font-weight: bold;\n  font-size: 6.5rem;\n  line-height: 6.5rem;\n  color: #000;\n}\n\n._nfb-font__volume--is-discreet-on-light {\n  color: #6b6a69 !important;\n}\n\n._nfb-font__volume--is-mute-on-light {\n  color: #c0bfbe !important;\n}\n\n._nfb-font__volume--is-discreet-on-dark {\n  color: #aaa9a7 !important;\n}\n\n._nfb-font__volume--is-mute-on-dark {\n  color: #464545 !important;\n}\n\n._nfb-font__case--is-upper {\n  text-transform: uppercase !important;\n}\n\n._nfb-font__case--is-lower {\n  text-transform: lowercase !important;\n}\n\n._nfb-font__style--is-italic {\n  font-style: italic !important;\n}\n\n.nfb-icon {\n  font-family: \"balmoral-icons\" !important;\n  font-size: 1.125rem;\n  width: auto;\n  speak: never;\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-48h-rental:before {\n  content: \"\\\\e60b\";\n}\n\n.icon-4k:before {\n  content: \"\\\\e9ca\";\n}\n\n.icon-add:before {\n  content: \"\\\\e9bc\";\n}\n\n.icon-add-circle:before {\n  content: \"\\\\e918\";\n}\n\n.icon-add-o:before {\n  content: \"\\\\e955\";\n}\n\n.icon-airplay:before {\n  content: \"\\\\e97a\";\n}\n\n.icon-amazon:before {\n  content: \"\\\\ea87\";\n}\n\n.icon-android:before {\n  content: \"\\\\eac0\";\n}\n\n.icon-angry:before {\n  content: \"\\\\e9de\";\n}\n\n.icon-angry-o:before {\n  content: \"\\\\e9df\";\n}\n\n.icon-appleinc:before {\n  content: \"\\\\eabe\";\n}\n\n.icon-arrowhead:before {\n  content: \"\\\\e95d\";\n}\n\n.icon-arrowhead-down:before {\n  content: \"\\\\e9ce\";\n}\n\n.icon-arrowhead-left:before {\n  content: \"\\\\e9cf\";\n}\n\n.icon-arrowhead-up:before {\n  content: \"\\\\e9d0\";\n}\n\n.icon-audio-subtitles-f:before {\n  content: \"\\\\e99d\";\n}\n\n.icon-audio-subtitles-o:before {\n  content: \"\\\\e99e\";\n}\n\n.icon-avatar:before {\n  content: \"\\\\e60c\";\n}\n\n.icon-bluesky:before {\n  content: \"\\\\e9da\";\n}\n\n.icon-bold:before {\n  content: \"\\\\e969\";\n}\n\n.icon-bulb:before {\n  content: \"\\\\e99c\";\n}\n\n.icon-burger-menu:before {\n  content: \"\\\\e9cb\";\n}\n\n.icon-calendar-add-o:before {\n  content: \"\\\\e968\";\n}\n\n.icon-calendar-day:before {\n  content: \"\\\\e93a\";\n}\n\n.icon-calendar-day-o:before {\n  content: \"\\\\e937\";\n}\n\n.icon-calendar-month:before {\n  content: \"\\\\e93c\";\n}\n\n.icon-calendar-month-o:before {\n  content: \"\\\\e939\";\n}\n\n.icon-card-layout:before {\n  content: \"\\\\e976\";\n}\n\n.icon-cart-f:before {\n  content: \"\\\\e9a3\";\n}\n\n.icon-cart-o:before {\n  content: \"\\\\e967\";\n}\n\n.icon-cash:before {\n  content: \"\\\\e608\";\n}\n\n.icon-cash-o:before {\n  content: \"\\\\e61d\";\n}\n\n.icon-cast:before {\n  content: \"\\\\e97b\";\n}\n\n.icon-cast-on:before {\n  content: \"\\\\e981\";\n}\n\n.icon-categories:before {\n  content: \"\\\\e9d8\";\n}\n\n.icon-categories-f:before {\n  content: \"\\\\e9d9\";\n}\n\n.icon-cc:before {\n  content: \"\\\\e9bd\";\n}\n\n.icon-cc-en:before {\n  content: \"\\\\e602\";\n}\n\n.icon-cc-en-o:before {\n  content: \"\\\\e958\";\n}\n\n.icon-cc-fr:before {\n  content: \"\\\\e61a\";\n}\n\n.icon-cc-fr-o:before {\n  content: \"\\\\e956\";\n}\n\n.icon-cc-o:before {\n  content: \"\\\\e9be\";\n}\n\n.icon-cd:before {\n  content: \"\\\\e609\";\n}\n\n.icon-channel-animation-f:before {\n  content: \"\\\\e94f\";\n}\n\n.icon-channel-animation-o:before {\n  content: \"\\\\e98b\";\n}\n\n.icon-channel-doc-f:before {\n  content: \"\\\\e98c\";\n}\n\n.icon-channel-doc-o:before {\n  content: \"\\\\e98d\";\n}\n\n.icon-channel-f:before {\n  content: \"\\\\e98e\";\n}\n\n.icon-channel-o:before {\n  content: \"\\\\e98f\";\n}\n\n.icon-chat-f:before {\n  content: \"\\\\e9a4\";\n}\n\n.icon-chat-o:before {\n  content: \"\\\\e953\";\n}\n\n.icon-check-box-o:before {\n  content: \"\\\\e972\";\n}\n\n.icon-check-circle:before {\n  content: \"\\\\e919\";\n}\n\n.icon-check-mark:before {\n  content: \"\\\\e971\";\n}\n\n.icon-check-o:before {\n  content: \"\\\\e954\";\n}\n\n.icon-chevron-down:before {\n  content: \"\\\\e95b\";\n}\n\n.icon-chevron-left:before {\n  content: \"\\\\e945\";\n}\n\n.icon-chevron-right:before {\n  content: \"\\\\e95c\";\n}\n\n.icon-chevron-up:before {\n  content: \"\\\\e95a\";\n}\n\n.icon-circle-fat:before {\n  content: \"\\\\e923\";\n}\n\n.icon-ciseaux:before {\n  content: \"\\\\e620\";\n}\n\n.icon-clock:before {\n  content: \"\\\\e60d\";\n}\n\n.icon-closeNav:before {\n  content: \"\\\\e600\";\n}\n\n.icon-collapse-down:before {\n  content: \"\\\\e914\";\n}\n\n.icon-collapse-up:before {\n  content: \"\\\\e916\";\n}\n\n.icon-collection:before {\n  content: \"\\\\e95f\";\n}\n\n.icon-compact-layout:before {\n  content: \"\\\\e975\";\n}\n\n.icon-compact-list:before {\n  content: \"\\\\e998\";\n}\n\n.icon-credit-card:before {\n  content: \"\\\\e628\";\n}\n\n.icon-credit-card-o:before {\n  content: \"\\\\e95e\";\n}\n\n.icon-ctrl-no-play:before {\n  content: \"\\\\e996\";\n}\n\n.icon-ctrl-pause:before {\n  content: \"\\\\e959\";\n}\n\n.icon-ctrl-play:before {\n  content: \"\\\\e94a\";\n}\n\n.icon-ctrl-skip-back:before {\n  content: \"\\\\e944\";\n}\n\n.icon-ctrl-skip-forward:before {\n  content: \"\\\\e942\";\n}\n\n.icon-ctrl-stop:before {\n  content: \"\\\\e949\";\n}\n\n.icon-delete:before {\n  content: \"\\\\e9c7\";\n}\n\n.icon-delete-circle:before {\n  content: \"\\\\e905\";\n}\n\n.icon-delete-o:before {\n  content: \"\\\\e950\";\n}\n\n.icon-desactivation:before {\n  content: \"\\\\e629\";\n}\n\n.icon-detailed-layout:before {\n  content: \"\\\\e974\";\n}\n\n.icon-discord:before {\n  content: \"\\\\e9db\";\n}\n\n.icon-dolby:before {\n  content: \"\\\\e9bb\";\n}\n\n.icon-down:before {\n  content: \"\\\\e928\";\n}\n\n.icon-down-circle:before {\n  content: \"\\\\e9bf\";\n}\n\n.icon-down-circle-o:before {\n  content: \"\\\\e9c0\";\n}\n\n.icon-download:before {\n  content: \"\\\\e93f\";\n}\n\n.icon-dto-circle:before {\n  content: \"\\\\e94e\";\n}\n\n.icon-dto-disk:before {\n  content: \"\\\\e621\";\n}\n\n.icon-dto-o:before {\n  content: \"\\\\e606\";\n}\n\n.icon-duplicate-lesson:before {\n  content: \"\\\\e922\";\n}\n\n.icon-dv:before {\n  content: \"\\\\e906\";\n}\n\n.icon-dv-o:before {\n  content: \"\\\\e903\";\n}\n\n.icon-dvd-o:before {\n  content: \"\\\\e982\";\n}\n\n.icon-edit:before {\n  content: \"\\\\e902\";\n}\n\n.icon-edit-cicle-o:before {\n  content: \"\\\\e952\";\n}\n\n.icon-edit-circle:before {\n  content: \"\\\\e907\";\n}\n\n.icon-edit-o:before {\n  content: \"\\\\e979\";\n}\n\n.icon-edu-institutions-business:before {\n  content: \"\\\\e90e\";\n}\n\n.icon-embed:before {\n  content: \"\\\\e983\";\n}\n\n.icon-enlarge:before {\n  content: \"\\\\e989\";\n}\n\n.icon-enveloppe-0:before {\n  content: \"\\\\e951\";\n}\n\n.icon-enveloppe-o:before {\n  content: \"\\\\e951\";\n}\n\n.icon-enveloppe-f:before {\n  content: \"\\\\e9a5\";\n}\n\n.icon-external:before {\n  content: \"\\\\e935\";\n}\n\n.icon-external-link:before {\n  content: \"\\\\e61c\";\n}\n\n.icon-eye:before {\n  content: \"\\\\e931\";\n}\n\n.icon-eye-blocked:before {\n  content: \"\\\\e92e\";\n}\n\n.icon-facebook:before {\n  content: \"\\\\f09a\";\n}\n\n.icon-facture:before {\n  content: \"\\\\e61b\";\n}\n\n.icon-filter-o:before {\n  content: \"\\\\e973\";\n}\n\n.icon-flag-o:before {\n  content: \"\\\\e999\";\n}\n\n.icon-gallery:before {\n  content: \"\\\\e619\";\n}\n\n.icon-globe-f:before {\n  content: \"\\\\e9a6\";\n}\n\n.icon-globe-o:before {\n  content: \"\\\\e9a7\";\n}\n\n.icon-google-classroom:before {\n  content: \"\\\\e9cc\";\n}\n\n.icon-google-play:before {\n  content: \"\\\\e9a0\";\n}\n\n.icon-happy:before {\n  content: \"\\\\e9e0\";\n}\n\n.icon-happy-o:before {\n  content: \"\\\\e9e1\";\n}\n\n.icon-help-circle:before {\n  content: \"\\\\e94d\";\n}\n\n.icon-help-o:before {\n  content: \"\\\\e94c\";\n}\n\n.icon-helpcenter:before {\n  content: \"\\\\e60a\";\n}\n\n.icon-home-f:before {\n  content: \"\\\\e990\";\n}\n\n.icon-home-o:before {\n  content: \"\\\\e94b\";\n}\n\n.icon-hourglass-end-o:before {\n  content: \"\\\\e97d\";\n}\n\n.icon-hourglass-o:before {\n  content: \"\\\\e97e\";\n}\n\n.icon-hourglass-start-o:before {\n  content: \"\\\\e97c\";\n}\n\n.icon-info-o:before {\n  content: \"\\\\e917\";\n}\n\n.icon-instagram:before {\n  content: \"\\\\ea92\";\n}\n\n.icon-institutions:before {\n  content: \"\\\\e90d\";\n}\n\n.icon-interactif-hand:before {\n  content: \"\\\\e90f\";\n}\n\n.icon-interactif-hand-f:before {\n  content: \"\\\\e991\";\n}\n\n.icon-interactif-hand-o:before {\n  content: \"\\\\e963\";\n}\n\n.icon-interactive-app:before {\n  content: \"\\\\e909\";\n}\n\n.icon-interactive-code:before {\n  content: \"\\\\e960\";\n}\n\n.icon-interactive-play:before {\n  content: \"\\\\e96e\";\n}\n\n.icon-ip-access:before {\n  content: \"\\\\e908\";\n}\n\n.icon-italic:before {\n  content: \"\\\\e96a\";\n}\n\n.icon-learning-bundles:before {\n  content: \"\\\\e90a\";\n}\n\n.icon-left-arrow:before {\n  content: \"\\\\e913\";\n}\n\n.icon-left-circle:before {\n  content: \"\\\\e9c1\";\n}\n\n.icon-left-circle-o:before {\n  content: \"\\\\e9c2\";\n}\n\n.icon-lesson:before {\n  content: \"\\\\e932\";\n}\n\n.icon-link:before {\n  content: \"\\\\e941\";\n}\n\n.icon-linkdin:before {\n  content: \"\\\\e966\";\n}\n\n.icon-lock-o:before {\n  content: \"\\\\e9af\";\n}\n\n.icon-logout:before {\n  content: \"\\\\e9dc\";\n}\n\n.icon-loupe:before {\n  content: \"\\\\e616\";\n}\n\n.icon-loupe-f:before {\n  content: \"\\\\e98a\";\n}\n\n.icon-map-marker:before {\n  content: \"\\\\e93b\";\n}\n\n.icon-map-marker-o:before {\n  content: \"\\\\e980\";\n}\n\n.icon-marc-ip:before {\n  content: \"\\\\e91e\";\n}\n\n.icon-marc-records:before {\n  content: \"\\\\e915\";\n}\n\n.icon-marker:before {\n  content: \"\\\\e91c\";\n}\n\n.icon-marker-plain:before {\n  content: \"\\\\e927\";\n}\n\n.icon-mastodon:before {\n  content: \"\\\\e9a1\";\n}\n\n.icon-maximize:before {\n  content: \"\\\\e92c\";\n}\n\n.icon-media_school:before {\n  content: \"\\\\e90b\";\n}\n\n.icon-meta:before {\n  content: \"\\\\e99f\";\n}\n\n.icon-metre-o:before {\n  content: \"\\\\e99a\";\n}\n\n.icon-minimize:before {\n  content: \"\\\\e92d\";\n}\n\n.icon-more-menu-horiz:before {\n  content: \"\\\\e934\";\n}\n\n.icon-more-menu-vert:before {\n  content: \"\\\\e933\";\n}\n\n.icon-move:before {\n  content: \"\\\\e924\";\n}\n\n.icon-move-horizontal:before {\n  content: \"\\\\e925\";\n}\n\n.icon-move-marker:before {\n  content: \"\\\\e930\";\n}\n\n.icon-move-vertical:before {\n  content: \"\\\\e926\";\n}\n\n.icon-ms-teams:before {\n  content: \"\\\\e9cd\";\n}\n\n.icon-mute:before {\n  content: \"\\\\e92a\";\n}\n\n.icon-neutral:before {\n  content: \"\\\\e9e2\";\n}\n\n.icon-neutral-o:before {\n  content: \"\\\\e9e3\";\n}\n\n.icon-newsletter-o:before {\n  content: \"\\\\e947\";\n}\n\n.icon-next:before {\n  content: \"\\\\e615\";\n}\n\n.icon-nfb-classic-logo:before {\n  content: \"\\\\e9d1\";\n}\n\n.icon-nfb-classic-logo-adj:before {\n  content: \"\\\\e9d2\";\n}\n\n.icon-nfb-onf-logo:before {\n  content: \"\\\\e901\";\n}\n\n.icon-nfb-sq:before {\n  content: \"\\\\e948\";\n}\n\n.icon-no-picture:before {\n  content: \"\\\\e994\";\n}\n\n.icon-no-play-o:before {\n  content: \"\\\\e995\";\n}\n\n.icon-notification:before {\n  content: \"\\\\e961\";\n}\n\n.icon-notification-f:before {\n  content: \"\\\\e9a8\";\n}\n\n.icon-o-list:before {\n  content: \"\\\\e96b\";\n}\n\n.icon-ocean_school:before {\n  content: \"\\\\e93d\";\n}\n\n.icon-oculus:before {\n  content: \"\\\\e936\";\n}\n\n.icon-pause-circle:before {\n  content: \"\\\\e921\";\n}\n\n.icon-phone-circle:before {\n  content: \"\\\\e607\";\n}\n\n.icon-phone-o:before {\n  content: \"\\\\e965\";\n}\n\n.icon-picture:before {\n  content: \"\\\\e91a\";\n}\n\n.icon-pinterest:before {\n  content: \"\\\\e962\";\n}\n\n.icon-play:before {\n  content: \"\\\\e613\";\n}\n\n.icon-play-o:before {\n  content: \"\\\\e605\";\n}\n\n.icon-play-only:before {\n  content: \"\\\\e90c\";\n}\n\n.icon-playlist:before {\n  content: \"\\\\e910\";\n}\n\n.icon-pop-in-o:before {\n  content: \"\\\\e984\";\n}\n\n.icon-pop-out-o:before {\n  content: \"\\\\e985\";\n}\n\n.icon-prev:before {\n  content: \"\\\\e614\";\n}\n\n.icon-rating-14plus:before {\n  content: \"\\\\e9b6\";\n}\n\n.icon-rating-14plus-o:before {\n  content: \"\\\\e9b1\";\n}\n\n.icon-rating-18plus:before {\n  content: \"\\\\e9b7\";\n}\n\n.icon-rating-18plus-o:before {\n  content: \"\\\\e9ba\";\n}\n\n.icon-rating-exempt:before {\n  content: \"\\\\e9b3\";\n}\n\n.icon-rating-exempt-o:before {\n  content: \"\\\\e9b2\";\n}\n\n.icon-rating-g:before {\n  content: \"\\\\e9b4\";\n}\n\n.icon-rating-g-o:before {\n  content: \"\\\\e9b8\";\n}\n\n.icon-rating-pg:before {\n  content: \"\\\\e9b5\";\n}\n\n.icon-rating-pg-o:before {\n  content: \"\\\\e9b9\";\n}\n\n.icon-re-order:before {\n  content: \"\\\\e91d\";\n}\n\n.icon-reddit:before {\n  content: \"\\\\e9a9\";\n}\n\n.icon-reduce:before {\n  content: \"\\\\e946\";\n}\n\n.icon-replay:before {\n  content: \"\\\\e987\";\n}\n\n.icon-revert:before {\n  content: \"\\\\e904\";\n}\n\n.icon-right-arrow:before {\n  content: \"\\\\e912\";\n}\n\n.icon-right-circle:before {\n  content: \"\\\\e9c3\";\n}\n\n.icon-right-circle-o:before {\n  content: \"\\\\e9c4\";\n}\n\n.icon-roundedArrow:before {\n  content: \"\\\\e612\";\n}\n\n.icon-sad:before {\n  content: \"\\\\e9e4\";\n}\n\n.icon-sad-o:before {\n  content: \"\\\\e9e5\";\n}\n\n.icon-settings:before {\n  content: \"\\\\e943\";\n}\n\n.icon-settings-f:before {\n  content: \"\\\\e992\";\n}\n\n.icon-share:before {\n  content: \"\\\\e92f\";\n}\n\n.icon-share-lesson:before {\n  content: \"\\\\e91b\";\n}\n\n.icon-share-o:before {\n  content: \"\\\\e940\";\n}\n\n.icon-share2:before {\n  content: \"\\\\e611\";\n}\n\n.icon-shield-o:before {\n  content: \"\\\\e977\";\n}\n\n.icon-skip:before {\n  content: \"\\\\e988\";\n}\n\n.icon-skip-back:before {\n  content: \"\\\\e91f\";\n}\n\n.icon-skip-forward:before {\n  content: \"\\\\e920\";\n}\n\n.icon-smile:before {\n  content: \"\\\\e9e6\";\n}\n\n.icon-smile-o:before {\n  content: \"\\\\e9e7\";\n}\n\n.icon-spark:before {\n  content: \"\\\\e993\";\n}\n\n.icon-star-f:before {\n  content: \"\\\\e9aa\";\n}\n\n.icon-star-o:before {\n  content: \"\\\\e97f\";\n}\n\n.icon-stc:before {\n  content: \"\\\\e9c8\";\n}\n\n.icon-stc-o:before {\n  content: \"\\\\e9c9\";\n}\n\n.icon-steam:before {\n  content: \"\\\\eaac\";\n}\n\n.icon-study-guides-o:before {\n  content: \"\\\\e964\";\n}\n\n.icon-subtitle-f:before {\n  content: \"\\\\e997\";\n}\n\n.icon-subtitle-o:before {\n  content: \"\\\\e986\";\n}\n\n.icon-switch:before {\n  content: \"\\\\e900\";\n}\n\n.icon-sync:before {\n  content: \"\\\\e9d3\";\n}\n\n.icon-thumb-up:before {\n  content: \"\\\\e9d4\";\n}\n\n.icon-thumb-up-o:before {\n  content: \"\\\\e9d5\";\n}\n\n.icon-tiktok:before {\n  content: \"\\\\e99b\";\n}\n\n.icon-top-right-arrow:before {\n  content: \"\\\\e9dd\";\n}\n\n.icon-trailer-f:before {\n  content: \"\\\\e9ab\";\n}\n\n.icon-trailer-o:before {\n  content: \"\\\\e9ac\";\n}\n\n.icon-trash-o:before {\n  content: \"\\\\e978\";\n}\n\n.icon-twitter:before {\n  content: \"\\\\f099\";\n}\n\n.icon-twitter-x:before {\n  content: \"\\\\e9a2\";\n}\n\n.icon-u-list:before {\n  content: \"\\\\e96c\";\n}\n\n.icon-underline:before {\n  content: \"\\\\e96d\";\n}\n\n.icon-unlink:before {\n  content: \"\\\\f127\";\n}\n\n.icon-up:before {\n  content: \"\\\\e929\";\n}\n\n.icon-up-circle:before {\n  content: \"\\\\e9c5\";\n}\n\n.icon-up-circle-o:before {\n  content: \"\\\\e9c6\";\n}\n\n.icon-upload:before {\n  content: \"\\\\e9b0\";\n}\n\n.icon-user-f:before {\n  content: \"\\\\e9ad\";\n}\n\n.icon-user-o:before {\n  content: \"\\\\e9ae\";\n}\n\n.icon-user-settings-f:before {\n  content: \"\\\\e9d6\";\n}\n\n.icon-user-settings-o:before {\n  content: \"\\\\e9d7\";\n}\n\n.icon-video-camera:before {\n  content: \"\\\\e938\";\n}\n\n.icon-vimeo:before {\n  content: \"\\\\e60e\";\n}\n\n.icon-virtual-class:before {\n  content: \"\\\\e911\";\n}\n\n.icon-viveport:before {\n  content: \"\\\\e93e\";\n}\n\n.icon-vod:before {\n  content: \"\\\\e604\";\n}\n\n.icon-vod-o:before {\n  content: \"\\\\e601\";\n}\n\n.icon-vod-tilt:before {\n  content: \"\\\\e60f\";\n}\n\n.icon-vod-tilt-o:before {\n  content: \"\\\\e617\";\n}\n\n.icon-volume:before {\n  content: \"\\\\e92b\";\n}\n\n.icon-warning:before {\n  content: \"\\\\e61e\";\n}\n\n.icon-warning-o:before {\n  content: \"\\\\e957\";\n}\n\n.icon-web-recorder:before {\n  content: \"\\\\e970\";\n}\n\n.icon-web-recorder-circle:before {\n  content: \"\\\\e96f\";\n}\n\n.icon-windows:before {\n  content: \"\\\\eac1\";\n}\n\n.icon-youtube:before {\n  content: \"\\\\e61f\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue {\n  --accent-color: #05EE80;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-control-bar {\n  flex-wrap: wrap;\n  height: auto;\n  background: linear-gradient(to top, hsla(0, 0%, 0%, 0.6) 0%, hsla(0, 0%, 0%, 0.592) 8%, hsla(0, 0%, 0%, 0.571) 15.5%, hsla(0, 0%, 0%, 0.538) 22.7%, hsla(0, 0%, 0%, 0.495) 29.5%, hsla(0, 0%, 0%, 0.444) 36.1%, hsla(0, 0%, 0%, 0.389) 42.5%, hsla(0, 0%, 0%, 0.33) 48.8%, hsla(0, 0%, 0%, 0.27) 54.9%, hsla(0, 0%, 0%, 0.211) 61.1%, hsla(0, 0%, 0%, 0.156) 67.2%, hsla(0, 0%, 0%, 0.105) 73.4%, hsla(0, 0%, 0%, 0.062) 79.7%, hsla(0, 0%, 0%, 0.029) 86.2%, hsla(0, 0%, 0%, 0.008) 93%, hsla(0, 0%, 0%, 0) 100%);\n  padding: 16px;\n  align-items: center;\n  justify-content: space-between;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-control-bar .vjs-play-progress .vjs-time-tooltip {\n  display: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-control-bar .vjs-control-text {\n  user-select: none;\n  -webkit-user-select: none;\n  touch-action: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-control-bar button.vjs-control:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .vjs-control-bar button.vjs-button:focus-visible {\n  outline: 2px solid #fff;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-control-bar .vjs-time-container {\n  margin-bottom: 0.5rem;\n  margin-top: 1rem;\n  display: flex;\n  align-items: center;\n  outline: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-control-custom-container {\n  display: flex;\n  z-index: 1;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-time-control {\n  padding-left: 0.3125em;\n  padding-right: 0.3125em;\n  width: auto;\n  min-width: 2.5em;\n  line-height: 3em;\n}\n\n@media screen and (min-width: 480px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-time-control {\n    padding-left: 0.3125em;\n    padding-right: 0.3125em;\n    min-width: 3em;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-current-time, .video-js.vjs-nfb-theme-balmoral-neue .vjs-time-divider, .video-js.vjs-nfb-theme-balmoral-neue .vjs-duration {\n  display: block;\n  font-size: 0.65em;\n  line-height: 1;\n  margin-top: 2px;\n}\n\n@media screen and (min-width: 480px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-current-time, .video-js.vjs-nfb-theme-balmoral-neue .vjs-time-divider, .video-js.vjs-nfb-theme-balmoral-neue .vjs-duration {\n    font-size: 0.75rem;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-current-time {\n  padding-right: 0.25rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-current-time .vjs-current-time-display {\n  display: block;\n  text-align: right;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-duration {\n  padding-left: 0.25rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-duration .vjs-duration-display {\n  display: block;\n  text-align: left;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-time-divider {\n  padding: 0;\n  min-width: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-remaining-time {\n  display: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-menu-button-popup .vjs-menu {\n  width: 0;\n  left: 50%;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-menu-button-popup .vjs-menu .vjs-menu-content {\n  bottom: 1em;\n  font-family: \"Ciutadella\", -apple-system, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", \"Helvetica\", \"Arial\", sans-serif;\n  font-size: 0.75rem;\n  max-height: 22em;\n  background: #0a0a0a;\n  transform: translateX(-50%);\n  width: auto;\n  min-width: 5em;\n  z-index: 3;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-menu-button-popup .vjs-menu .vjs-menu-title {\n  text-align: left;\n  padding: 0.5em;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-menu-button-popup .vjs-menu .vjs-menu-item {\n  text-transform: uppercase;\n  text-align: left;\n  padding: 0.5em;\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  white-space: nowrap;\n  color: inerhit;\n  font-size: 1em;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-menu-button-popup .vjs-menu .vjs-menu-item.vjs-selected {\n  background: #fff;\n  color: #0a0a0a;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-menu-button-popup .vjs-menu .vjs-menu-item:hover {\n  background: #fff;\n  color: #0a0a0a;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-menu-button-popup .vjs-menu .vjs-menu-item:focus-visible {\n  outline: none;\n  background: #313030;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-menu-button-popup .vjs-menu .vjs-menu-item.vjs-selected::after {\n  font-family: \"balmoral-icons\";\n  content: \"\\\\e954\";\n  margin-left: 5px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-poster {\n  background-size: cover;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-poster:focus-visible {\n  outline: none;\n}\n\n@keyframes loader {\n  0% {\n    background-color: var(--nfb-loader-color);\n  }\n  50%, 100% {\n    background-color: var(--nfb-loader-transition-color);\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  display: none;\n  --nfb-loader-size: 6px;\n  --nfb-loader-gap: 12px;\n  --nfb-loader-color: #000000;\n  --nfb-loader-transition-color: $nfb-loader-transition-color--light;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading {\n  display: block;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading .nfb-loader__dot {\n  position: relative;\n  width: var(--nfb-loader-size);\n  height: var(--nfb-loader-size);\n  border-radius: 50%;\n  background-color: #000;\n  color: #000;\n  animation: loader 1s infinite linear alternate;\n  animation-delay: 0.5s;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading .nfb-loader__dot::before, .video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading .nfb-loader__dot::after {\n  content: \"\";\n  display: inline-block;\n  position: absolute;\n  top: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading .nfb-loader__dot::before {\n  left: calc(-1 * var(--nfb-loader-gap));\n  width: var(--nfb-loader-size);\n  height: var(--nfb-loader-size);\n  border-radius: 50%;\n  background-color: #000;\n  color: #000;\n  animation: loader 1s infinite alternate;\n  animation-delay: 0s;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading .nfb-loader__dot::after {\n  left: var(--nfb-loader-gap);\n  width: var(--nfb-loader-size);\n  height: var(--nfb-loader-size);\n  border-radius: 50%;\n  background-color: #000;\n  color: #000;\n  animation: loader 1s infinite alternate;\n  animation-delay: 1s;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--xs {\n  --nfb-loader-size: 4px;\n  --nfb-loader-gap: 8px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--md {\n  --nfb-loader-size: 8px;\n  --nfb-loader-gap: 16px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--lg {\n  --nfb-loader-size: 10px;\n  --nfb-loader-gap: 24px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--dark {\n  --nfb-loader-color: #FFFFFF;\n  --nfb-loader-transition-color: rgb(255, 255, 255, 0.2);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue a.nfb-button, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content a.vjs-default-button {\n  text-decoration: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button {\n  --nfb-button-font-family: Elza Round, Georgia, serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;\n  --nfb-button-background-color: #D4D3D6;\n  --nfb-button-background-color--hover: transparent;\n  --nfb-button-background-color--focus: transparent;\n  --nfb-button-background-color--active: #05EE80;\n  --nfb-button-background-color--selected: transparent;\n  --nfb-button-border-color: #D4D3D6;\n  --nfb-button-border-color--hover: #1C7A3E;\n  --nfb-button-border-color--focus: var(--nfb-button-border-color--hover);\n  --nfb-button-border-color--active: var(--nfb-button-border-color--hover);\n  --nfb-button-border-color--selected: #000000;\n  --nfb-button-color: #000000;\n  --nfb-button-color--hover: var(--nfb-button-color);\n  --nfb-button-color--focus: var(--nfb-button-color);\n  --nfb-button-color--active: var(--nfb-button-color);\n  --nfb-button-color--selected: var(--nfb-button-color);\n  --nfb-button-primary-background-color: #05EE80;\n  --nfb-button-primary-background-color--hover: transparent;\n  --nfb-button-primary-background-color--focus: transparent;\n  --nfb-button-primary-background-color--active: #05EE80;\n  --nfb-button-primary-border-color: #05EE80;\n  --nfb-button-primary-border-color--hover: #1C7A3E;\n  --nfb-button-primary-border-color--focus: var(--nfb-button-primary-border-color--hover);\n  --nfb-button-primary-border-color--active: var(--nfb-button-primary-border-color--hover);\n  --nfb-button-primary-color: #000000;\n  --nfb-button-primary-color--hover: var(--nfb-button-primary-color);\n  --nfb-button-primary-color--focus: var(--nfb-button-primary-color);\n  --nfb-button-primary-color--active: var(--nfb-button-primary-color);\n  --nfb-button-danger-background-color: #E4352A;\n  --nfb-button-danger-background-color--hover: transparent;\n  --nfb-button-danger-background-color--focus: transparent;\n  --nfb-button-danger-background-color--active: #E4352A;\n  --nfb-button-danger-border-color: #E4352A;\n  --nfb-button-danger-border-color--hover: #B42B22;\n  --nfb-button-danger-border-color--focus: var(--nfb-button-danger-border-color--hover);\n  --nfb-button-danger-border-color--active: var(--nfb-button-danger-border-color--hover);\n  --nfb-button-danger-color: #000000;\n  --nfb-button-danger-color--hover: var(--nfb-button-danger-color);\n  --nfb-button-danger-color--focus: var(--nfb-button-danger-color);\n  --nfb-button-danger-color--active: var(--nfb-button-danger-color);\n  font-family: var(--nfb-button-font-family);\n  font-size: 1rem;\n  position: relative;\n  background-color: var(--nfb-button-background-color);\n  color: var(--nfb-button-color);\n  padding: calc(0.5rem - 2px) calc(1rem - 4px);\n  border-style: solid;\n  border-color: var(--nfb-button-border-color);\n  border-width: 2px;\n  border-radius: 4px;\n  text-align: center;\n  text-transform: uppercase;\n  white-space: nowrap;\n  transition: color 0.2s linear, background-color 0.2s linear, fill 0.2s linear, opacity 0.2s linear, border-color 0.2s linear;\n  cursor: pointer;\n  user-select: none;\n  display: inline-flex;\n  align-items: center;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button[aria-expanded=true], .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content [aria-expanded=true].vjs-default-button {\n  outline: none;\n  border-width: 4px;\n  border-color: var(--nfb-button-border-color--focus);\n  padding: calc(0.5rem - 4px) calc(1rem - 4px - 2px);\n  background-color: var(--nfb-button-background-color--focus);\n  color: var(--nfb-button-color--focus);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button:focus-visible .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:focus-visible .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button[aria-expanded=true] .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content [aria-expanded=true].vjs-default-button .nfb-button__text {\n  text-decoration: underline;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button:hover, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:hover {\n  border-color: var(--nfb-button-border-color--hover);\n  background-color: var(--nfb-button-background-color--hover);\n  color: var(--nfb-button-color--hover);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button:hover .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:hover .nfb-button__text {\n  text-decoration: underline;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-active, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-active.vjs-default-button, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button:active, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:active {\n  background-color: var(--nfb-button-background-color--active);\n  border-color: var(--nfb-button-border-color--active);\n  color: var(--nfb-button-color--active);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-active .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-active.vjs-default-button .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button:active .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:active .nfb-button__text {\n  text-decoration: underline;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-selected, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-selected.vjs-default-button {\n  border-width: 4px;\n  padding: calc(0.5rem - 4px) calc(1rem - 4px - 2px);\n  background-color: var(--nfb-button-background-color--selected);\n  border-color: var(--nfb-button-border-color--selected);\n  color: var(--nfb-button-color--selected);\n}\n\n@media screen and (max-width: 480px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .nfb-button, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button {\n    font-size: 1rem;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon {\n  gap: 0.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon nfb-loader {\n  margin-right: -0.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon .nfb-icon {\n  font-size: inherit;\n  text-decoration: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon nfb-icon::part(icon)::before, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon .nfb-icon::before {\n  display: inline-block;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon .nfb-button__icon {\n  display: flex;\n  margin-bottom: 2px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  font-size: 1.25rem;\n  text-decoration: none;\n  width: 2.5rem;\n  height: 2.5rem;\n  padding: 0;\n  border-radius: 999px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon .nfb-icon {\n  font-size: 1rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon .nfb-button__icon {\n  display: flex;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon .nfb-button__icon nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon .nfb-button__icon .nfb-icon {\n  font-size: 1rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon:hover, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-active, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon:active {\n  border-width: 2px;\n  border-style: solid;\n  text-decoration: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-active, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon:active {\n  border-width: 2px;\n  border-style: solid;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-sm-size {\n  width: 1.5rem;\n  height: 1.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-sm-size:focus-visible {\n  border-width: 3px;\n  padding: calc(0.5rem - 4px) calc(1rem - 4px - 3px);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-sm-size:focus-visible nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-sm-size:focus-visible .nfb-icon {\n  font-size: 1rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-lg-size {\n  width: 3.5rem;\n  height: 3.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-lg-size nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-lg-size .nfb-icon {\n  font-size: 2rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-xl-size {\n  width: 5rem;\n  height: 5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-xl-size nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-xl-size .nfb-icon {\n  font-size: 1rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--discreet {\n  background-color: rgba(0, 0, 0, 0);\n  border-color: rgba(0, 0, 0, 0);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--outline {\n  background-color: rgba(0, 0, 0, 0);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary {\n  font-weight: bold;\n  background-color: var(--nfb-button-primary-background-color);\n  border-color: var(--nfb-button-primary-border-color);\n  color: var(--nfb-button-primary-color);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary[aria-expanded=true] {\n  border-color: var(--nfb-button-primary-border-color--focus);\n  background-color: var(--nfb-button-primary-background-color--focus);\n  color: var(--nfb-button-primary-color--focus);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary:hover {\n  border-color: var(--nfb-button-primary-border-color--hover);\n  background-color: var(--nfb-button-primary-background-color--hover);\n  color: var(--nfb-button-primary-color--hover);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary._nfb-button--is-active, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary:active {\n  background-color: var(--nfb-button-primary-background-color--active);\n  border-color: var(--nfb-button-primary-border-color--active);\n  color: var(--nfb-button-primary-color--active);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger {\n  font-weight: bold;\n  background-color: var(--nfb-button-danger-background-color);\n  border-color: var(--nfb-button-danger-border-color);\n  color: var(--nfb-button-danger-color);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger[aria-expanded=true] {\n  border-color: var(--nfb-button-danger-border-color--focus);\n  background-color: var(--nfb-button-danger-background-color--focus);\n  color: var(--nfb-button-danger-color--focus);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger:hover {\n  border-color: var(--nfb-button-danger-border-color--hover);\n  background-color: var(--nfb-button-danger-background-color--hover);\n  color: var(--nfb-button-danger-color--hover);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger._nfb-button--is-active, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger:active {\n  background-color: var(--nfb-button-danger-background-color--active);\n  border-color: var(--nfb-button-danger-border-color--active);\n  color: var(--nfb-button-danger-color--active);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button.nfb-button--pill, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .nfb-button--pill.vjs-default-button {\n  border-radius: 20px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button.nfb-button--pill.nfb-button._nfb-button--is-sm-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .nfb-button--pill._nfb-button--is-sm-size.vjs-default-button {\n  border-radius: 15px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button.nfb-button--pill.nfb-button._nfb-button--is-lg-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .nfb-button--pill._nfb-button--is-lg-size.vjs-default-button {\n  border-radius: 30px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button.nfb-button--pill.nfb-button._nfb-button--is-xl-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .nfb-button--pill._nfb-button--is-xl-size.vjs-default-button {\n  border-radius: 40px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue ._nfb-button--is-dark, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button {\n  --nfb-button-background-color: #403E43;\n  --nfb-button-border-color: #403E43;\n  --nfb-button-border-color--hover: #05EE80;\n  --nfb-button-border-color--focus: var(--nfb-button-border-color--hover);\n  --nfb-button-border-color--active: var(--nfb-button-border-color--hover);\n  --nfb-button-border-color--selected: #FFFFFF;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: var(--nfb-button-color);\n  --nfb-button-color--focus: var(--nfb-button-color);\n  --nfb-button-color--active: #000000;\n  --nfb-button-primary-background-color--active: transparent;\n  --nfb-button-primary-border-color--hover: var(--nfb-button-primary-border-color);\n  --nfb-button-primary-border-color--focus: var(--nfb-button-primary-border-color);\n  --nfb-button-primary-border-color--active: var(--nfb-button-primary-border-color);\n  --nfb-button-primary-color--hover: #FFFFFF;\n  --nfb-button-primary-color--active: var(--nfb-button-primary-color--hover);\n  --nfb-button-primary-color--focus: var(--nfb-button-primary-color--hover);\n  --nfb-button-danger-background-color--active: transparent;\n  --nfb-button-danger-border-color--hover: var(--nfb-button-danger-border-color);\n  --nfb-button-danger-border-color--focus: var(--nfb-button-danger-border-color);\n  --nfb-button-danger-border-color--active: var(--nfb-button-danger-border-color);\n  --nfb-button-danger-color--hover: #FFFFFF;\n  --nfb-button-danger-color--active: var(--nfb-button-danger-color--hover);\n  --nfb-button-pill-background-color: #403E43;\n  --nfb-button-pill-border-color: #403E43;\n  --nfb-button-pill-border-color--hover: #05EE80;\n  --nfb-button-pill-border-color--active: #FFFFFF;\n  --nfb-button-pill-color: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-sm-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-sm-size.vjs-default-button {\n  font-size: 0.875rem;\n  line-height: 1rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-sm-size nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-sm-size.vjs-default-button nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-sm-size .nfb-icon, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-sm-size.vjs-default-button .nfb-icon {\n  font-size: 0.875rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-lg-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-lg-size.vjs-default-button {\n  font-size: 1rem;\n  line-height: 2rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-lg-size nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-lg-size.vjs-default-button nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-lg-size .nfb-icon, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-lg-size.vjs-default-button .nfb-icon {\n  font-size: 1.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size.vjs-default-button {\n  font-size: 1.5rem;\n  line-height: 1.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size.vjs-default-button:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size[aria-expanded=true], .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size[aria-expanded=true].vjs-default-button {\n  padding: calc(1.5rem - 4px) calc(2rem - 4px);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size:not(a), .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size.vjs-default-button:not(a) {\n  padding: calc(1.5rem - 2px) calc(2rem - 2px);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size.vjs-default-button nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size .nfb-icon, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size.vjs-default-button .nfb-icon {\n  font-size: 1.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-loading .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-loading.vjs-default-button .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-loading .nfb-button__icon, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-loading.vjs-default-button .nfb-button__icon {\n  visibility: hidden;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-disabled, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-disabled.vjs-default-button, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button:disabled, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:disabled {\n  opacity: 0.5;\n  cursor: not-allowed;\n  pointer-events: none;\n  box-shadow: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--filled {\n  font-weight: 600;\n}\n\n@media screen and (max-width: 480px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--filled {\n    font-size: 1rem;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--red--filled {\n  --nfb-button-background-color: #DB3934;\n  --nfb-button-background-color--active: #DB3934;\n  --nfb-button-border-color: #DB3934;\n  --nfb-button-border-color--hover: #DB3934;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue--filled {\n  --nfb-button-background-color: #263EA6;\n  --nfb-button-background-color--active: #263EA6;\n  --nfb-button-border-color: #263EA6;\n  --nfb-button-border-color--hover: #263EA6;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue-400--filled {\n  --nfb-button-background-color: #0085CA;\n  --nfb-button-background-color--active: #0085CA;\n  --nfb-button-border-color: #0085CA;\n  --nfb-button-border-color--hover: #0085CA;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue-700--filled {\n  --nfb-button-background-color: #003A58;\n  --nfb-button-background-color--active: #003A58;\n  --nfb-button-border-color: #003A58;\n  --nfb-button-border-color--hover: #003A58;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--orange--filled {\n  --nfb-button-background-color: #FF5C39;\n  --nfb-button-background-color--active: #FF5C39;\n  --nfb-button-border-color: #FF5C39;\n  --nfb-button-border-color--hover: #FF5C39;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n  --nfb-button-color: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--yellow--filled {\n  --nfb-button-background-color: #FBD31E;\n  --nfb-button-background-color--active: #FBD31E;\n  --nfb-button-border-color: #FBD31E;\n  --nfb-button-border-color--hover: #FBD31E;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n  --nfb-button-color: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--green--filled {\n  --nfb-button-background-color: #C3D91C;\n  --nfb-button-background-color--active: #C3D91C;\n  --nfb-button-border-color: #C3D91C;\n  --nfb-button-border-color--hover: #C3D91C;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n  --nfb-button-color: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--turquoise--filled {\n  --nfb-button-background-color: #2BC0B3;\n  --nfb-button-background-color--active: #2BC0B3;\n  --nfb-button-border-color: #2BC0B3;\n  --nfb-button-border-color--hover: #2BC0B3;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n  --nfb-button-color: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--violet--filled {\n  --nfb-button-background-color: #862899;\n  --nfb-button-background-color--active: #862899;\n  --nfb-button-border-color: #862899;\n  --nfb-button-border-color--hover: #862899;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--purple--filled {\n  --nfb-button-background-color: #862899;\n  --nfb-button-background-color--active: #862899;\n  --nfb-button-border-color: #862899;\n  --nfb-button-border-color--hover: #862899;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--pink--filled {\n  --nfb-button-background-color: #F13C6D;\n  --nfb-button-background-color--active: #F13C6D;\n  --nfb-button-border-color: #F13C6D;\n  --nfb-button-border-color--hover: #F13C6D;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--red--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #DB3934;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #DB3934;\n  --nfb-button-border-color--hover: #DB3934;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #263EA6;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #263EA6;\n  --nfb-button-border-color--hover: #263EA6;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue-400--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #0085CA;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #0085CA;\n  --nfb-button-border-color--hover: #0085CA;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue-700--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #003A58;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #003A58;\n  --nfb-button-border-color--hover: #003A58;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--orange--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #FF5C39;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #FF5C39;\n  --nfb-button-border-color--hover: #FF5C39;\n  --nfb-button-color--hover: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--yellow--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #FBD31E;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #FBD31E;\n  --nfb-button-border-color--hover: #FBD31E;\n  --nfb-button-color--hover: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--green--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #C3D91C;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #C3D91C;\n  --nfb-button-border-color--hover: #C3D91C;\n  --nfb-button-color--hover: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--turquoise--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #2BC0B3;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #2BC0B3;\n  --nfb-button-border-color--hover: #2BC0B3;\n  --nfb-button-color--hover: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--violet--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #862899;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #862899;\n  --nfb-button-border-color--hover: #862899;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--purple--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #862899;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #862899;\n  --nfb-button-border-color--hover: #862899;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--pink--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #F13C6D;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #F13C6D;\n  --nfb-button-border-color--hover: #F13C6D;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-skip-intro-container, .video-js.vjs-nfb-theme-balmoral-neue .vjs-next-episode-container {\n  position: absolute !important;\n  display: flex !important;\n  align-items: center;\n  justify-content: center;\n}\n\n@media screen and (max-width: 480px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-skip-intro-container, .video-js.vjs-nfb-theme-balmoral-neue .vjs-next-episode-container {\n    font-size: 0.875em;\n    line-height: 1em;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-skip-intro-container {\n  bottom: 150px;\n  left: 20px;\n}\n\n@media screen and (max-width: 480px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-skip-intro-container {\n    bottom: 134px;\n  }\n}\n@media screen and (min-width: 768px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-skip-intro-container {\n    bottom: 180px;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-next-episode-container {\n  z-index: 3;\n  bottom: 60px;\n  left: unset;\n  right: 20px;\n}\n\n@media screen and (max-width: 480px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-next-episode-container {\n    bottom: 65px;\n  }\n}\n@media screen and (min-width: 768px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-next-episode-container {\n    bottom: 95px;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control-container {\n  width: 100%;\n  position: relative;\n  margin-bottom: 16px;\n  margin-left: 0.25rem;\n  margin-right: 0.25rem;\n}\n\n@media screen and (min-width: 400px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control-container {\n    margin-bottom: 22px;\n  }\n}\n@media screen and (min-width: 480px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control-container {\n    margin-left: 0.25rem;\n    margin-right: 0.25rem;\n    font-size: 1.75em;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control {\n  width: 100%;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control .vjs-progress-holder {\n  outline: none;\n  margin: 0;\n  height: 0.25em;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control .vjs-time-tooltip {\n  font-size: 0.375em;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control:hover .vjs-progress-holder, .video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control:hover .vjs-chapter-separator, .video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control:hover .vjs-chapter-progress-overlay {\n  font-size: 1em;\n}\n\n@media (hover: hover) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control:hover .vjs-progress-holder, .video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control:hover .vjs-chapter-separator, .video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control:hover .vjs-chapter-progress-overlay {\n    font-size: 1.2em;\n    height: 0.4375em;\n  }\n}\n@media (hover: none) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control .vjs-slider:focus {\n    text-shadow: none;\n    box-shadow: none;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control .vjs-play-progress {\n  z-index: 1;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control .vjs-play-progress::before {\n  outline: none;\n  font-size: 1.125em;\n  top: 50%;\n  transform: translateY(-50%);\n  color: var(--accent-color);\n}\n\n@media screen and (min-width: 480px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-control .vjs-play-progress::before {\n    font-size: 1em;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-progress-holder .vjs-play-progress {\n  background: var(--accent-color);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-spacer {\n  display: block;\n}\n\n@media screen and (min-width: 480px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-spacer {\n    flex-grow: 1;\n  }\n}\n@keyframes loader {\n  0% {\n    background-color: var(--nfb-loader-color);\n  }\n  50%, 100% {\n    background-color: var(--nfb-loader-transition-color);\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader {\n  position: absolute;\n  top: 50%;\n  left: 50%;\n  transform: translate(-50%, -50%);\n  display: none;\n  --nfb-loader-size: 6px;\n  --nfb-loader-gap: 12px;\n  --nfb-loader-color: #000000;\n  --nfb-loader-transition-color: $nfb-loader-transition-color--light;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading {\n  display: block;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading .nfb-loader__dot {\n  position: relative;\n  width: var(--nfb-loader-size);\n  height: var(--nfb-loader-size);\n  border-radius: 50%;\n  background-color: #000;\n  color: #000;\n  animation: loader 1s infinite linear alternate;\n  animation-delay: 0.5s;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading .nfb-loader__dot::before, .video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading .nfb-loader__dot::after {\n  content: \"\";\n  display: inline-block;\n  position: absolute;\n  top: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading .nfb-loader__dot::before {\n  left: calc(-1 * var(--nfb-loader-gap));\n  width: var(--nfb-loader-size);\n  height: var(--nfb-loader-size);\n  border-radius: 50%;\n  background-color: #000;\n  color: #000;\n  animation: loader 1s infinite alternate;\n  animation-delay: 0s;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--loading .nfb-loader__dot::after {\n  left: var(--nfb-loader-gap);\n  width: var(--nfb-loader-size);\n  height: var(--nfb-loader-size);\n  border-radius: 50%;\n  background-color: #000;\n  color: #000;\n  animation: loader 1s infinite alternate;\n  animation-delay: 1s;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--xs {\n  --nfb-loader-size: 4px;\n  --nfb-loader-gap: 8px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--md {\n  --nfb-loader-size: 8px;\n  --nfb-loader-gap: 16px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--lg {\n  --nfb-loader-size: 10px;\n  --nfb-loader-gap: 24px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-loader--dark {\n  --nfb-loader-color: #FFFFFF;\n  --nfb-loader-transition-color: rgb(255, 255, 255, 0.2);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue a.nfb-button, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content a.vjs-default-button {\n  text-decoration: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button {\n  --nfb-button-font-family: Elza Round, Georgia, serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol;\n  --nfb-button-background-color: #D4D3D6;\n  --nfb-button-background-color--hover: transparent;\n  --nfb-button-background-color--focus: transparent;\n  --nfb-button-background-color--active: #05EE80;\n  --nfb-button-background-color--selected: transparent;\n  --nfb-button-border-color: #D4D3D6;\n  --nfb-button-border-color--hover: #1C7A3E;\n  --nfb-button-border-color--focus: var(--nfb-button-border-color--hover);\n  --nfb-button-border-color--active: var(--nfb-button-border-color--hover);\n  --nfb-button-border-color--selected: #000000;\n  --nfb-button-color: #000000;\n  --nfb-button-color--hover: var(--nfb-button-color);\n  --nfb-button-color--focus: var(--nfb-button-color);\n  --nfb-button-color--active: var(--nfb-button-color);\n  --nfb-button-color--selected: var(--nfb-button-color);\n  --nfb-button-primary-background-color: #05EE80;\n  --nfb-button-primary-background-color--hover: transparent;\n  --nfb-button-primary-background-color--focus: transparent;\n  --nfb-button-primary-background-color--active: #05EE80;\n  --nfb-button-primary-border-color: #05EE80;\n  --nfb-button-primary-border-color--hover: #1C7A3E;\n  --nfb-button-primary-border-color--focus: var(--nfb-button-primary-border-color--hover);\n  --nfb-button-primary-border-color--active: var(--nfb-button-primary-border-color--hover);\n  --nfb-button-primary-color: #000000;\n  --nfb-button-primary-color--hover: var(--nfb-button-primary-color);\n  --nfb-button-primary-color--focus: var(--nfb-button-primary-color);\n  --nfb-button-primary-color--active: var(--nfb-button-primary-color);\n  --nfb-button-danger-background-color: #E4352A;\n  --nfb-button-danger-background-color--hover: transparent;\n  --nfb-button-danger-background-color--focus: transparent;\n  --nfb-button-danger-background-color--active: #E4352A;\n  --nfb-button-danger-border-color: #E4352A;\n  --nfb-button-danger-border-color--hover: #B42B22;\n  --nfb-button-danger-border-color--focus: var(--nfb-button-danger-border-color--hover);\n  --nfb-button-danger-border-color--active: var(--nfb-button-danger-border-color--hover);\n  --nfb-button-danger-color: #000000;\n  --nfb-button-danger-color--hover: var(--nfb-button-danger-color);\n  --nfb-button-danger-color--focus: var(--nfb-button-danger-color);\n  --nfb-button-danger-color--active: var(--nfb-button-danger-color);\n  font-family: var(--nfb-button-font-family);\n  font-size: 1rem;\n  position: relative;\n  background-color: var(--nfb-button-background-color);\n  color: var(--nfb-button-color);\n  padding: calc(0.5rem - 2px) calc(1rem - 4px);\n  border-style: solid;\n  border-color: var(--nfb-button-border-color);\n  border-width: 2px;\n  border-radius: 4px;\n  text-align: center;\n  text-transform: uppercase;\n  white-space: nowrap;\n  transition: color 0.2s linear, background-color 0.2s linear, fill 0.2s linear, opacity 0.2s linear, border-color 0.2s linear;\n  cursor: pointer;\n  user-select: none;\n  display: inline-flex;\n  align-items: center;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button[aria-expanded=true], .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content [aria-expanded=true].vjs-default-button {\n  outline: none;\n  border-width: 4px;\n  border-color: var(--nfb-button-border-color--focus);\n  padding: calc(0.5rem - 4px) calc(1rem - 4px - 2px);\n  background-color: var(--nfb-button-background-color--focus);\n  color: var(--nfb-button-color--focus);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button:focus-visible .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:focus-visible .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button[aria-expanded=true] .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content [aria-expanded=true].vjs-default-button .nfb-button__text {\n  text-decoration: underline;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button:hover, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:hover {\n  border-color: var(--nfb-button-border-color--hover);\n  background-color: var(--nfb-button-background-color--hover);\n  color: var(--nfb-button-color--hover);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button:hover .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:hover .nfb-button__text {\n  text-decoration: underline;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-active, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-active.vjs-default-button, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button:active, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:active {\n  background-color: var(--nfb-button-background-color--active);\n  border-color: var(--nfb-button-border-color--active);\n  color: var(--nfb-button-color--active);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-active .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-active.vjs-default-button .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button:active .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:active .nfb-button__text {\n  text-decoration: underline;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-selected, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-selected.vjs-default-button {\n  border-width: 4px;\n  padding: calc(0.5rem - 4px) calc(1rem - 4px - 2px);\n  background-color: var(--nfb-button-background-color--selected);\n  border-color: var(--nfb-button-border-color--selected);\n  color: var(--nfb-button-color--selected);\n}\n\n@media screen and (max-width: 480px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .nfb-button, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button {\n    font-size: 1rem;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon {\n  gap: 0.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon nfb-loader {\n  margin-right: -0.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon .nfb-icon {\n  font-size: inherit;\n  text-decoration: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon nfb-icon::part(icon)::before, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon .nfb-icon::before {\n  display: inline-block;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--with-icon .nfb-button__icon {\n  display: flex;\n  margin-bottom: 2px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon {\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  font-size: 1.25rem;\n  text-decoration: none;\n  width: 2.5rem;\n  height: 2.5rem;\n  padding: 0;\n  border-radius: 999px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon .nfb-icon {\n  font-size: 1rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon .nfb-button__icon {\n  display: flex;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon .nfb-button__icon nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon .nfb-button__icon .nfb-icon {\n  font-size: 1rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon:hover, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-active, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon:active {\n  border-width: 2px;\n  border-style: solid;\n  text-decoration: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-active, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon:active {\n  border-width: 2px;\n  border-style: solid;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-sm-size {\n  width: 1.5rem;\n  height: 1.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-sm-size:focus-visible {\n  border-width: 3px;\n  padding: calc(0.5rem - 4px) calc(1rem - 4px - 3px);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-sm-size:focus-visible nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-sm-size:focus-visible .nfb-icon {\n  font-size: 1rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-lg-size {\n  width: 3.5rem;\n  height: 3.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-lg-size nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-lg-size .nfb-icon {\n  font-size: 2rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-xl-size {\n  width: 5rem;\n  height: 5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-xl-size nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon._nfb-button--is-xl-size .nfb-icon {\n  font-size: 1rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--discreet {\n  background-color: rgba(0, 0, 0, 0);\n  border-color: rgba(0, 0, 0, 0);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--outline {\n  background-color: rgba(0, 0, 0, 0);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary {\n  font-weight: bold;\n  background-color: var(--nfb-button-primary-background-color);\n  border-color: var(--nfb-button-primary-border-color);\n  color: var(--nfb-button-primary-color);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary[aria-expanded=true] {\n  border-color: var(--nfb-button-primary-border-color--focus);\n  background-color: var(--nfb-button-primary-background-color--focus);\n  color: var(--nfb-button-primary-color--focus);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary:hover {\n  border-color: var(--nfb-button-primary-border-color--hover);\n  background-color: var(--nfb-button-primary-background-color--hover);\n  color: var(--nfb-button-primary-color--hover);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary._nfb-button--is-active, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--primary:active {\n  background-color: var(--nfb-button-primary-background-color--active);\n  border-color: var(--nfb-button-primary-border-color--active);\n  color: var(--nfb-button-primary-color--active);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger {\n  font-weight: bold;\n  background-color: var(--nfb-button-danger-background-color);\n  border-color: var(--nfb-button-danger-border-color);\n  color: var(--nfb-button-danger-color);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger[aria-expanded=true] {\n  border-color: var(--nfb-button-danger-border-color--focus);\n  background-color: var(--nfb-button-danger-background-color--focus);\n  color: var(--nfb-button-danger-color--focus);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger:hover {\n  border-color: var(--nfb-button-danger-border-color--hover);\n  background-color: var(--nfb-button-danger-background-color--hover);\n  color: var(--nfb-button-danger-color--hover);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger._nfb-button--is-active, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--danger:active {\n  background-color: var(--nfb-button-danger-background-color--active);\n  border-color: var(--nfb-button-danger-border-color--active);\n  color: var(--nfb-button-danger-color--active);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button.nfb-button--pill, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .nfb-button--pill.vjs-default-button {\n  border-radius: 20px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button.nfb-button--pill.nfb-button._nfb-button--is-sm-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .nfb-button--pill._nfb-button--is-sm-size.vjs-default-button {\n  border-radius: 15px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button.nfb-button--pill.nfb-button._nfb-button--is-lg-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .nfb-button--pill._nfb-button--is-lg-size.vjs-default-button {\n  border-radius: 30px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button.nfb-button--pill.nfb-button._nfb-button--is-xl-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .nfb-button--pill._nfb-button--is-xl-size.vjs-default-button {\n  border-radius: 40px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue ._nfb-button--is-dark, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button {\n  --nfb-button-background-color: #403E43;\n  --nfb-button-border-color: #403E43;\n  --nfb-button-border-color--hover: #05EE80;\n  --nfb-button-border-color--focus: var(--nfb-button-border-color--hover);\n  --nfb-button-border-color--active: var(--nfb-button-border-color--hover);\n  --nfb-button-border-color--selected: #FFFFFF;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: var(--nfb-button-color);\n  --nfb-button-color--focus: var(--nfb-button-color);\n  --nfb-button-color--active: #000000;\n  --nfb-button-primary-background-color--active: transparent;\n  --nfb-button-primary-border-color--hover: var(--nfb-button-primary-border-color);\n  --nfb-button-primary-border-color--focus: var(--nfb-button-primary-border-color);\n  --nfb-button-primary-border-color--active: var(--nfb-button-primary-border-color);\n  --nfb-button-primary-color--hover: #FFFFFF;\n  --nfb-button-primary-color--active: var(--nfb-button-primary-color--hover);\n  --nfb-button-primary-color--focus: var(--nfb-button-primary-color--hover);\n  --nfb-button-danger-background-color--active: transparent;\n  --nfb-button-danger-border-color--hover: var(--nfb-button-danger-border-color);\n  --nfb-button-danger-border-color--focus: var(--nfb-button-danger-border-color);\n  --nfb-button-danger-border-color--active: var(--nfb-button-danger-border-color);\n  --nfb-button-danger-color--hover: #FFFFFF;\n  --nfb-button-danger-color--active: var(--nfb-button-danger-color--hover);\n  --nfb-button-pill-background-color: #403E43;\n  --nfb-button-pill-border-color: #403E43;\n  --nfb-button-pill-border-color--hover: #05EE80;\n  --nfb-button-pill-border-color--active: #FFFFFF;\n  --nfb-button-pill-color: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-sm-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-sm-size.vjs-default-button {\n  font-size: 0.875rem;\n  line-height: 1rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-sm-size nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-sm-size.vjs-default-button nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-sm-size .nfb-icon, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-sm-size.vjs-default-button .nfb-icon {\n  font-size: 0.875rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-lg-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-lg-size.vjs-default-button {\n  font-size: 1rem;\n  line-height: 2rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-lg-size nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-lg-size.vjs-default-button nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-lg-size .nfb-icon, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-lg-size.vjs-default-button .nfb-icon {\n  font-size: 1.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size.vjs-default-button {\n  font-size: 1.5rem;\n  line-height: 1.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size.vjs-default-button:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size[aria-expanded=true], .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size[aria-expanded=true].vjs-default-button {\n  padding: calc(1.5rem - 4px) calc(2rem - 4px);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size:not(a), .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size.vjs-default-button:not(a) {\n  padding: calc(1.5rem - 2px) calc(2rem - 2px);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size.vjs-default-button nfb-icon::part(icon), .video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-xl-size .nfb-icon, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-xl-size.vjs-default-button .nfb-icon {\n  font-size: 1.5rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-loading .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-loading.vjs-default-button .nfb-button__text, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-loading .nfb-button__icon, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-loading.vjs-default-button .nfb-button__icon {\n  visibility: hidden;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button._nfb-button--is-disabled, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content ._nfb-button--is-disabled.vjs-default-button, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button:disabled, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button:disabled {\n  opacity: 0.5;\n  cursor: not-allowed;\n  pointer-events: none;\n  box-shadow: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--filled {\n  font-weight: 600;\n}\n\n@media screen and (max-width: 480px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--filled {\n    font-size: 1rem;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--red--filled {\n  --nfb-button-background-color: #DB3934;\n  --nfb-button-background-color--active: #DB3934;\n  --nfb-button-border-color: #DB3934;\n  --nfb-button-border-color--hover: #DB3934;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue--filled {\n  --nfb-button-background-color: #263EA6;\n  --nfb-button-background-color--active: #263EA6;\n  --nfb-button-border-color: #263EA6;\n  --nfb-button-border-color--hover: #263EA6;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue-400--filled {\n  --nfb-button-background-color: #0085CA;\n  --nfb-button-background-color--active: #0085CA;\n  --nfb-button-border-color: #0085CA;\n  --nfb-button-border-color--hover: #0085CA;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue-700--filled {\n  --nfb-button-background-color: #003A58;\n  --nfb-button-background-color--active: #003A58;\n  --nfb-button-border-color: #003A58;\n  --nfb-button-border-color--hover: #003A58;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--orange--filled {\n  --nfb-button-background-color: #FF5C39;\n  --nfb-button-background-color--active: #FF5C39;\n  --nfb-button-border-color: #FF5C39;\n  --nfb-button-border-color--hover: #FF5C39;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n  --nfb-button-color: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--yellow--filled {\n  --nfb-button-background-color: #FBD31E;\n  --nfb-button-background-color--active: #FBD31E;\n  --nfb-button-border-color: #FBD31E;\n  --nfb-button-border-color--hover: #FBD31E;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n  --nfb-button-color: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--green--filled {\n  --nfb-button-background-color: #C3D91C;\n  --nfb-button-background-color--active: #C3D91C;\n  --nfb-button-border-color: #C3D91C;\n  --nfb-button-border-color--hover: #C3D91C;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n  --nfb-button-color: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--turquoise--filled {\n  --nfb-button-background-color: #2BC0B3;\n  --nfb-button-background-color--active: #2BC0B3;\n  --nfb-button-border-color: #2BC0B3;\n  --nfb-button-border-color--hover: #2BC0B3;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n  --nfb-button-color: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--violet--filled {\n  --nfb-button-background-color: #862899;\n  --nfb-button-background-color--active: #862899;\n  --nfb-button-border-color: #862899;\n  --nfb-button-border-color--hover: #862899;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--purple--filled {\n  --nfb-button-background-color: #862899;\n  --nfb-button-background-color--active: #862899;\n  --nfb-button-border-color: #862899;\n  --nfb-button-border-color--hover: #862899;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--pink--filled {\n  --nfb-button-background-color: #F13C6D;\n  --nfb-button-background-color--active: #F13C6D;\n  --nfb-button-border-color: #F13C6D;\n  --nfb-button-border-color--hover: #F13C6D;\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n  --nfb-button-color--focus: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--red--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #DB3934;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #DB3934;\n  --nfb-button-border-color--hover: #DB3934;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #263EA6;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #263EA6;\n  --nfb-button-border-color--hover: #263EA6;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue-400--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #0085CA;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #0085CA;\n  --nfb-button-border-color--hover: #0085CA;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--blue-700--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #003A58;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #003A58;\n  --nfb-button-border-color--hover: #003A58;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--orange--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #FF5C39;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #FF5C39;\n  --nfb-button-border-color--hover: #FF5C39;\n  --nfb-button-color--hover: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--yellow--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #FBD31E;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #FBD31E;\n  --nfb-button-border-color--hover: #FBD31E;\n  --nfb-button-color--hover: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--green--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #C3D91C;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #C3D91C;\n  --nfb-button-border-color--hover: #C3D91C;\n  --nfb-button-color--hover: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--turquoise--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #2BC0B3;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #2BC0B3;\n  --nfb-button-border-color--hover: #2BC0B3;\n  --nfb-button-color--hover: #FFFFFF;\n  --nfb-button-color--hover: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--violet--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #862899;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #862899;\n  --nfb-button-border-color--hover: #862899;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--purple--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #862899;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #862899;\n  --nfb-button-border-color--hover: #862899;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button--pink--outlined {\n  --nfb-button-background-color: transparent;\n  --nfb-button-background-color--hover: #F13C6D;\n  --nfb-button-background-color--active: transparent;\n  --nfb-button-border-color: #F13C6D;\n  --nfb-button-border-color--hover: #F13C6D;\n  --nfb-button-color--hover: #FFFFFF;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings {\n  z-index: 2;\n  background: #0a0a0a !important;\n  background: linear-gradient(to bottom, rgba(0, 0, 0, 0.8) 0%, rgba(62, 62, 62, 0.8) 100%) !important;\n  backdrop-filter: blur(8px);\n  height: 100%;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content {\n  font-size: 0.8333em;\n  padding: 16px;\n  display: flex;\n  flex-direction: column;\n  justify-content: center;\n  align-items: center;\n  gap: 24px;\n  min-height: fit-content;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-settings-controls {\n  width: 33.3333333333%;\n  display: flex;\n  justify-content: left;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-settings-controls button {\n  background-image: none;\n}\n\n@media screen and (max-width: 480px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-settings-controls {\n    width: 50%;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-setting legend {\n  margin-bottom: 8px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-setting select {\n  width: 100%;\n  background-color: #000;\n  color: #fff;\n  border: 0;\n  border-radius: 4px;\n  padding: 8px 16px;\n  outline: 1px solid #8b898e;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-setting select:focus-visible {\n  outline: 2px solid var(--accent-color);\n}\n\n@media screen and (max-width: 480px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-setting {\n    width: 50%;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-bg, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-fg, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-font-percent, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-text-color, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-bg-color {\n  min-width: 100%;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-bg select, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-fg select, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-font-percent select, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-text-color select, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-bg-color select {\n  min-width: 100%;\n  border-right: 16px solid rgba(0, 0, 0, 0);\n  margin: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-settings-colors {\n  display: flex;\n  flex-direction: column;\n  gap: 24px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-settings-colors, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-settings-font {\n  width: 33.3333333333%;\n}\n\n@media screen and (max-width: 480px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-settings-colors, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-track-settings-font {\n    width: 50%;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button {\n  margin: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-done-button, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-label, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-window, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-text-opacity, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-bg-opacity, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-edge-style, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-font-family, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-window-color {\n  display: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-close-button {\n  width: auto;\n  align-items: flex-start;\n  top: 16px;\n  right: 16px;\n  opacity: 1;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-close-button .vjs-icon-placeholder::before {\n  content: \"\\\\e950\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings fieldset {\n  margin: 0;\n  padding: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings fieldset span {\n  padding: 0;\n}\n\n@media screen and (min-width: 769px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content {\n    font-size: 1em;\n    padding: 22px;\n  }\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-close-button {\n    top: 22px;\n    right: 22px;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-track-setting select, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings select {\n  color: #0a0a0a;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__button .vjs-icon-placeholder::before {\n  content: \"\\\\e933\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__container {\n  display: flex;\n  flex-direction: column;\n  padding: 24px;\n  gap: 64px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__modal {\n  padding: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__modal[open] {\n  color: #fff;\n  position: absolute;\n  right: 0;\n  bottom: 0;\n  margin-bottom: calc(2.5em + 16px);\n  margin-right: 16px;\n  max-width: 70%;\n  overflow-y: auto;\n  background-color: #27262a;\n  z-index: 4;\n  border: none;\n  outline: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.875rem;\n  line-height: 1.25rem;\n  color: #000;\n  box-sizing: border-box;\n  display: inline-flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 0;\n  cursor: pointer;\n  min-width: fit-content;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item span {\n  border-bottom: 4px solid rgba(0, 0, 0, 0);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item:focus-visible {\n  outline: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item:focus-visible span {\n  font-weight: 600;\n  color: var(--accent-color);\n  border-bottom: 4px solid var(--accent-color);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item:hover .vjs-menu-item-text {\n  color: var(--accent-color);\n  border-bottom: 2px solid var(--accent-color);\n  margin-bottom: 2px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item.vjs-selected .vjs-menu-item-text {\n  border-bottom: 4px solid #fff;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item.vjs-selected::after {\n  color: #fff;\n  font-family: \"balmoral-icons\";\n  content: \"\\\\e919\";\n  margin-left: 5px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item.vjs-selected:hover .vjs-menu-item-text, .video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item.vjs-selected:focus-visible .vjs-menu-item-text {\n  border-color: var(--accent-color);\n  margin-bottom: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item.vjs-selected:hover::after, .video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item.vjs-selected:focus-visible::after {\n  color: var(--accent-color);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item-title {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__items-container {\n  flex-basis: 0;\n  flex-grow: 1;\n  display: inline-flex;\n  flex-direction: column;\n  gap: 16px;\n  width: 192px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__items-container span {\n  color: #fff;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__items-container .nfb-caption__settings-panel-button {\n  justify-content: flex-start;\n  align-items: center;\n  margin-top: 48px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__items-container .nfb-caption__settings-panel-button span {\n  white-space: nowrap;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__items-container.hidden {\n  display: none;\n}\n\n@media screen and (min-width: 768px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__container {\n    flex-direction: row;\n    padding: 48px;\n  }\n  .video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__modal[open] {\n    margin-bottom: calc(4.75em + 16px);\n  }\n}\n@media screen and (min-width: 990px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item {\n    font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n    font-style: normal;\n    font-weight: normal;\n    font-size: 1rem;\n    line-height: 1.5rem;\n    color: #000;\n  }\n  .video-js.vjs-nfb-theme-balmoral-neue .nfb-settings-panel__item-title {\n    font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n    font-style: normal;\n    font-weight: 500;\n    font-size: 1.125rem;\n    line-height: 1.5rem;\n    color: #1c1b1b;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-error-display.vjs-modal-dialog .vjs-modal-dialog-content {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: normal;\n  font-size: 0.75rem;\n  line-height: 1rem;\n  color: #000;\n  color: #fff !important;\n  width: 50%;\n  padding: 8px;\n  height: fit-content;\n  text-align: left;\n  transform: translate(-50%, -50%);\n  top: 50%;\n  left: 50%;\n  position: relative;\n  border: 4px solid #ffd100;\n}\n\n@media screen and (min-width: 768px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-error-display.vjs-modal-dialog .vjs-modal-dialog-content {\n    font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n    font-style: normal;\n    font-weight: normal;\n    font-size: 1rem;\n    line-height: 1.5rem;\n    color: #000;\n    padding: 16px;\n  }\n}\n@media screen and (min-width: 990px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-error-display.vjs-modal-dialog .vjs-modal-dialog-content {\n    font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n    font-style: normal;\n    font-weight: normal;\n    font-size: 1.5rem;\n    line-height: 2.125rem;\n    color: #000;\n    padding: 24px;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-airplay-button .vjs-icon-placeholder::before {\n  content: \"\\\\e97a\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-airplay-button .vjs-icon-placeholder {\n  background: none;\n  display: block;\n  width: auto;\n  height: auto;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-button:not(.vjs-play-control) {\n  min-height: 2.5em;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  opacity: 1;\n  transition: none;\n  cursor: pointer;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-button:not(.vjs-play-control) > .vjs-icon-placeholder::before {\n  line-height: 1;\n  font-family: \"balmoral-icons\";\n  position: relative;\n  font-size: 1.3125rem;\n  display: block;\n}\n\n@media screen and (min-width: 769px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-button:not(.vjs-play-control) > .vjs-icon-placeholder::before {\n    font-size: 1.3125rem;\n  }\n}\n@media (hover: hover) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-button:not(.vjs-play-control) > .vjs-icon-placeholder {\n    opacity: 0.6;\n    transition: all 0.2s linear;\n  }\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-button:not(.vjs-play-control):hover > .vjs-icon-placeholder {\n    opacity: 1;\n    transition: all 0.2s linear;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-menu-button::before {\n  content: \"\";\n  position: absolute;\n  width: 100%;\n  height: 150%;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-control:not(.vjs-play-control):not(.vjs-progress-control):not(.vjs-time-control):not(.vjs-close-button):not(.vjs-volume-panel):not(.vjs-volume-control):not(.vjs-playback-rate):not(.vjs-chapter-marker) {\n  width: 2em;\n  height: 2em;\n  text-decoration: none !important;\n}\n\n@media screen and (min-width: 400px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-control:not(.vjs-play-control):not(.vjs-progress-control):not(.vjs-time-control):not(.vjs-close-button):not(.vjs-volume-panel):not(.vjs-volume-control):not(.vjs-playback-rate):not(.vjs-chapter-marker) {\n    margin: 0 0.625em;\n  }\n}\n@media screen and (min-width: 769px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-control:not(.vjs-play-control):not(.vjs-progress-control):not(.vjs-time-control):not(.vjs-close-button):not(.vjs-volume-panel):not(.vjs-volume-control):not(.vjs-playback-rate):not(.vjs-chapter-marker) {\n    width: 3em;\n    height: 3em;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-control:not(.vjs-play-control):not(.vjs-progress-control):not(.vjs-time-control):not(.vjs-close-button):not(.vjs-volume-panel):not(.vjs-volume-control):not(.vjs-playback-rate):not(.vjs-chapter-marker):focus {\n  text-shadow: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-chromecast-button .vjs-icon-placeholder::before {\n  content: \"\\\\e97b\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-chromecast-button .vjs-icon-placeholder {\n  background: none;\n  display: block;\n  width: auto;\n  height: auto;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-chromecast-button.vjs-chromecast-casting-state {\n  color: #0085ca;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-chromecast-button.vjs-chromecast-casting-state .vjs-icon-placeholder::before {\n  content: \"\\\\e981\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-audio-description-button .vjs-icon-placeholder::before {\n  content: \"\\\\e903\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-audio-description-button.dv-playing {\n  color: var(--accent-color);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-fullscreen-control .vjs-icon-placeholder::before {\n  content: \"\\\\e92c\";\n}\n\n.vjs-fullscreen .vjs-fullscreen-control .vjs-icon-placeholder::before {\n  content: \"\\\\e92d\" !important;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button {\n  opacity: 1;\n  font-size: 1.25em;\n  width: 2em;\n  height: 2em;\n  min-height: 0;\n  background: #626065;\n  border: 2px solid #626065;\n  border-radius: 50%;\n  transition: all 0.2s linear;\n}\n\n@media screen and (min-width: 769px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button {\n    font-size: 2.375em;\n    border-width: 4px;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control .vjs-icon-placeholder::before, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button .vjs-icon-placeholder::before {\n  content: \"\\\\e90c\";\n  font-family: \"balmoral-icons\";\n  font-size: 1em;\n  padding-left: 0.1052631579em;\n  color: #fff;\n  position: relative;\n  display: inline-block;\n  transition: all 0.2s linear;\n  line-height: 1;\n  align-items: center;\n  justify-content: center;\n  text-shadow: none;\n}\n\n.vjs-ended .video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control .vjs-icon-placeholder::before, .vjs-ended .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button .vjs-icon-placeholder::before {\n  content: \"\\\\e904\";\n  padding-left: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control:hover, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button:hover {\n  background: #000;\n  border-color: var(--accent-color);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control:hover .vjs-icon-placeholder::before, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button:hover .vjs-icon-placeholder::before {\n  color: #fff;\n  transition: all 0.2s linear;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control:focus:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button:focus:focus-visible {\n  outline: none;\n  box-shadow: 0 0 0 3px #0a0a0a, 0 0 0 6px #c0bfbe;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control.vjs-playing .vjs-icon-placeholder::before, .video-js.vjs-nfb-theme-balmoral-neue .vjs-playing.vjs-big-play-button .vjs-icon-placeholder::before {\n  content: \"\\\\e959\";\n  padding-left: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control.nfb-button--round-with-icon, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon.vjs-big-play-button {\n  outline: rgba(0, 0, 0, 0);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control.nfb-button--round-with-icon:focus:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon.vjs-big-play-button:focus:focus-visible {\n  outline: none;\n  box-shadow: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control.nfb-button--round-with-icon:active, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon.vjs-big-play-button:active {\n  background-color: var(--accent-color) !important;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control.nfb-button--round-with-icon:active .vjs-icon-placeholder::before, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon.vjs-big-play-button:active .vjs-icon-placeholder::before {\n  color: #000 !important;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button {\n  opacity: 1;\n  font-size: 1.25em;\n  width: 2em;\n  height: 2em;\n  min-height: 0;\n  background: #626065;\n  border: 2px solid #626065;\n  border-radius: 50%;\n  transition: all 0.2s linear;\n}\n\n@media screen and (min-width: 769px), print {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button {\n    font-size: 2.375em;\n    border-width: 4px;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control .vjs-icon-placeholder::before, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button .vjs-icon-placeholder::before {\n  content: \"\\\\e90c\";\n  font-family: \"balmoral-icons\";\n  font-size: 1em;\n  padding-left: 0.1052631579em;\n  color: #fff;\n  position: relative;\n  display: inline-block;\n  transition: all 0.2s linear;\n  line-height: 1;\n  align-items: center;\n  justify-content: center;\n  text-shadow: none;\n}\n\n.vjs-ended .video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control .vjs-icon-placeholder::before, .vjs-ended .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button .vjs-icon-placeholder::before {\n  content: \"\\\\e904\";\n  padding-left: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control:hover, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button:hover {\n  background: #000;\n  border-color: var(--accent-color);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control:hover .vjs-icon-placeholder::before, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button:hover .vjs-icon-placeholder::before {\n  color: #fff;\n  transition: all 0.2s linear;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control:focus:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button:focus:focus-visible {\n  outline: none;\n  box-shadow: 0 0 0 3px #0a0a0a, 0 0 0 6px #c0bfbe;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control.vjs-playing .vjs-icon-placeholder::before, .video-js.vjs-nfb-theme-balmoral-neue .vjs-playing.vjs-big-play-button .vjs-icon-placeholder::before {\n  content: \"\\\\e959\";\n  padding-left: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control.nfb-button--round-with-icon, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon.vjs-big-play-button {\n  outline: rgba(0, 0, 0, 0);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control.nfb-button--round-with-icon:focus:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon.vjs-big-play-button:focus:focus-visible {\n  outline: none;\n  box-shadow: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control.nfb-button--round-with-icon:active, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon.vjs-big-play-button:active {\n  background-color: var(--accent-color) !important;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-play-control.nfb-button--round-with-icon:active .vjs-icon-placeholder::before, .video-js.vjs-nfb-theme-balmoral-neue .nfb-button--round-with-icon.vjs-big-play-button:active .vjs-icon-placeholder::before {\n  color: #000 !important;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button {\n  background: #000;\n  border-color: #000 !important;\n  position: absolute;\n  top: auto;\n  right: auto;\n  bottom: 16px;\n  left: 16px;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  margin: 0;\n}\n\n@media screen and (min-width: 400px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button {\n    top: auto;\n    right: auto;\n    bottom: 16px;\n    left: 16px;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button .vjs-icon-placeholder::before {\n  text-shadow: none;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n:hover .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button {\n  background: var(--accent-color);\n}\n\n:hover .video-js.vjs-nfb-theme-balmoral-neue .vjs-big-play-button .vjs-icon-placeholder::before {\n  color: #000;\n  transition: color 0.2s linear;\n}\n\n.vjs-has-started .vjs-big-play-button {\n  display: none !important;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-playback-rate.vjs-control {\n  display: flex;\n  flex-direction: row-reverse;\n  align-items: center;\n  height: auto;\n  position: relative;\n  width: auto;\n}\n\n@media screen and (min-width: 480px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-playback-rate.vjs-control {\n    margin: 0 0.625em;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-playback-rate.vjs-control .vjs-playback-rate-value {\n  font-size: 1em;\n  line-height: 1;\n  height: auto;\n  width: auto;\n  left: unset;\n  right: 0;\n  top: 50%;\n  transform: translateY(-50%);\n  margin-top: 1px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-playback-rate.vjs-control .vjs-playback-rate.vjs-button {\n  position: relative;\n  padding: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-playback-rate.vjs-control .vjs-icon-placeholder::before {\n  content: \"\\\\e99a\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-playback-rate.vjs-control .vjs-icon-placeholder {\n  background: none;\n  display: block;\n  width: auto;\n  height: auto;\n  padding-right: 1.5em;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-playback-rate.vjs-control .vjs-icon-placeholder::before {\n  margin-bottom: 0.3125em;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-quality-selector, .video-js.vjs-nfb-theme-balmoral-neue .video-playback-rate {\n  display: none;\n}\n\n@media screen and (min-width: 480px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-quality-selector, .video-js.vjs-nfb-theme-balmoral-neue .video-playback-rate {\n    display: inherit;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-quality-selector .vjs-menu-button, .video-js.vjs-nfb-theme-balmoral-neue .video-playback-rate .vjs-menu-button {\n  font-size: 0.75rem;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-mp4-source .vjs-quality-selector .vjs-icon-placeholder::before, .video-js.vjs-nfb-theme-balmoral-neue .vjs-mp4-source .video-playback-rate .vjs-icon-placeholder::before {\n  content: \"\\\\e943\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-mp4-source .vjs-quality-selector .vjs-icon-placeholder::before, .video-js.vjs-nfb-theme-balmoral-neue .vjs-mp4-source .video-playback-rate .vjs-icon-placeholder::before {\n  font-size: 1em;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-quality-selector button:focus-visible {\n  outline: 2px solid #fff;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-restart-from-beginning-button .vjs-icon-placeholder::before {\n  content: \"\\\\e944\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-seek-button .vjs-icon-placeholder::before {\n  content: \"\\\\e987\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-seek-button.vjs-forward .vjs-icon-placeholder::before {\n  transform: scaleX(-1);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel {\n  display: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel:focus-visible {\n  border: 2px solid #fff;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel.vjs-volume-panel-vertical {\n  width: auto;\n}\n\n@media screen and (min-width: 480px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel {\n    display: flex;\n    align-items: center;\n    transition: all 0.1s ease;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel .vjs-button {\n  opacity: 1;\n  transition: none;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel .vjs-volume-control {\n  min-height: 2.5em;\n  transition: none !important;\n  align-items: center;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel .vjs-volume-control.vjs-volume-horizontal {\n  height: 2.5em !important;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel .vjs-volume-control.vjs-volume-vertical {\n  background: #fff;\n  position: absolute;\n  top: 0 !important;\n  left: 50% !important;\n  transform: translate(-50%, -100%) !important;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel.vjs-hover.vjs-panel-horizontal {\n  width: 8.5em;\n  opacity: 1;\n  transition: all 0.1s ease;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel .vjs-volume-bar .vjs-slider-horizontal {\n  margin: 0;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel .vjs-volume-level {\n  background: #fff;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel .vjs-volume-tooltip {\n  font-family: \"Ciutadella\", -apple-system, \"Segoe UI\", \"Roboto\", \"Oxygen\", \"Ubuntu\", \"Cantarell\", \"Fira Sans\", \"Droid Sans\", \"Helvetica Neue\", \"Helvetica\", \"Arial\", sans-serif;\n  border-radius: 0;\n  background: #0a0a0a;\n  padding: 8px;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel .vjs-mute-control .vjs-icon-placeholder::before {\n  content: \"\\\\e92b\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-volume-panel .vjs-mute-control.vjs-vol-0 .vjs-icon-placeholder::before {\n  content: \"\\\\e92a\";\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-chapter-marker {\n  cursor: pointer;\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  position: absolute;\n  background: #626065;\n  width: 40px;\n  height: 40px;\n  border-radius: 999px;\n  top: -60px;\n  transition: all 0.2s;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-chapter-marker i {\n  font-size: 1.25rem;\n}\n\n@media (hover: hover) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-chapter-marker:hover {\n    background-color: #000;\n    border: 2px solid #05ee80;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-chapter-separator, .video-js.vjs-nfb-theme-balmoral-neue .vjs-chapter-progress-overlay {\n  position: absolute;\n  top: 0;\n  height: 0.25em;\n  transition: all 0.2s;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-chapter-separator {\n  width: 7px;\n  background: #102d18;\n  z-index: 2;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-chapter-progress-overlay {\n  background: #fff;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-chapter-name {\n  font-size: 0.65rem;\n  white-space: nowrap;\n  overflow: hidden;\n  text-overflow: ellipsis;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-chapter-name::before {\n  content: \"•\";\n  padding-right: 0.25rem;\n}\n\n@media screen and (min-width: 480px) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-chapter-name {\n    font-size: 0.75rem;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-control-bar button.vjs-control:focus-visible, .video-js.vjs-nfb-theme-balmoral-neue .vjs-control-bar button.vjs-button:focus-visible {\n  outline: rgba(0, 0, 0, 0);\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .nfb-button, .video-js.vjs-nfb-theme-balmoral-neue .vjs-text-track-settings .vjs-modal-dialog-content .vjs-default-button {\n  --nfb-button-background-color: #403E43;\n  --nfb-button-background-color--hover: #000000;\n  --nfb-button-background-color--focus: var(--nfb-button-background-color--hover);\n  --nfb-button-background-color--active: var(--accent-color);\n  --nfb-button-background-color--selected: var(--nfb-button-background-color--active);\n  --nfb-button-primary-background-color--active: var(--accent-color);\n  --nfb-button-primary-border-color: var(--accent-color);\n  --nfb-button-primary-background-color: var(--accent-color);\n  --nfb-button-primary-color--hover: #FFFFFF;\n  --nfb-button-primary-border-color--hover: var(--accent-color);\n  --nfb-button-border-color: var(--nfb-button-background-color);\n  --nfb-button-border-color--hover: var(--accent-color);\n  --nfb-button-border-color--selected: var(--nfb-button-background-color--selected);\n  --nfb-button-color: #FFFFFF;\n  --nfb-button-color--active: #000000;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue button.vjs-subs-caps-button:focus-visible {\n  outline: 2px solid var(--accent-color) !important;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-quality-selector button:focus-visible {\n  outline: 2px solid var(--accent-color) !important;\n}\n\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-button:not(.vjs-play-control) {\n  min-height: unset;\n}\n\n@media (hover: hover) {\n  .video-js.vjs-nfb-theme-balmoral-neue .vjs-button:not(.vjs-play-control) > .vjs-icon-placeholder {\n    opacity: 1;\n  }\n}\n.video-js.vjs-nfb-theme-balmoral-neue .vjs-control {\n  margin: 0 0.25em !important;\n}\n\n.vjs-nfb-theme-balmoral-neue.vjs-nfb-overlay .left-controls-row button:focus-visible {\n  outline: 2px solid var(--accent-color);\n}\n\n.vjs-nfb-theme-balmoral-neue.vjs-nfb-overlay .nfb-player-right-controls-container button {\n  margin-top: -0.625rem;\n}`;\nexport default styles;\n","import { LitElement, PropertyValues, html } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport throttle from 'lodash.throttle'\n\nimport NFBWebPlayer from '@web-nfb/player'\nimport NFBExpose from '@web-nfb/player/src/NFBExpose'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport { waitForMetadata } from '@src/js/helpers/player'\nimport { getSafariVersion } from '@src/js/helpers/browser'\nimport { RootState, store } from '@src/js/redux/store'\nimport {\n  selectPlayerOptionsByRegistryId,\n  PlayerUniqId,\n  fetchStream,\n  StreamFetchResponse,\n  PlayerError,\n  setCurrentError,\n  setCurrentPlaying,\n  setIsLoading,\n  StreamTypes\n} from '@src/js/redux/playersReducer'\nimport { selectWorkById } from '@src/js/redux/worksReducer'\nimport { postHistory, WorkHistory } from '@src/js/redux/workHistoryReducer'\nimport { selectFilmHistoryById } from '@src/js/redux/filmHistoryReducer'\nimport PlayerStats, { StatsOptions } from '@src/js/PlayerStats'\nimport { PlayerOptions } from '@src/js/types/Player'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBVideo.sass?lit'\n\nexport enum NFB_PLAYER_EVENTS {\n  BACK_BUTTON_CLICKED = 'nfbplayer:backbuttonclicked',\n  NEXT_BUTTON_CLICKED = 'nfbplayer:nextepisodeclicked',\n  SOURCE_HAS_EXPIRED_WARNING = 'nfbplayer:sourcehasexpired'\n}\n\nexport enum NFB_VIDEO_EVENTS {\n  PLAYER_ENDED = 'nfbvideo:playerended',\n}\n\n// Keep videojs instance in memory\n// We can't keep them into redux\nexport type CreatedVideoElement = {\n  playerId: PlayerUniqId\n  nfbWebPlayer: NFBWebPlayer\n  videoJsEl: Node,\n  playerStats: PlayerStats\n}\n\nconst storeCreatedElements: CreatedVideoElement[] = []\n\n@customElement('nfb-video')\nexport class NFBVideo extends LitElement {\n  @property({ type: Number, attribute: 'registry-id' })\n  registryId: number\n\n  @property({ type: String })\n  slug: string\n\n  @property({ type: String, attribute: 'stream-type' })\n  streamType: StreamTypes = 'films'\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-chapter' })\n  isChapter = false\n\n  @state()\n  shouldSaveProgress: boolean = true\n\n  @state()\n  isLoading: boolean = true\n\n  @state()\n  isReady: boolean = false\n\n  playerStats: PlayerStats\n  playerExposed: NFBExpose | null\n\n  _playPromiseResolve: ((value: unknown) => void) | null\n  _videoJsEl: Node | null\n\n  static styles = [styles]\n\n  constructor () {\n    super()\n    this.playerHasEnded = this.playerHasEnded.bind(this)\n    this.playerHasVideoJsError = this.playerHasVideoJsError.bind(this)\n    this.onProgress = throttle(this.onProgress.bind(this), 15 * 1000)\n    this.willQuitPage = this.willQuitPage.bind(this)\n    this.sourceHasExpired = this.sourceHasExpired.bind(this)\n\n    document.addEventListener(NFB_PLAYER_EVENTS.SOURCE_HAS_EXPIRED_WARNING, this.sourceHasExpired)\n    document.addEventListener(NFB_PLAYER_EVENTS.NEXT_BUTTON_CLICKED, async () => {\n      await this.saveProgress()\n    })\n\n    window.addEventListener('beforeunload', this.willQuitPage)\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    this.resetVideoElement()\n    const currentPlayerId = this.getPlayerIdFromAttributes()\n    this.initVideoElement(currentPlayerId)\n  }\n\n  disconnectedCallback (): void {\n    super.disconnectedCallback()\n    this.resetVideoElement()\n  }\n\n  protected willUpdate (_changedProperties: PropertyValues): void {\n    super.willUpdate(_changedProperties)\n    if (_changedProperties.has('registryId')) {\n      const oldValue = _changedProperties.get('registryId')\n      // NFB Video attribute changed without player modal closed\n      // Ex: User clicked \"Continue\" button inside the player\n      // Or play has been cancelled after another play button\n      // has been clicked before loading is over.\n      if (oldValue != null) {\n        this.resetVideoElement()\n        const currentPlayerId = this.getPlayerIdFromAttributes()\n        this.initVideoElement(currentPlayerId)\n      }\n    }\n  }\n\n  protected updated (_changedProperties: PropertyValues): void {\n    if (_changedProperties.has('isReady') && this.isReady) {\n      this.play()\n    }\n  }\n\n  // Init video element with values of playerId passed as parameter.\n  // These values are used instead of element attributes (as: this.registryId)\n  // in case these attributes changes during execution\n  // (ex: another play button is pressed before loading is done.)\n  async initVideoElement (playerId: PlayerUniqId): Promise<void> {\n    this.isLoading = true\n    this.isReady = false\n\n    // Has necessary info ?\n    if (!playerId.streamType || !playerId.slug) {\n      this.showError(PlayerError.NO_SLUG_OR_STREAM_TYPE, playerId)\n    }\n\n    const { players, works } = store.getState()\n\n    // Is watchable ?\n    const work = selectWorkById(works, playerId.registryId)\n    if (work?.geoblocked) {\n      this.showError(PlayerError.GEOBLOCKED, playerId)\n      return\n    }\n\n    // Retrieve player options\n    let playerOptions = selectPlayerOptionsByRegistryId(players, playerId.registryId)\n\n    // If no player options found, show an error\n    if (!playerOptions) {\n      this.showError(PlayerError.NO_PLAYER_OPTIONS, playerId)\n      return\n    }\n\n    // If no source detected, fetch stream\n    if (!playerOptions?.source) {\n      await store.dispatch(fetchStream(playerId))\n\n      const { players } = store.getState()\n      playerOptions = selectPlayerOptionsByRegistryId(players, playerId.registryId)\n\n      // If still no source, show error\n      if (!playerOptions?.source) {\n        this.showError(PlayerError.NO_SOURCE, playerId)\n        return\n      }\n    }\n\n    // Add enableLowInitialPlaylist to try to fix https://nfbonf.atlassian.net/browse/EO-7434\n    playerOptions = {\n      ...playerOptions,\n      html5: {\n        vhs: {\n          enableLowInitialPlaylist: true\n        }\n      }\n    }\n\n    // Disable chromecast plugin for old safari browser\n    const safariVersion = getSafariVersion()\n    if (safariVersion && safariVersion < 16) {\n      // @ts-expect-error Type 'false' has no properties in common with type '{ addButtonToControlBar?: boolean | undefined; }'.\n      playerOptions.chromecast = false\n    }\n\n    // When data ready, create player\n    this.createNFBWebPlayer(playerId, playerOptions)\n  }\n\n  resetVideoElement (): void {\n    if (this._playPromiseResolve) {\n      this._playPromiseResolve(null)\n      this._playPromiseResolve = null\n    }\n\n    this._videoJsEl = null\n    this.playerExposed = null\n  }\n\n  // Create NFBWebPlayer with values of playerId passed as parameter.\n  // (See initVideoElement comment).\n  createNFBWebPlayer (playerId: PlayerUniqId, playerOptions: PlayerOptions): void {\n    const createdElement = storeCreatedElements.find(item => JSON.stringify(item.playerId) === JSON.stringify(playerId))\n\n    if (createdElement) {\n      // Only call finalizeShowPlayer if playerId is\n      // still set to be played in the store\n      // (hasn't been cancelled/replaced by other actions)\n      if (this.playerIdIsCurrentlyPlaying(playerId)) {\n        this.finalizeShowPlayer(\n          playerId,\n          createdElement.nfbWebPlayer,\n          createdElement.videoJsEl,\n          createdElement.playerStats\n        )\n      }\n      return\n    }\n\n    const videoJsEl = document.createElement('video-js')\n    videoJsEl.classList.add('video-js', 'vjs-fill', 'vjs-nfb-theme-default')\n    videoJsEl.setAttribute('controls', 'true')\n    videoJsEl.setAttribute('preload', 'auto')\n    videoJsEl.setAttribute('playsinline', 'true')\n\n    // Don't know why we need to do this ?\n    // Otherwise we got \"object is not extensible error\"\n    const themeOptions = { ...playerOptions?.theme }\n    const overlayOptions = { ...playerOptions?.overlay }\n    const ratingOptions = { ...playerOptions?.ratings }\n    const triggerWarningsOptions = {\n      items: playerOptions?.triggerWarnings?.items.map(\n        i => ({ title: i.title, description: i.description, displayTime: i.displayTime })\n      )\n    }\n\n    const nfbWebPlayer = new NFBWebPlayer({\n      el: videoJsEl,\n      options: {\n        dynamicCssImports: false,\n        disableResolutions: [270, 360],\n        restartFromBeginning: true,\n        ready: async (player: NFBExpose) => {\n          await waitForMetadata(player)\n\n          this.addPlayerListeners(player, playerId)\n\n          const playerStats = this.initTracking(player, playerOptions)\n          playerStats.init()\n\n          // Only call finalizeShowPlayer if playerId is\n          // still set to be played in the store\n          // (hasn't been cancelled/replaced by other actions)\n          if (this.playerIdIsCurrentlyPlaying(playerId)) {\n            this.finalizeShowPlayer(playerId, nfbWebPlayer, videoJsEl, playerStats)\n          }\n\n          storeCreatedElements.push({\n            playerId,\n            nfbWebPlayer,\n            videoJsEl,\n            playerStats\n          })\n        },\n        ...playerOptions,\n        theme: themeOptions,\n        overlay: overlayOptions,\n        ratings: ratingOptions,\n        triggerWarnings: triggerWarningsOptions\n      }\n    })\n  }\n\n  addPlayerListeners (playerExposed: NFBExpose, playerId: PlayerUniqId) {\n    // Add listeners\n    playerExposed.on('ended', this.playerHasEnded)\n    playerExposed.on('error', this.playerHasVideoJsError)\n    if (playerId.streamType === 'films' && !this.isChapter && !playerId.isExtra) {\n      playerExposed.on('timeupdate', this.onProgress)\n    }\n  }\n\n  // Called when the player has been retrieved or created and will be shown.\n  // Update player progress, set instance variables and set loading as done.\n  finalizeShowPlayer (playerId: PlayerUniqId, nfbWebPlayer: NFBWebPlayer, videoJsEl: Node, playerStats: PlayerStats) {\n    this.shouldSaveProgress = playerId.streamType === 'films' && !this.isChapter && !playerId.isExtra\n\n    this.isLoading = false\n    this._videoJsEl = videoJsEl\n    this.playerExposed = nfbWebPlayer.expose\n    this.playerStats = playerStats\n    if (this.shouldSaveProgress) {\n      this.updateProgressWithHistory()\n    }\n    this.isReady = true\n    store.dispatch(setIsLoading(false))\n  }\n\n  initTracking (playerExposed: NFBExpose, playerOptions: PlayerOptions) {\n    const statsOptions: StatsOptions = {\n      // Base\n      registryId: this.registryId,\n      title: playerOptions.gtm.title,\n      workType: playerOptions.unstats.type,\n      embedMode: false,\n      autoplay: false,\n      isChapter: this.isChapter,\n      chapter: playerOptions.chapter,\n      // GTM\n      versionLang: playerOptions.gtm?.versionLang,\n      catalogingLang: playerOptions.gtm?.catalogingLang,\n      interfaceLang: window.LOCALE,\n      // Unstats\n      slug: this.slug,\n      url: playerOptions.unstats?.url,\n      user: playerOptions.unstats?.user,\n      context: playerOptions.unstats?.context,\n      labels: playerOptions.unstats?.labels\n    }\n\n    return new PlayerStats(playerExposed, statsOptions)\n  }\n\n  async playerHasEnded () {\n    const playerId = this.getPlayerIdFromAttributes()\n    await this.saveProgress()\n    document.dispatchEvent(new CustomEvent(NFB_VIDEO_EVENTS.PLAYER_ENDED, {\n      composed: true,\n      bubbles: true,\n      detail: playerId\n    }))\n\n    this.destroyVideoJsInstance(playerId)\n  }\n\n  destroyVideoJsInstance (playerId: PlayerUniqId) {\n    // destroy current videojs player\n    // we will want a new instance for watch again to track again stats\n    const index = storeCreatedElements.findIndex(item => JSON.stringify(item.playerId) === JSON.stringify(playerId))\n    storeCreatedElements.splice(index, 1)\n    this.resetVideoElement()\n  }\n\n  playerHasVideoJsError () {\n    this.showError(PlayerError.VIDEO_JS, this.getPlayerIdFromAttributes())\n  }\n\n  onProgress () {\n    this.saveProgress()\n  }\n\n  showError (error: PlayerError, relatedPlayerId: PlayerUniqId) {\n    // Only show error if relatedPlayerId is still playing (error is for \"current\" play)\n    if (this.playerIdIsCurrentlyPlaying(relatedPlayerId)) {\n      store.dispatch(setCurrentError(error))\n      store.dispatch(setCurrentPlaying(null))\n      store.dispatch(setIsLoading(false))\n    }\n  }\n\n  updateProgressWithHistory () {\n    if (this.playerExposed) {\n      // Check is user has history\n      const state: RootState = store.getState()\n      const filmHistory = selectFilmHistoryById(state.filmHistory, this.registryId)\n\n      // If history, update current time.\n      // Set to 0 if considered completed.\n      if (filmHistory) {\n        this.playerExposed.currentTime = filmHistory.is_completed ? 0 : filmHistory.timecode\n      }\n    }\n  }\n\n  async saveProgress (): Promise<void> {\n    if (!this.playerExposed || !this.shouldSaveProgress) {\n      return\n    }\n\n    const progress = this.playerExposed.currentTime\n    const percentProgress = Math.round(progress / this.playerExposed.duration * 100)\n\n    const history: WorkHistory = {\n      registry_id: this.registryId,\n      timecode: Math.floor(progress),\n      percent: progress > 0 && percentProgress === 0 ? 1 : percentProgress,\n      // we want uniformed data, to be able to sort by uniqId in workHistoryReducer\n      work: {\n        registry_id: this.registryId\n      }\n    }\n\n    // if series or collection, we want to send parent context\n    const { seriesPage } = store.getState()\n    if (seriesPage.seriesRegistryId) {\n      history.work = {\n        registry_id: seriesPage.seriesRegistryId\n      }\n    }\n\n    await store.dispatch(postHistory(history))\n  }\n\n  play () {\n    if (this.playerExposed) {\n      const playPromise = this.playerExposed.play()\n\n      // To make the play event \"cancellable\", use Promise.any\n      // with a second promise that can be resolved externally.\n      // The play promise will be ignored\n      // after this second promise is resolved.\n      Promise.any([\n        playPromise,\n        new Promise(resolve => {\n          this._playPromiseResolve = resolve\n        })])\n    }\n  }\n\n  pause () {\n    if (this.playerExposed) {\n      this.playerExposed.pause()\n      this.saveProgress()\n    }\n  }\n\n  sourceHasExpired = async () => {\n    const playerId = this.getPlayerIdFromAttributes()\n    const streamData = await store.dispatch(fetchStream(playerId))\n    const source = (streamData.payload as StreamFetchResponse)?.source\n    if (source) {\n      if (this.playerExposed) {\n        this.playerExposed.refreshSource(source)\n      }\n    } else {\n      this.showError(PlayerError.NO_SOURCE, playerId)\n    }\n  }\n\n  willQuitPage () {\n    this.saveProgress()\n  }\n\n  playerIdIsCurrentlyPlaying (playerId: PlayerUniqId) {\n    return store.getState().players.currentPlaying?.registryId === playerId.registryId\n  }\n\n  getPlayerIdFromAttributes () {\n    return {\n      registryId: this.registryId,\n      slug: this.slug,\n      streamType: this.streamType,\n      isExtra: store.getState().players.currentPlaying?.isExtra\n    }\n  }\n\n  render () {\n    if (this.isLoading) {\n      return html`\n      <nfb-spinner\n          is-dark=\"true\"\n          is-loading=\"true\"\n        ></nfb-spinner>\n      `\n    }\n\n    // Video JS element is created on the fly\n    return this._videoJsEl\n  }\n}\n\nif (window.Cypress) {\n  window.videoElementList = storeCreatedElements\n}\n","/**\n * Class NFBDisplayWorkCard.\n *\n * Component that can display any type of work on any variant of card.\n */\n\nimport { LitElement, css, nothing } from 'lit'\nimport { html, literal } from 'lit/static-html.js'\nimport { Unsubscribe } from '@reduxjs/toolkit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit-html/directives/class-map.js'\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { ShapeVariant } from '@web-nfb/frontend-static/design-system/wc/card/NFBCard'\n\nimport {\n  getRestriction,\n  getAvailabilityMessage,\n  cardShouldBeDisabled,\n  getActionButton,\n  handleUrl,\n  getSeriesOrCollectionLegend,\n  getFilmLegend\n} from '@src/js/helpers/element/card'\nimport { formatDuration } from '@src/js/helpers/format'\nimport { getAvailabilityStatusForWork, WorkAvailabilityStatus } from '@src/js/helpers/availability'\nimport { store, RootState } from '@src/js/redux/store'\nimport { WorkCard, selectWorkById } from '@src/js/redux/worksReducer'\n\n// @ts-expect-error Lit Sass import\nimport cardStyleSlot from '@web-nfb/frontend-static/design-system/wc/card/NFBCardSlot.sass?lit'\nimport { escapeText } from '@web-nfb/frontend-static/design-system/script/utils/string'\nimport type NFBCard from '@web-nfb/frontend-static/design-system/wc/card/NFBCard'\n\nexport enum CardType {\n carousel = 'carousel',\n bookmark = 'bookmark'\n}\n\nexport enum bookmarkButtonType {\n  add = 'add',\n  delete = 'delete',\n}\n\n@customElement('nfb-display-work-card')\nexport class NFBDisplayWorkCard extends LitElement {\n  @property({ type: Number, attribute: 'registry-id' })\n  registryId: number\n\n  @property({ type: String, attribute: 'href' })\n  href = ''\n\n  @property({ type: String, attribute: 'card-type' })\n  cardType: CardType | null = null\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-rounded' })\n  isRounded: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-active' })\n  isActive: boolean = false\n\n  @property({ type: String, attribute: 'gtm-attributes' })\n  gtmAttribute: string = ''\n\n  @property({ converter: stringToBooleanConverter, attribute: 'include-progress-bar' })\n  includeProgressBar: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'include-description' })\n  includeDescription: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'truncate-description' })\n  truncateDescription: boolean = true\n\n  @property({ converter: stringToBooleanConverter, attribute: 'include-see-more-link' })\n  includeSeeMoreLink: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'include-legend' })\n  includeLegend: boolean = true\n\n  @property({ converter: stringToBooleanConverter, attribute: 'use-thumbnail-pattern' })\n  // Set to false if thumbnailPath is an absolute URL\n  // and no pattern should be used to generate thumbnail\n  useThumbnailPattern: boolean = true\n\n  @property({ type: String, attribute: 'primary-variant' })\n  primaryVariant: string = ''\n\n  @property({ type: String, attribute: 'secondary-variant' })\n  secondaryVariant: string | '' = ''\n\n  @property({ type: String, attribute: 'shape-variant' })\n  shapeVariant: ShapeVariant | '' = ''\n\n  @property({ attribute: 'bookmark-button-type' })\n  bookmarkButtonType: bookmarkButtonType | null = null\n\n  @property({ type: String, attribute: 'thumbnail-path' })\n  thumbnailPath: string | null = null\n\n  @property({ type: String, attribute: 'thumbnail-pattern' })\n  thumbnailPattern: string | null = null\n\n  @state()\n  availabilityStatus: WorkAvailabilityStatus = WorkAvailabilityStatus.PUBLIC\n\n  @state()\n  work: WorkCard | null = null\n\n  @state()\n  contextWork: WorkCard | null = null\n\n  _storeUnsubscribe: Unsubscribe\n  _cardId: string\n  _rootState: RootState\n  _thumbnailPatterns: { [key: string]: string }\n\n  static get styles () {\n    return [cardStyleSlot, css`\n      nfb-work-page-legend::part(container) {\n        margin-top: 0;\n        margin-bottom: 0;\n      }\n  \n      .nfb-display-work-card--truncate-description .nfb-card__description div {\n        display: -webkit-box !important;\n        -webkit-line-clamp: 4;\n        -webkit-box-orient: vertical;\n        overflow: hidden !important;\n        word-break: normal !important;\n      }\n\n      .nfb-progress-bar--rounded {\n        border-radius: 6px;\n        overflow: hidden;\n      }\n    `]\n  }\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n    this.getIsInert = this.getIsInert.bind(this)\n    this.getCardElement = this.getCardElement.bind(this)\n    this.getParentCarouselElement = this.getParentCarouselElement.bind(this)\n  }\n\n  async connectedCallback (): Promise<void> {\n    super.connectedCallback()\n    this._storeUnsubscribe = store.subscribe(this.stateChanged)\n    this.stateChanged()\n  }\n\n  disconnectedCallback (): void {\n    super.disconnectedCallback()\n    this._storeUnsubscribe()\n  }\n\n  protected firstUpdated () {\n    this._cardId = `card-${this.work?.id}`\n  }\n\n  attributeChangedCallback (name: string, _old: string | null, value: string | null): void {\n    super.attributeChangedCallback(name, _old, value)\n    if (name === 'registry-id' && _old !== null) {\n      // When registry id changed\n      this.work = null // show loading\n      // Update new work\n      this.updateWork()\n    }\n  }\n\n  stateChanged (): void {\n    this._rootState = store.getState()\n    this.updateWork()\n  }\n\n  updateWork () {\n    const { works } = store.getState()\n    if (this.registryId) {\n      this.work = selectWorkById(works, this.registryId)\n      if (this.work) {\n        this._thumbnailPatterns = works.thumbnailPattern\n        this.availabilityStatus = getAvailabilityStatusForWork(this.work)\n      }\n    }\n  }\n\n  getGTMAttributes (): string {\n    const jsonGTMAttribute = this.gtmAttribute\n      ? JSON.parse(this.gtmAttribute)\n      : {}\n\n    return JSON.stringify({\n      ...jsonGTMAttribute,\n      nfb_version_title: this.work?.title\n    })\n  }\n\n  getProgressBar (work: WorkCard) {\n    if (!this.includeProgressBar) return nothing\n\n    return html`\n    <div slot=\"progress-bar\" class=\"nfb-progress-bar ${!this.includeLegend && !this.bookmarkButtonType ? 'nfb-progress-bar--rounded' : ''}\" data-ui-active=\"true\">\n      <nfb-history-progress-bar\n        full-width=\"true\"\n        registry-id=\"${work.id}\"\n      >\n      </nfb-history-progress-bar>\n    </div>`\n  }\n\n  getDescription (work: WorkCard) {\n    let description = null\n    let showMoreLink = null\n\n    if (this.includeDescription) {\n      description = html`\n        <div>\n          ${unsafeHTML(escapeText(work.tagline ?? work.description))}\n        </div>\n      `\n    }\n\n    if (this.includeSeeMoreLink) {\n      showMoreLink = html`\n        <div class=\"nfb-card__extra-header-content\">\n          <a href=\"${work.availability?.resource_url}\">${window.gettext('More info')}</a>\n        </div>\n      `\n    }\n\n    if (!description && !showMoreLink) return nothing\n\n    return html`\n      <div slot=\"description\" class=\"nfb-card__description\">\n       ${description}\n       ${showMoreLink}\n      </div>\n    `\n  }\n\n  getClasses (availabilityStatus: WorkAvailabilityStatus) {\n    return {\n      'nfb-bookmarks--inactive': cardShouldBeDisabled(availabilityStatus),\n      'nfb-display-work-card--truncate-description': this.truncateDescription\n    }\n  }\n\n  // Implementing this function will allow NFBCarousel handleArrowButtonFocus() to fetch right card element\n  getIsInert (): boolean {\n    return (this.shadowRoot?.querySelector('nfb-carousel-card') as NFBCard)?.getIsInert()\n  }\n\n  getCardElement (): HTMLElement {\n    return (this.shadowRoot?.querySelector('nfb-carousel-card') as NFBCard) ?? false\n  }\n\n  getParentCarouselElement (): HTMLElement | null {\n    return (this.getRootNode() as ShadowRoot)?.host?.shadowRoot?.querySelector('nfb-carousel') ?? null\n  }\n\n  render () {\n    if (!this.work) {\n      return html`\n        <nfb-spinner\n          is-dark=\"${this.isDark}\"\n          is-loading=\"true\"\n        ></nfb-spinner>`\n    }\n\n    const elementTag = this.cardType === CardType.carousel\n      ? literal`nfb-carousel-card`\n      : literal`nfb-card`\n\n    const thumbnailPattern = this.useThumbnailPattern\n      ? (this.thumbnailPattern ?? this._thumbnailPatterns[this.work.category] ?? this._thumbnailPatterns.film)\n      : nothing\n\n    return html`\n      <${elementTag} ${this.cardType === CardType.carousel ? literal`data-ui-el=\"carousel-card\"` : nothing}\n        part=\"nfb-card\"\n        data-ui-el=\"${this._cardId}\"\n        class=\"${classMap(this.getClasses(this.availabilityStatus))}\"\n        primary-variant=\"${this.primaryVariant ?? nothing}\"\n        secondary-variant=\"${this.secondaryVariant ?? nothing}\"\n        shape-variant=\"${this.shapeVariant ?? nothing}\"\n        is-rounded=\"${this.isRounded || (this.isDark && this.secondaryVariant === 'no-border')}\"\n        title=\"${this.work.title}\"\n        is-unavailable=\"${cardShouldBeDisabled(this.availabilityStatus)}\"\n        href=\"${this.href ? this.href : handleUrl(this.work)}\"\n        default-thumbnail=\"${this.shapeVariant !== ShapeVariant.vertical ? window.FALLBACK_THUMBNAIL_PATTERN.replace('{path}', window.FALLBACK_THUMBNAIL_PATH) : window.FALLBACK_THUMBNAIL_PATTERN.replace('{path}', window.FALLBACK_THUMBNAIL_VERTICAL_PATH)}\"\n        thumbnail-path=\"${this.thumbnailPath ? this.thumbnailPath : (this.shapeVariant !== ShapeVariant.vertical && this.work.thumbnail ? this.work.thumbnail : nothing)}\"\n        thumbnail-url-pattern=\"${thumbnailPattern}\"\n        gtm-attributes=\"${this.getGTMAttributes() ?? nothing}\"\n        is-dark=\"${this.isDark ?? nothing}\"\n        is-active=\"${this.isActive ?? nothing}\"\n        hover-icon-name=\"ctrl-play\"\n      >\n    ${this.shapeVariant === ShapeVariant.vertical\n    ? nothing\n    : html` <div slot=\"legend\">\n          ${getRestriction(this.work, this.availabilityStatus, this.isDark, this._rootState.user)}\n          ${getAvailabilityMessage(this.availabilityStatus, this.work, this.isDark)}\n          ${this.includeLegend\n    ? (['collection', 'series'].includes(this.work.category)\n      ? getSeriesOrCollectionLegend(this.work, this.availabilityStatus, this.isDark)\n      : getFilmLegend(this.work, this.availabilityStatus, this.isDark))\n    : nothing}\n        </div>\n        ${this.getProgressBar(this.work)}\n        ${getActionButton(this.bookmarkButtonType, this.registryId, this.work, this.isDark)}\n        ${this.getDescription(this.work)}`}\n      </${elementTag}>`\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-display-work-card': NFBDisplayWorkCard\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`:host {\n  position: relative;\n  display: flex;\n  width: 100%;\n  min-height: 180px;\n  outline: none;\n}\n\nnfb-card, nfb-carousel-card {\n  width: 100%;\n}\n\n:host(.nfb-play-work-card--is-loading)::part(nfb-card) {\n  opacity: 0.25;\n  pointer-events: none;\n}\n\n:host([data-cy=episode-card]) nfb-card::part(card) {\n  margin-left: -1rem;\n}\n\n@media screen and (max-width: 990px), print {\n  :host([data-cy=episode-card]) nfb-card::part(card) {\n    margin-left: -0.75rem;\n  }\n}\n@media screen and (max-width: 768px), print {\n  :host([data-cy=episode-card]) nfb-card::part(card) {\n    margin-left: -0.25rem;\n  }\n}`;\nexport default styles;\n","/**\n * Class NFBPlayWorkCard.\n *\n * Extends class NFBDisplayWorkCard.\n * Added functionality: trigger play event to store on click.\n */\n\nimport { PropertyValues, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { handleFocusOnLastElementClicked } from '@src/js/helpers/page/common/display'\nimport { store } from '@src/js/redux/store'\nimport { setCurrentPlaying, StreamTypes } from '@src/js/redux/playersReducer'\nimport { GTMSelectWork } from '@src/js/types/GTM'\n\nimport { NFBDisplayWorkCard } from '@src/js/wc/cards/NFBDisplayWorkCard'\nimport { PLAYABLE_STATUS } from '@src/js/helpers/availability'\n\n// @ts-expect-error Lit Sass import\nimport playWorkCardStyles from '@src/sass/wc/NFBPlayWorkCard.sass?lit'\n\n@customElement('nfb-play-work-card')\nexport default class NFBPlayWorkCard extends NFBDisplayWorkCard {\n  @property({ type: String, attribute: 'stream-type' })\n  streamType: StreamTypes = 'films'\n\n  @state()\n  playerIsLoading: boolean = false\n\n  @state()\n  _currentActiveClickElement: string|null\n\n  _gtmAttrs: GTMSelectWork\n\n  static get styles () {\n    return [super.styles, playWorkCardStyles]\n  }\n\n  constructor () {\n    super()\n    this.onClick = this.onClick.bind(this)\n  }\n\n  protected updated (_changedProperties: PropertyValues): void {\n    if (_changedProperties.has('_currentActiveClickElement') && this._currentActiveClickElement) {\n      (this.shadowRoot?.querySelector(`[data-ui-el=${this._currentActiveClickElement}]`)?.shadowRoot?.querySelector('[data-ui-el=\"nfb-card-link\"]') as HTMLElement)?.focus()\n    }\n  }\n\n  async connectedCallback (): Promise<void> {\n    super.connectedCallback()\n\n    await this.updateComplete\n    const cardSelector = this.cardType === 'carousel' ? 'nfb-carousel-card' : 'nfb-card'\n    const cardElement = this.shadowRoot?.querySelector(cardSelector)\n    const cardLink = cardElement?.shadowRoot?.querySelector('[data-ui-el=\"nfb-card-link\"]')\n    if (cardLink) {\n      cardLink.addEventListener('click', this.onClick)\n    }\n  }\n\n  async stateChanged () {\n    super.stateChanged()\n\n    this.setPlayerIsLoading()\n    this._currentActiveClickElement = store.getState().workPage.currentActiveClickElement\n  }\n\n  setPlayerIsLoading () {\n    const { players, workPage } = store.getState()\n    if (players.currentPlaying?.registryId === this.registryId && workPage.lastClickElement === this._cardId) {\n      this.playerIsLoading = players.isLoading\n    } else {\n      this.playerIsLoading = false\n    }\n  }\n\n  onClick (e: Event): void {\n    // If work status is not playable,\n    // do not prevent default behavior of click (link to film page)\n    if (this.work && !PLAYABLE_STATUS.includes(this.availabilityStatus)) {\n      return\n    }\n\n    e.preventDefault()\n\n    // Update playing work\n    if (this.work) {\n      store.dispatch(setCurrentPlaying({\n        registryId: this.work.id,\n        slug: this.work.slug,\n        streamType: this.streamType\n      }))\n\n      handleFocusOnLastElementClicked(this._cardId, null)\n    }\n  }\n\n  render () {\n    let loadingElement = null\n\n    if (this.work && this.playerIsLoading) {\n      this.classList.add('nfb-play-work-card--is-loading')\n      loadingElement = html`\n        <nfb-spinner\n          is-dark=\"${this.isDark}\"\n          is-loading=\"true\"\n        ></nfb-spinner>\n      `\n    } else {\n      this.classList.remove('nfb-play-work-card--is-loading')\n    }\n\n    return html`\n      ${loadingElement ?? nothing}\n      ${super.render()}\n    `\n  }\n}\n","/**\n * Class NFBRecommendationsCarousel.\n *\n * Extends class NFBWorkCarousel.\n */\n\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { store } from '@src/js/redux/store'\nimport { fetchRecommendationsWorks } from '@src/js/redux/worksReducer'\nimport { GTM_LIST_CATEGORY, GTM_LIST_ID } from '@src/js/constants'\nimport { WORK_CATEGORY_TYPE } from '@src/js/ApiClient'\n\nimport { selectRecommendationsIds } from '@src/js/redux/recommendationsReducer'\nimport NFBWorkCarousel from '@src/js/wc/carousels/base/NFBWorkCarousel'\n\n@customElement('nfb-recommendations-carousel')\nexport default class NFBRecommendationsCarousel extends NFBWorkCarousel {\n  @property({ type: Number, attribute: 'registry-id' })\n  registryId: 0\n\n  @property({ type: String, attribute: 'work-slug' })\n  workSlug = ''\n\n  @property({ type: String, attribute: 'work-title' })\n  workTitle = ''\n\n  @property({ type: String, attribute: 'work-type' })\n  workType: WORK_CATEGORY_TYPE = 'films'\n\n  carouselTitle: string = window.pgettext('Recommandations carousel', 'Suggestions')\n\n  getCarouselGTMAttributes (): object {\n    return {\n      ...super.getCarouselGTMAttributes(),\n      nfb_list_name: `suggestions for ${this.workTitle}`,\n      nfb_list_id: GTM_LIST_ID.SUGGESTIONS,\n      nfb_list_category: GTM_LIST_CATEGORY.SUGGESTIONS\n    }\n  }\n\n  async getRegistryIds () {\n    await store.dispatch(fetchRecommendationsWorks({ slug: this.workSlug, workType: this.workType }))\n    const state = store.getState()\n    return selectRecommendationsIds(state.recommendations) ?? []\n  }\n}\n","/**\n * Class NFBNormanCarousel.\n *\n * Generic carousel displaying slotted elements within a NFBCarousel component.\n *\n */\n\nimport { LitElement, nothing, css, TemplateResult } from 'lit'\nimport { literal, html } from 'lit/static-html.js'\nimport { customElement, property, state } from 'lit/decorators.js'\n\n// @ts-expect-error Lit Sass import\nimport carouselSlotStyle from '@web-nfb/frontend-static/design-system/wc/carousel/NFBCarouselSlot.sass?lit'\n\n// @ts-expect-error Lit Sass import\nimport boxedCarouselSlotStyle from '@web-nfb/frontend-static/design-system/wc/carousel/boxedCarousel/NFBBoxedCarouselSlot.sass?lit'\n\n// @ts-expect-error Lit Sass import\nimport cardSlotStyle from '@web-nfb/frontend-static/design-system/wc/card/NFBCardSlot.sass?lit'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport '@src/js/wc/work-page/NFBWorkPageCreator'\nimport '@src/js/wc/work-page/NFBWorkPageLegend'\nimport { ObjectValues } from '@src/js/types/GTM'\nimport { GTM_LIST_CATEGORY, GTM_LIST_TYPE } from '@src/js/constants'\n\nexport type CarouselGTMAttrs = {\n  nfb_list_type?: typeof GTM_LIST_TYPE.CAROUSEL,\n  nfb_list_category?: ObjectValues<typeof GTM_LIST_CATEGORY>\n  nfb_list_id?: string,\n  nfb_list_name?: string,\n}\n\n@customElement('nfb-norman-carousel')\nexport default class NFBNormanCarousel extends LitElement {\n  @property({ converter: stringToBooleanConverter, attribute: 'show-title' })\n  showTitle = true\n\n  @property({ type: String, attribute: 'carousel-title' })\n  carouselTitle: string\n\n  @property({ type: String, attribute: 'see-more-link' })\n  seeMoreLink: string | null = null\n\n  /** Show see more link as card. No effect if seeMoreLink is null. */\n  @property({ converter: stringToBooleanConverter, attribute: 'show-see-more-card' })\n  showSeeMoreCard = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-clothesline' })\n  isClothesLine = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-vertical' })\n  isVertical = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-boxed' })\n  isBoxed = false\n\n  @property({ type: Object, attribute: 'gtm-attributes' })\n  gtmAttributes: CarouselGTMAttrs = {}\n\n  @state()\n  isLoading = false\n\n  _defaultSeeMoreCardText = window.gettext('See more')\n  _carouselTemplateTag = literal`nfb-carousel`\n\n  static get styles () {\n    return [carouselSlotStyle, boxedCarouselSlotStyle, cardSlotStyle, css`\n    .nfb-norman-carousel__spinner-container {\n      min-height: 240px;\n      position: relative;\n    }\n\n    nfb-carousel::part(carousel) {\n      background-color: transparent;\n    }\n\n    nfb-boxed-carousel::part(carousel) {\n      background-color: transparent;\n    }\n\n    nfb-history-progress-bar::part(nfb-progress-bar) {\n      position: absolute;\n    }\n\n    nfb-work-page-legend::part(container) {\n      margin-top: 0;\n      margin-bottom: 0;\n    }\n\n    :host([data-is-hover=\"true\"]) {\n      z-index: 2;\n    }\n  `]\n  }\n\n  firstUpdated () {\n    if (this.isBoxed) {\n      this._carouselTemplateTag = literal`nfb-boxed-carousel`\n    }\n  }\n\n  /**\n   *\n   * @returns show or hide see more card.\n   * Based on the attribute by default. Can be overriden\n   * for a different condition.\n   */\n  shouldShowSeeMoreCard () {\n    return this.showSeeMoreCard\n  }\n\n  /**\n   * @returns TemplateResult that is to be assigned to the \"card\" slot of the NFBCarousel\n   * or nothing if no card to display.\n   */\n  getElements (): TemplateResult | typeof nothing {\n    return html`<slot slot=\"card\"></slot>`\n  }\n\n  /**\n   * To be overwritten in extended carousel\n   * @returns CarouselGTMAttrs with default nfb_list_type and nfb_list_name\n   */\n  protected getCarouselGTMAttributes (): CarouselGTMAttrs {\n    return {\n      nfb_list_type: GTM_LIST_TYPE.CAROUSEL,\n      nfb_list_name: this.carouselTitle,\n      ...this.gtmAttributes\n    }\n  }\n\n  private getFormattedCarouselGTMAttributes () : string | typeof nothing {\n    const gtmAttrs = this.getCarouselGTMAttributes()\n    if (gtmAttrs) {\n      return JSON.stringify(gtmAttrs)\n    }\n\n    return nothing\n  }\n\n  /**\n   * @returns TemplateResult of a NFBCarousel or nothing if no elements to display.\n   */\n  getCarousel (): TemplateResult | typeof nothing {\n    const carouselId = this.carouselTitle ? `${this.carouselTitle}-carousel`.toLowerCase() : nothing\n    const elements = this.getElements()\n    if (elements === nothing) {\n      return nothing\n    }\n\n    return html`\n      <${this._carouselTemplateTag}\n        id=\"${carouselId}\"\n        data-cy=\"${carouselId}\"\n        title=\"${this.showTitle ? this.carouselTitle : nothing}\"\n        skip-list=\"${window.gettext('Skip This List')}\"\n        aria-label-previous=\"${window.gettext('See previous')} ${this.carouselTitle}\"\n        aria-label-next=\"${window.gettext('See next')} ${this.carouselTitle}\"\n        is-dark=${this.isDark ?? nothing}\n        see-more-link=${this.seeMoreLink ?? nothing}\n        see-more-card-text=${this.shouldShowSeeMoreCard() ? this._defaultSeeMoreCardText : nothing}\n        is-clothesline=${this.isClothesLine ?? nothing}\n        is-loading=${this.isLoading ?? nothing}\n        gtm-attributes=${this.getFormattedCarouselGTMAttributes()}\n        is-vertical=${this.isVertical ?? nothing}\n        is-rounded=${this.isDark && this.isClothesLine}\n      >\n        ${this.getElements()}\n      </${this._carouselTemplateTag}>\n    `\n  }\n\n  render () {\n    if (this.isLoading) {\n      return html`\n      <div class=\"nfb-norman-carousel__spinner-container\" data-cy=\"carousel-spinner\">\n        <nfb-spinner\n          is-dark=\"${this.isDark ?? nothing}\"\n          is-loading=\"true\"\n        ></nfb-spinner>\n      </div>\n    `\n    }\n\n    return this.getCarousel()\n  }\n}\n","/**\n * Class NFBWorkCarousel.\n *\n * Generic carousel displaying NFBDisplayWork elements within a NFBCarousel component\n * based on a list of registry ids passed as attributes.\n *\n */\n\nimport { nothing, PropertyValues, TemplateResult } from 'lit'\nimport { html, literal } from 'lit/static-html.js'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport normanPaths from '@src/js/helpers/paths'\nimport { GTMSelectWork } from '@src/js/types/GTM'\nimport { GTM_EVENTS, DEFAULT_LIST_LENGTH } from '@src/js/constants'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { fetchWorks, selectWorkByIdList, WorkCard } from '@src/js/redux/worksReducer'\nimport NFBNormanCarousel, { CarouselGTMAttrs } from './NFBNormanCarousel'\nimport { store } from '@src/js/redux/store'\nimport { bookmarkButtonType, CardType } from '@src/js/wc/cards/NFBDisplayWorkCard'\nimport { ShapeVariant } from '@web-nfb/frontend-static/design-system/wc/card/NFBCard'\n\ntype SelectWorkGTMEvent = {\n  event: typeof GTM_EVENTS.SELECT_WORK,\n} & CarouselGTMAttrs\n\n@customElement('nfb-work-carousel')\nexport default class NFBWorkCarousel extends NFBNormanCarousel {\n  @property({ type: Array, attribute: 'registry-id-list' })\n  initialRegistryIdList: null | number[] = null\n\n  @property({ type: String, attribute: 'subset' })\n  subset: 'nfb/public' | 'gc/gc-films' | 'nfb/published' = 'nfb/published'\n\n  @property({ type: String, attribute: 'carousel-slug' })\n  carouselSlug = ''\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-vertical' })\n  isVertical = false\n\n  /** List of work to display. Is null if works have not\n   * been fetched yet, empty if fetch is completed but no\n   * work to display.\n   */\n  @state()\n  worksList: WorkCard[] | null = null\n\n  _includeProgressBar = false\n  _includeBookmarkButton = true\n  _defaultListLength = DEFAULT_LIST_LENGTH\n\n  /**\n   * After update, calls getRegistryIds() and use\n   * the returned list to select works.\n   */\n  async connectedCallback (): Promise<void> {\n    super.connectedCallback()\n    if (this.isBoxed) this._defaultListLength = 12\n    this.isLoading = true\n    await this.updateComplete\n    const registryIds = await this.getRegistryIds()\n    this.worksList = selectWorkByIdList(store.getState().works, registryIds) ?? []\n  }\n\n  protected updated (_changedProperties: PropertyValues): void {\n    if (_changedProperties.has('worksList') && this.worksList !== null && this.isLoading) {\n      this.isLoading = false\n    }\n  }\n\n  /**\n   * Called for each card in getWorkCard.\n   * @returns GTM dict containing all generic attributes\n   * for nfb_select_work related to this carousel. Will be used\n   * to send work specific event on card click.\n   *\n   * Should be overwritten in child class to set up specific values.\n   */\n  getGTMAttributesForSelectWork (): SelectWorkGTMEvent {\n    if (!this.carouselTitle) {\n      // Throw an error if no title has been attributed,\n      // since this will cause bad data for GTM event.\n      throw new Error('No carousel title has been defined.')\n    }\n\n    return {\n      ...this.getCarouselGTMAttributes(),\n      event: GTM_EVENTS.SELECT_WORK\n    }\n  }\n\n  /**\n   *\n   * @returns A list of registry ids to be displayed. In the generic\n   * version, returns value of registry-id-list attribute. Should be\n   * overwritten in child class if registry-id-list should be fetched\n   * from store.\n   */\n  async getRegistryIds (): Promise<number[]> {\n    if (!this.initialRegistryIdList?.length) {\n      return []\n    }\n\n    await store.dispatch(fetchWorks({\n      idList: this.initialRegistryIdList,\n      subset: this.subset\n    }))\n    return this.initialRegistryIdList\n  }\n\n  shouldShowSeeMoreCard () {\n    return this.showSeeMoreCard &&\n    !!this.worksList?.length && this.worksList.length > this._defaultListLength\n  }\n\n  getElements () {\n    if (!this.worksList?.length) {\n      this.classList.add('nfb-carousel--empty')\n      return nothing\n    }\n\n    this.classList.remove('nfb-carousel--empty')\n\n    const cardMax = this.shouldShowSeeMoreCard()\n      ? this._defaultListLength - 1\n      : this._defaultListLength\n\n    return html`${\n      this.worksList?.slice(0, cardMax).map((work, index) => this.getWorkCard(work, index))\n    }`\n  }\n\n  /**\n   *\n   * @param work\n   * @returns The context work (series or collection), or null if no\n   * context. Thumbnail and resource path of the context work will be\n   * used when displaying card for work.\n   *\n   * Returns null by default, should be overwritten if a context work\n   * is to be used.\n   */\n  getContextWork (work: WorkCard): WorkCard | null { return null }\n\n  /**\n   *\n   * @param work\n   * @param index\n   * @returns TemplateResult containing nfb-display-work card to be\n   * displayed\n   */\n  getWorkCard (work: WorkCard, index: number): TemplateResult {\n    const elementTag = this.isClothesLine && this.isDark && !this.isVertical && this.carouselSlug !== 'continue-watching'\n      ? literal`nfb-animated-hover-card`\n      : literal`nfb-display-work-card`\n\n    const gtmAttrs: GTMSelectWork = {\n      ...this.getGTMAttributesForSelectWork(),\n      nfb_version_title: work.title,\n      nfb_detail: (index + 1).toString()\n    }\n\n    const bookmarkButton = store.getState().user.isConnected && this._includeBookmarkButton\n      ? bookmarkButtonType.add\n      : nothing\n\n    const contextWork = this.getContextWork(work) ?? work\n    let thumbnailPath = contextWork.thumbnail\n\n    if (this.isVertical) {\n      thumbnailPath = work.jacket ?? ''\n    }\n\n    return html`\n      <li slot=\"card\" class=\"nfb-carousel__card ${this.isDark ? 'nfb-carousel__card--dark' : ''}\" id=\"${this.title}-${work.title}-${index}\" data-index=\"${index}\">\n        <${elementTag}\n          carousel-slug=\"${this.carouselSlug}\"\n          data-ui-el=\"carousel-card\"\n          registry-id=\"${work.id}\"\n          thumbnail-path=\"${thumbnailPath}\"\n          include-progress-bar=\"${this._includeProgressBar ?? nothing}\"\n          include-legend=\"${this.carouselSlug === 'continue-watching' ? 'false' : nothing}\"\n          gtm-attributes=\"${JSON.stringify(gtmAttrs)}\"\n          href=\"${normanPaths[contextWork.category].replace('{slug}', contextWork.slug)}\"\n          is-dark=\"${this.isDark ?? nothing}\"\n          shape-variant=\"${this.isVertical ? ShapeVariant.vertical : nothing}\"\n          secondary-variant=\"${this.isClothesLine ? 'no-border' : nothing}\"\n          card-type=\"carousel\"\n          bookmark-button-type=${bookmarkButton}\n        >\n        </${elementTag}>\n      </li>`\n  }\n}\n","/**\n * Class NFBExtraCard.\n *\n * Extends NFBPlayWorkCard:\n * - Uses registryId property as parent work.\n * - Uses slug property as extra slug.\n * - Uses work property as extra work.\n *\n * Overwrite stateChanged():\n *    add management of highlight\n * Overwrite setPlayerIsLoading():\n *    use work.id instead of this.registryId to evaluate\n *    (this.registryId is actually parent work)\n * Overwrite updateWork():\n *    use registryId property to get parent work,\n *    use slug property to get specific extra from work,\n *    set its property as this.work,\n *    generate player options.\n * Overwrite onClick():\n *    add setHighlightId\n *\n *\n */\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { store } from '@src/js/redux/store'\nimport { handleFocusOnLastElementClicked } from '@src/js/helpers/page/common/display'\nimport NFBPlayWorkCard from '@src/js/wc/cards/NFBPlayWorkCard'\nimport { WorkAvailabilityStatus, PLAYABLE_STATUS } from '@src/js/helpers/availability'\nimport { selectWorkById } from '@src/js/redux/worksReducer'\nimport { addToPlayerOptionsList, setCurrentPlaying } from '@src/js/redux/playersReducer'\nimport { generatePlayerOptionsForWork } from '@src/js/helpers/player'\nimport { setHighlightId } from '@src/js/redux/workPageReducer'\n\n@customElement('nfb-extra-card')\nexport default class NFBExtraCard extends NFBPlayWorkCard {\n  @property({ type: String, attribute: 'slug' })\n  slug = ''\n\n  @property({ type: String, attribute: 'parent-slug' })\n  parentSlug = ''\n\n  _isHighlight: boolean\n  _highlightId: string|null\n\n  constructor () {\n    super()\n    this.onClick = this.onClick.bind(this)\n    this.stateChanged = this.stateChanged.bind(this)\n\n    store.subscribe(this.stateChanged)\n  }\n\n  async stateChanged (): Promise<void> {\n    super.stateChanged()\n\n    const oldHilightId = this._highlightId\n\n    this._highlightId = store.getState().workPage.highlightId\n\n    // Highlight id changed\n    if (oldHilightId !== this._highlightId) {\n      this._isHighlight = this._highlightId === this.getAttribute('id')\n      this.setAttribute('is-active', this._isHighlight.toString())\n\n      if (this._isHighlight) {\n        this.focusCard()\n      }\n    }\n  }\n\n  setPlayerIsLoading (): void {\n    const { players, workPage } = store.getState()\n    if (players.currentPlaying?.registryId === this.work?.id && workPage.lastClickElement === this._cardId) {\n      this.playerIsLoading = players.isLoading\n    } else {\n      this.playerIsLoading = false\n    }\n  }\n\n  updateWork (): void {\n    const { works } = store.getState()\n\n    if (this.registryId && !this.work) {\n      const parentWork = selectWorkById(works, this.registryId)\n      if (parentWork?.extras) {\n        this._thumbnailPatterns = works.thumbnailPattern\n        this.availabilityStatus = WorkAvailabilityStatus.PUBLIC\n        const extra = (parentWork.extras[this.streamType]?.find(e => e.slug === this.slug))\n        if (extra) {\n          this.work = {\n            cataloging_language: parentWork.cataloging_language,\n            id: extra.id,\n            slug: extra.slug,\n            thumbnail: extra.thumbnail,\n            title: extra.title,\n            year: extra.year,\n            duration: extra.duration,\n            description: extra.description,\n            category: 'film',\n            availability: {\n              resource_url: window.location.href + `?highlight=${this.id}`\n            }\n          }\n\n          const playerOptions = generatePlayerOptionsForWork(this.work, this.streamType, this.parentSlug)\n          if (playerOptions) {\n            store.dispatch(addToPlayerOptionsList({ [this.work.id]: playerOptions }))\n          }\n        }\n      }\n    }\n  }\n\n  protected async firstUpdated (): Promise<void> {\n    this._cardId = `extra-card-${this.slug}`\n\n    // If highlighted from URL, force scrollIntoView when the component is rendered\n    if (this._isHighlight) {\n      await this.updateComplete\n      this.scrollIntoView({ block: 'center', inline: 'nearest' })\n    }\n  }\n\n  focusCard () {\n    this.setAttribute('tabindex', '-1')\n    this.focus()\n    this.removeAttribute('tabindex')\n  }\n\n  onClick (e: Event): void {\n    // If work status is not playable,\n    // do not prevent default behavior of click (link to film page)\n    if (this.work && !PLAYABLE_STATUS.includes(this.availabilityStatus)) {\n      return\n    }\n\n    e.preventDefault()\n\n    // Update playing work\n    if (this.work) {\n      store.dispatch(setCurrentPlaying({\n        registryId: this.work.id,\n        slug: this.work.slug,\n        streamType: this.streamType,\n        isExtra: true\n      }))\n\n      handleFocusOnLastElementClicked(this._cardId, null)\n    }\n\n    store.dispatch(setHighlightId(this.getAttribute('id')))\n  }\n}\n","/**\n * Class NFBExtras.\n *\n * Display extras either as a NFBCarousel or as a list.\n * Uses NFBExtraCard in both cases.\n */\nimport { css, html, LitElement, nothing, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\nimport { classMap } from 'lit-html/directives/class-map.js'\nimport { Unsubscribe } from 'redux/dist/redux'\n\nimport { store } from '@src/js/redux/store'\nimport { ExtraCard, selectWorkById } from '@src/js/redux/worksReducer'\nimport { GTMSelectWork } from '@src/js/types/GTM'\nimport { GTM_EVENTS, GTM_LIST_CATEGORY, GTM_LIST_ID, GTM_LIST_TYPE } from '@src/js/constants'\nimport type NFBCard from '@web-nfb/frontend-static/design-system/wc/card/NFBCard'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport spacings from '@web-nfb/frontend-static/design-system/sass/exports/spacing.module.sass'\n// @ts-expect-error Lit Sass import\nimport carouselSlotStyle from '@web-nfb/frontend-static/design-system/wc/carousel/NFBCarouselSlot.sass?lit'\n// @ts-expect-error Lit Sass import\nimport cardSlotStyle from '@web-nfb/frontend-static/design-system/wc/card/NFBCardSlot.sass?lit'\n\nimport { StreamTypes } from '@src/js/redux/playersReducer'\n\n@customElement('nfb-extras')\nexport default class NFBExtrasCarousel extends LitElement {\n  @property({ type: Number, attribute: 'registry-id' })\n  registryId: number\n\n  @property({ type: String, attribute: 'work-title' })\n  workTitle: string = ''\n\n  @property({ type: Array, attribute: 'allowed-types' })\n  allowedTypes: StreamTypes[] = ['films', 'making_ofs', 'clips', 'interviews', 'promo_clips', 'education_exclusives']\n\n  @property({ type: String, attribute: 'section-selector' })\n  sectionSelector: string | null = null\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-carousel' })\n  isCarousel = true\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark = true\n\n  @state()\n  extras: ExtraCard[] | null = null\n\n  @state()\n  parentSlug: string // needed for embed URL\n\n  _unsuscribe: Unsubscribe\n\n  static styles = [\n    carouselSlotStyle, cardSlotStyle,\n    css`\n      .nfb-carousel__card {\n        --nfb-carousel-number-of-cards: 5;\n        flex-basis: calc(100% / var(--nfb-carousel-number-of-cards));\n        width: calc(100% / var(--nfb-carousel-number-of-cards));\n        flex-shrink: 0;\n      }\n\n      ul {\n        list-style-type: none;\n        padding: 0;\n      }\n\n      .nfb-extras__layout {\n        display: flex;\n        flex-wrap: wrap;\n        gap: ${unsafeCSS(spacings.md)}\n      }\n    `\n  ]\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n  }\n\n  async connectedCallback (): Promise<void> {\n    super.connectedCallback()\n    this._unsuscribe = store.subscribe(this.stateChanged)\n    this.stateChanged()\n  }\n\n  stateChanged () {\n    if (this.extras === null && this.registryId) {\n      const { works } = store.getState()\n      const work = selectWorkById(works, this.registryId)\n      if (work) {\n        this.extras = []\n        this.parentSlug = work.slug\n        if (work.extras) {\n          Object.entries(work.extras).forEach(([type, value]) => {\n            if (value && this.allowedTypes.includes(type as StreamTypes)) {\n              this.extras?.push(...value)\n            }\n          })\n\n          // sort by published date: newer to older\n          this.extras.sort((a: ExtraCard, b: ExtraCard) => new Date(b.publish_date).valueOf() - new Date(a.publish_date).valueOf())\n        }\n\n        if (this.sectionSelector) {\n          // Extras section is hidden by default,\n          // show if extras have been found.\n          const extrasSection = document.querySelector(this.sectionSelector) as HTMLElement\n          if (extrasSection) {\n            extrasSection.dataset.uiShow = (!!this.extras.length).toString()\n          }\n        }\n\n        this._unsuscribe()\n      }\n    }\n  }\n\n  getIsInert (): boolean {\n    return (this.shadowRoot?.querySelector('nfb-carousel-card') as NFBCard)?.getIsInert()\n  }\n\n  getCardElement (): HTMLElement {\n    return (this.shadowRoot?.querySelector('nfb-carousel-card') as NFBCard) ?? false\n  }\n\n  getCommonGTMAttributes () {\n    return {\n      nfb_list_type: this.isCarousel ? GTM_LIST_TYPE.CAROUSEL : GTM_LIST_TYPE.LIST,\n      nfb_list_name: `extras for ${this.workTitle}`,\n      nfb_list_id: GTM_LIST_ID.EXTRAS,\n      nfb_list_category: GTM_LIST_CATEGORY.EXTRAS\n    }\n  }\n\n  getExtraCard (extra: ExtraCard, index: number) {\n    const gtmAttributes: GTMSelectWork = {\n      event: GTM_EVENTS.SELECT_WORK,\n      ...this.getCommonGTMAttributes(),\n      nfb_version_title: extra.title,\n      nfb_detail: (index + 1).toString()\n    }\n\n    return html`\n      <li \n        class=\"${classMap({ 'nfb-carousel__card': this.isCarousel, 'nfb-carousel__card--dark': this.isDark })}\"\n        id=\"extras-card-${index}\" data-index=\"${index}\"\n      >\n        <nfb-extra-card\n          data-ui-el=\"carousel-card\"\n          id=\"${`bonusCarousel_extra:${extra.content_type}:${extra.slug}`}\"\n          registry-id=\"${this.registryId}\"\n          parent-slug=\"${this.parentSlug}\"\n          slug=\"${extra.slug}\"\n          stream-type=\"${`${extra.content_type}s`}\"\n          is-dark=\"${this.isDark}\"\n          secondary-variant=\"${this.isDark ? 'no-border' : nothing}\"\n          card-type=\"${this.isCarousel ? 'carousel' : nothing}\"\n          gtm-attributes=\"${JSON.stringify(gtmAttributes)}\"\n          use-thumbnail-pattern=\"false\"\n        >\n        </nfb-extra-card> \n      </li>\n    `\n  }\n\n  render () {\n    if (!this.extras?.length) {\n      return nothing\n    }\n\n    if (this.isCarousel) {\n      return html`\n      <nfb-norman-carousel\n        id=\"extras-carousel\"\n        data-cy=\"extras-carousel\"\n        is-dark=\"true\"\n        gtm-attributes=\"${JSON.stringify(this.getCommonGTMAttributes())}\"\n      >\n        ${this.extras.map((e, index) => { return this.getExtraCard(e, index) })}\n      </nfb-carousel>\n      `\n    } else {\n      return html`\n        <ul class=\"nfb-extras__layout\">\n          ${this.extras.map((e, index) => { return this.getExtraCard(e, index) })}\n        </ul>\n      `\n    }\n  }\n}\n","import { LitElement, PropertyValues, html, nothing } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { handleFocusOnLastElementClicked } from '@src/js/helpers/page/common/display'\nimport { store } from '@src/js/redux/store'\nimport { WorkHistory, selectHistoryForParentWork, selectWorkHistoryById } from '@src/js/redux/workHistoryReducer'\nimport { PlayerUniqId, StreamTypes, setCurrentPlaying } from '@src/js/redux/playersReducer'\nimport { WorkPageState } from '@src/js/redux/workPageReducer'\nimport { FilmHistory, FilmHistoryState, selectFilmHistoryById } from '@src/js/redux/filmHistoryReducer'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { SeriesPageState, selectSeriesIsCompleted } from '@src/js/redux/seriesPageReducer'\n\nenum WatchButtonState {\n  'WATCH',\n  'CONTINUE',\n  'AGAIN'\n}\n\nconst WATCH_BUTTON_LABEL = {\n  [WatchButtonState.WATCH]: window.pgettext('Watch button', 'Watch now'),\n  [WatchButtonState.CONTINUE]: window.pgettext('Watch button', 'Continue watching'),\n  [WatchButtonState.AGAIN]: window.pgettext('Watch button', 'Watch again')\n}\n\n@customElement('nfb-watch-button')\nexport class NFBWatchButton extends LitElement {\n  @property({ type: Number, attribute: 'registry-id' })\n  registryId = 0\n\n  @property({ type: String, attribute: 'slug' })\n  slug = ''\n\n  @property({ type: String, attribute: 'stream-type' })\n  streamType: StreamTypes = 'films'\n\n  @property({ type: String, attribute: 'icon' })\n  icon: ''\n\n  @property({ type: String, attribute: 'film-title' })\n  filmTitle = ''\n\n  @property({ converter: stringToBooleanConverter, attribute: 'show-history-label' })\n  showHistoryLabel = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-primary' })\n  isPrimary = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark = true\n\n  @state()\n  state: WatchButtonState = WatchButtonState.WATCH\n\n  @state()\n  isPlayerLoading: boolean = false\n\n  @state()\n  _currentActiveClickElement: string|null\n\n  _playerUniqId: PlayerUniqId|null\n  _filmHistory: FilmHistory|undefined\n  _workHistoryList: WorkHistory[]|null\n  _workPageState: WorkPageState\n  _seriesPageState: SeriesPageState\n  _uniqueId: string|null\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n    this._uniqueId = 'watch-button-' + Date.now()\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    this._playerUniqId = {\n      registryId: this.registryId,\n      slug: this.slug,\n      streamType: this.streamType\n    }\n\n    store.subscribe(this.stateChanged)\n  }\n\n  protected willUpdate (_changedProperties: PropertyValues): void {\n    if (_changedProperties.has('registryId')) {\n      this._playerUniqId = {\n        registryId: this.registryId,\n        slug: this.slug,\n        streamType: this.streamType\n      }\n    }\n  }\n\n  protected updated (_changedProperties: PropertyValues): void {\n    if (_changedProperties.has('_currentActiveClickElement') && this._currentActiveClickElement) {\n      this.shadowRoot?.querySelector(`[data-ui-el=${this._currentActiveClickElement}]`)?.shadowRoot?.querySelector('button')?.focus({ preventScroll: true })\n    }\n  }\n\n  stateChanged (): void {\n    const state = store.getState()\n\n    this._workPageState = state.workPage\n    this._seriesPageState = state.seriesPage\n\n    // Work history\n    if (this.showHistoryLabel) {\n      if (this._seriesPageState.seriesRegistryId) {\n        this._workHistoryList = selectHistoryForParentWork(state.workHistory, this._seriesPageState.seriesRegistryId!)\n        this.updateStateForSeries()\n      } else {\n        this._filmHistory = selectFilmHistoryById(state.filmHistory, this.registryId)\n        this.updateStateForFilm()\n      }\n    }\n\n    // Is button player loading\n    if (JSON.stringify(state.players.currentPlaying) === JSON.stringify(this._playerUniqId) && this._workPageState.lastClickElement === this._uniqueId) {\n      this.isPlayerLoading = state.players.isLoading\n    } else {\n      this.isPlayerLoading = false\n    }\n\n    this._currentActiveClickElement = this._workPageState.currentActiveClickElement\n  }\n\n  updateStateForFilm () {\n    if (this._filmHistory && this._filmHistory.is_completed) {\n      this.state = WatchButtonState.AGAIN\n    } else if (this._filmHistory?.timecode && this._filmHistory.timecode > 0) {\n      this.state = WatchButtonState.CONTINUE\n    } else {\n      this.state = WatchButtonState.WATCH\n    }\n  }\n\n  updateStateForSeries () {\n    if (this._workHistoryList && this._workHistoryList.length > 0) {\n      const allCompleted = selectSeriesIsCompleted(this._seriesPageState)\n      if (allCompleted) {\n        this.state = WatchButtonState.AGAIN\n      } else {\n        this.state = WatchButtonState.CONTINUE\n      }\n    } else {\n      this.state = WatchButtonState.WATCH\n    }\n  }\n\n  async playAction () {\n    store.dispatch(setCurrentPlaying(this._playerUniqId))\n\n    handleFocusOnLastElementClicked(this._uniqueId, null)\n  }\n\n  render () {\n    const text = this.showHistoryLabel\n      ? WATCH_BUTTON_LABEL[this.state]\n      : this.filmTitle\n\n    const ariaLabel = this.showHistoryLabel\n      ? `${text} ${this.filmTitle}`\n      : `${WATCH_BUTTON_LABEL[WatchButtonState.WATCH]} ${this.filmTitle}`\n\n    return html`\n      <nfb-button\n        data-ui-el=\"${this._uniqueId}\"\n        @click=${this.playAction}\n        text=\"${text}\"\n        aria-label=\"${ariaLabel}\"\n        primary-variant=\"${this.isPrimary ? 'primary' : nothing}\"\n        icon-name=\"${this.icon ?? nothing}\"\n        is-dark=\"${this.isDark.toString()}\"\n        is-loading=\"${this.isPlayerLoading.toString()}\"\n      ></nfb-button>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-watch-button': NFBWatchButton\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-work-page-creator {\n  --nfb-work-page-creator-color: #000000;\n  --nfb-work-page-link-hover-color: #1C7A3E;\n  margin-bottom: 0.25rem;\n}\n\n.nfb-work-page-creator--clamped {\n  display: -webkit-box !important;\n  -webkit-line-clamp: 2;\n  -webkit-box-orient: vertical;\n  overflow: hidden !important;\n  word-break: normal !important;\n}\n\n.nfb-work-page-creator__separator {\n  font-size: 0.875rem;\n  font-weight: normal;\n}\n\n.nfb-work-page-creator__link {\n  text-decoration: none;\n  outline: none;\n}\n\n.nfb-work-page-creator__link:focus-visible {\n  text-decoration: underline;\n  color: var(--nfb-work-page-creator-color);\n}\n\n.nfb-work-page-creator__link--inactive {\n  pointer-events: none !important;\n  user-select: none !important;\n}\n\n.nfb-work-page-creator__link--inactive span {\n  color: #c0bfbe !important;\n}\n\n.nfb-work-page-creator__link span {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: #1c1b1b;\n  color: var(--nfb-work-page-creator-color);\n  text-decoration: none;\n}\n\n.nfb-work-page-creator__link span:hover {\n  color: var(--nfb-work-page-link-hover-color);\n}\n\n.nfb-work-page-creator--header {\n  --nfb-work-page-creator-color: var(--header-infos-color);\n  --nfb-work-page-link-hover-color: var(--nfb-work-page-creator-color);\n  margin-bottom: 0;\n}\n\n.nfb-work-page-creator--header .nfb-work-page-creator__link span {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n  color: var(--nfb-work-page-creator-color);\n}\n\n.nfb-work-page-creator--header .nfb-work-page-creator__link span:hover {\n  text-decoration: underline;\n}\n\n.nfb-work-page-creator--dark {\n  --nfb-work-page-creator-color: #FFFFFF;\n}\n\n.nfb-work-page-creator--dark:not(.nfb-work-page-creator--header) {\n  --nfb-work-page-link-hover-color: #05EE80;\n}`;\nexport default styles;\n","import { LitElement, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\nimport { classMap } from 'lit-html/directives/class-map.js'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBWorkPageCreator.sass?lit'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport normanPaths from '@src/js/helpers/paths'\n\nexport interface Creator {\n  first_name: string\n  last_name: string\n  slug: string\n}\n\n@customElement('nfb-work-page-creator')\nexport default class NFBWorkPageCreator extends LitElement {\n  @property({ type: Array })\n  creators: Creator[] | null = null\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-unavailable' })\n  isUnavailable = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-clamped' })\n  isClamped = true\n\n  @property({ type: String, attribute: 'variant' })\n  variant: 'header' | null = null\n\n  static styles = [styles]\n\n  renderDirectors () {\n    return this.creators?.map((c, index) => {\n      let suffix = ''\n      if (this.creators!.length > 1 && index !== this.creators!.length - 1) {\n        suffix = index === this.creators!.length - 2 ? ` ${window.gettext('&')}` : ', '\n      }\n\n      return html`\n        <span class=\"director\" itemscope itemtype=\"http://schema.org/Person\" data-cy=\"director\">\n          <a \n            class=\"nfb-work-page-creator__link ${this.isUnavailable ? 'nfb-work-page-creator__link--inactive' : ''}\"\n            href=\"${normanPaths.directors.replace('{slug}', c.slug)}\"\n            title=\"${window.gettext('More films by')} ${c.first_name} ${c.last_name}\"\n            itemprop=\"url\"\n            target=\"_parent\"\n          >\n            <span part=\"creator\" itemprop=\"director\" >${c.first_name} ${c.last_name}</span></a><span part=\"separator\" class=\"nfb-work-page-creator__separator\">${suffix}</span>\n        </span>\n      `\n    })\n  }\n\n  getClasses () {\n    let classes = {\n      'nfb-work-page-creator': true,\n      'nfb-work-page-creator--dark': this.isDark,\n      'nfb-work-page-creator--clamped': this.isClamped\n    }\n\n    if (this.variant) {\n      const variantClass = `nfb-work-page-creator--${this.variant}`\n      classes = {\n        [variantClass]: true,\n        ...classes\n      }\n    }\n\n    return classes\n  }\n\n  render () {\n    if (!this.creators) return\n\n    return html`\n      <div\n        class=\"${classMap(this.getClasses())}\"\n        part=\"container\"\n      >\n        ${this.renderDirectors()}\n      </div>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-work-page__header-description, ::slotted([slot=description]) {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #000;\n  color: var(--header-infos-color);\n  display: -webkit-box !important;\n  -webkit-line-clamp: 4;\n  -webkit-box-orient: vertical;\n  overflow: hidden !important;\n  word-break: normal !important;\n}`;\nexport default styles;\n","import { html } from 'lit'\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js'\nimport { customElement, property } from 'lit/decorators.js'\nimport { escapeText } from '@web-nfb/frontend-static/design-system/script/utils/string'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBWorkPageDescription.sass?lit'\n\nimport NFBWorkPageReactiveHeaderElement from './NFBWorkPageReactiveHeaderElement'\n\n@customElement('nfb-work-page-description')\nexport default class NFBWorkPageDescription extends NFBWorkPageReactiveHeaderElement {\n  @property({ type: String, attribute: 'text' })\n  text = ''\n\n  static styles = [styles]\n\n  render () {\n    return this.work\n      // this.work has been fetched from API: use this value\n      ? html`\n      <p\n        class=\"nfb-work-page__header-description\"\n        data-cy=\"work-page-header-description\"\n      >\n        ${unsafeHTML(escapeText(this.work.tagline ?? this.work.description))}\n      </p>  \n    `\n      // if not this.work, use server side generated slot (for SEO purposes)\n      : html`<slot name=\"description\"></slot>`\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-collapsable {\n  --nfb-collapsable-text-color: #000000;\n  --nfb-collapsable--hover-color: #1C7A3E;\n  width: 100%;\n  margin: 1.5rem 0;\n}\n\n.nfb-collapsable__item {\n  padding: 1.5rem 0;\n}\n\n.nfb-collapsable__item ~ .nfb-collapsable__item {\n  border-top: none;\n}\n\n.nfb-collapsable__item-title {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1.125rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n  display: flex;\n  gap: 8px;\n  align-items: center;\n  justify-content: center;\n  outline: none;\n  border-bottom: 4px solid rgba(0, 0, 0, 0);\n  color: var(--nfb-collapsable-text-color);\n}\n\n.nfb-collapsable__item-title:hover, .nfb-collapsable__item-title:focus-visible {\n  color: var(--nfb-collapsable--hover-color);\n}\n\n.nfb-collapsable__item-title:hover span, .nfb-collapsable__item-title:focus-visible span {\n  position: relative;\n  border-bottom-color: var(--nfb-collapsable--hover-color);\n}\n\n.nfb-collapsable__item-title:hover span::after, .nfb-collapsable__item-title:focus-visible span::after {\n  content: \"\";\n  display: block;\n  position: absolute;\n  left: 0;\n  width: 100%;\n  background: var(--nfb-collapsable--hover-color);\n}\n\n.nfb-collapsable__item-title:hover span::after {\n  bottom: -2px;\n  height: 2px;\n}\n\n.nfb-collapsable__item-title:focus-visible span::after {\n  bottom: -4px;\n  height: 4px;\n}\n\n.nfb-collapsable__item-title[aria-expanded=true] .nfb-icon {\n  transform: rotate(90deg);\n}\n\n.nfb-collapsable__item-title[aria-expanded=false] + .nfb-collapsable__item-content {\n  display: none;\n}\n\n.nfb-collapsable__item-content > * {\n  color: var(--nfb-collapsable-text-color);\n}\n\n.nfb-collapsable .nfb-icon {\n  justify-content: center;\n  align-items: center;\n  font-size: 1rem;\n}\n\n.nfb-collapsable.nfb-collapsable--dark {\n  --nfb-collapsable-text-color: #FFFFFF;\n  --nfb-collapsable--hover-color: #05EE80;\n}\n\n.nfb-icon {\n  font-family: \"balmoral-icons\" !important;\n  font-size: 1.125rem;\n  width: auto;\n  speak: never;\n  font-style: normal;\n  font-weight: normal;\n  font-variant: normal;\n  text-transform: none;\n  line-height: 1;\n  -webkit-font-smoothing: antialiased;\n  -moz-osx-font-smoothing: grayscale;\n}\n\n.icon-48h-rental:before {\n  content: \"\\\\e60b\";\n}\n\n.icon-4k:before {\n  content: \"\\\\e9ca\";\n}\n\n.icon-add:before {\n  content: \"\\\\e9bc\";\n}\n\n.icon-add-circle:before {\n  content: \"\\\\e918\";\n}\n\n.icon-add-o:before {\n  content: \"\\\\e955\";\n}\n\n.icon-airplay:before {\n  content: \"\\\\e97a\";\n}\n\n.icon-amazon:before {\n  content: \"\\\\ea87\";\n}\n\n.icon-android:before {\n  content: \"\\\\eac0\";\n}\n\n.icon-angry:before {\n  content: \"\\\\e9de\";\n}\n\n.icon-angry-o:before {\n  content: \"\\\\e9df\";\n}\n\n.icon-appleinc:before {\n  content: \"\\\\eabe\";\n}\n\n.icon-arrowhead:before {\n  content: \"\\\\e95d\";\n}\n\n.icon-arrowhead-down:before {\n  content: \"\\\\e9ce\";\n}\n\n.icon-arrowhead-left:before {\n  content: \"\\\\e9cf\";\n}\n\n.icon-arrowhead-up:before {\n  content: \"\\\\e9d0\";\n}\n\n.icon-audio-subtitles-f:before {\n  content: \"\\\\e99d\";\n}\n\n.icon-audio-subtitles-o:before {\n  content: \"\\\\e99e\";\n}\n\n.icon-avatar:before {\n  content: \"\\\\e60c\";\n}\n\n.icon-bluesky:before {\n  content: \"\\\\e9da\";\n}\n\n.icon-bold:before {\n  content: \"\\\\e969\";\n}\n\n.icon-bulb:before {\n  content: \"\\\\e99c\";\n}\n\n.icon-burger-menu:before {\n  content: \"\\\\e9cb\";\n}\n\n.icon-calendar-add-o:before {\n  content: \"\\\\e968\";\n}\n\n.icon-calendar-day:before {\n  content: \"\\\\e93a\";\n}\n\n.icon-calendar-day-o:before {\n  content: \"\\\\e937\";\n}\n\n.icon-calendar-month:before {\n  content: \"\\\\e93c\";\n}\n\n.icon-calendar-month-o:before {\n  content: \"\\\\e939\";\n}\n\n.icon-card-layout:before {\n  content: \"\\\\e976\";\n}\n\n.icon-cart-f:before {\n  content: \"\\\\e9a3\";\n}\n\n.icon-cart-o:before {\n  content: \"\\\\e967\";\n}\n\n.icon-cash:before {\n  content: \"\\\\e608\";\n}\n\n.icon-cash-o:before {\n  content: \"\\\\e61d\";\n}\n\n.icon-cast:before {\n  content: \"\\\\e97b\";\n}\n\n.icon-cast-on:before {\n  content: \"\\\\e981\";\n}\n\n.icon-categories:before {\n  content: \"\\\\e9d8\";\n}\n\n.icon-categories-f:before {\n  content: \"\\\\e9d9\";\n}\n\n.icon-cc:before {\n  content: \"\\\\e9bd\";\n}\n\n.icon-cc-en:before {\n  content: \"\\\\e602\";\n}\n\n.icon-cc-en-o:before {\n  content: \"\\\\e958\";\n}\n\n.icon-cc-fr:before {\n  content: \"\\\\e61a\";\n}\n\n.icon-cc-fr-o:before {\n  content: \"\\\\e956\";\n}\n\n.icon-cc-o:before {\n  content: \"\\\\e9be\";\n}\n\n.icon-cd:before {\n  content: \"\\\\e609\";\n}\n\n.icon-channel-animation-f:before {\n  content: \"\\\\e94f\";\n}\n\n.icon-channel-animation-o:before {\n  content: \"\\\\e98b\";\n}\n\n.icon-channel-doc-f:before {\n  content: \"\\\\e98c\";\n}\n\n.icon-channel-doc-o:before {\n  content: \"\\\\e98d\";\n}\n\n.icon-channel-f:before {\n  content: \"\\\\e98e\";\n}\n\n.icon-channel-o:before {\n  content: \"\\\\e98f\";\n}\n\n.icon-chat-f:before {\n  content: \"\\\\e9a4\";\n}\n\n.icon-chat-o:before {\n  content: \"\\\\e953\";\n}\n\n.icon-check-box-o:before {\n  content: \"\\\\e972\";\n}\n\n.icon-check-circle:before {\n  content: \"\\\\e919\";\n}\n\n.icon-check-mark:before {\n  content: \"\\\\e971\";\n}\n\n.icon-check-o:before {\n  content: \"\\\\e954\";\n}\n\n.icon-chevron-down:before {\n  content: \"\\\\e95b\";\n}\n\n.icon-chevron-left:before {\n  content: \"\\\\e945\";\n}\n\n.icon-chevron-right:before {\n  content: \"\\\\e95c\";\n}\n\n.icon-chevron-up:before {\n  content: \"\\\\e95a\";\n}\n\n.icon-circle-fat:before {\n  content: \"\\\\e923\";\n}\n\n.icon-ciseaux:before {\n  content: \"\\\\e620\";\n}\n\n.icon-clock:before {\n  content: \"\\\\e60d\";\n}\n\n.icon-closeNav:before {\n  content: \"\\\\e600\";\n}\n\n.icon-collapse-down:before {\n  content: \"\\\\e914\";\n}\n\n.icon-collapse-up:before {\n  content: \"\\\\e916\";\n}\n\n.icon-collection:before {\n  content: \"\\\\e95f\";\n}\n\n.icon-compact-layout:before {\n  content: \"\\\\e975\";\n}\n\n.icon-compact-list:before {\n  content: \"\\\\e998\";\n}\n\n.icon-credit-card:before {\n  content: \"\\\\e628\";\n}\n\n.icon-credit-card-o:before {\n  content: \"\\\\e95e\";\n}\n\n.icon-ctrl-no-play:before {\n  content: \"\\\\e996\";\n}\n\n.icon-ctrl-pause:before {\n  content: \"\\\\e959\";\n}\n\n.icon-ctrl-play:before {\n  content: \"\\\\e94a\";\n}\n\n.icon-ctrl-skip-back:before {\n  content: \"\\\\e944\";\n}\n\n.icon-ctrl-skip-forward:before {\n  content: \"\\\\e942\";\n}\n\n.icon-ctrl-stop:before {\n  content: \"\\\\e949\";\n}\n\n.icon-delete:before {\n  content: \"\\\\e9c7\";\n}\n\n.icon-delete-circle:before {\n  content: \"\\\\e905\";\n}\n\n.icon-delete-o:before {\n  content: \"\\\\e950\";\n}\n\n.icon-desactivation:before {\n  content: \"\\\\e629\";\n}\n\n.icon-detailed-layout:before {\n  content: \"\\\\e974\";\n}\n\n.icon-discord:before {\n  content: \"\\\\e9db\";\n}\n\n.icon-dolby:before {\n  content: \"\\\\e9bb\";\n}\n\n.icon-down:before {\n  content: \"\\\\e928\";\n}\n\n.icon-down-circle:before {\n  content: \"\\\\e9bf\";\n}\n\n.icon-down-circle-o:before {\n  content: \"\\\\e9c0\";\n}\n\n.icon-download:before {\n  content: \"\\\\e93f\";\n}\n\n.icon-dto-circle:before {\n  content: \"\\\\e94e\";\n}\n\n.icon-dto-disk:before {\n  content: \"\\\\e621\";\n}\n\n.icon-dto-o:before {\n  content: \"\\\\e606\";\n}\n\n.icon-duplicate-lesson:before {\n  content: \"\\\\e922\";\n}\n\n.icon-dv:before {\n  content: \"\\\\e906\";\n}\n\n.icon-dv-o:before {\n  content: \"\\\\e903\";\n}\n\n.icon-dvd-o:before {\n  content: \"\\\\e982\";\n}\n\n.icon-edit:before {\n  content: \"\\\\e902\";\n}\n\n.icon-edit-cicle-o:before {\n  content: \"\\\\e952\";\n}\n\n.icon-edit-circle:before {\n  content: \"\\\\e907\";\n}\n\n.icon-edit-o:before {\n  content: \"\\\\e979\";\n}\n\n.icon-edu-institutions-business:before {\n  content: \"\\\\e90e\";\n}\n\n.icon-embed:before {\n  content: \"\\\\e983\";\n}\n\n.icon-enlarge:before {\n  content: \"\\\\e989\";\n}\n\n.icon-enveloppe-0:before {\n  content: \"\\\\e951\";\n}\n\n.icon-enveloppe-o:before {\n  content: \"\\\\e951\";\n}\n\n.icon-enveloppe-f:before {\n  content: \"\\\\e9a5\";\n}\n\n.icon-external:before {\n  content: \"\\\\e935\";\n}\n\n.icon-external-link:before {\n  content: \"\\\\e61c\";\n}\n\n.icon-eye:before {\n  content: \"\\\\e931\";\n}\n\n.icon-eye-blocked:before {\n  content: \"\\\\e92e\";\n}\n\n.icon-facebook:before {\n  content: \"\\\\f09a\";\n}\n\n.icon-facture:before {\n  content: \"\\\\e61b\";\n}\n\n.icon-filter-o:before {\n  content: \"\\\\e973\";\n}\n\n.icon-flag-o:before {\n  content: \"\\\\e999\";\n}\n\n.icon-gallery:before {\n  content: \"\\\\e619\";\n}\n\n.icon-globe-f:before {\n  content: \"\\\\e9a6\";\n}\n\n.icon-globe-o:before {\n  content: \"\\\\e9a7\";\n}\n\n.icon-google-classroom:before {\n  content: \"\\\\e9cc\";\n}\n\n.icon-google-play:before {\n  content: \"\\\\e9a0\";\n}\n\n.icon-happy:before {\n  content: \"\\\\e9e0\";\n}\n\n.icon-happy-o:before {\n  content: \"\\\\e9e1\";\n}\n\n.icon-help-circle:before {\n  content: \"\\\\e94d\";\n}\n\n.icon-help-o:before {\n  content: \"\\\\e94c\";\n}\n\n.icon-helpcenter:before {\n  content: \"\\\\e60a\";\n}\n\n.icon-home-f:before {\n  content: \"\\\\e990\";\n}\n\n.icon-home-o:before {\n  content: \"\\\\e94b\";\n}\n\n.icon-hourglass-end-o:before {\n  content: \"\\\\e97d\";\n}\n\n.icon-hourglass-o:before {\n  content: \"\\\\e97e\";\n}\n\n.icon-hourglass-start-o:before {\n  content: \"\\\\e97c\";\n}\n\n.icon-info-o:before {\n  content: \"\\\\e917\";\n}\n\n.icon-instagram:before {\n  content: \"\\\\ea92\";\n}\n\n.icon-institutions:before {\n  content: \"\\\\e90d\";\n}\n\n.icon-interactif-hand:before {\n  content: \"\\\\e90f\";\n}\n\n.icon-interactif-hand-f:before {\n  content: \"\\\\e991\";\n}\n\n.icon-interactif-hand-o:before {\n  content: \"\\\\e963\";\n}\n\n.icon-interactive-app:before {\n  content: \"\\\\e909\";\n}\n\n.icon-interactive-code:before {\n  content: \"\\\\e960\";\n}\n\n.icon-interactive-play:before {\n  content: \"\\\\e96e\";\n}\n\n.icon-ip-access:before {\n  content: \"\\\\e908\";\n}\n\n.icon-italic:before {\n  content: \"\\\\e96a\";\n}\n\n.icon-learning-bundles:before {\n  content: \"\\\\e90a\";\n}\n\n.icon-left-arrow:before {\n  content: \"\\\\e913\";\n}\n\n.icon-left-circle:before {\n  content: \"\\\\e9c1\";\n}\n\n.icon-left-circle-o:before {\n  content: \"\\\\e9c2\";\n}\n\n.icon-lesson:before {\n  content: \"\\\\e932\";\n}\n\n.icon-link:before {\n  content: \"\\\\e941\";\n}\n\n.icon-linkdin:before {\n  content: \"\\\\e966\";\n}\n\n.icon-lock-o:before {\n  content: \"\\\\e9af\";\n}\n\n.icon-logout:before {\n  content: \"\\\\e9dc\";\n}\n\n.icon-loupe:before {\n  content: \"\\\\e616\";\n}\n\n.icon-loupe-f:before {\n  content: \"\\\\e98a\";\n}\n\n.icon-map-marker:before {\n  content: \"\\\\e93b\";\n}\n\n.icon-map-marker-o:before {\n  content: \"\\\\e980\";\n}\n\n.icon-marc-ip:before {\n  content: \"\\\\e91e\";\n}\n\n.icon-marc-records:before {\n  content: \"\\\\e915\";\n}\n\n.icon-marker:before {\n  content: \"\\\\e91c\";\n}\n\n.icon-marker-plain:before {\n  content: \"\\\\e927\";\n}\n\n.icon-mastodon:before {\n  content: \"\\\\e9a1\";\n}\n\n.icon-maximize:before {\n  content: \"\\\\e92c\";\n}\n\n.icon-media_school:before {\n  content: \"\\\\e90b\";\n}\n\n.icon-meta:before {\n  content: \"\\\\e99f\";\n}\n\n.icon-metre-o:before {\n  content: \"\\\\e99a\";\n}\n\n.icon-minimize:before {\n  content: \"\\\\e92d\";\n}\n\n.icon-more-menu-horiz:before {\n  content: \"\\\\e934\";\n}\n\n.icon-more-menu-vert:before {\n  content: \"\\\\e933\";\n}\n\n.icon-move:before {\n  content: \"\\\\e924\";\n}\n\n.icon-move-horizontal:before {\n  content: \"\\\\e925\";\n}\n\n.icon-move-marker:before {\n  content: \"\\\\e930\";\n}\n\n.icon-move-vertical:before {\n  content: \"\\\\e926\";\n}\n\n.icon-ms-teams:before {\n  content: \"\\\\e9cd\";\n}\n\n.icon-mute:before {\n  content: \"\\\\e92a\";\n}\n\n.icon-neutral:before {\n  content: \"\\\\e9e2\";\n}\n\n.icon-neutral-o:before {\n  content: \"\\\\e9e3\";\n}\n\n.icon-newsletter-o:before {\n  content: \"\\\\e947\";\n}\n\n.icon-next:before {\n  content: \"\\\\e615\";\n}\n\n.icon-nfb-classic-logo:before {\n  content: \"\\\\e9d1\";\n}\n\n.icon-nfb-classic-logo-adj:before {\n  content: \"\\\\e9d2\";\n}\n\n.icon-nfb-onf-logo:before {\n  content: \"\\\\e901\";\n}\n\n.icon-nfb-sq:before {\n  content: \"\\\\e948\";\n}\n\n.icon-no-picture:before {\n  content: \"\\\\e994\";\n}\n\n.icon-no-play-o:before {\n  content: \"\\\\e995\";\n}\n\n.icon-notification:before {\n  content: \"\\\\e961\";\n}\n\n.icon-notification-f:before {\n  content: \"\\\\e9a8\";\n}\n\n.icon-o-list:before {\n  content: \"\\\\e96b\";\n}\n\n.icon-ocean_school:before {\n  content: \"\\\\e93d\";\n}\n\n.icon-oculus:before {\n  content: \"\\\\e936\";\n}\n\n.icon-pause-circle:before {\n  content: \"\\\\e921\";\n}\n\n.icon-phone-circle:before {\n  content: \"\\\\e607\";\n}\n\n.icon-phone-o:before {\n  content: \"\\\\e965\";\n}\n\n.icon-picture:before {\n  content: \"\\\\e91a\";\n}\n\n.icon-pinterest:before {\n  content: \"\\\\e962\";\n}\n\n.icon-play:before {\n  content: \"\\\\e613\";\n}\n\n.icon-play-o:before {\n  content: \"\\\\e605\";\n}\n\n.icon-play-only:before {\n  content: \"\\\\e90c\";\n}\n\n.icon-playlist:before {\n  content: \"\\\\e910\";\n}\n\n.icon-pop-in-o:before {\n  content: \"\\\\e984\";\n}\n\n.icon-pop-out-o:before {\n  content: \"\\\\e985\";\n}\n\n.icon-prev:before {\n  content: \"\\\\e614\";\n}\n\n.icon-rating-14plus:before {\n  content: \"\\\\e9b6\";\n}\n\n.icon-rating-14plus-o:before {\n  content: \"\\\\e9b1\";\n}\n\n.icon-rating-18plus:before {\n  content: \"\\\\e9b7\";\n}\n\n.icon-rating-18plus-o:before {\n  content: \"\\\\e9ba\";\n}\n\n.icon-rating-exempt:before {\n  content: \"\\\\e9b3\";\n}\n\n.icon-rating-exempt-o:before {\n  content: \"\\\\e9b2\";\n}\n\n.icon-rating-g:before {\n  content: \"\\\\e9b4\";\n}\n\n.icon-rating-g-o:before {\n  content: \"\\\\e9b8\";\n}\n\n.icon-rating-pg:before {\n  content: \"\\\\e9b5\";\n}\n\n.icon-rating-pg-o:before {\n  content: \"\\\\e9b9\";\n}\n\n.icon-re-order:before {\n  content: \"\\\\e91d\";\n}\n\n.icon-reddit:before {\n  content: \"\\\\e9a9\";\n}\n\n.icon-reduce:before {\n  content: \"\\\\e946\";\n}\n\n.icon-replay:before {\n  content: \"\\\\e987\";\n}\n\n.icon-revert:before {\n  content: \"\\\\e904\";\n}\n\n.icon-right-arrow:before {\n  content: \"\\\\e912\";\n}\n\n.icon-right-circle:before {\n  content: \"\\\\e9c3\";\n}\n\n.icon-right-circle-o:before {\n  content: \"\\\\e9c4\";\n}\n\n.icon-roundedArrow:before {\n  content: \"\\\\e612\";\n}\n\n.icon-sad:before {\n  content: \"\\\\e9e4\";\n}\n\n.icon-sad-o:before {\n  content: \"\\\\e9e5\";\n}\n\n.icon-settings:before {\n  content: \"\\\\e943\";\n}\n\n.icon-settings-f:before {\n  content: \"\\\\e992\";\n}\n\n.icon-share:before {\n  content: \"\\\\e92f\";\n}\n\n.icon-share-lesson:before {\n  content: \"\\\\e91b\";\n}\n\n.icon-share-o:before {\n  content: \"\\\\e940\";\n}\n\n.icon-share2:before {\n  content: \"\\\\e611\";\n}\n\n.icon-shield-o:before {\n  content: \"\\\\e977\";\n}\n\n.icon-skip:before {\n  content: \"\\\\e988\";\n}\n\n.icon-skip-back:before {\n  content: \"\\\\e91f\";\n}\n\n.icon-skip-forward:before {\n  content: \"\\\\e920\";\n}\n\n.icon-smile:before {\n  content: \"\\\\e9e6\";\n}\n\n.icon-smile-o:before {\n  content: \"\\\\e9e7\";\n}\n\n.icon-spark:before {\n  content: \"\\\\e993\";\n}\n\n.icon-star-f:before {\n  content: \"\\\\e9aa\";\n}\n\n.icon-star-o:before {\n  content: \"\\\\e97f\";\n}\n\n.icon-stc:before {\n  content: \"\\\\e9c8\";\n}\n\n.icon-stc-o:before {\n  content: \"\\\\e9c9\";\n}\n\n.icon-steam:before {\n  content: \"\\\\eaac\";\n}\n\n.icon-study-guides-o:before {\n  content: \"\\\\e964\";\n}\n\n.icon-subtitle-f:before {\n  content: \"\\\\e997\";\n}\n\n.icon-subtitle-o:before {\n  content: \"\\\\e986\";\n}\n\n.icon-switch:before {\n  content: \"\\\\e900\";\n}\n\n.icon-sync:before {\n  content: \"\\\\e9d3\";\n}\n\n.icon-thumb-up:before {\n  content: \"\\\\e9d4\";\n}\n\n.icon-thumb-up-o:before {\n  content: \"\\\\e9d5\";\n}\n\n.icon-tiktok:before {\n  content: \"\\\\e99b\";\n}\n\n.icon-top-right-arrow:before {\n  content: \"\\\\e9dd\";\n}\n\n.icon-trailer-f:before {\n  content: \"\\\\e9ab\";\n}\n\n.icon-trailer-o:before {\n  content: \"\\\\e9ac\";\n}\n\n.icon-trash-o:before {\n  content: \"\\\\e978\";\n}\n\n.icon-twitter:before {\n  content: \"\\\\f099\";\n}\n\n.icon-twitter-x:before {\n  content: \"\\\\e9a2\";\n}\n\n.icon-u-list:before {\n  content: \"\\\\e96c\";\n}\n\n.icon-underline:before {\n  content: \"\\\\e96d\";\n}\n\n.icon-unlink:before {\n  content: \"\\\\f127\";\n}\n\n.icon-up:before {\n  content: \"\\\\e929\";\n}\n\n.icon-up-circle:before {\n  content: \"\\\\e9c5\";\n}\n\n.icon-up-circle-o:before {\n  content: \"\\\\e9c6\";\n}\n\n.icon-upload:before {\n  content: \"\\\\e9b0\";\n}\n\n.icon-user-f:before {\n  content: \"\\\\e9ad\";\n}\n\n.icon-user-o:before {\n  content: \"\\\\e9ae\";\n}\n\n.icon-user-settings-f:before {\n  content: \"\\\\e9d6\";\n}\n\n.icon-user-settings-o:before {\n  content: \"\\\\e9d7\";\n}\n\n.icon-video-camera:before {\n  content: \"\\\\e938\";\n}\n\n.icon-vimeo:before {\n  content: \"\\\\e60e\";\n}\n\n.icon-virtual-class:before {\n  content: \"\\\\e911\";\n}\n\n.icon-viveport:before {\n  content: \"\\\\e93e\";\n}\n\n.icon-vod:before {\n  content: \"\\\\e604\";\n}\n\n.icon-vod-o:before {\n  content: \"\\\\e601\";\n}\n\n.icon-vod-tilt:before {\n  content: \"\\\\e60f\";\n}\n\n.icon-vod-tilt-o:before {\n  content: \"\\\\e617\";\n}\n\n.icon-volume:before {\n  content: \"\\\\e92b\";\n}\n\n.icon-warning:before {\n  content: \"\\\\e61e\";\n}\n\n.icon-warning-o:before {\n  content: \"\\\\e957\";\n}\n\n.icon-web-recorder:before {\n  content: \"\\\\e970\";\n}\n\n.icon-web-recorder-circle:before {\n  content: \"\\\\e96f\";\n}\n\n.icon-windows:before {\n  content: \"\\\\eac1\";\n}\n\n.icon-youtube:before {\n  content: \"\\\\e61f\";\n}\n\n.nfb-work-page__small-title {\n  display: flex;\n  align-items: center;\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n  margin-bottom: 1rem;\n  color: var(--nfb-collapsable-text-color);\n}\n\n.nfb-work-page__small-title:not(:first-of-type) {\n  margin-top: 1rem;\n}\n\n.nfb-work-page__small-title .nfb-icon {\n  margin-right: 0.5rem;\n}\n\n.nfb-work-page__link {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n  color: #05ee80;\n  text-decoration: none;\n}\n\n.nfb-work-page__link:hover, .nfb-work-page__link:focus-visible {\n  color: #05ee80;\n  text-decoration: underline;\n}\n\n.nfb-work-page__link:focus-visible {\n  outline: 0;\n}\n\n.nfb-collapsable__item {\n  border: none;\n  padding: 0;\n}\n\n.nfb-collapsable__item-content {\n  display: flex;\n  flex-direction: column;\n  gap: 0.5rem;\n}\n\n.nfb-collapsable__spinner-container {\n  min-height: 100px;\n  position: relative;\n}\n\nbutton {\n  cursor: pointer;\n  box-shadow: none;\n  background: none;\n  border: none;\n  padding: 0;\n  margin: 0;\n}`;\nexport default styles;\n","import { customElement, property, queryAll, state } from 'lit/decorators.js'\nimport { LitElement, html } from 'lit'\nimport { store } from '@src/js/redux/store'\n\nimport { WorkCard } from '@src/js/redux/worksReducer'\nimport { fetchVersionList } from '@src/js/redux/workPageReducer'\nimport { getPlatformLanguageCode } from '@src/js/helpers/language'\nimport { handleUrl } from '@src/js/helpers/element/card'\nimport { GTMLangSwitch } from '@src/js/types/GTM'\nimport { GTM_EVENTS, GTM_LANG_CONTENT_TYPE } from '@src/js/constants'\n\n// @ts-expect-error Lit Sass import\nimport versionCollapsableStyle from '@src/sass/wc/NFBWorkPageDetailsVersionList.sass?lit'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\nimport CollapsableManager from '@web-nfb/frontend-static/design-system/script/elements/CollapsableManager'\n\n@customElement('nfb-work-page-details-version-list')\nexport default class NFBWorkPageDetailsVersions extends LitElement {\n  @property({ type: Number, attribute: 'expression-id' })\n  expressionId: number\n\n  @property({ type: Number, attribute: 'registry-id' })\n  registryId: number\n\n  @property({ type: String, attribute: 'collapsable-title' })\n  collapsableTitle: string|null = null\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark: boolean = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-expanded' })\n  isExpanded: boolean = false\n\n  @queryAll('[data-ui-el=\"nfb-collapsable-item-trigger\"]')\n  _nfbCollapsableElement!: NodeListOf<HTMLElement>\n\n  static styles = [versionCollapsableStyle]\n\n  collapsableManager: CollapsableManager | undefined\n\n  @state()\n  versionList: WorkCard[] | null = null\n\n  @state()\n  isLoaded: boolean = false\n\n  disconnectedCallback (): void {\n    super.disconnectedCallback()\n  }\n\n  async connectedCallback (): Promise<void> {\n    super.connectedCallback()\n    await store.dispatch(fetchVersionList({ expression_id: this.expressionId, id: this.registryId }))\n    this.versionList = store.getState().workPage.versionList!\n    await this.updateComplete\n    this.isLoaded = true\n    this.collapsableManager = new CollapsableManager({ collapsableElements: this._nfbCollapsableElement })\n  }\n\n  versionLinkClick (version: WorkCard): void {\n    window.dataLayer = window.dataLayer || []\n    const data: GTMLangSwitch = {\n      event: GTM_EVENTS.LANG_SWITCH,\n      nfb_interface_lang: getPlatformLanguageCode(),\n      nfb_cataloging_lang: version.cataloging_language,\n      content_type: GTM_LANG_CONTENT_TYPE.INTERFACE\n    }\n    window.dataLayer?.push(data)\n  }\n\n  render () {\n    if (!this.isLoaded && !this.versionList) {\n      return html`\n      <div class=\"nfb-collapsable__spinner-container\">\n        <nfb-spinner\n          is-dark=\"${this.isDark}\"\n          is-loading=\"true\"\n        ></nfb-spinner>\n      </div>`\n    }\n    if (this.versionList && this.versionList?.length > 0) {\n      return html`\n      <div class=\"nfb-collapsable nfb-collapsable--dark\">\n        <div class=\"nfb-collapsable__item\">\n          <button\n            class=\"nfb-collapsable__item-title nfb-work-page__small-title\"\n            id=\"links-collapsable-title\"\n            data-ui-el=\"nfb-collapsable-item-trigger\"\n            aria-expanded=\"${this.isExpanded}\"\n            aria-controls=\"links-collapsable\"\n          >\n            <i class=\"nfb-icon icon-arrowhead\" aria-hidden=\"true\"></i>\n            <span>${this.collapsableTitle}</span>\n          </button>\n          <div\n            class=\"nfb-collapsable__item-content\"\n            id=\"links-collapsable\"\n            aria-labelledby=\"links-collapsable-title\"\n          >\n          ${this.versionList.map((version) => {\n          return html`\n            <div class=\"nfb-work-page__external-link\">\n              <a\n                class=\"nfb-work-page__link\"\n                href=\"${handleUrl(version)}\"\n                @click=\"${() => this.versionLinkClick(version)}\"\n              >\n                ${version.title}\n              </a>\n            </div>`\n          })}\n          </div>  \n        </div>\n      </div>`\n    }\n  }\n}\n","import { customElement, property } from 'lit/decorators.js'\nimport { html } from 'lit'\nimport NFBWorkPageReactiveHeaderElement from './NFBWorkPageReactiveHeaderElement'\n\n@customElement('nfb-work-page-header-creator')\nexport default class NFBWorkPageHeaderCreator extends NFBWorkPageReactiveHeaderElement {\n  @property({ type: String, attribute: 'creators' })\n  initialCreators: string | null = null\n\n  getCreators () {\n    let creators\n    const work = this.getRelatedWork()\n\n    if (!work) {\n      creators = this.initialCreators\n      if (!creators) return\n    } else {\n      creators = JSON.stringify(work.directors)\n    }\n\n    return creators\n  }\n\n  render () {\n    return html`\n      <nfb-work-page-creator\n        creators=\"${this.getCreators()}\"\n        variant=\"header\"\n        is-dark=\"true\"\n        is-clamped=\"false\"\n      >\n      </nfb-work-page-creator>\n    `\n  }\n}\n","import { customElement, property } from 'lit/decorators.js'\nimport NFBWorkPageReactiveHeaderElement from './NFBWorkPageReactiveHeaderElement'\nimport { html } from 'lit'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\n@customElement('nfb-work-page-header-image')\nexport default class NFBWorkPageHeaderImage extends NFBWorkPageReactiveHeaderElement {\n  @property({ type: String, attribute: 'thumbnail-pattern' })\n  thumbnailPattern = ''\n\n  @property({ type: String, attribute: 'default-thumbnail-pattern' })\n  defaultThumbnailPattern = ''\n\n  @property({ type: String, attribute: 'default-thumbnail' })\n  defaultThumbnail = ''\n\n  @property({ type: String, attribute: 'thumbnail-square' })\n  initialThumbnailSquare = ''\n\n  @property({ type: String, attribute: 'thumbnail' })\n  initialThumbnail = ''\n\n  @property({ type: String, attribute: 'title' })\n  initialTitle = ''\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-unavailable' })\n  initialIsUnavailable = false\n\n  render () {\n    let thumbnailSquare: string | null = this.initialThumbnailSquare\n    let thumbnail = this.initialThumbnail\n    let unavailable = this.initialIsUnavailable\n    let title = this.initialTitle\n\n    const work = this.getRelatedWork()\n    if (work) {\n      thumbnailSquare = work.story_art_square ?? work.key_art_square ?? null\n      thumbnail = work.story_art_horizontal ?? work.thumbnail\n      title = work.title\n      unavailable = false\n    }\n\n    return html`\n      <nfb-work-page-image\n        thumbnail-pattern=\"${thumbnail ? this.thumbnailPattern : this.defaultThumbnailPattern}\"\n        thumbnail-square=\"${thumbnailSquare}\"\n        thumbnail=\"${thumbnail}\"\n        default-thumbnail=\"${this.defaultThumbnail}\"\n        title=\"${title}\"\n        is-unavailable=\"${unavailable}\"\n      >\n      </nfb-work-page-image>\n    `\n  }\n}\n","import { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { LanguageVariant } from '@web-nfb/frontend-static/design-system/wc/legend/legendIcons/NFBLegendIcons'\nimport { html, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport NFBWorkPageReactiveHeaderElement from './NFBWorkPageReactiveHeaderElement'\nimport { WorkCard } from '@src/js/redux/worksReducer'\nimport { formatComingSoonDate, formatGenreInfo } from '@src/js/helpers/format'\n\n@customElement('nfb-work-page-header-legend')\nexport default class NFBWorkPageHeaderLegend extends NFBWorkPageReactiveHeaderElement {\n  @property({ converter: stringToBooleanConverter, attribute: 'is-cc' })\n  initialIsCC = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dv' })\n  initialIsDV = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-leaving-soon' })\n  initialIsLeavingSoon = false\n\n  @property({ type: String, attribute: 'coming-soon-date' })\n  initialComingSoonDate: string = ''\n\n  @property({ type: String, attribute: 'year' })\n  initialYear = ''\n\n  @property({ type: String, attribute: 'running-time' })\n  initialRunningTime = ''\n\n  @property({ type: String, attribute: 'rating' })\n  initialRating = ''\n\n  @property({ type: String, attribute: 'language' })\n  language = LanguageVariant.en\n\n  @property({ type: String, attribute: 'genres' })\n  genres = ''\n\n  getLeavingSoon (work: WorkCard | null, initialValue: boolean) {\n    const isLeavingSoon = !work ? initialValue : work.leaving_soon\n    if (!isLeavingSoon) return nothing\n\n    return html`\n      <nfb-pill\n        data-cy=\"leaving-soon\"\n        is-dark=\"true\"\n        text=\"${window.gettext('Leaving soon')}\"\n      ></nfb-pill>\n    `\n  }\n\n  getComingSoonDate (work: WorkCard | null, initialValue: string) {\n    let comingSoonDate: string | null = null\n\n    if (!work) {\n      comingSoonDate = initialValue\n    } else if (work?.coming_soon) {\n      const formattedWorkComingSoon = formatComingSoonDate(work.coming_soon)\n      if (formattedWorkComingSoon) {\n        comingSoonDate = formattedWorkComingSoon\n      }\n    }\n\n    if (!comingSoonDate) {\n      return nothing\n    }\n\n    return html`\n      <nfb-pill\n        data-cy=\"coming-soon\"\n        is-dark=\"true\"\n        text=\"${window.pgettext('Coming soon date', 'Coming')}&nbsp;${comingSoonDate}\"\n      ></nfb-pill>\n    `\n  }\n\n  render () {\n    const work = this.getRelatedWork()\n\n    return html`\n      <div class=\"nfb-work-page-header-legend\">\n        <nfb-work-page-legend\n          class=\"nfb-work-page-legend\"\n          year=\"${(work ? work.year : this.initialYear) ?? nothing}\"\n          running-time=\"${(work ? work.duration : this.initialRunningTime) ?? nothing}\"\n          is-cc=\"${(work ? work.cc : this.initialIsCC) ?? nothing}\"\n          is-dv=\"${(work ? work?.dv : this.initialIsDV) ?? nothing}\"\n          rating=\"${(work ? (work?.rating ? `${work.rating.toLowerCase()}-o` : nothing) : this.initialRating) ?? nothing}\"\n          language=\"${this.language}\"\n          genre=${(work && work?.genres ? formatGenreInfo(work?.genres) : this.genres) ?? nothing}\n        >\n          ${this.getLeavingSoon(work, this.initialIsLeavingSoon)}\n          ${this.getComingSoonDate(work, this.initialComingSoonDate)}\n        </nfb-work-page-legend>\n      </div>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-work-page__header-login {\n  --header-infos-color: #F5F4F4;\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n  color: var(--header-infos-color);\n  line-height: 1.2;\n}\n\n.nfb-work-page__header-login a {\n  color: var(--header-infos-color);\n  text-decoration-line: underline;\n}\n\n.nfb-work-page__header-login a:focus-visible {\n  color: #05ee80;\n}\n\n.nfb-work-page__header-login a:hover {\n  color: #05ee80;\n  text-decoration-color: #05ee80;\n}`;\nexport default styles;\n","import { LitElement, html } from 'lit'\nimport { unsafeHTML } from 'lit-html/directives/unsafe-html.js'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { store } from '@src/js/redux/store'\nimport { selectHistoryForParentWork } from '@src/js/redux/workHistoryReducer'\nimport { selectFilmHistoryById } from '@src/js/redux/filmHistoryReducer'\n\nimport { GTMTieInPromo, GTMABGroupView, GTMABGroupClick } from '@src/js/types/GTM'\nimport { GTM_EVENTS, GTM_TIE_IN_DETAIL, GTM_AB_GROUP } from '@src/js/constants'\n\n// @ts-expect-error Lit Sass import\nimport style from '@src/sass/wc/NFBWorkPageHeaderLogIn.sass?lit'\n\n@customElement('nfb-work-page-header-log-in')\nexport class NFBWorkPageHeaderLogIn extends LitElement {\n  @property({ type: Number, attribute: 'registry-id' })\n    registryId = undefined\n\n  @property({ type: String, attribute: 'href' })\n    href = ''\n\n  @state()\n    text = ''\n\n  @state()\n    nfb_detail = ''\n\n  _viewObserver: IntersectionObserver\n\n  static styles = [style]\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    store.subscribe(this.stateChanged)\n    this.stateChanged()\n  }\n\n  protected firstUpdated (): void {\n    this._viewObserver = new IntersectionObserver((entries) => {\n      entries.forEach(entry => {\n        if (entry.isIntersecting) {\n          this.onVisible()\n        }\n      })\n    }, {\n      threshold: 0.75 // Trigger when 75% is visible\n    })\n\n    this._viewObserver.observe(this)\n  }\n\n  attributeChangedCallback (name: string, _old: string | null, value: string | null): void {\n    super.attributeChangedCallback(name, _old, value)\n    if (name === 'registry-id' && _old !== null) {\n      this.updateLogInText()\n    }\n  }\n\n  stateChanged (): void {\n    this.updateLogInText()\n  }\n\n  updateLogInText () {\n    if (this.registryId) {\n      const state = store.getState()\n      let workHistory = null\n\n      if (state.seriesPage.seriesRegistryId) {\n        workHistory = selectHistoryForParentWork(state.workHistory, state.seriesPage.seriesRegistryId!)![0]\n      } else {\n        workHistory = selectFilmHistoryById(state.filmHistory, this.registryId)\n      }\n\n      if (workHistory) {\n        this.text = window.pgettext('Work Page Header', 'to save your progress')\n        this.nfb_detail = GTM_TIE_IN_DETAIL.LOGIN_SAVE_PROGRESS\n      } else {\n        this.text = window.pgettext('Work Page Header', 'to add to my list')\n        this.nfb_detail = GTM_TIE_IN_DETAIL.LOGIN_TO_ADD\n      }\n    }\n  }\n\n  onVisible () {\n    this._viewObserver.disconnect()\n    const abGroupView: GTMABGroupView = {\n      event: GTM_EVENTS.AB_GROUP_VIEW,\n      nfb_detail: GTM_AB_GROUP.LOGIN_TO_ADD\n    }\n    window.dataLayer?.push(abGroupView)\n  }\n\n  sentGTMEvent () {\n    const event: GTMTieInPromo = {\n      event: GTM_EVENTS.TIE_IN_PROMO,\n      nfb_detail: this.nfb_detail\n    }\n    window.dataLayer?.push(event)\n\n    const abGroupClick: GTMABGroupClick = {\n      event: GTM_EVENTS.AB_GROUP_CLICK,\n      nfb_detail: GTM_AB_GROUP.LOGIN_TO_ADD\n    }\n    window.dataLayer?.push(abGroupClick)\n  }\n\n  render () {\n    return html`\n    <div class=\"nfb-work-page__header-login\">\n      <a\n        href=\"${this.href}\"\n        @click=\"${this.sentGTMEvent}\"\n      >${window.pgettext('Work Page Header', 'Login')}</a>\n      ${unsafeHTML(this.text)}\n    </div>`\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-work-page-header-log-in': NFBWorkPageHeaderLogIn\n  }\n}\n","import { customElement } from 'lit/decorators.js'\nimport { css, html } from 'lit'\n\nimport NFBWorkPageReactiveHeaderElement from './NFBWorkPageReactiveHeaderElement'\n\n@customElement('nfb-work-page-header-progress')\nexport default class NFBWorkPageHeaderProgress extends NFBWorkPageReactiveHeaderElement {\n  static styles = [\n    css`\n      nfb-history-progress-bar {\n        display: block;\n        max-width: 66%;\n      }\n    `\n  ]\n\n  render () {\n    return html`\n    <nfb-history-progress-bar\n      registry-id=\"${this.work?.id ?? this.initialRegistryId}\"\n    >\n    </nfb-history-progress-bar>\n    `\n  }\n}\n","import { html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport NFBWorkPageReactiveHeaderElement from './NFBWorkPageReactiveHeaderElement'\n\n@customElement('nfb-work-page-header-watch-button')\nexport default class NFBWorkPageHeaderWatchButton extends NFBWorkPageReactiveHeaderElement {\n  @property({ type: String, attribute: 'slug' })\n  initialSlug = ''\n\n  @property({ type: String, attribute: 'film-title' })\n  initialFilmTitle = ''\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dark' })\n  isDark = true\n\n  render () {\n    const id = this.work?.id ?? this.initialRegistryId\n    const slug = this.work?.slug ?? this.initialSlug\n    const title = this.work?.title ?? this.initialFilmTitle\n\n    return html`\n      <nfb-watch-button\n        registry-id=\"${id}\"\n        slug=\"${slug}\"\n        icon=\"play\"\n        film-title=\"${title}\"\n        is-dark=\"${this.isDark}\"\n        is-primary=\"true\"\n        show-history-label=\"true\"\n        update-display=\"true\"\n      ></nfb-watch-button>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`figure {\n  margin: 0;\n  height: 100%;\n}\n\nfigure .nfb-work-page__image {\n  display: block;\n  max-width: 100%;\n  max-height: 100%;\n  width: 100%;\n  height: 100%;\n  object-fit: cover;\n  object-position: 65% 30%;\n}\n\n@media screen and (min-width: 768px), print {\n  figure[is-unavailable=true] .nfb-work-page__image {\n    object-fit: contain;\n    object-position: 0;\n  }\n}`;\nexport default styles;\n","import { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { PropertyValueMap, html, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { store } from '@src/js/redux/store'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBWorkPageHeaderImage.sass?lit'\n\nimport NFBWorkPageReactiveHeaderElement from './NFBWorkPageReactiveHeaderElement'\nimport { setHeaderImageIsLoaded } from '@src/js/redux/workPageReducer'\n\nconst THUMBNAIL_HORIZONTAL_SRC_SET_VALUES =\n  ['768', '1024', '1236', '1854', '2048']\nconst THUMBNAIL_SQUARE_SRC_SET_VALUES =\n  ['768']\nconst DEFAULT_THUMBNAIL_SRC_SET_VALUES =\n  ['284', '350', '598', '618', '1024', '1236', '1854', '2048']\n\n@customElement('nfb-work-page-image')\nexport default class NFBWorkPageImage extends NFBWorkPageReactiveHeaderElement {\n  @property({ type: String, attribute: 'default-thumbnail' })\n  defaultThumbnail = ''\n\n  @property({ type: String, attribute: 'thumbnail-pattern' })\n  thumbnailPattern = ''\n\n  @property({ type: String, attribute: 'thumbnail-square' })\n  thumbnailSquare = ''\n\n  @property({ type: String, attribute: 'thumbnail' })\n  thumbnail = ''\n\n  @property({ type: String, attribute: 'title' })\n  title = ''\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-unavailable' })\n  isUnavailable = false\n\n  static styles = [styles]\n\n  protected updated (_changedProperties: PropertyValueMap<any> | Map<PropertyKey, unknown>): void {\n    if (_changedProperties.has('thumbnail') ||\n      _changedProperties.has('thumbnailSquare')) {\n      store.dispatch(setHeaderImageIsLoaded(false))\n    }\n  }\n\n  isLoaded () {\n    requestAnimationFrame(() => {\n      store.dispatch(setHeaderImageIsLoaded(true))\n    })\n  }\n\n  buildUrl (width: string, path: string, height = ''): string {\n    return this.thumbnailPattern\n      .replace('{width}', width)\n      .replace('{height}', height)\n      .replace('{path}', path)\n  }\n\n  buildSrcSet (srcSetList: string[], path: string): string {\n    let string = ''\n    srcSetList.forEach((value, index) => {\n      string += `${this.buildUrl(value, path)} ${value}w${index < srcSetList.length - 1 ? ', ' : ''}\\n`\n    })\n    return string\n  }\n\n  buildHeaderImageSrcSet (thumbnail: string | null = null) {\n    return this.buildSrcSet(THUMBNAIL_HORIZONTAL_SRC_SET_VALUES, thumbnail ?? this.thumbnail)\n  }\n\n  buildSquareHeaderImageSrcSet (thumbnailSquare: string | null = null) {\n    return this.buildSrcSet(THUMBNAIL_SQUARE_SRC_SET_VALUES, thumbnailSquare ?? this.thumbnailSquare)\n  }\n\n  getThumbnailElement (thumbnail: string | null = null, thumbnailSquare: string | null = null, useThumbnailSquare = true) {\n    if (!thumbnail) {\n      if (!this.defaultThumbnail) this.defaultThumbnail = window.FALLBACK_THUMBNAIL_PATH\n      return html`\n      <img\n        @load=${this.isLoaded}\n        class=\"nfb-work-page__image\"\n        data-cy=\"work-page-image\" \n        fetchpriority=\"high\"\n        src=${this.buildUrl('1024', this.defaultThumbnail, '576')}\n        srcset=\"${this.buildSrcSet(DEFAULT_THUMBNAIL_SRC_SET_VALUES, this.defaultThumbnail)}\"\n        sizes=\"100vw\"\n        alt=\"${this.title}\"\n      >\n    `\n    }\n\n    return html`\n      <source\n        media=\"(min-width:${THUMBNAIL_HORIZONTAL_SRC_SET_VALUES[0]}px)\"\n        srcset=\"${this.buildHeaderImageSrcSet(thumbnail)}\"\n        sizes=\"100vw\"\n      >\n      ${useThumbnailSquare && (thumbnailSquare || this.thumbnailSquare)\n    ? html`\n          <source\n            media=\"(max-width: ${THUMBNAIL_SQUARE_SRC_SET_VALUES[0]}px)\"\n            srcset=\"${this.buildSquareHeaderImageSrcSet(thumbnailSquare)}\"\n            sizes=\"100vw\"\n          >\n        `\n    : nothing\n}\n      <img\n        @load=${this.isLoaded}\n        class=\"nfb-work-page__image\"\n        fetchpriority=\"high\"\n        data-cy=\"work-page-image\"\n        alt=\"${this.title}\"\n        src=\"${this.buildUrl('1024', thumbnail ?? this.thumbnail)}\"\nn      >\n    `\n  }\n\n  render () {\n    return html`\n    <figure is-unavailable=\"${this.isUnavailable ?? nothing}\">\n      <picture>\n        ${this.isUnavailable && this.thumbnail\n    ? this.getThumbnailElement(this.thumbnail)\n    : (this.thumbnail\n      ? this.getThumbnailElement(\n        this.thumbnail, this.thumbnailSquare, !!this.thumbnailSquare)\n      : this.getThumbnailElement()\n    )\n}\n        <source\n        >\n      </picture>\n    </figure>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`@charset \"UTF-8\";\n.nfb-legend {\n  width: 100%;\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: normal;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #000;\n  color: #6b6a69;\n  margin-bottom: 1rem;\n}\n\n.nfb-legend__item {\n  display: inline-flex;\n  align-items: center;\n  margin-right: 0.25rem;\n  font-size: 0.75rem;\n}\n\n.nfb-legend__item + .nfb-legend__item::before {\n  content: \"|\";\n  margin-right: 0.5rem;\n}\n\n.nfb-legend__icon:not(:last-child) {\n  margin-right: 0.5rem;\n}\n\n.nfb-legend {\n  color: var(--nfb-card-legend-color);\n  width: auto;\n  margin-top: 0.5rem;\n  margin-bottom: 0.5rem;\n  margin-right: 0.5rem;\n}\n\n.nfb-legend-container {\n  display: flex;\n  align-items: first baseline;\n  flex-wrap: wrap;\n}\n\n.nfb-legend nfb-legend-item:not(.nfb-card__creator) + nfb-legend-item::before, .nfb-legend nfb-legend-item:not(.nfb-card__creator) + nfb-legend-icons::before {\n  content: \"•\";\n  margin-right: 0.5rem;\n}\n\n.nfb-legend nfb-legend-item, .nfb-legend nfb-legend-icons {\n  display: inline-flex;\n  align-items: center;\n  margin-right: 0.25rem;\n  font-size: 0.75rem;\n}`;\nexport default styles;\n","import { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { LanguageVariant } from '@web-nfb/frontend-static/design-system/wc/legend/legendIcons/NFBLegendIcons'\nimport { html, css, LitElement, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { formatDuration } from '@src/js/helpers/format'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBWorkPageLegend.sass?lit'\n\n@customElement('nfb-work-page-legend')\nexport default class NFBWorkPageLegend extends LitElement {\n  @property({ converter: stringToBooleanConverter, attribute: 'is-cc' })\n  isCC = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-dv' })\n  isDV = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-leaving-soon' })\n  isLeavingSoon = false\n\n  @property({ type: String, attribute: 'language' })\n  language = LanguageVariant.en\n\n  @property({ type: String, attribute: 'year' })\n  year = ''\n\n  @property({ type: String, attribute: 'running-time' })\n  runningTime = ''\n\n  @property({ type: String, attribute: 'series-info' })\n  seriesInfo = ''\n\n  @property({ type: String, attribute: 'rating' })\n  rating = ''\n\n  @property({ type: String, attribute: 'genre' })\n  genre = ''\n\n  static styles = [styles,\n    css`\n    :host(.nfb-work-page-legend) {\n      nfb-legend-item {\n        font-size: 1rem;\n      }\n    }\n  `\n  ]\n\n  render () {\n    return html`\n      <div\n        class=\"nfb-work-page-legend nfb-legend\"\n        part=\"container\"\n      >\n    ${this.year\n    ? html`\n        <nfb-legend-item\n          data-cy=\"work-page-legend-year\"\n          text=\"${this.year}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n    ${this.runningTime\n    ? html`\n        <nfb-legend-item\n          data-cy=\"work-page-legend-running-time\"\n          text=\"${formatDuration(this.runningTime)}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n    ${this.seriesInfo\n    ? html`\n        <nfb-legend-item\n          data-cy=\"work-page-legend-series-info\"\n          text=\"${this.seriesInfo}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n    ${this.genre\n    ? html`\n        <nfb-legend-item\n          data-cy=\"work-page-legend-genre\"\n          text=\"${this.genre}\"\n        >\n        </nfb-legend-item>`\n    : nothing}\n    ${this.isCC || this.isDV || this.rating\n    ? html`\n        <nfb-legend-icons\n          language=\"${this.language}\"\n          is-dv=\"${this.isDV}\"\n          is-cc=\"${this.isCC}\"\n          rating=\"${this.rating}\"\n        >\n        </nfb-legend-icons>`\n    : nothing}\n      <slot></slot>\n    </div>\n    `\n  }\n}\n","import { LitElement } from 'lit'\nimport { property, state } from 'lit/decorators.js'\nimport { Unsubscribe } from '@reduxjs/toolkit'\n\nimport { store } from '@src/js/redux/store'\nimport { WorkCard, selectWorkById } from '@src/js/redux/worksReducer'\nimport { WorkPageState } from '@src/js/redux/workPageReducer'\n\nexport default abstract class NFBWorkPageReactiveHeaderElement extends LitElement {\n  @property({ type: Number, attribute: 'registry-id' })\n  initialRegistryId: number | null = null\n\n  @state()\n  registryId: number | null = null\n\n  @state()\n  work: WorkCard | null = null\n\n  _workPageState: WorkPageState\n  _storeUnsubscribe: Unsubscribe\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    this._storeUnsubscribe = store.subscribe(this.stateChanged)\n    this.stateChanged()\n  }\n\n  disconnectedCallback (): void {\n    super.disconnectedCallback()\n    this._storeUnsubscribe()\n  }\n\n  stateChanged () {\n    const oldRegistryId = this.registryId ?? this.initialRegistryId\n    this._workPageState = store.getState().workPage\n    if (oldRegistryId !== this._workPageState.displayedRegistryId) {\n      this.registryId = this._workPageState.displayedRegistryId\n\n      const { works } = store.getState()\n      this.work = selectWorkById(works, this.registryId!) ?? null\n    }\n  }\n\n  getRelatedWork (): WorkCard | null {\n    let work = null\n    if (this.registryId) {\n      const { works } = store.getState()\n      work = selectWorkById(works, this.registryId)\n    }\n    return work\n  }\n\n  /** Overwrite this method in child class */\n  render () {\n\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-work-page__title-container {\n  height: 100%;\n  width: auto;\n  z-index: 1;\n  margin-left: 0;\n}\n\n.nfb-work-page__title-container--unavailable {\n  margin-top: 16px;\n}\n\n.nfb-work-page__header-title {\n  margin-top: 16px;\n  margin-bottom: 0;\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 600;\n  font-size: 2rem;\n  line-height: 2.375rem;\n  color: #000;\n  color: var(--header-infos-color);\n}\n\n@media screen and (min-width: 768px), print {\n  .nfb-work-page__header-title {\n    font-size: 3rem;\n  }\n}\n.nfb-work-page__header-title-treatment {\n  margin-top: 16px;\n  width: 100%;\n}\n\n.nfb-work-page__header-title-treatment img {\n  max-height: 160px;\n  max-width: 100%;\n  object-fit: contain;\n}\n\n@media screen and (min-width: 768px), print {\n  .nfb-work-page__header-title-treatment img {\n    max-height: 200px;\n  }\n}\n.nfb-work-page__header-title-treatment ::slotted([slot=title]) {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  margin: -1px;\n  overflow: hidden;\n}\n\n@media screen and (min-width: 768px), print {\n  .nfb-work-page__header-title-treatment.nfb-work-page__header-title-treatment--small img {\n    max-height: 120px;\n  }\n}\n.nfb-work-page__header-above-title {\n  color: var(--header-infos-color);\n  height: auto;\n  display: flex;\n  align-items: center;\n  margin-bottom: 1rem;\n  gap: 0.5rem;\n}\n\n.nfb-work-page__header-above-title > * {\n  display: flex;\n}\n\n.nfb-work-page__header-pill {\n  white-space: nowrap;\n  font-family: \"Elza Round\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 600;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: #000;\n  font-size: 0.75rem;\n  text-transform: uppercase;\n  background-color: #fff;\n  padding-top: 0.125rem;\n  padding-bottom: 0;\n  padding-left: 0.5rem;\n  padding-right: 0.5rem;\n  border-radius: 6px;\n}\n\n.nfb-work-page__header-label {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n  font-weight: 600;\n  color: #fff;\n}\n\nhgroup {\n  height: auto;\n  width: auto;\n  flex-shrink: 1;\n  min-height: 0;\n  display: flex;\n}\n\nh1 {\n  display: flex;\n}`;\nexport default styles;\n","import { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\nimport { LitElement, css, html, nothing } from 'lit'\nimport { property, customElement, state } from 'lit/decorators.js'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBWorkPageTitle.sass?lit'\nimport { store } from '@src/js/redux/store'\nimport { Unsubscribe } from '@reduxjs/toolkit'\nimport { selectWorkById, WorkCard } from '@src/js/redux/worksReducer'\n\n@customElement('nfb-work-page-title')\nexport default class NFBWorkPageTitle extends LitElement {\n  @property({ type: Number, attribute: 'registry-id' })\n  initialRegistryId = 0\n\n  @property({ type: String, attribute: 'text' })\n  text = ''\n\n  @property({ type: String, attribute: 'title-treatment-url' })\n  titleTreatmentUrl = ''\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-small' })\n  initialIsSmall = false\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-new-release' })\n  initialIsNewRelease = false\n\n  @property({ type: String, attribute: 'label' })\n  initialLabel = null\n\n  @property({ converter: stringToBooleanConverter, attribute: 'show-above-title' })\n  showAboveTitle = true\n\n  @property({ converter: stringToBooleanConverter, attribute: 'is-unavailable' })\n  isUnavailable = false\n\n  @state()\n  isLoaded = false\n\n  @state()\n  isSmall = false\n\n  @state()\n  currentRegistryId: number\n\n  @state()\n  work: WorkCard | null = null\n\n  _storeUnsubscribe: Unsubscribe\n\n  static styles = [\n    css`\n      [data-cy='title-treatment-img'] {\n        opacity: 0;\n        transition: opacity 0.2s;\n      }\n      .nfb-work-page__title-container[data-ui-is-loaded=\"false\"] {\n        min-height: 200px;\n      }\n      .nfb-work-page__title-container[data-ui-is-loaded=\"true\"] [data-cy='title-treatment-img'] {\n        opacity: 1;\n      }\n    `,\n    styles\n  ]\n\n  constructor () {\n    super()\n    this.stateChanged = this.stateChanged.bind(this)\n  }\n\n  connectedCallback (): void {\n    super.connectedCallback()\n    this._storeUnsubscribe = store.subscribe(this.stateChanged)\n    this.stateChanged()\n  }\n\n  stateChanged () {\n    const currentRegistryId = store.getState().workPage.displayedRegistryId\n    if (currentRegistryId && currentRegistryId !== this.initialRegistryId) {\n      this.isSmall = true\n      this.currentRegistryId = currentRegistryId\n      this.work = selectWorkById(store.getState().works, this.currentRegistryId)\n    }\n  }\n\n  setIsLoaded = () => {\n    this.isLoaded = true\n  }\n\n  getAboveTitle () {\n    const isNewRelease = this.work?.is_new_release ?? this.initialIsNewRelease\n    const label = this.work?.label ?? this.initialLabel\n\n    if ((!this.isLoaded && this.titleTreatmentUrl && !this.isUnavailable) ||\n      !(isNewRelease || label)) {\n      return nothing\n    }\n\n    const components = []\n\n    if (isNewRelease) {\n      components.push(html`\n        <nfb-pill is-dark=\"true\" data-cy=\"new-release\" text=\"${window.gettext('New release')}\"></nfb-pill>\n      `)\n    }\n\n    if (label) {\n      components.push(html`\n        <span class=\"nfb-work-page__header-label\" data-cy=\"label\">\n          ${label}\n        </span>  \n      `)\n    }\n\n    return html`          \n      <div\n        class=\"nfb-work-page__header-above-title\"\n      >\n        ${components}\n      </div>\n    `\n  }\n\n  getTitle () {\n    if (this.titleTreatmentUrl && !this.isUnavailable) {\n      const isSmall = this.work || this.initialIsSmall\n      return html`\n        <div\n          class='nfb-work-page__header-title nfb-work-page__header-title-treatment ${isSmall ? 'nfb-work-page__header-title-treatment--small' : ''}'\n          data-cy='work-page-header-title-treatment'\n        >\n          <img\n            @load=${this.setIsLoaded}\n            alt=\"${this.text}\"\n            src=\"${this.titleTreatmentUrl}\"\n            data-cy=\"title-treatment-img\"\n            fetchpriority=\"high\"\n          >\n          <slot data-cy=\"work-page-header-title\" name=\"title\"></slot>\n        </div>\n      `\n    } else {\n      return html`\n        <slot data-cy=\"work-page-header-title\" name=\"title\"></slot>\n      `\n    }\n  }\n\n  render () {\n    return html`\n      <div \n        class='nfb-work-page__title-container ${this.isUnavailable ? 'nfb-work-page__title-container--unavailable' : ''}'\n        data-ui-is-loaded=${this.titleTreatmentUrl ? this.isLoaded : true}\n      >\n        ${this.getAboveTitle()}\n        <hgroup>\n          ${this.getTitle()}\n        </hgroup>\n      </div>\n    `\n  }\n}\n\ndeclare global {\n  interface HTMLElementTagNameMap {\n    'nfb-work-page-title': NFBWorkPageTitle\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-work-page__up-next-label {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 1.125rem;\n  line-height: 1.5rem;\n  color: #1c1b1b;\n  color: var(--header-infos-color);\n  margin-bottom: 1rem;\n  margin-top: 2rem;\n}`;\nexport default styles;\n","import { customElement, property } from 'lit/decorators.js'\nimport NFBWorkPageReactiveHeaderElement from './NFBWorkPageReactiveHeaderElement'\nimport { html } from 'lit'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBWorkPageUpNext.sass?lit'\nimport { stringToBooleanConverter } from '@web-nfb/frontend-static/design-system/wc/_utils'\n\n@customElement('nfb-work-page-up-next')\nexport default class NFBWorkPageUpNext extends NFBWorkPageReactiveHeaderElement {\n  @property({ type: String, attribute: 'text' })\n  initialText = ''\n\n  @property({ type: String, attribute: 'label' })\n  label: string\n\n  @property({ converter: stringToBooleanConverter, attribute: 'remove-after-update' })\n  removeAfterUpdate = false\n\n  static styles = [styles]\n\n  render () {\n    if (this.removeAfterUpdate && this.registryId) {\n      this.remove()\n      return\n    }\n\n    const work = this.getRelatedWork()\n    const text = work?.title ?? this.initialText\n\n    return html`\n      <div class=\"nfb-work-page__up-next-label\">\n       ${this.label}: <span data-ui-el=\"up-next-label\">${text}</span>\n      </div>\n    `\n  }\n}\n","import {css} from 'lit';\nexport const styles = css`.nfb-work-page__header-warnings {\n  font-family: \"Public Sans\", Georgia, serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\";\n  font-style: normal;\n  font-weight: 500;\n  font-size: 0.875rem;\n  line-height: 1rem;\n  color: #1c1b1b;\n  color: var(--header-infos-color);\n  margin-top: 1.5rem;\n  display: inline-flex;\n  align-items: center;\n}\n\n.nfb-work-page__header-warnings nfb-icon {\n  margin-top: 2px;\n  margin-right: 8px;\n}`;\nexport default styles;\n","import { html, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\n// @ts-expect-error Lit Sass import\nimport styles from '@src/sass/wc/NFBWorkPageWarning.sass?lit'\nimport NFBWorkPageReactiveHeaderElement from './NFBWorkPageReactiveHeaderElement'\n\n@customElement('nfb-work-page-warning')\nexport default class NFBWorkPageWarning extends NFBWorkPageReactiveHeaderElement {\n  @property({ type: String, attribute: 'text' })\n  initialText = ''\n\n  static styles = [styles]\n\n  render () {\n    const work = this.getRelatedWork()\n    const text = work?.warning ?? this.initialText\n\n    if (!text) return nothing\n\n    return html`\n      <div\n        class=\"nfb-work-page__header-warnings\"\n      >\n        <nfb-icon name=\"warning-o\"></nfb-icon>\n        ${text}\n      </div>\n    `\n  }\n}\n"],"names":["map","webpackAsyncContext","req","__webpack_require__","e","ids","id","module","ApiClient","basePath","baseURL","method","url","data","headers","params","ApiV4Client","PublicApiV5Client","DEVICE_ID_KEY","DeviceHandler","char","storageDeviceId","cookies","deviceId","GTMHandler","player","options","store","hasCastDevicesAvailable","castingInfos","videoStart","nfbWorkStart","nfbWorkResume","percent","videoProgress","nfbWorkProgress","videoComplete","nfbWorkComplete","contentType","nfbLangSwitch","castStart","dataLayer","sendToSentry","tags","UnstatsHandler","type","value","extraLabels","eventUrl","platform","encodedLabels","_a","PlayerStats","currentPercent","progress","GTM_EVENTS","GTM_LIST_TYPE","GTM_LIST_CATEGORY","GTM_LIST_ID","GTM_CONTENT_TYPE","GTM_VIDEO_CAST_TYPE","GTM_VIDEO_CASTING_TYPE","GTM_VIDEO_CAST_TECH_TYPE","GTM_LANG_CONTENT_TYPE","GTM_ECOMMERCE_ITEM_DETAIL","GTM_TIE_IN_DETAIL","GTM_AB_GROUP","DEFAULT_LIST_LENGTH","ERROR_MESSAGE","LANGUAGE_FILTER_OPTIONS","SORT_BY_FILTER_OPTIONS","WATCH_HISTORY_LIST_LENGTH","DEFAULT_GRID_LIST_LENGTH","WorkAvailabilityStatus","PLAYABLE_STATUS","getAvailabilityStatusForWork","work","availabilityData","isTouch","isTouchScreen","userAgentCheck","touchCheck","screenCheck","isDialogAvailable","getSafariVersion","safariMatch","cookiesAreEnabled","getRestriction","film","availabilityStatus","isDark","userState","workIsDTO","workIsRental","rental","expirationDate","formatedExpiredDate","getAvailabilityMessage","message","cardShouldBeDisabled","getNFBAddToMyListButton","registryId","title","getActionButton","buttonType","handleUrl","getSeriesOrCollectionLegend","seriesInfo","creatorSlot","getFilmLegend","formatDuration","duration","durationToNumber","h","m","formatComingSoonDate","dateString","lang","dateObject","formatDirectors","directors","directorsString","d","index","separator","formatSeriesInfo","formatCollectionInfo","formatYearRange","formatHistoryItemDate","timestamp","formatGenreInfo","genreList","stripTags","html","secondsToMinutes","seconds","minutesToSeconds","minutes","getPlatformLanguageCode","executeAfterRegistryIdIsDisplayed","newRegistryId","callback","idIsDisplayed","workPage","unsubscribe","handleFocusOnLastElementClicked","lastClickedElement","currentActiveClickElement","verifyHighlight","currentHighlightId","oldHighlightId","currentPlaying","oldCurrentPlaying","appendHighlightToUrl","removeHighlightFromUrl","highlightId","highlightRegistryId","currentUrl","getNextWork","playingRegistryId","skipUnplayableWork","state","nextId","nextWork","displayNextWork","current","workError","playNextWork","waitForMetadata","resolve","getParentUrl","getUnstatsPlatform","generatePlayerOptionsForWork","streamType","parentSlug","workCategory","convertStreamTypeToCategory","platformLang","eduContext","getShareablePlayerIframeTagForWork","protocol","host","formattedStreamType","embedPath","fetchAllFromSessionStorage","key","unparsedSessionHistory","parsedSessionHistory","postSessionStorage","thunkAPI","historySession","item","sortByTimestamp","a","b","initialState","animatedHoverCardSlice","action","setCurrentOpenCard","apiV4Client","fetchBookmarks","response","postBookmark","registry_id","deleteBookmark","fetchBookmarksList","_","idListToFetch","bookmarksSlice","builder","i","selectIdIsBookmarked","selectIdIsLoading","selectIdHasError","selectBookmarksIds","carouselSlice","setCurrentActiveCarousel","fetchChannel","slug","include_featured","per_page","page","idsList","r","fetchWorkListByDirector","size","language","idList","worksPayload","w","totalCount","directorsSlice","setCurrentPage","resetList","publicApiV5Client","fetchDirectorList","subset","indigenous_nation","first_letter","count_by_letter","sort","fetchDirectorCountByLetterList","DEFAULT_FILTER","educationalSubjectPageSlice","setFilter","fetchExploreByChildSubject","exploreBySubjectSlice","sortMapping","SORT_ORDER","initialFilterList","fetchExploreByWork","currentPageState","exploreByWorkPageSlice","setLanguage","setGenre","setAvailability","setSort","setCC","setDV","setSafeSearch","setYearMin","setYearMax","setDurationMin","setDurationMax","setTitleLetter","resetSearchResult","setAllFilters","SESSION_FILM_HISTORY_KEY","fetchFilmHistory","is_completed","registry_ids","f","deleteFilmHistory","filmHistorySlice","tempList","selectFilmHistoryById","selectFilmHistoryIds","updateFilmHistoryList","fetchFilms","subject","subject_category","age_level_min","age_level_max","year_min","year_max","title_letter","getFilmsParams","getState","diff","filmsSlice","resetFilmList","indigenousCinemaSlice","setSelectedLetter","setSliderMinMax","fetchLikeByRegistryId","postLike","deleteLike","likesSlice","selectIdIsLiked","fetchNationList","nationsSlice","PlayerError","fetchStream","streamData","streamResponse","playersSlice","existingOptions","source","dvSource","currentRegistryId","next","indexOfNext","selectPlayerOptionsByRegistryId","selectNextInQueue","addToPlayerOptionsList","setQueue","setCurrentPlaying","setCurrentError","setIsLoading","setNextIdReturnedByAPI","modifyPlayerOptions","invalidateStreamDataForWork","fetchPlaylistTab","ThunkAPI","playlistTabsSlice","items","selectBySlug","fetchRecommendations","workType","recommendationsSlice","selectRecommendationsIds","API_ENDPOINT_FOR_TYPE","fetchSeries","seriesEndpoint","seriesData","seasons","episodesList","episodesIdsList","s","setEpisodesList","setAllEpisodeIdList","reversesSeasons","reverseEpisodesList","setSeasonList","seriesPageSlice","currentSeason","allCompleted","filmHistory","initSeries","setDisplayedSeasonNumber","setDisplayedSeasonTitle","selectCurrentEpisodesList","selectSeriesIsCompleted","seriesPageState","seasonNumber","episodesListEntries","number","list","seasonNumberInt","seasonTitle","season","bookmarksReducer","channelsReducer","filmHistoryReducer","playersReducer","recommendationsReducer","seriesPageReducer","workHistoryReducer","workPageReducer","userReducer","worksReducer","viewingHistoryReducer","subjectsReducer","indigenousCinemaReducer","directorsReducer","nationsReducer","filmsReducer","educationalSubjectPageReducer","likesReducer","playlistTabsReducer","animatedHoverCardReducer","carouselReducer","exploreBySubjectReducer","directorsPageReducer","exploreByWorkPageReducer","getDefaultMiddleware","fetchSubjectList","category_type","fetchSubjectBySlug","fetchSubjectByChildSlug","childSlug","fetchRentals","include_expired","fetchUserRecommendations","userSlice","selectActiveRentalForWork","selectUserRecommendationsIds","viewingHistorySlice","setIsDeleting","SESSION_WORK_HISTORY_KEY","fetchAllFromApi","fetchAll","sessionHistory","filteredSessionHistory","fetchAllContinueWatching","postHistory","history","returnedHistory","workHistorySlice","filmIds","viewContextIds","parentRegistryId","selectWorkHistoryById","selectContinueWatching","selectContinueWatchingIds","selectContinueWatchingAndParentWorkIds","selectHistoryForParentWork","setDisplayedRegistryId","worksList","fetchVersionList","expression_id","includeFields","workPageSlice","highlightIdFromURL","setPageIsReady","initWork","initHighlightId","setHighlightId","setHeaderImageIsLoaded","setDisplayedWork","setLastClickElement","setCurrentActiveClickElement","basicIncludeFields","detailedIncludeFields","fetchWorks","availability","cc","category","director","durationMax","durationMin","dv","genre","safeSearch","subjectCategory","titleLetter","yearMax","yearMin","getWorkParams","worksSlice","test","fetchContinueWatchingWorks","fetchViewingHistory","fetchRecommendationsWorks","fetchUserRecommendationsWorks","addWorkToList","resetWorkList","selectWorkById","selectWorkByIdList","selectWorksFromParams","gtmOptions","unstatsOptions","playerSpecificOptions","nfbWebPlayer","statsOptions","navigateToBackUrl","NFBWorkPageEpisodeTitle","NFBWorkPageReactiveHeaderElement","NFBSeasonButton","tabEvent","pageViewEvent","NFBSeasonList","changedProperties","el","oldDisplayedSeasonNumber","seasonsButtonsContainer","count","availableSpace","buttonData","entries","seasonsButtonsContainerMargin","NFBEpisodesList","currentEpisodesList","workId","repeat","gtmAttrs","getCurrentEpisodeUrl","search","seasonLabel","urlString","SeriesPage","queue","display","episode","series","format","titleTag","historyList","mostRecentHistory","idToDisplay","episodesRegistryIdList","rootState","oldDiplayedId","highlight","newCurrentPlaying","watchButtonId","seriesPage","ERROR_MESSAGES","NFBPlayerErrorMessage","PlayerModalLayout","NFBPlayerModal","oldPlaying","oldLoading","playingOrLoadingChanged","currentDisplayedId","SHARE_METHOD_LIST","NFBShareButton","name","_old","text","x","shareURL","event","SHARE_INPUT_LIST","NFBShareModal","openButton","oldWork","template","height","icon","dataCy","input","copied","copyFunction","NFB_PLAYER_EVENTS","NFB_VIDEO_EVENTS","storeCreatedElements","NFBVideo","playerId","currentPlayerId","_changedProperties","players","works","playerOptions","safariVersion","createdElement","videoJsEl","themeOptions","overlayOptions","ratingOptions","triggerWarningsOptions","NFBWebPlayer","playerStats","playerExposed","error","relatedPlayerId","percentProgress","playPromise","CardType","bookmarkButtonType","NFBDisplayWorkCard","jsonGTMAttribute","description","showMoreLink","elementTag","thumbnailPattern","NFBPlayWorkCard","cardSelector","cardElement","cardLink","loadingElement","NFBRecommendationsCarousel","NFBNormanCarousel","carouselId","NFBWorkCarousel","registryIds","cardMax","bookmarkButton","contextWork","thumbnailPath","NFBExtraCard","oldHilightId","parentWork","extra","NFBExtrasCarousel","extrasSection","gtmAttributes","WatchButtonState","WATCH_BUTTON_LABEL","NFBWatchButton","ariaLabel","NFBWorkPageCreator","c","suffix","classes","variantClass","NFBWorkPageDescription","NFBWorkPageDetailsVersions","CollapsableManager","version","NFBWorkPageHeaderCreator","creators","NFBWorkPageHeaderImage","thumbnailSquare","thumbnail","unavailable","NFBWorkPageHeaderLegend","initialValue","comingSoonDate","formattedWorkComingSoon","NFBWorkPageHeaderLogIn","entry","workHistory","abGroupView","abGroupClick","NFBWorkPageHeaderProgress","NFBWorkPageHeaderWatchButton","THUMBNAIL_HORIZONTAL_SRC_SET_VALUES","THUMBNAIL_SQUARE_SRC_SET_VALUES","DEFAULT_THUMBNAIL_SRC_SET_VALUES","NFBWorkPageImage","width","path","srcSetList","string","useThumbnailSquare","NFBWorkPageLegend","oldRegistryId","NFBWorkPageTitle","isNewRelease","label","components","isSmall","NFBWorkPageUpNext","NFBWorkPageWarning"],"sourceRoot":""}